From a3c4d929af0ed34a4fb5201601e04c46acf666b0 Mon Sep 17 00:00:00 2001 From: Florian Rathe Date: Tue, 15 Sep 2026 22:33:37 +0200 Subject: [PATCH 01/30] Begin isolated HEIC decoder restoration --- ARCHITECTURE.md | 12 ++ docs/heic/robustness-testing.md | 49 +++++ internal/heicdecode/limits.go | 72 +++++++ internal/heicdecode/protocol.go | 87 ++++++++ internal/heicdecode/protocol_test.go | 117 +++++++++++ plans/2026-09-15-isolated-heic-restoration.md | 187 ++++++++++++++++++ qodana.yaml | 1 + todos.md | 8 + 8 files changed, 533 insertions(+) create mode 100644 docs/heic/robustness-testing.md create mode 100644 internal/heicdecode/limits.go create mode 100644 internal/heicdecode/protocol.go create mode 100644 internal/heicdecode/protocol_test.go create mode 100644 plans/2026-09-15-isolated-heic-restoration.md diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index a4891f13..39feed5b 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -587,6 +587,18 @@ Encode/write-back for a subset of formats lives in `save.go`; `mutations.go` ser | `mutations.go` | Live file-identity transactions shared by Save/Strip/Export and external `WithFileMutation` participants such as Trash; case aliases share admission across atomic replacements, with cancellable admission/I/O and `WriteResult` commit identity. | | `save.go` | `SaveRotated`, `Export` (+ `ExportOptions`: size limit, metadata omission and exact-path fallback encoder), `CanEncode` / `CanEncodeExt`, `StripJPEGMetadata`. `dimensionTagsInvalidated` decides whether the source's dimension tags still describe what is being written, by comparing the written bounds against the source's own frame header - so a resize, a viewer rotation and an Orientation 5-8 source all correct them; Save Changes and export share that policy, retaining tags when geometry is unchanged or the source frame cannot be read (subject to export's resize fallback). | +### `internal/heicdecode` + +Fail-closed boundary for the proposed isolated HEIC/HEIF decoder. `Limits` +defines distinct finite input, output, metadata, diagnostic, time, thread, live +job, WASM-linear-memory and complete-process-family ceilings. `protocol.go` +validates the versioned helper response, checked dimensions and RGBA layout +before publishing pixels and rejects trailing data. It deliberately contains no +codec or rich HEIC parser. Runtime/helper integration remains disabled until the +pinned `github.com/gen2brain/h265/heic` source and guest artifact are qualified +and a platform's mandatory isolation controls pass natively; see the active +restoration plan and `docs/heic/robustness-testing.md`. + ### `internal/avifpolicy` An imaging compile dependency with files only under `nodynamic && !wasm2go`. diff --git a/docs/heic/robustness-testing.md b/docs/heic/robustness-testing.md new file mode 100644 index 00000000..ae91dca4 --- /dev/null +++ b/docs/heic/robustness-testing.md @@ -0,0 +1,49 @@ +# HEIC robustness testing boundary + +This project restores HEIC only behind a disposable, resource-bounded WASI +helper. Qualification is defensive validation of PicFetch's own boundary, not +third-party vulnerability research. + +## Allowed inputs and exercises + +- Ordinary, licensed photographs may exercise configuration, still decode, + metadata, orientation, alpha, supported bit depths and application routes. +- PicFetch-owned fake helpers and guests may return bounded invalid protocol + messages, exit, hang, request bounded over-allocation, or attempt benign file + and network access that the sandbox must deny. +- PicFetch-owned property tests may generate only length-bounded protocol values. +- Cancellation, timeout, busy admission, foreground priority without starvation, + process-family cleanup, missing isolation and recovery on the next request are + required observations. + +Do not generate malicious images, use historical exploit corpora, conduct +third-party vulnerability discovery, or pass rejected work to another model. +An ordinary invalid fixture found during normal use may become a regression only +after its provenance and safe handling are reviewed. + +## Budgets and observables + +The initial ceiling for a complete operation is 30 seconds. The separate maxima +are 1 GiB WASM linear memory, 2 GiB for the OS-enforced helper process family, +64 MiB encoded HEIC input (further reduced by a positive user limit), 64 million +pixels, checked RGBA output, 64 KiB metadata, 4096 bytes diagnostics, one helper +thread/process and one live decode lane per application instance. Measurements +on representative photographs must account for parent input, pipe buffers, +guest backing, wazero/Go overhead, output staging and application caches. Limits +may be lowered from evidence; they must remain finite. + +Each lifecycle test observes its own completion rather than inferring completion +from a cleared counter. A cancellation, timeout, crash, startup failure, excess +output or memory termination must stop admission, close IPC, join the helper and +descendants, release the lane and allow the next valid request. File/network +probes observe both denial and helper cleanup. Platform tests also observe the +kernel primitive rather than trusting a command-line flag. + +## Incomplete coverage + +These bounded checks are not fuzzing, a proof of decoder correctness, a security +certification or HEVC patent clearance. No fuzz coverage is claimed unless an +actual command and duration are recorded in the active plan. Compile-only +Windows or macOS results do not qualify runtime support. HEIC remains unavailable +on a platform until its packaged application passes that platform's isolation, +memory, cleanup and ordinary-photo tests. diff --git a/internal/heicdecode/limits.go b/internal/heicdecode/limits.go new file mode 100644 index 00000000..2ed73270 --- /dev/null +++ b/internal/heicdecode/limits.go @@ -0,0 +1,72 @@ +// Package heicdecode defines PicFetch's fail-closed boundary to the isolated +// HEIC/HEIF decoder helper. It contains no codec or rich container parser. +package heicdecode + +import ( + "errors" + "fmt" + "time" +) + +const ( + hardMaxInputBytes int64 = 64 * 1024 * 1024 + hardMaxPixels int64 = 64_000_000 + hardMaxOutputBytes int64 = hardMaxPixels * 4 + hardMaxMetadataBytes = 64 * 1024 + hardMaxDiagnosticBytes = 4096 +) + +var ErrInvalidLimits = errors.New("invalid HEIC decoder limits") + +// Limits is the complete finite resource contract for one helper request. +// OSProcessBytes must be enforced over the complete helper process family; +// WASMMemoryBytes is the separate linear-memory ceiling inside that process. +type Limits struct { + Timeout time.Duration + WASMMemoryBytes int64 + OSProcessBytes int64 + MaxInputBytes int64 + MaxPixels int64 + MaxOutputBytes int64 + MaxMetadataBytes uint32 + MaxDiagnosticBytes uint32 + MaxThreads uint32 + MaxLiveJobs uint32 +} + +// DefaultLimits returns the initial engineering limits. A positive user input +// ceiling can only lower the hard HEIC ceiling, never raise it. +func DefaultLimits(userMaxInputBytes int64) Limits { + input := hardMaxInputBytes + if userMaxInputBytes > 0 && userMaxInputBytes < input { + input = userMaxInputBytes + } + return Limits{ + Timeout: 30 * time.Second, + WASMMemoryBytes: 1 * 1024 * 1024 * 1024, + OSProcessBytes: 2 * 1024 * 1024 * 1024, + MaxInputBytes: input, + MaxPixels: hardMaxPixels, + MaxOutputBytes: hardMaxOutputBytes, + MaxMetadataBytes: hardMaxMetadataBytes, + MaxDiagnosticBytes: hardMaxDiagnosticBytes, + MaxThreads: 1, + MaxLiveJobs: 1, + } +} + +// Validate rejects relaxed, absent, or internally inconsistent limits. +func (l Limits) Validate() error { + if l.Timeout <= 0 || l.Timeout > 30*time.Second || + l.WASMMemoryBytes <= 0 || l.WASMMemoryBytes > 1*1024*1024*1024 || + l.OSProcessBytes <= 0 || l.OSProcessBytes > 2*1024*1024*1024 || + l.MaxInputBytes <= 0 || l.MaxInputBytes > hardMaxInputBytes || + l.MaxPixels <= 0 || l.MaxPixels > hardMaxPixels || + l.MaxOutputBytes <= 0 || l.MaxOutputBytes > hardMaxOutputBytes || + l.MaxMetadataBytes == 0 || l.MaxMetadataBytes > hardMaxMetadataBytes || + l.MaxDiagnosticBytes == 0 || l.MaxDiagnosticBytes > hardMaxDiagnosticBytes || + l.MaxThreads != 1 || l.MaxLiveJobs != 1 { + return fmt.Errorf("%w: every resource must have a supported finite ceiling", ErrInvalidLimits) + } + return nil +} diff --git a/internal/heicdecode/protocol.go b/internal/heicdecode/protocol.go new file mode 100644 index 00000000..5aabb2e7 --- /dev/null +++ b/internal/heicdecode/protocol.go @@ -0,0 +1,87 @@ +package heicdecode + +import ( + "encoding/binary" + "errors" + "fmt" + "image" + "io" +) + +const ( + responseMagic = "PHR1" + protocolVersion = 1 + statusOK = 0 + pixelFormatRGBA8 = 1 + responseHeaderBytes = 40 +) + +var ErrInvalidResponse = errors.New("invalid HEIC helper response") + +type response struct { + Image *image.RGBA + Metadata []byte + Diagnostic string +} + +func decodeResponse(reader io.Reader, limits Limits) (response, error) { + if err := limits.Validate(); err != nil { + return response{}, err + } + header := make([]byte, responseHeaderBytes) + if _, err := io.ReadFull(reader, header); err != nil { + return response{}, invalidResponse("header", err) + } + if string(header[:4]) != responseMagic || binary.LittleEndian.Uint16(header[4:6]) != protocolVersion { + return response{}, invalidResponse("magic or protocol version", nil) + } + if binary.LittleEndian.Uint16(header[6:8]) != statusOK { + return response{}, invalidResponse("status", nil) + } + width := uint64(binary.LittleEndian.Uint32(header[8:12])) + height := uint64(binary.LittleEndian.Uint32(header[12:16])) + stride := uint64(binary.LittleEndian.Uint32(header[16:20])) + depth := binary.LittleEndian.Uint16(header[20:22]) + format := binary.LittleEndian.Uint16(header[22:24]) + pixelLength := binary.LittleEndian.Uint64(header[24:32]) + metadataLength := binary.LittleEndian.Uint32(header[32:36]) + diagnosticLength := binary.LittleEndian.Uint32(header[36:40]) + + if width == 0 || height == 0 || width > uint64(limits.MaxPixels) || height > uint64(limits.MaxPixels) || + width > ^uint64(0)/height || width*height > uint64(limits.MaxPixels) { + return response{}, invalidResponse("dimensions", nil) + } + if format != pixelFormatRGBA8 || depth != 8 || width > ^uint64(0)/4 || stride != width*4 || + stride > ^uint64(0)/height || pixelLength != stride*height || pixelLength > uint64(limits.MaxOutputBytes) { + return response{}, invalidResponse("pixel layout", nil) + } + if metadataLength > limits.MaxMetadataBytes || diagnosticLength > limits.MaxDiagnosticBytes { + return response{}, invalidResponse("bounded fields", nil) + } + total := pixelLength + uint64(metadataLength) + uint64(diagnosticLength) + if total < pixelLength || total > uint64(limits.MaxOutputBytes)+uint64(limits.MaxMetadataBytes)+uint64(limits.MaxDiagnosticBytes) { + return response{}, invalidResponse("payload length", nil) + } + payload := make([]byte, int(total)) + if _, err := io.ReadFull(reader, payload); err != nil { + return response{}, invalidResponse("payload", err) + } + var trailing [1]byte + if n, err := reader.Read(trailing[:]); n != 0 || !errors.Is(err, io.EOF) { + return response{}, invalidResponse("trailing data", err) + } + pixelEnd := int(pixelLength) + metadataEnd := pixelEnd + int(metadataLength) + return response{ + Image: &image.RGBA{Pix: payload[:pixelEnd:pixelEnd], Stride: int(stride), Rect: image.Rect(0, 0, int(width), int(height))}, + Metadata: append([]byte(nil), payload[pixelEnd:metadataEnd]...), + Diagnostic: string(payload[metadataEnd:]), + }, nil +} + +func invalidResponse(field string, cause error) error { + if cause != nil { + return fmt.Errorf("%w: %s: %v", ErrInvalidResponse, field, cause) + } + return fmt.Errorf("%w: %s", ErrInvalidResponse, field) +} diff --git a/internal/heicdecode/protocol_test.go b/internal/heicdecode/protocol_test.go new file mode 100644 index 00000000..bfbf8737 --- /dev/null +++ b/internal/heicdecode/protocol_test.go @@ -0,0 +1,117 @@ +package heicdecode + +import ( + "bytes" + "encoding/binary" + "errors" + "testing" + "time" +) + +func TestLimitsValidate(t *testing.T) { + valid := DefaultLimits(32 * 1024 * 1024) + if err := valid.Validate(); err != nil { + t.Fatalf("default limits: %v", err) + } + + tests := []struct { + name string + mutate func(*Limits) + }{ + {"zero timeout", func(l *Limits) { l.Timeout = 0 }}, + {"input over hard ceiling", func(l *Limits) { l.MaxInputBytes = hardMaxInputBytes + 1 }}, + {"zero pixels", func(l *Limits) { l.MaxPixels = 0 }}, + {"output too large", func(l *Limits) { l.MaxOutputBytes = hardMaxOutputBytes + 1 }}, + {"metadata too large", func(l *Limits) { l.MaxMetadataBytes = hardMaxMetadataBytes + 1 }}, + {"diagnostic too large", func(l *Limits) { l.MaxDiagnosticBytes = hardMaxDiagnosticBytes + 1 }}, + {"wrong live jobs", func(l *Limits) { l.MaxLiveJobs = 2 }}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + limits := valid + tt.mutate(&limits) + if err := limits.Validate(); !errors.Is(err, ErrInvalidLimits) { + t.Fatalf("Validate() error = %v, want ErrInvalidLimits", err) + } + }) + } +} + +func TestDecodeResponseRejectsInvalidMessages(t *testing.T) { + limits := DefaultLimits(1024) + valid := responseBytes(t, 2, 1, pixelFormatRGBA8, 8, []byte{1, 2, 3, 4, 5, 6, 7, 8}, nil, nil) + + tests := []struct { + name string + data []byte + }{ + {"truncated", valid[:len(valid)-1]}, + {"trailing", append(append([]byte(nil), valid...), 0)}, + {"unknown version", replaceUint16(valid, 4, protocolVersion+1)}, + {"unknown status", replaceUint16(valid, 6, 99)}, + {"zero width", replaceUint32(valid, 8, 0)}, + {"bad stride", replaceUint32(valid, 16, 3)}, + {"unsupported bit depth", replaceUint16(valid, 20, 10)}, + {"unknown pixel format", replaceUint16(valid, 22, 99)}, + {"pixel length mismatch", replaceUint64(valid, 24, 7)}, + {"metadata over limit", responseBytes(t, 2, 1, pixelFormatRGBA8, 8, make([]byte, 8), make([]byte, limits.MaxMetadataBytes+1), nil)}, + {"diagnostic over limit", responseBytes(t, 2, 1, pixelFormatRGBA8, 8, make([]byte, 8), nil, make([]byte, limits.MaxDiagnosticBytes+1))}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := decodeResponse(bytes.NewReader(tt.data), limits); !errors.Is(err, ErrInvalidResponse) { + t.Fatalf("decodeResponse() error = %v, want ErrInvalidResponse", err) + } + }) + } +} + +func TestDefaultLimitsClampUserInput(t *testing.T) { + if got := DefaultLimits(0).MaxInputBytes; got != hardMaxInputBytes { + t.Fatalf("zero user limit = %d, want %d", got, hardMaxInputBytes) + } + if got := DefaultLimits(512 * 1024 * 1024).MaxInputBytes; got != hardMaxInputBytes { + t.Fatalf("large user limit = %d, want %d", got, hardMaxInputBytes) + } + if got := DefaultLimits(7).MaxInputBytes; got != 7 { + t.Fatalf("small user limit = %d, want 7", got) + } + if got := DefaultLimits(7).Timeout; got != 30*time.Second { + t.Fatalf("timeout = %v, want 30s", got) + } +} + +func responseBytes(t *testing.T, width, height uint32, format, depth uint16, pixels, metadata, diagnostic []byte) []byte { + t.Helper() + var out bytes.Buffer + out.WriteString(responseMagic) + values := []any{uint16(protocolVersion), uint16(statusOK), width, height, uint32(width * 4), depth, format, + uint64(len(pixels)), uint32(len(metadata)), uint32(len(diagnostic))} + for _, value := range values { + if err := binary.Write(&out, binary.LittleEndian, value); err != nil { + t.Fatal(err) + } + } + out.Write(pixels) + out.Write(metadata) + out.Write(diagnostic) + return out.Bytes() +} + +func replaceUint16(data []byte, offset int, value uint16) []byte { + out := append([]byte(nil), data...) + binary.LittleEndian.PutUint16(out[offset:offset+2], value) + return out +} + +func replaceUint32(data []byte, offset int, value uint32) []byte { + out := append([]byte(nil), data...) + binary.LittleEndian.PutUint32(out[offset:offset+4], value) + return out +} + +func replaceUint64(data []byte, offset int, value uint64) []byte { + out := append([]byte(nil), data...) + binary.LittleEndian.PutUint64(out[offset:offset+8], value) + return out +} diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md new file mode 100644 index 00000000..c163adfd --- /dev/null +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -0,0 +1,187 @@ +# Isolated HEIC/HEIF restoration + +Date: 2026-09-15. Route: **Deep SDD/TDD**. The deliverable is decode-only +HEIC/HEIF support through one bounded, disposable WASI decoder helper, admitted +only on platforms where both process-family memory enforcement and capability +isolation have been exercised at runtime. This plan is also the durable evidence +record. It does not authorize merge or release. + +## Intent and honest limit + +Restore HEIC/HEIF without loading a codec, container parser, or native HEIC +library into the desktop process. Untrusted container, sequence, tile and pixel +work belongs in a pinned WASI guest inside a minimal helper. The desktop parent +does bounded brand recognition and validates a versioned response before it +allocates or publishes pixels. + +Compilation is not platform qualification. Until a platform's mandatory +isolation and process-family memory controls pass in the packaged application, +admission on that platform fails closed and PicFetch does not advertise HEIC +there. The current Codex Cloud runner cannot provide Docker, Windows, macOS, +cgroup delegation, signing, MSIX, AppContainer, Job Object, or XPC runtime +evidence. HEVC may require patent licences in some jurisdictions; this work does +not provide patent clearance and does not change PicFetch's MIT licence. + +## Decisions (do not relitigate) + +| Topic | Decision | +| --- | --- | +| Decoder | `github.com/gen2brain/h265/heic`; never `github.com/gen2brain/heic`, `gav1d`, the removed Rust payload, or native fallback. | +| Boundary | Dedicated `cmd/picfetch-heic-worker`; no Fyne self-exec initialization. Codec/parser/sequences/tiles/pixels remain in its WASI guest. | +| Protocol | Versioned, length-prefixed binary IPC over explicitly inherited pipes. One request and response per disposable helper; reject unknown versions, statuses, fields and trailing bytes. No paths. | +| Capabilities | Guest receives byte streams only: no preopened filesystem, environment, clock beyond runtime need, secrets, or network. Helper receives only IPC/control handles. | +| Admission | One live lane per app instance. Acquire before the expensive source read. FIFO aging with bounded foreground preference; cancellation removes a waiter. No retry loop. | +| Proposed ceilings | 30 s total; 1 GiB WASM linear memory; 2 GiB OS-enforced process-family committed memory; input `min(user positive limit, 64 MiB)`; 64M pixels; checked RGBA output derivation; 64 KiB metadata; 4096-byte diagnostics; one guest thread/process and one live job. Lower after measurements, never make unbounded. | +| Output | Still image only. Reject sequences, unsupported bit depth/pixel format, zero/oversized dimensions, invalid stride, length mismatch, excessive metadata/diagnostics and extra data. Parent converts only a completely validated result. | +| Integration | `internal/imaging` remains canonical for probe, decode, record, capture date, metadata, thumbnails and previews. Similarity keeps its existing capability behavior and never gains a fallback parser. | +| Exposure | Chooser, MIME, manuals, translations and packaging change only for runtime-qualified fail-closed availability. | + +## Dependency, source and licence inventory + +The selected source must be pinned by immutable commit and Go module checksum, +not merely a tag. Qualification is incomplete until every row has an exact +source digest, artifact digest, licence and shipped notice location. + +| Component | Exact source / artifact | Licence and obligations | Status | +| --- | --- | --- | --- | +| `github.com/gen2brain/h265/heic` | Candidate module `github.com/gen2brain/h265` v0.2.3; immutable commit, `h1:` checksum and changes since v0.2.2 still must be obtained from the trusted source. | Upstream licence and complete generated/translated-source provenance must be inspected; ship its notice. | **Blocked:** outbound module/source access is HTTP 403 in this environment; do not invent a pin or digest. Prior repository audit records an invalid result invariant and sequence fallback at v0.2.3. | +| WASI guest | Reproducible build recipe will name compiler version, target, flags and source tree digest; checked-in artifact gets SHA-256. | Same closure as selected decoder plus compiler/runtime notices where distributed. | Pending source qualification. | +| wazero | Existing selected dependency is transitive through AVIF; exact selected version and licence will be recorded from `go list -m all` when the guest wrapper is added. | Apache-2.0 notice and NOTICE obligations. | Existing dependency; HEIC usage not yet added. | +| PicFetch host/helper/protocol | This repository and committed revision. | MIT. | Planned. | +| OS restriction helpers | Standard-library/syscall use plus existing pinned `golang.org/x/sys`; no new native runtime. | Existing BSD-3-Clause notice. | Planned per platform. | + +The old removed implementation used `github.com/gen2brain/heic` with a Rust +`heic` 0.1.6 payload under AGPL-3.0-only or commercial terms. It is excluded +from this design and must not reappear in either host or guest closure. + +## File map + +| Path | Responsibility | +| --- | --- | +| `internal/heicdecode/` | Context-bearing `Client` (`Decode`, `DecodeConfig`, `DecodeExif`), validated `Limits`, admission, typed failures, protocol validation, process lifecycle. | +| `internal/heicdecode/platform_*.go` | Platform availability and mandatory restriction setup; failure is an unavailable typed error, never unrestricted execution. | +| `cmd/picfetch-heic-worker/` | Minimal private helper dispatch and guest invocation; no UI imports. | +| `internal/imaging/{loader,exif,thumbnail,preview}.go` | Canonical HEIC routing after runtime qualification; ordinary 200M-pixel and encoded-input semantics stay unchanged. | +| `scripts/heicprovenance/`, `scripts/heicimports/` | Reproducible source/artifact and forbidden-import checks backing Make targets. | +| `scripts/nativeguards/` | Actual Linux, Windows, macOS/store isolation acceptance. | +| `docs/heic/robustness-testing.md` | Permitted defensive scope, budgets, observables and explicit omissions. | +| `THIRD-PARTY-NOTICES.md`, packaging/manual/translation files | Exact notices and exposure, only after qualification. | +| `ARCHITECTURE.md`, `todos.md`, this plan | Package map, remaining work and evidence. | + +Every new `_test.go` receives an exact `qodana.yaml` DuplicatedCode exclusion. +Any new top-level `internal/ui` test receives a sorted shard assignment and +updated count. + +## Acceptance criteria and commands + +1. **Provenance and closure.** Exact immutable source and guest artifact are + reproducible, checksummed, licensed and noticed; forbidden decoders/native + backends are absent. + `make heic-check-provenance && make heic-check-imports` +2. **Bounded protocol/client.** Owned protocol property tests and fake helpers + cover malformed/trailing/unknown replies, output arithmetic, metadata and + diagnostic caps, cancellation, timeout, crash, startup failure, queue + priority/no-starvation, cleanup and next-request recovery. + `go test -race -tags=no_emoji -count=1 ./internal/heicdecode/...` +3. **Canonical integration.** Valid licensed fixtures cover probe/decode, + renamed input, metadata/orientation/alpha/bit depth, grid and existing routes; + ordinary formats, AVIF, 200M pixels, cache generations and encoded limits + remain intact. + `go test -race -tags=no_emoji -count=1 ./internal/imaging ./internal/favthumbs ./internal/filescan` +4. **Similarity/UI lifecycle.** Existing capability reporting is preserved and + root/UI work settles through existing queues and shutdown barriers. Focused + named tests are recorded in the evidence ledger before completion. +5. **Packaging and locale.** Associations reflect runtime-qualified availability + only; no missing locale key or Unicode arrow. + `go test ./scripts/plistdoctypes ./scripts/msixstage` plus the repository's + named locale/manual guards. +6. **Platform isolation.** Native guards exercise Linux cgroup v2 memory.max + (including swap/overshoot/permissions) and all-thread seccomp; Windows + restricted token/AppContainer, explicit handles, no network/user files and + Job Object memory/CPU/process/kill-on-close in direct executable and MSIX; + macOS signed minimal sandbox/XPC helper, denied capabilities and supported + hard-memory control on Intel and Apple Silicon. Missing mandatory enforcement + produces a deterministic unavailable error. +7. **Defensive security.** `make security-govulncheck` includes host and guest; + static/import/provenance checks pass. Testing remains within + `docs/heic/robustness-testing.md`; no exploit corpus or vulnerability discovery. +8. **Repository gates.** `make fmt`; `make check-qodana-test-exclusions`; + `make check-test-shards-direct`; `make verify-build`; and `make verify` on + native Linux/amd64 Docker/CI. Changed Go files receive GoLand inspections. + +## Task graph and budgets + +`T0 -> T1 -> T2 -> T3 -> T4 -> T5`. Platform implementations may proceed +independently only after T1 contracts are fixed. The lead owns architecture, +review and every fix; no review agent is used. + +### T0 - feasibility and provenance +Owner: T0 inline. Files: this plan, source/licence records, provenance scripts. +Contract: exact reviewed source/artifact pins or an explicit blocker; no decoder +code enters the graph first. Test: provenance/import guards fail for missing or +forbidden closure. Verify: AC1. Budget: 0 spawns, 1 review, no full suite. + +### T1 - protocol, client, helper and runtime +Owner: T0 inline. Files: `internal/heicdecode`, helper, tests. Depends: T0. +Contract: context-bearing API and typed deterministic failures under validated +limits. Test: AC2 with owned fake helper/guest. Verify: AC2. Budget: 0 spawns, +2 reviews, no full suite. + +### T2 - restrictions and admission +Owner: T0 inline. Files: platform pairs and nativeguards. Depends: T1. Contract: +one fair priority lane; mandatory controls fail closed and kill/join descendants. +Test: benign capability/memory probes. Verify: AC6. Budget: 0 spawns, one review +per executable platform, no full suite. + +### T3 - imaging and process-family integration +Owner: T0 inline. Files: canonical imaging callers and existing tests. Depends: +T1-T2. Contract: one path for full images and all derived consumers; no rich +parent parsing or fallback. Test/verify: AC3-AC4. Budget: 0 spawns, 2 reviews. + +### T4 - native/package qualification and exposure +Owner: T0 inline. Files: native guards, packaging, docs/manual/translations. +Depends: T3 and actual runtime evidence. Contract: expose only qualified runtime +targets. Test/verify: AC5-AC7. Budget: 0 spawns, platform evidence required. + +### T5 - final review, land and publication +Owner: T0. Depends: all tasks. Update architecture/todos/ledger; inspect changed +Go files; run AC8 once; commit and publish draft PR without merge/release. +Budget: 0 spawns, one final review and one full suite. + +Delegation gate: all tasks stay with the lead because architecture, platform +security, dependency judgement and cross-package contracts fail G2/G3/G4; review +and fixes are never delegated. Rule S applies only to deterministic catalogue or +manifest generation. Rule W is satisfied. + +## Safe validation scope + +Use ordinary licensed HEIC photographs and PicFetch-owned bounded fake +helpers/guests. Benign probes may request denied file/network access, bounded +over-allocation, hang, crash and malformed IPC. Do not create malicious images, +run historical exploit corpora, conduct third-party vulnerability discovery, or +route rejected work through another model. Protocol property tests generate +only bounded PicFetch-owned byte messages. No fuzz coverage is claimed unless an +actual bounded fuzz command and duration are entered below. + +## Evidence ledger + +| Date | Task/check | Result and evidence | +| --- | --- | --- | +| 2026-09-15 | Repository/base | User supplied trusted connector evidence: public `frathe/picfetch`, default `main`, pull/push allowed, `main` = `0335a44384435a7680773c323b43016e839c07de`, and no HEIC branch collision. Local HEAD matched and branch `codex/heic-isolated-decoder` was created. | +| 2026-09-15 | Historical context | Read `finished_refactorings/2026-09-14-remove-heic-decoder.md`; recovered the removed research records from commit `aeb7176` for context. Historical prototype commit `fc127b44e1c99447b8d150256563c6d4f99b8ad3` is absent locally, as permitted by the task. | +| 2026-09-15 | Upstream feasibility | `go list -m -json github.com/gen2brain/h265@v0.2.3` failed at `proxy.golang.org` with HTTP 403. No h265 source exists in the module cache. Exact upstream diff, immutable revision, source checksum, licence closure and reproducible guest artifact therefore remain unverified; no decoder dependency or artifact may be added yet. | +| 2026-09-15 | T1 bounded response foundation | Red test first failed on absent `Limits`/protocol identifiers. Added finite-limit validation and a strict response reader that checks version/status, dimensions, multiplication, stride, bit depth, pixel format, every length and EOF before publishing RGBA pixels. `go test -race -tags=no_emoji -count=1 ./internal/heicdecode/...` passed in 1.010s. The client, helper and guest remain pending T0. | +| 2026-09-15 | Repository guards | `make check-qodana-test-exclusions`, `make check-test-shards-direct`, `make fmt`, and `git diff --check` passed. No top-level UI test was added. | +| 2026-09-15 | Existing imaging regressions | The brief's literal `go test -race -tags=no_emoji ...` failed at setup because the repository deliberately requires `nodynamic` for imaging (`internal/avifpolicy` otherwise has no selected file). The convention-compliant `go test -race -tags=no_emoji,nodynamic -count=1 ./internal/imaging ./internal/favthumbs ./internal/filescan` passed: 42.165s, 1.114s, 1.067s. | +| 2026-09-15 | Packaging/build | `go test -tags=no_emoji,nodynamic ./scripts/plistdoctypes ./scripts/msixstage` passed (0.005s, 0.297s). `make verify-build` passed its TUF, vector, asset, updater-notice and repository-wide vet checks. | + +## Cost ledger + +| Task | Spawns budget/actual | Review rounds | Full suite | Notes | +| --- | --- | --- | --- | --- | +| T0 | 0 / 0 | 0 | no | Source retrieval blocked; independent plan/recon completed. | +| T1 | 0 / 0 | 1 | no | Limits and response validation complete; client/helper/guest pending T0 immutable source qualification. | +| T2 | 0 / 0 | 0 | no | Pending fixed runtime contract. | +| T3 | 0 / 0 | 0 | no | Pending qualified platform admission. | +| T4 | 0 / 0 | 0 | no | Native platform evidence unavailable in Cloud. | +| T5 | 0 / 0 | 0 | no | Pending. | diff --git a/qodana.yaml b/qodana.yaml index 7221716b..1e62df47 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -152,6 +152,7 @@ exclude: - "internal/imaging/thumbnail_test.go" - "internal/imaging/tiffbounds_test.go" - "internal/imaging/vector_test.go" + - "internal/heicdecode/protocol_test.go" - "internal/launch/launch_test.go" - "internal/mosaic/generator_test.go" - "internal/mosaic/layout_test.go" diff --git a/todos.md b/todos.md index 4d17c001..cc4ef8fb 100644 --- a/todos.md +++ b/todos.md @@ -89,6 +89,14 @@ verification. The previous fork-upgrade watch [MA-023](needs_refactoring.md#ma-0 is closed by removal. Retained [options and source evidence](docs/find-more-like-this/old-heic-wasm-options.md) do not authorize restoring a decoder. +Restoration work is now authorized and tracked in +`plans/2026-09-15-isolated-heic-restoration.md`. The bounded parent protocol and +safe-testing boundary are present, but decoding and format exposure remain +disabled until the exact h265 source/guest closure can be retrieved and reviewed +and mandatory native isolation is runtime-qualified. The Codex Cloud checkout +cannot currently retrieve the candidate source (module proxy HTTP 403) or supply +Windows/macOS/native Linux isolation evidence. + The [independent alternatives](docs/image-codec-alternatives-2026-09-15.md#heic-alternatives) include libheif/libde265 with LGPL distribution work and hpvcd with unresolved table provenance and security/platform qualification. Ronin prefers avoiding From b64cca35430917cec6e59bd1c26ee4e6c86310b0 Mon Sep 17 00:00:00 2001 From: frathe Date: Tue, 15 Sep 2026 23:15:19 +0200 Subject: [PATCH 02/30] Build a reproducible WASI HEIC candidate with validated IPC --- .github/workflows/ci.yml | 3 + ARCHITECTURE.md | 33 +- Makefile | 26 +- docs/heic/macos-rlimit-probe.c.txt | 17 + docs/heic/notices/Go-LICENSE | 27 ++ docs/heic/notices/Go-PATENTS | 22 ++ docs/heic/notices/h265-LICENSE | 22 ++ docs/heic/notices/wazero-LICENSE | 201 ++++++++++ docs/heic/notices/wazero-NOTICE | 2 + docs/heic/qualification.md | 173 +++++++++ docs/heic/robustness-testing.md | 16 +- go.mod | 2 +- internal/heicdecode/limits.go | 4 +- internal/heicdecode/metadata.go | 111 ++++++ internal/heicdecode/metadata_test.go | 18 + internal/heicdecode/protocol.go | 293 +++++++++++--- internal/heicdecode/protocol_test.go | 38 +- internal/heicdecode/request.go | 110 ++++++ internal/heicdecode/request_test.go | 29 ++ internal/heicdecode/response_test.go | 39 ++ plans/2026-09-15-isolated-heic-restoration.md | 105 ++++- qodana.yaml | 11 +- scripts/heicbuild/fixture.go | 52 +++ scripts/heicbuild/guest_test.go | 114 ++++++ scripts/heicbuild/main.go | 358 ++++++++++++++++++ scripts/heicbuild/main_test.go | 44 +++ scripts/heicbuild/testdata/README.md | 24 ++ scripts/heicbuild/testdata/alpha.heic | Bin 0 -> 1256 bytes scripts/heicbuild/testdata/basic.heic | Bin 0 -> 18543 bytes scripts/heicbuild/testdata/main10.heic | Bin 0 -> 18543 bytes scripts/heicbuild/testdata/tenbit.heic | Bin 0 -> 1329 bytes scripts/heicguest/decoder.json | 31 ++ scripts/heicguest/decoder.wasm | Bin 0 -> 5429315 bytes scripts/heicguest/fixturegen/main.go | 26 ++ scripts/heicguest/go.mod | 10 + scripts/heicguest/go.sum | 2 + scripts/heicguest/main.go | 166 ++++++++ todos.md | 18 +- 38 files changed, 2057 insertions(+), 90 deletions(-) create mode 100644 docs/heic/macos-rlimit-probe.c.txt create mode 100644 docs/heic/notices/Go-LICENSE create mode 100644 docs/heic/notices/Go-PATENTS create mode 100644 docs/heic/notices/h265-LICENSE create mode 100644 docs/heic/notices/wazero-LICENSE create mode 100644 docs/heic/notices/wazero-NOTICE create mode 100644 docs/heic/qualification.md create mode 100644 internal/heicdecode/metadata.go create mode 100644 internal/heicdecode/metadata_test.go create mode 100644 internal/heicdecode/request.go create mode 100644 internal/heicdecode/request_test.go create mode 100644 internal/heicdecode/response_test.go create mode 100644 scripts/heicbuild/fixture.go create mode 100644 scripts/heicbuild/guest_test.go create mode 100644 scripts/heicbuild/main.go create mode 100644 scripts/heicbuild/main_test.go create mode 100644 scripts/heicbuild/testdata/README.md create mode 100644 scripts/heicbuild/testdata/alpha.heic create mode 100644 scripts/heicbuild/testdata/basic.heic create mode 100644 scripts/heicbuild/testdata/main10.heic create mode 100644 scripts/heicbuild/testdata/tenbit.heic create mode 100644 scripts/heicguest/decoder.json create mode 100644 scripts/heicguest/decoder.wasm create mode 100644 scripts/heicguest/fixturegen/main.go create mode 100644 scripts/heicguest/go.mod create mode 100644 scripts/heicguest/go.sum create mode 100644 scripts/heicguest/main.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f24c2424..eba21905 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,6 +40,9 @@ jobs: - name: Check formatting run: make fmt-check + - name: Verify isolated HEIC development artifact + run: make heic-check-provenance heic-check-imports + - name: Check search review controls run: | node --version diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 39feed5b..05fb91e5 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -589,15 +589,30 @@ Encode/write-back for a subset of formats lives in `save.go`; `mutations.go` ser ### `internal/heicdecode` -Fail-closed boundary for the proposed isolated HEIC/HEIF decoder. `Limits` -defines distinct finite input, output, metadata, diagnostic, time, thread, live -job, WASM-linear-memory and complete-process-family ceilings. `protocol.go` -validates the versioned helper response, checked dimensions and RGBA layout -before publishing pixels and rejects trailing data. It deliberately contains no -codec or rich HEIC parser. Runtime/helper integration remains disabled until the -pinned `github.com/gen2brain/h265/heic` source and guest artifact are qualified -and a platform's mandatory isolation controls pass natively; see the active -restoration plan and `docs/heic/robustness-testing.md`. +Codec-free boundary for the proposed isolated HEIC/HEIF decoder. `limits.go` +defines separate finite resource contracts; it does not install OS controls. +`request.go` frames one byte-only operation. `protocol.go` validates versioned +responses, dimensions, NRGBA8/NRGBA64 layout, operation-specific payload lengths, +normalized metadata and exact EOF before publication. `metadata.go` rejects +unknown/duplicate fields and invalid bounded values. No production launcher, +family-wide broker or native helper is installed; HEIC remains unsupported. + +### `scripts/heicguest` and `scripts/heicbuild` + +Development-only HEIC/WASI qualification. `heicguest` is a separate module pinned +to unmodified h265 v0.2.3. Its WASI-only entry point rejects movie containers, +decodes still pixels/config/Exif in the guest, preserves straight-alpha precision +and emits `internal/heicdecode`'s protocol. `fixturegen` writes one fixed ordinary +ten-bit gradient. Neither command is an application entry point or a shipped +helper. The checked guest artifact is not embedded in the viewer. + +`heicbuild` implements the Make build/provenance/import guards. It checks source, +notices and complete build-input hashes, reproduces the guest byte-for-byte and +rejects native codec imports. Its fixed fixture generator and tests use wazero's +interpreter with bounded linear memory and byte streams. This does not implement +a native worker-family memory cap. See `docs/heic/qualification.md`, the active +restoration plan and `docs/heic/robustness-testing.md` for status and remaining +platform, compatibility and distribution gates. ### `internal/avifpolicy` diff --git a/Makefile b/Makefile index bb230194..cff139a7 100644 --- a/Makefile +++ b/Makefile @@ -392,7 +392,7 @@ test-race: ## Run the guarded race partitions concurrently in one Linux/amd64 Do @bash scripts/testshards/docker-race.sh "$(CURDIR)" "$(TEST_IMAGE)" \ "$(TEST_MEMORY_GIB)" "$(TEST_CONTAINER_LABEL)" "$(TEST_LOCALE)" "$(TEST_ARTIFACTS_DIR)" -verify-build: fmt-check check-tuf-root check-qodana-test-exclusions check-tag-vectors check-app-assets check-updater-notices ## Run local verification without the test suite (format, TUF root, generated assets, notices, Qodana exclusions, vet, build) +verify-build: fmt-check check-tuf-root check-qodana-test-exclusions check-tag-vectors check-app-assets check-updater-notices heic-check-provenance heic-check-imports ## Run local verification without the test suite (format, TUF root, generated assets, notices, Qodana exclusions, vet, build) go vet -tags "$(APP_TAGS)" ./... go build -tags "$(APP_TAGS)" ./... @@ -424,8 +424,9 @@ golden: ## Regenerate the e2e golden-master screenshots via Docker (linux/amd64, tidy: ## Tidy go.mod / go.sum go mod tidy -security-govulncheck: ## Scan dependencies with the module-pinned govulncheck +security-govulncheck: ## Scan native and HEIC guest dependencies with the module-pinned govulncheck go tool govulncheck -tags "$(APP_TAGS)" ./... + $(MAKE) --no-print-directory heic-security-govulncheck security-github: ## List open GitHub Dependabot alerts for this repo (needs `gh auth login`) gh api "repos/$$(gh repo view --json nameWithOwner -q .nameWithOwner)/dependabot/alerts" \ @@ -592,3 +593,24 @@ release: ## Full release: verify, bump version, commit, tag, push (PART=major|mi help: ## Show this help @grep -hE '^[a-zA-Z_-]+:.*##' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*##"}; {printf " %-16s %s\n", $$1, $$2}' + +.PHONY: heic-build heic-check-provenance heic-check-imports heic-check-guest heic-fixture +heic-build: ## Rebuild the development-only HEIC WASI guest and provenance record + go run ./scripts/heicbuild build + +heic-check-provenance: ## Verify pinned source/notices and reproduce the HEIC guest byte-for-byte + go run ./scripts/heicbuild check + +heic-check-imports: ## Reject native HEIC codec imports and unreviewed guest dependencies + go run ./scripts/heicbuild imports + +heic-check-guest: ## Test the development guest against small licensed ordinary fixtures + go test -tags "$(APP_TAGS)" ./internal/heicdecode ./scripts/heicbuild + +heic-fixture: ## Reproduce the fixed 16x16 ten-bit fixture inside WASI + go run ./scripts/heicbuild fixture + +.PHONY: heic-security-govulncheck +heic-security-govulncheck: ## Scan the separate WASI guest module (including its fixed fixture generator) + @scanner="$$(go tool -n govulncheck)"; \ + cd scripts/heicguest && GOOS=wasip1 GOARCH=wasm CGO_ENABLED=0 GOWORK=off "$$scanner" -tags=noasm ./... diff --git a/docs/heic/macos-rlimit-probe.c.txt b/docs/heic/macos-rlimit-probe.c.txt new file mode 100644 index 00000000..32cc66ba --- /dev/null +++ b/docs/heic/macos-rlimit-probe.c.txt @@ -0,0 +1,17 @@ +#include +#include +#include +#include +#include +int main(void) { + struct mach_task_basic_info info = {0}; + mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT; + kern_return_t kr = task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &count); + if (kr != KERN_SUCCESS) return 2; + printf("virtual_bytes=%llu resident_bytes=%llu\n", (unsigned long long)info.virtual_size, (unsigned long long)info.resident_size); + struct rlimit limit = {2ULL * 1024 * 1024 * 1024, 2ULL * 1024 * 1024 * 1024}; + int result = setrlimit(RLIMIT_AS, &limit); + int saved_errno = errno; + printf("setrlimit_2GiB=%d errno=%d (%s)\n", result, saved_errno, result ? strerror(saved_errno) : "success"); + return 0; +} diff --git a/docs/heic/notices/Go-LICENSE b/docs/heic/notices/Go-LICENSE new file mode 100644 index 00000000..2a7cf70d --- /dev/null +++ b/docs/heic/notices/Go-LICENSE @@ -0,0 +1,27 @@ +Copyright 2009 The Go Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docs/heic/notices/Go-PATENTS b/docs/heic/notices/Go-PATENTS new file mode 100644 index 00000000..73309904 --- /dev/null +++ b/docs/heic/notices/Go-PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/docs/heic/notices/h265-LICENSE b/docs/heic/notices/h265-LICENSE new file mode 100644 index 00000000..91d5b917 --- /dev/null +++ b/docs/heic/notices/h265-LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2025 roticv +Copyright (c) 2026 Karpeles Lab Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/docs/heic/notices/wazero-LICENSE b/docs/heic/notices/wazero-LICENSE new file mode 100644 index 00000000..e21d6995 --- /dev/null +++ b/docs/heic/notices/wazero-LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2020-2023 wazero authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/heic/notices/wazero-NOTICE b/docs/heic/notices/wazero-NOTICE new file mode 100644 index 00000000..2f5ea8eb --- /dev/null +++ b/docs/heic/notices/wazero-NOTICE @@ -0,0 +1,2 @@ +wazero +Copyright 2020-2023 wazero authors diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md new file mode 100644 index 00000000..1d340d14 --- /dev/null +++ b/docs/heic/qualification.md @@ -0,0 +1,173 @@ +# HEIC restoration qualification, 2026-09-15 + +## Current disposition + +**HEIC viewing is still disabled on every production platform.** This branch +contains a reproducible development WASI guest and codec-free protocol. It has +no production helper launcher, family-wide admission broker, signed helper, +packaging integration, or mandatory OS memory/capability enforcement. Those are +required before enabling formats. The application and similarity paths retain +their current behavior. No release or merge is authorized by this record. + +## Exact source and distribution inventory + +| Component | Reviewed input | Distribution record | +| --- | --- | --- | +| h265 HEIC/HEVC code | `github.com/gen2brain/h265` v0.2.3, commit `b2d46ba787d8f0a2025bd106443ab1b1c7cd010f`; module sum `h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=`; module ZIP SHA-256 `2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a` | Unmodified upstream. MIT text and both upstream copyright notices preserved in `notices/h265-LICENSE`. | +| Guest compiler/runtime | Go 1.27.1, `wasip1/wasm`, no CGo, no assembly | BSD license and patent grant in `notices/Go-LICENSE` and `notices/Go-PATENTS`. The selected guest graph has no vendored third-party standard-library imports. | +| PicFetch adapter/protocol | This branch's `scripts/heicguest` and `internal/heicdecode`; exact input hashes in `scripts/heicguest/decoder.json` | PicFetch MIT. Adapter changes do not patch or vendor the upstream source. | +| Development WASI host | Existing wazero v1.12.0; used by the fixed fixture generator and guest ABI tests | Apache-2.0 license and NOTICE in `notices/wazero-LICENSE` and `notices/wazero-NOTICE`. No version upgrade. | +| Production helper / OS library | Not implemented or shipped | Complete native-helper closure remains a gate; no new native decoder/runtime has been admitted. | + +The [pinned upstream README](https://github.com/gen2brain/h265/blob/b2d46ba787d8f0a2025bd106443ab1b1c7cd010f/README.md) +describes a pure-Go implementation without module dependencies and names +rust_h265 and oxideav-h265 as source projects. Its LICENSE credits roticv (2025) +and Karpeles Lab Inc. (2026). The reviewed module contains that license, but does +not identify exact translated-source revisions or a file-by-file lineage map. +This records the distributed notice and the remaining traceability gap; it does +not invent upstream provenance or claim the whole translation is qualified. +The prior removed `github.com/gen2brain/heic` Rust payload is unrelated to this +new module and remains excluded. + +The upstream README explicitly separates its software copyright license from +HEVC patent rights. This work claims no patent clearance, purchases no license, +and does not change PicFetch's MIT license. Existing project-wide dependency +qualification obligations also remain open. + +### Changes since v0.2.2 + +The previous module is pinned at `665fd95984177afef4a7efca7d50638e4b695c7a`. +Static source comparison found six production files changed: `heic/exif.go`, +`heic/heic.go`, `heic/sequence.go`, `hevc/deblock.go`, `hevc/decoder.go`, and +`hevc/headers.go`. Upstream changes include a missing-metadata guard, propagating +coded-frame limits into the HEVC decoder, bounded/delayed sequence-table work, +transform-size validation and slice/deblocking maintenance. Upstream test +changes were inventoried but not executed or copied. + +Two API facts affect this adapter: + +- The still API can fall back to decoding an image sequence. PicFetch's guest + therefore refuses every top-level `moov` box before calling upstream. This is + also conservative for a still image accompanied by movie data. +- Decoding returns straight-alpha NRGBA8/NRGBA64; treating those bytes as + premultiplied RGBA changes translucent pixels. Protocol v2 identifies the + layout and preserves the full sixteen-bit samples. The earlier v1 boundary + was never shipped and has no compatibility promise. + +## Reproduction and guards + +From the repository root, with Go 1.27.1: + +```sh +make heic-build +make heic-check-provenance +make heic-check-imports +make heic-check-guest +``` + +`heic-build` checks the reviewed source revision, module and archive hashes, +verifies the module cache and notices, then builds with `GOOS=wasip1`, +`GOARCH=wasm`, `CGO_ENABLED=0`, `GOWORK=off`, `GOTOOLCHAIN=local`, empty +`GOEXPERIMENT`/`GOFLAGS`/`GOWASM`, `-mod=readonly -tags=noasm -trimpath +-buildvcs=false -ldflags='-s -w -buildid='`. It writes the artifact and its +input/hash manifest. `heic-check-provenance` refuses input inventory or hash +changes and independently rebuilds to a temporary file for byte comparison. +The manifest is a review record, not a signature or protection from a committer +who changes both sources and recorded hashes. + +The import guard rejects direct native codec imports across build tags, checks +the selected native imaging/analysis graph, and permits only the exact h265, +PicFetch adapter and standard-library guest closure. The guest's entry point is +WASI-only in a separate Go module. The artifact is not embedded in the viewer. +Source/notice changes require an intentional rebuild and review. Guard tests +include mismatched source content, missing artifacts and forbidden imports. + +`make heic-fixture` reproduces one ordinary 16x16 ten-bit gradient inside WASI. +Fixture provenance and scope are in `scripts/heicbuild/testdata/README.md`. +Upstream `basic.heic` and `main10.heic` are byte-identical in the pinned archive; +only the generated explicit-depth gradient is used as ten-bit evidence. + +## Resource and compatibility limits + +The candidate production maxima remain 64 MiB input, 64M pixels, 256,000,000 +output bytes, 64 KiB normalized metadata, 4096-byte diagnostics, 30 seconds, +1 GiB WASM linear memory, and a separately enforced 2 GiB worker-family budget. +The output cap allows at most 32M NRGBA64 pixels. The protocol accepts only +positive finite limits; resource fields are contracts, not OS enforcement. +Guest decoding sets upstream `Threads: 1`. A native Go helper's runtime thread +count is a separate, still-unimplemented OS limit. + +The development fixture tests use 1 MiB input, 1M pixels, 8 MiB output, 128 MiB +WASM linear memory, bounded stderr/stdout, and a deadline. They provide no +untrusted files, filesystem preopens, environment, real clock or sockets to the +guest. The host test process is not claimed to have the production OS cap. +These are positive ABI checks with ordinary images, not memory-exhaustion tests. + +Configuration currently decodes pixels to report the same transformed dimensions +as the displayed image. Optimizing this requires a qualified transformed-header +API. Container transforms are applied in the guest; Exif orientation is returned +as metadata. Their precedence in the eventual imaging adapter, color-profile/HDR +handling, representative camera compatibility and memory measurements remain +unqualified. No application integration may silently assume they are solved. + +## OS enforcement status + +| Platform | Documented candidate | Implemented/runtime verified here | Admission | +| --- | --- | --- | --- | +| Linux x64/ARM64 | Delegated cgroup v2 with `memory.max`, `memory.swap.max=0`, process limits and restricted filesystem/network/syscalls installed across threads before input | No Linux kernel/daemon in this worktree; no delegated hierarchy or packaged helper tested | Disabled | +| Windows x64/ARM64 | AppContainer/restricted capabilities plus Job Object aggregate commit-memory/process/CPU/kill-on-close limits, explicit inherited pipes and suspended setup | No native Windows or MSIX execution; no helper/restriction implementation | Disabled | +| macOS Intel/Apple Silicon | Separate sandboxed helper/XPC for privileges; a supported hard-memory mechanism must still be established | One bounded Apple Silicon address-space feasibility probe only; no decoder or sandbox qualification | Disabled | + +Linux's [cgroup v2 documentation](https://docs.kernel.org/admin-guide/cgroup-v2.html) +describes charged memory and explicitly permits temporary `memory.max` overshoot. +Swap is separately controlled, and unprivileged use depends on actual delegation. +Neither cgroup existence nor a CLI flag proves the worker is governed by it. + +Windows [Job Object extended limits](https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_extended_limit_information) +control aggregate committed memory, not an exact physical-RAM measurement. +[AppContainer](https://learn.microsoft.com/en-us/windows/win32/secauthz/implementing-an-appcontainer) +is a separate privilege boundary. Both must be established before input and +verified in the direct executable and MSIX distribution. + +Apple's [published XNU resource implementation](https://github.com/apple-oss-distributions/xnu/blob/xnu-12377.121.6/bsd/kern/kern_resource.c) +sets an address-space map limit for `RLIMIT_AS`, rejecting one below existing +mappings. It is incorrect to say this API is universally ignored. This source +is evidence about address-space accounting, not a whole-helper resident-memory +limit or supported-version matrix. [Sandboxed XPC services](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html) +provide privilege/crash separation, not a configurable hard RAM ceiling by +themselves. Private or privileged jetsam controls are not an established shipping +solution for an ordinary app. + +### Local macOS feasibility observation + +On macOS 27.0 (26A428), arm64, a disposable C executable queried +`MACH_TASK_BASIC_INFO`, then attempted `setrlimit(RLIMIT_AS, {2 GiB, 2 GiB})`. +It did not allocate a large buffer, test an image, or change the parent process. +Result: + +```text +virtual_bytes=500512735232 resident_bytes=1835008 +setrlimit_2GiB=-1 errno=22 (Invalid argument) +``` + +The probe source is retained in `macos-rlimit-probe.c.txt`. Reproduce with: + +```sh +clang -x c -Wall -Wextra -Werror docs/heic/macos-rlimit-probe.c.txt -o /tmp/picfetch-heic-rlimit-probe +/tmp/picfetch-heic-rlimit-probe +``` + +This eliminates this specific 2 GiB address-space setting on this host; it does +not prove all macOS resource strategies impossible. Separate macOS protection +research is ongoing at Ronin's request. No weaker protection has been accepted. + +## Subsequent explicit macOS decision + +Ronin subsequently approved the practical macOS tradeoff: activation may proceed +once sandboxing and finite decoder memory are verified, even though the native +helper lacks a guaranteed hard total-memory cap and can cause memory pressure or +crashes. Capability restrictions remain mandatory. This supersedes the original +whole-worker-cap gate for macOS; the proposed 2 GiB number was an engineering +starting point. The current candidate still does not launch a production helper. +Implementation continues with bounded host allocations, byte-only validated IPC, +finite jobs/time, cancellation/cleanup, shared admission and platform sandboxing. diff --git a/docs/heic/robustness-testing.md b/docs/heic/robustness-testing.md index ae91dca4..fb5a03a3 100644 --- a/docs/heic/robustness-testing.md +++ b/docs/heic/robustness-testing.md @@ -26,8 +26,9 @@ after its provenance and safe handling are reviewed. The initial ceiling for a complete operation is 30 seconds. The separate maxima are 1 GiB WASM linear memory, 2 GiB for the OS-enforced helper process family, 64 MiB encoded HEIC input (further reduced by a positive user limit), 64 million -pixels, checked RGBA output, 64 KiB metadata, 4096 bytes diagnostics, one helper -thread/process and one live decode lane per application instance. Measurements +pixels, checked NRGBA8/NRGBA64 output, 64 KiB metadata, 4096-byte diagnostics, +one guest decode lane and one live helper per application instance. Native +helper thread/process ceilings require separate OS enforcement. Measurements on representative photographs must account for parent input, pipe buffers, guest backing, wazero/Go overhead, output staging and application caches. Limits may be lowered from evidence; they must remain finite. @@ -47,3 +48,14 @@ actual command and duration are recorded in the active plan. Compile-only Windows or macOS results do not qualify runtime support. HEIC remains unavailable on a platform until its packaged application passes that platform's isolation, memory, cleanup and ordinary-photo tests. + +## Local development evidence + +The development guest is a separate WASI-only module. Its positive fixture ABI +tests use three distinct ordinary images (RGB, alpha, and an explicitly ten-bit +gradient) plus the upstream byte-identical `main10.heic` alias. Parent protocol +checks use bounded owned messages. No upstream negative test corpus, historical +reproducer, fuzz campaign, crash/hang/memory-exhaustion campaign or native +capability test was run. Source/artifact guards are negatively exercised using +owned source text and missing files. Full status and remaining gates are in +[qualification.md](qualification.md). diff --git a/go.mod b/go.mod index fd97d6f7..1eda824c 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ require ( github.com/sigstore/sigstore-go v1.3.0 github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef github.com/stretchr/testify v1.12.1 + github.com/tetratelabs/wazero v1.12.0 github.com/theupdateframework/go-tuf/v2 v2.4.2 github.com/yalue/onnxruntime_go v1.36.0 golang.org/x/image v0.46.0 @@ -94,7 +95,6 @@ require ( github.com/sigstore/rekor-tiles/v2 v2.3.0 // indirect github.com/sigstore/timestamp-authority/v2 v2.1.3 // indirect github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect - github.com/tetratelabs/wazero v1.12.0 // indirect github.com/transparency-dev/formats v0.1.1 // indirect github.com/transparency-dev/merkle v0.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect diff --git a/internal/heicdecode/limits.go b/internal/heicdecode/limits.go index 2ed73270..f1423f08 100644 --- a/internal/heicdecode/limits.go +++ b/internal/heicdecode/limits.go @@ -58,8 +58,8 @@ func DefaultLimits(userMaxInputBytes int64) Limits { // Validate rejects relaxed, absent, or internally inconsistent limits. func (l Limits) Validate() error { if l.Timeout <= 0 || l.Timeout > 30*time.Second || - l.WASMMemoryBytes <= 0 || l.WASMMemoryBytes > 1*1024*1024*1024 || - l.OSProcessBytes <= 0 || l.OSProcessBytes > 2*1024*1024*1024 || + l.WASMMemoryBytes <= 0 || l.WASMMemoryBytes > 1*1024*1024*1024 || l.WASMMemoryBytes%(64*1024) != 0 || + l.OSProcessBytes <= 0 || l.OSProcessBytes > 2*1024*1024*1024 || l.WASMMemoryBytes > l.OSProcessBytes || l.MaxInputBytes <= 0 || l.MaxInputBytes > hardMaxInputBytes || l.MaxPixels <= 0 || l.MaxPixels > hardMaxPixels || l.MaxOutputBytes <= 0 || l.MaxOutputBytes > hardMaxOutputBytes || diff --git a/internal/heicdecode/metadata.go b/internal/heicdecode/metadata.go new file mode 100644 index 00000000..8ff1ebbb --- /dev/null +++ b/internal/heicdecode/metadata.go @@ -0,0 +1,111 @@ +package heicdecode + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "math" + "time" + "unicode/utf8" +) + +// Metadata contains normalized values only, never embedded Exif/TIFF bytes. +// Orientation describes the Exif tag; container transforms are already applied +// by the guest. The integration must resolve their precedence before exposure. +type Metadata struct { + Orientation int + Make string + Model string + Software string + DateTime string + DateTimeOriginal string + ExposureTime float64 + FNumber float64 + ISOSpeed int + FocalLength float64 + Flash int + GPSLatitude float64 + GPSLongitude float64 + GPSAltitude float64 + Copyright string + Artist string +} + +func (m Metadata) validate() error { + for _, s := range []string{m.Make, m.Model, m.Software, m.DateTime, m.DateTimeOriginal, m.Copyright, m.Artist} { + if len(s) > 1024 || !utf8.ValidString(s) { + return errors.New("invalid metadata text") + } + } + for _, n := range []float64{m.ExposureTime, m.FNumber, m.FocalLength, m.GPSLatitude, m.GPSLongitude, m.GPSAltitude} { + if math.IsNaN(n) || math.IsInf(n, 0) { + return errors.New("non-finite metadata value") + } + } + for _, date := range []string{m.DateTime, m.DateTimeOriginal} { + if date != "" { + if _, err := time.Parse("2006:01:02 15:04:05", date); err != nil { + return errors.New("invalid metadata date") + } + } + } + if m.Orientation < 0 || m.Orientation > 8 || m.ExposureTime < 0 || m.FNumber < 0 || m.FocalLength < 0 || m.ISOSpeed < 0 || m.ISOSpeed > 65535 || m.Flash < 0 || m.Flash > 65535 || m.GPSLatitude < -90 || m.GPSLatitude > 90 || m.GPSLongitude < -180 || m.GPSLongitude > 180 { + return errors.New("metadata value outside its range") + } + return nil +} + +func readMetadata(data []byte) (*Metadata, error) { + if len(data) == 0 { + return nil, nil + } + if !utf8.Valid(data) { + return nil, errors.New("invalid metadata encoding") + } + // encoding/json accepts duplicate keys; reject them before decoding the fixed + // schema. Raw values remain bounded by the already checked metadata length. + d := json.NewDecoder(bytes.NewReader(data)) + token, err := d.Token() + if err != nil || token != json.Delim('{') { + return nil, errors.New("metadata must be an object") + } + seen := make(map[string]bool) + for d.More() { + token, err = d.Token() + if err != nil { + return nil, err + } + key, ok := token.(string) + if !ok || seen[key] { + return nil, errors.New("duplicate metadata field") + } + switch key { + case "Orientation", "Make", "Model", "Software", "DateTime", "DateTimeOriginal", "ExposureTime", "FNumber", "ISOSpeed", "FocalLength", "Flash", "GPSLatitude", "GPSLongitude", "GPSAltitude", "Copyright", "Artist": + default: + return nil, errors.New("unknown metadata field") + } + seen[key] = true + var value json.RawMessage + if err = d.Decode(&value); err != nil { + return nil, err + } + if bytes.Equal(bytes.TrimSpace(value), []byte("null")) { + return nil, errors.New("null metadata field") + } + } + var m Metadata + d = json.NewDecoder(bytes.NewReader(data)) + d.DisallowUnknownFields() + if err = d.Decode(&m); err != nil { + return nil, err + } + var extra any + if err = d.Decode(&extra); !errors.Is(err, io.EOF) { + return nil, errors.New("trailing metadata") + } + if err = m.validate(); err != nil { + return nil, err + } + return &m, nil +} diff --git a/internal/heicdecode/metadata_test.go b/internal/heicdecode/metadata_test.go new file mode 100644 index 00000000..026fd491 --- /dev/null +++ b/internal/heicdecode/metadata_test.go @@ -0,0 +1,18 @@ +package heicdecode + +import "testing" + +func TestMetadataRejectsUnvalidatedFields(t *testing.T) { + for _, data := range []string{ + `{"Orientation":9}`, `{"GPSLatitude":91}`, `{"GPSLongitude":-181}`, `{"FNumber":-1}`, + `{"DateTime":"yesterday"}`, `{"Make":null}`, `{"Orientation":1,"orientation":8}`, `{"Unknown":true}`, `{"Orientation":1,"Orientation":8}`, `{"Make":"ok"} {}`, + } { + if _, err := readMetadata([]byte(data)); err == nil { + t.Fatalf("accepted %s", data) + } + } + got, err := readMetadata([]byte(`{"Orientation":6,"GPSLatitude":0,"GPSLongitude":0,"DateTimeOriginal":"2026:09:15 12:30:00","Make":"Camera"}`)) + if err != nil || got.Orientation != 6 || got.Make != "Camera" { + t.Fatalf("metadata = %+v, %v", got, err) + } +} diff --git a/internal/heicdecode/protocol.go b/internal/heicdecode/protocol.go index 5aabb2e7..9c0c5209 100644 --- a/internal/heicdecode/protocol.go +++ b/internal/heicdecode/protocol.go @@ -2,83 +2,260 @@ package heicdecode import ( "encoding/binary" + "encoding/json" "errors" "fmt" "image" + "image/color" "io" + "unicode/utf8" ) const ( - responseMagic = "PHR1" - protocolVersion = 1 + responseMagic = "PHR2" + protocolVersion = 2 statusOK = 0 - pixelFormatRGBA8 = 1 + pixelFormatRGBA8 = 1 // Straight alpha; v1's premultiplied interpretation was never shipped. + pixelFormatNRGBA64 = 2 responseHeaderBytes = 40 ) var ErrInvalidResponse = errors.New("invalid HEIC helper response") -type response struct { - Image *image.RGBA - Metadata []byte +// Status classifies a bounded worker refusal, independently of transport errors. +type Status uint16 + +const ( + StatusRejected Status = 1 + iota + StatusUnsupported + StatusResourceLimit + StatusInternal + StatusUnavailable +) + +// Failure is a validated worker refusal. It does not imply an OS memory control +// was installed or identify a process's termination cause. +type Failure struct { + Status Status Diagnostic string } -func decodeResponse(reader io.Reader, limits Limits) (response, error) { - if err := limits.Validate(); err != nil { - return response{}, err - } - header := make([]byte, responseHeaderBytes) - if _, err := io.ReadFull(reader, header); err != nil { - return response{}, invalidResponse("header", err) - } - if string(header[:4]) != responseMagic || binary.LittleEndian.Uint16(header[4:6]) != protocolVersion { - return response{}, invalidResponse("magic or protocol version", nil) - } - if binary.LittleEndian.Uint16(header[6:8]) != statusOK { - return response{}, invalidResponse("status", nil) - } - width := uint64(binary.LittleEndian.Uint32(header[8:12])) - height := uint64(binary.LittleEndian.Uint32(header[12:16])) - stride := uint64(binary.LittleEndian.Uint32(header[16:20])) - depth := binary.LittleEndian.Uint16(header[20:22]) - format := binary.LittleEndian.Uint16(header[22:24]) - pixelLength := binary.LittleEndian.Uint64(header[24:32]) - metadataLength := binary.LittleEndian.Uint32(header[32:36]) - diagnosticLength := binary.LittleEndian.Uint32(header[36:40]) - - if width == 0 || height == 0 || width > uint64(limits.MaxPixels) || height > uint64(limits.MaxPixels) || - width > ^uint64(0)/height || width*height > uint64(limits.MaxPixels) { - return response{}, invalidResponse("dimensions", nil) - } - if format != pixelFormatRGBA8 || depth != 8 || width > ^uint64(0)/4 || stride != width*4 || - stride > ^uint64(0)/height || pixelLength != stride*height || pixelLength > uint64(limits.MaxOutputBytes) { - return response{}, invalidResponse("pixel layout", nil) - } - if metadataLength > limits.MaxMetadataBytes || diagnosticLength > limits.MaxDiagnosticBytes { - return response{}, invalidResponse("bounded fields", nil) - } - total := pixelLength + uint64(metadataLength) + uint64(diagnosticLength) - if total < pixelLength || total > uint64(limits.MaxOutputBytes)+uint64(limits.MaxMetadataBytes)+uint64(limits.MaxDiagnosticBytes) { - return response{}, invalidResponse("payload length", nil) - } - payload := make([]byte, int(total)) - if _, err := io.ReadFull(reader, payload); err != nil { - return response{}, invalidResponse("payload", err) - } - var trailing [1]byte - if n, err := reader.Read(trailing[:]); n != 0 || !errors.Is(err, io.EOF) { - return response{}, invalidResponse("trailing data", err) - } - pixelEnd := int(pixelLength) - metadataEnd := pixelEnd + int(metadataLength) - return response{ - Image: &image.RGBA{Pix: payload[:pixelEnd:pixelEnd], Stride: int(stride), Rect: image.Rect(0, 0, int(width), int(height))}, - Metadata: append([]byte(nil), payload[pixelEnd:metadataEnd]...), - Diagnostic: string(payload[metadataEnd:]), +func (f *Failure) Error() string { + return fmt.Sprintf("HEIC worker status %d: %s", f.Status, f.Diagnostic) +} + +// Response holds only fully validated pixels and normalized metadata. +type Response struct { + Image image.Image + Config image.Config + Metadata *Metadata +} + +type responseHeader struct { + status Status + width, height, stride uint64 + depth, format uint16 + pixels uint64 + metadata, diagnostic uint32 +} + +func parseResponseHeader(b []byte) (responseHeader, error) { + if string(b[:4]) != responseMagic || binary.LittleEndian.Uint16(b[4:6]) != protocolVersion { + return responseHeader{}, invalidResponse("magic or protocol version", nil) + } + return responseHeader{ + status: Status(binary.LittleEndian.Uint16(b[6:8])), width: uint64(binary.LittleEndian.Uint32(b[8:12])), height: uint64(binary.LittleEndian.Uint32(b[12:16])), stride: uint64(binary.LittleEndian.Uint32(b[16:20])), depth: binary.LittleEndian.Uint16(b[20:22]), format: binary.LittleEndian.Uint16(b[22:24]), pixels: binary.LittleEndian.Uint64(b[24:32]), metadata: binary.LittleEndian.Uint32(b[32:36]), diagnostic: binary.LittleEndian.Uint32(b[36:40]), }, nil } +func (h responseHeader) bytes() []byte { + b := make([]byte, responseHeaderBytes) + copy(b, responseMagic) + binary.LittleEndian.PutUint16(b[4:6], protocolVersion) + binary.LittleEndian.PutUint16(b[6:8], uint16(h.status)) + binary.LittleEndian.PutUint32(b[8:12], uint32(h.width)) + binary.LittleEndian.PutUint32(b[12:16], uint32(h.height)) + binary.LittleEndian.PutUint32(b[16:20], uint32(h.stride)) + binary.LittleEndian.PutUint16(b[20:22], h.depth) + binary.LittleEndian.PutUint16(b[22:24], h.format) + binary.LittleEndian.PutUint64(b[24:32], h.pixels) + binary.LittleEndian.PutUint32(b[32:36], h.metadata) + binary.LittleEndian.PutUint32(b[36:40], h.diagnostic) + return b +} + +func (h responseHeader) validate(op Operation, l Limits) error { + if !op.valid() || h.status > StatusUnavailable { + return invalidResponse("operation or status", nil) + } + if h.metadata > l.MaxMetadataBytes || h.diagnostic > l.MaxDiagnosticBytes { + return invalidResponse("bounded fields", nil) + } + if h.status != statusOK || op == DecodeExif { + if h.width != 0 || h.height != 0 || h.stride != 0 || h.depth != 0 || h.format != 0 || h.pixels != 0 || (h.status != statusOK && h.metadata != 0) || (h.status == statusOK && h.diagnostic != 0) { + return invalidResponse("non-pixel layout", nil) + } + return nil + } + if h.width == 0 || h.height == 0 || h.width > uint64(l.MaxPixels) || h.height > uint64(l.MaxPixels) || h.width*h.height > uint64(l.MaxPixels) { + return invalidResponse("dimensions", nil) + } + var size uint64 + switch { + case h.format == pixelFormatRGBA8 && h.depth == 8: + size = 4 + case h.format == pixelFormatNRGBA64 && h.depth == 16: + size = 8 + default: + return invalidResponse("pixel format or depth", nil) + } + // Width and height are bounded above by 64M before either product. + if h.stride != h.width*size || h.stride*h.height > uint64(l.MaxOutputBytes) || h.diagnostic != 0 { + return invalidResponse("pixel layout", nil) + } + if (op == Decode && h.pixels != h.stride*h.height) || (op == DecodeConfig && h.pixels != 0) { + return invalidResponse("pixel length", nil) + } + return nil +} + +// ReadResponse checks every field before allocation and requires EOF before +// returning any image. The launcher owns cancellation/deadline and pipe closure. +func ReadResponse(r io.Reader, op Operation, limits Limits) (Response, error) { + if err := limits.Validate(); err != nil { + return Response{}, err + } + var b [responseHeaderBytes]byte + if _, err := io.ReadFull(r, b[:]); err != nil { + return Response{}, invalidResponse("header", err) + } + h, err := parseResponseHeader(b[:]) + if err != nil { + return Response{}, err + } + if err = h.validate(op, limits); err != nil { + return Response{}, err + } + // All three lengths are independently bounded; their sum fits a 32-bit int. + payload := make([]byte, int(h.pixels)+int(h.metadata)+int(h.diagnostic)) + if _, err = io.ReadFull(r, payload); err != nil { + return Response{}, invalidResponse("payload", err) + } + if err = requireEOF(r); err != nil { + return Response{}, invalidResponse("trailing data", err) + } + if h.status != statusOK { + if !utf8.Valid(payload) { + return Response{}, invalidResponse("diagnostic encoding", nil) + } + return Response{}, &Failure{Status: h.status, Diagnostic: string(payload)} + } + metadata, err := readMetadata(payload[int(h.pixels):]) + if err != nil { + return Response{}, invalidResponse("metadata", err) + } + result := Response{Metadata: metadata} + if op == DecodeExif { + return result, nil + } + model := color.NRGBAModel + if h.depth == 16 { + model = color.NRGBA64Model + } + result.Config = image.Config{Width: int(h.width), Height: int(h.height), ColorModel: model} + if op == Decode { + pix := payload[:int(h.pixels):int(h.pixels)] + rect := image.Rect(0, 0, int(h.width), int(h.height)) + if h.depth == 16 { + result.Image = &image.NRGBA64{Pix: pix, Stride: int(h.stride), Rect: rect} + } else { + result.Image = &image.NRGBA{Pix: pix, Stride: int(h.stride), Rect: rect} + } + } + return result, nil +} + +// WriteResponse streams canonical straight-alpha pixels after checking the +// same header invariants as the reader. It never encodes a second image format. +func WriteResponse(w io.Writer, op Operation, result Response, limits Limits) error { + if err := limits.Validate(); err != nil { + return err + } + h := responseHeader{} + var pixels, metadata []byte + if result.Metadata != nil { + if err := result.Metadata.validate(); err != nil { + return err + } + var err error + metadata, err = json.Marshal(result.Metadata) + if err != nil { + return err + } + h.metadata = uint32(len(metadata)) + } + if op == Decode { + switch img := result.Image.(type) { + case *image.NRGBA: + if img == nil { + return invalidResponse("nil image", nil) + } + h.width, h.height, h.stride = uint64(img.Rect.Dx()), uint64(img.Rect.Dy()), uint64(img.Stride) + h.depth, h.format = 8, pixelFormatRGBA8 + pixels = img.Pix + case *image.NRGBA64: + if img == nil { + return invalidResponse("nil image", nil) + } + h.width, h.height, h.stride = uint64(img.Rect.Dx()), uint64(img.Rect.Dy()), uint64(img.Stride) + h.depth, h.format = 16, pixelFormatNRGBA64 + pixels = img.Pix + default: + return invalidResponse("image type", nil) + } + if result.Image.Bounds().Min != (image.Point{}) { + return invalidResponse("image origin", nil) + } + h.pixels = uint64(len(pixels)) + } else if op == DecodeConfig { + h.width, h.height = uint64(result.Config.Width), uint64(result.Config.Height) + switch result.Config.ColorModel { + case color.NRGBAModel: + h.depth, h.format, h.stride = 8, pixelFormatRGBA8, h.width*4 + case color.NRGBA64Model: + h.depth, h.format, h.stride = 16, pixelFormatNRGBA64, h.width*8 + default: + return invalidResponse("config color model", nil) + } + } + if err := h.validate(op, limits); err != nil { + return err + } + for _, p := range [][]byte{h.bytes(), pixels, metadata} { + if len(p) > 0 { + if err := writeAll(w, p); err != nil { + return err + } + } + } + return nil +} + +// WriteFailure emits a fixed-schema refusal without image or metadata content. +func WriteFailure(w io.Writer, status Status, diagnostic string, limits Limits) error { + if err := limits.Validate(); err != nil { + return err + } + if status < StatusRejected || status > StatusUnavailable || !utf8.ValidString(diagnostic) || len(diagnostic) > int(limits.MaxDiagnosticBytes) { + return invalidResponse("failure", nil) + } + h := responseHeader{status: status, diagnostic: uint32(len(diagnostic))} + if err := writeAll(w, h.bytes()); err != nil { + return err + } + return writeAll(w, []byte(diagnostic)) +} + func invalidResponse(field string, cause error) error { if cause != nil { return fmt.Errorf("%w: %s: %v", ErrInvalidResponse, field, cause) diff --git a/internal/heicdecode/protocol_test.go b/internal/heicdecode/protocol_test.go index bfbf8737..831aa57e 100644 --- a/internal/heicdecode/protocol_test.go +++ b/internal/heicdecode/protocol_test.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "errors" + "image" "testing" "time" ) @@ -19,6 +20,8 @@ func TestLimitsValidate(t *testing.T) { mutate func(*Limits) }{ {"zero timeout", func(l *Limits) { l.Timeout = 0 }}, + {"fractional WASM page", func(l *Limits) { l.WASMMemoryBytes = 1 }}, + {"guest exceeds OS budget", func(l *Limits) { l.OSProcessBytes = l.WASMMemoryBytes - 1 }}, {"input over hard ceiling", func(l *Limits) { l.MaxInputBytes = hardMaxInputBytes + 1 }}, {"zero pixels", func(l *Limits) { l.MaxPixels = 0 }}, {"output too large", func(l *Limits) { l.MaxOutputBytes = hardMaxOutputBytes + 1 }}, @@ -59,7 +62,7 @@ func TestDecodeResponseRejectsInvalidMessages(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if _, err := decodeResponse(bytes.NewReader(tt.data), limits); !errors.Is(err, ErrInvalidResponse) { + if _, err := ReadResponse(bytes.NewReader(tt.data), Decode, limits); !errors.Is(err, ErrInvalidResponse) { t.Fatalf("decodeResponse() error = %v, want ErrInvalidResponse", err) } }) @@ -115,3 +118,36 @@ func replaceUint64(data []byte, offset int, value uint64) []byte { binary.LittleEndian.PutUint64(out[offset:offset+8], value) return out } + +func TestDecodeResponsePreservesStraightAlphaAndSixteenBitSamples(t *testing.T) { + for _, tt := range []struct { + name string + format uint16 + depth uint16 + pixels []byte + }{ + {"straight alpha", pixelFormatRGBA8, 8, []byte{255, 0, 0, 128}}, + {"sixteen bit", 2, 16, []byte{0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xff}}, + } { + t.Run(tt.name, func(t *testing.T) { + data := responseBytes(t, 1, 1, tt.format, tt.depth, tt.pixels, nil, nil) + binary.LittleEndian.PutUint32(data[16:20], uint32(len(tt.pixels))) + got, err := ReadResponse(bytes.NewReader(data), Decode, DefaultLimits(0)) + if err != nil { + t.Fatal(err) + } + switch img := any(got.Image).(type) { + case *image.NRGBA: + if !bytes.Equal(img.Pix, tt.pixels) { + t.Fatal("straight alpha samples changed") + } + case *image.NRGBA64: + if !bytes.Equal(img.Pix, tt.pixels) { + t.Fatal("sixteen-bit samples changed") + } + default: + t.Fatalf("decoded image type %T loses straight alpha or precision", got.Image) + } + }) + } +} diff --git a/internal/heicdecode/request.go b/internal/heicdecode/request.go new file mode 100644 index 00000000..1c43d91a --- /dev/null +++ b/internal/heicdecode/request.go @@ -0,0 +1,110 @@ +package heicdecode + +import ( + "encoding/binary" + "errors" + "fmt" + "io" +) + +// Operation identifies a single still-image operation. Sequences are unsupported. +type Operation uint16 + +const ( + Decode Operation = 1 + iota + DecodeConfig + DecodeExif + requestMagic = "PHQ2" + requestHeaderBytes = 24 +) + +var ErrInvalidRequest = errors.New("invalid HEIC helper request") + +// Request carries bytes only. A caller must acquire family-wide admission before +// reading Input. This framing package does not grant worker admission. +type Request struct { + Operation Operation + Input []byte + MaxPixels int64 + MaxOutputBytes int64 +} + +func (o Operation) valid() bool { return o >= Decode && o <= DecodeExif } + +// WriteRequest validates a bounded request before writing any bytes. +func WriteRequest(w io.Writer, request Request, limits Limits) error { + if err := limits.Validate(); err != nil { + return err + } + if request.MaxPixels == 0 { + request.MaxPixels = limits.MaxPixels + } + if request.MaxOutputBytes == 0 { + request.MaxOutputBytes = limits.MaxOutputBytes + } + if err := validateRequest(request.Operation, uint64(len(request.Input)), request.MaxPixels, request.MaxOutputBytes, limits); err != nil { + return err + } + var header [requestHeaderBytes]byte + copy(header[:4], requestMagic) + binary.LittleEndian.PutUint16(header[4:6], protocolVersion) + binary.LittleEndian.PutUint16(header[6:8], uint16(request.Operation)) + binary.LittleEndian.PutUint64(header[8:16], uint64(len(request.Input))) + binary.LittleEndian.PutUint32(header[16:20], uint32(request.MaxPixels)) + binary.LittleEndian.PutUint32(header[20:24], uint32(request.MaxOutputBytes)) + if err := writeAll(w, header[:]); err != nil { + return err + } + return writeAll(w, request.Input) +} + +// ReadRequest reads one request and requires EOF. The launcher must close stdin +// after writing and enforce the wall-clock deadline while this function reads. +func ReadRequest(r io.Reader, limits Limits) (Request, error) { + if err := limits.Validate(); err != nil { + return Request{}, err + } + var header [requestHeaderBytes]byte + if _, err := io.ReadFull(r, header[:]); err != nil { + return Request{}, fmt.Errorf("%w: header: %v", ErrInvalidRequest, err) + } + if string(header[:4]) != requestMagic || binary.LittleEndian.Uint16(header[4:6]) != protocolVersion { + return Request{}, ErrInvalidRequest + } + req := Request{Operation: Operation(binary.LittleEndian.Uint16(header[6:8])), MaxPixels: int64(binary.LittleEndian.Uint32(header[16:20])), MaxOutputBytes: int64(binary.LittleEndian.Uint32(header[20:24]))} + n := binary.LittleEndian.Uint64(header[8:16]) + if err := validateRequest(req.Operation, n, req.MaxPixels, req.MaxOutputBytes, limits); err != nil { + return Request{}, err + } + req.Input = make([]byte, int(n)) + if _, err := io.ReadFull(r, req.Input); err != nil { + return Request{}, fmt.Errorf("%w: input: %v", ErrInvalidRequest, err) + } + if err := requireEOF(r); err != nil { + return Request{}, fmt.Errorf("%w: trailing data: %v", ErrInvalidRequest, err) + } + return req, nil +} + +func validateRequest(op Operation, n uint64, pixels, output int64, limits Limits) error { + if !op.valid() || n == 0 || n > uint64(limits.MaxInputBytes) || pixels <= 0 || pixels > limits.MaxPixels || output <= 0 || output > limits.MaxOutputBytes { + return ErrInvalidRequest + } + return nil +} + +func requireEOF(r io.Reader) error { + var trailing [1]byte + if n, err := r.Read(trailing[:]); n != 0 || !errors.Is(err, io.EOF) { + return errors.New("expected EOF") + } + return nil +} + +func writeAll(w io.Writer, p []byte) error { + n, err := w.Write(p) + if err == nil && n != len(p) { + return io.ErrShortWrite + } + return err +} diff --git a/internal/heicdecode/request_test.go b/internal/heicdecode/request_test.go new file mode 100644 index 00000000..a7d788c5 --- /dev/null +++ b/internal/heicdecode/request_test.go @@ -0,0 +1,29 @@ +package heicdecode + +import ( + "bytes" + "errors" + "testing" +) + +func TestRequestFraming(t *testing.T) { + limits := DefaultLimits(4) + var encoded bytes.Buffer + if err := WriteRequest(&encoded, Request{Operation: Decode, Input: []byte("data")}, limits); err != nil { + t.Fatal(err) + } + valid := append([]byte(nil), encoded.Bytes()...) + got, err := ReadRequest(bytes.NewReader(valid), limits) + if err != nil || got.Operation != Decode || string(got.Input) != "data" { + t.Fatalf("round trip = %+v, %v", got, err) + } + for _, data := range [][]byte{valid[:len(valid)-1], append(append([]byte(nil), valid...), 0), replaceUint16(valid, 6, 99), replaceUint64(valid, 8, 5)} { + if _, err := ReadRequest(bytes.NewReader(data), limits); !errors.Is(err, ErrInvalidRequest) { + t.Fatalf("invalid request accepted: %v", err) + } + } + encoded.Reset() + if err := WriteRequest(&encoded, Request{Operation: Decode, Input: []byte("excess")}, limits); !errors.Is(err, ErrInvalidRequest) || encoded.Len() != 0 { + t.Fatalf("oversized request wrote %d bytes: %v", encoded.Len(), err) + } +} diff --git a/internal/heicdecode/response_test.go b/internal/heicdecode/response_test.go new file mode 100644 index 00000000..d743868c --- /dev/null +++ b/internal/heicdecode/response_test.go @@ -0,0 +1,39 @@ +package heicdecode + +import ( + "bytes" + "errors" + "image" + "image/color" + "testing" +) + +func TestResponseOperationsAndFailures(t *testing.T) { + limits := DefaultLimits(0) + for _, op := range []Operation{Decode, DecodeConfig, DecodeExif} { + result := Response{Metadata: &Metadata{Orientation: 6, Make: "Camera"}} + if op != DecodeExif { + result.Config = image.Config{Width: 1, Height: 1, ColorModel: color.NRGBA64Model} + } + if op == Decode { + result.Image = &image.NRGBA64{Pix: []byte{1, 2, 3, 4, 5, 6, 7, 8}, Stride: 8, Rect: image.Rect(0, 0, 1, 1)} + } + var encoded bytes.Buffer + if err := WriteResponse(&encoded, op, result, limits); err != nil { + t.Fatal(err) + } + got, err := ReadResponse(&encoded, op, limits) + if err != nil || got.Metadata.Make != "Camera" || (got.Image == nil) != (op != Decode) { + t.Fatalf("operation %d = %+v, %v", op, got, err) + } + } + var encoded bytes.Buffer + if err := WriteFailure(&encoded, StatusUnsupported, "unsupported", limits); err != nil { + t.Fatal(err) + } + _, err := ReadResponse(&encoded, Decode, limits) + var failure *Failure + if !errors.As(err, &failure) || failure.Status != StatusUnsupported { + t.Fatalf("failure = %v", err) + } +} diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index c163adfd..c27b75fc 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -44,10 +44,10 @@ source digest, artifact digest, licence and shipped notice location. | Component | Exact source / artifact | Licence and obligations | Status | | --- | --- | --- | --- | -| `github.com/gen2brain/h265/heic` | Candidate module `github.com/gen2brain/h265` v0.2.3; immutable commit, `h1:` checksum and changes since v0.2.2 still must be obtained from the trusted source. | Upstream licence and complete generated/translated-source provenance must be inspected; ship its notice. | **Blocked:** outbound module/source access is HTTP 403 in this environment; do not invent a pin or digest. Prior repository audit records an invalid result invariant and sequence fallback at v0.2.3. | -| WASI guest | Reproducible build recipe will name compiler version, target, flags and source tree digest; checked-in artifact gets SHA-256. | Same closure as selected decoder plus compiler/runtime notices where distributed. | Pending source qualification. | -| wazero | Existing selected dependency is transitive through AVIF; exact selected version and licence will be recorded from `go list -m all` when the guest wrapper is added. | Apache-2.0 notice and NOTICE obligations. | Existing dependency; HEIC usage not yet added. | -| PicFetch host/helper/protocol | This repository and committed revision. | MIT. | Planned. | +| `github.com/gen2brain/h265/heic` | v0.2.3 at `b2d46ba787d8f0a2025bd106443ab1b1c7cd010f`; module/archive/source hashes and static v0.2.2 comparison in `docs/heic/qualification.md`. | Upstream licence and complete generated/translated-source provenance must be inspected; ship its notice. | Source recovered locally; MIT notice retained. Exact translated-source lineage and full decoder qualification remain incomplete. Sequence fallback is refused inside the guest. | +| WASI guest | Reproducible build recipe will name compiler version, target, flags and source tree digest; checked-in artifact gets SHA-256. | Same closure as selected decoder plus compiler/runtime notices where distributed. | Development artifact built and reproduced; production qualification pending. | +| wazero | Existing wazero v1.12.0; now directly used by the development fixture generator and ABI tests. No version upgrade. | Apache-2.0 notice and NOTICE obligations. | Apache-2.0 license and NOTICE preserved in `docs/heic/notices`; no production HEIC runtime. | +| PicFetch host/helper/protocol | This repository and guest manifest input hashes. | MIT. | Protocol/guest implemented; production client/helper pending OS controls. | | OS restriction helpers | Standard-library/syscall use plus existing pinned `golang.org/x/sys`; no new native runtime. | Existing BSD-3-Clause notice. | Planned per platform. | The old removed implementation used `github.com/gen2brain/heic` with a Rust @@ -175,7 +175,54 @@ actual bounded fuzz command and duration are entered below. | 2026-09-15 | Existing imaging regressions | The brief's literal `go test -race -tags=no_emoji ...` failed at setup because the repository deliberately requires `nodynamic` for imaging (`internal/avifpolicy` otherwise has no selected file). The convention-compliant `go test -race -tags=no_emoji,nodynamic -count=1 ./internal/imaging ./internal/favthumbs ./internal/filescan` passed: 42.165s, 1.114s, 1.067s. | | 2026-09-15 | Packaging/build | `go test -tags=no_emoji,nodynamic ./scripts/plistdoctypes ./scripts/msixstage` passed (0.005s, 0.297s). `make verify-build` passed its TUF, vector, asset, updater-notice and repository-wide vet checks. | -## Cost ledger +## Local continuation (2026-09-15) + +Recovered the cloud's eight-file, 533-line foundation through its supported +publication control. Draft PR #28 exposes the same foundation as `a3c4d92` +(the cloud-local commit was `fb2c4a9`); the published branch is +`codex/implement-authorized-heic-restoration-in-codex`. Continue this branch. +Remote `main` still equals `0335a44`. The local host is macOS 27.0 build 26A428, +arm64, Go 1.27.1. Docker is installed but has no running daemon. + +The source-access blocker is resolved: the standard Go module registry returned +v0.2.3 at `b2d46ba787d8f0a2025bd106443ab1b1c7cd010f`, checksum +`h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=`. v0.2.2 is available for +static comparison. No historical reproducer or upstream test corpus is run. + +Local work sequence, before adding a production runtime: + +1. Record source/license/API differences and actual OS memory semantics in + `docs/heic/qualification.md`. A small disposable native macOS probe tests + whether the proposed address-space budget can even be installed; it never + allocates up to that budget. Public API/source evidence does not count as + runtime qualification. Lead owns conclusions. +2. Complete the independent wire contract: straight-alpha NRGBA8/NRGBA64, + explicit operations and failure statuses, bounded structured metadata, + request framing, exact output/EOF validation. Share the existing codec-free + `internal/heicdecode` package with the separate guest module. Preserve 16-bit output + without increasing the 256,000,000-byte output ceiling (32M pixels at 16 bits). + Verify with `go test -race -tags no_emoji,nodynamic ./internal/heicdecode/...`. +3. If source inspection permits a development guest, add a separate WASI-only + module at `scripts/heicguest`, reproducible build/provenance/import guards, + and tests using only ordinary licensed fixtures. No shipped/production helper + runs without qualified OS controls. The guest accepts byte streams and emits + the shared wire contract. Source digests and notices accompany the artifact. +4. Integrate production decoding only after T2 can be enforced and measured. + A missing whole-worker memory mechanism blocks that dependent work; no soft + substitute, per-process semaphore, or compilation-only platform claim. + +One read-only OS-documentation scout was used alongside cloud recovery. G1: +bounded primary-source question; G2: cited public APIs/kernel implementation; +G3: zero file writes; G4/G5: independent OS source sweep before lead review. +Rule S cannot resolve accounting semantics from a textual substitution; Rule W +holds. No implementation/review/fix delegation. This revises T0's spawn budget +from zero to one. All reviews/fixes remain with the lead. + +The literal imaging commands above require `-tags no_emoji,nodynamic` under the +current repository policy. Native platform execution and GoLand availability +will be recorded separately from build-only checks. + +## Cloud cost ledger (historical) | Task | Spawns budget/actual | Review rounds | Full suite | Notes | | --- | --- | --- | --- | --- | @@ -185,3 +232,51 @@ actual bounded fuzz command and duration are entered below. | T3 | 0 / 0 | 0 | no | Pending qualified platform admission. | | T4 | 0 / 0 | 0 | no | Native platform evidence unavailable in Cloud. | | T5 | 0 / 0 | 0 | no | Pending. | + +## Local evidence ledger + +| Check | Actual result | +| --- | --- | +| Source recovery/publication | Draft PR #28 exposes the cloud foundation at `a3c4d92`; continued locally on its published branch. Upstream module and v0.2.2 comparison retrieved through the standard registry, with exact source/archive/module pins recorded in `docs/heic/qualification.md`. | +| Test-led protocol corrections | New tests first rejected premultiplied RGBA interpretation and absent 16-bit layout, then passed after NRGBA8/NRGBA64 support. Request/operation/metadata tests first failed for missing contracts. Additional limits tests rejected previously accepted fractional WASM pages and guest memory above the outer budget. | +| Bounded native feasibility probe | macOS 27.0 arm64: `setrlimit(RLIMIT_AS, 2 GiB)` returned EINVAL below existing virtual mappings. Tiny disposable C process, no large allocation. This does not rule out other macOS strategies; separate research is ongoing. | +| Guest/source guards | `make heic-build heic-check-provenance heic-check-imports` passed. Independent byte-identical rebuild; known module/archive/source/notice checks and native-graph checks. Actual artifact-byte mutation made the provenance command fail; removing the fixture generator's WASI-only build guard made the import command fail. Both exact files restored. Unit guards also refuse altered source content, missing artifact and native codec import. | +| Positive guest ABI | Four cases / three distinct licensed images; upstream basic/main10 are byte-identical. RGB, alpha and PicFetch-owned explicit ten-bit gradient pass Decode, DecodeConfig and DecodeExif. NRGBA64 and alpha preserved. No camera compatibility, colorimetric/orientation precedence or native sandbox conclusion follows from these checks. | +| Focused race regression | `go test -race -tags no_emoji,nodynamic -count=1 ./internal/heicdecode ./scripts/heicbuild ./internal/imaging ./internal/favthumbs ./internal/filescan ./scripts/plistdoctypes ./scripts/msixstage` passed. Imaging 28.130s, favorites 1.682s, scanner 1.505s, plist 1.283s, MSIX staging 5.460s. After final protocol/guard refinements, boundary and guest repeated and passed in 1.243s / 58.194s. | +| Advisory scan | `make security-govulncheck` passed for the native graph and separate WASI module. No reachable or imported-package vulnerability found. Native verbose scan identified existing module-only GO-2026-5932 in unimported `golang.org/x/crypto/openpgp`; this change neither imports it nor changes x/crypto. Guest scan found no vulnerabilities. This is known-advisory coverage, not decoder security certification. | +| Local build | `make verify-build` completed format/TUF/assets/notices/provenance/import/vet/build. The appended direct shard command selected macOS tests and failed on the pre-existing `TestMergeWindowMenus_FoldsEveryDuplicate`; the Make target explicitly requires a prepared Linux/amd64 runner. Do not change the Linux manifest or bypass the guard for a macOS run. Canonical shard validation remains a CI gate. | +| Full suite | `make verify` could not start: Docker daemon socket absent. Native Linux/amd64 CI is required. No seccomp, shard or isolation guard was relaxed. | +| GoLand | Connected IDE reports only `/Users/ronin/Projects/picfetch`; this isolated worktree is not an open GoLand project. Inspections of changed files remain unverified. Qodana is a separate CI check, not a replacement claim. | +| Production/platform status | No helper/client/broker/OS sandbox or memory control installed. Linux, Windows/MSIX and macOS production HEIC admission all remain disabled. No main/imaging/UI integration, format declarations or packaging exposure changed. | + +### Local cost/status ledger + +One bounded read-only scout, all implementation/review/fixes by the lead. +T0 source/build provenance is implemented; translated-source lineage and OS +qualification are incomplete. T1 protocol and development guest are implemented; +production client/helper lifecycle is pending the resource decision. T2-T4 +remain blocked on qualified enforcement and then shared admission, compatibility +and packaging. T5 publishes a reviewable candidate only, without merge/release. +No native capability/crash/timeout/memory-exhaustion campaign or upstream fuzz +corpus was executed. CI outcomes/publication are recorded below when observed. + +## Accepted macOS memory tradeoff (supersedes the original T0/T2 gate) + +After a separate explicit decision, Ronin approved enabling macOS HEIC once +sandboxing and decoder memory limits are verified, accepting that the native +helper has no guaranteed hard total-memory cap and can still cause system +memory pressure or crashes. Unauthorized file/network actions remain +unacceptable. The former 2 GiB value was an engineering proposal, not his numeric +requirement. This approval does not permit weaker sandboxing, unvalidated IPC, +native codec loading, unbounded decoder/input/output/jobs/time, or false claims +about undiscovered vulnerabilities. + +Continue beyond this candidate into a minimal disposable protected helper, +family-wide app/analysis admission, deterministic cancellation/join and canonical +imaging integration. macOS must fail closed if its actual sandbox cannot be +established. Windows/Linux use strong practical restrictions and OS memory +controls where available, with truthful per-platform reporting. Native/package +qualification remains required before exposure. All commits/pushes remain +permitted; no merge/release. The dedicated macOS research task supplies further +primary-source implementation guidance. No alternative runtime migration is +selected by this approval. diff --git a/qodana.yaml b/qodana.yaml index 1e62df47..0d81d97c 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -131,16 +131,20 @@ exclude: - "internal/hdbscan/hdbscan_test.go" - "internal/hdbscan/labels_test.go" - "internal/hdbscan/sets_test.go" + - "internal/heicdecode/metadata_test.go" + - "internal/heicdecode/protocol_test.go" + - "internal/heicdecode/request_test.go" + - "internal/heicdecode/response_test.go" + - "internal/imaging/avif_policy_test.go" - "internal/imaging/bytecache_test.go" - "internal/imaging/dhash_test.go" - "internal/imaging/exif_test.go" - "internal/imaging/exifformat_test.go" - "internal/imaging/exififd_test.go" - "internal/imaging/gif_test.go" + - "internal/imaging/ico_test.go" - "internal/imaging/jpegexif_test.go" - "internal/imaging/jpegseg_test.go" - - "internal/imaging/avif_policy_test.go" - - "internal/imaging/ico_test.go" - "internal/imaging/loader_test.go" - "internal/imaging/mutations_test.go" - "internal/imaging/orientation_benchmark_test.go" @@ -152,7 +156,6 @@ exclude: - "internal/imaging/thumbnail_test.go" - "internal/imaging/tiffbounds_test.go" - "internal/imaging/vector_test.go" - - "internal/heicdecode/protocol_test.go" - "internal/launch/launch_test.go" - "internal/mosaic/generator_test.go" - "internal/mosaic/layout_test.go" @@ -369,6 +372,8 @@ exclude: - "scripts/explorereval/search_test.go" - "scripts/explorereval/search_trial_test.go" - "scripts/explorereval/trial_test.go" + - "scripts/heicbuild/guest_test.go" + - "scripts/heicbuild/main_test.go" - "scripts/msixstage/msixstage_test.go" - "scripts/nativeguards/main_test.go" - "scripts/plistdoctypes/doctypes_test.go" diff --git a/scripts/heicbuild/fixture.go b/scripts/heicbuild/fixture.go new file mode 100644 index 00000000..40543c40 --- /dev/null +++ b/scripts/heicbuild/fixture.go @@ -0,0 +1,52 @@ +package main + +import ( + "bytes" + "context" + "errors" + "os" + "path/filepath" + "time" + + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" +) + +// generateFixture runs only the fixed-input fixture generator. It accepts no +// image path or input data. It cannot be used as an unrestricted decoder helper. +func generateFixture(root string) error { + dir, err := os.MkdirTemp("", "picfetch-heic-fixture-") + if err != nil { + return err + } + defer func() { _ = os.RemoveAll(dir) }() + artifact := filepath.Join(dir, "fixture.wasm") + if _, err = goCommand(root, true, "build", "-mod=readonly", "-tags=noasm", "-trimpath", "-buildvcs=false", "-ldflags=-s -w -buildid=", "-o", artifact, "./fixturegen"); err != nil { + return err + } + wasm, err := os.ReadFile(artifact) + if err != nil { + return err + } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + runtime := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigInterpreter().WithMemoryLimitPages(2048).WithCloseOnContextDone(true)) + defer func() { _ = runtime.Close(context.Background()) }() + if _, err = wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { + return err + } + output := &fixtureOutput{} + if _, err = runtime.InstantiateWithConfig(ctx, wasm, wazero.NewModuleConfig().WithStdout(output)); err != nil { + return err + } + return os.WriteFile(filepath.Join(root, "scripts/heicbuild/testdata/tenbit.heic"), output.Bytes(), 0644) +} + +type fixtureOutput struct{ bytes.Buffer } + +func (w *fixtureOutput) Write(p []byte) (int, error) { + if len(p) > 64*1024-w.Len() { + return 0, errors.New("fixed fixture exceeded 64 KiB output") + } + return w.Buffer.Write(p) +} diff --git a/scripts/heicbuild/guest_test.go b/scripts/heicbuild/guest_test.go new file mode 100644 index 00000000..1ba9e417 --- /dev/null +++ b/scripts/heicbuild/guest_test.go @@ -0,0 +1,114 @@ +package main + +import ( + "bytes" + "context" + "errors" + "image" + "os" + "path/filepath" + "testing" + "time" + + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// Only unchanged licensed small ordinary fixtures enter the development guest. +// This proves the guest ABI, not native helper resource or sandbox enforcement. +func TestWASIGuestOrdinaryFixtures(t *testing.T) { + wasm, err := os.ReadFile(filepath.Join("..", "heicguest", "decoder.wasm")) + if err != nil { + t.Fatal(err) + } + for _, tt := range []struct { + name string + sixteen, alpha bool + }{ + {"basic.heic", false, false}, {"main10.heic", false, false}, {"tenbit.heic", true, false}, {"alpha.heic", false, true}, + } { + t.Run(tt.name, func(t *testing.T) { + input, err := os.ReadFile(filepath.Join("testdata", tt.name)) + if err != nil { + t.Fatal(err) + } + result := runGuest(t, wasm, input, heicdecode.Decode) + if result.Image == nil || result.Image.Bounds().Empty() { + t.Fatal("missing decoded image") + } + _, sixteen := result.Image.(*image.NRGBA64) + if sixteen != tt.sixteen { + t.Fatalf("pixel type = %T", result.Image) + } + if tt.alpha { + img, ok := result.Image.(*image.NRGBA) + if !ok { + t.Fatalf("alpha type = %T", result.Image) + } + transparent := false + for i := 3; i < len(img.Pix); i += 4 { + if img.Pix[i] < 255 { + transparent = true + break + } + } + if !transparent { + t.Fatal("alpha was flattened") + } + } + config := runGuest(t, wasm, input, heicdecode.DecodeConfig) + if config.Image != nil || config.Config.Width != result.Image.Bounds().Dx() || config.Config.Height != result.Image.Bounds().Dy() { + t.Fatal("config differs from displayed dimensions") + } + _ = runGuest(t, wasm, input, heicdecode.DecodeExif) + }) + } +} + +func runGuest(t *testing.T, wasm, input []byte, op heicdecode.Operation) heicdecode.Response { + t.Helper() + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + limits := heicdecode.DefaultLimits(1024 * 1024) + limits.MaxPixels = 1024 * 1024 + limits.MaxOutputBytes = 8 * 1024 * 1024 + var request bytes.Buffer + if err := heicdecode.WriteRequest(&request, heicdecode.Request{Operation: op, Input: input}, limits); err != nil { + t.Fatal(err) + } + // Interpreter avoids executable JIT memory; WASI has no preopens, environment, + // real clock, random source, or sockets. The 128 MiB cap is linear memory only. + runtime := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigInterpreter().WithMemoryLimitPages(2048).WithCloseOnContextDone(true)) + defer func() { + if err := runtime.Close(context.Background()); err != nil { + t.Error(err) + } + }() + if _, err := wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { + t.Fatal(err) + } + output := &boundedOutput{limit: int(limits.MaxOutputBytes) + int(limits.MaxMetadataBytes) + 4096} + config := wazero.NewModuleConfig().WithStdin(&request).WithStdout(output).WithStderr(&boundedOutput{limit: 4096}) + if _, err := runtime.InstantiateWithConfig(ctx, wasm, config); err != nil { + t.Fatal(err) + } + result, err := heicdecode.ReadResponse(bytes.NewReader(output.Bytes()), op, limits) + if err != nil { + t.Fatal(err) + } + return result +} + +type boundedOutput struct { + bytes.Buffer + limit int +} + +func (w *boundedOutput) Write(p []byte) (int, error) { + if len(p) > w.limit-w.Len() { + return 0, errors.New("test guest exceeded output bound") + } + return w.Buffer.Write(p) +} diff --git a/scripts/heicbuild/main.go b/scripts/heicbuild/main.go new file mode 100644 index 00000000..23eaebda --- /dev/null +++ b/scripts/heicbuild/main.go @@ -0,0 +1,358 @@ +// Command heicbuild verifies and reproduces the development-only WASI guest. +package main + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "go/parser" + "go/token" + "io/fs" + "os" + "os/exec" + "path/filepath" + "sort" + "strconv" + "strings" + "time" +) + +const ( + decoderModule = "github.com/gen2brain/h265" + decoderVersion = "v0.2.3" + decoderRevision = "b2d46ba787d8f0a2025bd106443ab1b1c7cd010f" + decoderSum = "h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=" + decoderZipSHA = "2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a" + compilerVersion = "go1.27.1" + guestDir = "scripts/heicguest" + guestArtifact = guestDir + "/decoder.wasm" + manifestPath = guestDir + "/decoder.json" +) + +type manifest struct { + Version int + Module, Revision, ModuleSum, ModuleZipSHA256, Compiler string + Files map[string]string +} + +func main() { + if len(os.Args) != 2 { + fmt.Fprintln(os.Stderr, "usage: heicbuild build|check|imports|fixture") + os.Exit(2) + } + if err := run(os.Args[1]); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func run(mode string) error { + root, err := os.Getwd() + if err != nil { + return err + } + if mode == "imports" { + return checkImports(root) + } + if mode != "build" && mode != "check" && mode != "fixture" { + return errors.New("unknown heicbuild mode") + } + if err = verifySource(root); err != nil { + return err + } + if mode == "fixture" { + return generateFixture(root) + } + files, err := buildInputs(root) + if err != nil { + return err + } + if mode == "check" { + data, err := os.ReadFile(filepath.Join(root, manifestPath)) + if err != nil { + return err + } + var m manifest + if err = json.Unmarshal(data, &m); err != nil { + return err + } + if m.Version != 1 || m.Module != decoderModule+"@"+decoderVersion || m.Revision != decoderRevision || m.ModuleSum != decoderSum || m.ModuleZipSHA256 != decoderZipSHA || m.Compiler != compilerVersion { + return errors.New("guest manifest disagrees with reviewed source/toolchain pins") + } + expected := append(append([]string(nil), files...), guestArtifact) + if len(m.Files) != len(expected) { + return errors.New("guest input inventory changed") + } + for _, name := range expected { + if _, ok := m.Files[name]; !ok { + return fmt.Errorf("missing guest input %s", name) + } + } + if err = checkDigests(root, m.Files); err != nil { + return err + } + } + dir, err := os.MkdirTemp("", "picfetch-heic-build-") + if err != nil { + return err + } + defer func() { _ = os.RemoveAll(dir) }() + artifact := filepath.Join(dir, "decoder.wasm") + if _, err = goCommand(root, true, "build", "-mod=readonly", "-tags=noasm", "-trimpath", "-buildvcs=false", "-ldflags=-s -w -buildid=", "-o", artifact, "."); err != nil { + return err + } + built, err := os.ReadFile(artifact) + if err != nil { + return err + } + if mode == "check" { + original, err := os.ReadFile(filepath.Join(root, guestArtifact)) + if err != nil { + return err + } + if !bytes.Equal(original, built) { + return errors.New("guest rebuild differs from checked artifact") + } + fmt.Println("HEIC development guest: source, notices, input inventory and reproducible artifact verified") + return nil + } + if err = os.WriteFile(filepath.Join(root, guestArtifact), built, 0644); err != nil { + return err + } + m := manifest{Version: 1, Module: decoderModule + "@" + decoderVersion, Revision: decoderRevision, ModuleSum: decoderSum, ModuleZipSHA256: decoderZipSHA, Compiler: compilerVersion, Files: make(map[string]string)} + for _, name := range append(files, guestArtifact) { + sum, err := fileDigest(filepath.Join(root, name)) + if err != nil { + return err + } + m.Files[name] = sum + } + data, err := json.MarshalIndent(m, "", " ") + if err != nil { + return err + } + if err = os.WriteFile(filepath.Join(root, manifestPath), append(data, '\n'), 0644); err != nil { + return err + } + fmt.Println("Built development guest and refreshed its provenance manifest; production HEIC remains disabled") + return nil +} + +func goCommand(root string, guest bool, args ...string) ([]byte, error) { + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) + defer cancel() + cmd := exec.CommandContext(ctx, "go", args...) + cmd.Dir = root + overrides := map[string]string{"GOWORK": "off", "GOTOOLCHAIN": "local", "GOEXPERIMENT": "", "GOFLAGS": "", "GOWASM": "", "GOAMD64": "v1", "GOARM64": "v8.0", "CGO_ENABLED": "0"} + if guest { + cmd.Dir = filepath.Join(root, guestDir) + overrides["GOOS"] = "wasip1" + overrides["GOARCH"] = "wasm" + } + for _, item := range os.Environ() { + key, _, _ := strings.Cut(item, "=") + if _, overridden := overrides[key]; !overridden { + cmd.Env = append(cmd.Env, item) + } + } + for key, value := range overrides { + cmd.Env = append(cmd.Env, key+"="+value) + } + output, err := cmd.CombinedOutput() + if err != nil { + return nil, fmt.Errorf("go %s: %w\n%s", strings.Join(args, " "), err, output) + } + return output, nil +} + +func verifySource(root string) error { + version, err := goCommand(root, true, "env", "GOVERSION") + if err != nil { + return err + } + if strings.TrimSpace(string(version)) != compilerVersion { + return fmt.Errorf("guest requires reviewed compiler %s", compilerVersion) + } + data, err := goCommand(root, true, "mod", "download", "-json", decoderModule+"@"+decoderVersion) + if err != nil { + return err + } + var module struct { + Path, Version, Sum, Zip, Dir string + Origin struct{ Hash string } + } + if err = json.Unmarshal(data, &module); err != nil { + return err + } + if module.Path != decoderModule || module.Version != decoderVersion || module.Sum != decoderSum || module.Origin.Hash != decoderRevision { + return errors.New("upstream module provenance differs from pin") + } + sum, err := fileDigest(module.Zip) + if err != nil { + return err + } + if sum != decoderZipSHA { + return errors.New("upstream module archive digest mismatch") + } + if _, err = goCommand(root, true, "mod", "verify"); err != nil { + return err + } + shipped, err := os.ReadFile(filepath.Join(root, "docs/heic/notices/h265-LICENSE")) + if err != nil { + return err + } + original, err := os.ReadFile(filepath.Join(module.Dir, "LICENSE")) + if err != nil { + return err + } + if !bytes.Equal(shipped, original) { + return errors.New("h265 notice differs from pinned upstream") + } + return nil +} + +func buildInputs(root string) ([]string, error) { + var files []string + for _, dir := range []string{"internal/heicdecode", guestDir, "docs/heic/notices", "scripts/heicbuild/testdata"} { + err := filepath.WalkDir(filepath.Join(root, dir), func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + name := filepath.ToSlash(strings.TrimPrefix(path, root+string(filepath.Separator))) + if strings.HasSuffix(name, "_test.go") || name == guestArtifact || name == manifestPath { + return nil + } + files = append(files, name) + return nil + }) + if err != nil { + return nil, err + } + } + files = append(files, "scripts/heicbuild/main.go", "scripts/heicbuild/fixture.go") + sort.Strings(files) + return files, nil +} + +func fileDigest(path string) (string, error) { + data, err := os.ReadFile(path) + if err != nil { + return "", err + } + sum := sha256.Sum256(data) + return hex.EncodeToString(sum[:]), nil +} + +func checkDigests(root string, records map[string]string) error { + for name, want := range records { + if !filepath.IsLocal(name) { + return errors.New("nonlocal provenance path") + } + got, err := fileDigest(filepath.Join(root, name)) + if err != nil { + return err + } + if got != want { + return fmt.Errorf("digest mismatch: %s", name) + } + } + return nil +} + +func forbiddenImport(path string) bool { + for _, module := range []string{decoderModule, "github.com/gen2brain/heic", "github.com/frathe/heic"} { + if path == module || strings.HasPrefix(path, module+"/") { + return true + } + } + return false +} + +func checkNativeSources(root string) error { + return filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + rel, err := filepath.Rel(root, path) + if err != nil { + return err + } + rel = filepath.ToSlash(rel) + if d.IsDir() { + if rel == guestDir || (rel != "." && (strings.HasPrefix(d.Name(), ".") || d.Name() == "vendor" || d.Name() == "bin" || d.Name() == "fyne-cross")) { + return filepath.SkipDir + } + return nil + } + if !strings.HasSuffix(path, ".go") { + return nil + } + file, err := parser.ParseFile(token.NewFileSet(), path, nil, parser.ImportsOnly) + if err != nil { + return err + } + for _, item := range file.Imports { + imported, err := strconv.Unquote(item.Path.Value) + if err != nil { + return err + } + if forbiddenImport(imported) { + return fmt.Errorf("forbidden native codec import %s in %s", imported, rel) + } + } + return nil + }) +} + +func checkImports(root string) error { + if err := checkNativeSources(root); err != nil { + return err + } + data, err := goCommand(root, true, "list", "-mod=readonly", "-deps", "-f", "{{if .Module}}{{.Module.Path}} {{.Module.Version}}{{end}}", ".") + if err != nil { + return err + } + for _, line := range strings.Split(string(data), "\n") { + line = strings.TrimSpace(line) + if line != "" && line != "github.com/frathe/picfetch v0.0.0" && line != decoderModule+" "+decoderVersion && line != "github.com/frathe/picfetch/scripts/heicguest" { + return fmt.Errorf("unreviewed guest dependency: %s", line) + } + } + data, err = goCommand(root, false, "list", "-mod=readonly", "-tags=no_emoji,nodynamic", "-deps", "./internal/heicdecode", "./internal/imaging", "./internal/similarity") + if err != nil { + return err + } + for _, line := range strings.Split(string(data), "\n") { + if forbiddenImport(line) { + return fmt.Errorf("native graph contains %s", line) + } + } + if err = filepath.WalkDir(filepath.Join(root, guestDir), func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || !strings.HasSuffix(path, ".go") { + return nil + } + source, err := os.ReadFile(path) + if err != nil { + return err + } + if !bytes.HasPrefix(source, []byte("//go:build wasip1 && wasm\n")) { + return fmt.Errorf("guest source must remain WASI-only: %s", path) + } + return nil + }); err != nil { + return err + } + + fmt.Println("HEIC imports: codec only in reviewed WASI guest; native source and imaging/analysis graph clear") + return nil +} diff --git a/scripts/heicbuild/main_test.go b/scripts/heicbuild/main_test.go new file mode 100644 index 00000000..2745e3ec --- /dev/null +++ b/scripts/heicbuild/main_test.go @@ -0,0 +1,44 @@ +package main + +import ( + "os" + "path/filepath" + "testing" +) + +func TestProvenanceRejectsChangedArtifactAndSources(t *testing.T) { + root := t.TempDir() + if err := os.WriteFile(filepath.Join(root, "source.go"), []byte("original"), 0600); err != nil { + t.Fatal(err) + } + records := map[string]string{"source.go": "0682c5f2076f099c34cfdd15a9e063849ed437a49677e6fcc5b4198c76575be5"} + if err := checkDigests(root, records); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(root, "source.go"), []byte("changed"), 0600); err != nil { + t.Fatal(err) + } + if err := checkDigests(root, records); err == nil { + t.Fatal("changed source accepted") + } + if err := checkDigests(root, map[string]string{"missing.wasm": "00"}); err == nil { + t.Fatal("missing artifact accepted") + } +} + +func TestImportGuardRejectsNativeCodec(t *testing.T) { + root := t.TempDir() + file := filepath.Join(root, "sample.go") + if err := os.WriteFile(file, []byte("package sample\nimport _ \"github.com/gen2brain/h265/heic\"\n"), 0600); err != nil { + t.Fatal(err) + } + if err := checkNativeSources(root); err == nil { + t.Fatal("native codec accepted") + } + if err := os.WriteFile(file, []byte("package sample\nimport _ \"image/png\"\n"), 0600); err != nil { + t.Fatal(err) + } + if err := checkNativeSources(root); err != nil { + t.Fatal(err) + } +} diff --git a/scripts/heicbuild/testdata/README.md b/scripts/heicbuild/testdata/README.md new file mode 100644 index 00000000..6426b3c0 --- /dev/null +++ b/scripts/heicbuild/testdata/README.md @@ -0,0 +1,24 @@ +# Ordinary development fixtures + +`basic.heic`, `alpha.heic`, and `main10.heic` are unchanged files from +`github.com/gen2brain/h265` v0.2.3, commit +`b2d46ba787d8f0a2025bd106443ab1b1c7cd010f`, directory `heic/testdata`. +The upstream repository's MIT notice is preserved in +`docs/heic/notices/h265-LICENSE`; the artifact manifest hashes these exact files. +No upstream fuzz seeds, exploit reproductions, or upstream tests are copied/run. + +`main10.heic` returns NRGBA8 in this pinned decoder. Its name is not used as +proof of high-bit-depth support. `tenbit.heic` is PicFetch's own ordinary 16x16 +grayscale gradient with explicitly encoded ten-bit samples, generated by +`scripts/heicguest/fixturegen/main.go` inside WASI using `make heic-fixture`. +This deterministic generator accepts no input and is capped at 128 MiB of WASM +linear memory, 64 KiB output, and 15 seconds. It is a test-asset tool, not an +application encoder. The generator and generated fixture use PicFetch's MIT +license. Generation uses unmodified h265 v0.2.3, with its MIT notice retained. + +The tests cover successful byte transport, nonempty pixels, alpha retention, +NRGBA64 output for the explicit ten-bit fixture, and matching transformed +config/decode dimensions. They do not establish colorimetric fidelity, broad +camera compatibility, Exif/container-orientation precedence, production sandbox +qualification, or a whole-worker memory ceiling. Runtime memory is not measured +by the WASM linear-memory cap. diff --git a/scripts/heicbuild/testdata/alpha.heic b/scripts/heicbuild/testdata/alpha.heic new file mode 100644 index 0000000000000000000000000000000000000000..051ff032a140362ed1f5065960388d872285870f GIT binary patch literal 1256 zcmZQzV30{GsVvAy%}izhg51nBLl8SRGck>Ufyp&DwImTF4g`uBDLF+DCIdr3W^xIP z4Ws!AGD~v797Z5%l9`haHqym`fr$Ym!oZXXp@A%JpcoLal)yw7K*m{QX66B{1p<() zD3Fs1RtD6aQI>27l0XOoWuStLEtv&H1q=*~ahV0l`9MV#KnZ6?W}pxh$bDe=^Y_OO z1_plS1fY!)4vajE|Nny&Ff&X55kMrji^(AoD5>ql2-b=uvp}Jdb=oUW&2@Q9Qal_W z#V0@nheHxjJ-Z9z!J-XH4nV7flk;Y9hzS88=l(%BR~+J8kOF3g`9NO)-3xQA8ql?<5(k=C#G+TKEZez3 z0jQE0L@+3#ITRRG5En3lELBe|t#Ag}Tw0W8m0OUSZk3T*mTYBYU}$Oul*&x80tdZZ zW0WS3=DigT{*xwWCTJ6ruN*FL}2VPv1>4{ zXS4WpNT9rOPuzZoshc~+Hl54z#^QrZ` zqwcG2?7chja!S8iyi^D)V->gXkv+>q-P4+=`I)cw$20Ct4p{nUp3;Ig(*}mW?w1?;3*8mGZ}NOD_uMgOZ~T*gW($jx zuPN)?IlEs(_^!mQR`X~o&KP&t@U;erMgZN)<&OIXMLn~i$Ic*C1F6P_t{evy}Y<*DjA;i+h?#!nD zeVKj3Yr%;x({n60Y-aVh wf88Kf82tR#r-K%r+g^uUh~WPkl`;Rik2h=A!aq9<9v4chb3BwY)3enF0Cr5WG5`Po literal 0 HcmV?d00001 diff --git a/scripts/heicbuild/testdata/basic.heic b/scripts/heicbuild/testdata/basic.heic new file mode 100644 index 0000000000000000000000000000000000000000..8c192524a6665ea8bdf5b57727cb4f5cb2ab403a GIT binary patch literal 18543 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
D{Rg&bBm#YnaOtr;k02o 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

x?)A1cjrn%F_u)w8xAO_t= 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 hUJ+C@gJ->QE^}^~!xxb66 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

    NzE{Z1-4bflrs=G0bvuD52} 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%0A(eVJI$Z4?kXoK)Hx)`lEAv@fV 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

      TWR|5A0(eyd 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�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⁡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≷gZ(9T%RcGAa|dR0j{r?ew7Ix6{g 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ⅇ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

      12LOqRl?9Pw9ghgHC%iJ-_Mc%3XV?KV65w7r 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

      B85;Q8{-!+@LArFroWL!ob}~5 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�NwTGA9VPYnF;K>3)D$42*aF&l4nm{0R$S+k;9ISSo9B z-n`!-AaW|bT;F--0yHLK{{;mGRp@X*UkQ|`LFaBE36M=PoGGj3#}^j=s*^#zHI*@V z4{^Reo2CZ_nqk~*y|=LVn9B4ar?Tbs`nnUkav^B`6!oOW+1Vh6`qhuI+yBu!;FM04 zB(KxiHt>?9W1Q{vH!TRzbIPjO@de_F*%S2r(%r+2nfnBiymq$R4{u4%` z*u6>7E?#ef-t}UBdTMrP+z4c)pKEjkW#Y^1y)H@=MKfJ&ZbJniUr$-=4`3MEKzMY} zGN!QGEvQEP(DtyPHjWHl8J9-VOG7nGFGQF#Li+J32t8C4H0Y_Sle_{(igQTS>;q|{ z&#yFJGJ&@S6q$-YvD2f9@kdvK3rmcTDq4CheV`F=d6lFR8PZCA7m(GKK9Qj!Mo9)J zCHj6a{gaRnN#NPt`^N%kL5DoIehvXnCy6`+H0|ekv$Kr|LZ;zM?6P zVpDah93O?hGPvv{-(D9hs^qgXn>7+@zGONPyV*bn{wl-&8N9;WDNO_a_Q>#U@#L^k z!*)||rduV6lv^HsE>kOvAx!G>ScbD@@_{xYjNw$ShpaMUQcg+YX%n@K_Ff#3-rIo! zy(sZ9EwB#Gsq}jI>M*`*7R`G79xjmZj<%^KU5i+d#*IJE*#wj$QY3MgsPag0r?VgI zb1m&D@pIoGI9m^*C-GCt>&QlzpC9m!;fAR>z^cQEG^)85N4x1L6`*MNrv&)Jl;5F? zWo&X85+p`9UR-MLa<9a{x=NI5Y`&!V2 zsao_CkHvc(fVh~?cK0=OSbriK!3R>E5$fn{_zWeX5fPpq$~P14{tT%4Okyr>yp+G1 zMm>4U+9`YSwZ`k=0}Y^_h+kM(SbJZtK5biH6$~66J|mzY#D`}pwb%UJAFLLY{fS89 zr_tz^Acbe{{UD-$o2k`IhlNyX{in{-Qhr#7(G!D>03W{YbZ$RB8f{0ep{4bm&Q7Y= z=83SkVx(3mu%K!g@BwT^UH~>FGHm zsO4n$y}wWnbb&)Dxh~Q?_?00`VIIJ5x2&^IE3;dI;?_or;fH63w}U?=z&SrN4ueA} zuLt&7_xR>~$n!y{WS>_DtJHxK0Q21cj*4xLQmxy`o}v5>SR4x!g{Oa9T+| zI(UzN)?4yB-bRALHCw6n{c;zH{LUj!3>eRy^!w|gg^!^zIq1AymJi55T%PZO10}C` z>hR3RV2(QW!2V8^LPluJ8A15a3lLh>k6Pf9Fw@$C$Xf_D;JW!5mNWnR_ivd)7FvZC zxe9-I&efyh-|==56wc6(AcZgXdjYQD1XyeS)nS&jlv26nA{=ufG{zz~3E-Kfb#>=* zexN1oKd7X<9MDTQ>oYK&gMRq1rf9$2+K>j{4KGTncY3&x*75^ZZqb4*{-*Q}rNi5x zfUTCGhBue@_AMHgORED^A3Hdk7hjMdDzGqR{v6SHvut$_iBfov2!VrKTVZ5|Kc`_>`GvS$C3Utr@`SCOUZfiYi5^oUnaqZ0){Q&!fUrvYkb^CK zK<1~tC40bSicwDH7hYvr+_-o$bQh^PQst_re!deT+_MW=+)yZn^fXz1}1%8C0 z8(`~TX1*63{UN;x>kWqca52)m?=eQTX$EHsymdmuT-DXpH|M@9;PZFpUjuqd9;aKt z&b75EWH64{Ou;?5F|Dl`{}aO^E8ZnF(3g?%662_oXTcOw4X#FZL~77uC$(_hq%)~& zhV?ZQCj3N=TQ)=)jQqJ<9I(7RN$ECnkH==3hjVM1ymGlTY!WqSvO*sLHv)T{-=7}b zw)l$ML`BY@k`C?$)-2U^_$c+>fk4}}$#iD~oV5d|UmA^g6@V@SHE(#zucusiMp-7X zRVwluQ9owpV=*qByY5?u>T=!B0$UKzGS!6d7(LWr7kWk`pp4BbW){ipy;Ge%)8c44#Mw9(6`fUmM2vHmZ zqFFKb6E{8#HI(_L)UUG-x5ysqV1ONqn6?J2vHhlsU*v>A$<}aX|6p7V9)BX1CT;XlE zxDhJ?fII0Mrf-ut=3p4}gAfioeP&6FIKa+wu0j9}mK|Jb`QRvCj=#vQ!xab#951RAK|9QlRQ zwcW!|;LHP&Vm`*uyUSIK{rgmgd=r2XgSskks%3c_TyGuJ4xqnxyGLQ?IulbVbC7q9 zRA!x4lziz2p>75y@%51W{1&e${A+*xJFtZ?ZO5gv91ZPNV`zcBH7^T*y?M}>!ZyTf z6o}z0$upoKokk4w5c=P)i@RWk8pKN029`aZ7@mCCbcPg^{hRxR1w}tgVc6T`@rPCf zQ}5^E-$dJk<6|SEDD)izI4bP?ZS!ZA^&bZBE}ifVN^tbyMh;(T3D{>&tPl2?XF1y1 zDo1~=8bIJwNojA6U_@#1`l;L>pPC9rr@x1mN)O_}u-JUl)B&6TDwos%2N>L}@PR6Z z?r0Y3VQ@yM90Vl-f-+mIyPXSYob*g19^m5At-s$T0M0Tgo(oP1S%Xc~cvt$sHImVv z|2YU~bMOV)#>a!u>El&(l`wVsI3tp0z-z!uH6s}Uw{ajtJM_#W>8%4~)%5hiEF!k; z2~Y*AbKIV)qUj_jCRifwf8#z;!vjJR8m>vh046{6XZS{bfdkm$$qe1#1uyl##4dgO z9cPcorO4ZK)~_yT_0NpD4x?i0A=>@+g}Hip7NauHX7W5;rbH8YFR8<~QL z=!^ScAFOWdPtnNM51{uge5BF>jef6O3s_I+I|S|7y~2mVE)t1+5y|5}i1;Q4xtanu zhbIzj$OhRU_q-D9`FWkt`IXx|_`Z{5;cdQ}0|aaP^!>CM`ov3-KT@@=W*lNxkobMmDSog$;PX;PrH#Y?&I^CcJ|>U0a`V_2WZb@|$k=sv+_leuxs0>|TJ zM1|~QCkagHahbo)Zks4MR#lse$H(iF6sO-6MiE@^Ln zDdFkRw*k6qzX}jwkZ}g`&T$@_EtJJ^OXC|~PQq)Y3-};vor8rsa{#kF1dx`t&+m3C z^veL=0F}$;r{O~2Sa`6fS_$4!qwP|;x}n3jzQ-}_T{+++zfHJvC`4>sZoCcuqn|MV()@& z*IF2SmS~C$t6sbFJV-W>qCnzFfp;RWmo&F6f}a);CY4**O^{1Vh^Ujt8pt4ayfZ#z z9S3_i`r;j7s<;o_9KB?f=9mvN%b<)Xo$K?{xQbT#UE$Oi=+BKjNTP?DTVQKG-i3G^ z*2R4%Q+zqx@ywtA+xLK9;rE?R1}3dU#$iHEN_=39QXCeTbMxGA-UvjN*B=mcK20FY zy2RGGhtg2wt8uGYzKD8bnmlgEhn^S`0wp27f}$2k2_Qie(!$S!P3LFP->qn-SCzsYkSh;xAAF+!8Hw_iPt_)k7;$j23r*Mqf_!h#jshwvjS}Mq8Ve2H zT##2%u-aZ)FC|(R^4drh-o6R34OSm!lp!3fGH&sUiHTW*g+*|We1a1pk#t=|d)PUj z4T>n`Q|<@{JddH}uo><6;b=Ywcq9c-F!(tWdJ^iq3Dy_DRakJS98|J{$~t$CouVr6 zQ4zPz)56=NfG5D8eIVAnBFVNkY%+Q zPu@ZQwc#(ADRA1hbBsaA6&}mxViZFGIbR<_G)U`OmVqfx*)VmIU)=Bb+Ko;3EWean-~>Z?*Q$t{YM%`eE&Zs z+Z5qQ1JVWnnmG{|gi285pmZe9KT`7@9v)Urs2ueEHX_sY4nr);yrsuVr1)pa1cnvY zZ3BDMVq^@Em0N$xH?TT=^}%$m;S0o$HnAV5^1ur0im0^OASz7?z5lxos`QX!Nvxl$ zK`TbS%lnX8bS9jH<4`8)jEFnNsAT;TtDkY*tx^4dOWgNhE^kVfvbiG{grNr;f>Eo} zpq-lc8m<3WsqyG1KVwLGWe35Tc;W5c3(vz|TcOZJlV-lf@VQ_STh z8(2xj*N!T7@z2bIPMdN@#VSvUcdQ~!_>|nw|87tYAjH6_bcv!CqUNP!Bc-+yu%!Ha z?R~})BGDW+5u);@;e?Jmypm?JE*8RVi2VDuT|)YjZn67z5U6WQo_w8_IXIZK-U2lx z1FUnLlmn99wGpImcR1{1c*En(dAN70%Oz_f);AnyodcrOSKbg*&&4J=qQ{sN)9ga^r5+u#C)(4N=V*|1_?(5-WoF zAk|y~W@nUe&oYJceEVcn`}&NQmtcc4l#VtslH{3&r?U1!^+f)Fh7 z1H8E#GadQiV)^;%pe={&tqazug=lNtR(`P9dksB2)8i75J}t=JiL8o#dh9CqagkDC z01y0{J8}qGWu+SLJ&<_(h`VuT`Mx?2q3>XK#>n|h;p^RK$ina2BfzE_vVk7Cfqw>; zZNIK@Y*)@)#U2?M$pv|zW zAJ=$uxRp^PK#@B;89w%i!*OQ3Y=J8{YqJ~8FpEF{YYo{TIWF|m5gLvgz)hM*VE@tr z17z*>=6M?vOF&eokR_#V7!r#JgQOmLpb8v63^Qtz<6(z6rbkWxMerDMMV;e!8j-J2 zDsUDd_rmquH1RAyNPas_Upm0#=%J2?$>=ESO2hJa=zWG3ytS8u%w^(6YhOfpR z9PN4PZ@?9@Pe{+um)$l&81)hq2s*=p(_d*4{oQeU1i`@=fr_unt$3uXa{0c>a+zxtrPBKMseDRT?;X6G&J?a<%r+}#F6&=I`;bb&@JTrTGf~nC7HZon!+cKdFw0TO( z4m23C;IRptis*IN0Bo+n4oirC{x6+C)1d`}XRz;?71*L6xIkAVb$_=?%$4Tg-DB|6 zw-Qjdrve5U<)I&jc2{d%FJ}nj5@-!KF=7N}ckOlF9dYQ$jQ@$+P$bD|-o@udUj`14 z3-mxk`n@g);i&KcFOf1mis!i^WHSu|8E&r6?mRZ0c;-TKQcfz=%V3XG{6`rhd6PL& z0lk2l18=LYZ*slt%&aRJj{Kdq*T%VR1#DL=do`KFFVd`jYLWks%Hcb5?a< zv2Hp&Z^0Hjyebub%fk=;4uEd*q2avzoJ(cMZzK^>SUW+>taryGM2{OUuj=~jp~8ki$@zRC_&7qPIk zDz^a;k^ZI^B_E>(d@hT>W<;j}9v#U6Z})%_*Zv+jbvgYX3vNJv2V6FQw@-6S0KQbo z7;!&u3vud-28XWS0cH9O*6itt@k@3XY#o$qZz~ko$H~t^*@HBXLK68FA^NzQg2#rQpfT5iZ6ttf(qI~t&f38>jP+ya&aMC~I;Nq|FxZFf?l zEAENkej5Y6s#rwu(4KAUzB8K!-!cRlwf$!?Alz+sSfXh_7e;1t0x*i7OiI zB!g}uR4U{G%({|}o|L^YEm$l+-jQC)PaYyw(%lGP!Tkm+f2&xYEA}>275=g35V$&} zviohGcM*uMMTIE)I8TsKCMd`0?4DR74rGbwXH`$RJ^?lWi9^gGHUBk}$n(82QIFiR z8pbANynO|sg)*{XkSOAz3DtMhx`hhNl)IJc4MG+L5N zIS6|n{J;s^q`B?KCn&{f4)V2Y?}!DY>peY@vpSx5rz|$wfsV^Dq3?(Mg^%zrAIDhC zEKJ9cUR(=rkwu$~6i0Zk3be#9(=wAjxq(@#uFynu10BP2OM9<78?=8--WHX0>>KJn zF8E~4_{zS%$m*?qs@2)fB0U0L;4@8rF-_NYetJIhArjLg&%ppO;b*({I|2TOb(B0NkfeM8Xu=5ZmYO*+JD9rbV#?hrc7e?yBQgf;E!rZ zV$d-X9oJQ7_q2>&dGrK^tic^|IU7MbPLa9Y6dK}gQ}l|`#40MwY!VqxI5b#yiF+~{ zy1!NMAu0pOG52B+w2Nq4ItR}Hp*tfc6Hz%E$2c}hd2dhbIRIW{988_Jn;OV`Ngn;1F}LM5{@%c7IMQgOi^A!g_tIS zX4HUD$AGtW_BN$=IL=~O$U$#|_?xM2ZwuNxl`7}dzD1f0?-C!k@biy19qBXrU*?C2An&ky3>XQ_Xq8`35|w(|j~<8hM^!sgR36^zRH4V-F5aW;~G%csd> zChq*7h&xuh{dRQ9FM+XyZoG|}VNn^i^rI)-X5t~K2xF8=38}$&xo3GeZkY}SaUh7} z9b4dcoh}m5kc1bYbJ4MzXsc$}c*10mjeAfgSNz9N(Cw(L(W)TF##QbcU9@8fnQk$Wa4!iNVsUv6Iefrq-D&v$k|HouQjZ7nLRDD@KoM z*|XN3XXc`sGfjd-uy3W4*R#SoBgls!uw!lt3(O8pMFXo>0K1>>2@+JKaei#e%%X5^ zjb|ztnUe#ulJkuh;I72VcZ+QyaeKLHAL#xiboq+ZqguwaHJQvz7}9SdV%}v#7ot7I zjHgkcwb{MchKG6(V4alS3`WSwx1%@{3&$G}Df!it|1oJ6j@^IJ z@FcqVA4gsmLQeJCc|i1!ORx0dj|MjOFWfAJmfMlFd(% z=L|#sKoz9h%^z@yO#A-_amLXdP5?T=Wh=nSyOu5c2I>GV-$mltTl0H zCDt9FT_zNp_*;)7%$5y{9Ii=oH0z)0#H4qnL;65cmQ1Ir^y~Uql9&xHv7XXKRp8x&a%t> zwZVT=5ub^>1;{RVdU{ZtB?$k(>UXjxx3z&!Y}F>N@+s&+BS8d3|H_gdMevX3plgz` zuO`twaz!urtIzRAhH_hCu7}Ldq%KS5%=lMH^m)qOh8fh_-{x0pp63Hh0 z?yLYaLl?HIz5h+4vGb9GgF`P)8H{rX1iy>WS|R8lF8*gIaQ4~BAIN{*;AZsrpmLsP z?>v=Ov2Y$~aS??F9lR_!s8Z=>%MIEfW!0{HLR8fPz?88l9q_CCpl)+^e7uTEC90$U z`8Ce5QZ2SNI#Mv{ce~IHtdOVUgg?sVhnW@hVbOnbI!4YvOG}UpZ37ZivAArVAIoXi z+N}-HMs^s+pb@WmXq=SX+9=D*!HxAbBNAArggOQ#J|8|OqGQ#mcRS&PFGZ%H5o_(( zt}R}qv*HcI-rHS0SH;!>1$beh4g3TFfeZB{r~*i+zw~`5D4jS{uY?TB`&g#Bm%WQi zO5Pb>gD(*Qzs3evP>qz8$u2?}>=Tut4bEpxU`BTMVa_NCJ*&t+TMASUi^8fEnNNU*)#C5QFB*UIVzlVZvkHU3xQ2VfetuD%mdS9pO#Cr4TPF*MWWruH{vqEu;3NbIk)SU z^Wd7ckIxYtw^UROXt0xXxCnP&Nx~1X+p$wU8MKw6$H{5;+6$@uy!oQ_yC(nIa@DFr z4>itbw`-3rKUTb2GD@XkYvn20SUW*iESy>@Kf z@oP@ZpS)oKrgZ@`jOOwx+a5ZrbJ3%B7@}7)`424|GVgr&o>5s)@wd$T8zaXTHx`-K z-zCa=7-gBR)6EqCcO^6OGyECxnI+@TC6X|E_b29$OYScHgOP5sb$s1;uUN8Mq9nlX zp_iX$$@#$x2zWrBcFxcR$42J`0|>q&c4%&k*Itg-_l&uvUzoK^#7|7WoeA(QrgtT_ z?GSLOY||6Tge8iba@qKpGw`p2J`g&^tgrANKQzyB8XL)f-=tKc!yXCy=qidHt?)U5 z$f>_tnu(K}8yjCE zTbG|JwXfR4`SJrku+itK2eic!;59`)PL0AG(0cxI;+DgX+q?PnsKu)D*dlEJak3Yp zBMO$TklNli)o=Hs9`B%lYcs^py3yW#j_Ke40PbJnn9I05+mM<#n5;I=@fRL_M0Sgd zWcw37K7wd$nihwI#rw3AaF`zeH}>_nR7qzDM0cGbu9*ss64mi^x4PV(c>vFDVLw!` zOuYWcDd+8KX??vhq!0u#KY8LXKk~2Ugr3#q%!MdC8*=(5VYg$Xo|UMmg2?a~AEZ?0 z+ReyhaT8_XJNH%^Xl-n4o)7^D)OrN~=nLfeMd=U*>kx^f0PF*_x>{OY&d*a{X;p1; z<$BMhlWX&;Gp%1%{5J=cF=H(~&^c6+iWwRjDkJ_3K38WDu%4uoqYl8W|x za`9ZC$~pWTW^=Hv8u=nfZ!>v?bDIO2|c+usIeU2Oou*!$3!cCRlvx@~t!f!gKIuZ&p1 z+rb|?cy=_s*TRG`Nw>5*yVzGPC{~uh@QL@tmq1m0tmhd?dIXKjo7Bf zzGHaIeu6pNYc`+Rm5hle4q;YMRp}L;U}iHLos#BHOsUD7=j${bJ+F^M>@I5a+I2tD zDf4T6teR&%rT01AQEtV_pH7=FB1zgGI63mo19LakI*9JQZk~BG4(mTTF&f!JnVD(8sDg)|%p(x4tml0m()RV%OY1Q98HM4- zcG>rT(Eh-6e^nIeKl!7A7+10x__=Rht5dN414@b3Mf698@lha~2FaIVYhl1*HU3Zt+t=QbNp+D_L`YR04wqq6R61!RS5)WorCa0CgXbKA}yna*G}r| zWpulfbG;RXmR2BYpE6N^@Qu>#erX?5VJhJI@>(jLkjg=R%&e=d?p)7Th$L>M+IRNw zueDyg;h5~6g2)ys+iC(6Ra$MMC{*JCEDx%~SS3V~$2moEA^K*&qlceCe@Fa%Sk^tpSNOkCb=B4uOP=gld z2`j4=*FSbYF6|=~&X1oSp~rFhAGb3X*xeoVpU-}d|M(4_(kSF-T!pT&P72r@5@hR3AJUp0B{_sk?!1mr_3>5y*&3fGdNQeZEq^vPVa*1^Hd zDL0-n6=rZjf>E6s#}`9J;k)<95Vzayz-69SCiOA$3$T0lGMs5HgJg*UKV`uHEksEW z2CX1m%II-~6&!Fg2zDhgnN%w~100)H1;1ApEq#@($T;8d&soHlnO3W?oZigg?A~{rvmK zg9puHLaM}l;CIQG#9bx7L=l0M&oGs@PkL0G=pa6ymw>847{r=~`R|?LTyh)7qoKtK zS_Z*hPwrlgRxh^bh>jh`zi%w`+ z!`X2GS`R2Rtuy-yVD;o%`aRyNQE#iU#$PdBqGrIA|h z%Iu!qKCIx4m7$Ty(9`b=_~Z)BO0M+i#3R)QMi%evyB$gB(IR{ScKhCb91PQ(%m*sL ztz`;N*67mqp~YONCku+lNqbX4{Z+U|mv6t(Gq%tKCk3xINf*E5#n(8#2!CQw5Hkb7 zH_F{4PpW%L#Q2X`Wrb`GpZt%HkEE=&t9QJk9zv_oJMvgbEQW!=s-7b&qUUUiXsu-c zENgzY*TJ6w#I+W$(*URhB!e?lI;UH}Aj503^g^v;6krW%mAgq+Yby`ALAd!QD5yet zpQ|;0ad_&~+E2j6*CC=I6B9@2d*uNaH;hM^ToH|br5MwU^Cpb?fb2zz-qzLnl~jkH z7PW!~%dxe&E_|Kibr`ih(J{w3L#En^DIj=-&rI0XlaQ}WAhLjX{JIVw73nZvI^b!Aju| zMSqK~Xjy?|Q>DrRnSce)R=-BGtwM6JLsBKc!!x_<@zSl|4Xo<*pX^KVy7^2PeNH(K zU68%FiuCZ_!^2)zfzZYEg_{TN<=1YL21&whgnul*7jCQW_0oX2n~FiObA)CrQrl2A zra*c_?6t_GG3oEMlzLn5s!7D2qlTbsp0>lH<3xHLg|6bU&rUsuQ*YIx3j>Hrkp-Jc3CXCpIout0m54H(XyHt&m13@)iEPAVg&FW6h9+2 z4C3>ON}=@-7PoLrRwACe-K<8uT-uK?oyl>)_^uLq%69X?jwG>RKQ2Anob)OoZCxy7 z{b}1APDKL;*9@A13)tDg>Qwm)mqkPaBg-X=C@wXWXi~3KxPsFHefB&#UUPnI6)P^| zTB>1{VPll4n#me9&kLsjrOBTQf+2K6T40oCyWAi`vG#kLvv-rUz7xOJ z?x7g_Ah%7mW9~G9ndB7%5Bi0|G#IBjzx32bMRwg)Bk9`nFcvS=gMVL}0T?*_*_ zV|uk4|LP)j@hq6syDn$Xm%v7viQ=pl?YoL@DK{Va+-o3Sb*yX<7bL#%ZK4OoItfsKb%O~n&Z_2$t2@D*RW_faSr-;px{&uRAD!t)Q*Z`!%`+ z>&zOVEo=uzN5{Mwy~wstq*g{QHLflu@zQx?I2n$nbG&Vz&_pE9LiYDf{G#j_L2IB} z@iQqiI+`o+8gG|6og%PHkF^dOaF{vzW%-#Moh+LK1;aN;0y?-4h6}tY}S^PV7TJFntUl z3m+e!!cup(ie_sZ?35z{_0X1UP>7#j=6N5OPkQ@SaIRxV$SyO2>b5lv*qFY?W1~g( zJH#+hZs*spTMQ!KR5wFqb_NizSn5YJQvUw_Kbqi?iwYR|AkLkwzbPL)c);34ogT1H zUi`KN%oU$_mq&k32IEk&5O?i0c^qtae@&S$q%{J3zEViJ{DSNUoq`6@Xe8Zw;^Zp5 zYY2+f$|S5`HkIGhM|~Id={@Eebscs-SqYc}Y0z;3$G909z1a~ff!uqJyKJwk?Sdjj zff-7RDH-dObXD4q7R*}=TnG@sci7?col*3PQ`~o@!G~e(+c4Pr15g9n1;G%HZ@;0T z1DGRP6wP)CnD+6tVEgv%o4&sf#k0S3b=bO6xN%FIQZ0kQK_x~QjY5y=WHF+&!IxBR z1Xu$8`yv05s4d9p|8e!+@l^ls|2Q2^#3`d>RI-y1j+vPx<3v$JR@r+bBU@(3OtutC z8ClsJWN*se8L4neR+QiMq}TiNz5ULA=`pT(zngE}S$(W)U1ABX#J zabLsrsLx7MnL|XKO2k!yM-Snseh3@iJA{#PSW((>u{(bNq@-$d3~%MTyokQq`o8gL$wbNrGQW1nTyjN>$biLk^!=-&6`;Q3&7frM{7#b(1Cbzt%4@cp zHI4R^yWjN9LgttR_fis-p&7?iL&_W1L50N@GyM4VQgtfv&1P{kZ?q@dLV9sAV)t|vag;jezL~+TN>V;spwn& z^OKgy+j!cCyZm-vUj<_;JCnl{^;_rQF(dg0zSil&WZ7PK0~h~u+r2AS7j@5GLmlou zZMllrZF_D2-B;2)0lF(6-ed^0f*iR=dX;M^q-%eFBcb+2w4L{FoktdE0nG6!>LvZ8 zs|vY<@!R!%Z6fzHc~aO;R@-BBEc2F+go`H)`M=DCu3d zPgB!JiV|K-NJ7NHoat}Tlt^eHNS{yZ$Y^N>r&e+ibkZV3D51G((1bQg4M=1rg%ri4 z9LVeGz>i?7X8fjP)wqQNHl`l2R;+dbB62*79SyR^Lns$>$C(i8O#y_LTwFSRaTy#o z=M?r2!u#h4?~qWwU4Q>W=e38JQ%6v-3M&;7S3g+3NK``w2L~@tW)*V2H1?snWhYc~ ze{HQvBDgc-gj#=&oP%S7YnnUjU$ccpTKj2u?{Etmw>SnQ>)u^YS!+GDBtp;yKrNE{ zFxA=MuT}UjCxvP#!or#=e33ClsG3? zub?2dAA6O_ZE-w$17v3>_w-zd*5jJBHSzM&=Sj)b^c$z&BGP<@TZLEY+|sd5sJb42 zw#nN;!)IX-kaHgtF{l^W(4rL^m-ZhPa8ln<;HR~lK8ApABl}6?2O!hib7IkF`mOPg zshJYk3+w7u7wD)Bv7C{@M(T5Kq99bq>34|3o1hhH`Ng@@ zk3e;z0ZJ=;7!NBtn!^nXF*3SvmJ$L0j4G+%8Ikbu0F1&4%i&9fsxtGED1l2A0n*{I zv9bI2pM?}q$1aHwVKwk};Wb3f_n^RP_FsJqXMrZFgn?Ly>H%x5BF-u>mc2Rs5`tnm zL*EK>*}TAW0&Ju>t%z3)v>sh(|NYV%q(<~Nh0Jtj)dYDs`GEo3kRQ3~bM?}!`d9ii zGu-!A|KOUi^Imm2BK)P!RyUe)s~M{07-)Mt2rua>DAkovo`*y$q>g{xu=9ZG8_aH& zGO~C5)LaWe_};AALGfvuSNm4qeEZ=g)UKrSC_Hf}8x8&48#WH*@-TK|6m--ERN?+R z`r_;9hsM)hr=AfurCC;4YYs%83!=^cGcEb&9$@e@5o4xv6Zi@ zlz-TUA?5y_&tC=SpIzfUNdUn6k8I;*vWNLnHlrskg$a50uf7@GYngNx9l4=*cS}}+ zDo$JH?RP^XrtA3p23=*}2zj>9X@&lLs$q89D7>gB=kQAsk}(wX_aqCT@zBO-l8!g*FWxk5|K7{kTDv-Na(>VX$rEs@iz5yV~W z7ispzqa`m+(2c)Tp*Z^M>iV~N5#K~TI4->Yt(xOXyFfCgM4zoX;3lu^lt)7nV6j&&9zNGPS190B5VadvoniPHr2w>PNB%|`8s1;%_6W>>~;?< zW{dygl36C8GQyqQY zphpX$$35(>^O#a{-A++t;|C(Hc|zMMFW|~_8uJ)xi<^cnhPNkd^?ipCdD+HFtqu z4;J_ls#UHvklUNQ^y}Gvr|)40e6!?#A4S~&(y_pwq|CoZfgff_N!cv|2j;461p-U) zdY|J$k45@L8iMs;Ja;|T$;&M)I$)@k9dtD&t=DLF@ZXC|z^EXsakW66H*@+TjR9>e zZ-L)oL@KVWp3o6|5|G1HPTof(kW*-|z83=&X+k>s%N{KztaTd$E z@7Whv^tiU62bG4DR;0y%faK+8j)t!4&9r^*3Pl@kx4qmMTazxjG=c%z$AZlo$=F%K zQEBEhJ$`Dtg+H4e)<)9Ut*1h0^(X2bod36uW->=ZgeSpIBqdWp6h6O!$T9Gh*(=l7 zpNzwZp~kNP$=pQMeTxJuZqH_i#^=8SVC6g|#pPSld0dDu17a^R(Cg5h_$6N28CEb~n;o!O$j~)GYIZUV6!1J4&*Rh!`HHXGY*L52i>rmZo~T(4zt(*0;;2;`R4RnpX>pWyk&R)GH34=#>ImNVem-)L)};i2nE2f|%C1bmFXZ=E0mkUgw49~3$bQ@d zxd1nebEinUuB4<(QM}}kWxK3tgEG84CF#P^eP#MC5sjbOo2}~o1f5f1c*G^hZsK4u zZN17kQoHZ5)Lt4t#W!0(o2x;$m(q(M*mzJ{R6TbAapxSIr!J?~X6;ovam+%_2lD{Q zX!7doGhD8hxJ(@OH?N_&pfD|ZJ@oLg1|193UJ_v7xZCVS%ChO^`%fv=+%ZO+CqW}= z2bwOk!LMd|D8B!q{ZH@@J+?;(o;KWQ)`D^sR;U^;=#}AxTRd6#`#7!S& znQ@!v%ln`ktDEimLWuz=VF71y0-2{&ku_u<-ZVi?btAx?xM;PTGJcp^_5ZND;KO|c zkI!8BA9R=XDLe>hD;TK%&!Tz%8Evc0QF!7oSGC|R)Rg;B z>&6P=GcMhf0#*nu?%>r$s4ICX@azw&$4V7t5=*yc__|2Qdk3PCG7?-iLwt6L?MG+Iyq` zKz>dkIJH-K-tPw&#)4_forKaFlny^Z2|rA<{Ar94r)Snf?R~y%2vI6tKXrtmiE(o> zukVS+?gC?qJLK zbVa< zq2H8y*E+C2Ai`N*CUfO79Ar)*m{;S@{9DG6OU>KPi% z$yUubUrb%i`NFd6v%%%RGQufs&DE(Pw6$z8vk+gu?^@>kIz8i^UBu=;q##^nZ)9n- ze}2EEJ9Vw%(eWRQa8>Zb@qHP)$!5%w4rKhO@ologddPEy{mMhT>7Vl*S*r=*g!s5B z)_`P7vrUZN8TxJ$<4Kjw!5Zt$mF@8>k2}R2MyeErcY5(<={et@P}yZC0*J_z!-XnO z`=L_hJXoD9=1LKo5OXjE2|Ciqmb-8Rj7y9oUuB>f56;$`uTDC&BO*^DSFET`2{J5n ziDiv5Wz-~Ex=i6e`T1F=i_yY56J-}tgzjVX*7K=9$&}P@>b(&2^P<+Hz6VUaNTL2% zd6JH9!D*^N{(0Oqv{QAQ0O>y#QLzl;&Q{q^&-+0WM(N6*oz0&4hQELOH2jStoFi-= zFf%4lt~E1htVB}Ta7KafEACm@zfKRy*t2VVlW~}q6QIrBfzD<6FB{mWC~Dp0L}lwt zYm>L2GSWK$2WK87B6Pef?xipdt`tzTur=d^4MB2b!^^=(NwIg$5U%E1cKf>l{oQHq zV^fx_1eb=*ly-=RT8NO{) zaNABT-+UjLZCB?)39;I*a*+Rh&$7b#eflK2_TvDH`fEuqf1Mul&UWIJzk@9vIhd== z_p}N5T+bG;oEBMSys>&23YJdz^kb@l16VS3bo}AggyWCl9=L-VdJa}#v74xTpxXYK z`cM~1@eX>+>@x9~Oc{*?TrC~?I8jP1yAz6nNYN(>j=hjwZ<*g64#Dg2UEu)YsI4TJ%&QO!DkbQ$|LnWO+!>I*< zeia@YW8twVHK!!R_~C!9a%cRj*8Wpc^NsY+fG4V z+4kWjUng#yKLf|MC}Vtg1FSzv8}yv8rXX*2 z{pyr4sP6kzhnTChdaFOYA}H9%;e9swua#(159{g7cq7kO2D~>{6EazUN*;c>;;7M~ zdZ8!5+Kmit{?_|YZs!s45kGZCEMxfUN7cZK%F~+ryurgYVCu zj{SJqo5FKkT1%C0{wYbS0*$ULv6fljF|E0$+UCx};wf*H5B>2l8JT1h&*7k-%u!<{ zKRAQ^@#j}->_x^?-Jgia2`bJ;-=)=D%B9&n8Q6h=`N1bd@=F&hc?&2EE>rwa(|vDc zk4gDRL#h4D6{mqYnsa0~<5NUIi!xswP4$z%Q#3}VT6kqXn0e4$pfY)3Ziw7rYnuz7 zQ?G@0BtN={cjT*Mht3P{SRliNlf&PRs9DuJ@;%}rv=nZNLu(khf4xp#I+57YZ7>;0 z;}n&y-sJoS*|Dq|5eE&L$^NcECUONZFlFywO&&d>EK(#_Sq45U8bb zXK9q*;HJA%Zynfp>kfHWJesu=jiYAz5KS zah2khYby);2H#rHtvdZPvnkspslhn&4od&J7Rsj`zOz1b>Gu`h+X>njvPofr|XA3 zQa%cmdRTi%=DSySTr0Ohd{UJ9TsATApsAv{;sMVq%_<;*noTkvCh3Mx^W^8!fDV19 z@9baH%`(<$#j$Abvf~~U38OVtRb&0B6BA13`m8t{I5$Gxlxc}WukR({#1L2xMfeeb zIL6d!b8^x^)pc`&HA4YR&CCR9f9D9{q`mQ<$_$IkW%n zw(L}#Fm}jDi4#uN!^)Dx=FF9@yc7-lY+{(YW4Q@tj7B6IQ^yL z)Kxf;8Ezz?c&|BOGRsKwWrVF`V-Vj))-ppoXW%84(p=Q*+V^6=0qT1^fhq3PjBtwD zgV@k-0_2{b0FMj+(rPxvQ*Kx>{AajRk=)8$1A}lX{$H-m|Jjsyt8c{sB3!Gr+ZVw> zx0d}s2=|TEf08}-Yr{6*E=IRm*sq}Jj80CO))wCk(=CZ|DOIPc>tON6yIF0+9@S|) zgLFUZgRu*YXZ-6&-lP-p6dzKvLXiBCd@5&e)xY?ZasD^rpmpmb4FGg-;6u?PdPI%Xq80HL_k6sMXBB&PDFYw$W-;Bl1qyikmrbXB#@Ox}kwfBhvm( zI08}i1hoe=$`=3Z*Rk5LOgN1>x@Z+6w|7S8eHj`=3UYlDt0WJSTX_yG+&QB-3MZ}z zwf1Ti3{2(kW$9D$ev`iw;!(Q#jDtR(e>KzeE!Z8t+ja1+^0v&J`iCt3GhZ3c`mK(6 zwlpdMt~BJ~f6}>}^8SlVoz4sxFn1zp{Is9P;{5e9r}RS4*Uv1b;|&2hbsh9NE|BLY z5s5jeIEV)WzEa5&1O_3_Ng7wl__BdRi5@b_fjLuwJ?18$L_lyq6d>*y;r3JYgev*4 z9|*c408Yo>7#pGxbJ6Wkq#M08z^nhvW&oY0tl!mUkXWyYlRA|B7AN6L-URR){bV*tXB44qXz zK=h!QT~DZUV8C<^VaTd(M3?e_t2F+tZ2Er`Imdbr<=ZPS#Lo-a!%*T5&2L+T&S^!-9Ct|vz` zBn9TClJfffYY9Q`hINXVzb16LvVO1j74)Ho0SEZ+Ak@8LrzYWH(4XFk_?88^7Kh#= za)`#RpsRjl&#?>4LSa1Zs#;j)+d~s@wrEskTK+rrE&DtN4GONFvR}o)$JjCyIu05| zRK;DZH2X|gFIpVx;oJ|b6pzXN;B=oe!*g>=z=1!_<( zinDdB|`6%~n^YU|MoF`;iD zbrXFWhCRmPZRi@JRWN^!^5yL3-?YnR!7{S$IAqjUDZjaY**hbb9^@Sv9|!ZE`E((W zp)1}G@yYq-Ka@-1qV0RZ`agtj4oGoIdxT)|evx-k6+JQ|5D`N6={otYl=*jQGgZF8 z0TOoUwi2k22O`IwqWew8_a+M80}qY8Ao9nCj_)ycLXPlQ^XBI&DN+|G4wLi#64bqU zuxlHcHrHI7m^;V+i`8~*pXA-b9%d|B+<<5h*;ap4xar1MdVG@YsdH?o^*@NBSS7fW zhW{TX2M*D5AkWDE!a-Z9O1D{ne76jFeEIHVs-or|tQw=1op-RYecMxce*QG+9cB;n z$x~M!tk3lP;^#$&V+>3wbVMh81DZtL>XSE`(7KZ*c#5dN08ih!Jrc61+&$cb9(S|K z)lZ$$i|^&vYZ`$K;G+H0oOEyXx|>(h`fjcoGSn1wd-+V5SfTcu)1uW}tu7BWN}tyz zT|MixUFGzQRM{okM`UT|T5KUuQ*! zaMLXV*7v*2FeDC{$DI7@PquP8g-8ZplgH;ohGN$#qA8v8y=5Jw9F3bd%I_$f!Z9I+ zC6`y|TUB?$j<0mx#&+{l#Nc>@87MA{ZN3*im9!V+m#z!Tz-A8iQf$T>D@@aps-#K3 zwk+f<){;!^RU0$7DawlSU9GN{haEq4id*VoyFYtXbC0d}Y*^al&Aj|^1_K_lYXA5k zANZbWo+B4qs5H~3NoQxOzxolBa7#T-IHbmS^adUKh{)fG1@qc3OQ0=`LB3FSYxr^M z%iL^u>#S!XuAmcTqMPA(lJV%J&xN~YzMRH0BCPzvyWg0$I0P+(=ollLumlRj50g2U zVhdXhBR$wi54-BLn)hOYk9|p{n_FYq&b^7EvI_Vx(@Q^x%|kBycDj?H z%o7RRa@<-~!JnDV>YU-_53*xCamKpLc-nO2D>dAKUR7+E>lV3w(nX)x4jF7u*y#zrP_D zw}a`j1D9=)je%@sbeZw&E&g2ir8j8B?vJt2lnh+R4xZ;csTBd+?gYFiUp`8I`$1YF zyWO{5lT*i-2iI4}>X>PD6+XxyUNFjIbsori8rN`ntQ!? zCVRN5T(RAMuCV9&lpW8@mCtUMsi-S!(raRgV@&Z6uY6g#3B!`@;evg|Bs5vP=r=_R zp?EP;>bqm5#4$U$LzymjGTP3ak#f5}$DY1_}(9f1UN;b5Mae@QU*qJ%)GtcYjS*Zb*eyD)*1RDU{58TsPW4*l|8sAd!9JU z`C5nDRMc-Kgcl&7evUKXC01OlKiP~jGm1OSk-@e1CMLc{Ic!aDUfuBic#2vfz*2h; z!d_n~VbnHDb%$OY-Xh)jpC;Fuoo-qr^{%`prkQWhXK@}dp@grNRobNzSSed1@^Xs< zj*2=-y3vjy%4q3Wm(|kszrA>bvl}jaM;vn0I6bj;N(+qr**~QByYcr_M0J_q-fOXf zNYmmiTjaYU;+7yZ`|aPCi*+pq+T#UyLdd%87e_#NrdPpglQUyFVc$m!`LMPwC6bbs6-+dE}~m(@P6_&vp19Yg2j!GA3v-;XY=+ zy}`p|j~_z`r9JU4LSwS&sVj2^pb;xTKu_buID zJzlQBZTDq6CZ6q+r4F>&&Ua=!-fPNM8Ky|Nzd^$d{Iduy;Wupq_pH)s6gf+(EPaJ5 z9D26z_GFGN->jPXm{VrGug>7Ib@oJEYFS`3`Er_xQ9pKIb4*$VU+5@NTd^+yU}oy?SLEsGGG5t=N3@P1KEZIxV7=<{dS9LJe&V7i zo;UHcX{ivvLZF(yY};wEux!lIL9@mI-kdRV-SZJwM`AC`vVn_K5LwvD- zd(_8L%sKPMRGim^%zH3V{+}LE@8|s8r_pSOx>HM6f{2Ue8ZIyLHN@H{39pU#-d{Yd zRQMIiddZU(S`>kbN49VzDYE7hw3Ik+#66BYpX|i*X}!;twi1FSG+&ZnOHQ&iQG@tPL!FJiEVgTOdD#_~>5iL3rX897q&>h&BBw?{;3KMm&3$Pn0 z6@?*0YvGhp>?gNw(jsBBN}5#qGuiJp>gUl`N&0s}lYnldj1eM)TDf8^DHMq+-FDpN z_3{YadfyY&1aARzdbIONPV3gMAY$N)ccU!w}b3B&LzOQHB< zq)5@wq*G`k-JbJV@6CLAjTof`WRff>L$9Z!wx=0Sh?X*;n8`JAA9$c!pHdk5oUU9g zf6923L@x?T0^x>E6vxS0(f%9w1=4!KjEPIA8S~fnWhaupTTH*OSr750fW7DIW4SVt zIoU?a&xr$?iO9VRaK9IDK9As`dj-z{6^i;~hyR=;yqAsrXvZUb-sX$wAA1`;z^eqZ ziIYe@7%7>S834Ijion$^M1@W>a9dVJ)tx;iCT5ELvZ4B2)$~$=o|{zwrzGQ+!uy8; z8g%;U8MPCT|1s<8B-AXN@|!K+PeTno3=IYwyv~|gCuGE5=I_OJJOdsHHd_?CYNEN~ zxIrlsKT~(^swJ%kI2&X~blh%2%BRTO_ZB3%5rmRsKyDLrNDXB=4D+ z-amtoEKB{~B2d3FM#Y9D84qIiX5Lgabb}!~-}P0hAOsVGI4^JO=u~iokbSaajwn(@{E3yncv}M?l$TnGE^FVv^S_$&748k6i1_(3+sX?razprV zgoNaZK4$3f>5mp5lw!RrRv;2TI}V;bVheBD^1}y_6a1r^Doc)7G=_0o!xk`jbk<{U*#RTPxW$763?8e@8eGbSXF4D7X$4SLg+4fXS$rG>9t1;Lzb z;&i)x1eB2Y!lEdJ5lSdj_52@p_ox(`8R>WSEy^Z%^O)o3x_eL&kcv6$c?<-|B^X9O zJ?*WLLCi)UrN;pC992KrS?u0ytZX7`8}nS1!Y++#>8@YxJnG|^!-zwknnZmVXeuS+ z4EF}M?x=mUgCP9fn@b0e;$1#0FONXcZyWnxL3y*MTs7?W>E(k+LAfGJzl(VU&A

        rS(z>#Vma@4gEX>qN*V>|TvxeoA_*KEYYI4iL57hni5bQ+9vTZk$UA zNH~=yP5vtK1L%aYsgOxSA^VQ25ES zg%kZEs$>M#%*QIXDC-;I@c{w6LF|UPhS_Exd&U#f(v}9iysk>$cYhLgU;R_vUy0w+ zsW;pEmh-)UF4u12u}4p5NcmGHqr?otqEKxjd!swwE4LeJqg{vDrsK78rH?CV9dQq8 zus=OndwR20P%#Cq+k^Xh|C~$qq}s0_$)K@*JDG7iVZ532f&s&nUY9JKM!5Ne{I(u_ z8|K~i*|R#_eSOIqL6R_xp4heI-WvI4E_R?mB967aRU_FW!M7B^XE8Q z{=V5G!Kf*aJa0uhI-QM0rr;+7Gox8dcoP}bGg}-F9rF=(9-wPsNZ$N&?Opx60Nx5? z&bcmeJchE_lWP(glxyeP^{~V6jc0doP@-Ig8GguiC243LMrYmHV=Is^(%>boHzf(_ z5Y0Z3j7sjJU}vDPPfj*^WbKBoB@1AGB|_Ey0i-4csbex6F4G>9jI}xU06OI_M13hi z%UcTL?_HjeVNNoW?7Qx!HB7>@OsZShe!ZNzHSW+6RE8-@b-||+^N?dXof*J1R&8Zn zGrIDP6j^}k{dTW#>>Mm2c*t8Di#Mw=m86QH3}m_^E0AE6RU^kE>RMbgQ6^EM^pWtm zmV4a47WhGSDVGcgpegiDt;POnz1+TTZLk5C}-q?RQB5=sN;6&Aj zza%+b`@3eFCq}sh6N@IFR1%8eQIuQv!VxRtgWnTxFdjK}X3OjaW#GwEZXI1hEX&MR zP5hT7p;68;uy*_;7#%H+!|ZA#vzBym$$X#J1? zNj@1OblkxC^9g2y;}qZC6TfFXA_-WnNDc_NDP&v8 zk9wim&Ciue#4Y`7kz2ZU?(W?eR=#;b4RC)&zC9;=H@@@|24PV)*yAoJmNs#?VB;iC zfTby9>+)Ma{coMW?j7YTqHK~P?Ed6Jr^QgO#}tAjOhksJTV|5lH@N;b;O9i>xao7~ zjfxG{Zk>(&{#l^l@NRT4PT>#jLo?qlihMh5qO>gpC&G?fh|E_I#Ko&RM#?JdJ5-_O(h6+N80xQp>z zJ3ey~U6fo15x^EmTzq>k%p?oaXZ%{T$Wwps$h1FwkGuF7_fdnLp)ru+B)d?CBQU2}sKhPVk5z7^6od0q4xR}#; z-G$}NrDmdJZ3_u(PEW=Mb3^*pI?70L2tL@}-H+XP=A!?yt>skqGhn>CzGY56g^QV~ zPH4PEl@R3*&UlD8<0s|(71UHvdP3BOD9Uyp|0Fdn58JWg|2ZRlTbmpK@l&;7(t<3@ zrYIX35+yAa&kg$Fk;1yM3-IJo=$`l<8~ghdP)atOyuk$~0jOS2@OkzF;Jceb!jqhy zRwFzlbsV7Z5I|vCMzztjN7O+9kc8=>gUIy9sX1k|HGZqllm1nJ?yyqAJ%HZ$JwTnuV&Qr zffn)1Z#;Vd{lS`HCpm|w`@jC6-7XyPLn2C`XZh|w@IU!Zw-K2fD91)B)pC*__pbgH zg0%jpa|*`jiD!!ZzO zAoJ-uzbKP)b;3qx<3d4Pq*y5!1B$H&M^9h^-db83Rp3gg+gRIVw(8{nW8t}m}^F} zAvZ08!>fBdG|n=gwrYVCQ>Q2lKRzJ}w>NnA=%3tQMRC|V>qK%V4{U&y=cT=(J^^op zI)SE&Wp!kNWHqy7|D9D4LM~N@LSJdp2Bq{;g*DmmP_h6qGu4K!WfP~e z)ADGkP7f?Y%%T_|D3~~ab;vVT5{j3aL{U&I{~@Xg(yGPwuaAqs5PzzZ%#VRq$w z!#bI7iR^*Z)|*n3fsYQ4?HsC6e2C6>-QQ5u;d;neXZ@pFsG&S;5i{snP#_lF;z8(T z(J6TOPiz(zJGS7XS+>(~KZKZ>bgT)ldv)+p=J@rCOAO_Gh&}HjBaT_mOS0+r=wFTz znsjejfiaP%qSr5ixgNuh(`yU4=0)p2)KFIg$|Fum#H9HppT1n1ms);$?#C0wmxJCW z!cIzUdp9Y^OS)TYI}zgv(aZ{C86&`xB<@(_L9B9fOiNXH`S9q~u&|@tFK@)4C%@Cj z0114^K$)%k~=2p!0X5n{2htn zw9uiU3lr!@8i|^lPeTiMiHIoNYgnrRmK@ zXzlNC*`CyS-16kKsL*Ivp$ zPdQ!$F6csBP{jG+E~m9M`0(C%5Ck9h-TU|N53E36$u|Z*uZR`6XDkY*9hD#1g&qtP z?=-Qk5$JVOtW2v4a=vr%uB48kp=@Gb|Iku?|Kn>5Ct||qGpT|Tb5n7j@Tva$v5a)~ znUYl&_haRR^e@E}rqIj^#FT2%hsa)52Mfj=e=hXh`|HP?2+B*Y@gO_h8>2z&kKfaK zlV+Dg8kGh``>}ZS!4m=BzFmXwD=FPn&gKlL_KR#g;+uJD6eGh9u3dXCOQxrOXFU=h zaDRN!>o-pAzU(zut$kZ<4Mog{M^z?bD;SLNlNQX2`C;s&1m=XN-tc}YWx+dWg|{YM z){};+;Mm_}|1KSt2Uzp_SWCuf`^I*ktJt@RHeNNM#pXTpTUE&imN4O64EPvfvM1$g z*CRK^u!QIkK0jWuCh>Pgkw;XS+*>wdw=TZN3MykaMGjNjU-!SB2Y%~6=JV**@?y^( zYs=Kc9J+asVPwc%>P%$I=O1oTe`P()2TyA|2KMdIo5cv+Hdg(~Zu6P?h!R(;hgj&t|=&?t=$1)7t)ZRqO8j zu~QuVaLBG;S~T&s8ex3RI0iYwTQ599WH=)GrJ?O z>I66wp-1CPI2^wGV`m9H3BX?aNBMOGydS*{KpcG{#y9KXM90Or>R&(U zkv@$|bWl3=vOW_oewHMRR(N(_Y9o!g4SHEaYPUpOuMtY`*Y_>L2bT>=q`$)`WqS5t z^U<3s)#nLE67h_ChVFw^q6xfBB@Q@T4Y0G{ei7mH>{zJ_ zqE#J>iPNa{biPmm?|cNVT9I=}%wcmS*L4}OFd;dS0nD9wZDrzZjj>QHlXq=m=+Fmb zk2Im~OmQ(9@%lv}EWNeb4rS_kKE^)_=g3c65ULD^R~Js;;`_fzm%S56S#0%fW&(P^ zH#NpZae=tmE?(Y}A$&Y+nKe}Pu3S8Y!o*jkAN!)l`cWG$f2SfrxjM1w3fL+ZIJ$-= zQk0^RDisWi-{b zA72es6;&oZW4R{gQ1^1<$yB|9YrrR*9`&X7LwGM!0UebBS7AoX!dHvq+@=pc*`NKE zn1cwfp_r(U%n+dn3!z7rUnA-otO6~f(UZYJ)~s;FYohPoQgW`9yL9!G;$CzCyUaDQ zci*JhibqQ8^FEZ4)Bq*rdTuyka_NnSR;yp03N=0C>;vkwp)qSCbq2(uz)9KK-g=u& znr#$`DpR&t3pTjqdSCX~tX~h|KXv=cHKZ3d7Vlzj$%}KV$eD*O}Q4KnUzVuT5 zhfgG_pWwk;kG_4)Bp?Sp9_o1l*7|Z<#ipe^N;x+XX-4Y$VMJ+-M3pn$1%qlg$8#5= zs7I~wp*J8GoCITUWA)F7;X}>#wZ0ezoRyVvv4U{gHt$F84d~4|irk$yyO@Q$7vVet z2kQF{RnchEz*>g2o)TQfr~b{==hoEgW*<~~_D_6gIx+a%7gDUkoD#QM1@*A8x7qaH zL$5{&Btdd=vi$?fIZlRTWz^wGtWdGOhd|(}3&cz`oI98T4Fy(%o4nR!@h~ir#-|-z*|PK;rf}AZgEL#mq{b@*+m)BA73J zYv*_=bODc+)ij|CqqFG@(w;Y|Y~q12Ql!{bA$a+uyLSD9;@V$n(IYFP z&$Zf*tGyGywBIwgc7#(^a5aJ&>AY(~*IvA|3?cjfV7XtL#-xW&ctUr%?BLd3JL1L6 zkey{s+0^M-r~tx^FJnEMf>jQ{TZYOlefN_vxc+*w3OQG~Tkf_`dg6YX&8r_`jw0W8 zIE0RW*sB_Jtrj|#W;}3qZ4oDcbmApyAGFLp1NJg7KqF3I(i;`|6mXQDpTlBWkl74S zxJ~14OepOc=o!qsQ9H8_+v4@iX+Y+(`97Ww z{&DtSH8b-?U_4DG4{2L-(5^hT`aYhJlmK>?x`nRS$ae5wHH9&+yn?zPA`wEkXGng4 z<4JP_!n+NqRc?hp9VXe3jjjU_HF%hE%y!w>>ih$uPLnS6$#0S=cL2(vIw9S76Us8x zpKh{Fc5b+Q#+*8R`qLz}RLa)TnY^OLifd@70MUrR+80$mB#(?pjNqd;!#nToZ?4i+ zO^MX!R(QTi`vf{3u|FOcBIdN`4f1NDW8K3Qy?-jUz#yn@C9bv(JoQyKyI;`vb8t}Gn!)keC3NjK0CJ(oPq$>7-QOq*}Z>&wk(>2 ze@2V<<+|F!KAWbh9~hV5xu~B}b|0|=$JznE_wyH`#I}njKjbVIW*0bsv16r&VRE>Qs3X<(xZP4*h;V+<2Y*TtNHvV@ zgP`o>fuQ|1!rowZX0uCp6yMVVNtjqK4?9IX>uxb|9)(t8-RIi(ScqLUl>@pw2gI;; z)8?xTiSzjwyDVINjgeC`65JnrvJYfdj3HxM@|JP$KY;u!2cD-08yV%l3LhBe&fcI{ znXaA=_^Lbmj2rMZPGaaY*E7~O1_=?4JA|OlvH3osq4;u>JSo zJ$G|AvIeVf_qqH90n70t+w0l6Xx$pq(hdD_xv1mZZB`mFsjV-RI&@OR+g7VDrEE3* zHn&21DLpTA?x~PAnxd@x>*&C9D@SsQp@W|c#qRZE^~~3_8L@s!8}1?J5VaYQY5zQn5~O6EG9O6lmG(bb zSS)H3Gw;O$1G5js@~X`pwi%qjH^{GGaYtvqUH3lA?uDXgci`OV9*P!^W-hXf_;u!| zxvgAzdZFhzkU`_vvI~qYg8wT_to3^jBF?k17@(G2?py>(bW|dkm&aPNMTRr!=uV!z zpMKYg%rMX?J?a;R_k3gGcS*x58dl?FKC;P!0V~mOibc;>i_M62djBU+R`Z|3N8jn# zqg3Hj(Ie32B&YNn9Un&=%bV4VI()3i^4ga(Imk|j*S_95ckBq*_GA6epFf>euzEYy zk262I!RsN>0kLJWcD#h>aEdOb)~}`A zS2mr81vS*L5?Jp2pYZt-DhPI~Gzq8lyD?es+!i_$u{PQEMB3S;2__P3Ca;KX*bzJM z1~!F;hVBa&x=k}D(>Qk)4(kreOR#|QBN%(x4VAE5W$ic!l>YT4e#CJY&2nm zZqlU9E$Dk{z?eAy5#=eOd>jRM@5gKwji@9h*JBgN)zG*iJ(_zMcsC+r-}|R*s-hc4 zEcMURK#2MB3>?C3JaVm8Tr_1#MJpb}S=q74Zy5M}=qU~2(`%&pVD86Jx{Ua%1P>Yd zv~QHLyxKA=c(dPV2UA^Nz^oV0^*Nif;|zIGJJgQWK2yHd+kDj>oG;ptl0;nZ<+vQ0<-M~iEQE=JgW z7t1{;aat9R{#Dql&AA^Eb^GQB+F^M%kq>DQUAZY1%|s29;J>d{5K3rp2Vsd*+Nw#`z z3!`aO?f#AKKR5#y#v{4KXJco#Ak&C|&fxMGvc4v={v9QIR5HYSCs?SS_d;;dN4K5s z)Bgg+i*WxH%L-XenO`1!#?2A@()gTOX{j{1F(d~-2EUq0{?Yf!yGmB6afG^K=sQyR-V7UPy?uKsWC(?7t^<~ zvFKyUBRro1(8{^GHrP=HHZLtLS?;6Sw(;R`ByEKF05nz_KAr;6dAmD1JKw>PuCZ2a z9RNaHQ70K>KKr8jX@P}{u*>MO%Q=cLU^FfU+u`*Sl29Wu%SvW}--Uf6G9gpOdTt*H zgV(+H{}Zv3Jg2}KxE|9BZx36U)j>vxP7GPZT0uDfA`#P zwZP1A-vG*=poTMm(gKQ1swYSJRN!gUWS4OfaBjR^Ghu-h^`+NWD z_1w?3uh0FQ`@Zh$7H4;Kb?sJ{u%BW+Zci3$K*nWWXn(wvA!51lr>qVMXWY3)#DZ%2 zZj3nom-(J7`#dke=k)-4C^9+ajaGy|-^~KX)l9RWsVRg?=MV^=KaJs!9Ud^;Yi%&z zF@^0ZkBBq-E3i>XZKQwQ5$Gs}h~&DlKxEYg^q^aMVS|{PLN>bUKTzj>csZysj}Wq| z*nw~xm20gbf4Af%^n~7&`N*$K)V_||p25N_>bcM}aYU8FvmPyPa~onn*OseYerbG} zW^rA1rFl##=&i@c?bi7NdIj^XW=xqA)KE$Dks?Q|p|+mMx@e?|AdJ4w9%#+z^FeIk z>3GQZIgj_H6-+AQt0oWr&AWa>eqqHK&o=GKJLcy<)i`kiCB?)OsiDL+Ug(G3`toXC z7<+5($sr4;p*=S=smKpRE%1}h)lyw(?7QF!^R5Ve>qpUoImEfOjLSo&kMD#IcZSQ= zr*EKL@^mgeD00Z}r1Jm3!y9LbA_8H5LL4;%F0G%}XfI|nx6ah#`&57u18yZ{Z+r%$ zK#A}DCHXsp{2XW}A&pQ)SN%L$%x0>PK{CHguJ z_bRfTN-ar(b~>+`3kmk9M|WH`6sc#7{>7_t`fuKD@)ci*JnR`Kn7U+tWI?+ zJ$#dFJ-qm>wWP?mZgOF{XfrYRcz2zF%TnUJqfm*l{rUSWN@FRYG>KS$sklj3hL7V( zt8*|JFVX{xrB(hbUl4iYzb!8W?8Stiuh^M1}*7@#Vi zuMA4iO1rPjXp`B97e#~k8A1Xj7w5~nB6M--bXWVNMuAfo<6NMX&vQaY03q(&qbB&T zqGhcpimK~P+WjGti7{Ty*V4ShN+id8kk&lQT3>D4*|(ac`h*gDtN7@xCSS3IPkt3G zk^S+`L)O=`I5egz2>d(<)eu`BmNOjzuV+~oLGyX}H{z)C)#~8E`ze+2?vo~D>k&m_86Ft@ET5&Il|{pctfJI@n7$Fi0t6l`4*T~|9gU&4T^ zEkU;iWhl?il%i5+#!jre&+j?`QQ-IG_%A(uQ@f$%dlf9%w%9^-zu=0fo zOEM2t87(-N0x3Zn6Dt#b!zVeb?TfAuoA;CHLciymH>&!l4~eSxn&c}*o zfX33=eBeHx_>RQAe^~QCC^cV4&07X|uB#M8o>=?ziAT(9H35kCp1e~i;7suVmm`V# zy{Ihi5LZT86m$0o*?TkEqhg0?qLBQ%UoS39_8v+Gytk|OA$J}kxU zs3D%~?ox{+jCA0&4K%;r?5w_Hr3GtOUi#)vb;nkcDmh$r`xcnjF#1-bX zE@{sM!PHPy%}}jX%z{y&w-SSDp_*eqDQG9eZN{4ft)t}XdC^X-XNH;~PKF}Hg-333 zik6b?se6OIFp48&iCJ_Z(^a8<0x_xS?|+%V$wBkXKRrJuD${Xi!?~h5i@jh9(>D|U z65@tvA(SHft8Q==7{gP@>6@2}IS<*~J(2QyVjuHbMV&JOI6th$O*liAe*9JbrRyz& zoO)%l+pvgr;}++!NGlp)?7IcxA?rG4rCl$R;mubm9HIOnk#fjL!?lOBB)X6QV5Iz; z@nzYr5h7=-QQPBJ@0sFs9>yMmi@5zqj)gBbTxrF`E&Z;%q9=B~^J4(I>mRJnM?U3Pxn-(~q>@tc=coOUK-m`rRmya{P+gQCz;GMU z!YK`6cC$Lxj#E{M^_HqQ`s`06)d-*Iu5w{)oHPfqyDLue?k{n>@?aw&_lqKBbJZe? zZq!NhU!KQbzYJBOq1|_zW3zV5P=B5))vvue>+bbV5>ywI!Ibe?$9Z;ewt)#KyghIvc8~3r2OF52acNR%xIGD4x)B&qu!lCP;mp^HZbecADUDX zfV+)69WovaZT+c;rA4MRiKg)i{Yv`2S~byy4+rN1y7~(O3QtPdk-{C*x6m?Y_Y-*z zkl%M#_$`C*%I)+yaQMB04PqAWK6XSYnhUvs?L(y5D?onmqC>_nxKukU_Rcbbt14k2kZjP!mXX z==ZlK&$0qj`cQxnctTs+9)4fnXwH|$c!Vu9-)=H)va2FXE0FrA1FUrpN+>d19OAW6 zGyfKq9L1$&?1;-VdEN!)L3kK@Vx;zSTIF6`8pLoS*t&o)S;6j^aQ#E#(<4_-BX>Vq zJZ5Ksj8~J~TPCdOII?{ph3xV@^gOr0<;dmPFYJsARak}(Xo^>Uf6xm;F8S!OIlv)f zVfGU}w;Ni$|2X$bO~=|Bu%sfK793A3v<#n}iu(pqi2GCL|s?fm#6i6{>%ML za9K4?!uYlG8!`EtOsOU2+IR0>l&T5|g!GBjfNu$HuJrUK93~^iIq^-&eV82K#w5d~ zd?lD4EM|s;BusE=v5vdU@U43*Bbh%bOg6`zA||M)p`^+X^)6eUpAz?JdoZ|bQoHDw zh~-KCfVviJ!`D4teJ!UV-GPj*-Cr_l<5j-Tfk|B=A#N}PoCx-MLynt7lNs@>i^ACD z5q=8!ZTHFMPtRX|9y2BWW&!xqa~!c19S$Wv$JSt^1?ClRLGqg0=$tPXJR?PP)dYzR zB(|OjN9sbXhIY>w?^p} zL=x+!-k1Ui4_JQ4U~K#-B`-%mzsr`}fS<`x=&B{&w&lHHYXc|y8~^KzEZyn*iF(hv z8$QS4R0~_aqz_ttNTfZ#$8|oB_G|Sxto;gf551fFl;~Fch~il{g`q0;A!;N1v}Q~w z1rVV4O4{0bSWwQ0b2BeEf9`y*gR*L@(GlcwR%e`>wg?+ooOGEp@@K2rU0t2L@vzwQ zZt}k?x*jR9_xrEUh0^vY!gxJyY{$pU#4l!db@YnH!w8~wE-q#RwCO5!c`#rTO~VVe zke^uT{uCV>D&|bBY&}t9 z%U+B$LyKZSIb(r^x`*WxxV2Q92euaK`kxZxI3E7m-6j$-B4Yi{a6BEgteK?k3 zxvwia0_Gzy1B%zFkO?T=f2f`_ce}$uT_CR*PX8F!i7i6zAIq>%&oh=26SDTEzt)FH z8-ld^wZ2{iK7gH+pLy2sFcSTcs*{zd2lp#_iBtv0MTywW9oj$~PQ^}4WY}@{hcrf9 z(Qtxg{zp9X+VKo2%>wS%OnjTXM&!gH>eZjpuw}{<7Fo!3ksqBwa%Vd!`I=ZLJ(qve zJQj(psKsMFlg3ZiFz^hE5%GG)u`VmFW5g~p?Da(NmmZZ);liX#>$dN(wMdoOkDo{JCVaeo@QQ2~>MLK}5!* zi|U6ggACF)<8uKA$Ob8}7@7YyQoc0E;_1XBzTod7&o)~)4B)afcxDGnLe{TRA%W>U zzr={Mb|Rw>NIZY0gN=nrTwof39!Tu|(waMqg*}|)I8$peLDiM-2W5QBhF@4`Na+HC&50w2^QzGTz9h(so0pYpP8 zJm8^gvN?W2xOEj$=SPp(>F0m(Ze9HVBm&=NzpV5cGH(5VkNF;=-pw=>CEE0pJ+=Q5 zddLX`(dr{2ANNU`NRRAGP9^!>dSPXB5aZGN0g~bR@4Dj;7?;fj$Sga;hOUfvsXf2F zI>u3X1@NJonJTjJMj#pE^w%9<-dKOt|4*9AA(QfITVMvXP2~j+|AkjQfoU)XU3jGi z#ImgTqxCL~3(Ih(h_^OBq^>IkQSYJt{^e{Ims=RcQSk+B0GOrg?AJCqwo?c#Ye$R$ zp#jsLBA6CyblRgCK})_ecG{E7v?|g8L!`-Yye8GeYd=q;#=5clUxlllR?I<|HLwGu zDF6rkh0PMO5m#~rx#%kiFut|H5FXY@cF0`Kb_4qIS)tcv=m8E9ryV8!7>S!&sP;1( zt^2|(AyYKx*O8p)Hy}7+G%9YVdk9-TbDUOX#t$9z;>BBJGPwTsfvIy>ggPL;&+yn- zH3G<43c;zrXwKi? zkxoufrak-$kf6P{@35Ef^n_&s7B?u{r5US`RB|DtXVH4kOgTOy3Ccb4Mo+znY(5Cm zW8oGdfz+u4einq0-Hi0*@m|ZrPK;D zD2v%|KDXj{h`N^O4rq8tTtp{NC7s~Fw%$RWaQMfcT-eFVk@ddgn#laAd&CUEwzF&l zK1%%k&jDio12^CB@NkCEzOUzcb|k#j@XY&8NkOgrlQz;2AY6KHn4S1b&c5B~^=0vg zXGptRGXy=VKFLK`L7E(DmL-8}sa8kKxUb=a$l0qz1^o&dIJ!oU=Lr+h&7S1x@D^Xg zJ{!ZYBrgKL$&araQ1?Xbrm!8oFJlkn8fScn1ertN(I+!VbnAhI<}QB$JW)n% z$Kt`Uc=P>ro(JJ68BH^FBKDX0-g|EK7`;iJ-Y=(tV+r`$W^nA4P&!YB`@oVA@T4-_?7TA%Qz##C-e2<)t}$06az1y&Ji6W*vEFhi4nWwcpSc zj9dW)T?jn6EEmd@{*Akie0ciNYot|r&YT8*5j0bys$W8ZINF@ZM$X^kN z|0wuN*XFcq-z&gDlXlX(Q6~Swu18vYFDZ7u>+C~|H&c8bD5Q#Umd&WfecG(UGsB#R zbA!)DM>dCc(#-C}P!&_ruH7gMAWtU(t^h znTfTYTh8WM|75M?GnfAOP1EUJXSi&0fJ0_#yqIHggZ`=$=R=Rq72>{J*<9~G1Z`fy zVGe5wA4ffA`g&9V_!5# zF$q|X_t*~0a_u*HLDh&VtJy9lZ7!p~?7`{$C5p`){?k-LG2tbH*<5{0N(|>%xhE^Q z>aSliequRBdTO(>YMXmaJZF>|CybBY+ol;WzK5v!@b#Xyfa7+dMf-@F_}=(H{-KH)^B`&94 zq5G2;dfz}|YJNDeRQyPj+Bak04F9Zvy-=|Ejt4yIhmG4N3p{d_0>agz$+S5> zocIm4i-ZNZmlw`7$VgM$G{DVhYgyE#p<#%o)| zst3nNIyYAmtWEK)%9-o^>Dl#llIAXsCOs*q#oD^Mj`=t#xRtx3Y64y`STz0l^T&Xa9;Mo@Anc{cjUo^T#|xyOh!q^7W_j|&iKFU~$L;96<~qX$_0`7U zoZ`6y4AmxRxN?uBc$%6+_~hC4XsBrAPZl`9tjJa0@e}MD4GL-P$ZJ3Ok>>XGSpoB; zJok|*Un(`_HCQ?*#^7{HUY!Jwh54OzPID+}*(L|FpkKR418i;2zHOLjL+RFYQ zwe1|I^1Oigc;2IST=*7-^!OMehlGfT2uD)&L)2=Xl$zD*$;hySXZA;2rA$2-4SCeO z|EAkhWAv8P=PzHrgj1gRv}n7hlAa$QmGqf`;&l{H){MCKy_~hJjFxa-tt`!h+^W_5 zKToi0F+4U&EAEX%FUdMzpEt?UD|gGhqG-R#;(dtUj%M#>uB(xr`jP0=QD)}a8yYsN z*h8;~TZ3;L;n>bJ!<23MMlS5bX6nL`e0ksC(N}vn zST9ULV(FB;J}sjDDG>D2TI#|c?bmOu4`lf$Ds4<=hF9Bj!-zHNBV}3C4|^90(bN4% z2;xGP~7#BtoXg%8>arpq zK{2O%7?`qmDhLUPAZ?3&jo~JZ7vi=62NIz&IP-1x@Mm-2n+Z!+vp1BFyifuo6gVBF zH&gdTLyZT#UC2QUaqnJ^YBGveAD{wWaWe6j~M5U&;x%`gAyaLuqupu=i;8lIt*9kbVP(<3;kd;+)x{&kOdst=iZS+Y=K$1ZO8SBdk3NMuB z0a+;ToFjgB4o^ftf?8&~>}Nc#^@CQCz~HSN0F`k@ztOhf_&N`5B%crmUlYleTs;a5 zgn%2<%v{8veycLwpNi1?n=IWAAO*{^gP$p?+@IG*!Hq9T&bD|peWG#Z`kzI6Nl8Q( z&ZtD6`7cHRytPdMFT^tlu!Q(>@Jw`)e5R|1!4=gYFVu@T09$&1PI`JlGv~xEB=(Xz zr3EFqxeyhRu7YDqQ>@rb98YZ%PW89=LN!xlSWh=z+cG{jI+RHN9|&T6xhYDbQW2cT z=Dd6NPRs47X#{iOMCzS)V`DJOO;STbC7l*`obG&$UI9Qb0zd%di;s_IM39d>;Uxp& zC8wmYbdZiA;2WlW&lDI%MbRSoTVaO|Vw$EDrZj+VM8dn`E;OpW?Ua_1;!PF+jki3s z)#1V--h3DX-x6CGk11fA3YYRV`E%o_ds(M`A&DKOek3L;CgwSLcHzz|D*Bw)DJ_dY zD^yISN4H9G2zMTx09hs`Cl8A(+;XbAQo4Fc_#ZqLqj*@_ zN%t<``3fPe>qq0@$^%925m@RS5rd=)LICl9@EUtfQ%g%*lMx!3GbV=l?d4jW$o5Cr zX)-V(==$?7){;ANU*qPC7xShMCx`lTN;TnIkQxOHU^Q)B9UYxewKo9Qac9ecF()F( z9|QyOY6ix}#=geJ_E5zN===v=(LAS^JK&Cw%6*fQ5&Y~G6J%xM(4{HX2yF}Gj2-tV z8BU1hSK#V~@IUD9J64MG?)bS)bv*>&&$MDMcq8XgCI4{+5r?z8d|quWM~~CqU>N6q zgs!NYQ!E)^F*6yq#i8S64NiQmeNFye2yRrnx;81AsHo1o=9JJX1z%E?T*5(SV>f?` z@1fTNtoZeF>B5;$P}&hQ5b~&Wm6XU(RuPt4ao&_#!k^d6OBte%BBIq%S^?{|ic$Ma zM(b!M7jz(DHAc`yxZ~S|iN&R2@^=G3ZOqibsV0QRbgkpG335+BO7tneBMSwJ&b*)d+KH*t}h+HU+jYEc)2X zh_SJ#EVN#Q$9mp0E7n-%w_iijK?mXM*H(NxGemP#p^c@}H2fiH0)G4p`XbWq ztKj(#fE;yLcFckEQFmi~{WDM0JtkDmiQ=Z%w>f2S-jyd=0Q?c6G~Y=Qeko`-BJs2v zxzo*AqAmmOd9fQRjjY0{qwc-D4>-rz@7#1o%yE0ma|5>C!JfnK?Sawxl>nR@nD<(9 zoKy{G)}4tXF|G^41ZN5Vi$h@$enK@R2a9KQaQZVWYoCvsO$ed0qQ?(j%h5JJ9qX4C z^%Dt%57#Qyl#w`GetGhCX|KK-mCc3m;ArmF3c~3sE4XfCE-GB@P3t8I+FQa?5V%Jr zp*hvdkq8B+M3ZMfLDgHQqrO?~*UjTjs{Sdm&~>Rx>YO7Jd%s|9P&+PU1-^+H1X3xq zq?Ne^&GvBpK*TK^wz*7`8pQ_2%~%)v0+;3K*nNBzMz=GV+a4)a)g9FnMaFDkJg&!w zG=qJOgM?}AN~42ELD)u~oJM2n{vV&th^SYeN=_zJ5)cPHDlLC}G-YUydlh0;up0Ny z0AOUo0FV2c9v?N;VP11jfYC?SUU^^dPx*+DNSJ{sg!fg{H=l#WS_+ExU%a=NEK2X7 z>U2Motk0jgB7AMLM=G{DV*dAzH-4}sO8iyL+28J9)6qo%kp)&)`3wD-2e5_G9=9v+ z7)cnDvp4dnOC>OROZp(LzUlGPOd0APytACmCR}8z-YWcZXLzFinVj~aB>{wYYmN&| zM`bJ5*hEfCvl9n1A*_lo6K*ig+tFR$(tZsATsX|SbizaUQ%lW@Sww1Z(cn-^3NCx^ z6cgE{OJ!PBoP!BXWPVH4Aa|(OEr>?bpjEcvfpL%eZkT~INq|iYzfEW=qDCj%;0!^c zsZndGD7Y%Sc|!fORIHIEupSxzFatpz`wYExH;K&qQXwdj>R zt4kj8*m5WWJ~1y(x^CG+om>KWAUL+cb9dgZ(Kz6Ablhus#a=S!M8-1V@Fsk8%p1ad zop9^y4j%O|Sv*dJ&}EfvM^cB+#gHrJgNXQ!nd_FGpZv?p?9xLrtFI?6i%7ZLJ%fw_ zAj_vb3UTMB*>Y55!7%RB!t1w)tsdMuA#kyLHwu#rT@)DZgOo&_g{+eRi-4Mf-((*= ztbQ8g1XZ)HhtKQlJoiKi=wCaMda{h?32GOCBir}2=|B=?3xa|8c}Bda0?`@Fej}`^ zLg^%qnijTUJ`6|`Gx+B{XJuV%AK!Xq1UXD$gKhheK$^e zo`cS&T!$Mi!Awl_r@mc152(1#ea26vc?IJUD=Co5>F4EZwB&NkU4DVk=Lj#BT{*2H z*S71L%bV#OMAI2eY|T?$r^x;9n3s46BD75_nAnyRep-xnynbGRMoVAN%?Y;eCuKkm z(S7D@(O{=<@GH6BDYBiex>8lhwO8Ekj3c1t^!`>kk#fro>TwzzolUaIk!^Gxg1byq z@Qb<8`Y?9GG5?J1kt?*X{nrL72+yNXi}m|#B6^3q3sU2!5FriR=U{qLdHgkSVTx>* z#0a&Gu-HlSb+?)bpLgjts2Fi8RJ$i@4`bO+m+z?b*$XY(d++E@6&d1Vto26JSxDT+Yh+bZd&1eIiWkiFs;4Yl+ z&V3t!N$w>vECnRamOv~y9f1K5x=QXc+;!GZ>zKQsprlD{15nwr2j45cpfqvmLUCts z+~bhIgHv~BnEc_jS)M;;co+!MfKz7I3pn0Eyw0!%Sjp8w07OFoBz>uHhd!hoR#%b; zc5G>4MUx;vkIL~5zc6yV<2sAoepy&BGOo__ct9`1Nc?|FO~CGk%iVzUOls(ZCvTvGs<23EWcPRjYt{O3Bk> z)+_F98_EkIenel6-QdmMKf+;B@PAO_;)n==nDuQ8637;405NQ*yYVtcMz7$(UE z{VF?lha%fOLmXOQ$&rr=%IKbeFWw6Q)eyo;dd)O^jlnb2;%ue}b|XPC*);H$@RrlZ>Ip;>%Xg_X2ZYx@|A*Jt zw>1c_Ji?tZCUXd3(De9-*+;Udc;F)`%lCqH{%Z?f?7`>OOD_6$+l3#rXBTJ|TG-VN zjlMXQqQYUaxc#Z)#sRl6GFPQ!0pZ-Erm)$gVPF&D0(mW1j098e#$?qIpzJ2f8YNYtD~fS zy5i{PveAD-yX6k;F{{)iukB;l%*}+;{w=c7ewjbyAk9o$dUGu*XSPa2zN15N zX=}ny+?suj6&2{Y3kQgr0=DB%(MG6wlO=kD7)dFD0altuhmNGie`P7IIm|BwYZhmY zs8E}@qE=&l;K$Hr3|j~N$1hS&X^j1T%s=TkrJ;hl^nf~q!Vg&-n~x{7OG`A)h-H# z$q<|cxVzgXxOZtcC<|$~=wZWG)KhM}Q*WuoK)HoWAFb^<{CvTy(vVNugCv3@EQ7Q@ z{M{Jk^uu5OJ1bLfIY?`|e<1K&Gw?cl;^av;-~dBRjFaNr>RBZ2(_kq|dv$5=i|0x7 zVNN`AmdkhNipnq*Cn|5$|FDqyMYcv+-{$;W7Ug>u?bvT(cK7e!AG5AW3|HRx(W?U^ z1nyTsZ_CJnJnVNHBYU`m0Wn`{L3U;~i1{x@I&##y#waF^)jEqxjrPYm+hLd^Xr!Vv zdg1E%zWRW_f;z`+$HnD8YL<5sLaPext5GkTg(U-XS?4)jUg6|2g5e~rTu5FvWxog) z7~U>pe~<8l=U!VLyuw(tYF-9D@6*akkys1W1(vBgL6)_|s=lE6-OY)u4`I&KG{L!| z5+n}HV*kLs!pHW<1^zUmzB*s~WsVh*_FkDwZa5P?ii>+fOZav<#F@iC!Ow1*x}v5o z_tU^alJ&j!FbN7fnu!Ffa&*wl4t_9to|(yKtw(oXv=x2;gc>}&=+n^v4C{?77U7P% zmoZUSci!$*`Tee_=seYX=BWl(RP0&jRfHg)UWvoFvaq8cfq0G=*j@Y5p?EK-i)2eT z=mcv$I%RH9ylgUYb8yd%Q3jk?iPLPasI?vg!fhEX@z2~GYsSYyTr#7$n3z~})K%)( z#IPImgH9QDW^R~XMQBBclZY-9L``@umLei#`2#J(Fz@HKDg&~K##e(nRk9sVg5=$Z=$ZLo$dIH({`I-Y{)DWO_SgDCvuS&aPfE(zYeigiA<9KT$Z6i^zR%_l+0E3|fxA7A z&x5$vHXjBdtel)1w$9_p?+KXuR#KF{Ek(7{;KlRIeQTCvfSXe-i59%cDzewWgGMZ>X=*7s;$ z5Qt$5*HE?q1q)3p(_O~&@6SQG@FFFwz)x;53lY-@{MAySg^=9MC2FsmIJU}Hjp*wG z2*jfcIsWfh=Sd01ZA*iJOb@X6z1-wCo0kV#u>O_ySH)g8rV$36jm(g^=pTOQ{_Wx_ z1e7uOE_7{m=%vb8#{hJN)d-SwtG3Pm3P*LQ?&z*f+%oYMBd*1W8`IavihbD*qMqHs z!4g+X`MA0aCos9w$-;%Ax6*e!qdB%Z`Fb7;HLwgTm8qqRG-nFDZ8p-B5>)gpL12v2 zU;GAjY<1(QUg^=NL@@J1o?Ymq#9Fov6?9@JGXEFUu1D?3*8%zsl=b-?DFD1n=n4l_ z09n~%c<2(pbq6!{7i^D_!S?d7yN* z9T0>(y<{PfEa`xPt*_N0Lp3|qnDCX-)wx1-m=apzh`7#=7xi`K4k3^_i;jPe;O>EW zv2Br@${|%mOhKsj_(X+-+YA*lXdF{!2V6CJp{u@aO8oIBgCS(lb-4Fspmr3(EP!P6 z3{u0oIljXr>Cf=+t8gauK~lA(#DO_Xr^D&*R*77@!VV8i$Rf3N-GIHj*mD+ntYAGn zeiY%T(fcAONGD1Vc*6XUdEyX)rzR-=Pf~CC%6;k>r>CcTGYVu~7JvtWn3L0#wo)n7?_B>2 z({@^X{|g{-IwQ%$CKE?M#_^Uzh-!&3YSU8|iTvagcvOdlJEqfn$KLdsObFO|lNn#g zFbSQT%1B8MsQ{~<8kGx7puT-)&M>@g-oeXON-d~>19WAq zV84o_k#Fgt*Kb1xkAd3&KgnW*#+?iN-Rrk)Ekw# zWDBFtfOgW*giGI78dISWd5*Qs<+2@|0tR5MV2z=$Fws;({4Uzqu{3^sns?|f%-YY^ zoXFUEQpReC<|@5TJ%SSOb<%%rY5XM&X=Yy2EMu1h4J9Y<`-+tuFo}1CuLI>ZcRL0)isFXtQR4aN-@CzD#kXexKo~ChLvqBI<@iKYjReM{i-aVk z$K$Q^Y@`2Rbuu>X3wCHbo5&NUfq{;~AsGW3!>p>tq1Cbv&&Aw?%uMw55?L(zCOzb7 zaoW=}GW!cxF5t!vCUY#_h_A(lX^Vc@*o{4z^1G%&>2dIJ80S^AP-F;OQrkaMt*%7< z{g~_%E~tB&FpV=Q6t;e~O@@CLMS~7vwX8dq%+E;svTMhH@*Q>A6 zrJroP`CMHaJ&xDB4lrC_8K({yZ6p+h!xHO^grITtWQlH#z1)bn1HPGw z8XtD{g5cyqZw^JdN6ctR#iGbdbrF0qVPiuNQL(+&L zUVfr$%|~xPaP^t`YJn=j3@>NxX|#Z1g(+TvL(QS2vhWVH0}H8!Z*SzEDdx3oM}RfD z?NcEZ2F3HSb+|3X(2B45(Fw+Mu#KbzrF4xx2}F{IGqX$ZA#(XhI%Z64fr^e?ZsJLS z%_L=nH;XPDIa~nSC+nO_boY{Ai_rvDM_a`=wTRVOXY!+uYrbc9`ORVebHRI@YH&+aXc8dInE0}N30sy%QhDFx2pC+ zIYz;nQ@&}f+Vlk9o#GR8AC;XGXWh?3rE(OW%HN6uOpr~2I=rM#zB}(6BopsokQI@9 zFk+7~8w(i30}PVX{@%JzjK{Lg46oNudkk5;3Ag6RgKe)+nuUM82lPX~O{p8DKG;~9 z)#&^TJElSeb-o)EeM&~`f*JP}dMhUPWg|K`&vailwuX(T&HS5Hh>QowGEzkWJ+*0A z0!htK*);?FC2og9#XjOuI8<>t0uI~sUNg3S-%k2Q=k!#A@5cU8MI-ht7MIvVPz0@J zHc;-qYJ;6_hsuvoS)IOBUHF8zq3cnEJtKD+R_|Mg^{Yma3ljviYrIfOiLNlKURgbVRN@y>dc3^;53TuQ{C4QYwW?@Cfu@CrhE>X_SG20 z>7&-@%V$qTdxEHbvStkIzMn!uLTItm_fz(+yGIXX1_am2Zz3g23zGuF@9-h)?Ccv< zepa{+Z|RVji_WbHDJM5C?q4C+%8$NSed}?1OxW}Xt7aj0Po>v3VILdIH`vN60Eg26 zoiubr8N2n6BkV>WfR&Nkmy8U-l(Fph8eYMscl~9$9zUoYfI=*~Ve?eBlc(Uy(VKfi z0xzRls#zEFC--IQEL5MCklTqY-e9Qaetq?+JR*%2b8z;27Zj%$hslYJ?y{6uP&j<- zNKa%t$QGaHtaYtm~}jQY2nQd z=4dAgks}S^1MM`f|LlQSgBOK!{9vp61ZPO#8f{6+Tr$kBnvJ&POqsov$TeC}TbyWx?~!U<0Z3@~ z5f?tT9hb2E{oCFjxCueXc25eu!r|F5SQ3DNRB%LhZ|PMi-aD0W0_dDn7s=T?)CZvr zAI?afGx*{+6v0WZ*X?!OeVoE2sdX z&Y*5zniBcw2uRy-Ohu*!HBJL(J2szj_{%;>6GjY6F0?bi&*S=5khsoP!k^r+5K@45 z;R`7t#)EL6o)z2CNJFaO-+r=xqO=XEv%8(=ZGrDphWd|tV3JBs!up)Z!b=>4Nu!Ro z_33wnp%9WZY_d-syf?ZFgyv)*d#_7OSOu6&-#=Xm3v4`=-N%VtZ6xHMCp;OcmG0AjmP zn}sFL(yLHkJgF#0Ke;KsAViORH^+0qQ-}F4PY01OpHzZph9sp6AJVn55nG1owA?Eu zAuw2058#;`d<+m^7h*zzzVc0ra=S&gmsiQosD`izfqLUyv|i=ICcvAdcDKb=&ht;# zY=<8Jtc}z8TP608EbSGfXG+Krl+^ID~(W%6t+QyM5+s%}=*Lg^zg;9jMwu{D@QjNYXqdF%oRI!L->ui&vO zC>%ii7qC*o->ZU0A9nB^e2~N?WD9}Sk~-m<6E*D^WV$26#WT3gc1&dl3B4-L>pLrU z2yve+9DM)ad3`U~VjB1AR!ry}n3#AhF^Tkbr!rxN0BhyAA~1*R+?lk^$HhR3tC-CP zdo*WZ%bxPN^IU()MOA{A;M5b$u-xE^?&(_%o|pCQq1SCd-32hu z;QF0M1Ny*7@Ne4Ubhyt!wfYNTZPV^Os$IVQ6g7eCjRbX(dvcA26fx)A?3tKEm z&equ>>(aG{K$Q-XIGD4?@qlJwKRphI>*qV2x0ADgo+SX*Q#h2@ffH&_z6&SCwnywNkx z->=S>T!PAGm(QwD1P)*(KBSq0d~L{X2bZXcEx_!c1Lj{l<^e_UNd0e+L@(m*bANt+ zPRdi-Nx?@;J^MNIzCtB?YY2Kv^6|jyTU7Bad#_gxnWtLqKyPYq*f8ruC}>V47|$v0 z%wrnA%TS(T;E2V>N(+RkQiAyFlYaqUCrUNJE4c;hgN`WOarwn>oV7pK9RYa&C0r)% zVw|38@vW`i6%h8hakbNA2dpJJlJ_SlfVv>OYCo+Od0yA{5PvF0Ay_soiTp-KkdGcy zmi-Z#t!aijQd9`r=t0wcM7Ph%(EHQPh}{@9Kkd@zNYLVQDd&o;adx&;KLW)wk@G)t zqyU#gk<#VAQ_4v`>K)))19tb27$b8)Y{@?)j)yqTTX6BdKwS527J)evucqR*N;?=7 zhR{$0xMelph^ML!rO;SjYx^INRxadLGH7ZepdXqoT|9XfsL(0mE2RDhHG^dzy+c0w zmLBh)xC}XSXKP^Wfb`8dfmEy~^In;ys{G|Efa>FL0cC>yE3E#sis)cMlkAP1Jp_ug`K_8l9!T zEYU1&`^4{Nzy&RtGh%t(i;^sdCO$BWLCcBuN7{Vj;tMr$uoAD!5qZ!0v=)lavK#5+ z(6Fu;yJp{f7j=03$OS{8qZM(~vE5W5k}@z}fEH&_a>U0e(LGm5Q1HhKh29HMok^-aajJ*(Rw1b=wI+&M#zX78?lU%cg|W=fsGH5I^ksJH+4gWASAAPTWE@H9KPG9feO~^JZoj zD0Q0&s8f8X)T#3_OV_`Fq26{_iLKdaVPuxN81S?@x=5;ZRg$6lNpfPRo3X3pd99o$ zDie>O>D1?D*or#=7_y0u$39ZxE9@Lk*ZSt*Yl6D*iIrPll>#nj2OP|Oq5@4DzO8*{ z&+Byi)mvDst6#zFvI5&y-ApO37a~sTK9>_ydx&bG`(SCNY?0ZOb?-$3Lxy=N98v|b zBc|coI76Q(Ih_8in~A7nktuG|?^o}y{t$JK6S#`Ag#_MibAt2FDUa$TWHy5{3IXed zdANeWk_V)-{o?GIDQzu3HUX%E<)vxM$eO_M>wjYSYL?}m z8%`Rkv91=w)6oc18wEBNZh&L@4@O6!eLA~kCSaw1y}zMKADj-4rBu5ri7lol6X1@Q z4a8H&ePxagRh}Lwb)Nq`#xX8FESGi|Ti726KlZ9zKu~)GG2u0 z>B9yNq3h$Cxyq-F=q=Ml5VNb{bR6o%tm@AAeTu?Qa6I0#QX+g&1 zY=YMyt_y+YqarCMaqdN7_d_vKgA`s2B{Vzd&S(5=PX90?i&EuBBbxL@gbFp$*aQcC0U?OnWBk&{1@C?UeK*4AWhJ<9Bl+B@Ssg5=D79`IGE$C~)*wpcHIf&zUyV%2bn<9VOzoy_?Vz8dD z9d0#Z(Y_0PVTRsf;B;195v&Jlzbag`{|3)ZV$h2?jEhNj+ z=+=zE7G|hG*iKP!-H1nMN9cU(eK1`RRY@R5eHgpn9Jf6FUM?CFd(=7cxum$nihY)^ z&bRl!rVBw;Y6j_zyue@nKhp`&iy-dD&g;K1EXeEXQ2?SCe*_~5BWK?7Ozyza(8 z?jK$&cr(pJY?E~Fe3{LKSV`E&@RaGDe?@Kji~ot~EEovUZYlYY&)?S_=_hK{ic;0O zf6)+;ye(O!w{eIx1$s0j%VAk0_~sPF5t}A;7P~H+AUZ>@7j;R;i2#0auGSQ^O!}0Y zeBKLTzINt!Ry}W;;I5zuCJ~UD@Bc`4=bcSQvZz&P+)xmH#saL6=|5&m@~?FQ%B{uL zP{Gj~Yeur>=pdUc#UNmDya;jPOeAf<-6qAAkuB3fb?yENz;AGjcLK*TGq8Cdy|%gc zwn3NUlm;WLS>#@giP-+aqwK`dnt&clD81XF!}A89~feyT?CsIHRP! zCI3KJb=Mr&t{i`xSDcfR^Gc=f82yrM)rFYcnFcXN@a7(@18j^_QBjrh6iC{T+;`3F z#0jWkB)?^I#T1Zhrnk`2*;i~?+}mFl@4&n%+WFkUne7|8%-N{Z(I#icr&94}F3bfN z8Fu0<)U)Svyxi|r?@iA?b0$#w0i6~HDM6<_^zhRrqTC$KMW&ekhX>@Mn9HS3gJvu7~KzQVN&dp(ugmjcDy zftO}3jVaDTGT6@&U;iXO-Vq`nmL@X30&&Rgsi#AQUiK$(iKj5N^To3cpYsoI75cn@ zd8fln7#dU5QUrn2ujS-1xKj3=x1Z9mW+88f5*z4|&}kTvTOykP{v|GNmTxnhSIi#Q zTyhxuXW>P{y;#-6-vFgoDOzOKCMRVET^t{axql_Ka@=i^06)Uhv0Vc|GlthqX#`Gt zh4*oYm^&}77q`BGfYupwbAP;R>sG2E`EeyKHP1A3@(>cvmkSPa^|}u}G<__VsZaDc zC;r_{K9|4Gj;(`>tOL|qEq|l!Es%#QP9!ZQLVg(TOb_cyY!}UjEr`Z4_eJ3Ftv_u= zwNVKYFn%i|a_%iR=yP}8dFI&zg^r*{NinRR^+@H<6$j-}ZNHh{xOmCR(oChZJw%%0 z(mo2KC63e%zEldr{+i(15upP6uUzp?xb-r_@qJN;XRSL=Z@Bt~3#;sd+>N`>pF3YH zJ%97u1JTVxSnY?wwGHT>7(6ixn!L*5Wdir-w^SL3&&a2Je{E>miYCnReif&I;dOzTUp$%^Yi~o0)<9<-f z>zql=Hrbsa0-w?jEf$ZImiq$*UivwAC#GL22p3cibX;DxD#{>y{P?jS8niZYy|Ep> zNsY@3W1c+5*!}aolR|WS2Xqy^!ZxT6g%u}g99smKMuNhVKKp*UCiV+M{b@gOqJ&;w zFr)|lBwQ-gP!rXn`T4Bq`4u;^I3zO>=J9ywdHT|?f)H{XX`;9i5%IqWt09EJX21F? ztc_FQus~Fkrl_3;C}H@#k2Zq-tGFEpIzBVt9}8V=ZT+^=ZdP+QO%&|o_`5t+(IG)! zS?DOK90=P!RzFxI7~x5}KMoFSm$18n!L=Kp??MI~vC7QMonjUH>Zlg#{>13{9okMh zAk2o2MhL?)1U6>y)0|>kK69i|Nfg;S(7yJyy{D&VToa?HKs|@S6uZ+#vb}^@;5UfoeTYGzu62I(9v^<$6*aMI zsBG*gs~GLFOzlNjNATt5{aC{aej`1myj^rKqRD5Qm5SM=(m`RV$>MZR{qd1)vDrMt zQcHc4W8gOmS@E1*%1eCPlE0Mw(Q8s+7t*2k^QP3k=SUopj4+=Lt9tTQj(729{Xe$e z0~*UW{vXFa_72(ep+O-d*))uZY-K;no@ErWl98;(ro``k zKYYI5@Bf_tb3W&M&e3&W_w`<{_jTX*^?tpdowJ+pN|;K2IYcC1eRE>#vEe#$FO>?> zhyQMU8$Wj$CGM3uX9Nt)6U)a8K^h&o58PXz+fB3Ef$#g_JSsm>E(dvairP(twzIcM z!JSeTX$6)ay4=2v=xXW{pIZ;k5fju=a%4Q@@<})y`jRNBAY$d_w!X3iFJ=E|446W= zjkb;KtF>!ZAV(#(FgXrR=VR@U4W-m=hI_ZV=wy=YZJ#TBLQefW@7`RB8sf1{lH@{(9vlmlPwb)631)- zM&0%FeD0@@`l8?b0S{3OKw2n>I7e2q-_~+zuFFIcAV_6K7{DW9D_WzwcG!*rpV;rZo(?w;(Bk`2ge}VbfV80{|B+0h|e*bpG(}&QbQehZ%&0a=E z#uD-K*|pdav>51C81h2K6Tl9gpLZ`&v2Oi@ijx4ix)217wVklPfDLBL9O_ zKmRXM$w)~_;iGRx2tlf^U*X2Bz9!CQjL*p$Bj z?Er4kj#kHNHoKw9>&-}vKjN#)QXJMm#zJp?xb? zN*w9$!wl2V5h6Hto9>L6CJa=4-tyFDoVCUtFQTv=8rn&W-LQaP$8-e2&6BD+YrOMtd7t0eBS@TrdOCk0Wa=lBsy@ZOet_9_WjgT z5JfzaJccYvy;t!<7X}sOpr{ui$TRN5BHheUKlxDe5k# zTp7pKHvthp;E=)qLET5h8W6O-lQ)SI{ax9%pF(6eFdZrN_NulR$)z^s&FtAX*sd2? z{U?Dl+w9(zemp<;GpKj1`MhUi9qYnYx}<(_sDdabxvH_M`ItLn=`eT2si?HZpviwC zIex$U`b;9SUE-s9+7?%G+_XkdKi2)XW7?wF8R2%}HV5!}t(h*67x@@qxm&dhG~ey( zm~U#I+^BU%d{(i2`jLn^_>AWQ{>G*LvQ^(I7)V>C;*d!K{_8B|q{sZE@JG%zz# znS;$t@M7SPso2vx<~TFO@yOVk5=aSYSC&;J6J!Y`mXE%n=P>foeo1RLzuf%U)8@hv z!7&DF;khe~^+Kb@B1P?QgkQrPTQJAhy0666)@~`{iR-5)<*&(BBFmFZOl!)Vylua) z@G{nRQN(arZ>f{N(eegWWZ1Sx9ce#e}=lzS@Cg&;P* z93e$Ejd`&1@(OWf7psPZk*U^V3PUKJQSEm+^R@HvY*!TQZYZH+KVD;{UYgUVVs1K` zgmGUge}S!5--j*)j1P!ozDl|b(V|kM&T^Qa0$r#IWo^R7?3^2CxZZ({GZRFvaK%*A zSvd+mtdM>^d%V~%7#Rh7!>Be4w@x_5L;1lK5}p*nb7wZPva$*uE1z}>aGd{I&V6m6 z{zKyT{01pO7QS+q?-d1KD6O=EyVhnE$%jq;Bs_m!!AHs?n%M%zT~C#!q6Z=odpNW2 z_nM8LRHAh41vh>{-x*MJEWL|(hePCsZjY>^*UE`4xe9Lfq@7yFTA~7LvzYdG*pHH* z&SiSUY}oo2QAj4LK3(lLkoQ43Z!0Vm>=Wc}@Y!p)UF(W$Oob`8zPiHRWP=`v#;@$-Q+BabDO6|yxT5)*wF&8g$N^FXAi_f4=5*c+Q&CfJJs%f3n&6x?8A01CP5er8nPLm(2MEiELccS3t zI{%)VR_uIw90*F-0+l6^|6?g<>8kpCyvFEs{HI4xpPhIP*W3Z$bD!C_pBP!HGq?)# z_xcK9T7GvQOK~S#1D^&W&~tNMY;ZkEg%Cg9_pUOy@QT(T;q(p}@RUOU2GkNi9A%O9 z!t57f+T?0{E*6~Btx0ReaiDHR9!(^xLAjV|PY@92Kx@8J0>E@Z@@+yaLEgpZ z!_(%l4D`(W#dtLvcKI(qKb%my>lRObtoBfxS`~sD?AnWNVVJICMgB%eWcy03+u zM%~bc51(l&N@1gh9HTRyz$vzW78X5ppyG+E zOPL`)LiM~wUy1h&Fhjs*9C!T(8wn6Xj&&r{Z9lwxzLYf1RPK7%VE>XzaF_H){B#*= zk_Lc{4@0ptL#s*{Ro*SR8*c!qdBK)(yeHg}#NW^_8PTj{9Hy2d+9Gq)=m%<<1@-aR zI9@0Br42oR_tSgs191YR5^F2#cFy?w7`)-Wd7!dHy%EjD(|Z)ifcdoFj6Lb$ZFx(q zJD2durKsZ#P6Gpp#Oung-9Vf}BssGC#=B4s1MPk8FA_nn!}#nn+miuAak>B2lhF7) zFuW9z?mi0zJf_`elf%n4`fTo)qnY5KY!BoD9ar9h@k(8LdH2nHVg>DH{0vaT7WO4? ziCOBcEl=;)p47;fi`~DZyiCthFRy76&33C2tXskyR83rfI6x|w`YK7q@BKk?GF4lg zg(AAmdv|QB(Y{NxNdLlcRiRmY)@Z>>y#A;TNbbL5WiM2oQGfU4P@mB)q9z2o?jAQ| zt$e|p+WH$G;lVBxxTRigB04&{T4Ej^R#$F4E=&T%QmT8Q3j^TSOIz;VuRWTdB`FGtD@UY$@m z4NT9S-Ck$F1yetj#i&DyAwL9~>h(A*lozm#UK1%pqVkae5aGEQi3rD>0yk!1Fy#Y~ z?GK!8k5`uLze#&`Gic)=v<>M0ODmhZS!6tH(4!@5Jr{nL{tm!t4$~Mw3>|d^#=g9b z5t@}7r`WS2jBgxd1Mn&qAEJM@`*WqFiyVKs?*cE4gTeG6crNTXP=Q$4Z+LsZK54Wk zZ@q)$nA3Iqu&Z!{gC76>h$Be`CSgeD#H-~S!-kSh6+SW(^WBj%4Y{>N-any7^oH}x z3<9?DE|VXAg!6a5w^AaxV}p6n773kEiwt6C_%>KNc5a()f*b-JB-a%=8*>}c&1^Rn z5%8rl^1^R^^in)_>vwnlMXx3#HDj%ny@O987v=+{N5L)fTHE(Lyu5R9 z_tXyp(&Iz9vORd^D#cr3eL$$CBl012eaFZC{B70|DT<}xm}o&ZK{dFo<2ZHlS{Wq9 z5u{wb6`p%jl7V~|pEo4EO(42STCa&_2;;LUf4@+_v0@Sa?-IPvD*IKLtB)7RbZPWws9L~D!{6$`i%;5-tsKQk25I!`IF)$>Ep7HpQE>sz&oVcY zSmeaVx8`=Nh~#sn(f7J*g{i#BOs~Wqm48oQty6shq8BA-rVkJ_YrUaUI-vb!^`F=| z{EmS?z8lg=vgV@OSvqE4oAnXGz;_T>?gQEb8~^T&G8;PJLG=mowE<)Mgiry(=RyMD zV{LNZ)NfYTZ0_v&KmGf^i6nv4n~WyKm{#G&R%ETpgpG&I!=B1eAB9Sz+Wy^3PxGD( z^*>f*MAKJqLComp-g_QqX82i^+Y^?OF0^k8hNgIePY`ca6d2>|5A*2hK-cTMF@qM{ zO-B#2Myub6?-ymL8RwModrAcva|s3-m-DnwkepFEo1xj+euLx(;i$?nK?(k_?L1_Y z4=LmXdFzZG9*CdcSCGV~?`gB6Nd8!QjOkJ)0XM+($f#NwVTQ)fBTo#8WS!ZNK3*qa z3t^bib#n;>INA!441hcuoK!n}w17vGYcFYyYWGuW(N0m5RUdID+b2oFuiQy!jAB|4 zyb;b6jol#(k0fw+B4gt&E22nMJ9EK`NhLUK@F92iX5mtc-quJ?&RqvNoB*kh40fxSweo)?vX~@^GB4pJcfc$ zTiem?=NmHPIrn}>|NbJ0oepjI_ZLoq6f217q?BO%wtjE+&(^^?laOs~CFQ4H#@0Xg z{`Gs3^N=hz&hQd_QF8jtHnG}Z?jfEi_%NfDU7b4Uy5+iePC&Mf&5dAh3&Le%`Y;~* zKI!wN#Z}3}2e*oC{e{03LY75)|MVp~kH1aouP_4x162Vp3~$|nGpNRYvnngE5wJvh zoj?oblMC}*U`WW(>LSmJ?4Qo6lw*TY>P`v7ubXfW(+%Ag;U)M>0#Vigl(8H&9O)!j zk=TdP6v*fi|8k7@N@xE2oNg2$Pr=mitdQ9|Ynd_Eqz4NEnHB1A_N>JGpR$A&a`6!v z|83kUWR#GQpdOlI`FA=?Wlr~HLY}v&GAt<+AscK%7ixcsQVdC|I3-M+@V2lKtlWIi z)MVfM+9kMyjHD)IJwwLF?K<`2unzdM8j7k3UAiQvuyz)XhPo|6i?$~}P@0XC?6b!x zo)W`Z9_}|{ItfqI)dR$%129)}7il$awv`LP?*Ww<&67I9^Ct=FIcu2>2b^`xI~op^ z=g&&&Bp6u)h*8&JcI}ybyQ18yg& zSDN6UyY(7EhU{`5(Sw(9_5+t_a39MgI$o{Ru&$I4H!hJ}m_c`Tp5W_``>~yq@G$5c zuY37D;rX}U$somy-jPqa6|%uP7Z0{(tW&hFCXUk=eFFVI1*ZF7;H?Fx&}s6&sT2yb zZr_wavn`=S;lpDA@Yj!Y8!>`?-h@L_b5V_*9HC$i))czKe*+x?z1!|t3HahCFL(ftQkP;7E&H*MrOp#WOA z@dicirXA?2i=ghXGpzs|C-vsXN6sK{KZ5v zjpyFdToOJ(^7(x#J?l}(v7Q?`0l@qJ9y!tNytRObWPU%_mXR@Hprys`>-2B5L0*Gd5tH@ zlUGGHW+5I-4>vaW=Bax%2V>e3F+zq3dIl#+>I6Wjhe-_Im2tSW0c)qQEZrXUg&-i1>HgHj#!e#9x^>#cYzrs3{_B~-tp zCyn|2*?mjY4)-Qr$p|{15~i{IL4d<~S;M|M^P1fWQ!0H+VK(VMq#yjRfv}u=PlPP# zVv?ZzB`F53tOo4EdFGuC9U5GTsz#*Xp$Hs(c|M8LR94K|HnEDs(Pk)j6H%=3we6J7Ept9_DV#m2DK%Xq0?v$-Ib?_kWwecNA2qL2-ractGVU7t z9=Y?nMfyAo)(6)Hz9L?mU{5#(m8Bs@0(0Ux=TGLM&vDL+cLMW> z*VrU*=T8n-Nm5#KDf%l?|24Lh6CZPJD}w5!9zL2#nFN2-@(My%tw#OVAN~!lH-*XD z*VL4_di)HwB5*Iy`Sk$^Q2)Jzzf?6jRc>^dLupS=;*8K)n#h`HQ&bKcDdeR=rg)NoPugV@U56gRE=dZSc z8ZPt+CzgrkWe&IgdgJBMqw;+-8xpAT{I8iVS1C1Q5;qw!t1VA9p}deWVxKar;rvF^9{X%lgS6ljCB|-@pyZ_I&&0T=|0=N z0XJ{gKT|@p{QJD)cSJxKQ00_zz8b$+9uI#UVWp<(*;lQZY~J#($Juj={W)99qaq`( zOji_(7^(SE){F~#N2--2Fzf2rSvop)R#(|%I^mW3&cokdhQFn`#flFU7LwZY%L~dq zUC+cTH@CF(IZXJ2NkDRV7|0XUti-HMve?bS67+tga=jObiNvo!$HEm92=Bx6jFO+R zwUT@Y^eSu4wtNJ~k9{d|UEeRg^MJQsaD6TYC*58+Tv6+^phx@oZ0{Od)}!4mxBBXs z&Y5>6)t*gLS|v)pl*F!)l=X#2_k?`*c6UtF+9NHE>=jJ=du!)@ynp&2i0_iMD^Pe; zTevY9eGD=)Tljl*FG2KY)YrsD-=tAwc#xPPD2+H^UCht`;aGEj~W+*d{$+%7YsR-9=?* zXKz|5P0<^1uzui7kJ(((4DBC$wxFwH&;2CeFp`jmw2YUn?U}>DyD{pUP#(MqR>}NE zFp~`R7MsiCL7bOk;-NYby?%LFGgOsiSM`rzH^((7(uq=!os2vGZ^<_DL45}S97pNQ z?Lk>u^*Ru^YhwEUH2TDcs#Qgv=wu_OT=!NUu8^dJf)g3pte}ztzf9{A%bbx{w@;hBW({|OI#!~>&OrK7P>j1WLf4UP-BFBu} zgw6F5Y4MC|Az`OD3H*_MtyIO7mt?H15OM5lHxt-s8j}%#M|d=5)r2#gQRYxlAQlU1(sh?5wkI@z{>U>lIF4ktcn^B8id^dRk zc^Fv@GAuJYMXnk=Xo>3;N#RzwR5ffM+)U0Hz1SFDI;ge!_K!t(=c1RhHb(4*IJ?Mn zhwjNSzV08XU)L&n2)Rb3=J>*7KXrNm`BmfD4)4!!mV7#by0?|Zk5Z5q4)YKf+a&FD zdmDIM#eIGz3shOt`S7nsK!alnXJ{HU)u{cn5}OQN%&oGPfNG|j{FG*D={Ky}9fS_g z&omL)#2!!EOh?H7Opn-2)&SX+=I~;bw8qiOsAG5j-ZzS zo{O^V`(pNTF2>OGqhErtgISQg(BEhhptRwEc0dJC{`NfZ)U@)Szl-8U$;^rUu?~wT znJ28|OR&{>(!FKKDySTu@-10gp@WfLuX#6P}> zcH;^S-DEXXKUU)w7wf=&f;HBPX*mzRA#V1=X|q$O%4mQT=1G2GVd1yY+dAs+JZ!xU zpPMX*7s0`!eo?{u@YTdTZ6pTvS!6s`#Q<@7 zOrv9OX=&MLied}L80cT}Q+iiEU|;N(Iq)hA(Qa}@4rsgV{xep)@|z%O?NJT;w(_W` zsFD)#i)!k{BUo##QQ%67ILaq3dhw!tA*QPln;Djr#A5kw0~nxRMKm7@AKh;C@UG$! zCxioy*BzW3wVcqe_x_RzP(27%QDb@F9FXqA-zND}4*}zpR>J%3c z+4w@Wn&^3MXKwXRl#X85JdnE)o?D`m@LiL&qPVzfUh~@jNoQ4=c6%Uv3K@vk^Gzx8 zd66VM+w{~FvFJx3xwuQVTp;n+ zK{!@&TjwLZq!Z#oKhcF>Y(()lg3c@={YqmV4f2!E$#prT`jx6}f?C?z+Ula< zx0&#r^jzPiOEg!Koy@6_IXd7mDC?NA7T3>%>v_tJX=wqxvtD5=;FCCF+WVcxmM81= z<5!mX5I(eKxi{6H_?Z$>+aBk)&#B-S%Nd{Y4A+t=5F$v)I>_slS?OmF2Zs03u@7J$ zpmpa-Xb2*m)J)Lp^k-)l#0lJU;Slq-7wUW&jo6F&%Q>}RQ4)E-80u+sNbA)-+x)By1{Peop)|^_RjFD@BljRC!|K1a|Iig4y395wcDI+^ zZWtf2YdmtasVNAhAL0}tR93TYahYwT=`C>U*dEK{Zj3HR^4f9KjXmATP6RVLgoVbq zG=0t^);)r4yY(2l17+J;U6T3{cZ;1LEknH01Qc=1lkwQvj?9yE?R}R7qIJXDgiXZ73oj!r zDO3INk)&3sy0cz-eBs!P$YCsz-vQA?2CrW1;lfFM0d{tvka9gs!G-3&3@@V;7~ ziT6i|AG5(Lp$%rjJ10~T*Z6d@!#|X4`grk2qQ~TS1}q8*6V*wc=})^};4$MQ|DWmM zA29M~Acl7pk8}n(PFxmO04BLPID$wa$8^M>k9a0XoU*1d)bo)M4`900Bk4|mn+0*4 zD6s2IM**g?1MD2(NG?HefVkKTL0!<)Gy?||g4inras!;bdRgF399plf^AGA8*0+lVt6{-sMTGfY4_uOCgsopmKbEGFD{@4aD%GvwmXqQ;4=8Gk zf6ByU#|K6u-H~{`bi6SC{$|*fQ(4N;{&`Ux=Y(XfcOG_j;qmacr;Pr86Tul6^Zfa9 zSir)H2_A^2Zo)gH(+H&EOyDx5*)#h)^LrUbUPk^0=Q@=U)NTdPzXY%uk5c;1I?o?` zRu+`R1sqOcps%mQ5?M=HrwwK@qJdS5+5<~zV6NtOT`;t0%A#j=R~v)neNdRx-U#7a zsPLzOQ>3jG(H~+27saU?&#k-~pX7+$_3Ie>hWvy?hjHo;Z zd1toO$?}IGfmkwrgI@O+Dj!D_eN&)LaD;R0$;f2YQ0%BVj=$>@pemVkHFYZ z?PdZhcSgw*|6VF;w+f3k8iBsK(Uy?A0jY}GHQOIj5378^QcXpPd1}i-{%d)%B5GzC4*&nNarbsR^rZ9!ftdd(89ggE7J}^*N+nu6P#}9D*Y;q zxA2jb@5aLI2n`Qygxx4uo(_=i>BCHV&N>wjlp-yQBT3iI8tm{%1lXyhSwaLOfkLhj zxDq_?e^$qV3qqy5uy-~c3p+$)D;F2}oQqr0S>%+dcMo&+0>zv}Nd|10wR+zI zVEy~IE4xHCQ2A6avWs+&<~j&2_fM)7b!t@k_^R>&)Eb=scRw^VM`~BF&u$_Uzh$`# zI@CSbZK&^}Um<%b9AiM>^Zyc<4Be&wi_9TjAJ$4Ez$;GeG3X+<2#`{#sZ8!b#~uhN zkRV4iW@eJ~<5ZXskIO{k!98v!UDG-On9HDgurVs1*l3Gq;RxBD?Kvlj)73zfMclC9 zqt$DQ5>7Y@h@Y@kf=+C)q})|H0A%izHTGylK|g%P_S~+7JaXp&Y;{9w8p=dNcbKf% zAPFh(N%G;x7@>H_V-9v0-Z%K9Lw%4Hvjp<3p*fx*@c$p0Lg~(v-aIUY_-&5=h2hzY zoS^{AkK)$(sRaaIBqnI!Boq@RN3iuByCHzbSvP!6DCYbAm%O~y>7ixIAsl0j&TX=8 zYeQU8n8th}nUR-x;WQx#GgRVUS3?VeLz@YN4(61eBVFzb1PUwq4}`2vmhop0I*J8EE*ifc_ABnsd1 zTPPsi<)s$yRRe2Y%K!1Q|9Bid6-mgi*>HL|(eKb4Y)2Hv<73Kc5AO?54i5ju3IMsu zUzt(Io`5S9f$Fk`lUn>sdoN|pejviU&T)-Jss1dt)Y#$%rDydmu0-xx4E71pb-DtC zrBIJESuLE?HzRtA-q}1Lpcd%PZ*Gz!p9U6XgHZF$u=^>W3HZB}<9;%>5!(K)1MM-? zZwN&@Tk`@L@nd|Om`AD@s@#0>W%;|DX@6t5ci0Anm4#Ki9}$re_jWB=#1n9h3%9xN%f*+^Tz*8gruvgzODCiNe!bEsbVryj2*OO;clSsuA_#lh?pr^+ zx%T<D^Vcqg+IeXdu-vt$}HR?D~@-xeZx1|EzyQu(Dj5<;DIQ z{vCQZ?yzC&f8+r|X_gCF!Jg=(FM5u_&{CH7lzXsOsYVFx5IvFg9|uNCSG0>7-Im zBBAf#Qv>dKvzhpVbzUd_GElFh zj!+p~#TD=!aZo9~Xxr=-73u zpACPaC4`8#y8y_HCelFPNL57rkuLj=I8Ja+0Ph;GasOn{C;`ujO?djAul6#UM9xQB z-ajq#q7kKG*8bosx$@=zcdg)xY-& zM0B~v(a&9a^;%j`J_Slk%xs{_QJbBbdcbI;tl=g0!S(oJ8@d8|D-Lf`-P*HqKM{CXibhl4JH<`=1?Ahd; z$=qRqDJrgjDy_)XPRP~Glrp~k%cIat{W<3!_ET-((tMwo%#fy06DIuQG-1iMprATD zgjN$Nu3v#6&V^pK@2kZTu>KFa`94BWA3`QHdb($-6g%ZIQH+4s8O%Mj^jzA#Lxc7w z3z^iVcB`w<9%KlTrE5M$oTHsujLs8nalBbu=CP^LMCCIb2JbT0L}R&wP}&iMU*_)H zBnuGDS$mcYVdD<)8^KDmq~yssWa~?;ogo)+6X7@4CGtn>>h2(|9H6y;Lwa)h42(F; z6{{n4n$u+j%LE*^hWgaC z-CdcK&U=!$wWUr|JZ$<9RwV80_#Ei0ygwOeQJQ(sBy8Ka$nwE4EaA0P)@riC*^tg% z%KJ=`=xB{%{%b=fhK7bJ)8gEh4NyOnit|jDzXs3feH3j8QOHYLLPD{7TpHhM24ER_ z-4^D!5w=CwV{nt!@Q7&4q$1vzCJnoG$m{S3%l`!V8N0y_XKLmo1|rC91gW`-e?nx8 zzHt!$hS?wZuHoCsOvYOLAE-V<_%4YbQZ%AEXg6bOYC049+8AX<27SJAt&D;lvfFnl zC%Ov2<)0@c81U0pMod{(V+uiS@4-2_TY$yI`C8@a|A2dk7y8tQHc?`rH3Yvw^nZ{I z@Vp!jSUln!jAXe2LR~+C{rtwtQ67ZK-e>2V1mNZ8knw`ExRWnM|AS{-(3pObB^l+f z<qoN7_hD9M=W&sATI91tqIC09+UR zxAx%-i<;WEQ~?i2>j3#q0`kEodrtW=pfRHD_IfX*y$<7~pZwCuaVp!8(+5l7{^YjJ ze@k>_REvJmI+=yldK>}P+Whsa|5+1i2^{R)y!&$pKz)C?fj4JV0}Vy5 zc-Zuj+!Z`~(dQ!N-2=$iQQtN)o1 zwKY6imGt|Y-_`+m%IHp@De1RxTl9@A9G{7=jAGw^VV|3KcAEGQe@&43ew@3u3ix2e z?)wx3L4Bx#T#QoT5rF4^avf)C>el^yHglvO4U+H0cV(Mh{{!#{|8JU*H0&51-W>bb zW<+;r0?2$nHCFa~@c^AiTK8m0B?#mfiKkT*lPXXKkq`3hA7%UqHK6$W{{wKg6!z9* z*|{s{^?R2g&8pJY{fufqz}TVfmu*|#XUi^&U7^hN$(Lr3cy&4+5h;o#;qjaN5WnR)by9aJcP#;(Ruzzq^O!2|Mb!>Ngwbz@`_ofh zl;Or>_$8T7hp;{MQlVc(U`-O&39x-8Y)?hSZIU!yc7Ds*32t%qaQEESvp*!=H+}J4 z9;MmmEk&N5I7jtWnMPIS*ysjNA_D~#!J%QshS+?gl5_AM`D3CynMOidS|W_`z@Dl{ z#zuNyt=6)gYEHG+N%@ra?*e)azh_6M9u*I4c!#Kx)r+19ubWo+nOg;Izuu;|Wv)!j zUQYQi9W4GO9=Ja~SSytAnMD60zsmYl|9kD_m+qs%s(f_E4e3mB8605l+!)a zTWg%Mbk*Vn77lD&GGUw!4?DeNpK5`zmu1du6=B@*K)ZImwW)qRSFO{LwhuJ$B4)#Up zzmqQMgOyv*Z3kwCvyg3CTU(cXN_}4s+nYK3jMzL+plE8#V?o&yD*k?2JC`TXYF}Xl1Od2-q|Cz z=(z7~Mt%Ibe$OSa`Cy8JFQSOU~JZ7{;MQmmyyxljGm~L-xx4)$Lj?)PY&|8Qt3GX5F>7d4oq&gRZ5%96-xi_ zFF^z6{G-j=;gf0Bz1ho|8$c*CR&!pVG@R;$jN9i?4Y^yC{v8kqV852^dn>=bC_k23 zgg9!S%3#5};6s!{tC^tk*)+`n`AGF+bnkze9Fw zePiogCYjjnOL*mH($hN2+=|N2!~|L8`aV?U+ddj((2EL}NdHgmmp(?$ZbfOZ6^$LN zBH2f%>De}^KYkPk#DLGP^i_z#6z?8Fa>;c03x{6wSaXgjgHw_xNg^#18f_jpK0U3I zj7els|Iw6ZEn8A}u}=Xku z>XT=wJF4+260drNGIE%R`=&p??S#BfUCZSwX!^Bvk_^Ay(jU^T!X_Dbzvan_wq5!1 zSYU3$SQ5g+?AQd`8(}AqTZeJKfJK<^fzp$nC#1%dHS+}HRcOLK9`K`oM>SG{?dXKh zW$ls%zJWm`<2#~+ePfin!H-P4U^!XQzgiyNdo{ot(CoszZdI|lW5T)Lvt6(7kqtYe zNjO8;`G;st2bt+(4gk<97injm?Tb9pOXMyDDU#sEs}`i4kJ+~Asj{U!W>vp#A)U0rxo?Dn8kXBQ5elGqYe+n_U9p8tdD8|JpM6 z=G?Kl-w^q5l|NMcheknBQbbJ5p!IRk{7PZ*y4(*+^EGSXi$~*hOf8CdQrlRWSy)`V ziqY+mHgY$=c`m*piXO9l(4`a+71b=^ZXPSLl<@OsHS>=02+J6Ogv(LOvVdlkYWebT zZOTyv-`DZ;-MGr@&~%l3(rT}z#S6U}`9W7euusU?2EoR^OR|1%2r?zVJ8=3uz%OIy zQ>)};H?nfN53WC(@vuE!>g6K$?@POf&GrdtNoL`s*%{68k&d&@jj1`>3FqVRD>}XM=rzHIVO5k zH{o8LQ0^wsfpEMa6Z_Fo!K%V|t+;C!C(YijsQixRDa^OuwZc`sma6v`PG7jO+%2Iz z>uK|NcCbO-iD0kp+2x3j%7VEoC(BS?XQPrrgACO2{^5Rnsyuc9vBWluc7xwEc7IZK zRrqxgjXLBqw0{))?jI`bcfwutw*G1DmtRchRuaq5!>{6(m_ecCyAUn$epIuHOsn5!?$ z;Gtx27ncnYtnbH)0 zZonT8U_OAHMLY;l1{ zMHoKIF%h9_2pu^@O5sCewBfS*$_69T9H!AXBNM~oX|v$I0NPkJ-?;ZCc(al@5nv#w z$ZsBI8Rma5yP^=UWUk1Xs4#0PkFnmMKrDo_=n&sCm+ot%cnO{jgbor_5v_f(>Zx;sw zM=G?@H%H$v%gpeO!kKMuYTA7XE8LJLO5HomY6dGqSUgtKWgd9}(cu{N^V>Q{ z!-F1)ZX;Oc%~|AACWwalrI9344qM;n2^J|*_$1QN`}aP?L<*6HXy9VXvZx_lcYpi5 z*1xB<=+UUxRl_)v05hTytq`(E4y%r4^3Y>ax7TIV3L4_LHE6LVk*Y+4W`}>V)kdkgKlO1X~dq7`&dE{ zXFA3h#&gqsg!FlWdkWNO#WtR#&Xs$GnVz1msMLjX-%yuCsK|d>{EJ)*Ry6M8V}iI4 z_bM5$cm07A6AgLfi7eUo&shHl+gw(;+7ANJ+tTml_U zq(-{CvX2g?JEd3}vkB!v#_PVdBi7_dtu__ATUCP6yLkij>Nw?h- z3{6Z-nk?hI#=cnR{=@a_p`qcAMBK+bf>~Tt3||9Id9!!iu$FP9HaC3W*s9K7_@b%d`-1!&Qp+Ya+g(L4dl#Az1_`4_7GR8NL0Q7`Zi+jz@~6G7sA53{t~Q zYs_uAxZF}nAODk-05v8$-ks@Wae6-d^n_He%BNyU?97gP4)NUG=2n`9&&tY{1(>n~ zy>qi8m0SwdEpn76WPR6v#jGpP-Guri^c>~X+uGlyaG$87zawpXVI4L-qjFHfZ7Aaj zlw_|FnStv32^1A9g>C>n(r7}>nRPE)tAXEu4LJ{+;Q90RZoo=hT;#pG4WB4_ zQJS{MLQDwfifpGoyci4PA)_q1{(XdD=?oN4Yonk5;lg!o3X!5OnfS73x{%wE5o$rG z8bxPhEk~cgGp~%1HU&6_jMow`ls{&g8*;sN`%I7mRdga$Q0VptJ`@ZK3Z54f6zuQ2 zbj;EEKGTPc?}7~%Qzc3`Rj$10LqzFDVXH37QKs@6s(_ZW?9F?mxsVE55Q9&#faV6i zbPhvS*+mQ0xgNju28it%4otDcRIaS2ilS;v8}eHsO<_oU>&icBVV29;&~SrmqVBOODWcSzZPFbwf=G0{NoE6lTEfk zMlb9B5t6!mSjudkb|x-B^vW?uaXzFF{7itTiifA9=*0laq5xOKp-$W_QA(*-&$uS3 z!iKEIhT|(%8s|b)o~eB#zk5kp*`^+I{a__nD5|5xxwh3k)r`UyI{P3KtbZia|Fj%w z=Ymv7zr6@mTFx7be046@`Pi6!Y^GABp$x-Ul|*mW!~zUJYFH%GZyHe+LN z>ojA^Zo|dZL}RDIZ)E5xc#NT~hp??+yW_Z=i>q3R z_k&oFT^N&xbs*g<!U%dC-_>PN&+ydGRd@H!~D z*Z+=ryy}k_05&;>Fl7YIIb_>G4xPJ7&@{;A^gs(DN@yCpU4Od`RH!*Lo7d`AmU1C- z@43hPrbDId3=Xy7C7(t99Z?igFsi!Cbb8>bSW#(dpM=+A=y7kMBV5?Avm->D^|fb% z1=aBZ0K(O|l$)jC_;}}wtp2^G2NVGJk$8^{+uF&*@Od9__Ha)>7 z1wk~Q3=IVD6(l8`D8x)M;QdX*B^LfRn;>k@Wj zTvLI~4$xZ@LHjev9O>kc0o*h{+bYHU6uY*tzhHz%0ky?%g=Q|9KM+xNcj^Ea-cdZ1 z5It=HmELaMY0D%CyGFh1Ph~DjUW8pEKoz-+5_#F?b6L17h6ahcYNFoT%__P7p!y3k z$4!(SSMJU3v>$~5pMkj|H6=vv{zVJ(m#U}23y(u>afQohmB+j_lCUhqqQ?~KhTqDm z1LQtOa2v^Po4W;6NDVU5iSw^MGOnDo_l{0^DwIQCOmq~Ml`UwSgWvZMU#?_G)Sa1< z(S@6NJ+zrn<^6FIC`wirk%Y4Vb1m)4VmzMyn-rvgbo0M>4*3SS?Tm7B9)LF=b%_Qb z&rD!wC{k9=`p+hY3md+*zBif0u*$&Av3&~qry{3NhZo2nii`4Fn7>Bi#v@U*cYZ^k z!WYR~AJ`^H0+IL}JypMJbK{zWQaplZ?t#QmRSKH~0Yk(Z|DUXo{NigE%!THv!9K-j z1tWMjC1j|6n4@RAv>BlA_=7^qe8^3%yiCl=Cddy6f5q^Rq8RAO9T{>n8HjMKL;nT+ z;R7hT_h@%DgR&u7SvmVqj*{YH*PIv6voFIJ?E%Vkc*)nnj{Ljzu>~;{l#k;Moqt#n#OW9<}pJQ2>T@SF;C#PV9 z?ilMAD_BR!1~dVT!D|yZL=r~+N03f=D1Pn;K&IPd^FFoI`9{hM&*HJa7aFTL45>-* zf6_sbQVJDuH5*GBXsfoGtG)WA)>Z z%5YN&$@glccAo|aIuZ_0`BsRg1+w;tol5XKN2jeJH7eEoKhG#5YQVRV;y$tyXYIOB z|1?PSY&sI5v>xi7wZXrap`BXKWH= z7V6vDGDzyQ*FNT${pi1Zpt_56gu>%F0#j6dUJ3XyU$DO*sqF4}p)~YsMy~?+8JM;4 zJYzxm;gK4-n}4`}d|UqJ1y=J7CFjz{eB)Gre#Db2c5`4a+PW;-lK-4Jv$x_vf3c0# z$ekY!(Ba)DW;`=;DB&AyMLL2~%u6QU2Mou?AwvWuz}VDOi36+U1f@cS2MHUBo(tKS z-xJmq(Fwl=`lTfLKtMZ+nc9d^tPmdI=cXk6Z=DKTE_3Q)9_xzO+Duv>^%8l)Hf{I-(x(rHMf<-R+S-l+<#>)NK7{S#7#)cSynvMJg8FDTyX+6goBLc(&6mV-S&;+)hFGnX6s}}&t$&K zd-v;J+K*iKRjq&{v)yZ^oGjMLf8{wfcTWSGKkwF(IGnOpr~R7>M`piaWi8BgS_7us zFR9S=G<{w_&JOM5#cw7&Kl9kI5N` zOS-CvJe_=+sSX5t&4v$gt)*+feyepr=n69^*F{1@ufIZ2M)A!L=-D25AhM!= zE0EG~jf)O?M(BeD_qbfe4X#j{$SRgX9)mx|_6QOdJE^yio;}(;!5W2~d{lA=X)Aw} zQ4Z;_^z$8*z_jRtkdH|{cy{4?&%ebsfJd$~!}W}XMXOY@5`S_(zvW&OIBHO55 zGX^n0sz?!^Xr$VuC)UGmHc#VX3Jh_@5>TVBt(C#-{t-t;_ik|!UWn8YK9dQ-vRiD5 zU)zCkX3S7Z$S*bK`8!4=SK-Yf2r7O;4zkx+p)CaF$4`FOuJn@b%9YXkmx!;o@ znmjK+i{E1mEx{Qq)@w&`%6h{dlLwh4x<_GsF=k27Fa{D*O2Z+Uq1?`x4v!=&K$w&V znyV#p3U=PE3!n1ehQzY9npRuFvqbNk5w^tGfU-Nc&q4X8sQPzz%sfGIsXu8zTxVFS zqmHRiBWY>Db!g*G+8gHFkoN|^cH_ytMN*eh-lIDT7Egfq<)TDrBJ{J_fi@YEe9WDk zmd!$s^G-lGdoeIO6#}l25Ga@KDp5fmiYK<6U;oCOx~gVQT_g-WPikl(ZQ=I&`dHxl zC$#ig%S!n(;ymCSbAT=fgsrIC{jsb+`BQ{r9w+|S2h1Ry1F`>`X^OE8z)-O#cnlhj{$OJzJYyml@Y0( zWc_YhRKkyZiA{;^%jue2Dtd$fBCQM^|6c!X;x_=Ms8wz%6sF;!b zVBr$}Tcn^+y_yQm1N1%}Poo<2i( zOU8j#w9J81Q*;7u#=gaH%CwQw@Q!kjubMu+n)?Ix+d8ebZ<1HVP=OJY;`36= znI{v0PGLws1T<^fQKu}|3YOQxo>YW;fznw!O3bZ&fh(6&3l>&s%jP0^(gBu(LyoUvaQx|VqN%>rT!+-ss13(y0JF~{fr zJ|woh8W)UTPOd}OBEZ94_*%sIQ`0r~D@#w$B5Q^2;@{;Ixn8%B*@ML2f;&j8u&EYb z`lzD{_O~1gX%N^gHc}gsKG0Ol({5^N=@mu~ailOePcZ(c1vEXm`lc*pL6B$itQjMc zUq-Sq9zJ4S!p}1k5{c`KLBA<08?L3NIk4>XXYjb{p55Akd>AaX_J&=PLP6y^n>9-LNq_PKFgEw(r^i0=wh67cb3gDHjVI0IsaE%9Pcx} z2oS0$NI{?B|F0NvHBhMH3>lNlC%V`Rtlbk2Azy1IwK#L{o%kyn*_4FIbgH=c&Xym3 zPRnPCF6Batx<8u3Z*HPqr3U{Jez=RLWNU5z3WfFZ?>I5&Hrzq^&ypM6#oHhwW?u(# zcS5QHWRF={SrMYmDR;$b z#V{f-?;>ByDM8`^8yR2DB#1W5&7Bd~iJH1IO#Jv}ow;4?CLbBM3;%nx`^H}A=6(H0yPHV1 z55nAD=`Yop5RYvq78_|JeV&>RP^r2rPT{Dwy;>n1Z5PBpR};os%5|jwsv6}6a)3;K z+Cwe|)uP2@uid2fC^Qfx1I!vJuSH{dmSfMIA>v~L@CH1_Cu`c`n`xy-nnJ{OJc3@u zxTvaQ6)Df%U{paHQpp~}fy1*54OwG^Cl$A^mPM5HRMr8cTXPqh2kcOtaY%O6Hu=xIonyl;NMj@!m~ z``^+>H`oV~+L0cGn@g{0k=;f&6@~qe>(&0Rci?-Kr_>jqYB2Na_!lluq@5{p#=3VH zvW?Hjcq?vWHmj8S*p&MUt#feHfrK2g01mpA%%3n#wR* z2m!>wP1fs*kiGl-Nb+dL-BAQ{2=grsd`RO_$iC#%iR7T;RP~v!2~11NmLwmD-IU4L z+yYQubTSxUc$sZraL|gp$<|VP-(?zsvPddeEWamoVtW49e?D!{?QqNC(6Li@PvJ!F zCe|~t+M%%pD|_Jso5FwdbjotQ7bl_)nywW%Q3-dBH{JQleLyQgcO=IzZDGW~K&$HI zfvORojju8rIGf+U#as0rj7vdfN?e5sI@-a^smK>2^!qv&TP2g12P0Pa@ zY1UqkBZOuzkhYEp9#*W4%H?_GNZ|E^S4fc9@|STmEK@HhJLj(xZN=pcHjksMiIc+Y zFl=_#2lcpB^2D9T7!@Z%shUyUv3U8ChLcdByh8r~9Q_u^Sqk451XYt#+n7tx_lPQTwt)c~lQHCh*`9Pi5!E5_-`v(VgU#BLeWo220DC@n` zp@ICiNnxyFeiYQgSQA~+GBb`=e&K3w-^qJ>X4;ZRuVR$J%G=gB`n~?~3I%uqfHj<* zB*;M`Pou|g1G5*UpT2ue>A$|BY-NPHdIFVGJH9b>Q6N&EtHw}Zn8>vJ=-uaAs8_WF zLg{Gv9j?6`7|Lj+aDsdbv16z;h>sJJ+lpycPNt05-ceTqiT{k@`v=``eYxOz#_D0)rx2}mAH(kbB{vzDy zioT%_ztvVMvrrY(^oc+J^{x%Tq|LHL5!|_l`K{RfSp(v#8o3jizV`O^MqlMWAyV?1 zl8YbWOcSz@LFa5KSO{acP%)hPwLa^@!iDA4)zwF%b;R{PVWl` zbw+YIAMUr0gb170b?=1frKihqt_6DOmQ8vlPI+n)hxR(}-2@ZJMWhYI6afUgtc> z#5?IRc}7@rcLx3bJ+1iYCN?%wXf>D9Z)CHjrKKq}lu1}nHZUK4aa2Y`Noio617wS} zQj8L0p;({u1Fx`^4^+<8}7Am)vplf7Q7k4nSq6cU{@ZX<{ zFzjYv-s_p-f4h8j6U(zu9nv0Q_4F%y)SDJGuEKV&u&o)F-6dZA-ZQoA>SSVSvi7#0 z)$Yuog~fN)`>M8DwVeH3LDaAn*Ijh&$;Eq<7sMRrQeub87Bfk=kL|A6eGja;IMCk$ zn9Q93O=Pl3x6{`k3%W3X!0!$l+Ryf%*Og3A5Q0B{_HhUuOZfW46J%ufwQ9esyT`Ao z6JHEL5IeVM+=dk4(Z7_Pc#iJ9idfR4YOZI$2T(Ek;l_&H>=zm_S$y;|cR6X^DG4R{}m zw7rGe?gTcgk7Y`2+6K6@tsJ-sC+p@txQZi%qw-h++kbvLtLA^=D@~M)@C*lizToo& zvPEGvHx^;n;B6nmr!;3jieBGZ%;|@Oi@?UwuJBlJ-s0XXTgt z%sORs{N~s{8uLA8R?|F(5Tm85tr=-fPz(YBFNxeNT=5sc!s?;|2}Yd^TZgFIWo*W+ zL}fw3E{78*gI?#aQB4mI6Sq$QTi&_fuPO@A_Wvd^oib=UX83Kgh1qYCu!7mVE+MEE zXu=}cIi-sNLq5f9JP@)=;K&SAnyAEVe%P~L<}X_M5WR|%P{WhrOlMk*&%FbMZnH%0 zW}k-@&gsRn$pzWk9mydU&~a^gDxc3;M@uupU7n+RtQwLL@bMX6=miB< zAkoFUJc2v$`ZZ_l!U+5VH;${`C|*bB)9!H5gg<`VGMa^o zVU~8A5~KUrv0sB%UziaJ)8OpHadaz%r*aqUhRYIiQl_!xxTDlLv+vz@Mtzc0cTXTs zf6|&;nJXq%bSmXRDf7wN32pt`h^?fk2&py1f(T z^zx%igZ|%Eil{V#MMSsmDp3AiIcs-2Y7W9E-L1S-V7&ieW{~9jq(sLld%Cy|Gxe7b z+)uRe`#SPbZEMY)_*erm8NI7VE-0z4?&CkS2(c(x|8U6xp znBs4SajL<2!B+FvA#E1I0Hp|$!+zkUdhcrDburm(0Y_FzmH411c3P9t|E5_yc8~pC z_IS=ie)SOurW8OJwm)}2wbYBE5<|DZ;B-y5qxPVeNjLnWihxa< zWCtJ`a)~+V@8xEQ9uFIfwclUqp#aHY8TL0BtL}HH+n4ErFak5uWDN zTX^Wo4jeXP*nD39(erIkO_Gn;7)83~nI+YFnc?}b?MXW74`y4Q2EHIuE(d+&Md%<* zKJKiW`2!FqPG{dCMlA`;-90{JFie!=idVt@=W_+oDFXlNTCt~*ZwqY5{u=ji+}q_v zAGLr=27~gW%s@kCD@h-XB~=A}LvLSM&IprFc=7_SsrIpORSSkF@Fn59xfT^aBbq+- zOB{Wu_lO%Js&n>}h;Hl-8uUSVsON&G74M`!ohdY*oEbPrUUDMeQay!Edg(RGrfA^u zbYd5$U6^CrzVy_;g8_1EjrmsObw5qc7EqAzE_wFAbP-uI6kKiO-&t@4Q6hl>Ul4iw z7)S6ttbv8um^4e)CKYDVUkaTD2^KO^I6h#QPc_mD_yP&R&l~~m!<{|*Wk=9{=9HlZ z06>+{F*)!Ke}{Mh_tC`3Wg9w$0uee4-xv8j*cxFy?UVv3g$%0T93-eh4XUjWOpFpQ z2nS3~oHPxtGbha8$B0ER_xqd7icI~P7(M~O#{&qgcj@+?gZ=ds6rBJ(rdzC9PNnJ% z76p{MEb-RNWb}6vwTuH{#!~AyyVH-}K*!|T)UsXF$FFYmk_i|UWI881JQaZDIn@X8 zG~i9f2&lh)GHd+oi6u)nb+Ri3^s8^A+XG*E*JZqK4;^d1Q~G6WrM7Tz(}D4MnkwUQ zM@3ua>j53Lce`m#ivyefRVDJ%^lkrm;g@Bl&8+kE>Ic$|MgxxYb7N{FR}FM2tekwE zaCcW|VrpoTQ)Z_FuyA1fASPe_L|LQGxY-zsN;~K-SI6HVDVdTJYUiL#}6xDh}&PLP~*A z&|8Z$Rv59?F1`D2SaHuGC+)iK+-RM@Kb{py_-+fdeR2-B!GssnXjMYla~T=HeciAd zx!-`;^i9!sMF-4oz|{K~@uC_XlwwN-D221YB_2M2>m_5pbI@|oK=TJOf(aS%zexmH zrywX)lbQJd`+1ks@ke3J6`qsbV)AdguH(YUvq6$owqBr}OvNGQ9QfU8%^0Q-oBN%| z4(v;Nnww;;cURS^c%d8FXT#U__I4G79EJEtTFChzbbnA0t-=^T_v;!8Y&`-6_RqZ~lY;~{}swRF!dhBomw#ZB?DCw$#Rrp1U=hkkk$(zwjY z(@S+}K5WUkS)v2n0$0nr#jcFvCyVZF-r9Yesa zs5(;xgwB3m2o~Rd({S7VQ3A?(T$cq@P~r5p3~yY^qtcCpoE_RD(j*NO?dDCJCoUqt zTrl`*L=%q>U*&IkT(&{L+Y}JA)7=q$IJ7yRb+t0d3zGN9Y+7&ni+dpG>B8o*P!r|X ziBMh;58QidMCHP(dfd77q9D);c?+fgHfuI&EKQanJ=^}pVbWSX&UDiJsqJ%8$eO+jnHo*4Bd?-#ymg3iY=K3bPSi`BOR98`bC5dQ7@l$69p zuKRpgOCK(~+dqhA?_6l&{F};7|7mSvvyF~o(JBGUx$Cc`_$7GXDNF9Coy~sob6P(% z_F~~w%(Fn2QS9s@BABl`BX*6)$E`>{vQy9%-9voOHe~U?%a>6d*f)q}Q!d=r{}0l? z$)iB^8fk+!BS z;VAcO+_!pjWus>scrJcQ*1#Bd_pP6AI3Wksk#F67vqLd*26!aD1nX=t; zWNQjbDt0nfrwv#39FrYJtL!z^0j!$he|&iAMt7cNzq^qow>%uZ@0t z_akx1A$tv(T1&_pm1Havr$(B&&)xMD>#?FRJg#O9G69 zV>UyzoYtVpO6w;AKV1?At+;D)OCAws>e55<8pUE!F*Iw}J%s{!8$_ehYtUk1Vt+2! zKv!-0+Kj+wAABJ{7~t`)D!O5~%%Qa7;KHc{Wdw&Uw$P(z$jAp7!bh*N!R~t95K%NmL4heq*<|R&oyx6Fe_EKN1nq3GQ^e8(we?A`E2xogDg5aFP~*CI zOC)ZG!8}=zflW`{%JRy5Kx*CU>CGb zf)M<)y{a9W&_{IPne_n#jN$R%w>{rEO*TjD`W#}bt*0j@CNxJ?5tIa(Hqx4Hgp0s9 zV6h?Jx&8Tpb?0{w(VHeYITs{F#wmbV=$^gU5)I{+Z9gm`E@a9tDBI!%;zBxp)00_D z4sUFVmfy96a5x_eonav(`YUwp?@`4u@ON)~-zLJ_9jVjzxW9vH2(O4gwF?EPms0HR zRyhk3XCry?e z{}2A!(DZhE=mQ(ggTqB>X&78SqJrAagUu3n4lre=e}M0~nMuaHHZ)m zja2yH4Qu}2$z6QiLEsqmbm{L0GeuO=o&|E$i1&^miqK4RK&@Nx1Sr!wDK`|{MwXQK zD5v7>#Php1QPzEz&0;#1`ZVeiGX`Hrc2S>OXmDLC0+M@Y_iF%@MMpgOz8QQ#$>P7Y zn1@XK(*MZSDp52Z>L)z_SOL5smLJ-czae*k2^D5Dr?ZRn)GV|$V9f0)bAYyE4W!3X!L@Tf7fA*50Cq%8VkQ#j~y?zd$eIM^>f{y zb9)B3Xse^f2(lZKFn*&mDt_EYxlz8yP4BM38{XU0dd!Y~35_;EDHp^K!u%psDsOC!%aqsdP|ZKX60?Wzu6z22 z5;$kvB*~L?Z(w^nr6@Jm+RlaX8b2nFdxK6Xf`;SUr5%R^=OkKG3tGNBa8z}i83{)h z%)S|i3ddXX*dKA~+v$&`<(TxlgGKGet_4GJq6H)M*cOhh=a&}T&8RLC7sVN-_zONW z513cP96wt|^;`&df<;t_Ekfu4(dd)Rw9C~Ck|QA(96k=OXN>)x%uUtMm^q@p;z@g= zN~HL%mm?Pi;qCH+ZZVS|ag<^aH5nOQoQlHH&mL{Zom3Vyp<*&Y*(UQ|n$0>GPi@E4 zpO5)`O}r_-;@aix+i5RL<=MBRb&Q&W539t!ig4nKo-yGRn@?y{d&_T2IVvoh&Uc`BcT1hips>n~`b(_> z=5h|H4M&6g`{{HlRV-5q+#XVjbsXLy2wy&hOfFyIvtjMV7Mk&Y6OhrIP)+B%@1@IM zqH<%S$ozfVvqh03e~vyg+A=k6esDOkAn1Mpa({HVc}Tag$&Vq~515mhe}kRC2?#7fp*Su)~W@S~4I8ISxwzR=p8 zPnF~EpKj|)-zo+_%~y;t(t!0|RYpc5uXEM6!!l^?*M<=^yosmj{>Rk#k8Cdf=hL@nE4KE><^U= z>n_xj)U-k>IiKC(rK)olLilhpLO3#_C}L}YT4CDo=fgl(@Oh1hNT}$h9_$^_hW9W<%IrB;#Y(!g z7p3xX)1erwm@%0?e|Ck!zqQd3fyN7v*X8wQ?nr^tz zEkbx(blozsz)k2l*8C>-2o*wh#09*0${9qhEKq5PdhE6G`tr9nB{-DE#sPcJ4}JfG zZ+EfU#~~Bw*8Win=dQbFqm7i_r^a_3)*zr%eswoFpdJvkr zKyxiVkc4GBj}TS3=D*nmp{_Y(qUQD4F|)OZir?#_;~?TsBJ=f7q)b1c2a?v-bH8Xo z|ALQ@u8ka&=if95Prv!|%7^a_A7aa{-lvRjKODXA>XU9UU5LqH@l$GdGf63X zc)!TFL!Wb&AE7!tc9gR|nT`pEVsfzj=6ug>%kL5~Ww>Uv7s{`4zQsmcl|)0R#K#=Hta1~Fpx>~apX7p_~8 zGT}0@lYMkluzN8yl%C+8!By%uP+=3i*M=XoGsR70Jrq>?+MdrR_qhF7bt{H_#C`jg zD>`iNEiLBVAaO0;&YZ&0&9%CLbSR+5Q|o zao#I;jGFuVN%&7=N`R92`MeeJ<}C#C5cTn@IK8QTTvvb$g4{!&0ur`ayU~gt-Vg6- z_2QuuYmMvLvzf4eKHi?6VF|K#Z%ZkfBMLFk97|&(e#E#>#e<0YLP=P|FFkT`z8^4R z-t#*&wDT?n_v}>A(xaz3Z51S!&{^M&u1YN~lp zGxcvp2kx5-9l#q%AL!PgK(8r^Cs2Eo@eSbD5Dp%1y|G5!7F>$m!4~eB%S6N3X+}zK zKtfDbb7PnnPDx-Uq$UW!&$}(iz-h{ag7I+YP00^G7e~qtFlk?EGRz5tlTo%#Q`QY`A9UwOQ$5?u)6hU+-U+UEf{=+3gb)Gp?DPFD7K5NE{f_GroZj4Y$A; z+ByGB$;kL$`yb#(hi5(79?y_R5Vz=?w>-~J=%H~63`_z#K61m9-sS;zPE!PmqE#og z|0bYCfj11LNeDbO7aE-?pXFTY=5h5PL#^LC(*RYG@rSe*y1Krr_Z7+wR~yR#j_TlE(I$#)EhLmB{95EBj~gr}z;QJ)1rxZfwk{@&%j>Gu?7 zv*rkGuhr8#d%?FSh~|P_=k?QH35f?aU^VX3w+iOaa^39f>-)Er*(I%rbnj*vsEBtK z+?KapfUnckOA2mQW%ljDTP+Ag(xZwB{jBAm$b+{iE-r4_%kX8c4+p9#<-4i4%(&;9S!2XB>{y#24fJn zG)&gB?1W;uxanMYKWzfe;VpVVv8!UK^yzJI8jU=N!+CjzPOJ^V%p|}4TFH6r|MohK{#mc z@z1`9x*pG}BgQQV&VZxXzWRrEtVHNAE)QLa03|g$c*O}xDe^pomB&I}_RSpEot^Kz z7H4E|HXXm|D!-pqw%1^lx^AnBbl7P05v5q#yI=%vfQz2%7udzfC|MyF&7f)2pTt^+ zY8t+Y_WFE{@z=`QAf92$pt1c$C4MRf2_zJmRgGe(z7XBvR8(cVBG;Rc89QW*u zW`vL4bThc2GB)GB;Pu;N4^i9aC$wBVe7UK42>Qr{dL&YDkA!r77`nJuzw+CUhv)&9 zJ^ynP{Fk@*PVMl$>9))n2FLa2GI7jmWyapQFdSIP4gM=zwmJauHpt>HM*FGt-wWVP zs2MRC-{&fC)xr4=&KlJ{u-jD z>DNaNQa>z~5r@mbUK2}Q?)GuG0}X)aXPYt8e46X~(4vB3!F0nV-ET2>(!0kWg60s! zm!$<6#`zf>U-1o;FlitDK!fokI|{W;!+)rLUL6ji)%g7dN|P8&?bgWjm1ET4Ci3aH zzi08?!0UkT{q`-6(qRzMGCl=X-9@-^(jO&5b(|pJ!@n0@9gbW9=fcfqGaf2iWY_@9 z(s6laC^(+gN4yFJAMm<<^xdCiITZ^={hkBZz3bX>6BjT($4B%}JVo5TK44V@k z{09RzLK$D?NF7X%&Sa53rMCBTEaF`*>J}*FOJQW66{78F0qd(UQohMUN6)1F$HL&K zTv>66*nu2!?;82_IA5h~v8RDCb!J3=dHI^R;bwo{fCH+k zhx1Q;@omIK_}G_Fmvh0A#@%#R;Zb0PkK#UUU;m>(NyKxMy$@1VMVelgo(op{063La z<&K=hKO^1>S^olZ@CQ$I53BSdUB*BEc69ipCHwYB2o(aNx&u~xjcLzsAHjHyiU!fMgS9*Wc`S0n-lgSX#*;U>)Sy*7t>U$2<@5NgU zZ4KmKjrX?6V*Aj<>3qRW@1g>$LNNioS0SR|Ac2s6o=)vAP-0&5jD1D~mcmLm1+<%Rl_WgwzfP5Ok!E z_o^yt^iuG@LLprieZmOhhTdoUx9f-4k|Tp~C39<-kk0#5<$Sb$FTSuv*~=wgN0n<5 zX}sm*2J9MZl$e_SeERgMC-~4A(~eP?h4*z`XBzXZG(}NP)zN@H?2B%x@NsYVt=vGU z!}gSh$5M_rRYT{P9+0*_n2XEQEuoyi()yNB#@JW?vCi|qbql4cc#&xh?P&FD9Ur>r zsC#HLb_H|dV=!J9bzl(Nko9p|gHHb?{$ifLvojMiR_}}YC-Fmn?729{ti|-RVlWur zhZz^F{dCD^ftX1LRflSi4t|C*(emVlmVZF==MUMV#2z{&4R8T@jecP4`6o<1Gul}+ zCsH=xXDLUUY$+b_o@D51eExB!FU#6}Gp62fh$yi}vFO;9^+fpMq5Onn050<>jW?>i zB%hecyKnE|>)gLJFg~552m33RsKzB#DjjEgvy}Jk+ZV=wOxgW_|HTiY%drC8Smh?p zC`-BIX0~^}@)?U_Eu5U@zt;Q!3csH!OPk;pQSF?lI1n0AF_ zxrcatFIjmSveMS0Ycl5M#f*F7xK8v0<3k`0!FolDuC_4~#li(WB-qFk%Ayt=PP-VN zKk$vO?eepW+{uwRkfCJEcBtH#onvnA-Ux*Wi9P>VX+W5DPrUW4=X7#}8Oo?oJUENr zXC!pd;9U;dzIjK-j_T^bY>6&Y%srs8A#C54keP^?sFw_7_9KrjB8;w~)Yr4BwQ6(+ zqG#@;Sc-FYz;wmp!CkHt*(>8}Sv2-zTY~5v73)>=X&k*4=Z3Y~ZeEXsv8q-GSIeue zpxjLnRp_yOnj)@ARjW#L2eR}CSxX8Xw`YAi2mjcka1VHt~0q#qW^ zeLgt^%34#H(#V{k8RNOGmhUQyf-pg+9SGxAI~Gw_ka z>D7_YDsSs?LncPvV|Wt>iUjS%#poq=oI%E(1z$~k494YGs2oRPCqne7^P(Sl9DIE5 zn2}ryeNj3b(DjUuNt5{3`?3ZY!7E<`POCCQnem9KgzfZsDmG&7Ib;WDoinOSEPE^-nj-6u-_Be=#zCzu z`{g3)G65f;%szJQ8>-J!;$_Y{FJjuiz~0{whX4 z)S?F(XRw}okTJbg1+_RXf4a)SSe+zNDk2}m!GzR%`#0Myxf@Kc^7K(UKQr<`ES&X^ z=|n`nh&z515u9zCKrT*V^lR9L7QBHR<7TiR65E)I{*)gFH6A0~J*7E=MSI$ou;tUN z!d7YS&d2Mo(u#=axo(8|EY=1Z-<Mc!0ro2bI@qBq{|Qq@tT-kn(T7$iJUPNL(0y$Pcx; zQBYPdbLH)??^3sF~xI&(EP{@GsE3YA*2c`s#J)0m^y zDy&?}HtsL0@s>U&Kb6tce)2=^685PK>x!7*tWuu4nc1b-P=Y9N`=H>xk>9X9 zW5m~ISML3SW@h($1tH>K>C0H7ekV{3rx6kp787IkLy;El7?C*yJ!Y=6Dew+sXMZhV z6J5;p?-fSDe-JKFw1$5p6dCLtjP&<;SjxRhiW!2i|Ai!3&3A942+Tn{14>H;qToLqGGI@9$v`U^6pi$Jr-|&e_37*zTJu@#-^5a0C>& zBh(m?5%dLnwcncy2|mDB@CGXO{+wovbdh`Da%WpBUXM%wYw&ciWcm zc!v>mn1ju*_x%iRfTWPMR~8i%9D#{C&|(8v8mr$J_~$hDu;S|Xug?IDi~%maFHrvhvOfZr+?OELn94ztGWyu`Lp3{6JoLP6*#r zCg_Rrn`rW0ugdf_C7Y#Q-R1OQM%y$MuGl*$_A#=0XQq{zdPuL>GTB7mkp_+h463QG z(btKMwgv9Jd8&`voP6KY{&-KR4Sn*U>!{)Rh~QF0NSyWkt#~;k$_mo3<7UzwOjU(D zb7(R1nWvF$D;Bs4M_daXqfl9gUX#^>!80oY_(B}(43lX0dc>;NZ_M6d50QO4D+1ca zgQ~@M51jmQ4eZ5@j6g7XK<{hW0t{n1D;bR8J^?a75B%P*Qn{xwU&{LFFxv0r-nU2`(F4bT z1Li*fq-p%FCnnL<1){p3mgCsu(lath7S%BLeEYb7J@STf;wa;0^bXikhmo%J0}@no z??A1@D$FbwWW;P?;eiSZ%lJ{d4`<-1OKtNkj;x8ekm~xFy>%zr+cjSWrii~EZOwEY zefQ-sXWo77&@rNFmu$h=mE-j+!AY#IDt+al${U~xOK<^B4;Y-g7b@nPFCysn8>$K+ zI7^HIR}*K>Ijs<%P+C+IMaBuvx@p$$28Oy(=FFgfCoS=8=8K*dp3{XVnm)g4QzBvT zQmB~xCNCXr9dkhQ|6!FD!1+h59jHPs3mC?l$6Jd!`uOm%DZIY7G(k}Q*w^QPNDxlHJ4#ql3jiG(1SFe3zKXP=^oYm$(N%i0P zm`(L0(?~*fRQ*L8$7o!)b*Y}#B7Cs!mXyFZy%$~=?^Z|Svi1x8yd1lH4fSgLky#SXj7!oEu}@b^RB8jFg2%!%+)HJ2MXtiEZ>+Y~alYNqa*^A)8iP;Vs+T zqYpJUs5;H;BPK8enwYVrA|}Waf;b0lg=_+5o<$Q-BlbG3M?vArl@$kLBUXq7_{NUK z-ZD4K%UDnxsS*=x{R*W>O&$r|N8Ex1MlD)qAC=Z(r1Bm9iy6P+MNwY3$`EnZ<`(#!W1Y}NNswpZF;7M40H-RPhc$px>ZvmL5A=@45gx5I+le^7OuCraQ(jSk@(kt@1+>}f;O)#7Wh*gKC!L@-w4#kVzU zU zYrM>Wr!AtqWpHp48^CiGKI!K9FCI8QQG%7&QLPw!v$!U%VRf-aPOXCBH)(Ac7=F(A z^}`qLq%7j^61mZ}#YY)&hXn5xbty#i2M0$+gZT4n|`l8B;?GUZ&J@KPc3(9ZQ& z^#u5+C{LEHO!aW6ii6b7f{mk_w%=Y(G!#6SrQlPEepHL_Nmej~#W2}@%tk(2{MaM% zl1nwSmx7x60?@VR+Y>z0dqCMnZ||Atu-Tz2$k&{_baMI)R4rGRHr_MA2|OBHZfW!h zId%AlAmOV&N>b%Wd^A~|_G);1$y$%32@kt*HwF$TJXE1slVijuv0$|P>)HliR^c-Rr#MW(cp&`K^3^-qW~{tS{a zwXgynu{EHia;-tbID}}DznN`eq^^PHden1>6yr@$2aZj?0lX1D$2#4j5`;T%g;DF> ze@r^h>o=~oUa}5p1cEkm*7oZb^|f(M*_mS}Mi^dXM#AgD78vl-NN*jYD2DEX*FdZ$YUU zr2IC^5l!S1yf0o<5b2M497o2lkmk#V@#j7hC&nL579fmePHMvH>H}a{?Lj(@s3X{@ zaHWxNm7o9Y&mzDlsq1Kao~3mYPGyy^5qxKLt_i1Zoxx;GeI2h80dzw5M)? zvYB-m4H>^eR6=JLSPf$#bL(M7MuuQo^GluAhErzY{~y>V)%Tw)Z{zO2rwp6^y#6w0 zjvb)#3!hcLlIVkR9;E6<4UBFP0OyC;`hCq83oWDOi3JRZJ zhl8^oKqywl&F$+fmLy%y#rk6i6|;ZTDcE!3tvzKLgbNdjra8JmrwkvIG0qDkFzD{S z15Q9_e&G%6x9|z9#8o{TO}<=HvxCgh(;Y#A zzt`62zJ>SMkN-PkR3{lffnJfn%j+D#Ym3OZAgZaEJuoJ7`l*Q8u3MQ3K!$iYUc)cR z{{!TspKaxFFQ`FEt%?4wWE9>(<@O!tX*GJ9dS&{Rn3>namqVDNo@7%ndLYi|Q9l{W z_7lO2*Tl1NJoY2@2u!Lmv5|grBHI062fF{UYuJ4#ayBAtf=%Mj?yh&pfE~9ca2!BR zINWtsOw(yshmmnRE|-jvKZ9C%M8Ed!0xKYJ`THh1fe1jxH=8qpGG7UoB_S5cgy$cn zu0*28J<%`9?RJQZCKepp!6$;>2(G;=iRiJyMtUuLP~}TV0y;FS+L8j7_4(EgRD-tc zOtcgu3}Ie$I6*ad{gFOdgxGKO_(nTlgyt2>{+x2^W^1 z1wQddahTDog!;5k>Rd1-v&MsZzlKMY0AZyr>HK-DkhJdtN5lKLVg9Gx9-B=x zR&(Ox+pjv^96KePoi)?HMKxlAPrWehVow#_yUm$(8lUd**VSrB;l`is8UOi_+wKO< zztBqpAyt)=N*mi6rx&yr<1yu#iIgAaBO@aN%z1Dj!G{GwSTG{VW)*Bk=beH(HnB_oy;*A) zWAeD<`kNN+x%AVk7U@S^d34OY53Fg=m$87Ci9Kew4;*V+{_olrX1sWxUdH!>Tb8_U zKYGj$2#LMAKf*AZ$Bs-d#0iQ*o5x(zVHrJT4em%HWnH}B#nEIlb{6YVqP63dwxm+| z7(Sf|Xsk5=T+HRg4>CyGbaP#$)~W~;y)qnLBu^^268;kTcx^j9Mof14PqJO}R7lL=r+4TT5^9p z&r}39V*i}-c|5Cm*wW99#AnT0TU&l&D-OiE|AzLth9$i)`sN6y;lW}z%V@0<2|+qEb>)>c)V{ zOWArEt!hgcts19G-;7ZPi-=I{!j{-ggrIlYb1E@7gw4^Khb38S{`Ug2IT!GTRkaA7 zNLpxtWfY^Dy!ci&rUo=g@=ywJI}gymk9^Pa9}+Uu&9Uy_`#!mKsQ&+v)-`P5)Op`O z;f>j2#Flz?o;&?pPv-?S(ijkq&3y_(7UnwLt{Vo5LQJs^!Rg)(*@W+}JIhbI;N5A0 zs7ZdeS(UdMUl)y5ao`xfN9_4xcg-bukK{f8AXuHN{q20a=1d41_M7XKOoYX*Tbop2 zs-P{Y(pJyx6k_t|cGsg?#9#dxq5_GhU@@++m{vFUv>Sg;%pyna=VM}h$kZd3pglTq zR}7y_vX?LSJ|33sl01=y>{rLo&Uj}{-0xWkGFtHd5F%^a9T~C&o^pS z!}jTK_NdOGjHO5ci9gkAUZ@oCdFv2HGaUY+QDy33=97Q>e!Xo37lRMSU9fS#@(w0O zPNti+A9F|-Tf=d>+XA~nHcR=<>DIG6?Yk%XWw^y(lcrLS#@D0*~Oz=kTq|mkrHC28d8m6|sk+ zhr@-{r;#PxhdPp$DZVjwT|X}6zkQg%k4$?t7MZq^+e~%-ks??D_xq0?v&-f?N($nn z)2a^q@x#teBzgX;HlIO6!fSmKQ1Ul%E2?iUlrb7GSdS3h02vZX<;P62okR^Qyy6he zI0MIpdCQa@?(Z*vHS?!oyZLWle#$Sj`bX${awOSATRXM2O=qp)v~)ft&VKwcm7Pc> z{VVQDeppg4q$aGgTb$9EfbLDZkkeYpsX2>I--W5892~b{J?UqFz=T`})`RVHl#>Ml z9nkPMJnQ8hQ_~=1J)5lwY&w6rt?qq)oKJccar zt;vVm$hKx#gv6I;-C#c32{{IZp1Ze{u?%L{1ECPuh?q839N&J8r7m{ z5I%*&3s9bpt}cN?15yLBpLPw33Q^wn+P#Pf&7eH7P&^$S-NWb|%eIs(xxrvN{(k&X zthh~BQRC*Z0--a=Q{tatN;?s2voHQ4dH+mkONKLku<0K#@okFZkpmlG$G+xmUHyCJ zVRd>WL){+qmY?Eqc%?jP`@0ZHQdD~fZU@26p9t!i^f^3jA)73LS^8EB8Kz#!Bm39W zon6CHTLHJoSW8#u+-Pk({t^~;4rDXjAz4`M`f}KTJ0}aYMs3>?aA%BjbKQ5p-@Yet zJ2$x|=Gt#8HkuR{1{&^)bZg_@H{_K;K3FXK_TNNX?V><`1cnIl+kWbQT6bAKlFIbn z{iof!StVw*nv1M-4KtpmK2fW;;56A&mu!{N1GA4d)}>$m=Rf$2xc`>#4#&4v-t|{a zPytT+Y>fc=;B;#h|2KQYwu>j<;;4;r@qp|iSt?&RjT~2h0`8G5U`|kDq-u<4aTrUg z3_+v`bm9C*=EL{fa=TE3)3uB?ht+iW>-k1-#I{=&MQq#k-PqCx2a5O{G6p^+#EY6- zHt&MBF@hR@uQoZ*ai<^vGNm~_@fgK zeV%l@!T8+eXiG-W_;(1L<nIPIX{+HzIh9hkkWxU z`-A__0pnBur$OXw(lk1nj<`!9hWD-+o7e%3PVvFD@iC_O_wjRrH5TsLIq4OKo6y+E46e4d~ z1j7qtAMh-CNzc;f4MwDN>Ae1heMl#c%XrqXG21IN*CMv)TN&|nz&Hq3{Os?^%?~TO z96)xk4ahAWrc6B-8Wv_X1*iN6d>G}&ONsY@nJUhAO>>B7#evPt;2V#v99 z)z#G0EZzcVtyq4*T}ACsUoE8j`qu-mx`u{^)mstkB*F!cu)iG2Su?W0pBSWs-gy!5 zG@tq^vM5I1&#G+u_J?JWo&z4l8;NhAv~W0`gsTT~rS9B-H3{~?7Mny$>)Y?vFg4}+ z-NQspARmn6CEgK8hJ|l{^k>=?QKtOb>_uhM`JBs{F0a9Lh(>U;C99f47{=He18o!a_VX;fI(vf#sAx zNNvwy`MMQLQQ3GH9zUCtQV9H>{M($$Sp}#Qc599 zsWLqE$?03@fwEvrHe>B>WFr?Sz3^pF=Y$bTbV1ya@Nk!!;b}_|4DWW`RyauuT{htf7AE? z3#a@@2oS|y(lNO?xX#*VUNGf#f6 zDVXbHBb@wG{spQ9P0gHmPcg$N?Cqt+wV1*#MR~d=WyyK2*AJhP{^(4Xw-JGSFNQ_o zlj-8R#T;inKBeH@moXWoK!ToM`R@_Jbr$8H!z+{V5JRL^0{kGgfQ1>VJ)tE$uPA52 zZI%(NQES@B-tamkmDtEMxp?6zW_Iu?KBe8?W(V7tb0ONu$2GAsrN`fKOSH!8Z^~h3 zCIrZ;ork4`IRo$m7{hP)k!o!0Kt#&d#YJf?YxxTW|JAJYRmA3YQml; z()fLCTAvu>_F%viUqWsoV|=)}GODML0^YPPZ+e*c-}}WA;(IyQ|^`&(3>QWgf_d^++FLv!|`ESs&@Gj8PA*M)p)Rwr^-|7!2zPXc{H*+D##E`xB|MWhya(d%wGkKbU$?2r}jK^YaT* zPJ(3;@mBl2@QtyWOVwZ_xz%C^Na+yKWPYNXWNu>9|BX!Ig+-lIhEQ6*IxD=FuAf?h zx$z(WH`V3ibvF}mYY_6zb_tr-4U&l3WWL^j=&!IycZSX;sJ_I4{ktGoG6p+5QW%oj zI#KV7ps9VeJ(Wy36G?Y+tVxVB!4qTnvuyAVZQ9wL@-*c*h|!h_Mb;DS_m*=ao##{r zOrK{H?4*Z8^yhk+LZ|8Sj1_J_KpR5r7{L0Oto4e^ufTapTy9xS>Fs;uQ4NY}06kpm z{QSHvq9sw5jo?a7Ju4dJ7jls-Na~h$wRG~tST?KN4AfE2TgBy6ovUl!j?T`Bs{e15 zG_GG5#Wjg=Ce)+96Vmbbs5hh%s~RA(UV|G#wc>IEMJ;FLI!)y}HNNsj!Y=yDa?(Q~ zZ}<*iJQD5AgEX=e10~P(qCGE1QnK@?N9i$i>Y5vZFay63VO~~A5;XB~b{!_EN|LWgMu}*t>8A+VQ|z z_Osk0q$@gi%SGNo3LSxI@{PSGB7u_DX!0lV{9b>@qb%eP6^hO?#BZ?P-`aYFR5=2R z0n(gKenz+>Gh3!(oeR>=Riu3qF&ExXIp?R^3}DE8)9vatIb8j_pzZ4+q}3!g#*jds z7*B$z^%m0^JyoQg5k}PJ?I1D@U)*1hm@*|%*gY1od%mXGZ?L*-ZH4PqJmf`&z1SuD z8T*7a^2|q}XX+&vk#@o`kC?lJ^c&9IypszHofFh?;crfyDMipAwM|;$TFu0jDxqQ7 zc5G&C?AM=w@((su0)3CL!?0b}e7HMk<*jXwONaDIXC*vX%(nyYR+n>V7_f(*x+%o? ze&aQTGYC>;M!Au2nJ+>1kY44OgabwuqV+Udy;HvA9;j&hVZ}^&!yQ!8Q>eF%K)@wd zDOSFbzU#xh$lm>-7~SkJ=SmzhV#k?d7E@37;5{6XQoJs7t!B-t$|0F_RyX^v*dv&~ z?6X4^UVmTgceoGAS~CavYPR)wx)vW{nKt!0_@!xYc&~3Bk;|`oU;9QaAmvMX@;%H3 zTNpamvI$XQK3(eaP8@g(1dwf7nOa9ta*;zrUtW_M#A6IQ(&Rf$Y18w)*F6=&-=9Th zm+|mTRl9c%;%|J4DI(WQF`^ckhsbcuecopupr|%9UzAftes>Mh%&l6nv68QrYvmt9 z>0XSi8sffIgNYkcI8yTgASAyjJZZipvK%{h48Y*p#dqyBEWoWT z?CN3#Kq283=1j;$&RRjqfy&$>Z#IwX?)Utu2Kn<9 z3eL8U`CjLhQVIFQasqu9+%6=n8SuZjNV4TzvU?TFee$+^%eP~V^u0|NKWfzv1V>Si4KGo z8DOj}bLxmkyhp{KxUa&&x=2GcB(ncPeV9*asW=kSK3X=U=~bee1cC0R>Im_$nPhvs zS&atAT>nbSEpr2sFA}@@?W&N`CQU9BEmc>6&{%-P)8}T3F*NA{R%i4QQe)#3!k^rX zBh}?!^xvX)KUK7tZ23-8%xKQ^NT^!n=Y}nXD;|G3csVM4RLdym|5Z_ETJP59BF}o%}P`Uu+EA9LmNt>7Eio0ZkpXX>snIbl?oe zBb-5m-WfX?3XTk6S}GD5Ja(7c9i;vqb0UAh(4~K4wC5x+AVSW}7#qUPrvx$^CzSO- zaW5H=54HbwG$*k@1+0%_PIG-l?^GR(jEqPjlK-5r-Q_`A;|0zcQ6-`1J9WMsC*)nP zgIa0$cRYv9*e_hS3W74bH&qa>lP74zL7GIW`&-!PktDOazIgN-!pXH0GoocFXVEP9 z_W_UV@-l+DuqqyZcB1SM*Zop zmNXuXp3lUNi8D!OBerx&|H$ZC1i})%4g8s6xyaGk_Yd#ruTz6ojUY%iP%F_R{N73T zuq*n>zeAuQ!sC%%QN~F9R?T7^ddM|@#Q5A*<_(=e+Av+&P8;DBntK~@l}UF_9*cQOjq4VZn{W??9hpN`TkPVNQ#Df3Ymi*}80#NwF0hCUJF8oqiM znE-`q1u}tgW=feA{DC1?p~85C_%e+Q`NTcQLNz)Ol?b!oW!i0*ZEM~6NJmPjKGGM2 z?h!&v2zZ@CLlUwGuah5*AJ+U;5M~q|!F}LQ6>A?5c?zrDyJXvN%)vY8h9PG(k;=0v z-aZ$o6_nD?0aVidOEnU13foZS>qA|pJYqjuRzZ7AxSo+^pq~saH{uhQI8Kt*2KZ=N z!ZuwF)H)k!%Z1Q8DR5Yo(VoI1H*89g34A;$!9so-SZF{9r&jdj+Fn1<6sUC`xSTRB z$Uq9Hq#ZL^EJugt&=Dn3M%ZSp&kUMnPlkp0v`GPJ!OK_W`DHQ$Z z3a~MIro?K}V(r4nM%k1D>rM&JF#(x}U5wUUA){N02G`f&9R)O=+-f^(KtIWp3)}6F z1IG@U*7ac!Q1RqMk)_06Ie6Y?Pz~$4|ZSwkH_+M}XNJrNd z#)qQ$fq^6e?$_VIzDj+v*OO;V>@QC}+kL_Z_cJC|91kRLw{)ND2quu}2G(s;-CTn5 z5yzpst0md&a$y@~7uzn}v| zti1y)M;?UEj?g}LSJVPPfzSDN;cSiM7oa3A2NrP<&rjc0r^EopLc1O!ti>c*(`9bJ zr@#Op&@LjJst#}uFX=B{)RgHJ1{yu~Zz8~bcU@Sf;MzAhT_XfR#?S!!OTM;Q>Pv*) z{E0%uWB8y=jQ=L3N`r0cGz+)E=^EjUBdV#KI*U3Mt1S4WHC`-{?iVq0K)wA_eP7$t z;28=u(~uH{1^Wuhpb?$#pH+AZ8o%*BoFAri&3?-cKBE)@su9*F_zcxH57?s9k)FC! zh!;Bh&d&OmU&yxT{_v2O?FHgB0N{aA&HOP{eb+AnO%pc0^%sFXoT8{4)oVdquuV#CKWeGNCaN-VV_s!DF$7K z{(l}rN$@!poZ0yi8a!jD8qZ2XS<)_IXTC44oS_t9=tB6PeuXvb& zSfmeR4Nzg-_Z4=^>EL3{)ucsPRR4qRU%&)wIT-}p-z#r`SX#mvjLbsz z1@;$8rmNjSXwS}eKqmv~jWP7JLqJOZqc%^?Q*|Njo?JCGVZQ=hMYf*+T9k?t(R>HM zyK(2*WdQH5R7XyXOsbgYV5c34GmwJ;IR+|3hz;Qs!VvQiISC=z2TqK1wYJ*=-TLnY zJ7#sDMds!0VzPg*zZg}<`D)o41`gF%IXF;7^df}`O~`4^_?W55V3p8+LjyrmFlLJE zk+(##f?KO>F;*op5j!0#%XLW7Yw9m4l9Ax*`9H)Xz-2fB9Ps@eI!N-463%ttE7p8u z^OKMTAZ*@?N_3%plYA2`{|=H`aP6Nx0tLhXMSwv)$% z0UNonR*eJuzKcP~q8Na@W90Rag}?y{zLvwo%kiXPnGCDON&;m-va%mXg7}0Lr}`lt$*z&D7czG=kgE?WoW`IfsuJ-ZLY6c&s!E#kGu+pvy3l)A=3W2(b8+j{PSwz{0w-_5pex=+QWHri*bny0` zcbN4p+T5ICPEr}0S>x-DRY?Y}^H>e+ReWIOh*$JUvcsy*hc6${H=Z?q_KI}#ed4X9 zsfPT9M}p^Oo4tpoZ^pd6v(usY=eK@+x!GJ_lLy8lc&vNlb(DPM>QOIki!K)3!Ir+F z$Jlm*aF>HZq#E<%QtC$*`X2nouNSSJ>lCVaQI`hEL-N0V{$sK2hgB}q>~!AV*{qN}9z+02^C^OjeO%c~hT;a?LO z7fhYi90K3DyK8uyGH{+cP98Z>E+Zt&$U6~x?}@dc8uNyY>U5~UCtP1kdwVz}Nb5kN z5qXP-pcHn)aTd1FXsx|`^b5w%u9xN^P>mYG7KJ1w_4HA{n;{73*23q{4xYdzIRYyZm>VvEu5~| zs^;-kY>dhMl}R<3b-~9X+NK()`4a{Kf3h*-S_7(@x&y_K_Bd_eX|N&Y3~#6t+51wb zX&aTE(7Z6^_py9m_MeZ|(jBPw+VfOz=&>MSS|f&?&fcT9N>Q=0Q?{_aV2=dT=RX{Q zgvT#~uj-=&k`Jlc>p*s~r4^DW9j@#1!ro7}K=g9PQxtr}EW|H^jWB1JuNf9|a!NEG zW4L)Syk0c-5YmsSwY7D{8_ve?JYL8j-f;k*8Z7i!SiAmVvCsHFr9+Z8h9em9(BKeI zoPhMfQpiQ03%TuQrw&Fb30+r>hB_JMq~(lXDDZgv;Tyu^2L(mVM--6kmECCj4AuML z$|x zAH>`9PJE6?7MYRs4GsnAPfGW}vr$^1g3#)gnD)NzRK#6Zb<{3|ok;#>F~S9MJ3thj zMRxawOR#cJOI{g7zBau+P|euQa9qNvBJk^ZQ_;nEHhUxp`^it$I>pT4F!lxEcE==G zW>pn&&z*}HBp{M#E#kE}>y)j(pB|sUZrGd!)kWKn^&W0=WN-J^aKY3B9~DquQ4dK} z7Z&HC*A;8uP%K13zQ+;{wn=w$#?JdOumywM9MbdL>xYY*{C^#UmTma_3bdgj#DOjk ztguGTNS`0Ay@r7@7ZJPjNZ>b5+{-CQ#D*-mR`bePM~-jI>u*1yJ&T_XNT^0u4AyG! z#Jqe>_hLeXMCcYod^51MKs_j8E6dlLA?6SU4$+M-4efmu^^jE?jk+@q(T&Yd&pseF z`ZxI4!KaNZdtn0$NU-g)VC|L92fIch?{56Hm97m^MMnAoBk4%~pJDdsDuPuFL-sDu z1AF3oT4Wu?(J+w`6HVCKdu<0Bz7R%eVE-~6d%moV(&(#!u*Q;qzdsRUsL739X4$yL zd<^fs=$$BZzs`@EWrLA@s|eYoFGp@ZQbm?nQ~G0&9z+tl1U&9m68mB`B4lc)^@L%E zFQO?g(3NZBHL6l0-1c|`9Mlp8NpRdh1Clu3(-PlaYHQ`+7lvn z8nMy3GTJa)f^_Q_+W&QVr zx5VDT3_ylO11HG1%XTw+L-%*Wt5>!yLf^hcX#FyPX&=~pa{{c9@g}`0g1b^ucl1#P zCsEZQ6oYh@mGF)bA}%Gwz-#K-NAO-VvnOt7W_$;fYBl?}D>BwT+{$WrX;E|{wWWn| zsOE(TvNJmG(%Yo{uzc2C^P(AIv%kDJyA5MQ%nU--8G1wnQ9X5mFM#5+v+rRdl2w^a z5ZU~U*Rs;V!2yUmE*SSzYDnB`41^#E0)0#B9FZeWT(fJgz@>Eiz&jOA2Qt(zH6GS+ z0DjH{f0T~U_2=E*49N&L$HJnit$7SN|BFoMn)ts$4_vCEoV$bloT{T@7m7f17P75Z zMY*jT)A=C{#IC#cD+R@q#Xd6PL|~KL?+yV(@C;Akq+U|fbW8#>^2U>>1}Y%rT!XF2 z8zLittlTJa?%sLN56ASS6FkQMLFo&6U=~=VG$)|#u2wtS7y=>aS^ehbrVA2V{(`Z= zKo;?OEkgG%9n}4YVX=vc2I=OXT}-UYFt}kvS&(qjklrHg$)SBSKMsj5nf~hO=;+|= zNtxsCVmDY|SHHNsM1kP_T_PBTUol0QKWaW{K4P^G-}safFD^y^=MobT`f0UO6A-Ex z*K??^1P80{;}@hB{;Eo6k@AFFn8Ry-hcNS(cxCrKd%TxI`{g7U%$tq=!==vCsWmcE zTO-v;SNTuZ7Z5?@vl@?H<9&mxj@${Y2KM9s1MNcw+L!4>9a3!@So8$b!J~h2KE7(Q zQp~~FS0g5YfDvU?W8ewv$&j+xeIF8OR@Kn9>ddjt{PtUo7-aOFLTG3sduo4bo%^-@ zL#|aDR9eCm9#^l2y9M3m)7G2Y-NEwx+}C)N)<7HQ2_6Kg`-;?2Y6PHA!+y|nkfDkC zdLCxryK$Ka-eaC@yy6+`=C}5>-l_L~X+>@4;m)-(8uf<)4^Sb*Cp~!=e{f3!QWNl< z#0l64CS9n#z0seqMFeZc-kRb{WEM{t)V|(+%>U2xR)kbbi9JIwU-d^#F_M)SS;YHq znp`9zKnDAbsWV_R%41bsy=~6f&i@aK$m6-Jd`-v0-uieg;MWh= zGQ#xKb00Qak(d>F_g&K(!0E{0!4?rrs;4*#zHH|*kn5HqfP7aQ^%tS>5OJMyho3Rg zK+tE2{SIoc9*~)uLH40H!_FB5j>~A-3!QAhNtLTsD3<;6Sb)`R5ly^RK4cr=RzTQT zIJd+yW9G8Y;W=L$_<4K-1D^sH?zkC79+1IyGz!4)X@CZ*RoiDkQs9R84&O5qm=IY^ zKtkF*5GXI4R32{sMm$5RFOmV8|FbKan1^bP1*>Q_>6XfmxF~U%gpu1sC}-pQsT%2* z_-x+c>3?7jmp8cp=ClJZ7g@D_R~D7^y(|tVg@rlcvO0Yg*^uuAABz=~fo+5#jHaTY zA4NrzdY8~T3YByKB0$?{0F3U7Lm-$<27;{tf+fxF{e8cdot3j9m{NgeI~67P``(iW zK(FlT&f3R3Rh5i22wz$h{Pa&|4E!o8+H7m+=H@1`kK)*30`d6|;I7!Ro+lQ^mYnb% z_)+r#j=%Xa(dP?TT+A9)v|>FUI!{3>2bYL^sk95nJo`U|-)|Q!J}t{P*P1~Qly zpMUy*J8P;`m=LpFMa|p$b(vcIxJ2j+9O0T5dQdy)+Z_+W%~n(A0?Op!LynUtWbLM$ z`N%oQkCC52RnHQlekH`muc+KD{58-SFPn2pd{UAV8yg=_RqB(Y{R_63N~W`?=g_Ig z6gfUQSlH7oZg-!YG)W_Mh{$>~Q)vOSz54(z^^^FgA`SxGcVy!>_Wc8(6xXk=7A8== z(rm>s>!TD^jZvj%(wOO=B7df(-nh?DjU@lNa3y4hdd_XF&F?BN5{0n0&+iVQt?t12 zLz(}~>C>m5O`M42s6YqDG{DgOF3`y2EvcU4ceif{s38@?^EI>}yMgPGm{rKpXxaSL zR3lw6lDgQ3K>c7L_xIf=oOwu1z_BRCQ8=xsk(OtV>n!2oPsX$}h^|+6HeSNO-%GsP56aY;Yl%F4PH_f;Bvv(wl z4^@Oi4u;`?(v6f!jK*j@QjF{&htvp%iQ_|M*?0;zW%Y-c8ddF@6fy=1CtFu}s5q5o zF(UChN9uj5co_fVd8E5B@)*}YYh}AUD+n%aV5dPPX)~#2JSmj;o zqCQM?<-YECfwA;N!UD1!kS-}aFN3@GkRfR9mTqS|k4^%gEIyzO9PK?3hKF*#1D4ilBzCp>XhM1P-msBb)9m##kQg?b8j(H8#TotLI z(?{)D90QNQq+z&oAJvK0H}*E-g=VswXQjUveauCXpIyAE5xgjG88Cb$hjOL=TL-mg ztXlIPD?QjERGih?O(YGBC)DixaTG>HiB39mC7^z4v5DFBpgn8%>z-61?4|p>MPiFr zJ^wBy@3^jlJ~z4j=w@4fVFjwI*;?Ukf@_E3RORJU-Pl^PVJT7YHVo7^xU4M$u2{+k zKrW(?uXu4Oce8(IH_tr@niKLBv?fL+2Mym?CPs3~+h3Z?x?1o*rBBexwo9ae# zSni~hX}pwFev4FcV}%6hBXZLc?)@`glmnN|E|=)E*MNl1(OAtr!jUQD<$y~gol zu)F)kmv0^(7kS6WSz?NY9+`)MTUTL6^-@Q`lCx~!I9I_xrj$YYDu>?gVU1{cbqG48 zXNDJ=L?7!wrT=7zocy~EIm@ISCRNXDx4q<4;RJZml1fbTuliVo*%hgJDnxA}bn(V; z&D#jlL8qTst0~(MwD+I@Am5Dz1ML`P~%NY+{@fg zl{AG6 zW}ms4Oq{)*A@r9IhSPeN6weDUfNtH-9z!m;v-&BWLF%ZI>0CGKnh&jaG|mV{i$tjr zH$gv4QRg`PL6a?(jRD#%*so~jW~eiTgj6Dy!wkQwd>-fMymuHHxN?n2eSpJ<0`)~9 z6R>eUv%{b|TzvwR!Yi={Hq&{|C9dDa>iC5G@w5{PT?IhcZWrN134?+~B z`qVTu2GFHI=RLqTM31GPWQ7&X?qFKji2|ItQ|2h{qm(0u0{+PYGUGEs(ZW$z_V?|< z1@4k%;GA<&Ty#~tgW*38&kTw#xCqv1cB-C1f^+$ga`dYkC@Lyu<7j6@(tHkqJGhHj zO!JYz2)b&>Tyw4YZcsaNSu)Z5BU)Ww&Q6SKYS_i6slWoGzIE7(ia1X_5p8a#+o6ET^batD)cc0c`d_iM*1gNHEab3 z7Lgik0q;#HJc54v`QOs8mHsx#(MksB``>W&kIuHJwW(rHdT{Mq$Sao*t#WZRin$K| zG<Th1TFq7+H)2Ene>s&HWne zX@|CAUMMBS0x~>!KSAyRu3zz?5oL$~63PtEL85)HBsHXD6%KI(`_tWTfnZDUnxxeR z?eyWOL!R9Y&(7Ye@LmOQK_*>i6KptjY;>%n`G!-El<4ce+od9Bbt@jNB83{k<1=#U zNs0*PM%-g%KL9nEn{)W}<=J%qjTvmWL|lxR!p$t6YBTTANh}l@Jywj=06a5sA1PrX zMlCQa58I33_6F@Q#0@RJ$Xb2%3)}OA8o5vM`#~NLwfxAXH;8*Gc=6`@Riw%zcm`2| z+cG8cdy!af2u;$wfbG(Uvx*z+V#k5=8QKx^0DE;a2CP;WF zKM2!MZJ&XZep+O3%6Cgb4mZ9@6|w4oeEKGUIoH-djpGt*|K}{?#D?r9a0)I$35dwG z2w8GkLa)DKR5{bl-tvjM*blK>_I*D|sKh+h~@je7rxeH#iD-65LB-nJ>f#9TKlPpVlt6?e@>M@LaDK z5}W!o^=DzmIPv2fR^Me3RhDQHuVuOe;w;kGBu%@!7^ZY&8d zvP&bO_AE}M`0)ow12pzIg6p!p%jb`;%`#)5rkn1Wnh#BM_yA)1mYeoHwj@jc2DMw&uDU^P=F4|n_l@5y)+$)#Ng|8V=G%w+@j?&rY$)5DX zDT-45G^z7(_syzF7bNJ*r@*u!k(a0gOB0d~>z4HNH;_R4r+Gu{47Mg};y|zn$=;wq z)FG&cqA>XiD==ypw;LiTuw-BxMcVouoMz3aG%6^E| zTRi20N5y4ui`aEPyv#CN3O1NDJiN2%^vCOC6!H#}4X3|FiEX@-(EM>NlvhvM9GvU& z_V@_{?Cz>ic#ogSu(Ou&FXhLYPl>A{dGYsoLat2rLtu~yUM#Ygs z?nC7!_EUu(K~_SgBZS@9p4Jkf{}f25=$Iu;tg{?j4gEA<3T|xC;iT$L>vyDX;C1ju zXSZdZeNkomXfg7U(q`DG(<~nsz51=={Ss7c$@ifNp~B9UV%+0L*6%CqP|Bnf?|pQQ zkOV-#b0~Y8qDWP#Lga?ftK%vtugp$l0e4u2dpq{#597l2)s9aMe`xjIOj1`=V38<1 zG(iuKcJG~$!O?))<)w+w+2B>=mB+I3;+9MRm`zGahVdH?37no!7gj~1lsjrJH%N3^ zw_(ynqo^o~8!SH|?-qyxJ=e`>PBqz?2X@pniuA$pk&)gu zh#YO-x0YM&!-ACD6ijWjEE_3b8#mfJS?ko4?Cgd_A5v|8VnLSuTER1{LS23G^;rpq zJ_k5M?hK9C;1IAA+|`?6a5tZUO{P@xuoDUoemMm0y9GrZMBGC$!nGQ#{Js*zO{fA3!JI99MN_UCoaIylB};ExFu%##8HLYZ~&06yBA`jv4xiY0!~5j zcdhxS_*((Q0S4F=y(ypwbqa%>>yx>m#-e z>RIv&O0%#xpi+}mb*^TciwQ09sf|S=cxu&-BbthBptT3Y42qS*XVn%*`=5Mpmj6tb z11WRLP>sS*)`;0s(qS`u-Bn_D#G=elf3H53+c}Wg78S-O<@z15D}I+_11(NzgpsRe zH7W7k1~jG_ZZqS`&Vf+VmuT4C_>Hd>v^-MOwq_D=GFBK_@%^x{c<0Krspca#pITUlojqZbNB_dPs3D&wq_ z(6BwmcZ!Ie@R|-HP16Y8Z2a+XY7VFuy7%>E#^i-axm41!&)1lV+eG|l?T=t2l6C6E5~U_lWj3j=v9*gMwN6;9?^L6$jhk)cy6@@ekOVOKL=i zG$l!GnHC2Ee0Ns{NJ0h-2?@d6v{%{(HLd1AGQJZrf6-OKLv%~8`fF02!Y7`2%tS*& zgP9z+SollGN{X9Ycs(a!9Y1TDKU3QgEcA`I*?O{Z&McsHlSvj*a zyug%E>cuxrEKi)`c3M8Bj@rv?M@(LCX@rpWYTp;Z>xun@<>LfNR}A%kp8uxQMtsIw zaJ$?FH^J#eiJpDozx?Zm6?C$%>XH6&Q+&51w7S<@(+vn}-exmWmZlN;#iY41H&rUM><1dYb7i~gdzu7F)Gtd)SF=nu3`dhp$g-R>7^@#}m1dXod0!u{z zi3rhPYcm_!ipbE*L#;%NPJv3h&*9A_!2hhD2UYs6sV}p2!`C|i$(s}6JD0mkS@P9gGfvQ4#HjjJI z2posQIk>@rgMkV)CDE%G_e5wifr1|(C~SiRoGm!8#d5{`%cr)|#&+9_KRB5!RvNBi zY&urpEg6c=XavxOYbbW+d0z zhxv>E%VR-oc<7C_?X0V%a{?dhwOGVuPAHi>_F+a6B~QF0pTkg1i*eLjlI)FGb0*K$ z?rAiKQP8s_u}2VO}W-MR9U=O9IhdI9Nx2wzKUfRm*7 z{g?5Is5VW-FgCfV`^l=Q5i8V2!nNvIaa9U7{Q(%+^g^F|yvdEWBrihHD=TYz9mr*1 zfq%zAi4e4%PQwUxqqHU^T$gV|ym=bTS^_@1wb_In;xn#2`&05VB;P&gRgA4M<*Kc# zlQ$2#diVK@f&v&&TQRJI7L#w8K{k1`f8Hbcv!VLCbsvICS8XGQGa?3f(p@F&T~T{_`4Y*-pPsqQHPQSSDRI) z6Cru48nnwe@-;$QuK$nDhrur=*A_gNEkJi-~kol3x$&`V*h3yj^e2bn#%N2TDnl|F!bzOTYV_XM0E)_>Z6- zMN>IT_}dC+j6ta>iGy@<1S{H;OesCnFkpAUn>ALraPg;jPKw4QZC|$9ZXN4lDd_M# zCvk{QZs8Rvt~tO>emXlkC+^J}l)aksr8sI8ev+x(nqRH&tl0}qk=of^bhtoK{2?_< z-dh7m<;57oB@Bn|ulJNmST#!|+NbyQH8p|qdn8R-WUURpqPjQy-_%3a$5|hwuK}YU zE<#NMvn5%I*3kxE+2k&^_ltR(e3UQpz+4JJB9^Ea`0t>|qp8;ArfoGnH{0})CM?R) zt*?7^+EbptX@K{*IX{Z$Rp_m%*bl?}=2{=&bH%dszn&hioFN}Hk22LgX?dKPnHdH> z7Ouxk9T!r6TExkZj@TJ4XC-^Ztg}?ta_y8EWa#uFRn6T%hx6Nbc5^$5ovhxuSFL$Y z&gPix@~T`x9_SbDIoVHpBl1_M?}>f;1Jma#xgo%JO;wX9{efR5rTAco*E&*j@aZwx zmwFo>VeNCzS%#*ogpBK^(`|42wU>IE8E5>+iGeISO9x^Mf!t9OZ?WC_W}!;xXI)Q> z?KTKtG4z|RtRv<5($W&@kU(wcIqwm1cuX!z@(MSZ|I+=z59p?M6;lhyo~9JfF4Sfw3T{327BTdaw;8jD1?>8k<~4Hvv++ zRV-A*7TP|yeby}Q`reOGC5%AQ)H&hD0#?(hH^Xrtl=b?29ZBRAX6Jmh1VT>KBO0auOKqNR*w6^dePezQ5U~g<_f3uYU$Nw=oDk=pl z_Qfwu=J25TwGzhi+NZw8CtSht#Di9#TWYkpd;-kkK{Ve`X0YSL*NK-jl(wxs}jd5v&bQ>`$ zmLo^UM7Iod9$uoQyL)06`q4cq2{o4-4a&xynmG^XKT`_>L!+OhQ!dzLI;wvJs0@#) zv*hgOu$KL;zQ~Ab`$GF5Y+MjqtFiuR4#f$1)lb6@5TgxKZs-1TDe3)Q(a%OB-+C5Y zcU97dL4MnuJnV6%U-+?Nu#&(-#aEx_@BZXb2O}LM(VD1(&w#h46{Bvc17B*XpCzR! zK!jd6MCHWD*UCpA zg68CJ8ILVt)m$CF@jkKdAL0+0=Iha_Q;9Hq+P6@^ayi|-@o}7L?llYtP^50qmz|n; zXQq`N%ke?va}-r#gs?@mm7%32h=M*A?my3-H77Q&`|2tTca54ucT6d-!%tB6E7dpON3V-Tl;$}p2KP6Kh*|RAY#(@A*q1&qKxH#i zoD2F}r{=hNX6HKjpjuy$52QI~jxo$bKi2z)<*{^`_?S7YY`zhxn&o-t`GL|m#FQ3* zQ_Qk&^fvSmOr3Zsa0;Nkp9R-^2sU@WtiKA^7rle>MrweYW*TolV!Bnm2>?zSIs!3&%0yPy*+I-G}T zcZl1uJhfq-@;1w3R;zGv#2FQB9nsz#e&-~E`a7)JPk4@=_$ZrP-C9SoJYL6i2N3ML z*5)2VrVU1L>Hy%08sEuXJ|Tlm4YJG`;}NQg z-xn3v@1R1e`Yus(xS#?0z(J&~uPK&+X>=c3{D+<_=BpFk|AFUIrs5s8u<5~b-omAe zZHN4>6H6SMQn<#6X0}xI}ILVjY!*4oe3_!N$7TdNzd%% zpcn8I6+AT^b;!WRURURuEx=}74bdXzgiEeg+HKkw4CBU;^-UU*(O7pD=XEB+{X4#- z+jlBko}Fs-EJzo5lmNhqK=jP6?ahgy=9-(ZroUl%gqMrjZoaqxXp6YXJ5||qWe9Kv zlk1da4g`?mh+u!)VitX+8)*bPLJD1tIOk9j*NZhp+z4jt=DTZ8S-DR;BrBipe!h>~ z`+)lowv~nsb!=4-U3#Qq6_dS7D(WA;GG;Q`DIQF3jGN`#b50;ECbiAoVCg$^s$1gq z)uUFll88wlBN3sUcpxH>o3CC*?QzOQsbS3X&`l1ca1_Doj$ckz-BXcGZUu4h?oVm{ z+6refwu`)GZ3Cr#DaPrij_=&s$6l*pTIs@x8!WO(mZ&~B;q>Nu128MXk8{kjxq1(M zk%xP~d&BtLOs~RUD<9o?|7n;KP+bB2N>X{wj4XswJFowop~<(Opm)iQ`SNzDxf?2> zbjKMw`bE4=W|mo%6-c#DjHvY@3fqSeHA@$5JJpK>SmcS?Emr_J75t@|+xav1sX27& z-bcMwIl42uT6~a>6F)|<3U|NK)!nUKuG^k2z+BA3!-^t&Noz!oQ@-12xmVZ3 z6ae`@z}B(JcR1BiAwB-lK5Dlq4d@$-o%~&We+B>l@UPw`dLm6zjIJ7SYbXe_z#=C? z-rv$IdOJ zFWu|z-LVgV%XfslHA@#g(+50zY=3&N)UXb5nQZp58w9+aE{5!N8YL@l%4vnN?UFTkZu-r&@_KU?C*=U;c{mhyw3Z79t+OG z<+W1C@f&vcl|*(GdFNF3AJJ<$+1Ygmuhf(Ha(|`4AqU~>;8EaEBZW&^F}dYc;D;|_ z%*q+6_F^ZV#SjZT0vYZq&VpRG3m_+M=_b5F6pCjjyZ#)W+zaA=&Sawx*{Dz4Ba7_0 zbvg3y4PA0vUc$k+6b=g7+aFAnyDTMY-g?XGM22g8Kbzq;C7B#sHCU{X*fcj2yR?wL z(~@-3ebp^a<@%87*~~pF*5SjkN#7r}Y%xI?zam4Dd4QkmA^I4EnoC&TAdswz$I zVcywq9%~lXP2fv%`~PSfY7q;7@pTMbR5}W8lY?Jx`V)d$HIF`O85;zZL)*j1KOb(f zKbK|CFu)xbPp+J0S6X|sA$}%K$}w*4%4cF3cD6Y3RAeBgzVO7o0j~5%Bi6#+ey#!4 zsA0IM6%4V0Kl2leS<`P`F~>|Ch@yuiNK@V9d?(H)V9pP#{&G8+%iJs(VWDSWU~ris zi4hsJ6^>|5+I(WQ7vwG-jx9B(<1MxuH%t&u`E~nD7{~I&1tWRQAT66DY!6!em ze(`61=@bY|(LHI+Z-Q;y7Dla$ZQh{8OmF3ffLJXED*tUBW$3PysTXO@z0P zbWq+~rxf^7@AykCo#)S^J4UzQ3$YONQn*EPk3f(K@<(eR-PF5(3nnnVd)v$N$3IrY z`=c8wW};J*_vK%|3pnA2U^YSS#uc&ieF{EJhH1YwNy)bB_+h$Rhsci{74TThJxqal z^`3N~^OSqPFG1{?J%c7G4UK=sk@@)}hR>f~m0gr{zXoH4rINl>bnHj8mUQ4#^7Zm+ zIeYi+=HiW!9=HTaZhT-U42%0PhonHyP%!4*gLIN59hMr4P@<;&DXB`fHojaC=<|eI z469ATso_ySW3gvjo&J=xVK>fK-1OExqexo2!gD~eAMPQ*9C~e0TCarLZBbr$V$aGs ziyj;T%*{s*V3d|b7p0^fzpzmTL%+*RzW(U9H&$7bnp$$W{0L@I%U(9iDLziv4KKWa z?VIbrrT#*N5x=U-`2qs`+?D7>h>QsI7^x;Kb3r_63Tc6l6J$$f*;B|^j{oc?AY&$9 zM-{7&+VJw=UtCw=tkrOVkHaoQ7a{TFU7u>5W^L7AMV5@8d(DqYqofzxcp2z-3V9Nu z+)?bs)<|ZYkxE(lgj_bT^(Rh4V&d4}quY_cetdvbgiSO-kj$WVl@8_TA^U}FL9=F^5Hm>*k<9@#lVE+(~oz#2+ z+2XWV5^i-u2)Py9GPO(Q$wbvDAV~u%t3cIe(f@t|)Zs{Kg+XwM`j>X~x7SEDAF~#( ziFR5)(dph>T;s3QN6?^Tg)OX5*9YQCMUd+af#~Qp0@^5CzOz~xIb~j%7N00tQR+Mi zY!ga+HNL>zF&x_Vwg#6ctg;6r7!&#KtxL6*UmvrIP!#9NK7)xVkL>kzdGWQumtIUt zNbZKDJLo@(X+05Y(OXr>AUd#S?NsmLD`Z87UMb7X$T|0 zRFNhyQgwu0jkW1+!$eG$EK=p&f4EKZhSLwv|GmWjPWjJKsc50|Q&ZcPq;7x3R(?dnr>YALNj8JYq#3K`9$+#*%ryH z$}NKIv_gEnioxpt8Ms)!4o2K<`J2|Qa%_DYmSk!O#tjQW*QlqP!Z@GD7;T@;bDYu^ zYl}>sc(`a`le^MK40(8a`6nkrN+g9uxMWzavqAW%x%$bD=B=lSWOgl)(4eSmnNM~6 z-Z;P|n99;3ZN4)}GjIVSf&}?Mr<7B}9*YJDdgFCvM|mpHN6*4kx58+`d^x-V4m|6( zUeQf@GJ08g1_@bt=+)qjc`7rxMcJjzv0LE}FZ-42NGtP!l|YXS`Dbg{Hg?*gr0h4?mTrRm^$nbgpM z1%Y(!3jELz$j4^+eFERcacMg6qYshX(Zk*Y)t8U~GVHxWLvvu$`^5A%#G-yyoK(J= zaygP3j2fF?TznaU)3k)%q=XdR9DD^r)NEn3Roh#amkwc;>_BV+YmhHRdZen#0v^#G zmXiLeD6M!UMY@q{Mi!!Zq-LHKA8D1!lb2Q;=qFY#sh`YiK>LILe^peJZ)oA!b^lh$ zJb5YkxZ5Zw_O=(XC|Dfip-TzRjO=v=$k~wkR6E?bRc=%%&jhfgz3jE3BYmS{g^sRV z;X>x|x|e^_H{@IcaCL zbvq&9Rv4q7nL12-jo|piQay*Am{guzK}kvPAdz>xrhPUKf906_ ziN;?LG@sWgMdIA&&Wu%PXi+4TMvmd|N+$Jb@T_QQX~`;t6;vq#61`09tXyrpy-kEi zc3ok@C+F&idd(KZz{Xon8fW%ji>hmGewgqz{sLpL_CK(Gc(3&bv`ox_6i7mF8u~kr z!MRywxsEHbxfKv>pP#?1vexd4efN!aTyI?U!tf<8#w0Ep7ecrtZ!V?q=YE+2Y^Ol> z?Kqdf>JyZ-`}Vqoh0n46P`P?1y{ZpBAl8$W6^FWt)vLz)-6PD-{o1Y+%W(QQIDh$* zp70nn&rGLB!D{n2rA9IF6ZGAs6^Dp*f5|j6ymC;xOP>>-!Inoco*v5fjyTU#5HWUZ~#7Js;lRuD2uTMDqiyZ!u`5b9mMnSu8|b>_^|MFHfCniF+T65B)L4?;r_iFxIj&DGI<*G z_?mmnyV|PmgDL9T+OME<)Q?{&?2s}xG9b1_$NEXSQ<3zjM^dliggzUUMd|BB8LMxb zTL2q|aBuqOZ!2p}-}e1_C&>wAo{p{t#WlSo4S{L1>?9WM)xiP2p<80tx^wr}u`TOWXHu{vuyoSnpH&OH{ z_oAZz!AU!RbD7s5N9L+IE_jK4O;zwh+Vg*`lrQW#SIW4uRL6P+V>lGq?dt@q)T24v z*sD(12V-^p`cKbt3OK6M4HhokSBK70D@!%O@+tgg+&_+>xVwm3O0qP++;)&OpK7uQ7%)kDiUB-EMIn_lgjqM z6?&>n`Y&YQu}puioOd&={sxb*8FIzf(2BP?@5$l$*+o3|A++L*>wiL7mP-@6Pj5XO zm9?SB9@HxxLB#ct1z826%r*?HKz8R~709J@M0v4Nu^x_n#i9!-fzbcygP9f8ICNSv zfiblEwS;6B+00j+5pGLcYiY$(jZPrhz4}?B!e`Nff6%8I9vLG$ftp%J!m~};MQAoXM?9sD*8f>TYEuqgoC!9K z=JwxYKI>+$`G)wAT+6unVL~b*nP^2EjBc7pcRMbi%RJYbgI5gAgQij+4t_AM{u*z> z{_mNDkvO{8H|t^FtpHZA#VEj@cZOUF3mxSg_ z57=O!on0A6$@E~P|14++y5uGFnV82SY)8Vi+sI?2Q=W;ywz{4Diu0&H$P{`t-FAzJ zvn_lzukk}!7SfFS?1z%Azq#AE=^_|LlQ5^LRMT-Dz^IOXQX02= z2^m|JQb{W-Df)?RA{<^%4ws}7rHigk!DzT|UvL@4-#GufARX;(;*SblT0xps{kNNbWvLwV->PHE6EA3zFZ;WgF{G=77Qoh17ZffMncX`eq7 z78V*leMG|I=|jfWbI<@#j>yDpAuX`tOniui#o=l0+(%#p z{X1X)6G4h4V!~DEcIrrqJdL41PWXf93d@ z!ODtDs_Dmo;Av`Ts3j>RZ*|Jeb+V7BqDZn>NHL>2`S%|pxk!_KcQ0mtQ??79(bR5k z?h6MyX3hh83RWW6Uv*Fq4TmFcwSI$rWb%V(=C`QX^3MRy)QQ)H*f)AgdG8DvK$c$K ztEN600`RWBl^Kl~s`q%?q3S~Mti{fMM2$aBlruKI!Z(v)w^Qlj=v0z>(Y~}h*Mj5J zNgD@?hk{hdFt)}c92+>+JRHDv?G^W8t}b?*;O^pEM=Oxt{XnNn^%of`Qp^A9lEE3g zWbA_&8Pbq3ZRB-_uj%oXl1;H{#YPI#(&wI4pdtxaTG)k=#4f(R#piC7A0KHbcHfWs zrW}ZiEOI0-F#zBWMPC(}k)4U=rfjt@JU+&U6iLYotc$il?ErG=Z~aI7qiwl$4M_?P z+O-*^Q6M09RV}RC!W(CJ?!8{RS&66qM13Pq&xLpT4`pQoVI4DSbBnV6>f(+8gdc@q zX5)_S34pwYosKg>Da&7Xty0`RnoW12*02;`6GG~L0;kuac;j&SuLfAmyTyIHlVN(Mt>^K%$v(+HFcWVE_+d=hgt## z>_5&hFTg6irOMS5Iz(*MUOzTf3~-2|Ocn_2`-5Jb7%zjA4BDZ+^hamgQ5sC?__eO` zN#7wPTphKMB$N&YaX5o*^w{|l%}@C2?S zD}d>m56u3Kv_m2E$L8D5Xh8N{)Zy7voJu2bPIQDG;^dMmAa-o$9h|?WcHG%$WW3wy zu=^wopt&&A>PF&QVrF{T_Bh=Tbdvfds56M}*K7Rb72+J%q8)*L<7Ow12q3_Mb#y>S zEO;IcjW(mxGV%9soImS3gv7qnSw7-20LP%Jd)<2j0t+=?`Z_qg5q^xpcxx`{E^s*X z?2li)F~juq3}tznm%i|ih}l~?9M|VOL$NP?y}U|N9rBi0_pjKo-IS0$&dV5}{{-&J7!XRUxITGHuMDeukCb$)8v8Npp)JF${>&i;QDZU`8Dg`*Vf=>e$(&~-_T?YwRyAy+eIB)T_FXd~!ZJnX+X~71$x|Rq zi@YZ${)CNP*d&yMe)gj^S_56-PV~3(Zr$lqELb@4P&jPoYH#f1(5#7Zxl=Jecb`>} zsG!K?rTlDuZf?GS+yD_iKGncTQMF~<7i-=1ZuzdOT3??jet9|1=D$9c*Jo1vd{c+jzqq=ns0DVyJol|$wvuaQl330E!%E|V8tQPDSR@8 zqSDR}atBr{ts{GI|E!5GiEUz-P*En^7WBc+Y<&r(CTw> zp~A1kGVXOwfznwz%<#8`2vJ^kZ{#n zmw-WB?|TygDJiM^suxkb8qG*Nq5w4#bsE)sjMx<>{{gdSB$CYi-#_b*4;gx@L?It? zwJw2!@XaU1jtu%ol8uv7`ND;!i+r{n#I#=#i!fn*y;zkCuyC9qO|7U1j3=v#DYfE2bs}+-Qx`? z7=i?>a#v+Xf#I4(s0_bMnnEQ$h}@m(BgTbR535)>0_Ob-O2&#kR{0Dg?lB&LH598h zoQXUp<{neq`2aWNVUih)fL6g1u;zgO|ObGBH^S# z5L=9G_#^8%!aZ2OFQUEc(@oM)@_e20J)Og@uQ}KXbKFFP<=yj*jgJvHmh!ilzT?+; z6EviL!gp6Uo|~a{1sXi2ea&c4OEi7Xtp}-$?EuG3xm1th2nctMi!r@iniBn#LW z3Rpu^-98n@#_t5^+6DYio~1Ada^xw$f`M`gm@+MtKq&;iCo7qJVs3;REySEq+59J%Z@iCg?xSdHTg~qwzW)`Gd)pBeZAMD0DpFFE zn-Z#n4|S3!gi$ZbjW-!_Y!J8rbN-r@A8yfK-`MaHZK!VmpcjNB+J;{UTuElyni!`4`^1Hm0ahJO`Xrk5OQY{0D3g2d{;4s1X^U6Fezadaiw{u z8nIxt_0`qYo3iOo_Q07Nf|?2R2q=rnEh43YhOR|vUGsoXsInZw5EN7RTRAD3LMSkKS|ST2zY`rBa(0lF=X~1o+%}K}2zKti1N>m+GFpRa*HA_mm|YIBI`%=P*G~j{j!w1h49KT#3O#yMF}vMMy$jqo2S)X@ zB^OuD$+<~y%V1>6NjNxbUL%V6nf@+LED?hC?*kJ;7ON!O-&jW@BawVDZCbD$N5|Z| zbiIzFbpLR>y2`(ZM&3XVz({l399bBzPH9?gdai#^oh6WAcXR-K_a4(nKfy=RV|G9K z9AC_kOwA0|A(oY)0JqLv*s1fAe=Xe}Cy&m5ir&7+kF2rf4|8Z2{B2J}ssB@+dbzZ& zG+ufN0iQaMYVz>Se`oe$`X>{rmpiPZU@@^0NLC#4=5<>3e; zh=WY3Q{0t?eYsZu=x1o!f_S4=#-IAOr0uZiO8og6(1AQkM!ric+lsV@u~kg{_W;_%{^t&6B-7qEF|Knk)4da6;G@%vUiudgBqa$)Ym>`)_d6P0J)x1EU8Uxz^Wa%?>0qKNNDvU2rHNJyuNn&P=) z3p*)GKxuDRSJ&*sbrOy@K`3GtVp6uEWb7p>#mB=+9$W{(D!-iGanl&GOR)AG|ATBc z%pu9js`M!FYnV7`18Or6#waA>=HlXFc!LxBq5{3`47dWDYnMHXvg0jCHV}a#+Kl#5 z68u#XI-Dt3F=aP4kNHmLnKj%B8jJI|VA)RDij6tKrb@9#`tts$dwc>JKVn2(4Q=Vz zxKw$b#8{kpe}pe&?@6t%t;#z=l{kr^J7RQQH#UELJAb44$DhCUDjdI9wVgK00)Hh6 zrQu2lBYqqXPy)h~=@B#hRYaZH;UJ0^P-(AO`T6;kiwPb#&PlMc!}w_pKkzA*%hh4C zhuc}ngbR%{eD>uZ`R`2SyqHmRVP*0((KhOMosiN8jRae=D56cF6i_-7twQL8c8}^L zN924@09Mq1Wz`|g-X}y0jwrjOWMyTaU1${Ivp2tty4!+qplWj4bie{Y_m81tvVIj3+_Th8>JwoB1z+$Q2 z;zIpX#-O=_h?@vMJKKX6C~9qQPn}SBWD^dP&e>8^kIoq(N zL1;0Tazmph2;Jk&+d0Jk@BY%`ks$CzChG z@Bf?pp+hNYHw7Q-qJCB|&bVRXXYFKC#hx2o7}8d#_{jfv;yHC<Ldt)U$fexI)@}I! z3p?ug?)=rPGqGcjxk_$#qI>Qj>`L^tX=q+WFI_FD)n2#`->@Swi~^rhaE(%1jC;Pe zJ3Eg4;n5ixJE`@?mZ=ukCT&NaI*^)f;VhFn{4R-rUufb89muAPHVs^SH{(R$L3kby zVbXz*@RnuGkazp<|4bvZEbyVE`=!`D@~~)h&s~HC23?v!XM5YCGndgHZ;b=%96Mqw zsBMSu^j};iZ33_VS|uqLNXph6j|#;Zn#_WXx|xD98x%>^`C?gvWGCun7oST3$^1uS z^taf8GSkTvYlKc;pDWLzxc_sJ9w`==L0w<8T7}_zooc8B9nU&bA5?Eu3P{@ zWD?6h5@Owt?+bM98vkhHeqq^~TZN|=Du(>(4BRJ8C^sRr zcor&w3^?MkqNisEYFg_*l*tDI`33;`n)S&7?<@NpzqyhW0>Ms4_v9_?lTLasyI99M zc{dA@tD>3)^8&&duA2%3--`=Q2*>5QJG@>u26O&^{0ffKUma%=yOZZ1g5`eBd#_gq z2>GKnYSLmYqm-XB%h7P_xbR?XEN&GQG*IOY5(uX9uEQcNM}S#jqP!k8SZbe0kepQ& zrQf(AowgIU$Za_PT&%+I7pOwDkOz|$Rde7S9zzZ^gZ=Jn7rFJ7U5ZthbK?3VmTP%H zpl^lkS|&sPgTLs-XBMK1%{rQIZ~c7ln%}zgZa!S*&SQ{{3$q#rNWTz2+tL~c=1MRv zb{!FGIr0ZHs?}l&Q@PDu$hhzWYHlGDtB)3JH2k^7sc4e`hT=%MS)50$nC$7T*2~Rz zFftYBWIONDfk=*5B4M~&?t~d%5s3`jbl?L=DhVi>(E}+@q4^ToPFy>u$}K~%Y>$ue z;%Hum_qvZ}YK+FTSgXCg1sO`OM6~npIgK27c@0$AgM`^bBvyL`chstELa^`}I3jtF zF9DioT`vM*C?mr7pJ)t!!j;H5lfw(wL%nO_*7H1Z@duZ_f99Pq=YIJ>WKN#p?AyKi zrAj<}a_i7ZMlb3dEhgyEcRlCdN9hVZqx1Flxz_HQckMR_TU^)5*LcLfVX!xA5X3ag zs>YEwqRNnQG`>5^Sn2vGkrI2T3G#e<)<8@(A0hFB=fJ*~;a(wHSu4{4H$yIo9iR!V zgTsoWF*b~UFhs&3<4J+Z7YzLx!xUoq@4@Z>)6c+Pl*l(uG0FC?s)#FalUW6P22FHy zbiCYiI#$5>#WGoW{77Xd%H=2jBnve5!C}YAWUj`}!ZbV$*U+`6NiiQmDr+17=V1A; z2|3TS$An!*;`H!?XUd1-yFJg6=4qAGv>$T!O(Tvdc*>l9lA1R{q3wjnQa%^pdQAH= z`~~G-j{fh;ha4uCg~q;re%*k)1O)4vCPh#rct(3_!(04OB!7b%$x6Y`ZPic)6XA#Z zt@jEP9RXp1jUnDYxv|77v?bCNg-*LcP}HW~;G^_b`}eGAsh=8@`>>%^X}QTBFW_F= zd6X_0Uan7OF(HAf6GWe^5BznxRP3_0&1YJym^A! z+w>m=^HM+U6L->3iWkpuxmw1SGaC5L5{2Z2PK)^d^P{3-=5PgWXgGrm*ZA znS|{@vYqy|RynE;5Z!4cGV4f$MOfqaRxwenxU;Jw%Cjr#b+;5^itk=_=05Eg3$>fZ z4hSRO%l|-Gu+;_LBs#{nJvtA1OlIh;RrrHZdbCHNbn8AtZ3?TM9QYpN*5__uc#>*m zv>Zlw1Cl9vZJQyJ;#v!oD99Tju4sTQQv(Fk4cAq^3?D|MaeDULH9J5Qq+)gB`Nl^8 zpR5Bt#O3^(2#7IqKj1uMC%4979I?l$6w7vq>ES+|{Rg7a(3d-V4uL_#pNpwl0BZnb zfzVY9v1Bn4o>=n3Y@(bhWTbciR{z0RV@M+-0&4)X##gUCov-HeJ;g^bJ+FS=Ho>|I z|3zaI{N^GUmM1E6BHXwaVKJlUbDpHh6gV_#HzW`w*ZB^OT!n#=0We2gtpwoygULEa z6)iPCa^4)kN=PlaxXjMpH6>wtEgT|8hW0>_ ztHCEWAe&I{%9((tAI=<)`w+xI!jOGDUr>OP1u+o3dZ5nMc-&*?|6*c%)7UbN-IANoBtO#5O}`9$!lOrtxi z=i6K7)`t_Ax~^WjbJN$SUhj_ACBNg!3rC`QJD(Z(FVTen5WDHqlB#${Wkua3BbEqA zF$~VmOG&m=^R2V9Gm0dHPgUn1#PhQ|^?B5R`^XmPT z4OE$C^o;ZX_@t*e$;b=cLyw3s*tkNUb^&C4x(8Bp80B0Jn}Fp$+LZpN(tmC2P(QYk zDtbInuJb9{U-oR-$FP9qzHGj2nzlCfO%lch(ru5RMn@t`I@CJ?w%If*8kX;-IJ$Rw z+_hQ7obG{Awo$TGN4cRU5#4rcOiPk`kMs`OQXlpU9(V8g#XrAghDxy~%prbEt#YP1 zSk4L~)|7}luK^3$4ud$mPqGn(?R?&!PeyXm|C|K z>$rUt19(rGUX z?KnBpZ0f9U+HWB*Xo?>(ikx3;roQ`O-{AD8yb%BESGSQB@dT`hS2kp9+?blt<)1VL zkR8V(=9Z)V(6NEf+W+!7gp~XE+<$|76J%wG>LS2xiy9`+ugN}d&n9QNXk^kJ=#*fA zzbv-lcxDs<=gwfXzr~rdGl2CYbpu_c*v2Z#cx306jNtM^^wuu9mi0=NfM@MWh)~5B zzJTLp)P>p}aOERQG~c7@PoTy9O+163|B0RsckW{4Lk}Rv{z&{6M5wVU-QEW*Byj)1 zL_*XoD;1Gh0ht2Rtd}EdZiogZA27u4CF|VO(nxC?vn9y{=VK$md(Q_Gw+hhuvZ_#n zc@;jmU`=hsrQ_Fm0ep04^CdzGQt|6c=fp_6DU*GUR(%KWWkVAf^Tzsqjo1p4lMYNk#PdLp1ZIYRW| zV`$NN$m|@XaHNy?`?n8iigo)u&Xov+?M_4ANj6=t#q(?fyVvj43T7NisfB)x8wy# z_cVefefN?0Zha@^5BWSTj38IBTsZ0!0$*qW_|(|OxTpgj4|}0ZoUSV1bYpp)FfLK{ ze2)-JrW;P(+fL(gZhsddNCfirfByLK_CMjS4D_l05Y^jW+J|WV)B{*OV@y9iR}pV+ zHfHuAIefH~`CU$Lb6^8ZMdetm2JXaUpuFNe{hv@i<*Z4<7RQDJ6F~B0AV8Yz%UuUd z?e7501ZBl(w#3t9V5mpGFB}S##Qf`t3G$lXABQ^tzQi%!R?LV6G zFxd`b1E7;V@)a{!?!97!=W<5SC8_E_B&?UCMN|`_u!L_R+oF!Tdz|6HaOrRQj zl=My(tPuJwcmDAQ>fMRo(>#pX$t8u)mC=hK-nTbZz) z8@TBorS(>o+J$=W4F?LvXWrU<0qbPcb@H(4JHr7^Xw#a03E87~ul7*fKDqMvBxy^E zJtZE;^^6RDr}#fr60p{6D{_#1jQK7=x+#s{#z@{|9X+=d=A+8 z|D%Io*7C-ARPRiy%DgV>`Pa?;0EMu3{X(fBXrxS99Jq{(iP!x_;L}}p^-3cc7-y{ySh&#KKrO;d^!#LSscO=ts}WPsO6!BYZ%(I||s9 zXptDdXfI9nNy-R$xOu!Q&CD$7OtIj6WPDy*u6>Cjbt<$8dshzO`MD$u!%z&j031^% zBxlJ>_~E`EUhhUln`*X28yIZ60D5(z@4L4j8HbH_8WoI6)EuE0ev&|oU~x)f${NrL zN{O5shIldm*tjImlMt^m;|Pl~$KlEkH^UT<$mbn-(XCWr9ioy1w+6!(6KTENni&+~ zU4414dx+ovmRb)YauSk-N-|zuyR4hqQ9%e`LW1KZ)W`Mp2*g@ar~3L#+$(9Wp`Io50G{vSW!jPMxs#uIZR3MeQVCI zAUoPeQ2V8SQtQ|ZAaE20j(b>$U$rBjLf;X?w%bUspE&e)cWkcthJ<+h=?nq*mi2P~ zQ-afQ`=${vMCsRd5U%LsHK;}8Z6A<>Mm9Pd-oX9fJVb0}*y;uBwuNd$bRjkH)W0A^IvO1-8+qqf6wQ<%%=f0H?6Ozs;Q~Le>pVN{J(6+_fOCBTRdy| z@vhMG_Vc$bU6)LYGnZffH2HJyo-Ni%z;=I0Eyvc>R;Qx2DfUpv{rmR`F^jO#Ef2s7 zpP|*47AofG&8mpB`mjzU)IvHdRSV>FDbsM*g;K&vKyIt?h2Ga(GSOCg&g@>OnBi*) zsr5+6i$Ku923QytsRXiTFEJ!y^Kc(1f2$`BSKzV2NY$D+2L0s2*F&Y<0};Y~>BuXd z!^U-tTAQ{!#df&l0p{MFKFXQ%DnZ?Y#z^VRd z-JTZM+Z!!HcVlG2cJ+^F_p*3N&-|>u2PFc-Wh#78Km+#ohSdfFXtQt4R}TCKF|kk2 z&_V{%uMX~As-E9F#%NQdhS0-rD@p;!mM>82B^*Z1kE4x_>L0$C&w|-X zi$g@@{e4VKrod4ScGy9z5{~?j(z?ECh-RW|~d7ZUDN^$3bSW9dijm)=Qv3R_dUlF`z!E{Xl?2I?}9M|W|WvCjr`)v zZu)4Wlncn1ZOq_xv_Q7aXT9Ut^kHH+M=EXsj8*S=cjEV5;n1=g+kMs(!lt`o%6I%{ zl#>WIPLBx%n=;>-86o~@SC!EU7y0eTKU14KAYV8z#1UV(T&R{ES{X(O=NXXo7dw2d zQ!{mQhWGr$#D@I!E;ca9v!~sr8Y2%ElGS)T+1|wQl;`T3Wbh8GaLKKoMkF%kV{ZZn zTR*=BCOy%wOq>i8A0JhOyB_o$$x5S*B7_>-jwl{NAxAF=jozhkPtX1@MA!+s#{t=9 z59-o{@rJ(~C3E|=o0AnA@;m+fZW`+9?(gSt^jSwouuUISXPK~5KW|OsceR9k^2}BG zPa?9%+g?A5NCy9UpA5p_3^v=-#))zHGOQ6f>}Y^G zW(028*&GBvL%Pac)UlJG=;LkC(a~14%=gyF@DT~<9ve+-B@O=!=63hgTPPtRWo`bl z)9+g?yl2UMl-K?Rzz_|>Yzlh$+$~wKQX=804GubUXljN6fGAci1QsE>PdiAk)Bi31 zLg)?xgdmuEw0zQ22czncXu>G{SIU?zZUdhX+gSE= z@@puV%@I0F5Uib^8spVLA$A-vB-%(#@@_oUtZOt^e(7BgFsnDQMDF05I9- z766SYNQjpe*rENfZ`YY&^?Z)qC!~9YeWObbocW*z&+}^;+%nPM*htvr02Mzews9io zIs*P;=5DW}ql}$i2-UC4>jh%S%mi zlFbFDDeq=LS+mU*lqMuvT=<(2$-gZSQk{ggn4bQNIQEMKyh^e3@_JG7q);>m1KdP> zkblyuj~eN#8*L-x*ng@ggLF;R0;f<{1bVyk3_^T##7hE!^8Rf=|tcAZ~Wrh)GizkYZ$g>7SDBWz_eJ@+5JTgS3*rjK@v0X0@JLyVuP zFYh@L`>P=`JS+%mZWWQR77($+&hxiCS)KMv()}jK4KWYk3Iu$5!f?b;s!fWFza*Pb zl3u){95%hEm}Gps@D=`(k5I)&Nq~YxT?^i#)!nu9(>Sgq-%tbNXXMLki)c#okWP9| zq$$jLYr~I(w97Sh{|Dl+O(VALyJQSd%Oo#-#bzS&?2-8GmkBxrr1kegt3K}|IXyb| z4J*Ot<7c2cUv@cxqATq1_Q0c^uL#sqr)BT1e)%sbxfj?vCZV4HS+#PDlh zA)68cv(xruRE7h7dSn;*PsKo59{#!7 z$HrF{MhNIyoJ4i)kGCt&y5Rgu+`0pbzRMIL_MiX#@-F1!$dGG(aTjtuNRXRDg4}0{ zB*+aGip|*tU9959kIYVAIqY7Qr%{pTs?zv4chHq21T0S@(deDy=$|96ViuR9bax>o zM;HO^SlR2a(?Ax_44JB;P+1b{Uro)WFBI!hKX^p zagzwTk3dRhLb6S17MFZM`H@}pvPSzmv%Kys_nV1A5FXZfz*sTBZnLuPx9Cb;1pfe3 zZEeqKUxSl}epn&$UvbG5y27`DKvrSPIQyh}q|rZ9?pjuFEI#Btkw)Xo_oDzl3)YGy?B&=^#6mV!igDU))a zUq3Dh@%ykhvVQqO+J1#e250Vq@9>r|8El)r6*+%>hZP!w!$U91Xrp&RfUbW31KX%N zI3Kr&)8`>=z6ei$BF_(W5pfA%3Ys@hKBI53@qj8^2AVV^5Hz;Cc~FkUlToIaW8>YL z`op8_tar+=-s_J8c^mEB4V zz9pBl=9jsU^jnho#ft&m1_%7-T3KUVAL%$lT?%gY3Vuv~?6J47n+sh}m zr-WJ-D=a58`)Ug*|j_ZCU;z|`e8x+>? zO;q=p{S;KHo_zacl~pZpar1JB|EG>w>k~vZ`0Q*N2@c-C5YLKm^~G@?I&{cj%OuSC z#b`wNyaEJj7J2ChvGvBv3dnP~4)%RfjO;V9(%;yd}F8TO#0 z1>+`eeagezAG=4H?6A<+ts$0OEx@?>GRgnb_1P8%z2~-GT?uQ?$j?UAg|4OOgilC0 zj)n|!&MX{(ng`x%N*|Nj3m1&<=_Jx>=b!jIT#ylI<_4$LvoA-awS7wC$6BVvrOIct z|LBtD&oK8fbnPgaCoSh?+TY3z=!bXMtYib2=ahRaqaC)oTOMzGP6x4BCi26TEF)dK zjR_q^*Qu-~;qU7RO}yhF=UlAJ_CSjsX<&s}6=yU`=5xHmYT2^YuMyYP`M+Q zKZ;~JEjx6P@&R9!3aO$+BsSCVW$f3*Z^xdhVj#c%faQA;-H9tMJ;Ou`9|3AU@tF4RPwKD67lVMbG>&lO1boqBvc|0?p7OB%}qK{~G(r@>0=y-7Vm^BN8a zKeNajGN{XC(;e<(V-3fl>TX|*d_eIeGFQdmRk;rT^LaH{e~C8Y2ad(I8IHGK{m@&8 zPU=4Wheh?Abn?9rmOj#C*Sl!TZ)|@i&JVemGMDkbG*JYxUwN?Wdv86~QT3Z-bSEMzGIyoO45y+nsY0?c!&z`S_H%%(L>iQ{~|Hk(IO^Hj9wco}dT%th8 zop|R#KWZ*!J0m0GquNP~wu_90d zfAznlXXxCEUqEhsZ4(m{HhoIR!Bjd8EjhJ~`0`FjNJtRvTrs14zt~)*v!vIerMbYy zD$hb(qLhThbrF2qZPc(LQ(_Uc32z7jPYfCz`(r{Pq{CV&oL#zS*rkelng`g*8?D5X8UBM=pAs0#8k{PpT@dBi+ zAVg*=Y7&x<(wTa*GVw+nK;`z*CAB^!#1ep|4*JTsjZhljp!X)G&=W@h`%yi~t@0OV z3ifce)^9JuR`RJk0>L`os12rUB3}y|_d9&xF8fftUgugDY3}(S$@tkJgO`aKRP-AX)_~bA-%&#Ge2Sn&>V0TelA;ht4U6A_7*OC*o z%m2WZm8PID7su=DOaCRPL^N)E}gj%7nYgtxA>_5>f;uvD`9y}^`2E)V~lOV$ewJd0X zytN3P0_(;yGXg?7Ai-0N`Z$!hxkJ)5CO>mV!DRywRrv+_+GuLO?FcW)mk7GTbX?V$b*)X$$k`+;$+EImCY51zTI zAko*d;njD9sdIqnGanHHAUbVX4ljK0JZ?}Am-x# zA(kf=K`gYn0L(Iq|BDxF?2uU+(rd3t$r;Is)8#>*QMH2GqesFn@qO`{Y-S-#XINp! z+WK-(cRw+64`SQ|_8jwy=CpGBWrRqkS{aAe(+|9pV52q%U{@{-kO!N%JV%UN_U{lyKiIs2Ru_eL^Rc@RmU!F)*O@=leKg*t zl$(%AS$xsl6#?`$WYeDyF$vx)Q#xecI;)2s4j$CEM&12H1hl%XS>-$mK@G)#r=zFN z&H;Z{{(pc93T6+GfNJX_hzlD#05*iUMD!3+vpTk|_8W2@oZII}!Ep(U>8E8O4-Nqw zg5S>$xsNBUk6|DWFDzGR7v0zxJKaVH204Y4omBv_HeS+kl3u{bmgpgU612 zjPe?hPk2trmp2(C-YeEjT_=!(?N73CE|?rLF|G;@;(ucN{#))IH7?@9%;WCXIs5s+ zv{y4X+C>Skm%85h+*+P#UAbKsDmuhAav3fo2OE3Yz4n&3#k<^q3Rlso-dhl{#nN9W zPmK1W{&`)$k%m`hQTO)wX8Q%MtK84g+H9z#-i=H5irJ!_gDWUgYK7w^h*cGaSk!OD z2~HWOvGoI@lDVPbI1c2U7yqKYU&(as=-xe_w1)O#%6Y-L;U1&EvBD>sfyWgn^2Aph zBM48Vqc;Y0uGSL;?odaYZv3$owRRe<;2wq?d+dlSPLup7L^zDNzlHok-#*UB*5T@j zC*!iI-aibtrMdFM@H!$}Wx>U43&iIpu{C-sj(MaBOna`&JlWAM5!s8$x_!RPZUJ8M z{Qe7mwA_p^++Gc>_Fd>dqJ^q*9CxiJ#IE+4{VHaEbQR*gYSR}jkE&j`b#@AWS+A~a7{Gv2|h2nL7(>B-r=-M26 zjCQzj1XHdOSX_EBLkZqZej0Ae*T2XddSe{RgD|gv90>m}#L2@k$ypp+1@f%OX%UdDH>TJr_ zv# zXW<$ZLHuulAwmxF#Ac#g!w`gjfmNBBOIx{H_9?`-ZWuWVMCLe4J6l4&Rg7AvUZpL_LQ1{R_g#h8ros9mVEc$DR#;tvT+I@`*zM1Ov-w!DOwOQ zrBVlAf_d7~Gv>0nP@Cy^omO0-LO(HjHX;VBNn!DRioO^dNdv>TwjD>8ZCxXZ@lPST z%w1Zb$V?8Hs#AdLF6VN;$%k_1*^Qg#H9pV&1+lOoVmZ9=re+|l>7u!Rsf=?tT(f@x zrXDBXyD=L6EY(bw>C9KonZ$~FxMw@vMCdduXKfiRxmXB~U`4w?;!3yZ1&X@a?V$ox zpWCP-_#24QGpPD!!6VOljr}g2m!Hs=t5n9Aj>9Kyp+YFYTDK~J=)+hIrcjhbC`LO6g&ff|@qXrvwy+J8I~8rDG~kc-+CQReslEMw~u#Uy0$Gl58-YY#>ed-S_{eqy6q0YKMLDM&)%W-lI{y-&Uk~ zB{k&R?H68{Wu4;Gc0wFb^R>RWzZ-aK6#_2temz7}*+n|CD*61b?i2X>4!?6^?@B%@K>JrL8QaY z((Al*HF|1qfVZQsnVz%;-1<{4ku+XKIV|uB7OoW5DA^^yVdCmd-(`s_U>tn6qa~7< z5ni-uOI6*NqGaLk*T=9J!CMVbaV3br1N}4KZ@35G*d2j{>Cf2gE4B&&C&FE_&|Y1MHsF$`q~L#r+PkO%b%;qFRPYRWQXYA@Y`)RwdG=^w%ni1p z9_W11>* zyLRW44F!%5+5U8SgP!spc@0Fv3hbMP)Rxt)zV~0R_+)h5w7DvpY1z|xbtae z$EjJyDEa(I_BX@QCAnOnzto;G+=BVV_Ypw#V;WHH69y^#PbwZ$t!(){W$q)VF1`n) ze|uiXJ`>ih-)=JtviJrH^mt31otj|aI8=3a#~=INQTB;k^D$ST4tMHR$c)JgmF*G{ zkJ`%zIcl;`hUHp}!3bI?xxIO}IW%~_?2YEpeSS*E=+J?qN?sSDT<>FYBa8cJ^|ch9 zd0fyK1_^!R99|cGmS>u%@U#w^gK$RKaO_}UO9CPDOrR5&fbjA*pa>8PNnG4basYQY zukrkwpa>cg6^KsK){IX~Oym(15TL)j&vQZsBVvoIZF5mJ7PUP-p8Jp0BAFZX$4+e( z(VmV--Z_KXv0Z2_%Pffy->##OWKY^rp^?^5<5I1m!tcGmKP<%ikY)6VP-bbi|BtKh zj;H#M{>SAixe+2nGBYwSlGPBdjIxS^kS&EmHkA{8S!k*pd~!~7T!~l0UpBBY>Z*Nh*9BN|Jtwm7?Cw_o0~xX zDY{k_-b^a0vMVaLl}bPJRuxc;wq>4AI7r`pXd65x588IRXuf%*A`^(7a{g&BTXO29 z3|~Y1adttjLJ7DC9wfT1&JJ9MnIz9}v(Lk2t})zFL-xCdeGeTq?TN2Fcp_H%;GY_B zs;bGX@U&@Y9!<0*cUfOJ$oI#wEeh>B5ZwRNpy6T_4MR7`rFk0--d?ZJ;!8b)j|>hY zvan03;SQzg>*p|cf^ovamtG6C+AxwxgjI&B$h0|_7s!IwB1>Y2E1t5%zVjCh0Qc)2 z<3Vgw`}2(>_87+0s&0Z8uOU%CCA#y~kJz6@xNZXVaCmW#D>Z*!?op%Tl5pLe3$K6D z`O6nS!-mx8wduc2b$ft}epT#G5!dwMv3X^u-=M}<{@7g`D7Rs82bq)imO zOPcw1`u9JDIo{>3BBQ*QLKq1b=+!UPWOT7_*4XVf()WQkz~6AvAi&1T&5z{&XBz#* z8+4=Wzwf?~N~&SPh-{JgP+&#g$y@L%Djc4J9vnQ@nKint9=&$^_s4cZuvQn`#}jf7 z?($?|n^&C9B62YB1F+;RMUf%w^Nn?_7`plUF2OkI*`-rk{*>dT;DBZvaJkUm-u$}; zJiI_^1z}}g-0-XUL4vas{ExW9*aq5#eeJ;B#vph;fZ$uh=&ofe!}b!i(kGT4aCs^_ zep!b*`SNUKz+*`WeGsRM?!s6ZGJbv{8z|QE5s@;P$cOwgK=H{>ir!EA;c)%+1;K4~p*Q(WA$$7)nDL?Sa~U;+D@H9sbV6cyq=OTZJXr-dU)>xQ?*s+k-ROTG-k`L_?vc0`{907G z+3jTJE|eXh^AZ)e%k22*v~fpt1J?7A0MWpl1@Jc2t&Ipj;kl-H^a$~^RnF~=pT`n> zEDkM^b}id@KaDERibsM7xfo252_hoGZ*^zuVZ2QUGw^8hi1*;dOz>@OrsU6yHLj_t z$;s8)B@xzlBE*pwoFm9NS>8afb7M32`8>D_dr~L^1g7pywNE-Y#T6Ca!R{e4@bIxB zi*08XzT>2X#Odo!z{IU}{5@cKJ!Oa^7>W!l*ba?6I2qv!Wh7|t@;D8;2H--$friU{ zN5MXW`pIz}L+nCWeUICVfWc+LOHk01=&QUr4~729Mye!(vM|XY^>34M^&Gga@>ae> zQ~)1`W9U|grxwM^*#HBC^*f$YQbsj?C>-9?JeuS^+s|7V1zE{!d(-#f?YqT}iOh5t z+0ez@23kMUB~{@>MHVhisPSz7r=rlzr=h&I&Dl`zVd z$9N}0YpX66ARc4LnQ%0fU9u?T{(wM>&N!4`gSr{)cuT zj*nGjbfw=AcXhNIPM9fFDl*_X1i-+1`sjidZsVRB>MGWA17Rmeh65aomM1Jzj?GG1V|+(}$ClSFgF-b_V)IP)|-=wqEXrO@xPC-FJdjIxcom z;dnH&=guYy7ZokY(x9)$>}tZC7nQLUProfuOd0_OkyW-W{2L^`7t|Q-#43$_2O2=nIiNBc6LI1*jw zRZXT#;9)rW@-oSaM65e-AlU3Y;#}yUN8GVGck7QxCY|9&Fe?@#@`t1k`NnguN<2C8c z!gFSbS%odM&*A^uA?Hi0h_u^bkVPHEOF5Uf!6#!pHE9>F%z^A=BFHfg7NK}-R;z-* zQV(1?%oDIag9VcSW~b3ORH7++$6yc#$W` z8Igp|Rm>B_s*+&!GYz;k3GPKA1jKeRvyyF%!OWu@luKBd2jCR^M%?b@&)o<99AA5d zMwwB&vUlU?X?1cEN6Ct+49-#4iDr|ovrU7T66KSNii^l@$D!UN^h`dI3#aJ1R zR0aqn5qRr(7kHtk6>SO0HuJ{(sxr%=#7zlGzJhhS1!e1y08Q>3ck+p`%7E-7P*UC% zY*J@+{2bL?sn8@3GU*Rk_d&sqKh(er~ z%;DVZynDf3k&y!64bj+Ydp!nqD;^F9BIHj&=+np>nlcjISaT+N^20`oggD~62_P#9 zQwT)p{_b|2D4qh(tw{icrC7L9R zmj%9`o8=jApi2>Z2cG@+>wBuje}=#HX#uUAqBl88vL=0tEu5F%$-lMN)3q%}9>n>7 zuQ_vtVCi5S4Q}=v=}6J&L1QpM;6rk4z6UN25_5qma5`$MmxhG~v#njC%LVf)__d}c z>OSc;+@=st(9!CPr(VY2s=5u0D#=Yoom!|2!J_P>t|X!8z`8qvGxeB%=P3j!AxLbI zKj!uy43XOzv0`KVB%?B%=FAA2Mho>lENe-rYYxZUCY_N0Jrm6%z%E_yBz%A)QnxEL z%#)OoQfhFD1ZRlQmz?8fpVUMRk|S#W;YR<*tMJ=S_qKW`hVDIVYuaT8lwm@gxUoMH zV3tO~%?|6FZ}O%pJ^L#DVim_fD&f=zuKj7NG!GqV*%C95zioJ>?>zkD*4v@&1)ui} zG4zR%4^Q!_QE}6U>By z!Mc9B*PW)`MyelX*5mYn%&KFKzJcqX>mcpc+12eF+WAB&nNbK{+M8BErU;AUmk_1l;Z0DYy zd^A3LBoPTtD~rF*e>C*Cq8-mU)D(Np#(?NeV;MaquWwJ>R2Ly;8@IZU&yP^cM{4wM zd32mI$I@CA__2h_C=!p1pLMmxAd!cY2Ihs>c1$FlGLZ9pJ(&7Mz--Ekk7pgfP}~vt zUt_ctCM}#h_iU|yUi7b+TQ9;Rh#IJq~7#ttC_K7Aj%ik{a*dM{8btKV%jTQ{Rhs5VzMO8L{ zt8x6XKX&kw_DA|kH~SBePeb8&B(^mg$VRABX>Hkq)9zEQ4BlFz&?!AEqBY-fJ|wv1tgZM!NeOiUa;8=yq~KB=NYX%;WrHrdZcnx=1X zu!Ua=n9cTPzQF;AJCorN-sW~xOHq`{O-jYfA_S^J^<;3gowpA8bMa1msr z#KnmaMsBm3a@zmK=_)@0HS#v0+PpOE!75{Xa#H;a^gQ?;xi zKD!(undC(2!?=o6G1d8$7EO?hINp2}KH>$6N8dPeg^GjEMhW0@oB(C9^_dw5F4NeT z2%~xR`k3~R+*qT}?}y-Dxq12U%dXSkG&8Gl9EtRVsynB`_TsKX5q$i70-u@Rsa{W^Fn8=Ea$Qw#!+?N9jfO zV=$Oobx5uh1M?(}kfQ;YDU%?x?2)i9EU`t?fK#@%wkHU@@+;uE4ly*>FZ!CUh%pJi1k0@{hDR)P4oNDyfsK#e?2*F0+!LD8X_a!P{a$q-iJJ^p%bmB zF?|{X>J|NL>RGxL`p9q~AJxp>VytEdS|Cend~0iK0a?sc7kE?|0*pzJXC={FLcG|6 zo_<6=z+%}@Xcm&h**tpaFIk)oWuo<&)EpdY&FVx2KI2xfb?7Qpb1JLYlb9OP?9n-~ zhghDZ>{YI*u|zfgqx?w5F=!xfVnL(SQ&Ccq1bLH>Gg7!o4NX+v^FfJU13gGeOcZ$% zlif*-qg%gVban*&x7mP4-Ly{WsZJ)Fz2P zDtaoA-*{64CHdUWo+Q&udV&Ye#k9AnN8h$3p57Uz{xKUu4d906Wk`MV%y!u$L8!L; z3dpFh2w6K5utfsV=XcwFe_>h2_hVt6YFnx9NG&j z$$~s@>XT&&LRqRwH1DoLttXLbDkF&##Hh@T!+cO?hfwWI;#%{r0mqUX%z4Na34ev_#fIrR(WXv-%?DZGoG}_>jns5zTB~m5s*IZwh*L#`vG{U zmx8V!FLA$|b(!Tdqj~b)0&9{|*6C~H=H=n)0?`#X66z*SF=K|5po$}9Jow;o&9EK<76&*W~K6n{-5oQ&Clwp;OD9mH^>ol_klIdCQA%OrJu_D zc*=YSK-61*D+FB`0WY@E7r;5mMZ_A`kEs>cX}=YpZYGqhGug= z8`ai3Mx?Fx@8jT#$6x8pwM<*1@A7S%`7o>6PVY=&FWoU@!Zi7JXh`_?3Ra+7&#`^= zf*XXOrW{)cR@H5RG8KL-ES@vsX2Y4V0k-5Z*zO|}z8M+|uPmZyjZm%b_|77kIn4m& zi`jF}>dwlHAWm6%1c|uA%Ad3j=u5smhdLq?efI%Q&=l*L%(ho|ck<0cvNad$h-_=( z9%^mPJ&?0qELlM-oDzI+T1Ots!OXbfZC`;nPhsz~XmRc|n`C=f$&;7< zF2F)a&i79do7LU+4j}sH{Kbe4DNT*}XLaoz>XCoI$}>aNya`&EJa_LwJaoVbiXZ<% zqLDXbd(~7wLY&~nE<2a4aAfFcD{U(iv@|yk1t-_1R7`qx67>N4yZb?S%k&q$l?&w` zSS|f0Z7{adglia?Nq7jL7~DQ3(M;Ap-AkycCt#^G^*mY`HKVh00v^vt+9R8*DNd<{ z%>-wrD?oth5^v0?T`8J#=x8Txj4nTGAb+xMWq?{e!iBq`xP^NdK<~TXmBeuYvq8@j zE%qeaYJfMO*WB8zU#!n^M(3W*O5!;GqB(`3bi#}zY3OX9U~PE^`2Vt>AChf1bRbmbeHyr}!Jv-`j zC8(>tOdE4+z$2($vnVMEn)#x1;sPvb`dH3Ne5QA{w*JaC!(q3a3$Ac=QFiG`Y2h$Z z7oOw9$&)8Fkg1Gds-mJln8Sjw9Lc7l)!CXD{vU*ka}m5r@1W>GNeeLyN)sS*W|jKG zEL*Z&K~|Qfsn+flRMo+!4<%Bps_8aLsHDJWe!DY~@j5XHS<&XEH+nE|0hgy$fu|!##&K>0zkyzud1&28|sH6C$ z`zjRth`9bp#vU#;#j}#HN!CLhz8n+lhteaUA7W>w0mHS>Hb@l?zIX{XwmJ6u_Qr}1 zs3v`vT=DAUTc9KtC-O;Mbwi7aKYskk)^O+##^ZoJHGgKVB((7CBa_j99x=M9Um!o2 z!o%ydAV41|Vk8hRhoE|D+5&5n_c|!QML?FMVRTSY@%#7hnHvs$zsH^lT5?@T?)xE& zrs7?auS5RJ{sVPC?NZQN`w>*Qo_4hDQP}OjX!A2r?60t*qGITw)lvsL*I<-kOAo>7 z5fb*0?Gl8v!TbifK|x0emE>CmouU};ivl25xS<72O)KeDct zlsW)&#~PpytkT_GEU5X!4vgRy?a^^wv~E%}uFm=22?;>2%Xf6Tpy~Cl-rklcQV}HW zwiJ?EVMS1N%hwA#*McSu{sA|>`fwiZV0&0jf-or3Kust0^AYIJ#Zj|x z*pTS)I9j12l841}NSNEglrOH}osCW!z}_xIKO;dkF;Qdxe~5W;^c4xK$I{##A}6)< z{vo_a>!_VQulf(dB_Q?=!rZbAQ;cM}-7jzu{CF^tcl`!NsN8k|E6rdfkDa>>*r@{0 zH42`$Bt+d|6+mnmsSVzNYirk7m2HRp!`v71TIu=ok>Ic{X!>?-$2Q_)%_Irf`_fMX zJBnn)aSLf|`k&r1fgG@HH!os18Jg&|hR(%IT%r~4uRt*Rf+ioe=6L{cL_fxU(2D=f zCC@{j07ZNZHTTA3N&f&b71sWCf*=<%LzN!t(w`Ba-Hfja<8Np4M%}(R=TvS$HTah1 zrf^*Bwmjc=^P(H%!mVubni>!3(hJuOR1YZQ_93m$mcd@A{sO9@qm(*3=8OwuQT3n6pvIDI>WilmkF zA{!s_+E200WGU{HuU@?pXB9UR5fErWkFpOHPB>PO_dRAvdA0wBDcOMSU(I;lcHfo0 z5^rX3mgXn_;E9alp0r&Dh1&&W&)BS^-*{#NdnKnQnloB#ZsiUQB;B0h?K@5jJL^rT z3;$+^c|XZ~b7K#bD@j^eWDy-LI+5)_CfkDyRHwkmcy93w(u~9ya;p!K1i8dxxUBLI zA65hXPBEUVlfF<{E+}(}qi>sncoh$o$Dhe^{n(Sha@Q-b%9`SrJH}vlT>w+2+y4Ba zx(JKOtyT%ZfeL>U9+Q=oWuwpKQbQ)UZ=&c(WWcd{Wt|#(5ro#r^VbJO1N;4Sn&XF# z91%-qLAiu8)gqkLCU2|qz)4Ogh+eI~9%6}EZNBF^5qb6gTk>h{zat|f2^89nywTsy zGj5Q7xIm6rhDz^s7t!;n?br*I^SQdN9&q9s^Jioau|l{sHvi#bl~n{dMsv$SDWmbX ztMF&GLTCHz7zVTU_ctR))*P#@a?^yj^y=EM9!s&h84*{ zWWu-EBi~dm*30@g2|uo+qvg+}rNqj7%5=zmN?v*S#mQ8874N?wUp9-79qtl(6P0`{ zRJtoyWNq(DnPA|EFnM@5Q{B$`_}QVV2FLN_=HX7r>my^$8o^Fb?duaHYAal(e$H3I zc2k$9;4PZ{_C9es^Q#s|Ftq#k?}ujKqb%^E=P;B?L!-3qdE*gfI7pqq02jHjP_6f9 z%@btja%A6dlu3=6EQ1d`P)UWwe!9N04>pajiq5~+Ojs(I8VG z7E`7-sO2!xxc2I0Y92n;{kEWlQ!L-X_$1wYeNvq6llw=J&!0d4IQ$uD4Tn8LhE1|! zzYmfme!ug7pjzDMd+ncGzP?(zQuzGnc@FFw_A;rZK31Z2N4X+Y@o^#S4OeMro9d|B zd|WQ&Q~0cGc+QNUE6kt&wWF(;6p9u_yZ_jE23g|$Yr)rwxO1vi%*nL$A4-G~-Xy-5 z6DU8T*T3rX=gyH?x5^1kqp{u}6W(jfImvVrN|moeFD72`{iI-CSY7p~%X_9|BHk)i zSNc1;IAivSwoSqlj{QPL+=srYJN;rOF1#HowNw7HXA-@ReS>`-`*JU4)3i)V+Ur-4 zCp<-E2J)S^C|V5~xRpfHJaL7<*fR!?FKw9(F7XejlOLWNBufy$nC4U4M`?DznB3ovRtMrs51U^rGK5u2n;>wEp;EqqS1KQQd5wG#9+4Xo z@@prv_g_JoWN6u!QpOk>?(ywY_d%8uJH%dJRArU%SFWH0{9{smf7Pe9J&{%-R6P^g)>nFpC?#$yal% zc=J&$s_N#H6=w5dnbfk^pUoVK;iC`3)46#hgixk!jn znexVY)Ld)5d6#I($PRh73#-p>FMd@-#;Ym#-sym@e<`D@z;i+9+hF>+K+RpEf(y>zKZXz2I7SC_o*<3 zBMj@U3TIDbnhI&++QLM&j-;)mX{50SninQ2Y7Edn>YO6vNP}h zc!7*He3#ln?F&wL!NJQDSKH-zRt+U&W#P@PWaaknAHfv0wq+xU*RE-U6#S;@R84m2 z|8q`8Tvj##WC(A5QZzf;b^5og;~uKWR*xTU1$|e(z_~l9)gmj-kzSwOu6~&v=|7Z3 zHY>A@eRIoFdc?>C)vc!PlmI+bts<&2Ya;@Lh8M!y`(g}TrrBkkURo;*NSA{yrCp%_ z2O8c(eYKw^ITDO&l};maZ!q93CF44sqN@6mb%)_6f@R|#?KyMcR*9VzzKw8vzL~b~ z3igB4+>JIJ6a@ADIF+rJ!(&l4l6r0EJ+Sd)pazeYT-&6`%YZ3VpEg2^#_RIl={uiL zTGh{homU9i5Sra~P@m1NUi-t98^re>Ht5-$#T>GjgLh^JI8sVhV40V6B>*APbzDIV z)r0#rWcHzDbYuRYixuEA=5#4e83XYohR|qdF)ftf3MX`^OI_=3&GoxV4Y-|oeH}zJA_aQp|+2BKQ-9J?T@|vkqTo zC%(xl=Nk^I!pAj^Bf&E9dO_|cS@(4!VPmb5AeG#7Xj5L`>F|zBkP@A=7S!e7s~VDF zz3-iR4Ye_U(Z#uT&S9Q}k6(OcdMSh0a?S&`?91RHiDlB45cqSk|F)}K{78caNS*LS zzKA#wy-opySXfwieO1|62p$2rI!W+7>SK*En(7lhCfydhPM6G1M0rO6JtwF13*m*h z?$Pv60KWyos*pv#T6g0H{F4rKy>aEs*f&Iw+>R;*5Gn{QjCfSHi@GO^w;ROt5V$Hl zd%>PpXc;uQrw@*TaUAk@YV}W}=4bVPnRAL8amzlht&dH9r~%8MUL7n!F!J!+jjs$_ z_GPB6{j8JfR!PvyUz}2k+ytoQFyb)ciC_H2do6QxT=&WBEh;fXmEC1qAtTF0J83M zZ&ZCd)wHuDh`rf+qf>lS|CvTOOqz?{wNr-SMyBnz{$MiUdrY1wh}!j_fPu2J{GscxQ>hYe)``PK4z zr60_^~C)+sT{g|lu| z8$jz17E%g`6>?j*p(;B|&#vga=o62R&JD=_BCl78jDQ%8z%`!@un>R+Up`NlgZ?lH zg%>@Z{U8vB^nDK)b$WB_Z(&Gn*B?nxPtHZ7Fx?#3>;}wCWaSh3v;H0zH<$CA#a{weQ%SbuA)SPPM#f*aK1z z#1M6!wM2B?V2cODX^*st#!viX?{{fYD9Q(%ec8KyMIEqvG& z#Q6vJodFCMBDfxgH+_+v!yxtm8FCPl!->El!_2j|+IV-WXHi++HKkeZ4}#&u(V$2! z6fjuEbe?|ORDBta6sj}xk@ccg-ed)>Wdii!*vzMJoSH88{S+&MtR3fOv`tQaw_cM4;zv#_{vaygn?CY z;8w$%xl{fgmgFPBl+QxGnpmOW`h$ev8n6F;8~Xf|Op*5ej(Eq8~m8WD*8vvpJk=0qaBooO^*3L z%IYDM0qjmYks^=hZ!9Xyj8lRMYL|aq5a|;LrVMh|^z^qr?|h^NC$bNayhculWGhHB z%Rm!5sh>az66e1yY;`)U-LhO8XnO_qUG;UcMFkb$4WZA>@g^IM zjg18eavwUJva@10n-}k<6i@E z1O$k_0K+d;^Z56!K$fgPc=2I6I_!b-B>^?VX{==*f(7IfbH8nz>3yMa^aYk7YT#DO zn>iJKH)2YPW!<|B1<%6hP$NxL_g|fK{QL9YZnRZGsAEiEKzIkTx zkfq1~u|Uu}4~&}jUc~x@*>ZVPthf5k0EZ8L?7yLTr?me@)?XxJkNb%ATP;tdq>qaN@kJ8@f?Gbt`Q>j zfE-|97N@{Llf;C~|Ll|*_%X=|?=&2^_3aIPHA_&PBp6}Fl%ytCaN`lqMth;Wk?s5b z^!aG2`30Wa$O%SoqLl3W@fABFQf;dt=PB%{^t6)%9pun56@L-+aVetV?c83{$urt0 zH7zaecs3e@F8#zHia)QB=F9IW`+4;4)2mtsm%Q_&GgNRO$zGg>ska#C{Z^V^)x8|C|6Dn?;Yj83;HUtV8kM801W3YTR z*K^?YW1*5?OZ&D7qj2nb?poLk->aP_m?PLI4O{ctw2%qUs= z<(4_G{XGeu6<%z`rtK{XR+u+Fw{x2$plGn-aJT9M8();;jie)J_+ai*6 z^Ngm#734ERP?kI0$;#tyjkVlvuPLdEG0EVTkUMF^xsG{La(zpJY~UJqOv-^48A*lT zXy1o3jo-TeR4EV@uK1jgbzUxJRkGziINK$HiqC)iPA==Bpu$uC@jlI_xu`+1lol4a z9{E1a`QeiqeX92_^n-yUk96uyS9(p2y;RrY_|WQZX@i7E9v5Nq~mewxwbR56zU7Ud%A zq)XJITGU-&H(y+b+VBdG2)V@pN7g+C9MiT{k#5_^tXAeD2Fs^}h75$}*OmG5*}lol zZEH+P6K37w;VMFW{bfKxCqXCHqlW(~RZPx37R8jHx*04%EHj>>D1@tGC|e`lj`-Lq zL*f$D8{W%p7L(=fXc4PyX9ER$wL;3#Yk57o$W-eevE}R#jcVIq!UjKG4RLpDGZ0Uz zKf)bYD~q=)4`@;T(fm-WDN#1I%fWxpK@{%aD5IP;+U2J??zXzx!PaW=4HSfEy*6oW zPK;$x5sl0$N55u5$0T{Hie6xlCgc}>@DTM0tQ%c4Qpvkj_33`wQiPT!gYRb(DIS^Q z^8+?d8N4uaDPx%+oyH@d&V@lfuov=e?@O?79k0Gak6`BaV%vEOyPg~VgY!Qc6B|bs zuDcW<{Yw9466}N$cg-J z$X8(7lq^BjDdT()PVhG(R^N$=V$+Z64mW2g`=#fKM1VgguH6)sC`@IjCwD|53vWlX zcT+Q#Pf)t7rH*g828F87=3Y^hi%Xf??vi9LQXeZ3V9*=NFOI?F83ZWOv}I z5DhYeyHsVhA1sr++KsL^*DUX2n`8*j1Iwxf(+iU8OCE-Uxcisra=}*0z*A4onPluu z#g9DGX$Xla2#N2B25JLm;#y!o?b@@N4z|7hK{l=d_r57{-~2cCm;VG2Y9zMPxIl^c zD?)exgv3A_Y0q#&iRaRBIy~=>!45QuOt5&vrht4k9(VzOOXOfw;B`C9?((ay) zO}pP!FR~|UyQ%dkBJ%{Q&m%%d*f%@$#b@kMot5ukkoQDC=Pp%UjTFg@Dxo@^ggKJt z9Rr1T_xpY}nY2szST0>}TA7>9qVDVTpyUg#|6~WGzbtGU|GoueTe9-^>8&%MuNDtB zTuW+#Z>l<4lQ&gaxg%nB;iOPTjo3ep5${ezSBSuM?xsfFE3_$CClcm3^Z4dfd!y*q zBAXMnDCaS!N4g{k?pp6e z8+A<1CjT&s1WufaZ6pxmS~zRh<3PN44Pfgm-+Px75BxmCV~S&azvg!L#80@sG8U=Ct|Pv zov%PGw@{cK{Ot;TXUC%?-8Sr;(+-R!#zGOl+hu29Z6Oj{G(BK7B7}Dk0w-7lmDMjE zZORIm7}!Db{Q`(PLHdPZj+8?q^52>-YmHeUexzB#2$BP3IXSFSdH2v2VKeGp6A0u% z9s{9r1drR~5Au#NNh!Bdh|L%$xjqB7Ja+>i&RV zeqs_>Hb;xl%H`H(b&j+X8T+=sXor@g#Yx6}TYlWm?g9EiU(`g)w&iT&_mN}G%HGGf z{XPvF6po%VQFG(ZI>IrkYmS+5Ct%S*0m*GKsODDv9S?L$wNr%eBsc+DZ6ntuoq; z1BO}z)QxWz-y5C9WiGLK5mWrcJ6IzT*R|EFn5iPV*u^Bs%eRjg40FAUE^mqt25wIqih2iSTFNt%1Q4^M_dq{`gn;Ju?iqu%4{2$E@2_DUzwxS*~$uVl^?0}143+Ul^Zd`!N@@}M_eANAbtD>a@dJ{)#q2~cl(`4iInLS5z zlPm$kCQz_7UjZp3xW&|^Hqc5#K@bTYyDvbW9UR$#BI+2eq4k^QDyFen$fR8F?F>r} zsn1}%|JeNmOi>+8X=}_6(BXlxoYBt=esb7*MPT?d4@EiS^nkB1%geB9JPT(R@_+<$ zMai#LBcB(aJ?&Wgo_W447yG87BK^-{_G+2)WzH^w^m$!YCcrJ-k<5mK%p^|~d^qhx zw#9{OU3yML6422eNezMxX7?~G;Sp>us2a6h8pyaf8h7fgMa*H(E%+Y&#+t1)^jG47 zec7{E?4kqF(`pX3eeqKeK*(2coEL(j)b$z;*-o!8EWVlo>s5&JL}J;*#m6HN)bsp zZLjB1sSwKs#h?VW^167HD~|0=YX$QAXkmhihcE#X8-%aiJ`bn1#PFA9((e!za}nO* z+^9MNwjxk4TU1m-Y6Q~u23F0lCEDL(+82p7SH-UZa%OSBB$!eD zdAb53(-Df+=bGrBN?E9hJn{Q)@Jy|u`qIi@N1L9JuX5m=c2s)!IReQ*@b6QSj>O(; z6+=Nczv7uRBXmd%W?%fvIqFQ&`tnblZiZ!0*MWUMVcQYtA5#A8-9SC`NY|`q%?VU_ z2faxsH$nsFInl^Xwl!xfaY3pWdCc2R!m7}w(vCzso~0kGdAJ#beK(vF=2XQvqZ{x+ z7q?z{>JHl;C*roEdCvn97Pg_C#oh+k2~Nurq|kcg?K0v{Bl4W$ zH1qVW-mynN|5O*HUFFm~kQI{W3Uj?3gt=mM7hm_6{&r=tI|mepC}x9C)6~j^!A5JC z4&h~NvioeeUPdY8hnF=^_wOHj1k*W|)SUH^O6m4RDa@Zd_z3sAg!r_h%x2cqy@&ON ze|DksL@Jxd`^?AXoPAAG{jUzDxCMBkJ+ncCVv|>AdMC8y5x&;wk;mw+c;1vPa?UWU zkZ17H#%O8?O3(II4yN4!@DLT(377@+NLie4Dj5taP5Qgh>+GLhkxdcdl)8GsK0Pt< zMblqKM(Ir2w5MnfsjBzQIUEW<_>(y_Jzh9ja{(aVf}=FlLy3ubCnq6i1jUOd-;xj9 z`!)%?7Q<3GCH}P-&-7j7Wt)#Lgy1A@O8C~IA zy6~gX9NCA^rrf==f+CzJ-F{xU%E`;&*5&U>x9_>9g!XUX>EQ*W-TOiR_2Ih1z(EmC zCGWMHS2?*k9AyZqy`()oys|r%)8~|%AJZi!Ev|tlX8ipxJdl*>R%RIRAtjq4-buvc z#Bf!oW>gC1P3xVOoPg_B{u~o&hMV!?w)=*TZ8BwHFMh+R$y%WpilqESuZ<(TgGBXe z`|MpFxTX1`=zwp%;~o2ftmO;sjTd&r=qlVPk3Ty87&3w8KH+~H{kq)~FX|Iqw79$L3g86I(lIL029c?kXVs@jdQ=>oZ2bV)1D1i{m9<+x zkfkg8ZmIQ#+}nhMCj- znyr&@M-gmISup%N@<%G+a*^W)`?jtB+}3u@z6N!kz2woSa!qeCi;3i2^}k1X%vm=s zHk_;%mwMusjF|tlh<2)2hnU`~wsLZk*G4L;#{HvC=bHP=rAE&mtE+Bt81;`)59+(1 z*pEWVL2xxbLmua~GIcy>f|FPNDfxH=7J>wl1x5Ev9eg3%o-r`QD_C_!BCHPb)5kG@ z*%5vkBjAJba1n+GA0G-gsV_f#Hcn!0y2Hg58$@aiRzxwJ^ep>~djR1^lH8|c^}IP) z>)Oc%Xs>8Oypi3&v8OIpR(^Za6eigTF;~db1qbN6#KgI+x(Q-J?p9Aq-vx{qpD7@0 zWuNSj^xpFfVjKlp17sgFRi|n zN<%J@cl-5~bmk80668~PSv^jB5fj!T?SgGXp&gg8;?8w>RbP!)&QEZEmwJT#IUy+9_ zVajZ1p(zh}qVE(MDw&*~Car%dOeGZBM~AG=A0-7MF}=X*LdE(rXK2l!QmKMJF@SSN zN}E90aHa_=QwI3`Jgix>uPPXVR~S!WarA#BqlWR$#0UvUk<~yEr)qEHL~Kq2av_+B zvNeAX1T&pLlCv0_9(aMh*wBZWnnE~4JREl#QUurGkl>y`oJ;fG!}Q4S8YoCM7c`JZ z-a3EJCRukeAc%UzlMFWuWZs8_8xYm1+i*I-L#khMkZ{!!1WR|Z>TK|^Cp~UB%}p&C zIzq|Jz11m`S?(ur%uo+00b-^CiuB`?={S@Qx13dvUc&TAsfy#8jRHPX%v*o#9we04 zbFfz5z#u`H9p1&A!w`~`isYL)ew@4_$xzrCwK@wKkdf%S%<=C(k7Zyd*^3btNkZ_b z)X87}=2ft1zF=g}$-$1qG^O&Qjxdc53?&XfA|#$V7TCCi@iwRRh~URc#U_KR2ezhX zT3yg*mw9*S1$yKSU?%m{!1{sk|Y|U z2ARyEWLN5v_QzdS$Q%b0CXIk|@$Dyfcnu14_`sfXkx3N+b3|)2zY!dg&t1QUlsFNJ zSBs=o#N1;vFpw_45+uofCRH%tvQ#;uNvVTwgk%R`)cr3=0-EqKrs$(SsG+JR2pf|V zqIbxWEyWO3knKgPTEQKK{8zr<9r-v6IrClhIT?w`f|6#aN(}HI$wK?d8xKe=I%492 zcP7)hL3KGxceofrM5FrAH=pgO#C=k+6C|h#r@MFy2?8_DqAIoy)f^;C@1p^jxqJ6+ z7FTq;`i(p6YsD^V==WEk%Ek$}rNRl>P;xgdWrCns_)@#fzR|p;YYta2@42F-)Neqg zG|(v#HHK&-Ybt0q1|g*!b`UlU>`O~iyhvYX#48Js2iXSf<&M(ZWr?{;&uv_Ffr#fZ zxB$^D+@Uzp>X?>9owg2Rs|w^gUBZL*hf=u5ac|amMd0oL(QONLq9v=fX*1{T=KS&? z^yyqdx4Y39yJH#8NhL5L=v`zZ{~vna-wJ0^=L9T>g>one zT3c(psGc={`XoiLB3(X#WHE?I6x;FVPHzT&T%7nsjXix)X3h>);r2o1rpftZ%zHl7 z$qC?r`)9T~&LfbWS|j%2we=dkO3bds(LGPE-Rya^0o^6v2GPd=VL}6!^qLSHuh~)2 zV|~hx`*-f&0|GFq`i( z`sA4|E#5+~w?8I*ZDR((R%LzL2lht$g~Ho?^4SNXmAMmz?czy(+>v|DPMszb+tOD8Fc&R?JGPcbrr<8agwrgaJ1ZsPNa9vN||K$FbCL#25##v3Svib zWic~Qr$^dcm$)Y`foizPtsU@hAKek9#&T+yN(;l3Io@#Tb@ifTG_MZ|5U@pG!{oq2 z+4iO_G$%kH7eF9l0S->A;bCX$su0i_1Mm!EB&OUFMIvMYXf&E`_@+Z@0Q`;+jV7hy zT}=I*t$hbbGGs|pRucZKqwLKa`lj{!_Yt&x7m!cmGCOxz%hvib{X?1dm`V1v`a=+K z+5wTGhnntx`SSlkH#36Dh#;dYL`f{xU2JR9#j+&Cb7wAT{XtjApfwBKOs&|P_yTOD z6uWx~KjP#i6Z_dBH3MYj^kS0}5)!&0J~fqBaWHmt;3_sj`(z3Fzc~R$ra9FV(Ig;&S!1Z0zIm?+# zp*ZPj;{*EaH#;#w2E1o=P(vyP20I5K2Z{pgy9n#$wtxCdBPRixuuG6%o2@~b_v|0^ zr=S#8hzBQ)b%&i0f`(Hczg*AsofN1zh`gpD;rZIp$$n@ALtB}P`3cf`R#5eD)X@LB z5Fbq#1P)a;^QnD+>KDlAN4McNtaxyae6qD<6Wih9XBNl4bfWJ$qJ5oP@cv6vErfqn8Mqy``R8%!!Ls5;;}GCh=p zMIfG!ZS6fE{|BJ^9Ry2R7WwZ&?<@(guj~2SWj$>A2c6HU^dVsB#zFDA{cPU`p9=Kn zkvB0trvPVAsdJ8=!7;SLk&y2IO4c?}@ORgB5d1!pj(l1HdB>I7Nmc{mZK2XEPSKgW zdoMm3C^hX?#Q%t--Mnlz@r-9a@l>WopbUjsdMLv?~!Ix*tx3!l`bF9 zhe5qIR_?$l7&%|BJJXSPbR0P?_YY|QGjd)V6MSw9ZfwLIg(~c{e`lO$_^R^{>Fv(qoS87xyXsoEp0?+4h+u zk$U;jX71t>4o%|&L*X_jBL@oVC>B{J>=~iR-n)#H5LsC_l07m)wv0;Ig^1sI-n`!5&mTX3dS1_Koa>y&dEVD`9_Oer zKJ)2!{UVf>EPhNbKrBtt&u|l6u_jO4q{ck`RpX*?PJ+Y5E2w|zk?HOygaxdxD2Sy= zguR5D_{T>fRn|-&RTxiBa#x?#WHSpghoiJ(u5-fAoem}->XdO=+xs&<*PLkST~xZq z31OPCfM5ry(_cK{ikb9ly0iDpG*9Q5&&=)f7*9niL)7S2283%N&sDrE=On3FAQmnc zEyIn1neJks3Mv!*hivmck*e4fTQcR@1cyU?YEXob9|Iw!OvD1x;+P!| zAh#T){bz9*9qv-SWT!Vdrh^xY^j!*QTAg^Zr_5PHEb0hRk{uuY-Oe@+5-pWM^zzn8 zQcJUyXPx_zLnh}uu`}hf8f_*_UeV;kTQ_qQ-)U|Ca=&lw~GGF>8wlzoiy!L z&hz>--J}J9W{YyFd|pWT*fhWJYP zZ`M|)tz?Pe=j@5+myJ%hA0@QA)E$~OqOkJib~Q5QlcUg^WEnG~>x2;O`H?^d+W2c95RaC5|kQQ?9VjHi(B;?=! zWpLf7>fxLITBq4I+Dar^+e`>m-6ReDq%@W)=-Ud=QdMzeM{k0}2cD#b zt>cymi@ChDx+QB`{1KQ%W+nZ#mYqok*yBq>cl0J}_Iw{yB(<=>svw=W6ib9;Pr2x~ z67(;|ZQ&v)Zd+C?|GwK=G2ku#UAHW8bUaqjW1{5Of&W>AV2J z;%AwVSUS77&{4nIQu%a|g!~I4B1fU-u(tLB1L3u}aiZjM(yYeorvp2YR4;{=M@le7 z*Q^{UJW;3x#_cBk!fyjgb?eW<_6>u9QOs_rC^Lx%5`$AYC5t4yE0+KCI?`KWgorh8 zt_-iM1bN+x5IVC#CquQ_3qrs+FT}J|(nVe|WWJ$9dqID%W7%v`KfA@|R})2)#9H|G%CCHS5m}oE5}LR5d2b1xg-TG^*Qz8R>+PVbYa+0Tiix?<#BloFx&@?T%jh|1{D$lTf+wS-# z;X)YOLnCO+>6HJAaF7a7``W*;e2|Jn`%SKT&)3n&3(wRll|X|>4vouyP)wKRe=x+s zbXxo`1I9BaEphk$?(&WPE_t_NcL}614$uw>2!C*crJKS-@_}~8#}g{3pIu@v*OEa0 zPET(v4yY+u0_3Fed&ZaD2l+46QjIZ`yv?=B*h4@E_NlntQSw7h@I<+W7;WPCTYagY zUAlO9KbVY`)$32qP-e2J=pSTV!wo@xf#$P6f;VR_n~hs%XYQ|QHEQ{EVz7%HBjz;) zz%H$|%xRge9zBASP{`WaNnfUe#|G9`U1|J3kkKv%L~%?6~lS|#0|KTFCx)v2Jc(;n5@ zEGa6qdX%ZMgQbHaIBd=WaW9V%h%)JY66|vY{1d^|=vAK^ZOV$(Wq1{-S^JaiH6?`$ z40w9l_y)7r+z5WG3YMY@SyelAkAl<4f#v@)u~bxj*v%Reyg7JX@#K;gsCnWw_HjKt zYa!2d`ug=}opv1^1b=nq!;*Mk8kC z7X&}7K2&w?&CJkVSyD_Y`HV;X?pRN`FG~&5)3Q0q3gPhk$ZDBU;TMDm(STXIpM`uj z^6lFL2vW}b2Vw1Ih`H>q<@AZ8CdFMJ6t1hQsvf_AG#>i&V*G7a(Xx`?{RAbL!Ox+$ zFOc>fxqha5SHl5at;D{kCnSjHycD5}M6hw!6CsmjBO&dBf>VTkQzVVg!nZ@k^E(_~ zy)r z7J;JCt=GQJPrX>g@6UB4+T;j~5G8{vK}duWFZP{Jr`FWIv(eI%f^+p@o1BOPJd}8i zv`De{4ZC#z=B5tbJQhg`6x!J^4F$NmZU~Vs4YjzUCgwzKi>R3BC2}K9n-=ffCfHz+ zLxcuuo}#OjRP95rea1@Sr~4|KR3OXh=eWk(wRe7_$?9K zo|F8(dqNgay;VyAp2dhJnd!V?Pa+A%GdC@94gn6Upuu_Efqy`6`|NpvqJCeC(72z2 zMqVuQB|p34L*_2rD`w5Un`lE8UIhlc^L53QD|-1^>b}ce?(V(2Vruu$+se-OHasD;Nuk+Al!4uOuF2ky98KBRUh;=U2FwLl+H-Xu0P9$ULJYp zXh+Ic-S~Ie5O<8#Wnrw3Xrk$@ z*U4tdf_=9~SF3ToqiTSf@m%^;eLvAYg*Gd8@s6NnQ_F5dz04)7NzTY3FhV@DJ$cx-DiT-^~7- z)_rGJmlG?poalPTeJSq|LPyq=yRdW?7@SXoMkEnl8nBIiEodU_+5earGzikWpNMM~3m`uQpB|Ef@ z<3gxR`nv|CKr%gGK8@`&pAwH8XNRyn3t-Ofv-{+$-L2qo7YIocuMjqs&+!F1Ds+w# z*Z94mB40N-;K|0Zk4qiQt?d-CrLpkxWswXZ$}ls^03E39HnC-0Ia+4^R4m{QM;+C4 z_yKj6eB&Cq=Ne}m$DvP3w@&;iSWKNd1&k~wW8W5L&`YjR5rl$G2YxB9r27l;7h9MYhQ!;^OWF&A;fD*;TERC$~ zD8$5=Lg97!GpB{GmHW6F3Kta>X_n`9JtvCxcbQ&Ib#eODtdT-s#x`4EA(;*EuIjBW zc+yM9(fiwQIJ@lxAOu`e@CpjmowAq|DQ3i-!J;EQen>HZoN)4`k?*DM^-7*EiTFoO zAQ&M8A?H^~EB_JRa!FLgiap(RH-N38Cgr~VjTZa5`rkvlxi19 z9XXq(2~GbD%Kc#iUeU6{ng*(`?|?hy%P$DuHwM5tRS}cEWjz_`dM9pFJDnd`YEic7 zkUX7gpFU&BzKyEgC+~)4^eWv_@9x;=N?D+>uYZoQ#=@;*XKA{OmpfJpLHz*&jhCNP zoXlHDB(4vLRL&Cj|Gonr&U||cP=LOu{k5Ki^60VGLl4NvPKrh59MZj2?}2LdYw8{q z!tsKbt(&+e*JkO)1~X#po0Ow`!%E>lbNznqHisi*w)~zg>#dg^rRkC`1^ZOm*0l{P zr66No3GTyJ6fFK|+OQwT-e^Y%ukuw*GME%upWU6x1CFRogE9NwJNXG9i8>i+I%J(M z`H0ZsR(D>&PXlvNeuNg}i4awlF#(NPHkIWHo);4Gp$Zc-L={9wGm*?H{t&e7kUXzV zzk6sa7xVYL{6$sXRy)XHy)sQ;6YX!7^V5HJ=a007eK0R4KL2WDq(PTh)u5HH3;qb? zTVXzg=wqQ%be*H7cbv$FKz7y2C6Qk?%Y9G7*kuiX-SXaP{~tI)Z=_ zmThG+jPTkBSfk>v#o?T|cNu7~A41yX;=~(R#YDbyZu`=-vztVgBjB&o(EK z1J0B6+B=v{!I3zttUHgSw20J@#4WCHHz@hyD+7 z>i2?}QvtGmB%K379;`g|O_VM^6`dC1k~27t-qnYi0ub+?*r&!ees2Jf4R0PV=485- zGr6Vcp8JM)pNH$>dbzbTx!mb}-eu?~x1&yZ(r~F(sGOu*tXEPJv+n+1=7LJ+g@@{5 z&VZyx#AVV6?8Q;W(I@-(KXM5BX0*0%>Y?jl{}T%!4)*qs`Fag_YO3=U=N6V~Uzr!0Q3bZueT)TtJ#*;wClft782 za|k;9XliKXS=GMpM>t1q*wcNzMCC3BnHYE0WyzU9l0_J7=lAk_Tm6k61Vc7~acRig zV2N4x-e1NCgqyn|vqYwiNQUx2Vi~OYFYHZje35El-RWf-Pho6POmp!1y z>&P56`Ev!;F0z~o3M1f%@Ge)`2#$bdYxpFoyq%r*4>n^KWzyOseGF4#ksWJhT(Wf4 zR+HNfa!6)}vk9SGJ8?!AWUu*eF=2KzF-pC*zWf{_P>NyaI{93@{p57UQi3h~wjeh( ze$p}jQSv-4X4u;W%CX==tY#phIKloH;o&oQ2mlojBtM*tj(!_3@%j9m1=sV)_?oX# z3W*CY&32r@{D)1ALptWMz;L>#rwz+KtE|9L*n*y$Lwh;GhdqpO!xGq=twl&42VPpW z>Lhp6+SFTZX~I-7)|ZS@Zbp;@mjqN*MOoVQ|GXa)nTxS%U%_FAiN$;7lkwcdE_Bdm{E~M*!rqcUj)BmBdq=A`s zlG+GO^QELk6&l!|b;%1A!Yj@zVfE`!+EsPF_`5T(2?{IUQ+q`w}iMk`LPpA-;&}(bLn9 z2%dKG=cC4q(k``3E<$%_M`B`FT1}H(45Ju#o>0_znNPqGDw0$}h(SMb9U|SeO|Zk>%Y-C%GcX|G>ulBtMk!<}<1~8H>xK$bKUi48xW8b=AEVInPF0p>|>z>hPbNpW#Ti zg<5VQ&DvOT5CwueV602DKnbi}a$Th04rt z3P#xpm?$+^4tsMgMcJtsImM<#6BT2Im0B(xYGI5B4Ct75H%2i-OT+CUZ ztb6a8Q^ET$txJODoP8;hLHUG-od%WcYbZw|Blsazh9;^hSE0OtwOz!B0Rx-?F*4Pv}(qE z^i|pM6}vcn>t*M|;G>M19rPMhCU*q)0!Gj#T}RH$V!1*rsO>pzO*Zai*%NZrx8|aY zpoA4ne@AXYal{V7R&abCRvf!5z7l8QmQq`T8afCM@$<&nPe3YW(LyRYC>I0uOG0^R z&hlj>+)0oMTc5!5zY-qHe0SbuI`Q$QEzum3GJdalhMDse`Y%_hS2@H%L18SU-q%$8 zM_9%l)1kEqu?+jkqlY?d2%QPElg`ys2jHtG(BneT9LfUNW2%Fw?Fs3`Wf`JAFd_BH zZXh*JxA}z1!?w}m&1Apeo;L01B^I~O#;7G$RJ5TwUDVKgLZ!XwOAp26%yY2Dc9Lm| zGodKW?`fzZUvYLlS66UVlnW>g46VJKwGmQh;;*A-&Crl)-5I zsMyDb4Xh6Jls{}eP3nWOI~J{4Ja2J{u1X`JDFO{QtzT+yqTW^qY@FIA)EC_T)8wn7 z2mt^9SYo0d+r3&2&10aRW%+lQ=*NKTtjw%ygAlU?t0-``^Gu01Yw!Ss=~Y;0c(bpHq0`cMO^%0PYg+u_%Finytn6 zQ13@1BYu=^>QJ3AR3gN4ov8HL+x?dV>5zx{14O3_{k9Q-8!qgk$jqVI;rsoa=lS}9 ze1`ZG6t=zF`tne&p*oGzn^g6nSh9<322U2yG94hMvu87F6s{^|N2=!{q6!01Rep9T zZ-;a|Dk>qFi_F#|NLuCZNAiSwe?2tAb5U)bd4Vj{=}nDMcyTOI~NqtgH*(O0r5ty@6_SXX_clp;49i&n&>rDIiX!!TWi6cnpG@b zAC#lJBO1|Wkrtt!0#*N}XE+gu@PPK8)=1e+)SHxm--6ng+QQ61sqQs9qD=;n0vaW* zo6A#;DJhrYmI?1e=t)t86Nf$(EB*>W{mGF4t(K1INC*{EDpn=T`o{VD0UVdCIJ{Xm z?Vo?AdOezD&WMEAUXQZaIk4In@VF5Y`i~GYX z>OZ5sa4K7|So|?s2HUOVfehIWk-SD7H0H>Vi0s_10XW&B>iChteN{)Fa&2t}jpk1l z5+{@#GN{BK$IH%Z*_?i=FP!1?_{47qOqNr0)ULC&dPFQ3YsED60T<{;$d0R zf5T4hiKM0%c1xIBXrZd4IQDmJvz9piHpiM9lvktE^%Tqk{W!Gh6Mi*kY4&7c_jK}Z z?8+cfhd%Ke!)0SFBH5+}i=md4>PUI`K)sXIStW9}O-=c4;yC?IKHa|gQ+U5hrLg~S z2j#=}=>fo%v`)PELr8+1ko@L0@24;as|~~ zTxb24@`-i^SkLoEt`i2&EhV2NS;y_J(2zV+dONEIzlU5w^|&TNIyBy5a8 zbQYiq=N~mohh%$<=i>u>c06(_tQs+;w)xGBF~n(YGXh2fdrA!HZ|RU8O*K)`QBP9S{hwpHnXmJtERH0H#wUzE%;g6YKyf#ds<|3*G5%a|*6QpJ0K}x&X&MXl{hQ zvqya2j6rvrBzOBMm~glqBpnt35w%O4dPfT`g&7qsh+ewZCOGJRo4?@`(#H;8vc%2ZH!aduWbiburx+l^Fv_)vV9V$Yjm4%d**v%y)!Q;XZA$6f ztu#WYuTbC&$@*h~5B4sG0PxWUae%)11_rC6cmlRETyTA3v+F-#xB#hMuIRJ)U_31- zvz+QZ0_)unudwfvimywkA{&BN97RAff2=%oTHT9}MR`OH`hrdw>c8!TL7rw-oC7 z!3WBn<-T2`YPkX@81WKr5xSGpDY*mNp!mAr^sBp6Yt zIU|If#dGOf4iTNV*+#sXKI0`;P)YHx#u5`R!8>Z&oh+~6cVZp%=gc;6bnLu zziXse(x2UO1r*Gp#c5*G@BAEt0G?voy&L}i?M(S=cva^k;X5|PDcVUJI!boqc!aLy z>Q+i7UDnA6FrJaRg^}6TIDjJ^`}Y-QU!==)pVet7cTU0@Z36%@?Rd2@YTP zJbl1O`O?gC$rFfYvPfFIYmls|UcoUViu+GQT^eNlmVYBYFhz?ME$mw*0dc8XkKM)9 zO)PC}|MRY!*gNSl|H<;|y}+sTX*tcV-ZP=6>m%8%W4?AA?mRPuJyT!s`Iye17ru6Q zMQb8fR;V3}{}Z0arLpnG(ZR(z_0@~MTW^Fk7NnmprQQ0y9eX$`r|=K;gpM`T$&5)Z zSLE#Tx;yPSZdi=L8|vaY)AQ)E=sVJqjTnKw`Fk;VvBq{Xwmqi#%?QWP_YSlCdR!dU z#DG=RWgaoF6um#2VSF`clLGjhZu=!kXz>I+?V>O;4z#qU5R34MU=i_FO-NPYBEwRz zerLC<*M4&Q;sns}f^ec_SJ_kbR`xq!|8s#tFQrOV=90VKSJ|jPHMSYTu?*_@uE>a# zdvDgHWe&Rlk&hee5~%{^EFcX{%=CvR%`7SAFM(txD~lDVd%(JB+>GapN1YHjJ8O-y zXWiVq;OAz7Q5U=p)awpq{Z-7)$&*=}4}X`R4tx51)hx$gQ$4_i(CD{zs@ zg93VF6Gq7mCWfNf4H zb2(FLOV;pjW>pGl@p+Q--||$@mxmye0DcZZ33#O{3z>f$ZN+Ir`t?PT$-0n&N4K^S zKHf(0YPMu9f&L?^k1M^UV{OTwcV6#J>SwdAvL!3@fgGE-O-=8FyNPwscnW5YCZuoD<{c^5tU=oK5}c?p5QUXiny3i_=di0E)UfrKL+DlRgR z_voZ_JM1;(J&4qLoj0lqyo)5*@o1Ys!S?K;3Jb{clQ|>cK*asS9g*GeC8Po9NM(I; zLFq5pm?ET-IIS`j;U!4lqe}B3DR0gcB~~NZJ6zypBKQGZP(hXxB+;~$XV*6)DE`R& zk?1!hk(M^YH&L#`+vn^h?O>zeRA}VLq1Gf22Cftou8dY8DR0&k;ZlGUpcnugzIg2S z5tTSnzAz!5X&D5$Wynu=_6z!;T(zJggs;mHtxDtohSbj-!&32UEOPPTFS+t=N!5om z&|9{MIL>IcPyX`1zBpR>IxA6X72YM?qk2>o4{YdRorB76lHif>YvtMX`;#o0cRU0wF(akUYs>a#AI}wC^86tNz zV3SfNZ#pj9YbHHRuv^u^@oxMazS*mKVqfC5UgM_4@xBf@X)n;GE?K_{*eXCd#%s2f zlUf@O5Y3CkBXL*-wJY{K4^B$jYMB&;dzsb$w`O%$GnOzKeNmbk4ttkhc=Kp66|Jp? zryMNbDRaTJIXM1 zZBNZ&K*?kAQFX)!q88UXUd>vKClN?#K*SuuPGp4o)O1BT4$YHoB%lIte?GpajK9W z8DmuUnb2@TyQ&d4(&YaE^mM=yx1aoXb zemp=rFaTP>>f8gzo4uHKIjA8qX95ks+t-ywK!>UJpXbq+Asc`DypgI!-ZmuKoKhuN z`sA1S)6tCxln*!43A#=IXY+YS zjv||3(0CpMpgSgfJv0&TeB>$I3d*o4Q^lf3Lp+@kL(7WkBYA82iZEZm$k3WvYK7%Pv7>se2yrYm)^MsfyETAU=eLK1j{{V zd*H(WTmYPkJUAl(9t?Sh@*a{HBrgRE%{rUVwX2ItcR1(P`HvA4CF5-AQc2HI$ zw?S$`2m*rRMQlc^4Ngt$0CG!)fK0LPJxY-0`*YT610Hgvzg%%nA$qqm7(|S!z82AT z|Nr%nF*1+ALQ0DlQKT#p6Pf)5Y%PCE&h2*)6<^2%V%DQrw*9EVc;G*>CesaM{1pAa zvuu8;;$U0+0t*b?J?Y?3kSGPHP`p}r0dZHFyUBvFo3|)WzE5=D7tOan^**n&j{QsQ z+VK=}t3aP7XnxC|Xo_8hz94|d1G}lHyZs;&wmN~yh68{ z^~?R-R|>VZ3Grk#F7LUI2YpCv<@lGe)p{*^#PggtvfH3<-G8&--;95H{YGYT-ko8* z7(n=gK^aJ=pw-UAp#Lb^d`9*LGFlV4qv{LV(`y7*0kw=qR|B&xP@f2XLRFM!kKGF! zD_i7ZdGjH|RVMG~Ju!CS3^$ujx=oB7+S<>nvD7|8bSf7-DD zx{q8)+KL}HSow6 zxyt;lxO(c*?eDHZYAjzDq>QJiIfSnFg>oI%P5*B=&jzAKy76mQ9;Lm3lK~UMr!GVA z+Xr{Ob}lbaL`(yAbShFYj+%2NTI}! zjYXHAvp__#ogimz{Yf25_;1Ro!;B?c=-LZZs#?pdj}>UV{c$S@4{j$j^$qGP!?8H= zdbuQ%K6nTDP0j8Jk11>Xnl~HUD5DLq$CT*pL?`fOUkT5ma4S9N6S61P?f&688y&M# z%-Pk7zO#ukQ)#5>L3+uCdKFJP`Ar1qR_i25PpHK*#`LS{}%8V_|df%NQeKSq4Q*60ITtL5z?4*)gT;}`4ScLuiuj{j) z?Gf+1tEUINpy11D%nDU9<)iHEY%W_N&%V&v$C(QATpdhVU?y^=!iSbA$Gc>H5D%7DmmMuAx@jF~}V@M@L z!?+8sSH)P??byEMFt=Mgeq~vV>?d-eVoEqpX%l>WN_2Vf#IZLWaO8I6@(rP3J77L% zT2jMUgo6|t{f`mW>~;zRzd`%4DiTgJ!7;kbuaa7GVAj^Vj76ekkyougrhOnV;$kf* z53I+g@}uT}s;DjtUUAN;BbZT;8glmNl$!Y}(T=LnuZ}FgQ$YXYRAUgeN}?We zaL?O*teS)3cB5bCXKFibs;h!cG*4*uby&1h5AuBE&?^i6pnT)!Lxh-ZqUB2~Z2W)Y zCZ?sO;m)+aEEy&8xcV2YAlkt47;jQ*Hq2Llw=xuTL&cR}z72w_h6AEPFYdqhKzsbD zd0gi6M8oIA|Jb4|7vx|h%R6`G>0qRT84EUReo{RjG=O($*Gq=OJn(UzmvD-y|Ji(p zP)BEzh1H}aQ0~NU$_nT=RFP|Sbx$bqSRMymQQR6l^4aoRPBm*Q23?!zDGD{6`*|bO zgyMiQl*1tOtVgctV4Evj@nX>$OGUWo9mz+CGLKffoy|_TCro$+c8U=-p(^8nxjq)@ zeP;o09_gZ$RSj`2$``&aQzeJ;E~~k5M~zT=3T+)%M@`%Tr4;GZbC{@&*6I*Xf+EW{ zi2Q^69I@$8i7HxB5R&>+fOD7=iS zv7Z2>{0I+WhFPkA~%(&@H&9gMNL};?VNdemaCM)~Ra7!nSCg2 zknYGEm=YMmU0f%8QG0)?UQdcezT2sb+M{?-=f{JTM}J{Z-I#NWG)Kau`240?jq#Zf zs6+Me=rOj3s7VWy6_Mh?>XWEgbP;4iT_8S=vYEVLQL9zu_r0uBpc4qZMmOk=xZZGp zS4jR&e}q&5{`>Gch2{5@EM?m?5#^o$DBJgoWPLUpzB^?o5>%ZF^s98@1JMk~+$Ck8Ae_Y; zI^iic(Sh+(3ne6~yopNA1-Hu8<1fIx&&y5JDqFtHZ&xr$r4x>H^sUtlQX8Q((wfdN zGNaGBI9Rjt_^tHCwqoz)G}h)1B+drmVX#1#q3a$&`Q3E?wx}_7U*6$jufgzC zG)6-=Wm;WXv88re{@7y7B%7-5l@W|l|5sn!QMeM-aCR84){nJD4P8eU3YXc&`F6ZN zPHm^-k3~k-%``yPR}Qf!%DujeRHbCqg5--?<}X{@HB!85gwNIl&Mn&_@TXMRmBjt`01+5h@i3Rc{57Q4%Uo&sLD!E0Tq-Ra^^iw6r z^l)Femv9l1U^7V-{Ll46tmXD`aOW=>lR;idZ1)AcN+V?c563b>J&{W7XsAj>n_6{f zydqmjgeBP|moVlJUV+ZY(!x`3#o;17r_}&6%H{G>q~yWhx9KStASUSo(v#ETSbJSd z*vbi28)jD4k=TqDPt*@d^M80@GF2PkA)K7ZCQ$=WCLNMA_looFd>=}NQ0XM)BO_r8 z;_mNx@2Wir-N+jlBB_ea2$@CqgVOm~Kg;*RKq{5-=!}*gBGETN%DVNRmUTha#_8mP%$wrhTK^V}OJPD9m zN9!Jb1&+II)No%KqgK1VNA>P~W`Qh_g|YhH>vGf^KgE2rI@!-U zoOv^L2sCtQnyJU+8nxm+HbcR_u-bv7(j4ry`bkki}| zRk6$?ck9Sb{+LR825ICq2VE!(YNTj?cw03%5aIe}2Z-0lb#b*p-lL7uVk~l+r%YQX>oS4Q2P3HR9Ls6psFa0lOb}cc|C^IgvYbZ@41AkIB z3>YRo%1+ofBaGdqQMc#!n7Kz8D5a#c z0_e&Pj9(j`+ z=1!X#9(7+EwOh!3&S9+Aqy12tXN5bcX_#9%o*JCW~LuAswEbXL0)1?^rAuQC&^7*R`8oEa=mBZwoGf}Tw1?! zYGH4s^N6U!M`7Qr%HCq%Y=n)kVPkDHvJ8pri+-MTd(sakyfqRZl!Cbco5`H)Qcfi~-8?EiH#dT$+$MKdg}9%yAXb2T0_VtT zQ5hiysHihHfBSs%J1S}JKFl4%mXP?Ip`~!M{RxN{3C`od{GOqBjl8xVoykCq0 zaIGOGRvxrJ^&i#ezTILCOU-yEE-fwH*-?*kyugq=r9ms@u8-P>?9 zq$09RKn4TbEbfRO>v1!#hlIuT>KIMgy5D!KLCaN?MhuNM z$Y-khwZoZIWRud^<>?=S0f{dC{v@eNCx>NRI&S4#mstQ)mCI#1_F<89ukSSb_q$1i zapG7c{dQKZo+U)W_7vbrLfz{Nv#XV8@Au+8empLkY1n4{RukxHO|)mxE%}M)5`s3w z(R`bZuZ?;X%u$zN1HqE$V(LXUF zSbc?;+nFIhCj4|jgUR~T@LB1JPjZ*FuUA7SQKD;+?=#;$q}W{dm%Yb@;5nk(?|0mY zYHYLL(o2PthxnRz%lW5t#?-fPxeffZBYko&Drj z1e|4$S@8Jlq|~m;o4hACsHrxN2CU9fgN1 z#fS(94glR9B`ms3E_3*B5=Hv-qvh{DFa73Qw(MwWxO8Piz$WLFvV7+e&{)oV4f|dk z-1BcH)QSivG<6w%F<*O{VEV_Btx%LsK)(81JC|g_G zykC(RxtGbx^FYoepsi&+7~eWoG+&TXkHY>W?+`_EM#pvmGxvT8*xK*`MlY|SsG>8- ztB{d@i9GaIo}Xeep2=~TOnZMSt0Qn5Qp*i)_s2Z^@%0LTBuQ3l>^Az>&I><|s}+efoL{Qdj){rK%DGt=k2ZZqGmImBVu)e7=i@!3o}Qg2_tjIZgU z76@pa3*fBzo${2X&?^|+w_9ahMj|iu@8NwP^K!w{p{J`(`0mf43pP3!b{-Ezr%a+| z0g3lN7;sO3 z{FA!S-kXo#*WT=((Ov=^M!H$wD!#PzX8na=+D#c2(=}`Mb8&X7n#CnW(_okj;LSjyJ`|=(|Gj4H}{Vtqq>DG<1aQpN#=1q0b_vh%40H(5RJqiLvugFuW$f!yFIXO|e&_rkYp2eyb=|TWk^m^v>zNp`A<%ExC_O+j%nr?a;uN*AVL*#S$7FkYmkCqvC zg#vhK->l19ies9Ws(z!_>6f6M?9p8}o??KjBuB9x!dUSz9pRqo{Yk@Uo?FU+K43L$ zZ4m^0jwX>*DTp{w=Wpx9+7(W-Hi15$SvPgYXk_LaWNp6Pk_=0omJt6~9176&P$bT{wR_=$@3J0q)HFL^P2ks##%Kw5)e5<-6* zuW#P51A`aX%YWhWOZcHbE9iUJE5D_F%#;};_}@pn|3+Q&f;|3!=AELfK_pbYJx-sw z7__e!px)W>9u+W@j#vzSyY|`m?cVM`N04va=ZAw6&w>Z_bRRxny`xOM@j!UFhJep+ zgaI1<_Z4gmpUp=ny$g5B4!)%K*mgU|-RxU$7~bAgJFcW0&49Hz)EX%qLat1oz#bW? zP?2xTkBUc|wWC>2krzSv7&naB8lUs`8@UTh-wU)wJi60L2J?j8I2I20EL9~f@v}zc zXy|TGFY_D9Rma>AoP2tX6mopow&);Z?pY$A>#<#-ly*=NA^V-Sk75t1}qU}`R zljfx5w&Tl3EMx^z4_yi*?f9qDVuTX6raLZjFUVDBgaO zI8>Q+vnHYjeYY2)X>$*UonSZ?dr8bU`UGulGi&!oko{yFjWPb5?Q-k1;a05Rrs9bs zo*p+^sHsBW60Y!2BZI(+)yr4`?>fICsGohPQESzaD7|U`>ObuSlZQ??W)z^cARay>&DpVL!{UM(+-W03fyJ(zQ%J#yEJ$P1DZ)D zf5v+(-Kg=1o~e$;Q+OvNX1CT6?`@Kn`kC-*OLYKjrhY#Dhst{C3sT8_lh!g0?$NVo ztM_)dZ!EzewAk9i6CcLY;O_s>V;D8NXS?OCSv8*-#`)@x@lrn=)-lK}6jvQ-)(n?k zEb`6Tw_km!!8whqYkre{xFgQrJ_Fgjno3TjTVa4Bfedmii;aGEY4u@S)R8M>N z_&tX+O#58ZO>$_akveU`47Y>Wo-MmquO4n@3pVi}?NZy|f{+|X0T+_rel0ARS(v|P z`R2Z>f4)i-RuhhU7g<{?1Mi`Gem^LB1+hfXY-#C^g*ohC_w(LEShwme%Y=Wb&%@R? zHf~-Xi+t|_$}rtY5;*SXN35fWh)dVch*z6ZAVgFUikfGk-=|0D?oa;FqeuCns=JuY z=C^r}gqzu%&ffg)-5!=7&-!a@k*n64%a}eA;-pF&zGy9vV~%9b}6W zE@m5Bk8O!fUO|SHXyp7H-2M!`6Vh<9X7Ls)#7ps|NqhX^<2D1GT;~;No%#sX4jQD| zk#=*!%gK|tyc@rYRPJ&3mAJxj&;69pNFS6yHtA2T#OdSFdK~9BSnwfEBe4BEUDM0U z%L0U+X1d7gOKe^vF%$wwqcumO9N04|BvamrIcOIADDsoF*s}cHtHr~mWDj`?xR2eY zv;NQo;c~b+&&}H#eg0=hZpXJVfTwvurKrfghc;1$ofB;1>`)VF*CAqX_2oGSm&zYLd~hS-MA<+5Q=VaRDbCNff3r;eWVXQf_)}{+GVQ> z@rX?u<>ubR{B+qjwWPr#4Jm19JQ+gIVEC@l9~nQ`ym^dN1RAqOgFR9c_uq8LQ@tRx zW<{KO?+Mz0)P?i)Ee}}83sp-xxC$p&+0~P_@;PEB)Hzr-FLNVS-b8`T?GNsL?&qbU zhsd|L+JI)xEWDh(kChr?4MD$+pXk!N*3ZPStPBUBcZaSFNcMv&tZ*Add=Co(NCMqZ zRbKIL7v zYgzx;cn|Z_hp}g~W5Hg!1;~@E?hN67jZ`A) zq-sRjN8ufpm<L$DYoQu2_IM!lS^P!5;!$|;~oV5fWdu!Zr)8FyN6!n1xd~&LX-3*he?OKSDl6s zV-FnP3M4g(L*{x2IW^Gz4H(S`J?ZPUAkjm3&hXc|jeP6p`OdEvhl=zQ^uU3q0IO$C z=V*TK)4nbt12Luhq{UmX4B+RVAv0c;qBmCHS%ajn7Km4HL4w^Q-yR@*Rty)wVO(4s z;$iSi$O|)Xt5_{FUEJIfVXtNF-ZQh?2vRqKK5eH`(*ZNJds>LgAf^ z>^)9e_AGmxvWjG8r{DD)`g}g$U;pXc&pod3y6)$G?$>nzQWq5!Mf;-kkY!TWLNO8q zgm<)sBkBi+PxsM77QsGI6dMY@>@QPupeZ0*!;5Aa# zc6N5bKLqaAd2NX7;p*7M+w%n~g(*al|HajNXEe@-BFWksnvQ!y{%J5L=!+let7O-> z9~UEuQ9m{vZ?hostHEKIWB=gbAhlCCGNoM)6#Ss+Us_t~3>epAOUxlg7#Ca70m>Vu zU^9*|%>uqAF1y}9wA|a*CwU?)?D`HZAr|%lCJ&JYtaIpSl1ahk&BDUMAAq-ruTQbt zfUiftJs2S*nRtc8p%8=w2(hAG6RGdy6q9@tDc}cN4mrW6!KVOjncyK0#^V>r*T*QI z-c0Hy^dZm7Q}5_K=7OK|_Rv^)wtk?j{6`p|@r6A!rg`k^7!)E~nsyqnvb;PG?%hnK zdfuv4I7hKFaw_AuB&D?UKS*`V#^LJ~ULq}BUA$0R!$>HHebe9Y7xzf8JkeTz;T3G% z`PNe|Ja**%0U;gzHxQK9dPBmg1r@w(3k}wH zzf|k_HgjU~q1U5d4Iw_dsmNbfPHvnRS!8*(p%7$AQd!*Eot%N)2BfL*pJ$UtOj zEaeumKb$}*zr#iD!fN+X-@>|+SxmU=uM+{G=aFavLyg%`x>Jp*$(ig2%MRNpi+Sx@ zktq@g&He{oGh*Wxy-jXm>}kDNhofqCH;JU*_u{5I#h4z>#GjgFUDk8D^puu!z*k-e z4!(4O@S-bAsD5$_{2yv`>}AoH1EMd*q#o%Pyj>SBpo-o%q%R~P(NT1+w*AMSjtBGh zuXVj&|L0L!r(?B~U+rDzt9LzB^Y4NKoz1)umVT#4qMak*Sw>XkDiTyV61XVUroQxD zh-41?G=6XUQLl?lT3j52{02}I>Q1-4tB=$>n zkbg9Srf|)Ghia@Qlp!dy-;Q{$Sx)Hc;peRs5DSoM0dOG(?#C<@;C)yt8p%HfL+z_r zkTgUM3nGJ8K@k!u1cj*@Vjy)bGri1*;4+tl3_|jGLw{mREAFEYD)kI$6Yi9V{rq0h z;~FHN?thJJo#@H+3`|8JYc0GeC|5S{SQ>H%=ixhKtRRy<-{pndrWm7odvjpXF@Z*olrwh2A3e#*_@1ffsufGz{aO5T<7l(!8QKu-*xVDEaxO!k_OEcSvAgIvUc1y`SX~&aJ)w?7{m+Z`$PX?gUuZGmG9kLz{fPH4yIpx>x3iY)VJ7v-vblL9}|OLHJn- z#;l1+NlOt`+;>Sa&9bVw!_!d0r1=ju=VXB2JoUP|&7t(SJ!>Y?(Z>!&&rbmmu9 z#P~%)#OIy@x~t$snGQwS*t-k zo>R>~Kjq4EHnn+Uew#W{xGsvOvN-57x1k*}Tc6{%jA1g{ea{m%3} zzRa~BWNCw`RD4}Bwhw0kg?-M1A|GJiHJwNX%m?2A6JbMs2Rklo?}H~2ChQ^WTCs!X zvFWL)sq=~Ne0F#4&&~>c;yD^Mp@`DE=K8)h|5Aa9Nk}D>S)o=mMe@#r)cKZiBH_1$ zWyNT{P=l~pYlcq`@)X>~MtfUQ0ih-_^$+`5)-hGwE--ZTTNOqJK>+~)O(79!FtoCb zPiUL@PL)M<{8db%;_ExRldilKcSl!O_qD#U%O3DUpgKirumrPiD`zc1Ko2fxO(Jt4 z%@^vBnHH7Ac61WTyV!(FtmtqeZiQU!lao(bE-Zs|!p^`jhImGd1^1V+r%yR8h}Eit zqnw}}e*PTs2UCT6;?hja2*2g4r6o=4#WZq61$pT+adyrNYDW@J$8DG~A+BH&jvZ9` z?P}AuJ9Kx=4TkB#K@Zv#_Y1UQBT;$qo~!qmi8@yl%bLBD|Hc!PGqoi+h`>Aj?5wNR z_tt+B8a9cRQ2zt;a9iTm_lShSQn(a4?45&3e8ttUC*#XPQdn-z;1_sb=N|AVv5vm? z8@)qpjWi#}cPCwcw1bJ#zX{7ir7hX%cC8F7%r;wKaaEes1~S4Iw$yu)Txz$gIpn1S zBL+|o))_G&TcT}QM3KykcgRNjIh^sUF6n5UIe4{Tplg2 z;q)(p2fsh__cq#}&ws&K|4#EeG?*wmY_pL{9&qsn*`WVH``iMz@gk6aY(o3IKfsUZ zr0h4iYLl^DLQqTiF6n2Ns||ZxLPcya?aC0LgPI@|_^%(`$3Cd__O#pj zB5)-iySThxXxmq^pno-jx0E{U69MAEjuIzQKZp6SN-q*ol<==Y3}>KE8@M!@N&fZ8 zvFH=?ucZCyx<@X+Sx49Yn+zY2cmS(bKD={>vx)fus-*=U4Wp_zyxwj^@dEQW8*XV; zS~F5UiBUPc;|ARWx?h>=1?PFf^eE{x6liJEzoT7<+-~OB4v~+33GJnA0TY(4AfqeN zzPC#=Hz=18(k7mHTKbE(%%+7m93GN;H1SRQBUUOId+pxbvo7#$;}5Dhj#g5wKC89j!CECS!pflG~0rau6cKz|FME#J10N z`|Jt|sBu%3j)BcOYw)S`f4k@t)=Ky(&^g>{3V283zkc@IF_-m-7?nKF>HK>e8C}3A zI$Vg*NNyuNtpHN~`Gu^p^w&K#nM5c%U>{9(cyz`Ps-p0z9fOi8AePZ@hKvcVP8%Yy ztdVM0vl!vgo30sSBNy!1oD!RU?GJBz098rA1jZa3vz_M$ig}a6n9Wg()mgZo;Dc)T zkET`XK%;7E1g=wNZ!Nr*Sc_y;;}=%*;#_B8)vL$Mt+V)H)hkrmhx0OV32CRNp;NH9i3%s`vGkV1}K+i|cOx9o6JVq@>4j z^m3LD>g(k;;0t97u*3BWIYFrh;)kyv&6#yAhyRqik(QnKYu6-1THx|#cCG->7#8#e zrDzK93-`ryHCpr!T6&VYy0zC;7uv3@ z7%`9LZ^*64>F9?(KnOxkzur+KCH-h`gCa0xu5j-!0%*FrX+=fIWtupZLx5M!#4rBy z+CwU)m0^s#GJpOV;e}aS|5Un)(Jtg2yErp~;5KaXb zhkWNiRg?XYeE|An`2$oWO|Xhj2gSsCVvypFuSkvrwQYFM!0%usaEDg3=Kkf$5Tug{ zKbA*hem3U8zY_Wqp;}iFM)hPmK8Rrzv{W=c;aDVBnK-)VfXz)Y|5fR*jB=$>Ha?ZY9oHG|N2F15tYFHU{czaW?5Ez>4Xw%FKKmJk;ml z2oQ>8;oFmLMy%QMxkzInoaz_CH7Ec~GOxWBAlj3@Gj9h0T%UXAD@4B)65j-3S>FB_ zs`@#(z2S1uNu=R8E@CJ#)0KJ;lthmIN`dld_uHILTsyksRCXd(&Tk*3AJ0C2jx?g9 zy7A#)=GMziK2Oh5@$g7B#yzx-;^1t$TxN~kIk)_Mu-3`V)hx@b%41%jdS+=h*l8pK2XtNfIlU};+7MLkW##6hfw|xf}Av<4h}-Oc+4Pp(#q@V z%Ta_ia+1^U>xo`swBh!Pwz~-Zsmagmz{FBiL@bHhLAmDOU%bq=|9HDW_#5-j)h=m+ zYJvzMN>}}{9>Qw!ir*K+F0qh?u$ly!wLmXxl=|xisBZLggZ<;`&5{dcj{3s~f}Ffk z2~_Q-orIxvq1Omi@dK4_Y~#;64^=$Av3Yd@kt+5Y6)>Iz#t728Y$l^Crk|3A5tK)o zPYUmULnV^;_SBz+U)4a+SaDAZVc0nzHNZDUsBXsF%T`{zP87eKC4O%#eK;RjiQfWb zFB`j%WCGPd{Rvk7t#z#Z!=J&0fxC+3D%PmOt43JGzWDn!SxG(d)`(z(OGc;l)3ABet#Il_|}u{vw-^Y1OT8mazb`vDv+ zpiFToNs8jE?6K#Dp@uBNUa}mi#_*0O{^x}%k442e^!7PPVIyr#6Xwvi?(>bOUFHa- z9T#GB)+RpRy0{F&_{a$CrIw?Ys}c=XhX_#CBM#Bv=c@l)<|E9WFVR}_A;Vx`m{v{H z-BD?gXcA3UXASr`V$4RgfXXm3}H5uRjq(~|;(isKl-aVOK(%-3?i96-#) zas;mOhX5xEu{E5c6jWdoTszE@Y+;;A>viL$O|W&U0t^JnS-OmI8)%suhaLbqF#_p^ zm9`?(%lRIOmZZD}TU0Lr;F_vDUd|!AQ;I~A=Nw;fqAildleZA&QuDWlh6Z^7DKQp% zrj3~@gpzw24ty$gIh4eE5E(llxn|JORSe8=uaXao12@J1>@mVj33(VJ~t%8kBg(CZ!4jv_4*Ey9x6o*_&93czb|v+ z2)37G74UB2hjg@MNpxKUP7~CCKXB+q(+e*WDRtr%R;))^jKeqB5m<@>@_!;k=>JZw z#srF2WSp*Ne_<0$#lEe1$eiEVIo?5!DAQ<{Kl_xJhsOg<}q}w$_#&C$@ zbPG67@cl~V@lw}e#3&r}ie-;tp8Q+m!c%Xg!6BCQM$c=Cm0wnBDNcOb*z=1W&2H4Y0CN_CPYnPwyQO*44x0lnCEvD1(pQXE< z5kjiA-u$Z55il-_4I>6*?6+$B7q!hyH%R2!rpQf|J1Ui4ug9NYb6Az?xDjJ2r>lFM z@Qws|N>=tw75n>uF^S5@Yi!mYM6~=G} zi|@Ld&}Hr`t6hZDyNH4ae^SbHWkSbZeCLhXUGi6%>-H|s7WDlUALX(r)gzH~(#mfMuASGj)jxZ#5dy3mz-IBt7-t*GE>yH&lBsxOHQPT8c$bNb1I&N_9Kd#wH z&>Qp$qf>Svp)3kPON8JH5IzaK{%7x4bVc%!^N@J;x;+YM!2b)jz~NthKK>u%03foi zUy%~}g?cCTY+?FQ>-A0o?;g%hO6>tB_^Yx*Ln^O`bgiU4D|-pDBXCE4Ymv0S3(gLJ zjBot8PCHz8X$AomIv=!V1QUsc3J~}%MS2kC857E|!$ksJHUt5g5Xdgcnw5?Pn~hO_ zwh;fQH3E!|y{sJJZcm=t?Y|)JL;}y9#!QACk*I-1mj2PvlfU!X%tVfFJn#zu!&j*(WOyuAm@Q*|vzu03H3 zH9HA9WQUt+KSBTM&BA*SAK{3cIc)Xwzj-gJmV;-ThkBquH&<`w2YRM8_{T@agfLOb z_!gZtxR&y=Dd9frdWrndp+1@Q6nCiz1_TrV0dF6I6aksNHem>A{+shrg-GkHCD>b;i<}c}nV>=N5P^o}H3YOf z=Xm3rzro$?j*rm_8++*h9ODoi52hu)fKUql_4ET|iBAb7fu_aIR}z8Li9FjhN&6qx z!Wj=vkUtdCfv^@%2wCrA3WrnxCUGt3z0p9>$T_t`9anVj4tRo4>TmI21ku1QEm5R``jl0{8u!3r? z_;>`vyAiL2d;qo>AbVv~#avT^VoAVUE&4Oz7zix-lz&r(yuYOw+{t|W`#tchRF;$M zfiFO3NxJvB(@1!EuGZB!7AVO>W{;a7QH@mtF#iSlntWNz zhrYrFt&i%v>ENDt)te!?uVur8usO%?hzBHlusz(_R?@SJF0rhV_w!(obF|y#2!&Yz zW97JU<}I!1E{v_OCK@lzSnci~B_q8^_Gl$rdH(BL^6VR?2#UEcn~^5e0||RdHdxqW0m?p5F{$ke3NoGWB753B;6-836Z9W5 zk)6h3y~G&tVKiHVH)f|}G_lm;CY!@{D31f#fGc`{T)Xu}BUj@g)Ol3VYayYDB3b-U zjP4bO(2(;&hK6D+MsL%9*6!B3S6f}2&vqJo-*dp%`KH~y?;6X088`R!T#7Du zGwLAMAX`UP*L}-jq>PdNNv1&mgh3#Wk$WE*)n8-cClUQgUpwMhh(dJXFf^5E_E$Zr zsia;!Mj7&H$yaiLT_!^$rXnc7yJlK$|LSTHF+_yvqD_yMn|cF>tzo96NO2`;52im8dtHo@7EA1 zCZ2&V!u}sq^kh%sDUt`>#>4B{WRygrhYpfMLt2N9YnV{~NtKw)<%3`9jVdy<+P4u)q z{d?fR%^;DppBK;R)EsBf6#5E1YNw?-`)Z_PAcr13pZy z{tJPs(Hk=hKdTN#hmH5+e2bY`IF^bfx3BOflCaTMB7uv^_#ap)mwf!gS+$giuQxr^c@bnr#GGc zTZg0bN@ZxaI=FA^y$?lp2dEe%kCfZ`w;Uyr$JyE0U*uZ?O3R^;iAOuyJ(-4kevPyB zMpnR?9dWDP+_wRYM+&P1?wr=*F*o~hCy%X{QWex>E+^5er!!Oh1Q|ZF5@8Z06!=rs zlS#~7T9RQ`91Z-!w*!5b%J&46@}r9G*mkLOwsSSzc`eolsjd!zQg0r!o_QF)C9%cP zbR6hn4n`@RVg_>(C~%w%=4RS-Wv4%zzh{L(oeC)HjA>nBil#?zwvKczQxYb(_H~i| zOI=P2rnVKMSKTKdGQ9(d_R|(PjG40E>waU2Gfyg5jl;{ndgCVySKu$j7z+TCfc1=! z!PP5aPXn!EZK6s*>0e=pK1oViSdyt<;Mk9$p9;JnUW0c*y!?nI`Jk)^o!s(6PT#h*~XVh>{!KhfMi zQmVbz-<;%pTl(~&uSWVR6kxjYG{ZL~-$#-G$nY2qa9NL@7?cbplVEFtJMo+GsuTHrR9_AJa1M`MKVL}|T0ws}WT9%L<`Tj#> z1WwVeO>u&MdWr?@M;c} zE$b|%Kdj58-`CzLW9E0sDKO*Sm22lpt=9HY_39=R96#=jtYYd#n81+&Pc3svR{frx zC5MAxPeNJ;e)^dDky{DkZq=i!z-uE*4(<;>YJZ#jVzG2d2eZBgZ|<2Do7HsgQn)wA z@fIDAEFn&|bR&Vz9|k>6nQ7ps$_;h{Yv}4y`J)Vh0{lFs;Pp77g4U}8U2^6FAhvus z;nG5H>+JsSIN5QMQcRuj4BxrgBbB7Ix&Ux@KJjY_|G5iPSQ2XTZy()u(&p`y%J z1wB)C1oWM{+fMC&{u>s7t7tj!RS+BGsO@(B1}4|L4o_rNuKne~(G`JSMPS@5UjV_u z^~f1;36|!QfcGvB5x`+@BrGG{teT@-zt9$%33_d2KgWv1O(RieEtaBsqWQm*5KUCL z^xr&i3h|q6K_Z9D7Dw|9K`KwA5h=o$ny%npG@Jq?UB$w1{dbSuvpeln+rK_Z>`RMLg1*w&QG-%^5}SaV4Ci%9)z$V(;@esHuL`4#Ykfw zrrGs1_VZ9xDB<)$iSXL=&t~jbn47PD_3M-{m^+480?!%U5|>xwvI`9d!8t;TzI!Ot zeuK}q9(5Vqw7E% zh!cR(xY(%xa~=<85?iynePmkwa9vbY{!{r0l;#Y))WMpI@ZYL~&Tj+8&-T8=&YR9}TKXTYeaGQ1o7cGo~e~?H% zH5-8Zi17VmMNw~_>0JhlNqJTJjyc_+VK5w7Nz#u`_E5j8m=Q56DO8u_=a^0UmElu= zUbj<2h!I2^zqAg`xEEN_0}1R4Rv^;!OM!UNNO<34?R zigcfd!C9O>$4-!XaK^pwH}dZF2pP;7`l((UuS2XmZ+-mCOzI~DAg7ee7f$WGt>-C` zr1i?QeZ|B5g4e7~Hh)B*mUc;`{`VFQ;D`y4oB=7fT zvai0bu?D*2K=cWT>Ck0=q_RHAjB>qwvvF?h#D^W+9CiU8(Ia<`%E7ory`L>jol!c{kNk*Lrjmr$@?)m#%5wI#X8@>?oyOgrFH_PolwDo?sPr#F zge+K|{Ga$*(UB+PuLjq{Yt9)L*0d@uaW%y;N%5yPO|j+gi*}0{ADO(jcx)a|JWQ#3 zz`>ZGDj+~0z@G1Sl-}Aiv#hNLT7B6`53;L1{e5@tNqhOrX+5vyu-88FJ($hg9_>E+ z+p1nL3X1z{(Au3|9YH5O2$DH~M&&os61%gOBoChctU-7~ci6m_G0)!O?&Thg+sk}{ zAHO52q9l*TipYUCz2|PYPxX)$;VGU>w_8)D&=2D+b>&83zI*2Y9CD@eLGe;Zc*o>V zej@8A9o2bbNk5gl4GP{txhPq0oI1hwn>eH=G`&g*C?Ucvd&la zG0CG_wy4`x{_`Q+Wb;VV6NSKevY`m4-^!qZt3gy2$7m|*(@hI28rSp|mD!*{CQQxk z8vk&&=CQLheEMTI{Szaza_}EMe8`%U=*&20@dr+#9#Zk~e0w#rPtb+}KInauPFgXZ z7v{2)PohAb1mU?GlOcnKU!RqQ8~QjUJXM~3_B`uj?{d6iNNqRyr;r*d3uPK&x8}n7 zqEX%a_|ps5b^b0g@aoG`<0fb?8ro3?OC)|e7BuTSKgw`rG(e02RdK7qXf-IQU`Q^e zF5`FVd3SnD1_4Mwf;Rl--A^ugUZ;0w=$=4(joyg4qobqqO}gp?-rtFA4Ixen zOi6>djY-q~`P)gvqfwHas@G5|KWW7c%iBh4YcwRgHz6Y#ErYt!d%kKi-NF4bD#R`O zKl1}lNsWn-7)j#qAj8xSfi$dM_h!d4DHMaczC1}UhGRBqSXq~O8HEX)l7{iV_%go^ zhV=-+dvC{{;%2p!-v%5_fT})WwVWpgt!2syR!=cEuCxb;X`m`Tw@>q_4%rwtuO*f2 zz`;}lG%Y~1WAbVfzD#?^AtQ?t*MgGXG4Xj_BduE6^$@aZ&5Hl>ybQ=xJqm#X>3hAWkC)89JI_x+!C6L!Shogwy}w>0k?aYr3wnpKg`U~%>&a-dehHp*=~zc z^;l4BfOpS)4B?-KD4eU7&<;-<6CzF9{r<9AqV?9kN}mJEg2bVH^oS9g2eJ-PCrL!* zj2Y!0fes&t==&%X&PxQHW=H4q{_7}wN)NRjf$^@qu3J5o)K`SAGqs~sIVjhI>C8Cr zhF7=Vhnr$o-zCwHNxlpNUvPMMJRvgcGh+EQw=DcwB}Y~8ppnbyAUB2Z1UvM?C9V2T zHP>ixN(^XwW5%(9u{3No?cZMpL{n-+B#41)f+tIc;HfN3X=#>&k_hF@Fpm-Uvy)S8 zclmbR<*5yYYO-8vevRTV7aEiC!!T`z_CwteF-4gHz8OlBCWg45$e0Pyv(DGmmH`Et zJ-!}S%emc8-C08Q_g51k<)jd2;FaNC>UhlsHcy4{L7RsdZ%#5-+v+UHpN+U~ik8N& z;knBn9v{GT|D~h(9mFCuX7*Kj^TFh8fAZnl@g#55`Qp4Z3x*mE3;*ghj~j*G@KhoA z`2kkTUR&<5dTAcw=)JzyUfs7+2o$`UGowN`=;?^S`%mp1dI94r`E`moUiiVcbGl%SM53b0;=nc zqY^4#RLD;OF#KL?yrtqi~`Ggr20i3B3^S{>+?(M9j+(m{z~#JG85|g4pAhn zO#Tf_TjWK@wfF(rHofx4cyA;g7TbC6_l9hnQQ;8F>M0r2y6f+Bxp&8IxZzU|rZ*ha z7P2?0bQNQu7W;9KaXa=@_)A8?kl3}E(XI^0AYq`m$(%~&Rm6GJyqoFFx`hhMHU1&i zw{+>No!}?Wk2Qp?Xz)X}^)xK&dd}2|GwaL-$1pA^NxR1$XarX(m=Zp=w6;T&dx$T$Qmsq`5M8*aIoELgwkDL=Le}4IELo%F#HDJ4o-gH)B!`En^L+Z{ z`llgPD&ML3#CzskN*kai2hy*rmsgEQ_4xQH^{SCZ+KGDK^n93;h+xL&*7bEaFZB0! zJ8#j*B&CIgIh&)qnpYL&p|2ROLu?n`JIO0$Lroa47OdAqJ=x2Aw#mWs#vFOBj*jZF zrx-x>WAdkOyg93igHc7Kq!NYYm=@2Fp0DHioqw;|#pd>PE|pH|_$vpz=lAzkxrqH} z(cv^PjSlPB$H-s}dccMv<*l@yT1A~Qrs=#|^B9q9#v}M*y`;;V(Ta=K`3e_!U|4ew z3kT$oE60(oD8P-DSPev-uKcsAxlHP&n5K1_v_voqy=YRs`ODEJG&IB)lcNfNB?BB8 ztx8BY{e<%R&xk2SlX6nM2lJF-?=_c1(u-nopUn2P1?&fTLe7bp8&N%tML$@D>Y_+% zI43Hv+{z;i4#RvK#`pt_^l2$k(PH6rF0)7zhCDJawxNert|eA*lQ+8AoF`;K!8@><2&q_gU>&`vr_$$}WzJ`kBh(9os_k zTcD=B%3~=>Zk1q~TQz$NxEpY^%^KSVOGg|6l3U-^Xsx8sz7WN-ZZ0%lT??OJoFq|fGZzaoEC7N2Pw?SPtgG8AnUc5 zZaeyXD0S8Vw~41dhqFvuB0UBJTKGLKYj;r~dGZ4*+$|eo<+SJV7@xF;gAAGYC&eTy zcx66&(X8>G;XLD(le9t{JE)# zG5F*=>IwA|IH5LZ1vj?ZXlqRPY88NlmOGl5$gHWD^#)&FbMQck3LSLy?mgp?j6IVG z`vS$N2C|-AR(w@~A9H@IV;S6}Ynu2zNmyGCbv>+~z!M69ylx@z3yv*aHQKqjSH$50 zz-^`ZZaKjZc=BqbDF`Avd`wyyIB6!-Mhl7f-6tg_)BfQTS<{o^aB;u5vrg)ff2 zRX9Z4u&9qPG|I}{FLdBDYpx^%@!0{TtlJ$LDQl zMv?vMMkyS1E0$SJ{j$p5mp%Lh=_cdMPKD}^OG{a`0kh}V^>U6H zh^mw&ZnF3>^MUPcNncx)e4<_%5EfyT_B9;D4oV}b=%|xgu$LkC_M-5x znwZK8yNeDyiN8=u3xJrn-luNzffC#NKdA90J$o0DOVXbY-@;#u4W2sT5tk}DxXV%rSvqh~l^vei63kCJ71HVmOnubBnjc_jE{MXBX$DbNN$=4Tp zu3)b5&x8{nekRRV3_)uMqh}^1WMWBEU1#Qs(a=McBVhd8;G1~2N!9ue#I2@;m81t5fX~O^b-6)uDe;gWUkbX z@z6QMsCa>sEamV520us&A1T-W6IOe0AxizH9>6+c%?PYtG&SA+31r}&9}mE`7?-k1 zD85c*E2B9-Gh=DwqN&B5`QXBBiG}Q4G&gvPElK?H<@R1UK~NhKDTP;7l^x^zu#-uO z4iS{HhzZI3c9PR6aANxB3Y9 zo^fGkkise(1{6M~mU6-QHJ=(6_vb!825t$VCPPch<_-;Jh@RrnFm~0 z>5E=k3;j=Q6^VyTGO7v+wj4$pHYnc%nXV8|Vz3#^49T@{>rxrekSAC(=gSh@3toPf z&M6sH2rxv$U!c;ZY#)KNo3^wevR_i3NAfKo*Tp0uO9TlLz{942i!AJL5?;j8!DkT3 z$@==V5E{QDTbOSxCrP7)0QY!U=xoGKkBUkA3IhlBEeqdmp;Kic>`b9*-qi;W+X zeIqk=iiG9aMfkrf8Xm!Vj~5Yu)?$Fo0BlW%F$}L6F8-B|H~xQcJf`w|*TltCC5T2> zy}qa+Chq?AgJ9DGcG%ed1Jh^bj`x)^fOrl0pC$uI`o_0C5vqy+;L_~^OX;Xs_(Fnf>OGHLGv`&bf`0~7*Mv`#Ym$460}u_h*` zc!kpix+JuIplW}<8$Y9sOF~oM(AW6m(w_b;zxe$g3uTsl!$Y7RT!X+*`*);Ca{Y#R z@Zc@=?P%id3D+!Sy8*G3^t(td*hszM{_)?E3$n;Q@Ob;A0csenNWYy#6}AONA`iE{ z+?|`8Z{1vfvhPr{`_kzPN7!O}CYY`KO<1u#(Lbj*4>WchfA|)y!lI3)K|jQ&-hPtn zS?!|c>a3MO#bn(oY$?X`kwvIG(i>i;uj=5AFNvef}-`0mn~9v~};2slC|M z53YL)3CJEcq?NFM>@53ZI#`rO_W9`DdBjeQ1wL8SYYL>w)?uNIT(UB<1mlgU!&U`Y z)$KED%)l&dobJa#BZgdx1Y`H>kHph~`cPObp&$Jr#Ot{#G}ORj*|&FyhdT~t*WwRU zb_o3oAmmiH09v|y!Awq#~=KE`|costVxAv*c9|KHW?L81X`nC&1w@n3_r$!#l8H|p?N z0#A!AXK%nSr7uX=>XyT`W^~ED`Y~DiV+1?{J`el-Mc)k)#r+~2NEZ1sQ6tnUA^3)heqzQPfGonNRl>LEPUwqzquj3DIA}lTBpZ#A_h4BV zyO?EabD++X-h=zJIFP*}_e2)=P~H+okC6iS(^d`-KE!5-JgcU8P^igKNy!!U>z>`$ z+&RL898d_Dn$^dF-8E2xPR{t`8-KBbxybw1RmVF@o9KnCqGM@89e0$&;fuIIPf{ma z_5~{xMmvHM1P6_iWjja%02j*y89+-H8Q_+Z7Rr`e&jgX1R3s!i4l3$&L(bRX0*ESk_BjuYK1Z!eiqg&0ffUiM+QMRSJwYCg5`~ z;S&d#&w)bN=`%NngoHHhm*|08us!~EpRcYY9__Z!|0J#M+>6E)K`E>2j0G0764(~I z3llQ$cv@m3!3>%ZwZcnM4~6v$NXxtdChfS-m0DivEHbS)HE60(-jSjNrDC2i6(o`t z!vTVhIOss@^=;(HTTl*93sBRP`#~*Yj0wh4oEceYpK8@#KoCdhXaR_|A;X|5?j3H9 zk=I2jkSw)x&Ph5Na{WCeO{!_Ws?j^hO4dl~6c6Y}1Tku0qp9>;OA7tmv$p>bYg1pc zU;^)Ia@<@=q~Bfae%z{44o|FEKrF4-%*c^0m{NI1o>F_w=b&9Po4qb?!*iX-+tPx# zHbPpv%DHj_#14>gLK(2BMfh~rjG0_o@Y0Q^5{UY{7lTharWzDI(JQ0MgciGtK-dNg zHA|MP5}}azIO=t=MA~4-oo7m$FthGOZ8~ITa3j|S@%raDu(5Afy8koRU*9vw`&$mI zd+OVAt5-dpqO|$BlQ3Ni6=D6@J3{SKKA(d6#IBNs2EXW_L_67)JR&tlvT#f%+6io5dvZ-FEx7yVUO`Hodty~C@~9Fq9heI;tpG7xHhJi ze#Nb(BuAZ(GD93!jFEC)b)D8pQ>l&iBHSZEz)v~ctRuw;X7dCYVLIRrLlyUJGaCYr zO7`OL#xkM}O9Lw_erW4TOu6x#DY_1S)&xPX6eZ>G>2tdJ#pU?3^ASSD5=1afLB!_~ zOXL&3U*Q(j=E3TQ?C=nGtUUcbsWa$b-`_G-b{!pe$kd2CHa_6eRgiGy z_wU~~?jzc>I1@Qnd=h$w@}<_j0|c#8l^vaPW&(Yna!8^;S}&XjTkHH=e~U9G0P)0j zCGAH{&O?@X8<2His^VdVnB9D-v8t@)Bt8=;$bhZHlimc*z6@ zlw#FVkUF>LkYyc~Jb@nq0|O}};2;8lyaJf~L3yyQ?2W;wEt(jCK=@?-;p#uHEE1sp zA-3>8-~~TrlE5ougB5(e=`vjV99KLYzi04cuR^~Umz0#~5={RCKF4k_D-r-0>b|8P zZQ}0ko(XyDS=K#+5lw1?z;}UlpB+@zzQ5?3JE#0rz<<cHYb#Z*DDfcDbcP(;@ zW=v*XMvam;T4r~Jum6NiUfNz25cvmY$aW^woyaeDJdl1k5j%e^P6=28&)+^`771m_8A` zk2C#*PM!eS^fT#X4tIUo{n$drsFGM6sZe7hp?-bYATq2UO5)?k)#O~2C$BI49jVrI zo=>vMpAokFGNlzJyjGLEwKb!jERiF=;3;!w4Y>Li+?RiqU!Siq#(RAX&i}<@Q7U^A z(#FIwN0&r%(B1jZRdt?{y~NX2N#y-s@2n>Ll~ISL3a-U{WRmc+&a}Mb!p8KyF>LpY z{)<)C^^2lB7N;&>*Z$8nd;UhnbP!Ko7QOqYQwPUG&sEjMOkDKo6+6|a&^rJLTZ|Q> zb1!X=olZWXJaKPE`slAp&INl*Y-Dg=kF=onVR&7i-Mk*H8O%^RMyPF#%(%@w{+0V$ zZclZVE00SDEmnsOJHZBYzUXJ4)RIk^$D>|e%X7lB0$0+f&lOv=y5Retoue46Ww?XJ zJy;_rZ1H=cQLnZQ(Ptsz&gyVv#+O25E%I&)#J3Og=Xoq{e{_RWfm!Q%{DDMHY|eN{ zjg`kW!?oeaiQ)S`l@@WrCw-SyXICOrjuGMm^XHA(zP-6E?k#jhKM(uXmNjL=1hHFng3jK&zw9la3SXGcEr!S1X|Ot#S4PEa zxeGxr-LJzIfi>0pgCvZS3n}Jgtn2UgS!uaOKkFer*?98oY8X;g&nRUykSPSA*qD7r{-Jd#cM& z1dHh)vbvI=tPi~D7@ns42qM!%2I`(cGWb&WVo_t{^N+j{tGK5OR#7s0P894d<4Y!F zb6`S*wr*O<(Ii!K%RDKbq08?N8}-`oVb|}cGT|DE9v@ga@S-TCpXq4PpS^+dP5JU0 zgaB#Kbc)(nS&7M${_qzj8m(BfEAg3`FIJ}zOVIf}mkXvN70h%{by)`-0BKvHaPACz zDXle5feP5PqfxP!B#qgw=glHwllWt!gy_G@=Z|93g&{jXySRh!SCn}t;nkj5k5o7m z8>f)Gtf`7gS#{a;MIdCN;k-B2B)#I_4VAQ&5&!Wj){Xq#%A=EcHw3`);Am9FrSf2& zJlm0z1>nsYSAE%gkwx$*E%)p;&iFDXjq25w5L#jj8F5mGcJ7Ez$|AS$fmy9?zkD$( z?H>GGtIElhus5w2hyII$pC6+Y>-Sdu>n`e_l|^&3b;ye?cwa>p<1sr&_D}UiQ=d?( z8vbIkqk&O~u`NWB53kq6G)fCvw8`ewO)Fe;eW7{nG%zn^(cC*4j{<*F3a2NE$*i$d1Nb6i3)QMgu$qk{g>n}d;H)VO`o#7W;Gag$<95b@~!WHgy@)&)t z3uO4otW)s%-fU~_C)Y;%UPhhp4u;C*wOur*18JW;LTXfst`NAp9eU?%G|q-24k~82 z>dKVgEq5F;iZT}1;GYgY$w+Vg^Vv%>!P(%U@?;l!#^4fBbE0tK%r$B^F>Ak;r4RMk z-U}xbSvD?W{4piVH|HycHxD`6NJ_}1^`eh8-I7%&7?IWpFvfL6EIq{l_3R51WO1?> z#CDr2Q@iPAZANh&bN?jl{kFcPkE{8P#y1Dft4a*2TU@3ZsK>6atULwi88xb;#2LjF z0&u?-xRG@*!55mL67~y6Ov9JOKY#qepEKf9A+>@d@HiU%XBV_>TJ?034)2#csZYrG4pKN9f8-X z=4M^{;_r^7=g$>3=$0~=Y=@?LJjRrmzZeCLgl1<8^_*7=v1AxzmLS~rzPXKiWuexR zijEUVht3uvtTz3}%q(D7dd{ogr*0T=v${#UnHBXLu}7Ck*{6m1Hg#u;rC%j2=fLAs zi`t%&7?WI-VRj_f1E*Jo$|&79aUahA7^hw*y_fAF^r-a&91C~*G}()YBzNGa>dG z0k(oB?O*oAPtK31_dGu;ODk}%BG{lR967c%XD81Sv&(eF}ANC3Uu^k=f3Kt|_ZZhtTJ^ya@CC@R$+i$S~@l zrnew{FE4#TwS$`T>Z>Wosqg5ChT+vad_OwG3LGbup|2?DEAG-pt>FJh)t3iC`F(L? z7+Hp_SyI_k$gUzG$*#~sitIa)hHOJ5WnZ#IlqH4iOSVDT$r`ea63H%Ql6cQE`u^Vc zo&T8o+T&L8gw#-uV z{PlbmgJ7FN>nmK*&FcXgSB~>;C!;??ecyDL;X4I!#;!j-cl@Hji!Ow)W+pErdC23f zlmC$Ef;tfHCHLShWjcux zczro+YSjr2`-adMk>?G^8X}MN2me(kW^Q>0+j7$KltPqNn}mw6f=?ocvv4XP2OUf#z4#^zaD$!D#D5P}ul=&l%RiM|xKiAt z!!6wRc*!F5Zbzu|57_Nrp2NUPW7v2BbHJ7JsPX;-4S9B-y8Ajy&pAb{uG=46Qzlb*3Soi-`{IN)Cgy_S1Vc?ZMQQ`xfAPsO^G~7SLciUcT zTzM=|knZQA925a=Z=Lh0+y{k$pJ&)%RBL70i)U}`Ve0;u#ki~Kf2PQ38zqq-LR_&vG=)a?{QPlT=5fg3YfGW1(CdAegZwSPeZ3U>5 z6t@%y?iOKZZ`?Jye0b;3${+tD54t8abERcDPp3)LNrmiZHb@?rr%xkyBT@#_xrQ<`e;#;NvZx_YPQDZ}oViD*IpDSW2a?~9qe`SGIi6j!*-HY8%!@%`faLI8hm+(lO?tLAYGExG^Q@Z>Si86 zNa}TYL%z%XeatyTNLZ%mO2s`jd`bm*tY9PLLHf$;qD#uI>}RrQ!oIl$$!YA8mEjk& z69iQ#^WzE*h0k!dpPRZk<#Jr+nCQIR-xFd5ENa0?s}qi+{PfXICMVtSOM?&gT|068 z499Ky{m0pW3TmlFcp<>vzU~O$yWo|Ztv3^GgEd3O)a~3=QQTIqsrkQP#_vw*&{wjh z&|B{AV1gd*XZhq4Pad01;)Ei)ye%s+JGwAcbemtO%>21M&Pvjw_2Jm-yUpsE_Np~> zC;>*lbAB}iqGHu)pP*fpJqywflquo{zgKGNeM)xVZJ~gSu3e=i&is2-L{g^7(W45xzS$HuLaS0=#|fnYUDHwEvUmVorjes`2jl z_`!eTto^tdwsO~T$R&w|OQ@{I9%ml&BR$6Cw~FD%2G4~nI(AG<9^UHf?6JMxQgsal z(wcwXJF%$+JA5dS?uat9F(C{^tU4Th1ZmX_N{QPz9s0q}_ z`Eyst4#{b1w+OW<*Xj3{91D3%vm`F`L1S69X#`A#Q>$+_l1JgLxhkE|Con066}tLV zp>rb;ZJ*Ag3Uo;Fm}t?vc30?}O-A`yosmNH!XPvsbg)_vNA2o@FBPvw;>~*WRMhP5 zHeZ7smJ@RC4=*%@YpVm$G)qc3!-yzIT&C$bvAf8u7HlIQ{xw-Z%LY1y)h0!)<7mV< z=4E<++idw?&urg+7u=+e%6_Jl35kz#$|Y65FNdt$rJX34K!VoQ$e~k8lt9$sl%f8Y zXU)_1I|uCM1;CiJ8V?G91d6 z%rE)$20Xq6LQE1+bKPopu7|4UuRaLfRd_z3Yw3&4_?xf0sU5kqQL&Gnt;U4>kK~H^FhlJMFe>&PpX)rQykF+M<|}GhmYhbmzs?0 z)unz9L9Kg4XPf^tx5^4EMrM*=vwN3e%U`*?=4*4H9!lUbkWLYo3E!<54$=Q%W9AT{ z->-b0KXc@?dpG{ZmF{m%1xrl#~d+f{w^j`}Im65LdBA=HS-T*T`! ztq#V0ydkZ;E|Xy_=92vhqffQ-z+MMnD>OVn+OMJDBt;iLMY?~-TLlc@RYv>8bV!+H zbxc?M^X=^VhdzEK`*q2~r(II$&r`l^m3?AMsZW(Mq#9>4qacy)eHUrTgnsyOjbuc< z%H#@axO=9^YCe84CHp&=k*D%{o@fr!79(_2O1g2Y*M=jH0?|JYZoXLhozK@jEM1!H?Xe_z9^p1 zDE@RqH=Rk4O-WWN6W4)bV_JoGeOnKRy@_MA;3|Sht^($x9qi-#?X5jBgc_c%kUZ#p z=NWz(`;ce78_$otH`$~EsOTH7IWXqT!^Ku%Uuj7Y9R1Ejexd?V%gFK-ho^~@t-*II z>7$RcDgEif>K`>v-FH&p`WZe#wj#gwx3emU6X5LNZIsNMAYp$-yYlRLd?(^?7*3%d zCeQ-vZcZ4%kRw|qB=A>yrvz_AG(-NV+ZiPdFa7pz#orqJ-l%~HuyyzP?WwYaW(5B0 z|5*Rp2Oc{jc$10bbV5f%e}vDx@FLVEb0Cvx`B-56 z_szjm0IeMM+=!hfULj%_E(GV$EZxOKA7eYD!3$NxO+{qr*57MQsZ+aa#x zXIO>uwO73|nG;H=6#2o*u@0-hmIO#qg(l5pnFiB8D5iAdG7kcxx(tVZ<-Bb$?ZFR2 zj++|q_F1+{fP?Usn;I~{n(H@8&j)VTlz zWz7(u(c&2Nuy@IFv5BmG%=Z%Wn6vfsElIa+;%yjL1Hn0}6#B1KfHf15k_=4&4;1!Ja5BM#&Y`i|>MSJ>%SmL8PsK#`#TQ1?s#2Y%FZ zxPvi;CFtSBrSJ(E<&w4-iy?3n2?)WJ1x#!`d`3(l^UoecUeu%IQ!Upo0{3COv3;A& zc33w~#R-Zy*!_iMu3SW9Sup&AB3I7D+gq2qY3*lvbwmD%t$-^p&4m2G=Gdd_uWbhW ztqE`whImCdW9ZVAuiu|7JHn>}{!1-yRk#tW->*bsy8>@45o0T$McQtePno_8mHE_? zGq>DDz#2(wek_N?AF@NUKEUgd-&(5^W%kxrP97iBwZk@(H9iOLQ&n(G?(0=F#4KSM z5br*!$Y0%j6+mpZLa*-c{vKGA(hntw2bN}zu&lbawl@4f^CGaGelbx5-o4X>>3j^t8u{*XaG20 z4s;0JvbO$e0nX^*!vsZs@B44kP+OWR%wh5FF2))cx5cJN@czCpD9s><5jTmWzlR&IZ>7zjG5c z8UaK|hXU{)g>=JZ*OeaP`pJw9rVnF$vEV^W8zhx!uP}mnk0Tz*uD@%GoR84rxp2tR zd>iR0L={Dq->|kt2DVHRq}F!~kF7~?kbj69cD;t}CTkx6-v~(lV~ZQ0{U>rbxv3(< zTY;DcAI0DoE=Lf*Y`e6*()U}Hy;QvXWMx`mefPP5!v#JGl7@OLH z7vhR8+GXH8U3a_?r$X8rF4^@$-d|N}W0SIy(HDCHbDRQOeb-Q%EOZJIXS<0yc+e%3ncdoYY-dVjL zxYDV7z*{}mK19fG^-r_ujy_Gqt~sH>I^*#UCt<-3dB1jb7dXK@hmC;~EHT)k{rr2~ z*qV6}R_%%pF*8E#6|_SwnB_TP0k>pz3K5(WN<<(l8viV%Gyiu_?S=k$*A=HEzXzUP za@s4ED=i-s@&&to3xrTZVPuq$gr3~$fXa%*3lfXWVO}W(U?@mfmsW(hM}rQ2ognos zc-2P~hy&&cpkzVneV&_OQnUlg3jr$sXKrmTkS4%yV<56Z$Q)!qLgRrmMcwKygd;r@ z9H0O$nic`OtY^1SE49+VRSIQ2sm}Iv*#YSS#1zG^p9HEc|BsXSnw2M$w_@AJZry9F zN#fM?!w{nkUq#4k_Kb1fm841eX4|VwJVhj5{Df*;qM4G6n7qNyzf?`fc?*UXoX%~c zL+VckYraj6iP_>>J#2RwM(Y2@!^z|PfypWu7)JUK&Mc7^I{n?@k-!>Zq)Dvarhsru z@8ezSE8mtUmQFnihbU;@oNIJI(^4t5XcOyV11E7z@JbN9#W31GudDCd1Vqi8fYO6?8=ksg%t2Knv5R)|p3?C)FY_+BGtg1VlR_!7H|GqqhvSULe^{vaKzxEZN}^mq*Da#ri<);nJFN z(n?D8b%ANFNf-wxmTx>>=OYio!Zpxw79jqDBmnXE6ZAlj03rA~gX7A?NQ-2idx)HA zPoG*@Tfh>oTt!OX3ndG1CqI2UK1sIH6Hn4(#3W?)luAj0wG2&9-D!qsc1@8#$$L_q zPzPb(1LQZ|xx#qxq+5pACO?alBmUV@qfB5NsAk1V9W;-1XvqdCJhyA9KN=`(R0uld zy0J4t*iVrd;}I5!o;>gZN|S#*5@#eWUJ0aEXcAY!)A#2f{^zq5E$9!@GO`a^#5%mQ zuET6MK@goL1N>;K=gBDrlJM!~r#cV|42HdEFy7;qr1^>|@j4XlzYo*Dam?f7V~A%l ze5!+(4`%}<1R%ysy?=Lr$r_2Y1Y5UuaB%q47i-uyxWU~v$+Se$eYZeg_+xt*xr4|? z3ZX~R7-&7;NPUK)|IPc@1l&RF{ON%omHCDdk_0b}OIoF50ShV}V+iKk~^_ zl^h^0gCr46kqb!zDYtKDeMI|DXkK{c$&K>&Q5r&o+8;-Gife*GeSjR0LkzIb=w~rX}g_D{EX8 z)8@~?yqhRztQv`r>gj3Ew}Cw}FlE`b9XSY!*7SJ6+clu`S$%wXAa?RD<^z-BXvKj?JliVi^6yYnt7l-Mn4iNRQWZ>EgceLE937X@H1xbDhs_@Y5B%1Ky zDSRk20j?Eh*;U>{Xy7i4Gw^SEM;F!q&%SQ1{!p{Y-9jrhorBoqY{d@<4nst9jFg1t zngjX-k&3SrVG~@jW^Be#@1e z+925?$sdFz_kmRmw$Iu?ENXHs^Q^W`kPzZAQaikW_z;MQl$yKjg3xmE@`z?g&}|D? z=gV@vhNK+?G~qgD><7Kn^L6y{RD&5}Po;p;T|E$=?}xC4yujXdDLi8v!vri^By&ox zJve(X?vAvF2N=}lb$Bz~Ujv?^las5?!}deP+(9XbKRgIZ$%~>PFR3x`?h@1OX zx^1k>%(gcPcU(l|q-5?Xr0F@PuiRnImf1C$zzawAE0Cc3n}jA3*Z$p+z(SgR<=9e% zP41X(eE)p#|8TtDI@T#?Yzc8hZMpEIj+Xrf1lCmAVEvUYX;oggMrd&2M1lLM`KfKJ zlMQ6o_@JJlu~rfYqg`=&W?xNF5x(OcqWxA|3@K>6l_JiHpN@_WmN;1oDkAsQR8_S> z6L8oh{3>Y^7;XFf`T0M^Kb=JCXxeq2w+ed1O*CZ8&%O(xWEBMQB*3m}6Br8D29_0JsTW{JjI(b`1ik zuAWS`cuoG)uD3=Ga-JfO>llz&wh#z=R9Xe0K=0aFhvZhTUPM+=TgR8_5)$@q2TltL zG(X`Hs}9!DZ3tZ4TgQKdh*EKC(&A5mvg+6u4|wjzqXo_im?nDo;H{f=_YzVy5x$i@ z$iBVA9c%aQy)4Oc-1D5sF_)6F`q4Y}=Rxu;!W7dZ$Kn3}u*AOJ%(>pW`>UswJ7DlX z^dvNl9Q|x_B^6<+diD9S7~p4n#_vhNuE{C0Hw9lk*pf*>>tY#+6jNs&5OxU{-*xB9 zc0;s3UlsrT@$$gy$2^E1%JT=35zb7Zo#F_@;2MSB9!2o?=T9VrTMXgj^8JHOv%iNa z`)4pg@`|Ju5g5|kh3r!rI!tM#f9yE&4FLA;j_b_>4dQBLJFnN5R15yNy`^)O%RGH< zga2961|uM!E~?<46kdHZwNDZBeMB6-3nGXJ{`ewU*^l7#KaXbsFn+V$YCw5mZ@E&w zK9DebAJzIHJ7Bfx1vsv}(0~=lJ!@bk-qCz`K)2_0GLrX1g6%af|Lg1toTjLy|AuRv zQHvk~AsfltEfANgjci^P2cE!^ECq4y+;s!cO^}PbTF9|s0!;c-}6wcC$1^NCN#4) zkEK{qdN2-=?Yv;@&9wA}c&~l*+P~|8s@6S~gyB~a3_n3+h#3vzBGNM6|Ad@Uu}PE> z8w0Rb2K6l@?DlHJhIK)@nQs9-Bplgh29H}a%k=9z0)+~7!3}N>A>8V|6U0L?qcGv$ zIonZn(l?+WP}8bkk=5F<_9sr76}2|h%>K&kslsm5%FMObYm8zGZak?K%;(*&LDBAf zts=IFQdJelo%c*}!thy6?vuh7FP2kY*>0yR{+``d`0M}o#0#BQ&&*>x1^G<)uXFmK zHkXGW0quYwQA#o*>`kCgV4$XWVwjz-Q#PxDU+AmJbEr5q|EyeQ-;kshjX>?sR+cZ8 zZzOLp>`Xm8ef1%PRBbBw{Lw{S8LWt#X8d?V zK*KWdEX~||!@!t0cR5SN7c#DMID@cqT|(o)P=6mqt_xXI8^eG5W73_x7KW zkr93UYP6=z{HgHqgzaV>4vF2x#YCb`BElhZ*OksbKz4-=%K2g zfm3?@oWjo^Nf^MRyoYTE>zZBdRVzbG;mECKAE~c%O^fqzR7qeI3KeH6^zd40a#B)s z(`F>3eZxQ8>!5U5_9@9z_9BA27idlU^Y8+RntUH^goK4HT?lbc-(r&lGX1qnlBy9x zF9Q>ydbAP^{md5LHSfC)Q?Z|}&GrC%xi0;1(AP>(->AoW+ zt@>hoxj2$$Vi(v{qx+>o(1YjSA_WM{V;>*+H+h}_dt7-TPMCfWm^CtvCNgIKGwAlg{GRL!Z| zit{!qz?sxvwH5mti25lIwT=1LmqhzlE~e|!#&VFhx`gO~wFfShu6*eF3}rXp81_G4 ztrC#i$$9A$dgHJykEyVQqd+H-3zvKmUwGn%6^UuZDdjVA_# z*fyd9JfkU&_FNqghkGel71lUj3*{ zkE8~|$3$_L{gSEGG4ca;1dk;i`#D5=?q6C=BF`>CPZpoesJ_Dw@=h+M(wN05N5}uh zcXV7hwNo}=m$67PG@-w>@h|31lNv27fXGS2=TIbJd&{f6acislV8Ev^Kxi7O@zX4? zc*X@vmfLCrPn2P^3VgnSb;!HQy5($T1at4{JoYj3Qd(+ccuC-i$FO$<60cWspEUHl z*aQHBbfUB6EqOs-@RLI2!DQLh>|c>(SVjyC)z`SBfT_(3Ux04HLIWycmzUSy$)xmY zwNnF>*<1Fs8d8%u*^4{>He9^<3P;4tc#6b#%~!=p#D->hC?%-?_>CEswJF z0`1?JG1yc=en+QUYQIkFW}#q(aw*CSH!>+pg`0q)tK%y1;s8UOssHk{n3dGth>w}O z4w2fyzf~w(zPJ(^03#1id5|@m9+E2>K>KS_ws>aY1=DDC+yifkugR`9;9<*~FBEcp5|;DG<4zO5>K)c1@|(m0v>32duJL~4X^}lL(#g+I zrvB8}4@G2GKZXZ9-@YW)&JQrsNc}yX3wGxvY7_n*P|_X9hdNIa&=oV8R}-j!wV1lq z-^gaBG^^~`lsp8?UVPa>Qug%z?Ng!5J5~I3{O|Rqc>VM-`-bB>zA%&tJr$u6&kL== zT29@9Wv=gpZtBT>4~T*wo#NE5_6-I540H81-0B!HxxFJ^E@Ve9B5wgCr83C?J2v^{pQ$=!??ccfal_iGc;L_gK)YM!rd0jJxv|Fv? zADb{l2`!n{e(Q9h{%9i#8k;vFn9T9Tm|~$4zV_YCjcZ!PdTE$%0Se4>3={VZ=5L!j zx5N&~XY5GvCc}QJUWO6^*Wx7JqwQA0UG*`rqwy;C(jl;XM*5v*D{3{csZ2M48Kpoo z3Fa}Sn@yo(QtdV!bb|5pQRkd!k}v330)rVnec++hTOas5_TI0l3^sGB!38J#k>~AW zni|%7JR>Q^);}>XskLoDeKy5!;FDCRLGgb(h%?AN;0lwQ*G^NGD(8QJK`dl;|M!2|6Ke?sZzlY{C?p=+& z`^6j`2%Eadj%(uPtXI6d=%pte#j9xuxk)8PIF~f}hX=9da+bh9*sf4AaYpt?O|qNz z7vdVrscywcfd~-aVA7cxG;XSQQX;k3c2Czr)sT55)vCi4fu0_W)^^sRUTQKX}sGnjm+a?^CWaU z6=55r275eVE%%BNK2!rN<9To?T)L3jqR-kBI$iA*Lk0Mdy&UgqNg84iF#4=8EcWjT z6o>zaat&7o>3c9V>_NQS7&meMVT%a_CwFR}%s^vC7L<^uzs`&|35(&xNI-e&V>pI! z<|nj>bpIgz@btNSMDoVKj}N6^yAoc!gX4l05nC?$Y_}AfGv>*9mAgK2rPJ+f;|sK7 z5xO-tl-|mG^=P~J=o2UJcRHLdu5&4ZTaay_U*vVeJ9+>JQ)@1d>dq1twOv7OGbyI0;sw5v#cr zoM{`FT5)>I{^U5dbXs#+CY^!@b?1JGWA;_XJz}aCj_&KDMTj3`JJZRourw}KAw>wj z)&o!(Y^K-wEL2l-3i_cogTXj|p;zU<DXKLr~&+*Xk=a&~F%Ocfwz=Axy{R-M9Iu zQ8Mz}WprmOuXnyfy*3paz*3 z+}EGUhJvC`vrv;q+x+0D`h~o<+e^w1<+=|g^!K0wJ4gq=8^oY$jv_RCJ;GxT!AOP9 zkxa?^2+l2Wpz3+=Qh`mLw@XxeJ;-*>?aB03SbgQfh z;jNr;KdNjgov>IESgGX>pwhX%?k=i50r%mP0yhLXcr6`1g|n=&xGN_$-Tenpj)kDMWCns`OCr<&J0XO4gIl+uBzI2AfCfbZ zx+}~n!5M20QYVwu+xX_O>BXi@aUr9&_V@Q2h|-ZV(dx6Jk<4aR^D&#SHYZ$;&8t&( zWWrpq%1&dN*+r!5{Q9g6lFkJZo5@pB@@%k}T4$2lLP#ZS%nUSuhEfMXRB>fP>7hlS zt@FGvQd0&;F2LL~T%C~q`a4LghgSsFE;eZ@a2z{QaZ1Zd375<13aMYNLR2G#0yD8m z&z_kbeL15TEAfaQze)x8wddgON)Sb@5$0_ zYQxZz#moBwz&P&_{Z&K{95@ig>J=*kEA>LFO*Da@oGT^I`YKeg5#EI309^MA#0wyK z({U6!IXRihCMoF2^5wSuFlk98;<*>Qq13U#plAdCvq#_o#rWOChk`pJ6}MB@Yyn|x z3~(;o+X1K5e^-86Khgj9jm;6wBsABu1}s<7@8H5=pch zfyE^!eL`l{KV%$BtY{o|wx~L5{2(iav~q+`ddG;>(y4CJKSjB{rrz?OTk413LP>|4 z&i3j5zzJE{g~SQWFkXh0kA2Lv(skQnPvuE77JuCfJ-K@y}lPdE%)Qx zxcN_>KHFq_Z%k7Sl*Sp5|AY6C)I?@V{x}!^(=(6|m#PT|H$~?)O97?=C+lW-MpIn< zq|d*Nwa)T5H%7lO@a#}KY-lJ~qh2i2G#W?J(2?<$eUUx-D7+igV?x+DtMMljH!$1A z2+-J)n-f#f=|(6c=;`!le#M!$0D#Y^C4ycg*9S%c_{k9qP?F)Rw)p~40DwW%-^DQ; zl{muD50ph*G&y@qWeVRH2YCelHfEKdXkGGrrriKv@((uN^5i# zjJ)(+$!}KYj6VO1JL7nGq2)fsTbsVhJ*Pt!AngMAv@rl;+IfHA=KiPR{cr>Lhv$Wp zH8Ox~qX@7M(hAQ9wMHF23xKOBp1oW;*F(bFLv(z;yJ?1|A zkw&I|U~zeQc@|C=X+}NNz~>u1&ppBh?pVb0O@991`gX^oT-KFAu95QPeU6Dx!o^w; zSIMdG5Q1>Jwr3C4y?txanJ{!&Uu1H=EKr{oL9-8oMxs|yUa4zV@V? zSd;gpy^M_MxAytGE3-Nn<(X#*p!ci;KSX+Ty(JMK2RCQigmdEdedHakT4|tl`3GOD z^8XLq85G2nwd{XZLi-ph+bj$jX;ARUttKA2<^e~I&U<8L()Bu1IB!WwaOSj+6UA@5 zHR|>h2-HH&s#SDUfb#o0XJ)KKPf)GOe$fUK9^4*^{=+aT7pDfT;YNQ^n|5!5R4iq= zpF%MBpbXskgU=GGW@Uc^WLfVMS;4#wepK@!@MlWXJE$WIl?V{{a~BbHadL7Z#;P_1 zekf3An#{)NY$d_x;a7DsLp2!^4vbVJ9|0DzV&jYL7y;|kjs#bL#fsxJ)dF%TuM`LY zBw?baINaG?r8`y~mZj4WNFaGl7!5;qRWsq8Tb}JHtc04T zQU+>Y8cVftYxMsI;Q$LZWPr?IcUd#f*hmnD?;?&v} z-U}a>nC0z}3D20pL(^lkM`Fgvo4N;)QU>6v%F~P>2HfzoP{d7??mz$LF05RYeD9xu zf9;_=vt@s%S1nwRi-=7?bY<~Q!6P*3AN<{5h<~>pQiHS!Cwz;?$V|q7br8m8$(Z;j zlMg&Ze0=nY*I=ZcXEUF)O&svq7*OPB?E442?e78D#U&r3>&uqg+(>)+@rj>q{Tz`I zur*KDzluSAsDzV%IeG6?(0?l+>RSDVJEL&K^av|PW(paQgr|{A%i#kWM@ZK3Qs{W) zEZgJ67`4-OgoV>))4T&__T>WdsME&>iWUlq{&WuB)o1akxL zyd{RXW;y)%;|I?lBl;gdkdzhlfek$+%aK_i{YiO)VR~Bg@8+$*(fzxYD>|uPUPVf5 z8#X!I-@F`)J#zf@f!gcL6$01gKk!$7k}yW4Z7)O5U3{=Enz}#Lx1*ym;Fk zHPXdMJUeL;PGL@<(OL^5m*>>`!_BqnM5XKC9b_(4A}x#S_FbR!>F3m?t$r*(u5a*& zQ6AU5jaxZrmnl^G;YLdwrF2Z1Bthuh^pxUvg3}qhCk;zEP7?`x7bOd?b_BOylKZlr06CYMe+$m} zL5#=!+aI8uc=%XljP+k`ITxr7pGWQ_Cz3H>>LM-2ETH;S7Im%T_%?T`vGhu%*ePiA z%m>QYzr%Uf2D#!LIPbjqawnRqkX7Ae-7U1N0>h6 zbKx!Ot86KCA60oSu$SZq4CLsN<}L8`rslBi@uRYd*TZ$yx`U4xqDGty2tO+XbMphB zcBceywgZ`h_t(G7^QIzZo^mX*EJ5Mqf4si>@#k#aGKbo?61>*I}J}$ zxe!s|lO?sGU;)zHmE)L^fVi0Rj}@TEJvoa38Y)y=RXUO-ZPIO>P<;PoO0*UINE@s) zoh#@RnnAiJ4T}L6#uq=SV{5yRSMlbSFi4RMhTB8LME5*c|AR)z$>@Z#HZZ*wI}9m< zK|OuWKxn!=u_waQHQwkRJK03G78h8hQdb=N4{UE1 z`=rZt_eWfti=(B~$Xccj{*JCoUhcW_YRPfrT=c%%Ifwz9L%I83>`?BW1Fv-RxAWoo za2QhXn2;JLYMB6vrqZSL$|b9Y%)va0r09Mt<=q_rZ=+g z+3g(o&_Qv1PQ30xnEJPxl{9+`2dzZdK(gw!$%WmB3g_qNlc6hQzZMehaCg+>C|p>N z*gl-MzY$A5{*D(E=Ft5WZ3#c!%*aXF&s%5mk-m{$u<9}vTN;&=+-L1Tma0qpbLT6R z-fW-*bpU5TF45SdL;22+kE&BIP^K7TpZZ+zoS+PQZs)=$uGEQzqo{~k-2>&XKc+ zZmi^7Hp5c@pHG zJ!V1R|1=VIn(mix^ej?{?2qoxai z0_5LWP%iz{ubCFx@3>S1S%gq*&Am^&mvO0v+-df~*`eQ*hox+9I$w9!z-_%FyjedD zN@qEubmDInHCF;N=~3B#>&4ETp|pnKcVz4y&AIB~6ootCAR{OAhtDPU4vo^LlyQ-OTJJagVRu`ZysvYV zY{z=uk;!>9+p70kiFeX-^diG6FK{=7-u~-z+)nO*45PmaNT`D`FV)P<8#UFycgBBi z#+aXYGv06_ErQ~SnNU*LVmNt?*VlR`8GD&k+H7JOr(M9gFX;tPsQzm7oBdsCcfr_` z^*?^hLQu9)LIeLA`k*(LypYeSQo8LdFF1EONG&>S`xHRzQK;v5<5_{I{N+?{4ZLIg z=QuDFaqm?^;GK$}0be^D|3mxkgKPMGDKcDMX$aKoK8Rg=&~gSWOjVrUOqc}YB&5gy zPhyRx@w#u|`yE}Ba22^!zIghF|5)q~vrZ)_;K*D~LwqGMMrKGcFjfs>*psKylwtdANl=lnemU3fFZ_tJy`|cLCzD(6Fr%4wvTrzP zOT*0D!vVkzcqx;YZTA-v%;wBhwMxmIMt;H!;@#%^v$fki{=t41cK|;E@L!o<*sX2< z{xP@L-4AriVAGhhc8~XS2h~_WyMxHnTIGJ2^N;_Lw}6{>GLVQj+wlN4l+TOYc-5P~ z6#%sjv@d-DwrEiRx=Df+#DY%j^j$dp zLR0L=j~}jVB+%F04iqYfO7-WbU3pdB2OkAb^Znb@Amf?q_6`*yp%TO>Hqt@oBEUO( zw@$pB?BiO;S!xYizfC_>j+yp*oc2GUMK`1jS>F$2`sb!Hh=N^;u{*XATa}w_$V0=Z zENO>ss)k3D_opU4TGLkrBTAnH5MpO{nkwgTAvpfBd8>FmZ}Wuhs`G&x$b5x&E~}hg zs0k$>!@ltWjEw?}wKM1>jIF#4CzsEY`i|gYkkF6h<0^8yr-l_tT2_8jO~59o?CLik zE0w`n*RHP|>rcjlJ_gXA8gu>$9Rs`e$sMBqd_u34QmJ6uSL?AThA22ou3~(oCjeuHO;^QOl+V`u{a&&M z%~Kzvdul&b%$UmVTviPMpC-HquL6Wmm#tgCFL3-tT+yYg`g193uI#!bWHZZNkH%HL z5s^l3CInoayYAcew9iUzBhA*=cx!3l%*%^#em$@TdxC`Kp_DH_>_=TIm_`)P^cqa> zC-<4&mlFt*!q13M#$;*0a{*;Pi`A>%Jct{2s9w`!lsN`xNJ;=w*wMV?-@i=Z10pio zO;>G?G|~pDXM@ioEoNzThPR8dHfihVcF&e*Wn3yH7oAO5S>wgZ(SGCZP3I_jbhTa{ z+|;-LoU|*r?EKCVB?<#vsdP;+cA6M->0HI8&~Z-P*`Q}(6fR6gFHf?-PRB%rXN;Qm zD#~XdN7<86hdli%(sOJ)s&)4OUiz7$zbHVuIe{UY=!ST?s0dhb>^>Vl1u)D913Ui! zwues>e?w~x1}fDIOzBc0a)uGa8+ELN<#BbU>t}!UlxjwPr)_R%4$Q!O$|}0Vt>z}c zh8C^v_<9!S9K?*ao3%XJSIoe$9$IOectA{ zVlf}``W5EJ=I5657g>>NvIz;jJT?>9RPCI=t0MPXxyJjAu4t|E>p3@iCuH!w4EtQu zi|^>rn%FFf|1sr4knJF}%i}t^+9ztT=dekG>s%`5FS5MH=8~I!JhJ?RQV8{%HERWQ>8U?wipkc4i-`^Mi0v*48`K@FRgNG5%#N`r_8MkygZkd_x0vo(*}dLSzC-e zO5sAPBw^a9X)^z$`0#|%9OFBwz=gMt_{KZoGB(m*)6h9-;dgQ}H_frcy%)%Ogy%0wyS`BubOTPSub{8_CS0OPK{7D88S} z9Pu$WtwV;6;!$|8H}t)baNnVW{HIg)wK<`x^74G+ncpV%N1-DRpN&L>*px|#(n3aM zfl=>qWzbDrC>XoRo<#rrr{TtYRG;w2C~iy8-EXv;@fV^aUH*BjhFAyVL3$9_HV396 zp^v;?KP_l7Jh7*^Jaa{hjGO64L`W3nq*qHJVCIo{;X3Co5Fe0!X5 zpW0DJ4527Tg>MKIXQIap!<*a}zTFt&IR#qaT|^R>rHcK(59S%#@x}Y1s`9VmhMq6p zIeFeHbzgfq+U=6z@1%VbH)>#Lc3?X5lgJZvG;6l!8&lIL!T2uLN|#S` z>e2jO+RKd74UR?T65enhR9pU(_vJ%^le}`MtgE>Joz8Z_isI@k_I8*U4|*%jtq3KKNh?!!HM5wi3aLTGaY4?%xm{; z?LdYQ>CWs8qn%{lJJ<=WdH29;H$P^}dOZ@Yf4oqUm^~115_Qs2gm( z_f!J!ols3NU{KS77T50QB6Ft_di=wQcAdHSquRB?Dcnk09$1u@SVt)XTutiz>k0FD z%2*XUTo4bThuR%F5DOr~oHW=!fA(o-;+w4KUP3WiKeq8t&!F>($0ldG**=#@k*1zm zU~uYcp{Xu!W@DTj&N8LL7P?6i?U5E~d;N~h+T?yKX$m(VuZK4eIf`l6t>zEoZF>|9 zSL#FyO+;?I1Qy4HWEtG`l#V%`;AK7XMvtX?bj(};C#Rr*ox`QqxtSD&W`?u(FvO|k zw@cRcuZ_T0ARQqJh?st?r_>r6q@cq->mwFzgu9n-pT4dK*7FX{-kZ)Xe;sd!Y=KV% znOTzDS3yE(wT`I0QRIl1%T6s-_yY^wFA2N3aVJ(Y2@G*2FUfvhyH5>ei$Qhe+d;TK zQfqRd$LnP%uHOD_^v-qWBr)2q`)14%TnJh~>0gtRrRP;pCP>Q%>t}tBzD*P*%$qR@ z$eb)_G^4e+Eh|NoWoFp6U~Ijr1^Z(DvUv(B=T!YMvVot@WV;D+>@ZkPx$mg*D7s#V zY~bKWLhMZ#9bfk3ldN0aci0@hH*jjDoDJmL*?jC0?SW>iGe`P1Y1$)Y`=L1U#3xJC zz(I-b+s|+VYT^Zrg0j=1?y;aXt%>VsVU)W<4Uy4Wd1$jxJAN&zo#@d?yHtq>W&H@t!YI+ua5V+h_~lU z{5QMkZy41Q!&3D4%0Z)|X1KDUFrt)=nffA+Yq-`*Ayl4~BERwTcU&tJSDycMh&zeZ zE2LA29Fo=jpaT4knDF_n|!c}_<+%{LU?rdr|qpa~~uo*~LL%cu@C zX7uCRx0mu~SQ-N5`2cs-scIpqF46>|z9uFu;U5Ow;Nd4X!ey%jlw5O=M-tEY{Bk=b zL~yooauW4NxvHaMPyN~_kRtE=sjNLwNea_@zAy!m*G61Wj)s_`+0SLloMu*uHyHxc zW`3M1?>f1teRz%g2vZ+gsN9KtRW{Blhx~2Z<$%{)FC&;S}DTsP3vTKOCOuY4ceZudZE18f5d8etC6C3n2V}h!B`F*dSlfd=6 ztbG_(Y^3%)N!r`wX24fVdLYiErL|R6AVTyC;}5GXt5 zx7f>jq1KT%C|Fon;%L%0z>>}R*o(Td-(`{7jA4paG%7boz_i=j+w&;(@3nH7_P>Td zMacDmUu!5kaH>2H5*ozdo&3Q6I*^#3{z@sHOQqN?AQ^$)Sh+ZQMy|JOtpvZZv7r+r zTnF|M);Z?P^(YujAMyc!mkUhh3^2K`{e1n8 z?5oLJ{mt4mrY>W0sZF`hh#0(@Xh!lE!9Zj3`sA6ZQDX=EkH|YdQ5XRa5lIDw#HQTC zB;$xPnWZG!#0JdGe(%E{mLjPOUbC|*{rzv`St`=^bJsD%J%iRvKVVq(^qHB)^gtBY zhtP@@D9bkT02Mo_rvvPt<;hrzahBqO?Cce}tMkIn1fDsbygN~6B=W3l@IleAG7q;U zwGo^c-ML67*DfQ!#*GUDpkQb2)+=NZ9zfUbsaN0wortN@h8w93X$z*Gy1D;I-{K6{ z?GgsecHaG0*rT%spQkUF6lvyEhfR^`yo3E8ZFko_;$*T6A%L_agvu4y?f&b+t9DFf z5227wr2J75Omt9P*`7}P@LzROBTdu}Hfzks=}5|bwbFCXN84pTXMvntE1v7(N=9Yp zBompZSYZzTDahR9v20<`E0Q(1(%@x6WvjBT!seAI$VOwftK&9TGoSMa8T)+z0-bbm*%uG;dh=v}0lf2_>EnEReR=I^z2R^}VT$Wk!|djS z6k9|A@8m?SxAZ2+P1`-S@cnaKOMPH!3+yj(Fy}(?l`Pw=i5gi65x2+=RgbG!`DZed z)3L9Zbz?pBGOpuXb82d=FhJ>ce3PNiNQ*V4#^)X}tJszBL{cIz`vQEQJLiR}jI|YL zb;0O3h{$Yi{94!i!Xqw%Lh?`3AnaVMj>1>EuI?9RTn;Vd-IJbO(mOsj+$tP_?U(Lf zp5Qu}bMknvFkXIOc#cOr@7StNwpwQO%Akmnz19%^4MjCTwY%04c9k4#f5_5g0hmL` z?9PtAT=E)2q7fUMa8BUm2BxOWUZIyM-QlIAwEP9@%<3zzi`&EfP}uN5%SWdIQ^>}2 z3a&Uh5%eI%eY7CZ=9nODHwuMvl7gug&!q*8!w%xyZw?-bqsW!OV+rmm)7#B0TGysF zEul*`O#71V|3l;&Yg3TGJKBqzd`L-$P+7KL-l~tg30QW z{QmPv7#TwmrbPxuMn;eJzFy_pqn8Ij+@wJ%QM@cmzk;bnkL!2yZZN4Q=C`e^tb(-} z{-B@lD+K}hDNLn#4+FJ{I}9w)3Pr5x6B<8%`}XZ<;=##jW=DVS_PS=N_u=@LWWzcd zf6(SlwAXSB_^y#S-2V?%Umg$j_x(>3QVoR^laN7{5F(L6$ym!$h)C9~=`Cv*lqg~B zOG!y7k}Z^Fl**cYN%l~7Nhs3q+}C)&Ki{9n`=8!(mvhfO=XuWS-gC~CP}sBHGb6qY z4OISC&&5I2}3Q({9an^1Efxs$N`|&hx778T2 z?DMfqvNE+a3v>{wF7Yg>Mu9?#;szoIz$|RHr0`%9!#Mm@S$3=8C-n1N4ogT1AeAF= zt5oeB=n_A`8;xWDuC-Q}^lr$h1$m0IO2BC$d>4Gand5 zLJ+0>s2biKixszV7%UfnUHv4HXseo<2Zkp*P~^yRTe#-EZmKU-D!W{~C(&}>TH$@R zzX2*L^6cjyKZf;Yt_~e2^|a5Vrgd@r{OfZsDLv)`wopn|EVU_e-#6PglMUKVf!^vp z<>x>LC(<$-KepB)VHke}=xg~Q$xc(*2v*Pf1+ zl+5L!Dq`I7$|H_{WQIIkJ}R2&8x1CHI9i!*zm{O*FdzGnyhNxee|sQ~ZF$KSHTpSa zvd%KLzu*5TNS|ga>rqed2kCA;B z8pdv@4)1w4R*Q36reQKE!=T*sh%dlIQlARqRKpZ8(m#}_8MZHZcYadhI^Cly%gX-Pv<+5^hiZ&?EuV^~$gknsVz~$wf)n_OLCh6Bl zGFT?R0pi}LMgG{{Z{2f&LR@nc5WQe}>l#k#0>g2G<1Hhr$LTUf%4kvw?y?=eu!pM0 zVEL*H@8`5t`x4n6J&R!>i zZJp`sef<+ad|zDdW^90xjHk!p(W&C-)5lwKnMt~zxJx`GF(51xijr-K1x%9x5A1l$ z*XzU&ug|2VpTXAbP0k3*TwqCv4MHz|f-q^N|5{yDN|S~5@{B?Z>Q7R44yGifE$R9o z`D53i1P|zHpSHheVLTY~9^_~hT4k?B1eFebBf?)35*btl@ynlCtWEcGl9@t zEQYDYH_tVSOZbFpJ%ukV_+4WEcap(#Ms&b01(>h&_N}1=Gc?)%Nq(+**P%>maoj16 zR+G~*qSx#{a1*T>+UD!C*Fr@_R)&BKxf-) z*ZL5KS|AKnlV+%BOx1Bow9yH}^I$CTGQ#>;s6)PbYhwewvA_T$Z5mKOYq& z6hPR~iFV_Gxx_{iK@)r5R7D(s67l2uJ1M zS-Jrggb+?}91kyAdCdy{vRMF8i?cxAUyv7%&p&f5@BIIB(ilt8yc+{@y|9WD*C-=tkAd@ zeH#>p_%@3!?riQ1XEOrOEYW7|%bJ#F16_p5W@h3u$dbG%A4Hh&wTK{#o@ z?*@dLuDSix1d!z`h(%M=(>t*t@(ln?8z`o6HMwGg=+Y7^43Z^JJtBa7 z0lRQzGLHUL(wvXmAj0lvjPA2;U^}X+iZ&efp2EzHe*HnL#k6S)_3Xc3>puPSu=Rt@ z8)(LS|7lqTod}{yIOAFe+8qaRZL>#tOZ)>M5TINLVF&Zdx;$L6}U=V;-{&^R_ zOmZfutks9gNX*dDMslEmw(0Xqlh6kHp{79*s$W) z86N3}4wo>3`I7gB3kin{J%1Ev1%9%_ z8y}p@DD0>6f8PbEnpDrxyRoxE)a+N};(Pym_zM{YWAqL8V)w0;67`foI3HJk_G%LW z<@1){cTjEUBvAEC6v3Bcdv`Q#B_31!KbT4ER_pi{Hf*6WU;U#H-e-N- zb~SP1^2}7sysBzzNMeqBpdR<(9XHQ%1~Q)4p0EC5{;cWLV}SPa+8W8*+7!*^|2d>I zRR|h${JW%}_pn1byldK6hvAvEx$1YrEn+yT`BXZasb8 z(e~V@W%Q^_lcG^ZjT+zl-*dc)M5RI7=YRg5$$lclJL^U{b3Z`xk|nFqEpI++hV+W) zs-%9pwU>>e+j7MRRi0maR~OeY^2K~AqWbD2kQf*8Tb=Q-=OGgM6e?Yedv?YsM(;Jg zxrxyj&Q0n?Rj&yI%aqfv-mNsU%&+^i(%Vp!Yg+y)*{|$Yd33i6&mpFz>)Ar>^3sRO z-@-B4_b(qJbEfB>|A=Jl%+3-@TVUKnU=k|I=Eqvly1?m(qea10=YzkzLSqW4D_osd z6WjCSw}o5U`QT=u`Lo{F9~#Y8UU^K4itL)TawWbz$Mmu42>;}!q6paxj8@OPf19cB zJd2n};u(S$<$^Pql}Tp!+1dxEcN_M`eVQQW^d!Tw4zI-T8d7`?h;ZU-murpchiHDk zsEf{_wVUCZ5SHWGTarf!BDoIYz8pK8xHCWc)MpJfpPjw}d3}eQpTpt1oO6#MsS0Q% z{;1z$oHGTV$L#zZRUa1^-<)V*(Y{pcOP4>g>FoBng1}l z?HzaF0k*`Q>e7IUJ24salYvDbV%D6+&YxfAq_VXVs5;pQhPO{}JJk8(4n_Y{%%UBi zbocJvQCr)~D^Q5LUZhGfl^8uh=ct$+Y{LJUIepXBO!>eRV}{Oyi)uJUX-$#j2V^qF zUqDE{cG=cMV2?RyAbNMpPF>_gn<%b9mbzQ%Gu>}_4aWrDny>f*=u`T*I-le>k@WE3aG8!QZqEr%Q1RK#`zT*B{ClSyc$w|2;OTfiKjb5Ih- z*ZwLVekRtR`=k>`b;a<0rtf=L&`iw3tUM2Nq(IFu7L7I!?K#0%&|AyB99y>i6A}Zq zYF=gS6w6G{Lt*y@&b~mae0$P|gR8+^nAXX}?KP8p@Up;3d-jF~ZhL=3@;25WM6X&ciLt_L`>o}D6inMJ8`4@b!u6>4c_mLWC^Iu9;$eP#kL^htFSBo zAhfQoBvFp!$j>oUyvT?3$}?w#*=NenUB3*U&)fcTk`}!{N0+Ud5r5`6$+FvZ0Q|0c z{ci7Ji5a{R#kb~6nF6iOy3BXpgc?zdy89&jzL5>!5VY*6k^ez4H3J<5dTxSWUiMK7 z><|tCrv+;Fw8FodGJqo#OYvQH4WQpfR1@(2-%c#mFw@E=CP8AH&ifto=OSO@fC6Vj*JqO?Qa`N@8*1Y;={ z?K7qRcTX_!sIysIU4N2R7Veb#A85+Ao|wUb&?f5pJPyoHlbcY)mZ>< z;xfqKEl`F@O_%@L>MzaB?=i+&U$3ntx!e;*nCmPzXLJX^peiHEYy}=r5fw>XV62d4 zDSWn|r>lD&!{tYeZ^EARfJFiG;82O`;J9nfu?UmK^p3nRh3aedClI10^&cy_`3X!_ z(mO41rbQoz=;MZt8#+4y_ML%~fx$7sb>O8mr1@GF<*OY|+(t3k&CSgXZE1*|?Kov8 zbNq>8hR6!kDWeH|f!8m1VQe&Z5JPPJdK)y#r}MY~W`s#vwpfLnIuZVLZL{_B^Gi)R zyU8O$)~1p^RpZq;rp~I8sD|OWxj8olL1ZiD&w{dfMEr5O@juuVD%#4*YSFmwk$pHL zV+AswAR2L}+B7bL&=cnmVv7CjZ0;TFSbf=X2+KG_u9b%83|_x)+>TH&3@(3MLn_f^ z2l?UQ!-wn8d6xXo_0`pYhat)8+yyy|YiD3;(*B1JA6|q8I{zZ!uK$a?(sFX@1|c96 zYyq>#7_yaeshqKO(vHWbO;>+3QhDQRu-!R zvrP*^Lcc`>*0GBr;OUVADk+0Dxn$QGLiAK8xmNj?Yum|EF6CnBPkLN57^Gj*3frPQ zDy=|*mhg7U!;m7LkE1g!bjnw9R;E1G3EraoQ~BTtY^+Rqw$C}BxS5%)Yy0m5)f@hb z1J$Jc%V%F$Y9_9;O8FP>=SVjhKdq?oy}>3kBY0Vi$6id!DeMv|s|&I;9A;j9b{m^d z4Hq^bDz#3z;LXa*!E#j%We}1?o6LpiKj{XT@*J#e&~l2r1ABuLJl%!h*IH$HH>+uP_2~W{ z$l`zJyJ^GP;Q0NHXzWZU8KLPiGf#W$NRMCr?06S2@%;D75`NgK-|L~LK#W}gVHbRG7l2^I z?X(!N75dwperZ0;)v^K5bbPb&AVA#|ARiZ#wFsq@4Y3itly&o7svV{d z;K$s9nhTqS0UDF;HA{QNFi`cw4XGjDTS4brhlV*PevsxaQ;e0aj5Q=7%aKq$UyOOo zsr(C^<*uy38kVB{cAM;kRQh=g!i?_zSSzOf3!356^VP zukv7Cse)>x`Xw2tV}Uu9$n_NljP}OGR77VYZ5UNbKPgZIXE0$S?0~+t(%4;PGTdL&)CG$3C2b-(*6Bq0=1Y}SBP*27_`RdWnk3CC>;d;;>2Am%i6FE_L)0NHwx!hjL*TJ%}6SA7J z$$GUIhI`JHMZu9%CWpvdMKiXym72z%hsVXm! z3xswM0GG<{E=c8yAk97XfL?d4;=?95k5-gj*@VB_+CM(_)Z$bUKng@a2)r= z{e89G#a@-BzzVJ7@9XOjW=q`zi~8p`gk^T!r|ER){cOX@YUzx{g=u-8lBS zjc)BT#7JEto9x%)zUd4P{aNk-5ktzzY?a1ltDNIFxPNtU2J)l=TG*8YLu9|l{$ZS( z6*IMr-_j7wcQst<$9KT1!4LOm@<572R5jQQU}^h@Sp41Keuu4EcZaR=B7s`z<^c2? zT#pjUY-OD3&3g&e5mo(fZ?$^NECa_8B*hZnv#*$9rm8HKnc702)hAcJRl-9bzW9__ zzN@cb7Kugtk(nc$V1LXvIas~&EWzAz!^s6M8Ecc~e8%vUQtecmNgGh^Ix``qoa==~(hPQ9uw(?k&l1N1#Qx9szGb|Ez-Ps5> zj7^o0B`2lbfAcz;kaFqnLEo3+TVP$zmT*gU{1xERCslg^Xdbpv$Y!_FP3@wO_he4S zGr;?X(JBKM$p#Wk%vVC1)iI1Zk4=!Ics8CP=hEQx#&M92vCYgUMjR^1#R9;VtWNJA zV`2HS|MrH^WLn?-gXe=F6pM?Ah0h=dKw_tj!<4+6B-^1;_dqF&P0ks;)FboiPE&cu z#N@!}?XYo!+no3J>*_)X~%9Du#>dYhEU1@s_FRMwmPVd7!{JElLUewv}UdYlv^j8BC3gM;@dLJ4UvI+hleV<+&2)_GdFBH7p<1LW6 z*bN*~5%)!lV|%+=aT`Sm64E|e+DTRB9mJz>hmjweo29|?bS66AU&Odx=I(ucZb61? zYU|hmj3qcXKsdEPI${=^V+RSxREI>Ht_jP|y3UERweY zcFoUxQ$z7%Ogc<0&)o7{V9%aLc;&i@>(paZpIOk6d5XO6&oum;3!V&Z&huA9lf zgz@)Lrve1m=)lWQ3yni&-3y$MdS(MRnuDQn2qWg5`BnVx!2;vw_!07r%wJR8_Sz)z zSGVinTMY~>8vz?r${l?KmJd8ZJ12OvZ*PO&`oK=xRg=40UqZ><1YimLB--Eys(zF$ zkz-!k{n@tG>NB%e1I=IhFER^#`XSAKvrh=?J8k)o;VU(9d6CZmnlC@OTB3kUwrZE1 zw#pggmX^~<=O9ie3eG01R<45fh(U1`kbML?(~4JX@~Qqfv>JX%eos(SudW4k#%qy+ ziPlY8A%>H8?kd`tVEoxuuT!VXUl<*KaBgl$ZE-DN@#86RdE)ObFozrq{JiY1FZ0#+YeQk8Oy3_P z*)|!U-yeKmi5@j=Qrz*mM|XJ^h2i}yI^t{n>4QIR_Bd$aBEk=XSE!O2C&B@(ryfmn zFT_{CPW4cGdU}!(LY|D=8wz4QCI5nxIn`Z3Q=^Dwwoj~Hx!>rBfDXXaSr`4q&9J^u zEmP`iW~9g&rc2YGh3k4@gZeZ8U6c{JJiQm432Fi%b(1wUH}_ouDMI*o(SMJ^-VnLg zr;PW6kdjF2X%yYLb0=I{ev#nC&0OdnBP|*tM{yk#@kVHj^@pnPSpU2xUlBClZRYd{ zn5!J-f)xPZK4^&WG-}dlTY@!J!`ZKUB~A5}D!-BAUaN^FD5yU8NhRZ$h)KYSbp*zN z@|VJi@`9QprYa+pI6F4^khyt!ESWa-fpHRSf*w z+uI=(YYS{hUSqBd0KsOjBlHUUL*%R=2CIETj@fx(Z9Tmv;--8l`(uB%c9ehE0O;F* zWI9yK>Bof|Xbvcw*(z>{b%^==u0i{N8jhD@havAnrT}HP0)Sp{D?$Pn{_fFOWp2DK z*Ggejo)GBEYI&NmploqKvA${VA^~FyLt5S!;N!u$?cVC*7?|{TNq!w$HmQcIxTJv* z1Z@l!RbT%z7s}&DZ5~Gtt#Ez)Ws=cFy>FK>?khf5$B?E&w|wWk1hQ>mHp(CQ`-Wmu zVt;x6F1Ti7@-L1L3a^$l#Ap+i6P4C+c&LlVFY<1c5?uVj^*6-=j5aV8U-UIH1 zU#q0E4!>3akEsb8#?QgHEfude!9j1cdMhKNGNuv+F8Z1QN8C-&ht$Ud^6i^zbUjLaE$ALY<7(cU4f!|MtoHrb z6pk|A!wG!Kgmud;_3RM?ezl@T*sH1+JQUXJR6k#C8bfW1yiOk7h!Cq*Xmx6f|E{r< zG?Sc0T-`UG!TS^6wJ93K*0bar82H!|Q0)Fj%{nT!wWb!Ly_k+6G z-!vf3vfMiogG^Ki05J0kUg_3Gq3haw!QCLCcCHo}WOvO?4#VI!cOqX;Wy;}#ts1wng+(#)flYO{FrNq!(oI`rNhl10 zd;#ddA$>=?=$`Tw_4sR0Hc5$sW-u=uyp7<21{laIHk?c`p;Rwu#3cnW zqz>c=3}Svxm0ro8GH|jCRuaH)vtHpp|B0)7iA6)Y!)IpI+hozU%m2mM!8xUE2~I!5UHZEZ!h}(-LfpMf*fJPNpJ~IBq3gM z0xwIES83iM)4Bj=F}B55GLLAG181;oHZHJZ`v*^eLu(-6C3(b+gt;k_d&y^9^!0Nf zmVwj8WgcI~*K{)iSyXou_;}05iQn;6uPM}G}FnC&40`s`N|J)((bKeXn z;k@TWQi>UFXz%azgV!P%^kF$gRYv^jH^m{)W9%1{RPW_61z+6hJbZO06MuBO^4&CK z1(JmTyB*<3;%Ffa{Hw8Iw_4JX;D{*&%m5n0l#|$$m`A(!{rmS(VJE((##rC;$CcFd z?Aemx&Lwc@U;YBLvE7n~3L^ZqO4AO5l9+0_02FmY6hRSKhw9-sZ{7qEe=I;rMbHwk zK0!3>KNP?Kwn7l1x9{xT$;s&=1aOAo4fw~gZU&p2iH`RdxEuib!9{k5k^%2Fs&Jya z|5Ql~L~s2Mwrwt7zAT~=bzKE#5oK5X5%c)ryN2dgaY#`D%}h;AbpddDTB!rl8H$DO zT>Rny$QX^szy#FS*B7$^TFc%KxG~X>V856K` zfWfEj2YD4hw&y>k1eFQ@i}tx@i)=G}=SV|#(dTi&G@C6VFM^~3T+@2LI5i|Bad9gm ztKu~K5Mw&C#e_deZf=LSy7qJ)9H7orwgl7g(<(7w3_SB%yF(0I)%l_87A4p02D7Wu zx2lhpdt&6I<}jwGy2r4g7TC8rz(Q5Z5pX<@+MmY#6~!zeLSfn`48#@uxWEdYYhnhu zie}|0jraD{z<~mW^yU>3e0}@~)K~+0fRNR{M& zrNV$-dsg?O8Aff#EJ!3NFOjf(wKY-V%j+E*TOO4@A{WnDy>^Adwqpe0#B}wV&zX@JuGT;hzC>8oH4T^sNTQQQ-KZzoSo?E)fy!P}B)k>zq zBXRduEB^#c-8H#l)YWn$pk6pVOhtfO=~|M~eP%pgI(&dr<;YQT%MPX3#l zPS)dIVf1&|sy*LZp<@$FH=wN+?Ab~X@hOIwHdJfSfp`1K+EC0}CZ)kkxIFrSr{iFfW|%F6Cy$NU0t=Z- zc52Y3($dZDIB7cK-hjj{-K_G z?GSwTecid^MJ9?$BGErjidw`U-);*t1-&zXbo*h-!>167cV4FjV)1J8D=KtHMNliy zu`B*2^o~zq!cK;ucW{85Hb!|{LEiVq$r6@^g)y@NUT2~BO05@OaDXgh<_^x~1bn5s zs|Pv?S$lIYOHojsNR<^7>QzkGO^bi6g;zXYs@uGVKY!N&aGFqg)+qo2`P^0yKcv-s%oF(6l=qqY zk3;pacw+m^5)rpWCs)S1N_q5S5gZVrTWhGfu(`Q0B)7aAn^mZ2VR6x>xz+$&YGon_ zmFe$|5Cq*-QK5Kv-8Q!kA z+d!mc;AoVJa3pQX5Hk-!(iTjNqIfsgjBi+UyVRT}5CU7O=6_ZPrM;EymEy~wwQn_R zx<4OxRxFB3#~|h)731q*((o%3Tc;yX3Nf?oVkmy^S*{Tu1lDD8;QjQmF(7QNU6!J? z9zH$aGr6PYc4ihc-jCud;DGJTeE3KkN%5et6?ZlZh?s{tx+1nA3A&cN{m2$|yp zg+ZD(Y)($wME%E`u-vdKF*DF1eBW;!{@N^uK^Z@dBBZGO95n||$E@$<@fKHzMIPra ziDb>X3J!VvvFBmQg|34Ykdh%7?tf0heIDOindSpQ#wT@>=-T@(|>E-mF~HCez!?Is}339xmJmjccrpDNfF1~1Grg_OT`f z{FDPXq^Ub^o``}gAjEY$o9lJjKf1ejr8LAoB{$)+JP&0WZ{NiZSs-vx=sI}iB7#-z zAIr;!{sUTISP8^J!+jt~%RNbH{aJ+AN(T;93CTdn@&$nOBuFEH42Ze)^%0?@taMz` z7=&72DJ$JSY%pMrXMiHB=sk;Ri165D59u3ienW2<t^@b77-o-5P;BzQ`4l!+uU?e^ zP?Y568$de>CuO=Q(IgcZo0xkHL{9;Zcipeop<1>71s_Yl+d=k5!~C!xd24k!^p!9G)e59TylWy=$NXLD8 z?37Mo$e>OSaHTB6z7+z`}>w^9c9D|&b3JDZ} zul?&c!sbg^t0EJvYd=fYa`9l z7+Pwrojx(aa|h+8>^O~(yS{!sgF|pF_UGoiN^y)O^7@!mR1L`7N3eVL448zUa9tD@ zFg`Du^d#s$2Y$668Hi}L4!EhLhtfCzRcQ;b+q|lvd}38lybB>`Ew?4cbpYGr{~_nD zd7Xn<;Iyf(QPeX6*AYJKK`nnu7#H`l(2{y9LI}?JgqH#gw3#W@X`<=U;X(op-(`8TERKCDxB;HgbAB3ypt<`@ zkF2kE^c9`9fmg!WC~&ESNW*$b2Fz{f4A^#ca^Jv^+5?^kA`k4{T`<6e?S;{q6FcFn z0CZZvUWY!>|5Kn5j%^XY`Wd{Qe8|t1Bs9wfR(fdCW5Wmz`2woGm1WR2$Yws?0=Zgq z>dSV&@p$FNF{U8u5!W{XXA1T{|Z+QM%$cV^;);4NaXk7GhP^(9jvb?wum!Eq+~qt-b?|KHm91qj=8rk79W$jQ5TPtSKRH zVg~Y1ddpXix(*(l>KngmRQ!u^uHIgY&54olqH5!t*iszn1)lkz(alz^a$yIe{J(G9 zr02z__IMWo=e$9dC)nAKi>s$_JSw9cf31P?^4^y#BN{y`9m?mslsZk82#~>ANvM?2@(|1-xt1dP(k$TEk^Bq_Y8>evX-aWEaUWBX{^1##D zDX7xaX79y4+}!!P^~?iQVKTp6+do|HFXUuoWvi1W2@Z>UxG5Qw1CXb8?(wMGjTFNj zlnm~x@Vk`2xF^#k-#T?f zHUy@!a)haPc#3rEhqlTy&&p(d<2jI$S^p%sD5<5TWe$#Mc2P3e4p>0IK#+4!`@#Dz z87JGIFOlR?Rn>VrF?C3&>d$_1(Gwn$ei(=3`7*B-Ip;U>_k%WFjmn7o{cLSOPV#Vf z^7ew~^d167l5JoA#n!oy|R?hj*Tb-wy(Tsvj=VYwnACoJ^PRwdhG&5>; zU3}@lUO`XXzL}C?#q!d&+6+RQMB%j}Y$A&azfV|i)fF=lpOX|h@YWC8Bq#7VHQwaH zdg;q4jPmKD48a1O6jNN9!!=QkheR>H=%vSF!%Hfcby${$Db7DX#L@7kfdI0rZ|qIImv z9G9N9bWvYbJd(rx!cU;FUkyaAtxbmF-E)~HAjy}d zD~;xlLc+TZo8K3tZ+EU^%pTAvSZa>Sb9hzu^Xi*JMy;7|xm@&(KoA(5l?dD|wj$ii z`DmOBpOw2Im!D?nfM9FvhhqT5rSl{DL$r7_`doQGlI<#%acUMLu;UtOfDE#hZe>?>VwqM^j zvDJO{Cn<)N|C~}G=&i4JGs)m`=E+kFpoX#&I*DVsyQ2!3?Mg^S{Pyh7o6q4Xo9tYr zy2Y21DvEpMbP_BS`NrqvXdA4N94^zF@idCq;kr8tInV)?8Wb4th&{FASmaw@7LA?| ztU)0&MeejplVav~w;O+TGT;0?dTYlTCu4`F653FPwOrmP;tq;m^Re^zL096VpXPdN z_(8!u)%if{HdP8MH$36JwsRZIvxGW~jvQItH~AcdLbOJwI!O)ZMamch=@ZgREv?{M zm72~=>f$3kNPEV|yZ56`>X5BMlH|&r5&F|m&*G9PtM|Mson+V!3KKCUe)If=;ofHI zs$b`knJd$PL_Xc@b|qRyW^H`Hyb*!+Bu`w|^SEnWAnzxYe#r+WR6AUtCtd2-Ry2xA z$%-i`tIWzj*ZhR&__gu2obT{f`TBQn-l%@^`7q_uGBr4Gp%T{aKyb@=s=oO3QqW`ME!R$av; zu<8uP!vk>CX{ri{{XXaO%hSSk&t2aaeXu136SH1=BWi=aP6M$Nr+;S5dPFYvzPzUB z@f%io{M(Jdh9NWc&qof*zR0*HleO6W5s!C&JetdG@8~GdIPL6=__~et)#*j^P-0dO zjW?Uonm&L2Oe)AJzYDl)g$0Rh&sGrx9~*xquZmW$L3Eh z>DcL79DJe2r~OMHmvQdi=i+)yE|f93xLj%gG5|R+#TNHt8dCWMM`r30g9@8Co4NCKq-8}CylC9AtB%dmJPwDGHLM{f6(33j7&E1;1 zM&Uv?D)yStUwU8{Yngg#{_J65SW*W+O_YDVV1beU`S#-YT?Ee{$c)%rQ(-c_4NT_+ zbP<0t4*M5)X ztx@t_tUXPp=t0LEwP!?b9Nm>CZ=P2e zR;uH2iI4GJKHX^^I)dm;#T4hzen|lYvp?Fi-W}UdeU*x1 z|88e;o5R;F_YT#sq=eVkg=^+t)wRnAQc}O0IwWC~_dsQ?dV?D@g7fJUn)QO8X8s{A?^)?9RRv1)gQz>&KyTuYF0z$Kc*Tx|TJQ5>u zUteW_g`lb8HLluSzCOMV1&@pK$VSsCq=FA)6^x~A^RttaKdWJNOy4t*w2}lbP95=2 zJ^Y72)v~%y%(}BaTOyqG=72%w`tqG!_(_aRZ>DIctVVu|SZ>B$VI{w}{deWgUN#HZ z9kBCnz%T>7zkFCr5OEt{hL~syyX4f(6Z%_%Kb6@Xu=VDu(sfcxZDb62!Tx!hUBJ#i zQU_)J-1T*3cYM{96#m+Ab=>f-@19c~Up;#yJ}~wUwucA#0(VD_5zoomtI9K{h3 zy)p5!<@6uMM53Df<`IedfPsqBf{w}k+6HMUggum4(Tm_{vUjxP9dIl$*%D56$>?9v z(7&Wjs-zdHZB}H!TJZAj?8y86y$atu*RO310r*Np1?vkJ_zUldnY?XW=ofj^zp{yE zOLW~XVIiRmBh+Xcq^!N~!OJ9(`jizEvIgj4tiPV!LD}6p`BU{$Zr7xaDBg)`-VpgRt4VhG z_qM}6u)N1mf|}^ze(6#jw@c=j(ELfAoF#n4__t->^8Q$gKTex+*W#>({!@+1K0ZFC z`j4UV#tLE3D(_lmRaYqSQD$8Bkgch9tPeK%J07U*9d!nA>MT*g9-h8dE}S_v;TlMI zw^-`a#P88?QdA#RjMa50xDFN$>I&zrApD4(DRpI8+m$rrVqusCSgF}|?|&9%lmr$8&gOgVek1&(IpHbQKgVmiT{?FVSt(4lH}=-%y26f& zQDS}0j7Q`BszaNV<#~NI^y?UYrM^&h#LGL@etI4F0KwWOS2e{DIeH=RXn9Hv!x1-{i0_k__V#yh*CJBRSu z-mXF!O^rubNt!&T^KYaSr6=zD*?$tD*U3A3;;?-@iQcjSN(^g(DQ)dvZTr+HZ!OyH0UQsqy8jb)KPlMt8?y%uPIr{n&wCP#&CEDDF5bG;DO;YDseEy13sI!# zi8a1!JbVSiV-j`mM5hLdL=BRHNY!PuFmr%6<(zINq;#{P>+mxtjMUzfp( zCEGW@d;Ny_|Cx)po36VL;juEp9UX1!_}SnqQ*|x#>lHv>2SLXYeWWe!&5&i} zb!>m#GUU%#h;O>|E4>IW)%+DCL;r(U#?CmTbPaxFvOLe-iqF&}1lirxul*^^vscsr zma=3Ju{>kHhHqi&eOKYin3DFbG6UVO@o!P68z>3`FOrEqiX-ca+6%K&>L~gFxSLVPq7tl;ngog?MKxWlC zZBk|CPwZ!M@yLd zloE4B87mh0wGGpTeogX8M>bU)mIR$HdKEMRHczrrKkWI8ni#<{aUL^Lb?bPkz9x5* z_~^WM5u15ms5_2O0m3g2s5IsKs@*v4`BMyk|HaJGw+sZo^Vf3r=3p3fQ|YjeC%_tn zd3{0Z_H|ZmV&CBRjHF*gBZP3WY{n>k;=-A2~s-x(ev$Ky-dTQvM*Ro7RSB6u%2r4hi0p$R^4y9m9* zL@Z6@S^<3kZXgV_s?#mz`Emjn&HQx#=L?OD8v5bH$_l{F%rzZ~e&wnB8aJ%ui7C|MG^7{OF?#`1$fW@sY-vi4?rO{9KL(k=3z;bT-<0-;$2YPkxiE zRk^t{^%`>9s=6w8Y8foLPRh-3^6F22RtGcE{b9qT0MOKG1c+-)bQOrSsU+9?MJ*CV zMuV;?y-;?a|4bc?2Z{U=T^6A<<2pD$+P?CVm2|^>V9Jbl=M;N%kup%PRQ~7XOX2S3 z3E#bx;xJ+8^m#urm{T$6cl&|nzpq>gB+VmSwV$hFPpHq<&y&7TsR_7J? zNOi`=%0CUwrt5uiUAY#O&!Z!QxX3-j0AfpqDj zo0%ze%(F9+`b9;iIX&UK+aYG-Y0jo^A4)B*PXFoc@?X4{ZQayx&t@q*bfB!{-uI5V z*Djq8WQmUcUaFA0(n@u$xt`ODu0%&nSAPFC{&n1fcfTMbR(kWc*x9ISs-h7KKYy0G z4CdUEg-zJ|uqv{*x&mX4_uM1y%;w#|%8Qo=+c9O~T zXBJtvHp6QUf@@xik5RZ9V~8O))YhBpqJBoT2hApL;0ciKvTLGW<1;GjRsH7826sq) z(AbLVI2uZ92{D^|A3-=_!rg=~i)s5O6yg-+AclO|kye~9(*xf1NjX%y-Q+?0u~#?O z^gq8u_vCWSBJva{>|f1OIUQ((A_p6W#~M@Queh`4hg33B4ncLj?NC#srct#n!rJ5# zpZW2CEJU}V#E+1M;rRXMUb?x<T~R1mX_tG9Ur?BK#|9kQ@lO;t0(`Tz$`;_~}h6?m?zXe%C%x07<;WU?m!Pfgtc zmrlkSS<&J*ZZUTHtuq^Ps6I>YQn)Ry2NZM7k~0;xHB0^(ZxtMoipESRxhz%`@%^}(n*ow}=#RIm#bwuKrct^>*x{+c>3=fOWgFw7;c?GUfn zMb}_L4@GU&)vsD_%9qX}FVzwpzQcu=$Y8|Q5f(^r@3>8$P%_MFo;=fBH;R9Ahez?s z#1*D|X>7fGMan~Eb-Mh0>Q~1iG8j9(*U5&5i0ZPM?$*>*2WpvpS4lwgeG<(0T=Tqa z`@d_2uMLIO>{f?C+`M{E8EmfK`6iVaPE|q}eZqohyS=&oRVX_0wn9gU;@8yw zp&0J7Qs6gl2r-v$oq$4y`t|4eeKp<(YVH31L0SiLM6MiQDqX5&DN0f%e)nB^$@+ghH6$JFLmF zBbr*@MgN}n%k?pSyJk3}8*#xfl+D9vHhe?xso!nZI#{IAhY=HEl?6`94yrwotUB0n ze*}xJ!A0q(vL5BY$==&Q8tWb}-|xE+&s@Eem?tT9 zr2|wDyIkC&sv#g*eQHU4E`2|Z*lW>A&xC;5*mJ0de*G=f;BVoK@0_C{Rj zMyBhx1S~#b1@dhc;oT22cc`HQ!n3(Fu%T#%z%x3kY)!6YbRooO=YQRB!BC?px}{|u zWBB3|=K2M@4j-0#Uw_(K1vXL;D$Qd%d4Rt|{r&sZgKi(-!kFU7^SLrD;bKkDf8bQ_ z4-FP)Baz@iK8g!Vl4D=MV4(QxWf!O!_}VjN#;wlgj@vPanYO@rMxcBb_Z%jcJ+U?k z{~JRE)3vaZs6#GVAv9s-q1fyUpcN6^%|;2|m*0wV3QbGTv1->H3fPn6$ivHPH=6$a zvZ*Ez%%5f_3keGK-fv2xGzGqV`Lf2n+`G%mMzAoUrbt&?`-QuoRZu*eS|7pTGYWD@ z+NSSdZDqBWhUx&iLvKSdMD>dXM1`ymNZMIFICuSkl*llgA=H>nLh{J}P?;~TUg6Dl z8rerH8XR7!L84=6Cp=Lao-Yeiw*t4^4K+j`)ac{J_x{#$#wM+G+5<-xyM!b6YSDzh z-CbLwG+LZTelCHnGsdGr zf(2f~)nV)u@h`>XN(84U6`<#4C8OoX&9F}Gh5~uK;siQi)i`Q9>9gT=&17-AcICUI69_gew|`z!Hjkd zP6HRhGQl3HdRA7}_*QjY{`xQLWNH}dod4*q!?r;vZO+`vYU!zFS2HtWJ$?dmWbc= z8Ty|8|9PF)>zwnrm+QWk_jS+xxfYIlX<82j!3v@p*bxWP#_{G}j4_{C`;MKPUNeTM z83Q{&Q%IEwzcquz%t4X@+03Jg>B+~077h8*d(1d?v2d~+9HTSI1vH};G=uJaWBOcc zbMW)F9x{RkusKdrc~NYqx6SnQdJhp*t7S%xAjqq;m7lZ8q;ta`{eMeQZ!6(-U&RjA z#(pB6_=hsvmwGmj8T{}(V3rKnA-H9Ru+My9o6BQH&Qs1Elo~;srIzi3!F0*>p5G3s zKJ(_hI3Hc^_9~pSP?xU$egr+4{z!KnII^+spQqoKAuV#3S)?&GkF4kkOpwN?_A|ux z#bm|ZAB^CuDEnreiuRcIq`F%k6K-=j?K2{F zg+hHHLG0_w{ ze~fTOupKaJ|Dh*wl=e7jzx-xR>+0I0;Vi)9qmkzx>?-wAI7FQ9UM7go4+LX25lHgH z?QK`RrUqXi*+fFj#L0iRPgV7nLT*OXM{;7R0es}4O)IIUI|RFOS28LKA_vD-M#!n( zqL4Fr0q$@r>x<2ZhsN2AvDzO8!~Y00E#*PZP3m!(n;H$|m?WG{Fc#G+d z=v&+vC5F;4rOdTp0~aofoGSYLef;RL;-mCHBJp6vB!8{18LP3I?e*h8X7@|P5C|@p zEzHL!kCyU+0TCc8O%CxRgcxT&UEM8CKSv0!YpIZcVmod8wx=racfi+P2Mw_Eu6OZ$ z*dJ!fRplcNGh>l1=g!q{h1rAp17ck2eEwDgSi6v7k1xQj=LQ04|1O@oMZf<@pq3)!Nc3Yi<3Az*S=9$sP|uHEw9Lze*@6%*sWqLyW?Lne)BPS^6BurgEy$yl zTD6I8!u-Pd^B1dXOVxGZhN3Vr4cF${()~la&-WI{!0Q6snKPrw_hYEvU+OtIrEjiN zh0lch)U;(+@Ssw$xYFGp(W*_`?kw?Vq;(!2de6A$Hg1WJf-!`Oq%@fltHm7adNmA7 zWQGt7BgtaC8}tZv9nF@gt2Vqj?R{ajXr#_Cz36-IpPv;|N*mW!=bvp9tkMhQ9xA{U zAxVLbw{?e_^M&8SwUoa%03t2Tlap6u7YZD#OAkyn1PE+9{&v)#)hZt!)po6M=dBP~ zD}Kq_8vteI%#%3^k<5m^r%qna1$_9#uaUY=zR>YaiYGXpyahNe;?IzrbrW;&`Y0Oq zE5^Ny#Y$t6qGk=F-BvMrIykWmh3n&*3Cj1|AF)X|9S)wspR0arE8ZTwZn!nF9hqXw zg)7~eZv1TNa8%9@;h2=d%GP?crO8&c-8))-q*yj$4W^t~3IA=J?J1Y$NBqe@G zLz^2?x*Kr8wj$=lo5+@Mama*3*^J#p#X%~Nj_^6bGB`VwRp`3{-w`)rpTZG-x{;*c zzEFC8-mc-a&2@NIuQ#xF0-T$szgQR(lX10PATQz;q$9Tn@O_-CrxD0SLJYB{@BM9k z%HQyde|5JWI4qDW_6gggy`TOk+~9&J=MN?ZO7@M&OPbw*@I}Rm znG{=2+<5tUB*D@7+?1FBwAT^H(wfRE#BA1ey->>Ew13)iR!(P5~L3EkZF;&Mg3S{A1 z8@H~fFmNhn%4M^Wb8sg&*Xf0Or45z1)*QmG_$EE?)T3Kc2W=UG`|tW2xz^kcc)>Aw z>X2cHDuUWfb6iRBo+ZF%^DhLs#nZ@?c+bW0-1zUw`8VOm%rV#@7fzG|A+vR{PkhHv zalOd~rz`^sXi}$WQYc{BfyH96w{r{T2~PBUl}i?-pdc`h6t6Gz%5TP#Nv?y5uU^#& z)w#Qy&7KPxiO)aLA$jZZp6ip`t|>fPo0Dyzt7D4cfFgI9E&L@e4c3DjVV5*ZF5rHj zXf<UQOEil41 ze;r+<36rYsymros@quTTdjSvJtU&@dkHt;wn4(Tq;%n#Zm@F>8AB7(vp`lhgm$@zs z=UL9VLjQfPa&nu&tSJvk|fVwcS`bYrl1uF8Pl&fgFVv=ef- zkLi&2kd?AF)_LkbQ))L^#fr;jTh$7hF9Dl;csyQSS{oR#4{Ed>fME1+_9uF>$1c^^ zDkmPnrMQ#KZ4bsx)DmB$Wz{C1n&PUouZul9TSD1o>IwT5U;JXgxhn_JgTo!qFEYQx z|A03dCI~i;A$pv+MlpY2=(!t3VTh>*}G@mb)5ayTfkY6yc1-$EJ$nCI|`b<>n(HVdq@hQP z`E~ckRagdmM6G=Xr^5*?P!9#wA9&eMjB&<&l1WG3yVg@KfBDFucS6zo+rEUz5qR_} z5^s~$ra{2^rN~&ItD02Pk?;xzyAE3u^6YtJc848po5cR8AJ8B9!b6u>#uRsAke>`- zbl>rK*|?5Vs7l9Afv!MF<2XbY_1ARY-i5y33`Oi`OSM?vBQ z)X5TxIAaLDmlueiz;?_2MZcFHhn6l$@ujg@Ims5FbevNccz-d*NiZH#@Ca#*=90gr zBh(VD-7hmnQLlW!I(eMptw1=z-gD4BB#5tmbs%Jt5N0cw3YBQnj0mYQMIU#ds5BW_ zFWi~be^Y&4QrHgCMlbC@G?NDX=n|W$^mGQ_kQ@af#U0hQ!a?sT;}|n^A9+Ieo=Yr; zW)6Y$%4+)se=&Bjb{%)M^N@*a?Aw`$WoNlR;yO|-o||+jw(~fq)}bzzd9DN;$KX37 zSAk3bP_6Zj5JYVT;o(Q;_^Tu7pr>m~7ejEupE>S!O!UZ*{K$0UXu1T9s%~!FkGHvY z=ENBU4IU+rn}r`{XtH18$it7>??svz9D-kUdRaaC&@-&A+WzAF3)Y$ zNjj%n2S4uO3SsjRO@fw!;;J-9Hhye+FXX%2X4daSF|F|SB<1DpNWRI`6DF{7mPk1f z|L)Sx9rT1I`JId`Fm7s%_YAW8&Y04F+QJ=Bxiex=M+>oULQn&2RqhAAHG1)mG7ss@ zBZy4D=jh3O#P1*nRFeW;+bBJ=(TqCttlHgvfNaz9d$~_Z?Ly%3>?RON@I3}_BKqj0 z`ks(-{QPlZIV;&{o#>MC)()WbntOSsLfao=o6%5BV`EuO*)*N9=7Or&)MK+H6DvYrGhE~~9 z067`MUz4$b+bZ`FViZDqHIGzqu3&nhK@GwOLrL6yKrjaRYhj~T2w$8;GOb^v2-z-U zh9elR64LTv^$|V7RauX(@1hao`#4G4B~!zp$D9{AUIY%}4LreWfc68X1a@UC4M$_0 zpa~5^>53#7o-237NpK!5^L6*1J4M*x5yT2jT81y#qd6+^P6y#ioE68Eo0c9(46;Dc=05tz6w~!A=tehwy zqm*<-$W0*5{5ty|=<+3yo09^M4Z2?TJ}-0Phj-`T%T2FIrphcdBlWA@4~90!<3}SIqAo*GVT<2HT2A1FvISNBSP7KJv}`m zf3-)Y$>FZ9B=*t6Gwo@dF?z?3#JCjoI=f0WbGq)&c;#i&^#O7~^h4b8&Of^iKB*Dv zK~zmafhW1-tI^(PhEC?A;W2nWBt=04Jv#N5D3b6Lgn;ll#W3550phVA*7s!JV%s21 zDuIUjX^K<(0;ZDPa0;A2rJDV9KR>@p5vHRs+kJMonz$Vcq31;R8EE$9Y$JY)Mt$KV}q^&c!-vYg5QKH?fiFS2e2{? zK8+by2wx}Q$3lTJ^wf#7TSG5Q6;QOX3Q|i&owsg5S%UM7C4*I}4B>yzkqaPV6NpUBblp=8V7s*k!( zEK9C7Ye^^BJ^<3i8b*$;Fd)t1lI%+lV#X*&mDykfH2ArQj+=#YR!X0~r*TTQcqoUq z9*1lvv3Jj33;d;%F*(EzMJ(e8{Klw;&jKq9Et6qi(~rx&bJ(HVBw!(vP4xkvnFXr- zu+u86kVU=icKZ6JLMAZ!QEiR>EC+n=3HE8*UYnYx#Rfv;xV$0sk9fb$9;dVUllpX3 zvP~bCUw;i>dYTC;MR;M`Oz8Vq8wXE5bO3bSPZ*Qm7Z`q3gnwZ~kFGj-_Q#svKZXrA zET%k)%O9oi-PM@a4cBrWrMA=?=v@re|HGD))3W`?K3-?FjN7oMg(VlSDziT@9CDH{ zoYc35B5l;)FJMR=CY1MeX`86#&JZ(&a|1oHTjJ!2qp?0@(WiMVDU0U-^LT?@u?X`r zvTk8gkU@}VQ0p%OiAjQK%3XVt|8I)S`YW#oXK|ZP2c|P_Fd4}B0~5cjncxScl}$)W z-&qY5{4?03f>3_TrXkQ_A>-|t(?-HEvc$1}J321Kb1rssx^^Skck`sUuTNMbJ`w|| z5q)Wj6fi7cKK6EpgV^ia^>I2ugz_%mSgO7?ofDwunkEV#C$4ArBAmOY%I?p^6l*WE zQf8JRxW+A2Mb^|f^EAibC3(F{Wj$mSS*6W5LkIj)Ura>I(4hQ}vZI>H4XO*bGy929a7np zM7S(KU8|+TQIBV0K?zhSd^AxfG^eDGW}Tl#wlJZxWXavJC}EEz9l-!|=+AJ?`YPYb ztR8`;f$6@DIngCM{tMTDHbX?7@ta5$eyo2j8Y-qB41(-;e$rhJ{dfo1j}<8!7YI~V zO_@kb_xjV}_SfSBBf;kF_dHDSpDtoF9obXh#sFbMHb&n&MTA+ze!k=@zX+ zNA{rZMmK9DogO)FCnPeZo#d*=cYp*kzFZOU>Tu{v{~DL~ftcre=7dzf4=IT%lU?Jw z0pLX*s3R4RU1P?VDygjGBmK%sN|%zS?HxpQgwr6`C;lMd%6SBU%eAWcerA{e3nx;# zGF7dT%ci?7#2YJsS?&!=V@A$BO)Zk@1Xd7~c2KfqTt&4Qb_SwcrSePg59*Ys3?(+74YNR#vy*>!KabVSd=v?w(9a7W#X>Ew@-m#FtMO#L!32AvkSb`1# zVGO1+I_Mm7h?HmhA1X>kA&qiO6WC)J;1IWFgP>yf z)7miG7w;~8>j4BuO4yh^dYb%hM`v2jKI?ThwLegdjmdwoO)-W7&6Hrf_3q?UKa+1UR7&uTZ2 z)gsX<%X8Y(WYdBlfL8CJG7y~n#pczh0q|aC`>a!1Y>w=p2`)Te>WRh0ix=BrkfU1g z9rJVqPBZpjWJN}O1kT3?Ut_a-a>g z0*yRr{lfqg3R{;!P|$!3uvJ)geAnZ{=R*Gq#^g?!8>Q&AU7Uzw(a$jEvji=9vv>|L zA8NwP9a{()q`@>gKRRdbPLaC0*ZoZnA=y1Zp`^pU3NOE))-lqV%56lu;B>oVyis+c zbQ18*WJ!R#+HM8!->mmcdE$%g(cJ9al?Au1B#QF@poY@W9GGXDYoCp|bFx+|C+I!r z^X_BAi-_mh-x{hIeS~_5gdcJ%W6}%IlTYmFsX2K!TD!`{_Xoy$+442V z$cY|tg3DN)!vj%@L76^n-*=gTcOlb5y|#1v*Dvk|Hhji&qgOExXV~WgkZ6;QjJm+6 zL1iTu-oV?}QlaHSo8^P=THjpjfFtzJAuRqiGHCSX#@#_>@@h5dvP?;0QnJ0SbIVVz zg&DZKNDiOHRJ*OaVglN%$b6vqRw#(%TaeKoKMP8`L3TPtT+Rq{gsYM}N4`S7n_zouLb5lCs`oatQi zVp@b6KL?W2Tt(mwgXSb%w6>z8f+MC6G-4^lOL7p1Xyy)d{c!S8q&@tY+Aj0W8#!xn zfqhH%*yE%#s1+{5b{j`bh+WJ+Yc5@DE!xJ!4HMU96t>e^%{p!XeaJy_ujH2W>ech- zGB01QaO$m_7BX8bT=6RFD=Ir5tnhobM*YpBTZ_V^5_P)=}dz z3OU2f2cFj5Iz=}>W}i+lJv6WG8$SJMJt71r8WmB5)F&U%>pG)Y(7~W*-ckW+td)ej zk3n_vyP6dx&5)0!B~?k^hP3q`a>mqMlTRB7jcY{Je1tn2N^oRMdZqnla@5IhmXEea*527S~lbZr5oD0pjQ_l^!BlNHk*=-_v4Zzg4ZkNNricGi81#F zO|dET0##-%9LULz?W{94ex2qw*hu+$ErmcKx%{n`@HrYxke09gmLk%@#Wr$P+Qv)v zV{YuwFUHgv;#OvG#!$POlAl$}_ugmy(ADC`FJyr#ONtrv`g(BRzRR2i`ZD{1^Npb) zfu6ZpnSIC5J>#eMK|Iub4Y&RVI7_4A&iCzi>1(v#2>pY8;co&I!joW|nJ98{r$M#W`3;EOVw|OAAV=E=2lZuD6}1^{;l|9f>OWH#+Bm7SmkxT zisUa!g?1-DI$`5~GJOZ=5MHj?4`=-Q2cww&>EksLdL+4;e4v~JC`5!5OCQifz3eg| zQzPd(kko@aj1behS-(fm$M2Y+oc#V{a>kiI(ckA7x(ZOsA<@o*mDf!S1aJ7=>0q^9 z-$b;+$&RJuxZLC^vPj_n^-Rg7PMq3vCbJelr1aJcwU!ME9ZPk$OjvI6wbJumL>w)Q z^HY14M|`f`D(JBH-}m}s^CyajU4}r&yjr6ckMJXf)T<`k2vfb+HK>IyJWE{eekgbP z?w5f$*#+v60fpv`dZ1&#_PvRSaNXS>tVSlnwnS0?u*Fo%nfc_^32I(u^5TwFPFZ+ z6f`QG=S+#4HautDeK+C)kIdBJ13y3z#GHf+VTrLi3>fPhM=Fx>IMJh)H$NmH3N985 zjR~mphr;$xZ{NNUqf`6VrjDu|6+t7(6%`@Ra}zL37^aWyliYAYZ9hYo``ytGxP6Q^ zseDOgJoX0B(jFw zdsp)T5!~E9SdkrBQOVc;PKTInaSRZjlVGt?G*a`7;{mXJloi12T6Q4ca=vdCXkT1q z;OgAvr01TSey&qPzVm}79e%ZM|pJ>FjnToz?Hc|8IQy{y?({t%WS|u&!2z){tcW2;~PILCmmBqyg*jH89|Zg zFi-d3280rd`p%FRk*inFD$2<{bb*G9Rt?IJA}`j`k8os|OuNATNrao4xv@qo^Pi^= z%k?bZKn(Gxz+Xpe_~Z%>;-8BA)$G@D?nYQpr8wLMI##s;iJ7Lx*K6OZ)V(x7dXD ziMlEC!MVbmX7@NIeD1{J72Qlwqwb@v(P2_9dLRSh4kk0T)MLmZ2&O1`!{|@sX`oXC? zd}pC|(PJg)?O}#FcJLFgq-~bp$MU(`flH`;Yk(NMBaOSLf7G{bZ8vi+;@0Xs7)#8x zm57$WlYfLID1Jnu%J@CY+UqzIpZrf5~L<@ttPTW*faC&31A7btny@VO#kJ zIlkCWwXKjnR*wGw<&@5ZuXGw8p{baZXVsF6PuV>MZOFDy1obu-oi`_~-A3rnDiF&C ztBg5`ug?or1e>({QVRTcn6;DVJ~&||K4X+~luYF1@$fF<^E}z@ zPzWeZ1bcX5la>U#s?yr6~ERw;zl_u=cIJ7WbDU31rW; zbuZ`7j+qJ+rX6__YgGS%`1nj#mD%*-)ui&H<6XvDJo7Jfix-kYa5h46UHd<2O0o|T zzc$0+lf)QrEg6d)-9oi~LoTiIp;d|z@&_b;QJ&J@)1&k=T_;@;fGT3mEB<4%lB@mI zYddB&z1R6@(mx%nTJf6h(xrUw_yi9TARmT>GL-$P;u@_j7#TAJpGJo*4g1f(xEBdU zE8*T@Q?9UvdtL%9-k{s^qtNM->EGJU$BGbmBb)$(Yyyi{-id$qK3 zey225Csa#20>6B6+Y-U$_ztwIuOQdkTG*JuLI4?xT)p%u1qvsIAgxuR4MCS~qI9+N z{G2DY(_YL761c&TSVQh~rn1CaQJ7-?_#I?e_2XPSw z`i6n*LrK%vVas6oaIJgHxuR$v{Mhh3g0bCDMeeAe(-s?0 zXIQjA;Sbt&5uKLl1^b`NcHxtqx%{njA?<`J3*x#}q@_)8O^a~3T~`zYylbIb!n{1L zsNwCFBY@nE^C)I0#)c2+=KV#|HS8y@Ks=`X)EJa4dU&phjbh0HN)wan?eDc8TT>jQ{Mordy!BCBQ zXZ;ark9%es+YR!26!lEG3Q~)XyLgz1Y*G*T&}C@|#_A$ae&(t4 zX=sFIQPV}0(}^3a<7=$roRP1=kV>m>8bL9VmPun}Brxo|-W805?(GJ(&jv?uMUTm& zpsna+C>0RO8ht$Pgh@R7q^M8kSf%vOL=m2I9zJ|HI_cUy&ZDf%(tlOU(SjA!1ezSi z$C3Arf4xtO9Lfi^hEnN&Y4R)8K-R#NvmkYgCr>`4Eun^5o8S@@w3#H$eG4419ZLF^ zw0A%FF~Y5rytxK=Uf3m{A^qC#Fo-Y+=i5%qBXMU{N@$tsauZ<@;XOupw zZOZ3Du5BYDU*vrrRh2KM_T6RZ#N5|^U%9({77pv&JGL!* z(ju!llH}Iy|IDHm=e*&_ERBttvtnCWvIj z!1mVQ@1d1t>_@kpYX`QWNu5Q}kX6k-B?iG0{!8(`Qk(EQP91f#o}=33&IJBePk{mR zh}L)eMW({ncETQYfgl>3XZnd7Lq9r^PJ*5tTj%lEDgzc@`R?EYm|q+A--_Tc*p?fA zesL5l^;`^XGbRPBB3zgq`q|Ve-8d5cD-$LzojS#$e`BiM38W2rTlDLx{SFA^B~Sxk*PIKkqurpb9NjC-2@odmCHh<6q%*;dod2u{3&B zb>hb^`46k9Sv5#y4y7>b$5uj*f~IX8))4&&`TDnqEYBNT6>ruT`1Tz7i!2lH_c0A& z0$Dg{+#3^gsy=y(JRRHb!cI5I(DF_N6jOQFQrS)EHnvKAfnDN*z)_?XY>*LeOLwRG zY^_I$QD=Q-z!BPQrhsWhg4=klXhtyCgR1ZZnpq1^4l zu~%V4V`SsQiJ;c)Vp2cG$|m74i2xS9J{mcJCsXOG;(=-D42+`IK!H--Os47Ncii zAa}D1^ZK3s#Hg(9drph)^ME(a3N9nxdU?AvxQV_jTV2nk&zn<8m6x;3DXGecLw`bi~C2 zcj-va#XEa>zWzr|Uukj!<*w9yxJpaE(XvDhVU`1&H|QQcyTpWn%lG=&yq{H|3b)n! zNc(RWK@TCE=lVf*ar4IXKb(~hIS6{53#3!+r`3DWMX~NV$${7Q%J!Xl(_HDdXfs!i zPW-lfUvPxkWj5ykJ&=_Sd`*0Cy@kL(?DT(!sL=e!s3s)wDtEY`5^u%&!qXRw~3sZIxx+&>?lJK>xFs#`EJW1sB9wK>AOX+o;aZ0Shed zA}>&#K;hokc7cG7RYtEUEk6Asv&`6{#HNW3q0MpmnOZep3+u+}{MdskbvV1W1bYsr zi|Q9+q?PJ;=QUL2lNpeUtdFqTaxL$)y^^Kg=65N;X87{LaAn zaZD%r)`cTrF8%MKQDlM&d_E?kj*s$Af3K`DOh0?rr9F;C6pRTe|u zK;|RIG<{Q!`|?%lxnG!Hf3;Fx?%3C?0}wRvR|Fx5JFu1r!rS5NKI}#ndQ=c8$2J^e zTRzV&$rGGSOec%uMI?3nu{|xfIJwp|m}c&4Ulsh_7)L$ljrrB^0x>9pDEx6(aE7-E ziRm!#(H-wI1dAiuD?K}m)!MM6T>hcn_d&G)WW86eBxDIJ)5Rl_GkEql=pN zB@CE5Z2f#<~kS>I7(%V3>TQ<>DBBJ^!yq`0Zd62nJa43bc3O z3Yeqlo^@8=(O%-6wU3_=Mf@EPvePVhun<}UdbDq%XSkpk|3FHEP*Sgg!*_5$>oUg~kw-xMqv| zjn>R$HCo243xg8~VC-qGbldPj?5F&kw$z`KXI$C4M~D!f5qF1^O*x`QFAXM)RV zB4YzkDlqag8F*BDa+ExyQzGgBSprwDAsF2Z09rJn-uLMy9|8ji(OLCt}F9r|=OyE$DuDElMxpWs6ZKBiTA6)nLj#nyt&HpFpJLqeR ztOx+KAws^&JA?eU=?O^3B15;KjL(o|&@)+mzm$HgarG4XbIJ|znAh(f+UnjfWYu8P zQ0{vCiJ)w6T|{Mb$(ZojdhZ@}ic1d(YTA3TloHv&#(|lZ-HL@hH5<=g-SqKwQ~i7O z=jzxqhZ{{L{OOoDF)Nnra~pDIi){xE4sr+t+W7b!FmoJ+k202W%Pz!-C?8(gc(bTF z^&w74u0bnjXD`=Bve+wi>2Jmnq$w$2lXDV*n(&6&^_b08-t;Sk+!qQ^0P?l{Eez2@ z464(szdw%}5c;hsCpk!uykOiD6ElE+N?~S8v=vv5^z(4f0UKlOo$<0VZgf#l{?Wws znruk4apqN2oS2Dv`5S@cMJ{A@J7;I-V9L~WSqiU`5ZuGR>T+Bjqp_c+28g!D4nZ8! zK2LbKqM;l3M3*YVb`dif(?oe>P;Nmkrt<}7Ow8zOXbqJ|KhO>l^ik9hYDIqv<$lQ* zI|9_TNS!=+(uA0IegJ#yR!yXLIPM|Gk)3^7xc#yy6s4uTUWDk&5XZ7^b(P@zj4WR$ z2x*GC64)9(tDn$#s`{liE|kVD8L|=B>64z*_oy`;#<|_c=q->M3?MR9KZQ=Yl+;D@ zP>;*cfqsS|?xfKsWxzhOEw`#odg;WSo%)Oxwk0XHEgQR?Nr!*j&rxnh8))?8{T?YB zG?S}%BcQmrA(tbqS4!Gw7Te{)fn}2$$4UpCAAP@{BiD=;Fk4v85i`FMcW+HYshdOK zZL;vG`iQY>N2MWGN#elEvkv1t(&G2D|HNZVcNm9_TF>1mF58u)jb^uC8$3gvIq??$ zuu$m!V)sN04%K^{G`sU1Ntc1Jlg(&Ljn}>d_^)sMLrs7SOu@5iCp4TKhYrU6YT0FP z5X-S?-ZIBWe|9N@T^(=hFMX+FM9vUIKmVO?hbl>qd+Yv&Im|eo!r5cOpey@6U!_c? znV+-&h{#dscP@RBs}U;r`@~7*7-Z_DU3DQ)3z&g&=)-^2^I;p%TZcH37^oYzsjZi; zqi)D9Ts{Jv$fJrAlN=mCZ~aH(15%x*{n+~I2s~9Fx}`Ot>q?f5UTG~ByMdnjich~H z#TvxDNAls4~3Trofr70i-(npFNzO4WBC!77lHwkpavFnQgZCKpZhpiyEK0u#Qd6 zkgAJBY}<_^dHB0Z1ccePRk!|X(IPZGU-KqI*@6Y-QaG>-hN`&;b(sxUUM~ylIFHIS z_r*>s%6V|6$jRRZ$)wQfl@8bXKMU(nhLj{Oz$de7wEy5@xcWv7GU?oorgC(a@xT9! z5X7-q?2}XG_9?mRWw**Jt84$~T$&fo=dJ*;%~_=uto9Ew-n>IHPQAO$V>GDE^FwT z_b_uWvOsI_A`#TZMso|0=T@J?t&D?yETQzZg^f+yv}BM>@}caJ*cwCW<@XSeK?IqZ zb;{&*R5!YQf->*&F6)Uhx<4_s_wQ8OC)uu-((nx>|8*z*hKMN zhq%Iv5II|pitt$qqj?tV2CktXQpxWL5^=`&2X`jGaGR?#4&vRGa*#he$$Lz9KF%;v zLg-VS#7zS|pWcqt+~|^=`4T3YxnwO{BEB(39BGskNT+d^_PwI1`V&U!1l$RL0ITfF zGhdyU&a-?r7Ip15wI(!0jDEpQ7gXWlvsv#+h)`x^%G=x1xKg!^8P;V$01dv~l?BeJ zo%q=5d&UNdGUdKspn1sl2r0hi&wEgqb=W zsL;^f87;u6NF)aGyw_}!D9uS2qVNP!A&=Sdq&vpTqz^_nstaD>p=eZZwS%8e?t>#t zy&Vjg-_S`3*!<9Vd11k${}3nloUu;xjH7jLHQxhUgP&ktFYXj|lq2M$M}?k1a2yPM z|6aTQ5I4sRGBgt5k$&+%7o&4KB%p6 zDbE&Rl5G8?Lt7t12Mx1B7049G2hvBv+1on_jZR_T%B5vrEN8 z7o)2jdZk}E{fa%$3{|>tB{57Usrkxh0?B9BN4Sy0P7aiORs5|SZYy{T<>w_%#6ra- zQ*QPr@+JoT6kcS4J6PTK9#Xw^G(V#`cJ^XuoVQ4fg`vWf;t?bFyfo+~auaF26z&O; z%8cpCi(JH17fJz*8D=EdeC1a;CuvT5M`jrrqlZpF%s0+v=@v4jyEa3^u9#v(Z>8du z{Lb#uO+TpW>IA*MO|)?NH2~4oE?f#l{H*k8tl!wWLDENqg~%K-Q0dElIQKeIV3%xL zAp-?P!Q1Uz*7M}u2vZe@M0f&gPm7O)vgqFj1s9yL|W1RSV@4Nz#RAe&^KeU(OxXYq% zP#CN84sr{MsFSe%71RlaD!u>dIi#dKr`)&ql_bdoWj-^gYE**c?0hStRuJ)juWfmOlV4~#V)-H^)Gpd0##EA}c zTr()_jwuLeTvJsyM`4j`O`Ag!w^&Lnqe{?nc7lwOg%6)V#RNhe_Y3|}Jlgb6C#Uy_ zM1PX1@TYx)VD+mVk4Llaj38!^w*QIDS;PvlaB+}^rWIKe zDTe7PKf6q{32T^PQ{cX*IdQDr(wuK3HqY0Mm_y`;80`G6w8d#BY$S5@aXo?;j&v`i zA-PU(m{@q}mGS((pN4*UEwY)4fqj_{G1x_}%3KCe^XJGIF?o+?pj0I;C@_23%%4BL z#=QfIsb9H|)u$td_Xk=U{rNL4?{SGkvc+rhC`7i`Z{1RHdLBzwVp7t0wps%;kPB{r z-RYoVj*sy?Ij+5GdstD$X40s0^9JIIQRvq5E=&S?kw zxFH?icGH0no$Sh2M9kPuJH*Z2(NX9YDpQ1fIB1?x)^bm_dsmI6#2^M;S=kk1us^fQ z6SNq)pBmZ~ts@tCDV7F&S3G44>oV0ewFR^7f&V{7OV#kfKlREFY+vlc6*Hxkbd%ly z(aPLfzv8W}P;wI#R6lEVpZ9-|{TM;vs(uQCPji>KBwMb3d2^c{BFmAFYLyePPGpA_ zfbGS+N?u6;BvWV;@-NIo>_qsbqM(k>*Z;w_UbvJ549EqByQ=sC%p>3rUy1f49{OiQ z$@@qtEuOFNU825FrU@cR?jt$=B2Z*lKw4Q5KLIk%F@Y9yig+BQp>!_Pgc^f(Mh{Oy za5*$#HsQ!f)AVHd2b#jjkYTrwT0VWUQNo*69;|X3Sp_Q*JO)S`m!(JVmm<7NGbAue zKS8=TwOA7l%j~;#hua67n@O#ZBp*>GuIU~SZc#t51JF>~x7{8fd*`$*M)pX)Q4)0G zJzK@+He7*$!z$@ciV+U)=*Z{Ob;+Ir&Lo~dIQQKn4bQyC#|C zu=Lqaslxd#Ayo*;PsW_Ehn6SCPPH~fnsz8+l>qFIuRD-2`oH-sV;Ji2Z+r9LY-LqL zLBnU1b7a^O(0JWtYV@JQ)@pjX5W#6XGEPry|2UzMyMgPWKH( z8+Skyl971rQgj5<(xTL-FfV*_W-fCr=;2k{vUzWv8qrN0-UV^ZdJ%yCujc9{AuI-+ z{71g-!nXR>8|NIgKH>$SVifcZ!Dz<8d;eU#KL^i6ja;?6=z0mn*7mQ)oijZF4eU4z zZ2KsJ-vG9#$=qhq?-X6z)DfWu4|ReKf$FA6#*96fAd@K?p&K(a& zhVDCc(hsT;IPp&>$>xNBtYx+?PjMmR35|dC=>Zl=k&pzj3)#!z&`F8xLM1uq^zJNq zp&kqoQ>i2i^YQKp0Et9zp$c?;lSYk?8=yuMm4Qq$h%a)D5os)!LmaEk^T_{xOSe&-Q;x^H907lgBp41*Cx!WHDDiPnD zhVxuVH52yixKL#Idzy_5kUYB9oAy0=5f-Mr*z|!_?#(-KNn?bGEQ46!nzsdN!`3N{>caHd3@5nCca8t8b9vVuK zztG>OoEwiI0wojDa;`;MN_{dVj#WSEb zi{82OAEEA89@Gqw;b`T+iy-+(y44->Fh_<%r*9mI6ofH1QEQVWAp+07L6U&ieR6iU#Ea zA8du*C6#f+<(xX-5k@)9mHhpr9Q->6YJuY>IxZe9>2xU!lkk`{EhSRw8DK}^Vfhts zCXQ{k!(&nrPbY1b_G5?m4v7`IG$r3_LXVG%(xBgr#msYa2@NLf*Pvp9G*tK)?{JymW<|PEboPl|w z194wk>8aA~TL*V0rd*z7hE`WL1`d{L=NUPk`0<%Q>b%aJp0`EEX}p2-Bz%Y&E_eiX zZCM-twbMD^D#?mEpzbmJ3);#K+ilD0PyZ;W@^(^aPVX&eFs+L%fShan>cRA{tyd^t zCC`q1xdP0SUoTQC_Wd<$^NP5zpnYHI+04$Vn~UNPGJB-9Y#ruk!2~srzAuM52`LPA z6HNyW<9H;$ynzqhr?)QW^ed$>+@|yGjEEVL4}qEzj@=zahc48w8AsjEVGx>hJhwsOLN`mirn2*?<$?J9-@g&sga zlNZbt;!=F{?H~P#*89!PPSbQk91ZCM<1#CgM1iN#G#cj?;+ld|9*sWwH58*^mIY%X4L~&Xz&V2Do~?Rnytv< zOQ1fbq=#y5fHv`FAL*fK)zJ_EjjBu-G~@PY8Pim+`=~|DAT}hKyhAbHvj^WJ1%#BWHM|V`Z@4E25Ov%@cKDkn2rCfyYmXTML@5b4E7zCs8JSpknDGrI=O; zczkD_|MY+c84O=bXOYu<`oV*q>by-WE_sBDm@6y^skiR{pjs`mUDZ>E)!uX6O+QX4 z!|{&(7%X;k;ndDz#?)75F|sy^=*xeWs1|uo9o_USdPkPuGr3ci+qM472z`hwWFuZl zt=(F}!oL2REn#wACKq!@H8o=1j05{5~kuDA>Nj50qtr^+B^UcMLEQ?}AHOkzq^d<9Xb(gzunhR=aKwuW7Qtif}pH)_J1y>EmRTJ+q~ggwYF2YGmOKpzfUbYge(%6uug2O|2`F z*Y$$bxOK~5o4I-G)Y2P#FVszK2|Jixj%F*OdEki?RyIW!t{ATdh+0w&ydgP}MQZT9jIK6VHgGp)#L5QD<(KkkALdwyV2P z@tYx)S*S%MZIN!G*Px{DEXTD3QkaQFiz0!`{zE5{ss75?#;5HhLl-Cy~HD z)}vQSJA;94p4^1LGE4)=7PPA8o1M>8M^#r&)*smZc;mD1HHhC)=78h@!e$d^HY3Vq zd1aRJ2Lq`NFj6oN3qivNTSHv-A0>1P{MoOiAf$8<}kSwqOIyxQC}$wJV}Yz(r3#F6wobf ziFDe&`Q)70A>m=+N@~e*apdf7JfG**uxtR(5{!-Yn8oC_WSFJc0t#|-24w=R7m-62SUW0&z zEKHmyZf!;oGH7yGCKYzqXN^M0OHJo9nbEhcp8&?z>pO*Pa9!7__=clS0ms7fOQM-; zBb?mv+H$5nNVwVmde|}mGKT90(kA-HU%bc<%;Zr_PbIC)VwbeID*hd&QQn*+t#&85 zA4=ODUYZMAm22@C#SB_GZ2ZSKWVv3?iHxb-uE6CWUB91lMQE{!BK zD`zAjiqAv;cZ9|G;gF|~_(?OdJH^8=k(6jLl+D^@B4KKW?W7g|^DEspR-jc4KD89o zghNc_L!8_X#B7HtXfP~<^=>Me@Aq0rv_0zc2EC|nmdMqRnnFaK-K`ysjBbJw5L|O7 z>)N%zlvVGfq$%}DggmuD`#*95-tk2xQo2?Xdm)N18w;W0GT?g0acXu#5&Q^{;fYgG z#++8qH8QnCRm&K97c}C7k87iHronfV5Gc+@9skDZ9g}Mju%_#9Tm6YYf3UCv=ivF0 zLrjEph?8SDYcYBlwkkKMtj}lCzzB@br$ejbgadr;@{!)xe-cUVSOI|)ceB2e*~;|e zrx9-=4lvI1r3~wo7J>anOYI$k_$JpO5KAZ*cKfD2UjH&fXPBG<-F6c|_&z~(gdiY} z%=$kE66bh0o!UtZF;AtGMs9vpd=lbMZe-xNU=ceFs(sdk$3Go$y^uMf7IGn;da2Rl zsq9H%LuZ=Pi0i2TBl6k_fd_Mlqha~=TqgK@!;lI%3jJFoX~NBL?u1x)+xKy(mG^({ zY9&ZfDT&}%x#<3D!pWhJX5{A&mNMHgGL*3Xt=kG0|3-%RDY7DC`m0bS^LS32>YX<4r zGa&~k{+E)>xldKz+o%4eu)Uh3c72v1;Y$+)yrlP>7x47qV7GC3%vdLbkRC;Rg(2t& znSVy})|*J5M}adN%R?{0`T@EXiLej@)E8%skwQK|DN|2mmO|y3Xr3GHX~9 zr?aNB06FLrl9J_VM>2YZr3r_@(N_-n9}boZ;NV-`h1B*$R~7ot!Il|j=H7>v#qEfq zpWjhR`qBiM&xvlYKR~%_@;i6qmnT6`wvQK_Ro4i~PqmaX3eX`V_}E(>Kfrulwe{@( zynwA#6eKwPDRLJ!E8xSqx=nAGy^WI!kXN;If@JwyZ$L&z*mK|LJ5mx~3vVITv{|?&xSg8>AZDD$R(uYaT z#kS(NZj1Fx)fYlSctvfd(zkN&>cmYQ9qX<6%M#7XaWf9&Wc-Tw)Wdu@#laS@>f`RU zkN!xH%J#W`zjFD~*3FfpIr=8YPd=Lad-M%sqV=_2f9>#d%>F8g*Iy8W(9O=%K+cv} zW3%Z&Yc^HAH$UKyT~~&GNeVS6V;En2{N;tzIjB`~Qd1Qd9Y^ZeI&a{eG$DQ2aJcy- z(#*&xG**v7?W(S(sdDNZa&!g_sVhj2?O8j%ymxBRMph}FD(9?(bg-7-yg1%QsKm;` z!s03#8SWM71}6NbYAuaW2{A06O;?hC$&w`V)Z_ZR9ve2*zBCRCNYIePA<0i6Jc2HV zJ)S`kk0uiZbMH+l!ofOz%@RVIoWDeI88N3bO1KczX|Uql=Q6(ap^LGEwR8I5aVlvs zW_<=qiPwpTZODA_!G9vACYIzt3N(kh(uHY+3$y6V-Ww?O8uDqI9y$y)x-^6fDVWcr zTwZeBwe@5@U^pz_*Vh^wcUY@hT;|V7_nqKh zk_^`R)jJT1=WIt-D}6lu3Q5M8PH@EGND*qrx>3PXy2HtHynL~ z_xlks^}vLnTEug@$p4pr`fVVAAcVfw9`;=sAzRKr3u5I;sJew4m_Br3o26M-W zQB-2Kdrt&w9c_NXie=gT5pqdvX~Kp)apNsf`pgq1k`o%uBv*9DbO;+;QoIv5olBQD z+{xO&RUOm<#xE+gKS29yI1|@uouVmxofdvfgk(58e4lF3{)_DR;*yZUrxVe;t8_Ta z09TkvG=cF@)P1z2*#QsNgkYOmI{zq2vP_kZOZ4%Dsb|Qg`IovO!A})7EK&#b8NO@e zAt^GcA5oY2)JzG_$=#7gqv(2ie*eo&CZP~b z)%mv<9m-3hW@l%KguiJW`U_bT5DTjQXHuJtR?NL)R*J65x}On86(f{#I`Msz%iqBC zc=%2+%P^>!CDGjt@e&`qoUEl7zQ_ zFKLBJrt%^WwNIaenn(!ry(V?!JeM;=;4t3}xh#8HGg(trK{^*Se5aN4K9MTij_;!` zCmlh)AN1YXTRL#MaLaFL&L0xe6MV-p3a;2u1~3|*P$D7!F%He zBqHgjcIwnVvOPqRXs|L7dceAb7spRfaQ2hmQ;`{QX2GXnp8u zW$3Z4>G$_}BdJBf$PTKr($v17nSA<&X4}2btaOi=>lkEU@66V76J^ zRA<)!xGn7@pnw-5%LR74wSOEB*xZQ#jK+meVU;#k7&(vN@N@T^Jat6^q;A8}Zee`X zVW9p%3??oLA1%Wj=zc7VS^z!pA`9PDx86hEd`-lWP&?QbSkgkuYMFo`C3d9gZ#si9 zz)jlhCzYsMoooMdAR~KEF*)}Z9lW!Tq{nY2;<|@0=6894k642F#GU=I%I$)lxExsr z+4j3VfM%X~AOfsu<)n0?0YUK{)a&ZD#KRdCOcUMVVBaoJ`fWKBL>hhwj zude76@jR4YJ5R5v%Fk#+H2CDHtNpYW-iKAD(e+p79r@Nl@Bf_fEXT=A6fATL=dlbi zqAQ#|_6gj`P4w;vG6SKKi9a#$qHh)q%Wh z8oVKS_2W|0RfgRkWNN$arXP3K*x)niKWoo!9Jyr7_wkpfR07xb-BE@^`jg)U{O2;% z6{>GnP*5C|0GbYnBMK3Lt#q|_^Xp&i3x3LZ-4b9k_tLKGluv~at>eTv3&?VPevF&x z_F}%varW&8;0$|7U;$4D)TCA4srffr=9M)}U0$^{+i5*JN}-9>!{ZX*oAkq}3C}yO z632`Fv8>p@MU&&AK``Pu!%AK4HuU;6#;hB0<&^~n11YAja?RdSFq5IKr9?Raax~OD zf^QlLrrU2H)RysiHy&LRKSV|TgynX38I{oYd$QMH&vSm*S&QSjJsuJn=;U6YeTBBU{zRsLNC9@LzofqnEglY{ORn^ltv~0p9 z_rVvNz~Q~|`6}fZK{au%uywf?=Ap9BF<+1lqLv9;r^hf{*mhqmWZT-HIlNfH$xb!=9jb4valGc%!&>f2PzW@)cS6tZ#u9Gl^nkBWoxV2@0Se1 zHu_#;2kOqxe{Aaf{PV{OTCfD)H+(nP)>!Fi7ws$| zWv1W%aNd`bgNLUIomqM{zAy@|sK?g4p?a0rw=-e_s31q2tB!Pw$BC=WSNMhU zpGLX_huD`gls&zgP*m###iA0&?uC#-wUza%>`YkxA>qQbgi=_zkon8vlJxe-=K>27 z$Y9dz$Jj_p^Q7W@;`LXwi&jG4c_2)`5}9<^8NWXrV?Nj~CdMv%OM`C5E60zA&lOv@ zrHXT?$;Inf-lY+HF8#|{PgRxAYzUpG$R{Mk@>Q|@=+HUoUk$&EO`JZ-yAMixHM#FR zM1&qJJGP zks|*PDbKk)XLOL3(7XMBCQ4WB>Jn#L`gEGk{)2_&ukw9=7SH9$XBI{z@0(bgd}+gEmvA zO}8Yx5bT7f5KCT?Qu0VX=t?iA+_b4#x?dSct8q?asmF>ir_JT@Abj(OnaUy@wvNa& zsc^K4G56ztlp)t$IqsuOBMuvi)%)}uYIV)>B~>$SZA>V^Ey?FS>wCSBaNWC&ajrQu zl5;^*KL{mRM6s?{pFGJxY}dm-j;D7i9Ium$*RYC%%?`FF;~j7<-L#a4B(kNKj^=VT zJ;3|?KZ0ld3xQx3+S6C?_gEFAvA>kw8e3gOU(l z@&te#ky8^ zQyo$W&*nuc#4pB1?sKiFz7oX^b8qh7;p^i%fQb5d)40mw z=ska2JNN!r-(5(GDUEp>qM{j&qe?+@i< z2%B<1S#5QV-rTo&=0fatDRJTgOZ{Y5k>!+LZWlt6Sx%ySd*$fbA{yz24fYebJ3LbVNidGceN*GgWh2~vwdU-+gs zLCTwqKj<-ibcCqc=^0mHCFaq}2w%bNo-(A*6vesbPFqlA z@yUZoAH8;F%@E;Qqaf64NM9j(laSOIBkVXa@N5`a5aI6d9igP$XlJ;zLbJLgKAe~G zZoYg%`oSyN@){%GNHa0_({F`r^D{TF-o%5Obd;Pr4&0qWw>R zy$fetSA~w>8vcw&a3K|fINuj(m}griI?v3s0r{tNBYMW|Jqu@izOfv?Rhl=Z+T`Ul zk=D-rD7}zN-lH9^3dzR25TjEs@bdOfPl+yR!fmC1oZe_A#?l=)a6`EvA#fR)sLJw( z4^&5)fnN@YMSlPGo_U<4nj9n@?tOwjdpmh-GIh!VCbh6|xsTYq(gLJo_ zZ9%ZAaM8(oPy~SaA(8jkyKDn;F@DWAbJ#imS#*Kw)GE-B=4xHQUM1X|)=pPjT!*{uYMa5xKJ_ukwyoBPVbScb6jKJ;B z-i{rmU=plWNoLa>(S|odp*Gy+ARd`1i&`T2g(7d^H|y)`F#z&VrUhFFahEj)bLr*? z&c}c{JD*)7f;uD&XXB31)F#3jXdqcqM#i08^jT2Ji@-0`^k%C@@Dx}TLP05P0V7A* ziZeHQ@sDl*vr%L&a)mn%9&2e1VtxJNB${>!-hFMIm_N=b0?w@gSy@Xm1UrI?{V;;F zSwUV{>?Io{bf9amDiV=db5lcc6u|TR+_!%~m-ROlV()AoXrmPNbyG-d?SPK7`PAi? zItWa!tpQ*>*eQkXdwLT&=E{3HOAV?v4~W8=NNwld?ptD6%W&k}KIScGxHJqE8}|MV z_(mh(3Bd=sWJ!AUW^VZ^{;%?JO&dfJ{J9i#TB8_y=${PK`t~SO79|^qt>iF2wh^mN zlIF6G`*9ylCmjmHyZNUv7GWRYyiN8$Y;XJXm>?-#jrI)u=T`v1YpemPHdc3tkUaI* z|8jcwG?qd)BagU9RK3yq5y&`b8$hA^X~pf zDxr!8TRPqwiU%QzK|`leA-s3c;VTH2>F@mSH~tCx=xaZl)2=8P&UOexr?Hbq3P{Vu z%zohi2J9clv$ez0re)wy4&m9hbvnQm!DQIdIb!$y3C-T$CVpB3S%+%TjjfS-3UvB- z?- zY6tAzX>?Kb`|>VRi1OTlBQu6XfQJXJp=C`HM3k(b_>#_{^&8_4=&J4$tJZS?`)t1t z7`%6LnY1)$5OE=I+DzReXgMy4J4}o<_!W7jTe=B%sw{uMcdtGMkj}5&J85QOJ~ZN( zlp6L$we3DWqnZuoY}X|u#8;$1t$S%8pxzYO-Dm)a9~1vPjt{Vc+AIZLc0L(tC%$r3 z^VTPDdO{R$yA)t^M+a!191=253FKx@$a7d1c==d`r=8fq5)?VAi}1^|R7U2B&X!hh zIlslO14spybbeYe@tMZleD@F6SJ4P2JhPwRy0i#s{$+fxUcG9R0sdrL1t9W8yU@^w zZ{MEC_U~^IR@2j|UVf^3^$K7W2DpxY9oMTc0vWL(nZgM*xficqU4a_PVyFgWTF=YM zUP_&S!u4GB38#o$pGvY6glHaMdw1tKaYMw}042FfH8nxPk3hmhW{HlLw{E@p$F8u^ z_V}aW%-At_99AxM0{SUYxQP;eg(*LmT)B8*C?EajGpR!fk8ermWGV59n23J=craTL z;=aTXVD;l9u!WENf-8a|IxoGE`+p)pmt+Td;ji0+sK5L}R)BSQH3V-gB(vTkWoqXC zxATqHIFUVh>fheCYK`~uB9A8!JT_MCI*mpM0@6TD1ZPQb2yRbFjSapc8ti(|Wvt#O ziMY!~Hq13`LZ72L24o1P__4q5$1V+xX(;a&_8Oczb)$A&t*AkhY>>n* z7@KQv_@v-vgF#**8H+B9ZmufnH}~AA{IhRr@B9cDNPF2m?C?|m{b|3f2OJ_z@+tu~ zV_m<04Fpg_r4}So;o$sQ_qlU7`991H0+zXv)^Xn=pFYnN%W@*HfOIwX*j6^z;B2CW zzrTOJVtm^QeH#0`bk8P~E))(E;uN)L2}DVz&_Y7&6DKBV$TPTQ2uABFKYrBUAiu3@ zeuBV5uWHL{5TpB^X6nvIt%Foj@>mU2P@U3Og>^S>!E}~H+rlU{ncTl2BYw_&X&QH- zkmON{5Y4##ZsJ!FB2(>Jz4-CEN+<`E3OS6_w>59U=CB=Vvt}^qxfE_I$g*Dnfm<4ik5hM<>Qz%X-lwrds*49U=3!;+-eHbv$I7frL`X6 zx(l!tcHKxNPe$Tk($hQ=99JNHZD*$=b&j2L9Qu!L-V#)W?W7?NkyS+;Lf9uRxm8|4 z;c5$l`dTiQHCrS2f-Mcx%Z+ z@Puxf%joABZ1T`a(GW9F``EB``ZPMI7%^Lvrclli^WI%rhER5B7@$mpp%Y#;#Q#SY zYH<-q_@uZ-90A_0K30CHB&krPa^5#m zx^mxZMdbQdcPJPUc!d1jE#TF9$LqN1)FlllTZl6k|BnhUHExA{dFpcID_9OAde124 zh$`<$jR;n%IjRforma97r{FkbS`IDGqAlMl-PA2hBnzK@m|k2z9z3znJ(r zR;I8oy>&Sl`R&Ve*Z-7VUd0mJr$KywMS>@9V2)iy=>ZdOXdvG+4JqBYJyN^z1}kNZ zLy0VbcF)$~HGRx`yyW|<)FEba4f_qLTU-Pavml$ZSm3oG$d2tquFGsW=Q3f449mCY zDKNAW=O?(GH~I{w=`0fUfUi%%Sc?6oU)L~w(uwWmDsH81o(nIMns8rYP?N6eHKBa= zA)3p(0m>uJkawLaY+Ox9VQezd98$H9s4>VY&E;~X=e&Leip#eL*~i<)@%64|i4*b? z%K}sv!-N;k*qcFFyrt1o&6ZBt%zED%9p2u(vkKxuw?LwgXG;u+9woDqcXi#74nkdx z1*X(Tk6wAMDRSRyglp03H9h1+SL+$k#KQbSCy-QIrAv|}Mg0wKpP$@WopG6X;A$q- z^|ITo=5B6HhO_T`*qnHM$9r_XJg+|b^h%jF420O{^2wr7VO!_o%upvYc%<44vjs{| zmm3wbPVaDClLR_7naBv6GUW^n30FM76Ip@i54B=5SOnC>2AP9`X0gv4hr|~K89Dv7 zJxskbcXgbPifV};U}+mm%s-C(--}v_E8UWYhu3Lz!C0Dq3`4 z2xqFd<6el`A8Q}AD0O3Kn_7LhJr@yN2if^(+^zJ&a?{XQ8} z@Q8!0dPKXYNAq$%?sWmScg&dw$njaiDTx9M#<_gEt(YL6p^r z>+!0eW}rHlJuA2Xb>bMLzqzJ7zk@x&`;jb)XqH&7YN4Y|OBPO%ZRD5PZr3E4-7!er zfy!LhDQa(JAAI3H|2)yRoeCpUkLaeN=R-YD#-6VAVx-&hoeIQuOzJ$-`t?=*pb14+ z02u117p#3>_Td#iaoM>eHZauScUkR>6%l39OVy2U}?A?$;a3?cFm*n`pZFP`f9zc~6Tx`>+nbz(Tg zO#YHN>`U1~(19_>5it9bcY|OyCiA@GnE9jq?Rh&JyQIb)Pz92LzVcp=V*->`TfVIp zcvh5XV|rU~wMPU`e+!`N7L!|%q5hx4uuNQ=?{+u(c8H5hg9!LLJC&`&^g}1+!($lt z;ojdKfn1mn1b()$Xcpma>y|zzLeT6=4m@crrnq8s#|A%~O6I@xs(0 z#nw+Uns9_XYf9lH2%eAYXdzaoE!I2#zi|LhdxwblZfjqNko!;=LEwD|64rls21=!;g};@y`S?(+ zC=AKy1^&34$NkC&j(_BgwEw_9T<*Pxf%!I;#C6JK%;`5HU$jZe#Kl)fMac}0C5rou zi`UJ{(*C-{_sa1tjv!41Ma3M4)X8w=LZpAr2NnLz3M}%wJl^>aetgb&ed64|a~sQ^@U32aB(;UH(z+Q72k z$dPYb<-tcN{vqmz>X(7X3FT@QW9VV)^wKHh3$F&r2h}zsp!Vg-V zK26b2_^&gu>&^r8mVGf+5TSO9gO$Sru3PMOMg^dIved!c;taiF7ZU7e_zdCT;`$2D z6LcvtAI2H54p5%=#{p!NXU)Q}=ely6FBHNz50Fd6rE+fnW*W9$DCV|Rt zV?V{bk=0ovGD|JG?GiDC)ysnGmBRX$VXruZi)NZaJ_Io;Nyn{YCW^1ae70p}4v%Qc zD`4uOiurMyC46D`A8rYSpnO6LZQwhIPf=^*rLoPN%nbQ^V+Nm7qTAAyEKQWp!~^SN zKV7;T7Hqh)&`@@|&qx6dA%fn=F*z4M1d^~JE2@tQT2Yctyu!JCi_u9MzPnl)m>nZ5 zchR@?pWzEH|GANN%eXcucu(timif;aOg|*Hd+9lm88Uum?siMVv@DY%YRN9pFCv=iu*ze(|>5T>Hl<+jolK{--M9Mg?VUKd)2Fu*LH^yyS`^&h0ctOm(DW1D}vyc#Fa-<%hREW94(^S zl75ZMBoS#%q$37Lb+n`pvZq1S6XM`rC_Dim-DVbF$ikksT8%5l_#Y>sbB6%{TnZ;l zhh6d2$pc*5B)pZKlG*_4%apf6hBU|Vlodh=RmW@C4MaR1(YH42E80PX`%6&MuPjKxG$$ zwsfj8sVZ|b5I`Y3iR|5mpSAk1tzC$|N1|Yae}cKoe3nCXvvL%_R}Z>`@(=B3BPonF zD|RuvDgUw1i;%Q^(rq+JU;lHPGG}^D&hkbn57i@%4ujxb>r|xN7!72%>X(C~DdVmF z1i{a3NsYKjWKNgJ`mryQ2X4C*E|&5@@$K(t-PUbARzV`e6Ob_cer1=WQP*0xyN`@w zfV4(NBkoc=&VeRS3VZ4KuZ4^bx1hwJJ(}3Q;FJ{&) z+*cXri(MuJL9{S!2&p(KJ$3C(1EP3lFPOHv!aaOWDLP4qL**#Cqw!kJSTDDk+U|$) z`WcLmy3l7oev(thc3t~O{@AHFevxbY8p3s70Ax>lX~?0RNBWx4@XH-U@#VR4pCfO{ z;7%cpp1rCQn!WV?37LnW*)DqI;^#x@rL6%;J|@|;I$tzT&_dO#$F;x&UuKBQ>imae z+2?}(_#3`6L$owE)B4yvsvjP)ZE|iuRsITEC3O#8DOBsEoVccp{RZm_N6Y+*Cem+- zY!higg{^x)%Mar})g$-DlC{orY548zTM~~hmVLZ1%Y1P(v2zNJn(r9CD<8y*fXzA% z1eyV{K2l>wN8p`l4V&u}p(YA>=+dObq`npY!^IjF1SKWp82kmb5Qs{KZv&H$k3T#H zH3p-4aTlUAG(4HGQIGX?rU;Zf^nn&kR{-^+Bk{x6V?yK9QUY+pd7r1 zaRvG7-92F~4DcTZ<<7)&BmiX8M5RgX;Ysp8TTjl&$T*51wlOLv5!?I5=oe&N&hDC6 zRS(X{fD`>pp;=xH+swSoRYxJnkkqyEAFet+s4&Jb01iIKJ;3%77pTT}<9b|<>%N&M zyNN3TZolfopQ9!E9r%oN--{94cRaoG8Qcg2> z6BC12LCCUQ*PO|bR{w!HQcw$c_^%Tzk~BgFk?iU+(cieO&C=h@r-}I2Bj=HO^&KM6 zet=3KL{9znv*TuFub%Q=q;rS33#n2(ka>7}**li}MGE@tQKFQ}>W7;(Y|<6>-5r1q z@pmbQ3F%c8Uj+mf8^>@RS53c96iIg?^{q~wJ)Y+jar-WF=OK|1g`0vnNWl(E^0=6z z!{OWl(kiPIxBE|2;3fV+zf|LqHTkngGQcw*K%H#Y%$z;=d{{!I00bBQMM#1b+bp$PeJHXXuF#%2^x+pIKZ7SpHJn)7bn!m9r!Kfjv(xvaLJqrXoYGK z_rE<7(gx#wd&V$DbIlxJw=nAl3|Nj639o^$7_k85?Ocz!To_r6|9P;;4!V3Xx3>VD z%~bpaFTNU4KA(I0ms}ReNB_Jr>1Cr(6LiW~I!RH>c4`yR&gWc&@%YUQlvo|bctwL= z)KRm;ko}*B&e~>?t{|>tkX(B~%-k1q=Wj%%bjR&5v8B~gCSU_1)M6pe;j8hv4`{wh z2e&LZwn&|Q5(TssA(Ii$DS+_L=X=6rwZ`K;e@fyD6}hPX>Lg7W zm0G+eNUlYINGv4^6`rIDYPT$hf#)fQohImgln32(h($k6UDho!$*w}i8no7_>FDV^ z$9e6wcIv2{&PGIKH#b}hW--V#V}rFQk#zI&Ksn}3qA|-u4*%_zqvWv<}UK(SNTXGmPvz;54 zEjNFI){Tpa0lVDiJV{TEN{QJYHFyVZ%Q+(HXHS7u9Z??+UchX8s!3C_ss53w92bkQ ze9cCu=DlLoJK+x=&cl^z$tH5Q@7L%3NtdTty=arP&-bq!toy=<>N(EAdY_j^)KD*A zfw72ISo7QNukWx8eL4%gVVk%R|4&0=|Kwei5cma;96G2a%1p>{UfXE; z8O#XYXh@h`>sn|ynpNbKx0zlG#JYQ1yCNxt4iA~22CK)d=?8zLy1w`1w+(^v0GkRf z@(Y^JV0OoTLJVT0PzT0L`qY+!Bu~DrX$w7({dQdJFQ++M3tkKqGl^4|f+BCj^LywX zaI`Trt`}n@oiy(^%ie`|g@y z5oqRuPwWLfJ+}EfhvvKc<-N{~Zav=|srurc*gjOZw`B0FPA}!jqo8i7RI<@e0U?WG zW{KvIJ7lwFKKq8gqNW{*8b-|J@nRi?qi+W5KzuHB9jTBOtCQ@V5Lt(T)251@AJGe3 zcV`+<>toJ2@a8}!!6xy@5M`fXf5mZ3sW@NpQ=C^n=IzTHkZ$TalZ-hwxX^X&rxe`z zgiKRFB43lMik)%jZ7%y$k|q>)eB~ud1(le6A__-K8uN;m4_>!lAcxZ+zr5gd9EQ(s zr2cixn8G^qG6j`Mp`F!*`!v30V^P zdm707t233ugF%8P$9^4M;5pU6%`6w68+}^&g8^<)tg^p{TF%kCqV?PvOnsU2k>b&O z<#Q`Hg_M{*QL3EMyp?%gV`n%AuTAAFVIcIe7}aM8Q&K@DtU4U)jO||^B@_P5Eshk5 ziVlj93obmdX3pgsdHMLIa4m>(aGXGSC~v2eOPYjxa-M1~{_8NA-FqRM-;V7p#0!6R zZqWW4c;WG{ynO+WHOLV3Xtx|)Ai(}2;jH~7c*rkse)NFW42MNAjpkL-q`$(E$@SJF2!E&9TQ65FY3x7-a9D=e+~^moFgLPaJg?6ktQFc zg`O4v!pH`^hJ0LCZ#qq8H-mJa;0rUc*Q0c{l$qa}qBfi#@A!}4#`u$uO~hXP+Z666 zfen6`!uKS%G58&pvDUJ6ux(MytuOf4_g7pHp= zQL~g<%wFnD8oGx>^9BBhMmE3N6MqX5$c~qwN?KOKwN1`zF(hu*+hML0<}5t_4LxG2 zWVuX#mdeX4*~v^gnx$O6o8hqGPj=gan->-ixu5&*P!2%6Z%iW0pA6bA?IN%psd!)K6J!Ts*h8gCA%J+9)Ekl@#Nq$ui@D z@x{Bpjp-P7c7Oj}e&w6Lz#Rqo*Rvci3ft?Iy2$9AL=psEDZsgT&V46D%zE=kx?m2N zrEqhD-xdV32uUlb_FTyR+>lr7-c2Ib&`DMFkw?MH?WHY=8a$fZbtWxn(Oe)`Q0oaB zMS8)rqK!b+qaKZV^B+y>s!O=4A30Mg-I{AuI`darx(*qO-;QeQGv;kMn43n4`HkW_Xx@GiowYnwpw>wGb3&|$zch}YU+uv_+ZlCjo9ewCZ%q=V_DTxQ5W6)fVjweN!1YHE1Ze~4UbxELdL!>NwW|m z2-A(~Pb=pmi1Tgm_!tBA11cAi=v!aKL5$@{xu?#~a!^dSKXjlVbd>bmCnYrnF47&x z5;AJ}OFto~Q=EosAwb#!(i26bLbCAM32<^4a8gjnw#Au5O>o{lcgyn^9VA97plJQ! z7z{vqF8z6a-0!K_L`2-ZKmDIOAIS!|GE%v8={-#p#~{)2nCfpzs)PvlkOV2a65awt zYacJ8y>;u>G(~GNI{t*ASuKq?;Jz!94CAok1_B-nJ(ug@0y&z@0u6YlyOzefep5Mc zCx@Cz)Z#qn_W4nURPtcNrC3>nWPwuG_0C2-XawC<;=i3g-Q*hlw+Iwlr7I2KSfzd< zqN53$_V?;s77?Wprq63&vPgnNwuqvxTPdo|OZU7-|GU-UcU^6p+Fv>+(Cu)qao=sM z-_4#2PjRQPEGW~eJcvcG`#t=-KRGC$v``ZO2#`4@ZQ|-~LvD0Ax^`5j&x>|@JtU|& zWxPXSDJKuGuXV4Ar@`S-9`l6PAKwIl;tq799wZ7-Bk41|v%4i7doFS=s{`7x)s7*( z#{#}bBRGlph7+c*3xHyR%f^Z6Y;X>>M0q15Q;1j!-ppjd7r~KHC9wP#euM7ro6{h8AlHXjnj?qhO$ zX&cY=h%$*z7!a{_`Jkj2UAXpVyd7}}yYlMCTjtODceImKNgu5NAj)Q441GWWV@S`O z&azSEY@M32a0EVIJmgOh_&7-Pj6!W@C2O5SFGq|&lfZkW1}Mg~z$4Z$@hd$0FtTBh zELm+OQ3-GEp;pgAihvi_;c{S?uzXPYddXTA>}j$vr*%z9^@>~i9$n7)){q?}bNkO} z>^*e6uwgbQ>?DX=ClBIQOVf>xF8LJHcfxnYgM=tj;Sa7EZxYr}694c}%cf1y50jPK z?=v}d5y5Xe5{+*W`Ge1}Cm(0+R;vnJG_HhgfI-Q;DJRsLV3PGf0i>^Ivo7!m8%ZP} zF!0d8$C@OG`}gmnkC3ZaAL0tTiK<<_9+D&CnL(~qi6v+TP<%+I8Bbdd(*ujPYP>jgL{>7Xb5m{ce>hgTiY>)2I@9wM&5S}3We-a6DkJym8> zrvmW(Kg0#VCai^nLudSg_+vxFDbU5NVi{3~ZK(<~+&ik9w*z6!AJ%g~Qub&_7JuJkewEZ7+$1fILtycR# z;68r?rd93@JIouMbPgnHx8^S?EiY|yID>>z(D9nf6#%&X75CAQYI%-`+(`C`$fYQ*PiG9CT};E8OSp=xB4p`xZK zDh1gv=8v9zbK^hMHdS2q_@RMvVPk;Q*E#(d^LxAqa2bvLY-t)&C=;)_dz9{6D9SEG zSX8s0oRORQK_Rue^fYZ18GW!ocWz>sPzdvvR|zVd_;-VY!Lhw0a+|l(&F};&k43{r z-wm85&enhW{m%EV4qZW;qd%9An>-z3dk{~SHZXtg9hcb0pD1CDV@Ez_pE=4B zBLt~4?sdIq?c_Q2@K=OgJKjE?U&jOWmw?3Xw zV*Ufqv|qlU-l@f{Q4g&dd%(So3zf!8LK}LHKFRo_v=X!4#0P7NViUYjsLxw?Ap{qi z#prKHG63G5j1-?P3SrxpaS{n}nH*=cpFk*tmMvT3L-uEkzePR2KNcmqln~!*bnOyqC=&cI{>)QI*X*sl?RfCdjo6wmyWJnH zglnUqoKh#kH(~TUI{SE%{7V@fNG{X(D_Bk9y6xQl#Bn?IobHirKYplr{|T4Mcv*|n zYRDU;gvr`m*|e?f=?q1fc0P+8)2Z;}E!MLSVY_)ONxltOnp(YxnRDjsx_j_}Pfyq` zw!8+*q9D0MCR|g$t(VbhWC!^VO8!Fjg#f&zwRMMWUIwMsHY923q6w3tO%GU{x00Gy zL7lwVcc;Cnbe7iNRyL`$Zb#Z)9n5M;Y3Wnay3*y#5GRb~;_< zC0T(n%mhY`w4eB*xd0QerVy^dA4xMnnNBK)Drbh5t>o=+0{5L4*a$CJnxY?$qtSnv zQE4uYOrp2do{}XQH>#1pyY~gZOomD_HcRgqMazA~zmCFJN3&EH8sgM=x5uAqnx$*N zO)L{T`zGnM@VIb(_#>&$_@moVRtGSeZl6My`K|3C@#ZrcO}CoJs81IT(|*CT`p;Co z5n>bHzG+b`{0IG<94%ZkqS0!bpJg3lVlTR^zxwBujVhGFPi%_e{K?oG#55G0@kX_~xuCZ-Cz#uKV zf-Q&ELaU`22N*tGTo9J?EI{%w4{r9@CXM+FDCKYAUddfA20E2u3_mp3oG$!`t*l}# z#lffVEJO~cU2wVKry$v}ZDteG>@kcVu z5myC&^$;_exUe+xB0SY@%Ee4vQnJm8meEh}#;bmra-er)vj^6Kslmj=q_8q(e;GI* zUCtc3*gC8VQIdI_-i8TV^smoqE2yq}dU+-FO08fC_GSpF+URRsi$8y+wrr_zHbjEV zg?#;deO2u^V72$^Q{%V5{C%UK&EjG-9N{60&IEbh8W2K_SctWkkyM+4D^TlArV6>< zuV0T+NJQs+VO|~M|MFgxGJ34B@vPo;SkIdW=+<|8FY+=v2nGZM7-AOgb>@sAz1uD> zj@Ej7zoI@2a8?P`L9C84-VhX{?Z+>7m~}Zss!6m@A;&kmy()VcTis@~u-e1ZKE0hz z7aU_Bm)a|uTK-vASYt=x1w|*g-GwO2t4Or(rRV(Hc|GbkjZf3;smyV2RAcSR~aZk^DuS zKSV4XE?B{HoER)q*CAiCFYl=-A$0?a=KS?bG{(J8@XwE%&@oiV8Xq`ku=4iy zz5v6u68j0)#1Ppb#}LMKh?2H~0G>x7@dHGqmQBfa(0XXP8y^y6a$1xFh&& zdGOjE25)c#S_}?)LyKfC?+$Ol6H9qGHOL5>F0U;#8nvr%R)Rvp&T!((`#$=2??ssQ z>>jaW_KNP-dsRaMd}@J3mHzSQXgAb`gyZ@lP7vCOilfarp8w!t=%QsyLb&Zj*=M4F zO%9~46w5hl@6+w=)~B|%Zyr;V&6l>zg_>e8!1l&UawsLQ*tC|@2sh|-YrP39^2ly) z_`x4p27;&l(~CpC)iKyAS9b%H3zv(~bE0C>ZfZYa%mQ7y0w8&MPnE;PetM2259ek7 z!7ozn__?FEivK@@OiDQv-@DYP|1NX5TK)-c_n)-x?KgpC`n2jSzC0oL2r$S$E$U$Q zgKY@M)WHj}vCj#F?=au`s*Fmy8F>9&=Q1PCl^J-g+Gpq&v&wr#%8 zEG=t|!aDCm^2#mB`^+aEJT4@{j+tp~Pe=}*wf)@zsJDdZ`uK3mrtb&S-4ob>Cuc6 zSCneA=-!3pnSK@`w$d~&eSN)#=pYLqqQ3qL_O=4xqUlYYP^%Mkd={D z^gnC{%{~THUcLmK5GZeKY|KXBk*VRO-)4^#NVJp^B=mzn|DLLq7V0}#s>Ojbl4{cn zy3))Iu+Q8FXOj9dP@fyTmv}lEE99i$Wla!jnGzisuqg0J0UmLvcc{W@#EyYB7|#JZ zXXNCh?IYviPj%(xis~IK@Jxt_Xm?})r?j-RfaXeOW{ItkVxUtKg7hU4d!_!(T=DsR zLHdI*jFGW12)ea9lGO=9ZQrLo0SK|X#6^2 zr%Yqabms4oP}wrj+#iAn4E~42kad1g)5;a9C;?s;JRuE8*y-Z}H{uq+?OC1^^^7rv zXgz?!=Z#L^p1_l;4J~%p+G?Qz@gLL@riPB@KUG(feZ=C=s`|h zQSc{O_hmqp)bb3(QaTL|rol(mk$>P^{=HzvEE=H$w{cQqsxp2HI1|&_YuB$|zrxUa z3W$H$VMB~nqT|A`*vHr6{!uf!dGn?&G)O@|{14P<5H!8A4>Niv?=1B2OJBWmC9n`s z_bwzEK04Eore361Vz7J8&*qiTRacM6tJ^`DO70F_r2D6Yh>bzE@QQ$VOqb#A^ zC@hIIIAB5Wcj4lvCaiN0vX?U^l6)N;WS6`jpB8sI<>{_LcIR-NmyKSA?yl#BXTx4b z{$3P)77 zsIAV$%2hxpy%cx|N3%k&Rq%6q5aS<_;mvvCgd>;tn;Jomr4mYEj)y0zKWqcRs8h`7aiB4}i|^%nX5-dP#9zwEXT zPg*|;Pt|srl{X^MV!x9=;dvceA;_ENPp9T5$JY9@TgHC?{^8Kby1J!npo#C{8I4Cd zS5TurRm-;e@y99tEPtZ-8=-=<%|7##RXb7IWgx2Ijd%+GkIUUz1$~$IyX(;e7RTie zMfsfZdTu|VH6LeL_2>}X-qJTsDp`>{yPX)bqn|Yh&xk5Q+U#U3r2m4KW|dUa|7|!I zpSj5v*Q8Y}`&0X~;unS9?`LEQ8n`Ac&;6$QM;{iN;%r1rl2E_d57(4O(;wC~iAwsl$=G91jABK20N!Gj zPUu?83I9cpX+b9rt0|dJ+Rq*{}|7lC`ok6cHk1XAnu*l58oz z>owf(&-d}0f9}Vf^E&4`*Ydp1yyjfb>mT(v3^$z0lCvnDy6z~`<~{{)sW%3oGUzVz zHNqTTNfNhK8uo3|BUvfFExT%E3*PFF(WhS;aH;d-|DDU4o@`5Y)!NYx+;E2>-F{72 zR#Xg`--a4_U%la>mlW>#^+wUUReJiA19q3KI*s{op~O2<`rwoF^j9wWz$OQ2eaHqNSX;T(D4r6K5Gwx8o<7a*7f!EepYB*Lv7|LB)x@&XMc7{dgzP)l$DS! zV9+-tK@f))pqL`is7j~6&*gSzn%$kw%BTJl|MsI$|6Ak;y60qP08(mN>O?gRxvkdw3`JpsR3Q5Up?Lr0AaG+@h^r8 zIXO8F1=m1qiYe6DMfRW~D)G*DW9^HJZvUtQ6PVMJVMtb%UBR{Q)PYmuiHeB(CCkH9 z@FD}ATAP1+A5n18`p2H0%05X@v5l>DQskW^8>RV-TS>x?g*;VbTaybL>{qQ`nb{ zO=wCk!58viUzED_aY8~u#|Ch~V-|;0dp_Aj7%k-%PVS+LpV@;0h=~7`wyhWpQA+&t zDWKsg)Q>U8z>W9DE-elSfstQTjHY%=VjV5YBlWpy8C$I48NnzM1=?niPNLp@=MSR(!zE0khOUQ9 z2>slf{UzZy#=17bl7HcgqTJ2z0|K(81ktk5$`zpXv>9U}yX){t#47LOUY+q>Q+wMO zC;Ph4_-uuw?%dnpeKRvNNui08pn;C;;1EQ4X0`~x8veI(UteDZ3~-jEttTiBdt4vL zZTh+$Fu5AKLave6*>06F!g}^0z>36xI@y3F1R{dX6bKTV^oHynDFB^g4S~-nd4DyC zJ;VFRN)e|DLgSGM4DTC$uZ2JEqb=0uf0+7u6QjM|FSA;Hqz6S%*#6>$D}&EYIkivCzQl%u>BsxT{vYL<9NEU3?3zt2-*(~nN$1J5uR&0W`H)mihq{Z9}lK!BB?UI zJ8azt0PW!h_|7M7i_{|9ebFGx3HmRwc!(i$c#c0~-FjDZ(hNy01>?6G$ugd`s0n8C z*!?r&gX%0P1LJCEGHk!oJ4b?+r_yGkiF%rP!*pH8bDoEm5TY3BPH9cV*-Boxw%Lt^91L(x_u2JV1dk1=saaK|6ukt;u-K}g;L_>b-#T8;n{YilznOK%^Ei> z^eD9F^u30tu3DCv0**JF{j7d```JODl>+nh(>=YHM*<+@2v}wpq6^PzGkA~6=X7#tuLWG=fS$vrS(aFAc35q znUXpRtnT%O%wjCoVcLR$=Q%q*0l>FU=)BEzqsl#LP<}F`UtR1q0`iAfbhiqMe2_+5 zl75_8bh2LX-gX@EP)X>Z;t2HiCN==;<4LN$P^%AGqBVrG^25$N)stX}FnD z1C4T~NK#UkE$jUJzKS5t06duPN{^&d>iQm9mFJ@3|z`Bltz6SV(G`J7K zD1QoJtn$Vat~5_%jey|e0|4QWa-F=ysFMJ_xG-l#i#QBthu(^&9^bVXcNg z8{1fnGpdx;8$Ufdr-;2n>~_>1Wd7U|vhpCp3Z1eHU-KV~%Zg12v?_q6?Oz~@P7WoS zbW|*YQ%=Yb6$mZ>@&xbwdvJWX32$`YZ$@_Y3bNLX|S1eURYAE2<}c^B#g{hj#}F&hh~LZBSPU+G-e>P>3zq`9LRIZM&ZclUHDe zO(k)*QynPmO(#Frj<{CZ$bfJHdNVO=D|7@tJ4t6N&_Ra?#2vL%U@ zS#=@<$w@Z^^35l7P;XqxYlNUM;HUIiVFOP2CvZGCvS+uVTlYk+L~J*F_-Ae_yHS?qynB$-8toqHcJ2DQjjeOUtSsA9GylmRWND zOy~T0`Q85qPM$=|S*1BY`6g+oW7x8C+<*_h1%;~rmmmh+hni3W93j0npco<1-ZoCPhw9)=i%=*Tvl$M zz?M*aow|OhA@QiMI~YfXPAZH1DRg5n43g&DgoB*hcy$qsN-RdM4i=QLF%4SrD3 ztfOSR-Tp+0b%E+VhA;`|_FMbiP?uKQ%J=#h znv7-IFe6$`yCK-f&|ADmb0L#TJ6!Q-HRiIxCd==_8W*y1GYJV+n((hn_hPENj$ zLc)9|LS=zBpig$SQ39L^OKNq}{t7+3-N7Nlm3t(ww>(@+Qre$6K-DYx>EU{f_Ql#z z8fAi^^tbxeH9*fC{3zI}-W1eKNk3`i3WmOAP_XcjO9IjGL|J_{I4@~W>lzD5DY-bb@#`&BM_JfQL*bZo5fpk$X9k{}v)*DHRUNdxf%>PamEns$OYQvo2BpisH+Lk=OR{^h8hKqa+o*tz zlW)!+Xt10AczanDnTFi~SM|`smo6g9*|8y1VUjIzaTK&wunauLk&;OJ8m4i0<>9dm zsea^K?_?KezpU3~&^ZX>y1DGtR*u=&cPE<%9Px7=VH=KUq#q112O~J*>z?bFg5~Jw z=qt;)>4%f)ve&5tpHXd<@UBawa~_tV*K~zN|=%Pe#ZE14`1;mpVI&ieLzcejeJ=aK3-Q9y50g8E3+_)gExN!jdgv=|-$p5xkE- zogRz0SI>Linw8!qzBK2sLB~^Y_dgyQ{1|Fa02@iOeXKORx~x+q@<_2(zI%#4qZTky*x*Wmj}bhR^1dYx0R#N+rT z*^aJ2`^18-?rwJeXS2tXB==qBuAKL5d!p$H&cjmlT_0Juj=?l664hWYjDR}@gnX2LCV$15R=YAwR?Z%Kds zs`sG|{Q4hKAK}>eB}P~bz^kwjFj>K6>K8Hi3g%F-=lb41)rteKJ$&Jxz)_vu?xlV= zOm+iWd2_OzzfLA^>`<`&d;X>e7lQ=e8k_*31-5k}$Nj1|u#}BS^Jis^diIys5@-k> zvM_bR#9N`<4;+?kuVMv87=WFwLmg4|-pZ}w48_yVQ>B*>?9|#m7rt#e6TGt{Bv$E` z_d5b<(&WhzIDu&s55$}8{pm?ig!Wc#4Askg0}=qd{Z4n=^;x&fQxK)i1RZaQ4yvWm z_wqpsl@I`x`xz(yv8y6<@W5UBwmt$?_~%Eg)c-jVj0TlPFoI>H z`yKSq0su0F|L^MtF0yUjh?eve*8_2(e7Jy@RyUYWzD3<)L@J>dJi?V5?qfINE_=nD^bh zh77d>vla~8`MNmb)wb}4&?}b^jH$@qLE=j+Vl0lnGN}d2mGd7XCG}s1URsH}2j`z5 z$?HNU9T}Bh4bu{~v^cL{I`G z%+&LcCYcTxkdlsUy&)W-viSh)+X4JvKp(A{plhb)skNdO)wH^8#%x=I2dEv6&tUpO zqUI`@0#JaQp$tR{mZ7d5jTN_)S+&$cQc#U10@D4mt2vOTp==f2!8F_J77+V!U!B`O zMe&kcR+l26cqswJCGP!UZ*ey>Z4BIAn{xpd)WnC>rDuk^aqJ#hVooDJ(;ZRK7ow0@ z>J53Q*HUkI?gHUmOp1$@h6J=n)cV*IVBLKaPGgr3!&oTnT()%q;5^1y3XC+bGcPAl zq5p^8myzk9&nWmz2QB0m$#NkfD=1^S!Y}VLgbO}ivr@Js`F567&0O*`Qod41HoSq= zvAGWIas`r)|KB`1r0(6u;CnpcdxX^I0G-5dtMR5KWdC;t_0Hk!)fM{#i~;*+P}|#( z?^2PQL>Dh~{LuUeCo!I{0SSMOj4Ai)deD+)k{_fFUtX@X);Km<4@ToPbdsdgRKQAH zJJQlKISV;s?;oMzf8Z+7slz<3wJuY^fXNUm!pI5x;4sQ!{hTuu3J4_NgiXzw(1e_H zeE#T)i<1g>4m1ugprQdC$(|eci z(n=)CFZlTNWe_<~aQzzAqL);S5k0w(eQvX4xK>+N`#kc{bWQllj6k1nx81zs9( zoXz`e$a{RsC&#WQiz-O{b;LGim*Qml?`%#I1)K4gb%-psdoBH%7oGLl@b~!iiYm|< zNR9lQ$~>^_XGDyxvlbfrBj8K9ue*l;l(BV{SH*g^;qa7%nJkL)Ms@uUX41NfH0-kT zWD!P5HXN+4!(f~xup(uXWVLoFv=Hys=NRz7^=hq;{QF6X+nym!LdS-yI()g(1gm+* zYeGw7WetBEaUZ@JPaxf}!u@42N_s;Y*wdc+4 zDQ&A*vsqUJJt_%ZA(DA9XO42KC?OVRN9od0s$6ct+}RefuDsGHJ>?n_+7` z$Lx>?t6SoqXXy<}=aG>tzoHT|E3>!=OVm*2nJ#!3WQzIwl~|B34IarFXle4GB=)n5 zIYhEtK`mz1gwtp?Tfq3C-bVPCqtgW$CvSJ&Y_d0be*AEHBrq*kgVK2!Ck+jaa3f|o zF|G-H)UxcrD|5=MV&|z7Za-CVLSsbObItHZ*b>ZQzjlJ?sMvJvwd+~vbRp}KQ#L7A zFvO%?ZHzQ=V2D3(FM8t2Fn@Zo`-Y0VJew-1ZuN3Nbse*H1%I{gQsxikfWbxML!{#| z!Y5e8VH-FLBg4|Yj*b9gbzH=c+-@Zhr=D#nR+hfyWu)Ft(opb9w!9Qqq=p+xcTluU zOXXvB1`3$w$E0w^POzP5B`CiDM*VXMhM9VcsX7`2|^Mh%)AeB5}NF}(LBs1a6NnR8c17%aY z*Mwu~b*~^U+aI>Tk-|-yf!@SJS9Q zc(9?<1sEqkUY~$StN#bID}52iGBxSHMn_hqlxd0TKU8j@1>X9qw;|9NY-zAX;&nFK z|8ESV@MCfTDI0K*Re!$sH?v-A%bJmDWAf|VLYhhD*?A+^8Zf27Q1U9pMaIooK#n!% zeDu?vHQ4p3{+|&cG%eR?Om!VAIB_WG`gP;2jwD`0*%WAI0mh(_mYbEZbk6D5q^c24 zOmPL|s8*8u3^bhs-W2vPMa^n`1YjqLE+}2*(U+}mmufocQ>>=Bt}ToF>)?Zt=hl_G zfhM5u#UycpW?MJzw2xXqA1!UfH0~&>W0Xypk~)p;?WPnWZk{@OA-x3tOq)u>;e1iE zEEIf@eV?K>Zpq}_Ff~?kSt1v;A zVL?_g2^oDKHA>g2aHm`9@1Wsxyq(F*E7Iv8s8fp!&feyi72A;IligiBCy>%FClO<4 zIAjFDzu`@pTrx5W+_wH*0PN-)#PIr5Yb=+T9RGyFzMq*sO=W8C?d|m$j z$3c(u;PsRlo0Qcal|~DglX-S$YGcspis<3uWbeJ(8XALNdkJ2P5nXNk=@?e~`irHK zqcC%#M__EMF$)5fmId?0mUSYB$YP>2yirv2lue>DVC~%b8-t;*`{HO0n`U8R*(u#j zDE{o_xI?83~rX)F-TIc>Gi7@>)FuFE6?;N!OvRe-qMw1={@%^ zAtQAg&zm4a>7Frw(XkGK6Hj8g|(jmp3yYH%#*)8m}_7dL9@9MZ8v207s`%`4UN z?^;-z+iMD}@6J0Y&z^7X#@q=d`k4;KXhw`-gLTPu|A`A1zEFI-mf8B%ecAqXb4p|d zA<}#Ar5qt_t+&r+#BW`^o|RJjrXw8h8fyC)i=jFJ8o1A;szjTY3($+Chq_C?@CLBGI`DCR zVaONSGIDc8+Er7C*A+IGQ3Td2$e977Vh9+T&-aCPRqo9#PFt)^NV)AaP-c~6U2or1=eDj_8nI^)vPV!hGGz>M zU#VvK_TMUM#nAt<%s7JT{v?ES)IFZnAJI{Fz4MkN*Eobahk;7Y(B8XLVFUpPc>$qS zU#cA`NPXJOctM71q7ZTWG3_p^f~?u!o+Gs>5H#Q$``d8{9A7kkZ-R`QfK4}DC=F&E zeiMfb=^#4W+VYeI+-#?US~bFrDYk(8%e$7R+Q_0xDML-}e|!;mayEoUjsWT+uNBGO zppc}2fY>?QHI|aG#Y?Zug2!+V*b(WpA?G?N8}%(r#yQqTL#_9tU}=gCl6$mE zk0DWd(_^TX25sM*n&5H0gWPaJP;3~TUVN4R&B|Nl3sPJY4k+DYl)=O$b^3p#%HUU< zzX!=hH(d-lw5&U*@Mk70FC))bW0m1Yky*{buit>>8DxZRS(y8gq5ytbS0031M5Y_b zC#P?PK!P=gg__)vK46DnQT14$f@!%W**rcf04oy{9ZgdDFfl=dCHr_a`bWvdpfO-? zIz$6Wn$?+2wQMyC3HHY0q_kWkhpH=s;n09i@hn`ZVw72UI}JbNTyuW_EuKHY@N&YL zOy>1*v>g$*RGoc@zpYJe+z%NYIIqaaY}g|ZA1!6`)f7-n`*%PWHqZJ@?KPbpl$8PKO5`TP?N zxYl_5{iVpC=dC+t?o`diz30qgG83ONwtarM)9Ge?XI-)2SW+748al!B&6hG#D-=oS zJM-h5p|porNjH0pH?utp|Gc@qEdNyL<=Di(9OE4M;0wQh{uQ~zRW9YfC;i-4M=i(D z%6qsfzOKKm0-aFYx7!%A;;Zx9(`V8~?PO!3tYs`nA?s8(d3GKgfC0 zQnk{e_vx|S2Hj1(sHUGNs$o+1Th*~Dqh)ky{o_CVB4UX!&!w+_NgEX=nzEN4$|fyG z5R;aYIi<$b-p>5{=VtIuj{0I1x`V!cr9MM@qHn>tDEng%hnMV~;fJn79jCfDuv;Ed z0`mdl6Az_QiBFaj^B_-C?j(l=zZu!~w_h%#;hFj~$mt)J>xo%6zdu&w_vAMBAGWAl zIL$$#BJ@3;^5AW42pvdo0bLv=b8ByS0mgE-xiqR~xS;pOyZntFW6-v`j`LM0F zbGdoVj|SC%M|L44aQB~Hz*kE0bQHZAO4GzrS#!GX;xj{>-__rDE~!uIGpnxM4sooh zPVtt#b!po{ANmF*`Kd}hc7bP$B1y~MOQ*u_Q|5Y{m2pwoY0s7F1XtIz256yP@&m{L&Lxz2XVL=hGpJT|U|}t3qXB0wrDw?d+Vq@ z(IyUvB0rT{r+@{Cq^C~?w%19fP#i+%CxlGL67#$e;vg5`w_Z7{*6Qtdtys-_iLE8- zf`@=p#WP|79%~+$Dw8A=$OA8wk58}+5qW=(RPYOw%}fr%Q>u})IaNlH#$E{*x;g!T zR!Y0ReL_r3Lk?3t=8D_9d#0{n@uncd5pw3I-6!b85RLqvTDHVnUckkCiLeW+lLQy7 z9cKu`P_m}yAwxWZ3yFFqh7nfUx?s)CV|H}OSpTdHKkRhkaLmEgV2pszXqok2W zllVJCW6~j}H>crR6u32`lvjdGfb~1ph$70($UH6ffQ{oknxq+1lge;2O4caSoT3&s z%f>zwyxPl^K1D+Ch(mBUY8B^K*WfKHr=G9pRRwx_-i6{id)DKr#LNy2yD}BM1+*{X z8G^gK9s;d9_{w>)M49FZN*2`$*466~D;n4gx*5)-E=ZoLW+Y@4SO1WD4v!l ztct#kU<-<+)G(2PsQ~+#o%rL>`^sY9B4J~Ku223!UG5Xo=&7ZM@?_$O=ae)j1O2K3 z*suRRAI~06E+S@2Ju?s)b%x@z3j7uv%Xze7Nqn`}U-ENxL7tZI^}mFUSNmc5c^=D* zkHcJAoNV|bmnhLZ@c_h;d3abY!*I1B>H1$R7Aw{at;P`V0EuP>KTKFBX=Y3JDo)*FbbXqIn@Sr}c4zp^0?P`@wBb$SE^Jdrimk$+hem|z`6?)W_ z_L<0q^2O_}b8axV0L<;%XWB^2Q#>lnd$G~w@u0y&{6RkfncVsiNdXjDh}kQj6g66ovc=^>-a@6vsC>=j~?DzbqexfBWy z(>0F>*!iQCZ%pdmgh({{a0KeXzXy_nw28%tW%j;J)lC@Iux0bn!LA&LI$qFZ&Lus+ zDn8%y@Zp0Husz_>(~e-tM|eYuWR5*)Jsw>zKQO8*g_B|D`ueMAWQ-b`_NmBjWem6? zh1ET=ck5DqPvgwOdj)Ru9Qm6XcDkTmmD$db+d7Og)*gWxFC>xRb6HxLm-X3BqV5?n zDX+}b8T}T7TYO*7Aku+xYDMzQM0S?PZiJ?1OfSDGkE9Mk)9Mf?VI6*?n1PZu@qLF|pw)-D-$Aia~iJ|D7%xqc3fQ6PyQ~2BMs2I4BsT~_P(z0+r!wv0`s*xOS$W} zMDMTeh#(!UP0{(aIYDt_u>e9OKJN@R-14~jTk7(?&b}P6klEjmUXe^DczF!G6!ETl zofTR79bq!P`~GjJ$*XUltGz)0?nm0hJys2ackesU=&J9rsixMhI#A%3Og>D6kXqE8 znqWr}(i6DF+~^PYXQn@etcgC|dyZ(5kq&oa$P{wirPRH`Z8{Eb$dg|)WJ;Sp-M!Bc zFa5bxks9`YCWR!Ii+J%m*mRbiR(Kwf|GMCB_cYm{Q5a`{JfE^h4rwKd^xjhdumi2_ z#;R5t5r%|F@G_>|QEaKV} z6K^=?bzlQ$Jhd0~l(`P%IY!rn{GvP?4yW-sHZt-aoH;Tguj4#4Ko2x6u5$yY@ML_) z%0r%9_4CnH+0216=ae5!Otajovxh(NQP{?<#7&(w^Bc*7!a2sXOsCegmfoPXGAUR$ zLRush%@TU4Et)1*Ai+N3e%QCXN@XF+0{SWnGc{VLR{D-Cz<6rS8F{9~KBy5dn`!Tj zn=oMFQAGXXJ*#*75Z-0^%sG)y9`A9xySuh{hw!if&-EM!Ewy5`q(Z=nchVwewZ?TQ zS)?vE2oKTI7iRiJ$8^I|#>r5};!B@H=c_SR9_Ld|NgWY&X$(AWD5NxZWF;$e{iFJk z>v5f_qC+6pxDdBC(Ry*g4uEcw2adpt>&;=|T8sLsh>_%@bCs>dhqxGeB7yNRMX|_#?t5 zRpem#pU%{!ORhErHTWKKn@V%{+W4V?6#_nniH1hbX_h=&ZMNhec2ZH#TB+G&+Y`w^KebzkqXjV|D%CD4qVL|;|)cylB%RbsPCQFS=!ffKy#5dVTsa&Uc)1K zmiUi$dB`G0pd~aKEpy(Ip)^1tyP}UPMNr zps`2bfddsU55&W~c7rBk0TI4$L;mf1D^IvdL|qjVM1=FHXG7-&qo8^xSny08N_w?U zKXn})x+;n3wV+vcB8l3Pv5v^e)(jM!nLKJ_4AhUK_8>;Y*r2RC<~TZ_>3tp zYN_K%#7+W50FVX_H5XpZd#k`bQ4p$?+7JzGB8-22WUK*RnZ=2^p60?vGHVTr^kQ6V znAj$7-<7GHDfXgD9aMw3NNSlUKIl-^;1r$SZbjTUyN8`w+duVnVIoOGUOn({5@_UrTs1O`Sg1 z7Y|KYia_8PylZn|8`v>Tz(}Z?hqb#F@rQ_*8RpI`$z{5=2bXf|Fw>UVyfA51o=pgn;UL#hX{f_Lmu?x(h zOpC_Y)myc6Mw`+HoL^OYu7i4elr!*<)vO>eChGWj?*$< z4uncEw$NDWl$crKFPqzmQNsg`xDVRP%X%6QfAJpIhJ6UO0Hs^RN{(Dy)DaFxNmFYF zhXTTWj_bc;wRoI#h~~sB)Tqx$oly3U081!>JZ2AgZ1on|6PNpN_UArEE=Zk_zn!cH zyVo|keEEi-r^HUS;ItF>4x=dpI>^rKZvUJ@mgo_p6bC z2HfcA=oMrm?-Au>iiw%URbG4R!-_P%`uc`!Fw8GMRpc+uJ+_iJTN4p1frirCZ)+*N zw}DdsO9z&3WS|Nc1v>5QP%n;dIN4{(nr?rcwXU{y7#c50LD9v6w)!uUrW>#sGq|VJ zA(qp&yzC+KGTM?KVqu&a%j?5OP*pEmr$lyJZte*gY0=fhlYUWJskz|htBFuzHzT#N zu~9MdCZvhqn2QiXlj_j6=lj+j$^i>@j3BVM9d&#}phq4as0v{^xuNP28%?Lr+xNdm zCiTh3>Moip-q~4qmVy3ndSn z!xnw}giVrzwe^%Pan}Ceq&Zz~14jNkNaTr`MMCGTaxvf?l{Cc_5?t0Jwww-4f3Xht zp3^UC;t2Uj9r9A$7_AJ_@l!3?VPyW6M26b?9a;gqNTtMXCZp1k7cH9L!B7uly zxb>2=YkGP*kwm7PXzz&9k_h#B+pU)oiHKm&w>klQW>fhrRz9}3KMVga)Fm?S{U1zy z`t)kwhQ*Wxlz|oJmXFXg@c(-vUMu;tX~5z;A#Nv`w^n=)|7)VtaSb&9XZa{XJ>FJ9 zwW)A^SvDS+I@6qHO5G7h4#O)r97rbgQbj8_-MaF%>Qg`US|nPw>W&E^;IsQO2lntK zR<0!*hhOA1BH-t48*b%G#I3~jFO1)|5SW{KBlV~@LTgt?MdHAa^_n{uYj97O2oV!Z z)G9CYdmkTT0M%Ma9->z?8^AGRXZDQ6b@#%*eXMk*7WwoRUzJ#Q){9Cs@ckD6C;|jO zi*sP%Re4tH%}D7JL@*Hoe*j+UG!NYgPC4}RoV5M^=Cv3_lY)xLgF9{l_DbB}Grwyy z6Ch{?`qeAw5|Tjc21PM$z4ujq8>I`DS(V-pI&cB-J!BC4M+Cu-UUJqfjlz^xb8l)fxzZwO{JKLaXx11D_#(Fp920`||zgCpFdolF5E=GKz8&buu1(Tum@{2U|X;($QX8s_gao~p7tvnevJss5Yf>al%TMcNR7aDm8L zZx$Yc$^n>@OJ z1XV@s7$V&I&lJQ#U@~_tbK5J|s1e@8z^C$*0_# zA^Z24MEY{nIP;eNQbG&D)GGzrUbTI9;@eVkSp!>t^ef>hQHo216c5)S;fl;#01I{Y zJ&(}L7jJnwbpeQw;Rud>gil4yYa)^7NFuuQZE0zV`i9KDM@=v{@E&8Fhw`rBfjV5U zVvWKgNMEB~OfE_oEfm?hy}j-KpEkmPo}i~@1O#eQHI1>rc*!QU{i|3JR#|3Qs`C)LCbEY zvZ9-zp1BEdR3WRSY_ZVa&-CkU-$ZQu{kJ`cvw}iB0bbff{;GQTxBOln*F%!g{XO?Y z@P^Kby0-t0Q1;@{TV$u}_Y;x$*W7Rf98Wb)aDy!=d>A79MZxXiSkue)hi=*X=!oN(j}=Xc94^jloD%&Fg?>T87f-IUj9C6dDHjuL*whaV@&uFS6h(kWKBY8}B0zm>$6QNf424JA2u{UY3ZZa_k&Z4UPG4YvzrdGv3XeCe&u&BM zQ~n z4M0i!tM-T9M)x0*eVvaE-J?`W+k0^^4gD@Vi^#u+M0W%5I8izjaL>r41yB#TPq~tc zEuH}$jZ%aUVZQGcs_9+4De#`G-6Rnn&M>SNc}Ig+lD6(64Ytdo6y8-n*?_Qal;Wz1 zNfm11aZV9kZEV%C9OVFV=O~--nk(dZ+}t}*>?S>PT!OQV*S7bB5_J3%xw3^)KaD&~ z1*|fSZ+V(GEw+h5KaplkvsEWCkJ>x0%F5OCws7$D$r}#bIr}x26{xF4Y3P{s5}+0x zYWk957#r_t&PyR(vM<}=fq8(N#4^GoZ1SzFm$W$ixv#eyX!|{We+f?RH z4Y>dpP)9*PM_<8)&q<)o2t)e4#X~`bhz|MltOffmbO|3Cisx(7M9duxWDTn)HLKv6 z{G4C&mNl_?wHf;0ZaWOsGV&|1mfN;>K&|teP=J%|VZSYz{PAeYy?LKOuy{fIKk<3e7)VpPXAKYBp&(%HL(1TKI)?3*4zj)p@Lc`)kb(>W z(LH(5_F37#dHR)rgE6}&MU%!G$Ypd>CYFncC$=LjIqs6Xbq~W_blF#5<5+)y{1P!h zv3PR(xW;YTM&iFV9aOMKt}4=d>O4sE$f>Cnj9dNnE*E()4gg!Z!C>90If9vXOcwB z6ZpJYe^i5>L?+@%yBPM|agC*sIMD1AEC#KL%401aaNjAMz>R_4S3vKha>%jx@`IzM zndOBbf>;xA`AV6)_b3)lr$1pd*BwkCYOBIHWXa-83DXzSRL9~GkC4EV$j-4AP)Igp zKkI#bK@uPYx64RaRT>%ezg2+d+CS~Y8Mo_+LRfkS4 z+@~Z;V=b6@4elP4Z3#=QF3mglXuZR6wHZosphynr5R_`iZ*U4!S-DxBzj* z;89(u`2(r>n|{zDJ_8B7^xN#|{GkYF^pi><<~-dB0m#QMYiBT_+Dh=4Z!-R$ut4k1 zf4b(xf;32-S3kzJ!Cs+2UKQlV2_t(}si!&(i7_=$?R4>?zRDHqdRMsHNHA9%v{Pz@ z@Io-$;Y*v|eea!5x~P@8dv~HbBt-cwYNDY=DScn$z^wYIjzYaGhPm~#(yO^YHC({Y zEvo2Ulty&RIwXN3gn0W-?l7QFg}+XW?{|(XWj9)6Lqv7RfF7ka&9U;@bMz@ZA<}r# zglS$oJ^lBHOaU;3E@AT*=-EDFo}px5MyIk>@-5-9EgAnwY}5&li`wqP(q^a?HqZRY zT-FQjg`!t(Icvw!9so<{+xS=f1u~177}l*k)kUBp`qZLhT-@X;soMH@J-j;N* zJ`376GjHQqOUnNyA#aO1r;Ll&^gAs3DJGQ^#wr3`-`@?{EjLm|1f}PT>%SEQk6hh|2pch@8d`n z=lo5`8mu$upm((p6MW>c8tqhgTpR)lSGJ5aZpV+{;@Ci7NS=!4tfkIC93aUkY~G?M zQbjNSMyAKq*Y06I_X?>V|23%t6whEr5c|rO33txPa}%=mgm8Fs0N~CM@VcrMA`oEp z#~b(7@%uh>jiKfU{=GRmoF(w|Scz=kQZB2Q)@rd}%Ch@d71Is2K0@~Tgwgp`%r{29 z*qvNCjrPDdvi~_U-5POKR(lf&g74R`FQ`)tMeawRFD+rN{nV+w`5;GOX`yfgjr5@4 z+dybkc%FF_Vj<;VnZ=yv2Lvvkno#gts(8uc3P>ySgO4x=r8 z8ek~*imU!REp zO+qn{S-%~4gqE%9n+|e=jicYVvolFDK`4)E)%#eEoALo_x4-w8im>OOB z;mmS}aO&M6vO(lHkYqOA1Q#*_^-n4t#)teXvquPb_z>*YhrUV6U^nM4&;aVaWyU_= zjQI{HnFx9JLumqZj$=`zm%3*q_hHjr@=k{k@-t_i@SSf`Au-ZDS;B)RP-yIS;9V;Ir74E(0$+m!-e04iB(vekAF2DYoA?pV9r zE;_(&M?30WGMLF%gli~fWMrf!*5V`gf6%QZa^wGp+weW$h{LS+5dvOq@^MQ?$JwoyXq`!M6>ALtOR*7#AV|`gwwT z2*-t0JPl^faS=&7Ea7_8*Jb{#s zGgK}%S3>a&9b2dy--B?gx8*tM9rj+(o`${&SJUb>?eud1@>q-f$3>Ci$h!coS4RgCkb(AMhkHNTv8TM!MH}j6~(C{fw+p_c-oPn?m2`+|j%r+!uwhs4eHs znWvM9imzID!znV8&$OD`W&E@^pxS+;+wUhO5c$vMr_Q;)L#O2AezW1Q1tf$azmy!m zqE9!TEDvzW)5_Y7UumM(-fwXm0*Qkv7nN$RV@wi6{Lowf5mtlbLDhW=+J3 zW~cI8Bx{(P^2>8{B~Tp9E1G`D1Omp@(y2!cTq1S8e|bxxhyRqH%;B@$Irc*~ginVI zWT2>OlbGq~Ql0nXfv}QtR#WMr|G+WRnbl?gm;u_oU#KQ$IDY(;g`$$!>cteApN}3X zJa@e8LDksFuzT1aPc_wHNUW#*sHOGEr9}mLAcWD=-i~gLPt=7?zyA6D6vy=0vwq05 zmM64fmi>)V$UX`SztM|gJ@N=yqc{JUlt@7kDp;FJN??_g4aV4WJ)7Y~jg? zXH(W2s<-QE7ONjs4R9&4FKVQZJw88&G8NE^wmO>iALm@?_@~9puEsA1&g2=qy!xL z!fjfzlw`c1h_P_R$xz#Bb9TU3nlDl9J5Y>?_vS}=MtXk;AB)Yo5;>VTtR($R%XM{( z|Lp8d13iPwHz-)tVQqQ<{Qh{q9x!zasI)Ho7d8J5cVCZg|DqlXZ;7xUXxrJ zIJN%Z-EvWAiQeki0<6lRcg3E) zf8#p>!e9r<6WNZ(i!OaT2$7B-xj8v6XS)`QVGK;9G-ag$ZoTj|lIe{6k7nn##NP-R z&$m%hya@w$X@G}ENmAvF8%G2_3b0jQt3O$xBz>VO!{V!=T(_LzfvNo`;LVdC#_qQB zRF6EtTfdw*oheXY@`%!Ib3heqxK?YBEjO*(wy*Vth{lFWqukZrPr3pDPE(@7WimI< zk6^YoMrq9^;C08ZImJ->3r)ng0r+pG(Jy(YZ%#>k`H)0h+g>bzxVr$a>veeN@hJP3 zCi=>B(&)A;WwG7_1PK|9h-67Io=C}5A{k%JJrnnq=8x`?SvPp4Bmz9HkFm(e{H>OTa7!h@q92 zw2!z$3WD6-o1ff&;&g_h(`$oW|@`u&u4F1+j)A+`vH~Qk2mY4!&2H%%9epbSR4D+8_a>oD4qzWlaW*;*vLF zUOj*ofoqC#U2@>@gcyVGDe_sP`4_K!DJu(O|8E2vH;oc z`PyM4Ht^eV`IP>TH#7&qh%R#v-S?Msh%odo>#l|nMIM9vB!2OGpuPe_lC(Yi=tc)g zzLwxwRC=eK4;HeemCU8QB*Me-2tW7MfJsUr@ti zdcIm&)1cck#4oj zfhdi)Gb=H#!xV08#nT!K$;LqL)WLHFI(;}n$;v>%PxbBy`K@;{A)RQl7k%yi$$7SR z{SqN{JCQFgpAASODb&K*B`WR% zyY;`A8YCQ+I66AS#g6teyXpmCwbuN)~77 zUNqms2)N+%h@oVGspPzbw1Y3}d#w6rQrWX;xs?n38>Y2CIM6as{Q?)IV79-w@87?> zIGqPd5ZX)h<5FOaWV1L@y$^DMa;3p<+v1SBNUvJvj+n&xVWO3MdmV(LqT}F3mqSN7 z*z`BCr$dBqX1j50DH zT>L`J4yOtK`)lUJPjCN$ulJWkZdJYXGH6=$<>8l1CAXEl zDBj#1LOiK3@JflX(!?XI{vX^xfJ;v4WiZ>iKOf(#v=2<(jE`-@vJi#Jtf=>0`YToj z6vD{e#Vga^l(oHquL@Vdpg=o9*ZiRZF1m~84eG0O%hBE-NYd2K2+Xem<(aa^% zXzMu{`&J^6?@U2D5gQ((QK1O0FrsicWqpTRw@h$^ICN2_x%(s9%f$JhGjrJG*zw%^{63cjS_{l7bJtLllfw*Q3Wb+g*Y?0B8Ky5_VF{0d;Jt?Y`5?k z1bvVrZ=uYx;L`mhH4NX6l~*jC{N-6Nx|mszYAP>iT8VbF+k_<==7sNmBPbZCE?E1_ z6W#4CP$gIef zJ8il!0S8<{HvZ1krEGgEJ?pI|SWD37*0s#W_uMOuVq!_e|JwyG5 zYU)Z4f`o*#z>7WuWMSq{6z4Z7K{elF=Qw{#iA&IBo`pAZh-|DmOOyzacN~My*vbcTm_htD74J=5%5NjSLCE*D<#L30g z;rT4y?2@0#%@_I;wXZh?ln3O~u2l{;{u%qRDPP9;hWGd8n;GBd6RS8B%~$I)l$h^m zO-6~m%a4~zHazFmY@E*ge`Ni6Jk;;^KaOKEg(x8*rD*JB8Dt3wS%$JkW#9KwwyaYW zh3v~HQkIBhOR`M~4W{hbsYJ>$g(%ziJcj4%^Zwm_^XELS>pJH;*E#odJ+8-f&Z%ib zYaK#ipEbdudQsb(@cp5*(qo@RC>JZ8DB|pMsS4Ul`?D*2;#hNidi|K`u>K{vUZ$U)yxzy(?7bEL znl?d?v3FzEeQ%!|(h`LVkBabXtr!{YZG$s4$+L{6do;Vk`%6{JFWwb7<@Dsmo7XJ| z{96K~ZAMI;yV|dzWIeh0nhJNa`Je=tQvF0LM%aG{kIS>ZaCzdBx;svZ#o6@Ur2^l^ zygO*E(jRZs32{O1SLC{vhwkzdm5z>Q>-CK|huJ6I^jnhJb4p3|uE`!u*Th4siBFyU zqtAXHKg>P%Smz@v?T@Pv2l$35vM=t{d=&=)yD$@W=P(yv6CvLddecSRVDvZL@f7Z$ zV>(SXGDPNoWq6;DFzZr^@?pYUEFH@!5v|fe z3mjoDgs{q~C0a0>vC`hp)BYs)?oRzMh$XdUhp=hQy#g*iGqKB4XS($gP5XB2MjGWZ z7}$P(&C0#R{^HLoz9v^cNe}dMt39(X^@|O^MurL6KRdfa$x==g0-MHfy{vf>Rw=ln zCEWMZ?l`f_$`Wdcyv*(?#fMlaAjjcl=B3$}YKfUep8F574W4?7@LE_=CIZ7az%cH< zyZ4Ij_Z)uJ>D&GEMd8q5!|Q)Jd`I7@57njD$?NT6W0H$5Dz1JwxR>^l{j;6?E?rB= zfL+C#y}jZ$Blog-EGN#ef@;#k^*;9+7clXBq+Kj+0)4w4KX#h*CVvO(5zOG6_>8!V zn)jGoPt_2k$whgg$gq3|Xb2i{506~)bFCS%tmMhuuO6P(G5VY~A);NJ|JgIoeA(as zvPNHXuw9gh#|SJ3p9!uhzW#G_{7tc1Z@BM$&~I%#5)?c3+JgsEVg1-O3}SDQdVHYr z|4Pfs^qvwr=GtjoY(KwbeO*y@6oRCN>Ur5Ns=s?#3TfZGFp)zFo+X8P>!PBfL-efK zL&xk8mcsT(56;;vhd}eOQWOw3lvFKy^tVGR{~x6H_1$$;tx6X{=_cyEo_c|*EgmZg zZTavpt>Y$QED;~i$^-curM0!SMtfOb&K}@1?+>yMmns%x3Rs80UT7DEJpwUWKZZP- zicM;4be^Vl%*CU%WQCJjmkG5S)6*_E=QrvDH0idVzdm?bW3=AZ*4C}o6z)5Pe$U2q zm?vA?>i0h-JJ46oy_oTttb<) zFa8MEer?s5AW}Arh?&++_cn|$&2eR4MoP>%KDuAW(Ok} z#19nk@R@&KvvjVhsmLN9KdqkT+e<@Iy94?U(WyTXpAf?!o~Ff?P!lInF~q3%5ArqR zQ8f`|46}zk5VP~RD9>l_@qtVx+W?H+Mr*M%W$p5)8Y=W{d~jYi8wqoQ@LR{qq@m>_ zZr6}}LlW8aY%yr%tD`uHDj$WUtj+SXdsztX-z1WV8kr6w6!}`q zM(nl`A{UnDVLpx*AexQD%RPnznN+wqG{jZPtEi~l-=5BR5Ft;UjG;(66dEJj|O& z6JYzf{N~FH%qf42-D#op4o^wdNd!iET)uH3-_a!z?dh~0m!2Z;xPGZcyfV0Z-FkmS z1pVxD?q?v|jO-?*>(;kJTU|yD@cD=#<19M3 zkml!yZESOpJK}6T9=wE#@;IZl;lHJkk?6JqP)jylVbQxo4{qna1URBs*Yaoc3~cmkcu^&- zruTQ9oH@W}MjVzbYbowIS;BZ!4OcO8XW&kE_yj)$f#^F|C3~)OqAe4P4@LJdZ`qV3 z8$iEvjg>r7Lmd=(x|ok2hL`y_o%T+}V&aw59J8J=LRp>K8}PDR^PR zhwctN^F3p^`O~WwZ1O+>H=l_Z#750q4xN&l@^$^nob9SsBaO<5iU`zvy>uVXe-=TQ z|7HTQk*tN7iohh=geD>aAXOlMmgg1$>u`kD1lua(-FwBH=XkPpMb~!Rc>;hjn*c`n zch}ti@g5O)yA~J}QR@u$+as%2aeG-`2PXmY8;b>Hb^7`hHb_t=GY|)XJ)$obk?-FdBIM9Xrv%yH&i{@2csECslFio z?c4>)VGQ>onGjMi0wqTn9tw7^4k>`!Xm7{${UgDd6@auRXrZj|`81NN4Bn)`}~p zLKz)%ok&v^2CBC>(?^XT+IAwy2)V=cd#1v{(R{#w3@C{UjyJ1|yR+Bc68|nteY8`% z7kTmm2oc#J$e)PZMOJQket_@1*c$JkCt=aX)zwwRZQ(8Cvp^QkA+$#b7UMiUlAx1so7>YYQ=V_tr#e zbrv$FS3O{k)dER4XTMvpDs0xKf0*I4Iz=X%r z!xR$h1>Po$4hBb@`an!WP?r&i^7CsaJcFUOHYn{4Iu#>5E)I9Dm}u?$c^pt1aUE4g zv$vmJ7;F9ieU~s^ty)Ntz-Esih%dEyywi8p?>^oQULoD(mXCj5^r)BKZ#(jWr{iw_E8jK`sdT9K(Zmjjt_2EqW%`L=dd|YTa~3Q8Cne{1 ziVx~8gbiFQShP}^;-7LQuUw6F3k#Ok82hPFto#8Alu11vC+v(dmJ4h1v{4?5sz@~v znNphwD&|tLr8P&L4DzBWucS-#k+%5qwrQWi74j|3+Qx4~L79QlRehEx_7;j+E9}4W zORY{D4wO7C>Yu6(F6g-FUHO%}&%m903-i_r^@=)1g6N~UDEiv#rK4g%tLpO@u5LMQv_ws6D#)5 zU(qh7>t>hG`^8L~cH9%yAce+M5-UG6G1H@P7QS?sW`Rp>lnYr@gH^%h#*wT;K1Aen2m1@e6VbG+_~7G$MQ z5&Fk+gjDJ^o**ev@Qnq3nau<~On2q>)GQHmi1!PkAJ4NV90Y=r{PQVzc69!yV5d&zj5< zOX9^r`W45)p;?|+Af4Z}6uRW}$v?3y$}Y8uP_D+$Z9MG@J)Q+die&+AS^FXLC9bYf zI(c9EWNgj+BtlHj&f2hTgsya#lqh$9dtJN$B9|20H76&*jCTJ!x&%;$E@8+EHZWlR z6sm9KjM^kj{hcak$NKsBl#-%BMm(q%_K!^08D5aD`}oYdk1q}LXqR6?k&Sii2{kn} z1NOkP?MEK20zVi^9EKVh@faiWAhX0>J9lmm&=IVQ*PQQzKMv8pgfsx4#Zjlc91&XI zAil=fk+3{F)Pj))HE`K2VDx~aUvTd|zH4VuzaG~Tpra~G>CGIn*}q2m%zNC$6y_8{ z`#e349?H`ldyzM2W2pPWA9)SA?AZns+h z8i!N~)e{t!RI`N)tslH8!XI`WWFIFmxIir|Guk#|ogMd(Pv-BAwfLf52`zadBMHDr zT`))TrT8AOC5HWh@T;D9;YEWf3ey&^L!{frT$>!oPxAeV*N#OBfaaA|RaKoJ3Me8f zL7yV5&$P%OK@R^eibFNf7x|20v+k7j?%CIerrW+SYyNb4c%a~^Ge_Zt&kw~--)AsFvu&G(!Dl|bjlkEVz zHGx6$J0c~%be$-;f!9cj84%V%d8KOCfxR@+;iQkSw4g^nSfpL4I+WJqy+S#UeyBv{ z6H~dHp@STrb>>8yI+om%~VyoshqBn?z;5nDasZ1umC7P zRE)P5Id=QbS*h<6zd)|P@9} z6fbubLD>OmF5}qPL!?KEQ0A+){8o>ml93Ys741tw7xGEmZyIpi13@2HZ2b{HSO1w&S>M= z$3Owlb!+sTm29FPy*1%2ReDIb-zKOUkMTe{35#KDDck{mHEMlud|KQXTR+K&5Z3}Ae?ASuh zPtgF928)eq35j0ggOyuQYh~F?(TM%vKu4bL7>kCkPc3D{&Nz5@0sc8 zHi=v?LE06exEpu0Gg}VlduxVyK-4$@_5Eld)Iu*sE-x>4mntvE-}m+sAbT=njf5pd ziL%m)ia)m%J}ZV$1Ain&sP@K{dHX^hxH#oUFpHKqTDxdLs?&FJI>I(KRK zEDrj9ZNrext&lfCSa!$FNhAsXw}i%eywF?sM}QVj=q^hi@x$&t(fZ6~5y3u&{rBN} zMYJyXmnivAalA|~%ruta3OT&Oi|?)k4>)kKLnjXQJ3px%ki|08D{K zJ6e%c`ZPy1v7v4Jv!jEvIZ*)B)2M%P6+>JS9=!;Im{*McsWy8`XNC?OZqC8yV{$;G3^MutkX;*EPO* z_Sm`qU{*lnSO>d?4}bDD0_pzw**BB=-1s;96MX0_RS7A6p6m!V4-$e=5;pWWSK;+* zGfO@S0XocApn@4Jk9IlX^sx;+7J5ME>iRj}Ru`WG5}tq$gz($!N9q;F{)ka|v$;o~(KJQVCTVT&IA01g=jGCI zbf7n7N3J%ZfJ=VwVLJC1fwmpDKFbiTMa?k>qTdjMEy{je5B|~JTj!Qler|cd;@Q%W zkAoBRG|7~klesF2y0BLg4Z@lK3ufkBL$PFL#BQb-JU%YZY)yP5?|9hA_?#=lSp>u!F#ivLGqKPar z_%7{pAogz2Px_zm+IJzae^!F)iiyQ(CC3 zB89>kQAbNlqU$zX3l}?>anOZvh1g4Vw?# z#0(lX;D>;lMmd;fOS(V{q0sB;kLNLRuyIB+Hk~}vp?(Phtp43n^!qV-gaE?4aZ}rS zk>}MDD5aHdy^G+i>sDBwUAQI6O#1{#icES$muQIL3SzB~`cwCj`xPYDA5p|f1wCxV zEx=tVB^T)aEE=JJIoia2rZ&Am*zJ{E*H1*a3H;qkGN*XYaYIy{)s^|ty4QY?xSqV% z%kjp=27F*EWbwrh%utkTk31`h_h+W&Mbfu@RQIfu1I?6Wl z$YA^0T5SkwPZHiyL|%#v^%y&&arO9}Z+HrvpmVO6gnEX#nb`|;>h}e0O^}cd347xB zaZPEdf6PITLA>Vnk+S8lUO6)_Yu-Tg$Y9M+%NJw_haXS4V74G<68j2^$=!wB^}D22 zpW;xk{|U=lf5{X{ zh;96_R!!UY+82^*#~_MMgxCTTBz7yiSMT<^ zHRpoGWHk7LwWjN^IQ{zltu57#>kJgV>!8ErUUrO>`C2vraczOfOi$j^gdvszv`U;X;^>q!`A5q6B?kJ7);- zF0j|ftxkFXMCo4wZZo4_b1h%9+Y(bk!9;(*1lRRu7c9k`qWNPO!jOb-<2{?#v7k(k zNh;o;OgZd!veMt9pTMr#nHKJ8aD8_i{zxWkqDrX-la>>3{8lTOT)bQ1D-}Qd^Za9N z?jeH=5B|81R{m(P%+g})?e1Ygek8pmT*xur`l89ck2nRI=<^Awp}16uw!hKc10%5i zb;?9$_(dbJyH6`_OS0Mv?&#!_y3w%zi@~s8ZyVogg(Mi*=v5n0WH%!H`p3ikelf40 za~p0gvGN`phmNs=3NR|SBM*+#^z=L36~gF0aVTtZMKZL(KL32pi)R)$J_ zuij^k#IG9nS_tP)kJQMX#~o`~=7OCth^V>Y(qFoUo(hmsTFT>X5rq(Gy4m}}K|c_A zN{BZ>!=}(Ay!PD^iM2S|yu&i8GBp1elT~cPrq41v%Mi22h@r{QN5v5!zG6}k#j-&M z8K`qlv~HT@+(4=59Ry6?q?K5GN?VL>g|J(yGN;m6zpO`(>cB&~1;asZf2IcZ5u=?L z+Is#1AuAS&EfY8w@K4&pmTPvW_h&wrqsWG6JAk9PPrpO&g?SymiVbR|`Tx4V)7-xZ zf$Qu)J<$68PIwB@r_(H-p69-76d=m^?r*vmdi4EUqdL4>6zbPoy1cAiy9n0Z0NFx5 zP%egZ(>^W&6t0W+WtGtoSVto5X*PFLFKflC)ThRA5rWRvfq^wMnFLzMvBG? zW@QBNDgKFjc8-l(CE-?$6n!fkuf85es*@WH9kDbc_QZyLi0J@Me?|e8NX;tx&bgDn zm^Ie1dYfl6F1kC6wjBtwPbRi{&SKd0xezlo)88uu&p7 z0Clef{s0G%k5Z6R`%kFpe@+Gdsj!clc16vfG#s)iOOA?qTrK#>jz7L=l&BbmnzDW@ zkp2h0CBC$eD!m=ZKb)yRIliDGSt^ILfvETE_)D=pfPM)sV^v;Ox+!Ttn1_+oEIWZT zXqUSp>d)UqU6S-aa3oO$!=O`*r$(Zole#N^(^=v(R666-a?hC8z28-Z*RDzI{7Z!Q0&RbszD>X;;M} z-I*GB?vCtuXHzelECCZh!%le1kcSqBWL4|86vSKX(HZ_u5Vi5dsklMdc_5Jy!|`o~ zMs>773C4Jm5?sgO*I4jZy`%X!3O&j+s`cxXk2P;}(gXx;2p+5!gL*4Kzl;8Nd8q!5 z>&^m%5!dkxd$c{kir_utfbT?EkMV!>uWXGnK{bk23WcJ5_P8#)YDJ)cZgxC50luP$JW2mXVOFOuSq{^L)8+$4XD@+FpsZ6nCQu10^gzK! z0UA9WrBT){1V!woosD@{-bq}2!y{at&jJN8g8$((rQ5drTp6j2OJf128p!`^MjzEc ziXUW|AODsB2UD{DZ;*h1Lfqzcp#qM z3nk799&VQU?k2=z?Ple z`_37+hF+5T*;70jG3%wUVLr;eW+_EAX_NUjihO^cZzRL@`weR|)(JS$c*aWI(n1-v#TQ9T3~HZb*x zsMv}RpeesxyTYke=464IA4mCpg0&C8s}drS%0#+Q>gyul$(N=Et%Os5nQNaRe&Z+} z%c=*(pmrQa&kj&KoSyc)~9G_l2@VJnN;HU3-WBWNhpw5T=2lIX+2`z5ct9x1c+o8&bf?>&C- zppL!Z{~e>IU4^^9@>ymO)T0@MlsOI>(9h79mB7RG;4gC#GO?4hHNNxD1+y-qL?>ci z_|Aghec6IoXP`Wa3x1gq6vcdM{IsXS?3puXDsgFR=uso^9Jiu&vvTuLtFr7Hszl98 zZPw!f!5yXV0E>OP7EGNq>XJLCX|Q#=RFp+D*cFnfD`$oWsn~F)_VTHX_U`YzCD`Php4X z@q5-t89mvCX}n1r%#CsAEBtzKM;d5DSrJuiX3&d4im#}!n(zRpi87N@Q`P2X58#&T zQ%6RiWx1@Lptvu4&$Xq#6W1YMKTaCQ|)+A>Iz2-K9nHY_Hlf9~A53(^rGsFMaip7WaR zycUIHBXBe10?U|&orAt+sr}2$?d--zM&^di95z|0BtSwv)~((Qdct!R$m6;mHCz#F^`+6P$uiBmw*Ep@1KGB@x0Xrmt~cn zGOJ#wi9`B)j-z6h!a}jqI=-@$Q!PKZ@ZJe03;y`)%sb8(s|rW-&Tixo2ymBm*1~t*J+?W%OMtn;NE@C&=m=2 zL|xj}#NJi;2Y-(p630?p9-gC|CRrA;$8w$k0HSIjdr<1(F!SSm=OX}7tPL3fLD7P& z3#kfOUv4GvVszKCrY11;=G?@Y1vdoG-=R*VoRT=P4Xa7~Q~+Kx0hpnm%nce-^+c%% z62&;TR*NRICX%UL*QE~sk#f3?Wr4=AdhO2E{Z-Li`uvs)h~XX^iNvEU_a98S)* z#2zjY%mRWUK=7a-R!-_9QW6W?93XndVU??ow{UVCNw|vOo|Eg{3_)a|570??=Lgyl zZb{Dk^>?I10Of6zu4&)w>Cr}z87UNoxY_*mi2|dgiEdAn8~hMc^S;|L{C>RM%UTbF z)8wKO{O`IrTV5ZLJAl8)VwGtBkfiOIiNVV5(*lO~uhgmzu}sm7>A!`h*Cuh|Y#3OD zWCUXq6PM(1cu(Pq3ex7!-XrX zUS0XDCS&vzJAO{Rx0$-VU_u}hhDjig-LUR01KMxDAQw2OsJW)mLnSxbPP&J*Gj}0o zMHa>Yq+Jj5Ix%HvR(l;zHMRhhJQfK3&(vsbuB@yaLx2|2#aO8$TbQ?B;85el|3gp^ zW_m}DmJq1kYuLjJi&-KyK4grXOYkKK3Ku~Vb=hXJC_*xQjK=dZhuKcMD0aB_$I1CD zU2TAP0h}Bt<=PAgW~{^NHy3*L*x^2F<>P4 z;{?(tq>BmUmONV>5cB_#^rtm8-VLgwpLlBD^$1@=;`uxeGsXukfAmp1!~bR*oW4Qb z8eRHi9N{JRN}f7GI|V^~X)1mLc0nO7O~CVJISO+CKSRwQJc*H?ez^9u*+m^)P!X|> zfwMy_v(^If@T#ZqFI_VP^(x8~!Qb_3i7)Eoulz&PZKL9FZ9rS+M=Stb*~-iNh#d?c zE%Fio=a1|gwS}uZxz4I|f0v<%2k;AnWtV+?aVz6CG6rD(bq@cXjZp`#4Z#S5F5^}J z$5%4v>gB2s*mt551t^#u@;kVWd-6&3`_{H4NilpWCLF0Nb}RHkC!&&yet}6*B54!I zUXdQNx?BF$bkkU!ZiaQ98{Z1zI>vc-AM;+eyf0N}J_i_KPqBb)?t}cA`54a7`9uGM zQElPnxn-g5jBom#M8Aocob65A`s&v1cunr_p1|cwi(a1y+7)`k%is0t&RZB-IIFQQ z-9ARE|K%v{2cx14)gQV7vUFVeCw*s5ma-;jU;83ZVk1~>naUNIwRD(Q9IbF|-KcS< zx~l%v?M>TBX~sW8no2 zH1$y?LWk5!zf27-5pLXe%suCeUmA;dEcbb;RQ-<<{sr>GoH&A;f59-jP^sLwlmA+s z&hNiA0_>t8i=0HcQbxV94yCr5S8sa;6tJX!20O?)0eAEY8TI-e7RF-;P98-1jq<*! z6>EFVUwiLzsHns~G8dkIp>2|_y&s-hss`e-)H`N4{qURIcQEG8nUw+f6}sT45bo3E zhNCu#%)eEFUPwI&P%SsiUdhrB4yj$OzS?m9Z5IB+zl5$ydczZ84b`;uMH9TT1tM6{ zh)G&KPs^}68iIYW25E!d@`75T7`EDm)1UWnQTs*bge8+>KwY~Qzo&~!uS_le{tK5) zIxnGYZQ(UNPfBEhA9<8DNa#mV1jao3{n>#!$UEztgspZ#{;!6V+q4*3PXQ@uN_r*G+GJ$9BD!WBs znm)S4*EU0hQRy@?Np?|kzih6z#W+&x+0Y3~YIPfa8LXHwDl_!rd-;BXy~hQF8xDf~ zHyO{d(pzM23v2k6CF!G?=J0P&AMUUZfs0f@%0Ce=1#CfCc*Pp)eg7^d=@$3P-6areOnRiT8C^Utt$ z;yTQnyLg(cim6j~5Pu23vMtU?t|lU#^dTm<3=jeL*l`u!mgmTIC{kI0g1PJVvATqEWs+$4Ry1Ir0&We4uZW7Binh*u%FYRup_}-F8DLw5YKaV%B)&aD$rE(*&vhOeJnIpS zN9|;p+-3;IL`vSF={9`<^ci}cI5Q< z9sMYjJV$r<^R4Te<%Z6O)Z#yufjS))2FaFFfq;_z6fy0Hqgi&{z!;0)Tn++B4-iN) zP)m%mRKI;R%c)y&R&nu#6GVBf1W5j_MF8etN{XQqK!%ynZy`|r7dc?cXOkZ@K|(%r z1cpRQetj>s+fq%vvRL8d89KOOtq1z{SoeKxvt7&ma^S=-SuOF)l;OlH1RoLe6fz~0 z);50?)PDiCCL96fxev;5x4%IrJbwxXfv+UWkr`$Y~X-x(oNx;pF zRO8R@hH&p79vdAUjmRGyABo#QgiODI228<8o;r0Z<{%dr7kL|#Omp-2pXe+xDN%TZ z{~;8(czAhv+mNo3b8OUMao{UE1VE>o;V13>g)U2dKJp;~bj`_NH6{@lw%WMUvG?zv zv+oycqu;Ou>^3dnJj%8OkU}PeQmAE4+MV$VNkcn>bi^PX^VaQ55OYgRG?M=x8tDjM zwtncBgCI8Uit?=o1ceeEz&V$!Ee!h0>_~-D!`uLs%eUJG>6K$fS#`_z-?0BY#+*Vm z83EDFbhV8{`r~a^@u9NF44`_Y<2D#o&$Pr1+_x_a)z|9{`DX2Sn>=y2VgqzXI>M5YXGN~ zEkU*FO~!qe`($M=-9UUjuhr=!z9gp{hc{l`e=LnNlsrlj+(cU^Fyaia)~8{m zOi&w&hD+&8)F)>d-4jk6o_X?pcVcH+sKd?cAy4_F7T_COfvWo(I^X-O+RBFgDo3i) znUb3GnCp!+HK2od=-|hl{*e!CV9Y*9$CyKxXiVw7EVA7aXNcDpF|x=6RELlM|R?j9Tu zZ4&OX%AX^z@$}mQCzI)B%usRno9s2<@8VZD^^nOWVm#h_ZMlE%gM@k9{1MKyi7}!b zrrCb+jp9Ch->WNg2W4`1jl>szyv!#n>+wM{o-U(@BQ58#Or~OJCSkUhi0mCYxiAF} zoDxD&LpbY%yM6u}Z|PliSYPv-WK|RGCAsILO#|@AM0oolZql=iolR^jgiOaQG z2x~TUC8aLc;z{*r-y+3?ruI`3+8S=~%DIoq9kJyuvf9<}1UAvijxdXgW_ZgqLZnpi zubm!quXE*gbZZ+fhluf^*SC8kmlW3L|E-n7^`#Li%lYny4(<%u3&^wtx0qY{Ve&ub z1d^X2{r)Z#b!RG+HKuTY_gmrTB+5XIhT;t^XF%;TIGP zkSiF_WL~SJZSLp7Fxk{gmMH6oCTedmABdko6_f^jQZujh`PnD#Iwunr7TTxDBj^WyIl!J7uzw7*rP#)BtssS?$2|kBi~?25DQn;AhBGv` zw6ruh&ju;4M&g4Uk4u<`rE)^i-H$wm=ljge6hdWjrg89W=BR0{LZnu+09lMaX(GQ4;6^QmNunbrU;bK3o@g z?hF}PFPysjAr2OE85VPE+RJkzpU%Vgq^Uk$k_%Xu@tid1=R|u00p=}`yt*85oA6hT zCehehDw9)2>rGB)*nF&U@FeJ4t@Dw0C}w005vA##q)mM3JU&LI@^k9~_jynPDzX5` zoRu4|qpGq%GL%eK)dTx(4(h~#(tiy&eGB^^3e`6MzS;DwMCMVR>p0WT*a?|y_^$p6 zq(1^hR&xjx8CwR{(Qb(cvFU^$87y@7}?t{=h^^ItP;actFIP>svO3DpRE4$x0fQ7%8 zXe2B~&>`^$02jNBGqFUEaUNRh!H8{yO3O>A$IIxYG5e@yvM~}=s;09*hX`V%) z5M@KVxjB54&~A!UX4jh19wT0~wU#2vUpT~QeOE&7;Dcf`TwQ6+G_u1f?5Y1gujZ!Q z)A<=Pz#=H$`FwXLD{%~W_G}ZknU&Rvz}tYD*UmcStBmA$S)Y=W(9V?(Ye@g_VV$|? zl3z|V%oBiXZsx~t$Upc(n*;Jx^b0{J6(*+VGmPV2dCx?HQ9Mz2J5DCripl45o}sVf zk6u4}@l-xK(}L@W0R!v zm8s;Wr+?*5Y2o#LFyj8DXZbmtqw$i4olvstxSqy<^ue06J&$CT|NObpeXUE5;%GZQ zkbL9@%0FXzb~bsNIHtgv92^`xx_A(X-x%#mIt9j4Pc!QH@83V@V`__l`taD;yxzzE z_{G%0>t1!4N?29;#zqLWTVK+tGiCRxX)Z1hiD7c51cOmtf@p#Tmn|POf{eI%=yuJQ z1k;bm;_58K^Pi1f>AJI}JIVaCLFA`J=TQx=VWo&R2;GB=x2JyS9-iirIGVtlwkQSH zdt09%t=wIS?)J}ImL70x`AYJrnk)Iv^h;X(i=)fPnf!FS%*o8xA<_=Ro7Dt#ct zYi)0DZw!P^qvkLA<@DlzGkbewmZA?^Ri16x&yBzkk|P zX(hmNDTUQ=E%^lvW5=uci!+T-iN?(>g4nr57(}}@Fpx?&ie}ESXDljek(sD2Vx7?X z?p;pv!w_!fTBnhCDG+f^hBWsDee@N%CmZ^ZI$6)~_bR3}^YcJcIt}cI|3@ws$ca$N zxfUYOyd|S_f0l<@YM*65ck2 zdut%`TWCwSDU%>lMWemQm|^7OX=>mJ(OyL2;axum`f3Q`kV^IvC1M*PG^Y8)U;wj~ z)U1T|UmLa*Xh9`O9e&Ip%;h$9Y?86H0>>&k#AP=w@3#eg+Qw_zXJ{;35g%cMKTg3P z4KCw8L8Qt?fv-Cm4Hlp1bU{R!j~&oC%b}xpJ;!g5=S^y%FG5)8pX9M=2%K_#tA}*3 z7r8H-MEI_?iuUA2B^Ic6-WS!*ABF^j)ex+r-Mq|k=z@?;XFOblzd>o{srHL>EMV18 z$rj*UMUP6LF-8Gu**)rKZ}<(%T_1)(4cxK2A%@xt(A<+A9vUJK`-+f!8Qp9BRVJgKV~)+U(ITRJ#+$<;bEG*kud zRTi)lR`nkyAdJ=n%~s(EvmNA@=s&t%0&Q^rU3j6#NQ{ZRzP@hDh;T~lg+|Eu>ttJ< zcF${Q7z0-ugLg{dj+n&bX(c0m=?C(gKm?h+2#V2G8s5vdB_xd9!@_b`826Cd{}~@b zcDG0*c{dBopd2MdQbO2!V=Vw?qxs}Wp2Vn&R}RG0XgNN(;4BnL#&R=LqtG}f;3{UW zW_EzHvlh-~hR1*CKpM_L>&X7o<+*r&19Lr?F39Xf;J?M`ZbKbd`S!miY(>?+X}E6{ zH+yif@{f0w) zSzm>_SjIXG)My|x$9AD;5g0_tb^Ku$59#HlJ!0iO2jDD#X_s&;#3ZDRg$*m>@}%70E#?*3!}0$Ns6NM=!ZpQ?VGnmy!)*nFN$JKQ#{*$;UmoEXw>8+o@U%1LT@Dfo;dlQ%qJ2;` z(}?y+Q|a~;^QZ$fp-08*;-ev^Acr_W(^gP0O_wPJ@hL_j%W=bsSm_TUI8ln@+o{D0 zsznQw_oQX^8DeDlYU2w50m?-Dr9Ussn9pC)uA(!V9uF-xYwdZ0AFGNByc1x;A6J{BwQjrjNhhz+Z#v7B=wN289 zUhLynFU3-0A@03nT2zxEHk`Io@4T+SEu2e5CA$>vUnj<_9&zcF7igg7tN#B-F^W=& z{^>&K#Ab95S99eO{Hg#kq8?9Q#~MO-Y83C`ig*Z6&{DqyNL5l?0bN&YJ9cJM)bGThEXpn(p1ybx15AUKjbpyhZ{O`X#SCje5?n`HTiwy;Za_gayN7vJ4Vp{|~%6u~YFD@dzN&?@q}% zMm6ZUFS^fp0S-+OI2@F_^65aD{doQ!iO1ikl5&hZAq(no&5|lsH)iU;-iLzLuFgRh z82>^-Y%uCD4}h~$$$8hu{B??RJPLE3%!mLQ9trRQ=ci7d1VznxE7ZnG9UvIBvspdy zI;H#lfrv@Y$;pX{ByOnV^nMFqC)p<)CnvYPhoN(3MpkN~Q8^ket)wD)FbP;YIR(*Y zPT+0ev6Wd|V)rN!(HtcDOp2dhj1xxKzaK{M8K(xd0`d{h2|BV9IQMgYgOI!{V+Z^l z3re5z$(6tQ{_u}xA;egcj2X%BJ-Zc&$m_v3!VfWNZ-djGlV3De(JV347I3ZJma)5! zXfqvSKTy0A<8b?q`ElV$G8_vB+|hl_anf8H98FD4Ywz9Zu~rtQnsvlvZ?B1D1b9j| zi0Bj8`17)))r7t@9sb>REdtV%AttVf$;wI@fN+-7{souQbG!s|*CJr4sJM6ll4Bzd zsUrvpDlpWkfXFkEX9Y<3t5J0hA2sTh>RsMYzr5=T8$3a84DWCQWzhKIb#0@twg_oN z4PWC+$B#LF*tNgpa<#XHPE-o|i-v;?xC~Wk-5AmTAav~*)yUvI7K%b98@}DP@ajSs z=C=(5{4P`VLd+5}WT35GhJ3Y5K1!*FVjoY{#TLb!300&+k zJHy%kbHqc8YSKqu{_G+;ot+r9kxGUVLO=fpzS{UVG;Kc_hlaeH(aNG!_*Ip*JOBCL z(!*`^-S`FQ3t-!CFisBt_z<=!NU$-^!O5vAEFb5t>c8!VYZzDB~GO@ zGExVFY=zm8xP+{$^N9ehfq`Un4t1lUB#mbO^XD?{IV1+MiVlGG0i72nNZ|s6C3pey zCKjCZdlHrpA?L`ZG0*!9UXD%KYgmYTrFK!XY_1RHI_zJ{pl5ssDvr)-!J(8%Ee%xxX5atzEDLQYwr3#*nJmw;v%e{y~v5W;c!PR`9F-` z0@c>N-pu%ZVSaa%b|0VW z`!3df+R+hV6C(edUe;*Y#_c^>ia!};$IpOgD}QHxod4I@MmixqWU4)gkUqC@gVE>H zXP3g!1(Sz|*H3v}2xxqK{kHaT39`dCp0KE7I!yK2WfU&;2)zlVXet?v(Ung)pCUol zU>vq@TCvL9{L&~*IP!Y;vDb@hYAD?55Dl&fN=DM>RcqlhDny`^Q7X6fzW|hIZ&+-y z*Z2?zB+*~fLE(7hDB{XW&jO&po)nAQ`NyHfq%Qs@uY-R*#>br=UHg0dvtmjG++O5| zqBLn!N9jHLM2JdIs$q;(}6r*nAFIGpO#nV;2h^F>vsq{l@0|R-rYJ7Um zMvTL`CTT}hmC9*)RWDsqCKpuWA?S=ciVHuxoMB2yMYUX*-c5U7-~E{CcY{Nw#jW}B zzCH`fsI%n=(h)y8M^zMYvVnwO@>FkB%2{?Ti;TG;z+!6g>qLmlFpub$!3 z`)HzT%66AW_+t>Ne1e?Tp8fyzbmf6ic3qr?QEI3p#k?p>l$e(pA}`uxn@AE$reb7Q zq=gxVN|vcCVGJP}DM_TXU@Qq4)F7tG+B>u$l&#`B&*=U9$-U>CdzRnt@!b2|b1F(? z%y{7>iIX0dt|IR5DDlR;vK1Uwa@me=asC;o-YJggeOKtpv<=E@t62X5tBV{3h0Z5i zbIKDYl9xR3k`*k)F@~CCx$$KW`~q6@4a@XbZp9D%w4ntBzDx{>++3se?(vi7AZ*D; zve=8sU-!^PMnxOn zY)*etU88TG@>gbNH`+hZ;Dmm3{njNm0=Q$N#H*h7?*8Fa>o{14pymEL5Re!3I;Btr zCM1kvNJ)0IkQ6GunEHF}hznLTIKbQ>`t_^7VIlwI6eq+cFPZj|HBpBKIZi(>V-&zT zZ(lRN-G_eovEX+Yv4a=)n=A1Z*y`2eKgH6TVI$2i5kA)DCX5upk1y}Kmzit)-3|^d z)>b+%%FFuM(mnL#e=ipmX=?`RdA6GeAM7PtO%V@&IfMy@?R!rydKz5}&3QLKkC|YZ zSb5FYMWdsmWK?m*chK1&sE1Eq$XqlCI8>Z~ME0q#>KcOmjm6b8YNcwsK66h` z5O(fuVqrMwK$Z7~4kr8AM&<5}>O1$V9Mlx|Z$}E}%vB1$4XjNfDtP;dET;@Wa4fa| zfmK=7y9Gmbi`C~tyA^2b=6kgvuftM7gQEA$5KmGBJ2)33&6{-RBiEEORGfwnAb}w> z($mv*8#Gw@0X@IGcdOqQW*N>OE32%x`@O65u?9$ zDVGnel6_V&9vPh>L{LWg;}n+J_L;WCcT2_T4#J|-7}ci*Uk>YFKTad_a^%Z*^~Ar# z^5A?u(sm^UYN}E0Hk*^dHiFIU9~30Ie(xW@!gHmNfY|+dxD3?pbLz2hR(Es2IJ{U~ z0!g>_5;_(j5J#E%yxGu}Vni`srX-D~e# zvkvAP&V~tRG!#@6G6Jf_TUO{)_*kVL&%Js4u(F}=@I^^c|5_Z_{z zq#330#PLB(4`rFx=2BMvRdliS>98!#0xQA(f$5Q4;yPheuqLh0_hzah;W|s#=R#h# zq~B0m1QL_vb6=wB0Y1A(vX_t?KS0gMw$3nEW>vTdyKwL~jUX=YJHPAp8i$+_EH<2j z`nU6Q$E@g%7=np?-*MmK*nyz1Z^5ih2OEuX0k4^x|4S&Uh23#Fbf>et_e~tiOvn{& zXsUbTVK_V-B7_9^>H^^q4@?+MniX_1%o5lmKqlFV8)hxZFI2CrlW;>Ieg8l&KsZwV zkf=7=FLo&thbR01M9@l20`^mh8-0;#R==LBBHFC(1zr<@6UW5!slWpsBN+a31Pc*X z3PlE-30SjsauTTIAB0Nm`?T-Z7=v{h<3BCsvz{rWWlbabaO^F9TE;?#Crqlwnn+#7 zO-t+K8I&qr+KWV`_Jl~$#h29SEl)Exv)gk=J$P~+W#30GD=seX6DoT+g{r8S#lJ!_ z0ciMkDge5(;_!`~)8ycwHZ5)K8bG?xvFfNsXA{Z2x zmkBF(J7!t>`^wO8~WY0?4o(Zyzpsm~%y!UWwSG4pH z7poaqYIH?^LYUjN7YEFnxQHnmk*{`fjcT3LnT7=5oJ*seVL_YIMz;IS$syw8(nU@& zxJNsgqXrO>5jB}o$NM=q2Y9^beNa2pI=xB~Y*e987MU3VOf_lK}6#*V;la3SFi?l>O64I^q!qy#MxX#@nurl`pVD zoN_Yke#99Z+0tFuO}WHtSE(q!IYg=h;gH|M85=T;!>LH+(^MNW1?NqkiVS~0=kgh@2I83hf51kH?6 zWGGnVPs)0Aje-REUo9BgBrKelN#Oa@aJ6_pq8@M8%bWlN1tR&ql#5kggSTfa&fH`R z&S;bBdE$QV+{}^x2+ct`bA##pnX5Qs-}FYggDBeu=EJloV_PPyGib;hFdlfo;T{yb z`qTK8i`3%dE%F7LOt()nfYHp&PxAVEMD&-%hU00CD-zOHQLf%;=KAhTZInww--HJk zJ>f!NuZdL`j=8p=+wwD16Zl@Pm>3Keah|Nm59u2_zIU&e4EYlxC?-G`lz;5~M5hzD zSMz9h{}1WaRUL{7xx_T+g!dmcK@Y262J_~*j1c4j3ZCSc8F6n|bDK8*(w4)K(?9Rx zvkeed5xp5srk%~Mlg~m^TM3iXN3Cf-Ws*4Qw+4PACbPHe@;#kZJPJ(O-~J&Qz}dl> za2#VnM+oi8^Ecqp1QOJ_)57_#^eNO0ngUQ6|OmNESQ5gxg65&P3je`USU>-NiiS~Fa#HtV;n zIBAnbL|u{~CRxKerLY9O{Zx<6V^#0Kw!+I_^lXL7@5dr_Sfba5?bI< zs(Egpu4?5c#F&vlYR?bnNXxA{Vz*-I<6#B%;)s@1M2lZl!K3nWP?HL3PPo*%^7;pE zeJK@7igcS}$t+mq372gDlA$FPKK&~7kZ=@tifI-1+PZGb@@$%TLJxdot-IxjB-~fC zqc1j)i03?5>*C)xF;RlZaXCG*JT9)|`=&}!eapoDz$=zp<09wG)&H%zMIZ*Sy!O#^ zM3N%&sk7g`iYTYN3exAnPcFx{VM8b>+j3v_k44OtsNM;1x7XHwDfHOc%y4<9qeU#! z4)o;#&P=mr5FDeuWV!VdNecf|E@DeDsl&nY;i0&YA4RCYlPb(O#`6fe2t zFEqr%RXFgl+qFgC%ksxmXWfe^Cr;!hio!k+{hS^(=ow$2{MSq-&P`vejBaD;Q{Gw_ zxW(+bl_|#8-``QU?@_ne47U*q`DDhmm! zL09U{?4ktAryXB@SYgWJEX#;Nw+7-4P`TA}uBhMCDz}!EkVtRJ=^yX9GS%P)Ke={- zu4d?OswomxS-3#U*FPX2AXV?;DHLBLc;AhxZQ!57cJCS3!G%`_ zLkZ5!Bcr30EgBwe4=*$K)a>kqpcG35(O#@=$LnfN>Ie(b{sOmp$`uv5{`LxZcSC%! ze!-AfDF;^w-ppnt6nJ6IrptoFcI3joto=>dTu0Q`$={(uQ@$<-&FSNqVoMjkEUBb! za78bi69`X&VY^Tx6$M36=gqboOMRp-N-~IxJOlp-f)Uq?u8+xYYgq5O4w-DvzXnN) zs;-6F7>+BVX(Gje0lX-~VzGjFy%j#?&T9&T!oz!o#T*?OO}A-!BR43_ZugkI>p8O; zt+lmJ3RZh*S}vmKwMgZakDe@GId8 zh3!RzwIaS$qb5TZ=c**Z0CS8@s2&jkH(bHXrHcBx|J?5<|6NQBL9*IVkdN)f3tU^a z)n0+LUOf=t@lDE9d}1Fdj7w=ynAy-{)0V-jHtsX#SNQau+nqpzy52})`~pBF*~iI* zhiNfST1{{GlR$-XpBeGQ#JvykxZm_Ld}Fe*u=d-s87(w%|#5z`wZ-QvG-lDMn( z7}Zwh)6rcX!C=ZtX#nO^1GcsvGB?-viZJtPO*dy7J5_AY_f&}uCR1!X+24_xM+Sp-X=)p=ZEKY|TLBIaKvN6-SR|Y1l)|%c!%u@ITIo0HrrlFD; z=z$a}I3~Ln0zV*HS_w2Utu2hej`PJA&Qf&(j{~OK9~;iVF5I=hQGJ_m#MhB+ z47ntffKUhmz_") + return errors.New("usage: nativeguards -suite windows|macos|heic-macos|store -capture ") } s, err := suiteFor(*name, runtime.GOOS) if err != nil { diff --git a/scripts/nativeguards/main_test.go b/scripts/nativeguards/main_test.go index be57272c..f7a529bb 100644 --- a/scripts/nativeguards/main_test.go +++ b/scripts/nativeguards/main_test.go @@ -21,6 +21,7 @@ func TestNativeSuitesSelectPlatformAndDistributionGuards(t *testing.T) { {"windows", "windows", "github.com/frathe/picfetch/internal/update", "TestApplyWindows_MissingStagedBinaryRestoresDest", ""}, {"windows", "windows", "github.com/frathe/picfetch/internal/distribution", "TestStoreManaged_DefaultBuildIsFalse", ""}, {"macos", "darwin", "github.com/frathe/picfetch", "TestInstall_GraftsOntoGLFWsDelegate", ""}, + {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/heicdecode/client", "TestNativeMacSandboxHelper", "heicnative"}, {"store", "darwin", "github.com/frathe/picfetch/internal/distribution", "TestStoreManaged_MicrosoftStoreBuildIsTrue", "microsoftstore"}, } { t.Run(tc.name+"/"+tc.test, func(t *testing.T) { diff --git a/todos.md b/todos.md index 2deb5604..ae85c6bb 100644 --- a/todos.md +++ b/todos.md @@ -93,12 +93,18 @@ Restoration work is authorized and tracked in [the active plan](plans/2026-09-15-isolated-heic-restoration.md) and [draft PR #28](https://github.com/frathe/picfetch/pull/28). Local source access is resolved. The pinned WASI development guest, NRGBA8/NRGBA64 protocol, ordinary -fixtures and reproducible source/artifact/import guards are present. Production -decoding remains disabled: native helper restrictions, a real whole-worker memory -budget, shared app/analysis admission, signing/packaging and compatibility checks -are unfinished. A local macOS probe rejected the proposed 2 GiB address-space -limit below existing virtual mappings; separate macOS protection research is -ongoing. Linux/Windows native enforcement is unverified. See +fixtures and reproducible source/artifact/import guards are present. A signed +macOS App Sandbox helper now passes owned file/network-denial, ordinary decode +and cancellation checks. Its bounded parent transport passes owned crash, +blocked-writer timeout and diagnostic tests. Ronin accepted the absent hard total +native-memory cap on macOS; WASM/IPC/deadline/sandbox protections remain mandatory. +The compiler needs a helper-only executable-memory entitlement; the interpreter +timed out on an ordinary 12-megapixel fixture under the same deadline. +Production decoding remains disabled pending shared app/analysis admission, +canonical imaging integration, Linux/Windows enforcement, final packaging and +compatibility checks. The updated source instructions also require retaining or +verifying equivalence of the historical maintained h265 patches before selecting +the shipped source. Native Intel and full packaged qualification remain open. See [qualification evidence](docs/heic/qualification.md). The [independent alternatives](docs/image-codec-alternatives-2026-09-15.md#heic-alternatives) From 52ed2dfb2500d8a6b8b0895e0cba353c934915e0 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 07:38:58 +0200 Subject: [PATCH 04/30] Integrate isolated HEIC services and package qualification --- .github/testshards/internal-ui.tsv | 4 +- .github/workflows/ci.yml | 60 + .github/workflows/microsoft-store.yml | 4 + .github/workflows/release.yml | 28 +- ARCHITECTURE.md | 75 +- Makefile | 22 +- THIRD-PARTY-NOTICES.md | 8 + docs/heic/compatibility-2026-09-16.md | 118 ++ docs/heic/qualification.md | 219 ++- docs/heic/robustness-testing.md | 4 +- go.mod | 3 + internal/favthumbs/sync.go | 11 +- internal/filesort/filesort.go | 11 +- internal/heicdecode/client/admission.go | 116 ++ internal/heicdecode/client/admission_test.go | 81 + internal/heicdecode/client/attachment.go | 110 ++ .../heicdecode/client/attachment_other.go | 13 + internal/heicdecode/client/attachment_test.go | 63 + internal/heicdecode/client/attachment_unix.go | 46 + .../heicdecode/client/attachment_windows.go | 52 + internal/heicdecode/client/broker.go | 227 +++ internal/heicdecode/client/client.go | 71 +- internal/heicdecode/client/client_test.go | 58 +- .../heicdecode/client/native_darwin_test.go | 53 +- .../heicdecode/client/native_platform_test.go | 84 + internal/heicdecode/client/package.go | 124 ++ internal/heicdecode/client/package_test.go | 83 + internal/heicdecode/client/peer_other_test.go | 9 + .../heicdecode/client/peer_windows_test.go | 33 + internal/heicdecode/client/process.go | 15 +- internal/heicdecode/client/process_other.go | 14 +- internal/heicdecode/client/process_unix.go | 18 +- internal/heicdecode/client/process_windows.go | 21 + internal/heicdecode/client/remote.go | 149 ++ internal/heicdecode/client/remote_test.go | 312 ++++ internal/heicdecode/limits.go | 5 +- internal/heicdecode/protocol_test.go | 6 +- .../winisolation/native_windows_test.go | 138 ++ .../heicdecode/winisolation/policy_windows.go | 92 + .../winisolation/process_windows.go | 191 ++ .../winisolation/profile_windows.go | 106 ++ internal/heicdecode/worker/decoder.wasm | Bin 5429315 -> 5458535 bytes internal/heicdecode/worker/isolate_linux.go | 147 ++ internal/heicdecode/worker/isolate_other.go | 2 +- internal/heicdecode/worker/isolate_windows.go | 15 + internal/heicdecode/worker/linux_filter.go | 66 + .../heicdecode/worker/linux_filter_test.go | 85 + internal/heicdecode/worker/main.go | 7 +- .../heicdecode/worker/native_linux_test.go | 134 ++ internal/heicdecode/worker/runtime_test.go | 13 + internal/imaging/exif.go | 6 + internal/imaging/ico.go | 6 + internal/imaging/loader.go | 87 +- internal/imaging/preview.go | 12 +- internal/imaging/raw.go | 7 +- internal/imaging/source.go | 272 +++ internal/imaging/source_kind.go | 102 ++ internal/imaging/source_test.go | 248 +++ internal/imaging/testdata/README.md | 6 +- internal/mosaic/generator.go | 19 +- internal/similarity/analyze.go | 15 +- internal/similarity/client.go | 100 +- internal/similarity/facts.go | 6 +- internal/similarity/heic.go | 43 + internal/similarity/heic_test.go | 192 ++ internal/similarity/search_client.go | 13 +- internal/similarity/search_protocol_test.go | 12 +- internal/similarity/search_worker.go | 18 +- internal/ui/build.go | 3 +- internal/ui/compare.go | 4 +- internal/ui/display/feature.go | 2 + internal/ui/display/load.go | 5 +- internal/ui/display/load_contract_test.go | 40 + internal/ui/display/preload.go | 6 +- internal/ui/exifwin/exifwin.go | 11 +- internal/ui/exifwin/metadata.go | 11 +- internal/ui/favthumbs.go | 2 +- internal/ui/features.go | 10 +- internal/ui/filework.go | 8 +- internal/ui/grid/grid.go | 7 + internal/ui/grid/hashengine.go | 9 +- internal/ui/grid/thumbs.go | 4 +- internal/ui/grid/work.go | 2 +- internal/ui/harness_test.go | 15 +- internal/ui/images.go | 36 + internal/ui/images_test.go | 134 ++ internal/ui/mosaic.go | 2 +- internal/ui/run.go | 5 + internal/ui/savework_test.go | 10 +- internal/ui/sort.go | 2 +- internal/ui/spiral/spiral.go | 11 +- internal/ui/spiral/tunnel.go | 4 +- internal/ui/spiral/tunnel_test.go | 31 + internal/ui/startup.go | 7 +- internal/ui/viewer.go | 5 +- internal/update/apply.go | 14 +- internal/update/apply_test.go | 37 + internal/update/apply_unix.go | 3 + internal/update/companions.go | 138 ++ internal/update/companions_test.go | 107 ++ internal/update/download.go | 86 +- internal/update/package_install.go | 172 ++ internal/update/package_native_darwin_test.go | 172 ++ internal/update/update.go | 13 +- plans/2026-09-15-isolated-heic-restoration.md | 480 +++++ qodana.yaml | 119 ++ scripts/heicbuild/main.go | 28 +- scripts/heicbuild/main_test.go | 56 + scripts/heicbuild/source.go | 90 + scripts/heicguest/decoder.json | 134 +- scripts/heicguest/go.mod | 4 +- scripts/heicguest/go.sum | 2 - scripts/heicpackage/main.go | 204 +++ scripts/heicpackage/main_test.go | 50 + scripts/nativeguards/main.go | 23 +- scripts/nativeguards/main_test.go | 12 +- third_party/h265/LICENSE | 22 + third_party/h265/PICFETCH-SOURCE.json | 113 ++ third_party/h265/PICFETCH.md | 87 + third_party/h265/README.md | 75 + third_party/h265/go.mod | 3 + third_party/h265/heic/color.go | 438 +++++ third_party/h265/heic/color_amd64.go | 126 ++ third_party/h265/heic/color_amd64.s | 214 +++ third_party/h265/heic/color_arm64.go | 112 ++ third_party/h265/heic/color_arm64.s | 259 +++ third_party/h265/heic/color_noasm.go | 27 + third_party/h265/heic/color_riscv64.go | 92 + third_party/h265/heic/color_riscv64.s | 392 +++++ third_party/h265/heic/color_row.go | 209 +++ third_party/h265/heic/cpu_amd64.go | 7 + third_party/h265/heic/cpu_amd64.s | 35 + third_party/h265/heic/encode.go | 561 ++++++ third_party/h265/heic/exif.go | 504 ++++++ third_party/h265/heic/grid.go | 358 ++++ third_party/h265/heic/gridenc.go | 176 ++ third_party/h265/heic/heic.go | 748 ++++++++ third_party/h265/heic/image.go | 276 +++ third_party/h265/heic/isobmff.go | 917 ++++++++++ third_party/h265/heic/limits.go | 39 + third_party/h265/heic/sequence.go | 601 +++++++ third_party/h265/heic/transform.go | 189 ++ third_party/h265/heic/ycbcr.go | 404 +++++ third_party/h265/hevc/budget.go | 36 + third_party/h265/hevc/cabac.go | 237 +++ third_party/h265/hevc/cabac_tables.go | 294 ++++ third_party/h265/hevc/cabacenc.go | 165 ++ third_party/h265/hevc/cpu_amd64.s | 77 + third_party/h265/hevc/ctu.go | 1334 ++++++++++++++ third_party/h265/hevc/deblock.go | 663 +++++++ third_party/h265/hevc/deblock_amd64.s | 378 ++++ third_party/h265/hevc/deblock_arm64.s | 404 +++++ third_party/h265/hevc/deblock_riscv64.s | 363 ++++ third_party/h265/hevc/deblockenc.go | 112 ++ third_party/h265/hevc/decoder.go | 605 +++++++ third_party/h265/hevc/dequant_amd64.s | 132 ++ third_party/h265/hevc/dequant_arm64.s | 88 + third_party/h265/hevc/dequant_riscv64.s | 60 + third_party/h265/hevc/dpb.go | 414 +++++ third_party/h265/hevc/dsp.go | 102 ++ third_party/h265/hevc/dsp_amd64.go | 264 +++ third_party/h265/hevc/dsp_arm64.go | 205 +++ third_party/h265/hevc/dsp_noasm.go | 7 + third_party/h265/hevc/dsp_riscv64.go | 187 ++ third_party/h265/hevc/encoder.go | 275 +++ third_party/h265/hevc/getbits.go | 142 ++ third_party/h265/hevc/headers.go | 1095 ++++++++++++ third_party/h265/hevc/headersenc.go | 215 +++ third_party/h265/hevc/idct_amd64.s | 147 ++ third_party/h265/hevc/idct_arm64.s | 152 ++ third_party/h265/hevc/idct_riscv64.s | 133 ++ third_party/h265/hevc/inter.go | 633 +++++++ third_party/h265/hevc/interpred.go | 482 +++++ third_party/h265/hevc/interpred_amd64.s | 160 ++ third_party/h265/hevc/interpred_arm64.s | 54 + third_party/h265/hevc/interpred_bi_amd64.s | 172 ++ third_party/h265/hevc/interpred_bi_arm64.s | 57 + third_party/h265/hevc/interpred_bi_riscv64.s | 67 + third_party/h265/hevc/interpred_copy_amd64.s | 125 ++ third_party/h265/hevc/interpred_copy_arm64.s | 42 + .../h265/hevc/interpred_copy_riscv64.s | 44 + third_party/h265/hevc/interpred_riscv64.s | 63 + third_party/h265/hevc/interpred_tap_amd64.s | 253 +++ third_party/h265/hevc/interpred_tap_arm64.s | 152 ++ third_party/h265/hevc/interpred_tap_riscv64.s | 62 + third_party/h265/hevc/interpred_tapv_amd64.s | 193 ++ third_party/h265/hevc/interpred_tapv_arm64.s | 173 ++ .../h265/hevc/interpred_tapv_riscv64.s | 69 + third_party/h265/hevc/intrapred.go | 356 ++++ third_party/h265/hevc/intrapred_amd64.s | 168 ++ third_party/h265/hevc/intrapred_arm64.s | 184 ++ third_party/h265/hevc/intrapred_riscv64.s | 137 ++ third_party/h265/hevc/itransform.go | 545 ++++++ third_party/h265/hevc/itransform_amd64.s | 176 ++ third_party/h265/hevc/itransform_arm64.s | 187 ++ third_party/h265/hevc/itransform_riscv64.s | 161 ++ third_party/h265/hevc/lossyenc.go | 1559 +++++++++++++++++ third_party/h265/hevc/mvpred.go | 276 +++ third_party/h265/hevc/nal.go | 331 ++++ third_party/h265/hevc/pcmenc.go | 64 + third_party/h265/hevc/picture.go | 278 +++ third_party/h265/hevc/putbits.go | 66 + third_party/h265/hevc/rdoq.go | 384 ++++ third_party/h265/hevc/residual.go | 610 +++++++ third_party/h265/hevc/residualenc.go | 331 ++++ third_party/h265/hevc/sao.go | 391 +++++ third_party/h265/hevc/saoenc.go | 449 +++++ third_party/h265/hevc/satd_amd64.s | 193 ++ third_party/h265/hevc/satd_arm64.s | 199 +++ third_party/h265/hevc/satd_riscv64.s | 236 +++ third_party/h265/hevc/scaling.go | 151 ++ third_party/h265/hevc/scan.go | 63 + third_party/h265/hevc/slice.go | 575 ++++++ third_party/h265/hevc/sse_amd64.s | 69 + third_party/h265/hevc/sse_arm64.s | 82 + third_party/h265/hevc/sse_riscv64.s | 55 + third_party/h265/hevc/transformenc.go | 141 ++ third_party/h265/hevc/transformenc_amd64.s | 344 ++++ third_party/h265/hevc/transformenc_arm64.s | 170 ++ third_party/h265/hevc/transformenc_riscv64.s | 154 ++ third_party/h265/hevc/transpose_amd64.s | 101 ++ third_party/h265/hevc/transpose_arm64.s | 64 + third_party/h265/hevc/transpose_riscv64.s | 42 + third_party/h265/hevc/wavefront.go | 281 +++ third_party/h265/hevc/wavefrontenc.go | 90 + todos.md | 55 +- 226 files changed, 34220 insertions(+), 389 deletions(-) create mode 100644 docs/heic/compatibility-2026-09-16.md create mode 100644 internal/heicdecode/client/admission.go create mode 100644 internal/heicdecode/client/admission_test.go create mode 100644 internal/heicdecode/client/attachment.go create mode 100644 internal/heicdecode/client/attachment_other.go create mode 100644 internal/heicdecode/client/attachment_test.go create mode 100644 internal/heicdecode/client/attachment_unix.go create mode 100644 internal/heicdecode/client/attachment_windows.go create mode 100644 internal/heicdecode/client/broker.go create mode 100644 internal/heicdecode/client/native_platform_test.go create mode 100644 internal/heicdecode/client/package.go create mode 100644 internal/heicdecode/client/package_test.go create mode 100644 internal/heicdecode/client/peer_other_test.go create mode 100644 internal/heicdecode/client/peer_windows_test.go create mode 100644 internal/heicdecode/client/process_windows.go create mode 100644 internal/heicdecode/client/remote.go create mode 100644 internal/heicdecode/client/remote_test.go create mode 100644 internal/heicdecode/winisolation/native_windows_test.go create mode 100644 internal/heicdecode/winisolation/policy_windows.go create mode 100644 internal/heicdecode/winisolation/process_windows.go create mode 100644 internal/heicdecode/winisolation/profile_windows.go create mode 100644 internal/heicdecode/worker/isolate_linux.go create mode 100644 internal/heicdecode/worker/isolate_windows.go create mode 100644 internal/heicdecode/worker/linux_filter.go create mode 100644 internal/heicdecode/worker/linux_filter_test.go create mode 100644 internal/heicdecode/worker/native_linux_test.go create mode 100644 internal/imaging/source.go create mode 100644 internal/imaging/source_kind.go create mode 100644 internal/imaging/source_test.go create mode 100644 internal/similarity/heic.go create mode 100644 internal/similarity/heic_test.go create mode 100644 internal/ui/images.go create mode 100644 internal/ui/images_test.go create mode 100644 internal/update/companions.go create mode 100644 internal/update/companions_test.go create mode 100644 internal/update/package_install.go create mode 100644 internal/update/package_native_darwin_test.go create mode 100644 scripts/heicbuild/source.go delete mode 100644 scripts/heicguest/go.sum create mode 100644 scripts/heicpackage/main.go create mode 100644 scripts/heicpackage/main_test.go create mode 100644 third_party/h265/LICENSE create mode 100644 third_party/h265/PICFETCH-SOURCE.json create mode 100644 third_party/h265/PICFETCH.md create mode 100644 third_party/h265/README.md create mode 100644 third_party/h265/go.mod create mode 100644 third_party/h265/heic/color.go create mode 100644 third_party/h265/heic/color_amd64.go create mode 100644 third_party/h265/heic/color_amd64.s create mode 100644 third_party/h265/heic/color_arm64.go create mode 100644 third_party/h265/heic/color_arm64.s create mode 100644 third_party/h265/heic/color_noasm.go create mode 100644 third_party/h265/heic/color_riscv64.go create mode 100644 third_party/h265/heic/color_riscv64.s create mode 100644 third_party/h265/heic/color_row.go create mode 100644 third_party/h265/heic/cpu_amd64.go create mode 100644 third_party/h265/heic/cpu_amd64.s create mode 100644 third_party/h265/heic/encode.go create mode 100644 third_party/h265/heic/exif.go create mode 100644 third_party/h265/heic/grid.go create mode 100644 third_party/h265/heic/gridenc.go create mode 100644 third_party/h265/heic/heic.go create mode 100644 third_party/h265/heic/image.go create mode 100644 third_party/h265/heic/isobmff.go create mode 100644 third_party/h265/heic/limits.go create mode 100644 third_party/h265/heic/sequence.go create mode 100644 third_party/h265/heic/transform.go create mode 100644 third_party/h265/heic/ycbcr.go create mode 100644 third_party/h265/hevc/budget.go create mode 100644 third_party/h265/hevc/cabac.go create mode 100644 third_party/h265/hevc/cabac_tables.go create mode 100644 third_party/h265/hevc/cabacenc.go create mode 100644 third_party/h265/hevc/cpu_amd64.s create mode 100644 third_party/h265/hevc/ctu.go create mode 100644 third_party/h265/hevc/deblock.go create mode 100644 third_party/h265/hevc/deblock_amd64.s create mode 100644 third_party/h265/hevc/deblock_arm64.s create mode 100644 third_party/h265/hevc/deblock_riscv64.s create mode 100644 third_party/h265/hevc/deblockenc.go create mode 100644 third_party/h265/hevc/decoder.go create mode 100644 third_party/h265/hevc/dequant_amd64.s create mode 100644 third_party/h265/hevc/dequant_arm64.s create mode 100644 third_party/h265/hevc/dequant_riscv64.s create mode 100644 third_party/h265/hevc/dpb.go create mode 100644 third_party/h265/hevc/dsp.go create mode 100644 third_party/h265/hevc/dsp_amd64.go create mode 100644 third_party/h265/hevc/dsp_arm64.go create mode 100644 third_party/h265/hevc/dsp_noasm.go create mode 100644 third_party/h265/hevc/dsp_riscv64.go create mode 100644 third_party/h265/hevc/encoder.go create mode 100644 third_party/h265/hevc/getbits.go create mode 100644 third_party/h265/hevc/headers.go create mode 100644 third_party/h265/hevc/headersenc.go create mode 100644 third_party/h265/hevc/idct_amd64.s create mode 100644 third_party/h265/hevc/idct_arm64.s create mode 100644 third_party/h265/hevc/idct_riscv64.s create mode 100644 third_party/h265/hevc/inter.go create mode 100644 third_party/h265/hevc/interpred.go create mode 100644 third_party/h265/hevc/interpred_amd64.s create mode 100644 third_party/h265/hevc/interpred_arm64.s create mode 100644 third_party/h265/hevc/interpred_bi_amd64.s create mode 100644 third_party/h265/hevc/interpred_bi_arm64.s create mode 100644 third_party/h265/hevc/interpred_bi_riscv64.s create mode 100644 third_party/h265/hevc/interpred_copy_amd64.s create mode 100644 third_party/h265/hevc/interpred_copy_arm64.s create mode 100644 third_party/h265/hevc/interpred_copy_riscv64.s create mode 100644 third_party/h265/hevc/interpred_riscv64.s create mode 100644 third_party/h265/hevc/interpred_tap_amd64.s create mode 100644 third_party/h265/hevc/interpred_tap_arm64.s create mode 100644 third_party/h265/hevc/interpred_tap_riscv64.s create mode 100644 third_party/h265/hevc/interpred_tapv_amd64.s create mode 100644 third_party/h265/hevc/interpred_tapv_arm64.s create mode 100644 third_party/h265/hevc/interpred_tapv_riscv64.s create mode 100644 third_party/h265/hevc/intrapred.go create mode 100644 third_party/h265/hevc/intrapred_amd64.s create mode 100644 third_party/h265/hevc/intrapred_arm64.s create mode 100644 third_party/h265/hevc/intrapred_riscv64.s create mode 100644 third_party/h265/hevc/itransform.go create mode 100644 third_party/h265/hevc/itransform_amd64.s create mode 100644 third_party/h265/hevc/itransform_arm64.s create mode 100644 third_party/h265/hevc/itransform_riscv64.s create mode 100644 third_party/h265/hevc/lossyenc.go create mode 100644 third_party/h265/hevc/mvpred.go create mode 100644 third_party/h265/hevc/nal.go create mode 100644 third_party/h265/hevc/pcmenc.go create mode 100644 third_party/h265/hevc/picture.go create mode 100644 third_party/h265/hevc/putbits.go create mode 100644 third_party/h265/hevc/rdoq.go create mode 100644 third_party/h265/hevc/residual.go create mode 100644 third_party/h265/hevc/residualenc.go create mode 100644 third_party/h265/hevc/sao.go create mode 100644 third_party/h265/hevc/saoenc.go create mode 100644 third_party/h265/hevc/satd_amd64.s create mode 100644 third_party/h265/hevc/satd_arm64.s create mode 100644 third_party/h265/hevc/satd_riscv64.s create mode 100644 third_party/h265/hevc/scaling.go create mode 100644 third_party/h265/hevc/scan.go create mode 100644 third_party/h265/hevc/slice.go create mode 100644 third_party/h265/hevc/sse_amd64.s create mode 100644 third_party/h265/hevc/sse_arm64.s create mode 100644 third_party/h265/hevc/sse_riscv64.s create mode 100644 third_party/h265/hevc/transformenc.go create mode 100644 third_party/h265/hevc/transformenc_amd64.s create mode 100644 third_party/h265/hevc/transformenc_arm64.s create mode 100644 third_party/h265/hevc/transformenc_riscv64.s create mode 100644 third_party/h265/hevc/transpose_amd64.s create mode 100644 third_party/h265/hevc/transpose_arm64.s create mode 100644 third_party/h265/hevc/transpose_riscv64.s create mode 100644 third_party/h265/hevc/wavefront.go create mode 100644 third_party/h265/hevc/wavefrontenc.go diff --git a/.github/testshards/internal-ui.tsv b/.github/testshards/internal-ui.tsv index 3e479854..f7fa59c1 100644 --- a/.github/testshards/internal-ui.tsv +++ b/.github/testshards/internal-ui.tsv @@ -5,7 +5,7 @@ # baseline-run: 34627413846 # baseline-attempts: 1 # weights: single CI attempt; projected test sums, not measured shard runtimes -# ui-1: 236 entries, 470.520s projected weight sum +# ui-1: 238 entries, 470.520s projected weight sum # ui-2: 248 entries, 470.530s projected weight sum # ui-3: 202 entries, 504.870s projected weight sum # rebalance: 27 whole-test moves; slowest projected sum within 5% of mean @@ -117,6 +117,8 @@ TestGlobalFavoriteShortcutOpensStoredFilesThroughViewer ui-1 TestGridBrowseDuringAnalysis ui-1 TestGridHighlight_TitleKeepsTheModePrefixes ui-1 TestGridHighlight_VariantsHoverUpdatesTitleAndHidesMergePrefix ui-1 +TestHEICOwnerStopsWithViewer ui-1 +TestHEICSourceConsumers ui-1 TestHandleDropBlockedWhileCopyPendingShowsToast ui-1 TestHandleDrop_ClosesOpenGrid ui-1 TestHandleDrop_HidesRestoreLinkEvenWithoutUsingIt ui-1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 727eadbe..76a631e0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -155,6 +155,66 @@ jobs: if-no-files-found: error retention-days: 14 + heic-linux: + name: Linux ${{ matrix.arch }} HEIC native guards (attempt ${{ github.run_attempt }}) + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-latest + arch: amd64 + - runner: ubuntu-24.04-arm + arch: arm64 + runs-on: ${{ matrix.runner }} + steps: + - name: Check out code + uses: actions/checkout@v7 + - name: Set up Go + uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache-dependency-path: go.sum + - name: Qualify HEIC native isolation and address-space ceiling + run: go run ./scripts/nativeguards -suite heic-linux -capture "${{ runner.temp }}/native-guards-heic-linux.json" + - name: Upload native guard events + if: always() + uses: actions/upload-artifact@v7 + with: + name: native-guards-Linux-${{ matrix.arch }}-${{ github.run_id }}-attempt-${{ github.run_attempt }} + path: ${{ runner.temp }}/native-guards-heic-linux.json + if-no-files-found: error + retention-days: 14 + + heic-windows: + name: Windows ${{ matrix.arch }} HEIC sandbox and pipe guards (attempt ${{ github.run_attempt }}) + strategy: + fail-fast: false + matrix: + include: + - runner: windows-latest + arch: amd64 + - runner: windows-11-arm + arch: arm64 + runs-on: ${{ matrix.runner }} + steps: + - name: Check out code + uses: actions/checkout@v7 + - name: Set up Go + uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache-dependency-path: go.sum + - name: Qualify HEIC AppContainer, job limits, inherited handles and cancellation + run: go run ./scripts/nativeguards -suite heic-windows -capture "${{ runner.temp }}/native-guards-heic-windows.json" + - name: Upload native guard events + if: always() + uses: actions/upload-artifact@v7 + with: + name: native-guards-Windows-HEIC-${{ matrix.arch }}-${{ github.run_id }}-attempt-${{ github.run_attempt }} + path: ${{ runner.temp }}/native-guards-heic-windows.json + if-no-files-found: error + retention-days: 14 + windows-test: name: Windows tests (attempt ${{ github.run_attempt }}) runs-on: windows-latest diff --git a/.github/workflows/microsoft-store.yml b/.github/workflows/microsoft-store.yml index ceb654ef..2a0b6651 100644 --- a/.github/workflows/microsoft-store.yml +++ b/.github/workflows/microsoft-store.yml @@ -69,6 +69,10 @@ jobs: if ($LASTEXITCODE -ne 0) { throw 'Staging the x64 package or pinned runtime failed.' } go run -tags no_emoji,nodynamic ./scripts/msixstage -arch arm64 -exe dist/executables/picfetch-microsoft-store-arm64.exe -runtime-archive dist/onnxruntime-win-arm64.zip -out dist/stage-arm64 if ($LASTEXITCODE -ne 0) { throw 'Staging the ARM64 package failed.' } + go run ./scripts/heicpackage -os windows -arch amd64 -out dist/stage-x64 + if ($LASTEXITCODE -ne 0) { throw 'Staging the x64 HEIC helper failed.' } + go run ./scripts/heicpackage -os windows -arch arm64 -out dist/stage-arm64 + if ($LASTEXITCODE -ne 0) { throw 'Staging the ARM64 HEIC helper failed.' } - name: Ensure Desktop C++ framework for local certification shell: pwsh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 730a743f..abfc54b7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -83,12 +83,12 @@ jobs: # name already carries the arch, and that is what users unpacked # before Windows gained a second architecture. for arch in amd64 arm64; do - cp "picfetch-windows-$arch.exe" "picfetch.exe" - zip "picfetch-windows-$arch.zip" "picfetch.exe" ../LICENSE ../THIRD-PARTY-NOTICES.md ../PRIVACY.md -j - rm "picfetch.exe" + cp "picfetch-windows-$arch.exe" "heic-windows-$arch/picfetch.exe" + cp ../LICENSE ../THIRD-PARTY-NOTICES.md ../PRIVACY.md "heic-windows-$arch/" + (cd "heic-windows-$arch" && zip -r "../picfetch-windows-$arch.zip" picfetch.exe heic LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md) done for arch in amd64 arm64; do - tar -czf "picfetch-linux-$arch.tar.gz" "picfetch-linux-$arch" -C .. LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md + tar -czf "picfetch-linux-$arch.tar.gz" "picfetch-linux-$arch" -C "heic-linux-$arch" heic -C "$GITHUB_WORKSPACE" LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md done - name: Upload unsigned Windows artifacts for signing @@ -119,6 +119,13 @@ jobs: permissions: contents: read steps: + - name: Check out code + uses: actions/checkout@v7 + - name: Set up Go + uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache-dependency-path: go.sum - name: Download unsigned Windows artifacts uses: actions/download-artifact@v8 with: @@ -182,8 +189,17 @@ jobs: if ($LASTEXITCODE -ne 0) { throw "Signature verification failed for $($archive.Name)." } - - $packageFiles = @($executable) + $helper = Join-Path $unpacked 'heic/picfetch-heic-worker.exe' + if (-not (Test-Path -LiteralPath $helper -PathType Leaf)) { throw 'The HEIC helper is missing.' } + & $signtool.FullName sign /fd sha256 /tr http://time.certum.pl /td sha256 /sha1 $env:CERTUM_CERT_THUMBPRINT /v $helper + if ($LASTEXITCODE -ne 0) { throw 'HEIC helper signing failed.' } + & $signtool.FullName verify /pa /all /v /tw $helper + if ($LASTEXITCODE -ne 0) { throw 'HEIC helper signature verification failed.' } + $arch = if ($archive.BaseName.EndsWith('-amd64')) { 'amd64' } else { 'arm64' } + go run ./scripts/heicpackage -mode finalize -os windows -arch $arch -out $unpacked + if ($LASTEXITCODE -ne 0) { throw 'HEIC post-signing manifest verification failed.' } + + $packageFiles = @($executable, (Join-Path $unpacked 'heic')) foreach ($name in @('LICENSE', 'THIRD-PARTY-NOTICES.md', 'PRIVACY.md')) { $notice = Join-Path $unpacked $name if (-not (Test-Path -LiteralPath $notice -PathType Leaf)) { diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 5946464e..91a0b5a8 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -56,6 +56,10 @@ dispatch. Each request captures the caller's encoded-file size limit; the worker installs it before source reads. `analyze.go` accounts for every input, captures source versions, reuses canonical full oriented decoding, makes previews, and publishes a map on manual request, optionally every 30 sources, and at completion. +`heic.go` attaches the optional application-owned HEIC client's explicit pipes, +initializes one worker Remote/`imaging.Reader`, and joins connection cleanup. +Analysis and retained search derive hashes/facts/previews from `imaging.Source`; +workers receive no helper executable selection and cannot launch their own. `facts.go` captures versioned oriented dimensions, normalized extension and optional EXIF camera/calendar-date facts from already-read sources; old cached representations backfill these facts without inference. `tags.go` exposes catalogue identity for @@ -483,6 +487,7 @@ The concurrency invariant: see `AGENTS.md` § Concurrency and Fyne. | `run.go` | `Run`: restore startup viewer, start runtime (`favstore.DefaultDir`, position polling), register shutdown and CLI drop, enter the Fyne loop. Shutdown retires title/menu updates, cancels feature work and flushes preferences without rebuilding retired native menus. Store-managed builds skip GitHub update startup and staged-binary apply. Explicit trial startup reserves new evidence, isolates Favorites/presets/updates, disables update activity, auto-opens Explorer after the ordinary scan, and joins its signal watcher and workers before finalizing evidence. | | `build.go` | `buildViewer` composes widgets and `registerFeatures` modules and snapshots `distribution.StoreManaged` onto the viewer. Overlay tail: copy selection, similarity map, grid, comparison (including its pointer shield), delete confirm, export prompt, toast. Desktop canvases also receive the chained comparison key-down hook for exact physical `Ctrl+L`; ordinary typed-key and shortcut wiring remains separate. | | `startup.go` | `loadStartupState` / `restoreStartupGeometry` / `buildStartupViewer` — the one load→build→restore path shared by `Run` and tests. | +| `images.go` | One optional app-family HEIC owner and immutable foreground/background `imaging.Reader` values injected before GUI and analysis work. Shutdown Stop/Wait owns complete helper/pipe retirement. Production construction supplies no owner until package/platform qualification. | | `components.go` | Dropzone, scan, sort, and info-overlay constructors. Toast stays in `toast.go`. | | `trane.go` | Welcome-screen Trane: hosts `widgets.Gaze` with a compact 17-cell atlas. Owns pointer/window-layout coordinates, scaled dead zone, immutable decode cache and magenta-spill correction within five source pixels of transparency. Hide/MouseOut forget pointer position and circle progress. A hover-only surface preserves input across the restore link; ten circles request `Help.ShowFinis`. No timers or background workers. `scripts/appassets` retains the used pixels from `assets/trane/codex-pet/spritesheet.webp`. | | `explorer.go` | Root adapter for Explorer: captures duplicate-prepared sources, composes setup acknowledgment with preferences, maps frozen cohort identities to collection indexes, and coordinates map/Grid/image transitions. The feature owns workflow, dialogs, workers and delivery. `explorerInput` retains collection/launch/window policy only. | @@ -567,6 +572,7 @@ Encode/write-back for a subset of formats lives in `save.go`; `mutations.go` ser |------|----------------| | `bytecache.go` | `ByteCache[V]`: goroutine-safe LRU by estimated bytes. `Add` admits foreground images even over budget; generation-bound `CacheWriter.AddIfRoom` admits display preloads only into remaining space without eviction or promotion. `AddIfFits` keeps its existing individual-size gate and may evict. `LoadedImage.DecodedBytes` shares retained pixel/vector accounting with the mosaic repeat cache. | | `loader.go` | `LoadedImage`, `NewImgCache`, `ReadAndProbe`, `CaptureDateContext` (cancellable metadata reads), `DecodeLoaded` (pixels), `DecodeRecord` (complete full-cache facts), `LoadImage`, `IsSupportedImage`, `SupportedExtensions`, `MaxEncodedBytes` / `InputTooLargeError`. | +| `source.go`, `source_kind.go` | Immutable `Reader` and `Source` share ordinary probe/decode algorithms and carry validated HEIC pixels/normalized metadata without retaining encoded HEIC bytes. Reader injection selects the shared owner; zero value refuses HEIC. Bounded leading file-type dispatch precedes bulk reads and prevents native HEIC metadata/preview fallback. `InspectMetadata` returns normalized values, byte count and JPEG strip capability from one source read. | | `ico.go` | Explicit ICO probe/decode dispatch, independent of the desktop driver's decoder registration: validates directory/payload spans and dimensions, selects the same single image for probe/decode, delegates PNG or normalized uncompressed DIB pixels to existing decoders, and applies icon transparency. | | `raw.go` | Largest embedded JPEG from TIFF IFDs or SOI scan (CR3/RAF). | | `svg.go` | SVG detection, logical-size floor (`MinVectorWidth`/`Height` = UI `startW`/`startH`), `ClampVectorRaster` / `MaxVectorRasterPixels`. | @@ -596,7 +602,7 @@ responses, dimensions, NRGBA8/NRGBA64 layout, operation-specific payload lengths normalized metadata and exact EOF before publication. `metadata.go` rejects unknown/duplicate fields and invalid bounded values. `ready.go` reports actual startup memory controls separately from requested limits. HEIC viewing remains -disabled pending app-family integration and platform/package qualification. +disabled pending platform/package qualification and production activation. ### `internal/heicdecode/client`, `worker`, and `cmd/picfetch-heic-worker` @@ -604,24 +610,64 @@ disabled pending app-family integration and platform/package qualification. parent-owned file/loopback probes, readiness, bounded pipes and response checks. Admission precedes source reads. Stop cancels pending/active work; Wait joins process and pipe completion. Unix group termination precedes leader reap. -This instance is not yet shared across app and analysis processes. +Its fair lane gives waiting background work a turn after three foreground +grants. `broker.go` serves at most eight explicit pipe connections through that +same lane, sending native-ready grants before remote bulk reads and retaining +admission through result delivery. `remote.go` validates frames and joins +cancellation; a disconnected queued peer is observed through one control byte. +`attachment.go` supplies explicit inherited pipes and observes parent-copy, +service and remote lifetimes. GUI construction and analysis requests share one +optional owner; production currently supplies none pending qualification. +`package.go` bounds and validates the trusted installed-package manifest, fixes +helper paths per OS, checks the target and pins the post-signing executable. `worker` embeds the fixed WASI artifact and streams bounded stdio through wazero with finite linear memory and a deadline. Native code accepts no image paths. Its macOS cgo boundary verifies the App Sandbox entitlement; the entry point then verifies denied owned file reads/creation and TCP/UDP access before input. -Other platforms currently refuse startup. Native-memory readiness is explicitly -zero on macOS; its Go memory target is not a hard OS cap. The helper alone may +The Linux no-cgo amd64/arm64 candidate installs synchronized default-deny +seccomp with exact Go thread flags, private anonymous mappings and runtime +stdio/scheduling operations. It verifies RLIMIT_AS/CPU/core/file/descriptor +limits and a no-access oversized-mapping refusal before readiness. Its native +qualification is a separate `heic-linux` CI suite. Windows amd64/arm64 uses +`winisolation` below and verifies its token/job before the same denial probes. +Other builds refuse startup. +Native-memory readiness is explicitly zero on macOS; its Go memory target is +not a hard OS cap. The helper alone may import the embedded guest runtime. `packaging/heic` holds the macOS bundle and entitlement templates; `heicinterpreter` is the qualification runtime variant. `cmd/picfetch-heic-worker` is the minimal single-request entry point, without -Fyne or a native HEIC codec. Final application packaging/integration is pending. +Fyne or a native HEIC codec. Final application packaging/activation is pending. + +### `internal/heicdecode/winisolation` + +Windows-only helper process boundary. `process_windows.go` creates a suspended +zero-capability AppContainer with three explicit inherited stdio handles, +assigns a private one-process Job Object with committed-memory/user-CPU limits +and kill-on-close, then resumes. `policy_windows.go` queries the actual token, +identity, capabilities and immediate job before worker readiness. Process Kill +and Wait serialize handle retirement. `profile_windows.go` owns the stable +AppContainer profile and explicit read/execute provisioning for a dedicated +helper file and its directory, with no inherited ACL grant. Launch does not +change ACLs. Native controls and ordinary decoder fixtures are required by the +`heic-windows` amd64/arm64 CI suite; native execution remains unverified. + +### `scripts/heicpackage` + +Stages the minimal native helper at `client.PackagePaths`, its complete +h265/Go/wazero notices and a bounded post-signing SHA-256 manifest. It verifies +the binary target, uses pure Go for Linux/Windows, and builds/signs/verifies the +macOS App Sandbox bundle. `finalize` refreshes the manifest after Windows +Authenticode signing. Native helper tests use the same staging tool. Makefile +and release/MSIX assembly retain the helper directory; package creation alone +does not enable production HEIC. ### `scripts/heicguest` and `scripts/heicbuild` -Development-only HEIC/WASI qualification. `heicguest` is a separate module pinned -to unmodified h265 v0.2.3. Its WASI-only entry point rejects movie containers, +Development-only HEIC/WASI qualification. `heicguest` is a separate module using +the maintained `third_party/h265` copy through an explicit local replacement. +Its WASI-only entry point rejects movie containers, decodes still pixels/config/Exif in the guest, preserves straight-alpha precision and emits `internal/heicdecode`'s protocol. `fixturegen` writes one fixed ordinary ten-bit gradient; `fixturephoto` writes one fixed ordinary 12-megapixel gradient. @@ -637,6 +683,16 @@ implement a native worker-family memory cap. See `docs/heic/qualification.md`, t restoration plan and `docs/heic/robustness-testing.md` for status and remaining platform, compatibility and distribution gates. +### `third_party/h265` + +The v0.2.2-based production source previously maintained at PicFetch `fc127b44`, +including local coded-work, container, NAL and transformed-config hardening. +`PICFETCH.md` records selection and upgrade rules; `PICFETCH-SOURCE.json` pins +the exact 107-file production copy. The separate WASI guest uses `noasm`; this +module is excluded from native application imports, not from source provenance. +`scripts/heicbuild/source.go` verifies its baseline and both module replacements. +The ordinary fixture target `test-h265` reaches this nested source through WASI. + ### `internal/avifpolicy` An imaging compile dependency with files only under `nodynamic && !wasm2go`. @@ -684,10 +740,11 @@ GitHub-release check, SHA-256 + immutable release attestation verify, stage, app | `update.go` | `Client`, `AssetName`, `Newer`, `Due`. | | `github.go` | Releases + release-attestation HTTP. | | `checksums.go` | `VerifyHash` (optional API digest). | -| `download.go` / `extract.go` | Fetch with optional `DownloadProgress`, hash, attest, unzip/tar, and persist `Stage` provenance plus extracted-file hashes for reuse/apply revalidation. | +| `download.go` / `extract.go` | Fetch with optional `DownloadProgress`, hash, attest, unzip/tar, and persist `Stage` provenance plus extracted-file hashes for reuse/apply revalidation. Each authenticated archive extracts into a fresh payload directory before companion hashes are captured. | +| `companions.go` / `package_install.go` | Bounded exact companion inventories tied to stage provenance. Linux/Windows swap the dedicated helper directory around the existing binary transaction and roll it back on failure. Qualified macOS stages replace the complete verified app bundle, preserving its enclosing/nested signatures. Legacy stages keep their binary/plist path and cannot install a newly introduced helper. | | `attest.go` | GitHub Fulcio Sigstore `Verifier` + in-toto release policy. | | `tufroot.go` | Offline 60-day expiry check and verified sync of `embed/tuf-repo.github.com/root.json`. | -| `apply.go` / `apply_unix.go` / `apply_windows.go` | `Apply` dispatcher with `ApplyOptions`, normal shutdown without relaunch, explicit Perform-update relaunch. Unix (`apply_unix.go`) writes `.new` beside the target, renames it into place, and rolls back through `.old` on failure. Windows (`apply_windows.go`) replaces the running executable in-process via `swapBinary` — it used to run a generated `.apply.cmd` through `cmd.exe`, which Controlled Folder Access refuses outright regardless of `cmd.exe`'s own Microsoft signature; that script is gone. | +| `apply.go` / `apply_unix.go` / `apply_windows.go` | `Apply` dispatcher with `ApplyOptions`, normal shutdown without relaunch, explicit Perform-update relaunch. Legacy/standalone Unix (`apply_unix.go`) writes `.new` beside the target, renames it into place, and rolls back through `.old` on failure. Windows (`apply_windows.go`) replaces the running executable in-process via `swapBinary` — it used to run a generated `.apply.cmd` through `cmd.exe`, which Controlled Folder Access refuses outright regardless of `cmd.exe`'s own Microsoft signature; that script is gone. | | `swap.go` | `swapBinary`: the Windows in-process replace. Renames the running executable to `.old` (the one replacement Windows allows on a running image), copies the staged binary over `dest`, SHA-256-verifies the copy against the stage, and *tries* to restore `.old` on any failure past the rename — the rename back is retried a few times and then falls back to copying the backup over `dest`, but if all of that is refused too, `dest` is left truncated or missing and the reported `Op` is `restore`. That is the one outcome PicFetch cannot recover from or even report on the next launch, since reading the record needs the executable that is broken. `.old` deliberately survives a successful swap — it is still this process's own running image — for the next launch to sweep (`await.go`). | | `applyerr.go` | `ApplyError` (`Op`/`Path`/`Err`) and `FailureReason` (`ReasonAccessDenied` / `ReasonVirusBlocked` / `ReasonSharingViolation` / `ReasonUnknown`); `ClassifyApplyError` maps a failed `Apply` to the reason the next launch reports, preferring Windows errno classification (`applyerr_windows.go`) over the portable `fs.ErrPermission` fallback (`applyerr_other.go`). | | `await.go` | `AwaitPIDEnv` (`PICFETCH_UPDATE_AWAIT_PID`) relaunch handshake. `CleanupPredecessor`, called from `main.go` before `app.NewWithID`, waits (bounded, 15s) for the process that installed this executable to exit before preferences are touched, then sweeps `.new` / `.apply.cmd` left by pre-2026-08-30 updates. `SweepBackup`, called from `internal/ui` startup once the Fyne app cache exists, removes `.old` — skipped when the last recorded apply failure has `Op == "restore"`, the one state where the backup is the user's only intact executable. | diff --git a/Makefile b/Makefile index c688626d..32f31fba 100644 --- a/Makefile +++ b/Makefile @@ -440,7 +440,9 @@ clean: ## Remove all build artifacts package-mac: install-fyne ## Package a macOS .app bundle (native, no Docker) into bin/ "$(FYNE_BIN)" package -os darwin -icon $(ICON) -name "$(APP_NAME)" -appID $(PACKAGE_ID) -tags "$(APP_TAGS)" -release go run -tags "$(APP_TAGS)" ./scripts/plistdoctypes "$(APP_NAME).app/Contents/Info.plist" + go run ./scripts/heicpackage -os darwin -arch $$(go env GOARCH) -out "$(APP_NAME).app" cp LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md "$(APP_NAME).app/Contents/Resources/" + codesign --force --sign - "$(APP_NAME).app" mkdir -p $(BIN_DIR) rm -rf "$(BIN_DIR)/$(APP_NAME).app" mv "$(APP_NAME).app" "$(BIN_DIR)/" @@ -459,6 +461,7 @@ package-windows: warm-fyne-cross-windows install-fyne-cross ## Cross-compile Win for arch in $(WIN_ARCHES); do \ "$(FYNE_CROSS_BIN)" windows -engine "$(FYNE_CROSS_ENGINE)" -image "$(FYNE_CROSS_WINDOWS_IMAGE)" -cache "$(FYNE_CROSS_CACHE)" -arch=$$arch -icon $(ICON) -name $(BIN_NAME) -app-id $(PACKAGE_ID) -tags "$(APP_TAGS)" -env GOTOOLCHAIN=auto || exit 1; \ cp fyne-cross/bin/windows-$$arch/$(BIN_NAME).exe $(BIN_DIR)/$(BIN_NAME)-windows-$$arch.exe || exit 1; \ + go run ./scripts/heicpackage -os windows -arch $$arch -out "$(BIN_DIR)/heic-windows-$$arch" || exit 1; \ done package-windows-store: warm-fyne-cross-windows install-fyne-cross ## Cross-compile Microsoft Store-managed Windows .exe files into bin/ (MSIX packaging runs on Windows in CI) @@ -480,6 +483,7 @@ package-linux: warm-fyne-cross-linux install-fyne-cross ## Cross-compile Linux b for arch in $(LINUX_ARCHES); do \ "$(FYNE_CROSS_BIN)" linux -engine "$(FYNE_CROSS_ENGINE)" -image "$(FYNE_CROSS_LINUX_IMAGE)" -cache "$(FYNE_CROSS_CACHE)" -arch=$$arch -icon $(ICON) -name $(BIN_NAME) -app-id $(PACKAGE_ID) -tags "$(APP_TAGS)" -env GOTOOLCHAIN=auto || exit 1; \ cp fyne-cross/bin/linux-$$arch/* $(BIN_DIR)/$(BIN_NAME)-linux-$$arch || exit 1; \ + go run ./scripts/heicpackage -os linux -arch $$arch -out "$(BIN_DIR)/heic-linux-$$arch" || exit 1; \ done package-linux-debug: warm-fyne-cross-linux install-fyne-cross ## Cross-compile unstripped Linux binaries for diagnosing startup failures, one per arch in LINUX_ARCHES @@ -610,7 +614,7 @@ heic-check-guest: ## Test the guest and owned runtime/transport boundaries heic-fixture: ## Reproduce the fixed 16x16 ten-bit fixture inside WASI go run ./scripts/heicbuild fixture -.PHONY: heic-photo-fixture heic-native-macos +.PHONY: heic-photo-fixture heic-native-macos heic-native-linux heic-native-windows heic-photo-fixture: ## Reproduce the fixed 12-megapixel qualification gradient inside WASI go run ./scripts/heicbuild photo-fixture @@ -618,7 +622,23 @@ heic-native-macos: ## Qualify signed sandboxed helpers and bounded runtime choic mkdir -p .scratch/heic-qualification go run ./scripts/nativeguards -suite heic-macos -capture .scratch/heic-qualification/native-macos.json +heic-native-linux: ## Qualify the no-cgo HEIC helper's syscall and native address-space limits on Linux + mkdir -p .scratch/heic-qualification + go run ./scripts/nativeguards -suite heic-linux -capture .scratch/heic-qualification/native-linux.json + +heic-native-windows: ## Qualify the HEIC AppContainer helper, job limits and inherited pipes on Windows + mkdir -p .scratch/heic-qualification + go run ./scripts/nativeguards -suite heic-windows -capture .scratch/heic-qualification/native-windows.json + .PHONY: heic-security-govulncheck heic-security-govulncheck: ## Scan the separate WASI guest module (including its fixed fixture generator) @scanner="$$(go tool -n govulncheck)"; \ cd scripts/heicguest && GOOS=wasip1 GOARCH=wasm CGO_ENABLED=0 GOWORK=off "$$scanner" -tags=noasm ./... + +.PHONY: generate-heic-wasm check-heic-wasm test-h265 +generate-heic-wasm: heic-build ## Rebuild the guest from the maintained h265 source + +check-heic-wasm: heic-check-provenance heic-check-imports ## Verify maintained source and WASI-only decoder provenance + +test-h265: check-heic-wasm ## Exercise the maintained nested decoder through ordinary WASI fixtures + go test -tags "$(APP_TAGS)" -run '^TestWASIGuestOrdinaryFixtures$$' -count=1 ./scripts/heicbuild diff --git a/THIRD-PARTY-NOTICES.md b/THIRD-PARTY-NOTICES.md index 28276c11..01056883 100644 --- a/THIRD-PARTY-NOTICES.md +++ b/THIRD-PARTY-NOTICES.md @@ -9,6 +9,14 @@ reconciles the pinned production updater sources across all six desktop targets; `make check-updater-notices` verifies that inventory and its exact source texts. Test-only dependencies are excluded because they do not ship. +The isolated HEIC helper contains the maintained PicFetch h265/HEIC source based +on gen2brain/h265 v0.2.2 (MIT), a Go WASI runtime (BSD-3-Clause and patent grant), +and wazero v1.12.0 (Apache-2.0). Their complete applicable source notices ship in +`heic/notices/`, under `Contents/Resources/` in the macOS app. The helper's manifest +records its post-signing executable and guest hashes. HEIC viewing remains +disabled until platform qualification is complete. These software notices make +no claim about HEVC patent rights. + The historical `github.com/hashicorp/golang-lru/v2` notices remain below, including MPL-2.0 and the separate Go-derived BSD notice for `simplelru/list.go`. The updater inventory also records MPL-2.0 matcher provenance in diff --git a/docs/heic/compatibility-2026-09-16.md b/docs/heic/compatibility-2026-09-16.md new file mode 100644 index 00000000..fbd8dbfc --- /dev/null +++ b/docs/heic/compatibility-2026-09-16.md @@ -0,0 +1,118 @@ +# Ordinary HEIC compatibility checks, 2026-09-16 + +## Scope and method + +These checks use ordinary existing licensed fixtures and the current real, +ad-hoc-signed App Sandbox helper on macOS 27.0 (26A428), Apple Silicon. The +helper uses the maintained WASI artifact and unchanged production candidate +limits: one admitted job, 64 MiB input, 64M pixels, 256 MB output, 1 GiB WASM +memory and a 60-second deadline. Source bytes enter after native readiness. +There is no native decoder fallback in PicFetch. + +Independent reference work runs outside PicFetch, only on these ordinary +fixtures: macOS ImageIO applies orientation and draws into an eight-bit sRGB +bitmap; ExifTool 13.55 reports metadata. PNG comparisons use premultiplied RGBA, +with errors expressed on a 0–255 scale. The eight-bit reference cannot establish +sixteen-bit precision, HDR correctness or broad colorimetric fidelity. Local +tools/results are retained under `.scratch/heic-qualification/`; the reference +tool is `/private/tmp/picfetch-heic-reference.swift`. + +## Existing fixture results + +| Fixture | Real helper result | Independent check and limit | +| --- | --- | --- | +| `internal/imaging/testdata/test_exif.heic` | 480×640 NRGBA, 1.204 s; orientation 6, TestCam/Model123, f/5.6, ISO 800 | ImageIO and ExifTool agree on metadata and upright dimensions. RGB mean absolute error 0.893/0.517/0.586; maximum 3/2/2. This is a synthetic metadata fixture, not a camera photo. | +| `scripts/heicbuild/testdata/basic.heic` | 320×240 NRGBA, 1.023 s | Same dimensions and recognizable test pattern as ImageIO. Six unobstructed bottom-row color bars differ by at most two levels per channel. Full-image RGB mean absolute error 3.515/1.863/2.339; maxima 134/74/117 occur outside those flat samples. This is not pixel-equivalence evidence; texture/edge discrepancies are not diagnosed here. | +| `scripts/heicbuild/testdata/alpha.heic` | 64×64 NRGBA, 0.911 s | Alpha samples match the independent reference exactly. Premultiplied RGB mean absolute error 0.535/0.326/0.469. | +| `scripts/heicbuild/testdata/tenbit.heic` | 16×16 NRGBA64, 0.917 s | The owned full-range grayscale ramp matches its known generated values within one ten-bit quantization step; equal RGB channels and opaque alpha survive. ImageIO expands/clips this fixture's range differently, so its eight-bit output is not accepted as the numeric oracle. | + +Fixture origin and retained notices are recorded in +[`scripts/heicbuild/testdata/README.md`](../../scripts/heicbuild/testdata/README.md) +and [`internal/imaging/testdata/README.md`](../../internal/imaging/testdata/README.md). +The synthetic EXIF fixture SHA-256 is +`49d881a7a87d91cdf79d4599a3f7ecf331fa9d940743954856dc1c66fdd2eae3`. + +The native guard now checks Decode, DecodeConfig and DecodeExif against those +known synthetic metadata and single-container-rotation expectations. Its +metadata subtest passes in 3.850 s including package/test setup. The strengthened +ordinary ten-bit subtest passes in 1.893 s. GoLand reports no findings in the +changed test file. These assertions establish additional positive behavior; +they do not claim a fixed production defect or new camera support. +The complete native sandbox-helper test passes in 5.906 s with both additions; +`make verify-build` also passes afterward. + +## One real camera photograph + +The selected subject is a bee on a flower, Imazen sample 1427, photographed by +contributor `lilith` with a Samsung S23 Ultra. The publisher's pinned +[per-photo manifest](https://raw.githubusercontent.com/imazen/imazen-26/ce09d338b3f68f9bdc8d222f40017ea71ca6bfa4/1400-lilith-nature/MANIFEST.tsv) +records `PD-own`; its +[license statement](https://raw.githubusercontent.com/imazen/imazen-26/ce09d338b3f68f9bdc8d222f40017ea71ca6bfa4/README.md) +defines that as the photographer's own work released to the public domain, +while describing the inventory as best-effort. No private photo library was +accessed. The sample is retained only in local ignored qualification output. + +The [immutable test manifest](https://raw.githubusercontent.com/imazen/imazen-26/ce09d338b3f68f9bdc8d222f40017ea71ca6bfa4/manifests/test.tsv) +pins the [ordinary original](https://codec-corpus.r2.imazen.org/imazen-26-unprocessed/1400-lilith-nature/1427_nature_bee-on-pink-flower_monument-inochi-kyoto_s23u_iso64-f4p9_20231107-111746_4000x3000.heic): + +- Actual file size: 2,872,198 bytes. +- SHA-256: `b18db35022b1d1d0617b166eef381464cf0d07dbd5f34afeb11d01820ad08f40`. +- The complete size and digest were verified before any decoder read. Stalled + long transfers were completed with sequential bounded 64 KiB range requests; + no incomplete image was decoded. +- Real sandboxed helper: successful NRGBA decode in **20.414 seconds**, upright + **3000×4000**, within the unchanged 60-second/1-GiB-WASM/one-job limits. +- Metadata agrees with independent ImageIO/ExifTool: orientation 6, `samsung`, + `Galaxy S23 Ultra`, original date `2023:11:07 11:17:46`, f/4.9, ISO 64, + exposure 1/60 s and focal length 27.2 mm. + +The public image contains an eight-bit P3 profile with sRGB transfer. Against +the orientation-aware, color-managed ImageIO sRGB output, RGB mean absolute +errors are **7.529 / 8.283 / 7.644**, RMSE **9.017 / 9.524 / 9.465**, and maxima +**29 / 30 / 70** on a 0–255 scale. Alpha agrees exactly. Visual inspection +confirms the same complete upright scene; these pixel differences do not +establish color fidelity. Profile omission is a known implementation limit; +the experiment does not attribute every pixel difference solely to that cause. + +A publisher-generated upright SDR PNG was also identified through a pinned +[LFS pointer](https://raw.githubusercontent.com/imazen/imazen-26/0264d4d8a7e283c046ba2d1febb6e1fc547d511e/png-v3/1400-lilith-nature/1427_nature_bee-on-pink-flower_monument-inochi-kyoto_s23u_iso64-f4p9_20231107-111746_3000x4000.sdr.png): +17,752,719 bytes, SHA-256 +`dd7b9491fe6bf115820b28dc945f58090866de872f365eddcb50e5751825129b`. +It was not downloaded or used as a pixel oracle; the actual reference above is +local ImageIO. That distinction avoids claiming an unperformed comparison. + +This establishes normal decode, metadata and orientation for **one** Samsung +file on Apple Silicon. It does not qualify every Samsung image, other camera +families, iPhone files, HDR, or faithful wide-gamut display. + +## Color/HDR support boundary + +The maintained decoder's documented contract applies YUV matrix/range conversion +but leaves primaries and transfer functions in the source color space. ICC data +is only exposed by DecodeColor. PicFetch's guest calls Decode, and its protocol +carries no ICC/CICP profile or HDR metadata. See +[`third_party/h265/heic/heic.go`](../../third_party/h265/heic/heic.go) and +[`scripts/heicguest/main.go`](../../scripts/heicguest/main.go). + +ICC-managed/wide-gamut display, PQ/HLG transfer handling, HDR tone mapping and +gain-map composition are therefore not implemented. The guest does not reject +files merely because they use those color classes; it can return untagged +source-space pixels. Successful decode or sixteen-bit transport must not be +described as faithful HDR/wide-gamut display. This work does not add a color +engine or change that behavior. Production HEIC remains disabled. + +## What remains unverified + +- Broad camera/device compatibility and other valid crop/mirror/rotation + combinations. The decoder supports still-container transforms; the checked + cases cover only the ordinary inputs listed here. +- Exact SDR color equivalence, wide-gamut color management and HDR presentation. + No suitable HDR reference was selected; the missing presentation behavior is + established independently by the current code contract and is not cured by + adding a fixture. +- Native Intel/macOS, Linux and Windows camera results, distribution execution, + and native worker memory measurements. Apple Silicon runs and cross-builds + do not substitute for those CI/package gates. + +The bounded compatibility continuation is complete. No new decoder, color +engine, production activation, commit, push or signing change was made. diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md index 8d6a412e..c972e4bb 100644 --- a/docs/heic/qualification.md +++ b/docs/heic/qualification.md @@ -5,23 +5,26 @@ **HEIC viewing is still disabled on every production platform.** This branch contains a reproducible WASI guest, codec-free protocol, bounded parent launcher and a minimal helper. Native Apple Silicon tests exercise a signed App Sandbox -bundle and real decoding; Linux/Windows enforcement, shared app/analysis -admission, final packaging and canonical imaging integration are incomplete. -Those remain activation gates. No release or merge is authorized by this record. - -The subsequent source-retention instruction also requires reconciling the -maintained `third_party/h265` copy recorded in the historical checkout with this -candidate's upstream v0.2.3. Its local hardening must be retained unless equivalent -upstream checks are verified. The historical patch record has been read; this -candidate does not yet establish that equivalence or select final shipped source. +bundle and real decoding. Shared app/analysis admission and canonical imaging +integration now have focused regression coverage. Linux and Windows restrictions are +implemented but await native CI. Package construction and updater integration +are implemented, with native macOS signed-bundle evidence. Native distribution +qualification, the first-upgrade transition and representative camera +compatibility remain activation gates. No release or merge is authorized by this record. + +The subsequent source-retention instruction is implemented by restoring the +exact maintained production copy in `third_party/h265`. The earlier unmodified +v0.2.3 guest is superseded: it did not contain every local hardening change. +The new source/artifact is undergoing native and compatibility qualification; +preserving those checks is not itself permission to activate HEIC. ## Exact source and distribution inventory | Component | Reviewed input | Distribution record | | --- | --- | --- | -| h265 HEIC/HEVC code | `github.com/gen2brain/h265` v0.2.3, commit `b2d46ba787d8f0a2025bd106443ab1b1c7cd010f`; module sum `h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=`; module ZIP SHA-256 `2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a` | Unmodified upstream. MIT text and both upstream copyright notices preserved in `notices/h265-LICENSE`. | +| h265 HEIC/HEVC code | Maintained PicFetch production copy from `fc127b44e1c99447b8d150256563c6d4f99b8ad3`, based on upstream v0.2.2 `665fd95984177afef4a7efca7d50638e4b695c7a`. Exact 107-file baseline in `third_party/h265/PICFETCH-SOURCE.json`; its SHA-256 is `583c5ab3b021675acfac0bc7344a7ff7acdc8f0ae1ab94e804d7b931e3618b9b`. | Local hardening retained unchanged; MIT text and both copyright notices in the maintained LICENSE and `notices/h265-LICENSE`. | | Guest compiler/runtime | Go 1.27.1, `wasip1/wasm`, no CGo, no assembly | BSD license and patent grant in `notices/Go-LICENSE` and `notices/Go-PATENTS`. The selected guest graph has no vendored third-party standard-library imports. | -| PicFetch adapter/protocol | This branch's `scripts/heicguest` and `internal/heicdecode`; exact input hashes in `scripts/heicguest/decoder.json` | PicFetch MIT. Adapter changes do not patch or vendor the upstream source. | +| PicFetch adapter/protocol | This branch's `scripts/heicguest` and `internal/heicdecode`; exact input hashes in `scripts/heicguest/decoder.json` | PicFetch MIT; adapter and maintained decoder are separately inventoried. | | WASI host | Existing wazero v1.12.0; fixed guest, helper and qualification tools | Apache-2.0 license and NOTICE in `notices/wazero-LICENSE` and `notices/wazero-NOTICE`. No version upgrade. | | Native helper / OS library | `cmd/picfetch-heic-worker`, codec-free boundary, Go/wazero; macOS uses system Security/CoreFoundation frameworks via cgo | Separate minimal executable, no Fyne or native HEIC codec. Final shipped closure and notice placement remain packaging gates. | @@ -40,16 +43,33 @@ HEVC patent rights. This work claims no patent clearance, purchases no license, and does not change PicFetch's MIT license. Existing project-wide dependency qualification obligations also remain open. -### Changes since v0.2.2 +### Source reconciliation with the earlier v0.2.3 candidate The previous module is pinned at `665fd95984177afef4a7efca7d50638e4b695c7a`. Static source comparison found six production files changed: `heic/exif.go`, `heic/heic.go`, `heic/sequence.go`, `hevc/deblock.go`, `hevc/decoder.go`, and `hevc/headers.go`. Upstream changes include a missing-metadata guard, propagating coded-frame limits into the HEVC decoder, bounded/delayed sequence-table work, -transform-size validation and slice/deblocking maintenance. Upstream test +transform-size validation; the slice/deblocking differences are comments. Upstream test changes were inventoried but not executed or copied. +The maintained v0.2.2-based source already contains the missing-metadata, +coded-frame and 32-sample transform checks. It additionally retains aggregate +coded-work accounting, metadata/extent limits, streaming bounded NAL traversal, +finite sequence retention and transformed configuration. Its stricter sequence +implementation is preserved in full; no complete equivalence to upstream's +different table representation is claimed. All 107 production/source-notice +files are byte-identical to the clean historical subtree, including unused +native assembly. The WASI guest selects `noasm`; native application imports +remain prohibited. The historical test corpus and THREAT-MODEL.md are not copied. + +The exact upstream base module sum is +`h1:rnpfo8I4PFhohbij8ySYZlJFn07TTwV+/uWBrKsOEas=` and its ZIP SHA-256 is +`57a197c95e25b481abcd6d20773ebfb17d859e6d864017304aff6ec0e0f19757`. +Root and guest replacements select the maintained directory. Build guards +refuse missing/redirected replacements, changed baseline bytes and uninventoried +source files before reproducing the guest. + Two API facts affect this adapter: - The still API can fall back to decoding an image sequence. PicFetch's guest @@ -96,7 +116,7 @@ only the generated explicit-depth gradient is used as ten-bit evidence. ## Resource and compatibility limits The candidate production maxima remain 64 MiB input, 64M pixels, 256,000,000 -output bytes, 64 KiB normalized metadata, 4096-byte diagnostics, 30 seconds, +output bytes, 64 KiB normalized metadata, 4096-byte diagnostics, 60 seconds, 1 GiB WASM linear memory, and a requested 2 GiB native worker budget. The output cap allows at most 32M NRGBA64 pixels. The protocol accepts only positive finite limits; resource fields are contracts, not OS enforcement. @@ -114,17 +134,30 @@ These are positive ABI checks with ordinary images, not memory-exhaustion tests. Configuration currently decodes pixels to report the same transformed dimensions as the displayed image. Optimizing this requires a qualified transformed-header API. Container transforms are applied in the guest; Exif orientation is returned -as metadata. Their precedence in the eventual imaging adapter, color-profile/HDR -handling, representative camera compatibility and memory measurements remain -unqualified. No application integration may silently assume they are solved. +as metadata. The imaging adapter keeps these validated pixels without applying +Exif orientation again. Color-profile/HDR handling, representative camera +compatibility and memory measurements remain unqualified. + +The color limitation is stronger than missing test evidence: the maintained +decoder applies the YUV matrix and range, but deliberately leaves primaries and +transfer in the source color space (`third_party/h265/heic/heic.go`, Color +contract). Its ICC profile is reported only by `DecodeColor`; the guest calls +`Decode`, and the response protocol carries neither ICC nor CICP descriptions. +Consequently, ICC-managed, wide-gamut, PQ/HLG and gain-map HDR display are not +implemented. These files are **not deliberately rejected by color class**; +some can decode into untagged pixels without faithful display semantics. +Sixteen-bit sample transport is not an HDR or color-management claim. No color +engine redesign or new HDR feature is part of this qualification work. +Additional real-helper metadata/orientation, alpha and known-ramp checks are +recorded in the [ordinary compatibility report](compatibility-2026-09-16.md). ## OS enforcement status | Platform | Documented candidate | Implemented/runtime verified here | Admission | | --- | --- | --- | --- | -| Linux x64/ARM64 | Delegated cgroup v2 with `memory.max`, `memory.swap.max=0`, process limits and restricted filesystem/network/syscalls installed across threads before input | No Linux kernel/daemon in this worktree; no delegated hierarchy or packaged helper tested | Disabled | -| Windows x64/ARM64 | AppContainer/restricted capabilities plus Job Object aggregate commit-memory/process/CPU/kill-on-close limits, explicit inherited pipes and suspended setup | No native Windows or MSIX execution; no helper/restriction implementation | Disabled | -| macOS Intel/Apple Silicon | Independently entitled App Sandbox helper bundle, hardened runtime, bounded WASI, parent-owned pipes/deadline/group termination | Apple Silicon native ordinary decode, read/create/TCP/UDP denial and cancellation verified below. Intel/packaged application qualification pending. Hard total native cap absent by explicit approval. | Viewer integration pending | +| Linux x64/ARM64 | All-thread seccomp, hard RLIMIT_AS virtual-address-space ceiling, CPU/core/file/descriptor limits before input; bounded WASI and parent lifetime | Candidate cross-builds; portable syscall-policy controls pass. Native helper execution and packaged application qualification await CI. No RSS or cgroup limit is claimed. | Disabled | +| Windows x64/ARM64 | AppContainer/restricted capabilities plus Job Object aggregate commit-memory/process/CPU/kill-on-close limits, explicit inherited pipes and suspended setup | AppContainer/suspended launch and job controls cross-build; owned native controls are wired in CI. Native Windows and MSIX execution remain unverified. | Disabled | +| macOS Intel/Apple Silicon | Independently entitled App Sandbox helper bundle, hardened runtime, bounded WASI, parent-owned pipes/deadline/group termination | Apple Silicon native ordinary decode, read/create/TCP/UDP denial and cancellation verified below. Intel/packaged application qualification pending. Hard total native cap absent by explicit approval. | Disabled pending qualification | Linux's [cgroup v2 documentation](https://docs.kernel.org/admin-guide/cgroup-v2.html) describes charged memory and explicitly permits temporary `memory.max` overshoot. @@ -202,13 +235,14 @@ image bytes enter solely through bounded stdin. Parent code uses an absolute hash-pinned executable, explicit stdio, a minimal environment, and no user image paths in helper arguments. Trusted probe paths contain no image data. -The parent owns one admitted operation, at most 64 waiters, the 30-second +The parent owns one admitted operation, at most 64 waiters, the 60-second deadline, every pipe and process wait. It kills the Unix group before reaping its leader (preventing PID reuse before a late kill) and joins pipe work before releasing admission. An owned peer and descendant pass cancellation with an observable connection close; deliberately killing only the leader makes that -guard fail. App-family sharing remains pending; one Client is not yet a complete -cross-process broker. +guard fail. The shared Client now serves bounded analysis connections through +explicit inherited pipes. GUI and analysis construction inject that same owner; +production construction still supplies no owner until qualification completes. ### Executable-memory decision @@ -257,3 +291,142 @@ reached the unchanged deadline at 30.0108 s. Raw HEIC bytes are unchanged. Full app functionality and broad camera/color/orientation qualification remain open. The separate macOS research informed this record; native results above come from this implementation task, not from documentation alone. + +### Finite lifetime tuning after native Intel evidence + +Signed worker `c4a89d1` passed native Intel App Sandbox, small-image decoding, +read/create/TCP/UDP denial and cancellation. Its 12-megapixel compiler comparison +reached the 30-second ceiling (30.060 s); the interpreter also timed out. This +was a controlled deadline rejection, not successful large-image qualification. +The same x86 transport/compiler path with the maintained source completed the +fixture in 5.967 s under Rosetta after using the installed ARM clang toolchain. +Rosetta is diagnostic evidence only and does not replace native Intel timing. + +The lifetime ceiling is now proposed as a finite 60 seconds, with an explicit +rejection test above that value. The initial 30 seconds was an engineering +choice; native Intel ordinary-camera usefulness requires measuring beyond it. +The pending native Intel run must show its actual completion time before that +platform's common-camera performance is qualified. Longer occupation of the +single lane is the availability cost; file/network restrictions, WASM memory, +input/output/metadata/diagnostic sizes, thread settings and job count do not +change. Earlier 30-second measurements above remain historical observations. + +The prior Linux race failure was compilation of the fixed real guest under +instrumentation: 37.08 seconds exceeded 30. The same focused ordinary-worker +test took 0.89 seconds without race instrumentation on this host; all owned +memory, capability, cancellation and stream tests passed in CI. The new finite +ceiling retains that real compiler test and all native guards; none is skipped. + +The maintained-source candidate passes `make verify-build test-h265`, the +focused boundary/guest race suite, and native Apple Silicon qualification. +With the 60-second ceiling, its compiler decoded the 12MP fixture in 6.713 s; +the interpreter reached 60.012 s and was terminated/joined. The helper-only +executable-memory entitlement remains justified by this observed runtime +difference. Native Intel timing at the new ceiling is still pending CI. + +## Linux native-helper candidate + +The no-cgo amd64/arm64 helper now has a default-deny seccomp policy synchronized +across threads. It allows explicit Go scheduling, private futexes, stdio/poll, +signal and anonymous-memory operations. Exact architecture-specific CLONE_THREAD +flags permit runtime threads; process/exec, file opens, network, io_uring, +namespace and resource-policy changes remain denied. Wazero's private RW +mapping followed by RX protection is allowed; RWX and file-backed mappings are +not. Optional huge-page allocation and mapping-name decoration may be refused. +The compiled runtime and kernel remain trusted. This reduces native authority; +seccomp by itself is not a complete security guarantee. See the +[kernel seccomp documentation](https://docs.kernel.org/userspace-api/seccomp_filter.html). + +Before input, the helper verifies finite hard/soft limits for virtual address +space (2 GiB), CPU time (rounded request seconds), core files (zero), file size +(zero), and descriptors (32). It refuses an already oversized starting address +space and requires ENOMEM from an oversized PROT_NONE reservation after policy +installation. The reservation touches no RAM. RLIMIT_AS constrains virtual +mappings, not physical RSS; the Go thread ceiling remains runtime enforcement, +not a per-family kernel PID quota. See [Linux resource-limit semantics](https://man7.org/linux/man-pages/man2/getrlimit.2.html). + +Pure Go is part of this candidate's contract: cgo Linux builds and unsupported +architectures refuse startup. The `heic-linux` native suite records actual +thread synchronization/inheritance, address-limit negative control, owned +runtime cancellation, file/network denial and ordinary ten-bit/12MP decoding. +CI selects native amd64 and arm64 hosts using documented +[GitHub runner labels](https://docs.github.com/en/actions/reference/runners/github-hosted-runners). +Cross-build and portable BPF results are available locally; native execution +remains pending publication and CI. No production HEIC activation is included. + + +## Shared source and Windows integration checkpoint + +The GUI owns one optional HEIC Client shared by foreground/background Readers +and both analysis subprocess types. Remote connections inherit explicit pipes, +wait for owner admission/native readiness before bulk reads, and retain the lane +through validated output delivery. The imaging Source retains ordinary encoded +data or validated HEIC pixels/metadata, so HEIC probing and decoding do not run +twice. Container transforms remain applied once. Display/preloads, comparison, +grid, EXIF, capture sorting, Favorite/Spiral/mosaic previews and similarity use +the injected readers. Production still supplies no owner and advertises no HEIC +formats while qualification is incomplete. Focused race results are in the plan. + +The Windows candidate creates a zero-capability AppContainer process suspended, +with three explicit inherited stdio handles and a child-process restriction. +Before resuming it, the parent assigns a private Job Object with active-process +limit one, requested process/job committed-memory ceilings, finite user CPU time +and kill-on-close. The worker independently checks its AppContainer SID, empty +capability list and immediate job, then performs owned file/TCP/UDP denial +probes before readiness. [Microsoft documents creation attributes](https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute) +and [immediate-job queries](https://learn.microsoft.com/en-us/windows/win32/api/jobapi2/nf-jobapi2-queryinformationjobobject). + +Dedicated helper provisioning grants that AppContainer read/execute on only the +helper and its immediate directory; the grant does not propagate to children. +Launch does not mutate ACLs. The profile can access its own storage and permitted +system resources; these controls do not establish zero native filesystem access. +The stable profile and immutable MSIX installation/staging path still need native +distribution qualification. + +The `heic-windows` CI matrix requires owned token/job and unsandboxed-refusal +controls, inherited-pipe cancellation, analysis attachment cleanup, and ordinary +ten-bit/12-megapixel decode. The memory control uses a 64 MiB job and a fixed +65 MiB commitment attempt, touches no pages, and frees any unexpected allocation +immediately. It is a bounded OS-policy control, not an image decoder stress test. +Cross-build/vet/IDE results establish compilation only; no Windows execution has +been observed on this macOS host. + + +## Package updates and first-upgrade limitation + +Authenticated archives now extract into a fresh payload directory. Stage +provenance records every companion-file digest and revalidates the exact file +set after persistence and before install. Linux/Windows prepare the dedicated +helper directory before replacing it, then roll it back if the existing binary +transaction fails. macOS installs the complete verified app bundle, including +its enclosing signature resources, nested helper, manifest, notices and sealed +resources. The viewer joins HEIC process/pipe retirement before applying updates. +Removing companion provenance from a helper-bearing stage is rejected; only +legacy stages without helper content may omit that proof. + +Owned native macOS bundles with different helper signatures, manifests and +sealed resources pass strict deep codesign verification after successful +installation and after an injected final-rename failure restores the original +bundle. Neighboring owned user-data bytes remain unchanged. Reverting to the +binary/plist-only path deliberately makes this guard fail; the restored +implementation passes. These are signed fixture/package transaction checks, +not a claim of Windows or production distribution execution. + +The final local `make heic-native-macos` run on 2026-09-16 passes all four +mandatory helper/runtime/update/legacy-transition guards. The compiler's 12MP +decode takes 6.772 s; the interpreter reaches 60.015 s and is terminated/joined. +The signed install/rollback guard passes in 1.310 s, and the expected legacy +transition limitation is observed in 1.220 s. The raw local event stream is +`.scratch/heic-qualification/native-macos.json`. Full updater race regressions +pass in 4.091 s; native guard registration regressions pass in 1.344 s. + +**The currently released updater cannot perform the first helper-bearing +upgrade completely.** Its binary/plist replacement omits the helper and then +deletes the staged archive payload. The new app cannot recover the helper from +that cache. An owned native reproduction also leaves the enclosing macOS bundle +failing strict signature verification with an invalid resource-directory error. +The first helper-bearing version therefore requires complete package +reinstallation, or a separately designed and qualified bridge before release. +New updater code only governs subsequent upgrades. Missing/unqualified helper +availability remains closed; no release, repair download, or external user +notification is authorized or performed by this work. diff --git a/docs/heic/robustness-testing.md b/docs/heic/robustness-testing.md index 6759a60d..228693ab 100644 --- a/docs/heic/robustness-testing.md +++ b/docs/heic/robustness-testing.md @@ -23,7 +23,9 @@ after its provenance and safe handling are reviewed. ## Budgets and observables -The initial ceiling for a complete operation is 30 seconds. The separate maxima +The current finite ceiling for an admitted operation is 60 seconds. Native +Intel ordinary-camera evidence motivated tuning the initial 30-second proposal; +see the qualification record for completed and pending measurements. The separate maxima are 1 GiB WASM linear memory, a requested 2 GiB native-process budget, 64 MiB encoded HEIC input (further reduced by a positive user limit), 64 million pixels, checked NRGBA8/NRGBA64 output, 64 KiB metadata, 4096-byte diagnostics, diff --git a/go.mod b/go.mod index 1eda824c..0d698d3e 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,9 @@ require ( // isolated behind internal/ort; all other platforms retain the current binding. replace github.com/frathe/picfetch/internal/ortlegacy => github.com/yalue/onnxruntime_go v1.25.0 +// Retain the maintained decoder source; only the separate WASI module imports it. +replace github.com/gen2brain/h265 => ./third_party/h265 + require ( fyne.io/systray v1.12.2 // indirect github.com/BurntSushi/toml v1.6.0 // indirect diff --git a/internal/favthumbs/sync.go b/internal/favthumbs/sync.go index c3e5b1fe..397f83b4 100644 --- a/internal/favthumbs/sync.go +++ b/internal/favthumbs/sync.go @@ -83,6 +83,11 @@ func (p *Preview) RGBA64At(x, y int) color.RGBA64 { // sink may be nil, which reads as "nothing is cached, and storing is a // no-op": the pass still fills the on-disk cache for a later opener. func Sync(ctx context.Context, favDir string, files []fyne.URI, sink Sink) error { + return SyncWithReader(ctx, favDir, files, sink, imaging.Reader{}) +} + +// SyncWithReader shares the caller's canonical source reader across the bounded workers. +func SyncWithReader(ctx context.Context, favDir string, files []fyne.URI, sink Sink, reader imaging.Reader) error { // The app's merge mode loads one path at two indices whenever the same // file arrives from two dropped folders. Two workers on that path would // duplicate a full decode and then race each other to write a single @@ -148,7 +153,7 @@ loop: return } - if err := syncFile(ctx, favDir, u, sink); err != nil { + if err := syncFile(ctx, favDir, u, sink, reader); err != nil { fail(err) } }) @@ -178,7 +183,7 @@ loop: // syncFile brings one file's preview up to date, taking the cheapest of the // three routes that applies. It is the body of a worker goroutine, so it // touches nothing shared beyond sink, which the caller owns and guards. -func syncFile(ctx context.Context, favDir string, u fyne.URI, sink Sink) error { +func syncFile(ctx context.Context, favDir string, u fyne.URI, sink Sink, reader imaging.Reader) error { if err := ctx.Err(); err != nil { return err } @@ -216,7 +221,7 @@ func syncFile(ctx context.Context, favDir string, u fyne.URI, sink Sink) error { return nil } - thumb, err = imaging.LoadThumbnailContext(ctx, u) + thumb, _, err = reader.Thumbnail(ctx, u, imaging.ThumbnailSize) if err != nil { return err } diff --git a/internal/filesort/filesort.go b/internal/filesort/filesort.go index b6929d90..9d428bb4 100644 --- a/internal/filesort/filesort.go +++ b/internal/filesort/filesort.go @@ -93,6 +93,11 @@ func DisplayName(m Mode) string { // stop touching the filesystem promptly once ctx is done - it doesn't need // to return a fully correct partial order, since nothing ever looks at one. func Order(ctx context.Context, m Mode, raw []fyne.URI) []fyne.URI { + return OrderWithReader(ctx, m, raw, imaging.Reader{}) +} + +// OrderWithReader uses the caller's shared reader for capture-date extraction. +func OrderWithReader(ctx context.Context, m Mode, raw []fyne.URI, reader imaging.Reader) []fyne.URI { ordered := append([]fyne.URI(nil), raw...) switch m { @@ -100,7 +105,7 @@ func Order(ctx context.Context, m Mode, raw []fyne.URI) []fyne.URI { // Already in raw order - nothing to do. case ByCaptureDate: sortByInt64Key(ctx, ordered, func(u fyne.URI) (int64, error) { - date, err := captureOrModTime(ctx, u) + date, err := captureOrModTime(ctx, u, reader) return date.UnixNano(), err }) case ByModTime: @@ -199,8 +204,8 @@ func fileSizeOf(u fyne.URI) int64 { // capture-date sort mode still produces a sensible, total order instead of // clumping every such file at the same zero-time position. Cancellation stops // the sort instead of falling back to another filesystem operation. -func captureOrModTime(ctx context.Context, u fyne.URI) (time.Time, error) { - date, ok, err := imaging.CaptureDateContext(ctx, u) +func captureOrModTime(ctx context.Context, u fyne.URI, reader imaging.Reader) (time.Time, error) { + date, ok, err := reader.CaptureDate(ctx, u) if ctx.Err() != nil { return time.Time{}, ctx.Err() } diff --git a/internal/heicdecode/client/admission.go b/internal/heicdecode/client/admission.go new file mode 100644 index 00000000..0fe0b891 --- /dev/null +++ b/internal/heicdecode/client/admission.go @@ -0,0 +1,116 @@ +package client + +import ( + "context" + "sync" +) + +// Priority separates an interactive image from speculative/background work. +type Priority uint8 + +const ( + Foreground Priority = iota + Background +) + +// Callers enforce the 64-waiter limit before entering. The queue does not start +// workers: a caller retains its grant until helper and transport cleanup ends. +type admissionQueue struct { + mu sync.Mutex + busy bool + foregroundRun int + waiting []*admission +} + +type admission struct { + ready chan struct{} + ctx context.Context + once sync.Once + queue *admissionQueue + priority Priority + granted bool +} + +func (q *admissionQueue) enter(ctx context.Context, priority Priority) *admission { + a := &admission{ready: make(chan struct{}), ctx: ctx, queue: q, priority: priority} + q.mu.Lock() + q.waiting = append(q.waiting, a) + if !q.busy { + q.promote() + } + q.mu.Unlock() + return a +} + +func (a *admission) wait() error { + select { + case <-a.ready: + return a.ctx.Err() + case <-a.ctx.Done(): + return a.ctx.Err() + } +} + +func (a *admission) release() { + a.once.Do(func() { + q := a.queue + q.mu.Lock() + defer q.mu.Unlock() + if a.granted { + q.promote() + return + } + for i, waiting := range q.waiting { + if waiting == a { + copy(q.waiting[i:], q.waiting[i+1:]) + q.waiting[len(q.waiting)-1] = nil + q.waiting = q.waiting[:len(q.waiting)-1] + return + } + } + }) +} + +// Called under mu when the previous grant has fully retired. Preserve FIFO +// within each priority, with a background grant after at most three foreground +// grants. Cancelled requests never consume a grant or a fairness turn. +func (q *admissionQueue) promote() { + active := q.waiting[:0] + for _, a := range q.waiting { + if a.ctx.Err() == nil { + active = append(active, a) + } + } + clear(q.waiting[len(active):]) + q.waiting = active + foreground, background := -1, -1 + for i, a := range q.waiting { + if a.priority == Foreground && foreground < 0 { + foreground = i + } + if a.priority == Background && background < 0 { + background = i + } + } + index := foreground + if foreground < 0 || (background >= 0 && q.foregroundRun >= 3) { + index = background + } + if index < 0 { + q.busy = false + q.foregroundRun = 0 + return + } + a := q.waiting[index] + copy(q.waiting[index:], q.waiting[index+1:]) + q.waiting[len(q.waiting)-1] = nil + q.waiting = q.waiting[:len(q.waiting)-1] + if a.priority == Foreground { + q.foregroundRun = min(q.foregroundRun+1, 3) + } else { + q.foregroundRun = 0 + } + q.busy = true + a.granted = true + close(a.ready) +} diff --git a/internal/heicdecode/client/admission_test.go b/internal/heicdecode/client/admission_test.go new file mode 100644 index 00000000..da18bb75 --- /dev/null +++ b/internal/heicdecode/client/admission_test.go @@ -0,0 +1,81 @@ +package client + +import ( + "context" + "errors" + "testing" +) + +func TestAdmissionPrefersForegroundWithoutStarvingBackground(t *testing.T) { + var queue admissionQueue + first := queue.enter(context.Background(), Foreground) + if err := first.wait(); err != nil { + t.Fatal(err) + } + background := queue.enter(context.Background(), Background) + foreground := []*admission{ + queue.enter(context.Background(), Foreground), + queue.enter(context.Background(), Foreground), + queue.enter(context.Background(), Foreground), + } + assertPending := func(request *admission) { + t.Helper() + select { + case <-request.ready: + t.Fatal("request admitted before its turn") + default: + } + } + assertPending(background) + first.release() + for _, request := range foreground[:2] { + select { + case <-request.ready: + default: + t.Fatal("foreground was not preferred") + } + assertPending(background) + request.release() + } + // At most three consecutive foreground grants, including the first one. + select { + case <-background.ready: + default: + t.Fatal("background starved") + } + assertPending(foreground[2]) + background.release() + if err := foreground[2].wait(); err != nil { + t.Fatal(err) + } + foreground[2].release() +} + +func TestAdmissionCancellationAndIdempotentRelease(t *testing.T) { + var queue admissionQueue + first := queue.enter(context.Background(), Background) + ctx, cancel := context.WithCancel(context.Background()) + cancelled := queue.enter(ctx, Foreground) + next := queue.enter(context.Background(), Background) + cancel() + if err := cancelled.wait(); !errors.Is(err, context.Canceled) { + t.Fatalf("cancelled wait: %v", err) + } + cancelled.release() + first.release() + if err := next.wait(); err != nil { + t.Fatal(err) + } + later := queue.enter(context.Background(), Foreground) + first.release() + select { + case <-later.ready: + t.Fatal("duplicate release admitted overlapping work") + default: + } + next.release() + if err := later.wait(); err != nil { + t.Fatal(err) + } + later.release() +} diff --git a/internal/heicdecode/client/attachment.go b/internal/heicdecode/client/attachment.go new file mode 100644 index 00000000..258a0923 --- /dev/null +++ b/internal/heicdecode/client/attachment.go @@ -0,0 +1,110 @@ +package client + +import ( + "context" + "os" + "os/exec" + "sync" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// PipeConfig names only handles explicitly inherited by an analysis process. +// Limits must match its application's owner; no executable path is forwarded. +type PipeConfig struct { + Input, Output uint64 + Limits heicdecode.Limits +} + +// Attachment owns the parent's service and its temporary copies of child pipe +// ends. Call Started immediately after exec.Start; Stop/Wait on every return. +type Attachment struct { + Config PipeConfig + children []*os.File + once sync.Once + cancel context.CancelFunc + done chan struct{} +} + +func (c *Client) Attach(ctx context.Context, cmd *exec.Cmd) (*Attachment, error) { + if cmd == nil || cmd.Process != nil { + return nil, ErrUnavailable + } + finish, err := c.beginService() + if err != nil { + return nil, err + } + transferred := false + var files []*os.File + defer func() { + if !transferred { + for _, file := range files { + _ = file.Close() + } + finish() + } + }() + requestRead, requestWrite, err := os.Pipe() + if err != nil { + return nil, err + } + files = append(files, requestRead, requestWrite) + responseRead, responseWrite, err := os.Pipe() + if err != nil { + return nil, err + } + files = append(files, responseRead, responseWrite) + readID, writeID, copies, err := inheritBrokerPipes(cmd, responseRead, requestWrite) + if err != nil { + return nil, err + } + ctx, cancel := context.WithCancel(ctx) + attachment := &Attachment{ + Config: PipeConfig{Input: readID, Output: writeID, Limits: c.config.Limits}, + children: append([]*os.File{responseRead, requestWrite}, copies...), cancel: cancel, done: make(chan struct{}), + } + transferred = true + go func() { + defer finish() + defer close(attachment.done) + _ = c.serve(ctx, requestRead, responseWrite) + }() + return attachment, nil +} + +func (a *Attachment) Started() { + a.once.Do(func() { + for _, file := range a.children { + _ = file.Close() + } + }) +} +func (a *Attachment) Stop() { a.cancel(); a.Started() } +func (a *Attachment) Wait() { <-a.done } + +// OpenRemote consumes the two inherited handles. They must be pipes; on UNIX, +// nonblocking mode is installed before NewFile so Close can interrupt reads. +func OpenRemote(config PipeConfig) (*Remote, error) { + if err := config.Limits.Validate(); err != nil { + return nil, err + } + if config.Input <= 2 || config.Output <= 2 || config.Input == config.Output { + return nil, ErrUnavailable + } + input, err := openBrokerPipe(config.Input, true) + if err != nil { + return nil, err + } + output, err := openBrokerPipe(config.Output, false) + if err != nil { + _ = input.Close() + return nil, err + } + remote, err := NewRemote(input, output, config.Limits) + if err != nil { + _ = input.Close() + _ = output.Close() + return nil, err + } + return remote, nil +} diff --git a/internal/heicdecode/client/attachment_other.go b/internal/heicdecode/client/attachment_other.go new file mode 100644 index 00000000..eb41e181 --- /dev/null +++ b/internal/heicdecode/client/attachment_other.go @@ -0,0 +1,13 @@ +//go:build !darwin && !linux && !windows + +package client + +import ( + "os" + "os/exec" +) + +func inheritBrokerPipes(_ *exec.Cmd, _, _ *os.File) (uint64, uint64, []*os.File, error) { + return 0, 0, nil, ErrUnavailable +} +func openBrokerPipe(_ uint64, _ bool) (*os.File, error) { return nil, ErrUnavailable } diff --git a/internal/heicdecode/client/attachment_test.go b/internal/heicdecode/client/attachment_test.go new file mode 100644 index 00000000..5cb0bc90 --- /dev/null +++ b/internal/heicdecode/client/attachment_test.go @@ -0,0 +1,63 @@ +package client + +import ( + "bytes" + "context" + "encoding/json" + "os" + "os/exec" + "testing" + "time" +) + +func TestInheritedRemoteUsesOwner(t *testing.T) { + runInheritedRemote(t, "success", "--owned-heic-remote", "owned remote decode complete\n") +} + +func TestInheritedRemoteCancellationJoins(t *testing.T) { + runInheritedRemote(t, "hang", "--owned-heic-remote-cancel", "owned remote cancellation complete\n") +} + +func runInheritedRemote(t *testing.T, peer, mode, want string) { + t.Helper() + owner := ownedPeer(t, peer, 5*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + cmd := exec.CommandContext(ctx, os.Args[0]) + link, err := owner.Attach(ctx, cmd) + if err != nil { + t.Fatal(err) + } + defer func() { link.Stop(); link.Wait() }() + config, err := json.Marshal(link.Config) + if err != nil { + t.Fatal(err) + } + cmd.Args = append(cmd.Args, mode, string(config)) + var output, diagnostic bytes.Buffer + cmd.Stdout, cmd.Stderr = &output, &diagnostic + if err = cmd.Start(); err != nil { + t.Fatal(err) + } + link.Started() + if err = cmd.Wait(); err != nil { + t.Fatalf("inherited remote: %v (%s)", err, diagnostic.String()) + } + if output.String() != want { + t.Fatalf("unexpected child output: %q", output.String()) + } +} + +func TestAttachmentStopWithoutProcessStartJoinsOwner(t *testing.T) { + owner := ownedPeer(t, "success", 5*time.Second) + link, err := owner.Attach(context.Background(), exec.Command(os.Args[0])) + if err != nil { + t.Fatal(err) + } + link.Stop() + link.Wait() + link.Started() + link.Stop() + owner.Stop() + owner.Wait() +} diff --git a/internal/heicdecode/client/attachment_unix.go b/internal/heicdecode/client/attachment_unix.go new file mode 100644 index 00000000..a115cb64 --- /dev/null +++ b/internal/heicdecode/client/attachment_unix.go @@ -0,0 +1,46 @@ +//go:build darwin || linux + +package client + +import ( + "os" + "os/exec" + + "golang.org/x/sys/unix" +) + +func inheritBrokerPipes(cmd *exec.Cmd, input, output *os.File) (uint64, uint64, []*os.File, error) { + readID := uint64(3 + len(cmd.ExtraFiles)) + cmd.ExtraFiles = append(cmd.ExtraFiles, input, output) + return readID, readID + 1, nil, nil +} + +func openBrokerPipe(id uint64, read bool) (*os.File, error) { + if id > uint64(^uint(0)>>1) { + return nil, ErrUnavailable + } + fd := int(id) + var stat unix.Stat_t + if err := unix.Fstat(fd, &stat); err != nil { + return nil, err + } + if stat.Mode&unix.S_IFMT != unix.S_IFIFO { + return nil, ErrUnavailable + } + flags, err := unix.FcntlInt(uintptr(fd), unix.F_GETFL, 0) + if err != nil { + return nil, err + } + want := unix.O_WRONLY + if read { + want = unix.O_RDONLY + } + if flags&unix.O_ACCMODE != want { + return nil, ErrUnavailable + } + if err = unix.SetNonblock(fd, true); err != nil { + return nil, err + } + unix.CloseOnExec(fd) + return os.NewFile(uintptr(fd), "HEIC broker pipe"), nil +} diff --git a/internal/heicdecode/client/attachment_windows.go b/internal/heicdecode/client/attachment_windows.go new file mode 100644 index 00000000..3508edeb --- /dev/null +++ b/internal/heicdecode/client/attachment_windows.go @@ -0,0 +1,52 @@ +package client + +import ( + "os" + "os/exec" + "syscall" + + "golang.org/x/sys/windows" +) + +func inheritBrokerPipes(cmd *exec.Cmd, input, output *os.File) (uint64, uint64, []*os.File, error) { + if cmd.SysProcAttr == nil { + cmd.SysProcAttr = &syscall.SysProcAttr{} + } + if cmd.SysProcAttr.NoInheritHandles || cmd.SysProcAttr.ParentProcess != 0 { + return 0, 0, nil, ErrUnavailable + } + var copies []*os.File + for _, file := range []*os.File{input, output} { + var handle windows.Handle + if err := windows.DuplicateHandle(windows.CurrentProcess(), windows.Handle(file.Fd()), windows.CurrentProcess(), &handle, 0, true, windows.DUPLICATE_SAME_ACCESS); err != nil { + for _, copy := range copies { + _ = copy.Close() + } + return 0, 0, nil, err + } + // Wrap before any I/O starts: NewFile's synchronous-mode query must + // not race an outstanding operation on this handle. + copies = append(copies, os.NewFile(uintptr(handle), "HEIC inherited pipe")) + } + readID, writeID := copies[0].Fd(), copies[1].Fd() + cmd.SysProcAttr.AdditionalInheritedHandles = append(cmd.SysProcAttr.AdditionalInheritedHandles, syscall.Handle(readID), syscall.Handle(writeID)) + return uint64(readID), uint64(writeID), copies, nil +} + +func openBrokerPipe(id uint64, _ bool) (*os.File, error) { + if id > uint64(^uintptr(0)) { + return nil, ErrUnavailable + } + handle := windows.Handle(id) + typeID, err := windows.GetFileType(handle) + if err != nil { + return nil, err + } + if typeID != windows.FILE_TYPE_PIPE { + return nil, ErrUnavailable + } + if err = windows.SetHandleInformation(handle, windows.HANDLE_FLAG_INHERIT, 0); err != nil { + return nil, err + } + return os.NewFile(uintptr(handle), "HEIC broker pipe"), nil +} diff --git a/internal/heicdecode/client/broker.go b/internal/heicdecode/client/broker.go new file mode 100644 index 00000000..99484dfb --- /dev/null +++ b/internal/heicdecode/client/broker.go @@ -0,0 +1,227 @@ +package client + +import ( + "bytes" + "context" + "encoding/binary" + "errors" + "io" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +const ( + brokerIntent uint16 = 1 + iota + brokerGrant + brokerInput + brokerResult + maxServices = 8 +) + +type brokerHeader struct { + kind uint16 + operation heicdecode.Operation + size uint64 +} + +// Serve shares this Client's admission lane with one analysis connection. +// Its context belongs to the analysis process's lifetime. Stop closes active +// and idle connections; Wait joins their complete service work. No source path +// or native executable selection crosses this byte-only protocol. +func (c *Client) Serve(ctx context.Context, input io.ReadCloser, output io.WriteCloser) error { + finish, err := c.beginService() + if err != nil { + _ = input.Close() + _ = output.Close() + return err + } + defer finish() + return c.serve(ctx, input, output) +} + +func (c *Client) beginService() (func(), error) { + c.mu.Lock() + defer c.mu.Unlock() + if c.closed { + return nil, context.Canceled + } + if c.services >= maxServices { + return nil, ErrBusy + } + c.services++ + c.work.Add(1) + return func() { c.mu.Lock(); c.services--; c.mu.Unlock(); c.work.Done() }, nil +} + +func (c *Client) serve(ctx context.Context, input io.ReadCloser, output io.WriteCloser) error { + closeIO := func() { _ = input.Close(); _ = output.Close() } + defer closeIO() + ctx, cancel := context.WithCancel(ctx) + stopParent := watchCancellation(c.ctx, cancel) + stopIO := watchCancellation(ctx, closeIO) + defer func() { cancel(); stopIO(); stopParent() }() + for { + header, err := readBrokerHeader(input) + if err != nil { + return err + } + if header.kind != brokerIntent || header.size != 0 { + return heicdecode.ErrInvalidRequest + } + err = c.serveRequest(ctx, header.operation, input, output, closeIO) + if err != nil { + return err + } + } +} + +// Read one control byte while queued so a disconnected analysis peer can retire +// immediately. No encoded allocation or bulk read occurs before native-ready +// admission. Every exit joins this reader, including pre-admission refusal. +func (c *Client) serveRequest(ctx context.Context, op heicdecode.Operation, input io.Reader, output io.Writer, closeIO func()) (resultErr error) { + ctx, cancel := context.WithCancel(ctx) + stopIO := watchCancellation(ctx, closeIO) + var first [1]byte + var peekErr error + peekDone := make(chan struct{}) + go func() { + defer close(peekDone) + _, peekErr = io.ReadFull(input, first[:]) + if peekErr != nil { + cancel() + } + }() + received := false + defer func() { + if resultErr != nil || !received { + closeIO() + } + <-peekDone + stopIO() + cancel() + }() + resultErr = c.withAdmission(ctx, Background, func(ctx context.Context) error { + // Include source transfer and downstream output in the admitted deadline. + stopAdmittedIO := watchCancellation(ctx, closeIO) + defer stopAdmittedIO() + var response heicdecode.Response + var inputErr error + decodeErr := c.verifyExecutable(ctx) + if decodeErr == nil { + response, decodeErr = c.run(ctx, op, func(ctx context.Context, maxBytes int64) (data []byte, resultErr error) { + defer func() { inputErr = resultErr }() + if err := ctx.Err(); err != nil { + return nil, err + } + if err := writeBrokerHeader(output, brokerHeader{kind: brokerGrant, operation: op, size: uint64(maxBytes)}); err != nil { + return nil, err + } + <-peekDone + if peekErr != nil { + return nil, peekErr + } + reader := io.MultiReader(bytes.NewReader(first[:]), input) + data, resultErr = readBrokerInput(reader, op, c.config.Limits) + received = resultErr == nil + return data, resultErr + }) + } + if inputErr != nil { + return inputErr + } + if err := ctx.Err(); err != nil { + return err + } + return writeBrokerResult(output, op, response, decodeErr, c.config.Limits) + }) + if resultErr == nil && !received { + return io.EOF + } + return resultErr +} + +func readBrokerInput(input io.Reader, op heicdecode.Operation, limits heicdecode.Limits) ([]byte, error) { + encoded, err := readBrokerHeader(input) + if err != nil { + return nil, err + } + if encoded.kind != brokerInput || encoded.operation != op || encoded.size <= 24 || encoded.size > uint64(limits.MaxInputBytes)+24 { + return nil, heicdecode.ErrInvalidRequest + } + frame := &io.LimitedReader{R: input, N: int64(encoded.size)} + request, err := heicdecode.ReadRequest(frame, limits) + if err != nil { + return nil, err + } + if frame.N != 0 || request.Operation != op || request.MaxPixels != limits.MaxPixels || request.MaxOutputBytes != limits.MaxOutputBytes { + return nil, heicdecode.ErrInvalidRequest + } + return request.Input, nil +} + +func readBrokerHeader(r io.Reader) (brokerHeader, error) { + var data [16]byte + if _, err := io.ReadFull(r, data[:]); err != nil { + return brokerHeader{}, err + } + h := brokerHeader{kind: binary.LittleEndian.Uint16(data[4:]), operation: heicdecode.Operation(binary.LittleEndian.Uint16(data[6:])), size: binary.LittleEndian.Uint64(data[8:])} + if string(data[:4]) != "PHB1" || h.kind < brokerIntent || h.kind > brokerResult || h.operation < heicdecode.Decode || h.operation > heicdecode.DecodeExif { + return brokerHeader{}, heicdecode.ErrInvalidRequest + } + return h, nil +} + +func writeBrokerHeader(w io.Writer, h brokerHeader) error { + if h.kind < brokerIntent || h.kind > brokerResult || h.operation < heicdecode.Decode || h.operation > heicdecode.DecodeExif { + return heicdecode.ErrInvalidRequest + } + var data [16]byte + copy(data[:4], "PHB1") + binary.LittleEndian.PutUint16(data[4:], h.kind) + binary.LittleEndian.PutUint16(data[6:], uint16(h.operation)) + binary.LittleEndian.PutUint64(data[8:], h.size) + n, err := w.Write(data[:]) + if err == nil && n != len(data) { + return io.ErrShortWrite + } + return err +} + +func readBrokerResult(r io.Reader, size uint64, op heicdecode.Operation, limits heicdecode.Limits) (heicdecode.Response, error) { + if size < 40 || size > uint64(limits.MaxOutputBytes)+uint64(limits.MaxMetadataBytes)+uint64(limits.MaxDiagnosticBytes)+40 { + return heicdecode.Response{}, heicdecode.ErrInvalidResponse + } + frame := &io.LimitedReader{R: r, N: int64(size)} + result, err := heicdecode.ReadResponse(frame, op, limits) + if frame.N != 0 { + return heicdecode.Response{}, heicdecode.ErrInvalidResponse + } + return result, err +} + +func writeBrokerResult(w io.Writer, op heicdecode.Operation, result heicdecode.Response, decodeErr error, limits heicdecode.Limits) error { + encode := func(w io.Writer) error { + if decodeErr == nil { + return heicdecode.WriteResponse(w, op, result, limits) + } + var failure *heicdecode.Failure + if errors.As(decodeErr, &failure) { + return heicdecode.WriteFailure(w, failure.Status, failure.Diagnostic, limits) + } + return heicdecode.WriteFailure(w, heicdecode.StatusUnavailable, "helper request failed", limits) + } + // Validation/counting touches only lengths and bounded metadata. Pixel + // slices are streamed on the second pass, never copied into an envelope. + var count byteCounter + if err := encode(&count); err != nil { + return err + } + if err := writeBrokerHeader(w, brokerHeader{kind: brokerResult, operation: op, size: uint64(count)}); err != nil { + return err + } + return encode(w) +} + +type byteCounter int64 + +func (c *byteCounter) Write(p []byte) (int, error) { *c += byteCounter(len(p)); return len(p), nil } diff --git a/internal/heicdecode/client/client.go b/internal/heicdecode/client/client.go index 6945ad73..fd817599 100644 --- a/internal/heicdecode/client/client.go +++ b/internal/heicdecode/client/client.go @@ -36,14 +36,15 @@ type Input func(ctx context.Context, maxBytes int64) ([]byte, error) // Client admits one job and at most 64 pending callers. Stop is nonblocking; // Wait joins active process/pipe work and cancelled waiting callers off the UI. type Client struct { - config Config - ctx context.Context - cancel context.CancelFunc - slot chan struct{} - mu sync.Mutex - closed bool - active int - work sync.WaitGroup + config Config + ctx context.Context + cancel context.CancelFunc + lane admissionQueue + mu sync.Mutex + closed bool + active int + services int + work sync.WaitGroup } func New(config Config) (*Client, error) { @@ -54,7 +55,7 @@ func New(config Config) (*Client, error) { return nil, ErrUnavailable } ctx, cancel := context.WithCancel(context.Background()) - return &Client{config: config, ctx: ctx, cancel: cancel, slot: make(chan struct{}, 1)}, nil + return &Client{config: config, ctx: ctx, cancel: cancel}, nil } func (c *Client) Stop() { @@ -69,14 +70,42 @@ func (c *Client) Wait() { c.work.Wait() } // Do retains admission until source work, the helper, all pipes, and output // validation have finished. A cancelled queued call never invokes input. func (c *Client) Do(ctx context.Context, op heicdecode.Operation, input Input) (heicdecode.Response, error) { + return c.DoWithPriority(ctx, Foreground, op, input) +} + +// DoWithPriority preserves FIFO within each class and gives waiting background +// work a turn after at most three foreground grants. The timeout begins after +// admission; queued callers retain their own cancellation/deadline. +func (c *Client) DoWithPriority(ctx context.Context, priority Priority, op heicdecode.Operation, input Input) (heicdecode.Response, error) { + var result heicdecode.Response + err := c.withAdmission(ctx, priority, func(ctx context.Context) error { + if err := c.verifyExecutable(ctx); err != nil { + return err + } + var err error + result, err = c.run(ctx, op, input) + return err + }) + if err != nil { + return heicdecode.Response{}, err + } + return result, nil +} + +// The pipe service also holds this grant through downstream response delivery, +// so a stalled analysis consumer cannot accumulate decoded outputs off-lane. +func (c *Client) withAdmission(ctx context.Context, priority Priority, operation func(context.Context) error) error { + if priority > Background { + return heicdecode.ErrInvalidRequest + } c.mu.Lock() if c.closed { c.mu.Unlock() - return heicdecode.Response{}, context.Canceled + return context.Canceled } if c.active >= 65 { c.mu.Unlock() - return heicdecode.Response{}, ErrBusy + return ErrBusy } c.active++ c.work.Add(1) @@ -90,25 +119,21 @@ func (c *Client) Do(ctx context.Context, op heicdecode.Operation, input Input) ( ctx, cancel := context.WithCancel(ctx) stop := context.AfterFunc(c.ctx, cancel) defer func() { stop(); cancel() }() - select { - case c.slot <- struct{}{}: - defer func() { <-c.slot }() - case <-ctx.Done(): - return heicdecode.Response{}, ctx.Err() + admitted := c.lane.enter(ctx, priority) + defer admitted.release() + if err := admitted.wait(); err != nil { + return err } ctx, deadline := context.WithTimeout(ctx, c.config.Limits.Timeout) defer deadline() if err := ctx.Err(); err != nil { - return heicdecode.Response{}, err - } - if err := c.verifyExecutable(ctx); err != nil { - return heicdecode.Response{}, err + return err } - result, err := c.run(ctx, op, input) + err := operation(ctx) if ctx.Err() != nil { - return heicdecode.Response{}, ctx.Err() + return ctx.Err() } - return result, err + return err } func (c *Client) verifyExecutable(ctx context.Context) error { diff --git a/internal/heicdecode/client/client_test.go b/internal/heicdecode/client/client_test.go index ba440f27..229cb7a7 100644 --- a/internal/heicdecode/client/client_test.go +++ b/internal/heicdecode/client/client_test.go @@ -7,11 +7,14 @@ import ( "encoding/json" "errors" "fmt" + "image" "io" "net" "os" "os/exec" "path/filepath" + "runtime" + "strings" "testing" "time" @@ -43,6 +46,37 @@ func TestRejectsChangedHelperBeforeReadingSource(t *testing.T) { // TestMain also supplies an owned protocol peer. It is never a decoder or OS // sandbox test: these modes exercise only the parent's process/pipe boundary. func TestMain(m *testing.M) { + if len(os.Args) == 3 && (os.Args[1] == "--owned-heic-remote" || os.Args[1] == "--owned-heic-remote-cancel") { + var config PipeConfig + if err := json.Unmarshal([]byte(os.Args[2]), &config); err != nil { + os.Exit(2) + } + remote, err := OpenRemote(config) + if err != nil { + os.Exit(2) + } + ctx := context.Background() + if os.Args[1] == "--owned-heic-remote-cancel" { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, 500*time.Millisecond) + defer cancel() + } + result, err := remote.Do(ctx, heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { return []byte("owned inherited input"), nil }) + remote.Stop() + remote.Wait() + if os.Args[1] == "--owned-heic-remote-cancel" { + if !errors.Is(err, context.DeadlineExceeded) { + os.Exit(2) + } + _, _ = fmt.Fprintln(os.Stdout, "owned remote cancellation complete") + os.Exit(0) + } + if err != nil || result.Image == nil || result.Image.Bounds() != image.Rect(0, 0, 1, 1) { + os.Exit(2) + } + _, _ = fmt.Fprintln(os.Stdout, "owned remote decode complete") + os.Exit(0) + } if len(os.Args) == 3 && os.Args[1] == "--owned-heic-descendant" { connection, err := net.DialTimeout("tcp4", os.Args[2], time.Second) if err != nil { @@ -63,7 +97,17 @@ func TestMain(m *testing.M) { if err := heicdecode.WriteReady(os.Stdout, heicdecode.Ready{WASMMemoryBytes: limits.WASMMemoryBytes, NativeMemoryBytes: limits.OSProcessBytes}); err != nil { os.Exit(2) } - switch filepath.Base(os.Args[0]) { + switch strings.TrimSuffix(filepath.Base(os.Args[0]), ".exe") { + case "success": + request, err := heicdecode.ReadRequest(os.Stdin, limits) + if err != nil { + os.Exit(2) + } + result := heicdecode.Response{Image: image.NewNRGBA64(image.Rect(0, 0, 1, 1))} + if err = heicdecode.WriteResponse(os.Stdout, request.Operation, result, limits); err != nil { + os.Exit(2) + } + os.Exit(0) case "hang": // Remain alive with all pipes open until the parent terminates us. for { @@ -104,10 +148,14 @@ func ownedPeer(t *testing.T, mode string, timeout time.Duration) *Client { if err != nil { t.Fatal(err) } - path := filepath.Join(t.TempDir(), mode) - // A hard link preserves executable identity without a second binary-sized - // test allocation. Its basename selects an owned protocol behavior above. - if err = os.Link(executable, path); err != nil { + name := mode + if runtime.GOOS == "windows" { + name += ".exe" + } + path := filepath.Join(t.TempDir(), name) + // Its basename selects an owned protocol behavior above. Unix uses a + // hard link; Windows prepares an independent AppContainer-readable copy. + if err = installOwnedPeer(executable, path); err != nil { t.Fatal(err) } file, err := os.Open(path) diff --git a/internal/heicdecode/client/native_darwin_test.go b/internal/heicdecode/client/native_darwin_test.go index 0fd0b2ab..a87bfd98 100644 --- a/internal/heicdecode/client/native_darwin_test.go +++ b/internal/heicdecode/client/native_darwin_test.go @@ -12,6 +12,7 @@ import ( "os" "os/exec" "path/filepath" + "runtime" "testing" "time" @@ -60,9 +61,45 @@ func TestNativeMacSandboxHelper(t *testing.T) { if decodeErr != nil { t.Fatal(decodeErr) } - if img, ok := result.Image.(*image.NRGBA64); !ok || img.Bounds().Dx() != 16 || img.Bounds().Dy() != 16 { + img, ok := result.Image.(*image.NRGBA64) + if !ok || img.Bounds().Dx() != 16 || img.Bounds().Dy() != 16 { t.Fatalf("ordinary ten-bit result: %T", result.Image) } + // The owned lossless full-range source is a known grayscale ramp. + // Allow one ten-bit quantization step in the sixteen-bit output. + for y := 0; y < 16; y++ { + for x := 0; x < 16; x++ { + pixel := img.NRGBA64At(x, y) + expected := (x + y) * 2000 + if pixel.R != pixel.G || pixel.G != pixel.B || pixel.A != 65535 || int(pixel.R) < expected-65 || int(pixel.R) > expected+65 { + t.Fatalf("ten-bit ramp at %d,%d: %+v, expected gray %d", x, y, pixel, expected) + } + } + } + }) + t.Run("metadata and container rotation", func(t *testing.T) { + // This ordinary synthetic fixture carries both Exif orientation 6 and + // a container rotation. Independent ImageIO output is 480x640; applying + // the Exif orientation to already transformed pixels would rotate twice. + path := filepath.Join(root, "internal", "imaging", "testdata", "test_exif.heic") + for _, operation := range []heicdecode.Operation{heicdecode.Decode, heicdecode.DecodeConfig, heicdecode.DecodeExif} { + result, decodeErr := client.Do(context.Background(), operation, func(_ context.Context, _ int64) ([]byte, error) { + return os.ReadFile(path) + }) + if decodeErr != nil { + t.Fatal(decodeErr) + } + metadata := result.Metadata + if metadata == nil || metadata.Orientation != 6 || metadata.Make != "TestCam" || metadata.Model != "Model123" || metadata.FNumber != 5.6 || metadata.ISOSpeed != 800 { + t.Fatalf("ordinary fixture metadata: %+v", metadata) + } + if operation != heicdecode.DecodeExif && (result.Config.Width != 480 || result.Config.Height != 640) { + t.Fatalf("transformed configuration: %+v", result.Config) + } + if operation == heicdecode.Decode && result.Image.Bounds() != image.Rect(0, 0, 480, 640) { + t.Fatalf("transformed pixels: %v", result.Image.Bounds()) + } + } }) t.Run("cancellation joins admitted and queued work", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) @@ -103,6 +140,20 @@ func TestNativeMacSandboxHelper(t *testing.T) { func buildNativeMacHelper(t *testing.T, root, engine string) Config { t.Helper() + if engine == "compiler" { + bundle := filepath.Join(t.TempDir(), "PicFetch.app") + command := exec.Command("go", "run", "./scripts/heicpackage", "-os", "darwin", "-arch", runtime.GOARCH, "-out", bundle) + command.Dir = root + if output, err := command.CombinedOutput(); err != nil { + t.Fatalf("stage signed helper package: %v: %s", err, output) + } + executable, digest, err := LoadPackage(bundle, "darwin", runtime.GOARCH) + if err != nil { + t.Fatal(err) + } + return Config{Executable: executable, SHA256: digest, Limits: heicdecode.DefaultLimits(0)} + } + var err error tags := "no_emoji,nodynamic" entitlements := filepath.Join(root, "packaging", "heic", "macos.entitlements.plist") diff --git a/internal/heicdecode/client/native_platform_test.go b/internal/heicdecode/client/native_platform_test.go new file mode 100644 index 00000000..c1bdbbe6 --- /dev/null +++ b/internal/heicdecode/client/native_platform_test.go @@ -0,0 +1,84 @@ +//go:build heicnative && (linux || windows) && (amd64 || arm64) + +package client + +import ( + "compress/gzip" + "context" + "image" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func TestNativeSandboxHelper(t *testing.T) { + root, err := filepath.Abs(filepath.Join("..", "..", "..")) + if err != nil { + t.Fatal(err) + } + + packageRoot := t.TempDir() + build := exec.Command("go", "run", "./scripts/heicpackage", "-os", runtime.GOOS, "-arch", runtime.GOARCH, "-out", packageRoot) + build.Dir = root + if output, buildErr := build.CombinedOutput(); buildErr != nil { + t.Fatalf("stage helper package: %v: %s", buildErr, output) + } + executable, digest, err := LoadPackage(packageRoot, runtime.GOOS, runtime.GOARCH) + if err != nil { + t.Fatal(err) + } + if err = prepareNativeHelper(executable); err != nil { + t.Fatal(err) + } + client, err := New(Config{Executable: executable, SHA256: digest, Limits: heicdecode.DefaultLimits(0)}) + if err != nil { + t.Fatal(err) + } + defer func() { client.Stop(); client.Wait() }() + for _, fixture := range []struct { + name string + bounds image.Rectangle + }{ + {"tenbit.heic", image.Rect(0, 0, 16, 16)}, + {"photo-gradient.heic.gz", image.Rect(0, 0, 4032, 3024)}, + } { + t.Run(fixture.name, func(t *testing.T) { + start := time.Now() + result, decodeErr := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, maxBytes int64) ([]byte, error) { + file, readErr := os.Open(filepath.Join(root, "scripts", "heicbuild", "testdata", fixture.name)) + if readErr != nil { + return nil, readErr + } + defer func() { _ = file.Close() }() + var reader io.Reader = file + if filepath.Ext(fixture.name) == ".gz" { + compressed, zipErr := gzip.NewReader(file) + if zipErr != nil { + return nil, zipErr + } + defer func() { _ = compressed.Close() }() + reader = compressed + } + return io.ReadAll(io.LimitReader(reader, maxBytes+1)) + }) + if decodeErr != nil { + t.Fatal(decodeErr) + } + if result.Image == nil || result.Image.Bounds() != fixture.bounds { + t.Fatalf("unexpected result: %+v", result.Config) + } + if fixture.name == "tenbit.heic" { + if _, ok := result.Image.(*image.NRGBA64); !ok { + t.Fatalf("ten-bit precision lost: %T", result.Image) + } + } + t.Logf("%s: elapsed=%s, bounds=%v", fixture.name, time.Since(start), result.Image.Bounds()) + }) + } +} diff --git a/internal/heicdecode/client/package.go b/internal/heicdecode/client/package.go new file mode 100644 index 00000000..7cc8a517 --- /dev/null +++ b/internal/heicdecode/client/package.go @@ -0,0 +1,124 @@ +package client + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "path/filepath" +) + +// PackageManifest records the post-signing helper identity within a trusted +// installed package. It is not an independent signature: package authenticity +// belongs to the enclosing TUF archive or platform bundle/package signature. +// No manifest field selects a path or relaxes the runtime resource policy. +type PackageManifest struct { + Version int `json:"version"` + GOOS string `json:"goos"` + GOARCH string `json:"goarch"` + ExecutableSHA256 string `json:"executableSHA256"` + GuestSHA256 string `json:"guestSHA256"` +} + +// PackagePaths defines the one supported helper and manifest location for each +// OS. root is the .app bundle on macOS, or the installation directory elsewhere. +func PackagePaths(root, system string) (executable, manifest string, err error) { + if !filepath.IsAbs(root) { + return "", "", errors.New("HEIC package root must be absolute") + } + switch system { + case "darwin": + return filepath.Join(root, "Contents", "Helpers", "HEICWorker.app", "Contents", "MacOS", "picfetch-heic-worker"), filepath.Join(root, "Contents", "Resources", "heic", "manifest.json"), nil + case "linux": + return filepath.Join(root, "heic", "picfetch-heic-worker"), filepath.Join(root, "heic", "manifest.json"), nil + case "windows": + return filepath.Join(root, "heic", "picfetch-heic-worker.exe"), filepath.Join(root, "heic", "manifest.json"), nil + default: + return "", "", errors.New("unsupported HEIC package platform") + } +} + +// LoadPackage refuses absent/malformed/wrong-target packages and pins the +// installed executable. Client verifies that pin again at every launch. The +// caller supplies the trusted installation root, never an image-selected path. +func LoadPackage(root, system, architecture string) (string, [32]byte, error) { + var empty [32]byte + if architecture != "amd64" && architecture != "arm64" { + return "", empty, ErrUnavailable + } + executable, manifest, err := PackagePaths(root, system) + if err != nil { + return "", empty, err + } + file, err := os.Open(manifest) + if err != nil { + return "", empty, err + } + data, readErr := io.ReadAll(io.LimitReader(file, 4097)) + closeErr := file.Close() + if readErr != nil { + return "", empty, readErr + } + if closeErr != nil { + return "", empty, closeErr + } + if len(data) > 4096 { + return "", empty, errors.New("oversized HEIC package manifest") + } + var record PackageManifest + decoder := json.NewDecoder(bytes.NewReader(data)) + decoder.DisallowUnknownFields() + if err = decoder.Decode(&record); err != nil { + return "", empty, err + } + if err = decoder.Decode(new(any)); err != io.EOF { + return "", empty, errors.New("trailing HEIC package manifest data") + } + if record.Version != 1 || record.GOOS != system || record.GOARCH != architecture { + return "", empty, errors.New("HEIC package target mismatch") + } + pin, err := packageDigest(record.ExecutableSHA256) + if err != nil { + return "", empty, err + } + if _, err = packageDigest(record.GuestSHA256); err != nil { + return "", empty, err + } + helper, err := os.Open(executable) + if err != nil { + return "", empty, err + } + defer func() { _ = helper.Close() }() + info, err := helper.Stat() + if err != nil { + return "", empty, err + } + if !info.Mode().IsRegular() || info.Size() <= 0 || info.Size() > 64*1024*1024 { + return "", empty, errors.New("invalid packaged HEIC executable") + } + hash := sha256.New() + if _, err = io.Copy(hash, io.LimitReader(helper, 64*1024*1024+1)); err != nil { + return "", empty, err + } + if !bytes.Equal(hash.Sum(nil), pin[:]) { + return "", empty, errors.New("packaged HEIC executable hash mismatch") + } + return executable, pin, nil +} + +func packageDigest(value string) ([32]byte, error) { + var digest [32]byte + decoded, err := hex.DecodeString(value) + if err != nil || len(decoded) != len(digest) || hex.EncodeToString(decoded) != value { + return digest, fmt.Errorf("invalid HEIC package digest") + } + copy(digest[:], decoded) + if digest == [32]byte{} { + return digest, errors.New("empty HEIC package digest") + } + return digest, nil +} diff --git a/internal/heicdecode/client/package_test.go b/internal/heicdecode/client/package_test.go new file mode 100644 index 00000000..cf9ab2ed --- /dev/null +++ b/internal/heicdecode/client/package_test.go @@ -0,0 +1,83 @@ +package client + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "os" + "path/filepath" + "testing" +) + +func TestPackagedHelperPinsOnlyFixedTarget(t *testing.T) { + for _, system := range []string{"darwin", "linux", "windows"} { + t.Run(system, func(t *testing.T) { + root := t.TempDir() + executable, manifest, err := PackagePaths(root, system) + if err != nil { + t.Fatal(err) + } + if err = os.MkdirAll(filepath.Dir(executable), 0700); err != nil { + t.Fatal(err) + } + if err = os.MkdirAll(filepath.Dir(manifest), 0700); err != nil { + t.Fatal(err) + } + helper := []byte("owned package executable") + if err = os.WriteFile(executable, helper, 0700); err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(helper) + guest := sha256.Sum256([]byte("owned package guest")) + record := PackageManifest{Version: 1, GOOS: system, GOARCH: "arm64", ExecutableSHA256: hex.EncodeToString(digest[:]), GuestSHA256: hex.EncodeToString(guest[:])} + data, err := json.Marshal(record) + if err != nil { + t.Fatal(err) + } + if err = os.WriteFile(manifest, data, 0600); err != nil { + t.Fatal(err) + } + got, pin, err := LoadPackage(root, system, "arm64") + if err != nil || got != executable || pin != digest { + t.Fatalf("package: path=%q pin=%x error=%v", got, pin, err) + } + if _, _, err = LoadPackage(root, system, "amd64"); err == nil { + t.Fatal("wrong architecture accepted") + } + if err = os.WriteFile(executable, []byte("changed helper"), 0700); err != nil { + t.Fatal(err) + } + if _, _, err = LoadPackage(root, system, "arm64"); err == nil { + t.Fatal("changed helper accepted") + } + }) + } +} + +func TestPackagedHelperRejectsUntrustedManifestChoices(t *testing.T) { + root := t.TempDir() + if _, _, err := LoadPackage(root, "linux", "amd64"); err == nil { + t.Fatal("missing package accepted") + } + _, manifest, err := PackagePaths(root, "linux") + if err != nil { + t.Fatal(err) + } + if err = os.MkdirAll(filepath.Dir(manifest), 0700); err != nil { + t.Fatal(err) + } + for _, data := range []string{`{}`, `{"Version":1,"Executable":"/other/program"}`, string(make([]byte, 4097))} { + if err = os.WriteFile(manifest, []byte(data), 0600); err != nil { + t.Fatal(err) + } + if _, _, err = LoadPackage(root, "linux", "amd64"); err == nil { + t.Fatalf("invalid manifest accepted: %.80q", data) + } + } + if _, _, err = PackagePaths(root, "unsupported"); err == nil { + t.Fatal("unsupported package target accepted") + } + if _, _, err = PackagePaths("relative", "linux"); err == nil { + t.Fatal("relative installation root accepted") + } +} diff --git a/internal/heicdecode/client/peer_other_test.go b/internal/heicdecode/client/peer_other_test.go new file mode 100644 index 00000000..500d34e1 --- /dev/null +++ b/internal/heicdecode/client/peer_other_test.go @@ -0,0 +1,9 @@ +//go:build !windows + +package client + +import "os" + +func installOwnedPeer(source, destination string) error { return os.Link(source, destination) } + +func prepareNativeHelper(_ string) error { return nil } diff --git a/internal/heicdecode/client/peer_windows_test.go b/internal/heicdecode/client/peer_windows_test.go new file mode 100644 index 00000000..d0913b25 --- /dev/null +++ b/internal/heicdecode/client/peer_windows_test.go @@ -0,0 +1,33 @@ +//go:build windows && (amd64 || arm64) + +package client + +import ( + "io" + "os" + + "github.com/frathe/picfetch/internal/heicdecode/winisolation" +) + +func installOwnedPeer(source, destination string) error { + input, err := os.Open(source) + if err != nil { + return err + } + defer func() { _ = input.Close() }() + output, err := os.OpenFile(destination, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0700) + if err != nil { + return err + } + _, copyErr := io.Copy(output, input) + closeErr := output.Close() + if copyErr != nil { + return copyErr + } + if closeErr != nil { + return closeErr + } + return winisolation.PrepareExecutable(destination) +} + +func prepareNativeHelper(path string) error { return winisolation.PrepareExecutable(path) } diff --git a/internal/heicdecode/client/process.go b/internal/heicdecode/client/process.go index 50d53cee..cac0e74c 100644 --- a/internal/heicdecode/client/process.go +++ b/internal/heicdecode/client/process.go @@ -46,7 +46,6 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) cmd := exec.Command(c.config.Executable, "--heic-worker-v2", string(limitsJSON), readPath, writePath, tcp.Addr().String(), udp.LocalAddr().String()) cmd.Env = []string{"GOMAXPROCS=1"} cmd.Dir = string(filepath.Separator) - configureProcess(cmd) var pipes []*os.File defer func() { for _, file := range pipes { @@ -73,7 +72,8 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) return empty, err } cmd.Stdin, cmd.Stdout, cmd.Stderr = inRead, outWrite, errWrite - if err = cmd.Start(); err != nil { + process, err := startProcess(cmd, c.config.Limits) + if err != nil { return empty, fmt.Errorf("%w: launch: %v", ErrUnavailable, err) } _ = inRead.Close() @@ -86,7 +86,7 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) cancelWork.Add(1) context.AfterFunc(ctx, func() { defer cancelWork.Done() - killProcess(cmd) + process.Kill() _ = inWrite.Close() _ = outRead.Close() _ = errRead.Close() @@ -111,7 +111,7 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) cancelWork.Wait() // Kill the group before reaping its leader, so its PID cannot be // recycled between Wait and a late cancellation callback. - processErr := cmd.Wait() + processErr := process.Wait() pipeWork.Wait() if diagnosticErr != nil { result = empty @@ -161,3 +161,10 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) } return decoded, nil } + +// Each platform owns family termination and a final join. Windows creates a +// suspended AppContainer process rather than asking exec.Cmd to start it. +type helperProcess interface { + Kill() + Wait() error +} diff --git a/internal/heicdecode/client/process_other.go b/internal/heicdecode/client/process_other.go index 1ba5d94a..6ade938a 100644 --- a/internal/heicdecode/client/process_other.go +++ b/internal/heicdecode/client/process_other.go @@ -1,13 +1,13 @@ -//go:build !darwin && !linux +//go:build !darwin && !linux && (!windows || (!amd64 && !arm64)) package client -import "os/exec" +import ( + "os/exec" -func configureProcess(_ *exec.Cmd) {} + "github.com/frathe/picfetch/internal/heicdecode" +) -func killProcess(cmd *exec.Cmd) { - if cmd.Process != nil { - _ = cmd.Process.Kill() - } +func startProcess(_ *exec.Cmd, _ heicdecode.Limits) (helperProcess, error) { + return nil, ErrUnavailable } diff --git a/internal/heicdecode/client/process_unix.go b/internal/heicdecode/client/process_unix.go index 42c4371a..5ebca4df 100644 --- a/internal/heicdecode/client/process_unix.go +++ b/internal/heicdecode/client/process_unix.go @@ -5,14 +5,24 @@ package client import ( "os/exec" "syscall" + + "github.com/frathe/picfetch/internal/heicdecode" ) -func configureProcess(cmd *exec.Cmd) { +type unixProcess struct{ cmd *exec.Cmd } + +func startProcess(cmd *exec.Cmd, _ heicdecode.Limits) (helperProcess, error) { cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + if err := cmd.Start(); err != nil { + return nil, err + } + return &unixProcess{cmd: cmd}, nil } -func killProcess(cmd *exec.Cmd) { - if cmd.Process != nil { - _ = syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) +func (p *unixProcess) Kill() { + if p.cmd.Process != nil { + _ = syscall.Kill(-p.cmd.Process.Pid, syscall.SIGKILL) } } + +func (p *unixProcess) Wait() error { return p.cmd.Wait() } diff --git a/internal/heicdecode/client/process_windows.go b/internal/heicdecode/client/process_windows.go new file mode 100644 index 00000000..19230320 --- /dev/null +++ b/internal/heicdecode/client/process_windows.go @@ -0,0 +1,21 @@ +//go:build windows && (amd64 || arm64) + +package client + +import ( + "os" + "os/exec" + + "github.com/frathe/picfetch/internal/heicdecode" + "github.com/frathe/picfetch/internal/heicdecode/winisolation" +) + +func startProcess(cmd *exec.Cmd, limits heicdecode.Limits) (helperProcess, error) { + input, inOK := cmd.Stdin.(*os.File) + output, outOK := cmd.Stdout.(*os.File) + diagnostic, errOK := cmd.Stderr.(*os.File) + if !inOK || !outOK || !errOK { + return nil, ErrUnavailable + } + return winisolation.Start(cmd.Path, cmd.Args[1:], [3]*os.File{input, output, diagnostic}, limits) +} diff --git a/internal/heicdecode/client/remote.go b/internal/heicdecode/client/remote.go new file mode 100644 index 00000000..b133e0f0 --- /dev/null +++ b/internal/heicdecode/client/remote.go @@ -0,0 +1,149 @@ +package client + +import ( + "context" + "errors" + "io" + "sync" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// Remote uses an explicitly inherited pair of interruptible pipes to reach the +// application's admission owner. It cannot launch a helper itself. Cancellation +// retires this connection; its owning analysis process must obtain a new pair +// before later work. Each Remote permits one active call and no hidden backlog. +type Remote struct { + input io.ReadCloser + output io.WriteCloser + limits heicdecode.Limits + ctx context.Context + cancel context.CancelFunc + mu sync.Mutex + closed, active bool + work sync.WaitGroup +} + +func NewRemote(input io.ReadCloser, output io.WriteCloser, limits heicdecode.Limits) (*Remote, error) { + if err := limits.Validate(); err != nil { + return nil, err + } + if input == nil || output == nil { + return nil, ErrUnavailable + } + ctx, cancel := context.WithCancel(context.Background()) + return &Remote{input: input, output: output, limits: limits, ctx: ctx, cancel: cancel}, nil +} + +func (r *Remote) Stop() { + r.mu.Lock() + if r.closed { + r.mu.Unlock() + return + } + r.closed = true + r.cancel() + r.mu.Unlock() + _ = r.input.Close() + _ = r.output.Close() +} + +func (r *Remote) Wait() { r.work.Wait() } + +func (r *Remote) Do(ctx context.Context, op heicdecode.Operation, input Input) (result heicdecode.Response, resultErr error) { + r.mu.Lock() + if r.closed { + r.mu.Unlock() + return result, ErrUnavailable + } + if r.active { + r.mu.Unlock() + return result, ErrBusy + } + r.active = true + r.work.Add(1) + r.mu.Unlock() + defer func() { r.mu.Lock(); r.active = false; r.mu.Unlock(); r.work.Done() }() + ctx, cancel := context.WithCancel(ctx) + stopParent := watchCancellation(r.ctx, cancel) + stopIO := watchCancellation(ctx, r.Stop) + defer func() { + stopIO() + stopParent() + ctxErr := ctx.Err() + cancel() + if ctxErr != nil { + result = heicdecode.Response{} + resultErr = ctxErr + } + var failure *heicdecode.Failure + if resultErr != nil && !errors.As(resultErr, &failure) { + r.Stop() + } + }() + if err := ctx.Err(); err != nil { + return result, err + } + if err := writeBrokerHeader(r.output, brokerHeader{kind: brokerIntent, operation: op}); err != nil { + return result, err + } + header, err := readBrokerHeader(r.input) + if err != nil { + return result, err + } + if header.operation != op { + return result, heicdecode.ErrInvalidResponse + } + if header.kind == brokerResult { + // A helper refused before source admission. A successful pixel result + // here would violate the handshake and must not be published. + _, err = readBrokerResult(r.input, header.size, op, r.limits) + var failure *heicdecode.Failure + if errors.As(err, &failure) { + return result, err + } + return result, heicdecode.ErrInvalidResponse + } + if header.kind != brokerGrant || header.size == 0 || header.size > uint64(r.limits.MaxInputBytes) { + return result, heicdecode.ErrInvalidResponse + } + if err = ctx.Err(); err != nil { + return result, err + } + data, err := input(ctx, int64(header.size)) + if err != nil { + return result, err + } + if err = ctx.Err(); err != nil { + return result, err + } + if len(data) == 0 || uint64(len(data)) > header.size { + return result, heicdecode.ErrInvalidRequest + } + if err = writeBrokerHeader(r.output, brokerHeader{kind: brokerInput, operation: op, size: uint64(len(data)) + 24}); err != nil { + return result, err + } + if err = heicdecode.WriteRequest(r.output, heicdecode.Request{Operation: op, Input: data}, r.limits); err != nil { + return result, err + } + header, err = readBrokerHeader(r.input) + if err != nil { + return result, err + } + if header.kind != brokerResult || header.operation != op { + return result, heicdecode.ErrInvalidResponse + } + return readBrokerResult(r.input, header.size, op, r.limits) +} + +// watchCancellation returns a join, including when a callback has already +// started. Close functions must interrupt pending pipe operations. +func watchCancellation(ctx context.Context, action func()) func() { + done := make(chan struct{}) + stop := context.AfterFunc(ctx, func() { defer close(done); action() }) + return func() { + if !stop() { + <-done + } + } +} diff --git a/internal/heicdecode/client/remote_test.go b/internal/heicdecode/client/remote_test.go new file mode 100644 index 00000000..5ce84aee --- /dev/null +++ b/internal/heicdecode/client/remote_test.go @@ -0,0 +1,312 @@ +package client + +import ( + "bytes" + "context" + "encoding/binary" + "errors" + "image" + "io" + "net" + "sync" + "testing" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func TestRemoteRepeatedRequestsShareOwner(t *testing.T) { + owner := ownedPeer(t, "success", 5*time.Second) + parent, child := net.Pipe() + remote, err := NewRemote(child, child, owner.config.Limits) + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithCancel(context.Background()) + done := make(chan error, 1) + go func() { done <- owner.Serve(ctx, parent, parent) }() + t.Cleanup(func() { remote.Stop(); remote.Wait(); cancel(); <-done }) + reads := 0 + for range 2 { + result, decodeErr := remote.Do(ctx, heicdecode.Decode, func(_ context.Context, maxBytes int64) ([]byte, error) { + reads++ + if maxBytes != owner.config.Limits.MaxInputBytes { + t.Errorf("grant=%d", maxBytes) + } + return []byte("owned input"), nil + }) + if decodeErr != nil { + t.Fatal(decodeErr) + } + if _, ok := result.Image.(*image.NRGBA64); !ok { + t.Fatalf("pixel layout changed: %T", result.Image) + } + } + if reads != 2 { + t.Fatalf("source reads=%d", reads) + } +} + +func TestRemotePreAdmissionRefusalDoesNotReadSource(t *testing.T) { + peer := ownedPeer(t, "success", 5*time.Second) + config := peer.config + config.SHA256[0] ^= 1 + owner, err := New(config) + if err != nil { + t.Fatal(err) + } + defer func() { owner.Stop(); owner.Wait() }() + parent, child := net.Pipe() + remote, err := NewRemote(child, child, config.Limits) + if err != nil { + t.Fatal(err) + } + defer func() { remote.Stop(); remote.Wait() }() + done := make(chan error, 1) + go func() { done <- owner.Serve(context.Background(), parent, parent) }() + read := false + _, err = remote.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { read = true; return []byte{1}, nil }) + var failure *heicdecode.Failure + if read || !errors.As(err, &failure) || failure.Status != heicdecode.StatusUnavailable { + t.Fatalf("read=%v refusal=%v", read, err) + } + if err = <-done; !errors.Is(err, io.EOF) { + t.Fatalf("refused connection not retired: %v", err) + } +} + +func TestBrokerResultRejectsOversizedTruncatedAndTrailingFrames(t *testing.T) { + limits := heicdecode.DefaultLimits(0) + var encoded bytes.Buffer + result := heicdecode.Response{Image: image.NewNRGBA64(image.Rect(0, 0, 1, 1))} + if err := heicdecode.WriteResponse(&encoded, heicdecode.Decode, result, limits); err != nil { + t.Fatal(err) + } + data := encoded.Bytes() + if _, err := readBrokerResult(bytes.NewReader(data), uint64(len(data)), heicdecode.Decode, limits); err != nil { + t.Fatal(err) + } + for _, tc := range []struct { + name string + size uint64 + data []byte + }{ + {"oversized", ^uint64(0), nil}, + {"missing frame byte", uint64(len(data) + 1), data}, + {"short payload", uint64(len(data)), data[:len(data)-1]}, + {"trailing payload", uint64(len(data) + 1), append(bytes.Clone(data), 0)}, + } { + t.Run(tc.name, func(t *testing.T) { + if result, err := readBrokerResult(bytes.NewReader(tc.data), tc.size, heicdecode.Decode, limits); err == nil || result.Image != nil { + t.Fatal("invalid frame published pixels") + } + }) + } +} + +func TestRemoteRejectsGrantBeforeReadingSource(t *testing.T) { + limits := heicdecode.DefaultLimits(0) + for _, size := range []uint64{0, uint64(limits.MaxInputBytes) + 1, ^uint64(0)} { + parent, child := net.Pipe() + remote, err := NewRemote(child, child, limits) + if err != nil { + t.Fatal(err) + } + done := make(chan struct{}) + go func() { + defer close(done) + defer func() { _ = parent.Close() }() + if _, err := readBrokerHeader(parent); err == nil { + _ = writeBrokerHeader(parent, brokerHeader{kind: brokerGrant, operation: heicdecode.Decode, size: size}) + } + }() + read := false + _, err = remote.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { read = true; return []byte{1}, nil }) + remote.Stop() + remote.Wait() + <-done + if read || !errors.Is(err, heicdecode.ErrInvalidResponse) { + t.Fatalf("grant=%d read=%v error=%v", size, read, err) + } + } +} + +// Hold output inside a Write that Close can interrupt, just like a full pipe. +// The result header arrives only after helper cleanup and pixel validation. +type heldResultWriter struct { + io.WriteCloser + blocked, closed chan struct{} + once sync.Once +} + +func (w *heldResultWriter) Write(p []byte) (int, error) { + if len(p) == 16 && string(p[:4]) == "PHB1" && binary.LittleEndian.Uint16(p[4:]) == brokerResult { + close(w.blocked) + <-w.closed + return 0, io.ErrClosedPipe + } + return w.WriteCloser.Write(p) +} + +func (w *heldResultWriter) Close() error { + w.once.Do(func() { close(w.closed) }) + return w.WriteCloser.Close() +} + +func TestRemoteOutputRetainsAdmissionAndStopJoins(t *testing.T) { + owner := ownedPeer(t, "success", 5*time.Second) + parent, child := net.Pipe() + held := &heldResultWriter{WriteCloser: parent, blocked: make(chan struct{}), closed: make(chan struct{})} + remote, err := NewRemote(child, child, owner.config.Limits) + if err != nil { + t.Fatal(err) + } + serveDone, remoteDone := make(chan error, 1), make(chan error, 1) + go func() { serveDone <- owner.Serve(context.Background(), parent, held) }() + go func() { + _, err := remote.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { return []byte{1}, nil }) + remoteDone <- err + }() + defer func() { + owner.Stop() + owner.Wait() + remote.Stop() + remote.Wait() + <-serveDone + <-remoteDone + }() + select { + case <-held.blocked: + case <-time.After(5 * time.Second): + t.Fatal("result did not reach output") + } + // This enters the same lane used by foreground Do, synchronously; it + // cannot acquire a grant while the remote output is blocked. + next := owner.lane.enter(context.Background(), Foreground) + defer next.release() + select { + case <-next.ready: + t.Fatal("output escaped the shared admission bound") + default: + } + owner.Stop() + owner.Wait() + select { + case <-next.ready: + default: + t.Fatal("stopped output retained its grant") + } +} + +type readObserver struct { + io.ReadCloser + once sync.Once + started chan struct{} +} + +func (r *readObserver) Read(p []byte) (int, error) { + r.once.Do(func() { close(r.started) }) + return r.ReadCloser.Read(p) +} + +func TestBrokerBoundsIdleConnectionsAndJoinsStop(t *testing.T) { + owner := ownedPeer(t, "success", 5*time.Second) + var completions []chan error + var peers []net.Conn + defer func() { + for _, peer := range peers { + _ = peer.Close() + } + }() + for range maxServices { + parent, child := net.Pipe() + peers = append(peers, child) + reader := &readObserver{ReadCloser: parent, started: make(chan struct{})} + done := make(chan error, 1) + completions = append(completions, done) + go func() { done <- owner.Serve(context.Background(), reader, parent) }() + <-reader.started + } + parent, child := net.Pipe() + defer func() { _ = child.Close() }() + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + if err := owner.Serve(ctx, parent, parent); !errors.Is(err, ErrBusy) { + t.Fatalf("excess connection: %v", err) + } + owner.Stop() + owner.Wait() + for _, done := range completions { + <-done + } +} + +type intentObserver struct { + io.WriteCloser + once sync.Once + written chan struct{} +} + +func (w *intentObserver) Write(p []byte) (int, error) { + n, err := w.WriteCloser.Write(p) + w.once.Do(func() { close(w.written) }) + return n, err +} + +func TestRemoteQueuedCancellationReleasesService(t *testing.T) { + owner := ownedPeer(t, "success", 5*time.Second) + localCtx, cancelLocal := context.WithCancel(context.Background()) + entered, localDone := make(chan struct{}), make(chan error, 1) + go func() { + _, err := owner.Do(localCtx, heicdecode.Decode, func(ctx context.Context, _ int64) ([]byte, error) { + close(entered) + <-ctx.Done() + return nil, ctx.Err() + }) + localDone <- err + }() + t.Cleanup(func() { cancelLocal(); <-localDone }) + select { + case <-entered: + case <-time.After(5 * time.Second): + t.Fatal("local request not admitted") + } + parent, child := net.Pipe() + observer := &intentObserver{WriteCloser: child, written: make(chan struct{})} + remote, err := NewRemote(child, observer, owner.config.Limits) + if err != nil { + t.Fatal(err) + } + serveCtx, stopServe := context.WithCancel(context.Background()) + serveDone := make(chan error, 1) + go func() { serveDone <- owner.Serve(serveCtx, parent, parent) }() + var serveJoined bool + t.Cleanup(func() { + remote.Stop() + remote.Wait() + stopServe() + if !serveJoined { + <-serveDone + } + }) + remoteCtx, cancelRemote := context.WithCancel(context.Background()) + remoteDone := make(chan error, 1) + go func() { + _, err := remote.Do(remoteCtx, heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + t.Error("queued source was read before owner released its grant") + return []byte("owned input"), nil + }) + remoteDone <- err + }() + <-observer.written + cancelRemote() + if err = <-remoteDone; !errors.Is(err, context.Canceled) { + t.Fatalf("remote cancellation: %v", err) + } + select { + case <-serveDone: + serveJoined = true + case <-time.After(time.Second): + t.Fatal("disconnected queued service still waits for the foreground grant") + } +} diff --git a/internal/heicdecode/limits.go b/internal/heicdecode/limits.go index 91974a0e..e70249a8 100644 --- a/internal/heicdecode/limits.go +++ b/internal/heicdecode/limits.go @@ -14,6 +14,7 @@ const ( hardMaxOutputBytes = hardMaxPixels * 4 hardMaxMetadataBytes = 64 * 1024 hardMaxDiagnosticBytes = 4096 + hardMaxDuration = time.Minute ) var ErrInvalidLimits = errors.New("invalid HEIC decoder limits") @@ -44,7 +45,7 @@ func DefaultLimits(userMaxInputBytes int64) Limits { input = userMaxInputBytes } return Limits{ - Timeout: 30 * time.Second, + Timeout: hardMaxDuration, WASMMemoryBytes: 1 * 1024 * 1024 * 1024, OSProcessBytes: 2 * 1024 * 1024 * 1024, MaxInputBytes: input, @@ -59,7 +60,7 @@ func DefaultLimits(userMaxInputBytes int64) Limits { // Validate rejects relaxed, absent, or internally inconsistent limits. func (l Limits) Validate() error { - if l.Timeout <= 0 || l.Timeout > 30*time.Second || + if l.Timeout <= 0 || l.Timeout > hardMaxDuration || l.WASMMemoryBytes <= 0 || l.WASMMemoryBytes > 1*1024*1024*1024 || l.WASMMemoryBytes%(64*1024) != 0 || l.OSProcessBytes <= 0 || l.OSProcessBytes > 2*1024*1024*1024 || l.WASMMemoryBytes > l.OSProcessBytes || l.MaxInputBytes <= 0 || l.MaxInputBytes > hardMaxInputBytes || diff --git a/internal/heicdecode/protocol_test.go b/internal/heicdecode/protocol_test.go index 183a9084..74927ad6 100644 --- a/internal/heicdecode/protocol_test.go +++ b/internal/heicdecode/protocol_test.go @@ -11,6 +11,7 @@ import ( func TestLimitsValidate(t *testing.T) { valid := DefaultLimits(32 * 1024 * 1024) + valid.Timeout = time.Minute if err := valid.Validate(); err != nil { t.Fatalf("default limits: %v", err) } @@ -20,6 +21,7 @@ func TestLimitsValidate(t *testing.T) { mutate func(*Limits) }{ {"zero timeout", func(l *Limits) { l.Timeout = 0 }}, + {"timeout over hard ceiling", func(l *Limits) { l.Timeout = time.Minute + time.Nanosecond }}, {"fractional WASM page", func(l *Limits) { l.WASMMemoryBytes = 1 }}, {"guest exceeds OS budget", func(l *Limits) { l.OSProcessBytes = l.WASMMemoryBytes - 1 }}, {"input over hard ceiling", func(l *Limits) { l.MaxInputBytes = hardMaxInputBytes + 1 }}, @@ -79,8 +81,8 @@ func TestDefaultLimitsClampUserInput(t *testing.T) { if got := DefaultLimits(7).MaxInputBytes; got != 7 { t.Fatalf("small user limit = %d, want 7", got) } - if got := DefaultLimits(7).Timeout; got != 30*time.Second { - t.Fatalf("timeout = %v, want 30s", got) + if got := DefaultLimits(7).Timeout; got != time.Minute { + t.Fatalf("timeout = %v, want 60s", got) } } diff --git a/internal/heicdecode/winisolation/native_windows_test.go b/internal/heicdecode/winisolation/native_windows_test.go new file mode 100644 index 00000000..172e34a9 --- /dev/null +++ b/internal/heicdecode/winisolation/native_windows_test.go @@ -0,0 +1,138 @@ +//go:build windows && (amd64 || arm64) + +package winisolation + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "testing" + "time" + + "golang.org/x/sys/windows" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// This process is PicFetch's owned native control, with no image or codec. +func TestMain(m *testing.M) { + if len(os.Args) == 2 && os.Args[1] == "--owned-exit" { + os.Exit(0) + } + if len(os.Args) == 3 && os.Args[1] == "--owned-windows-policy" { + var limits heicdecode.Limits + if json.Unmarshal([]byte(os.Args[2]), &limits) != nil { + os.Exit(2) + } + if err := ownedPolicyControl(limits); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(3) + } + _, _ = fmt.Fprintln(os.Stdout, "verified") + _, _ = io.Copy(io.Discard, os.Stdin) + os.Exit(0) + } + os.Exit(m.Run()) +} + +func ownedPolicyControl(limits heicdecode.Limits) error { + if err := Verify(limits); err != nil { + return err + } + if os.Getenv("PICFETCH_OWNED_PARENT_ENVIRONMENT") != "" { + return errors.New("parent environment reached the helper") + } + // The request is capped at 65 MiB even if the tested restriction is broken. + // No page is touched; an unexpected success is freed immediately. + if limits.OSProcessBytes != 64*1024*1024 { + return errors.New("owned memory control requires its small fixed budget") + } + address, err := windows.VirtualAlloc(0, 65*1024*1024, windows.MEM_RESERVE|windows.MEM_COMMIT, windows.PAGE_READWRITE) + if address != 0 { + _ = windows.VirtualFree(address, 0, windows.MEM_RELEASE) + return errors.New("job accepted commitment beyond its memory ceiling") + } + if !errors.Is(err, windows.ERROR_COMMITMENT_LIMIT) && !errors.Is(err, windows.ERROR_NOT_ENOUGH_MEMORY) && !errors.Is(err, windows.ERROR_NOT_ENOUGH_QUOTA) { + return fmt.Errorf("unexpected commitment refusal: %w", err) + } + // A second copy of this inert control must be refused by the kernel. + child, err := os.StartProcess(os.Args[0], []string{os.Args[0], "--owned-exit"}, &os.ProcAttr{}) + if child != nil { + _ = child.Kill() + _, _ = child.Wait() + return errors.New("job admitted a second process") + } + if !errors.Is(err, os.ErrPermission) && !errors.Is(err, windows.ERROR_NOT_ENOUGH_QUOTA) && !errors.Is(err, windows.ERROR_CHILD_PROCESS_BLOCKED) { + return fmt.Errorf("unexpected child-process refusal: %w", err) + } + return nil +} + +func TestNativeWindowsJobAndToken(t *testing.T) { + t.Setenv("PICFETCH_OWNED_PARENT_ENVIRONMENT", "owned test sentinel") + source, err := os.Executable() + if err != nil { + t.Fatal(err) + } + directory := t.TempDir() + executable := filepath.Join(directory, "owned-policy.exe") + data, err := os.ReadFile(source) + if err != nil { + t.Fatal(err) + } + if err = os.WriteFile(executable, data, 0700); err != nil { + t.Fatal(err) + } + if err = PrepareExecutable(executable); err != nil { + t.Fatal(err) + } + input, feed, err := os.Pipe() + if err != nil { + t.Fatal(err) + } + defer func() { _ = input.Close(); _ = feed.Close() }() + output, response, err := os.Pipe() + if err != nil { + t.Fatal(err) + } + defer func() { _ = output.Close(); _ = response.Close() }() + diagnostic, warnings, err := os.Pipe() + if err != nil { + t.Fatal(err) + } + defer func() { _ = diagnostic.Close(); _ = warnings.Close() }() + limits := heicdecode.DefaultLimits(0) + limits.Timeout = 10 * time.Second + limits.OSProcessBytes = 64 * 1024 * 1024 + limits.WASMMemoryBytes = 16 * 1024 * 1024 + encoded, err := json.Marshal(limits) + if err != nil { + t.Fatal(err) + } + process, err := Start(executable, []string{"--owned-windows-policy", string(encoded)}, [3]*os.File{input, response, warnings}, limits) + if err != nil { + t.Fatal(err) + } + defer func() { process.Kill(); _ = process.Wait() }() + deadline := time.AfterFunc(limits.Timeout, process.Kill) + defer deadline.Stop() + _ = input.Close() + _ = response.Close() + _ = warnings.Close() + _ = feed.Close() + actual, readErr := io.ReadAll(output) + detail, detailErr := io.ReadAll(diagnostic) + waitErr := process.Wait() + if readErr != nil || detailErr != nil || waitErr != nil || string(actual) != "verified\n" { + t.Fatalf("native policy: output=%q diagnostics=%q read=%v/%v wait=%v", actual, detail, readErr, detailErr, waitErr) + } +} + +func TestNativeWindowsUnsandboxedRefused(t *testing.T) { + if Verify(heicdecode.DefaultLimits(0)) == nil { + t.Fatal("ordinary test process accepted as isolated helper") + } +} diff --git a/internal/heicdecode/winisolation/policy_windows.go b/internal/heicdecode/winisolation/policy_windows.go new file mode 100644 index 00000000..9c130c56 --- /dev/null +++ b/internal/heicdecode/winisolation/policy_windows.go @@ -0,0 +1,92 @@ +//go:build windows && (amd64 || arm64) + +package winisolation + +import ( + "errors" + "runtime" + "time" + "unsafe" + + "golang.org/x/sys/windows" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// TOKEN_INFORMATION_CLASS values from the Windows SDK; x/sys does not expose +// these three declarations. https://learn.microsoft.com/windows/win32/api/winnt/ne-winnt-token_information_class +const ( + tokenIsAppContainer = 29 + tokenCapabilities = 30 + tokenAppContainerSID = 31 +) + +func jobLimits(limits heicdecode.Limits) windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION { + return windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{ + BasicLimitInformation: windows.JOBOBJECT_BASIC_LIMIT_INFORMATION{ + PerJobUserTimeLimit: int64((limits.Timeout + 100*time.Nanosecond - 1) / (100 * time.Nanosecond)), // Windows counts 100-nanosecond units. + LimitFlags: windows.JOB_OBJECT_LIMIT_ACTIVE_PROCESS | windows.JOB_OBJECT_LIMIT_PROCESS_MEMORY | + windows.JOB_OBJECT_LIMIT_JOB_MEMORY | windows.JOB_OBJECT_LIMIT_JOB_TIME | windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, + ActiveProcessLimit: 1, + }, + ProcessMemoryLimit: uintptr(limits.OSProcessBytes), JobMemoryLimit: uintptr(limits.OSProcessBytes), + } +} + +func verifyJob(job windows.Handle, limits heicdecode.Limits) error { + var actual windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION + if err := windows.QueryInformationJobObject(job, windows.JobObjectExtendedLimitInformation, uintptr(unsafe.Pointer(&actual)), uint32(unsafe.Sizeof(actual)), nil); err != nil { + return err + } + wanted := jobLimits(limits) + if actual.BasicLimitInformation.LimitFlags != wanted.BasicLimitInformation.LimitFlags || + actual.BasicLimitInformation.ActiveProcessLimit != 1 || + actual.BasicLimitInformation.PerJobUserTimeLimit != wanted.BasicLimitInformation.PerJobUserTimeLimit || + actual.ProcessMemoryLimit != wanted.ProcessMemoryLimit || actual.JobMemoryLimit != wanted.JobMemoryLimit { + return errors.New("HEIC Job Object limits do not match the requested boundary") + } + return nil +} + +// Verify checks the current process's kernel token and immediate Job Object. +// The worker calls this before performing denial probes or reading any input. +func Verify(limits heicdecode.Limits) error { + if err := limits.Validate(); err != nil { + return err + } + token := windows.GetCurrentProcessToken() + var isContainer uint32 + var length uint32 + if err := windows.GetTokenInformation(token, tokenIsAppContainer, (*byte)(unsafe.Pointer(&isContainer)), uint32(unsafe.Sizeof(isContainer)), &length); err != nil { + return err + } + if isContainer != 1 { + return errors.New("HEIC helper is not an AppContainer process") + } + var buffer [4096]byte + if err := windows.GetTokenInformation(token, tokenCapabilities, &buffer[0], uint32(len(buffer)), &length); err != nil { + return err + } + if length < 4 || (*windows.Tokengroups)(unsafe.Pointer(&buffer[0])).GroupCount != 0 { + return errors.New("HEIC helper has unexpected AppContainer capabilities") + } + if err := windows.GetTokenInformation(token, tokenAppContainerSID, &buffer[0], uint32(len(buffer)), &length); err != nil { + return err + } + if length < uint32(unsafe.Sizeof(uintptr(0))) { + return errors.New("HEIC helper has no AppContainer SID") + } + actual := *(**windows.SID)(unsafe.Pointer(&buffer[0])) + expected, err := containerSID(false) + if err != nil { + return err + } + defer func() { _ = windows.FreeSid(expected) }() + matches := actual != nil && actual.Equals(expected) + runtime.KeepAlive(buffer) + if !matches { + return errors.New("HEIC helper has an unexpected AppContainer identity") + } + // A null handle queries the caller's immediate job even in a nested job. + return verifyJob(0, limits) +} diff --git a/internal/heicdecode/winisolation/process_windows.go b/internal/heicdecode/winisolation/process_windows.go new file mode 100644 index 00000000..058db682 --- /dev/null +++ b/internal/heicdecode/winisolation/process_windows.go @@ -0,0 +1,191 @@ +//go:build windows && (amd64 || arm64) + +package winisolation + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + "unsafe" + + "golang.org/x/sys/windows" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +const ( + securityCapabilitiesAttribute = 0x00020009 + childProcessPolicyAttribute = 0x0002000e + childProcessRestricted = 1 +) + +type securityCapabilities struct { + AppContainerSID *windows.SID + Capabilities *windows.SIDAndAttributes + CapabilityCount uint32 + Reserved uint32 +} + +// Process owns one noninheritable job and process handle. Kill is nonblocking; +// Wait joins the process and closes the final job handle. Callers stop their +// pipe work separately, then Wait once admission can be released. +type Process struct { + mu sync.Mutex + process, job windows.Handle + wait sync.Once + waitErr error +} + +// Start creates the helper suspended inside a zero-capability AppContainer, +// assigns and verifies its private job, then resumes its sole initial thread. +// Only the three duplicated stdio handles are inherited. Every setup failure +// terminates and joins the still-owned process before returning. +func Start(executable string, args []string, stdio [3]*os.File, limits heicdecode.Limits) (_ *Process, resultErr error) { + if err := limits.Validate(); err != nil { + return nil, err + } + if !filepath.IsAbs(executable) { + return nil, errors.New("HEIC helper path must be absolute") + } + sid, err := containerSID(true) + if err != nil { + return nil, err + } + defer func() { _ = windows.FreeSid(sid) }() + job, err := windows.CreateJobObject(nil, nil) + if err != nil { + return nil, err + } + defer func() { + if resultErr != nil { + _ = windows.CloseHandle(job) + } + }() + policy := jobLimits(limits) + if _, err = windows.SetInformationJobObject(job, windows.JobObjectExtendedLimitInformation, uintptr(unsafe.Pointer(&policy)), uint32(unsafe.Sizeof(policy))); err != nil { + return nil, err + } + if err = verifyJob(job, limits); err != nil { + return nil, err + } + var handles [3]windows.Handle + defer func() { + for _, handle := range handles { + if handle != 0 { + _ = windows.CloseHandle(handle) + } + } + }() + for i, file := range stdio { + if file == nil { + return nil, errors.New("HEIC helper requires three explicit pipes") + } + if err = windows.DuplicateHandle(windows.CurrentProcess(), windows.Handle(file.Fd()), windows.CurrentProcess(), &handles[i], 0, true, windows.DUPLICATE_SAME_ACCESS); err != nil { + return nil, err + } + } + attributes, err := windows.NewProcThreadAttributeList(3) + if err != nil { + return nil, err + } + defer attributes.Delete() + capability := securityCapabilities{AppContainerSID: sid} + children := uint32(childProcessRestricted) + if err = attributes.Update(securityCapabilitiesAttribute, unsafe.Pointer(&capability), unsafe.Sizeof(capability)); err != nil { + return nil, err + } + if err = attributes.Update(windows.PROC_THREAD_ATTRIBUTE_HANDLE_LIST, unsafe.Pointer(&handles[0]), unsafe.Sizeof(handles)); err != nil { + return nil, err + } + if err = attributes.Update(childProcessPolicyAttribute, unsafe.Pointer(&children), unsafe.Sizeof(children)); err != nil { + return nil, err + } + startup := windows.StartupInfoEx{ProcThreadAttributeList: attributes.List()} + startup.Cb = uint32(unsafe.Sizeof(startup)) + startup.Flags = windows.STARTF_USESTDHANDLES + startup.StdInput, startup.StdOutput, startup.StdErr = handles[0], handles[1], handles[2] + path, err := windows.UTF16PtrFromString(executable) + if err != nil { + return nil, err + } + command, err := windows.UTF16PtrFromString(windows.ComposeCommandLine(append([]string{executable}, args...))) + if err != nil { + return nil, err + } + // No parent environment, search path or user image location enters the child. + environment, err := windows.UTF16FromString("GOMAXPROCS=1") + if err != nil { + return nil, err + } + environment = append(environment, 0) + directory, err := windows.UTF16PtrFromString(filepath.Dir(executable)) + if err != nil { + return nil, err + } + var information windows.ProcessInformation + flags := uint32(windows.CREATE_SUSPENDED | windows.CREATE_UNICODE_ENVIRONMENT | windows.EXTENDED_STARTUPINFO_PRESENT | windows.CREATE_NO_WINDOW) + if err = windows.CreateProcess(path, command, nil, nil, true, flags, &environment[0], directory, &startup.StartupInfo, &information); err != nil { + return nil, err + } + runtime.KeepAlive(capability) + runtime.KeepAlive(handles) + runtime.KeepAlive(children) + defer func() { _ = windows.CloseHandle(information.Thread) }() + defer func() { + if resultErr != nil { + _ = windows.TerminateProcess(information.Process, 1) + _, _ = windows.WaitForSingleObject(information.Process, windows.INFINITE) + _ = windows.CloseHandle(information.Process) + } + }() + if err = windows.AssignProcessToJobObject(job, information.Process); err != nil { + return nil, err + } + if err = verifyJob(job, limits); err != nil { + return nil, err + } + count, err := windows.ResumeThread(information.Thread) + if err != nil { + return nil, err + } + if count != 1 { + return nil, fmt.Errorf("HEIC initial thread had unexpected suspend count %d", count) + } + return &Process{process: information.Process, job: job}, nil +} + +func (p *Process) Kill() { + p.mu.Lock() + defer p.mu.Unlock() + if p.job != 0 { + _ = windows.TerminateJobObject(p.job, 1) + } +} + +func (p *Process) Wait() error { + p.wait.Do(func() { + state, err := windows.WaitForSingleObject(p.process, windows.INFINITE) + if err != nil { + p.waitErr = err + } else if state != windows.WAIT_OBJECT_0 { + p.waitErr = fmt.Errorf("HEIC process wait returned %d", state) + } else { + var code uint32 + if err = windows.GetExitCodeProcess(p.process, &code); err != nil { + p.waitErr = err + } else if code != 0 { + p.waitErr = fmt.Errorf("HEIC process exited with code %d", code) + } + } + p.mu.Lock() + defer p.mu.Unlock() + // Kill-on-close is retained until the process has been observed to exit. + _ = windows.CloseHandle(p.job) + _ = windows.CloseHandle(p.process) + p.job, p.process = 0, 0 + }) + return p.waitErr +} diff --git a/internal/heicdecode/winisolation/profile_windows.go b/internal/heicdecode/winisolation/profile_windows.go new file mode 100644 index 00000000..c9564cdc --- /dev/null +++ b/internal/heicdecode/winisolation/profile_windows.go @@ -0,0 +1,106 @@ +//go:build windows && (amd64 || arm64) + +// Package winisolation owns the Windows HEIC helper's native privilege and +// process-family boundary. It contains no decoder or user-image handling. +package winisolation + +import ( + "fmt" + "path/filepath" + "runtime" + "unsafe" + + "golang.org/x/sys/windows" +) + +const containerName = "PicFetch.HEICWorker.v2" + +// Profile APIs return HRESULT, not the thread's last-error value. Each SID is +// allocated by Windows and belongs to the caller until FreeSid. +func containerSID(create bool) (*windows.SID, error) { + name, err := windows.UTF16PtrFromString(containerName) + if err != nil { + return nil, err + } + library := windows.NewLazySystemDLL("userenv.dll") + var sid *windows.SID + if create { + procedure := library.NewProc("CreateAppContainerProfile") + if err = procedure.Find(); err != nil { + return nil, err + } + result, _, _ := procedure.Call(uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(name)), 0, 0, uintptr(unsafe.Pointer(&sid))) + runtime.KeepAlive(name) + if int32(result) >= 0 { + if sid == nil { + return nil, fmt.Errorf("HEIC AppContainer returned no SID") + } + return sid, nil + } + if sid != nil { + _ = windows.FreeSid(sid) + sid = nil + } + if uint32(result) != 0x800700b7 { + return nil, fmt.Errorf("create HEIC AppContainer: HRESULT %#x", uint32(result)) + } + } + procedure := library.NewProc("DeriveAppContainerSidFromAppContainerName") + if err = procedure.Find(); err != nil { + return nil, err + } + result, _, _ := procedure.Call(uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(&sid))) + runtime.KeepAlive(name) + if int32(result) < 0 { + if sid != nil { + _ = windows.FreeSid(sid) + } + return nil, fmt.Errorf("derive HEIC AppContainer: HRESULT %#x", uint32(result)) + } + if sid == nil { + return nil, fmt.Errorf("HEIC AppContainer returned no SID") + } + return sid, nil +} + +// PrepareExecutable grants only read/execute of a dedicated helper file and +// its containing directory to this AppContainer. Callers own this installation +// directory; no permission is inherited by other files or child directories. +// Launch does not change ACLs, so immutable packaged locations must already +// provide the necessary access or be staged into an owned helper directory. +func PrepareExecutable(executable string) error { + if !filepath.IsAbs(executable) { + return fmt.Errorf("HEIC helper path must be absolute") + } + sid, err := containerSID(true) + if err != nil { + return err + } + defer func() { _ = windows.FreeSid(sid) }() + var pinned runtime.Pinner + pinned.Pin(sid) + defer pinned.Unpin() + for _, path := range []string{filepath.Dir(executable), executable} { + descriptor, getErr := windows.GetNamedSecurityInfo(path, windows.SE_FILE_OBJECT, windows.DACL_SECURITY_INFORMATION) + if getErr != nil { + return getErr + } + existing, _, getErr := descriptor.DACL() + if getErr != nil { + return getErr + } + access := windows.EXPLICIT_ACCESS{ + AccessPermissions: windows.FILE_GENERIC_READ | windows.FILE_GENERIC_EXECUTE, + AccessMode: windows.GRANT_ACCESS, Inheritance: windows.NO_INHERITANCE, + Trustee: windows.TRUSTEE{TrusteeForm: windows.TRUSTEE_IS_SID, TrusteeType: windows.TRUSTEE_IS_UNKNOWN, TrusteeValue: windows.TrusteeValueFromSID(sid)}, + } + acl, aclErr := windows.ACLFromEntries([]windows.EXPLICIT_ACCESS{access}, existing) + if aclErr != nil { + return aclErr + } + if err = windows.SetNamedSecurityInfo(path, windows.SE_FILE_OBJECT, windows.DACL_SECURITY_INFORMATION, nil, nil, acl, nil); err != nil { + return err + } + } + return nil +} diff --git a/internal/heicdecode/worker/decoder.wasm b/internal/heicdecode/worker/decoder.wasm index 2da94e118f72be7c42e8bcf4f41656dc446e0d06..ee7a3f235e011eda2b0f29e2672d63c6cdcf405d 100644 GIT binary patch delta 1340459 zcma%kcR*A}(712+)kC@z;i$3q-Wz9+iK0f0DV9_dV@r%FHn3vlXbu{USRq!F=);a0 z6+3EFG!`%xG#ar*to&y8y*o~m@B4lJA+v3Ew!CROySF#{hl#35Y zx<|)nU8AyFQVcDh^p}Sw#3w!Sc*lL~S}YdIMa6`>#Rot{`^fL%?#=ogAajIuYt|93 zN`4U#kQy*QU_ro70Sf~b1^gVaI3O)xNx;$o%amyav52`I><+IT3eQSv`6N}Z@})=S z>Ubf&I#na64Z*A>RlGcDo<0SZd?p2E9ckQ2BD>;}Dzt1&mOM!6)^Zlj+dKslyd`VW zqn4G(x%i~uR%VekX?Uv<&f=`+ttv}AWv@^>G|6UL>si*5z`J^Bo2H1l+w21D?p@n2 zYtfr8L|U-Vp0ub(F#o%)M{Dx)X6QLuwI=yTN0X$rFsh$yO`3vm>3xXZO+%9&Mt@K8 zHiP|>^46r8J$ZgqPijpn>G`G?;$kB!7fB+BjUn#U>pD5}6pEX2)|t3nw2xU7O!KZ+{Tcwn2PpmFUobrR*(Q$sf zUDQ0un$>jN?*fUt0I{n*tXb73j3Ca$=9mPL*L#^N1!N7LN)3#kPfHhtTadTT&kw%( zrm{cewXn)b?PkprZe^XFHJy^XPqPNaf5JD-yt_3+v#uoYwN$U$kWmGHN08XvxX9y znld8^HWl%2Vt4&op;>90CmWQ5@DeE z>1Y(+4M~^tcd-tVmYh4rJNo+k+X`8epR~KM3s0B7GK#lIiutpcXMA&Yq_Gm$ueaq$ zldAo7ilcb>S2nM)<#uPI6Z-cwqsHv}MoH%fvov1i^z$|ny|-C}d%Ys9dIKW7Nod-} zWSA%l#SWl`zEBbxQAe^`;&@pXG+~!>|LK=3!Zzmy)OB|ugijWq4gG9S|YdMJGY!s|bBL9iLWl zC1_n0VOJSJvugZ{ARP&6_Zls;%E(|-7FFAoh+TDDiSVy4OeiB_V`GyDwG8^)79MhR#|rzpd~tAJ4ncnrqvKLHfl7=HxEd|+y{0ejiJQea!TWm& z{j1=Lo1!6lZFEPmUDQuPM7i>kn_D>HvXHph*rwonVQ6pRj)2T5X;6G4eQqD&s>0EG zKlAa^XMQNm4By)Jgog=0?rNt79|MNIZ!oGh~PlCMByzCEJ(zO!aDl?L_rbNtFwd%)s}x2 zPR|qGqnT@F>kUAtKp6zy(Y29hFA%cm~-$MKx7%*y~P>}<379t~JIR_RBp$yQA77BNX5B6>{s1hd3^3O`(y;ukZ zB@GvrksvM+x_MwNTREK5U}T_3>4!^%gx6aZJ6eV=72f!t3iVM-h0l#Ca}2E}gsjA= z!tv?pD}{LK($vm)CZlL~22%9dDxri=_Tbh3rfBPGA;r6FEWBm$Ss1iN==3^5Mkqt5 zpIIZM3ofNa<*++eI=HS90`_(_E&Aql!U#e$(q!1}Rly(HY!GUblS}ns8-(%HrMrCA zvLqks=|cV2v$KtCmwtF{)=%tC|8Pj#Bs_b)4NftliiBgE1<(I3`&TzO*#GL?$PR`% zy0GhYOh%a%M*4YL^vT&mp&(p^PqzvUTq-(Npsb&hjzyGZq=4=<-U$1~RSp}CZ zLjP))5Qo}^K1F}LSEx%kRDHiN0Yxk-!>bMm-;rnc!P~oDC`9E72VR%Z1&{QK2ZeDO zwf_X9AS?WGRk+N%n{^FyV@qJk zQ{2Ci*9DZ{NW{bIm^+o{TJ;$>1VP|mcbyl)hx)A|p#Wvv-q|p`R0!Aa+!DT)NI@YC zE*8Gy+2bS zQFzv$tT&(;fush9U~@(Cf>+xdL{Qmb^HUg1o^jx^mHfeh9U-Kc1DT;@Hv{z1VFXnY z2JH+dx&eJ3No)qR;|+4rfEHCI%{T=4RmdjZz+RP1qnd;$ z)JyEXX)W@ES8Q0Dco|up>X7ri?2WqQ5y{g*xZB7VYS$yjc*U3XNE@TOwhf58vFCa; zA`=WKuL*fzljFPc!NER=t z-%2Vk4ov&h8FIovR(l3{GF+K+RX5+>tcmdr05fiAVyY_uj=uzWVQ-$rZ{_ zXLlo&@UMQU8)<0JQ{ingiWg0fCRJIL%xJRs^$j2M4-D!_HgaP8dXbI9(|%G4cOREt zzg)QpcN>o4%sZq>MV9Gi6ULcpwNYH26<6+K7OSrpyRqWYeMl|d+VXm_%8Ix2Avtag zxi&6BV;NKWl0m$_@_Ky>D}K?J#PRy-IFzsUle)bh&KAwtFjxPzKWSym(1Z7gjj}xW z>LU`Vzc+x~7Pv$vD0uYlgGjK^0!vF=3cmV;l!zQv;Rw=}>MOq@%{Uqz)3-!&XcrtE zO~S}O%iwSJ_t--4{Fa3I{*AkiMpfWCip?FZ78E8?-x42{=FU!rzT-(d5;H|l9Z%j8 zUZ4Hq>-wV!$04e8w6Wj42^KoT6UxYV}O4-tuRxUgA={V$lCkI|pm8 zVzpzoxFW~YeJ=Ab^|)86W9mPv7hv@`R^9Ge-HNIItX^!77m|v<3zAe@u4{wJ zm~u48i^r+4#l*x+XDXR3-%O@W7hv#E&oDhcjU<<+H||gnT9E)~y_U?RC9zYv7e~Lo zmV8s59Gn5~ZzW61vaQ=l2w~YRcerH3^BrUYjhmAU<98ApS-45xy_1X;NcIY2`QOjM z)wZulhL{}Ekz|^=S93@JOJMGb#A?1c~Q4%1JVr19MKAb^bX? zcJdtk6v~08v%vdk;~>cWoebu=wN8`X9GG+(#T2ulI-Ma3CAaL*6Ma=M^c<;6Hb3N! zE66@a0y+JiZXo^lFeO}v6Jv3*s-7nuoF)3~^JKW-7(n0!vXb|(`vSSkfer75`02S9 z$pb|wfe|~D5dGXWGR+vhz!FRPYb^oa24-F&WN*ZI4L;2YQr{ zAspCRLb`Ln?TI;yqn{YFs5gE}S_r~Z82QYYE@>ZOMOwn`SeT{K^*pP!MxP5L?IqlsB>O^lH|k3lBK!Qr zjYfFq$0XplhfcwAf)Fm)u+ls?T7#y=C&OMhTAc%T-RMTT99t|ePscMnZ@ANZYTs*z zm+mx>0eVFb`j4ZE#=@P|L$z&f29K%0_7Kf{3l`ouGF4dbiKA?1ZD?g>4= z_pJy&3E>s==Yh04evH4z!`s2MJ54(k4?hRft|V~{yxqXds!LXyU}y{TL+Bm@8W2WJ zMXOB&J!9xQ0hQ=k1G-m*{(!ppmMJi-CS6DKvZp|3ExMN4w@ra#wOG#fDKN1%-A(g$ zPJ#AyFvq?X_2W8NhiPKV>#`gy>Qj%NrFmFXw?1pNV+s^7z>Yvd19}R1@D%vGA>B*! z5OeKDtOzk*;sD}_Z_IMA_jXNKb98*)YeEl`RS#hB2RN|vO(_bnnESAyHL@+QRHwfvIXcmy&7iXo<6AVU$bBvnZD~#Wt6c z9_?w7vrV54MoH`=ITSW`pr@TBzjQ2XqpO{$rHr_Goy&?KzOze5Q@Xg6{Mp5&qnlk_ zO1ivhw2A0OKXi_AVK@4O^&Zj2Ed+jji?(x?_`L1Xh0@&x(P!Q1GAG4Vd(ddI>pn0S zKcw`ad&o93@oh9cM0VWQv1BDBY3CqekWZ+t^r0sxDU8?8ze^7aWZxux#d|bBpl5%k z^Q=JuaOQpb2AO;xp1n_-xlO+B_`FKMdty*U==TABUNHw@=m)eJeS)7#p+EJ558f}Y z!u53l-Y}rFi8oyPfDY%3kDZCY*B{bB=qcD>}`dpFKM7q4Bl~Ci2mJ|)Q6H|nJ{Y@%_K?pq4jVY%KrAO zCaZlvr`UF}T`jqtyA1Dk9lyOqJey zEZv1B+YA^r6}5qyvGfrwm=UkPF^TpP7{v7gNS;jn{4r(tyh)Th*FBNNJ;{ftQco-V zF_{LE$!nngLW@=RoN{5O#o^p_I)Gb(tr6?yzrlC#buAtLJVK+oH^a)8H zwu%z6Dh)DKlEefJvLvaBd*y-QK_dOFNmr2nyj9ummf*|6b}Vuig~xN)vR zyZ7Y~{Ye%LBhHd0n-RrfL%q?z+Dvx|!gHvVP4@~fVMD4V1l+e^g+y}$w%V6P9{ZfV(?s0J&o7f|Yim z@H=kmTtDoh%>+9{#CV0k@m;vj*hqMr7npLkX^=yk3QwTNSyUOP=ae59SIv%hWS2R79 zA4oznODr>%S3k5D7cnSxMY2P83&)k4`q;6K)smK+_0?_rX?=m{vmx(VU8|mOfCdTP zF`H9do80>uw&&7MDP}{ZgLFBcjl%~~?ZF(q5u~Na zoYCG#P-#Fm%~*-P>jpl+zQOnA4R z1*YfG{{Jezn@8IaGzsdSpf$<%4e-GUT7_g~z?2ho1bMlEpAm!iN!o{8G!s)!qM%u1 z&f%XdQDlCVwo|CHJb+zyP%plBicXSn^*1Q)A&_v6MhWq7Zveu@=V+{u4qk8LK;zHj z;C31M8|*tzJ7EJ}Q2mdx262DTSdwUmT}zNx?@9sIC%?oKSygFTlW)r!##JYjd!gS(}s?&gUdf)Uu=E+Vi_i+Ap*5{y4N72 z+XIxa4DrJUbOFPuBSm-=y#5+2v7z!h`5(H&7+3oz^dhhM##1_z1DQ|hwlXqepV8lV zO})!YsuB9@{N$8(#B>_BIVI(#*gG(Wow%ZpD4iWsFpnFa&)DLUlHm(M4A$(d)Q11V z96{Xi*(;Srtn6b{<~t~oyur?OQiYxj6)W||(o~Lt|Bq1u>{PcMXBdL*#9ie2j-LIn zx~H3)AlUNm>X}4DS6ue|WPK|YXEAPiFB-)`e@XN)20dI6t)4h5=FU}ZY}V&1;(c;; zi9SaaR|;VTXJ_MKkF8dmtwfkSF1;o#7pa7cThhYitu`#vds)OnJjTH(ZsH*}q}d33 z$TUAZAa)o`&M&Pvwn28f9Q-?zoziNX5i zKrxM!ZKsrAu>}ouZF`7~rh(BI)UIL`a1Rr^I1p6SM}>(w5=YR#huBIVSy>$Z9|#(o z2&}ykfwj6Tf|%;!KG{IfQEUZYd?R}4$@Ro;|AFNdGC~@;Vu@|^3K=mi{{LjuYU7H) z-bUQd$#jEO);S}wjuhF*TG_{aZ9fsTW5-Mi~1 zipWnL9GQkzKb|LkDzF;*z*I5U5D+zf5?z@5v!BFq0&5CC zEMsbI8qICZ(aiW1N^;dB^M;5tBWM>*^<8QcT4b{hN7FTi# z^ssGWckUL`M{XBu`f@q;^Kr2iE&4SPq8f$x!-M1E=gj2MKg<(Vl|w`F#W{j-#c*Q! zo)-`EW`*a)WTRPHsJ}k<57AD|I(nxPHGs0U&bvi2DaNNHLT<_rmmfIlCIDP+zGh(4=X zVctV=JgWc9T7deG#3*4WL_9*+&fr4^eD{$UCoF)w&D=xulz+qo9#NrJe=aVjWaecI zs}Zemy;O|GI!qNxc}I#8mU8_#B}EJG*-BNq=rVI!gc|6N;NRwAtPl$z7b z&53Z!Q)Lknucq+kGIsEWSFk!wcb(5nnzGp889X6g}S%79hP-0mp!XxPG~+wj5ysTBmGu>C*!w z!9m1|Kf{dnjBClpgXy{9aM|gil$^AZaA;WL=P?b6`lY%kXo8rBNP6AJu6+ z-Uk!2@S#--=IzH?r6}HPmsMJ6v=5O!;`AZ4e$Z}=q=DC*8eZ@$M7qlRz7i_ssYoV2 zje(anmCA5AO!|_{S`1O|%U1Y2T#6!pnwxZgxD*S$+o_@Yrx6nR{+MZ3;|-}b$-4_* zydjlxj6*9)tLX1|Mif|CO2ra=V`XWQzcb5^3hxsEi5kQ3&HY*b%5?u$gA{$-pmQdD91+AZ*|sMl>E z^%cBwOtXWBjk2IZJW|c`dN%aA2tYm)nGlUwd6*ObVLm)SRdL}YD7uwbv!wip5nRlG+5L@>Pre= z>W?}|ZwtcDhEX)AlhljMc?=sKphF|ClXQv1&S&=LkK_{CEA5b1bm@XzL0<(&x=7h% z#Y-5u1Kk!&yGjG;<@FLIG**Kl>`f_`B$!B~Ze3Ct!h{|;1qbfK?jBMh*=;&Xa-t<0(M?3*J*9U^s?-Y$Lo+1sU$ZSNR;pnEX{YW0!Yu|7CmGy6!tIXn8QuS-Wq`bxi&g-Zdo ze=GdlPilrnBeRb6hy5f!!7C1V02(Jom@?Z!75hugMU*bMQ$AAt^r2{6$lSF4dZ6@; zA&QCyNl~Il@m_~>%7&oc^i%0`l+Bx_v)Jt=4j=?FH*2y!!_va>K%94ZeYB(rW$L^4 z7%3dBBjk017yE|ky}v`&NG{xmgmu_c>G#q^!6TRXW^lBKfT{npe?-26d3xiqxS_a3 zFm;?{XIT(9UTVsLUgM=5B5MdIwyIXW?gXj7R57y*QMLo59OshB(sGJ<&}E8b(|A1_ z{tro0q$ji(HIewK62|*t&g!XBWtxw`si_hg&4{X>2ezfL7rJ} zHi{MA&1|W1O$P}qE}GG-+KSDgIC8ukbm=YTNa@Idk;1EUrOIJA8uR#`hg+&B(p#dM zpUO_LaZuoWND72@@sh6}&tjV`O~Cmw@xc;Z^@XwVQeBR6ZM;<3!!eDxli17^#7kin zi`dyW-(3cU(GGeb&@OfKe&!5X)jHh`-Z;RE?GLumoO+rs$`t1;tBNut_He+R3hS(3-HqmEf^wGr4@X# z52Z@=c?FD{pF_4ArZW68Ukc%bTZ zX%us-K)au%IR6~%GMw~8qxv9=cKrtDKWEu&{nF2pw@MCfMg0W@#nu(DI74cz4@{RZ z1gI=m$J`dK8LV1OXuC>M$gjJh%PQ$8S#=!(R!jBB-y5LoYAJ?X+yodO5TX~YX1K0% zj?;+zv=Ii+5JSMW7Im#Ph6MS3t@JTDe;F>W#pWv(!{9~1R;am7`h-k>z_>>VANcI` zlHpMLDpUHFoXX(WLG;p0sS70wfb%o>^jE1VYP8Jvrf>aK!oV)3S(I*)W^=7(?q;bQ z&A^4fuvv->ODn+bXN$$q2`{#cwiqUi`Dv~#4nc_hN#&BdtuB2d7XKb2z=pn3Fr3h( z8l<=sUg%OQPFSmK=?j*To^57a&z4S!1%IVr1V&*5M{#+Jlt2rXC&M>er3W+)S>zYn zqz9znFBq^LBXZ;LcsO>u)SmOF1KXvsB%=^I?7%imSIpmmYFg%*6tM1;+R~U`X2XD; z5{4gO(Se;(OIoxnS(kQ6m-xZ8etnO03(uAuCjenFPe;; zU_ibUibXA`y(|$4eMfvaEe?m?*^=cgMFn!A?=YW#ChnkGDh@rR@;tx@&}>5aGsw5E`CP1=xh zw#+gx&8!fKa;G=*Qr%`fG7rO=LMS-IjD}^&^A1au!wYyLa152dma8~@)Z=S;vB^BmqeB6Vd;v-pVA*3(Hj z(;`iqV%|~dOR)g(<1Pr317KXJ>;)-DQ3ox!43CdWZM_SfdyMlY%r4wrJ_J5FCRIev zJK-39)=WmF9l=Af1IHvkp1OQYsujd}XgFc3!gNKXa3Y^6R2wTFm)_(?Hg7ifxU{1V zpFo_}3CJJ+|09JT@{m=So1q%`osf>BZ}Zv-+~{cqI&P$3L0Dn9z27{Ab9mU)sD5FI zji&0a{w~FmC5D-)r~fYX63B9wUD)c3G)BZO1n^9&P#rFxkt$Tdp>nxkGu)H>sEE1y zUQ>%Jo<&vhm94t%tmNkr!xxuDU)V};&Muvm>fx^P%$FL3VA@sSRKgt-j&4s}C=*Q= zdL5hmk}nOlX26pQ8hg6qfM${kpSu>74^$)4LIaSr+B_{Y<7B)qtcIX8ufZ~2) zUu*y@ynx#;rVwsikZL&_w7Dp?@^bD)l+Cyo@t}=aqd#3C-ukAC(pMr`cp2&!c=|$< zE0V8AKHENAPTKNt`}DgaHKu77>=1uNs!HMtVB(*W9~`|RC5K`zt67Zkhv6ig@+$+i zaWbtqCZpnKyk*g!l9jcTuS%8pm}*}|CT1^yRaYgeM;zlRMt^L)zh9N&$@9zb={2d2 z52uBzKx}muB4sct-aS~)xhDCL*C{QyA$1N!k{#Hb1EIE}%h0w+`pj9%Sw$d{8ib^> z!R;uL!WoH|i==yDnR_@6)x7_~_6IvLFtf{Hi~^qZi?^ijgB-ot9DR+CAO@w(77c-{ zTaur~%h+7%CvHinMUm}mL%i?1EBW(p_|jdembc3{jDtnK1;NEq6;f0P?Te+GeB$cf zlRDz2)5qMC`YZHyN3FsdRX29 z^B+n66Vvdpz?R1PM6=aaD)19?)M^!TN8j|`S zOsw|*onMy}+8Ob|@YVu*Fx-@_Z(d?D)W3}v z#%}zB=0d(B74{fYB{LI@vVM;xf0A7QBOXhB*5w>I|DR2bFb>(Xane#$0BMhow=of#m!M+LKK!!jpHhNdKgab?V`WUQIb0&8SYKf{ zx0q~PAQ-H!0R8LWEMsrZvnk~w$NbYioxQph)MNzIn^Dx&U$?a)A0@0G( zE|e=BO#eVBzSfq(kUNO5Ayw-nxuYBZN{|91MSm&DN?EsWsPcDYis^>UR%N^^iHNBt zx21LjI%;y|_qbZZT33j37)nLNR^*u2vfKi+s{fsvkGGdGRF-{QE*SC%ejV_eCU+(~ zr=Ml1S2aMkOxyuXrcKOF$p39<{V7iA~pB;_DHV^q-T5#MB{+@CoIq)}( zipGBTdtz6)hQ43LOYTE1n>5V#lF^BK*bZmB zwG6c`kChrA=dL_RoLiZ5i7BX@2=MN1I9@eb}GR*S$WC1*CGfe!-Y8MHWN8WaV{ zEtx>js|3o%6Yvq;-w?cBDaQoNuPw)T+MU`85@=WnA<(gooFwcwxYa*(aJ1LW zsp?Z#UQ6UEw8iwQ?qZ2uW+Jqa9EE|`oL!7( z@HS%z7Z^OvAf#nuY;evT&Vt5rEI(BfZdya3RTDXo{BC+eziuKw=Sw-Nsa%U6prkdG zD_i-|0y_sW^b5j-DE~m2j6#*T5iP-E94?p}HIx0`%`5Z2=Q==Yb2#xML|X~VHSD?= z=4$1trppBp&MLf-Q=omo*aMrjVhlH0(oAmTjR3a5JY##|kst4wG)GpD=14VfE?49O z=+j)rD0qWTD=choj_Yu9xpGB2I&{;`D=p>9F&%?#Smy85TF8|vIra`(YbMBS>()q? zzoA0pAlhD7vr686+_w(+9z5Tay1uwQpqp!PD!6LMR~K_q8C z2+8ig`r{Vz7=ddNBU{Ns$*Jo+bO)Zak{2V_8+^y=3u{`-cxeNv+uvHQ?B|?Lf-{8s zDx48MuZ>)RR|#k%Uv}|2dA5~ndGlRwa95;=DY|d9l`DJXurJN2tAh8v%GIFwF-FF2 zZ7Uz3X?VqDN;|o$SLSZ4hVqX48ZZGD+sQGcpcEURXY=bQ*_RZR!t^M)HfM2ql>Eu- zE=G1)$^&PnsMJ6OOBQ=teT-xo*GH5?Y%=%eB-`XFq@)zK+f1ytZU4r~>;x8uRPriT zo-D&!T&gc>FK<%GN%N><@Keq$mPFv6p{yMnNOc` z2YaV?hvAL<4| z_*geDAYaISBC7^VesJ@HdSA%C6q9;m^{{$VW{0znirvp(HY)5I zA-`uxHzV&g91TXAI8M|Ku_g`5_G`gkG^rLLIWRGHXIQ(&#`9jv$ z@?RvyJbT>!4es+zX0Sx?Xt}9y+fY76j+Va`NbzO3`Ym#dhnK-?jO@>2-K&q0hX!+U zQTYs~?=mMP3mfc+5``kIu-;KKcZ~c4EkXZthwtPDv>?w8KYS-Q58=bXwvp&!;jJUF zbu-=?-6Y4qlfPu{l9u1g6@&PAjBc=(JF|O<8Xeq@Iz`4#>->4Z$0MI+E#deILHfDjz=Sb9gLM_jhY|>o4lGa z@`v#GL>Zr7K|5*hMENr|wV1n^W$0I9WH&;xOPM}brAuxpZUycmX0juPUGC3eS-8z` zGqSu~%riX4yue@*yqT?>LxadJ)dxgELh%&2b<;eCi(#oY&O~X; zXIaMo*e@$wu27{eT+5$EbvglC6?yrIQRxt$pMYF@@n`7t@nRk0iBE55fAjf|DE z<+kLeX-UyJsAtDLG|pR>&Oy;(puo#oK@gtiB}2WLvPD~?>fjQh3Bv(RsMt( zgw2ERN0zerU`D%lKJvC7 zmdgR$kIn;DHZGSBklX@@s#zZIAFPml>gKV}+L+q{2C~h8PJEtiEPg)!@QtI{0?1n- zM>7nOE9GMLm*3^9nlAg1hqEA|iNzOsrpq;|@J1Z1q3G1Jm0`ymWKor{4_K0p+Eji4 z>`0gUx8Qx6Vg}c}8RO<0kHNP&0w)^7z+)Vc&24ms+&a`~&rCkfcNy7i|I}ltf&y5b zf!`ZaZ23j*?)Bo86HLq<@(YUn+yec?FLDIVb^$zGg*Gdj*@)HXW5F6@SIbTL`fa%E z5e}zU%ad5O{%hnewT+$`yAKz+8qC-Z#yT71^J#Q5C})HmTO$uZmB4Xn)Z5y`BCj=6I*YHfF?Ud&jy?5JH*86G(o4vc`$gxoPnOi8V%8};?U_^`c z*UE7TLWNQ4;WiJgqX zg?s^nj^oTBO5xk`zVOd+v!lp7IgeuG4?N0~FEZ;`KYc=eNJCybkh#m`OH*bT@k52{ zr{yn5nz4@h@H286azA9&_{Fkt?wADqjdSv4!TK5!lt1Olt0ofWi>m+){y@Lg%A+||eJ{zW_;wnO{ayijJ#dcnx`lEiaZmvx|CHb3X5`U7 ziH}8*>f#+?R`- zp`E(#1IFc;Piyu=xv_B9*q4_d%2ALs3U_OpM<^39>IyGcI%T5%{1LKbl9&iRBQe~v ze~F`VHbPE!Wxx|mIHc&9C&;Re5UpSs_(BVVn@{8b&$SQO_r+un3s=DVhwU0v1WPN) z8=60ry9uZmU~CvHeJa0&J2IxWZ-`$0nY_S=6XTJoyPnIN$Sl)2nfOA!M;@4xV#!PF z{t9<3%qvCPJqEn{d56G2grPxGj5XYe5c!K$7*BIn#;3$8k^JvUGFszo(E42qUY#e|i7++`!_mCll|bPy z;|5YEcO~&(P8z+)UFj;~g9Cg5d-y0-B_@^OhX4f+)=i{vG(b5`W6sakR|G0w;HJmB zIo?4E6&k#@)tSLw(NM>jc#2_xQl{P~ zM-RWX(YPVrs>2b$qlU^ZT8y;mjg+rQ$tAeAypAt~#}NzI8Y^9!WK1^w&n1%#U_4{_ zJeS)TOkR26Z5*>2lUxYH?#9Yej`p)AN^3Gd*N6(<-9!l_2aLO4@VJSxiWFmq>~8($ zrivdanPkZ0f~LwFv;=9An<>><6>j@?Xr}n`FtPWVDbs^oZl}(G{9zwVAb2O& z^97IQ$|N#p8wQGC+}OJ2N(eH_%_(rKrBazI9sjgc>Jex6E!!Y&HXS_~z`FjtjZ%dV zz}`mDdCrIiK4I`hTcz!P%?S#AV@{0k_CM$3QdH+bC`}rMmFHZipW3l`$-w4|3b%SQt>;UODi;ZIKfl6ug+lc5Xsv1>fOdM?Gp+ z1+Uzl$4g#al_Hj-?|oD0EZ`+WCMKcUTgtYwsMF_fDI>l3(b0$xl_Ds3AKApW1MmxW zgq{BGnrJvsu{n89(mDE}KBB2FXE>BQS(PH$(U6`O$COLSVGf{bu z95gN6u@iCdQ_#aU9J%KCiAo1D%S^P2!4k*0(odMcsDCakp0WaSCiVWY$^@0-L6v@f zhVrS%d$i3}`jA8u&8E4^+ho3(2#;6V2q(DnSRWU!yc8UGAT^;3DLiJ0hlU5dZ=%wL zyfEPHiMW@yn<530a6L|#9_q(QN)()C(eizhasRwDeA3&J5l^fs2!m3TyZrin`FYA& zH0WQ#H9*u4Uqanfd@%rzTJ-6uN)v&<@{u!NSrOs%$V%bjZ;_(;a$;NL^%f?BFsOFg z0_7^dQKAo9sC+HZ-1ubu$|7YNVGy9^9R@Sglx}6I$7u>4HKF;GwnUkQVw2ro*1Il6 zVMS6?jc~^?%akVk1Q9l;)VnT%ul5yV_< z%D5^=l_kVk@7i(P1CDwf^N{O1>RroI3d->PdC~=+?NnJkxN-`omYp%A{*IKgIHL^bchi@hL9UD+0~|i19OR)Ia8_wT z(pDIGw_zj<5WbVG{d0CaiG%AD`6xDRU-B**Q4_&U>rqy`#%)fP`BT@pbVs`3unT* z3x+^sv8DcyQ`I8Dy$cFD0&uH!x~L3wf6DC6YT-297BjgNc3woDlDQbpT~r$JI$oC) ze9#qoUQ&#}sjn|7QE%`zF#=8&8pWs##R)ixsB*LWJZKHDBN!-b<`DpQE-5t>UONtB zF6Vg$!MDuR>U&vvM$wvq2w4n*;RVW@*2&eqIzW*2DS-N^`#2e?3sr$#3Sq z&3uSFY05K8D0n`?@8rIrw+}~{B=8U7V{+DHUk(0II@2B4%ea4(MtF<9=M3KvIQEay zm}kn5mHLkJ_dbtJF4nn3S;iyh^*c{+nVpYuwS1ujaH2*%BY2Z%h-87$EGrG^FBODr5u{*rQ&T^%rpIW?O@68K2|8Usgiy% zSgj_LV`dL;M5<9_iOGB>MXIr6y{XGZyrE7Nob`UI+Wp$S%#DN!H zQq~vORG-M?xpCU1Z*HK1#7^t<=w|Ad0zbFg(Omt2jxfbkVFt}3=syYi#T=r(GNigE1p5B*BxT_QM| z+3-vdlG>;p$mFHQYaox>;6Ubbg$DP3TeU4&VA#lz)fP*BGT0~hv{R#mc?P>3)lO~3 zgDuvyQ~L-PxfugtQ7T?nGhZ6$6Q#aOIBUynuXg0)C~2>@=J(>7bx;@bU46EL`XPa5 z#uIG4I;zL{cYUviTd>0HEId+V2clM}8|~)p#|{{sJ}Q2W$xbKZI;oW@9z;TBC$%E` zkPdfJt9!rdv10Xvu4;9?PG@|~ksU}Te2cH$Pwk=xathPBs8Qj@VJ3f63mI+Re`4rL z5taUSS9Kym!80frUmCmBO~vnuit}PBq{4?$K%u-c^fe zb&%u2m~n+{U$k1YVu|aTR>w8Put20D^Cf6K)tV&xsNtLG-BbNTSk60!w|c2j;IqLu z6jmcdR+y_~>5Ut4sj;&9FTGVf*y1r;@2Ewu_Is(1I?R!y59+I8T*--Tc*dvhmiTHl z{!mS1V*KETYCVDPDR!8r2M$!Xi4~o16(DDw#2hUd82n}X4ORKuAFGL!wTt;&T~7FN zSN&2=p~bkPIf6gFRK0O#kOSNus_x`K=2vQS=fi#KFcn`P!egzl5o#C68HOJLOFbH< z&gJL6CstsL^3vhzkB&-HIF6Mg)YBZ8Fj8$qGac;a_mOH4%||`--bl5UlS{Q4rFM2A z)0d7?dot^TzZl^CjT$J-fI-RVnCSeC`lgU-u*3D=xJu+NjZxc?4Q9#QG3qpO>KEfmL4)tq_IPRV zE`0ZcT8Yizq94=_0%enW^+(lH+s+Ems>?{=@^Nqor$+J~- zbRfstJzK5p;b2tgw_w#D&Q{y=9oJ%xiVw|VPWBwNW5BIQ?afp>aw*n%fnD{l%5j8~Eli6D=fRmaP9sYP zqP5T5sEjVAGU=@n)O^ZJcs(EmHz9}arm7cZ?r%B1SZ!c&SYF{2+F6w_sF9|&A$E)# zVjhp2&qB+?j5M{i!@a0qOH+psjwgDVdIgO$JZEdXQjH`jOINFq?288K=ybI<$u$$)v$8PVY_KI=UCCR1l%Y0!wa%{@YDHG0=Vhp~ zowtI2T!rlYqG`Bgu2K((NEZH#%4g`3oWC0Tag<$Mt?m<1~rUR zKWu}F4|-wFx(#Xw2aat}gJ~Y-aBn2psD`lV;IGg&+o%Rk#3EA%P;J-{u_8hUDX7^d|2gRwz}NuhSaBRL1h7%#^G(M zl@@JEfm_?uf!w9_)^>FeUinOc_1iIrz1ZTt!vwx@0H+;5)179~d@w6fNMEwg2-HN5E@b=SWnrl_TXmb^}Xs2kujGQxr}w0l333;tS*rp^39O6 zqfe*-tm2##>U5DF$dDi{UkKJ4oKf#dBr933d_gU=a6?MFftm_Cq3n7??a581MK@Hu z{GOPsi$y9%Dn13zTWSZIVG1?)`j(nW@=U`g>Myl`Urz;L9tJVCzpWZ7al&9Pe<-N; zh6Tpo#@)+Q;>EYsFSzQ?)#dOzsPeKmYdhXi&l@r_@~&DX$SG~vK~4@6x6Y@5KDw(` z5=fSL`ntSWy~Dk2ko-W!KumNU*L|p-cJWh(JXXKvhKio}R2?gDRh=KP)_RUqGO66@ zxr&wv0{PF?HQa!i{sNUfM(v&#$Sl#~nDnJC>8hz|EBJKjr!3kNfvmV;gqGbZuLY80W+L2OTPfT# z1k+V_Es7j84W;%TS`_3=^9+Th2$A)sA|-fY!VzOV$Wx0YF}sZihDtpV?WLcgIL*zf zH}=x%isYPW)=jE_jc%F(vydh3nu&IPS`0<7`1%W|>3OEm&LPaw~tIRhuc1BZ)em`_vc714EgBv?|&Knm+@7 z(x$40muv9pQFhwAt*TaoGZH(x{eJxl8sG(;XjY0_;kPjpuTf$YkTY>9#bpl)2+M%=4MdWDE;Q(wEfI+yzDk zr)h6(&G-L=JMe$N&E>I)8$#=7ml?_P>f*3d@wsU>>{fMMhCQ~fHj)qf@46bOe0Xuq zaCo^>&Ech*03RODbq+5)-Ii&Vvf*)cd(@2WMmG10S|AYxoQMi=zJ*rFG55M} zOAQ~zk1I69UZ>WYZ(X|?gU`-x7-+^8@N7f2q_S)SOeK)wHA1z6C4V|8JbO{>pI zxn#pxwNEo=wZL^&d9HI-5p9Xfta6ym>MLlwwb$$h+V+Sx-+?y61o&d{TvxO?W+_`N z4*wf%2Q7)CE$o13GviEZV@!af<+-kCQ_WI_mc#!-+r6XKo1LB07uJn zUD4*5r3@{H|Ap4OlNQa*?t2UH8SZ+PU>U+s)|Vl=lD7p?J85`h2)Es@ov_asb4G1> zu3sz9b?vjrBh3C4W%`i*ZP&oWAw2iu$+hj-= zL|fvR_*~bC=ee$E3tT3i!~a5i+JRQiL+n4*~(x>r9&|`Y370G>w22x9_p!0(s&09 z1@!5KVjYukqn8%O0j)QF2aMu@y|up`)Qfvrg>uZ<-1x8 zxn!zFYJcq|B`-GuKKE(WD}AWd5rFJMp+9nfHlOwJ)z{6_`~`B+^b=nJ)acC7Mx|;8$aRzWD)X`6 zs4*o|=cD52=%CU9ZD@J6u8_DAw-`FN;lxUY zyMJ$nwi7+A>;+$a@h@7m5P^t$M-sOmT6;-0m>%W#&u9qPZZVvw>UpgujlsKpP0k}Jm^-+IyDxlmUTf`*xQ!db z#xDXqI}5wdYkgUrve=O(e`wWMbA9k1+7b-CKuEfzT_gb+`0h&ti8{x^c>K_`#-uHC zi(P+GfV+TqC|yA{iuJthigwn)h%*1wlKHij4TF)rzjsyZADM>_%V2D{>)YMNiFzPc zgY1am^i^#&Wx(WX+BuT3g-4O8A%@od6!&v{^jrUpb^v_|U3G)oc>Bi280 zw^a7Q-*)9ZEj`S_IUwgrayTZ=nT+z&a7$D2*f0Y1t>Kng5>3UoOuAHI<3LZt$SRg+ zG!v(3cvZ_`g+Wlikyn`heqGBfd=M9tWpY|=X!)6}NZ@ZN!*2~OXkD5wz&vee=|nb} z>~26K?0*%$h}Folh%7U#M*V}v7K-*ZcKuNk3*I0?pG#sBOFkhx&F?d=Id8@Nt2dfk zCJ1|tV9v=cEFTE?j5{8A;q950mbPTq1O8hO@Ifm}Eb>BjT&F*4W$8tPV}|`bv@I6w zGzu*3EV|$*xE$pyfC)CsaUS{{-QLoY=3-#*Tn6MJaD)NuuCk?rWddb)(r0yGIq3g5 z*uml@RLy0-K*CR!99K;z*z(Lgyx||s%rU&KzPXd-v>?3H&vdqIH^R{~gE-ATv zpZd0CyGmp5o@u|nmKHP{XFIvC1wUWR+11z5h8As^KChqU&E_S$neD^x@yD=76l^gD z{OSu&?D`cyC}&DzHCr(@O3KLzhI&K%{Cx4}HCcvn6%Xl)If%aRXTgDRsh{QlarWK; zQ5{{}@UydkxVP-?U63k*y^FmYS&cE8Sfa)jTVhPHmn6mt8WlU%!Hy-0Mh(`B9qc74 z_O77DXw-<^sFCk?=H6YRfQFK#OnDlm!c{Wv;fJATSoah`S7!|rPTFCI&0<7pT z|Ej&Mu$T~GW+l13EtI8B;r+Y#y7Y7HZHxS^8!=gwr_cJ__LG(UGm#Xnpx)HOcFuCa zfWgJS!d{&tpl!I`@hjUu-~nL+cI;_`!#TQLX7_^g0t!^_ZF^)*!#b4gV=ERe`UHtG zV$4(b$T6`6hHEIszv*LZVx^I9?qmB<6@wJWx_Dz(`q~PMG4kkMfziBnAIWB=kGg$P zGSJ}z1(lId%OT$gZcG%P)fZKv)fLzK+8~dQ=6~;pPKrQ(TRSli^#|BW+rZK>&=p{|x&H<&>HQm{)5n3rgx8sIXO7UR>VrB z&{_@uexz$nG0{eY?`%#hHX(2Oovo}G_}K4k_1G5UrAWX2oh?6J7LfnfU|SdkboobH zOR#N_)OCoF#7B4n^M}}iMV3CqRwn{wj2;VXDniw#2u=zqDq>W+b0{{7X!7nbTTHNL zp~d?$Q40=~qor#&9H5s17l&gC78GmsJ;XDcCQq(dAo4oZm(s#JhSNBGNpVVteL zs46SYHYN;tVrzoHAr9#Qy5OVHY5FE^l#Pp$VWVvuL@g&qV{VY8-y03+B=Yu-v0Y%> zP3XOCtS!cJ)j;1u#{pixHtyLi;{Y$&E8_;%mrt}!v#`geWI&tAHVfPc!H}=G(&DDt z%7vtop+sY=rR4_cj2)P2E8>%awAq8B!+5h$?7F}NT);@;m!*E1*(GiCd2(yV=-T+}0Mj z^=|$!6-IfFCE8-yxNM>Np!b?%1H&-|rRUDIg^R$Jx#nm0=fa^Po3Mslyv(;G@YrAQ z$bNUe?FS1?L5WE0LR_R~1p2kM@2Uv7B>18eDufw78w4V`Um1qPVWWXN;GrFx<$JBaQDrBZzSU6JYwJB;YD6Wh!0y6^kWIdj~V3XBxc4 z>HDK=_No?=DTdW*ehPD7G+ zeEom*W)|UDzvihUBE?%r?nG5sm#0Lpb>0#YTv?x|qT%cF6x+HU#cr+PbvM{@D>||v zPYM5xwz2H?S)Q;_Y|yEE`zAo6SkE%cn`}eajjO_i8eg^v$0`XfyhRxbkS}lUv)Km5 z0=~Gg8J|)B$t8Ia9q=s$v5$2mQ$UoSrDNmV;Ohw6J4!{;kn`g=)eDJ$DDqyatrW^E{%YE=ZTP4zVU%k)PEuA+v`7H29;8pdde~O#trVUP(ixbkMFuqD%QI{*tYc$+`Qj5cgASf?(l$~ICh!!%FO7J^Dcffvpq;isA^|B0 zr)?W4pnq`2*29?flykPe48p&W7i}d;SDlEh4>VXNZ%EL+XoSVk7M0yr>)-}_y+wKn{Bb^6^l)#4eWZu`TQ&U}7?Jr`cl2FKKY z-oZ6T9ZdSumJa82<9PSGw*I20=kMB@;jPekmTPz))W&uryp+Nomo)4zL@t@cQ@6it z)h#EDN!$DvMl#_D&-lw$g{>0eV(=RHz}B6?e1mXEGWVfP#)Uc>7VaK_Ou1mN7j(bJ zws!FDV@~(5C$>`VaVR=CoOn{XDp zCD{EM5;31Xvt5DdWK)i&C z=@}TorZ;p%f%Rm)v5j`Jt0s*%${_`VTUI~EUQkbUNYxmGkf;0iDYZrXErL8SU?^;n> z2#;ZpW>?0bexbjTykBK0g8lkvMM7nXu?>&-^s3S!w&@Y?R1N=2AL%8lONGE!c%*+= zLxR5qbdVpZDP5%Md2%gjt7zxT+R|$a8*j?ikE|=@KGj~ONWAd(*GZI(t0#TJO2)4Q zS^zHf-OEB-G{J}_pWTv=uKMHN^)`$#YB5qdmXyt7Vx;O{yr8)hh@2sS@e{qkHwV6x zV(w6r5!7N$VI~kz4f)NGA5ZLa(+Lo@5-XVMw5xzCtv1jU07eA$OED6-1F;8T+`ugr zs)c~SLp-)D2D=m9N$KY{%LIGM)Nm)E3@`LqNFdK{UEayNHjv!x!B)PkfmDm7pX8bJ ze|8!VZzxr<#=&tPTniTAx6i@1-}Hvk7uJ;1P{?apu^B(=W z$I`UcL3-xf>2C;~C%etJJ?W(lJpVOi)IvszC&Ng8N$E9_ett&+FWX3J>O%#{HccTu zw~39<)P)?zy(m-()gbXMU!8bGo;CNtY0N+8FjXJ^CEraxap^uR9w*d>ArNz*kHbqJg3Mt!H=y1{(x{n@x{jg9&~G{&7=Y)GPb?F`yB4`o)jx)3`zxG3yCC?x4&z=I09lV1ysaVmsZD%==A+B&!pKiEwA#AEBHd~+#HGzoFv zLe}#j2E3xaBG#aVG{KsIpmx`kAqWr8dAD_$fzwvcGwzoDcrvC-C+D+ORcr{1a&mso@C0vu|2S(U#Zx+*Xo}k;NaOw!Ebc zmV&PM{GUocTG-^j_^&!{^rW`ZGBO0zs2%!EbM|#RsU#&#Zzpx5|EKLFT)2~S_&4pP zPeqB{?WLI_(7uB-n(DvWL8@=fo;HC;b(ElygR+M^nq`Z8CQTQurhX>v0;dysL%N!I zr@BfrMBX>uq^1VqrGGBn6IDN~s0Q+FUr7C_{_@?Wcd#$?Yhrh)67_Facd1=~uu$|C z_Jz;Nd?^iJpFUDhCz}Hf*cfC4i!t(al(gikoBJcH$lwv)P69*<; z5U=*FG*-lReJeF!4-avlp17S>oX~&jiN&$TPMtZsw^S@V#o$sAGr|m-%o)U>qbD_C zDJS`4{HtlX>^54&-+N1i4ckDu{3`lJFlRb}d!?p|55(<3AAHwG8ePGFgeqH;@Pymod#SjvY0&F?shc$u zZx|WhOLeWc7XV-TK{{_un=wm(!y9)Z8W1aheFWOON!Qr!aAz~;$Iaf#~< zd&P|p;R0AH{E?`^y+rsr#cgQt9I%arAHmUdOOj;hZAv$!f!?W6T(ICu(5IqCo2WyS zuwhw3j~WG>kL}&fV@6AzJO#Fo2AXx& zxNG#VpCr4b$U)jYI05eSW&pAw#szCUi=|?!J{}|0u}(r@(io{2117y;jMT+)$k^}E zV^QaRgR%>^8$o@y)T)V0Q2g?>r8tl-l8Gok9b6;y7S5Q^y!SowCPCM?e?B z;1`)|%NQ^1VhN}Cvj6P{BWD*}N`Y_8jn`2}Q)I?+rxkC-C07EfW=t3iCy6e%os z!=9XCZoq)4|6{|Jd~3s|PBqHwFQ-Znd4T4qu-8$18i4H!xYn8`{TA}V;LicGamVg8 zRs+oXY+Q`Rro&_k!L7dv1{TmePnYV7`$JzigD`1GUe2E-&0}oLb%T}BCQ(}Jli|gF z3eS;3t*4`tWUMERf&t@&sA#}Ncu~8cg&#LK5 zQR0wE1(sMQ#k1c|=)jAjt(KSi^%WANXiwmcb=OMC2g98>%}_zPzDj~(#ckLj5gIA) zua?e&Y)zTOBi2f*EHK;CyJ7%uz9PV;|FIUN8T-p566>v#URXRa-g<+y%wwmO+!_?- zwKrn5lP*u?(>F?nJ@PFZrFBI!r{ll_nqg6HQ;;xEEQ%)xW081Qo3crY5^My%UY9;J zEY`!Ae*u2vfUk2!@l?s;u>vdF(!bdv_4Fo{)N{5 zfJ-cyFjXb+TJLi4GdrbMMT`X%zr+O{N%p2_*O*u`1@*_fq~9(1y(Qs5Kxz~0`NTNr z^;op19j9cS6Lw#^?Uoi<<1y<(!nn{L;7f_KM66P@=gYjb6VB3g0+_*oU7prGjvx5a zJyIEV=r+%wYOpi;qdk&a(Aw4a0zo8N`-{EORtp<9h8Nl|m1Rq^_{aODB0S&+{|G*1 zKTgRi6H@HmFXdo601E9tC_NDGXFpyjP>7#9B!$uue|$(PUTK-f0fgtBAA;9wCa|`<&JUSglQ7#?F zsqq+gsg(i98E<-WnVNy}4^3iWUxxIa_nX2e@_Z9_BKI5p>dO0MG|>;D}-NJ=A{l}O`P&Pr3+A;ZhDKH;2H5F0cbUJxY1 zR&c`$INBJzK)R)ifHVYjOJ0pyo3{kYO*c? zE6tu{;8j&FgC01zVHzKDS%MKEXx(3yiu;QT3fC0haa9WDWv&>Iz0novID2i5vhr2X z4JbeL>O18tQfl^9z@2Hv<)nXlO@cK{q<)zN*q?%~Ov#eMf)T*-dNz!Cs0ae5XGsOD z$tZSt0IVL+qhqngAgMqQ(-(x3CkQ_0TSowpotL;SJ!7}u@Ip7F*M*Gg#jp3w#?Z4~ zQ4qwayw*+dSE_?Qx#!cdlEMP4nm-;_ftcR#gGpClg?j(Jm=5&f_MHy8cMZY z`a>%IF3+0CrRUx+8VPA;3Ujm7*^-z5A|I-0AJ~NWvazoH+&IGEluI`BzA#=>u>D7Y0Wa zbSi1fM51q`KO{2WK5Xyb!KyqHNaY_;wNAz1f*?N{N^tl8PCcrgeZ}aAJz>Z0igvhvF!V%3|N}6R)I!EYn0zzIZL2vL=9vsQC|yQC&ia;p9KkN0h8by^(w^ zKEMYpv-?4lwQ-JAhye{Il1Lw$gW0ksVe)@va z@US=sgp;h8lT92-H0X{L3VO&1GJ^_@X}3re#*5vl=J#)HoITVAodl8VR`S5@W-ktV_KT+jc zs7{Zz%U4K-Om)fv3ohl9$5J!6=bupi3QhLQosT1~Jo8aHAkTb^43L9i`d^T@n-FGa z%wFB4$dn6)9rvg}L}ncp+y=dEpnTL45o=oB#L|KbOK7*?7dFA^b7T9vgXALE{`{*T zd9bi3ay>|HOE_}vV7U&ld43F*KcaZ^Cax%cJ6Ntjy$=bION$G;QHXrZ18fTLa-njY z{{d;LkgY8;efqD!W&#msFf))B+PGtL_~lSJoI3F`RIV;?vMOORyu!TUpN7eY&1rP; zs^Rjt6j>ZDe=mAhP(I`I;zhnrg^m7O2EjUqvhcOkQb{cM_Pi< zdGICL&f(~fi$DQ58=Wf2GYQFiTuGjnj|Q$!tA&~f&R?o67o&~N>c~qYVAV7)D}f9L z%wU2Ng((>eZ`#5U#;?|qCo=58o^|DdG+W(PlydO}b>#q-ki$3BmCI6QR$aM7d2z(V z4PfH7ba#zMeeQT+m)79CB#1D+tyWKl#gaF?OFg-ca3#2~p8SCb+^#1#v%;k!ulb(b zQ|PO#cuxlF_BeOeuIA#e-;)DL`KbRG7Q{=}msdr-eYi0h4+;1_B8M_W0;7?q_2o2b zOplT43e5d^jNC$C?oHhCr*xE-xaAfs(Y$w@4dm6*puS@F4oZ8O#&1qW|<|1H)<>w5htKmV_EQ;ert@K zh?VpGP;Nlvf0Ga8!8Ad8Ka}^<|AZ!pdrnGJQxryGho)FEd^EbL+!b;C_olJ~*Ep`_ z7ayC`*|eG5&Ki%I6Pg~oo5`I-e&Ob5CgBbLs<~X*nt*J}*pNuRqq%%e7`x#uaCcF% z_^M+|Iat(@>qTgGOF2-KT-#C>+_u0^1d!7we7s?gNJvMxrNO>X}pzG z`T~`EB41PFaF*d#d|}?4(|L1j-BIk0srgwS5lfbF;=iYiy#m5jVW|RY734R%W1C`v zfBsUQBId1H54ox6+D|>?53o)3qdnvj#=wZ=)C+tq{{%y6Fi^7KTiLM3cl=wqyRgSs zt*6{Y7&zsLy|C+nxbyS9fErK$cJ~5#P;dE@(A*8?*+%{_G*78Kb7+x3o_57Y=3O_b zvYyggK4u9?@NP)Yc7@Le3hKPC{KSX0$>c%u0Qv_(){^~8R&lGY87u=!h1rHX zgXL9JMDW^@f0SE`?3^FviXyx65CaR@G(>JIPLqA8+=R*t!z+D;%2O!vW~dBNU({A= znB0yMMh}x8(ODL@R3;3^W=(jbZx}9@73?km{h!Pk59gytV)`>pJ11L4%GrYZ@k^Y% zkI@ky@RQNr&Y$GTEItQ(N4cc|W=!ky0;Cz}p@3+RNCiyWHAb#R9eF-RE>QrFSb|qW zhZ)jgWr-=0@>;JlR=zIwUvNBzfx469<(7pE;3>@h8{jfe-Bfe%c)2Fk+-m%P*Id%5 znJ0_~xJ8+;2}Y+^P5A%PX}$GC`7j=gFrRRvUNao*x?DR!WdTp|E-An%F;BjqD#r-s z$=0c|V4m<>QvoCsbNKrS2KKQd0n?B8tpxdJmYl;UPm{aVN+RGdMka9YXn|;Z)7&ZI zZV_xW`BKGV1JmNVok?2RcGv2+Gj^O zv+piDmIfpGug*SPjB^H|03NmkIL%cd0HYsYBIg&D1}-j_e`jnP2=B@&4F61#2Ky(0R0K z7(cuo=P=X6b~T9~|^w+WY_Y4TckY{nU2`wZ^u z;8cLFe+1~#*QUy05LD6+ZwJ!D;emVz-NT z((&msY#AVTX}Vk|4`b_1x*S*`>EGyYdI_Tk5Rv&d{q5e3tH47-?c1FP%__PFQ|aMg z{kTWIMQht_FX$d1!1~m^a-xOZG_U$b`{j=R1N*B^yPk;ue?x*U;fh;a+-ck^$u?(O5mqj~!H=g~ZUeD9e2g~jLI16&7D zLEydYIS%9tJMQ9fc^$j=z`&$eWypVcn&BxYij3dgd=*PGxFG6dS=hrJOeL$E_dMkhja2om@5-PRRzw={h%0O>OU;IB>yPDijFs$ z>K1XRI%LWdMBtB1xwpXG+hzgL!r>E-ET^;N13m($u6P|*CbKe=dx_#md_w_G3gc#+#Dmk`zkR|@Af?_xJ)?1;7S5qITA0vsH;3nqbeKD6?( z?#t(d8;h;kxG^(wc>RZRtr8gmPQwZfd9o1P61>!T(lU@nQ1E;XU;I$+&eFt3@Du(> zE>u0uQ!3X}#X(P!;h@4T;;106rwTs!5y)&KiI$j4`*A$Dsya z@>HH7=BCCo`8Sv=%;A17f#pKyJ^YwQ`Zn3MmJD_E@Aka^qnMqXwG zI>&qD0J);T+#I>~|3>3@RF|;wv%;0x?6GkdZOTv-i|RR<#%%{v>OsNW%9Pkr;zZL@ z_z=-y6@JH(5TKJS@`RTnT%3G0Q-TQ)>}N`|{|}$lwJN~@@nXNw(?6gwg$YP}V^vbg z?g%gHqbwDt@34<@QH+0uuTsU5|KJHKiC=!xPpJU2bjFJvuar+2!LFOktz-F=7_zeA z^j8+JoF#gSzY^dhxGV=`r8$nN9;_(!U>z6GsJ*Hbu9_iOCgK<4Ce*HBq)#LpK7xGH z3UE{1nhb|#RLmGWVcaRI5@k&TEAzCfz&tln{!x|cLE^<#5X~{Av4vNY?L2&J<$_#wCoD5TrSb3ctkK~8#^Y+p)|Gv#pib&N>v8})GI-MLU`{d9_>_y*G!~T zfgHP&M34|CQd`Q)VW@>Rm!eI;Wcc?;5frb{w$Ng+Yf418sGhQ6bHk)H3bVbCL#4g@ zp{7)Kq?*Y@CW{UvXv**qk!o~6d}kogg#8tFDG_4li&2i8RZ8alkQ9yz(Phz6@>OG| zjh0|;jjwW{r6e=i+tNdq(kDcuiZyeK?{Zrj9DtVSYtd4(!KLJ=Oe}@qk|(h!KL~PA zjiOC)A<>4o5un6~4N)Rc=_vxU0u@-5!?K(TRH7{R`O`q<2NCaEK*^vT855*@V~sSo zhsPcC3@c`Lh_Rqz+Zg_!uZ1ej=(4F0ru-=&LU=fKBGq0$Txlf&v%{6bBCsu7X(l$Q zTu>=i$*fMuv5z8zq1Cmbgz};KLR8^7&HPOXr5LdnjM@3;Ocj|oFR28Hq;E

        ?&kBL@3Aywg-6_v|GlMqQ% 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≠=PkIu@^NTs2 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 z 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

        d) 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 >Qa)>ivtshP#lXMSZDrS?EacE1NG3ASoiey;| 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

        YNzf@}yRG=CSXtnx{rumdeRurKO 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≫~G@=c8-_>l4a;q1ZGp?vd&H~-lacdbcKfoe3M)hadzpMES^QG_y7q3$O0{>=;z6#PVM≫~G@=c8KhgEx9lpfq^fL*IB9x&D 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≫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

        lgNty$LDvw2 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%0Diwk8Kn5AW|O3 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 Y=xzA)Zz%H-;%{J6cL&FuG4q`N1+{V@ 4096 || len(fields) == 0 { + return errors.New("HEIC address-space accounting unavailable") + } + pages, err := strconv.ParseUint(fields[0], 10, 64) + if err != nil || pages > uint64(limits.OSProcessBytes)/uint64(os.Getpagesize()) { + return errors.New("HEIC initial address space exceeds native limit") + } + for _, ceiling := range []struct { + resource int + value uint64 + }{ + {unix.RLIMIT_AS, uint64(limits.OSProcessBytes)}, + {unix.RLIMIT_CPU, uint64((limits.Timeout + time.Second - 1) / time.Second)}, + {unix.RLIMIT_CORE, 0}, {unix.RLIMIT_FSIZE, 0}, {unix.RLIMIT_NOFILE, 32}, + } { + var previous unix.Rlimit + if err = unix.Getrlimit(ceiling.resource, &previous); err != nil { + return err + } + value := min(ceiling.value, previous.Cur, previous.Max) + bound := unix.Rlimit{Cur: value, Max: value} + if err = unix.Setrlimit(ceiling.resource, &bound); err != nil { + return err + } + var installed unix.Rlimit + if err = unix.Getrlimit(ceiling.resource, &installed); err != nil { + return err + } + if installed != bound { + return errors.New("HEIC native resource limit not installed") + } + // Readiness reports the requested AS ceiling; refuse inherited tighter + // AS limits rather than reporting a different control as that value. + if ceiling.resource == unix.RLIMIT_AS && value != ceiling.value { + return errors.New("HEIC inherited address-space limit is too small") + } + } + return nil +} + +func verifyLinuxAddressLimit(maxBytes int64) error { + mapping, err := unix.Mmap(-1, 0, int(maxBytes)+os.Getpagesize(), unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON) + if err == nil { + _ = unix.Munmap(mapping) + return errors.New("HEIC native address-space limit not enforced") + } + if !errors.Is(err, unix.ENOMEM) { + return fmt.Errorf("HEIC native memory probe: %w", err) + } + return nil +} diff --git a/internal/heicdecode/worker/isolate_other.go b/internal/heicdecode/worker/isolate_other.go index 641ab4e9..a4a2ebf6 100644 --- a/internal/heicdecode/worker/isolate_other.go +++ b/internal/heicdecode/worker/isolate_other.go @@ -1,4 +1,4 @@ -//go:build !darwin || !cgo +//go:build (!darwin || !cgo) && (!linux || cgo || (!amd64 && !arm64)) && (!windows || (!amd64 && !arm64)) package worker diff --git a/internal/heicdecode/worker/isolate_windows.go b/internal/heicdecode/worker/isolate_windows.go new file mode 100644 index 00000000..eabf5bb8 --- /dev/null +++ b/internal/heicdecode/worker/isolate_windows.go @@ -0,0 +1,15 @@ +//go:build windows && (amd64 || arm64) + +package worker + +import ( + "github.com/frathe/picfetch/internal/heicdecode" + "github.com/frathe/picfetch/internal/heicdecode/winisolation" +) + +func isolate(limits heicdecode.Limits) (int64, error) { + if err := winisolation.Verify(limits); err != nil { + return 0, err + } + return limits.OSProcessBytes, nil +} diff --git a/internal/heicdecode/worker/linux_filter.go b/internal/heicdecode/worker/linux_filter.go new file mode 100644 index 00000000..403844d5 --- /dev/null +++ b/internal/heicdecode/worker/linux_filter.go @@ -0,0 +1,66 @@ +package worker + +import "golang.org/x/net/bpf" + +// linuxCalls keeps kernel numbers supplied by the native build separate from +// the portable policy evaluator. Arguments are 64-bit little-endian fields. +type linuxCalls struct { + architecture, threadFlags uint32 + clone, mmap, mprotect, futex, fcntl, tgkill uint32 + ordinary []uint32 +} + +func linuxFilter(calls linuxCalls, pid uint32) ([]bpf.RawInstruction, error) { + const deny = 0x00050001 // SECCOMP_RET_ERRNO | EPERM + const allow = 0x7fff0000 + instructions := []bpf.Instruction{ + bpf.LoadAbsolute{Off: 4, Size: 4}, + bpf.JumpIf{Cond: bpf.JumpEqual, Val: calls.architecture, SkipTrue: 1}, + bpf.RetConstant{Val: deny}, + bpf.LoadAbsolute{Off: 0, Size: 4}, + bpf.JumpIf{Cond: bpf.JumpGreaterOrEqual, Val: 0x40000000, SkipFalse: 1}, + bpf.RetConstant{Val: deny}, + } + for _, call := range calls.ordinary { + instructions = append(instructions, + bpf.JumpIf{Cond: bpf.JumpEqual, Val: call, SkipFalse: 1}, + bpf.RetConstant{Val: allow}) + } + // Each matched rule terminates. Its argument checks cannot fall through to + // another syscall rule with an argument still loaded in the accumulator. + rule := func(call uint32, conditions ...[]bpf.Instruction) { + var body []bpf.Instruction + for _, condition := range conditions { + body = append(body, condition...) + } + body = append(body, bpf.RetConstant{Val: allow}) + instructions = append(instructions, bpf.JumpIf{Cond: bpf.JumpEqual, Val: call, SkipFalse: uint8(len(body))}) + instructions = append(instructions, body...) + } + // Restrict scalar arguments, including their high word. Pointer contents + // cannot be inspected by seccomp and are not treated as an authority check. + argument := func(index uint32, values ...uint32) []bpf.Instruction { + check := []bpf.Instruction{ + bpf.LoadAbsolute{Off: 20 + index*8, Size: 4}, + bpf.JumpIf{Cond: bpf.JumpEqual, Val: 0, SkipTrue: 1}, + bpf.RetConstant{Val: deny}, + bpf.LoadAbsolute{Off: 16 + index*8, Size: 4}, + } + for i, value := range values { + check = append(check, bpf.JumpIf{Cond: bpf.JumpEqual, Val: value, SkipTrue: uint8(len(values) - i)}) + } + return append(check, bpf.RetConstant{Val: deny}) + } + // Go's exact CLONE_THREAD form permits runtime threads, never a new process + // or namespace. clone3 and all unlisted process-launch calls remain denied. + rule(calls.clone, argument(0, calls.threadFlags)) + // Only private anonymous mappings; huge-page attempts fail and wazero falls + // back to normal pages. Compiled code transitions RW -> RX via mprotect. + rule(calls.mmap, argument(2, 0, 1, 3), argument(3, 0x22, 0x32)) + rule(calls.mprotect, argument(2, 0, 1, 3, 5)) + rule(calls.futex, argument(1, 128, 129)) + rule(calls.fcntl, argument(1, 1, 2, 3, 4)) + rule(calls.tgkill, argument(0, pid)) + instructions = append(instructions, bpf.RetConstant{Val: deny}) + return bpf.Assemble(instructions) +} diff --git a/internal/heicdecode/worker/linux_filter_test.go b/internal/heicdecode/worker/linux_filter_test.go new file mode 100644 index 00000000..75b688db --- /dev/null +++ b/internal/heicdecode/worker/linux_filter_test.go @@ -0,0 +1,85 @@ +package worker + +import ( + "encoding/binary" + "testing" + + "golang.org/x/net/bpf" +) + +// Evaluate policy on every host without installing a native filter. Each +// instruction input represents a PicFetch-owned boundary decision, no image. +func TestLinuxFilterRuntimeAndAuthority(t *testing.T) { + for _, calls := range []linuxCalls{ + {0xc000003e, 0xd0f00, 56, 9, 10, 202, 72, 234, []uint32{0, 1, 3, 60, 231}}, + {0xc00000b7, 0x50f00, 220, 222, 226, 98, 25, 131, []uint32{63, 64, 57, 93, 94}}, + } { + raw, err := linuxFilter(calls, 42) + if err != nil { + t.Fatal(err) + } + instructions, decoded := bpf.Disassemble(raw) + if !decoded { + t.Fatal("unknown BPF instructions") + } + vm, err := bpf.NewVM(instructions) + if err != nil { + t.Fatal(err) + } + check := func(name string, arch, call uint32, args [6]uint64, allow bool) { + t.Helper() + // BPF's portable VM loads network order; seccomp loads host order. + // Encode each scalar separately to preserve the kernel's low/high + // 32-bit layout of little-endian 64-bit syscall arguments. + data := make([]byte, 64) + binary.BigEndian.PutUint32(data, call) + binary.BigEndian.PutUint32(data[4:], arch) + for i, arg := range args { + binary.BigEndian.PutUint32(data[16+i*8:], uint32(arg)) + binary.BigEndian.PutUint32(data[20+i*8:], uint32(arg>>32)) + } + got, err := vm.Run(data) + want := 0x00050001 + if allow { + want = 0x7fff0000 + } + if err != nil || got != want { + t.Errorf("%s arch=%#x: decision=%#x error=%v, want %#x", name, arch, got, err, want) + } + } + for _, call := range calls.ordinary { + check("runtime", calls.architecture, call, [6]uint64{}, true) + } + check("unknown architecture", calls.architecture^1, calls.ordinary[0], [6]uint64{}, false) + check("x32", calls.architecture, calls.ordinary[0]|0x40000000, [6]uint64{}, false) + for _, flags := range []uint64{uint64(calls.threadFlags), 0, 17, uint64(calls.threadFlags) | 0x10000000, uint64(calls.threadFlags) | (1 << 32)} { + check("clone", calls.architecture, calls.clone, [6]uint64{flags}, flags == uint64(calls.threadFlags)) + } + for _, flags := range []uint64{0x22, 0x32, 0x02, 0x21, 0x4022, 0x22 | (1 << 32)} { + check("mmap flags", calls.architecture, calls.mmap, [6]uint64{0, 4096, 3, flags}, flags == 0x22 || flags == 0x32) + } + for _, protection := range []uint64{0, 1, 3, 5, 7, 0x100000003} { + check("mmap protection", calls.architecture, calls.mmap, [6]uint64{0, 4096, protection, 0x22}, protection == 0 || protection == 1 || protection == 3) + check("mprotect", calls.architecture, calls.mprotect, [6]uint64{0, 4096, protection}, protection == 0 || protection == 1 || protection == 3 || protection == 5) + } + for _, operation := range []uint64{0, 1, 128, 129, 0x100000080} { + check("private futex", calls.architecture, calls.futex, [6]uint64{0, operation}, operation == 128 || operation == 129) + } + for _, command := range []uint64{0, 1, 2, 3, 4, 5, 1030} { + check("fcntl", calls.architecture, calls.fcntl, [6]uint64{0, command}, command >= 1 && command <= 4) + } + check("own thread signal", calls.architecture, calls.tgkill, [6]uint64{42, 43, 23}, true) + check("other process signal", calls.architecture, calls.tgkill, [6]uint64{41, 43, 23}, false) + // Common and architecture-specific file/network/process/privilege paths + // must remain denied. Values differ between the two Linux ABIs. + denied := []uint32{425, 426, 427, 435, 9999} + if calls.architecture == 0xc000003e { + denied = append(denied, 2, 41, 42, 53, 57, 58, 59, 101, 157, 257, 272, 302, 308, 319, 322) + } else { + denied = append(denied, 56, 117, 167, 198, 199, 203, 221, 261, 268, 279, 281) + } + for _, call := range denied { + check("denied authority", calls.architecture, call, [6]uint64{}, false) + } + } +} diff --git a/internal/heicdecode/worker/main.go b/internal/heicdecode/worker/main.go index 49495fb0..a115b55e 100644 --- a/internal/heicdecode/worker/main.go +++ b/internal/heicdecode/worker/main.go @@ -17,6 +17,9 @@ import ( // Main serves one request in the dedicated, disposable helper process. Probe // paths and loopback endpoints are parent-owned launch controls, never supplied // by an image. Any missing platform restriction exits before reading stdin. +// The separate cmd/picfetch-heic-worker entry point is its production caller. +// +// noinspection GoUnusedExportedFunction func Main(args []string) int { if len(args) != 6 || args[0] != "--heic-worker-v2" || len(args[1]) > 2048 { return 2 @@ -93,5 +96,7 @@ func verifyDenial(ctx context.Context, readPath, writePath, tcpAddress, udpAddre } func permissionDenied(err error) bool { - return errors.Is(err, syscall.EPERM) || errors.Is(err, syscall.EACCES) + // Winsock reports WSAEACCES (10013), while file APIs use the ordinary + // permission mapping. Refused connections or timeouts do not prove denial. + return errors.Is(err, os.ErrPermission) || (runtime.GOOS == "windows" && errors.Is(err, syscall.Errno(10013))) } diff --git a/internal/heicdecode/worker/native_linux_test.go b/internal/heicdecode/worker/native_linux_test.go new file mode 100644 index 00000000..20b739a6 --- /dev/null +++ b/internal/heicdecode/worker/native_linux_test.go @@ -0,0 +1,134 @@ +//go:build heicnative && linux && !cgo && (amd64 || arm64) + +package worker + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "os" + "os/exec" + "runtime" + "runtime/debug" + "sync" + "testing" + "time" + + "golang.org/x/sys/unix" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func TestMain(m *testing.M) { + if len(os.Args) == 2 && (os.Args[1] == "--owned-linux-policy" || os.Args[1] == "--owned-no-address-limit") { + if err := runOwnedLinuxControl(os.Args[1]); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + os.Exit(0) + } + os.Exit(m.Run()) +} + +func runOwnedLinuxControl(mode string) error { + limits := heicdecode.DefaultLimits(0) + if mode == "--owned-no-address-limit" { + return verifyLinuxAddressLimit(limits.OSProcessBytes) + } + runtime.GOMAXPROCS(1) + debug.SetMaxThreads(32) + threads, err := os.ReadDir("/proc/self/task") + if err != nil { + return err + } + if len(threads) > 24 { + return errors.New("unexpected initial thread count") + } + // Hold one existing thread across TSYNC, then hold more threads than + // existed beforehand. This exercises both synchronization and inheritance. + start, release := make(chan struct{}), make(chan struct{}) + started := make(chan struct{}, 32) + results := make(chan error, 32) + var work sync.WaitGroup + defer func() { close(release); work.Wait() }() + launch := func() { + work.Add(1) + go func() { + defer work.Done() + runtime.LockOSThread() + defer runtime.UnlockOSThread() + started <- struct{}{} + select { + case <-start: + case <-release: + return + } + fd, openErr := unix.Open("/proc/self/statm", unix.O_RDONLY, 0) + if openErr == nil { + _ = unix.Close(fd) + } + results <- openErr + <-release + }() + } + launch() + <-started + nativeMemory, err := isolate(limits) + if err != nil { + return err + } + if nativeMemory != limits.OSProcessBytes { + return errors.New("wrong native limit") + } + close(start) + for range len(threads) + 1 { + launch() + } + for range len(threads) + 2 { + if err = <-results; !errors.Is(err, unix.EPERM) { + return fmt.Errorf("native thread file denial: %v", err) + } + } + // No process or executable is contacted: a null pathname must be refused + // by seccomp as EPERM before kernel pathname validation could return EFAULT. + _, _, errno := unix.RawSyscall(unix.SYS_EXECVE, 0, 0, 0) + if errno != unix.EPERM { + return fmt.Errorf("exec denial: %v", errno) + } + // Runtime-private futexes remain usable; unknown clone3 and io_uring calls + // are denied before reading their absent argument structures. + for _, call := range []uintptr{unix.SYS_CLONE3, unix.SYS_IO_URING_SETUP, unix.SYS_IO_URING_ENTER, unix.SYS_IO_URING_REGISTER} { + _, _, errno = unix.RawSyscall(call, 0, 0, 0) + if errno != unix.EPERM { + return fmt.Errorf("syscall %d denial: %v", call, errno) + } + } + // A fixed PicFetch-owned loop verifies that the sandbox still lets wazero + // compile code and cancel execution; it contains no decoder/image input. + limits.Timeout = 50 * time.Millisecond + loop := []byte{0x03, 0x40, 0x0c, 0, 0x0b, 0x0b} + err = execute(context.Background(), ownedModule(1, loop), bytes.NewReader(nil), io.Discard, io.Discard, limits) + if !errors.Is(err, context.DeadlineExceeded) { + return fmt.Errorf("sandboxed WASI cancellation: %v", err) + } + _, err = fmt.Fprintln(os.Stdout, "owned Linux policy controls passed") + return err +} + +func TestNativeLinuxRuntimePolicy(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + command := exec.CommandContext(ctx, os.Args[0], "--owned-linux-policy") + if out, err := command.CombinedOutput(); err != nil { + t.Fatalf("owned native controls: %v: %s", err, out) + } + // This negative control omits the native AS limit. The same no-access + // reservation check must detect that omission without committing RAM. + command = exec.CommandContext(ctx, os.Args[0], "--owned-no-address-limit") + out, err := command.CombinedOutput() + if err == nil || !bytes.Contains(out, []byte("address-space limit not enforced")) { + t.Fatalf("missing-limit control: error=%v output=%s", err, out) + } +} diff --git a/internal/heicdecode/worker/runtime_test.go b/internal/heicdecode/worker/runtime_test.go index 8b60775a..53e1ab9d 100644 --- a/internal/heicdecode/worker/runtime_test.go +++ b/internal/heicdecode/worker/runtime_test.go @@ -169,3 +169,16 @@ func ownedModule(pages byte, body []byte) []byte { 10, byte(len(body) + 3), 1, byte(len(body) + 1), 0} return append(module, body...) } + +func TestNativeDenialErrorsRequirePermission(t *testing.T) { + for _, err := range []error{os.ErrPermission, &os.PathError{Op: "open", Path: "owned", Err: os.ErrPermission}} { + if !permissionDenied(err) { + t.Fatalf("permission refusal not recognized: %v", err) + } + } + for _, err := range []error{nil, os.ErrNotExist, context.DeadlineExceeded, errors.New("connection refused")} { + if permissionDenied(err) { + t.Fatalf("non-permission failure counted as isolation: %v", err) + } + } +} diff --git a/internal/imaging/exif.go b/internal/imaging/exif.go index 172aa4a6..5461fba9 100644 --- a/internal/imaging/exif.go +++ b/internal/imaging/exif.go @@ -233,6 +233,9 @@ func (m Metadata) Empty() bool { // field (or all of them) blank rather than returning an error - there is no // error to report, only "nothing to show". func ReadMetadata(data []byte) Metadata { + if routeSource(data) == sourceIsolated { + return Metadata{} + } if len(data) >= 4 && data[0] == 0xFF && data[1] == 0xD8 { return jpegMetadata(data) } @@ -271,6 +274,9 @@ func jpegMetadata(data []byte) Metadata { // AVIF package's box parser, without invoking its image decoder. JPEG APP1 // and TIFF IFD0 are handled before this is called. func isobmffMetadata(data []byte) Metadata { + if routeSource(data) != sourceAVIF { + return Metadata{} + } if ex, err := avif.DecodeExif(bytes.NewReader(data)); err == nil { return metadataFromISOBMFFExif(ex.Make, ex.Model, ex.ExposureTime, ex.FNumber, ex.ISOSpeed, ex.FocalLength, ex.DateTimeOriginal, ex.DateTime, ex.GPSLatitude, ex.GPSLongitude) } diff --git a/internal/imaging/ico.go b/internal/imaging/ico.go index c5f0807b..0b912048 100644 --- a/internal/imaging/ico.go +++ b/internal/imaging/ico.go @@ -25,6 +25,9 @@ var errInvalidICO = errors.New("invalid or unsupported ICO") // The desktop driver also registers an ICO decoder. Dispatch explicitly so // the viewer's admission cannot depend on global decoder registration order. func decodeRasterConfig(data []byte) (image.Config, string, error) { + if routeSource(data) == sourceIsolated { + return image.Config{}, "", image.ErrFormat + } if bytes.HasPrefix(data, []byte("\x00\x00\x01\x00")) { cfg, err := decodeICOConfig(bytes.NewReader(data)) return cfg, "ico", err @@ -33,6 +36,9 @@ func decodeRasterConfig(data []byte) (image.Config, string, error) { } func decodeRaster(data []byte) (image.Image, string, error) { + if routeSource(data) == sourceIsolated { + return nil, "", image.ErrFormat + } if bytes.HasPrefix(data, []byte("\x00\x00\x01\x00")) { img, err := decodeICO(bytes.NewReader(data)) return img, "ico", err diff --git a/internal/imaging/loader.go b/internal/imaging/loader.go index 9c31302c..9551e4ca 100644 --- a/internal/imaging/loader.go +++ b/internal/imaging/loader.go @@ -21,7 +21,6 @@ import ( "time" "fyne.io/fyne/v2" - "fyne.io/fyne/v2/storage" _ "github.com/fyne-io/image/xpm" // registers XPM with image.Decode _ "github.com/gen2brain/avif" // registers AVIF with image.Decode (WASM/wazero, no cgo) _ "golang.org/x/image/bmp" // registers BMP with image.Decode @@ -227,12 +226,9 @@ func (e *InputTooLargeError) Error() string { return fmt.Sprintf("file exceeds the %d-byte input limit", e.limit) } -// ctxReader wraps r so a Read call fails with ctx's error once ctx is -// done, instead of running r's Read to completion for a result a -// cancelled load has already discarded. readRawBytes's io.ReadAll loop -// calls Read repeatedly for anything bigger than one chunk, so this stops -// a large or slow (e.g. network-mounted) file's read partway through -// rather than only catching the cancellation before the next file starts. +// ctxReader checks cancellation between reads. Reader also closes its source +// on cancellation and joins the close callback; interruption of an already +// blocked storage operation depends on that backend's Close implementation. type ctxReader struct { ctx context.Context r io.Reader @@ -245,49 +241,6 @@ func (cr ctxReader) Read(p []byte) (int, error) { return cr.r.Read(p) } -// readRawBytes reads u's contents into memory, up to MaxEncodedBytes - the -// first step shared by ReadAndProbe (which goes on to decode the header) -// and CaptureDate (which only needs the bytes to walk for Exif). ctx is -// checked once up front, before even opening u - cheap enough there's no -// reason not to, mirroring internal/filesort's Order - and then on every -// Read the io.ReadAll loop makes, via ctxReader, so a load abandoned -// partway through a large read stops doing I/O for it instead of finishing -// unseen. -func readRawBytes(ctx context.Context, u fyne.URI) ([]byte, error) { - if err := ctx.Err(); err != nil { - return nil, err - } - - rc, err := storage.Reader(u) - if err != nil { - return nil, err - } - defer func() { _ = rc.Close() }() - - // Read one byte past the limit rather than exactly up to it: io.ReadAll - // on a LimitReader returns the same short slice whether the file ended - // at the limit or was cut off there, so the extra byte is what - // distinguishes "fits exactly" from "too large". - limit := MaxEncodedBytes() - - data, err := io.ReadAll(io.LimitReader(ctxReader{ctx: ctx, r: rc}, limit+1)) - if err != nil { - return nil, err - } - - // A backend may return its last bytes with EOF while cancellation arrives. - // Do not accept that read just because ReadAll needs no further Read call. - if err := ctx.Err(); err != nil { - return nil, err - } - - if int64(len(data)) > limit { - return nil, &InputTooLargeError{limit: limit} - } - - return data, nil -} - // CaptureDate is the compatibility form of CaptureDateContext. Unreadable or // absent metadata reports ok=false; cancellable callers use CaptureDateContext. func CaptureDate(u fyne.URI) (time.Time, bool) { @@ -301,37 +254,21 @@ func CaptureDate(u fyne.URI) (time.Time, bool) { // Context checks surround the non-interruptible metadata walk. A Read already // blocked in the storage backend must return before cancellation can stop I/O. func CaptureDateContext(ctx context.Context, u fyne.URI) (time.Time, bool, error) { - data, err := readRawBytes(ctx, u) - if err != nil { - return time.Time{}, false, err - } - date := ReadMetadata(data).DateTakenTime - if err := ctx.Err(); err != nil { - return time.Time{}, false, err - } - return date, !date.IsZero(), nil + return (Reader{}).CaptureDate(ctx, u) } -// ReadAndProbe reads u's raw bytes and decodes just its header - via -// image.DecodeConfig, so no pixel data is touched - to learn its final -// display size and reject a zero or absurdly large one instantly, without -// paying for a full decode that was only going to be thrown away. bounds -// already accounts for any Exif orientation swap (a 90/270 degree rotation -// exchanges width and height), so a caller can resize the window to it -// ahead of the full pixel decode in DecodeLoaded. This is also the natural -// hook for a future downsampling pass on huge-but-valid images. -// -// ctx is threaded through to readRawBytes, which is where the actual I/O -// happens - see its own comment. A caller (internal/ui's attemptLoad/ -// preloadOne) whose generation has been superseded by a newer navigation -// or drop cancels ctx instead of just discarding the result once it comes -// back, so an abandoned load stops doing I/O instead of finishing unseen. +// ReadAndProbe is the byte-oriented compatibility path for ordinary images. +// Bounds include Exif orientation. HEIC-aware callers use their injected Reader +// and Source.Decode, because isolated output has no native encoded-byte path. func ReadAndProbe(ctx context.Context, u fyne.URI) (data []byte, bounds image.Rectangle, err error) { - data, err = readRawBytes(ctx, u) - + source, err := (Reader{}).Read(ctx, u) if err != nil { return nil, image.Rectangle{}, err } + return source.encoded, source.bounds, nil +} + +func probeEncoded(data []byte) ([]byte, image.Rectangle, error) { if isSVGData(data) { if len(data) > maxSVGBytes { diff --git a/internal/imaging/preview.go b/internal/imaging/preview.go index 3bd30b2d..8dcb3c51 100644 --- a/internal/imaging/preview.go +++ b/internal/imaging/preview.go @@ -3,7 +3,6 @@ package imaging import ( "bytes" "context" - "fmt" "image" "image/gif" @@ -19,13 +18,10 @@ const previewGIFDecodeBytes int64 = 256 * 1024 * 1024 // animationBytes bounds retained RGBA pixels and frame objects; large source decodes fall back to // a static first frame, with AnimationTruncated set. No preview is upscaled. func LoadAnimatedPreviewContext(ctx context.Context, u fyne.URI, maxEdge int, animationBytes int64) (*LoadedImage, error) { - if maxEdge <= 0 { - return nil, fmt.Errorf("preview edge must be positive: %d", maxEdge) - } - data, bounds, err := ReadAndProbe(ctx, u) - if err != nil { - return nil, err - } + return (Reader{}).Preview(ctx, u, maxEdge, animationBytes) +} + +func decodePreview(ctx context.Context, data []byte, bounds image.Rectangle, maxEdge int, animationBytes int64) (*LoadedImage, error) { if err := ctx.Err(); err != nil { return nil, err } diff --git a/internal/imaging/raw.go b/internal/imaging/raw.go index 631d1332..2a48b9c0 100644 --- a/internal/imaging/raw.go +++ b/internal/imaging/raw.go @@ -30,10 +30,6 @@ func isRAF(data []byte) bool { return bytes.HasPrefix(data, []byte("FUJIFILM")) } -func isISOBMFF(data []byte) bool { - return len(data) >= 8 && string(data[4:8]) == "ftyp" -} - func tiffOrder(data []byte) (binary.ByteOrder, bool) { if len(data) < 8 { return nil, false @@ -58,7 +54,8 @@ func tiffOrder(data []byte) (binary.ByteOrder, bool) { func looksLikePreviewContainer(data []byte) bool { _, isTIFF := tiffOrder(data) - return isTIFF || isISOBMFF(data) || isRAF(data) + kind := routeSource(data) + return isTIFF || kind == sourceCR3 || kind == sourceAVIF || isRAF(data) } // embeddedJPEGPreview returns the largest valid JPEG payload embedded in a diff --git a/internal/imaging/source.go b/internal/imaging/source.go new file mode 100644 index 00000000..25c6a5c8 --- /dev/null +++ b/internal/imaging/source.go @@ -0,0 +1,272 @@ +package imaging + +import ( + "bytes" + "context" + "crypto/sha256" + "fmt" + "image" + "io" + "math" + "strings" + "sync" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + + "github.com/frathe/picfetch/internal/heicdecode" + "github.com/frathe/picfetch/internal/heicdecode/client" +) + +// HEICDecoder supplies the application's shared admission owner or an inherited +// analysis connection. It returns only protocol-validated pixels and metadata. +type HEICDecoder func(context.Context, heicdecode.Operation, client.Input) (heicdecode.Response, error) + +// Reader is immutable and safe to share. The zero value handles ordinary images +// and refuses HEIC. A configured reader never selects its own executable. +type Reader struct{ heic HEICDecoder } + +// Source owns ordinary encoded bytes or already decoded HEIC pixels. HEIC bytes +// never escape admission: only their byte count and digest survive. Callers must +// treat returned pixels as immutable, just like existing shared cache frames. +type Source struct { + encoded []byte + bounds image.Rectangle + pixels image.Image + metadata Metadata + size int64 + digest [32]byte +} + +func NewReader(decode HEICDecoder) Reader { return Reader{heic: decode} } + +// Read probes ordinary images without decoding their pixels; HEIC bounds and +// pixels arrive together so a later Decode cannot start another helper job. +func (r Reader) Read(ctx context.Context, u fyne.URI) (*Source, error) { + return r.read(ctx, u, heicdecode.Decode) +} + +func (r Reader) Metadata(ctx context.Context, u fyne.URI) (Metadata, error) { + info, err := r.InspectMetadata(ctx, u) + if err != nil { + return Metadata{}, err + } + return info.Values, nil +} + +// MetadataInfo includes the editing capability established from the same bytes +// as its values. HEIC metadata never enables the JPEG-only strip operation. +type MetadataInfo struct { + Values Metadata + CanStrip bool + FileSize int64 +} + +func (r Reader) InspectMetadata(ctx context.Context, u fyne.URI) (MetadataInfo, error) { + source, err := r.read(ctx, u, heicdecode.DecodeExif) + if err != nil { + return MetadataInfo{}, err + } + m := source.Metadata() + canStrip := source.encoded != nil && CanStripJPEGMetadata(source.encoded) && !m.Empty() + if err = ctx.Err(); err != nil { + return MetadataInfo{}, err + } + return MetadataInfo{Values: m, CanStrip: canStrip, FileSize: source.size}, nil +} + +func (r Reader) CaptureDate(ctx context.Context, u fyne.URI) (time.Time, bool, error) { + m, err := r.Metadata(ctx, u) + if err != nil { + return time.Time{}, false, err + } + return m.DateTakenTime, !m.DateTakenTime.IsZero(), nil +} + +func (r Reader) read(ctx context.Context, u fyne.URI, op heicdecode.Operation) (*Source, error) { + if err := ctx.Err(); err != nil { + return nil, err + } + ext := strings.ToLower(u.Extension()) + isolated := ext == ".heic" || ext == ".heif" || ext == ".heics" || ext == ".heifs" + if isolated && r.heic == nil { + return nil, client.ErrUnavailable + } + file, err := storage.Reader(u) + if err != nil { + return nil, err + } + var once sync.Once + closeFile := func() { once.Do(func() { _ = file.Close() }) } + joinClose := closeSourceOnCancel(ctx, closeFile) + defer func() { closeFile(); joinClose() }() + limit := MaxEncodedBytes() + var prefix []byte + if !isolated { + prefix, err = sourcePrefix(ctxReader{ctx: ctx, r: file}, limit) + if err != nil { + return nil, sourceReadError(ctx, err) + } + isolated = routeSource(prefix) == sourceIsolated + } + read := func(ctx context.Context, maxBytes int64) ([]byte, error) { + join := closeSourceOnCancel(ctx, closeFile) + defer join() + return readSourceBytes(ctx, io.MultiReader(bytes.NewReader(prefix), file), min(limit, maxBytes)) + } + if isolated { + if r.heic == nil { + return nil, client.ErrUnavailable + } + source := &Source{} + result, err := r.heic(ctx, op, func(ctx context.Context, maxBytes int64) ([]byte, error) { + data, err := read(ctx, maxBytes) + if err == nil { + source.size = int64(len(data)) + source.digest = sha256.Sum256(data) + } + return data, err + }) + if err != nil { + return nil, sourceReadError(ctx, err) + } + if err := ctx.Err(); err != nil { + return nil, err + } + if op == heicdecode.Decode { + if result.Image == nil || result.Image.Bounds() != image.Rect(0, 0, result.Config.Width, result.Config.Height) { + return nil, heicdecode.ErrInvalidResponse + } + source.pixels, source.bounds = result.Image, result.Image.Bounds() + } + if m := result.Metadata; m != nil { + source.metadata = metadataFromISOBMFFExif(m.Make, m.Model, m.ExposureTime, m.FNumber, m.ISOSpeed, m.FocalLength, m.DateTimeOriginal, m.DateTime, m.GPSLatitude, m.GPSLongitude) + } + return source, nil + } + data, err := read(ctx, limit) + if err != nil { + return nil, err + } + source := &Source{encoded: data, size: int64(len(data))} + if op == heicdecode.Decode { + _, source.bounds, err = probeEncoded(data) + if err != nil { + return nil, err + } + } + if err = ctx.Err(); err != nil { + return nil, err + } + return source, nil +} + +func (s *Source) Bounds() image.Rectangle { return s.bounds } + +func (s *Source) SHA256() [32]byte { + if s.encoded != nil { + return sha256.Sum256(s.encoded) + } + return s.digest +} + +func (s *Source) Metadata() Metadata { + if s.encoded != nil { + return ReadMetadata(s.encoded) + } + return s.metadata +} + +func (s *Source) Decode(ctx context.Context, maxAnimBytes int64) (*LoadedImage, error) { + if err := ctx.Err(); err != nil { + return nil, err + } + if s.pixels != nil { + // Container transforms have already been applied by the guest. Exif + // orientation is descriptive metadata, never a second pixel transform. + return &LoadedImage{Frames: []image.Image{s.pixels}, FileSize: s.size, HasEXIF: !s.metadata.Empty()}, nil + } + return DecodeRecord(ctx, s.encoded, maxAnimBytes) +} + +func (r Reader) Thumbnail(ctx context.Context, u fyne.URI, maxEdge int) (image.Image, image.Rectangle, error) { + if maxEdge <= 0 { + return nil, image.Rectangle{}, fmt.Errorf("thumbnail edge must be positive: %d", maxEdge) + } + source, err := r.Read(ctx, u) + if err != nil { + return nil, image.Rectangle{}, err + } + pixels, err := source.thumbnail(ctx, maxEdge) + if err != nil { + return nil, image.Rectangle{}, err + } + return pixels, source.bounds, nil +} + +func (s *Source) thumbnail(ctx context.Context, maxEdge int) (image.Image, error) { + if err := ctx.Err(); err != nil { + return nil, err + } + var pixels image.Image + var err error + if s.pixels != nil { + pixels = scaleToFit(s.pixels, maxEdge) + } else { + pixels, err = decodeThumbnailAtEdge(ctx, s.encoded, s.bounds, maxEdge) + } + if cancelled := ctx.Err(); cancelled != nil { + return nil, cancelled + } + return pixels, err +} + +func (r Reader) Preview(ctx context.Context, u fyne.URI, maxEdge int, animationBytes int64) (*LoadedImage, error) { + if maxEdge <= 0 { + return nil, fmt.Errorf("preview edge must be positive: %d", maxEdge) + } + source, err := r.Read(ctx, u) + if err != nil { + return nil, err + } + if source.pixels == nil { + return decodePreview(ctx, source.encoded, source.bounds, maxEdge, animationBytes) + } + pixels, err := source.thumbnail(ctx, maxEdge) + if err != nil { + return nil, err + } + return &LoadedImage{Frames: []image.Image{pixels}}, nil +} + +func readSourceBytes(ctx context.Context, input io.Reader, limit int64) ([]byte, error) { + if limit <= 0 || limit == math.MaxInt64 { + return nil, &InputTooLargeError{limit: limit} + } + data, err := io.ReadAll(io.LimitReader(ctxReader{ctx: ctx, r: input}, limit+1)) + if err = sourceReadError(ctx, err); err != nil { + return nil, err + } + if int64(len(data)) > limit { + return nil, &InputTooLargeError{limit: limit} + } + return data, nil +} + +func sourceReadError(ctx context.Context, err error) error { + if ctx.Err() != nil { + return ctx.Err() + } + return err +} + +func closeSourceOnCancel(ctx context.Context, closeFile func()) func() { + done := make(chan struct{}) + stop := context.AfterFunc(ctx, func() { defer close(done); closeFile() }) + return func() { + if !stop() { + <-done + } + } +} diff --git a/internal/imaging/source_kind.go b/internal/imaging/source_kind.go new file mode 100644 index 00000000..ba41a1be --- /dev/null +++ b/internal/imaging/source_kind.go @@ -0,0 +1,102 @@ +package imaging + +import ( + "encoding/binary" + "errors" + "io" +) + +const maxSourcePrefix = 64 * 1024 + +type sourceKind uint8 + +const ( + sourceOrdinary sourceKind = iota + sourceAVIF + sourceCR3 + sourceIsolated +) + +// Inspect only the leading file-type box. Unknown/oversized BMFF types and +// containers beginning with another common box go to isolation, never a native +// fallback. This is dispatch, not a walk of image items, properties or metadata. +func routeSource(data []byte) sourceKind { + if len(data) < 8 { + return sourceOrdinary + } + switch string(data[4:8]) { + case "free", "skip", "wide", "meta", "moov", "mdat": + return sourceIsolated + case "ftyp": + default: + return sourceOrdinary + } + size, header := sourceTypeSize(data) + if size < header+8 || size > maxSourcePrefix || size > uint64(len(data)) || (size-header)%4 != 0 { + return sourceIsolated + } + kind := sourceIsolated + for offset := header; offset < size; offset += 4 { + if offset == header+4 { // minor version, not a compatible brand + continue + } + switch string(data[offset : offset+4]) { + case "heic", "heix", "hevc", "hevx", "heim", "heis", "hevm", "hevs": + return sourceIsolated + case "avif", "avis": + kind = sourceAVIF + case "crx ": + if kind != sourceAVIF { + kind = sourceCR3 + } + } + } + return kind +} + +func sourceTypeSize(data []byte) (size, header uint64) { + size, header = uint64(binary.BigEndian.Uint32(data[:4])), 8 + if size == 1 { + if len(data) < 16 { + return 0, 16 + } + return binary.BigEndian.Uint64(data[8:16]), 16 + } + return size, header +} + +func sourcePrefix(r io.Reader, limit int64) ([]byte, error) { + var prefix []byte + readTo := func(size uint64) error { + size = min(size, uint64(maxSourcePrefix), uint64(max(0, limit))) + if size <= uint64(len(prefix)) { + return nil + } + old := len(prefix) + prefix = append(prefix, make([]byte, int(size)-old)...) + n, err := io.ReadFull(r, prefix[old:]) + prefix = prefix[:old+n] + if errors.Is(err, io.EOF) || errors.Is(err, io.ErrUnexpectedEOF) { + return nil + } + return err + } + if err := readTo(8); err != nil { + return nil, err + } + if len(prefix) < 8 || string(prefix[4:8]) != "ftyp" { + return prefix, nil + } + if binary.BigEndian.Uint32(prefix[:4]) == 1 { + if err := readTo(16); err != nil { + return nil, err + } + } + size, _ := sourceTypeSize(prefix) + if size <= maxSourcePrefix { + if err := readTo(size); err != nil { + return nil, err + } + } + return prefix, nil +} diff --git a/internal/imaging/source_test.go b/internal/imaging/source_test.go new file mode 100644 index 00000000..372f6ca0 --- /dev/null +++ b/internal/imaging/source_test.go @@ -0,0 +1,248 @@ +package imaging + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/binary" + "errors" + "image" + "image/color" + "io" + "os" + "path/filepath" + "sync" + "sync/atomic" + "testing" + + "fyne.io/fyne/v2/storage" + + "github.com/frathe/picfetch/internal/heicdecode" + "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/uitest" +) + +func TestSourceHEICAdmissionAndPixels(t *testing.T) { + data, err := os.ReadFile(filepath.Join("testdata", "test_exif.heic")) + if err != nil { + t.Fatal(err) + } + for _, name := range []string{"photo.heic", "photo.heif", "renamed.jpg"} { + t.Run(name, func(t *testing.T) { + var read, closed atomic.Int64 + stream := bytes.NewReader(data) + u := uitest.ReaderURI(storage.NewFileURI(name), func() (io.ReadCloser, error) { + return uitest.ReadCloser{ReadFunc: func(p []byte) (int, error) { + n, err := stream.Read(p) + read.Add(int64(n)) + return n, err + }, CloseFunc: func() error { closed.Add(1); return nil }}, nil + }) + pixels := image.NewNRGBA64(image.Rect(0, 0, 2, 3)) + pixels.SetNRGBA64(1, 2, color.NRGBA64{R: 0x1234, G: 0xabcd, B: 0x5678, A: 0x4321}) + calls := 0 + r := NewReader(func(ctx context.Context, op heicdecode.Operation, input client.Input) (heicdecode.Response, error) { + calls++ + if op != heicdecode.Decode { + t.Fatalf("operation = %v", op) + } + if name != "renamed.jpg" && read.Load() != 0 { + t.Fatal("extension source read before admission") + } + if read.Load() >= int64(len(data)) { + t.Fatal("full source read before admission") + } + got, err := input(ctx, int64(len(data))) + if err != nil || !bytes.Equal(got, data) { + t.Fatalf("input = %d bytes, %v", len(got), err) + } + return heicdecode.Response{Image: pixels, Config: image.Config{Width: 2, Height: 3, ColorModel: color.NRGBA64Model}, Metadata: &heicdecode.Metadata{Orientation: 6, Make: "Camera", DateTimeOriginal: "2026:09:16 12:34:56"}}, nil + }) + source, err := r.Read(context.Background(), u) + if err != nil { + t.Fatal(err) + } + if source.Bounds() != pixels.Bounds() || source.SHA256() != sha256.Sum256(data) { + t.Fatal("source bounds/digest changed") + } + for range 2 { + loaded, err := source.Decode(context.Background(), 0) + if err != nil { + t.Fatal(err) + } + if len(loaded.Frames) != 1 || loaded.Frames[0] != pixels || loaded.FileSize != int64(len(data)) || !loaded.HasEXIF { + t.Fatalf("source record = %+v", loaded) + } + } + if source.Metadata().Make != "Camera" || calls != 1 || read.Load() != int64(len(data)) || closed.Load() != 1 { + t.Fatal("source decoded/read twice or lost metadata/closure") + } + }) + } +} + +func TestSourceMetadataUsesIsolatedOperation(t *testing.T) { + data := []byte("owned source callback bytes") + path := writeTempFile(t, "photo.heic", data) + r := NewReader(func(ctx context.Context, op heicdecode.Operation, input client.Input) (heicdecode.Response, error) { + if op != heicdecode.DecodeExif { + t.Fatalf("metadata operation = %v", op) + } + if _, err := input(ctx, int64(len(data))); err != nil { + return heicdecode.Response{}, err + } + return heicdecode.Response{Metadata: &heicdecode.Metadata{Make: "Owned", GPSLatitude: 50.8, GPSLongitude: 4.3}}, nil + }) + m, err := r.Metadata(context.Background(), storage.NewFileURI(path)) + if err != nil || m.Make != "Owned" || !m.HasGPS || m.Latitude != 50.8 { + t.Fatalf("metadata = %+v, %v", m, err) + } +} + +func TestSourceCancellationClosesAdmittedInput(t *testing.T) { + started, stopped := make(chan struct{}), make(chan struct{}) + var once sync.Once + u := uitest.ReaderURI(storage.NewFileURI("owned.heic"), func() (io.ReadCloser, error) { + return uitest.ReadCloser{ReadFunc: func(_ []byte) (int, error) { close(started); <-stopped; return 0, io.ErrClosedPipe }, CloseFunc: func() error { once.Do(func() { close(stopped) }); return nil }}, nil + }) + r := NewReader(func(ctx context.Context, _ heicdecode.Operation, input client.Input) (heicdecode.Response, error) { + _, err := input(ctx, 128) + return heicdecode.Response{}, err + }) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + done := make(chan error, 1) + go func() { _, err := r.Read(ctx, u); done <- err }() + select { + case err := <-done: + t.Fatalf("reader returned before admission: %v", err) + case <-started: + } + cancel() + if err := <-done; !errors.Is(err, context.Canceled) { + t.Fatalf("cancelled read = %v", err) + } +} + +func TestSourceWithoutOwnerRejectsHEIC(t *testing.T) { + path := writeTempFile(t, "photo.heic", []byte("owned bytes")) + if _, err := (Reader{}).Read(context.Background(), storage.NewFileURI(path)); !errors.Is(err, client.ErrUnavailable) { + t.Fatalf("unconfigured source = %v", err) + } +} + +func TestSourceOrdinaryOrientationAndFacts(t *testing.T) { + data := halfRedHalfBlueJPEG(t, 20, 10, 6) + path := writeTempFile(t, "photo.jpg", data) + source, err := (Reader{}).Read(context.Background(), storage.NewFileURI(path)) + if err != nil { + t.Fatal(err) + } + wantData, wantBounds, err := ReadAndProbe(context.Background(), storage.NewFileURI(path)) + if err != nil { + t.Fatal(err) + } + want, err := DecodeRecord(context.Background(), wantData, 0) + if err != nil { + t.Fatal(err) + } + got, err := source.Decode(context.Background(), 0) + if err != nil { + t.Fatal(err) + } + if source.Bounds() != wantBounds || got.Frames[0].Bounds() != want.Frames[0].Bounds() || got.FileSize != want.FileSize || got.HasEXIF != want.HasEXIF || source.SHA256() != sha256.Sum256(data) { + t.Fatal("ordinary source facts changed") + } +} + +func TestSourceDispatchTypes(t *testing.T) { + for _, c := range []struct { + name string + brands []string + want sourceKind + }{ + {"heic", []string{"heic", "mif1"}, sourceIsolated}, + {"generic HEIF", []string{"mif1"}, sourceIsolated}, + {"avif", []string{"avif", "mif1"}, sourceAVIF}, + {"cr3", []string{"crx "}, sourceCR3}, + {"mixed", []string{"avif", "heic"}, sourceIsolated}, + } { + t.Run(c.name, func(t *testing.T) { + data := make([]byte, 12+4*len(c.brands)) + binary.BigEndian.PutUint32(data[:4], uint32(len(data))) + copy(data[4:8], "ftyp") + copy(data[8:12], c.brands[0]) + for i, brand := range c.brands[1:] { + copy(data[16+4*i:], brand) + } + if got := routeSource(data); got != c.want { + t.Fatalf("route = %v, want %v", got, c.want) + } + }) + } +} + +func TestByteMetadataAndPreviewRefuseHEIC(t *testing.T) { + data, err := os.ReadFile(filepath.Join("testdata", "test_exif.heic")) + if err != nil { + t.Fatal(err) + } + if !ReadMetadata(data).Empty() { + t.Fatal("byte metadata reached native HEIC container parsing") + } + if looksLikePreviewContainer(data) { + t.Fatal("HEIC admitted to native embedded-preview scan") + } +} + +func TestSourceDerivedViewsAndCaptureDate(t *testing.T) { + path := writeTempFile(t, "photo.heic", []byte("owned read bytes")) + u := storage.NewFileURI(path) + var operations []heicdecode.Operation + r := NewReader(func(ctx context.Context, op heicdecode.Operation, input client.Input) (heicdecode.Response, error) { + operations = append(operations, op) + if _, err := input(ctx, 128); err != nil { + return heicdecode.Response{}, err + } + return heicdecode.Response{Image: image.NewNRGBA64(image.Rect(0, 0, 40, 20)), Config: image.Config{Width: 40, Height: 20}, Metadata: &heicdecode.Metadata{DateTimeOriginal: "2026:09:16 12:34:56"}}, nil + }) + thumb, bounds, err := r.Thumbnail(context.Background(), u, 10) + if err != nil || thumb.Bounds().Size() != image.Pt(10, 5) || bounds.Size() != image.Pt(40, 20) { + t.Fatalf("thumbnail = %v, %v", bounds, err) + } + preview, err := r.Preview(context.Background(), u, 20, 1024) + if err != nil { + t.Fatal(err) + } + if len(preview.Frames) != 1 || preview.Frames[0].Bounds().Size() != image.Pt(20, 10) || len(preview.Delays) != 0 { + t.Fatal("HEIC preview changed geometry or became animated") + } + date, ok, err := r.CaptureDate(context.Background(), u) + if err != nil || !ok || date.Format("2006-01-02") != "2026-09-16" { + t.Fatalf("capture date = %v, %v, %v", date, ok, err) + } + if len(operations) != 3 || operations[0] != heicdecode.Decode || operations[1] != heicdecode.Decode || operations[2] != heicdecode.DecodeExif { + t.Fatalf("operations = %v", operations) + } +} + +func TestSourceAdmittedCancellationClosesInput(t *testing.T) { + started, stopped := make(chan struct{}), make(chan struct{}) + var once sync.Once + u := uitest.ReaderURI(storage.NewFileURI("owned.heic"), func() (io.ReadCloser, error) { + return uitest.ReadCloser{ReadFunc: func(_ []byte) (int, error) { close(started); <-stopped; return 0, io.ErrClosedPipe }, CloseFunc: func() error { once.Do(func() { close(stopped) }); return nil }}, nil + }) + admitted, cancel := context.WithCancel(context.Background()) + defer cancel() + r := NewReader(func(_ context.Context, _ heicdecode.Operation, input client.Input) (heicdecode.Response, error) { + _, err := input(admitted, 128) + return heicdecode.Response{}, err + }) + done := make(chan error, 1) + go func() { _, err := r.Read(context.Background(), u); done <- err }() + <-started + cancel() + if err := <-done; !errors.Is(err, context.Canceled) { + t.Fatalf("admitted cancellation = %v", err) + } +} diff --git a/internal/imaging/testdata/README.md b/internal/imaging/testdata/README.md index bc123082..cfad8c0a 100644 --- a/internal/imaging/testdata/README.md +++ b/internal/imaging/testdata/README.md @@ -1,7 +1,9 @@ # Image fixtures -`test_exif.heic` is retained solely to test rejection of unsupported HEIC -images. It contains image data, not decoder code. It was copied from +`test_exif.heic` tests production rejection of unsupported HEIC images and the +candidate sandboxed helper's ordinary metadata/container-rotation behavior. +It is a synthetic TestCam/Model123 fixture, not a camera photograph. It contains +image data, not decoder code. It was copied from [gen2brain/heic](https://github.com/gen2brain/heic/tree/v0.7.1/testdata), whose [MIT license](https://github.com/gen2brain/heic/blob/v0.7.1/LICENSE) is retained below. The HEIC decoder is not a PicFetch dependency. diff --git a/internal/mosaic/generator.go b/internal/mosaic/generator.go index 0852d494..77b8e2f5 100644 --- a/internal/mosaic/generator.go +++ b/internal/mosaic/generator.go @@ -36,8 +36,13 @@ type Generator struct { } // New creates a mosaic generator backed by PicFetch's canonical image loader. -func New() *Generator { - return &Generator{load: loadCanonicalSource, cacheBytes: defaultRepeatCacheBytes, previewClock: time.Now} +func New() *Generator { return NewWithReader(imaging.Reader{}) } + +// NewWithReader binds every source to the caller's canonical reader. +func NewWithReader(reader imaging.Reader) *Generator { + return &Generator{load: func(ctx context.Context, uri fyne.URI) (*loadedSource, error) { + return loadSourceWithReader(ctx, uri, reader) + }, cacheBytes: defaultRepeatCacheBytes, previewClock: time.Now} } // Generate renders one validated request with a fresh production generator. @@ -234,11 +239,15 @@ func validateStoredRequest(request Request) error { } func loadCanonicalSource(ctx context.Context, uri fyne.URI) (*loadedSource, error) { - data, bounds, err := imaging.ReadAndProbe(ctx, uri) + return loadSourceWithReader(ctx, uri, imaging.Reader{}) +} + +func loadSourceWithReader(ctx context.Context, uri fyne.URI, reader imaging.Reader) (*loadedSource, error) { + source, err := reader.Read(ctx, uri) if err != nil { return nil, err } - decoded, err := imaging.DecodeLoaded(ctx, data, 0) + decoded, err := source.Decode(ctx, 0) if err != nil { return nil, err } @@ -247,7 +256,7 @@ func loadCanonicalSource(ctx context.Context, uri fyne.URI) (*loadedSource, erro } sourceBounds := decoded.Frames[0].Bounds() if decoded.Vector != nil { - sourceBounds = bounds + sourceBounds = source.Bounds() } return &loadedSource{ diff --git a/internal/similarity/analyze.go b/internal/similarity/analyze.go index 0ffb92db..a31073f2 100644 --- a/internal/similarity/analyze.go +++ b/internal/similarity/analyze.go @@ -3,7 +3,6 @@ package similarity import ( "bytes" "context" - "crypto/sha256" "fmt" "image/jpeg" "os" @@ -125,13 +124,13 @@ func analyzeLocal(ctx context.Context, req request, controls <-chan Control, emi } if sourceErr == nil && reused && (item.Facts.Version != FactsVersion || item.Facts.Width <= 0 || item.Facts.Height <= 0) { factsStart := time.Now() - data, bounds, readErr := imaging.ReadAndProbe(ctx, storage.NewFileURI(path)) + source, readErr := req.reader.Read(ctx, storage.NewFileURI(path)) sourceErr = readErr - if sourceErr == nil && fmt.Sprintf("%x", sha256.Sum256(data)) != item.SHA256 { + if sourceErr == nil && fmt.Sprintf("%x", source.SHA256()) != item.SHA256 { sourceErr = fmt.Errorf("source changed since cached representation") } if sourceErr == nil { - item.Facts = imageFacts(path, data, bounds) + item.Facts = imageFacts(path, source) backfilled = true } event.Measurements.DecodeSeconds += time.Since(factsStart).Seconds() @@ -147,12 +146,12 @@ func analyzeLocal(ctx context.Context, req request, controls <-chan Control, emi } } decodeStart := time.Now() - data, bounds, readErr := imaging.ReadAndProbe(ctx, storage.NewFileURI(path)) + source, readErr := req.reader.Read(ctx, storage.NewFileURI(path)) sourceErr = readErr if sourceErr == nil { - item.Facts = imageFacts(path, data, bounds) - item.SHA256 = fmt.Sprintf("%x", sha256.Sum256(data)) - loaded, decodeErr := imaging.DecodeLoaded(ctx, data, 1) + item.Facts = imageFacts(path, source) + item.SHA256 = fmt.Sprintf("%x", source.SHA256()) + loaded, decodeErr := source.Decode(ctx, 1) event.Measurements.DecodeSeconds += time.Since(decodeStart).Seconds() sourceErr = decodeErr if sourceErr == nil { diff --git a/internal/similarity/client.go b/internal/similarity/client.go index f4fdf825..d4e780c6 100644 --- a/internal/similarity/client.go +++ b/internal/similarity/client.go @@ -9,11 +9,13 @@ import ( "io" "net/http" "os" + "os/exec" "os/signal" "path/filepath" "syscall" "time" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" "github.com/frathe/picfetch/internal/imaging" ) @@ -45,6 +47,9 @@ func (d *workerDecoder) Decode(value any) error { // Assets may override the installed assets directory for a local trial. type Client struct { Assets string + // HEIC is the application's shared admission owner. Nil preserves the + // existing unavailable-format behavior; workers never launch their own. + HEIC *heicclient.Client // HTTPClient configures asset downloads; analysis never uses it. HTTPClient *http.Client // FavoritesDir supplies membership and, unless disabled, Favorite analysis. @@ -58,13 +63,15 @@ type Client struct { } type request struct { - Search *SearchRequest `json:",omitempty"` + HEIC *heicclient.PipeConfig `json:",omitempty"` + Search *SearchRequest `json:",omitempty"` Assets string FavoritesDir string GeneralAnalysisDir string DisableFavoriteCache bool Paths []string MaxEncodedBytes int64 + reader imaging.Reader } // Analyze streams serialized immutable snapshots and waits for worker exit. @@ -87,6 +94,15 @@ func (c Client) Analyze(ctx context.Context, paths []string, controls <-chan Con req := request{Assets: assets, FavoritesDir: c.FavoritesDir, GeneralAnalysisDir: c.GeneralAnalysisDir, DisableFavoriteCache: c.DisableFavoriteCache, Paths: paths, MaxEncodedBytes: imaging.MaxEncodedBytes()} cmd := workerCommand(ctx, executable) cmd.Env = append(os.Environ(), workerEnvironment+"=1") + return c.analyzeCommand(ctx, cmd, req, controls, emit) +} + +func (c Client) analyzeCommand(ctx context.Context, cmd *exec.Cmd, req request, controls <-chan Control, emit func(Event)) error { + link, err := c.attachHEIC(ctx, cmd, &req) + if err != nil { + return err + } + defer closeHEICAttachment(link) input, err := cmd.StdinPipe() if err != nil { return err @@ -102,6 +118,9 @@ func (c Client) Analyze(ctx context.Context, paths []string, controls <-chan Con if err := cmd.Start(); err != nil { return err } + if link != nil { + link.Started() + } stopWriter := make(chan struct{}) writerDone := make(chan struct{}) go func() { @@ -215,51 +234,56 @@ func WorkerMain() bool { } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() - var req request input, err := controlInput() if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer func() { _ = input.Close() }() - decoder := newWorkerDecoder(input) - err = decoder.Decode(&req) - if err == nil { - imaging.SetMaxEncodedBytes(req.MaxEncodedBytes) - if req.Search != nil { - if err := searchWorker(ctx, req, decoder, input); err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - return true - } - readCtx, cancelRead := context.WithCancel(ctx) - controls := make(chan Control, 1) - readDone := make(chan struct{}) - go func() { - defer close(readDone) - defer close(controls) - for { - var control Control - if err := decoder.Decode(&control); err != nil { - return - } - select { - case controls <- control: - case <-readCtx.Done(): - return - } - } - }() - output := json.NewEncoder(os.Stdout) - err = analyzeLocal(ctx, req, controls, func(event Event) error { return output.Encode(event) }) - cancelRead() - _ = input.Close() - <-readDone - } - if err != nil { + if err = runWorker(ctx, input); err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } return true } + +func runWorker(ctx context.Context, input io.ReadCloser) error { + var req request + decoder := newWorkerDecoder(input) + if err := decoder.Decode(&req); err != nil { + return err + } + cleanup, err := openWorkerSource(&req) + if err != nil { + return err + } + defer cleanup() + imaging.SetMaxEncodedBytes(req.MaxEncodedBytes) + if req.Search != nil { + return searchWorker(ctx, req, decoder, input) + } + readCtx, cancelRead := context.WithCancel(ctx) + controls := make(chan Control, 1) + readDone := make(chan struct{}) + go func() { + defer close(readDone) + defer close(controls) + for { + var control Control + if err := decoder.Decode(&control); err != nil { + return + } + select { + case controls <- control: + case <-readCtx.Done(): + return + } + } + }() + output := json.NewEncoder(os.Stdout) + err = analyzeLocal(ctx, req, controls, func(event Event) error { return output.Encode(event) }) + cancelRead() + _ = input.Close() + <-readDone + return err +} diff --git a/internal/similarity/facts.go b/internal/similarity/facts.go index 1b0964c2..b8b69416 100644 --- a/internal/similarity/facts.go +++ b/internal/similarity/facts.go @@ -1,15 +1,15 @@ package similarity import ( - "image" "path/filepath" "strings" "github.com/frathe/picfetch/internal/imaging" ) -func imageFacts(path string, data []byte, bounds image.Rectangle) ImageFacts { - metadata := imaging.ReadMetadata(data) +func imageFacts(path string, source *imaging.Source) ImageFacts { + metadata := source.Metadata() + bounds := source.Bounds() facts := ImageFacts{Version: FactsVersion, Width: bounds.Dx(), Height: bounds.Dy(), Format: strings.ToLower(strings.TrimPrefix(filepath.Ext(path), ".")), Make: strings.TrimSpace(metadata.Make), Model: strings.TrimSpace(metadata.Model)} diff --git a/internal/similarity/heic.go b/internal/similarity/heic.go new file mode 100644 index 00000000..c4dfc946 --- /dev/null +++ b/internal/similarity/heic.go @@ -0,0 +1,43 @@ +package similarity + +import ( + "context" + "os/exec" + + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" +) + +func (c Client) attachHEIC(ctx context.Context, cmd *exec.Cmd, req *request) (*heicclient.Attachment, error) { + req.HEIC = nil + if c.HEIC == nil { + return nil, nil + } + link, err := c.HEIC.Attach(ctx, cmd) + if err != nil { + return nil, err + } + req.HEIC = &link.Config + return link, nil +} + +func closeHEICAttachment(link *heicclient.Attachment) { + if link != nil { + link.Stop() + link.Wait() + } +} + +// Setup and disposal belong to the worker request, before any source work and +// before WorkerMain's exit. A remote has no executable or fallback decoder. +func openWorkerSource(req *request) (func(), error) { + if req.HEIC == nil { + return func() {}, nil + } + remote, err := heicclient.OpenRemote(*req.HEIC) + if err != nil { + return nil, err + } + req.reader = imaging.NewReader(remote.Do) + return func() { remote.Stop(); remote.Wait() }, nil +} diff --git a/internal/similarity/heic_test.go b/internal/similarity/heic_test.go new file mode 100644 index 00000000..eb5aecbb --- /dev/null +++ b/internal/similarity/heic_test.go @@ -0,0 +1,192 @@ +package similarity + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/json" + "errors" + "fmt" + "image" + "image/jpeg" + "io" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "fyne.io/fyne/v2/storage" + + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" +) + +func TestAnalysisWorkersUseHEICOwner(t *testing.T) { + for _, search := range []bool{false, true} { + for _, cancelAfterDelivery := range []bool{false, true} { + t.Run(fmt.Sprintf("search=%v/cancel=%v", search, cancelAfterDelivery), func(t *testing.T) { + runAnalysisHEICOwner(t, search, cancelAfterDelivery) + }) + } + } +} + +func runAnalysisHEICOwner(t *testing.T, search, cancelAfterDelivery bool) { + t.Helper() + // A mismatched pin exercises the owner's typed refusal before source input. + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + owner, err := heicclient.New(heicclient.Config{Executable: executable, SHA256: [32]byte{1}, Limits: heicdecode.DefaultLimits(0)}) + if err != nil { + t.Fatal(err) + } + defer func() { owner.Stop(); owner.Wait() }() + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + cmd := exec.CommandContext(ctx, executable, "-test.run=^TestHEICAnalysisHelper$", "-test.timeout=8s") + mode := "exit" + if cancelAfterDelivery { + mode = "wait" + } + cmd.Env = append(os.Environ(), "PICFETCH_OWNED_HEIC_ANALYSIS="+mode) + req := request{} + client := Client{HEIC: owner} + seen := false + observe := func(delivered bool) { + seen = delivered + if cancelAfterDelivery { + cancel() + } + } + if search { + req.Search = &SearchRequest{SessionID: 17} + err = client.searchCommand(ctx, cmd, req, nil, func(event SearchEvent) { observe(event.Kind == SearchReady) }) + } else { + err = client.analyzeCommand(ctx, cmd, req, nil, func(event Event) { observe(event.Complete) }) + } + if !seen || (!cancelAfterDelivery && err != nil) || (cancelAfterDelivery && !errors.Is(err, context.Canceled)) { + t.Fatalf("shared owner result: seen=%v, %v", seen, err) + } + if cmd.ProcessState == nil { + t.Fatal("analysis return preceded process join") + } +} + +func TestHEICAnalysisHelper(_ *testing.T) { + if os.Getenv("PICFETCH_OWNED_HEIC_ANALYSIS") == "" { + return + } + if err := ownedHEICAnalysis(); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + os.Exit(0) +} + +func ownedHEICAnalysis() error { + var req request + if err := json.NewDecoder(os.Stdin).Decode(&req); err != nil { + return err + } + if req.HEIC == nil { + return fmt.Errorf("analysis did not receive the owner's pipe handles") + } + cleanup, err := openWorkerSource(&req) + if err != nil { + return err + } + defer cleanup() + _ = RegisterLocalFiles() + // The HEIC suffix forces dispatch; the owner refuses before invoking + // the bulk input callback, so no encoded file content is needed. + file, err := os.CreateTemp("", "picfetch-owned-analysis-*.heic") + if err != nil { + return err + } + defer func() { _ = os.Remove(file.Name()) }() + if err = file.Close(); err != nil { + return err + } + _, err = req.reader.Read(context.Background(), storage.NewFileURI(file.Name())) + var failure *heicdecode.Failure + if !errors.As(err, &failure) || failure.Status != heicdecode.StatusUnavailable { + return fmt.Errorf("expected owner refusal, got %v", err) + } + if req.Search != nil { + err = json.NewEncoder(os.Stdout).Encode(SearchEvent{SessionID: req.Search.SessionID, Revision: 1, Kind: SearchReady}) + } else { + err = json.NewEncoder(os.Stdout).Encode(Event{Complete: true}) + } + if err == nil && os.Getenv("PICFETCH_OWNED_HEIC_ANALYSIS") == "wait" { + _, err = io.Copy(io.Discard, os.Stdin) + } + return err +} + +func TestAnalysisHEICAttachmentStartFailureJoins(t *testing.T) { + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + owner, err := heicclient.New(heicclient.Config{Executable: executable, SHA256: [32]byte{1}, Limits: heicdecode.DefaultLimits(0)}) + if err != nil { + t.Fatal(err) + } + defer func() { owner.Stop(); owner.Wait() }() + client := Client{HEIC: owner} + for _, search := range []bool{false, true} { + for range 10 { + cmd := exec.Command(filepath.Join(t.TempDir(), "picfetch-owned-missing-executable")) + if search { + err = client.searchCommand(context.Background(), cmd, request{Search: &SearchRequest{}}, nil, func(_ SearchEvent) {}) + } else { + err = client.analyzeCommand(context.Background(), cmd, request{}, nil, func(_ Event) {}) + } + if err == nil || errors.Is(err, heicclient.ErrBusy) { + t.Fatalf("start failure leaked service admission: %v", err) + } + } + } +} + +func TestSearchPreviewUsesInjectedHEICReader(t *testing.T) { + _ = RegisterLocalFiles() + data := []byte("owned HEIC source callback") + path := filepath.Join(t.TempDir(), "photo.heic") + if err := os.WriteFile(path, data, 0600); err != nil { + t.Fatal(err) + } + info, err := os.Stat(path) + if err != nil { + t.Fatal(err) + } + calls := 0 + reader := imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + calls++ + if op != heicdecode.Decode { + t.Fatalf("preview operation = %v", op) + } + got, err := input(ctx, 128) + if err != nil { + return heicdecode.Response{}, err + } + if !bytes.Equal(got, data) { + return heicdecode.Response{}, io.ErrUnexpectedEOF + } + return heicdecode.Response{Image: image.NewNRGBA64(image.Rect(0, 0, 4, 6)), Config: image.Config{Width: 4, Height: 6}, Metadata: &heicdecode.Metadata{Make: "Owned camera", DateTimeOriginal: "2026:09:16 12:34:56"}}, nil + }) + p := searchPreparer{reader: reader, versions: map[string]os.FileInfo{path: info}} + item := Item{Path: path, SHA256: fmt.Sprintf("%x", sha256.Sum256(data))} + got, err := p.completePreview(context.Background(), item) + if err != nil { + t.Fatal(err) + } + pixels, err := jpeg.Decode(bytes.NewReader(got.Preview)) + if err != nil || pixels.Bounds().Size() != image.Pt(4, 6) || calls != 1 { + t.Fatalf("preview decoder: calls=%d, %v", calls, err) + } +} diff --git a/internal/similarity/search_client.go b/internal/similarity/search_client.go index b56d4489..6e2f68ad 100644 --- a/internal/similarity/search_client.go +++ b/internal/similarity/search_client.go @@ -36,10 +36,16 @@ func (c Client) Search(ctx context.Context, search SearchRequest, queries <-chan req := request{Assets: assets, MaxEncodedBytes: imaging.MaxEncodedBytes(), Search: &search} cmd := workerCommand(ctx, executable) cmd.Env = append(os.Environ(), workerEnvironment+"=1") - return searchCommand(ctx, cmd, req, queries, emit) + return c.searchCommand(ctx, cmd, req, queries, emit) } -func searchCommand(ctx context.Context, cmd *exec.Cmd, req request, queries <-chan SearchQuery, emit func(SearchEvent)) error { +func (c Client) searchCommand(ctx context.Context, cmd *exec.Cmd, req request, queries <-chan SearchQuery, emit func(SearchEvent)) error { + link, err := c.attachHEIC(ctx, cmd, &req) + if err != nil { + return err + } + defer closeHEICAttachment(link) + // Reject large path inventories before JSON encoding can duplicate them. if req.Search != nil { remaining := workerRequestLimit @@ -73,6 +79,9 @@ func searchCommand(ctx context.Context, cmd *exec.Cmd, req request, queries <-ch if err := cmd.Start(); err != nil { return err } + if link != nil { + link.Started() + } stop := make(chan struct{}) done := make(chan struct{}) go func() { diff --git a/internal/similarity/search_protocol_test.go b/internal/similarity/search_protocol_test.go index 4a9a4c67..aee60f03 100644 --- a/internal/similarity/search_protocol_test.go +++ b/internal/similarity/search_protocol_test.go @@ -25,7 +25,7 @@ func TestSearchProtocolInitialFlowAndControlClosure(t *testing.T) { queries := searchProtocolQueries(t, ctx, req) cmd := searchProtocolCommand(t, ctx, "clean") var events []SearchEvent - err := searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { + err := (Client{}).searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { events = append(events, event) if event.Kind == SearchReady { close(queries) @@ -57,7 +57,7 @@ func TestSearchProtocolRejectsInvalidStreams(t *testing.T) { queries := searchProtocolQueries(t, ctx, req) cmd := searchProtocolCommand(t, ctx, mode) var events []SearchEvent - err := searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { events = append(events, event) }) + err := (Client{}).searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { events = append(events, event) }) if err == nil || errors.Is(err, context.DeadlineExceeded) { t.Fatalf("invalid stream was accepted or stalled until timeout: %v", err) } @@ -82,7 +82,7 @@ func TestSearchProtocolCancellationJoinsProcessAndControls(t *testing.T) { queries := make(chan SearchQuery) cmd := searchProtocolCommand(t, ctx, mode) delivered := 0 - err := searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { + err := (Client{}).searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { delivered++ if event.Kind != SearchProgress { t.Errorf("unexpected pre-cancellation event: %+v", event) @@ -122,7 +122,7 @@ func TestSearchProtocolCancellationJoinsProcessAndControls(t *testing.T) { done := make(chan struct{}) go func() { defer close(done) - completed <- searchCommand(checking, cmd, req, queries, func(_ SearchEvent) { cancel() }) + completed <- (Client{}).searchCommand(checking, cmd, req, queries, func(_ SearchEvent) { cancel() }) }() t.Cleanup(func() { cancel(); releaseWriter(); searchProtocolWait(t, done) }) searchProtocolWait(t, checking.writerEntered) @@ -154,7 +154,7 @@ func TestSearchProtocolExitBeforeReady(t *testing.T) { queries := searchProtocolQueries(t, ctx, req) cmd := searchProtocolCommand(t, ctx, mode) delivered := 0 - err := searchCommand(ctx, cmd, req, queries, func(_ SearchEvent) { delivered++ }) + err := (Client{}).searchCommand(ctx, cmd, req, queries, func(_ SearchEvent) { delivered++ }) wantError := "before readiness" if mode == "provider_error" { wantError = "fixture worker setup failed" @@ -368,7 +368,7 @@ func TestSearchProtocolRejectsOversizedRequestBeforeLaunch(t *testing.T) { req.Search.Paths[i] = fmt.Sprintf("%s%d", path, i) } cmd := searchProtocolCommand(t, context.Background(), "early_exit") - err := searchCommand(context.Background(), cmd, req, nil, func(_ SearchEvent) {}) + err := (Client{}).searchCommand(context.Background(), cmd, req, nil, func(_ SearchEvent) {}) if err == nil || !strings.Contains(err.Error(), "request exceeds") || cmd.Process != nil { t.Fatalf("oversized scope launched worker instead of rejecting admission: process=%v err=%v", cmd.Process, err) } diff --git a/internal/similarity/search_worker.go b/internal/similarity/search_worker.go index 653b944b..ee030ee0 100644 --- a/internal/similarity/search_worker.go +++ b/internal/similarity/search_worker.go @@ -3,7 +3,6 @@ package similarity import ( "bytes" "context" - "crypto/sha256" "errors" "fmt" "image/jpeg" @@ -15,6 +14,7 @@ import ( ) type searchPreparer struct { + reader imaging.Reader assets string cache *representationStore encoder *Encoder @@ -43,11 +43,11 @@ func (p *searchPreparer) prepare(ctx context.Context, path string) (Item, bool, reused = true } if !reused { - data, bounds, err := imaging.ReadAndProbe(ctx, storage.NewFileURI(path)) + source, err := p.reader.Read(ctx, storage.NewFileURI(path)) if err != nil { return item, false, err } - loaded, err := imaging.DecodeLoaded(ctx, data, 1) + loaded, err := source.Decode(ctx, 1) if err != nil { return item, false, err } @@ -61,8 +61,8 @@ func (p *searchPreparer) prepare(ctx context.Context, path string) (Item, bool, if err != nil { return item, false, err } - item.Facts = imageFacts(path, data, bounds) - item.SHA256 = fmt.Sprintf("%x", sha256.Sum256(data)) + item.Facts = imageFacts(path, source) + item.SHA256 = fmt.Sprintf("%x", source.SHA256()) var preview bytes.Buffer if err := jpeg.Encode(&preview, imaging.ScaleForExport(loaded.Frames[0], 160), &jpeg.Options{Quality: 80}); err != nil { return item, false, err @@ -107,7 +107,7 @@ func searchLocal(ctx context.Context, req request, queries <-chan SearchQuery, e if cache != nil { defer cache.close() } - p := searchPreparer{assets: req.Assets, cache: cache, versions: map[string]os.FileInfo{}} + p := searchPreparer{reader: req.reader, assets: req.Assets, cache: cache, versions: map[string]os.FileInfo{}} if cacheErr != nil { p.warning = cacheErr.Error() } @@ -172,14 +172,14 @@ func (p *searchPreparer) refreshFavorites(ctx context.Context, items []Item) { } func (p *searchPreparer) completePreview(ctx context.Context, item Item) (Item, error) { - data, _, err := imaging.ReadAndProbe(ctx, storage.NewFileURI(item.Path)) + source, err := p.reader.Read(ctx, storage.NewFileURI(item.Path)) if err != nil { return item, err } - if fmt.Sprintf("%x", sha256.Sum256(data)) != item.SHA256 { + if fmt.Sprintf("%x", source.SHA256()) != item.SHA256 { return item, fmt.Errorf("source changed before Favorite persistence") } - loaded, err := imaging.DecodeLoaded(ctx, data, 1) + loaded, err := source.Decode(ctx, 1) if err != nil { return item, err } diff --git a/internal/ui/build.go b/internal/ui/build.go index a9049c13..09e0cf1b 100644 --- a/internal/ui/build.go +++ b/internal/ui/build.go @@ -42,7 +42,7 @@ func buildViewer(application fyne.App, startup startupState) (*viewer, fyne.Wind var view *viewer cache := imaging.NewImgCache(int64(prefs.MaxImageCacheMB) * bytesPerMB) - presentation := display.New(display.Config{Cache: cache, Callbacks: display.Callbacks{ + presentation := display.New(display.Config{Reader: startup.images.foreground, PreloadReader: startup.images.background, Cache: cache, Callbacks: display.Callbacks{ Repaint: func() { view.ForceRepaint() }, Requested: func(id display.Identity) { view.imageRequested(id) }, Probed: func(bounds image.Rectangle) { view.imageProbed(bounds) }, @@ -69,6 +69,7 @@ func buildViewer(application fyne.App, startup startupState) (*viewer, fyne.Wind loadingBar.Hide() view = &viewer{ + images: startup.images, app: application, win: window, quit: application.Quit, diff --git a/internal/ui/compare.go b/internal/ui/compare.go index 646ed942..ff0e4cd2 100644 --- a/internal/ui/compare.go +++ b/internal/ui/compare.go @@ -69,14 +69,14 @@ func (v *viewer) loadComparedImage(ctx context.Context, uri fyne.URI) (*imaging. } continue } - data, _, err := imaging.ReadAndProbe(ctx, uri) + source, err := v.images.foreground.Read(ctx, uri) if err != nil { if !writer.Current() { continue } return nil, err } - loaded, err := imaging.DecodeRecord(ctx, data, v.imgCache.Budget()) + loaded, err := source.Decode(ctx, v.imgCache.Budget()) if !writer.Current() { continue } diff --git a/internal/ui/display/feature.go b/internal/ui/display/feature.go index 6cf9fc96..861e69e3 100644 --- a/internal/ui/display/feature.go +++ b/internal/ui/display/feature.go @@ -35,6 +35,8 @@ type Snapshot struct { // Config supplies instance dependencies before presentation starts. type Config struct { + Reader imaging.Reader + PreloadReader imaging.Reader Queue UIQueue AnimationAfter func(time.Duration) <-chan time.Time Callbacks Callbacks diff --git a/internal/ui/display/load.go b/internal/ui/display/load.go index ae9ac186..5e5f9b83 100644 --- a/internal/ui/display/load.go +++ b/internal/ui/display/load.go @@ -56,8 +56,9 @@ func (f *Feature) attemptLoad(token requestToken, request Request, done func()) return } f.loadWorkers.Go(func() { - data, bounds, err := imaging.ReadAndProbe(token.context(), u) + source, err := f.config.Reader.Read(token.context(), u) if err == nil && f.config.Callbacks.Probed != nil { + bounds := source.Bounds() f.config.Queue.Do(func() { if token.current() && writer.Current() { f.config.Callbacks.Probed(bounds) @@ -66,7 +67,7 @@ func (f *Feature) attemptLoad(token requestToken, request Request, done func()) } var loaded *imaging.LoadedImage if err == nil { - loaded, err = imaging.DecodeRecord(token.context(), data, f.config.Cache.Budget()) + loaded, err = source.Decode(token.context(), f.config.Cache.Budget()) } f.config.Queue.Do(func() { if !token.current() { diff --git a/internal/ui/display/load_contract_test.go b/internal/ui/display/load_contract_test.go index 04a3b27c..82c25b32 100644 --- a/internal/ui/display/load_contract_test.go +++ b/internal/ui/display/load_contract_test.go @@ -15,11 +15,51 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/storage" + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" "github.com/frathe/picfetch/internal/imaging" "github.com/frathe/picfetch/internal/ui/display" "github.com/frathe/picfetch/internal/uitest" ) +func TestHEICDisplayAndPreloadUseInjectedReaders(t *testing.T) { + uri := func(name string) fyne.URI { + return uitest.ReaderURI(storage.NewFileURI("/"+name+".heic"), func() (io.ReadCloser, error) { + return io.NopCloser(bytes.NewReader([]byte(name))), nil + }) + } + first, next := uri("first"), uri("next") + var foreground, background atomic.Int64 + reader := func(calls *atomic.Int64, width int) imaging.Reader { + return imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + calls.Add(1) + if _, err := input(ctx, 128); err != nil { + return heicdecode.Response{}, err + } + if op != heicdecode.Decode { + return heicdecode.Response{}, heicdecode.ErrInvalidRequest + } + pixels := image.NewNRGBA64(image.Rect(0, 0, width, 3)) + return heicdecode.Response{Image: pixels, Config: image.Config{Width: width, Height: 3}, Metadata: &heicdecode.Metadata{Make: "Owned"}}, nil + }) + } + f := newPresentation(t, display.Config{Reader: reader(&foreground, 2), PreloadReader: reader(&background, 4), Callbacks: display.Callbacks{Presented: func(_ display.Snapshot) []fyne.URI { return []fyne.URI{next} }}}) + f.Load(display.Request{Source: first}) + f.Settle() + if f.Surface().Image == nil || f.Surface().Image.Bounds().Size() != image.Pt(2, 3) || !f.Snapshot().HasEXIF { + t.Fatal("foreground source did not reach presentation") + } + loaded, ok := f.cache.Get(next.String()) + if !ok || loaded.Frames[0].Bounds().Size() != image.Pt(4, 3) || !loaded.HasEXIF || loaded.FileSize != 4 { + t.Fatal("preload source did not retain complete cache facts") + } + f.Load(display.Request{Source: next}) + f.Settle() + if foreground.Load() != 1 || background.Load() != 1 || f.Surface().Image != loaded.Frames[0] { + t.Fatal("preload handoff decoded again or changed pixels") + } +} + func loadContract(t *testing.T) { t.Run("cache generation", loadCacheGenerationContract) t.Run("retired worker", loadRetiredWorkerContract) diff --git a/internal/ui/display/preload.go b/internal/ui/display/preload.go index 46ba42cb..3232a42d 100644 --- a/internal/ui/display/preload.go +++ b/internal/ui/display/preload.go @@ -38,7 +38,7 @@ func (f *Feature) preloadOne(token requestToken, u fyne.URI) { return } - data, bounds, err := imaging.ReadAndProbe(token.context(), u) + source, err := f.config.PreloadReader.Read(token.context(), u) if err != nil { return } @@ -54,11 +54,11 @@ func (f *Feature) preloadOne(token requestToken, u fyne.URI) { // current image, so bail on the header alone rather than paying // for the decode first. Half the budget is where the current image // and one neighbor stop both fitting. - if imaging.EstimateDecodedBytes(bounds) > budget/2 { + if imaging.EstimateDecodedBytes(source.Bounds()) > budget/2 { return } - loaded, err := imaging.DecodeRecord(token.context(), data, budget) + loaded, err := source.Decode(token.context(), budget) if err != nil { return } diff --git a/internal/ui/exifwin/exifwin.go b/internal/ui/exifwin/exifwin.go index d2a10412..7b03af73 100644 --- a/internal/ui/exifwin/exifwin.go +++ b/internal/ui/exifwin/exifwin.go @@ -62,8 +62,9 @@ type Host interface { // Singleton): a second request raises the existing window rather than // stacking up duplicates. type Window struct { - app fyne.App - host Host + reader imaging.Reader + app fyne.App + host Host win widgets.Singleton @@ -134,7 +135,13 @@ type Window struct { // New returns the EXIF window for application. host.DisplayedFile is called // on every open and refresh to find the file to read. func New(application fyne.App, host Host) *Window { + return NewWithReader(application, host, imaging.Reader{}) +} + +// NewWithReader installs the canonical source dependency before work starts. +func NewWithReader(application fyne.App, host Host, reader imaging.Reader) *Window { w := &Window{ + reader: reader, app: application, host: host, tiles: newTileFetcher(osmTiles, nil), diff --git a/internal/ui/exifwin/metadata.go b/internal/ui/exifwin/metadata.go index 00e9a2f5..fa5dbcb2 100644 --- a/internal/ui/exifwin/metadata.go +++ b/internal/ui/exifwin/metadata.go @@ -62,15 +62,8 @@ func (w *Window) Refresh() { generation := w.metadata.generation done := w.metadata.done.Begin() w.metadata.workers.Go(func() { - data, _, err := imaging.ReadAndProbe(ctx, u) - var metadata imaging.Metadata - var canStrip bool - if err == nil && ctx.Err() == nil { - metadata = imaging.ReadMetadata(data) - if ctx.Err() == nil { - canStrip = imaging.CanStripJPEGMetadata(data) && !metadata.Empty() - } - } + info, err := w.reader.InspectMetadata(ctx, u) + metadata, canStrip := info.Values, info.CanStrip if ctx.Err() != nil { cancel() done() diff --git a/internal/ui/favthumbs.go b/internal/ui/favthumbs.go index 5233807f..96d4eabb 100644 --- a/internal/ui/favthumbs.go +++ b/internal/ui/favthumbs.go @@ -66,7 +66,7 @@ func (v *viewer) SyncFavoritePreviews(favDir string, files []fyne.URI) { defer done() defer token.cancelContext() - if err := favthumbs.Sync(token.context(), favDir, files, sink); err != nil { + if err := favthumbs.SyncWithReader(token.context(), favDir, files, sink, v.images.background); err != nil { // A superseded pass returns context.Canceled, which is this // design working rather than anything failing. if errors.Is(err, context.Canceled) { diff --git a/internal/ui/features.go b/internal/ui/features.go index d0562951..1db16b69 100644 --- a/internal/ui/features.go +++ b/internal/ui/features.go @@ -38,7 +38,7 @@ var _ mosaicwin.Host = (*viewer)(nil) func registerFeatures(view *viewer, application fyne.App, window fyne.Window, prefs preferences.State) { view.help = help.New(application, appTitle, assets.ComparingWebP) view.welcomeArt.onCircles = view.help.ShowFinis - view.spiral = spiral.New(application) + view.spiral = spiral.NewWithReader(application, view.images.foreground) view.spiral.SetOnManual(view.help.ShowManual) view.help.SetOnSpiral(view.openSpiral) @@ -46,7 +46,7 @@ func registerFeatures(view *viewer, application fyne.App, window fyne.Window, pr // position poller; both doors reach the viewer-owned Spiral. view.spiralDrag = wingesture.New(wingesture.Config{}) view.spiralGesture = view.openSpiralForGesture - view.exif = exifwin.New(application, view) + view.exif = exifwin.NewWithReader(application, view, view.images.foreground) // Resolve these callbacks against the viewer at call time so tests can // replace keyModifiers after construction. @@ -111,12 +111,12 @@ func registerFeatures(view *viewer, application fyne.App, window fyne.Window, pr // The thumbnail-cache setter reaches into the grid, so the grid must be // registered before saved cache limits are applied. - view.grid = grid.New(view, window, view.dupes) + view.grid = grid.NewWithReader(view, window, view.dupes, view.images.background) view.explorer = explorerui.NewFeature(explorerHost{view}, explorerui.Options{ - App: application, Discussions: view.help.ShowDiscussions, Supported: similarity.SupportedPlatform(), + Client: similarity.Client{HEIC: view.images.owner}, App: application, Discussions: view.help.ShowDiscussions, Supported: similarity.SupportedPlatform(), Settings: explorerui.Settings{CacheFavorites: prefs.SimilarityFavoriteCache, AutoFit: prefs.SimilarityAutoFit, Automatic: prefs.SimilarityAutoUpdate, IntroSeen: prefs.SimilarityIntroSeen}, }) - view.visualsearch = searchui.New(searchHost{view}, searchui.Options{}) + view.visualsearch = searchui.New(searchHost{view}, searchui.Options{Provider: (similarity.Client{HEIC: view.images.owner}).Search}) view.grid.SetOnRankedOpen(view.searchImageOpened) view.compare = compareui.New( func(ctx context.Context, uri fyne.URI) (*imaging.LoadedImage, error) { diff --git a/internal/ui/filework.go b/internal/ui/filework.go index 35688564..4f34699f 100644 --- a/internal/ui/filework.go +++ b/internal/ui/filework.go @@ -202,12 +202,12 @@ func (v *viewer) refreshWrittenFile(result imaging.WriteResult, reload, refreshE done() return } - var data []byte + var metadata imaging.MetadataInfo var infoErr error if !reload { - data, _, infoErr = imaging.ReadAndProbe(ctx, storage.NewFileURI(path)) + metadata, infoErr = v.images.foreground.InspectMetadata(ctx, storage.NewFileURI(path)) } - hasEXIF := !imaging.ReadMetadata(data).Empty() + hasEXIF := !metadata.Values.Empty() if ctx.Err() != nil { done() return @@ -227,7 +227,7 @@ func (v *viewer) refreshWrittenFile(result imaging.WriteResult, reload, refreshE return } if infoErr == nil { - v.info.SetFile(int64(len(data)), hasEXIF, false) + v.info.SetFile(metadata.FileSize, hasEXIF, false) v.syncInfoOverlayVisibility() v.updateInfoOverlay() } diff --git a/internal/ui/grid/grid.go b/internal/ui/grid/grid.go index 5e31addf..8e6459ac 100644 --- a/internal/ui/grid/grid.go +++ b/internal/ui/grid/grid.go @@ -92,6 +92,7 @@ type Host interface { // Overview is the grid overlay and the state behind it. type Overview struct { + reader imaging.Reader ranked, pendingRanked *RankedVisit visitIndex *visitSourceIndex rankedBar *fyne.Container @@ -361,7 +362,13 @@ func unpackGridCell(cell *fyne.Container) (*canvas.Image, *canvas.Rectangle, *ca // real Fyne canvas focus, which this app deliberately never hands to // GridWrap (see Close's comment on why). func New(host Host, win fyne.Window, model *dupes.Model) *Overview { + return NewWithReader(host, win, model, imaging.Reader{}) +} + +// NewWithReader installs the canonical source dependency before work starts. +func NewWithReader(host Host, win fyne.Window, model *dupes.Model, reader imaging.Reader) *Overview { g := &Overview{ + reader: reader, host: host, win: win, sel: selection.New(), diff --git a/internal/ui/grid/hashengine.go b/internal/ui/grid/hashengine.go index d0651634..dc32eead 100644 --- a/internal/ui/grid/hashengine.go +++ b/internal/ui/grid/hashengine.go @@ -41,6 +41,7 @@ const hideApplyMinInterval = 250 * time.Millisecond // does have to touch the overlay comes back through Run's apply callback // instead (Overview.hashFactsReady). type hashEngine struct { + reader imaging.Reader // host, pool, thumbs, model and ui are the Overview's own, shared // rather than copied: the engine hashes onto the same decode pool the // cells decode on - which is what keeps Settle's decodes.Wait barrier @@ -172,7 +173,7 @@ func (e *hashEngine) Run(ctx context.Context, apply func(remaining int32, gen ui if thumb == nil { var err error version, _ = favthumbs.EntryName(file) - thumb, native, err = imaging.LoadThumbnailAndBoundsContext(ctx, file) + thumb, native, err = e.reader.Thumbnail(ctx, file, imaging.ThumbnailSize) if workCancelled(ctx, err) { return } @@ -203,7 +204,11 @@ func (e *hashEngine) Run(ctx context.Context, apply func(remaining int32, gen ui return } } else { - _, b, err := imaging.ReadAndProbe(ctx, file) + source, err := e.reader.Read(ctx, file) + var b image.Rectangle + if err == nil { + b = source.Bounds() + } if workCancelled(ctx, err) { return } diff --git a/internal/ui/grid/thumbs.go b/internal/ui/grid/thumbs.go index 97f96452..2c0fca7c 100644 --- a/internal/ui/grid/thumbs.go +++ b/internal/ui/grid/thumbs.go @@ -56,7 +56,7 @@ func (g *Overview) Warm() error { } version, _ := favthumbs.EntryName(u) - thumb, native, err := imaging.LoadThumbnailAndBoundsContext(ctx, u) + thumb, native, err := g.reader.Thumbnail(ctx, u, imaging.ThumbnailSize) if err != nil { return err } @@ -267,7 +267,7 @@ func (g *Overview) requestThumbnail(key *fyne.Container, img *canvas.Image, id i var err error var native image.Rectangle version, _ = favthumbs.EntryName(u) - if thumb, native, err = imaging.LoadThumbnailAndBoundsContext(ctx, u); err != nil { + if thumb, native, err = g.reader.Thumbnail(ctx, u, imaging.ThumbnailSize); err != nil { // No retry here: release lets the cell's next update pass // claim and try again, and the normal viewing path is // where the file's actual error surfaces to the user. diff --git a/internal/ui/grid/work.go b/internal/ui/grid/work.go index 0e5efb84..c0439cd2 100644 --- a/internal/ui/grid/work.go +++ b/internal/ui/grid/work.go @@ -37,7 +37,7 @@ func (g *Overview) restartWork() { g.work.generation = g.host.Generation() g.work.revision++ g.work.facts = g.dupes.CaptureFacts() - g.hashes = &hashEngine{host: g.host, pool: g.decodes, thumbs: g.thumbs, model: g.dupes, facts: g.work.facts, ui: g.ui} + g.hashes = &hashEngine{reader: g.reader, host: g.host, pool: g.decodes, thumbs: g.thumbs, model: g.dupes, facts: g.work.facts, ui: g.ui} } func (g *Overview) workContext() context.Context { diff --git a/internal/ui/harness_test.go b/internal/ui/harness_test.go index c029124f..92264d1b 100644 --- a/internal/ui/harness_test.go +++ b/internal/ui/harness_test.go @@ -78,7 +78,12 @@ func TestMain(m *testing.M) { // defer, so a second Close panics partway through and leaves that mutex // permanently locked - wedging every later test in the package that touches // a window, not just this one. -func newTestUI(t *testing.T) (v *viewer, win fyne.Window, closed func() bool) { +func newTestUI(t *testing.T) (*viewer, fyne.Window, func() bool) { + t.Helper() + return newTestUIWithImages(t, imageServices{}) +} + +func newTestUIWithImages(t *testing.T, images imageServices) (v *viewer, win fyne.Window, closed func() bool) { t.Helper() // Reassert the shared app as the current one before building: the @@ -101,10 +106,12 @@ func newTestUI(t *testing.T) (v *viewer, win fyne.Window, closed func() bool) { } } - v, win = buildStartupViewer(testApp) + startup := loadStartupState(testApp) + startup.images = images + v, win = buildConfiguredViewer(testApp, startup) v.display.SetUIQueue(&uitest.UIQueue{}) v.grid.SetUIQueue(&uitest.UIQueue{}) - v.visualsearch.Configure(searchui.Options{Queue: &uitest.UIQueue{}}) + v.visualsearch.Configure(searchui.Options{Provider: (similarity.Client{HEIC: images.owner}).Search, Queue: &uitest.UIQueue{}}) v.searchView.overlayUI = &uitest.UIQueue{} v.analysisDir = t.TempDir() v.analysisCache.Configure(analysiscache.Options{Roots: v.analysisRoots(), Queue: &uitest.UIQueue{}, ConfirmClear: v.settingsWin.ConfirmClearAnalysis, Changed: v.syncMenus}) @@ -194,6 +201,7 @@ func drain(t *testing.T, v *viewer) { // this test has already closed. Clearing it first also means nothing // can start a fresh scan behind the waits below. openwith.SetHandler(nil) + v.images.Stop() v.stopSearchOverlayWait() v.searchView.overlayWorkers.Wait() if v.searchView.overlayUI != nil { @@ -300,6 +308,7 @@ func drain(t *testing.T, v *viewer) { v.slides.Settle() v.spiral.Settle() v.exif.Settle() + v.images.Wait() close(settled) }() diff --git a/internal/ui/images.go b/internal/ui/images.go new file mode 100644 index 00000000..1cf87bc7 --- /dev/null +++ b/internal/ui/images.go @@ -0,0 +1,36 @@ +package ui + +import ( + "context" + + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" +) + +// imageServices owns one admission lane for this viewer and its analysis +// descendants. Readers are immutable dependencies installed before any work. +type imageServices struct { + owner *heicclient.Client + foreground, background imaging.Reader +} + +func newImageServices(owner *heicclient.Client) imageServices { + if owner == nil { + return imageServices{} + } + return imageServices{owner: owner, foreground: imaging.NewReader(owner.Do), background: imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + return owner.DoWithPriority(ctx, heicclient.Background, op, input) + })} +} + +func (s imageServices) Stop() { + if s.owner != nil { + s.owner.Stop() + } +} +func (s imageServices) Wait() { + if s.owner != nil { + s.owner.Wait() + } +} diff --git a/internal/ui/images_test.go b/internal/ui/images_test.go new file mode 100644 index 00000000..c94438ed --- /dev/null +++ b/internal/ui/images_test.go @@ -0,0 +1,134 @@ +package ui + +import ( + "context" + "errors" + "image" + "os" + "os/exec" + "strings" + "sync/atomic" + "testing" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + + "github.com/frathe/picfetch/internal/filesort" + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" + mosaiccore "github.com/frathe/picfetch/internal/mosaic" + "github.com/frathe/picfetch/internal/uitest" +) + +func TestHEICSourceConsumers(t *testing.T) { + var foreground, background atomic.Int64 + reader := func(calls *atomic.Int64) imaging.Reader { + return imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + calls.Add(1) + data, err := input(ctx, 128) + if err != nil { + return heicdecode.Response{}, err + } + date := "2026:09:16 12:34:56" + if string(data) == "early" { + date = "2026:09:15 12:34:56" + } + result := heicdecode.Response{Metadata: &heicdecode.Metadata{Make: "Owned camera", DateTimeOriginal: date}} + if op == heicdecode.Decode { + result.Image = image.NewNRGBA64(image.Rect(0, 0, 8, 6)) + result.Config = image.Config{Width: 8, Height: 6} + } + return result, nil + }) + } + v, _, _ := newTestUIWithImages(t, imageServices{foreground: reader(&foreground), background: reader(&background)}) + late := storage.NewFileURI(uitest.WriteTempFile(t, "late.heic", []byte("late"))) + early := storage.NewFileURI(uitest.WriteTempFile(t, "early.heic", []byte("early"))) + files := []fyne.URI{late, early} + // Format advertisement stays disabled during qualification; install this + // owned source set directly and exercise the ordinary viewer load path. + v.state.replaceFiles(files, files) + v.ShowImage(0) + waitUntilLoaded(t, v) + v.display.Settle() + if foreground.Load() == 0 || !v.display.Snapshot().HasEXIF { + t.Fatal("viewer did not inject its foreground reader") + } + v.imgCache.Purge() + compared, err := v.loadComparedImage(context.Background(), early) + if err != nil || compared.FileSize != 5 || !compared.HasEXIF { + t.Fatalf("comparison source = %v", err) + } + v.exif.Show() + v.exif.Settle() + if !strings.Contains(v.exif.Text().Text, "Owned camera") || v.exif.StripButton().Visible() { + t.Fatal("EXIF source values or editing capability were lost") + } + if err := v.grid.Warm(); err != nil { + t.Fatal(err) + } + if !v.grid.Cached(early) || background.Load() == 0 { + t.Fatal("grid did not use the background reader") + } + v.SetSortMode(filesort.ByCaptureDate) + waitForSort(t, v) + waitUntilLoaded(t, v) + if v.state.files[0].String() != early.String() { + t.Fatal("capture-date sort ignored isolated metadata") + } + request, err := mosaiccore.NewRequest(files, image.Pt(320, 180), mosaiccore.DefaultSettings(), 1) + if err != nil { + t.Fatal(err) + } + result, err := v.GenerateMosaic(context.Background(), request, nil) + if err != nil || result.Bounds().Size() != image.Pt(320, 180) { + t.Fatalf("mosaic source = %v", err) + } + // Use an uncached third source so Favorite persistence must decode. + favorite := storage.NewFileURI(uitest.WriteTempFile(t, "favorite.heic", []byte("favorite"))) + favDir := t.TempDir() + v.SetFavoritePreviewCache(true) + v.SyncFavoritePreviews(favDir, []fyne.URI{favorite}) + settleFavoritePreviews(t, v) + if got := previewNames(t, favDir); len(got) != 1 { + t.Fatalf("Favorite previews = %v", got) + } +} + +func TestHEICOwnerStopsWithViewer(t *testing.T) { + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + owner, err := heicclient.New(heicclient.Config{Executable: executable, SHA256: [32]byte{1}, Limits: heicdecode.DefaultLimits(0)}) + if err != nil { + t.Fatal(err) + } + defer func() { owner.Stop(); owner.Wait() }() + v, _, _ := newTestUIWithImages(t, newImageServices(owner)) + if v.explorer.Options().Client.HEIC != owner { + t.Fatal("Explorer received a different admission owner") + } + link, err := owner.Attach(context.Background(), exec.Command(executable)) + if err != nil { + t.Fatal(err) + } + defer func() { link.Stop(); link.Wait() }() + lifecycle, ok := testApp.Lifecycle().(interface{ OnStopped() func() }) + if !ok { + t.Fatal("test lifecycle has no stopped hook") + } + previous := lifecycle.OnStopped() + t.Cleanup(func() { testApp.Lifecycle().SetOnStopped(previous) }) + registerShutdown(testApp, v) + lifecycle.OnStopped()() + v.waitForShutdown() + _, err = owner.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + t.Fatal("stopped owner read a source") + return nil, nil + }) + if !errors.Is(err, context.Canceled) { + t.Fatalf("viewer left owner admission open: %v", err) + } +} diff --git a/internal/ui/mosaic.go b/internal/ui/mosaic.go index 27d1fa90..be13a09e 100644 --- a/internal/ui/mosaic.go +++ b/internal/ui/mosaic.go @@ -127,7 +127,7 @@ func (v *viewer) showMosaic() { } func (v *viewer) GenerateMosaic(ctx context.Context, request mosaiccore.Request, report func(mosaiccore.Progress)) (mosaiccore.Result, error) { - return mosaiccore.GenerateWithProgress(ctx, request, report) + return mosaiccore.NewWithReader(v.images.background).GenerateWithProgress(ctx, request, report) } func (v *viewer) InspectMosaicDisplays() (displays.Snapshot, error) { diff --git a/internal/ui/run.go b/internal/ui/run.go index 3405a8d6..dabdaa1c 100644 --- a/internal/ui/run.go +++ b/internal/ui/run.go @@ -133,6 +133,7 @@ func (v *viewer) waitForShutdown() { v.visualsearch.Wait() v.searchView.overlayWorkers.Wait() v.analysisCache.Wait() + v.images.Wait() } // Runtime side effects start only after feature construction and geometry @@ -166,6 +167,7 @@ func registerShutdown(application fyne.App, view *viewer) { // same guaranteed-synchronous flush instead of racing it. application.Lifecycle().SetOnStopped(func() { view.stopping = true + view.images.Stop() view.spiral.Close() view.closeExplorer() view.stopSearchOverlayWait() @@ -206,6 +208,9 @@ func registerShutdown(application fyne.App, view *viewer) { session.Save(application, view.state.unsortedFiles) preferences.Save(application, view.currentPreferences()) if !view.storeManaged && view.explorer.Trial() == nil { + // Helper files can be replaced by this update. Its native/pipe + // work has no remaining UI delivery dependency after Stop. + view.images.Wait() view.updater.ApplyStagedUpdate() } }) diff --git a/internal/ui/savework_test.go b/internal/ui/savework_test.go index 310fe015..84ec120b 100644 --- a/internal/ui/savework_test.go +++ b/internal/ui/savework_test.go @@ -285,11 +285,13 @@ func (p *heldSavePixels) At(x, y int) color.Color { } func TestSaveChangesLeavesQueuedUIResponsive(t *testing.T) { - v, _, _ := newTestUI(t) - source := storage.NewFileURI(uitest.WriteTempFile(t, "save.png", uitest.EncodePNG(t, 8, 16, color.White))) - dropAndWait(t, v, source) - v.rotateBy(1) synctest.Test(t, func(t *testing.T) { + // Source cancellation registers with fileWork.ctx. Construct and + // clean up its owner in this same bubble as the worker's signal. + v, _, _ := newTestUI(t) + source := storage.NewFileURI(uitest.WriteTempFile(t, "save.png", uitest.EncodePNG(t, 8, 16, color.White))) + dropAndWait(t, v, source) + v.rotateBy(1) pixels := &heldSavePixels{Image: v.img.Image, entered: make(chan struct{}), release: make(chan struct{})} v.img.Image = pixels actions := make(chan func(), 2) diff --git a/internal/ui/sort.go b/internal/ui/sort.go index 93d86236..2bb61060 100644 --- a/internal/ui/sort.go +++ b/internal/ui/sort.go @@ -110,7 +110,7 @@ func (v *viewer) startSort(mode filesort.Mode, unsorted []fyne.URI, onDone func( v.ForceRepaint() go func() { - ordered := filesort.Order(token.context(), mode, unsorted) + ordered := filesort.OrderWithReader(token.context(), mode, unsorted, v.images.background) fyne.Do(func() { v.finishSort(token, ordered, sortDone, onDone) }) diff --git a/internal/ui/spiral/spiral.go b/internal/ui/spiral/spiral.go index c0675c6d..ce5b26bf 100644 --- a/internal/ui/spiral/spiral.go +++ b/internal/ui/spiral/spiral.go @@ -36,6 +36,8 @@ import ( "sync/atomic" "time" + "github.com/frathe/picfetch/internal/imaging" + "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/lang" @@ -58,7 +60,8 @@ const followEpsilon = 0.5 // without opening anything, so the app can construct it at startup and pay // nothing until someone actually finds it. type Spiral struct { - app fyne.App + reader imaging.Reader + app fyne.App // win is the open window, nil whenever it is closed. Read and written // only on Fyne's UI goroutine (Show, Close, the SetOnClosed callback, @@ -124,7 +127,13 @@ type Spiral struct { // construct unconditionally at startup: no window, no goroutine, no shader // - just the state the first Show will seed its uniforms from. func New(app fyne.App) *Spiral { + return NewWithReader(app, imaging.Reader{}) +} + +// NewWithReader installs the canonical source dependency before work starts. +func NewWithReader(app fyne.App, reader imaging.Reader) *Spiral { return &Spiral{ + reader: reader, app: app, st: newState(), frameInterval: defaultFrameInterval, diff --git a/internal/ui/spiral/tunnel.go b/internal/ui/spiral/tunnel.go index 34d5acf3..64c8d0f1 100644 --- a/internal/ui/spiral/tunnel.go +++ b/internal/ui/spiral/tunnel.go @@ -9,8 +9,6 @@ import ( "time" "fyne.io/fyne/v2" - - "github.com/frathe/picfetch/internal/imaging" ) const tunnelPreviewEdge = 512 @@ -156,7 +154,7 @@ func (s *Spiral) loadTunnelPreview(t *tunnelSession, index int) { queue := s.ui s.previewWorkers.Go(func() { defer cancel() - loaded, err := imaging.LoadAnimatedPreviewContext(ctx, u, tunnelPreviewEdge, tunnelAnimationBytes) + loaded, err := s.reader.Preview(ctx, u, tunnelPreviewEdge, tunnelAnimationBytes) var preview *tunnelPreview if err == nil && ctx.Err() == nil { preview = newTunnelPreview(index, loaded) diff --git a/internal/ui/spiral/tunnel_test.go b/internal/ui/spiral/tunnel_test.go index ce46cba9..eb4d91a2 100644 --- a/internal/ui/spiral/tunnel_test.go +++ b/internal/ui/spiral/tunnel_test.go @@ -2,6 +2,7 @@ package spiral import ( "bytes" + "context" "fmt" "image" "image/color" @@ -16,9 +17,39 @@ import ( "fyne.io/fyne/v2/storage" "fyne.io/fyne/v2/test" + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" "github.com/frathe/picfetch/internal/uitest" ) +func TestTunnelUsesInjectedHEICReader(t *testing.T) { + reader := imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + if op != heicdecode.Decode { + return heicdecode.Response{}, heicdecode.ErrInvalidRequest + } + if _, err := input(ctx, 128); err != nil { + return heicdecode.Response{}, err + } + return heicdecode.Response{Image: image.NewNRGBA64(image.Rect(0, 0, 8, 6)), Config: image.Config{Width: 8, Height: 6}}, nil + }) + s := NewWithReader(test.NewApp(), reader) + s.SetUIQueue(&uitest.UIQueue{}) + s.frameInterval = time.Minute + s.st.randomness = 0 + s.now = func() time.Time { return time.Unix(1000, 0) } + t.Cleanup(func() { s.Close(); waitSettled(t, s) }) + u := storage.NewFileURI(uitest.WriteTempFile(t, "owned.heic", []byte("owned source"))) + s.Show([]fyne.URI{u}) + s.win.Resize(fyne.NewSize(800, 600)) + s.previewWorkers.Wait() + s.ui.Drain() + pixels := s.shader.Textures["traveller0"] + if pixels == nil || pixels.Bounds().Size() != image.Pt(8, 6) { + t.Fatal("isolated preview did not reach the Spiral shader") + } +} + func BenchmarkAdvanceTunnel(b *testing.B) { a := test.NewApp() s := New(a) diff --git a/internal/ui/startup.go b/internal/ui/startup.go index 66538868..9b8c1307 100644 --- a/internal/ui/startup.go +++ b/internal/ui/startup.go @@ -16,6 +16,7 @@ import ( // startupState is the persisted input snapshot consumed by buildViewer and // geometry restoration. type startupState struct { + images imageServices savedSession []fyne.URI prefs preferences.State } @@ -24,6 +25,7 @@ type startupState struct { // have no distinct zero-value meaning. func loadStartupState(application fyne.App) startupState { return startupState{ + images: newImageServices(nil), savedSession: session.Load(application), prefs: normalizePreferenceDefaults(preferences.Load(application)), } @@ -32,7 +34,10 @@ func loadStartupState(application fyne.App) startupState { // buildStartupViewer is the shared load, construct, then restore entry point. // It leaves noPollerStop installed for startViewerRuntime to replace. func buildStartupViewer(application fyne.App) (*viewer, fyne.Window) { - startup := loadStartupState(application) + return buildConfiguredViewer(application, loadStartupState(application)) +} + +func buildConfiguredViewer(application fyne.App, startup startupState) (*viewer, fyne.Window) { view, window := buildViewer(application, startup) restoreStartupGeometry(view, window, startup) return view, window diff --git a/internal/ui/viewer.go b/internal/ui/viewer.go index 2e231f45..7ebeed4b 100644 --- a/internal/ui/viewer.go +++ b/internal/ui/viewer.go @@ -41,8 +41,9 @@ import ( // viewer bundles the UI elements and the navigation state so the drop // handler and the key handler can share them without package-level globals. type viewer struct { - app fyne.App - win fyne.Window + images imageServices + app fyne.App + win fyne.Window // stopping retires title/menu updates before shutdown cancels features. // Fyne may run OnStopped after the native event loop has drained. stopping bool diff --git a/internal/update/apply.go b/internal/update/apply.go index 00a5befe..edfda2c9 100644 --- a/internal/update/apply.go +++ b/internal/update/apply.go @@ -12,10 +12,12 @@ type ApplyOptions struct { // Apply replaces the running executable at dest with stage.BinaryPath. // dest is os.Executable() from UI glue. A var so tests stub it. var Apply = func(stage Stage, dest string, options ApplyOptions) error { - switch runtime.GOOS { - case "windows": - return applyWindows(stage, dest, options) - default: - return applyUnix(stage, dest, options) - } + return applyWithCompanions(stage, dest, func() error { + switch runtime.GOOS { + case "windows": + return applyWindows(stage, dest, options) + default: + return applyUnix(stage, dest, options) + } + }) } diff --git a/internal/update/apply_test.go b/internal/update/apply_test.go index 24cc1226..aa39a315 100644 --- a/internal/update/apply_test.go +++ b/internal/update/apply_test.go @@ -432,3 +432,40 @@ func TestUnixRelaunchCommand_WaitsForOldProcessAndPassesPathAsArgument(t *testin t.Error("post-exit relaunch errors are not connected to PicFetch stderr") } } + +func TestApplyUnixPreservesWholeVerifiedMacBundle(t *testing.T) { + directory := t.TempDir() + installedRoot := filepath.Join(directory, "installed", "PicFetch.app") + stagedRoot := filepath.Join(directory, "staged", "PicFetch.app") + relative := []string{"Contents/MacOS/picfetch", "Contents/Info.plist", "Contents/_CodeSignature/CodeResources", "Contents/Helpers/HEICWorker.app/Contents/MacOS/picfetch-heic-worker", "Contents/Resources/heic/manifest.json", "Contents/Resources/heic/notices/h265-LICENSE"} + for _, name := range relative { + for _, side := range []struct{ root, version string }{{installedRoot, "old"}, {stagedRoot, "new"}} { + path := filepath.Join(side.root, filepath.FromSlash(name)) + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(path, []byte(side.version+" "+name), 0755); err != nil { + t.Fatal(err) + } + } + } + files, err := companionDigests(stagedRoot) + if err != nil { + t.Fatal(err) + } + stage := Stage{BinaryPath: filepath.Join(stagedRoot, "Contents", "MacOS", "picfetch"), PlistPath: filepath.Join(stagedRoot, "Contents", "Info.plist"), verification: stageVerification{GOOS: "darwin", CompanionDigests: files}} + launched := false + err = applyUnixWithLauncher(stage, filepath.Join(installedRoot, "Contents", "MacOS", "picfetch"), ApplyOptions{Relaunch: true}, func(_ string) error { + launched = true + for _, name := range relative { + data, readErr := os.ReadFile(filepath.Join(installedRoot, filepath.FromSlash(name))) + if readErr != nil || string(data) != "new "+name { + t.Errorf("relaunch before complete bundle: %s = %q (%v)", name, data, readErr) + } + } + return nil + }) + if err != nil || !launched { + t.Fatalf("bundle installation/relaunch: %v, launched=%v", err, launched) + } +} diff --git a/internal/update/apply_unix.go b/internal/update/apply_unix.go index 2265117a..f8c1f646 100644 --- a/internal/update/apply_unix.go +++ b/internal/update/apply_unix.go @@ -19,6 +19,9 @@ func applyUnix(stage Stage, dest string, options ApplyOptions) error { // test. launch is called only after the executable and optional plist have // both been installed successfully. func applyUnixWithLauncher(stage Stage, dest string, options ApplyOptions, launch func(string) error) error { + if stage.verification.GOOS == "darwin" && len(stage.verification.CompanionDigests) != 0 { + return applyMacBundle(stage, dest, options, launch) + } dest, err := filepath.EvalSymlinks(dest) if err != nil { return err diff --git a/internal/update/companions.go b/internal/update/companions.go new file mode 100644 index 00000000..bf7ba2a0 --- /dev/null +++ b/internal/update/companions.go @@ -0,0 +1,138 @@ +package update + +import ( + "errors" + "fmt" + "io/fs" + "maps" + "os" + "path/filepath" + + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" +) + +// Package roots are derived from the authenticated main executable, never +// supplied by a companion manifest. macOS installs the complete signed bundle; +// other platforms replace only the dedicated helper directory beside the app. +func companionRoots(binary, system string) (installation, companions string, err error) { + if !filepath.IsAbs(binary) { + return "", "", errors.New("update package binary is not absolute") + } + installation = filepath.Dir(binary) + if system == "darwin" { + if filepath.Base(installation) != "MacOS" || filepath.Base(filepath.Dir(installation)) != "Contents" { + return "", "", errors.New("update package is not a macOS app bundle") + } + installation = filepath.Dir(filepath.Dir(installation)) + if filepath.Ext(installation) != ".app" { + return "", "", errors.New("update package has no app bundle root") + } + return installation, installation, nil + } + if system != "linux" && system != "windows" { + return "", "", errors.New("unsupported update companion platform") + } + return installation, filepath.Join(installation, "heic"), nil +} + +func captureCompanions(binary, system, architecture string) (map[string]string, error) { + installation, root, err := companionRoots(binary, system) + if err != nil { + // Legacy stages can have no helper or .app layout; their existing binary + // and plist verification remains authoritative until a complete package. + if system == "darwin" { + return nil, nil + } + return nil, err + } + _, manifest, err := heicclient.PackagePaths(installation, system) + if err != nil { + return nil, err + } + if _, err = os.Lstat(manifest); errors.Is(err, os.ErrNotExist) { + helper, _, pathErr := heicclient.PackagePaths(installation, system) + if pathErr != nil { + return nil, pathErr + } + if _, helperErr := os.Lstat(helper); errors.Is(helperErr, os.ErrNotExist) { + return nil, nil + } + return nil, errors.New("update helper has no manifest") + } else if err != nil { + return nil, err + } + if _, _, err = heicclient.LoadPackage(installation, system, architecture); err != nil { + return nil, fmt.Errorf("update helper package: %w", err) + } + return companionDigests(root) +} + +func companionDigests(root string) (map[string]string, error) { + files := make(map[string]string) + var total int64 + err := filepath.WalkDir(root, func(path string, entry fs.DirEntry, walkErr error) error { + if walkErr != nil { + return walkErr + } + if entry.Type()&os.ModeSymlink != 0 { + return fmt.Errorf("update companion is a symbolic link: %s", path) + } + if entry.IsDir() { + return nil + } + info, err := entry.Info() + if err != nil { + return err + } + if !info.Mode().IsRegular() || info.Size() < 0 { + return errors.New("update companion is not a regular file") + } + total += info.Size() + if len(files) >= 4096 || total > 256*1024*1024 { + return errors.New("update companion package exceeds finite limits") + } + name, err := filepath.Rel(root, path) + if err != nil || !filepath.IsLocal(name) { + return errors.New("invalid update companion path") + } + digest, err := fileSHA256(path) + if err != nil { + return err + } + files[filepath.ToSlash(name)] = digest + return nil + }) + if err != nil { + return nil, err + } + if len(files) == 0 { + return nil, errors.New("empty update companion package") + } + return files, nil +} + +func validateCompanions(stage Stage) error { + expected := stage.verification.CompanionDigests + if len(expected) == 0 { + actual, err := captureCompanions(stage.BinaryPath, stage.verification.GOOS, stage.verification.GOARCH) + if err != nil { + return err + } + if len(actual) != 0 { + return errors.New("update helper package has no verified companion digests") + } + return nil + } + _, root, err := companionRoots(stage.BinaryPath, stage.verification.GOOS) + if err != nil { + return err + } + actual, err := companionDigests(root) + if err != nil { + return err + } + if !maps.Equal(actual, expected) { + return errors.New("update companion package changed after archive verification") + } + return nil +} diff --git a/internal/update/companions_test.go b/internal/update/companions_test.go new file mode 100644 index 00000000..32ff4142 --- /dev/null +++ b/internal/update/companions_test.go @@ -0,0 +1,107 @@ +package update + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "os" + "path/filepath" + "testing" + + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" +) + +func TestDownloadedCompanionsRemainVerifiedAfterPersistence(t *testing.T) { + helper := []byte("owned helper executable") + digest := sha256.Sum256(helper) + guest := sha256.Sum256([]byte("owned guest")) + manifest, err := json.Marshal(heicclient.PackageManifest{Version: 1, GOOS: "linux", GOARCH: "amd64", ExecutableSHA256: hex.EncodeToString(digest[:]), GuestSHA256: hex.EncodeToString(guest[:])}) + if err != nil { + t.Fatal(err) + } + archivePath := writeTarGz(t, t.TempDir(), "picfetch-linux-amd64.tar.gz", map[string][]byte{ + "picfetch-linux-amd64": []byte("owned main executable"), + "heic/picfetch-heic-worker": helper, + "heic/manifest.json": manifest, + "heic/notices/h265-LICENSE": []byte("owned fixture notice"), + }) + archive, err := os.ReadFile(archivePath) + if err != nil { + t.Fatal(err) + } + sum := sha256.Sum256(archive) + server := serveDownload(t, "picfetch-linux-amd64.tar.gz", archive, okAttest) + stageDir := t.TempDir() + release := Release{Version: "v0.2.6", AssetName: "picfetch-linux-amd64.tar.gz", AssetURL: server.URL + "/picfetch-linux-amd64.tar.gz", AssetDigest: hex.EncodeToString(sum[:])} + staged, err := downloadClient(t, server, &fakeVerifier{}, stageDir).Download(context.Background(), release) + if err != nil { + t.Fatal(err) + } + if err = ValidateStage(staged); err != nil { + t.Fatal(err) + } + loaded, err := LoadStage(stageDir) + if err != nil { + t.Fatal(err) + } + withoutProof := loaded + withoutProof.verification.CompanionDigests = nil + if err = ValidateStage(withoutProof); err == nil { + t.Fatal("helper package accepted after removing its companion provenance") + } + companion := filepath.Join(filepath.Dir(loaded.BinaryPath), "heic", "notices", "h265-LICENSE") + if err = os.WriteFile(companion, []byte("changed after archive verification"), 0600); err != nil { + t.Fatal(err) + } + if err = ValidateStage(loaded); err == nil { + t.Fatal("changed companion accepted after provenance round trip") + } +} + +func TestApplyInstallsCompanionsAndRollsBackOnBinaryFailure(t *testing.T) { + for _, fail := range []bool{false, true} { + t.Run(map[bool]string{false: "install", true: "binary failure"}[fail], func(t *testing.T) { + directory := t.TempDir() + installed := filepath.Join(directory, "installed", "picfetch") + staged := filepath.Join(directory, "staged", "picfetch") + for path, data := range map[string]string{installed: "old main", staged: "new main", filepath.Join(filepath.Dir(installed), "heic", "helper"): "old helper", filepath.Join(filepath.Dir(staged), "heic", "helper"): "new helper"} { + if err := os.MkdirAll(filepath.Dir(path), 0700); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(path, []byte(data), 0700); err != nil { + t.Fatal(err) + } + } + files, err := companionDigests(filepath.Join(filepath.Dir(staged), "heic")) + if err != nil { + t.Fatal(err) + } + stage := Stage{BinaryPath: staged, verification: stageVerification{GOOS: "linux", CompanionDigests: files}} + if fail { + if err = os.Remove(staged); err != nil { + t.Fatal(err) + } + } + err = Apply(stage, installed, ApplyOptions{}) + if (err != nil) != fail { + t.Fatalf("apply: %v", err) + } + main, readErr := os.ReadFile(installed) + if readErr != nil { + t.Fatal(readErr) + } + helper, readErr := os.ReadFile(filepath.Join(filepath.Dir(installed), "heic", "helper")) + if readErr != nil { + t.Fatal(readErr) + } + wanted := "new" + if fail { + wanted = "old" + } + if string(main) != wanted+" main" || string(helper) != wanted+" helper" { + t.Fatalf("installed main=%q helper=%q", main, helper) + } + }) + } +} diff --git a/internal/update/download.go b/internal/update/download.go index 767ffc80..7b9d1eb0 100644 --- a/internal/update/download.go +++ b/internal/update/download.go @@ -29,16 +29,17 @@ type DownloadProgress struct { } type stageFile struct { - Version string `json:"version"` - Notes string `json:"notes"` - BinaryPath string `json:"binaryPath"` - PlistPath string `json:"plistPath,omitempty"` - VerifiedAssetName string `json:"verifiedAssetName,omitempty"` - VerifiedArchiveDigest string `json:"verifiedArchiveDigest,omitempty"` - VerifiedBinaryDigest string `json:"verifiedBinaryDigest,omitempty"` - VerifiedPlistDigest string `json:"verifiedPlistDigest,omitempty"` - VerifiedGOOS string `json:"verifiedGoos,omitempty"` - VerifiedGOARCH string `json:"verifiedGoarch,omitempty"` + VerifiedCompanionDigests map[string]string `json:"verifiedCompanionDigests,omitempty"` + Version string `json:"version"` + Notes string `json:"notes"` + BinaryPath string `json:"binaryPath"` + PlistPath string `json:"plistPath,omitempty"` + VerifiedAssetName string `json:"verifiedAssetName,omitempty"` + VerifiedArchiveDigest string `json:"verifiedArchiveDigest,omitempty"` + VerifiedBinaryDigest string `json:"verifiedBinaryDigest,omitempty"` + VerifiedPlistDigest string `json:"verifiedPlistDigest,omitempty"` + VerifiedGOOS string `json:"verifiedGoos,omitempty"` + VerifiedGOARCH string `json:"verifiedGoarch,omitempty"` } // Download fetches rel's archive, SHA-256s it, compares to AssetDigest when @@ -96,7 +97,16 @@ func (c *Client) DownloadWithProgress(ctx context.Context, rel Release, progress if err := os.MkdirAll(c.cfg.StageDir, 0o700); err != nil { return Stage{}, err } - bin, plist, err := extract(ctx, tmp, c.cfg.StageDir) + payload, err := os.MkdirTemp(c.cfg.StageDir, "payload-") + if err != nil { + return Stage{}, err + } + defer func() { + if err != nil { + _ = os.RemoveAll(payload) + } + }() + bin, plist, err := extract(ctx, tmp, payload) if err != nil { return Stage{}, err } @@ -121,18 +131,23 @@ func (c *Client) DownloadWithProgress(ctx context.Context, rel Release, progress return Stage{}, err } } + companions, err := captureCompanions(bin, c.cfg.GOOS, c.cfg.GOARCH) + if err != nil { + return Stage{}, err + } st = Stage{ Version: rel.Version, Notes: rel.Notes, BinaryPath: bin, PlistPath: plist, verification: stageVerification{ - AssetName: rel.AssetName, - ArchiveDigest: hex.EncodeToString(sum[:]), - BinaryDigest: binaryDigest, - PlistDigest: plistDigest, - GOOS: c.cfg.GOOS, - GOARCH: c.cfg.GOARCH, + AssetName: rel.AssetName, + ArchiveDigest: hex.EncodeToString(sum[:]), + BinaryDigest: binaryDigest, + CompanionDigests: companions, + PlistDigest: plistDigest, + GOOS: c.cfg.GOOS, + GOARCH: c.cfg.GOARCH, }, } if err := SaveStage(c.cfg.StageDir, st); err != nil { @@ -292,16 +307,17 @@ func SaveStage(dir string, s Stage) error { return err } data, err := json.Marshal(stageFile{ - Version: s.Version, - Notes: s.Notes, - BinaryPath: bin, - PlistPath: plist, - VerifiedAssetName: s.verification.AssetName, - VerifiedArchiveDigest: s.verification.ArchiveDigest, - VerifiedBinaryDigest: s.verification.BinaryDigest, - VerifiedPlistDigest: s.verification.PlistDigest, - VerifiedGOOS: s.verification.GOOS, - VerifiedGOARCH: s.verification.GOARCH, + Version: s.Version, + Notes: s.Notes, + BinaryPath: bin, + PlistPath: plist, + VerifiedAssetName: s.verification.AssetName, + VerifiedArchiveDigest: s.verification.ArchiveDigest, + VerifiedBinaryDigest: s.verification.BinaryDigest, + VerifiedCompanionDigests: s.verification.CompanionDigests, + VerifiedPlistDigest: s.verification.PlistDigest, + VerifiedGOOS: s.verification.GOOS, + VerifiedGOARCH: s.verification.GOARCH, }) if err != nil { return err @@ -327,12 +343,13 @@ func LoadStage(dir string) (Stage, error) { BinaryPath: sf.BinaryPath, PlistPath: sf.PlistPath, verification: stageVerification{ - AssetName: sf.VerifiedAssetName, - ArchiveDigest: sf.VerifiedArchiveDigest, - BinaryDigest: sf.VerifiedBinaryDigest, - PlistDigest: sf.VerifiedPlistDigest, - GOOS: sf.VerifiedGOOS, - GOARCH: sf.VerifiedGOARCH, + AssetName: sf.VerifiedAssetName, + ArchiveDigest: sf.VerifiedArchiveDigest, + BinaryDigest: sf.VerifiedBinaryDigest, + CompanionDigests: sf.VerifiedCompanionDigests, + PlistDigest: sf.VerifiedPlistDigest, + GOOS: sf.VerifiedGOOS, + GOARCH: sf.VerifiedGOARCH, }, }, nil } @@ -353,6 +370,9 @@ func ValidateStage(s Stage) error { if err := verifyFileSHA256(s.BinaryPath, v.BinaryDigest); err != nil { return fmt.Errorf("update: staged binary verification: %w", err) } + if err := validateCompanions(s); err != nil { + return err + } if s.PlistPath == "" { if v.PlistDigest != "" { return errors.New("update: staged plist provenance has no file") diff --git a/internal/update/package_install.go b/internal/update/package_install.go new file mode 100644 index 00000000..81e4edd6 --- /dev/null +++ b/internal/update/package_install.go @@ -0,0 +1,172 @@ +package update + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "slices" +) + +type directorySwap struct { + destination string + backup string + hadPrevious bool +} + +// installDirectory prepares and verifies every file before renaming any +// installed directory. All temporary/backup directories share its filesystem. +func installDirectory(source, destination string, expected map[string]string, rename func(string, string) error) (*directorySwap, error) { + if len(expected) == 0 { + return nil, errors.New("update directory has no verified files") + } + parent := filepath.Dir(destination) + prepared, err := os.MkdirTemp(parent, ".picfetch-package-new-") + if err != nil { + return nil, err + } + defer func() { _ = os.RemoveAll(prepared) }() + names := make([]string, 0, len(expected)) + for name := range expected { + names = append(names, name) + } + slices.Sort(names) + for _, name := range names { + local := filepath.FromSlash(name) + if !filepath.IsLocal(local) || filepath.ToSlash(filepath.Clean(local)) != name || !validSHA256(expected[name]) { + return nil, errors.New("invalid verified companion path or digest") + } + src, target := filepath.Join(source, local), filepath.Join(prepared, local) + info, statErr := os.Lstat(src) + if statErr != nil { + return nil, statErr + } + if !info.Mode().IsRegular() { + return nil, errors.New("update companion source is not a regular file") + } + if err = copyFile(src, target); err != nil { + return nil, err + } + if err = os.Chmod(target, info.Mode().Perm()); err != nil { + return nil, err + } + if err = verifyFileSHA256(target, expected[name]); err != nil { + return nil, err + } + } + // A package root must remain traversable by its existing consumers, including + // an AppContainer with explicit read/execute provisioning after installation. + if err = os.Chmod(prepared, 0755); err != nil { + return nil, err + } + backup, err := os.MkdirTemp(parent, ".picfetch-package-old-") + if err != nil { + return nil, err + } + if err = os.Remove(backup); err != nil { + return nil, err + } + transaction := &directorySwap{destination: destination, backup: backup} + if info, statErr := os.Lstat(destination); statErr == nil { + if !info.IsDir() || info.Mode()&os.ModeSymlink != 0 { + return nil, errors.New("installed companion root is not an ordinary directory") + } + if err = rename(destination, backup); err != nil { + return nil, err + } + transaction.hadPrevious = true + } else if !errors.Is(statErr, os.ErrNotExist) { + return nil, statErr + } + if err = rename(prepared, destination); err != nil { + if transaction.hadPrevious { + err = errors.Join(err, rename(backup, destination)) + } + return nil, err + } + return transaction, nil +} + +func (s *directorySwap) rollback() error { + if err := os.RemoveAll(s.destination); err != nil { + return err + } + if s.hadPrevious { + return os.Rename(s.backup, s.destination) + } + return nil +} + +func (s *directorySwap) commit() { + if s.hadPrevious { + _ = os.RemoveAll(s.backup) + } +} + +func applyWithCompanions(stage Stage, destination string, apply func() error) error { + if len(stage.verification.CompanionDigests) == 0 || stage.verification.GOOS == "darwin" { + return apply() + } + if err := validateCompanions(stage); err != nil { + return err + } + _, source, err := companionRoots(stage.BinaryPath, stage.verification.GOOS) + if err != nil { + return err + } + destination, err = filepath.EvalSymlinks(destination) + if err != nil { + return err + } + _, target, err := companionRoots(destination, stage.verification.GOOS) + if err != nil { + return err + } + transaction, err := installDirectory(source, target, stage.verification.CompanionDigests, os.Rename) + if err != nil { + return &ApplyError{Op: "companions", Path: target, Err: err} + } + if err = apply(); err != nil { + // Relaunch errors occur after the executable has committed. Its companion + // package must stay paired with that newly installed executable. + if failure, ok := errors.AsType[*ApplyError](err); ok && failure.Op == "relaunch" { + transaction.commit() + return err + } + if rollbackErr := transaction.rollback(); rollbackErr != nil { + return &ApplyError{Op: "restore", Path: target, Err: errors.Join(err, rollbackErr)} + } + return err + } + transaction.commit() + return nil +} + +func applyMacBundle(stage Stage, destination string, options ApplyOptions, launch func(string) error) error { + if err := validateCompanions(stage); err != nil { + return err + } + _, source, err := companionRoots(stage.BinaryPath, "darwin") + if err != nil { + return err + } + destination, err = filepath.EvalSymlinks(destination) + if err != nil { + return err + } + _, target, err := companionRoots(destination, "darwin") + if err != nil { + return err + } + transaction, err := installDirectory(source, target, stage.verification.CompanionDigests, os.Rename) + if err != nil { + return fmt.Errorf("install verified app bundle: %w", err) + } + transaction.commit() + if options.Relaunch { + if err = launch(destination); err != nil { + return &ApplyError{Op: "relaunch", Path: destination, Err: err} + } + } + return nil +} diff --git a/internal/update/package_native_darwin_test.go b/internal/update/package_native_darwin_test.go new file mode 100644 index 00000000..adbb3702 --- /dev/null +++ b/internal/update/package_native_darwin_test.go @@ -0,0 +1,172 @@ +//go:build heicnative && darwin + +package update + +import ( + "errors" + "maps" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" +) + +// This owns complete signed fixture bundles. It never launches the fixture app +// or touches an installed application, preferences or a user's image files. +func TestNativeMacUpdatePreservesSignedBundle(t *testing.T) { + root, err := filepath.Abs(filepath.Join("..", "..")) + if err != nil { + t.Fatal(err) + } + parent := t.TempDir() + unrelated := filepath.Join(parent, "owned-user-data") + if err = os.WriteFile(unrelated, []byte("preserved"), 0600); err != nil { + t.Fatal(err) + } + previous := nativeSignedBundle(t, root, filepath.Join(parent, "installed", "PicFetch.app"), "1") + candidate := nativeSignedBundle(t, root, filepath.Join(parent, "staged", "PicFetch.app"), "2") + before, err := companionDigests(previous) + if err != nil { + t.Fatal(err) + } + after, err := companionDigests(candidate) + if err != nil { + t.Fatal(err) + } + staged := Stage{BinaryPath: filepath.Join(candidate, "Contents", "MacOS", "picfetch"), PlistPath: filepath.Join(candidate, "Contents", "Info.plist"), verification: stageVerification{GOOS: "darwin", CompanionDigests: after}} + failedInstall := false + _, err = installDirectory(candidate, previous, after, func(from, to string) error { + if strings.HasPrefix(filepath.Base(from), ".picfetch-package-new-") && to == previous { + failedInstall = true + return os.ErrPermission + } + return os.Rename(from, to) + }) + if !failedInstall || !errors.Is(err, os.ErrPermission) { + t.Fatalf("commit failure not observed: %v", err) + } + restored, err := companionDigests(previous) + if err != nil || !maps.Equal(before, restored) { + t.Fatalf("rollback changed signed bundle files: %v", err) + } + verifyNativeBundle(t, previous) + if err = Apply(staged, filepath.Join(previous, "Contents", "MacOS", "picfetch"), ApplyOptions{}); err != nil { + t.Fatal(err) + } + installed, err := companionDigests(previous) + if err != nil || !maps.Equal(after, installed) { + t.Fatalf("updated bundle differs from verified candidate: %v", err) + } + verifyNativeBundle(t, previous) + data, err := os.ReadFile(unrelated) + if err != nil || string(data) != "preserved" { + t.Fatalf("neighboring user data changed: %q (%v)", data, err) + } +} + +func nativeSignedBundle(t *testing.T, root, bundle, version string) string { + t.Helper() + main := filepath.Join(bundle, "Contents", "MacOS", "picfetch") + if err := os.MkdirAll(filepath.Dir(main), 0755); err != nil { + t.Fatal(err) + } + source, err := os.Executable() + if err != nil { + t.Fatal(err) + } + if err = copyFile(source, main); err != nil { + t.Fatal(err) + } + plist := `CFBundleIdentifierio.github.frathe.picfetch.owned-updateCFBundleExecutablepicfetchCFBundlePackageTypeAPPLCFBundleVersion` + version + `` + if err = os.WriteFile(filepath.Join(bundle, "Contents", "Info.plist"), []byte(plist), 0644); err != nil { + t.Fatal(err) + } + packageHelper := exec.Command("go", "run", "./scripts/heicpackage", "-os", "darwin", "-arch", runtime.GOARCH, "-out", bundle) + packageHelper.Dir = root + if output, buildErr := packageHelper.CombinedOutput(); buildErr != nil { + t.Fatalf("package owned helper: %v: %s", buildErr, output) + } + // Distinguish both helper and enclosing sealed resources between versions. + // Otherwise a binary/plist-only update could accidentally produce the same + // bytes as the candidate because its unchanged helper still matched. + helperBundle := filepath.Join(bundle, "Contents", "Helpers", "HEICWorker.app") + helperPlist := filepath.Join(helperBundle, "Contents", "Info.plist") + helperMetadata, err := os.ReadFile(helperPlist) + if err != nil { + t.Fatal(err) + } + helperMetadata = []byte(strings.Replace(string(helperMetadata), "1", ""+version+"", 1)) + if err = os.WriteFile(helperPlist, helperMetadata, 0644); err != nil { + t.Fatal(err) + } + helperSign := exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", "--entitlements", filepath.Join(root, "packaging", "heic", "macos.entitlements.plist"), helperBundle) + if output, signErr := helperSign.CombinedOutput(); signErr != nil { + t.Fatalf("sign changed owned helper: %v: %s", signErr, output) + } + finalize := exec.Command("go", "run", "./scripts/heicpackage", "-mode", "finalize", "-os", "darwin", "-arch", runtime.GOARCH, "-out", bundle) + finalize.Dir = root + if output, finalizeErr := finalize.CombinedOutput(); finalizeErr != nil { + t.Fatalf("finalize changed owned helper: %v: %s", finalizeErr, output) + } + if err = os.WriteFile(filepath.Join(bundle, "Contents", "Resources", "owned-version"), []byte(version), 0644); err != nil { + t.Fatal(err) + } + sign := exec.Command("/usr/bin/codesign", "--force", "--sign", "-", bundle) + if output, signErr := sign.CombinedOutput(); signErr != nil { + t.Fatalf("sign owned bundle: %v: %s", signErr, output) + } + verifyNativeBundle(t, bundle) + return bundle +} + +func verifyNativeBundle(t *testing.T, bundle string) { + t.Helper() + command := exec.Command("/usr/bin/codesign", "--verify", "--deep", "--strict", "--verbose=2", bundle) + if output, err := command.CombinedOutput(); err != nil { + t.Fatalf("complete bundle signature: %v: %s", err, output) + } +} + +func TestNativeMacLegacyUpdateRequiresCompleteReinstall(t *testing.T) { + root, err := filepath.Abs(filepath.Join("..", "..")) + if err != nil { + t.Fatal(err) + } + parent := t.TempDir() + previous := nativeSignedBundle(t, root, filepath.Join(parent, "installed", "PicFetch.app"), "1") + for _, path := range []string{filepath.Join(previous, "Contents", "Helpers"), filepath.Join(previous, "Contents", "Resources", "heic")} { + if err = os.RemoveAll(path); err != nil { + t.Fatal(err) + } + } + sign := exec.Command("/usr/bin/codesign", "--force", "--sign", "-", previous) + if output, signErr := sign.CombinedOutput(); signErr != nil { + t.Fatalf("sign owned legacy bundle: %v: %s", signErr, output) + } + verifyNativeBundle(t, previous) + stageDirectory := filepath.Join(parent, "legacy-stage") + candidate := nativeSignedBundle(t, root, filepath.Join(stageDirectory, "PicFetch.app"), "2") + // The released updater knows only BinaryPath/PlistPath and removes its + // stage after a successful application. Exercise that retained legacy path. + staged := Stage{BinaryPath: filepath.Join(candidate, "Contents", "MacOS", "picfetch"), PlistPath: filepath.Join(candidate, "Contents", "Info.plist")} + if err = applyUnix(staged, filepath.Join(previous, "Contents", "MacOS", "picfetch"), ApplyOptions{}); err != nil { + t.Fatal(err) + } + if err = RemoveStage(stageDirectory); err != nil { + t.Fatal(err) + } + if _, err = os.Stat(filepath.Join(previous, "Contents", "Resources", "heic", "manifest.json")); !os.IsNotExist(err) { + t.Fatalf("legacy updater unexpectedly installed helper manifest: %v", err) + } + if _, err = os.Stat(stageDirectory); !os.IsNotExist(err) { + t.Fatalf("legacy stage remains recoverable: %v", err) + } + command := exec.Command("/usr/bin/codesign", "--verify", "--deep", "--strict", previous) + if output, verifyErr := command.CombinedOutput(); verifyErr == nil { + t.Fatal("legacy binary/plist replacement unexpectedly preserved the new enclosing signature") + } else { + t.Logf("owned legacy update requires complete reinstall: %v: %s", verifyErr, output) + } +} diff --git a/internal/update/update.go b/internal/update/update.go index 498a7dfc..499bdbd5 100644 --- a/internal/update/update.go +++ b/internal/update/update.go @@ -62,12 +62,13 @@ type Stage struct { } type stageVerification struct { - AssetName string - ArchiveDigest string - BinaryDigest string - PlistDigest string - GOOS string - GOARCH string + CompanionDigests map[string]string + AssetName string + ArchiveDigest string + BinaryDigest string + PlistDigest string + GOOS string + GOARCH string } type Client struct { diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index ede93c37..28f46078 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -392,3 +392,483 @@ before P4/P5 activation; the independently verified P1/P2 worker boundary can be published while HEIC remains disabled. Do not copy or edit the user's historical `THREAT-MODEL.md`. No source-equivalence conclusion follows solely from the newer upstream version or the updated AGENTS wording. + +### P0 source preservation and native deadline diagnosis + +P0 files: `third_party/h265`, root/guest module replacements, +`scripts/heicbuild/source.go`, provenance, ordinary guest checks and the source +qualification record. Owner T0; no implementation delegation. Contract: exact +maintained production bytes from fc127b44, WASI-only application use, baseline +and replacement validation before builds. Verify with `make check-heic-wasm +test-h265`, focused worker/guest race tests and native guards. One source +inventory scout and the earlier evidence-retrieval scout were reused; source +assessment, patches and findings stayed with the lead. + +- Read historical `third_party/h265/PICFETCH.md`; source subtree was clean at + saved HEAD 73cb3c9, last source change fc127b44. Restored 107 production/source + notice files exactly (57 Go, 47 assembly, LICENSE, README and go.mod). No + historical test corpus or THREAT-MODEL.md was imported or edited. +- Preserve all local hardening instead of substituting unmodified v0.2.3. + Reviewed v0.2.2 -> v0.2.3 production diff: missing metadata, coded-frame bounds + and transform bounds already exist locally; decoder/deblock changes are + comments. Keep the complete local bounded sequence implementation without + claiming equivalence to upstream's different representation. Patch inventory + and exact source manifest are in the maintained directory. +- The new input-inventory/native-import test first failed because maintained + source was absent from provenance. It passes after source inventory and + module isolation are recognized. Missing or redirected replacements are + refused. An actual appended comment in the maintained budget source made + `heicbuild build` fail on its baseline hash before compilation; exact bytes + restored. `make test-h265` then passed source/rebuild/import checks and the + ordinary WASI fixture test (1.563 s). +- The maintained worker and guest pass focused race tests (14.730 / 15.802 s). + All imported Go/assembly files were inspected. Assembly dialect errors and + retained declarations/algorithms have exact Qodana exclusions; existing weak + style suggestions and partial switch/EOF behavior were assessed and recorded + in PICFETCH.md. The IDE does not consume Qodana scopes: those reports are + reviewed dispositions, not a claim of zero generic-assembly diagnostics. +- Published c4a89d1 Qodana had one result: worker Main appeared unused although + cmd/picfetch-heic-worker calls it directly. Added a function-scoped suppression + with that caller documented; GoLand re-inspection is clear. Fresh source-phase + Qodana evidence remains pending. +- c4a89d1 CI passed six jobs; Linux race and Intel native guards failed on the + 30-second timing proposal. Linux's real guest compilation under race took + 37.08 s; every small owned runtime boundary control passed. Intel sandbox, + small ordinary decode and cancellation passed, while the 12MP compiler job + reached 30.060 s and its interpreter reached 30.049 s. No guard was skipped. +- Diagnosis retained the original deadline. The maintained x86 helper under + Rosetta decoded basic at 2.290 s and 12MP at 5.967 s. Its first diagnostic + launch hit the installed xcrun's missing x86 slice; using ARM clang to build + the x86 helper resolved setup. This exercises x86 transport/compiler behavior + but is not native Intel performance qualification. A non-race real worker + fixture test completed in 0.89 s; instrumentation/host throughput explain the + observed timing evidence better than a general transport stall. +- The coordinator clarified that 30 seconds was an engineering proposal. + Proposed a finite 60-second ceiling to measure common-camera completion on + native Intel, with no byte/memory/job/sandbox relaxation and no test removals. + The updated default/max-duration tests went red at the prior 30-second limit, + then green; values above 60 seconds are refused. Fresh native Intel completion + time is still required before qualification. Longer single-lane occupation + is the availability cost, recorded in the qualification document. +- Final local P0 checks: `make verify-build test-h265` passes. Focused race + protocol/client/worker/guest/nativeguard packages pass in 1.310 / 1.911 / + 14.998 / 15.903 / 1.225 s. Native Apple Silicon suite passes in 75.328 s; + compiler 12MP 6.713 s, interpreter finite rejection at 60.012 s. All native + file/network, missing-entitlement, cancellation and descendant guards remain. + The new source tooling and changed boundary files re-inspect clean in GoLand. + +### P2 Linux candidate (native execution pending) + +Files: worker Linux policy/installation and owned native controls, client native +fixture test, nativeguard runner, CI matrix, exact test exclusions and platform +qualification record. Lead owns design/implementation/review. Verify with +`make heic-native-linux` on native Linux amd64 and arm64, the portable filter +test on every host, cross-builds and GoLand. No Linux production exposure follows +from cross-build success alone. + +- Reused one read-only scout for installed Go 1.27.1/wazero 1.12.0 syscall + facts while the lead implemented policy. A second read-only Windows scout + mapped existing package/CI launch points. Neither wrote policy, reviewed code, + ran security tests or made edits; all implementation remained with the lead. +- Exact pure-Go thread flags differ: amd64 0xd0f00 includes CLONE_SETTLS, + arm64 0x50f00 does not. Reject all other clone forms, clone3, exec, file/network + operations, io_uring, new policies/namespaces and unspecified syscalls. + Runtime memory/signal/poll/stdio operations are the explicit allowlist. +- Portable BPF tests first failed on the refusing placeholder, then passed + required runtime calls and denied authority for both ABIs. Native-suite + registration/CI tests first failed for the absent Linux suite and invocation, + then passed after wiring. Native guards cannot be executed on this macOS host; + no local Docker daemon is available. Their execution is still unverified. +- RLIMIT_AS is a virtual-address-space ceiling, not a measured RSS quota. + Read bounded /proc/self/statm before installation and reject an oversized + starting process. Read back every hard/soft limit, then require ENOMEM from + an oversized PROT_NONE reservation before input; no RAM pressure test. + CPU/core/file-size/descriptor limits are finite; actual process creation is + denied, while debug.SetMaxThreads remains only a Go runtime thread ceiling. +- Native controls retain one thread across TSYNC and create enough locked + threads to exercise inheritance. They also observe syscall denial, a small + owned WASI cancellation and the omitted-address-limit negative control. + The real helper must decode ordinary ten-bit and 12MP fixtures after its + parent-owned file/TCP/UDP readiness controls under the unchanged 60 seconds. +- Signed P0 publication is temporarily waiting on Secretive's signature request. + Its original staged checkpoint remains separate from these working edits. + +### P3 family admission and pipe transport + +Lead-only implementation in `internal/heicdecode/client`. One application-owned +Client admits foreground and background operations; FIFO within class and no +more than three foreground grants before a waiting background grant. A bounded +pipe service shares that Client with analysis processes. The remote sends a +small intent first and reads encoded bytes only after the owner's native-ready +grant. Framed canonical responses use existing validation, without a second +image encoding or an image-sized envelope copy. Retain admission through +downstream response delivery, bound idle connections and queue entries, close +both stream directions on cancellation, and join their service work at Stop. + +Tests: controlled local/remote source callbacks cannot overlap, remote bulk +reads follow the grant, blocked output retains admission until cancellation or +delivery, cancelled queues never read sources, repeated responses remain +framed, and Stop joins active/idle service work. Verify focused client race +tests, GoLand and native Mac regression after this boundary. Pipe inheritance +and app/similarity wiring are subsequent P3/P4 work, not satisfied by these +component tests alone. Existing platform refusal remains unchanged. + +- The fairness test went red on the refusing queue placeholder, then passed + FIFO selection, the three-foreground maximum, cancellation and idempotent + release. Existing client lifecycle regressions pass after lane replacement. +- Repeated remote requests went red on the refusing transport placeholder, + then passed canonical NRGBA64 transfer. A queued-disconnect regression + exposed a service waiting behind active foreground work; one bounded control + byte now observes disconnect, cancels admission and is joined on every exit. + Pre-admission refusal retires the connection without reading source bytes. +- The focused client race suite passes (5.200 s), including bounds for frame + lengths/grants, eight idle connections, Stop/Wait and held output. An actual + early-release mutation made the held-output test fail; exact source restored. + GoLand inspections are clear after moving deliberate retained test peers to + one explicit cleanup. Final post-fix native/local checks are recorded next. + +- Final component client race run: 5.275 s. `make verify-build` passes. Real + macOS App Sandbox helper/cancellation regression passes in 3.343 s; the + runtime-choice measurements remain the earlier unchanged-runtime evidence. +- Pipe inheritance now proceeds through a Client-owned attachment and a small + descriptor/limits configuration. UNIX appends explicit ExtraFiles and makes + inherited child pipes pollable; Windows uses explicit inherited handles. + Attachments must register service work before asynchronous dispatch, close + parent copies of child endpoints immediately after Start, and stop/join on + every failure/exit. A reused read-only Windows scout checks pinned Go pipe + Close/handle-list semantics while the lead implements the UNIX side. + +- Actual inherited subprocess decoding, child cancellation, and cleanup before + process Start pass under the race detector. The full client race suite passes + in 8.841 s; nativeguard tests and `make verify-build` pass. Latest changed Go + files have no GoLand findings. Windows amd64/arm64 and Linux arm64 test binaries + cross-build; the new Windows native pipe CI suite is still unexecuted. + +### P4 source contract and first integration gate + +Owner: lead for design, tests, implementation and review. Reused one read-only +caller scout to locate constructor and shutdown injection points across GUI +features while the lead inspected imaging/analysis. No edits or review delegated. + +- `imaging.Reader` is an immutable value containing an optional HEIC decode + function. Its zero value keeps HEIC unavailable. `Read` returns a `Source` + with bounds, complete decode, metadata, encoded digest, thumbnail and preview + methods. Ordinary sources retain encoded bytes and the existing algorithms; + HEIC sources retain validated pixels/normalized facts and discard source bytes. +- Dispatch reads at most 64 KiB before admission, from one open source stream. + HEIC extensions route directly; renamed HEIC and ambiguous BMFF file types + route to the isolated decoder. Only positively identified AVIF/CR3 brands + enter existing native metadata/preview handling. No full container walk occurs + in the parent. Bulk HEIC reads and digest calculation occur inside admission. +- The guest's transformed pixels are authoritative. The source adapter does + not apply Exif orientation again; ordinary image orientation stays unchanged. + Native camera/container/Exif precedence still needs qualification before + production enablement. Existing normalized GPS absence ambiguity is preserved. +- Metadata-only reads use the guest metadata operation. Cancellation closes + the open stream and joins that close callback. Opening or a storage backend + that cannot interrupt a blocked read retains the existing I/O limitation. +- First gate: owned decoder callbacks prove no bulk read before admission, + renamed dispatch, exact digest/size, one decode, 16-bit pixels, no repeated + orientation, source cancellation and metadata-only routing. Ordinary JPEG, + AVIF, CR3, GIF/SVG, thumbnails and capture-date regressions must pass. + Verify `go test -race -tags no_emoji,nodynamic ./internal/imaging`, then the + affected consumer packages, `make verify-build`, and changed-file GoLand. + App/similarity injection and shutdown tests are a separate subsequent gate. + +- First source gate passed: image-source contracts went red against the refusing + placeholder, then green. Native byte-metadata refusal first failed on the + existing ordinary HEIC fixture, then passed after dispatch guards. An actual + early full-read mutation failed the renamed-file admission test; exact source + restored. Full imaging race tests pass in 23.429 s; expanded focused source + tests pass in 1.386 s. GoLand is clear on new source/dispatch/tests and changed + preview, metadata, RAW and raster files. The loader import retains the already + recorded IDE module-tag error (no_emoji/nodynamic not applied to its live + module); command-line tagged builds validate that import. No suppression was + added for the missing IDE configuration. The first build gate caught import + grouping in two new files; corrected with repository goimports settings. + +P4 analysis connection gate: `similarity.Client` accepts the app-owned HEIC +client; Analyze and retained Search attach explicit pipe pairs before process +start and close/join them on every exit. Only descriptor/limit values enter the +request. Worker request setup owns one Remote and injects `imaging.Reader` into +analysis and search preparation; disposal runs before WorkerMain can exit. +Source hashes/facts use Source methods, with no raw HEIC metadata path. Owned +analysis/search subprocesses must observe a typed owner refusal without reading +source bytes, including start failure and cancellation. Pixel transport itself +is covered by P3's real inherited subprocess tests. Verify focused similarity +protocol/source tests, affected regressions, Windows cross-build and GoLand. + +- Analysis/search owned-process connection tests went red for missing setup and + missing inherited handles, then green. Search preview injection went red on + the old byte path, then green after Source migration. Full similarity race + suite passes in 13.543 s. Expanded cancellation/start-failure/preview tests pass + in 3.754 s. Windows ARM64 test binary cross-builds; native execution remains + separate. All eight changed analysis code/test files re-inspect clear in + GoLand. No inference model or real HEIC camera qualification follows from + these owned transport and source tests. + +P4 GUI injection gate: immutable foreground/background Readers enter display +Config and feature constructors before workers start. Viewer owns both readers +and the one optional HEIC Client; Explorer and visual search receive that same +Client. Stop closes HEIC admission before feature teardown and Wait joins it off +UI in production and the harness. Comparison, EXIF/file reconciliation, grid +hash/thumb work, Favorite previews, sorting, Spiral and mosaic use those Readers. +Zero-valued readers keep production HEIC disabled until package qualification. +Verify feature-level HEIC callback contracts, root wiring/shutdown assertions, +focused package regressions, exact UI shard assignments, and GoLand. + +P4 GUI evidence (2026-09-16): + +- Root source-consumer and owner-shutdown race tests pass (2.890 s); display + suite 2.696 s, grid 10.780 s, EXIF 5.517 s, Spiral 2.523 s, filesort 1.397 s, + Favorite previews 1.679 s and mosaic 51.267 s. Expanded Spiral HEIC callback + test passes (1.882 s); source/metadata/date regressions pass (1.903 s). +- Focused viewer capture-sort, EXIF navigation, Favorite, comparison, save/export + and HEIC regressions pass (45.573 s). The first run exposed a pre-existing + synctest ownership mismatch: a viewer created outside the bubble acquired a + context Done channel inside it after source cancellation became observable. + Its cleanup cancelled that channel outside the bubble. Moving that test's + viewer/source setup inside its existing bubble makes creation and cleanup + share the lifetime; no production cancellation was weakened. The minimized + test failed before the change and passes (2.624 s) afterward. +- All 29 changed GUI files were inspected, confirmed issues corrected, and + touched files re-inspected clear. The source loader retains the known IDE + build-tag configuration diagnostic for avifpolicy; tagged command-line + verification passes. Live IDE tag refresh is still recorded as incomplete. +- Both new top-level UI tests are assigned to ui-1 and its count is 238. + Qodana exact-file exclusions are synchronized. Format/provenance/import/vet/ + build gates pass. Canonical Linux shard validation and the complete race + suite remain unverified locally because the Docker daemon is unavailable. + Direct host shard checking selects an existing Darwin-only test absent from + the Linux manifest; that does not justify changing the canonical manifest. + +P2 Windows launch gate: the lead owns implementation of suspended AppContainer +creation with zero granted capabilities, an explicit three-handle stdio list, +one-process Job Object, finite committed-memory/CPU limits and kill-on-close. +The child verifies its token and active job before readiness; failures retire +all handles and the suspended child. No native image parser is added. Native +owned controls and ordinary WASI fixtures must pass on both Windows architectures +before activation. Cross-builds alone are not native evidence. The read-only +Windows scout was reused for pinned standard-library/x/sys API inventory while +the lead verified P4 (G1 bounded API question; G2 source declarations/official +links; G3 no edits; G4 narrow platform facts; G5 no lead implementation overlap). + +P2 Windows candidate evidence (2026-09-16): + +- Added `internal/heicdecode/winisolation`: suspended zero-capability AppContainer + launch, explicit stdio handle list, child-process restriction and private job + with process-count/commit-memory/user-CPU/kill-on-close limits. The worker + checks token identity/capabilities and immediate job before the common owned + file/network denial probes. Provisioning grants read/execute only to a + dedicated helper and its directory, without ACL inheritance; launch itself + does not change permissions. +- The owned native control has a 64 MiB budget, checks a fixed 65 MiB commitment + refusal without touching pages, rejects a second inert copy and checks that + a parent environment sentinel is absent. An unsandboxed process must fail + verification. These Windows tests first failed to compile for the missing + boundary; native red/green execution remains pending, not inferred from that + compile failure. AMD64/ARM64 test binaries and the AMD64 helper cross-build. +- Native suite registration tests failed for missing Windows guards/CI wiring, + then pass (0.267 s). `heic-windows` replaces the pipe-only suite, retaining + its analysis/pipe controls and adding token/job controls and the same ordinary + ten-bit/12MP helper fixtures as Linux. The shared fixture test is now + `client/native_platform_test.go`; native Linux inventory is updated with it. +- A portable denial-classification control failed for standard permission + errors, then passes (0.263 s). Windows file access-denied and Winsock WSAEACCES + are recognized; connection failures/timeouts are not isolation evidence. +- Client process-lifetime regressions pass under race (8.935 s). Windows HEIC + packages pass vet; Linux AMD64 and Windows ARM64 native client inventories + cross-build. All 19 affected existing/new code files inspected clear in + GoLand. `make verify-build` passes including format, source/artifact proof, + imports, notices, vet and build; exact Qodana exclusions are synchronized. +- Packaging discovery reused the read-only caller scout for twelve-file-bounded + artifact-layout facts while the lead implemented Windows isolation. G1-G5: + bounded inventory, file/line oracle, no edits, cold independent package paths, + no lead design/review overlap. P5 retains all decisions and implementation + with the lead. Additional scout call recorded rather than hidden in budget. + +- Real signed Apple Silicon App Sandbox helper still passes after the process + abstraction/permission changes (3.385 s). + +P5 packaging contract: helper and exact notices live at fixed package-relative +paths, with a bounded manifest recording the post-signing executable SHA-256, +platform and embedded-guest SHA-256. This manifest belongs to the trusted +installed package (TUF archive or platform package/bundle signing); it is not +an independent signature or protection against replacement of the whole trusted +installation by its owner. No image, environment override or manifest field +chooses an executable path. Readiness and isolation checks still run for every +request. Package construction finalizes the manifest after helper signing, and +any later helper change must fail the executable pin. Production admission and +format exposure remain disabled until native/package qualification is complete. +The next acceptance seam is package loading with absent, malformed, wrong-target +and changed-helper controls, followed by actual staged-bundle qualification. + +P5 packaging evidence in progress: + +- Fixed package paths and bounded manifests now have race-tested absent, + malformed, wrong-architecture and changed-helper controls (1.368 s). + `scripts/heicpackage` builds the minimal helper, signs/verifies its macOS + bundle, copies exact h265/Go/wazero notice files and writes the final hash + manifest. Wrong binary format is refused before manifest creation; package + tool controls pass (1.367 s). Linux AMD64 and Windows ARM64 artifacts stage + successfully here; those are cross-builds, not native isolation results. +- Native macOS acceptance now uses this same staged package; ordinary decode, + missing-sandbox refusal and cancellation pass (3.070 s). `make package-mac` + builds the complete app with its nested helper/notices. Strict deep codesign + verification passes for both outer app and nested helper. The automatic + Fyne build-number increment (469 to 470) was restored after verification. +- Release ZIP/tar and MSIX assembly include the helper/notices. Windows signing + signs both executables, finalizes the helper manifest afterward, and retains + the helper directory when rebuilding the ZIP. Real Windows Authenticode/MSIX + package execution remains unverified. +- Packaging inspection found a further required P5 path: the in-app updater + currently installs only the main executable and macOS plist. It will need + authenticated companion-file staging/install (with rollback) or a complete + package transaction before HEIC activation. No updater installation behavior + has been changed yet. Production remains disabled while this work and native + qualification are incomplete. + +GoLand configuration follow-up: using the live project Build Tags settings, +set the required `no_emoji nodynamic` editor tags. The changed imaging loader +now re-inspects with no findings; its previously reported avifpolicy import +warning is resolved without a suppression. This is project-local IDE state, +not a source change. The known nested guest module resolution issue is separate +from the native loader diagnostic. + +P5 updater continuation contract: after authenticated archive extraction, retain +and persist exact companion-file digests. Validate every staged companion again +before installation. Linux/Windows install the dedicated `heic` directory with +rollback around the existing executable transaction. macOS installs a verified +complete app bundle so the outer signature and nested helper remain consistent. +Legacy stages without companion provenance retain their existing behavior; +this also means the first upgrade from an older updater can omit the helper and +must remain fail-closed until a complete package is installed. The shutdown path +must join the HEIC owner before replacing any helper files. Acceptance tests use +owned archives/files: companion tampering after Save/Load is rejected; install +preserves the package; preparation/apply failures restore prior installed bytes; +existing update/relaunch controls still pass. Native Windows/MSIX execution and +the old-updater transition stay explicit qualification limits. + +P5 updater evidence (2026-09-16): + +- The companion-provenance test failed because a changed notice was accepted + after Save/Load, then passes after exact bounded inventories were added. + Each authenticated extraction now owns a fresh payload directory so stale + cached files cannot be incorporated into a newer archive's companion proof. +- The install test failed with a new main executable paired to the old helper, + then passes after the helper-directory transaction/rollback. Full updater + race suite passes (4.204 s), updater UI suite (1.627 s) and focused root + shutdown/update regressions (4.446 s). Windows AMD64/ARM64 updater test + binaries cross-build; native execution remains a gate. +- Native macOS whole-bundle install and an injected final-rename failure both + preserve coherent signatures and all expected bytes, without modifying a + neighboring owned user-data file. An initial fixture had unchanged helper + resources and incorrectly survived the negative binary-only mutation; it was + strengthened to change helper metadata/signature, its manifest and another + sealed resource. The same real mutation now fails for package mismatch; + restored implementation passes (1.639 s). This supersedes the weaker fixture + evidence. Strict deep codesign verification covers the enclosing bundle and + nested helper, not merely the standalone helper signature. +- The retained legacy updater path was tested separately with an owned initial + bundle that has no helper. It omits the new helper, removes the staged payload + and fails enclosing codesign verification (invalid resource directory). The + expected-limitation control passes (1.748 s). This proves no cache-based + automatic migration is available after the old updater's normal cleanup. + A complete reinstall or separately qualified bridge is a first-release + requirement; production HEIC remains disabled. The originating task received + this concrete finding and the fact that work continues locally. + +- Removing a helper-bearing stage's companion provenance initially passed + validation. The new control fails before the fix and passes after rejecting + helper packages without their verified digests. Legacy stages with no helper + remain supported. Full updater race regressions pass again (4.091 s). +- Final updater/native-guard GoLand inspections are clear, and the three + modified workflow documents parse as YAML. Explicit Windows companion + provenance/install/rollback requirements were missing from the guard list; + a failing registration control exposed this and the list is corrected. +- A final read-only fixture inventory reused the caller scout while the lead + verified updater changes. G1-G5: repository-only ordinary-fixture coverage, + named tests/file-line evidence, no writes or decoder execution, independent + compatibility facts, and no delegated implementation or review. It confirms + that the existing fixtures cover basic/alpha/explicit ten-bit transport and + synthetic 12MP throughput, but no recorded real-camera provenance or + HDR/color reference. Adapter metadata stubs are not camera extraction proof. +- Final consolidated `make heic-native-macos` passes all four mandatory guards: + sandbox helper, interpreter/compiler comparison, signed bundle install and + rollback, and the legacy first-upgrade limitation. Compiler 12MP decode is + 6.772 s; the interpreter is terminated/joined at 60.015 s. The two native + update guards pass in 1.310 s and 1.220 s. Raw events are retained in + `.scratch/heic-qualification/native-macos.json`. Native guard registration + regressions pass under race in 1.344 s; changed guard files re-inspect clear. +- Final `make verify-build` passes again after the updater provenance and CI + guard corrections. Publication remains blocked on the pending Secretive + signing request; subsequent work stays unstaged to preserve that in-flight + checkpoint. A refreshed PR description is prepared locally for publication. + +### Ordinary compatibility continuation (2026-09-16) + +The originating task requested bounded normal-camera and color qualification +before treating signing as the only remaining local dependency. The lead owns +all checks and conclusions. A read-only scout searched first-party records for +at most two ordinary licensed samples while the lead tested existing fixtures; +it downloaded no image bytes and executed no decoder. This is the existing +compatibility gate, with no new HDR feature, negative corpus or stress work. + +- Real sandboxed helper checks pass for the existing synthetic TestCam metadata + and container rotation, alpha, basic color pattern and owned ten-bit ramp. + ImageIO/ExifTool provide independent metadata/orientation and eight-bit SDR + comparisons. The known generated ramp is the numeric oracle for ten-bit + values, because ImageIO expands/clips that fixture's range differently. +- Added the metadata/config/decode and known-ramp assertions to the existing + native sandbox guard. The complete guard passes in 5.906 s, and GoLand is + clear. Full details, reference methodology and observed pixel differences + are in `docs/heic/compatibility-2026-09-16.md`. +- Static maintained-source/API evidence establishes an implementation limit: + ICC/primaries/transfer handling and HDR gain-map/tone-map presentation are + absent, and the guest drops the color description. Those color classes are + not explicitly rejected. This supersedes the earlier vague description of + HDR/color as merely unqualified; no implementation behavior was expanded. +- One photographer-released public-domain Samsung S23 Ultra sample with an + immutable source manifest and paired SDR reference was located. Only that + ordinary file is being retrieved with pinned size/hash and finite transfer + limits; incomplete bytes will never be decoded. All native OS CI and signed + publication requirements remain unchanged. +- The camera sample was fully retrieved and matched its pinned 2,872,198-byte + size and SHA-256 before decoding. The real helper succeeds in 20.414 s, + preserving upright 3000x4000 pixels and expected Samsung metadata. It carries + a P3 profile; comparison with color-managed ImageIO yields RGB MAE + 7.529/8.283/7.644, so this is decode/metadata/orientation evidence, not faithful + P3 display. The public paired PNG was identified but not downloaded or used. +- The bounded compatibility continuation is complete. Native tests, GoLand + and `make verify-build` pass. Remaining camera breadth, color/HDR support, + native CI, distribution and signing requirements are recorded explicitly; + no production activation or new color implementation was added. + +### Complete checkpoint publication (2026-09-16) + +Ronin requested publication of the entire owned checkpoint to the existing +draft PR #28. Fresh inspection confirms the old signing process has exited; +the configured SSH key fingerprint matches a currently available Secretive +key. Signing stays enabled and the configured signer is used without a key +override. The prior P0-only staged subset is superseded by all 226 related +changed/new files; no unrelated local changes were identified. + +The lead reviewed the intended source, platform, shared-admission, imaging, +packaging/updater, CI/test and documentation scope against the existing plan +and verification record. Source/artifact/import guards and exact Qodana test +exclusions are rechecked. The UI manifest has unique assignments for both new +root tests, sorted blocks and matching counts (238/248/202); complete Linux +build-selected inventory and race verification remain native CI gates. +Prior focused/native/GoLand/build evidence remains applicable; broad local +tests are not rerun merely for publication. + +A read-only scout inventoried the two separately owned documentation commits +while the lead handled the checkpoint (bounded commit/path facts; no edits, +review or historical code import). They are intentionally absent here: +`cac90b9e4b2e7039c1489bc84e96327ec1e84f46` adds +`docs/heic/macos-memory-protection-research.md`; root-local +`73cb3c9c568728ecd4cd36df10dd6907f3d47a3c` adds `THREAT-MODEL.md` scoped to the +historical prototype. Neither branch nor the historical hardening commit is +merged. The missing documents are reported for separate intentional integration. +HEIC activation remains disabled, all qualification limitations remain explicit, +and no history rewrite, merge or release is authorized by this checkpoint. diff --git a/qodana.yaml b/qodana.yaml index 7c9a86d4..685e0f79 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -41,6 +41,8 @@ profile: #Specify Qodana linter for analysis (Applied in CI/CD pipeline) linter: jetbrains/qodana-go:2026.2 include: + # Preserve reviewed codec variants for exact source comparison. Keep this + # generated paths list contiguous so sync-qodana-test-exclusions can update it. - name: DuplicatedCode # Shared table-test scaffolding is intentionally excluded from DuplicatedCode # because it reads better repeated than extracted; production duplication @@ -99,6 +101,8 @@ exclude: - name: GoResourceLeak paths: - "internal/clipboard/clipboard.go" + # Preserve reviewed codec variants for exact source comparison. Keep this + # generated paths list contiguous so sync-qodana-test-exclusions can update it. - name: DuplicatedCode paths: - "internal/appearance/appearance_test.go" @@ -131,14 +135,24 @@ exclude: - "internal/hdbscan/hdbscan_test.go" - "internal/hdbscan/labels_test.go" - "internal/hdbscan/sets_test.go" + - "internal/heicdecode/client/admission_test.go" + - "internal/heicdecode/client/attachment_test.go" - "internal/heicdecode/client/client_test.go" - "internal/heicdecode/client/native_darwin_test.go" + - "internal/heicdecode/client/native_platform_test.go" + - "internal/heicdecode/client/package_test.go" + - "internal/heicdecode/client/peer_other_test.go" + - "internal/heicdecode/client/peer_windows_test.go" - "internal/heicdecode/client/process_unix_test.go" + - "internal/heicdecode/client/remote_test.go" - "internal/heicdecode/metadata_test.go" - "internal/heicdecode/protocol_test.go" - "internal/heicdecode/ready_test.go" - "internal/heicdecode/request_test.go" - "internal/heicdecode/response_test.go" + - "internal/heicdecode/winisolation/native_windows_test.go" + - "internal/heicdecode/worker/linux_filter_test.go" + - "internal/heicdecode/worker/native_linux_test.go" - "internal/heicdecode/worker/runtime_test.go" - "internal/imaging/avif_policy_test.go" - "internal/imaging/bytecache_test.go" @@ -157,6 +171,7 @@ exclude: - "internal/imaging/preview_test.go" - "internal/imaging/raw_test.go" - "internal/imaging/save_test.go" + - "internal/imaging/source_test.go" - "internal/imaging/svg_test.go" - "internal/imaging/thumbnail_test.go" - "internal/imaging/tiffbounds_test.go" @@ -180,6 +195,7 @@ exclude: - "internal/similarity/cache_store_test.go" - "internal/similarity/cache_test.go" - "internal/similarity/grouping_test.go" + - "internal/similarity/heic_test.go" - "internal/similarity/offline_test.go" - "internal/similarity/search_pipeline_test.go" - "internal/similarity/search_protocol_test.go" @@ -280,6 +296,7 @@ exclude: - "internal/ui/help/mascot_test.go" - "internal/ui/help/search_test.go" - "internal/ui/help/whatsnew_test.go" + - "internal/ui/images_test.go" - "internal/ui/imgcache_test.go" - "internal/ui/info_test.go" - "internal/ui/infoview/card_test.go" @@ -351,9 +368,11 @@ exclude: - "internal/update/await_test.go" - "internal/update/await_windows_test.go" - "internal/update/checksums_test.go" + - "internal/update/companions_test.go" - "internal/update/download_test.go" - "internal/update/extract_test.go" - "internal/update/github_test.go" + - "internal/update/package_native_darwin_test.go" - "internal/update/swap_test.go" - "internal/update/tufroot_repo_test.go" - "internal/update/tufroot_test.go" @@ -379,6 +398,7 @@ exclude: - "scripts/explorereval/trial_test.go" - "scripts/heicbuild/guest_test.go" - "scripts/heicbuild/main_test.go" + - "scripts/heicpackage/main_test.go" - "scripts/msixstage/msixstage_test.go" - "scripts/nativeguards/main_test.go" - "scripts/plistdoctypes/doctypes_test.go" @@ -392,3 +412,102 @@ exclude: - "scripts/updaternotices/main_test.go" - "scripts/wingettag/tag_test.go" - "scripts/wingettag/workflow_test.go" + - "third_party/h265/heic/color_amd64.go" + - "third_party/h265/heic/color_arm64.go" + - "third_party/h265/heic/color_riscv64.go" + - "third_party/h265/heic/color_row.go" + - "third_party/h265/heic/gridenc.go" + - "third_party/h265/hevc/ctu.go" + - "third_party/h265/hevc/dsp_amd64.go" + - "third_party/h265/hevc/dsp_arm64.go" + - "third_party/h265/hevc/dsp_riscv64.go" + - "third_party/h265/hevc/headers.go" + - "third_party/h265/hevc/inter.go" + - "third_party/h265/hevc/interpred.go" + - "third_party/h265/hevc/lossyenc.go" + - "third_party/h265/hevc/rdoq.go" + - "third_party/h265/hevc/residual.go" + - "third_party/h265/hevc/residualenc.go" + - "third_party/h265/hevc/sao.go" + - "third_party/h265/hevc/saoenc.go" + - "third_party/h265/hevc/slice.go" + - "third_party/h265/hevc/transformenc.go" + + # Retained decoder source: build-specific/public API declarations and Go + # assembly are preserved byte-for-byte. See third_party/h265/PICFETCH.md. + - name: GoUnusedParameter + paths: + - "third_party/h265/heic/color_amd64.go" + - "third_party/h265/heic/color_arm64.go" + - "third_party/h265/heic/color_riscv64.go" + - "third_party/h265/hevc/dsp_amd64.go" + - "third_party/h265/hevc/dsp_arm64.go" + - "third_party/h265/hevc/dsp_riscv64.go" + - name: GoUnusedExportedFunction + paths: + - "third_party/h265/heic/encode.go" + - "third_party/h265/heic/exif.go" + - "third_party/h265/heic/heic.go" + - "third_party/h265/hevc/nal.go" + - name: GoUnusedFunction + paths: + - "third_party/h265/heic/ycbcr.go" + - "third_party/h265/hevc/itransform.go" + - "third_party/h265/hevc/nal.go" + - "third_party/h265/hevc/residual.go" + - name: GoUnusedConst + paths: + - "third_party/h265/hevc/cabac_tables.go" + - "third_party/h265/hevc/nal.go" + - name: GoUnusedType + paths: + - "third_party/h265/hevc/mvpred.go" + - name: All + paths: + - "third_party/h265/heic/color_amd64.s" + - "third_party/h265/heic/color_arm64.s" + - "third_party/h265/heic/color_riscv64.s" + - "third_party/h265/heic/cpu_amd64.s" + - "third_party/h265/hevc/cpu_amd64.s" + - "third_party/h265/hevc/deblock_amd64.s" + - "third_party/h265/hevc/deblock_arm64.s" + - "third_party/h265/hevc/deblock_riscv64.s" + - "third_party/h265/hevc/dequant_amd64.s" + - "third_party/h265/hevc/dequant_arm64.s" + - "third_party/h265/hevc/dequant_riscv64.s" + - "third_party/h265/hevc/idct_amd64.s" + - "third_party/h265/hevc/idct_arm64.s" + - "third_party/h265/hevc/idct_riscv64.s" + - "third_party/h265/hevc/interpred_amd64.s" + - "third_party/h265/hevc/interpred_arm64.s" + - "third_party/h265/hevc/interpred_bi_amd64.s" + - "third_party/h265/hevc/interpred_bi_arm64.s" + - "third_party/h265/hevc/interpred_bi_riscv64.s" + - "third_party/h265/hevc/interpred_copy_amd64.s" + - "third_party/h265/hevc/interpred_copy_arm64.s" + - "third_party/h265/hevc/interpred_copy_riscv64.s" + - "third_party/h265/hevc/interpred_riscv64.s" + - "third_party/h265/hevc/interpred_tap_amd64.s" + - "third_party/h265/hevc/interpred_tap_arm64.s" + - "third_party/h265/hevc/interpred_tap_riscv64.s" + - "third_party/h265/hevc/interpred_tapv_amd64.s" + - "third_party/h265/hevc/interpred_tapv_arm64.s" + - "third_party/h265/hevc/interpred_tapv_riscv64.s" + - "third_party/h265/hevc/intrapred_amd64.s" + - "third_party/h265/hevc/intrapred_arm64.s" + - "third_party/h265/hevc/intrapred_riscv64.s" + - "third_party/h265/hevc/itransform_amd64.s" + - "third_party/h265/hevc/itransform_arm64.s" + - "third_party/h265/hevc/itransform_riscv64.s" + - "third_party/h265/hevc/satd_amd64.s" + - "third_party/h265/hevc/satd_arm64.s" + - "third_party/h265/hevc/satd_riscv64.s" + - "third_party/h265/hevc/sse_amd64.s" + - "third_party/h265/hevc/sse_arm64.s" + - "third_party/h265/hevc/sse_riscv64.s" + - "third_party/h265/hevc/transformenc_amd64.s" + - "third_party/h265/hevc/transformenc_arm64.s" + - "third_party/h265/hevc/transformenc_riscv64.s" + - "third_party/h265/hevc/transpose_amd64.s" + - "third_party/h265/hevc/transpose_arm64.s" + - "third_party/h265/hevc/transpose_riscv64.s" diff --git a/scripts/heicbuild/main.go b/scripts/heicbuild/main.go index 2bc82418..e449eb3f 100644 --- a/scripts/heicbuild/main.go +++ b/scripts/heicbuild/main.go @@ -23,10 +23,10 @@ import ( const ( decoderModule = "github.com/gen2brain/h265" - decoderVersion = "v0.2.3" - decoderRevision = "b2d46ba787d8f0a2025bd106443ab1b1c7cd010f" - decoderSum = "h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=" - decoderZipSHA = "2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a" + decoderVersion = "v0.2.2" + decoderRevision = "665fd95984177afef4a7efca7d50638e4b695c7a" + decoderSum = "h1:rnpfo8I4PFhohbij8ySYZlJFn07TTwV+/uWBrKsOEas=" + decoderZipSHA = "57a197c95e25b481abcd6d20773ebfb17d859e6d864017304aff6ec0e0f19757" compilerVersion = "go1.27.1" guestDir = "scripts/heicguest" guestArtifact = "internal/heicdecode/worker/decoder.wasm" @@ -36,6 +36,7 @@ const ( type manifest struct { Version int Module, Revision, ModuleSum, ModuleZipSHA256, Compiler string + MaintainedRevision, MaintainedRecordSHA256 string Files map[string]string } @@ -83,7 +84,7 @@ func run(mode string) error { if err = json.Unmarshal(data, &m); err != nil { return err } - if m.Version != 1 || m.Module != decoderModule+"@"+decoderVersion || m.Revision != decoderRevision || m.ModuleSum != decoderSum || m.ModuleZipSHA256 != decoderZipSHA || m.Compiler != compilerVersion { + if m.Version != 2 || m.Module != decoderModule+"@"+decoderVersion || m.Revision != decoderRevision || m.ModuleSum != decoderSum || m.ModuleZipSHA256 != decoderZipSHA || m.Compiler != compilerVersion || m.MaintainedRevision != maintainedRevision || m.MaintainedRecordSHA256 != maintainedRecordSHA { return errors.New("guest manifest disagrees with reviewed source/toolchain pins") } expected := append(append([]string(nil), files...), guestArtifact) @@ -126,7 +127,7 @@ func run(mode string) error { if err = os.WriteFile(filepath.Join(root, guestArtifact), built, 0644); err != nil { return err } - m := manifest{Version: 1, Module: decoderModule + "@" + decoderVersion, Revision: decoderRevision, ModuleSum: decoderSum, ModuleZipSHA256: decoderZipSHA, Compiler: compilerVersion, Files: make(map[string]string)} + m := manifest{Version: 2, Module: decoderModule + "@" + decoderVersion, Revision: decoderRevision, ModuleSum: decoderSum, ModuleZipSHA256: decoderZipSHA, Compiler: compilerVersion, MaintainedRevision: maintainedRevision, MaintainedRecordSHA256: maintainedRecordSHA, Files: make(map[string]string)} for _, name := range append(files, guestArtifact) { sum, err := fileDigest(filepath.Join(root, name)) if err != nil { @@ -173,6 +174,12 @@ func goCommand(root string, guest bool, args ...string) ([]byte, error) { } func verifySource(root string) error { + if err := verifyMaintainedSource(root); err != nil { + return err + } + if err := verifyReplacements(root); err != nil { + return err + } version, err := goCommand(root, true, "env", "GOVERSION") if err != nil { return err @@ -220,7 +227,7 @@ func verifySource(root string) error { func buildInputs(root string) ([]string, error) { var files []string - for _, dir := range []string{"internal/heicdecode", guestDir, "docs/heic/notices", "scripts/heicbuild/testdata"} { + for _, dir := range []string{"internal/heicdecode", guestDir, "docs/heic/notices", "scripts/heicbuild/testdata", "third_party/h265"} { err := filepath.WalkDir(filepath.Join(root, dir), func(path string, d fs.DirEntry, err error) error { if err != nil { return err @@ -244,7 +251,7 @@ func buildInputs(root string) ([]string, error) { return nil, err } } - files = append(files, "scripts/heicbuild/main.go", "scripts/heicbuild/fixture.go") + files = append(files, "go.mod", "scripts/heicbuild/main.go", "scripts/heicbuild/fixture.go", "scripts/heicbuild/source.go") sort.Strings(files) return files, nil } @@ -294,7 +301,7 @@ func checkNativeSources(root string) error { } rel = filepath.ToSlash(rel) if d.IsDir() { - if rel == guestDir || (rel != "." && (strings.HasPrefix(d.Name(), ".") || d.Name() == "vendor" || d.Name() == "bin" || d.Name() == "fyne-cross")) { + if rel == guestDir || rel == "third_party/h265" || (rel != "." && (strings.HasPrefix(d.Name(), ".") || d.Name() == "vendor" || d.Name() == "bin" || d.Name() == "fyne-cross")) { return filepath.SkipDir } return nil @@ -323,6 +330,9 @@ func checkNativeSources(root string) error { } func checkImports(root string) error { + if err := verifyReplacements(root); err != nil { + return err + } if err := checkNativeSources(root); err != nil { return err } diff --git a/scripts/heicbuild/main_test.go b/scripts/heicbuild/main_test.go index bafe5238..393f1bfe 100644 --- a/scripts/heicbuild/main_test.go +++ b/scripts/heicbuild/main_test.go @@ -3,6 +3,7 @@ package main import ( "os" "path/filepath" + "slices" "testing" ) @@ -53,3 +54,58 @@ func TestImportGuardKeepsGuestRuntimeOutOfViewer(t *testing.T) { t.Fatal("viewer imported the embedded guest runtime") } } + +func TestMaintainedSourceIsInventoriedAndCannotBecomeNative(t *testing.T) { + root := t.TempDir() + for _, dir := range []string{"internal/heicdecode", guestDir, "docs/heic/notices", "scripts/heicbuild/testdata", "third_party/h265/heic"} { + if err := os.MkdirAll(filepath.Join(root, dir), 0700); err != nil { + t.Fatal(err) + } + } + const source = "third_party/h265/heic/source.go" + if err := os.WriteFile(filepath.Join(root, source), []byte("package heic\nimport _ \"github.com/gen2brain/h265/hevc\"\n"), 0600); err != nil { + t.Fatal(err) + } + files, err := buildInputs(root) + if err != nil || !slices.Contains(files, source) { + t.Fatalf("maintained source missing from artifact inputs: %v, %v", files, err) + } + if err = checkNativeSources(root); err != nil { + t.Fatalf("the separate decoder module is not a native application import: %v", err) + } + if err = os.WriteFile(filepath.Join(root, "native.go"), []byte("package sample\nimport _ \"github.com/gen2brain/h265/heic\"\n"), 0600); err != nil { + t.Fatal(err) + } + if err = checkNativeSources(root); err == nil { + t.Fatal("maintained source was allowed into a native application") + } +} + +func TestMaintainedReplacementCannotBeRemovedOrRedirected(t *testing.T) { + root := t.TempDir() + if err := os.MkdirAll(filepath.Join(root, guestDir), 0700); err != nil { + t.Fatal(err) + } + rootModule := "module example.test/app\n\ngo 1.27.1\n\nreplace github.com/gen2brain/h265 => ./third_party/h265\n" + guestModule := "module example.test/guest\n\ngo 1.27.1\n\nrequire github.com/gen2brain/h265 v0.2.2\n\nreplace github.com/gen2brain/h265 => ../../third_party/h265\n" + write := func(name, data string) { + t.Helper() + if err := os.WriteFile(filepath.Join(root, name), []byte(data), 0600); err != nil { + t.Fatal(err) + } + } + write("go.mod", rootModule) + write(guestDir+"/go.mod", guestModule) + if err := verifyReplacements(root); err != nil { + t.Fatal(err) + } + write(guestDir+"/go.mod", "module example.test/guest\n") + if err := verifyReplacements(root); err == nil { + t.Fatal("removed guest replacement accepted") + } + write(guestDir+"/go.mod", guestModule) + write("go.mod", "module example.test/app\nreplace github.com/gen2brain/h265 => ./unreviewed-source\n") + if err := verifyReplacements(root); err == nil { + t.Fatal("redirected root replacement accepted") + } +} diff --git a/scripts/heicbuild/source.go b/scripts/heicbuild/source.go new file mode 100644 index 00000000..f7f0f972 --- /dev/null +++ b/scripts/heicbuild/source.go @@ -0,0 +1,90 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + + "golang.org/x/mod/modfile" +) + +const maintainedDir = "third_party/h265" +const maintainedRecord = "PICFETCH-SOURCE.json" +const maintainedRevision = "fc127b44e1c99447b8d150256563c6d4f99b8ad3" +const maintainedRecordSHA = "583c5ab3b021675acfac0bc7344a7ff7acdc8f0ae1ab94e804d7b931e3618b9b" + +// The baseline records the exact previously maintained production copy. A +// decoder update must intentionally review this record as well as the guest. +func verifyMaintainedSource(root string) error { + dir := filepath.Join(root, maintainedDir) + path := filepath.Join(dir, maintainedRecord) + digest, err := fileDigest(path) + if err != nil { + return err + } + if digest != maintainedRecordSHA { + return errors.New("maintained decoder source record changed without review") + } + data, err := os.ReadFile(path) + if err != nil { + return err + } + var record struct { + Files map[string]string + } + if err = json.Unmarshal(data, &record); err != nil { + return err + } + if err = checkDigests(dir, record.Files); err != nil { + return err + } + return filepath.WalkDir(dir, func(path string, entry fs.DirEntry, err error) error { + if err != nil || entry.IsDir() { + return err + } + rel, err := filepath.Rel(dir, path) + if err != nil { + return err + } + rel = filepath.ToSlash(rel) + if rel == maintainedRecord || rel == "PICFETCH.md" { + return nil + } + if _, ok := record.Files[rel]; !ok { + return fmt.Errorf("unreviewed maintained decoder file: %s", rel) + } + return nil + }) +} + +func verifyReplacements(root string) error { + for _, name := range []string{"go.mod", guestDir + "/go.mod"} { + path := filepath.Join(root, name) + data, err := os.ReadFile(path) + if err != nil { + return err + } + module, err := modfile.Parse(path, data, nil) + if err != nil { + return err + } + found := false + for _, replacement := range module.Replace { + if replacement.Old.Path != decoderModule { + continue + } + if replacement.Old.Version != "" || replacement.New.Version != "" || + filepath.Clean(filepath.Join(filepath.Dir(path), replacement.New.Path)) != filepath.Join(root, maintainedDir) { + return fmt.Errorf("%s does not select the maintained decoder source", name) + } + found = true + } + if !found { + return fmt.Errorf("%s lacks the maintained decoder replacement", name) + } + } + return nil +} diff --git a/scripts/heicguest/decoder.json b/scripts/heicguest/decoder.json index 2d292160..2122f55d 100644 --- a/scripts/heicguest/decoder.json +++ b/scripts/heicguest/decoder.json @@ -1,24 +1,28 @@ { - "Version": 1, - "Module": "github.com/gen2brain/h265@v0.2.3", - "Revision": "b2d46ba787d8f0a2025bd106443ab1b1c7cd010f", - "ModuleSum": "h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=", - "ModuleZipSHA256": "2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a", + "Version": 2, + "Module": "github.com/gen2brain/h265@v0.2.2", + "Revision": "665fd95984177afef4a7efca7d50638e4b695c7a", + "ModuleSum": "h1:rnpfo8I4PFhohbij8ySYZlJFn07TTwV+/uWBrKsOEas=", + "ModuleZipSHA256": "57a197c95e25b481abcd6d20773ebfb17d859e6d864017304aff6ec0e0f19757", "Compiler": "go1.27.1", + "MaintainedRevision": "fc127b44e1c99447b8d150256563c6d4f99b8ad3", + "MaintainedRecordSHA256": "583c5ab3b021675acfac0bc7344a7ff7acdc8f0ae1ab94e804d7b931e3618b9b", "Files": { "docs/heic/notices/Go-LICENSE": "911f8f5782931320f5b8d1160a76365b83aea6447ee6c04fa6d5591467db9dad", "docs/heic/notices/Go-PATENTS": "96f408bfae65bf137fc2525d3ecb030271c50c1e90799f87abf8846d8dd505cc", "docs/heic/notices/h265-LICENSE": "a53831ee9730340d31a911148e69fdd15cc7d1c408b06f3a923b170c4578634d", "docs/heic/notices/wazero-LICENSE": "c46f033d017a5af71a1de0105ec56c41bd47f81a0bbdf779fffe316336dc7c1f", "docs/heic/notices/wazero-NOTICE": "e6f0c5c151a3ff1eba8f5930a31ec084ca6d7adda43c8675ab81f7d36af50b4f", - "internal/heicdecode/limits.go": "b2f65c028eaba26960fb919da3fb3680a1b71afa2c9c8c5693bb29fb6141487a", + "go.mod": "d53b9545520c72fb5a46d2005ad8eb8a4ab9bb4f3817fd8f744109c8d1c8a9c2", + "internal/heicdecode/limits.go": "e0a31ce5704a052bef8936243bca311d1cb3a00697dd5cd1a53e718b8458c1da", "internal/heicdecode/metadata.go": "ee88ad5b55708636fc5b3470737cb68feb6822e0acf2bf6773c023ea1818656b", "internal/heicdecode/protocol.go": "a656424ab09ef1c6b2e1e52fa0fe72b611960f5a10717fc17a37a9c2b77c2d2a", "internal/heicdecode/ready.go": "423ff2a78d9fd86507b7e09af180e0bc1d5740406850f2bc880d31675f3b4329", "internal/heicdecode/request.go": "39bd8fe6af5e228681e0c819e82159c3ecb1c5109ae56513fe9b5faa6ff75ed3", - "internal/heicdecode/worker/decoder.wasm": "876a4145be029e9db9f2396ce28368c50e3ea8623e36adfaea5040db5aa72607", + "internal/heicdecode/worker/decoder.wasm": "cdaf9af71d8a8624c620a2ca8f90865a00a2d2dc228bb8bdb058564726d769ed", "scripts/heicbuild/fixture.go": "dd205a231c22f464ff86a5d922e1ee95bdca03f1e4b1ac864439cf4fdea9b512", - "scripts/heicbuild/main.go": "5dec2c5607e69f13e50c2a6cf249a19820f4f815c5e48763c316dacc182348b4", + "scripts/heicbuild/main.go": "17daa03d417139ac4b2639749871bae48e8f72290804a7a2d13776ac5669360f", + "scripts/heicbuild/source.go": "fa21510be758ac3a4634e0db028f0920747c9efb05bc903c2c4429bed0d46857", "scripts/heicbuild/testdata/README.md": "72e49786cb220bf0f46e95de5816379218f740b89c8766222495b0b5235381e7", "scripts/heicbuild/testdata/alpha.heic": "130c9f6c9a9bdefe2fc4b17427ff37b78423f2d3a935f82cfe55a9782f6d0f51", "scripts/heicbuild/testdata/basic.heic": "b3e3ee1e64f7ae42948bd9f83465c9ea110116a662d603d677d3ff262b8e4cfe", @@ -27,8 +31,116 @@ "scripts/heicbuild/testdata/tenbit.heic": "e8026ee08b531a212a29250b66f663e36fc3fb953ce7d7c5d7c9ed048e499eba", "scripts/heicguest/fixturegen/main.go": "b5bc075560ca280ff6b37b50cc48d4758e03c726c0c3235fc3accb28f402701b", "scripts/heicguest/fixturephoto/main.go": "798bfc8742bb2a16fb69d4a31d70e71960c702123108aaf0f47c3b1d2509f474", - "scripts/heicguest/go.mod": "36b7c93e5dd473ac58d0937ae120503595848abe3d1623349f3294fd09104cc8", - "scripts/heicguest/go.sum": "e8ceb1eabd033ca36c18c81acf8f62a73846f7e600868e1894b1cbaed01eb95f", - "scripts/heicguest/main.go": "30c24f8f4cd92e1b6f06a1601d42e7e6702f7b53551ebfbbb0a744ea437f6c12" + "scripts/heicguest/go.mod": "d14233c7c06337b99f56f934d76a99a8ac94086b13cc2176ce3fa9920f7ff1a5", + "scripts/heicguest/main.go": "30c24f8f4cd92e1b6f06a1601d42e7e6702f7b53551ebfbbb0a744ea437f6c12", + "third_party/h265/LICENSE": "a53831ee9730340d31a911148e69fdd15cc7d1c408b06f3a923b170c4578634d", + "third_party/h265/PICFETCH-SOURCE.json": "583c5ab3b021675acfac0bc7344a7ff7acdc8f0ae1ab94e804d7b931e3618b9b", + "third_party/h265/PICFETCH.md": "29888c61df88b49f10c38c25a843d23270a3d93e7a05aacb2e8d496bda24a5b0", + "third_party/h265/README.md": "d10ee10f3d98e3fd1808d37b26aa770d94689d2731794d06a3ea714152554838", + "third_party/h265/go.mod": "ab1c01f4919d1116d207771b0274e985c76ef0c1380ee4e0c0e3d4495a186942", + "third_party/h265/heic/color.go": "6eb86c0968f624d7081ee38cce7bfa301dfea2d362b63bf207dab183babf4beb", + "third_party/h265/heic/color_amd64.go": "c056bb073e4a11e28a6a719375b9c12483b028ecef5e92eb2ac4501bae1b8c4d", + "third_party/h265/heic/color_amd64.s": "801dfb6905769c6fcdc4c179eb89a2c5b806efd5822ec6b78554dcdb0b2ab946", + "third_party/h265/heic/color_arm64.go": "459e3af6924ca246c1e909638d4212b77b19c91b4ae9fc70c91f4548faf16c1f", + "third_party/h265/heic/color_arm64.s": "3cc39098aa91591db0a2dc0add555296f57905b6d5aa46504549483e49ec95ca", + "third_party/h265/heic/color_noasm.go": "8658b79899068b92b12cb62c3a1b358712382a6ecd0706f5f874e24b674bdac0", + "third_party/h265/heic/color_riscv64.go": "2eaec7518c8b970b42b7ea63015b2e03b4f042bbb569d16db186051004144113", + "third_party/h265/heic/color_riscv64.s": "ec3aca76667078e3d56d6cf703a01491bd3d343e385ca6fb6735e87f7d9f2eb3", + "third_party/h265/heic/color_row.go": "d2467b8d79b3c7ea35c990cf82a0e7c88a04d932a317b4c7f712511dec5088a5", + "third_party/h265/heic/cpu_amd64.go": "7ac53bab8a9fedbbd5d08020703b37a6c967feb10a2cee651c780961621f4414", + "third_party/h265/heic/cpu_amd64.s": "462ed6010f30c535a8f2c1f5682aff46f1a9fc13ca6ff7303527135458e30165", + "third_party/h265/heic/encode.go": "08ab928a36dd612135155f8ccf8bf941dc6df1cb56adafa05467329db50fccfd", + "third_party/h265/heic/exif.go": "5c863616f6ea4bc6d830d92682ef5325bf13f7c8df2520ba26d46079f8434759", + "third_party/h265/heic/grid.go": "d4c91e57122a53d9fd6c93cc02d207830ca9060a74b86e6919336e16f6f7fcc9", + "third_party/h265/heic/gridenc.go": "87613918826f80509083abf6c94a2f89acaae13b23014dc3bc640fdb5cce549b", + "third_party/h265/heic/heic.go": "2d6e508e2e28192d48192d92b124a7b1446dab23d0a141d91cc6c6dd4a26e46b", + "third_party/h265/heic/image.go": "88788bdb63d755c99d557eb99c782f804850ac926b0ee05f40cecd965d216624", + "third_party/h265/heic/isobmff.go": "187e638e5d2da55051ade4d1faa36639bef102fd80c1bc6109d57f38adf0e9a8", + "third_party/h265/heic/limits.go": "ff336caa0c194fcc81e2ea5cf581ce30eda9a6e038ec9bbe98ba5c2d15831dc2", + "third_party/h265/heic/sequence.go": "8c5c9b8e042cdd254cc52cd25438632fd77ec4b507526d42bdb474f64159c8fa", + "third_party/h265/heic/transform.go": "11c75e77a33a21f891e9d5e1401c9cfb3ddbdcbbcb0e96745a9ff4519f841423", + "third_party/h265/heic/ycbcr.go": "e190dffd37342e4375fba5de7d6d3a4a5bfaab228cd953978a3cb922f688d4d4", + "third_party/h265/hevc/budget.go": "62ed954c0300d8a848d262e1a9dc33514b6058613caf22e8662e591c7ef0d735", + "third_party/h265/hevc/cabac.go": "4b3426446d9e2d5636fd3137b790fa2641899f68e8c8c8b15857efb7998bfbcd", + "third_party/h265/hevc/cabac_tables.go": "39ae240713d741df33bdac8551ac7b463351d459069cd07feafda88058e5472a", + "third_party/h265/hevc/cabacenc.go": "6f010e27c000afe826b2155f424af303db05d2179b9b3cefb2f99c44b1ff96d5", + "third_party/h265/hevc/cpu_amd64.s": "ce04f6cb753589d1b49c52d8e767cfcee707c6f57e42e0b3f80a7b370f60e619", + "third_party/h265/hevc/ctu.go": "fa320bc14f90828450d0b3cf42bd4146811e507964a707dd6e4411502f7bbc00", + "third_party/h265/hevc/deblock.go": "36f66c96e38e26b1f0b0885c68b026cb67350600ae3056d6b082d20975cabf87", + "third_party/h265/hevc/deblock_amd64.s": "086a0a4ecb4f1aacabdd6896bd497027724867a74c3963b954a256fcb90e4ae3", + "third_party/h265/hevc/deblock_arm64.s": "f0fc2c9566139df256c80554cdb4497513f10357168720e7d185dc3bcdeeef26", + "third_party/h265/hevc/deblock_riscv64.s": "2871547768141f10d9129f006df25158efc696899b89830e43757f71241b3ee3", + "third_party/h265/hevc/deblockenc.go": "b2c9996e3d527124859f3238663d1ee4a3d298e83c336f66acc2876dde3ebe51", + "third_party/h265/hevc/decoder.go": "98c2d0d6348babc6068f6815e6a94802731a9d105ad19628c14b9d729eb27030", + "third_party/h265/hevc/dequant_amd64.s": "6ed52f89420aa8fb1fdc3a9da8473f381716a2431beceddeb41e38775f123d4a", + "third_party/h265/hevc/dequant_arm64.s": "8162781c26dcac679d0af9db257c3915d8d7f83849b1e47c9269a2bf62da68a8", + "third_party/h265/hevc/dequant_riscv64.s": "ea86abff13f9b065be2591a5bb2fcf2b5ccde4a9f63992e085615c65295cf904", + "third_party/h265/hevc/dpb.go": "36aa82767d7e3c73474de3c77a0f6756ad83ddb78a2666b2176e3ec972be18c1", + "third_party/h265/hevc/dsp.go": "07b1155187c9ce66130902f2c58e3c0d5ab7a30fba7d572006cb86b263c84eab", + "third_party/h265/hevc/dsp_amd64.go": "6be0f3d7698f8ef58403285c03feeb46e1d3ce218e6660d083297c184aaeba69", + "third_party/h265/hevc/dsp_arm64.go": "d6dd5a569163543bf5af811ea6c47f78a609d1cd3512e545e19aebeb6655eabd", + "third_party/h265/hevc/dsp_noasm.go": "33369a09b678286c8b0fdb996d4a8f89165aeaaf95222fea37123894ddeaf6d4", + "third_party/h265/hevc/dsp_riscv64.go": "7530087bd0466d79a010c17e96dbdc8272502a2a90bb9b00365df7e179ebd4a5", + "third_party/h265/hevc/encoder.go": "71d15aa3e9f3bb7f1909e859a259e2abdaac6ef242a5ec60462e72b3716c4751", + "third_party/h265/hevc/getbits.go": "508e223966df9a8d2e6bf9c666f6f85979397f7e17a8d01c2579f35e0b33e6ab", + "third_party/h265/hevc/headers.go": "44bf44cdf4596e6fe855b14e0a323f71d6f91a5f58b3873dc81469ae4b359cc5", + "third_party/h265/hevc/headersenc.go": "951fdab46b602e620008d5018fe228239808baa1997158e9765cdc9f8eebe0fa", + "third_party/h265/hevc/idct_amd64.s": "d69467d1fdbab834d69e51f76adc213c1c1a4b15e2f4d810e150a89902f2c3ef", + "third_party/h265/hevc/idct_arm64.s": "46d9bffa1d0aa85a7ad97b64fcb4ee63169b171074545e126e689b11e88d4956", + "third_party/h265/hevc/idct_riscv64.s": "4392199c1793f68c4712b59e07a1bb399af0e2e4d1b41571e4c53f826fb3e483", + "third_party/h265/hevc/inter.go": "88f2ed37174ebda06461c8f7b1b94b5b36a6dca6697ac83b4c3eff33e6a715cc", + "third_party/h265/hevc/interpred.go": "f603090da8dd4658a219000a6c7e3b0dc1ed739e6e49bf4270ec449f0133dd22", + "third_party/h265/hevc/interpred_amd64.s": "afadb8be1fe68e899bade0c0ba97dfd637ce399f7c2c91d44a17e0858b6126b2", + "third_party/h265/hevc/interpred_arm64.s": "2c5ca0ad46f332d85e822df2b20e61a2f31674146f1709b25235354b2cde7ca3", + "third_party/h265/hevc/interpred_bi_amd64.s": "669cf7e97dba239a16c3f6c64d6754c2fefece6fffc47ae26528bc78f4cd4902", + "third_party/h265/hevc/interpred_bi_arm64.s": "6de5ef4910e026aa31e8a5c0413510084b0f4e28798500127e728153c533badd", + "third_party/h265/hevc/interpred_bi_riscv64.s": "63b5b4eddb4e049d6894387c9b9d058714e236753281060d7bbf36b60741c4c1", + "third_party/h265/hevc/interpred_copy_amd64.s": "d10091b5770abbe1ab20227e4bc0b7a6f932a5c3877e11173f94afcc4f335c5f", + "third_party/h265/hevc/interpred_copy_arm64.s": "182b3c0f54a312cda71e98023f0e3c3cc6abcc1f249b536905801836338394eb", + "third_party/h265/hevc/interpred_copy_riscv64.s": "fc3fae4f3005a81654f6e28c5cf718c3ca78249544e2f72b75e3c5fb2a43ec9f", + "third_party/h265/hevc/interpred_riscv64.s": "f2a475c83a145b3e79a2c09733b5e6ec58439f74da3f8c7bd1da6c0557eb1771", + "third_party/h265/hevc/interpred_tap_amd64.s": "376d23dc8bf277835a99a25e789a3e71367a8f80c290ac28083f75da4f941529", + "third_party/h265/hevc/interpred_tap_arm64.s": "22f9e53b17bc3a0ab34be673d2e4fde17ac0c45ccfb61695ed830adbbfe2e47a", + "third_party/h265/hevc/interpred_tap_riscv64.s": "10773290647302a93e0cfc52f95750be2f5a71686a8cfedb77d5c388b5861de7", + "third_party/h265/hevc/interpred_tapv_amd64.s": "e5af8c2938d579a7c57462ef1175cf270eae57fcdcd5cf47c460c4fdd0ea693c", + "third_party/h265/hevc/interpred_tapv_arm64.s": "4d9811345444f8021a1b5c8059904cb3c42f37180261cc76fdaeb8e2272baa59", + "third_party/h265/hevc/interpred_tapv_riscv64.s": "40e06ac4933e48e77afebc8ca8a7a4c11c05f7c4fcb002711513824cc66eda2e", + "third_party/h265/hevc/intrapred.go": "33f0f0020b4651b827ffcc40b478e90b78368235fbbf901ddce5cb28a3285a32", + "third_party/h265/hevc/intrapred_amd64.s": "e2d37602d999ac6a7ce5184ee89ba823ee603d678a8883aac2377e82f0a85fc5", + "third_party/h265/hevc/intrapred_arm64.s": "5f0d4acf19e04bf7be7a7bafc12a3b3ff33aeeb0dfd6577187a58870b5ed1779", + "third_party/h265/hevc/intrapred_riscv64.s": "d102ea1c92eb40a184487a9d06c4c78bd811d04b47b46007e73b16caa1534c00", + "third_party/h265/hevc/itransform.go": "1503a2c78f000c6ecb69855263af5bfb55ff33050883d861e107dfce1707f2a5", + "third_party/h265/hevc/itransform_amd64.s": "5b5c72fec386e0daa8cca3d435d2c0fddc6465d3935ff39dc2b4311cb7b8bef9", + "third_party/h265/hevc/itransform_arm64.s": "89aa40a067a4bbf840523cb49cde23eedd65bdd4b0ba874e05d1b0d2fb24f5c8", + "third_party/h265/hevc/itransform_riscv64.s": "4984e77173ed04f5143027bc4f0aa224bd6457ae6ef279b6077cdb8f1a51e1ac", + "third_party/h265/hevc/lossyenc.go": "01db7098badb86405765f7111692d755c6a2893ee3713ba083067e19c635d22f", + "third_party/h265/hevc/mvpred.go": "e17744d8abbaa3971eed072e699f16b8a3740770c66127e305096e7638eb88ea", + "third_party/h265/hevc/nal.go": "997dfa297fab9abac82dab15225b9a2cbaa2c8965097f7d43a6da74aa4c736c3", + "third_party/h265/hevc/pcmenc.go": "9889f9843316916aa288965c6f9846ef8ea00224e9d44e7dea1c56bbb6aa5276", + "third_party/h265/hevc/picture.go": "50256e63278cf4805db1faa23c252fb0ba596ca034f09b29dff2be3ddcbeb087", + "third_party/h265/hevc/putbits.go": "0e825ddc335b656da8373d61f593142578732fb6fa6ad64cca2e08188c39d72d", + "third_party/h265/hevc/rdoq.go": "4ed95b2b3113861ce3b5471707c33d8a38dfafc1ef8ddd42ec45f1f46b3feb7c", + "third_party/h265/hevc/residual.go": "7d73bcbb65b0f6a2749828637f776ee6415918f28762544f1b8dcc933911119b", + "third_party/h265/hevc/residualenc.go": "ada98252c054278baffa2e51d78e0f629dfff9ad294e9c36015bab19c73eab82", + "third_party/h265/hevc/sao.go": "d16a669a2968d4d9105a188a3a4762d111a0ff16fde91927a1ce5d257932ef7d", + "third_party/h265/hevc/saoenc.go": "7659e919ba66ac8c2cfb0c16f367f5d99b23acb1237262d35dcbcdc7c21f16f9", + "third_party/h265/hevc/satd_amd64.s": "ff488aad240ba382fa8ca72528c24f0626e12c649951e27324421a28fa43e96a", + "third_party/h265/hevc/satd_arm64.s": "d904d792f8de0e8fc95ca6ceabf7415bfc523b734fb940dd8bd78378f769a1f4", + "third_party/h265/hevc/satd_riscv64.s": "82f815d2fe0e815b54cc252eac5435c8d0bd8a8b7ea26aed56fe301c2a564d44", + "third_party/h265/hevc/scaling.go": "8646fd156e943971ceb49489d648d1e3dc972ec80ae5fb7466ece230f17285a5", + "third_party/h265/hevc/scan.go": "68dccfd7329a661117e8d4578d04af287435b639c87b19a6d7528ab3ac98f8e4", + "third_party/h265/hevc/slice.go": "d419998030613086d5cffaf86d073299923afd8a20f3c8c2c9771300f8951918", + "third_party/h265/hevc/sse_amd64.s": "c6347b34ebb84b36a3c676d39601478ee2ee7f47246dadd5728e0dc3af572494", + "third_party/h265/hevc/sse_arm64.s": "bc7c6d7b96641eef5f30efcdb00ace9f0ef79f822412fb7e3008d9eca03313b0", + "third_party/h265/hevc/sse_riscv64.s": "c4d874c26577042141c987b473b78090a1040a1afbe95daf3dd9b344e0cc788b", + "third_party/h265/hevc/transformenc.go": "5b6271131527ca3eb141dd26d3f77ed0005252c938ca591c5a5dcfa0d9300d6a", + "third_party/h265/hevc/transformenc_amd64.s": "46c031c6dd354625a43c49fa524f317a15af42e9c3a367ff1cf360dbf18d2e81", + "third_party/h265/hevc/transformenc_arm64.s": "4d3a14051b93e11dbf2646e58fc1d89fe9695f30c0cd6d4d081752c69a005f17", + "third_party/h265/hevc/transformenc_riscv64.s": "65a41ccf3da20f659a1b995fbe79713585cc54f0b61a63819c9e2bba6c0ee9bb", + "third_party/h265/hevc/transpose_amd64.s": "e7d482947d2a3b9fc7f06d3b58c111e19d2558524022f7dc68dbf2bd84d5cf9a", + "third_party/h265/hevc/transpose_arm64.s": "d37ab80cf794befb44f2077e8405cf925debafde2b15193585c7658564ba1aff", + "third_party/h265/hevc/transpose_riscv64.s": "d0ce8035aa654f15527e539d93b15948562e0a8bc962ed9e6e42229dad2c7aef", + "third_party/h265/hevc/wavefront.go": "ef89091a2ec5f99e5253ac8ecb10950faf9385f34a8766877b0e8ef032f22585", + "third_party/h265/hevc/wavefrontenc.go": "fd3faf659474175b00c8989ebbbc81dd3579084edb3e1c599360d98f9217a029" } } diff --git a/scripts/heicguest/go.mod b/scripts/heicguest/go.mod index 6392c78f..46165019 100644 --- a/scripts/heicguest/go.mod +++ b/scripts/heicguest/go.mod @@ -4,7 +4,9 @@ go 1.27.1 require ( github.com/frathe/picfetch v0.0.0 - github.com/gen2brain/h265 v0.2.3 + github.com/gen2brain/h265 v0.2.2 ) replace github.com/frathe/picfetch => ../.. + +replace github.com/gen2brain/h265 => ../../third_party/h265 diff --git a/scripts/heicguest/go.sum b/scripts/heicguest/go.sum deleted file mode 100644 index 2cb5a36b..00000000 --- a/scripts/heicguest/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -github.com/gen2brain/h265 v0.2.3 h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk= -github.com/gen2brain/h265 v0.2.3/go.mod h1:kefpLxLhGpNCUG/q/aabJcD6GqB9Nhet3fNi9xX9Wzw= diff --git a/scripts/heicpackage/main.go b/scripts/heicpackage/main.go new file mode 100644 index 00000000..a75bc22e --- /dev/null +++ b/scripts/heicpackage/main.go @@ -0,0 +1,204 @@ +// Command heicpackage stages the isolated helper and its notices. Staging does +// not enable HEIC viewing or claim native/platform qualification. +package main + +import ( + "crypto/sha256" + "debug/elf" + "debug/macho" + "debug/pe" + "encoding/hex" + "encoding/json" + "errors" + "flag" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + + "github.com/frathe/picfetch/internal/heicdecode/client" +) + +type options struct{ mode, root, out, system, architecture, identity string } + +func main() { + var opts options + flag.StringVar(&opts.mode, "mode", "build", "build the helper or finalize its manifest after signing") + flag.StringVar(&opts.root, "root", ".", "repository root") + flag.StringVar(&opts.out, "out", "", "installation directory, or .app bundle root on macOS") + flag.StringVar(&opts.system, "os", runtime.GOOS, "target OS: darwin, linux, windows") + flag.StringVar(&opts.architecture, "arch", runtime.GOARCH, "target Go architecture: amd64 or arm64") + flag.StringVar(&opts.identity, "identity", "-", "macOS codesign identity; default is local ad-hoc signing") + flag.Parse() + if err := stage(opts); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func stage(opts options) error { + if opts.out == "" || (opts.architecture != "amd64" && opts.architecture != "arm64") || (opts.mode != "build" && opts.mode != "finalize") { + return errors.New("invalid HEIC package target/output/mode") + } + root, err := filepath.Abs(opts.root) + if err != nil { + return err + } + destination, err := filepath.Abs(opts.out) + if err != nil { + return err + } + executable, manifest, err := client.PackagePaths(destination, opts.system) + if err != nil { + return err + } + if opts.mode == "build" { + if opts.system == "darwin" && runtime.GOOS != "darwin" { + return errors.New("macOS HEIC packaging requires a native macOS host") + } + if err = os.MkdirAll(filepath.Dir(executable), 0755); err != nil { + return err + } + command := exec.Command("go", "build", "-trimpath", "-buildvcs=false", "-tags", "no_emoji,nodynamic", "-ldflags=-s -w -buildid=", "-o", executable, "./cmd/picfetch-heic-worker") + command.Dir = root + cgo := "0" + if opts.system == "darwin" { + cgo = "1" + } + command.Env = buildEnvironment(map[string]string{"GOOS": opts.system, "GOARCH": opts.architecture, "CGO_ENABLED": cgo, "GOTOOLCHAIN": "local", "GOWORK": "off", "GOFLAGS": "", "GOEXPERIMENT": "", "GOAMD64": "v1", "GOARM64": "v8.0"}) + if output, buildErr := command.CombinedOutput(); buildErr != nil { + return fmt.Errorf("build HEIC helper: %w: %s", buildErr, output) + } + if opts.system == "darwin" { + bundle := filepath.Dir(filepath.Dir(filepath.Dir(executable))) + if err = copyFile(filepath.Join(root, "packaging", "heic", "macos.Info.plist"), filepath.Join(bundle, "Contents", "Info.plist")); err != nil { + return err + } + command = exec.Command("/usr/bin/codesign", "--force", "--sign", opts.identity, "--options", "runtime", "--entitlements", filepath.Join(root, "packaging", "heic", "macos.entitlements.plist"), bundle) + if output, signErr := command.CombinedOutput(); signErr != nil { + return fmt.Errorf("sign HEIC helper: %w: %s", signErr, output) + } + command = exec.Command("/usr/bin/codesign", "--verify", "--strict", "--verbose=2", bundle) + if output, verifyErr := command.CombinedOutput(); verifyErr != nil { + return fmt.Errorf("verify HEIC helper signature: %w: %s", verifyErr, output) + } + } + } + if err = verifyTarget(executable, opts.system, opts.architecture); err != nil { + return err + } + notices := filepath.Join(filepath.Dir(manifest), "notices") + if err = os.MkdirAll(notices, 0755); err != nil { + return err + } + for _, name := range []string{"h265-LICENSE", "Go-LICENSE", "Go-PATENTS", "wazero-LICENSE", "wazero-NOTICE"} { + if err = copyFile(filepath.Join(root, "docs", "heic", "notices", name), filepath.Join(notices, name)); err != nil { + return err + } + } + executableDigest, err := fileDigest(executable) + if err != nil { + return err + } + guestDigest, err := fileDigest(filepath.Join(root, "internal", "heicdecode", "worker", "decoder.wasm")) + if err != nil { + return err + } + record := client.PackageManifest{Version: 1, GOOS: opts.system, GOARCH: opts.architecture, ExecutableSHA256: executableDigest, GuestSHA256: guestDigest} + data, err := json.MarshalIndent(record, "", " ") + if err != nil { + return err + } + if err = os.WriteFile(manifest, append(data, '\n'), 0644); err != nil { + return err + } + _, _, err = client.LoadPackage(destination, opts.system, opts.architecture) + return err +} + +func buildEnvironment(overrides map[string]string) []string { + var environment []string + for _, value := range os.Environ() { + key, _, _ := strings.Cut(value, "=") + if _, overridden := overrides[strings.ToUpper(key)]; !overridden { + environment = append(environment, value) + } + } + for key, value := range overrides { + environment = append(environment, key+"="+value) + } + return environment +} + +func copyFile(source, destination string) error { + data, err := os.ReadFile(source) + if err != nil { + return err + } + return os.WriteFile(destination, data, 0644) +} + +func fileDigest(path string) (string, error) { + file, err := os.Open(path) + if err != nil { + return "", err + } + defer func() { _ = file.Close() }() + hash := sha256.New() + n, err := io.Copy(hash, io.LimitReader(file, 64*1024*1024+1)) + if err != nil { + return "", err + } + if n == 0 || n > 64*1024*1024 { + return "", errors.New("HEIC package input size is invalid") + } + return hex.EncodeToString(hash.Sum(nil)), nil +} + +func verifyTarget(path, system, architecture string) error { + switch system { + case "darwin": + file, err := macho.Open(path) + if err != nil { + return err + } + defer func() { _ = file.Close() }() + expected := macho.CpuAmd64 + if architecture == "arm64" { + expected = macho.CpuArm64 + } + if file.Cpu == expected && file.Type == macho.TypeExec { + return nil + } + case "linux": + file, err := elf.Open(path) + if err != nil { + return err + } + defer func() { _ = file.Close() }() + expected := elf.EM_X86_64 + if architecture == "arm64" { + expected = elf.EM_AARCH64 + } + if file.Machine == expected && file.Class == elf.ELFCLASS64 && file.Type == elf.ET_EXEC { + return nil + } + case "windows": + file, err := pe.Open(path) + if err != nil { + return err + } + defer func() { _ = file.Close() }() + expected := uint16(pe.IMAGE_FILE_MACHINE_AMD64) + if architecture == "arm64" { + expected = pe.IMAGE_FILE_MACHINE_ARM64 + } + if file.Machine == expected && file.Characteristics&pe.IMAGE_FILE_EXECUTABLE_IMAGE != 0 && file.Characteristics&pe.IMAGE_FILE_DLL == 0 { + return nil + } + } + return errors.New("HEIC helper binary target does not match its package") +} diff --git a/scripts/heicpackage/main_test.go b/scripts/heicpackage/main_test.go new file mode 100644 index 00000000..0db3feab --- /dev/null +++ b/scripts/heicpackage/main_test.go @@ -0,0 +1,50 @@ +package main + +import ( + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/frathe/picfetch/internal/heicdecode/client" +) + +func TestFinalizeRefusesWrongBinaryTargetBeforeManifest(t *testing.T) { + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + wrong := "windows" + if runtime.GOOS == wrong { + wrong = "linux" + } + root := t.TempDir() + target, manifest, err := client.PackagePaths(root, wrong) + if err != nil { + t.Fatal(err) + } + if err = os.MkdirAll(filepath.Dir(target), 0700); err != nil { + t.Fatal(err) + } + if err = copyFile(executable, target); err != nil { + t.Fatal(err) + } + if err = stage(options{mode: "finalize", root: "../..", out: root, system: wrong, architecture: runtime.GOARCH}); err == nil { + t.Fatal("wrong binary format accepted") + } + if _, err = os.Stat(manifest); !os.IsNotExist(err) { + t.Fatalf("invalid package created a manifest: %v", err) + } +} + +func TestPackageRefusesIncompleteBuildTarget(t *testing.T) { + for _, opts := range []options{ + {mode: "finalize", out: t.TempDir(), system: "linux", architecture: "386"}, + {mode: "unknown", out: t.TempDir(), system: "linux", architecture: "amd64"}, + {mode: "build", system: "linux", architecture: "amd64"}, + } { + if err := stage(opts); err == nil { + t.Fatalf("invalid options accepted: %+v", opts) + } + } +} diff --git a/scripts/nativeguards/main.go b/scripts/nativeguards/main.go index efc4444f..77bb1d35 100644 --- a/scripts/nativeguards/main.go +++ b/scripts/nativeguards/main.go @@ -49,7 +49,7 @@ func suiteFor(name, hostOS string) (suite, error) { s.require("internal/wallpaper", "TestSetWindows_TargetPreservesOpaqueIDAndUnicodePath", "TestSetWindows_TargetValidationFailsBeforeMutation") s.require("internal/clipboard", "TestCopyFilesWindows_DecodesUTF8WithNonUTF8Default") s.require("internal/filepicker", "TestWindowsPickerTransport_EmitsUTF8PathArrays") - s.require("internal/update", "TestApplyWindows_ReplacesDestAndKeepsOld", "TestApplyWindows_MissingStagedBinaryRestoresDest", "TestWindowsRelaunchCommand_PassesThePIDInTheInheritedEnvironment", "TestClassifyApplyError_WindowsErrno", "TestWaitMilliseconds_NeverConvertsToAnUnboundedWait") + s.require("internal/update", "TestApplyWindows_ReplacesDestAndKeepsOld", "TestApplyWindows_MissingStagedBinaryRestoresDest", "TestWindowsRelaunchCommand_PassesThePIDInTheInheritedEnvironment", "TestClassifyApplyError_WindowsErrno", "TestWaitMilliseconds_NeverConvertsToAnUnboundedWait", "TestDownloadedCompanionsRemainVerifiedAfterPersistence", "TestApplyInstallsCompanionsAndRollsBackOnBinaryFailure") s.require("internal/ui/autoupdate", "TestUpdater_AutomaticAndManualShareCompleteTransaction", "TestApplyStagedUpdate_SuccessRemovesTheStageOnEveryPlatform") s.require("internal/distribution", "TestStoreManaged_DefaultBuildIsFalse") case "macos": @@ -63,6 +63,19 @@ func suiteFor(name, hostOS string) (suite, error) { s.goos = "darwin" s.tags = "heicnative" s.require("internal/heicdecode/client", "TestNativeMacSandboxHelper", "TestNativeMacRuntimeChoice") + s.require("internal/update", "TestNativeMacUpdatePreservesSignedBundle", "TestNativeMacLegacyUpdateRequiresCompleteReinstall") + case "heic-linux": + s.goos = "linux" + s.tags = "heicnative" + s.require("internal/heicdecode/worker", "TestNativeLinuxRuntimePolicy") + s.require("internal/heicdecode/client", "TestNativeSandboxHelper") + case "heic-windows": + s.goos = "windows" + s.tags = "heicnative" + s.require("internal/heicdecode/winisolation", "TestNativeWindowsJobAndToken", "TestNativeWindowsUnsandboxedRefused") + s.require("internal/heicdecode/client", "TestNativeSandboxHelper") + s.require("internal/heicdecode/client", "TestInheritedRemoteUsesOwner", "TestInheritedRemoteCancellationJoins", "TestAttachmentStopWithoutProcessStartJoinsOwner", "TestRemoteQueuedCancellationReleasesService", "TestRemoteOutputRetainsAdmissionAndStopJoins") + s.require("internal/similarity", "TestAnalysisWorkersUseHEICOwner", "TestAnalysisHEICAttachmentStartFailureJoins") case "store": s.tags = "microsoftstore" s.require("internal/distribution", "TestStoreManaged_MicrosoftStoreBuildIsTrue") @@ -165,7 +178,7 @@ func validateEvents(input io.Reader, required []guard, log io.Writer) error { func run(args []string, stdout, stderr io.Writer) error { flags := flag.NewFlagSet("nativeguards", flag.ContinueOnError) flags.SetOutput(stderr) - name := flags.String("suite", "", "windows, macos, heic-macos, or store") + name := flags.String("suite", "", "windows, macos, heic-macos, heic-linux, heic-windows, or store") capturePath := flags.String("capture", "", "raw go test JSON output path") if err := flags.Parse(args); err != nil { if errors.Is(err, flag.ErrHelp) { @@ -174,7 +187,7 @@ func run(args []string, stdout, stderr io.Writer) error { return err } if flags.NArg() != 0 || *capturePath == "" { - return errors.New("usage: nativeguards -suite windows|macos|heic-macos|store -capture ") + return errors.New("usage: nativeguards -suite windows|macos|heic-macos|heic-linux|heic-windows|store -capture ") } s, err := suiteFor(*name, runtime.GOOS) if err != nil { @@ -188,6 +201,10 @@ func run(args []string, stdout, stderr io.Writer) error { defer cancel() execute := func(ctx context.Context, args []string, out io.Writer) error { cmd := exec.CommandContext(ctx, "go", args...) + if s.name == "heic-linux" { + // The standalone Linux helper policy supports the pure Go runtime. + cmd.Env = append(os.Environ(), "CGO_ENABLED=0") + } cmd.Stdout = out cmd.Stderr = stderr return cmd.Run() diff --git a/scripts/nativeguards/main_test.go b/scripts/nativeguards/main_test.go index f7a529bb..9d00092b 100644 --- a/scripts/nativeguards/main_test.go +++ b/scripts/nativeguards/main_test.go @@ -19,9 +19,19 @@ func TestNativeSuitesSelectPlatformAndDistributionGuards(t *testing.T) { {"windows", "windows", "github.com/frathe/picfetch/internal/clipboard", "TestCopyFilesWindows_DecodesUTF8WithNonUTF8Default", ""}, {"windows", "windows", "github.com/frathe/picfetch/internal/filepicker", "TestWindowsPickerTransport_EmitsUTF8PathArrays", ""}, {"windows", "windows", "github.com/frathe/picfetch/internal/update", "TestApplyWindows_MissingStagedBinaryRestoresDest", ""}, + {"windows", "windows", "github.com/frathe/picfetch/internal/update", "TestDownloadedCompanionsRemainVerifiedAfterPersistence", ""}, + {"windows", "windows", "github.com/frathe/picfetch/internal/update", "TestApplyInstallsCompanionsAndRollsBackOnBinaryFailure", ""}, {"windows", "windows", "github.com/frathe/picfetch/internal/distribution", "TestStoreManaged_DefaultBuildIsFalse", ""}, {"macos", "darwin", "github.com/frathe/picfetch", "TestInstall_GraftsOntoGLFWsDelegate", ""}, {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/heicdecode/client", "TestNativeMacSandboxHelper", "heicnative"}, + {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/update", "TestNativeMacUpdatePreservesSignedBundle", "heicnative"}, + {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/update", "TestNativeMacLegacyUpdateRequiresCompleteReinstall", "heicnative"}, + {"heic-linux", "linux", "github.com/frathe/picfetch/internal/heicdecode/client", "TestNativeSandboxHelper", "heicnative"}, + {"heic-linux", "linux", "github.com/frathe/picfetch/internal/heicdecode/worker", "TestNativeLinuxRuntimePolicy", "heicnative"}, + {"heic-windows", "windows", "github.com/frathe/picfetch/internal/heicdecode/client", "TestInheritedRemoteCancellationJoins", "heicnative"}, + {"heic-windows", "windows", "github.com/frathe/picfetch/internal/similarity", "TestAnalysisWorkersUseHEICOwner", "heicnative"}, + {"heic-windows", "windows", "github.com/frathe/picfetch/internal/heicdecode/winisolation", "TestNativeWindowsJobAndToken", "heicnative"}, + {"heic-windows", "windows", "github.com/frathe/picfetch/internal/heicdecode/client", "TestNativeSandboxHelper", "heicnative"}, {"store", "darwin", "github.com/frathe/picfetch/internal/distribution", "TestStoreManaged_MicrosoftStoreBuildIsTrue", "microsoftstore"}, } { t.Run(tc.name+"/"+tc.test, func(t *testing.T) { @@ -145,7 +155,7 @@ func TestNativeCIExecutesAndRetainsEveryDeclaredSuite(t *testing.T) { t.Fatal(err) } text := string(data) - for _, name := range []string{"windows", "macos", "store"} { + for _, name := range []string{"windows", "macos", "heic-macos", "heic-linux", "heic-windows", "store"} { if !strings.Contains(text, "./scripts/nativeguards -suite "+name+" -capture") { t.Errorf("CI omits %s guard runner", name) } diff --git a/third_party/h265/LICENSE b/third_party/h265/LICENSE new file mode 100644 index 00000000..91d5b917 --- /dev/null +++ b/third_party/h265/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2025 roticv +Copyright (c) 2026 Karpeles Lab Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/h265/PICFETCH-SOURCE.json b/third_party/h265/PICFETCH-SOURCE.json new file mode 100644 index 00000000..cf8a74aa --- /dev/null +++ b/third_party/h265/PICFETCH-SOURCE.json @@ -0,0 +1,113 @@ +{ + "sourceCommit": "fc127b44e1c99447b8d150256563c6d4f99b8ad3", + "sourceTree": "df5936bb22bd65eae70be1f6a50237644c5fa999", + "files": { + "LICENSE": "a53831ee9730340d31a911148e69fdd15cc7d1c408b06f3a923b170c4578634d", + "README.md": "d10ee10f3d98e3fd1808d37b26aa770d94689d2731794d06a3ea714152554838", + "go.mod": "ab1c01f4919d1116d207771b0274e985c76ef0c1380ee4e0c0e3d4495a186942", + "heic/color.go": "6eb86c0968f624d7081ee38cce7bfa301dfea2d362b63bf207dab183babf4beb", + "heic/color_amd64.go": "c056bb073e4a11e28a6a719375b9c12483b028ecef5e92eb2ac4501bae1b8c4d", + "heic/color_amd64.s": "801dfb6905769c6fcdc4c179eb89a2c5b806efd5822ec6b78554dcdb0b2ab946", + "heic/color_arm64.go": "459e3af6924ca246c1e909638d4212b77b19c91b4ae9fc70c91f4548faf16c1f", + "heic/color_arm64.s": "3cc39098aa91591db0a2dc0add555296f57905b6d5aa46504549483e49ec95ca", + "heic/color_noasm.go": "8658b79899068b92b12cb62c3a1b358712382a6ecd0706f5f874e24b674bdac0", + "heic/color_riscv64.go": "2eaec7518c8b970b42b7ea63015b2e03b4f042bbb569d16db186051004144113", + "heic/color_riscv64.s": "ec3aca76667078e3d56d6cf703a01491bd3d343e385ca6fb6735e87f7d9f2eb3", + "heic/color_row.go": "d2467b8d79b3c7ea35c990cf82a0e7c88a04d932a317b4c7f712511dec5088a5", + "heic/cpu_amd64.go": "7ac53bab8a9fedbbd5d08020703b37a6c967feb10a2cee651c780961621f4414", + "heic/cpu_amd64.s": "462ed6010f30c535a8f2c1f5682aff46f1a9fc13ca6ff7303527135458e30165", + "heic/encode.go": "08ab928a36dd612135155f8ccf8bf941dc6df1cb56adafa05467329db50fccfd", + "heic/exif.go": "5c863616f6ea4bc6d830d92682ef5325bf13f7c8df2520ba26d46079f8434759", + "heic/grid.go": "d4c91e57122a53d9fd6c93cc02d207830ca9060a74b86e6919336e16f6f7fcc9", + "heic/gridenc.go": "87613918826f80509083abf6c94a2f89acaae13b23014dc3bc640fdb5cce549b", + "heic/heic.go": "2d6e508e2e28192d48192d92b124a7b1446dab23d0a141d91cc6c6dd4a26e46b", + "heic/image.go": "88788bdb63d755c99d557eb99c782f804850ac926b0ee05f40cecd965d216624", + "heic/isobmff.go": "187e638e5d2da55051ade4d1faa36639bef102fd80c1bc6109d57f38adf0e9a8", + "heic/limits.go": "ff336caa0c194fcc81e2ea5cf581ce30eda9a6e038ec9bbe98ba5c2d15831dc2", + "heic/sequence.go": "8c5c9b8e042cdd254cc52cd25438632fd77ec4b507526d42bdb474f64159c8fa", + "heic/transform.go": "11c75e77a33a21f891e9d5e1401c9cfb3ddbdcbbcb0e96745a9ff4519f841423", + "heic/ycbcr.go": "e190dffd37342e4375fba5de7d6d3a4a5bfaab228cd953978a3cb922f688d4d4", + "hevc/budget.go": "62ed954c0300d8a848d262e1a9dc33514b6058613caf22e8662e591c7ef0d735", + "hevc/cabac.go": "4b3426446d9e2d5636fd3137b790fa2641899f68e8c8c8b15857efb7998bfbcd", + "hevc/cabac_tables.go": "39ae240713d741df33bdac8551ac7b463351d459069cd07feafda88058e5472a", + "hevc/cabacenc.go": "6f010e27c000afe826b2155f424af303db05d2179b9b3cefb2f99c44b1ff96d5", + "hevc/cpu_amd64.s": "ce04f6cb753589d1b49c52d8e767cfcee707c6f57e42e0b3f80a7b370f60e619", + "hevc/ctu.go": "fa320bc14f90828450d0b3cf42bd4146811e507964a707dd6e4411502f7bbc00", + "hevc/deblock.go": "36f66c96e38e26b1f0b0885c68b026cb67350600ae3056d6b082d20975cabf87", + "hevc/deblock_amd64.s": "086a0a4ecb4f1aacabdd6896bd497027724867a74c3963b954a256fcb90e4ae3", + "hevc/deblock_arm64.s": "f0fc2c9566139df256c80554cdb4497513f10357168720e7d185dc3bcdeeef26", + "hevc/deblock_riscv64.s": "2871547768141f10d9129f006df25158efc696899b89830e43757f71241b3ee3", + "hevc/deblockenc.go": "b2c9996e3d527124859f3238663d1ee4a3d298e83c336f66acc2876dde3ebe51", + "hevc/decoder.go": "98c2d0d6348babc6068f6815e6a94802731a9d105ad19628c14b9d729eb27030", + "hevc/dequant_amd64.s": "6ed52f89420aa8fb1fdc3a9da8473f381716a2431beceddeb41e38775f123d4a", + "hevc/dequant_arm64.s": "8162781c26dcac679d0af9db257c3915d8d7f83849b1e47c9269a2bf62da68a8", + "hevc/dequant_riscv64.s": "ea86abff13f9b065be2591a5bb2fcf2b5ccde4a9f63992e085615c65295cf904", + "hevc/dpb.go": "36aa82767d7e3c73474de3c77a0f6756ad83ddb78a2666b2176e3ec972be18c1", + "hevc/dsp.go": "07b1155187c9ce66130902f2c58e3c0d5ab7a30fba7d572006cb86b263c84eab", + "hevc/dsp_amd64.go": "6be0f3d7698f8ef58403285c03feeb46e1d3ce218e6660d083297c184aaeba69", + "hevc/dsp_arm64.go": "d6dd5a569163543bf5af811ea6c47f78a609d1cd3512e545e19aebeb6655eabd", + "hevc/dsp_noasm.go": "33369a09b678286c8b0fdb996d4a8f89165aeaaf95222fea37123894ddeaf6d4", + "hevc/dsp_riscv64.go": "7530087bd0466d79a010c17e96dbdc8272502a2a90bb9b00365df7e179ebd4a5", + "hevc/encoder.go": "71d15aa3e9f3bb7f1909e859a259e2abdaac6ef242a5ec60462e72b3716c4751", + "hevc/getbits.go": "508e223966df9a8d2e6bf9c666f6f85979397f7e17a8d01c2579f35e0b33e6ab", + "hevc/headers.go": "44bf44cdf4596e6fe855b14e0a323f71d6f91a5f58b3873dc81469ae4b359cc5", + "hevc/headersenc.go": "951fdab46b602e620008d5018fe228239808baa1997158e9765cdc9f8eebe0fa", + "hevc/idct_amd64.s": "d69467d1fdbab834d69e51f76adc213c1c1a4b15e2f4d810e150a89902f2c3ef", + "hevc/idct_arm64.s": "46d9bffa1d0aa85a7ad97b64fcb4ee63169b171074545e126e689b11e88d4956", + "hevc/idct_riscv64.s": "4392199c1793f68c4712b59e07a1bb399af0e2e4d1b41571e4c53f826fb3e483", + "hevc/inter.go": "88f2ed37174ebda06461c8f7b1b94b5b36a6dca6697ac83b4c3eff33e6a715cc", + "hevc/interpred.go": "f603090da8dd4658a219000a6c7e3b0dc1ed739e6e49bf4270ec449f0133dd22", + "hevc/interpred_amd64.s": "afadb8be1fe68e899bade0c0ba97dfd637ce399f7c2c91d44a17e0858b6126b2", + "hevc/interpred_arm64.s": "2c5ca0ad46f332d85e822df2b20e61a2f31674146f1709b25235354b2cde7ca3", + "hevc/interpred_bi_amd64.s": "669cf7e97dba239a16c3f6c64d6754c2fefece6fffc47ae26528bc78f4cd4902", + "hevc/interpred_bi_arm64.s": "6de5ef4910e026aa31e8a5c0413510084b0f4e28798500127e728153c533badd", + "hevc/interpred_bi_riscv64.s": "63b5b4eddb4e049d6894387c9b9d058714e236753281060d7bbf36b60741c4c1", + "hevc/interpred_copy_amd64.s": "d10091b5770abbe1ab20227e4bc0b7a6f932a5c3877e11173f94afcc4f335c5f", + "hevc/interpred_copy_arm64.s": "182b3c0f54a312cda71e98023f0e3c3cc6abcc1f249b536905801836338394eb", + "hevc/interpred_copy_riscv64.s": "fc3fae4f3005a81654f6e28c5cf718c3ca78249544e2f72b75e3c5fb2a43ec9f", + "hevc/interpred_riscv64.s": "f2a475c83a145b3e79a2c09733b5e6ec58439f74da3f8c7bd1da6c0557eb1771", + "hevc/interpred_tap_amd64.s": "376d23dc8bf277835a99a25e789a3e71367a8f80c290ac28083f75da4f941529", + "hevc/interpred_tap_arm64.s": "22f9e53b17bc3a0ab34be673d2e4fde17ac0c45ccfb61695ed830adbbfe2e47a", + "hevc/interpred_tap_riscv64.s": "10773290647302a93e0cfc52f95750be2f5a71686a8cfedb77d5c388b5861de7", + "hevc/interpred_tapv_amd64.s": "e5af8c2938d579a7c57462ef1175cf270eae57fcdcd5cf47c460c4fdd0ea693c", + "hevc/interpred_tapv_arm64.s": "4d9811345444f8021a1b5c8059904cb3c42f37180261cc76fdaeb8e2272baa59", + "hevc/interpred_tapv_riscv64.s": "40e06ac4933e48e77afebc8ca8a7a4c11c05f7c4fcb002711513824cc66eda2e", + "hevc/intrapred.go": "33f0f0020b4651b827ffcc40b478e90b78368235fbbf901ddce5cb28a3285a32", + "hevc/intrapred_amd64.s": "e2d37602d999ac6a7ce5184ee89ba823ee603d678a8883aac2377e82f0a85fc5", + "hevc/intrapred_arm64.s": "5f0d4acf19e04bf7be7a7bafc12a3b3ff33aeeb0dfd6577187a58870b5ed1779", + "hevc/intrapred_riscv64.s": "d102ea1c92eb40a184487a9d06c4c78bd811d04b47b46007e73b16caa1534c00", + "hevc/itransform.go": "1503a2c78f000c6ecb69855263af5bfb55ff33050883d861e107dfce1707f2a5", + "hevc/itransform_amd64.s": "5b5c72fec386e0daa8cca3d435d2c0fddc6465d3935ff39dc2b4311cb7b8bef9", + "hevc/itransform_arm64.s": "89aa40a067a4bbf840523cb49cde23eedd65bdd4b0ba874e05d1b0d2fb24f5c8", + "hevc/itransform_riscv64.s": "4984e77173ed04f5143027bc4f0aa224bd6457ae6ef279b6077cdb8f1a51e1ac", + "hevc/lossyenc.go": "01db7098badb86405765f7111692d755c6a2893ee3713ba083067e19c635d22f", + "hevc/mvpred.go": "e17744d8abbaa3971eed072e699f16b8a3740770c66127e305096e7638eb88ea", + "hevc/nal.go": "997dfa297fab9abac82dab15225b9a2cbaa2c8965097f7d43a6da74aa4c736c3", + "hevc/pcmenc.go": "9889f9843316916aa288965c6f9846ef8ea00224e9d44e7dea1c56bbb6aa5276", + "hevc/picture.go": "50256e63278cf4805db1faa23c252fb0ba596ca034f09b29dff2be3ddcbeb087", + "hevc/putbits.go": "0e825ddc335b656da8373d61f593142578732fb6fa6ad64cca2e08188c39d72d", + "hevc/rdoq.go": "4ed95b2b3113861ce3b5471707c33d8a38dfafc1ef8ddd42ec45f1f46b3feb7c", + "hevc/residual.go": "7d73bcbb65b0f6a2749828637f776ee6415918f28762544f1b8dcc933911119b", + "hevc/residualenc.go": "ada98252c054278baffa2e51d78e0f629dfff9ad294e9c36015bab19c73eab82", + "hevc/sao.go": "d16a669a2968d4d9105a188a3a4762d111a0ff16fde91927a1ce5d257932ef7d", + "hevc/saoenc.go": "7659e919ba66ac8c2cfb0c16f367f5d99b23acb1237262d35dcbcdc7c21f16f9", + "hevc/satd_amd64.s": "ff488aad240ba382fa8ca72528c24f0626e12c649951e27324421a28fa43e96a", + "hevc/satd_arm64.s": "d904d792f8de0e8fc95ca6ceabf7415bfc523b734fb940dd8bd78378f769a1f4", + "hevc/satd_riscv64.s": "82f815d2fe0e815b54cc252eac5435c8d0bd8a8b7ea26aed56fe301c2a564d44", + "hevc/scaling.go": "8646fd156e943971ceb49489d648d1e3dc972ec80ae5fb7466ece230f17285a5", + "hevc/scan.go": "68dccfd7329a661117e8d4578d04af287435b639c87b19a6d7528ab3ac98f8e4", + "hevc/slice.go": "d419998030613086d5cffaf86d073299923afd8a20f3c8c2c9771300f8951918", + "hevc/sse_amd64.s": "c6347b34ebb84b36a3c676d39601478ee2ee7f47246dadd5728e0dc3af572494", + "hevc/sse_arm64.s": "bc7c6d7b96641eef5f30efcdb00ace9f0ef79f822412fb7e3008d9eca03313b0", + "hevc/sse_riscv64.s": "c4d874c26577042141c987b473b78090a1040a1afbe95daf3dd9b344e0cc788b", + "hevc/transformenc.go": "5b6271131527ca3eb141dd26d3f77ed0005252c938ca591c5a5dcfa0d9300d6a", + "hevc/transformenc_amd64.s": "46c031c6dd354625a43c49fa524f317a15af42e9c3a367ff1cf360dbf18d2e81", + "hevc/transformenc_arm64.s": "4d3a14051b93e11dbf2646e58fc1d89fe9695f30c0cd6d4d081752c69a005f17", + "hevc/transformenc_riscv64.s": "65a41ccf3da20f659a1b995fbe79713585cc54f0b61a63819c9e2bba6c0ee9bb", + "hevc/transpose_amd64.s": "e7d482947d2a3b9fc7f06d3b58c111e19d2558524022f7dc68dbf2bd84d5cf9a", + "hevc/transpose_arm64.s": "d37ab80cf794befb44f2077e8405cf925debafde2b15193585c7658564ba1aff", + "hevc/transpose_riscv64.s": "d0ce8035aa654f15527e539d93b15948562e0a8bc962ed9e6e42229dad2c7aef", + "hevc/wavefront.go": "ef89091a2ec5f99e5253ac8ecb10950faf9385f34a8766877b0e8ef032f22585", + "hevc/wavefrontenc.go": "fd3faf659474175b00c8989ebbbc81dd3579084edb3e1c599360d98f9217a029" + } +} diff --git a/third_party/h265/PICFETCH.md b/third_party/h265/PICFETCH.md new file mode 100644 index 00000000..355f715e --- /dev/null +++ b/third_party/h265/PICFETCH.md @@ -0,0 +1,87 @@ +# PicFetch's maintained HEIC source + +## Source selection + +This is the exact production source previously maintained by PicFetch at +commit `fc127b44e1c99447b8d150256563c6d4f99b8ad3`, subtree +`df5936bb22bd65eae70be1f6a50237644c5fa999`. `PICFETCH-SOURCE.json` records every +copied production file. The baseline is upstream `github.com/gen2brain/h265` +v0.2.2, commit `665fd95984177afef4a7efca7d50638e4b695c7a`, with the local +hardening retained unchanged. Root and guest modules explicitly replace h265 +with this directory. Only the separate WASI guest imports its decoder. + +The restoration's earlier unmodified v0.2.3 guest was a development candidate. +That release does not contain all the maintained source's work-budget, +metadata-accounting, bounded NAL traversal, sequence-retention and transformed +configuration changes. Selecting a newer version alone would discard those +changes. This restoration instead preserves the complete maintained production +copy; it does not claim complete equivalence between two different sequence +implementations. + +## Retained local changes + +- Finite movie sample/track counts, table payload and duplicate checks, deferred + timing expansion and checked linear sample layout. +- Missing-metadata handling, checked extent arithmetic and aggregate selected + bytes, finite parsed metadata entries and HEVC configuration units. +- Coded-frame limits for primary images, grids, alpha and tracks, plus one + shared atomic `DecodeBudget` for aggregate coded work. Finite decoded-picture + buffering and reordering counts. +- The 32-sample transform limit, originally taken from upstream commit + `5138267a04330b8f0e36ddeabbcf6f49b664fa88`, and checked NAL length arithmetic. +- Streaming NAL traversal with finite counts, one-picture still items, bounded + first-frame traversal and finite aggregate retained sequence output. +- `DecodeConfigWithOptions` for container-transformed bounds, explicit + `AutoRotate` and one decoder thread in the application guest. +- Existing parameter-name annotations for the project's inspections. + +The restoration guest additionally rejects movie containers, admits at most +64 MiB input, and applies its independently enforced WASM/IPC/output/deadline +ceilings. Library limits are defense in depth and do not replace that boundary. +The historical negative-limit API remains in the source; PicFetch never uses it. + +## Distribution and verification + +MIT; retain `LICENSE`, including the roticv and Karpeles Lab notices. Upstream +credits rust_h265 and oxideav-h265; exact translated-source revisions remain a +traceability gap. No HEVC patent clearance is asserted. The source has no module +dependencies, embedded runtime or native codec library. Native assembly is +retained for exact source provenance, but `wasip1/wasm -tags=noasm` selects the +scalar decoder used by PicFetch. + +`make generate-heic-wasm` rebuilds the fixed guest and provenance. +`make check-heic-wasm` checks the production copy, replacements, complete guest +inputs, independent reproduction and absence of native decoder imports. +`make test-h265` exercises this nested source through the bounded WASI guest +using the reviewed ordinary fixtures; root `go test ./...` alone does not +traverse a nested module. It is scoped compatibility coverage, not the upstream +or historical full test suite. Historical malformed-input/fuzz seeds and test +files are not copied or executed by this restoration. Their original record +remains in the historical checkout, which is not modified here. + +Before upgrades, review every local change against the proposed upstream +source, preserve checks without verified equivalents, update the exact source +record deliberately, reproduce the guest, and repeat bounded ordinary-image and +owned-boundary qualification. Never add an in-process or native codec fallback. +Current native platform, memory and compatibility status is recorded in +`../../docs/heic/qualification.md`; a source copy does not establish activation. + +## Inspection disposition for this restoration + +All 57 Go and 47 assembly files were inspected with GoLand, including weak +warnings. The 47 assembly reports reject Go's assembler dialect in the generic +assembly parser; those unchanged files are retained for provenance and excluded +from the WASI build. Their exact paths are excluded from Qodana. Native assembly +execution/compilation is not newly qualified by this restoration. + +Exact-file inspection exclusions preserve assembly-backed parameter names, +build-specific helpers, public API/format constants and the unused retained +reference helpers/type. Exact duplication exclusions preserve reviewed codec +variants instead of rewriting the maintained algorithms. Remaining suggestions +are redundant conversions and scoped local `any`/`max` names; they do not change +behavior. The partial NAL switch is followed by explicit EOS/non-VCL handling. +Direct EOF comparisons are fed by the bounded in-memory guest reader; other +errors return a refusal. No confirmed new defect was found in these reports. +The IDE does not apply Qodana's scopes, so this is a reviewed disposition, not a +claim that its generic assembly reports disappeared. Fresh Qodana verification +of the configured scopes remains pending. diff --git a/third_party/h265/README.md b/third_party/h265/README.md new file mode 100644 index 00000000..5c843f23 --- /dev/null +++ b/third_party/h265/README.md @@ -0,0 +1,75 @@ +## h265 +[![Status](https://github.com/gen2brain/h265/actions/workflows/test.yml/badge.svg)](https://github.com/gen2brain/h265/actions) +[![Go Reference](https://pkg.go.dev/badge/github.com/gen2brain/h265.svg)](https://pkg.go.dev/github.com/gen2brain/h265) + +[HEVC](https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding) video and +[HEIC](https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format) image codec in pure Go, +decoding and encoding. No CGo, no dependencies. + +The decoder is byte-exact on the JCT-VC HEVC v1 conformance suite. What the encoder writes is +held to libde265, FFmpeg and libheif sample for sample. + +SIMD support for amd64 (AVX2, AVX-512), arm64 (NEON) and riscv64 (RVV, with `GORISCV64=rva23u64`). +Build with `-tags noasm` for pure Go everywhere. + +### Decoding + +```go +img, err := heic.Decode(r) +``` + +`heic.Decode` returns `*image.NRGBA`, or `*image.NRGBA64` above 8 bits, and registers itself with +`image.RegisterFormat`. The `hevc` package decodes the bitstream on its own, a NAL unit at a time: + +```go +d := hevc.Decoder{} + +for _, nal := range nals { + pics, err := d.DecodeNAL(nal) + ... +} +``` + +### Encoding + +`heic.Encode` writes any image as a HEIC still, keeping alpha as the auxiliary item of +ISO/IEC 23008-12 Annex F. + +```go +err := heic.Encode(w, img, heic.EncodeOptions{Quality: 60}) +``` + +`hevc.Encoder` writes the bitstream on its own, as self-contained intra IDR access units: + +```go +enc, err := hevc.NewEncoder(hevc.EncoderOptions{Width: 1920, Height: 1080, QP: 26}) +nals, err := enc.Encode(hevc.Frame{ + Y: y, Cb: cb, Cr: cr, + StrideY: yStride, StrideC: cStride, +}) +stream := hevc.MarshalAnnexB(nals) +``` + +### Supported + +Decoding: 8-16 bit, 4:2:0/4:2:2/4:4:4/monochrome, tiles, wavefronts, dependent slice segments, +PCM, lossless, scaling lists, and the range extensions other than cross-component prediction, +RDPCM and CABAC bypass alignment, which are refused rather than decoded wrongly. In the container +alpha, `grid`, `clap`/`irot`/`imir`, `colr`, image sequences, Exif and XMP. + +Encoding: 8-12 bit, 4:2:0/4:2:2/4:4:4/monochrome, intra only, deblocking, sample adaptive +offset, wavefronts, PCM lossless, and alpha, `grid`, `colr`, Exif and XMP in the container. A picture too large for +any HEVC level is written as a grid of tiles. + +Decoding is threaded over grid tiles and wavefront rows; `heic.Options.Threads` and +`hevc.Decoder.Threads` bound it. + +### License + +MIT, in [LICENSE](LICENSE). The decoder is a port of the pure-Rust +[rust_h265](https://github.com/roticv/rust_h265) and +[oxideav-h265](https://github.com/OxideAV/oxideav-h265) decoders and carries their notices. + +This software implements a decoder and an encoder. It gives you no special rights on the HEVC +patents. HEVC is covered by patents held by several pools and by unpooled holders; if you +distribute or use this software you may need a licence from them. diff --git a/third_party/h265/go.mod b/third_party/h265/go.mod new file mode 100644 index 00000000..a56d7fa5 --- /dev/null +++ b/third_party/h265/go.mod @@ -0,0 +1,3 @@ +module github.com/gen2brain/h265 + +go 1.26.4 diff --git a/third_party/h265/heic/color.go b/third_party/h265/heic/color.go new file mode 100644 index 00000000..089156ba --- /dev/null +++ b/third_party/h265/heic/color.go @@ -0,0 +1,438 @@ +package heic + +import ( + "github.com/gen2brain/h265/hevc" +) + +const ( + mcIdentity = 0 + mcBT709 = 1 + mcUnspec = 2 + mcFCC = 4 + mcBT470BG = 5 + mcBT601 = 6 + mcSMPTE240 = 7 + mcYCgCo = 8 + mcBT2020NCL = 9 +) + +func yuvCoefficients(matrix int) (float32, float32, float32) { + kr, kb := float32(0.299), float32(0.114) + + switch matrix { + case mcBT709: + kr, kb = 0.2126, 0.0722 + case mcFCC: + kr, kb = 0.30, 0.11 + case mcBT470BG, mcBT601: + kr, kb = 0.299, 0.114 + case mcSMPTE240: + kr, kb = 0.212, 0.087 + case mcBT2020NCL: + kr, kb = 0.2627, 0.0593 + } + + return kr, 1 - kr - kb, kb +} + +// planeView is one plane of a decoded picture with the conformance window +// already applied, so the rest of this package never sees the crop. +type planeView struct { + p8 []uint8 + p16 []uint16 + stride int + w, h int +} + +func (v planeView) valid() bool { return v.p8 != nil || v.p16 != nil } + +func viewOf(p8 []uint8, p16 []uint16, stride, x, y, w, h int) planeView { + v := planeView{stride: stride, w: w, h: h} + + off := y*stride + x + if p16 != nil { + v.p16 = p16[off:] + } else if p8 != nil { + v.p8 = p8[off:] + } + + return v +} + +// views returns the luma and chroma planes of pic, cropped to the conformance +// window. Chroma is empty for monochrome. +func views(pic *hevc.Picture) (y, cb, cr planeView) { + cw, ch := pic.CropW, pic.CropH + sw, sh := 1, 1 + + switch pic.ChromaFormat { + case 1: + sw, sh = 2, 2 + case 2: + sw = 2 + } + + y = viewOf(pic.Y, pic.Y16, pic.StrideY, pic.CropX, pic.CropY, cw, ch) + + if pic.ChromaFormat == 0 { + return y, cb, cr + } + + ux, uy := pic.CropX/sw, pic.CropY/sh + uw, uh := (cw+sw-1)/sw, (ch+sh-1)/sh + + cb = viewOf(pic.Cb, pic.Cb16, pic.StrideC, ux, uy, uw, uh) + cr = viewOf(pic.Cr, pic.Cr16, pic.StrideC, ux, uy, uw, uh) + + return y, cb, cr +} + +type colorState struct { + matrix int + fullRange bool + depth int + maxChannel int + outMax float32 + + kr, kg, kb float32 + crCoef, cbCoef float32 + gcr, gcb float32 + + tableY []float32 + tableUV []float32 + pixLUT []uint16 + + biasY, rangeY float32 + biasUV, rangeUV float32 + + ssHor, ssVer int + hasColor bool + unsupported bool + + uvIdx, uvAdj []int + yRow []uint16 + uRow, vRow [2][]uint16 + cbRow, crRow []float32 + + yf []float32 + uPad, vPad [2][]float32 + row convertRow + row16 convertRow16 + consts rowConsts +} + +func newColorState(pic *hevc.Picture, ci ColorInfo, outDepth int) *colorState { + s := &colorState{ + matrix: int(ci.Matrix), + fullRange: ci.FullRange, + depth: pic.BitDepth, + } + + // ISO/IEC 23091-2: the identity matrix describes GBR, which subsampled + // chroma cannot carry. A sequence that declares it anyway is describing + // nothing usable, so it is read as unspecified rather than refused. + if s.matrix == mcIdentity && pic.ChromaFormat != 3 && pic.ChromaFormat != 0 { + s.matrix = mcUnspec + } + + if s.matrix == mcUnspec { + s.matrix = mcBT601 + } + + s.maxChannel = 1< 1 { + return 1 + } + + return v +} + +// prepare sizes the row scratch and precomputes the chroma sample each output +// column interpolates against. +func (s *colorState) prepare(w int) { + uw := (w + s.ssHor) >> s.ssHor + + s.yRow = make([]uint16, w) + + for i := range s.uRow { + s.uRow[i] = make([]uint16, uw) + s.vRow[i] = make([]uint16, uw) + } + + s.cbRow = make([]float32, w) + s.crRow = make([]float32, w) + + s.yf = make([]float32, w) + + for i := range s.uPad { + s.uPad[i] = make([]float32, uw+2) + s.vPad[i] = make([]float32, uw+2) + } + + s.uvIdx = make([]int, w) + s.uvAdj = make([]int, w) + + for x := range w { + uvX := x >> s.ssHor + adj := 0 + + if x != 0 && !(x == w-1 && x%2 != 0) { + if x%2 != 0 { + adj = 1 + } else { + adj = -1 + } + } + + s.uvIdx[x] = uvX + s.uvAdj[x] = min(max(uvX+adj, 0), uw-1) + } +} + +// fillRow copies one row of a plane into 16-bit scratch, which lets the LUTs +// be indexed the same way at every bit depth. +func (s *colorState) fillRow(v planeView, y, n int, dst []uint16) { + dst = dst[:n] + + if v.p16 != nil { + row := v.p16[y*v.stride:] + maxCh := uint16(s.maxChannel) + + for i := range dst { + dst[i] = min(row[i], maxCh) + } + + return + } + + row := v.p8[y*v.stride : y*v.stride+n] + for i, c := range row { + dst[i] = uint16(c) + } +} + +func (s *colorState) lumaRow(v planeView, y, w int) []uint16 { + s.fillRow(v, y, w, s.yRow) + + return s.yRow +} + +// chromaRow expands one row of Cb and Cr to full width. 4:2:0 interpolates +// with the 9/3/3/1 weights libavif uses, so both packages upsample alike. +func (s *colorState) chromaRow(cb, cr planeView, y, w, h int) { + uvY := y >> s.ssVer + uw := (w + s.ssHor) >> s.ssHor + + s.fillRow(cb, uvY, uw, s.uRow[0]) + s.fillRow(cr, uvY, uw, s.vRow[0]) + + tab := s.tableUV + cbRow, crRow := s.cbRow[:w], s.crRow[:w] + + if s.ssHor == 0 { + u, v := s.uRow[0][:w], s.vRow[0][:w] + + for x := range cbRow { + cbRow[x] = tab[u[x]] + crRow[x] = tab[v[x]] + } + + return + } + + adjRow := 0 + if s.ssVer != 0 && y != 0 && !(y == h-1 && y%2 != 0) { + if y%2 != 0 { + adjRow = 1 + } else { + adjRow = -1 + } + } + + u1, v1 := s.uRow[0], s.vRow[0] + + if adjRow != 0 { + ay := min(max(uvY+adjRow, 0), cb.h-1) + + s.fillRow(cb, ay, uw, s.uRow[1]) + s.fillRow(cr, ay, uw, s.vRow[1]) + + u1, v1 = s.uRow[1], s.vRow[1] + } + + const w0, w1, w2, w3 = 9.0 / 16.0, 3.0 / 16.0, 3.0 / 16.0, 1.0 / 16.0 + + u0, v0 := s.uRow[0], s.vRow[0] + + for x := range w { + i, j := s.uvIdx[x], s.uvAdj[x] + + cbRow[x] = w0*tab[u0[i]] + w1*tab[u0[j]] + w2*tab[u1[i]] + w3*tab[u1[j]] + crRow[x] = w0*tab[v0[i]] + w1*tab[v0[j]] + w2*tab[v1[i]] + w3*tab[v1[j]] + } +} + +// rgbRow converts one row to RGB at the output depth. +func (s *colorState) rgbRow(y, cb, cr planeView, row int, dst []uint16) { + w := y.w + luma := s.lumaRow(y, row, w) + + if !s.hasColor { + for x := range w { + v := s.pixLUT[luma[x]] + dst[3*x], dst[3*x+1], dst[3*x+2] = v, v, v + } + + return + } + + s.chromaRow(cb, cr, row, w, y.h) + + tab := s.tableY + cbf, crf := s.cbRow, s.crRow + + switch s.matrix { + case mcIdentity: + for x := range w { + g, b, r := tab[luma[x]], cbf[x], crf[x] + s.store(dst[3*x:], r, g, b) + } + + case mcYCgCo: + for x := range w { + yv, cg, co := tab[luma[x]], cbf[x], crf[x] + t := yv - cg + s.store(dst[3*x:], t+co, yv+cg, t-co) + } + + default: + for x := range w { + yv, u, v := tab[luma[x]], cbf[x], crf[x] + + r := yv + s.crCoef*v + b := yv + s.cbCoef*u + g := yv - (s.gcr*v+s.gcb*u)*2/s.kg + + s.store(dst[3*x:], r, g, b) + } + } +} + +func (s *colorState) store(dst []uint16, r, g, b float32) { + dst[0] = uint16(0.5 + clampF(r)*s.outMax) + dst[1] = uint16(0.5 + clampF(g)*s.outMax) + dst[2] = uint16(0.5 + clampF(b)*s.outMax) +} + +func (s *colorState) alphaRow(v planeView, row, w int, dst []uint16) { + luma := s.lumaRow(v, row, w) + + for x := range w { + dst[x] = s.pixLUT[luma[x]] + } +} diff --git a/third_party/h265/heic/color_amd64.go b/third_party/h265/heic/color_amd64.go new file mode 100644 index 00000000..9ba29fe0 --- /dev/null +++ b/third_party/h265/heic/color_amd64.go @@ -0,0 +1,126 @@ +//go:build amd64 && !noasm + +package heic + +//go:noescape +func convertRow8AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) + +//go:noescape +func convertRow444AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) + +func rowFn(ssHor int) convertRow { + if ssHor == 0 { + if !hasAVX2 { + return convertRow444Go + } + + return convertRow444AVX2Row + } + if !hasAVX2 { + return convertRowGo + } + + return convertRowAVX2 +} + +func convertRow444AVX2Row(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + if n8 := n &^ 7; n8 > 0 { + convertRow444AVX2(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n8, c) + if n8 == n { + return + } + dst, yf, a, n = dst[4*n8:], yf[n8:], a[n8:], n-n8 + u0, u1, v0, v1 = u0[n8:], u1[n8:], v0[n8:], v1[n8:] + } + + convertRow444Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +func convertRowAVX2(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + if n8 := n &^ 7; n8 > 0 { + convertRow8AVX2(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n8, c) + if n8 == n { + return + } + dst, yf, a, n = dst[4*n8:], yf[n8:], a[n8:], n-n8 + u0, u1 = u0[n8/2:], u1[n8/2:] + v0, v1 = v0[n8/2:], v1[n8/2:] + } + + convertRowGo(dst, yf, u0, u1, v0, v1, a, n, c) +} + +//go:noescape +func convertRow16x8AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) + +//go:noescape +func convertRow16x444AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) + +func rowFn16(ssHor int) convertRow16 { + if ssHor == 0 { + if !hasAVX2 { + return convertRow16x444Go + } + + return convertRow16x444AVX2Row + } + if !hasAVX2 { + return convertRow16Go + } + + return convertRow16AVX2 +} + +func convertRow16x444AVX2Row(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + if n8 := n &^ 7; n8 > 0 { + convertRow16x444AVX2(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n8, c) + if n8 == n { + return + } + dst, yf, a, n = dst[8*n8:], yf[n8:], a[n8:], n-n8 + u0, u1, v0, v1 = u0[n8:], u1[n8:], v0[n8:], v1[n8:] + } + + convertRow16x444Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +func convertRow16AVX2(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + if n8 := n &^ 7; n8 > 0 { + convertRow16x8AVX2(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n8, c) + if n8 == n { + return + } + dst, yf, a, n = dst[8*n8:], yf[n8:], a[n8:], n-n8 + u0, u1 = u0[n8/2:], u1[n8/2:] + v0, v1 = v0[n8/2:], v1[n8/2:] + } + + convertRow16Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +//go:noescape +func normRow8AVX2(dst *float32, src *uint8, n int, bias, rng float32) + +func normRow(dst []float32, src []uint8, bias, rng float32) { + if n8 := len(dst) &^ 7; hasAVX2 && n8 > 0 { + normRow8AVX2(&dst[0], &src[0], n8, bias, rng) + if n8 == len(dst) { + return + } + dst, src = dst[n8:], src[n8:] + } + + normRowGo(dst, src, bias, rng) +} + +func normRow16(dst []float32, src []uint16, maxCh uint16, bias, rng float32) { + normRow16Go(dst, src, maxCh, bias, rng) +} diff --git a/third_party/h265/heic/color_amd64.s b/third_party/h265/heic/color_amd64.s new file mode 100644 index 00000000..45801fe1 --- /dev/null +++ b/third_party/h265/heic/color_amd64.s @@ -0,0 +1,214 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +DATA rowPermC<>+0(SB)/8, $0x0000000100000001 +DATA rowPermC<>+8(SB)/8, $0x0000000200000002 +DATA rowPermC<>+16(SB)/8, $0x0000000300000003 +DATA rowPermC<>+24(SB)/8, $0x0000000400000004 +GLOBL rowPermC<>(SB), RODATA|NOPTR, $32 + +DATA rowPermN<>+0(SB)/8, $0x0000000200000000 +DATA rowPermN<>+8(SB)/8, $0x0000000300000001 +DATA rowPermN<>+16(SB)/8, $0x0000000400000002 +DATA rowPermN<>+24(SB)/8, $0x0000000500000003 +GLOBL rowPermN<>(SB), RODATA|NOPTR, $32 + +DATA rowShuf<>+0(SB)/8, $0x0d0905010c080400 +DATA rowShuf<>+8(SB)/8, $0x0f0b07030e0a0602 +GLOBL rowShuf<>(SB), RODATA|NOPTR, $16 + +#define CHROMA(P0, P1, OUT) \ + VMOVUPS (P0), Y3; \ + VPERMPS Y3, Y13, Y4; \ + VPERMPS Y3, Y14, Y5; \ + VMULPS Y8, Y4, OUT; \ + VMULPS Y9, Y5, Y5; \ + VADDPS Y5, OUT, OUT; \ + VMOVUPS (P1), Y3; \ + VPERMPS Y3, Y13, Y4; \ + VPERMPS Y3, Y14, Y5; \ + VMULPS Y9, Y4, Y4; \ + VADDPS Y4, OUT, OUT; \ + VMULPS Y10, Y5, Y5; \ + VADDPS Y5, OUT, OUT + +#define CHROMA444(P0, P1, OUT) \ + VMOVUPS 4(P0), OUT + +#define PIXEL(V) \ + VMAXPS Y1, V, V; \ + VMINPS Y2, V, V; \ + VMULPS Y6, V, V; \ + VADDPS Y7, V, V; \ + VCVTTPS2DQ V, V + +DATA rowSwap<>+0(SB)/8, $0x0607040502030001 +DATA rowSwap<>+8(SB)/8, $0x0e0f0c0d0a0b0809 +GLOBL rowSwap<>(SB), RODATA|NOPTR, $16 + +#define ROW8(CH, UVSTEP) \ + MOVQ dst+0(FP), DI; \ + MOVQ yf+8(FP), SI; \ + MOVQ u0+16(FP), R8; \ + MOVQ u1+24(FP), R9; \ + MOVQ v0+32(FP), R10; \ + MOVQ v1+40(FP), R11; \ + MOVQ a+48(FP), R12; \ + MOVQ n+56(FP), DX; \ + MOVQ c+64(FP), CX; \ + VBROADCASTSS 0(CX), Y8; \ + VBROADCASTSS 4(CX), Y9; \ + VBROADCASTSS 8(CX), Y10; \ + VBROADCASTSS 12(CX), Y11; \ + VBROADCASTSS 16(CX), Y12; \ + VMOVDQU rowPermC<>(SB), Y13; \ + VMOVDQU rowPermN<>(SB), Y14; \ + VBROADCASTI128 rowShuf<>(SB), Y15; \ +loop:; \ + VMOVUPS (SI), Y0; \ + CH(R8, R9, Y1); \ + CH(R10, R11, Y2); \ + VMULPS Y11, Y2, Y3; \ + VADDPS Y3, Y0, Y3; \ + VMULPS Y12, Y1, Y4; \ + VADDPS Y4, Y0, Y4; \ + VBROADCASTSS 20(CX), Y5; \ + VMULPS Y5, Y2, Y5; \ + VBROADCASTSS 24(CX), Y6; \ + VMULPS Y6, Y1, Y6; \ + VADDPS Y6, Y5, Y5; \ + VADDPS Y5, Y5, Y5; \ + VBROADCASTSS 28(CX), Y6; \ + VDIVPS Y6, Y5, Y5; \ + VSUBPS Y5, Y0, Y5; \ + VPXOR Y1, Y1, Y1; \ + VBROADCASTSS 36(CX), Y2; \ + VBROADCASTSS 32(CX), Y6; \ + VBROADCASTSS 40(CX), Y7; \ + PIXEL(Y3); \ + PIXEL(Y5); \ + PIXEL(Y4); \ + VPMOVZXBD (R12), Y1; \ + VPACKUSDW Y5, Y3, Y3; \ + VPACKUSDW Y1, Y4, Y4; \ + VPACKUSWB Y4, Y3, Y3; \ + VPSHUFB Y15, Y3, Y3; \ + VMOVDQU Y3, (DI); \ + ADDQ $32, SI; \ + ADDQ $UVSTEP, R8; \ + ADDQ $UVSTEP, R9; \ + ADDQ $UVSTEP, R10; \ + ADDQ $UVSTEP, R11; \ + ADDQ $8, R12; \ + ADDQ $32, DI; \ + SUBQ $8, DX; \ + JNZ loop; \ + VZEROUPPER + +#define ROW16(CH, UVSTEP) \ + MOVQ dst+0(FP), DI; \ + MOVQ yf+8(FP), SI; \ + MOVQ u0+16(FP), R8; \ + MOVQ u1+24(FP), R9; \ + MOVQ v0+32(FP), R10; \ + MOVQ v1+40(FP), R11; \ + MOVQ a+48(FP), R12; \ + MOVQ n+56(FP), DX; \ + MOVQ c+64(FP), CX; \ + VBROADCASTSS 0(CX), Y8; \ + VBROADCASTSS 4(CX), Y9; \ + VBROADCASTSS 8(CX), Y10; \ + VBROADCASTSS 12(CX), Y11; \ + VBROADCASTSS 16(CX), Y12; \ + VMOVDQU rowPermC<>(SB), Y13; \ + VMOVDQU rowPermN<>(SB), Y14; \ + VBROADCASTI128 rowSwap<>(SB), Y15; \ +loop16:; \ + VMOVUPS (SI), Y0; \ + CH(R8, R9, Y1); \ + CH(R10, R11, Y2); \ + VMULPS Y11, Y2, Y3; \ + VADDPS Y3, Y0, Y3; \ + VMULPS Y12, Y1, Y4; \ + VADDPS Y4, Y0, Y4; \ + VBROADCASTSS 20(CX), Y5; \ + VMULPS Y5, Y2, Y5; \ + VBROADCASTSS 24(CX), Y6; \ + VMULPS Y6, Y1, Y6; \ + VADDPS Y6, Y5, Y5; \ + VADDPS Y5, Y5, Y5; \ + VBROADCASTSS 28(CX), Y6; \ + VDIVPS Y6, Y5, Y5; \ + VSUBPS Y5, Y0, Y5; \ + VPXOR Y1, Y1, Y1; \ + VBROADCASTSS 36(CX), Y2; \ + VBROADCASTSS 32(CX), Y6; \ + VBROADCASTSS 40(CX), Y7; \ + PIXEL(Y3); \ + PIXEL(Y5); \ + PIXEL(Y4); \ + VPMOVZXWD (R12), Y1; \ + VPACKUSDW Y5, Y3, Y3; \ + VPACKUSDW Y1, Y4, Y4; \ + VPUNPCKLWD Y4, Y3, Y0; \ + VPUNPCKHWD Y4, Y3, Y2; \ + VPUNPCKLWD Y2, Y0, Y5; \ + VPUNPCKHWD Y2, Y0, Y6; \ + VPERM2I128 $0x20, Y6, Y5, Y7; \ + VPERM2I128 $0x31, Y6, Y5, Y1; \ + VPSHUFB Y15, Y7, Y7; \ + VPSHUFB Y15, Y1, Y1; \ + VMOVDQU Y7, (DI); \ + VMOVDQU Y1, 32(DI); \ + ADDQ $32, SI; \ + ADDQ $UVSTEP, R8; \ + ADDQ $UVSTEP, R9; \ + ADDQ $UVSTEP, R10; \ + ADDQ $UVSTEP, R11; \ + ADDQ $16, R12; \ + ADDQ $64, DI; \ + SUBQ $8, DX; \ + JNZ loop16; \ + VZEROUPPER + +// func convertRow8AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) +TEXT ·convertRow8AVX2(SB), NOSPLIT, $0-72 + ROW8(CHROMA, 16) + RET + +// func convertRow444AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) +TEXT ·convertRow444AVX2(SB), NOSPLIT, $0-72 + ROW8(CHROMA444, 32) + RET + +// func convertRow16x8AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) +TEXT ·convertRow16x8AVX2(SB), NOSPLIT, $0-72 + ROW16(CHROMA, 16) + RET + +// func convertRow16x444AVX2(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) +TEXT ·convertRow16x444AVX2(SB), NOSPLIT, $0-72 + ROW16(CHROMA444, 32) + RET + +// func normRow8AVX2(dst *float32, src *uint8, n int, bias, rng float32) +TEXT ·normRow8AVX2(SB), NOSPLIT, $0-32 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ n+16(FP), DX + VBROADCASTSS bias+24(FP), Y1 + VBROADCASTSS rng+28(FP), Y2 + +loop8: + VPMOVZXBD (SI), Y0 + VCVTDQ2PS Y0, Y0 + VSUBPS Y1, Y0, Y0 + VDIVPS Y2, Y0, Y0 + VMOVUPS Y0, (DI) + ADDQ $8, SI + ADDQ $32, DI + SUBQ $8, DX + JNZ loop8 + VZEROUPPER + RET diff --git a/third_party/h265/heic/color_arm64.go b/third_party/h265/heic/color_arm64.go new file mode 100644 index 00000000..d375136c --- /dev/null +++ b/third_party/h265/heic/color_arm64.go @@ -0,0 +1,112 @@ +//go:build arm64 && !noasm + +package heic + +//go:noescape +func convertRow4NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) + +//go:noescape +func convertRow444NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) + +func rowFn(ssHor int) convertRow { + if ssHor == 0 { + return convertRow444NEONRow + } + + return convertRowNEON +} + +func convertRow444NEONRow(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + if n4 := n &^ 3; n4 > 0 { + convertRow444NEON(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n4, c) + if n4 == n { + return + } + dst, yf, a, n = dst[4*n4:], yf[n4:], a[n4:], n-n4 + u0, u1, v0, v1 = u0[n4:], u1[n4:], v0[n4:], v1[n4:] + } + + convertRow444Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +func convertRowNEON(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + if n4 := n &^ 3; n4 > 0 { + convertRow4NEON(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n4, c) + if n4 == n { + return + } + dst, yf, a, n = dst[4*n4:], yf[n4:], a[n4:], n-n4 + u0, u1 = u0[n4/2:], u1[n4/2:] + v0, v1 = v0[n4/2:], v1[n4/2:] + } + + convertRowGo(dst, yf, u0, u1, v0, v1, a, n, c) +} + +//go:noescape +func convertRow16x4NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) + +//go:noescape +func convertRow16x444NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) + +func rowFn16(ssHor int) convertRow16 { + if ssHor == 0 { + return convertRow16x444NEONRow + } + + return convertRow16NEON +} + +func convertRow16x444NEONRow(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + if n4 := n &^ 3; n4 > 0 { + convertRow16x444NEON(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n4, c) + if n4 == n { + return + } + dst, yf, a, n = dst[8*n4:], yf[n4:], a[n4:], n-n4 + u0, u1, v0, v1 = u0[n4:], u1[n4:], v0[n4:], v1[n4:] + } + + convertRow16x444Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +func convertRow16NEON(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + if n4 := n &^ 3; n4 > 0 { + convertRow16x4NEON(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n4, c) + if n4 == n { + return + } + dst, yf, a, n = dst[8*n4:], yf[n4:], a[n4:], n-n4 + u0, u1 = u0[n4/2:], u1[n4/2:] + v0, v1 = v0[n4/2:], v1[n4/2:] + } + + convertRow16Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +//go:noescape +func normRow8NEON(dst *float32, src *uint8, n int, bias, rng float32) + +func normRow(dst []float32, src []uint8, bias, rng float32) { + if n8 := len(dst) &^ 7; n8 > 0 { + normRow8NEON(&dst[0], &src[0], n8, bias, rng) + if n8 == len(dst) { + return + } + dst, src = dst[n8:], src[n8:] + } + + normRowGo(dst, src, bias, rng) +} + +func normRow16(dst []float32, src []uint16, maxCh uint16, bias, rng float32) { + normRow16Go(dst, src, maxCh, bias, rng) +} diff --git a/third_party/h265/heic/color_arm64.s b/third_party/h265/heic/color_arm64.s new file mode 100644 index 00000000..3f82d497 --- /dev/null +++ b/third_party/h265/heic/color_arm64.s @@ -0,0 +1,259 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define FMUL(Vd, Vn, Vm) WORD $(0x6E20DC00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define FADD(Vd, Vn, Vm) WORD $(0x4E20D400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define FSUB(Vd, Vn, Vm) WORD $(0x4EA0D400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define FDIV(Vd, Vn, Vm) WORD $(0x6E20FC00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define FMAX(Vd, Vn, Vm) WORD $(0x4E20F400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define FMIN(Vd, Vn, Vm) WORD $(0x4EA0F400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define FCVTZS(Vd, Vn) WORD $(0x4EA1B800 | ((Vn) << 5) | (Vd)) + +DATA rowSelC<>+0(SB)/8, $0x0706050407060504 +DATA rowSelC<>+8(SB)/8, $0x0b0a09080b0a0908 +GLOBL rowSelC<>(SB), RODATA|NOPTR, $16 + +DATA rowSelN<>+0(SB)/8, $0x0b0a090803020100 +DATA rowSelN<>+8(SB)/8, $0x0f0e0d0c07060504 +GLOBL rowSelN<>(SB), RODATA|NOPTR, $16 + +DATA rowSelP<>+0(SB)/8, $0x3424140430201000 +DATA rowSelP<>+8(SB)/8, $0x3c2c1c0c38281808 +GLOBL rowSelP<>(SB), RODATA|NOPTR, $16 + +#define CHROMA(P0, P1, OUT, VOUT) \ + VLD1 (P0), [V4.S4]; \ + VTBL V16.B16, [V4.B16], V5.B16; \ + VTBL V17.B16, [V4.B16], V6.B16; \ + FMUL(OUT, 5, 20); \ + FMUL(6, 6, 21); \ + FADD(OUT, OUT, 6); \ + VLD1 (P1), [V4.S4]; \ + VTBL V16.B16, [V4.B16], V5.B16; \ + VTBL V17.B16, [V4.B16], V6.B16; \ + FMUL(5, 5, 21); \ + FADD(OUT, OUT, 5); \ + FMUL(6, 6, 22); \ + FADD(OUT, OUT, 6) + +#define CHROMA444(P0, P1, OUT, VOUT) \ + ADD $4, P0, R9; \ + VLD1 (R9), [VOUT] + +#define PIXEL(V) \ + FMAX(V, V, 24); \ + FMIN(V, V, 25); \ + FMUL(V, V, 26); \ + FADD(V, V, 27); \ + FCVTZS(V, V) + +#define ROW8(CH, UVSTEP) \ + MOVD dst+0(FP), R0; \ + MOVD yf+8(FP), R1; \ + MOVD u0+16(FP), R2; \ + MOVD u1+24(FP), R3; \ + MOVD v0+32(FP), R4; \ + MOVD v1+40(FP), R5; \ + MOVD a+48(FP), R6; \ + MOVD n+56(FP), R7; \ + MOVD c+64(FP), R8; \ + MOVD $rowSelC<>(SB), R9; \ + VLD1 (R9), [V16.B16]; \ + MOVD $rowSelN<>(SB), R9; \ + VLD1 (R9), [V17.B16]; \ + MOVD $rowSelP<>(SB), R9; \ + VLD1 (R9), [V18.B16]; \ + MOVW 0(R8), R9; \ + VDUP R9, V20.S4; \ + MOVW 4(R8), R9; \ + VDUP R9, V21.S4; \ + MOVW 8(R8), R9; \ + VDUP R9, V22.S4; \ + MOVW 12(R8), R9; \ + VDUP R9, V23.S4; \ + MOVW 16(R8), R9; \ + VDUP R9, V28.S4; \ + MOVW 20(R8), R9; \ + VDUP R9, V29.S4; \ + MOVW 24(R8), R9; \ + VDUP R9, V30.S4; \ + MOVW 28(R8), R9; \ + VDUP R9, V31.S4; \ + MOVW 32(R8), R9; \ + VDUP R9, V26.S4; \ + MOVW 36(R8), R9; \ + VDUP R9, V25.S4; \ + MOVW 40(R8), R9; \ + VDUP R9, V27.S4; \ + VEOR V24.B16, V24.B16, V24.B16; \ +loop: \ + VLD1 (R1), [V0.S4]; \ + CH(R2, R3, 1, V1.S4); \ + CH(R4, R5, 2, V2.S4); \ + FMUL(7, 2, 23); \ + FADD(7, 0, 7); \ + FMUL(8, 1, 28); \ + FADD(8, 0, 8); \ + FMUL(9, 2, 29); \ + FMUL(10, 1, 30); \ + FADD(9, 9, 10); \ + FADD(9, 9, 9); \ + FDIV(9, 9, 31); \ + FSUB(9, 0, 9); \ + PIXEL(7); \ + PIXEL(9); \ + PIXEL(8); \ + VLD1 (R6), [V10.B8]; \ + VUSHLL $0, V10.B8, V10.H8; \ + VUSHLL $0, V10.H4, V10.S4; \ + VMOV V7.B16, V12.B16; \ + VMOV V9.B16, V13.B16; \ + VMOV V8.B16, V14.B16; \ + VMOV V10.B16, V15.B16; \ + VTBL V18.B16, [V12.B16, V13.B16, V14.B16, V15.B16], V11.B16; \ + VST1 [V11.B16], (R0); \ + ADD $16, R1; \ + ADD $UVSTEP, R2; \ + ADD $UVSTEP, R3; \ + ADD $UVSTEP, R4; \ + ADD $UVSTEP, R5; \ + ADD $4, R6; \ + ADD $16, R0; \ + SUB $4, R7; \ + CBNZ R7, loop + +#define ROW16(CH, UVSTEP) \ + MOVD dst+0(FP), R0; \ + MOVD yf+8(FP), R1; \ + MOVD u0+16(FP), R2; \ + MOVD u1+24(FP), R3; \ + MOVD v0+32(FP), R4; \ + MOVD v1+40(FP), R5; \ + MOVD a+48(FP), R6; \ + MOVD n+56(FP), R7; \ + MOVD c+64(FP), R8; \ + MOVD $rowSelC<>(SB), R9; \ + VLD1 (R9), [V16.B16]; \ + MOVD $rowSelN<>(SB), R9; \ + VLD1 (R9), [V17.B16]; \ + MOVD $rowSelD<>(SB), R9; \ + VLD1 (R9), [V18.B16]; \ + MOVD $rowSelE<>(SB), R9; \ + VLD1 (R9), [V19.B16]; \ + MOVW 0(R8), R9; \ + VDUP R9, V20.S4; \ + MOVW 4(R8), R9; \ + VDUP R9, V21.S4; \ + MOVW 8(R8), R9; \ + VDUP R9, V22.S4; \ + MOVW 12(R8), R9; \ + VDUP R9, V23.S4; \ + MOVW 16(R8), R9; \ + VDUP R9, V28.S4; \ + MOVW 20(R8), R9; \ + VDUP R9, V29.S4; \ + MOVW 24(R8), R9; \ + VDUP R9, V30.S4; \ + MOVW 28(R8), R9; \ + VDUP R9, V31.S4; \ + MOVW 32(R8), R9; \ + VDUP R9, V26.S4; \ + MOVW 36(R8), R9; \ + VDUP R9, V25.S4; \ + MOVW 40(R8), R9; \ + VDUP R9, V27.S4; \ + VEOR V24.B16, V24.B16, V24.B16; \ +loop16: \ + VLD1 (R1), [V0.S4]; \ + CH(R2, R3, 1, V1.S4); \ + CH(R4, R5, 2, V2.S4); \ + FMUL(7, 2, 23); \ + FADD(7, 0, 7); \ + FMUL(8, 1, 28); \ + FADD(8, 0, 8); \ + FMUL(9, 2, 29); \ + FMUL(10, 1, 30); \ + FADD(9, 9, 10); \ + FADD(9, 9, 9); \ + FDIV(9, 9, 31); \ + FSUB(9, 0, 9); \ + PIXEL(7); \ + PIXEL(9); \ + PIXEL(8); \ + VLD1 (R6), [V10.H4]; \ + VUSHLL $0, V10.H4, V10.S4; \ + VMOV V7.B16, V12.B16; \ + VMOV V9.B16, V13.B16; \ + VMOV V8.B16, V14.B16; \ + VMOV V10.B16, V15.B16; \ + VTBL V18.B16, [V12.B16, V13.B16, V14.B16, V15.B16], V11.B16; \ + VST1.P [V11.B16], 16(R0); \ + VTBL V19.B16, [V12.B16, V13.B16, V14.B16, V15.B16], V11.B16; \ + VST1.P [V11.B16], 16(R0); \ + ADD $16, R1; \ + ADD $UVSTEP, R2; \ + ADD $UVSTEP, R3; \ + ADD $UVSTEP, R4; \ + ADD $UVSTEP, R5; \ + ADD $8, R6; \ + SUB $4, R7; \ + CBNZ R7, loop16 + +DATA rowSelD<>+0(SB)/8, $0x3031202110110001 +DATA rowSelD<>+8(SB)/8, $0x3435242514150405 +GLOBL rowSelD<>(SB), RODATA|NOPTR, $16 + +DATA rowSelE<>+0(SB)/8, $0x3839282918190809 +DATA rowSelE<>+8(SB)/8, $0x3c3d2c2d1c1d0c0d +GLOBL rowSelE<>(SB), RODATA|NOPTR, $16 + +// func convertRow4NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) +TEXT ·convertRow4NEON(SB), NOSPLIT, $0-72 + ROW8(CHROMA, 8) + RET + +// func convertRow444NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) +TEXT ·convertRow444NEON(SB), NOSPLIT, $0-72 + ROW8(CHROMA444, 16) + RET + +// func convertRow16x4NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) +TEXT ·convertRow16x4NEON(SB), NOSPLIT, $0-72 + ROW16(CHROMA, 8) + RET + +// func convertRow16x444NEON(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) +TEXT ·convertRow16x444NEON(SB), NOSPLIT, $0-72 + ROW16(CHROMA444, 16) + RET + +#define UCVTF(Vd, Vn) WORD $(0x6E21D800 | ((Vn) << 5) | (Vd)) +#define UMINH(Vd, Vn, Vm) WORD $(0x6E606C00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func normRow8NEON(dst *float32, src *uint8, n int, bias, rng float32) +TEXT ·normRow8NEON(SB), NOSPLIT, $0-32 + MOVD dst+0(FP), R0 + MOVD src+8(FP), R1 + MOVD n+16(FP), R2 + MOVW bias+24(FP), R3 + VDUP R3, V1.S4 + MOVW rng+28(FP), R3 + VDUP R3, V2.S4 + +loop8: + VLD1.P 8(R1), [V0.B8] + VUSHLL $0, V0.B8, V0.H8 + VUSHLL $0, V0.H4, V3.S4 + VUSHLL2 $0, V0.H8, V4.S4 + UCVTF(3, 3) + UCVTF(4, 4) + FSUB(3, 3, 1) + FSUB(4, 4, 1) + FDIV(3, 3, 2) + FDIV(4, 4, 2) + VST1.P [V3.S4, V4.S4], 32(R0) + SUB $8, R2 + CBNZ R2, loop8 + + RET diff --git a/third_party/h265/heic/color_noasm.go b/third_party/h265/heic/color_noasm.go new file mode 100644 index 00000000..ccc35eba --- /dev/null +++ b/third_party/h265/heic/color_noasm.go @@ -0,0 +1,27 @@ +//go:build noasm || (!amd64 && !arm64 && !(riscv64 && riscv64.rva23u64)) + +package heic + +func rowFn(ssHor int) convertRow { + if ssHor == 0 { + return convertRow444Go + } + + return convertRowGo +} + +func rowFn16(ssHor int) convertRow16 { + if ssHor == 0 { + return convertRow16x444Go + } + + return convertRow16Go +} + +func normRow(dst []float32, src []uint8, bias, rng float32) { + normRowGo(dst, src, bias, rng) +} + +func normRow16(dst []float32, src []uint16, maxCh uint16, bias, rng float32) { + normRow16Go(dst, src, maxCh, bias, rng) +} diff --git a/third_party/h265/heic/color_riscv64.go b/third_party/h265/heic/color_riscv64.go new file mode 100644 index 00000000..95953884 --- /dev/null +++ b/third_party/h265/heic/color_riscv64.go @@ -0,0 +1,92 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +package heic + +//go:noescape +func convertRowRVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) + +//go:noescape +func convertRow444RVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) + +func rowFn(ssHor int) convertRow { + if ssHor == 0 { + return convertRow444Vec + } + + return convertRowVec +} + +func convertRow444Vec(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + if n > 0 { + convertRow444RVV(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n, c) + } +} + +func convertRowVec(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + if n4 := n &^ 3; n4 > 0 { + convertRowRVV(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n4, c) + if n4 == n { + return + } + dst, yf, a, n = dst[4*n4:], yf[n4:], a[n4:], n-n4 + u0, u1 = u0[n4/2:], u1[n4/2:] + v0, v1 = v0[n4/2:], v1[n4/2:] + } + + convertRowGo(dst, yf, u0, u1, v0, v1, a, n, c) +} + +//go:noescape +func convertRow16RVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) + +//go:noescape +func convertRow16x444RVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) + +func rowFn16(ssHor int) convertRow16 { + if ssHor == 0 { + return convertRow16x444Vec + } + + return convertRow16Vec +} + +func convertRow16x444Vec(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + if n > 0 { + convertRow16x444RVV(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n, c) + } +} + +func convertRow16Vec(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + if n4 := n &^ 3; n4 > 0 { + convertRow16RVV(&dst[0], &yf[0], &u0[0], &u1[0], &v0[0], &v1[0], &a[0], n4, c) + if n4 == n { + return + } + dst, yf, a, n = dst[8*n4:], yf[n4:], a[n4:], n-n4 + u0, u1 = u0[n4/2:], u1[n4/2:] + v0, v1 = v0[n4/2:], v1[n4/2:] + } + + convertRow16Go(dst, yf, u0, u1, v0, v1, a, n, c) +} + +//go:noescape +func normRow8RVV(dst *float32, src *uint8, n int, bias, rng float32) + +func normRow(dst []float32, src []uint8, bias, rng float32) { + if len(dst) > 0 { + normRow8RVV(&dst[0], &src[0], len(dst), bias, rng) + } +} + +func normRow16(dst []float32, src []uint16, maxCh uint16, bias, rng float32) { + normRow16Go(dst, src, maxCh, bias, rng) +} diff --git a/third_party/h265/heic/color_riscv64.s b/third_party/h265/heic/color_riscv64.s new file mode 100644 index 00000000..4237735d --- /dev/null +++ b/third_party/h265/heic/color_riscv64.s @@ -0,0 +1,392 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +#define CHROMA(P0, P1, OUT) \ + VLE32V (P0), V3; \ + VRGATHERVV V6, V3, V4; \ + VRGATHERVV V7, V3, V5; \ + VFMULVF F0, V4, OUT; \ + VFMULVF F1, V5, V5; \ + VFADDVV V5, OUT, OUT; \ + VLE32V (P1), V3; \ + VRGATHERVV V6, V3, V4; \ + VRGATHERVV V7, V3, V5; \ + VFMULVF F1, V4, V4; \ + VFADDVV V4, OUT, OUT; \ + VFMULVF F2, V5, V5; \ + VFADDVV V5, OUT, OUT + +#define PIXEL(V) \ + VFMAXVF F11, V, V; \ + VFMINVF F9, V, V; \ + VFMULVF F8, V, V; \ + VFADDVF F10, V, V; \ + VFCVTRTZXFV V, V + +#define NARROW(SRC, DST) \ + VSETVLI X5, E16, MF2, TA, MA, X6; \ + VNSRLWI $0, SRC, V20; \ + VSETVLI X5, E8, MF4, TA, MA, X6; \ + VNSRLWI $0, V20, DST; \ + VSETVLI X5, E32, M1, TA, MA, X6 + +// func convertRowRVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) +TEXT ·convertRowRVV(SB), NOSPLIT, $0-72 + MOV dst+0(FP), X10 + MOV yf+8(FP), X11 + MOV u0+16(FP), X12 + MOV u1+24(FP), X13 + MOV v0+32(FP), X14 + MOV v1+40(FP), X15 + MOV a+48(FP), X16 + MOV n+56(FP), X17 + MOV c+64(FP), X18 + + MOVF 0(X18), F0 + MOVF 4(X18), F1 + MOVF 8(X18), F2 + MOVF 12(X18), F3 + MOVF 16(X18), F4 + MOVF 20(X18), F5 + MOVF 24(X18), F6 + MOVF 28(X18), F7 + MOVF 32(X18), F8 + MOVF 36(X18), F9 + MOVF 40(X18), F10 + MOVF 44(X18), F11 + +loop: + MOV $16, X19 + MIN X17, X19, X19 + VSETVLI X19, E32, M1, TA, MA, X5 + + VIDV V3 + VSRLVI $1, V3, V4 + VADDVI $1, V4, V6 + VANDVI $1, V3, V5 + VADDVV V5, V5, V5 + VADDVV V5, V4, V7 + + VLE32V (X11), V0 + CHROMA(X12, X13, V1) + CHROMA(X14, X15, V2) + + VFMULVF F3, V2, V8 + VFADDVV V0, V8, V8 + + VFMULVF F4, V1, V10 + VFADDVV V0, V10, V10 + + VFMULVF F5, V2, V9 + VFMULVF F6, V1, V4 + VFADDVV V4, V9, V9 + VFADDVV V9, V9, V9 + VFDIVVF F7, V9, V9 + VFSUBVV V9, V0, V9 + + PIXEL(V8) + PIXEL(V9) + PIXEL(V10) + + VSETVLI X5, E8, MF4, TA, MA, X6 + VLE8V (X16), V11 + VSETVLI X5, E32, M1, TA, MA, X6 + VZEXTVF4 V11, V12 + + NARROW(V8, V16) + NARROW(V9, V17) + NARROW(V10, V18) + NARROW(V12, V19) + + VSETVLI X5, E8, MF4, TA, MA, X6 + VSSEG4E8V V16, (X10) + VSETVLI X5, E32, M1, TA, MA, X6 + + SLLI $2, X5, X6 + ADD X6, X11 + ADD X6, X10 + ADD X6, X10 + ADD X6, X10 + ADD X6, X10 + SUB X6, X10 + SUB X6, X10 + SUB X6, X10 + SRLI $1, X6, X20 + ADD X20, X12 + ADD X20, X13 + ADD X20, X14 + ADD X20, X15 + ADD X5, X16 + SUB X5, X17 + BNEZ X17, loop + + RET + +#define SWAP16(SRC, DST) \ + VSETVLI X5, E16, MF2, TA, MA, X6; \ + VNSRLWI $0, SRC, DST; \ + VSRLVI $8, DST, V20; \ + VSLLVI $8, DST, DST; \ + VORVV V20, DST, DST; \ + VSETVLI X5, E32, M1, TA, MA, X6 + +// func convertRow16RVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) +TEXT ·convertRow16RVV(SB), NOSPLIT, $0-72 + MOV dst+0(FP), X10 + MOV yf+8(FP), X11 + MOV u0+16(FP), X12 + MOV u1+24(FP), X13 + MOV v0+32(FP), X14 + MOV v1+40(FP), X15 + MOV a+48(FP), X16 + MOV n+56(FP), X17 + MOV c+64(FP), X18 + + MOVF 0(X18), F0 + MOVF 4(X18), F1 + MOVF 8(X18), F2 + MOVF 12(X18), F3 + MOVF 16(X18), F4 + MOVF 20(X18), F5 + MOVF 24(X18), F6 + MOVF 28(X18), F7 + MOVF 32(X18), F8 + MOVF 36(X18), F9 + MOVF 40(X18), F10 + MOVF 44(X18), F11 + +loop16: + MOV $16, X19 + MIN X17, X19, X19 + VSETVLI X19, E32, M1, TA, MA, X5 + + VIDV V3 + VSRLVI $1, V3, V4 + VADDVI $1, V4, V6 + VANDVI $1, V3, V5 + VADDVV V5, V5, V5 + VADDVV V5, V4, V7 + + VLE32V (X11), V0 + CHROMA(X12, X13, V1) + CHROMA(X14, X15, V2) + + VFMULVF F3, V2, V8 + VFADDVV V0, V8, V8 + + VFMULVF F4, V1, V10 + VFADDVV V0, V10, V10 + + VFMULVF F5, V2, V9 + VFMULVF F6, V1, V4 + VFADDVV V4, V9, V9 + VFADDVV V9, V9, V9 + VFDIVVF F7, V9, V9 + VFSUBVV V9, V0, V9 + + PIXEL(V8) + PIXEL(V9) + PIXEL(V10) + + VSETVLI X5, E16, MF2, TA, MA, X6 + VLE16V (X16), V11 + VSETVLI X5, E32, M1, TA, MA, X6 + VZEXTVF2 V11, V12 + + SWAP16(V8, V16) + SWAP16(V9, V17) + SWAP16(V10, V18) + SWAP16(V12, V19) + + VSETVLI X5, E16, MF2, TA, MA, X6 + VSSEG4E16V V16, (X10) + VSETVLI X5, E32, M1, TA, MA, X6 + + SLLI $2, X5, X6 + ADD X6, X11 + SLLI $3, X5, X21 + ADD X21, X10 + SRLI $1, X6, X20 + ADD X20, X12 + ADD X20, X13 + ADD X20, X14 + ADD X20, X15 + SLLI $1, X5, X22 + ADD X22, X16 + SUB X5, X17 + BNEZ X17, loop16 + + RET + +// func convertRow444RVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint8, n int, c *rowConsts) +TEXT ·convertRow444RVV(SB), NOSPLIT, $0-72 + MOV dst+0(FP), X10 + MOV yf+8(FP), X11 + MOV u0+16(FP), X12 + MOV v0+32(FP), X14 + MOV a+48(FP), X16 + MOV n+56(FP), X17 + MOV c+64(FP), X18 + + MOVF 12(X18), F3 + MOVF 16(X18), F4 + MOVF 20(X18), F5 + MOVF 24(X18), F6 + MOVF 28(X18), F7 + MOVF 32(X18), F8 + MOVF 36(X18), F9 + MOVF 40(X18), F10 + MOVF 44(X18), F11 + +l444: + MOV $16, X19 + MIN X17, X19, X19 + VSETVLI X19, E32, M1, TA, MA, X5 + + VLE32V (X11), V0 + ADD $4, X12, X23 + VLE32V (X23), V1 + ADD $4, X14, X23 + VLE32V (X23), V2 + + VFMULVF F3, V2, V8 + VFADDVV V0, V8, V8 + + VFMULVF F4, V1, V10 + VFADDVV V0, V10, V10 + + VFMULVF F5, V2, V9 + VFMULVF F6, V1, V4 + VFADDVV V4, V9, V9 + VFADDVV V9, V9, V9 + VFDIVVF F7, V9, V9 + VFSUBVV V9, V0, V9 + + PIXEL(V8) + PIXEL(V9) + PIXEL(V10) + + VSETVLI X5, E8, MF4, TA, MA, X6 + VLE8V (X16), V11 + VSETVLI X5, E32, M1, TA, MA, X6 + VZEXTVF4 V11, V12 + + NARROW(V8, V16) + NARROW(V9, V17) + NARROW(V10, V18) + NARROW(V12, V19) + + VSETVLI X5, E8, MF4, TA, MA, X6 + VSSEG4E8V V16, (X10) + VSETVLI X5, E32, M1, TA, MA, X6 + + SLLI $2, X5, X6 + ADD X6, X11 + ADD X6, X12 + ADD X6, X14 + ADD X6, X10 + ADD X5, X16 + SUB X5, X17 + BNEZ X17, l444 + + RET + +// func convertRow16x444RVV(dst *uint8, yf, u0, u1, v0, v1 *float32, a *uint16, n int, c *rowConsts) +TEXT ·convertRow16x444RVV(SB), NOSPLIT, $0-72 + MOV dst+0(FP), X10 + MOV yf+8(FP), X11 + MOV u0+16(FP), X12 + MOV v0+32(FP), X14 + MOV a+48(FP), X16 + MOV n+56(FP), X17 + MOV c+64(FP), X18 + + MOVF 12(X18), F3 + MOVF 16(X18), F4 + MOVF 20(X18), F5 + MOVF 24(X18), F6 + MOVF 28(X18), F7 + MOVF 32(X18), F8 + MOVF 36(X18), F9 + MOVF 40(X18), F10 + MOVF 44(X18), F11 + +l16444: + MOV $16, X19 + MIN X17, X19, X19 + VSETVLI X19, E32, M1, TA, MA, X5 + + VLE32V (X11), V0 + ADD $4, X12, X23 + VLE32V (X23), V1 + ADD $4, X14, X23 + VLE32V (X23), V2 + + VFMULVF F3, V2, V8 + VFADDVV V0, V8, V8 + + VFMULVF F4, V1, V10 + VFADDVV V0, V10, V10 + + VFMULVF F5, V2, V9 + VFMULVF F6, V1, V4 + VFADDVV V4, V9, V9 + VFADDVV V9, V9, V9 + VFDIVVF F7, V9, V9 + VFSUBVV V9, V0, V9 + + PIXEL(V8) + PIXEL(V9) + PIXEL(V10) + + VSETVLI X5, E16, MF2, TA, MA, X6 + VLE16V (X16), V11 + VSETVLI X5, E32, M1, TA, MA, X6 + VZEXTVF2 V11, V12 + + SWAP16(V8, V16) + SWAP16(V9, V17) + SWAP16(V10, V18) + SWAP16(V12, V19) + + VSETVLI X5, E16, MF2, TA, MA, X6 + VSSEG4E16V V16, (X10) + VSETVLI X5, E32, M1, TA, MA, X6 + + SLLI $2, X5, X6 + ADD X6, X11 + ADD X6, X12 + ADD X6, X14 + SLLI $3, X5, X21 + ADD X21, X10 + SLLI $1, X5, X22 + ADD X22, X16 + SUB X5, X17 + BNEZ X17, l16444 + + RET + +// func normRow8RVV(dst *float32, src *uint8, n int, bias, rng float32) +TEXT ·normRow8RVV(SB), NOSPLIT, $0-32 + MOV dst+0(FP), X10 + MOV src+8(FP), X11 + MOV n+16(FP), X12 + MOVF bias+24(FP), F0 + MOVF rng+28(FP), F1 + +loop8: + VSETVLI X12, E32, M1, TA, MA, X13 + VLE8V (X11), V1 + VZEXTVF4 V1, V2 + VFCVTFXUV V2, V2 + VFSUBVF F0, V2, V2 + VFDIVVF F1, V2, V2 + VSE32V V2, (X10) + ADD X13, X11 + SLLI $2, X13, X14 + ADD X14, X10 + SUB X13, X12 + BNEZ X12, loop8 + + RET diff --git a/third_party/h265/heic/color_row.go b/third_party/h265/heic/color_row.go new file mode 100644 index 00000000..caafbda0 --- /dev/null +++ b/third_party/h265/heic/color_row.go @@ -0,0 +1,209 @@ +package heic + +import "encoding/binary" + +type rowConsts struct { + w0, w1, w2 float32 + crCoef, cbCoef float32 + gcr, gcb, kg float32 + outMax float32 + one, half float32 + zero float32 +} + +type convertRow func(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts) + +type convertRow16 func(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts) + +// forceScalarRow drops back to rgbRow, so a test can compare the two paths. +var forceScalarRow bool + +func (s *colorState) fastRow(outDepth int) bool { + if forceScalarRow { + return false + } + + if !s.hasColor { + return false + } + if s.depth == 8 != (outDepth == 8) { + return false + } + switch s.matrix { + case mcIdentity, mcYCgCo: + return false + } + + return true +} + +func (s *colorState) rowConsts() rowConsts { + const w0, w1, w2 = 9.0 / 16.0, 3.0 / 16.0, 1.0 / 16.0 + + return rowConsts{ + w0: w0, w1: w1, w2: w2, + crCoef: s.crCoef, cbCoef: s.cbCoef, + gcr: s.gcr, gcb: s.gcb, kg: s.kg, + outMax: s.outMax, one: 1, half: 0.5, + } +} + +func normRowGo(dst []float32, src []uint8, bias, rng float32) { + src = src[:len(dst)] + for i, v := range src { + dst[i] = (float32(v) - bias) / rng + } +} + +func normRow16Go(dst []float32, src []uint16, maxCh uint16, bias, rng float32) { + src = src[:len(dst)] + for i, v := range src { + dst[i] = (float32(min(v, maxCh)) - bias) / rng + } +} + +func convertRow444Go(dst []uint8, yf, u0, _, v0, _ []float32, a []uint8, + n int, c *rowConsts, +) { + for x := range n { + yy := yf[x] + cb, cr := u0[x+1], v0[x+1] + + r := yy + c.crCoef*cr + b := yy + c.cbCoef*cb + g := yy - (2*((c.gcr*cr)+(c.gcb*cb)))/c.kg + + dst[4*x] = uint8(0.5 + clampF(r)*c.outMax) + dst[4*x+1] = uint8(0.5 + clampF(g)*c.outMax) + dst[4*x+2] = uint8(0.5 + clampF(b)*c.outMax) + dst[4*x+3] = a[x] + } +} + +func convertRow16x444Go(dst []uint8, yf, u0, _, v0, _ []float32, a []uint16, + n int, c *rowConsts, +) { + for x := range n { + yy := yf[x] + cb, cr := u0[x+1], v0[x+1] + + r := yy + c.crCoef*cr + b := yy + c.cbCoef*cb + g := yy - (2*((c.gcr*cr)+(c.gcb*cb)))/c.kg + + o := dst[8*x : 8*x+8 : 8*x+8] + binary.BigEndian.PutUint16(o[0:], uint16(0.5+clampF(r)*c.outMax)) + binary.BigEndian.PutUint16(o[2:], uint16(0.5+clampF(g)*c.outMax)) + binary.BigEndian.PutUint16(o[4:], uint16(0.5+clampF(b)*c.outMax)) + binary.BigEndian.PutUint16(o[6:], a[x]) + } +} + +func convertRow16Go(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint16, + n int, c *rowConsts, +) { + for x := range n { + k := x >> 1 + j := k + if x&1 != 0 { + j = k + 2 + } + k++ + + yy := yf[x] + cb := u0[k]*c.w0 + u0[j]*c.w1 + u1[k]*c.w1 + u1[j]*c.w2 + cr := v0[k]*c.w0 + v0[j]*c.w1 + v1[k]*c.w1 + v1[j]*c.w2 + + r := yy + c.crCoef*cr + b := yy + c.cbCoef*cb + g := yy - (2*((c.gcr*cr)+(c.gcb*cb)))/c.kg + + o := dst[8*x : 8*x+8 : 8*x+8] + binary.BigEndian.PutUint16(o[0:], uint16(0.5+clampF(r)*c.outMax)) + binary.BigEndian.PutUint16(o[2:], uint16(0.5+clampF(g)*c.outMax)) + binary.BigEndian.PutUint16(o[4:], uint16(0.5+clampF(b)*c.outMax)) + binary.BigEndian.PutUint16(o[6:], a[x]) + } +} + +func convertRowGo(dst []uint8, yf, u0, u1, v0, v1 []float32, a []uint8, + n int, c *rowConsts, +) { + for x := range n { + k := x >> 1 + j := k + if x&1 != 0 { + j = k + 2 + } + k++ + + yy := yf[x] + cb := u0[k]*c.w0 + u0[j]*c.w1 + u1[k]*c.w1 + u1[j]*c.w2 + cr := v0[k]*c.w0 + v0[j]*c.w1 + v1[k]*c.w1 + v1[j]*c.w2 + + r := yy + c.crCoef*cr + b := yy + c.cbCoef*cb + g := yy - (2*((c.gcr*cr)+(c.gcb*cb)))/c.kg + + dst[4*x] = uint8(0.5 + clampF(r)*c.outMax) + dst[4*x+1] = uint8(0.5 + clampF(g)*c.outMax) + dst[4*x+2] = uint8(0.5 + clampF(b)*c.outMax) + dst[4*x+3] = a[x] + } +} + +// rowPlanes normalises the chroma rows one output row needs, padded by one +// sample at each end so the kernels can read a neighbour without a bounds +// check at the edges. +func (s *colorState) rowPlanes(cb, cr planeView, y, w, h int) (u0, u1, v0, v1 []float32) { + uvY := y >> s.ssVer + uw := (w + s.ssHor) >> s.ssHor + + adjRow := 0 + if s.ssVer != 0 && y != 0 && !(y == h-1 && y%2 != 0) { + if y%2 != 0 { + adjRow = 1 + } else { + adjRow = -1 + } + } + + u0 = s.padRow(s.uPad[0], cb, uvY, uw) + v0 = s.padRow(s.vPad[0], cr, uvY, uw) + + if adjRow == 0 { + return u0, u0, v0, v0 + } + + ay := min(max(uvY+adjRow, 0), cb.h-1) + + u1 = s.padRow(s.uPad[1], cb, ay, uw) + v1 = s.padRow(s.vPad[1], cr, ay, uw) + + return u0, u1, v0, v1 +} + +func (s *colorState) padRow(dst []float32, v planeView, y, uw int) []float32 { + if v.p16 != nil { + normRow16(dst[1:1+uw], v.p16[y*v.stride:], uint16(s.maxChannel), s.biasUV, s.rangeUV) + } else { + normRow(dst[1:1+uw], v.p8[y*v.stride:y*v.stride+uw], s.biasUV, s.rangeUV) + } + + dst[0] = dst[1] + dst[uw+1] = dst[uw] + + return dst +} + +func (s *colorState) lumaRowF(v planeView, y, w int) []float32 { + if v.p16 != nil { + normRow16(s.yf[:w], v.p16[y*v.stride:], uint16(s.maxChannel), s.biasY, s.rangeY) + } else { + normRow(s.yf[:w], v.p8[y*v.stride:y*v.stride+w], s.biasY, s.rangeY) + } + + return s.yf +} diff --git a/third_party/h265/heic/cpu_amd64.go b/third_party/h265/heic/cpu_amd64.go new file mode 100644 index 00000000..39e4bc22 --- /dev/null +++ b/third_party/h265/heic/cpu_amd64.go @@ -0,0 +1,7 @@ +//go:build amd64 && !noasm + +package heic + +var hasAVX2 = cpuidAVX2() + +func cpuidAVX2() bool diff --git a/third_party/h265/heic/cpu_amd64.s b/third_party/h265/heic/cpu_amd64.s new file mode 100644 index 00000000..a1071c5c --- /dev/null +++ b/third_party/h265/heic/cpu_amd64.s @@ -0,0 +1,35 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// cpuidAVX2 reports whether the CPU has AVX2 and the OS saves the YMM state. +TEXT ·cpuidAVX2(SB), NOSPLIT, $0-1 + MOVL $0, AX + CPUID + CMPL AX, $7 + JL no + + MOVL $1, AX + MOVL $0, CX + CPUID + BTL $27, CX // OSXSAVE + JNC no + + MOVL $0, CX + XGETBV + ANDL $6, AX // XMM and YMM state + CMPL AX, $6 + JNE no + + MOVL $7, AX + MOVL $0, CX + CPUID + BTL $5, BX // AVX2 + JNC no + + MOVB $1, ret+0(FP) + RET + +no: + MOVB $0, ret+0(FP) + RET diff --git a/third_party/h265/heic/encode.go b/third_party/h265/heic/encode.go new file mode 100644 index 00000000..c4e2e9db --- /dev/null +++ b/third_party/h265/heic/encode.go @@ -0,0 +1,561 @@ +package heic + +import ( + "encoding/binary" + "image" + "io" + "math" + + "github.com/gen2brain/h265/hevc" +) + +// DefaultQuality is the quality Encode uses when none is given. +const DefaultQuality = 60 + +// The written planes are what image.YCbCr holds, which is full range BT.601 +// carrying sRGB primaries and transfer. +const ( + encPrimaries = 1 + encTransfer = 13 + encMatrix = 6 +) + +// alphaURN is the auxiliary type of ISO/IEC 23008-12 Annex F, which names an +// item as the alpha channel of the picture it is tied to. +const alphaURN = "urn:mpeg:hevc:2015:auxid:1" + +// maxBoxOverhead bounds the header bytes before the sample data, so a file +// needing 64 bit box sizes is refused rather than truncated. +const maxBoxOverhead = 1 << 16 + +// defaultTile is what a picture too large for any level is split into. +const defaultTile = 512 + +// ChromaFormat is the chroma sampling [Encode] writes. The zero value is 4:2:0. +type ChromaFormat = hevc.ChromaFormat + +const ( + Chroma420 = hevc.Chroma420 + Chroma422 = hevc.Chroma422 + Chroma444 = hevc.Chroma444 + ChromaGray = hevc.ChromaMono +) + +// EncodeOptions are the encoding parameters. +type EncodeOptions struct { + // Quality in the range [0,100]. Default is DefaultQuality. + Quality int + // Lossless codes the samples as PCM and ignores Quality. + Lossless bool + // Chroma is the sampling to code in. The zero value is 4:2:0. + Chroma ChromaFormat + // BitDepth is the sample size, 8 through 12. The zero value is 8. + BitDepth int + // SAO fits the offsets of 8.7.3 to each coding tree block, for about 2.2x + // the time and 3.5% of the bitrate. + SAO bool + // Tile splits the picture over a grid of items of this many samples each + // way. Zero tiles only a picture too large to code as one. + Tile int + // ICC is a color profile, written alongside the nclx description that + // says how the samples are coded. It aliases the input. + ICC []byte + // Exif is a TIFF payload, written as an Exif item describing the picture. + Exif []byte + // XMP is an XMP packet, written as a metadata item describing the picture. + XMP []byte +} + +// ratioOf is the image.YCbCr subsampling that matches the coded one. Without +// chroma nothing constrains the stored size, which is what 4:4:4 also says. +func ratioOf(c ChromaFormat) image.YCbCrSubsampleRatio { + switch c { + case Chroma422: + return image.YCbCrSubsampleRatio422 + case Chroma444, ChromaGray: + return image.YCbCrSubsampleRatio444 + default: + return image.YCbCrSubsampleRatio420 + } +} + +// Encode writes img to w as a HEIC still. Any image will do; one that is not +// already in [EncodeOptions.Chroma] as an *image.YCbCr is converted. An image +// that carries alpha keeps it, in a monochrome auxiliary item coded at the +// same quality. +func Encode(w io.Writer, img image.Image, opts ...EncodeOptions) error { + var o EncodeOptions + + if len(opts) > 0 { + o = opts[0] + } + + switch { + case o.Quality <= 0: + o.Quality = DefaultQuality + case o.Quality > 100: + o.Quality = 100 + } + + if o.Chroma < Chroma420 || o.Chroma > ChromaGray { + return ErrUnsupported + } + + if o.BitDepth == 0 { + o.BitDepth = 8 + } + + if o.BitDepth < 8 || o.BitDepth > 12 { + return ErrUnsupported + } + + b := img.Bounds() + width, height := b.Dx(), b.Dy() + sw, sh := ratioSub(ratioOf(o.Chroma)) + even := image.Rect(0, 0, roundUp(width, sw), roundUp(height, sh)) + + qp := 51 - o.Quality*50/100 + deep := o.BitDepth > 8 + + var ( + frame hevc.Frame + alpha []uint8 + alpha6 []uint16 + ) + + switch { + case deep: + alpha6 = alphaDeep(img, even, o.BitDepth) + _, y, cb, cr := toDeep(img, ratioOf(o.Chroma), o.BitDepth, alpha6 != nil) + frame = hevc.Frame{Y16: y, StrideY: even.Dx()} + + if o.Chroma != ChromaGray { + frame.Cb16, frame.Cr16, frame.StrideC = cb, cr, even.Dx()/sw + } + case o.Chroma == ChromaGray: + alpha = alphaPlane(img, even) + frame = hevc.Frame{Y: toGray(img, alpha != nil), StrideY: even.Dx()} + default: + alpha = alphaPlane(img, even) + ycc := toYCbCr(img, ratioOf(o.Chroma), alpha != nil) + frame = hevc.Frame{Y: ycc.Y, Cb: ycc.Cb, Cr: ycc.Cr, + StrideY: ycc.YStride, StrideC: ycc.CStride} + } + + stored := image.Point{X: even.Dx(), Y: even.Dy()} + + tile := o.Tile + if tile == 0 && stored.X*stored.Y > hevc.MaxLumaSamples { + tile = defaultTile + } + + if tile != 0 && (tile%sw != 0 || tile%sh != 0 || + tile*tile > hevc.MaxLumaSamples) { + return ErrUnsupported + } + + f := heicFile{size: image.Point{X: width, Y: height}, stored: stored, + gray: o.Chroma == ChromaGray, depth: o.BitDepth, icc: o.ICC} + + src := gridSource{frame: frame, alpha: alpha, alpha6: alpha6, + stored: stored, sw: sw, sh: sh} + + base := hevc.EncoderOptions{Chroma: o.Chroma, BitDepth: o.BitDepth, + QP: qp, Lossless: o.Lossless, SAO: o.SAO} + + if err := f.picture(&src, base, tile); err != nil { + return err + } + + if len(o.Exif) > 0 { + f.meta(encItem{typ: "Exif", name: "exif", data: append(u32(0), o.Exif...)}) + } + + if len(o.XMP) > 0 { + f.meta(encItem{typ: "mime", name: "xmp", mime: xmpContentType, data: o.XMP}) + } + + file, err := f.marshal() + if err != nil { + return err + } + + _, err = w.Write(file) + + return err +} + +// codeItem codes one picture as a complete access unit, and returns the sample +// data its item carries with the parameter sets its hvcC repeats. +func codeItem(opts hevc.EncoderOptions, frame hevc.Frame) ([]byte, []hevc.NALUnit, error) { + enc, err := hevc.NewEncoder(opts) + if err != nil { + return nil, nil, ErrUnsupported + } + + nals, err := enc.Encode(frame) + if err != nil || len(nals) != 4 { + return nil, nil, ErrInvalid + } + + sample := hevc.MarshalNAL(nals[3]) + if uint64(len(sample))+maxBoxOverhead > math.MaxUint32 { + return nil, nil, ErrUnsupported + } + + data := make([]byte, 4, 4+len(sample)) + binary.BigEndian.PutUint32(data, uint32(len(sample))) + + return append(data, sample...), nals[:3], nil +} + +// encItem is one item on its way into the file: what iinf declares, what iloc +// points at, which ipco properties ipma ties to it, and what iref ties it to. +type encItem struct { + id uint16 + typ string + name string + mime string + hidden bool + mono bool + data []byte + assoc []byte + ref string + to []uint16 +} + +// heicFile gathers the items and their properties, so that the boxes naming +// them are written once from one list. +type heicFile struct { + size, stored image.Point + gray bool + depth int + icc []byte + grid bool + tile int + items []encItem + props []byte + nProps byte + colr []byte + shared map[string]byte + ispe byte + ispeTile byte + pixi byte + pixiMono byte + clap byte +} + +// prop appends a property to ipco and returns the one based index ipma names +// it by, with the essential bit of 23008-12 set. +func (f *heicFile) prop(b []byte, essential bool) byte { + f.props = append(f.props, b...) + f.nProps++ + + idx := f.nProps + if essential { + idx |= 0x80 + } + + return idx +} + +// once returns the index of a property already written with the same bytes, so +// that the tiles of a grid share one decoder configuration record. +func (f *heicFile) once(b []byte, essential bool) byte { + if f.shared == nil { + f.shared = map[string]byte{} + } + + if idx, ok := f.shared[string(b)]; ok { + return idx + } + + idx := f.prop(b, essential) + f.shared[string(b)] = idx + + return idx +} + +// sizeProp is the ispe of one size, kept so that every tile shares one. +func (f *heicFile) sizeProp(idx *byte, w, h int) byte { + if *idx == 0 { + *idx = f.prop(fullBox("ispe", 0, 0, append(u32(uint32(w)), u32(uint32(h))...)), true) + } + + return *idx +} + +// colorProps is the nclx description of the samples and, beside it, whatever +// profile says what they mean. +func (f *heicFile) colorProps() []byte { + if f.colr == nil { + f.colr = []byte{f.prop(box("colr", + append(append(append([]byte("nclx"), u16(encPrimaries)...), + u16(encTransfer)...), append(u16(encMatrix), 0x80)...)), false)} + + if len(f.icc) > 0 { + f.colr = append(f.colr, + f.prop(box("colr", append([]byte("prof"), f.icc...)), false)) + } + } + + return f.colr +} + +// pixiProp is the sample size of a component count, one property per count. +func (f *heicFile) pixiProp(mono bool) byte { + depth := byte(max(f.depth, 8)) + + idx, body := &f.pixi, []byte{3, depth, depth, depth} + if mono || f.gray { + idx, body = &f.pixiMono, []byte{1, depth} + } + + if *idx == 0 { + *idx = f.prop(fullBox("pixi", 0, 0, body), true) + } + + return *idx +} + +// add appends an item with the properties its part calls for: a grid describes +// the picture, a tile describes only itself, and a lone picture does both. +func (f *heicFile) add(it encItem, params []hevc.NALUnit) { + tile := it.typ == "hvc1" && f.grid + + if tile { + it.assoc = []byte{f.sizeProp(&f.ispeTile, f.tile, f.tile), f.pixiProp(it.mono)} + } else { + it.assoc = []byte{f.sizeProp(&f.ispe, f.size.X, f.size.Y), f.pixiProp(it.mono)} + } + + if config, err := marshalHvcC(params); err == nil { + it.assoc = append(it.assoc, f.once(box("hvcC", config), true)) + } + + switch { + case it.mono: + it.assoc = append(it.assoc, + f.once(fullBox("auxC", 0, 0, append([]byte(alphaURN), 0)), true)) + case !tile: + it.assoc = append(it.assoc, f.colorProps()...) + } + + // A grid names its own output size, so only a lone picture needs the clean + // aperture that takes the repeated edge back off. + if !f.grid && f.clap == 0 && f.stored != f.size { + f.clap = f.prop(box("clap", clapData(f.size)), false) + } + + if f.clap != 0 && !tile { + it.assoc = append(it.assoc, f.clap) + } + + f.items = append(f.items, it) +} + +// meta appends a metadata item, which describes the picture and carries no +// properties of its own. +func (f *heicFile) meta(it encItem) { + it.id = uint16(len(f.items)) + 1 + it.ref, it.to = "cdsc", []uint16{1} + + f.items = append(f.items, it) +} + +func (f *heicFile) marshal() ([]byte, error) { + ftyp := box("ftyp", []byte("heic\x00\x00\x00\x00mif1heic")) + + var data []byte + for _, it := range f.items { + data = append(data, it.data...) + } + + meta, err := f.metaBox(0) + if err != nil { + return nil, err + } + + meta, err = f.metaBox(uint64(len(ftyp) + len(meta) + 8)) + if err != nil { + return nil, err + } + + return append(append(ftyp, meta...), box("mdat", data)...), nil +} + +func (f *heicFile) metaBox(offset uint64) ([]byte, error) { + // ipma names a property by seven bits, so a file wanting more of them than + // that is refused rather than written with the indices wrapped. + if f.nProps > 0x7f { + return nil, ErrUnsupported + } + + hdlr := fullBox("hdlr", 0, 0, append([]byte("\x00\x00\x00\x00pict"), make([]byte, 13)...)) + pitm := fullBox("pitm", 0, 0, u16(1)) + + var ( + infes []byte + ilocs []byte + irefs []byte + ipmas []byte + assoc int + ) + + for _, it := range f.items { + flags := uint32(0) + if it.hidden { + flags = 1 + } + + entry := append(u16(it.id), 0, 0) + entry = append(entry, it.typ...) + entry = append(entry, it.name...) + entry = append(entry, 0) + + if it.typ == "mime" { + entry = append(entry, it.mime...) + entry = append(entry, 0, 0) + } + + infes = append(infes, fullBox("infe", 2, flags, entry)...) + + if uint64(len(it.data))+offset > math.MaxUint32 { + return nil, ErrUnsupported + } + + ilocs = append(ilocs, u16(it.id)...) + ilocs = append(ilocs, u16(0)...) + ilocs = append(ilocs, u16(1)...) + ilocs = append(ilocs, u32(uint32(offset))...) + ilocs = append(ilocs, u32(uint32(len(it.data)))...) + offset += uint64(len(it.data)) + + if it.ref != "" { + body := append(u16(it.id), u16(uint16(len(it.to)))...) + + for _, to := range it.to { + body = append(body, u16(to)...) + } + + irefs = append(irefs, box(it.ref, body)...) + } + + if len(it.assoc) == 0 { + continue + } + + ipmas = append(ipmas, u16(it.id)...) + ipmas = append(ipmas, byte(len(it.assoc))) + ipmas = append(ipmas, it.assoc...) + assoc++ + } + + iinf := fullBox("iinf", 0, 0, append(u16(uint16(len(f.items))), infes...)) + locs := append(u16(uint16(len(f.items))), ilocs...) + iloc := fullBox("iloc", 0, 0, append([]byte{0x44, 0}, locs...)) + iprp := box("iprp", append(box("ipco", f.props), + fullBox("ipma", 0, 0, append(u32(uint32(assoc)), ipmas...))...)) + + meta := append(hdlr, pitm...) + meta = append(meta, iinf...) + meta = append(meta, iloc...) + + if irefs != nil { + meta = append(meta, fullBox("iref", 0, 0, irefs)...) + } + + meta = append(meta, iprp...) + + return fullBox("meta", 0, 0, meta), nil +} + +// clapData is the CleanApertureBox naming the whole of the image ispe +// describes. It is what makes a reader take the stored picture down to that +// size rather than hand back the repeated edge with it. +func clapData(size image.Point) []byte { + var out []byte + + for _, v := range [8]int32{int32(size.X), 1, int32(size.Y), 1, 0, 1, 0, 1} { + out = append(out, u32(uint32(v))...) + } + + return out +} + +// marshalHvcC writes the HEVCDecoderConfigurationRecord. ISO/IEC 14496-15 +// requires its profile, tier and level to be the sequence parameter set's own. +func marshalHvcC(params []hevc.NALUnit) ([]byte, error) { + var ( + ptl []byte + sps []byte + ) + + for _, nal := range params { + if nal.Type != hevc.NALSPS { + continue + } + + b, ok := hevc.ProfileTierLevel(nal.RBSP) + if !ok { + return nil, ErrInvalid + } + + ptl, sps = b, nal.RBSP + } + + if ptl == nil { + return nil, ErrInvalid + } + + chroma, depthY, depthC, ok := hevc.SPSFormat(sps) + if !ok { + return nil, ErrInvalid + } + + out := append([]byte{1}, ptl...) + out = append(out, 0xf0, 0, 0xfc, + 0xfc|byte(chroma), + 0xf8|byte(depthY-8), + 0xf8|byte(depthC-8), + 0, 0, 0x0f, 3) + + for _, nal := range params { + data := hevc.MarshalNAL(nal) + if len(data) > 0xffff { + return nil, ErrInvalid + } + + out = append(out, 0x80|byte(nal.Type), 0, 1) + out = append(out, u16(uint16(len(data)))...) + out = append(out, data...) + } + + return out, nil +} + +func box(typ string, data []byte) []byte { + out := make([]byte, 8, 8+len(data)) + binary.BigEndian.PutUint32(out, uint32(8+len(data))) + copy(out[4:], typ) + + return append(out, data...) +} + +func fullBox(typ string, version uint8, flags uint32, data []byte) []byte { + return box(typ, append([]byte{version, byte(flags >> 16), byte(flags >> 8), byte(flags)}, data...)) +} + +func u16(v uint16) []byte { + out := make([]byte, 2) + binary.BigEndian.PutUint16(out, v) + + return out +} + +func u32(v uint32) []byte { + out := make([]byte, 4) + binary.BigEndian.PutUint32(out, v) + + return out +} diff --git a/third_party/h265/heic/exif.go b/third_party/h265/heic/exif.go new file mode 100644 index 00000000..efdcaf7a --- /dev/null +++ b/third_party/h265/heic/exif.go @@ -0,0 +1,504 @@ +package heic + +import ( + "encoding/binary" + "errors" + "io" + "slices" +) + +// ErrNoExif is returned when the file carries no Exif item. +var ErrNoExif = errors.New("heic: no exif data") + +// ErrNoXMP is returned when the file carries no XMP item. +var ErrNoXMP = errors.New("heic: no xmp data") + +const xmpContentType = "application/rdf+xml" + +// Exif holds the Exif metadata decoded from an HEIC image. +type Exif struct { + // Orientation is the Exif orientation, 1 to 8, where 1 is upright. + Orientation int + // Width and Height are the dimensions the Exif tags report, which need + // not be the dimensions the image decodes to. + Width int + Height int + + // Make and Model name the camera, Software what wrote the file. + Make string + Model string + Software string + + // DateTime and DateTimeOriginal are "YYYY:MM:DD HH:MM:SS", the first the + // file's own time and the second the time the photo was taken. + DateTime string + DateTimeOriginal string + + // ExposureTime is in seconds and FocalLength in millimetres. + ExposureTime float64 + FNumber float64 + ISOSpeed int + FocalLength float64 + Flash int + + // GPSLatitude and GPSLongitude are decimal degrees, positive north and + // east. GPSAltitude is metres above sea level. + GPSLatitude float64 + GPSLongitude float64 + GPSAltitude float64 + + Copyright string + Artist string +} + +// DecodeExif reads the Exif metadata of an HEIC image. Tags the file omits +// stay zero. It returns ErrNoExif when the file carries no Exif item. +func DecodeExif(r io.Reader) (*Exif, error) { + tiff, err := RawExif(r) + if err != nil { + return nil, err + } + + exif := &Exif{Orientation: 1} + if err := parseExifData(tiff, exif); err != nil { + return nil, err + } + + return exif, nil +} + +// RawExif returns the TIFF payload of the Exif item, without the +// exif_tiff_header_offset the HEIC container puts in front of it. It aliases a +// buffered input rather than copying it, so it must not be written to. +func RawExif(r io.Reader) ([]byte, error) { + f, err := readFile(r) + if err != nil { + return nil, err + } + + it := f.descItem("Exif", "") + if it == nil { + return nil, ErrNoExif + } + b, err := f.meta.data(it, f.src) + if err != nil { + return nil, err + } + tiff := exifTIFF(b) + if tiff == nil { + return nil, ErrNoExif + } + + return tiff, nil +} + +// RawXMP returns the XMP packet of the file. It aliases a buffered input +// rather than copying it, so it must not be written to. +func RawXMP(r io.Reader) ([]byte, error) { + f, err := readFile(r) + if err != nil { + return nil, err + } + + it := f.descItem("mime", xmpContentType) + if it == nil { + return nil, ErrNoXMP + } + + return f.meta.data(it, f.src) +} + +func readFile(r io.Reader) (*file, error) { + src, err := srcFor(r) + if err != nil { + return nil, err + } + + return parse(src) +} + +// descItem finds the metadata item describing the primary image. A file with +// no image item at all still gives up its metadata. +func (f *file) descItem(typ, contentType string) *item { + m := f.meta + if m == nil { + return nil + } + primary, _ := f.primary() + + for _, id := range m.order { + it := m.items[id] + if it == nil || it.typ != typ || it.unsupported { + continue + } + if it.contentType != contentType { + continue + } + if primary != nil && !slices.Contains(m.refsTo("cdsc", it.id), primary.id) { + continue + } + + return it + } + + return nil +} + +func isTIFFHeader(b []byte) bool { + if len(b) < 4 { + return false + } + + return (b[0] == 'I' && b[1] == 'I' && b[2] == 42 && b[3] == 0) || + (b[0] == 'M' && b[1] == 'M' && b[2] == 0 && b[3] == 42) +} + +// exifTIFF strips the exif_tiff_header_offset of ISO/IEC 23008-12 Annex A.2.1. +// A file that gets the offset wrong still parses, from the header found by +// scanning, which is the offset the writer should have signalled. +func exifTIFF(b []byte) []byte { + if len(b) < 4 { + return nil + } + off := uint64(binary.BigEndian.Uint32(b)) + b = b[4:] + + if off <= uint64(len(b)) && isTIFFHeader(b[off:]) { + return b[off:] + } + for i := range b { + if isTIFFHeader(b[i:]) { + return b[i:] + } + } + + return nil +} + +const ( + tagOrientation = 0x0112 + tagImageWidth = 0x0100 + tagImageLength = 0x0101 + tagMake = 0x010F + tagModel = 0x0110 + tagSoftware = 0x0131 + tagDateTime = 0x0132 + tagArtist = 0x013B + tagCopyright = 0x8298 + tagExifIFDPointer = 0x8769 + tagGPSIFDPointer = 0x8825 + + tagExposureTime = 0x829A + tagFNumber = 0x829D + tagISOSpeedRatings = 0x8827 + tagDateTimeOriginal = 0x9003 + tagFlash = 0x9209 + tagFocalLength = 0x920A + + tagGPSLatitudeRef = 0x0001 + tagGPSLatitude = 0x0002 + tagGPSLongitudeRef = 0x0003 + tagGPSLongitude = 0x0004 + tagGPSAltitudeRef = 0x0005 + tagGPSAltitude = 0x0006 +) + +const ( + typeUnsignedByte = 1 + typeASCIIString = 2 + typeUnsignedShort = 3 + typeUnsignedLong = 4 + typeUnsignedRational = 5 + typeSignedByte = 6 + typeUndefined = 7 + typeSignedShort = 8 + typeSignedLong = 9 + typeSignedRational = 10 + typeSingleFloat = 11 + typeDoubleFloat = 12 +) + +type exifReader struct { + data []byte + littleEndian bool +} + +func (r *exifReader) uint16(offset int) uint16 { + if offset < 0 || offset+1 >= len(r.data) { + return 0 + } + if r.littleEndian { + return uint16(r.data[offset]) | uint16(r.data[offset+1])<<8 + } + + return uint16(r.data[offset])<<8 | uint16(r.data[offset+1]) +} + +func (r *exifReader) uint32(offset int) uint32 { + if offset < 0 || offset+3 >= len(r.data) { + return 0 + } + if r.littleEndian { + return uint32(r.data[offset]) | uint32(r.data[offset+1])<<8 | + uint32(r.data[offset+2])<<16 | uint32(r.data[offset+3])<<24 + } + + return uint32(r.data[offset])<<24 | uint32(r.data[offset+1])<<16 | + uint32(r.data[offset+2])<<8 | uint32(r.data[offset+3]) +} + +func (r *exifReader) readString(offset, maxLen int) string { + if offset < 0 || offset >= len(r.data) { + return "" + } + end := offset + for end < len(r.data) && end < offset+maxLen && r.data[end] != 0 { + end++ + } + + return string(r.data[offset:end]) +} + +func (r *exifReader) readRational(offset int) float64 { + if offset < 0 || offset+7 >= len(r.data) { + return 0 + } + num, den := r.uint32(offset), r.uint32(offset+4) + if den == 0 { + return 0 + } + + return float64(num) / float64(den) +} + +func parseExifData(data []byte, exif *Exif) error { + if len(data) < 8 { + return errors.New("heic: exif data too short") + } + + r := &exifReader{data: data} + switch { + case data[0] == 'I' && data[1] == 'I': + r.littleEndian = true + case data[0] == 'M' && data[1] == 'M': + default: + return errors.New("heic: invalid exif byte order marker") + } + + if r.uint16(2) != 42 { + return errors.New("heic: invalid exif magic number") + } + + ifdOffset := r.uint32(4) + if ifdOffset < 8 || int(ifdOffset) >= len(data) { + return errors.New("heic: invalid exif ifd offset") + } + + exifIFDOffset, gpsIFDOffset := parseIFD(r, int(ifdOffset), exif) + if exifIFDOffset > 0 { + parseExifSubIFD(r, exifIFDOffset, exif) + } + if gpsIFDOffset > 0 { + parseGPSSubIFD(r, gpsIFDOffset, exif) + } + + return nil +} + +// eachEntry walks the entries of an IFD, resolving each value to its offset. +func eachEntry(r *exifReader, offset int, fn func(tag, dataType uint16, count uint32, valueOffset int)) { + if offset < 0 || offset+1 >= len(r.data) { + return + } + + n := int(r.uint16(offset)) + offset += 2 + + for i := range n { + entry := offset + i*12 + if entry+11 >= len(r.data) { + break + } + + tag := r.uint16(entry) + dataType := r.uint16(entry + 2) + count := r.uint32(entry + 4) + valueOffset := entry + 8 + + if getDataSize(dataType, count) > 4 { + valueOffset = int(r.uint32(valueOffset)) + if valueOffset >= len(r.data) { + continue + } + } + + fn(tag, dataType, count, valueOffset) + } +} + +func parseIFD(r *exifReader, offset int, exif *Exif) (exifIFDOffset, gpsIFDOffset int) { + eachEntry(r, offset, func(tag, dataType uint16, count uint32, valueOffset int) { + switch tag { + case tagOrientation: + if dataType == typeUnsignedShort { + exif.Orientation = int(r.uint16(valueOffset)) + } + case tagImageWidth: + switch dataType { + case typeUnsignedShort: + exif.Width = int(r.uint16(valueOffset)) + case typeUnsignedLong: + exif.Width = int(r.uint32(valueOffset)) + } + case tagImageLength: + switch dataType { + case typeUnsignedShort: + exif.Height = int(r.uint16(valueOffset)) + case typeUnsignedLong: + exif.Height = int(r.uint32(valueOffset)) + } + case tagMake: + if dataType == typeASCIIString { + exif.Make = r.readString(valueOffset, int(count)) + } + case tagModel: + if dataType == typeASCIIString { + exif.Model = r.readString(valueOffset, int(count)) + } + case tagSoftware: + if dataType == typeASCIIString { + exif.Software = r.readString(valueOffset, int(count)) + } + case tagDateTime: + if dataType == typeASCIIString { + exif.DateTime = r.readString(valueOffset, int(count)) + } + case tagArtist: + if dataType == typeASCIIString { + exif.Artist = r.readString(valueOffset, int(count)) + } + case tagCopyright: + if dataType == typeASCIIString { + exif.Copyright = r.readString(valueOffset, int(count)) + } + case tagExifIFDPointer: + if dataType == typeUnsignedLong { + exifIFDOffset = int(r.uint32(valueOffset)) + } + case tagGPSIFDPointer: + if dataType == typeUnsignedLong { + gpsIFDOffset = int(r.uint32(valueOffset)) + } + } + }) + + return exifIFDOffset, gpsIFDOffset +} + +func parseExifSubIFD(r *exifReader, offset int, exif *Exif) { + eachEntry(r, offset, func(tag, dataType uint16, count uint32, valueOffset int) { + switch tag { + case tagExposureTime: + if dataType == typeUnsignedRational { + exif.ExposureTime = r.readRational(valueOffset) + } + case tagFNumber: + if dataType == typeUnsignedRational { + exif.FNumber = r.readRational(valueOffset) + } + case tagISOSpeedRatings: + if dataType == typeUnsignedShort { + exif.ISOSpeed = int(r.uint16(valueOffset)) + } + case tagDateTimeOriginal: + if dataType == typeASCIIString { + exif.DateTimeOriginal = r.readString(valueOffset, int(count)) + } + case tagFlash: + if dataType == typeUnsignedShort { + exif.Flash = int(r.uint16(valueOffset)) + } + case tagFocalLength: + if dataType == typeUnsignedRational { + exif.FocalLength = r.readRational(valueOffset) + } + } + }) +} + +func parseGPSSubIFD(r *exifReader, offset int, exif *Exif) { + var latRef, lonRef string + var lat, lon []float64 + var altRef uint8 + + eachEntry(r, offset, func(tag, dataType uint16, count uint32, valueOffset int) { + switch tag { + case tagGPSLatitudeRef: + if dataType == typeASCIIString { + latRef = r.readString(valueOffset, 2) + } + case tagGPSLatitude: + if dataType == typeUnsignedRational && count == 3 { + lat = []float64{ + r.readRational(valueOffset), + r.readRational(valueOffset + 8), + r.readRational(valueOffset + 16), + } + } + case tagGPSLongitudeRef: + if dataType == typeASCIIString { + lonRef = r.readString(valueOffset, 2) + } + case tagGPSLongitude: + if dataType == typeUnsignedRational && count == 3 { + lon = []float64{ + r.readRational(valueOffset), + r.readRational(valueOffset + 8), + r.readRational(valueOffset + 16), + } + } + case tagGPSAltitudeRef: + if dataType == typeUnsignedByte && valueOffset < len(r.data) { + altRef = r.data[valueOffset] + } + case tagGPSAltitude: + if dataType == typeUnsignedRational { + exif.GPSAltitude = r.readRational(valueOffset) + } + } + }) + + if altRef == 1 { + exif.GPSAltitude = -exif.GPSAltitude + } + if len(lat) == 3 { + exif.GPSLatitude = lat[0] + lat[1]/60 + lat[2]/3600 + if latRef == "S" { + exif.GPSLatitude = -exif.GPSLatitude + } + } + if len(lon) == 3 { + exif.GPSLongitude = lon[0] + lon[1]/60 + lon[2]/3600 + if lonRef == "W" { + exif.GPSLongitude = -exif.GPSLongitude + } + } +} + +func getDataSize(dataType uint16, count uint32) int { + var size int + switch dataType { + case typeUnsignedByte, typeSignedByte, typeASCIIString, typeUndefined: + size = 1 + case typeUnsignedShort, typeSignedShort: + size = 2 + case typeUnsignedLong, typeSignedLong, typeSingleFloat: + size = 4 + case typeUnsignedRational, typeSignedRational, typeDoubleFloat: + size = 8 + default: + size = 1 + } + + return size * int(count) +} diff --git a/third_party/h265/heic/grid.go b/third_party/h265/heic/grid.go new file mode 100644 index 00000000..ffd00e8b --- /dev/null +++ b/third_party/h265/heic/grid.go @@ -0,0 +1,358 @@ +package heic + +import ( + "sync" + "sync/atomic" + + "github.com/gen2brain/h265/hevc" +) + +type gridInfo struct { + rows, cols int + w, h int +} + +func parseGrid(b []byte) (gridInfo, error) { + r := &reader{b: b} + r.u8() + + flags := r.u8() + + var g gridInfo + + g.rows = int(r.u8()) + 1 + g.cols = int(r.u8()) + 1 + + if flags&1 != 0 { + g.w, g.h = int(r.u32()), int(r.u32()) + } else { + g.w, g.h = int(r.u16()), int(r.u16()) + } + + if r.err || g.w <= 0 || g.h <= 0 { + return g, ErrInvalid + } + + return g, nil +} + +func (f *file) gridOf(it *item) (gridInfo, []uint32, error) { + data, err := f.meta.data(it, f.src) + if err != nil { + return gridInfo{}, nil, err + } + + g, err := parseGrid(data) + if err != nil { + return gridInfo{}, nil, err + } + + tiles := f.meta.refsTo("dimg", it.id) + if len(tiles) != g.rows*g.cols { + return gridInfo{}, nil, ErrInvalid + } + + return g, tiles, nil +} + +// decodeImage decodes an item, stitching the tiles first when it is a grid. +func (f *file) decodeImage(it *item) (*hevc.Picture, error) { + if it.unsupported { + return nil, ErrUnsupported + } + + if it.typ != "grid" { + var dec itemDecoder + + return f.decodeItem(dec.use(f.workers(0)), it) + } + + g, tiles, err := f.gridOf(it) + if err != nil { + return nil, err + } + + if n := f.limit(); n > 0 && uint64(g.w)*uint64(g.h) > uint64(n) { + return nil, ErrUnsupported + } + + return f.decodeTiles(g, tiles) +} + +// decodeTiles decodes the tiles and copies each into its place in the output. +func (f *file) decodeTiles(g gridInfo, tiles []uint32) (*hevc.Picture, error) { + if len(tiles) == 0 { + return nil, ErrInvalid + } + + var ( + out *hevc.Picture + tw, th int + ready = make(chan struct{}) + next atomic.Int64 + fail atomic.Pointer[error] + wg sync.WaitGroup + ) + + setErr := func(err error) { fail.CompareAndSwap(nil, &err) } + + next.Store(1) + + // The tiles already spread across the budget, so each one's wavefront + // takes only what is left over rather than multiplying it. + tileWorkers := f.workers(len(tiles)) + perTile := max(f.workers(0)/tileWorkers, 1) + + for range tileWorkers - 1 { + wg.Add(1) + + go func() { + defer wg.Done() + + var dec itemDecoder + + dec.use(perTile) + + for { + i := int(next.Add(1)) - 1 + if i >= len(tiles) || fail.Load() != nil { + return + } + + p, err := f.decodeTile(&dec, tiles[i]) + if err != nil { + setErr(err) + + return + } + + <-ready + + if fail.Load() != nil { + p.Release() + + return + } + + if p.CropW != tw || p.CropH != th || + p.ChromaFormat != out.ChromaFormat || p.BitDepth != out.BitDepth { + p.Release() + setErr(ErrInvalid) + + return + } + + blit(out, p, g, i, tw, th) + p.Release() + } + }() + } + + var dec itemDecoder + + dec.use(perTile) + + func() { + defer close(ready) + + p, err := f.decodeTile(&dec, tiles[0]) + if err != nil { + setErr(err) + + return + } + + defer p.Release() + + tw, th = p.CropW, p.CropH + if tw*g.cols < g.w || th*g.rows < g.h || + tw*(g.cols-1) >= g.w || th*(g.rows-1) >= g.h { + setErr(ErrInvalid) + + return + } + + out = newGrid(p, g) + + blit(out, p, g, 0, tw, th) + }() + + for fail.Load() == nil { + i := int(next.Add(1)) - 1 + if i >= len(tiles) { + break + } + + p, err := f.decodeTile(&dec, tiles[i]) + if err != nil { + setErr(err) + + break + } + + if p.CropW != tw || p.CropH != th || + p.ChromaFormat != out.ChromaFormat || p.BitDepth != out.BitDepth { + p.Release() + setErr(ErrInvalid) + + break + } + + blit(out, p, g, i, tw, th) + p.Release() + } + + wg.Wait() + + if err := fail.Load(); err != nil { + return nil, *err + } + + return out, nil +} + +func (f *file) decodeTile(dec *itemDecoder, id uint32) (*hevc.Picture, error) { + t := f.meta.items[id] + if t == nil { + return nil, ErrInvalid + } + + return f.decodeItem(dec, t) +} + +// newGrid allocates the stitched picture, which may be smaller than the tiles +// cover. +func newGrid(first *hevc.Picture, g gridInfo) *hevc.Picture { + sw, sh := subsampling(first.ChromaFormat) + + out := &hevc.Picture{ + Width: g.w, + Height: g.h, + CropW: g.w, + CropH: g.h, + ChromaFormat: first.ChromaFormat, + BitDepth: first.BitDepth, + StrideY: g.w, + } + + if first.ChromaFormat != 0 { + out.WidthC = (g.w + sw - 1) / sw + out.HeightC = (g.h + sh - 1) / sh + out.StrideC = out.WidthC + } + + if first.BitDepth > 8 { + out.Y16 = make([]uint16, out.StrideY*g.h) + out.Cb16 = make([]uint16, out.StrideC*out.HeightC) + out.Cr16 = make([]uint16, out.StrideC*out.HeightC) + + return out + } + + out.Y = make([]uint8, out.StrideY*g.h) + out.Cb = make([]uint8, out.StrideC*out.HeightC) + out.Cr = make([]uint8, out.StrideC*out.HeightC) + + return out +} + +func subsampling(chromaFormat int) (int, int) { + switch chromaFormat { + case 1: + return 2, 2 + case 2: + return 2, 1 + } + + return 1, 1 +} + +// blit copies tile i of the grid into its place in out. +func blit(out, p *hevc.Picture, g gridInfo, i, tw, th int) { + sw, sh := subsampling(out.ChromaFormat) + row, col := i/g.cols, i%g.cols + + for pl := range 3 { + sx, sy := col*tw, row*th + cw, ch := tw, th + ow, oh := g.w, g.h + ss, ds := p.StrideY, out.StrideY + sox, soy := p.CropX, p.CropY + + if pl != 0 { + if out.ChromaFormat == 0 { + return + } + + sx, sy = sx/sw, sy/sh + cw, ch = cw/sw, ch/sh + ow, oh = out.WidthC, out.HeightC + ss, ds = p.StrideC, out.StrideC + sox, soy = sox/sw, soy/sh + } + + cw = min(cw, ow-sx) + ch = min(ch, oh-sy) + + if cw <= 0 || ch <= 0 { + continue + } + + if out.BitDepth > 8 { + src, dst := planes16(p, out, pl) + for y := range ch { + copy(dst[(sy+y)*ds+sx:][:cw], src[(soy+y)*ss+sox:][:cw]) + } + + continue + } + + src, dst := planes8(p, out, pl) + for y := range ch { + copy(dst[(sy+y)*ds+sx:][:cw], src[(soy+y)*ss+sox:][:cw]) + } + } +} + +func planes8(src, dst *hevc.Picture, pl int) ([]uint8, []uint8) { + switch pl { + case 0: + return src.Y, dst.Y + case 1: + return src.Cb, dst.Cb + default: + return src.Cr, dst.Cr + } +} + +func planes16(src, dst *hevc.Picture, pl int) ([]uint16, []uint16) { + switch pl { + case 0: + return src.Y16, dst.Y16 + case 1: + return src.Cb16, dst.Cb16 + default: + return src.Cr16, dst.Cr16 + } +} + +// gridAlpha assembles a grid's alpha from the auxiliary items on its tiles. +func (f *file) gridAlpha(it *item) (*hevc.Picture, error) { + g, tiles, err := f.gridOf(it) + if err != nil { + return nil, err + } + + alpha := make([]uint32, len(tiles)) + + for i, id := range tiles { + a := f.alphaOf(id) + if a == nil { + return nil, nil + } + + alpha[i] = a.id + } + + return f.decodeTiles(g, alpha) +} diff --git a/third_party/h265/heic/gridenc.go b/third_party/h265/heic/gridenc.go new file mode 100644 index 00000000..c2b40e29 --- /dev/null +++ b/third_party/h265/heic/gridenc.go @@ -0,0 +1,176 @@ +package heic + +import ( + "image" + + "github.com/gen2brain/h265/hevc" +) + +// samples is what a plane holds either side of eight bits. +type samples interface{ ~uint8 | ~uint16 } + +// gridSource is the converted picture a grid is cut from. +type gridSource struct { + frame hevc.Frame + alpha []uint8 + alpha6 []uint16 + stored image.Point + sw, sh int +} + +// picture writes one item, or a grid of tiles and the item assembling them. +func (f *heicFile) picture(src *gridSource, base hevc.EncoderOptions, tile int) error { + if tile == 0 { + return f.single(src, base) + } + + cols := (src.stored.X + tile - 1) / tile + rows := (src.stored.Y + tile - 1) / tile + + if rows > 256 || cols > 256 || rows*cols*2+2 > 0xffff { + return ErrUnsupported + } + + // 6.6.2.3.1 clips the tiles to the size the grid names, so all are equal. + desc := []byte{0, 1, byte(rows - 1), byte(cols - 1)} + desc = append(desc, u32(uint32(f.size.X))...) + desc = append(desc, u32(uint32(f.size.Y))...) + + f.grid, f.tile = true, tile + f.add(encItem{id: 1, typ: "grid", name: "grid", data: desc, ref: "dimg"}, nil) + + base.Width, base.Height = tile, tile + + for i := range rows * cols { + x0, y0 := i%cols*tile, i/cols*tile + + sample, params, err := codeItem(base, src.tile(x0, y0, tile, false)) + if err != nil { + return err + } + + id := uint16(2 + i) + f.items[0].to = append(f.items[0].to, id) + f.add(encItem{id: id, typ: "hvc1", name: "tile", hidden: true, + data: sample}, params) + } + + if src.alpha == nil && src.alpha6 == nil { + return nil + } + + // Annex F ties the alpha to each tile rather than to the grid. + alpha := base + alpha.Chroma = hevc.ChromaMono + + for i := range rows * cols { + x0, y0 := i%cols*tile, i/cols*tile + + sample, params, err := codeItem(alpha, src.tile(x0, y0, tile, true)) + if err != nil { + return err + } + + f.add(encItem{id: uint16(2 + rows*cols + i), typ: "hvc1", name: "alpha", + hidden: true, mono: true, data: sample, + ref: "auxl", to: []uint16{uint16(2 + i)}}, params) + } + + return nil +} + +// single writes the one item a picture that fits a level takes. +func (f *heicFile) single(src *gridSource, base hevc.EncoderOptions) error { + base.Width, base.Height = src.stored.X, src.stored.Y + + sample, params, err := codeItem(base, src.frame) + if err != nil { + return err + } + + f.add(encItem{id: 1, typ: "hvc1", name: "image", data: sample}, params) + + if src.alpha == nil && src.alpha6 == nil { + return nil + } + + alpha := base + alpha.Chroma = hevc.ChromaMono + + sample, params, err = codeItem(alpha, hevc.Frame{ + Y: src.alpha, Y16: src.alpha6, StrideY: src.stored.X, + }) + if err != nil { + return err + } + + f.add(encItem{id: 2, typ: "hvc1", name: "alpha", hidden: true, mono: true, + data: sample, ref: "auxl", to: []uint16{1}}, params) + + return nil +} + +// tile cuts one tile out, repeating the edge where the grid reaches past it. +func (g *gridSource) tile(x0, y0, n int, alpha bool) hevc.Frame { + if alpha { + if g.alpha6 != nil { + return hevc.Frame{StrideY: n, + Y16: cutTile(g.alpha6, g.stored.X, g.stored.X, g.stored.Y, x0, y0, n, n)} + } + + return hevc.Frame{StrideY: n, + Y: cutTile(g.alpha, g.stored.X, g.stored.X, g.stored.Y, x0, y0, n, n)} + } + + f := g.frame + w, h := g.stored.X, g.stored.Y + cw, ch := w/g.sw, h/g.sh + cn := n / g.sw + cnh := n / g.sh + + if f.Y16 != nil { + out := hevc.Frame{StrideY: n, + Y16: cutTile(f.Y16, f.StrideY, w, h, x0, y0, n, n)} + + if f.Cb16 != nil { + out.StrideC = cn + out.Cb16 = cutTile(f.Cb16, f.StrideC, cw, ch, x0/g.sw, y0/g.sh, cn, cnh) + out.Cr16 = cutTile(f.Cr16, f.StrideC, cw, ch, x0/g.sw, y0/g.sh, cn, cnh) + } + + return out + } + + out := hevc.Frame{StrideY: n, Y: cutTile(f.Y, f.StrideY, w, h, x0, y0, n, n)} + + if f.Cb != nil { + out.StrideC = cn + out.Cb = cutTile(f.Cb, f.StrideC, cw, ch, x0/g.sw, y0/g.sh, cn, cnh) + out.Cr = cutTile(f.Cr, f.StrideC, cw, ch, x0/g.sw, y0/g.sh, cn, cnh) + } + + return out +} + +// cutTile copies a tw by th rectangle out of a plane, clamping to its edge. +func cutTile[P samples](src []P, stride, w, h, x0, y0, tw, th int) []P { + out := make([]P, tw*th) + + for y := range th { + row := src[min(y0+y, h-1)*stride:] + dst := out[y*tw:] + + n := min(tw, w-x0) + if n > 0 { + copy(dst[:n], row[x0:x0+n]) + } else { + n = 0 + } + + for x := n; x < tw; x++ { + dst[x] = row[w-1] + } + } + + return out +} diff --git a/third_party/h265/heic/heic.go b/third_party/h265/heic/heic.go new file mode 100644 index 00000000..07d3a21c --- /dev/null +++ b/third_party/h265/heic/heic.go @@ -0,0 +1,748 @@ +/* +Package heic decodes HEIF images that carry HEVC-coded item data, the format +commonly called HEIC, and writes them. + +# Color + +[Decode] returns RGB, converted with the matrix and range the file declares in +its nclx color description. [Options.ToYCbCr] skips that and hands back the +planes the bitstream carries: *[image.YCbCr], *[image.NYCbCrA] with alpha, or +*[image.Gray] for monochrome. Above 8 bits there is no such image type, so +*[image.NRGBA64] is returned anyway. + +[image.YCbCr] reads its planes as full-range BT.601 whatever the file signals, +which is rarely what a HEIC file means. [DecodeColor] reports what they +actually are, so ToYCbCr is for reaching the samples rather than for display: + + img, ci, err := heic.DecodeColor(r, heic.Options{ToYCbCr: true}) + +[ColorInfo] carries the CICP code points and the range flag, plus the ICC +profile when the file has one. Matrix and FullRange are what the conversion to +RGB uses. Primaries and Transfer are reported but not applied, so RGB output +stays in the file's own color space. + +# Encoding + +[Encode] writes any image as a HEIC still. One that is not already an 8-bit +*[image.YCbCr] at [EncodeOptions.Chroma] is converted, and the file carries an +nclx description of what [image.YCbCr] holds: full-range BT.601 carrying sRGB +primaries and transfer. [EncodeOptions.Quality] selects the quantiser and +[EncodeOptions.Lossless] codes the samples as PCM instead. [Chroma420], +[Chroma422], [Chroma444] and [ChromaGray] are the samplings it writes. + +An image that carries alpha keeps it. The channel becomes a monochrome +auxiliary item coded at the same quality, and the colour is written +un-composited so that a reader gets both back. An opaque image writes no such +item. [EncodeOptions.Exif] and [EncodeOptions.XMP] add metadata items +describing the picture, and [EncodeOptions.ICC] a colour profile beside the +nclx description rather than instead of it. [EncodeOptions.SAO] fits an +offset per coding tree block to the error left in it, which costs about 2.2x +the encoding time. + +Chroma that cannot resolve a dimension leaves a picture with one stored with +its edge repeated, carrying a clean aperture that takes the repetition back +off. 4:4:4 and monochrome resolve any size and never need it. + +# Grids + +A picture larger than [hevc.MaxLumaSamples] has no level to be coded at, so it +is written as a grid of items instead and reassembled on the way out. +[EncodeOptions.Tile] asks for one at any size. + +# Metadata + +[DecodeExif] reads the Exif item a file describes its image with, and +[RawExif] and [RawXMP] return the payloads unparsed. +*/ +package heic + +import ( + "errors" + "image" + "image/color" + "io" + "math" + "runtime" + + "github.com/gen2brain/h265/hevc" +) + +// ErrUnsupported is returned for a file this package cannot render but which +// is otherwise well formed: an essential property it does not implement, or a +// sample format it has no conversion for. A caller that has another decoder to +// fall back on should test for this one rather than [ErrInvalid]. +var ErrUnsupported = errors.New("heic: unsupported image") + +// DefaultFrameSizeLimit bounds the pixel area a header may ask to allocate. +const DefaultFrameSizeLimit = min(16384*16384, math.MaxInt>>6) + +// Resource ceilings apply to every entry point, including metadata readers. +// The per-item ceiling also bounds one HEVC access unit or metadata payload. +const ( + maxInputBytes = 512 * 1024 * 1024 + maxItemBytes = 64 * 1024 * 1024 +) + +// ColorInfo describes the color space an image was decoded from. +type ColorInfo struct { + Primaries uint16 + Transfer uint16 + Matrix uint16 + FullRange bool + // ICCP is the embedded ICC profile, for files that carry one in place of + // an nclx description. It aliases the input, so it is not a copy. + ICCP []byte +} + +// Options controls decoding. +type Options struct { + // AutoRotate applies the clap/irot/imir transforms, forcing NRGBA output + // when it transforms. + AutoRotate bool + // FrameSizeLimit bounds a frame's area in pixels. Zero means + // DefaultFrameSizeLimit; a negative value removes the limit. + FrameSizeLimit int + // ToYCbCr forces the image's native color space instead of NRGBA: + // *image.YCbCr, *image.NYCbCrA when there is alpha, or *image.Gray when + // the image is monochrome. Above 8 bits NRGBA64 is returned anyway. + // image.YCbCr reads the planes as full-range BT.601 whatever the file + // signals, so this is for reaching the samples, not for display. + // DecodeColor reports what the samples actually are. + ToYCbCr bool + // Threads bounds the goroutines a decode may use, over the tiles of a grid + // and the wavefront rows within each. Zero means GOMAXPROCS; one decodes + // serially. + Threads int +} + +func options(opts []Options) Options { + if len(opts) == 0 { + return Options{} + } + + return opts[0] +} + +type file struct { + src *source + meta *metaBox + movie *movie + frameSizeLimit int + threads int + budget *hevc.DecodeBudget +} + +func (f *file) setOptions(o Options) { + f.frameSizeLimit = o.FrameSizeLimit + f.threads = o.Threads + if n := f.limit(); n > 0 { + // Covers edge tiles and alpha without allowing repeated cropped + // pictures or non-output sequence frames to multiply decode work. + f.budget = hevc.NewDecodeBudget(int64(n) * 4) + } +} + +// workers is how many goroutines a grid may use, never more than it has tiles. +func (f *file) workers(n int) int { + w := f.threads + if w == 0 { + w = runtime.GOMAXPROCS(0) + } + + if n <= 0 { + return max(w, 1) + } + + return max(min(w, n), 1) +} + +// HEIC holds the images of a file, which may be an image sequence. +type HEIC struct { + // Image holds the decoded frames, *image.NRGBA or *image.NRGBA64. + Image []image.Image + // Delay holds each frame's duration in seconds. + Delay []float64 + // LoopCount controls how many times the animation restarts, following + // image/gif: zero loops forever, -1 shows each frame once, and any other + // value plays the animation LoopCount+1 times. + LoopCount int + // Color describes the color space the frames were decoded from. + Color ColorInfo +} + +func parse(src *source) (*file, error) { + f := &file{src: src} + + seen := false + + err := src.eachBox(func(typ string, off, n uint64) error { + // Only these carry anything parse needs, so the media data is never + // read here: the items that reference it are read on demand. + switch typ { + case "ftyp", "meta", "moov": + case "mini": + // The MinimizedImageBox of the low overhead profile carries the + // whole description in place of meta, so a file built on it is one + // we can read nothing from rather than a malformed one. + return ErrUnsupported + default: + return nil + } + + if n > maxHeaderBox { + return ErrUnsupported + } + b, err := src.at(off, n) + if err != nil { + return err + } + + switch typ { + case "ftyp": + seen = true + case "meta": + if f.meta != nil { + return nil + } + + m, err := parseMeta(b) + if err != nil { + return err + } + + f.meta = m + + case "moov": + if f.movie != nil { + return nil + } + + mv, err := parseMoov(b) + if err != nil { + return err + } + + f.movie = mv + } + + return nil + }) + if err != nil { + return nil, err + } + + if !seen || (f.meta == nil && f.movie == nil) { + return nil, ErrInvalid + } + + return f, nil +} + +// srcFor addresses the file by range when the reader allows it, so only the +// items a decode reaches are read. Anything else is buffered whole, which is +// what image.Decode leaves us with: it hands the decoder a bufio.Reader. +func srcFor(r io.Reader) (*source, error) { + ra, raOK := r.(io.ReaderAt) + sk, skOK := r.(io.Seeker) + + if raOK && skOK { + cur, err1 := sk.Seek(0, io.SeekCurrent) + end, err2 := sk.Seek(0, io.SeekEnd) + + if err1 == nil && err2 == nil && end > cur { + n := end - cur + if n > maxInputBytes { + return nil, ErrUnsupported + } + + return &source{r: io.NewSectionReader(ra, cur, n), size: uint64(n)}, nil + } + } + + data, err := io.ReadAll(io.LimitReader(r, maxInputBytes+1)) + if err != nil { + return nil, err + } + if len(data) > maxInputBytes { + return nil, ErrUnsupported + } + + return memSource(data), nil +} + +// parseHeader reads only the boxes a configuration needs and stops as soon as +// one can be derived, so a stream that cannot be addressed by range still +// costs no more than its header. +func parseHeader(r io.Reader) (*file, error) { + f := &file{} + + seen := false + + err := eachBoxReader(r, func(typ string, n int64, body io.Reader) error { + switch typ { + case "ftyp": + seen = true + + case "meta": + if f.meta != nil { + return nil + } + + b, err := boxBytes(body, n) + if err != nil { + return err + } + + m, err := parseMeta(b) + if err != nil { + return err + } + + f.meta = m + + case "moov": + if f.movie != nil { + return nil + } + + b, err := boxBytes(body, n) + if err != nil { + return err + } + + mv, err := parseMoov(b) + if err != nil { + return err + } + + f.movie = mv + + return nil + + default: + return nil + } + + // Only a configuration from the primary item ends the walk. A picture + // track is the fallback for a file that has no usable image item, and + // a meta box after moov would still outrank it. + if seen { + if _, err := f.config(); err == nil { + return errStop + } + } + + return nil + }) + if err != nil && !errors.Is(err, errStop) { + return nil, err + } + + if !seen || (f.meta == nil && f.movie == nil) { + return nil, ErrInvalid + } + + return f, nil +} + +// config is the image configuration of the primary item, or of the picture +// track when a file carries no image item. +func (f *file) config() (image.Config, error) { + it, err := f.primary() + if err != nil { + if f.movie == nil { + return image.Config{}, err + } + + return f.sequenceConfig() + } + + w, h, err := f.size(it) + if err != nil { + return image.Config{}, err + } + + return image.Config{Width: w, Height: h, ColorModel: colorModelFor(f, it)}, nil +} + +func (f *file) limit() int { + switch { + case f.frameSizeLimit < 0: + return 0 + case f.frameSizeLimit == 0: + return DefaultFrameSizeLimit + } + + return f.frameSizeLimit +} + +// primary is the item a file describes itself with. +func (f *file) primary() (*item, error) { + if f.meta == nil { + return nil, ErrInvalid + } + + it := f.meta.items[f.meta.primary] + if it == nil { + return nil, ErrInvalid + } + + if it.unsupported { + return nil, ErrUnsupported + } + + return it, nil +} + +// alphaOf finds the auxiliary item that carries this item's alpha channel. +func (f *file) alphaOf(id uint32) *item { + for _, r := range f.meta.refs { + if r.typ != "auxl" || len(r.to) == 0 || r.to[0] != id { + continue + } + + it := f.meta.items[r.from] + if it == nil || it.unsupported { + continue + } + + if p := f.meta.prop(it, "auxC"); p != nil && isAlphaURN(p.auxC) { + return it + } + } + + return nil +} + +func isAlphaURN(s string) bool { + return s == "urn:mpeg:mpegB:cicp:systems:auxiliary:alpha" || + s == "urn:mpeg:hevc:2015:auxid:1" +} + +// itemDecoder carries the decoder across the tiles of a grid, which keeps the +// per-picture buffers allocated once, together with the configuration already +// fed to it so the tiles after the first skip the parameter sets they share. +type itemDecoder struct { + d hevc.Decoder + cfg *hevcConfig +} + +// use sets how many goroutines this decoder's wavefront may take. +func (dec *itemDecoder) use(threads int) *itemDecoder { + dec.d.Threads(threads) + + return dec +} + +func (f *file) decodeItem(dec *itemDecoder, it *item) (*hevc.Picture, error) { + // The coded SPS may disagree with the container's ispe. Enforce the + // budget in HEVC before it allocates pictures, including tiles and alpha. + dec.d.FrameSizeLimit(f.limit()) + dec.d.Budget(f.budget) + if it.typ == "grid" { + return nil, ErrUnsupported + } + + if it.typ != "hvc1" && it.typ != "hvc2" { + return nil, ErrUnsupported + } + + cfg := f.meta.prop(it, "hvcC") + if cfg == nil || cfg.hvcC == nil { + return nil, ErrInvalid + } + + data, err := f.meta.data(it, f.src) + if err != nil { + return nil, err + } + + if n := f.limit(); n > 0 { + if p := f.meta.prop(it, "ispe"); p != nil && uint64(p.w)*uint64(p.h) > uint64(n) { + return nil, ErrUnsupported + } + } + + if dec.cfg != cfg.hvcC { + for _, nal := range cfg.hvcC.paramSets { + u, ok := hevc.ParseNAL(nal) + if !ok || u.Type.IsVCL() { + return nil, ErrInvalid + } + + if _, err := dec.d.DecodeNAL(u); err != nil { + return nil, wrap(err) + } + } + + dec.cfg = cfg.hvcC + } + + var out []*hevc.Picture + complete := false + defer func() { + if !complete { + releasePictures(out) + } + }() + frames := 0 + err = eachNAL(data, cfg.hvcC.lengthSize, func(u hevc.NALUnit) error { + if u.Type.IsVCL() && len(u.RBSP) > 0 && u.RBSP[0]&0x80 != 0 { + frames++ + // An image item is one picture; refuse an appended sequence before + // allocating its second frame. + if frames > 1 { + return ErrInvalid + } + } + pics, err := dec.d.DecodeNAL(u) + out = append(out, pics...) + if err != nil { + return wrap(err) + } + return nil + }) + if err != nil { + return nil, err + } + + out = append(out, dec.d.Flush()...) + + if len(out) != 1 { + return nil, ErrInvalid + } + complete = true + return out[0], nil +} + +func wrap(err error) error { + if errors.Is(err, hevc.ErrUnsupported) { + return ErrUnsupported + } + + return ErrInvalid +} + +// decodeStill decodes the primary item, its alpha, and any grid it derives +// from, and converts the result. +func (f *file) decodeStill(o Options) (image.Image, ColorInfo, error) { + it, err := f.primary() + if err != nil { + if f.movie == nil { + return nil, ColorInfo{}, err + } + + seq, serr := f.decodeSequence(o, 1) + if serr != nil { + return nil, ColorInfo{}, serr + } + + if seq == nil { + return nil, ColorInfo{}, err + } + + return seq.Image[0], seq.Color, nil + } + + pic, err := f.decodeImage(it) + if err != nil { + return nil, ColorInfo{}, err + } + + // ISO/IEC 23008-12 7.2.1: ispe is the displayed size. + f.clampToISPE(it, pic) + + var alpha *hevc.Picture + + // A grid carries no alpha of its own; its tiles do. + if it.typ == "grid" { + alpha, err = f.gridAlpha(it) + } else if a := f.alphaOf(it.id); a != nil { + alpha, err = f.decodeImage(a) + } + + if err != nil { + return nil, ColorInfo{}, err + } + + if alpha != nil { + f.clampToISPE(it, alpha) + } + + ci := f.colorInfo(it, pic) + + img, err := toImage(pic, alpha, ci, o.ToYCbCr) + if err != nil { + return nil, ci, err + } + + if o.AutoRotate { + img, err = f.transform(it, img) + if err != nil { + return nil, ci, err + } + } + + return img, ci, nil +} + +// Decode reads a HEIC image as *image.NRGBA, or *image.NRGBA64 above 8 bits. +func Decode(r io.Reader, opts ...Options) (image.Image, error) { + img, _, err := decode(r, opts...) + + return img, err +} + +// DecodeColor is Decode, and also reports the color space the image was +// decoded from. +func DecodeColor(r io.Reader, opts ...Options) (image.Image, ColorInfo, error) { + return decode(r, opts...) +} + +func decode(r io.Reader, opts ...Options) (image.Image, ColorInfo, error) { + src, err := srcFor(r) + if err != nil { + return nil, ColorInfo{}, err + } + + f, err := parse(src) + if err != nil { + return nil, ColorInfo{}, err + } + + o := options(opts) + f.setOptions(o) + + return f.decodeStill(o) +} + +// DecodeAll returns every frame of an image sequence with its duration, and +// how many times the animation repeats. A still image gives one frame. +// FrameSizeLimit also bounds the aggregate coded pixel area of each track. +func DecodeAll(r io.Reader, opts ...Options) (*HEIC, error) { + src, err := srcFor(r) + if err != nil { + return nil, err + } + + f, err := parse(src) + if err != nil { + return nil, err + } + + o := options(opts) + f.setOptions(o) + + if f.movie != nil { + seq, err := f.decodeSequence(o, 0) + if err != nil { + return nil, err + } + + if seq != nil { + return seq, nil + } + } + + img, ci, err := f.decodeStill(o) + if err != nil { + return nil, err + } + + return &HEIC{Image: []image.Image{img}, Delay: []float64{0}, Color: ci}, nil +} + +// DecodeConfig returns the dimensions and color model without decoding the +// image data. +func DecodeConfig(r io.Reader) (image.Config, error) { + return DecodeConfigWithOptions(r, Options{}) +} + +// DecodeConfigWithOptions returns the display dimensions after the requested +// container transforms and applies the same pixel budget as Decode. Coded SPS +// dimensions are independently checked when Decode reaches the image data. +func DecodeConfigWithOptions(r io.Reader, o Options) (image.Config, error) { + f, err := parseHeader(r) + if err != nil { + return image.Config{}, err + } + + f.frameSizeLimit = o.FrameSizeLimit + cfg, err := f.config() + if err != nil { + return image.Config{}, err + } + if n := f.limit(); n > 0 && uint64(cfg.Width)*uint64(cfg.Height) > uint64(n) { + return image.Config{}, ErrUnsupported + } + if o.AutoRotate { + if it, err := f.primary(); err == nil { + if clap := f.meta.prop(it, "clap"); clap != nil { + _, _, w, h, ok := cropRect(&clap.clap, cfg.Width, cfg.Height) + if !ok { + return image.Config{}, ErrInvalid + } + cfg.Width, cfg.Height = w, h + } + if rot := f.meta.prop(it, "irot"); rot != nil && rot.angle&1 != 0 { + cfg.Width, cfg.Height = cfg.Height, cfg.Width + } + } + } + return cfg, nil +} + +// sequenceConfig reads the dimensions from the sample entry of the picture +// track, for a file that carries no image item. +func (f *file) sequenceConfig() (image.Config, error) { + t := f.movie.pictTrack() + if t == nil || t.hvcC == nil || t.width == 0 || t.height == 0 { + return image.Config{}, ErrInvalid + } + + model := color.NRGBAModel + if t.hvcC.bitDepthLuma > 8 { + model = color.NRGBA64Model + } + + return image.Config{Width: t.width, Height: t.height, ColorModel: model}, nil +} + +// clampToISPE trims a decoded picture to the size the item declares. +func (f *file) clampToISPE(it *item, pic *hevc.Picture) { + p := f.meta.prop(it, "ispe") + if p == nil { + return + } + + pic.CropW = min(pic.CropW, int(p.w)) + pic.CropH = min(pic.CropH, int(p.h)) +} + +// size is the stored size of an item, which is what Decode returns unless +// AutoRotate transforms it. +func (f *file) size(it *item) (int, int, error) { + p := f.meta.prop(it, "ispe") + if p == nil { + return 0, 0, ErrInvalid + } + + if p.w == 0 || p.h == 0 || p.w > 1<<20 || p.h > 1<<20 { + return 0, 0, ErrInvalid + } + + return int(p.w), int(p.h), nil +} + +func decodeWrapper(r io.Reader) (image.Image, error) { + return Decode(r) +} + +func init() { + for _, brand := range []string{ + "heic", "heix", "heim", "heis", "hevc", "hevx", "hevm", "hevs", + "mif1", "msf1", + } { + image.RegisterFormat("heic", "????ftyp"+brand, decodeWrapper, DecodeConfig) + } +} diff --git a/third_party/h265/heic/image.go b/third_party/h265/heic/image.go new file mode 100644 index 00000000..b018f83d --- /dev/null +++ b/third_party/h265/heic/image.go @@ -0,0 +1,276 @@ +package heic + +import ( + "image" + "image/color" + + "github.com/gen2brain/h265/hevc" +) + +func colorModelFor(f *file, it *item) color.Model { + if p := f.meta.prop(it, "hvcC"); p != nil && p.hvcC != nil && p.hvcC.bitDepthLuma > 8 { + return color.NRGBA64Model + } + + return color.NRGBAModel +} + +// colorInfo is the color description of an item. The sequence declares one in +// its video usability information and a colr box replaces it whole, which is +// how ISO/IEC 23008-12 resolves the two. +func (f *file) colorInfo(it *item, pic *hevc.Picture) ColorInfo { + ci := ColorInfo{Matrix: mcUnspec, Primaries: 2, Transfer: 2} + + if pic != nil { + ci = ColorInfo{ + Primaries: pic.ColorPrimaries, + Transfer: pic.ColorTransfer, + Matrix: pic.ColorMatrix, + FullRange: pic.FullRange, + } + } + + if f.meta == nil || it == nil { + return ci + } + + // 23008-12 lets a picture carry an nclx description and an ICC profile at + // once, in a colr box each, so both are read rather than the first. + for _, ip := range it.props { + if ip.idx >= len(f.meta.props) { + continue + } + + c := f.meta.props[ip.idx].colr + if c == nil { + continue + } + + if c.hasNCLX { + ci.Primaries = c.primaries + ci.Transfer = c.transfer + ci.Matrix = c.matrix + ci.FullRange = c.fullRange + } + + if c.icc != nil { + ci.ICCP = c.icc + } + } + + return ci +} + +// aliasesPicture reports whether img shares memory with the decoded planes. +func aliasesPicture(img image.Image) bool { + switch img.(type) { + case *image.YCbCr, *image.NYCbCrA, *image.Gray: + return true + } + + return false +} + +// planar wraps the decoded planes without converting them, which is what the +// bitstream already holds. +func planar(pic, alpha *hevc.Picture) (image.Image, bool) { + if pic.BitDepth != 8 { + return nil, false + } + + y, cb, cr := views(pic) + rect := image.Rect(0, 0, pic.CropW, pic.CropH) + + if pic.ChromaFormat == 0 { + if alpha != nil { + return nil, false + } + + return &image.Gray{Pix: y.p8, Stride: y.stride, Rect: rect}, true + } + + var ratio image.YCbCrSubsampleRatio + + switch pic.ChromaFormat { + case 1: + ratio = image.YCbCrSubsampleRatio420 + case 2: + ratio = image.YCbCrSubsampleRatio422 + case 3: + ratio = image.YCbCrSubsampleRatio444 + default: + return nil, false + } + + yc := image.YCbCr{ + Y: y.p8, Cb: cb.p8, Cr: cr.p8, + YStride: y.stride, CStride: cb.stride, + SubsampleRatio: ratio, Rect: rect, + } + + if alpha == nil { + return &yc, true + } + + if alpha.BitDepth != 8 || alpha.ChromaFormat != 0 { + return nil, false + } + + ay, _, _ := views(alpha) + if ay.w != pic.CropW || ay.h != pic.CropH { + return nil, false + } + + return &image.NYCbCrA{YCbCr: yc, A: ay.p8, AStride: ay.stride}, true +} + +func toImage(pic, alpha *hevc.Picture, ci ColorInfo, ycbcr bool) (image.Image, error) { + if ycbcr { + if img, ok := planar(pic, alpha); ok { + return img, nil + } + } + + outDepth := 8 + if pic.BitDepth > 8 { + outDepth = 16 + } + + cs := newColorState(pic, ci, outDepth) + if cs.unsupported { + return nil, ErrUnsupported + } + + y, cb, cr := views(pic) + if !y.valid() { + return nil, ErrInvalid + } + + w, h := y.w, y.h + rect := image.Rect(0, 0, w, h) + + cs.prepare(w) + + if cs.fastRow(outDepth) { + cs.consts = cs.rowConsts() + + if outDepth == 8 { + cs.row = rowFn(cs.ssHor) + } else { + cs.row16 = rowFn16(cs.ssHor) + } + } + + var ( + as *colorState + av planeView + ) + + if alpha != nil { + // An auxiliary alpha image carries its values in the luma channel, so + // chroma planes are padding whatever the file codes them as. + av, _, _ = views(alpha) + if av.w != w || av.h != h { + return nil, ErrUnsupported + } + + as = alphaState(alpha, outDepth, true) + as.prepare(w) + } + + rgb := make([]uint16, 3*w) + aRow := make([]uint16, w) + + if as == nil { + for x := range aRow { + aRow[x] = uint16(cs.outMax) + } + } + + if outDepth == 8 { + dst := image.NewNRGBA(rect) + + if cs.row != nil { + ab := make([]uint8, w) + for i := range ab { + ab[i] = 0xff + } + + for row := range h { + if as != nil { + as.alphaRow(av, row, w, aRow) + + for i, v := range aRow { + ab[i] = uint8(v) + } + } + + u0, u1, v0, v1 := cs.rowPlanes(cb, cr, row, w, h) + cs.row(dst.Pix[row*dst.Stride:], cs.lumaRowF(y, row, w), + u0, u1, v0, v1, ab, w, &cs.consts) + } + + return dst, nil + } + + for row := range h { + cs.rgbRow(y, cb, cr, row, rgb) + + if as != nil { + as.alphaRow(av, row, w, aRow) + } + + o := row * dst.Stride + for x := range w { + dst.Pix[o] = uint8(rgb[3*x]) + dst.Pix[o+1] = uint8(rgb[3*x+1]) + dst.Pix[o+2] = uint8(rgb[3*x+2]) + dst.Pix[o+3] = uint8(aRow[x]) + o += 4 + } + } + + return dst, nil + } + + dst := image.NewNRGBA64(rect) + + if cs.row16 != nil { + for row := range h { + if as != nil { + as.alphaRow(av, row, w, aRow) + } + + u0, u1, v0, v1 := cs.rowPlanes(cb, cr, row, w, h) + cs.row16(dst.Pix[row*dst.Stride:], cs.lumaRowF(y, row, w), + u0, u1, v0, v1, aRow, w, &cs.consts) + } + + return dst, nil + } + + for row := range h { + cs.rgbRow(y, cb, cr, row, rgb) + + if as != nil { + as.alphaRow(av, row, w, aRow) + } + + o := row * dst.Stride + for x := range w { + r, g, b, a := rgb[3*x], rgb[3*x+1], rgb[3*x+2], aRow[x] + + dst.Pix[o] = uint8(r >> 8) + dst.Pix[o+1] = uint8(r) + dst.Pix[o+2] = uint8(g >> 8) + dst.Pix[o+3] = uint8(g) + dst.Pix[o+4] = uint8(b >> 8) + dst.Pix[o+5] = uint8(b) + dst.Pix[o+6] = uint8(a >> 8) + dst.Pix[o+7] = uint8(a) + o += 8 + } + } + + return dst, nil +} diff --git a/third_party/h265/heic/isobmff.go b/third_party/h265/heic/isobmff.go new file mode 100644 index 00000000..a36fc6cc --- /dev/null +++ b/third_party/h265/heic/isobmff.go @@ -0,0 +1,917 @@ +package heic + +import ( + "errors" + "io" + "slices" +) + +// ErrInvalid is returned when a file is not a HEIF, or is malformed past the +// point where anything can be decoded from it. +var ErrInvalid = errors.New("heic: invalid file") + +type reader struct { + b []byte + i int + err bool +} + +func (r *reader) remaining() int { + if r.err { + return 0 + } + + return len(r.b) - r.i +} + +func (r *reader) fail() { + r.err = true + r.i = len(r.b) +} + +func (r *reader) bytes(n int) []byte { + if n < 0 || r.remaining() < n { + r.fail() + + return nil + } + v := r.b[r.i : r.i+n] + r.i += n + + return v +} + +func (r *reader) skip(n int) { + r.bytes(n) +} + +func (r *reader) u8() uint8 { + b := r.bytes(1) + if b == nil { + return 0 + } + + return b[0] +} + +func (r *reader) uint(n int) uint64 { + b := r.bytes(n) + var v uint64 + for _, c := range b { + v = v<<8 | uint64(c) + } + + return v +} + +func (r *reader) u16() uint16 { return uint16(r.uint(2)) } +func (r *reader) u32() uint32 { return uint32(r.uint(4)) } +func (r *reader) u64() uint64 { return r.uint(8) } + +// boxNames interns the four-character codes the parser compares against, so +// reading a header allocates nothing. An unknown box is skipped on its size +// alone, and its name never leaves this function. +var boxNames = func() map[[4]byte]string { + m := make(map[[4]byte]string) + + for _, s := range []string{ + "ftyp", "meta", "hdlr", "pitm", "iinf", "infe", "iloc", "iref", "iprp", + "ipco", "ipma", "hvcC", "ispe", "colr", "pixi", "irot", "imir", "clap", + "auxC", "idat", "mdat", "moov", "trak", "mdia", "minf", "stbl", "stsd", + "stts", "stsc", "stsz", "stco", "co64", "tkhd", "mvhd", "hvc1", "hvc2", + "grid", "Exif", "mime", "iprd", "free", "skip", "url ", "dinf", "dref", + } { + m[[4]byte([]byte(s))] = s + } + + return m +}() + +func (r *reader) str4() string { + b := r.bytes(4) + if b == nil { + return "" + } + + if s, ok := boxNames[[4]byte(b)]; ok { + return s + } + + return string(b) +} + +func (r *reader) cstr() string { + for j := r.i; j < len(r.b); j++ { + if r.b[j] == 0 { + s := string(r.b[r.i:j]) + r.i = j + 1 + + return s + } + } + r.fail() + + return "" +} + +func (r *reader) fullBox() (uint8, uint32) { + v := r.u32() + + return uint8(v >> 24), v & 0xffffff +} + +// eachBox calls fn for every box in b. +func eachBox(b []byte, fn func(typ string, payload []byte) error) error { + r := &reader{b: b} + + for r.remaining() >= 8 { + start := r.i + size := uint64(r.u32()) + typ := r.str4() + hdr := 8 + + switch size { + case 1: + size = r.u64() + hdr = 16 + case 0: + size = uint64(len(b) - start) + } + if r.err || size < uint64(hdr) || size > uint64(len(b)-start) { + return ErrInvalid + } + + payload := b[start+hdr : start+int(size)] + if typ == "uuid" { + r.i = start + int(size) + + continue + } + if err := fn(typ, payload); err != nil { + return err + } + r.i = start + int(size) + } + + if r.err { + return ErrInvalid + } + + return nil +} + +type extent struct { + off, len uint64 +} + +type item struct { + id uint32 + typ string + contentType string + extents []extent + + method uint8 + baseOffset uint64 + + props []itemProp + + unsupported bool +} + +type itemProp struct { + idx int + essential bool +} + +type itemRef struct { + typ string + from uint32 + to []uint32 +} + +type property struct { + typ string + + w, h uint32 + hvcC *hevcConfig + pixi []uint8 + auxC string + angle uint8 + axis uint8 + clap [8]uint32 + colr *colorInfo +} + +// hevcConfig is the HEVCDecoderConfigurationRecord of ISO/IEC 14496-15. The +// parameter sets travel in it rather than in the item data. +type hevcConfig struct { + chromaFormat uint8 + bitDepthLuma uint8 + bitDepthChroma uint8 + lengthSize int + paramSets [][]byte +} + +type colorInfo struct { + icc []byte + primaries uint16 + transfer uint16 + matrix uint16 + fullRange bool + hasNCLX bool +} + +type metaBox struct { + primary uint32 + items map[uint32]*item + order []uint32 + props []property + refs []itemRef + idat []byte + entries int +} + +// reserve accounts for parsed objects, including zero-width iloc extents. +// Payload size alone cannot bound the number of such objects. +func (m *metaBox) reserve(n int) bool { + if n < 0 || n > maxSamples-m.entries { + return false + } + m.entries += n + return true +} + +// source is the file, addressed by range. b carries it when it is buffered, +// and r reads it a range at a time when it is not. +type source struct { + b []byte + r io.ReaderAt + size uint64 +} + +func memSource(b []byte) *source { + return &source{b: b, size: uint64(len(b))} +} + +// at returns n bytes at off. It aliases a buffered file, so the result must +// not be written to. +func (s *source) at(off, n uint64) ([]byte, error) { + if off > s.size || n > s.size-off { + return nil, ErrInvalid + } + + if s.r == nil { + return s.b[off : off+n], nil + } + + buf := make([]byte, n) + + _, err := io.ReadFull(io.NewSectionReader(s.r, int64(off), int64(n)), buf) + + switch { + case err == nil: + return buf, nil + case errors.Is(err, io.EOF), errors.Is(err, io.ErrUnexpectedEOF): + return nil, ErrInvalid + } + + return nil, err +} + +// eachBox reports where each top level payload lives without reading it. +func (s *source) eachBox(fn func(typ string, off, n uint64) error) error { + for off := uint64(0); off+8 <= s.size; { + b, err := s.at(off, 8) + if err != nil { + return err + } + + r := &reader{b: b} + size := uint64(r.u32()) + typ := r.str4() + head := uint64(8) + + switch size { + case 1: + if off+16 > s.size { + return ErrInvalid + } + + b, err = s.at(off+8, 8) + if err != nil { + return err + } + + rr := &reader{b: b} + size = rr.u64() + head = 16 + r.err = r.err || rr.err + + case 0: + size = s.size - off + } + + if r.err || size < head || size > s.size-off { + return ErrInvalid + } + + if typ != "uuid" { + if err := fn(typ, off+head, size-head); err != nil { + return err + } + } + + off += size + } + + return nil +} + +// maxHeaderBox bounds a box eachBoxReader buffers, since its size comes from +// the file being read. +const maxHeaderBox = 64 << 20 + +// errStop ends a walk from inside the callback. +var errStop = errors.New("heic: stop") + +// eachBoxReader walks the top-level boxes of a stream. fn reads as much of a +// box as it wants from body, whose length is n, or -1 when the box runs to the +// end of the file; the rest is discarded before the next box. Boxes fn does +// not read are never buffered, so a caller after the header alone does not pay +// for the media data behind it. +func eachBoxReader(r io.Reader, fn func(typ string, n int64, body io.Reader) error) error { + var hdr [16]byte + + for { + // A short read at a box boundary is the end of the walk, which is + // what the in-memory form does with a trailing partial header. + if _, err := io.ReadFull(r, hdr[:8]); err != nil { + if err == io.EOF || err == io.ErrUnexpectedEOF { + return nil + } + + return ErrInvalid + } + + size := uint64(hdr[0])<<24 | uint64(hdr[1])<<16 | uint64(hdr[2])<<8 | uint64(hdr[3]) + typ := string(hdr[4:8]) + head := uint64(8) + + if size == 1 { + if _, err := io.ReadFull(r, hdr[8:16]); err != nil { + return ErrInvalid + } + + size = 0 + for _, b := range hdr[8:16] { + size = size<<8 | uint64(b) + } + + head = 16 + } + + n := int64(-1) + if size != 0 { + if size < head { + return ErrInvalid + } + + n = int64(size - head) + } + + body := &io.LimitedReader{R: r, N: maxHeaderBox} + if n >= 0 { + body.N = n + } + + err := fn(typ, n, body) + + if _, derr := io.Copy(io.Discard, body); derr != nil { + return ErrInvalid + } + + if err != nil { + return err + } + + if n < 0 { + return nil + } + } +} + +// boxBytes reads a whole box payload, refusing one too large to be a header. +func boxBytes(body io.Reader, n int64) ([]byte, error) { + if n < 0 { + return io.ReadAll(body) + } + + if n > maxHeaderBox { + return nil, ErrInvalid + } + + b := make([]byte, n) + if _, err := io.ReadFull(body, b); err != nil { + return nil, ErrInvalid + } + + return b, nil +} + +func parseMeta(payload []byte) (*metaBox, error) { + r := &reader{b: payload} + r.fullBox() + if r.err { + return nil, ErrInvalid + } + + m := &metaBox{items: map[uint32]*item{}} + + err := eachBox(payload[r.i:], func(typ string, b []byte) error { + switch typ { + case "pitm": + rr := &reader{b: b} + v, _ := rr.fullBox() + if v == 0 { + m.primary = uint32(rr.u16()) + } else { + m.primary = rr.u32() + } + if rr.err { + return ErrInvalid + } + + case "iloc": + return m.parseIloc(b) + + case "iinf": + return m.parseIinf(b) + + case "iref": + return m.parseIref(b) + + case "idat": + m.idat = b + + case "iprp": + return eachBox(b, func(typ string, b []byte) error { + switch typ { + case "ipco": + return m.parseIpco(b) + case "ipma": + return m.parseIpma(b) + } + + return nil + }) + } + + return nil + }) + if err != nil { + return nil, err + } + + m.markUnsupported() + + return m, nil +} + +// knownProps are the property types this reader implements. An item with an +// essential association to anything else must not be processed. +var knownProps = map[string]bool{ + "ispe": true, "hvcC": true, "pixi": true, "auxC": true, + "irot": true, "imir": true, "clap": true, "colr": true, +} + +func (m *metaBox) markUnsupported() { + for _, it := range m.items { + for _, ip := range it.props { + if !ip.essential { + continue + } + if ip.idx >= len(m.props) || !knownProps[m.props[ip.idx].typ] { + it.unsupported = true + + break + } + } + } +} + +func (m *metaBox) item(id uint32) *item { + it := m.items[id] + if it == nil { + it = &item{id: id} + m.items[id] = it + m.order = append(m.order, id) + } + + return it +} + +func (m *metaBox) parseIloc(b []byte) error { + r := &reader{b: b} + v, _ := r.fullBox() + + sizes := r.u8() + offSize, lenSize := int(sizes>>4), int(sizes&0xf) + sizes = r.u8() + baseSize, idxSize := int(sizes>>4), int(sizes&0xf) + if v < 1 { + idxSize = 0 + } + for _, n := range []int{offSize, lenSize, baseSize, idxSize} { + if n != 0 && n != 4 && n != 8 { + return ErrInvalid + } + } + + count := int(r.u16()) + if v == 2 { + r.i -= 2 + count = int(r.u32()) + } + + for range count { + if !m.reserve(1) { + return ErrUnsupported + } + var id uint32 + if v < 2 { + id = uint32(r.u16()) + } else { + id = r.u32() + } + it := m.item(id) + if v >= 1 { + it.method = uint8(r.u16() & 0xf) + } + r.skip(2) + it.baseOffset = r.uint(baseSize) + + n := int(r.u16()) + if !m.reserve(n) { + return ErrUnsupported + } + for range n { + r.skip(idxSize) + off := r.uint(offSize) + l := r.uint(lenSize) + if r.err { + return ErrInvalid + } + it.extents = append(it.extents, extent{off: off, len: l}) + } + if r.err { + return ErrInvalid + } + } + + return nil +} + +func (m *metaBox) parseIinf(b []byte) error { + r := &reader{b: b} + v, _ := r.fullBox() + if v == 0 { + r.u16() + } else { + r.u32() + } + if r.err { + return ErrInvalid + } + + return eachBox(b[r.i:], func(typ string, b []byte) error { + if typ != "infe" { + return nil + } + if !m.reserve(1) { + return ErrUnsupported + } + rr := &reader{b: b} + v, _ := rr.fullBox() + if v < 2 { + return nil + } + + var id uint32 + if v == 2 { + id = uint32(rr.u16()) + } else { + id = rr.u32() + } + rr.skip(2) + itemType := rr.str4() + if rr.err { + return ErrInvalid + } + + it := m.item(id) + it.typ = itemType + + if itemType == "mime" { + rr.cstr() + if ct := rr.cstr(); !rr.err { + it.contentType = ct + } + } + + return nil + }) +} + +func (m *metaBox) parseIref(b []byte) error { + r := &reader{b: b} + v, _ := r.fullBox() + if r.err { + return ErrInvalid + } + + return eachBox(b[r.i:], func(typ string, b []byte) error { + rr := &reader{b: b} + ref := itemRef{typ: typ} + if v == 0 { + ref.from = uint32(rr.u16()) + } else { + ref.from = rr.u32() + } + n := int(rr.u16()) + if !m.reserve(n + 1) { + return ErrUnsupported + } + for range n { + var to uint32 + if v == 0 { + to = uint32(rr.u16()) + } else { + to = rr.u32() + } + ref.to = append(ref.to, to) + } + if rr.err { + return ErrInvalid + } + m.refs = append(m.refs, ref) + + return nil + }) +} + +func (m *metaBox) parseIpco(b []byte) error { + return eachBox(b, func(typ string, b []byte) error { + if !m.reserve(1) { + return ErrUnsupported + } + p := property{typ: typ} + r := &reader{b: b} + + switch typ { + case "ispe": + r.fullBox() + p.w = r.u32() + p.h = r.u32() + + case "hvcC": + c, err := parseHvcC(r) + if err != nil { + return err + } + p.hvcC = c + + case "pixi": + r.fullBox() + n := int(r.u8()) + for range n { + p.pixi = append(p.pixi, r.u8()) + } + + case "auxC": + r.fullBox() + p.auxC = r.cstr() + + case "irot": + p.angle = r.u8() & 3 + + case "imir": + p.axis = r.u8() & 1 + + case "clap": + for i := range 8 { + p.clap[i] = r.u32() + } + + case "colr": + switch r.str4() { + case "nclx": + p.colr = &colorInfo{hasNCLX: true} + p.colr.primaries = r.u16() + p.colr.transfer = r.u16() + p.colr.matrix = r.u16() + p.colr.fullRange = r.u8()>>7 != 0 + case "rICC", "prof": + p.colr = &colorInfo{icc: b[4:]} + } + } + + if r.err { + return ErrInvalid + } + m.props = append(m.props, p) + + return nil + }) +} + +func (m *metaBox) parseIpma(b []byte) error { + r := &reader{b: b} + v, flags := r.fullBox() + count := int(r.u32()) + if r.err { + return ErrInvalid + } + + for range count { + var id uint32 + if v < 1 { + id = uint32(r.u16()) + } else { + id = r.u32() + } + it := m.item(id) + + n := int(r.u8()) + if !m.reserve(n + 1) { + return ErrUnsupported + } + it.props = slices.Grow(it.props, n) + + for range n { + var idx int + var essential bool + if flags&1 != 0 { + v := r.u16() + idx, essential = int(v&0x7fff), v&0x8000 != 0 + } else { + v := r.u8() + idx, essential = int(v&0x7f), v&0x80 != 0 + } + if r.err { + return ErrInvalid + } + if idx == 0 { + continue + } + it.props = append(it.props, itemProp{idx: idx - 1, essential: essential}) + } + if r.err { + return ErrInvalid + } + } + + return nil +} + +// data gathers an item's extents out of the file or, for construction method 1, out of idat. +func (m *metaBox) data(it *item, src *source) ([]byte, error) { + if it.method == 1 { + src = memSource(m.idat) + } else if it.method != 0 { + return nil, ErrInvalid + } + + span := func(e extent) (uint64, uint64, error) { + if it.baseOffset > src.size || e.off > src.size-it.baseOffset { + return 0, 0, ErrInvalid + } + off, n := it.baseOffset+e.off, e.len + if n == 0 { + if off > src.size { + return 0, 0, ErrInvalid + } + + n = src.size - off + } + + if off > src.size || n > src.size-off || n > maxItemBytes { + return 0, 0, ErrInvalid + } + + return off, n, nil + } + + if len(it.extents) == 1 { + off, n, err := span(it.extents[0]) + if err != nil { + return nil, err + } + + return src.at(off, n) + } + + // Validate all spans before reading or allocating. Repeated extents must + // not amplify a small source into an arbitrarily large allocation. + var total uint64 + for _, e := range it.extents { + _, n, err := span(e) + if err != nil { + return nil, err + } + if n > min(src.size, maxItemBytes)-total { + return nil, ErrInvalid + } + total += n + } + if total == 0 { + return nil, ErrInvalid + } + out := make([]byte, 0, int(total)) + for _, e := range it.extents { + off, n, _ := span(e) // Validated above against the same immutable source. + + b, err := src.at(off, n) + if err != nil { + return nil, err + } + + out = append(out, b...) + } + + return out, nil +} + +func (m *metaBox) prop(it *item, typ string) *property { + if it == nil { + return nil + } + for _, ip := range it.props { + if ip.idx < len(m.props) && m.props[ip.idx].typ == typ { + return &m.props[ip.idx] + } + } + + return nil +} + +func (m *metaBox) refsTo(typ string, from uint32) []uint32 { + for _, r := range m.refs { + if r.typ == typ && r.from == from { + return r.to + } + } + + return nil +} + +// parseHvcC reads the HEVCDecoderConfigurationRecord. Everything before the +// arrays is fixed width, and the profile and level fields are not needed once +// the parameter sets themselves are in hand. +func parseHvcC(r *reader) (*hevcConfig, error) { + if r.u8() != 1 { + return nil, ErrInvalid + } + + r.skip(12) + + c := &hevcConfig{} + + r.skip(2) + r.skip(1) + c.chromaFormat = r.u8() & 3 + c.bitDepthLuma = r.u8()&7 + 8 + c.bitDepthChroma = r.u8()&7 + 8 + + r.skip(2) + c.lengthSize = int(r.u8()&3) + 1 + + arrays := int(r.u8()) + if r.err { + return nil, ErrInvalid + } + + for range arrays { + r.skip(1) + + n := int(r.u16()) + if r.err || n > r.remaining()/4 || n > 1024-len(c.paramSets) { + return nil, ErrInvalid + } + c.paramSets = slices.Grow(c.paramSets, n) + + for range n { + nal := r.bytes(int(r.u16())) + if r.err { + return nil, ErrInvalid + } + + c.paramSets = append(c.paramSets, nal) + } + } + + if r.err { + return nil, ErrInvalid + } + + return c, nil +} diff --git a/third_party/h265/heic/limits.go b/third_party/h265/heic/limits.go new file mode 100644 index 00000000..ee5a2ee2 --- /dev/null +++ b/third_party/h265/heic/limits.go @@ -0,0 +1,39 @@ +package heic + +import "github.com/gen2brain/h265/hevc" + +// eachNAL validates framing and visits one unit at a time. Splitting the whole +// item first retains every unescaped payload and a slice entry per tiny NAL. +func eachNAL(data []byte, lengthSize int, visit func(hevc.NALUnit) error) error { + if lengthSize < 1 || lengthSize > 4 { + return ErrInvalid + } + for count := 0; len(data) > 0; count++ { + if count >= maxSamples || len(data) < lengthSize { + return ErrInvalid + } + var n uint64 + for _, b := range data[:lengthSize] { + n = n*256 + uint64(b) + } + data = data[lengthSize:] + if n < 2 || n > uint64(len(data)) { + return ErrInvalid + } + u, ok := hevc.ParseNAL(data[:int(n)]) + if !ok { + return ErrInvalid + } + if err := visit(u); err != nil { + return err + } + data = data[int(n):] + } + return nil +} + +func releasePictures(pics []*hevc.Picture) { + for _, pic := range pics { + pic.Release() + } +} diff --git a/third_party/h265/heic/sequence.go b/third_party/h265/heic/sequence.go new file mode 100644 index 00000000..07b31878 --- /dev/null +++ b/third_party/h265/heic/sequence.go @@ -0,0 +1,601 @@ +package heic + +import ( + "errors" + "math" + + "github.com/gen2brain/h265/hevc" +) + +type track struct { + id uint32 + handler string + timescale uint32 + samples []extent + deltas []uint32 + auxl []uint32 + auxType string + hvcC *hevcConfig + width int + height int + + duration uint64 + hasEdits bool + repeating bool + segmentDur uint64 +} + +const indefiniteDuration = ^uint64(0) + +// loopCount is zero for forever, -1 to show each frame once, otherwise the +// number of extra plays. ISO/IEC 23008-12 section 9.6.1. +func (t *track) loopCount() int { + if !t.hasEdits { + return 0 + } + if !t.repeating { + return -1 + } + if t.duration == indefiniteDuration || t.duration == 0 || t.segmentDur == 0 { + return 0 + } + + n := t.duration / t.segmentDur + if t.duration%t.segmentDur != 0 { + n++ + } + if n <= 1 { + return -1 + } + if n-1 > math.MaxInt32 { + return 0 + } + + return int(n - 1) +} + +type movie struct { + tracks []track +} + +// A movie's expanded sample tables share this budget. HEIC sequences longer +// than this need a streaming API rather than eager table/frame allocation. +const maxSamples = 65536 + +func parseMoov(b []byte) (*movie, error) { + m := &movie{} + samples := 0 + + err := eachBox(b, func(typ string, b []byte) error { + if typ != "trak" { + return nil + } + t, err := parseTrak(b) + if err != nil { + return err + } + samples += len(t.samples) + if samples > maxSamples || len(m.tracks) >= 1024 { + return ErrUnsupported + } + m.tracks = append(m.tracks, t) + + return nil + }) + if err != nil { + return nil, err + } + + return m, nil +} + +func parseTrak(b []byte) (track, error) { + var t track + + err := eachBox(b, func(typ string, b []byte) error { + switch typ { + case "tkhd": + r := &reader{b: b} + v, _ := r.fullBox() + if v == 1 { + r.skip(16) + } else { + r.skip(8) + } + t.id = r.u32() + r.skip(4) + if v == 1 { + t.duration = r.u64() + } else { + t.duration = uint64(r.u32()) + if t.duration == 1<<32-1 { + t.duration = indefiniteDuration + } + } + if r.err { + return ErrInvalid + } + + case "edts": + t.hasEdits = true + + return eachBox(b, func(typ string, b []byte) error { + if typ != "elst" { + return nil + } + r := &reader{b: b} + v, flags := r.fullBox() + if flags&1 == 0 { + return nil + } + t.repeating = true + if r.u32() != 1 { + return nil + } + if v == 1 { + t.segmentDur = r.u64() + } else { + t.segmentDur = uint64(r.u32()) + } + if r.err { + return ErrInvalid + } + + return nil + }) + + case "tref": + return eachBox(b, func(typ string, b []byte) error { + if typ != "auxl" { + return nil + } + r := &reader{b: b} + for r.remaining() >= 4 { + t.auxl = append(t.auxl, r.u32()) + } + + return nil + }) + + case "mdia": + return eachBox(b, func(typ string, b []byte) error { + switch typ { + case "mdhd": + r := &reader{b: b} + v, _ := r.fullBox() + if v == 1 { + r.skip(16) + } else { + r.skip(8) + } + t.timescale = r.u32() + if r.err { + return ErrInvalid + } + + case "hdlr": + r := &reader{b: b} + r.fullBox() + r.u32() + t.handler = r.str4() + + case "minf": + return eachBox(b, func(typ string, b []byte) error { + if typ != "stbl" { + return nil + } + + return t.parseStbl(b) + }) + } + + return nil + }) + } + + return nil + }) + + return t, err +} + +type chunkRun struct { + firstChunk, perChunk uint32 +} + +func (t *track) parseStbl(b []byte) error { + var sizes []uint32 + var offsets []uint64 + var runs []chunkRun + type timingRun struct{ count, delta uint32 } + var timing []timingRun + timingCount := 0 + seen := make(map[string]bool) + + err := eachBox(b, func(typ string, b []byte) error { + r := &reader{b: b} + // Multiple copies could otherwise repeatedly replace or expand a + // table, and make its final size conceal the parsing cost. + switch typ { + case "stts", "stsz", "stsd", "stsc", "stco", "co64": + key := typ + if key == "co64" { + key = "stco" + } + if seen[key] { + return ErrInvalid + } + seen[key] = true + } + + switch typ { + case "stts": + r.fullBox() + n := int(r.u32()) + if r.err || n < 0 || n > maxSamples || n > r.remaining()/8 { + return ErrInvalid + } + for range n { + count := r.u32() + delta := r.u32() + if r.err || count == 0 || uint64(count) > uint64(maxSamples-timingCount) { + return ErrInvalid + } + timingCount += int(count) + timing = append(timing, timingRun{count, delta}) + } + + case "stsz": + r.fullBox() + uniform := r.u32() + n := int(r.u32()) + if r.err || n < 0 || n > maxSamples || (uniform == 0 && n > r.remaining()/4) { + return ErrInvalid + } + sizes = make([]uint32, n) + for i := range n { + if uniform != 0 { + sizes[i] = uniform + } else { + sizes[i] = r.u32() + } + } + + case "stsd": + r.fullBox() + r.u32() + + return eachBox(b[r.i:], func(typ string, b []byte) error { + if len(b) < 78 { + return nil + } + + rr := &reader{b: b} + rr.skip(24) + t.width = int(rr.u16()) + t.height = int(rr.u16()) + + return eachBox(b[78:], func(typ string, b []byte) error { + switch typ { + case "auxi": + rr := &reader{b: b} + rr.fullBox() + t.auxType = rr.cstr() + + case "hvcC": + c, err := parseHvcC(&reader{b: b}) + if err != nil { + return err + } + t.hvcC = c + } + + return nil + }) + }) + + case "stsc": + r.fullBox() + n := int(r.u32()) + if r.err || n < 0 || n > maxSamples || n > r.remaining()/12 { + return ErrInvalid + } + for range n { + first := r.u32() + per := r.u32() + r.u32() + if r.err || first == 0 || per == 0 || per > maxSamples || + (len(runs) > 0 && first <= runs[len(runs)-1].firstChunk) { + return ErrInvalid + } + runs = append(runs, chunkRun{first, per}) + } + + case "stco", "co64": + r.fullBox() + n := int(r.u32()) + entrySize := 4 + if typ == "co64" { + entrySize = 8 + } + if r.err || n < 0 || n > maxSamples || n > r.remaining()/entrySize { + return ErrInvalid + } + offsets = make([]uint64, n) + for i := range n { + if typ == "stco" { + offsets[i] = uint64(r.u32()) + } else { + offsets[i] = r.u64() + } + } + } + + if r.err { + return ErrInvalid + } + + return nil + }) + if err != nil { + return err + } + + if timingCount != len(sizes) { + return ErrInvalid + } + t.samples, err = layoutSamples(sizes, offsets, runs) + if err != nil { + return err + } + t.deltas = make([]uint32, 0, timingCount) + for _, run := range timing { + for range int(run.count) { + t.deltas = append(t.deltas, run.delta) + } + } + return nil +} + +// layoutSamples walks the chunk table to give every sample a file offset. +func layoutSamples(sizes []uint32, offsets []uint64, runs []chunkRun) ([]extent, error) { + if len(sizes) == 0 || len(offsets) == 0 || len(runs) == 0 { + if len(sizes) != 0 || len(offsets) != 0 || len(runs) != 0 { + return nil, ErrInvalid + } + return nil, nil + } + if runs[0].firstChunk != 1 || uint64(runs[len(runs)-1].firstChunk) > uint64(len(offsets)) { + return nil, ErrInvalid + } + + out := make([]extent, 0, len(sizes)) + s := 0 + runIndex := 0 + + for c := range offsets { + for runIndex+1 < len(runs) && uint32(c+1) >= runs[runIndex+1].firstChunk { + runIndex++ + } + per := runs[runIndex].perChunk + + off := offsets[c] + for range int(per) { + if s >= len(sizes) { + return nil, ErrInvalid + } + if sizes[s] == 0 || uint64(sizes[s]) > math.MaxUint64-off { + return nil, ErrInvalid + } + out = append(out, extent{off: off, len: uint64(sizes[s])}) + off += uint64(sizes[s]) + s++ + } + } + + if s != len(sizes) { + return nil, ErrInvalid + } + return out, nil +} + +func (m *movie) pictTrack() *track { + for i := range m.tracks { + if m.tracks[i].handler == "pict" && len(m.tracks[i].samples) > 0 { + return &m.tracks[i] + } + } + + return nil +} + +func (m *movie) alphaTrack(id uint32) *track { + for i := range m.tracks { + t := &m.tracks[i] + if t.handler != "auxv" || len(t.samples) == 0 || !isAlphaURN(t.auxType) { + continue + } + for _, to := range t.auxl { + if to == id { + return t + } + } + } + + return nil +} + +// decodeSequence decodes an image sequence track. +func (f *file) decodeSequence(o Options, maxFrames int) (*HEIC, error) { + t := f.movie.pictTrack() + if t == nil || t.timescale == 0 { + return nil, nil + } + + colors, err := f.decodeTrack(t, maxFrames) + if err != nil { + return nil, err + } + // Planar output aliases these pictures; RGB output owns its pixels. + if !o.ToYCbCr { + defer releasePictures(colors) + } + + var alphas []*hevc.Picture + + if at := f.movie.alphaTrack(t.id); at != nil { + if alphas, err = f.decodeTrack(at, maxFrames); err != nil { + return nil, err + } + if !o.ToYCbCr { + defer releasePictures(alphas) + } + } + + var first *hevc.Picture + if len(colors) > 0 { + first = colors[0] + } + + out := &HEIC{LoopCount: t.loopCount(), Color: f.sequenceColor(first)} + + for i, pic := range colors { + var alpha *hevc.Picture + if i < len(alphas) { + alpha = alphas[i] + } + + img, err := toImage(pic, alpha, out.Color, o.ToYCbCr) + if err != nil { + return nil, err + } + + if o.AutoRotate && f.meta != nil { + if it, err := f.primary(); err == nil { + if img, err = f.transform(it, img); err != nil { + return nil, err + } + } + } + + out.Image = append(out.Image, img) + + d := 0.0 + if i < len(t.deltas) { + d = float64(t.deltas[i]) / float64(t.timescale) + } + + out.Delay = append(out.Delay, d) + } + + if len(out.Image) == 0 { + return nil, nil + } + + return out, nil +} + +// sequenceColor takes the color description from the primary item when the +// file carries one, and otherwise from what the sequence itself declares. +func (f *file) sequenceColor(pic *hevc.Picture) ColorInfo { + var it *item + + if f.meta != nil { + it, _ = f.primary() + } + + return f.colorInfo(it, pic) +} + +func (f *file) decodeTrack(t *track, maxFrames int) ([]*hevc.Picture, error) { + if t.hvcC == nil { + return nil, ErrInvalid + } + + // A sample needs at least one byte, so a table claiming more samples than + // the file has bytes is describing data that cannot exist. + if uint64(len(t.samples)) > f.src.size { + return nil, ErrInvalid + } + + var d hevc.Decoder + d.FrameSizeLimit(f.limit()) + d.Budget(f.budget) + d.Threads(f.workers(0)) + + for _, nal := range t.hvcC.paramSets { + u, ok := hevc.ParseNAL(nal) + if !ok || u.Type.IsVCL() { + return nil, ErrInvalid + } + + if _, err := d.DecodeNAL(u); err != nil { + return nil, wrap(err) + } + } + + var out []*hevc.Picture + complete := false + defer func() { + if !complete { + releasePictures(out) + } + }() + var pixels uint64 + take := func(pics []*hevc.Picture) error { + for i, pic := range pics { + if maxFrames > 0 && len(out) >= maxFrames { + releasePictures(pics[i:]) + return errStop + } + n := uint64(pic.Width) * uint64(pic.Height) + if limit := f.limit(); limit > 0 && n > uint64(limit)-pixels { + releasePictures(pics[i:]) + return ErrUnsupported + } + pixels += n + out = append(out, pic) + } + if maxFrames > 0 && len(out) >= maxFrames { + return errStop + } + return nil + } + + for sampleIndex, s := range t.samples { + // A first-frame request must not scan a long run of non-output + // samples. The DPB itself is independently bounded by the SPS parser. + if maxFrames == 1 && sampleIndex >= 64 { + return nil, ErrUnsupported + } + if s.len == 0 || s.len > maxItemBytes { + return nil, ErrInvalid + } + + b, err := f.src.at(s.off, s.len) + if err != nil { + return nil, err + } + + err = eachNAL(b, t.hvcC.lengthSize, func(u hevc.NALUnit) error { + pics, err := d.DecodeNAL(u) + if err != nil { + releasePictures(pics) + return wrap(err) + } + return take(pics) + }) + if errors.Is(err, errStop) { + complete = true + return out, nil + } + if err != nil { + return nil, err + } + } + if err := take(d.Flush()); err != nil && !errors.Is(err, errStop) { + return nil, err + } + complete = true + return out, nil +} diff --git a/third_party/h265/heic/transform.go b/third_party/h265/heic/transform.go new file mode 100644 index 00000000..573ea721 --- /dev/null +++ b/third_party/h265/heic/transform.go @@ -0,0 +1,189 @@ +package heic + +import "image" + +type raw struct { + pix []byte + stride int + w, h int + psize int +} + +func toRaw(img image.Image) (*raw, bool) { + switch m := img.(type) { + case *image.NRGBA: + return &raw{m.Pix, m.Stride, m.Rect.Dx(), m.Rect.Dy(), 4}, true + case *image.NRGBA64: + return &raw{m.Pix, m.Stride, m.Rect.Dx(), m.Rect.Dy(), 8}, true + } + + return nil, false +} + +func (r *raw) toImage() image.Image { + rect := image.Rect(0, 0, r.w, r.h) + if r.psize == 4 { + return &image.NRGBA{Pix: r.pix, Stride: r.stride, Rect: rect} + } + + return &image.NRGBA64{Pix: r.pix, Stride: r.stride, Rect: rect} +} + +func (r *raw) alloc(w, h int) *raw { + return &raw{pix: make([]byte, w*h*r.psize), stride: w * r.psize, w: w, h: h, psize: r.psize} +} + +func (r *raw) at(x, y int) []byte { + o := y*r.stride + x*r.psize + + return r.pix[o : o+r.psize] +} + +func (r *raw) crop(x, y, w, h int) *raw { + out := r.alloc(w, h) + for j := range h { + copy(out.pix[j*out.stride:][:w*r.psize], r.at(x, y+j)[:w*r.psize]) + } + + return out +} + +// rotate turns the image anti-clockwise by angle quarter turns. +func (r *raw) rotate(angle int) *raw { + if angle == 0 { + return r + } + w, h := r.w, r.h + if angle&1 != 0 { + w, h = h, w + } + out := r.alloc(w, h) + + for j := range r.h { + for i := range r.w { + var dx, dy int + switch angle { + case 1: + dx, dy = j, r.w-1-i + case 2: + dx, dy = r.w-1-i, r.h-1-j + default: + dx, dy = r.h-1-j, i + } + copy(out.at(dx, dy), r.at(i, j)) + } + } + + return out +} + +func (r *raw) mirror(axis int) *raw { + if axis == 0 { + for y := range r.h / 2 { + a := r.pix[y*r.stride:][:r.w*r.psize] + b := r.pix[(r.h-1-y)*r.stride:][:r.w*r.psize] + for i := range a { + a[i], b[i] = b[i], a[i] + } + } + + return r + } + + for y := range r.h { + for x := range r.w / 2 { + a, b := r.at(x, y), r.at(r.w-1-x, y) + for i := range a { + a[i], b[i] = b[i], a[i] + } + } + } + + return r +} + +// cropRect derives the clean aperture rectangle, in fractions throughout. +func cropRect(clap *[8]uint32, w, h int) (int, int, int, int, bool) { + widthN, widthD := int64(int32(clap[0])), int64(int32(clap[1])) + heightN, heightD := int64(int32(clap[2])), int64(int32(clap[3])) + horizN, horizD := int64(int32(clap[4])), int64(int32(clap[5])) + vertN, vertD := int64(int32(clap[6])), int64(int32(clap[7])) + + if widthD <= 0 || heightD <= 0 || horizD <= 0 || vertD <= 0 || + widthN < 0 || heightN < 0 { + return 0, 0, 0, 0, false + } + if widthN%widthD != 0 || heightN%heightD != 0 { + return 0, 0, 0, 0, false + } + clapW, clapH := widthN/widthD, heightN/heightD + + numX := int64(w)*horizD + 2*horizN - clapW*horizD + denX := 2 * horizD + numY := int64(h)*vertD + 2*vertN - clapH*vertD + denY := 2 * vertD + if numX%denX != 0 || numY%denY != 0 { + return 0, 0, 0, 0, false + } + x, y := numX/denX, numY/denY + + if x < 0 || y < 0 || clapW <= 0 || clapH <= 0 || + x+clapW > int64(w) || y+clapH > int64(h) { + return 0, 0, 0, 0, false + } + + return int(x), int(y), int(clapW), int(clapH), true +} + +// applyTransforms runs clean aperture, then rotation, then mirroring, per MIAF 7.3.6.7. +// hasTransform reports whether AutoRotate would have to touch the pixels. +func (f *file) hasTransform(it *item) bool { + return f.meta.prop(it, "clap") != nil || f.meta.prop(it, "irot") != nil || + f.meta.prop(it, "imir") != nil +} + +func (f *file) applyTransforms(img image.Image, it *item) (image.Image, error) { + clap := f.meta.prop(it, "clap") + irot := f.meta.prop(it, "irot") + imir := f.meta.prop(it, "imir") + if clap == nil && irot == nil && imir == nil { + return img, nil + } + + r, ok := toRaw(img) + if !ok { + return nil, ErrUnsupported + } + + if clap != nil { + x, y, w, h, ok := cropRect(&clap.clap, r.w, r.h) + if !ok { + return nil, ErrInvalid + } + if x != 0 || y != 0 || w != r.w || h != r.h { + r = r.crop(x, y, w, h) + } + } + if irot != nil { + r = r.rotate(int(irot.angle)) + } + if imir != nil { + r = r.mirror(int(imir.axis)) + } + + return r.toImage(), nil +} + +// transform applies the clap, irot and imir properties. The planar images the +// ToYCbCr path returns alias the decoded planes, so they are converted first. +func (f *file) transform(it *item, img image.Image) (image.Image, error) { + if !f.hasTransform(it) { + return img, nil + } + + if aliasesPicture(img) { + return nil, ErrUnsupported + } + + return f.applyTransforms(img, it) +} diff --git a/third_party/h265/heic/ycbcr.go b/third_party/h265/heic/ycbcr.go new file mode 100644 index 00000000..218a7246 --- /dev/null +++ b/third_party/h265/heic/ycbcr.go @@ -0,0 +1,404 @@ +package heic + +import "image" + +// toYCbCr converts img to the 8-bit planes the encoder codes, at a size the +// sampling resolves: a dimension the chroma cannot divide repeats its edge, +// which ispe then hides. keepAlpha leaves the color un-composited. +func toYCbCr(img image.Image, sub image.YCbCrSubsampleRatio, keepAlpha bool) *image.YCbCr { + b := img.Bounds() + sw, sh := ratioSub(sub) + even := image.Rect(0, 0, roundUp(b.Dx(), sw), roundUp(b.Dy(), sh)) + + if ycc, ok := img.(*image.YCbCr); ok { + if ycc.SubsampleRatio == sub && ycc.Rect == even { + return ycc + } + + return ycbcrTo(ycc, even, sub) + } + + if a, ok := img.(*image.NYCbCrA); ok { + return ycbcrTo(&a.YCbCr, even, sub) + } + + return rgbTo(img, even, sub, keepAlpha) +} + +// toYCbCr420 is toYCbCr at the sampling this package has always written. +func toYCbCr420(img image.Image, keepAlpha bool) *image.YCbCr { + return toYCbCr(img, image.YCbCrSubsampleRatio420, keepAlpha) +} + +// toGray is the luma plane on its own, for a picture coded without chroma. +func toGray(img image.Image, keepAlpha bool) []byte { + b := img.Bounds() + w, h := b.Dx(), b.Dy() + out := make([]byte, w*h) + + switch src := img.(type) { + case *image.Gray: + for y := range h { + copy(out[y*w:], src.Pix[src.PixOffset(b.Min.X, b.Min.Y+y):][:w]) + } + + return out + case *image.YCbCr: + for y := range h { + copy(out[y*w:], src.Y[src.YOffset(b.Min.X, b.Min.Y+y):][:w]) + } + + return out + } + + buf := make([]byte, 4*w) + + for y := range h { + px := readRow(img, b, y, buf, keepAlpha) + + for x := range w { + p := px[4*x:] + out[y*w+x], _, _ = rgbToYCbCr(p[0], p[1], p[2]) + } + } + + return out +} + +// toDeep converts img to sixteen bit planes at a sampling and a sample size, +// the way toYCbCr does at eight. The color comes through image.Color, which +// hands back sixteen bits whatever the source holds. +func toDeep(img image.Image, sub image.YCbCrSubsampleRatio, depth int, + keepAlpha bool, +) (even image.Rectangle, y, cb, cr []uint16) { + b := img.Bounds() + w, h := b.Dx(), b.Dy() + sw, sh := ratioSub(sub) + even = image.Rect(0, 0, roundUp(w, sw), roundUp(h, sh)) + + y = make([]uint16, even.Dx()*even.Dy()) + cb = make([]uint16, even.Dx()/sw*even.Dy()/sh) + cr = make([]uint16, len(cb)) + + for cy := range even.Dy() / sh { + for cx := range even.Dx() / sw { + var sumCb, sumCr, n int32 + + for j := range sh { + for i := range sw { + px, py := min(cx*sw+i, w-1), min(cy*sh+j, h-1) + r, g, bl, a := img.At(b.Min.X+px, b.Min.Y+py).RGBA() + + if keepAlpha { + r, g, bl = unpremul16(r, a), unpremul16(g, a), unpremul16(bl, a) + } + + l, pcb, pcr := rgbToYCbCrDeep(r, g, bl, depth) + y[(cy*sh+j)*even.Dx()+cx*sw+i] = l + sumCb, sumCr, n = sumCb+int32(pcb), sumCr+int32(pcr), n+1 + } + } + + cb[cy*(even.Dx()/sw)+cx] = uint16((sumCb + n/2) / n) + cr[cy*(even.Dx()/sw)+cx] = uint16((sumCr + n/2) / n) + } + } + + return even, y, cb, cr +} + +// alphaDeep is alphaPlane at a sample size above eight. +func alphaDeep(img image.Image, even image.Rectangle, depth int) []uint16 { + if o, ok := img.(interface{ Opaque() bool }); ok && o.Opaque() { + return nil + } + + b := img.Bounds() + w, h := b.Dx(), b.Dy() + out := make([]uint16, even.Dx()*even.Dy()) + top := uint16(1<> (16 - depth)) + out[j*even.Dx()+i] = v + + if v != top { + opaque = false + } + } + } + + if opaque { + return nil + } + + return out +} + +// rgbToYCbCrDeep is the full range BT.601 matrix at a sample size, taking the +// sixteen bit components image.Color hands back. +func rgbToYCbCrDeep(r, g, b uint32, depth int) (uint16, uint16, uint16) { + sh := 16 - depth + top := int32(1)<>sh), int32(g>>sh), int32(b>>sh) + + y := (19595*r1 + 38470*g1 + 7471*b1 + 1<<15) >> 16 + cb := (-11056*r1-21712*g1+32768*b1+1<<15)>>16 + half + cr := (32768*r1-27440*g1-5328*b1+1<<15)>>16 + half + + return uint16(min(max(y, 0), top)), uint16(min(max(cb, 0), top)), + uint16(min(max(cr, 0), top)) +} + +func unpremul16(c, a uint32) uint32 { + if a == 0 { + return 0 + } + + return min(c*0xffff/a, 0xffff) +} + +// ratioSub is SubWidthC and SubHeightC for the samplings this package writes. +func ratioSub(sub image.YCbCrSubsampleRatio) (int, int) { + switch sub { + case image.YCbCrSubsampleRatio444: + return 1, 1 + case image.YCbCrSubsampleRatio422: + return 2, 1 + default: + return 2, 2 + } +} + +func roundUp(n, to int) int { + return (n + to - 1) / to * to +} + +// alphaPlane is the alpha of img at luma resolution, padded the way the luma +// is, or nil for a picture that is opaque and needs no auxiliary item. +func alphaPlane(img image.Image, even image.Rectangle) []uint8 { + if o, ok := img.(interface{ Opaque() bool }); ok && o.Opaque() { + return nil + } + + b := img.Bounds() + w, h := b.Dx(), b.Dy() + out := make([]uint8, even.Dx()*even.Dy()) + opaque := true + + for y := range even.Dy() { + sy := b.Min.Y + min(y, h-1) + row := out[y*even.Dx():][:even.Dx()] + + alphaRow(img, b.Min.X, sy, w, row) + fillEdge(row, w) + + for _, a := range row { + if a != 0xff { + opaque = false + + break + } + } + } + + if opaque { + return nil + } + + return out +} + +func alphaRow(img image.Image, x, y, w int, dst []uint8) { + switch src := img.(type) { + case *image.NRGBA: + p := src.Pix[src.PixOffset(x, y):] + + for i := range w { + dst[i] = p[4*i+3] + } + case *image.RGBA: + p := src.Pix[src.PixOffset(x, y):] + + for i := range w { + dst[i] = p[4*i+3] + } + case *image.NYCbCrA: + p := src.A[src.AOffset(x, y):] + + copy(dst[:w], p[:w]) + default: + for i := range w { + _, _, _, a := img.At(x+i, y).RGBA() + dst[i] = uint8(a >> 8) + } + } +} + +// ycbcrTo resamples any subsampling to another through COffset, which resolves +// the source ratio for us, so a matching one copies and the rest average. +func ycbcrTo(src *image.YCbCr, even image.Rectangle, sub image.YCbCrSubsampleRatio) *image.YCbCr { + out := image.NewYCbCr(even, sub) + sw, sh := ratioSub(sub) + b := src.Rect + w, h := b.Dx(), b.Dy() + + for y := range even.Dy() { + row := out.Y[y*out.YStride:][:even.Dx()] + copy(row, src.Y[src.YOffset(b.Min.X, b.Min.Y+min(y, h-1)):][:w]) + fillEdge(row, w) + } + + for cy := range even.Dy() / sh { + for cx := range even.Dx() / sw { + var cb, cr, n int32 + + for j := range sh { + y := b.Min.Y + min(cy*sh+j, h-1) + + for i := range sw { + o := src.COffset(b.Min.X+min(cx*sw+i, w-1), y) + cb, cr, n = cb+int32(src.Cb[o]), cr+int32(src.Cr[o]), n+1 + } + } + + out.Cb[cy*out.CStride+cx] = byte((cb + n/2) / n) + out.Cr[cy*out.CStride+cx] = byte((cr + n/2) / n) + } + } + + return out +} + +func rgbTo(img image.Image, even image.Rectangle, sub image.YCbCrSubsampleRatio, + keepAlpha bool, +) *image.YCbCr { + out := image.NewYCbCr(even, sub) + sw, sh := ratioSub(sub) + b := img.Bounds() + w, h := b.Dx(), b.Dy() + + rows := make([][]byte, sh) + px := make([][]byte, sh) + + for j := range rows { + rows[j] = make([]byte, 4*w) + } + + for y := 0; y < even.Dy(); y += sh { + for j := range sh { + px[j] = readRow(img, b, min(y+j, h-1), rows[j], keepAlpha) + } + + for x := 0; x < even.Dx(); x += sw { + var cb, cr, n int32 + + for j := range sh { + row := out.Y[(y+j)*out.YStride:] + + for i := range sw { + p := px[j][4*min(x+i, w-1):] + l, pcb, pcr := rgbToYCbCr(p[0], p[1], p[2]) + row[x+i] = l + cb, cr, n = cb+int32(pcb), cr+int32(pcr), n+1 + } + } + + out.Cb[y/sh*out.CStride+x/sw] = byte((cb + n/2) / n) + out.Cr[y/sh*out.CStride+x/sw] = byte((cr + n/2) / n) + } + } + + return out +} + +func fillEdge(row []byte, w int) { + for i := w; i < len(row); i++ { + row[i] = row[w-1] + } +} + +// readRow returns row y of img as RGB samples with a four byte pixel stride, +// composited over black unless keepAlpha asks for the color an alpha item +// will be read against, which a non-premultiplied source already holds. +func readRow(img image.Image, b image.Rectangle, y int, dst []byte, keepAlpha bool) []byte { + w := b.Dx() + + switch src := img.(type) { + case *image.RGBA: + p := src.Pix[src.PixOffset(b.Min.X, b.Min.Y+y):] + + if !keepAlpha { + return p + } + + for x, o := 0, 0; x < w; x, o = x+1, o+4 { + a := uint32(p[o+3]) + + for c := range 3 { + dst[o+c] = unpremul(uint32(p[o+c]), a) + } + } + case *image.NRGBA: + p := src.Pix[src.PixOffset(b.Min.X, b.Min.Y+y):] + + if keepAlpha { + return p + } + + for x, o := 0, 0; x < w; x, o = x+1, o+4 { + a := uint32(p[o+3]) + dst[o] = byte(uint32(p[o]) * a / 255) + dst[o+1] = byte(uint32(p[o+1]) * a / 255) + dst[o+2] = byte(uint32(p[o+2]) * a / 255) + } + case *image.Gray: + p := src.Pix[src.PixOffset(b.Min.X, b.Min.Y+y):] + + for x, o := 0, 0; x < w; x, o = x+1, o+4 { + v := p[x] + dst[o], dst[o+1], dst[o+2] = v, v, v + } + default: + for x, o := 0, 0; x < w; x, o = x+1, o+4 { + r, g, bl, a := img.At(b.Min.X+x, b.Min.Y+y).RGBA() + + if keepAlpha { + dst[o], dst[o+1], dst[o+2] = unpremul(r, a), unpremul(g, a), unpremul(bl, a) + + continue + } + + dst[o], dst[o+1], dst[o+2] = byte(r>>8), byte(g>>8), byte(bl>>8) + } + } + + return dst +} + +// unpremul takes a premultiplied component back to the color an alpha channel +// is read against. Where nothing is left of the alpha, neither is the color. +func unpremul(c, a uint32) byte { + if a == 0 { + return 0 + } + + return byte(min(c*0xffff/a, 0xffff) >> 8) +} + +// rgbToYCbCr is the full range BT.601 matrix, which is what image.YCbCr holds +// and what the nclx description this package writes declares. +func rgbToYCbCr(r, g, b byte) (byte, byte, byte) { + r1, g1, b1 := int32(r), int32(g), int32(b) + + y := (19595*r1 + 38470*g1 + 7471*b1 + 1<<15) >> 16 + cb := (-11056*r1 - 21712*g1 + 32768*b1 + 257<<15) >> 16 + cr := (32768*r1 - 27440*g1 - 5328*b1 + 257<<15) >> 16 + + return byte(y), byte(min(max(cb, 0), 255)), byte(min(max(cr, 0), 255)) +} diff --git a/third_party/h265/hevc/budget.go b/third_party/h265/hevc/budget.go new file mode 100644 index 00000000..d5eda011 --- /dev/null +++ b/third_party/h265/hevc/budget.go @@ -0,0 +1,36 @@ +package hevc + +import "sync/atomic" + +// DecodeBudget bounds the total coded pixel area processed by decoders sharing +// it, including pictures that are cropped, discarded or never output. A budget +// may be shared across concurrent grid/alpha decoders. A nil budget is unlimited. +type DecodeBudget struct { + remaining atomic.Int64 +} + +// NewDecodeBudget creates a budget of n coded pixels. Negative n permits none. +func NewDecodeBudget(n int64) *DecodeBudget { + b := &DecodeBudget{} + b.remaining.Store(max(n, 0)) + return b +} + +func (b *DecodeBudget) take(n int64) bool { + if b == nil { + return true + } + for { + left := b.remaining.Load() + if n > left || n <= 0 { + return false + } + if b.remaining.CompareAndSwap(left, left-n) { + return true + } + } +} + +// Budget attaches an aggregate work budget without resetting its consumption. +// Configure the decoder before calling DecodeNAL. +func (d *Decoder) Budget(b *DecodeBudget) { d.budget = b } diff --git a/third_party/h265/hevc/cabac.go b/third_party/h265/hevc/cabac.go new file mode 100644 index 00000000..26b5116c --- /dev/null +++ b/third_party/h265/hevc/cabac.go @@ -0,0 +1,237 @@ +package hevc + +import ( + "math" + "math/bits" +) + +const nContexts = 179 + +const ( + cabacBits = 16 + cabacMask = 1<= 62 { + mps = st + } + + lps := int(transIdxLPS[st]) + + for v := range 2 { + s := 2*st + v + + transState[128+s] = uint8(2*mps + v) + + flipped := v + if st == 0 { + flipped = 1 - v + } + + transState[127-s] = uint8(2*lps + flipped) + } + } +} + +func normShift(r uint32) uint { + return uint(9 - bits.Len32(r)) +} + +type cabac struct { + low uint32 + rng uint32 + data []byte + pos int + state [nContexts]uint8 +} + +func (c *cabac) init(data []byte, off int) error { + if off < 0 || off+2 > len(data) { + return ErrInvalid + } + + c.data = data + c.low = uint32(data[off])<<18 + uint32(data[off+1])<<10 + 1<<9 + c.rng = 0x1fe + c.pos = off + 2 + + return nil +} + +func (c *cabac) initContexts(qp int32, t sliceType, cabacInit bool) { + row := &initValues[initType(t, cabacInit)] + + for i := range c.state { + c.state[i] = initState(row[i], qp) + } +} + +func initType(t sliceType, cabacInit bool) int { + n := 2 - int(t) + if cabacInit && t != sliceI { + n ^= 3 + } + + return n +} + +func initState(v uint8, qp int32) uint8 { + m := int32(v>>4)*5 - 45 + n := int32(v&0x0f)<<3 - 16 + + if qp < 0 { + qp = 0 + } else if qp > 51 { + qp = 51 + } + + s := 2*((m*qp>>4)+n) - 127 + s ^= s >> 31 + + if s > 124 { + s = 124 + s&1 + } + + return uint8(s) +} + +func (c *cabac) byteAt(i int) uint32 { + if i < len(c.data) { + return uint32(c.data[i]) + } + + return 0 +} + +func (c *cabac) refill() { + c.low += c.byteAt(c.pos)<<9 + c.byteAt(c.pos+1)<<1 - cabacMask + c.pos += 2 +} + +func (c *cabac) refillShifted() { + i := uint(bits.TrailingZeros32(c.low) - cabacBits) + x := c.byteAt(c.pos)<<9 + c.byteAt(c.pos+1)<<1 - cabacMask + c.low += x << i + c.pos += 2 +} + +func (c *cabac) decodeBin(ctx int) uint32 { + s := c.state[ctx] + lps := uint32(lpsRange[c.rng>>6&3][s]) + + c.rng -= lps + + mask := uint32(int32(c.rng<<(cabacBits+1)-c.low) >> 31) + + c.low -= c.rng << (cabacBits + 1) & mask + c.rng += (lps - c.rng) & mask + + signed := int32(s) ^ int32(mask) + c.state[ctx] = transState[128+signed] + + shift := normShift(c.rng) + c.rng <<= shift + c.low <<= shift + + if c.low&cabacMask == 0 { + c.refillShifted() + } + + return uint32(signed & 1) +} + +func (c *cabac) decodeBypass() uint32 { + c.low += c.low + if c.low&cabacMask == 0 { + c.refill() + } + + r := c.rng << (cabacBits + 1) + if c.low < r { + return 0 + } + + c.low -= r + + return 1 +} + +func (c *cabac) decodeBypassBits(n int) uint32 { + var v uint32 + + for range n { + v = v<<1 | c.decodeBypass() + } + + return v +} + +func (c *cabac) decodeTerminate() uint32 { + c.rng -= 2 + + if c.low >= c.rng<<(cabacBits+1) { + return 1 + } + + if c.rng < 256 { + c.rng <<= 1 + c.low <<= 1 + + if c.low&cabacMask == 0 { + c.refill() + } + } + + return 0 +} + +func (c *cabac) pcmOffset() int { + n := c.pos + + if c.low&0x1 != 0 { + n-- + } + + if c.low&0x1ff != 0 { + n-- + } + + return n +} diff --git a/third_party/h265/hevc/cabac_tables.go b/third_party/h265/hevc/cabac_tables.go new file mode 100644 index 00000000..30ef327f --- /dev/null +++ b/third_party/h265/hevc/cabac_tables.go @@ -0,0 +1,294 @@ +package hevc + +// Table 9-46. +var rangeTabLPS = [64][4]uint8{ + {128, 176, 208, 240}, + {128, 167, 197, 227}, + {128, 158, 187, 216}, + {123, 150, 178, 205}, + {116, 142, 169, 195}, + {111, 135, 160, 185}, + {105, 128, 152, 175}, + {100, 122, 144, 166}, + {95, 116, 137, 158}, + {90, 110, 130, 150}, + {85, 104, 123, 142}, + {81, 99, 117, 135}, + {77, 94, 111, 128}, + {73, 89, 105, 122}, + {69, 85, 100, 116}, + {66, 80, 95, 110}, + {62, 76, 90, 104}, + {59, 72, 86, 99}, + {56, 69, 81, 94}, + {53, 65, 77, 89}, + {51, 62, 73, 85}, + {48, 59, 69, 80}, + {46, 56, 66, 76}, + {43, 53, 63, 72}, + {41, 50, 59, 69}, + {39, 48, 56, 65}, + {37, 45, 54, 62}, + {35, 43, 51, 59}, + {33, 41, 48, 56}, + {32, 39, 46, 53}, + {30, 37, 43, 50}, + {29, 35, 41, 48}, + {27, 33, 39, 45}, + {26, 31, 37, 43}, + {24, 30, 35, 41}, + {23, 28, 33, 39}, + {22, 27, 32, 37}, + {21, 26, 30, 35}, + {20, 24, 29, 33}, + {19, 23, 27, 31}, + {18, 22, 26, 30}, + {17, 21, 25, 28}, + {16, 20, 23, 27}, + {15, 19, 22, 25}, + {14, 18, 21, 24}, + {14, 17, 20, 23}, + {13, 16, 19, 22}, + {12, 15, 18, 21}, + {12, 14, 17, 20}, + {11, 14, 16, 19}, + {11, 13, 15, 18}, + {10, 12, 15, 17}, + {10, 12, 14, 16}, + {9, 11, 13, 15}, + {9, 11, 12, 14}, + {8, 10, 12, 14}, + {8, 9, 11, 13}, + {7, 9, 11, 12}, + {7, 9, 10, 12}, + {7, 8, 10, 11}, + {6, 8, 9, 11}, + {6, 7, 9, 10}, + {6, 7, 8, 9}, + {2, 2, 2, 2}, +} + +// Table 9-47. +var transIdxLPS = [64]uint8{ + 0, 0, 1, 2, 2, 4, 4, 5, 6, 7, 8, 9, 9, 11, 11, 12, + 13, 13, 15, 15, 16, 16, 18, 18, 19, 19, 21, 21, 22, 22, 23, 24, + 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 30, 31, 32, 32, 33, + 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 63, +} + +// Table 9-4. +var initValues = [3][nContexts]uint8{ + { + 153, 200, 139, 141, 157, 154, 154, 154, 154, 154, 154, 154, 154, 184, 154, 154, + 154, 184, 63, 139, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, 154, 154, 153, 138, 138, 111, 141, 94, 138, 182, 154, 154, 139, + 139, 139, 139, 139, 139, 110, 110, 124, 125, 140, 153, 125, 127, 140, 109, 111, + 143, 127, 111, 79, 108, 123, 63, 110, 110, 124, 125, 140, 153, 125, 127, 140, + 109, 111, 143, 127, 111, 79, 108, 123, 63, 91, 171, 134, 141, 111, 111, 125, + 110, 110, 94, 124, 108, 124, 107, 125, 141, 179, 153, 125, 107, 125, 141, 179, + 153, 125, 107, 125, 141, 179, 153, 125, 140, 139, 182, 182, 152, 136, 152, 136, + 153, 136, 139, 111, 136, 139, 111, 141, 111, 140, 92, 137, 138, 140, 152, 138, + 139, 153, 74, 149, 92, 139, 107, 122, 152, 140, 179, 166, 182, 140, 227, 122, + 197, 138, 153, 136, 167, 152, 152, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, + }, + { + 153, 185, 107, 139, 126, 154, 197, 185, 201, 154, 154, 154, 149, 154, 139, 154, + 154, 154, 152, 139, 110, 122, 95, 79, 63, 31, 31, 153, 153, 153, 153, 140, + 198, 140, 198, 168, 79, 124, 138, 94, 153, 111, 149, 107, 167, 154, 154, 139, + 139, 139, 139, 139, 139, 125, 110, 94, 110, 95, 79, 125, 111, 110, 78, 110, + 111, 111, 95, 94, 108, 123, 108, 125, 110, 94, 110, 95, 79, 125, 111, 110, + 78, 110, 111, 111, 95, 94, 108, 123, 108, 121, 140, 61, 154, 155, 154, 139, + 153, 139, 123, 123, 63, 153, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, + 153, 154, 166, 183, 140, 136, 153, 154, 170, 153, 123, 123, 107, 121, 107, 121, + 167, 151, 183, 140, 151, 183, 140, 140, 140, 154, 196, 196, 167, 154, 152, 167, + 182, 182, 134, 149, 136, 153, 121, 136, 137, 169, 194, 166, 167, 154, 167, 137, + 182, 107, 167, 91, 122, 107, 167, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, + }, + { + 153, 160, 107, 139, 126, 154, 197, 185, 201, 154, 154, 154, 134, 154, 139, 154, + 154, 183, 152, 139, 154, 137, 95, 79, 63, 31, 31, 153, 153, 153, 153, 169, + 198, 169, 198, 168, 79, 224, 167, 122, 153, 111, 149, 92, 167, 154, 154, 139, + 139, 139, 139, 139, 139, 125, 110, 124, 110, 95, 94, 125, 111, 111, 79, 125, + 126, 111, 111, 79, 108, 123, 93, 125, 110, 124, 110, 95, 94, 125, 111, 111, + 79, 125, 126, 111, 111, 79, 108, 123, 93, 121, 140, 61, 154, 170, 154, 139, + 153, 139, 123, 123, 63, 124, 166, 183, 140, 136, 153, 154, 166, 183, 140, 136, + 153, 154, 166, 183, 140, 136, 153, 154, 170, 153, 138, 138, 122, 121, 122, 121, + 167, 151, 183, 140, 151, 183, 140, 140, 140, 154, 196, 167, 167, 154, 152, 167, + 182, 182, 134, 149, 136, 153, 121, 136, 122, 169, 208, 166, 167, 154, 152, 167, + 182, 107, 167, 91, 107, 107, 167, 154, 154, 154, 154, 154, 154, 154, 154, 154, + 154, 154, 154, + }, +} + +// Offsets of each syntax element's first context, 9.3.2.2. +const ( + ctxSAOMergeFlag = 0 + ctxSAOTypeIDX = 1 + ctxSplitCodingUnitFlag = 2 + ctxCUTransquantBypassFlag = 5 + ctxSkipFlag = 6 + ctxCUQPDelta = 9 + ctxPredModeFlag = 12 + ctxPartMode = 13 + ctxPrevIntraLumaPredFlag = 17 + ctxIntraChromaPredMode = 18 + ctxMergeFlag = 20 + ctxMergeIDX = 21 + ctxInterPredIDC = 22 + ctxRefIDXL0 = 27 + ctxRefIDXL1 = 29 + ctxAbsMVDGreater0Flag = 31 + ctxAbsMVDGreater1Flag = 33 + ctxMVPLXFlag = 35 + ctxNoResidualDataFlag = 36 + ctxSplitTransformFlag = 37 + ctxCBFLuma = 40 + ctxCBFCBCR = 42 + ctxTransformSkipFlag = 47 + ctxExplicitRDPCMFlag = 49 + ctxExplicitRDPCMDirFlag = 51 + ctxLastSignificantCoeffXPrefix = 53 + ctxLastSignificantCoeffYPrefix = 71 + ctxSignificantCoeffGroupFlag = 89 + ctxSignificantCoeffFlag = 93 + ctxCoeffAbsLevelGreater1Flag = 137 + ctxCoeffAbsLevelGreater2Flag = 161 + ctxLog2ResScaleAbs = 167 + ctxResScaleSignFlag = 175 + ctxCUChromaQPOffsetFlag = 177 + ctxCUChromaQPOffsetIDX = 178 +) + +// The 32-point inverse transform matrix. +var transMatrix = [32][32]int8{ + { + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + }, + { + 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4, + -4, -13, -22, -31, -38, -46, -54, -61, -67, -73, -78, -82, -85, -88, -90, -90, + }, + { + 90, 87, 80, 70, 57, 43, 25, 9, -9, -25, -43, -57, -70, -80, -87, -90, + -90, -87, -80, -70, -57, -43, -25, -9, 9, 25, 43, 57, 70, 80, 87, 90, + }, + { + 90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13, + 13, 38, 61, 78, 88, 90, 85, 73, 54, 31, 4, -22, -46, -67, -82, -90, + }, + { + 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89, + 89, 75, 50, 18, -18, -50, -75, -89, -89, -75, -50, -18, 18, 50, 75, 89, + }, + { + 88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22, + -22, -61, -85, -90, -73, -38, 4, 46, 78, 90, 82, 54, 13, -31, -67, -88, + }, + { + 87, 57, 9, -43, -80, -90, -70, -25, 25, 70, 90, 80, 43, -9, -57, -87, + -87, -57, -9, 43, 80, 90, 70, 25, -25, -70, -90, -80, -43, 9, 57, 87, + }, + { + 85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31, + 31, 78, 90, 61, 4, -54, -88, -82, -38, 22, 73, 90, 67, 13, -46, -85, + }, + { + 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, + 83, 36, -36, -83, -83, -36, 36, 83, 83, 36, -36, -83, -83, -36, 36, 83, + }, + { + 82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38, + -38, -88, -73, -4, 67, 90, 46, -31, -85, -78, -13, 61, 90, 54, -22, -82, + }, + { + 80, 9, -70, -87, -25, 57, 90, 43, -43, -90, -57, 25, 87, 70, -9, -80, + -80, -9, 70, 87, 25, -57, -90, -43, 43, 90, 57, -25, -87, -70, 9, 80, + }, + { + 78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46, + 46, 90, 38, -54, -90, -31, 61, 88, 22, -67, -85, -13, 73, 82, 4, -78, + }, + { + 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75, + 75, -18, -89, -50, 50, 89, 18, -75, -75, 18, 89, 50, -50, -89, -18, 75, + }, + { + 73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54, + -54, -85, 4, 88, 46, -61, -82, 13, 90, 38, -67, -78, 22, 90, 31, -73, + }, + { + 70, -43, -87, 9, 90, 25, -80, -57, 57, 80, -25, -90, -9, 87, 43, -70, + -70, 43, 87, -9, -90, -25, 80, 57, -57, -80, 25, 90, 9, -87, -43, 70, + }, + { + 67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61, + 61, 73, -46, -82, 31, 88, -13, -90, -4, 90, 22, -85, -38, 78, 54, -67, + }, + { + 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, + 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, 64, -64, -64, 64, + }, + { + 61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67, + -67, -54, 78, 38, -85, -22, 90, 4, -90, 13, 88, -31, -82, 46, 73, -61, + }, + { + 57, -80, -25, 90, -9, -87, 43, 70, -70, -43, 87, 9, -90, 25, 80, -57, + -57, 80, 25, -90, 9, 87, -43, -70, 70, 43, -87, -9, 90, -25, -80, 57, + }, + { + 54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73, + 73, 31, -90, 22, 78, -67, -38, 90, -13, -82, 61, 46, -88, 4, 85, -54, + }, + { + 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50, + 50, -89, 18, 75, -75, -18, 89, -50, -50, 89, -18, -75, 75, 18, -89, 50, + }, + { + 46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78, + -78, -4, 82, -73, -13, 85, -67, -22, 88, -61, -31, 90, -54, -38, 90, -46, + }, + { + 43, -90, 57, 25, -87, 70, 9, -80, 80, -9, -70, 87, -25, -57, 90, -43, + -43, 90, -57, -25, 87, -70, -9, 80, -80, 9, 70, -87, 25, 57, -90, 43, + }, + { + 38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82, + 82, -22, -54, 90, -61, -13, 78, -85, 31, 46, -90, 67, 4, -73, 88, -38, + }, + { + 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, + 36, -83, 83, -36, -36, 83, -83, 36, 36, -83, 83, -36, -36, 83, -83, 36, + }, + { + 31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85, + -85, 46, 13, -67, 90, -73, 22, 38, -82, 88, -54, -4, 61, -90, 78, -31, + }, + { + 25, -70, 90, -80, 43, 9, -57, 87, -87, 57, -9, -43, 80, -90, 70, -25, + -25, 70, -90, 80, -43, -9, 57, -87, 87, -57, 9, 43, -80, 90, -70, 25, + }, + { + 22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88, + 88, -67, 31, 13, -54, 82, -90, 78, -46, 4, 38, -73, 90, -85, 61, -22, + }, + { + 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18, + 18, -50, 75, -89, 89, -75, 50, -18, -18, 50, -75, 89, -89, 75, -50, 18, + }, + { + 13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90, + -90, 82, -67, 46, -22, -4, 31, -54, 73, -85, 90, -88, 78, -61, 38, -13, + }, + { + 9, -25, 43, -57, 70, -80, 87, -90, 90, -87, 80, -70, 57, -43, 25, -9, + -9, 25, -43, 57, -70, 80, -87, 90, -90, 87, -80, 70, -57, 43, -25, 9, + }, + { + 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90, + 90, -90, 88, -85, 82, -78, 73, -67, 61, -54, 46, -38, 31, -22, 13, -4, + }, +} diff --git a/third_party/h265/hevc/cabacenc.go b/third_party/h265/hevc/cabacenc.go new file mode 100644 index 00000000..170de908 --- /dev/null +++ b/third_party/h265/hevc/cabacenc.go @@ -0,0 +1,165 @@ +package hevc + +// cabacWriter is the arithmetic encoder of 9.3.4. It always counts what it +// writes in rate, and one with no bits to write to only counts. +type cabacWriter struct { + low uint32 + rng uint32 + outstanding int + firstBit bool + bits *putBits + rate int64 + state [nContexts]uint8 +} + +func (w *cabacWriter) init(bits *putBits, qp int32, t sliceType, cabacInit bool) { + w.bits = bits + w.reinit() + + row := &initValues[initType(t, cabacInit)] + for i := range w.state { + w.state[i] = initState(row[i], qp) + } +} + +// counter is a copy of w that writes nothing. +func (w *cabacWriter) counter() cabacWriter { + c := *w + c.bits = nil + c.rate = 0 + + return c +} + +func (w *cabacWriter) reinit() { + w.low = 0 + w.rng = 510 + w.outstanding = 0 + w.firstBit = true +} + +func (w *cabacWriter) putBit(v uint32) { + if w.firstBit { + w.firstBit = false + } else { + w.bits.bit(v) + } + + for w.outstanding > 0 { + w.bits.bit(1 - v) + w.outstanding-- + } +} + +func (w *cabacWriter) renorm() { + for w.rng < 256 { + switch { + case w.low < 256: + w.putBit(0) + case w.low >= 512: + w.low -= 512 + w.putBit(1) + default: + w.low -= 256 + w.outstanding++ + } + + w.rng <<= 1 + w.low <<= 1 + } +} + +func (w *cabacWriter) encodeBin(ctx int, bin uint32) { + s := w.state[ctx] + mps := bin == uint32(s&1) + + signed := int32(s) + if !mps { + signed = -signed - 1 + } + + w.state[ctx] = transState[128+signed] + w.rate += int64(entropyBits[s^uint8(bin&1)]) + + if w.bits == nil { + return + } + + lps := uint32(lpsRange[w.rng>>6&3][s]) + w.rng -= lps + + if !mps { + w.low += w.rng + w.rng = lps + } + + w.renorm() +} + +func (w *cabacWriter) encodeBypass(bin uint32) { + w.rate += 1 << rateShift + + if w.bits == nil { + return + } + + w.low <<= 1 + if bin != 0 { + w.low += w.rng + } + + switch { + case w.low >= 1024: + w.low -= 1024 + w.putBit(1) + case w.low < 512: + w.putBit(0) + default: + w.low -= 512 + w.outstanding++ + } +} + +func (w *cabacWriter) encodeBypassBits(v uint32, n int) { + if w.bits == nil { + w.rate += int64(n) << rateShift + + return + } + + for i := n - 1; i >= 0; i-- { + w.encodeBypass(v >> uint(i) & 1) + } +} + +// encodeTerminate codes a bin against the fixed range of two, which is the +// probability state 63 holds. +func (w *cabacWriter) encodeTerminate(bin uint32) { + w.rate += int64(entropyBits[126+(bin&1)]) + + if w.bits == nil { + return + } + + w.rng -= 2 + if bin == 0 { + w.renorm() + + return + } + + w.low += w.rng + w.rng = 2 + w.renorm() + w.putBit(w.low >> 9 & 1) + w.bits.bit(w.low >> 8 & 1) + w.bits.bit(1) +} + +func (w *cabacWriter) bytes() []byte { + for w.bits.nbits != 0 { + w.bits.bit(0) + } + + return w.bits.bytes() +} diff --git a/third_party/h265/hevc/cpu_amd64.s b/third_party/h265/hevc/cpu_amd64.s new file mode 100644 index 00000000..49109e7d --- /dev/null +++ b/third_party/h265/hevc/cpu_amd64.s @@ -0,0 +1,77 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// cpuidAVX2 reports whether the CPU has AVX2 and the OS saves the YMM state. +TEXT ·cpuidAVX2(SB), NOSPLIT, $0-1 + MOVL $0, AX + CPUID + CMPL AX, $7 + JL no + + MOVL $1, AX + MOVL $0, CX + CPUID + BTL $27, CX // OSXSAVE + JNC no + + MOVL $0, CX + XGETBV + ANDL $6, AX // XMM and YMM state + CMPL AX, $6 + JNE no + + MOVL $7, AX + MOVL $0, CX + CPUID + BTL $5, BX // AVX2 + JNC no + + MOVB $1, ret+0(FP) + RET + +no: + MOVB $0, ret+0(FP) + RET + +// cpuidAVX512ICL reports whether the CPU has the Ice Lake AVX-512 feature set +// and the OS saves the ZMM state. +TEXT ·cpuidAVX512ICL(SB), NOSPLIT, $0-1 + MOVL $0, AX + CPUID + CMPL AX, $7 + JL noicl + + MOVL $1, AX + MOVL $0, CX + CPUID + ANDL $0x18000000, CX // OSXSAVE and AVX + CMPL CX, $0x18000000 + JNE noicl + + MOVL $0, CX + XGETBV + MOVL AX, DX + ANDL $6, AX // XMM and YMM state + CMPL AX, $6 + JNE noicl + ANDL $0xe0, DX // opmask, ZMM_Hi256 and Hi16_ZMM + CMPL DX, $0xe0 + JNE noicl + + MOVL $7, AX + MOVL $0, CX + CPUID + ANDL $0xd0230000, BX // F, DQ, IFMA, CD, BW, VL + CMPL BX, $0xd0230000 + JNE noicl + ANDL $0x00005f42, CX // VBMI, VBMI2, GFNI, VAES, VPCLMULQDQ, VNNI, BITALG, VPOPCNTDQ + CMPL CX, $0x00005f42 + JNE noicl + + MOVB $1, ret+0(FP) + RET + +noicl: + MOVB $0, ret+0(FP) + RET diff --git a/third_party/h265/hevc/ctu.go b/third_party/h265/hevc/ctu.go new file mode 100644 index 00000000..81715dc5 --- /dev/null +++ b/third_party/h265/hevc/ctu.go @@ -0,0 +1,1334 @@ +package hevc + +import "slices" + +const ( + partMode2Nx2N = iota + partMode2NxN + partModeNx2N + partModeNxN + partMode2NxnU + partMode2NxnD + partModenLx2N + partModenRx2N +) + +// Table 8-10 for ChromaArrayType 1, indexed by qPi - 30. +var chromaQPTable = [14]int8{29, 30, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37} + +func chromaQP(qPi int32, chromaArrayType uint32) int32 { + if chromaArrayType != 1 { + return min(qPi, 51) + } + + switch { + case qPi < 30: + return qPi + case qPi > 43: + return qPi - 6 + default: + return int32(chromaQPTable[qPi-30]) + } +} + +type ctuDecoder struct { + c cabac + s *sps + p *pps + sh *sliceHeader + pic *Picture + + minTbLog2 int + minTbWidth int + minTbAddr []int32 + + intraMode []uint8 + intraModeC []uint8 + cuDepth []uint8 + qpY []int8 + skipped []bool + noFilter []bool + bypass bool + + qpYPrev int32 + qpYCur int32 + qpYPred int32 + qgX, qgY int + qpCoded bool + qpDelta int32 + + // 8.6.1's CuQpOffsetCb and CuQpOffsetCr, coded once per chroma + // quantisation group when the picture carries an offset list. + cuOffCoded bool + cuOffCb int32 + cuOffCr int32 + statCoef [4]uint8 + scaling [maxScalingListSizes][maxScalingListMats][]uint8 + + // scalingFrom is the list d.scaling was derived from. Parsing a parameter + // set yields a new one, so the pointer changing is the only invalidation. + scalingFrom *scalingList + saoType [3]int + eoClass [2]int + sao [][3]saoParams + + blk []blockInfo + mvField []mvInfo + mvPoc [][2]int32 + mvLong [][2]bool + mvValid []bool + mvWidth int + curX int + curY int + cuX int + cuY int + cuSize int + puW int + puH int + partIdx int + curIntra bool + lastMerge bool + + refPOC [2][]int32 + refLong [2][]bool + refPics [2][]*Picture + poc int32 + colPic *Picture + noBackwardPred bool + + rsToTs []int32 + tsToRs []int32 + tileID []int32 + scanFor scanGeometry + built bool + + saved [nContexts]uint8 + hasSaved bool + + depSaved [nContexts]uint8 + hasDepSaved bool + + threads int + sliceAddrRs int + simpleAvail bool + ctbSliceAddr []int32 + sliceLF []bool + ctbSlice []int32 + slices []*sliceHeader + depSliceAddrRs int + + coef [32 * 32]int32 + scratch transformScratch + + // Scratch for one prediction unit, the largest being 64x64 luma. Motion + // compensation runs for every unit, so none of this may be allocated. + saoSrc8 []uint8 + saoSrc16 []uint16 + + mcBuf [2][64 * 64]int16 + mcTmp [(64 + 7) * 64]int32 + mcTmp16 [(64 + 7) * 64]int16 + mcPad8 [(64 + 7) * (64 + 7)]uint8 + mcPad16 [(64 + 7) * (64 + 7)]uint16 + mergeCd [8]mvInfo + ref refSamples + avail [4*32 + 1]bool +} + +// scanGeometry is everything the tile scan and the z-scan address table are +// built from. Every picture of a sequence shares it, and the tables cost more +// than the rest of the per-picture setup put together. +type scanGeometry struct { + widthInCtbs uint32 + heightInCtbs uint32 + ctbLog2SizeY uint8 + minTbLog2 uint8 + cols []uint32 + rows []uint32 +} + +func geometryOf(s *sps, p *pps) scanGeometry { + return scanGeometry{ + widthInCtbs: s.picWidthInCtbs, + heightInCtbs: s.picHeightInCtbs, + ctbLog2SizeY: s.ctbLog2SizeY, + minTbLog2: s.minTbLog2SizeY, + cols: p.colWidthsInCtbs, + rows: p.rowHeightsInCtbs, + } +} + +func (g scanGeometry) same(o scanGeometry) bool { + return g.widthInCtbs == o.widthInCtbs && g.heightInCtbs == o.heightInCtbs && + g.ctbLog2SizeY == o.ctbLog2SizeY && g.minTbLog2 == o.minTbLog2 && + slices.Equal(g.cols, o.cols) && slices.Equal(g.rows, o.rows) +} + +// newCTUDecoder prepares the per-picture state, reusing prev's buffers. They +// are sized from the sequence and grow when a larger one arrives. +func newCTUDecoder(prev *ctuDecoder, s *sps, p *pps, sh *sliceHeader, pic *Picture) *ctuDecoder { + d := prev + if d == nil { + d = &ctuDecoder{} + } + + minTbLog2 := int(s.minTbLog2SizeY) + tbW := (int(s.picWidthInLumaSamples) + 1<> minTbLog2 + tbH := (int(s.picHeightInLumaSamples) + 1<> minTbLog2 + mvW := (int(s.picWidthInLumaSamples) + 3) / 4 + mvH := (int(s.picHeightInLumaSamples) + 3) / 4 + ctbs := int(s.picWidthInCtbs) * int(s.picHeightInCtbs) + + saoSrc8, saoSrc16 := d.saoSrc8, d.saoSrc16 + scaling, scalingFrom := d.scaling, d.scalingFrom + threads := d.threads + + *d = ctuDecoder{ + s: s, p: p, sh: sh, pic: pic, + + minTbLog2: minTbLog2, + minTbWidth: tbW, + mvWidth: mvW, + + minTbAddr: keep(d.minTbAddr, tbW*tbH), + intraMode: reuse(d.intraMode, tbW*tbH), + intraModeC: reuse(d.intraModeC, tbW*tbH), + cuDepth: reuse(d.cuDepth, tbW*tbH), + qpY: reuse(d.qpY, tbW*tbH), + skipped: reuse(d.skipped, tbW*tbH), + noFilter: reuse(d.noFilter, tbW*tbH), + + // Only mvValid says whether the three beside it mean anything, and + // every read of them is behind it, so they carry over unzeroed. + mvField: keep(d.mvField, mvW*mvH), + mvPoc: keep(d.mvPoc, mvW*mvH), + mvLong: keep(d.mvLong, mvW*mvH), + mvValid: reuse(d.mvValid, mvW*mvH), + blk: reuse(d.blk, mvW*mvH), + + ctbSliceAddr: reuse(d.ctbSliceAddr, ctbs), + ctbSlice: reuse(d.ctbSlice, ctbs), + sao: reuse(d.sao, ctbs), + sliceLF: reuse(d.sliceLF, ctbs), + + rsToTs: d.rsToTs, + tsToRs: d.tsToRs, + tileID: d.tileID, + scanFor: d.scanFor, + built: d.built, + + saoSrc8: saoSrc8, + saoSrc16: saoSrc16, + + scaling: scaling, + scalingFrom: scalingFrom, + threads: threads, + + qpYPrev: sh.qpY, + qpYCur: sh.qpY, + } + + if g := geometryOf(s, p); !g.same(d.scanFor) { + d.scanFor = g + d.built = false + + d.buildTileScan() + } + + if !d.built { + d.built = true + + d.buildMinTbAddr(tbH) + } + + sl := (*scalingList)(nil) + + if s.scalingListEnabled { + sl = &s.scalingList + if p.scalingListPresent { + sl = &p.scalingList + } + } + + if sl != d.scalingFrom { + d.scalingFrom = sl + d.scaling = [maxScalingListSizes][maxScalingListMats][]uint8{} + + if sl != nil { + d.scaling = sl.factors() + } + } + + return d +} + +// keep returns a buffer of n elements without clearing it, for a table that is +// either rewritten in full or carried over. +func keep[T any](b []T, n int) []T { + if cap(b) < n { + return make([]T, n) + } + + return b[:n] +} + +// reuse returns a zeroed buffer of n elements, keeping b's memory when it fits. +func reuse[T any](b []T, n int) []T { + if cap(b) < n { + return make([]T, n) + } + + b = b[:n] + clear(b) + + return b +} + +// buildMinTbAddr is the MinTbAddrZs derivation of 6.5.2, which the +// availability process in 6.4.1 compares against. +func (d *ctuDecoder) buildMinTbAddr(h int) { + shift := int(d.s.ctbLog2SizeY) - d.minTbLog2 + + for y := range h { + for x := range d.minTbWidth { + tbX := (x << d.minTbLog2) >> d.s.ctbLog2SizeY + tbY := (y << d.minTbLog2) >> d.s.ctbLog2SizeY + + ctb := int(d.rsToTs[int(d.s.picWidthInCtbs)*tbY+tbX]) + + v := ctb << (shift * 2) + + for i := range shift { + m := 1 << i + + if m&x != 0 { + v += m * m + } + + if m&y != 0 { + v += 2 * m * m + } + } + + d.minTbAddr[y*d.minTbWidth+x] = int32(v) + } + } +} + +func (d *ctuDecoder) tbIndex(x, y int) int { + return (y>>d.minTbLog2)*d.minTbWidth + x>>d.minTbLog2 +} + +// available is the z-scan availability of 6.4.1. +func (d *ctuDecoder) available(xCurr, yCurr, xN, yN int) bool { + if xN < 0 || yN < 0 || + xN >= int(d.s.picWidthInLumaSamples) || yN >= int(d.s.picHeightInLumaSamples) { + return false + } + + if d.minTbAddr[d.tbIndex(xN, yN)] >= d.minTbAddr[d.tbIndex(xCurr, yCurr)] { + return false + } + + // With one tile and a slice starting at the first block, everything + // earlier in z-scan order is in the same slice and the same tile. + if d.simpleAvail { + return true + } + + cw := int(d.s.picWidthInCtbs) + curRs := (yCurr>>d.s.ctbLog2SizeY)*cw + xCurr>>d.s.ctbLog2SizeY + nbRs := (yN>>d.s.ctbLog2SizeY)*cw + xN>>d.s.ctbLog2SizeY + + if d.tileID[d.rsToTs[curRs]] != d.tileID[d.rsToTs[nbRs]] { + return false + } + + // 6.4.1 wants the neighbour in the same slice. Slices follow the tile scan, + // so a raster comparison would admit one from a slice already finished. + return d.ctbSliceAddr[nbRs] == int32(d.sliceAddrRs) +} + +// intraChromaMode is Table 8-2 and, for 4:2:2, Table 8-3. +func (d *ctuDecoder) intraChromaMode(luma int) int { + mode := luma + + if d.c.decodeBin(ctxIntraChromaPredMode) != 0 { + idx := int(d.c.decodeBypassBits(2)) + + mode = [4]int{intraPlanar, intraVer, intraHor, intraDC}[idx] + if mode == luma { + mode = 34 + } + } + + if d.s.chromaFormatIDC == 2 { + mode = int(chroma422Map[mode]) + } + + return mode +} + +// Table 8-3. +var chroma422Map = [35]uint8{ + 0, 1, 2, 2, 2, 2, 3, 5, 7, 8, 10, 12, 13, 15, 17, 18, 19, 20, + 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31, +} + +func (d *ctuDecoder) codingQuadtree(x, y, log2Size, depth int) error { + split := log2Size > int(d.s.minCbLog2SizeY) + + if log2Size > int(d.s.minCbLog2SizeY) && + x+1< depth { + ctx++ + } + + if d.available(x, y, x, y-1) && int(d.cuDepth[d.tbIndex(x, y-1)]) > depth { + ctx++ + } + + split = d.c.decodeBin(ctxSplitCodingUnitFlag+ctx) != 0 + } + + if d.p.cuQPDeltaEnabled && + log2Size >= int(d.s.ctbLog2SizeY)-int(d.p.diffCuQPDeltaDepth) { + d.qpCoded = false + d.qpDelta = 0 + d.qgX, d.qgY = x, y + d.qpYPred = d.predictQP(x, y) + d.qpYCur = d.qpYPred + } + + // 7.3.8.4 restarts the chroma offset at its own depth, which need not be + // the one the luma delta uses. + if d.sh.cuChromaQPOffset && + log2Size >= int(d.s.ctbLog2SizeY)-int(d.p.diffCuChromaQPOffsetDep) { + d.cuOffCoded = false + d.cuOffCb, d.cuOffCr = 0, 0 + } + + if !split { + return d.codingUnit(x, y, log2Size, depth) + } + + half := 1 << (log2Size - 1) + + for i := range 4 { + nx, ny := x+i&1*half, y+i>>1*half + + if nx >= int(d.s.picWidthInLumaSamples) || ny >= int(d.s.picHeightInLumaSamples) { + continue + } + + if err := d.codingQuadtree(nx, ny, log2Size-1, depth+1); err != nil { + return err + } + } + + return nil +} + +// predictQP is qPY_PRED of 8.6.1. +func (d *ctuDecoder) predictQP(x, y int) int32 { + ctbMask := ^(1<> 1 +} + +// parseCuQPDelta reads cu_qp_delta_abs and its sign, 9.3.3.10. +func (d *ctuDecoder) parseCuQPDelta() { + prefix := 0 + for prefix < 5 { + ctx := 1 + if prefix == 0 { + ctx = 0 + } + + if d.c.decodeBin(ctxCUQPDelta+ctx) == 0 { + break + } + + prefix++ + } + + v := int32(prefix) + + if prefix > 4 { + // 7.4.9.14 caps cu_qp_delta_abs at 26 + QpBdOffsetY/2, well inside this. + k := 0 + for k < 6 && d.c.decodeBypass() != 0 { + k++ + } + + v = int32(5 + (1<>d.minTbLog2+j)*d.minTbWidth+x>>d.minTbLog2:][:nw] + + for i := range row { + row[i] = v + } + } +} + +// codingUnit is 7.3.8.5. QpY of 8.6.1 covers the whole coding unit, including +// one that carries no residual at all, since deblocking reads it back. +func (d *ctuDecoder) codingUnit(x, y, log2Size, depth int) error { + if err := d.codingUnitData(x, y, log2Size, depth); err != nil { + return err + } + + // 8.7.2.2 marks the coding block boundary even with no transform tree. + d.markTU(x, y, 1<= int(d.s.log2MinPcmCbSize) && + log2Size <= int(d.s.log2MaxPcmCbSize) && partMode == partMode2Nx2N && + d.c.decodeTerminate() != 0 { + return d.pcmSample(x, y, log2Size) + } + + parts := 1 + if partMode == partModeNxN { + parts = 4 + } + + pbSize := size + if parts == 4 { + pbSize = size / 2 + } + + var lumaModes [4]int + + prevFlags := make([]bool, parts) + for i := range parts { + prevFlags[i] = d.c.decodeBin(ctxPrevIntraLumaPredFlag) != 0 + } + + for i := range parts { + px, py := x+i&1*pbSize, y+i>>1*pbSize + lumaModes[i] = d.intraLumaModeWithFlag(px, py, prevFlags[i]) + fill(d, d.intraMode, px, py, pbSize, uint8(lumaModes[i])) + } + + // 7.3.8.5 codes intra_chroma_pred_mode once per prediction block when + // ChromaArrayType is 3, and once per coding unit otherwise. + switch { + case d.s.chromaArrayType() == 3: + for i := range parts { + px, py := x+i&1*pbSize, y+i>>1*pbSize + fill(d, d.intraModeC, px, py, pbSize, uint8(d.intraChromaMode(lumaModes[i]))) + } + case d.s.chromaArrayType() != 0: + fill(d, d.intraModeC, x, y, size, uint8(d.intraChromaMode(lumaModes[0]))) + default: + fill(d, d.intraModeC, x, y, size, uint8(lumaModes[0])) + } + + return d.transformTree(x, y, x, y, log2Size, 0, 0, lumaModes, partMode, [2]bool{}, [2]bool{}) +} + +// intraLumaModeWithFlag completes 8.4.2 once prev_intra_luma_pred_flag has been +// read; the flags for all partitions precede the indices in the syntax. +func (d *ctuDecoder) intraLumaModeWithFlag(x, y int, prev bool) int { + candA, candB := intraDC, intraDC + + // 8.4.2: a neighbour that is not intra coded contributes INTRA_DC, as does + // one above the current coding tree block row. + if d.available(x, y, x-1, y) && d.blk[d.blkIndex(x-1, y)].intra { + candA = int(d.intraMode[d.tbIndex(x-1, y)]) + } + + ctbMask := ^(1<= y&ctbMask && d.blk[d.blkIndex(x, y-1)].intra { + candB = int(d.intraMode[d.tbIndex(x, y-1)]) + } + + var cand [3]int + + switch { + case candA == candB && candA < 2: + cand = [3]int{intraPlanar, intraDC, intraVer} + case candA == candB: + cand = [3]int{candA, 2 + (candA+29)%32, 2 + (candA-2+1)%32} + default: + cand[0], cand[1] = candA, candB + + switch { + case candA != intraPlanar && candB != intraPlanar: + cand[2] = intraPlanar + case candA != intraDC && candB != intraDC: + cand[2] = intraDC + default: + cand[2] = intraVer + } + } + + if prev { + idx := 0 + if d.c.decodeBypass() != 0 { + idx = 1 + if d.c.decodeBypass() != 0 { + idx = 2 + } + } + + return cand[idx] + } + + if cand[0] > cand[1] { + cand[0], cand[1] = cand[1], cand[0] + } + + if cand[0] > cand[2] { + cand[0], cand[2] = cand[2], cand[0] + } + + if cand[1] > cand[2] { + cand[1], cand[2] = cand[2], cand[1] + } + + mode := int(d.c.decodeBypassBits(5)) + for i := range 3 { + if mode >= cand[i] { + mode++ + } + } + + return mode +} + +func (d *ctuDecoder) transformTree(x, y, xBase, yBase, log2Size, depth, blkIdx int, + lumaModes [4]int, partMode int, cbfCbUp, cbfCrUp [2]bool, +) error { + intraSplit := d.curIntra && partMode == partModeNxN + + maxDepth := int(d.s.maxTrHierInter) + if d.curIntra { + maxDepth = int(d.s.maxTrHierIntra) + } + + if intraSplit { + maxDepth++ + } + + // 7.3.8.8: with no inter hierarchy an inter unit that is not 2Nx2N still + // splits once. + interSplit := !d.curIntra && d.s.maxTrHierInter == 0 && + partMode != partMode2Nx2N && depth == 0 + + split := log2Size > int(d.s.maxTbLog2SizeY) || (intraSplit && depth == 0) || interSplit + + if log2Size <= int(d.s.maxTbLog2SizeY) && log2Size > int(d.s.minTbLog2SizeY) && + depth < maxDepth && !(intraSplit && depth == 0) && !interSplit { + split = d.c.decodeBin(ctxSplitTransformFlag+5-log2Size) != 0 + } + + cbfCb, cbfCr := cbfCbUp, cbfCrUp + + if d.s.chromaArrayType() != 0 && (log2Size > 2 || d.s.chromaArrayType() == 3) { + // 7.3.8.8: 4:2:2 stacks two chroma transform blocks per luma block, each + // with its own cbf, once the tree stops splitting them apart. + second := d.s.chromaArrayType() == 2 && (!split || log2Size == 3) + + cbfCb = [2]bool{} + if depth == 0 || cbfCbUp[0] { + cbfCb[0] = d.c.decodeBin(ctxCBFCBCR+depth) != 0 + if second { + cbfCb[1] = d.c.decodeBin(ctxCBFCBCR+depth) != 0 + } + } + + cbfCr = [2]bool{} + if depth == 0 || cbfCrUp[0] { + cbfCr[0] = d.c.decodeBin(ctxCBFCBCR+depth) != 0 + if second { + cbfCr[1] = d.c.decodeBin(ctxCBFCBCR+depth) != 0 + } + } + } + + if split { + half := 1 << (log2Size - 1) + + for i := range 4 { + if err := d.transformTree(x+i&1*half, y+i>>1*half, x, y, log2Size-1, + depth+1, i, lumaModes, partMode, cbfCb, cbfCr); err != nil { + return err + } + } + + return nil + } + + // 7.3.8.8 only codes cbf_luma when the block is intra, nested, or has + // chroma coefficients; otherwise an inter root block is inferred to have + // luma residual. + cbfLuma := true + if depth != 0 || cbfCb[0] || cbfCb[1] || cbfCr[0] || cbfCr[1] || d.curIntra { + cbfLuma = d.c.decodeBin(ctxCBFLuma+boolToInt(depth == 0)) != 0 + } + + return d.transformUnit(x, y, xBase, yBase, log2Size, depth, blkIdx, + lumaModes, partMode, cbfLuma, cbfCb, cbfCr) +} + +func (d *ctuDecoder) setQP(x, y, size int) { + fill(d, d.qpY, x, y, size, int8(d.qpYCur)) + + d.qpYPrev = d.qpYCur +} + +func (d *ctuDecoder) transformUnit(x, y, xBase, yBase, log2Size, _, blkIdx int, + lumaModes [4]int, _ int, cbfLuma bool, cbfCb, cbfCr [2]bool, +) error { + // 8.4.4.2 takes the mode from IntraPredModeY at the block's own position, + // which is not blkIdx once the transform tree splits below the partition. + mode := lumaModes[0] + if d.curIntra { + mode = int(d.intraMode[d.tbIndex(x, y)]) + } + + cbfChroma := cbfCb[0] || cbfCb[1] || cbfCr[0] || cbfCr[1] + + if (cbfLuma || cbfChroma) && d.p.cuQPDeltaEnabled && !d.qpCoded { + d.parseCuQPDelta() + } + + if cbfChroma && !d.bypass && d.sh.cuChromaQPOffset && !d.cuOffCoded { + d.parseCuChromaQPOffset() + } + + d.markTU(x, y, 1< 2 || !sub { + c := log2Size + cx, cy := x, y + + if sub { + c-- + cx, cy = x/d.s.subWidthC, y/d.s.subHeightC + } + + return d.chromaTBs(cx, cy, c, d.chromaMode(x, y), cbfCb, cbfCr) + } + + if blkIdx != 3 { + return nil + } + + cx, cy := xBase/d.s.subWidthC, yBase/d.s.subHeightC + + return d.chromaTBs(cx, cy, 2, d.chromaMode(xBase, yBase), cbfCb, cbfCr) +} + +// chromaTBs reconstructs the chroma transform blocks of one transform unit. +// 4:2:2 stacks two of them per component, and 7.3.8.10 codes both Cb blocks +// before either Cr block. +func (d *ctuDecoder) chromaTBs(cx, cy, c, mode int, cbfCb, cbfCr [2]bool) error { + n := 1 + if d.s.chromaArrayType() == 2 { + n = 2 + } + + for cIdx := 1; cIdx <= 2; cIdx++ { + cbf := cbfCb + if cIdx == 2 { + cbf = cbfCr + } + + for t := range n { + if err := d.reconstruct(cx, cy+t< 0 { + off := d.p.cbQPOffset + d.sh.cbQPOffset + d.cuOffCb + if cIdx == 2 { + off = d.p.crQPOffset + d.sh.crQPOffset + d.cuOffCr + } + + qp = chromaQP(clip3(d.qpYCur+off, -offC, 57), d.s.chromaArrayType()) + offC + } + + // 8.6.2 turns a four by four intra block end for end, whether it reaches + // the residual by skipping the transform or by bypassing it. + rotate := d.s.transformSkipRotation && n == 4 && d.curIntra + + // 8.6.2: a bypassed unit takes the coefficients as the residual, with no + // scaling and no transform. + shift := 0 + + if d.bypass && rotate { + for i, j := 0, len(coef)-1; i < j; i, j = i+1, j-1 { + coef[i], coef[j] = coef[j], coef[i] + } + } + + if !d.bypass { + k := dsp + + k.dequant(coef, d.scalingFactor(log2Size, cIdx, skip), n, int(qp), bitDepth, + d.s.extendedPrecision) + + shift = residualShiftBits(bitDepth, d.s.extendedPrecision) + dst := d.curIntra && cIdx == 0 && log2Size == 2 + + switch { + case wideTransform(bitDepth, d.s.extendedPrecision): + if skip { + transformSkipWide(coef, n, rotate, shift) + } else { + inverseTransformWide(coef, n, dst, bitDepth, shift, &d.scratch) + } + + shift = 0 + case skip: + k.transformSkip(coef, n, rotate) + default: + k.inverseTransform(coef, n, dst, bitDepth, d.s.extendedPrecision, &d.scratch) + } + } + + addResidual(plane, stride, x, y, n, shift, coef, bitDepth) + + return nil +} + +// addResidual is bdShift of 8.6.2 and the sum of 8.6.6, in one pass. +func addResidual[P pixel](plane []P, stride, x, y, n, shift int, coef []int32, bitDepth int) { + if n >= 8 { + if p, ok := any(plane).([]uint8); ok && bitDepth == 8 { + if k := dsp.addResidual8; k != nil { + k(p[y*stride+x:], stride, coef[:n*n], n, shift) + + return + } + } else if p, ok := any(plane).([]uint16); ok { + if k := dsp.addResidual16; k != nil { + k(p[y*stride+x:], stride, coef[:n*n], n, shift, int32(1)<>shift), 0, maxV)) + } + } +} + +func gatherRef[P pixel](d *ctuDecoder, plane []P, stride, x, y, n, cIdx int) { + sw, sh := 1, 1 + if cIdx > 0 { + sw, sh = d.s.subWidthC, d.s.subHeightC + } + + w, h := d.pic.Width/sw, d.pic.Height/sh + + d.ref.n = n + + // Availability is uniform across a minimum transform block, so it is + // derived once per block rather than once per reference sample. + lastTb, lastOK := -1, false + + for i := range 4*n + 1 { + var nx, ny int + + switch { + case i < 2*n: + nx, ny = x-1, y+2*n-1-i + case i == 2*n: + nx, ny = x-1, y-1 + default: + nx, ny = x+i-2*n-1, y-1 + } + + ok := nx >= 0 && ny >= 0 && nx < w && ny < h + + if ok { + tb := d.tbIndex(nx*sw, ny*sh) + + if tb != lastTb { + lastTb = tb + lastOK = d.available(x*sw, y*sh, nx*sw, ny*sh) + + // 8.4.4.2.2: with constrained intra prediction, samples from + // inter-coded neighbours count as unavailable. + if lastOK && d.p.constrainedIntraPred && + !d.blk[d.blkIndex(nx*sw, ny*sh)].intra { + lastOK = false + } + } + + ok = lastOK + } + + d.avail[i] = ok + if ok { + d.ref.s[i] = int32(plane[ny*stride+nx]) + } + } + + d.ref.substitute(d.avail[:4*n+1], d.pic.depth(cIdx)) +} + +// buildTileScan is 6.5.1, the raster to tile scan conversion and the tile +// each coding tree block belongs to. +func (d *ctuDecoder) buildTileScan() { + w, h := int(d.s.picWidthInCtbs), int(d.s.picHeightInCtbs) + + colBd := make([]int, len(d.p.colWidthsInCtbs)+1) + for i, v := range d.p.colWidthsInCtbs { + colBd[i+1] = colBd[i] + int(v) + } + + rowBd := make([]int, len(d.p.rowHeightsInCtbs)+1) + for i, v := range d.p.rowHeightsInCtbs { + rowBd[i+1] = rowBd[i] + int(v) + } + + d.rsToTs = make([]int32, w*h) + d.tsToRs = make([]int32, w*h) + d.tileID = make([]int32, w*h) + + for rs := range w * h { + x, y := rs%w, rs/w + + var tbX, tbY int + + for i := range len(colBd) - 1 { + if x >= colBd[i] { + tbX = i + } + } + + for i := range len(rowBd) - 1 { + if y >= rowBd[i] { + tbY = i + } + } + + ts := 0 + + for i := range tbX { + ts += int(d.p.rowHeightsInCtbs[tbY]) * int(d.p.colWidthsInCtbs[i]) + } + + for i := range tbY { + ts += w * int(d.p.rowHeightsInCtbs[i]) + } + + ts += (y-rowBd[tbY])*int(d.p.colWidthsInCtbs[tbX]) + x - colBd[tbX] + + d.rsToTs[rs] = int32(ts) + d.tsToRs[ts] = int32(rs) + d.tileID[ts] = int32(tbY*len(d.p.colWidthsInCtbs) + tbX) + } +} + +// partMode is 7.3.8.5's part_mode, whose binarization depends on the +// prediction mode, the coding block size and whether asymmetric splits are on. +func (d *ctuDecoder) partMode(intra bool, log2Size int) int { + if intra { + if d.c.decodeBin(ctxPartMode) != 0 { + return partMode2Nx2N + } + + return partModeNxN + } + + if d.c.decodeBin(ctxPartMode) != 0 { + return partMode2Nx2N + } + + minCb := log2Size == int(d.s.minCbLog2SizeY) + + // Table 9-34. At the smallest coding block size the third bin separates + // Nx2N from NxN, and the asymmetric modes are not available at all. + if d.c.decodeBin(ctxPartMode+1) != 0 { + if minCb || !d.s.ampEnabled { + return partMode2NxN + } + + if d.c.decodeBin(ctxPartMode+3) != 0 { + return partMode2NxN + } + + if d.c.decodeBypass() != 0 { + return partMode2NxnD + } + + return partMode2NxnU + } + + if minCb { + if log2Size == 3 { + return partModeNx2N + } + + if d.c.decodeBin(ctxPartMode+2) != 0 { + return partModeNx2N + } + + return partModeNxN + } + + if !d.s.ampEnabled { + return partModeNx2N + } + + if d.c.decodeBin(ctxPartMode+3) != 0 { + return partModeNx2N + } + + if d.c.decodeBypass() != 0 { + return partModenRx2N + } + + return partModenLx2N +} + +var partShape = [8][4][4]int{ + partMode2Nx2N: {{0, 0, 4, 4}}, + partMode2NxN: {{0, 0, 4, 2}, {0, 2, 4, 2}}, + partModeNx2N: {{0, 0, 2, 4}, {2, 0, 2, 4}}, + partModeNxN: {{0, 0, 2, 2}, {2, 0, 2, 2}, {0, 2, 2, 2}, {2, 2, 2, 2}}, + partMode2NxnU: {{0, 0, 4, 1}, {0, 1, 4, 3}}, + partMode2NxnD: {{0, 0, 4, 3}, {0, 3, 4, 1}}, + partModenLx2N: {{0, 0, 1, 4}, {1, 0, 3, 4}}, + partModenRx2N: {{0, 0, 3, 4}, {3, 0, 1, 4}}, +} + +var partCount = [8]int{1, 2, 2, 4, 2, 2, 2, 2} + +func (d *ctuDecoder) interCU(x, y, log2Size, depth, partMode int) error { + size := 1 << log2Size + q := size / 4 + + for i := range partCount[partMode] { + s := partShape[partMode][i] + + if err := d.predictionUnit(x+s[0]*q, y+s[1]*q, s[2]*q, s[3]*q, + i, partMode, depth, size, x, y, false); err != nil { + return err + } + } + + // The bin is rqt_root_cbf: one means residual data follows. It is + // inferred to one for a merged 2Nx2N unit. + if !(partMode == partMode2Nx2N && d.lastMerge) { + if d.c.decodeBin(ctxNoResidualDataFlag) == 0 { + return nil + } + } + + var modes [4]int + + return d.transformTree(x, y, x, y, log2Size, 0, 0, modes, partMode, [2]bool{}, [2]bool{}) +} + +// scalingFactor picks the matrix of 8.6.3, which is flat when scaling lists +// are off and when a large block skips the transform. +func (d *ctuDecoder) scalingFactor(log2Size, cIdx int, skip bool) []uint8 { + if !d.s.scalingListEnabled || (skip && log2Size > 2) { + return nil + } + + sizeID := log2Size - 2 + + matrixID := cIdx + if !d.curIntra { + matrixID += 3 + } + + if sizeID == 3 && cIdx > 0 { + matrixID = 0 + if !d.curIntra { + matrixID = 3 + } + } + + return d.scaling[sizeID][matrixID] +} + +func readPCM[P pixel](g *getBits, plane []P, stride, x, y, w, h, depth, bitDepth int) { + shift := bitDepth - depth + + for j := range h { + row := (y + j) * stride + for i := range w { + plane[row+x+i] = P(g.bits(depth) << shift) + } + } +} + +// pcmSample is 7.3.8.7 and 8.4.4.1: the samples are read from the bitstream at +// the byte boundary the arithmetic decoder left off, which then restarts. +func (d *ctuDecoder) pcmSample(x, y, log2Size int) error { + off := d.c.pcmOffset() + if off < 0 || off >= len(d.c.data) { + return ErrInvalid + } + + size := 1 << log2Size + + fill(d, d.intraMode, x, y, size, uint8(intraDC)) + d.markPU(x, y, size, size, true) + + if d.s.pcmLoopFilterDisabled { + fill(d, d.noFilter, x, y, size, true) + } + + var g getBits + + g.init(d.c.data[off:]) + + depth := int(d.s.pcmBitDepthLuma) + + if d.pic.deep() { + plane, stride := d.pic.plane16(0) + readPCM(&g, plane, stride, x, y, size, size, depth, d.pic.BitDepth) + } else { + plane, stride := d.pic.plane8(0) + readPCM(&g, plane, stride, x, y, size, size, depth, d.pic.BitDepth) + } + + if d.s.chromaArrayType() != 0 { + sw, sh := d.s.subWidthC, d.s.subHeightC + depth = int(d.s.pcmBitDepthChroma) + + for cIdx := 1; cIdx <= 2; cIdx++ { + if d.pic.deep() { + plane, stride := d.pic.plane16(cIdx) + readPCM(&g, plane, stride, x/sw, y/sh, size/sw, size/sh, depth, d.pic.BitDepthC) + } else { + plane, stride := d.pic.plane8(cIdx) + readPCM(&g, plane, stride, x/sw, y/sh, size/sw, size/sh, depth, d.pic.BitDepthC) + } + } + } + + if g.err { + return ErrInvalid + } + + return d.c.init(d.c.data, off+(g.pos()+7)/8) +} diff --git a/third_party/h265/hevc/deblock.go b/third_party/h265/hevc/deblock.go new file mode 100644 index 00000000..6cfaeabc --- /dev/null +++ b/third_party/h265/hevc/deblock.go @@ -0,0 +1,663 @@ +package hevc + +// Table 8-12. +var betaTable = [52]uint8{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, + 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, + 58, 60, 62, 64, +} + +var tcTable = [54]uint8{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, + 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 13, + 14, 16, 18, 20, 22, 24, +} + +// blockInfo is what boundary strength derivation reads back after decoding. +type blockInfo struct { + intra bool + cbf bool + tuV bool + tuH bool + puV bool + puH bool +} + +func (d *ctuDecoder) blkIndex(x, y int) int { + return (y>>2)*d.mvWidth + x>>2 +} + +// blocksIn is how many blocks of a region fall inside the picture, so the +// loops that walk one need no bound on each block. +func (d *ctuDecoder) blocksIn(x, y, w, h, log2 int) (int, int) { + last := 1<> log2, max(nh+last, 0) >> log2 +} + +func (d *ctuDecoder) markTU(x, y, w, h int, cbf bool) { + nw, nh := d.blocksIn(x, y, w, h, 2) + + for j := range nh { + row := d.blk[(y>>2+j)*d.mvWidth+x>>2:][:nw] + + if cbf { + for i := range row { + row[i].cbf = true + } + } + + // The edges of 8.7.2 are the first column and the first row of the + // block, so only those carry a flag. + if j == 0 { + for i := range row { + row[i].tuH = true + } + } + + row[0].tuV = true + } +} + +func (d *ctuDecoder) markPU(x, y, w, h int, intra bool) { + nw, nh := d.blocksIn(x, y, w, h, 2) + + for j := range nh { + row := d.blk[(y>>2+j)*d.mvWidth+x>>2:][:nw] + + for i := range row { + row[i].intra = intra + } + + if j == 0 { + for i := range row { + row[i].puH = true + } + } + + row[0].puV = true + } +} + +// boundaryStrength is 8.7.2.4. +func (d *ctuDecoder) boundaryStrength(xP, yP, xQ, yQ int, vertical bool) int { + qi := d.blkIndex(xQ, yQ) + q := &d.blk[qi] + + tu := q.tuV + pu := q.puV + + if !vertical { + tu, pu = q.tuH, q.puH + } + + // 8.7.2 filters transform and prediction block edges only, not every + // edge on the eight-sample grid, and most of them are neither. + if !tu && !pu { + return 0 + } + + pi := d.blkIndex(xP, yP) + p := &d.blk[pi] + + if p.intra || q.intra { + return 2 + } + + if tu && (p.cbf || q.cbf) { + return 1 + } + + if !d.mvValid[pi] || !d.mvValid[qi] { + return 1 + } + + if differentMotion(&d.mvField[pi], &d.mvField[qi], d.mvPoc[pi], d.mvPoc[qi]) { + return 1 + } + + return 0 +} + +func mvFar(a, b mv) bool { + return absI32(int32(a.x)-int32(b.x)) >= 4 || absI32(int32(a.y)-int32(b.y)) >= 4 +} + +// differentMotion is the motion part of 8.7.2.4, comparing the pictures each +// block recorded when it was decoded. +func differentMotion(p, q *mvInfo, pPoc, qPoc [2]int32) bool { + var ( + pp, qp [2]int32 + pv, qv [2]mv + np, nq int + ) + + for l := range 2 { + if p.pred[l] { + pp[np], pv[np] = pPoc[l], p.mv[l] + np++ + } + + if q.pred[l] { + qp[nq], qv[nq] = qPoc[l], q.mv[l] + nq++ + } + } + + if np != nq { + return true + } + + if np == 1 { + return pp[0] != qp[0] || mvFar(pv[0], qv[0]) + } + + if np == 0 { + return false + } + + if pp[0] == qp[0] && pp[1] == qp[1] { + if pp[0] == pp[1] { + return (mvFar(pv[0], qv[0]) || mvFar(pv[1], qv[1])) && + (mvFar(pv[0], qv[1]) || mvFar(pv[1], qv[0])) + } + + return mvFar(pv[0], qv[0]) || mvFar(pv[1], qv[1]) + } + + if pp[0] == qp[1] && pp[1] == qp[0] { + return mvFar(pv[0], qv[1]) || mvFar(pv[1], qv[0]) + } + + return true +} + +// sliceAt is the slice header governing a coding tree block. The filtering +// parameters of 7.4.7.1 are per slice. +func (d *ctuDecoder) sliceAt(x, y int) *sliceHeader { + rs := (y>>d.s.ctbLog2SizeY)*int(d.s.picWidthInCtbs) + x>>d.s.ctbLog2SizeY + if rs < 0 || rs >= len(d.ctbSlice) || int(d.ctbSlice[rs]) >= len(d.slices) { + return d.sh + } + + return d.slices[d.ctbSlice[rs]] +} + +// deblock is 8.7.2: every vertical edge in the picture, then every horizontal +// one, both on the eight-sample grid. Within a pass each edge writes its own +// band of eight lines, so the bands split across workers. +func (d *ctuDecoder) deblock() { + w, h := int(d.s.picWidthInLumaSamples), int(d.s.picHeightInLumaSamples) + + for _, vertical := range []bool{true, false} { + d.overRows((h+7)/8, func(r0, r1 int) { + for r := r0; r < r1; r++ { + y := r * 8 + + if !vertical && y == 0 { + continue + } + + for x := 0; x < w; x += 8 { + if vertical && x == 0 { + continue + } + + d.deblockEdge(x, y, vertical) + } + } + }) + } +} + +func (d *ctuDecoder) deblockEdge(x, y int, vertical bool) { + // The two sides share a coding tree block unless the edge sits on one of + // its boundaries, and 8.7.2 only asks about tiles and slices when they do. + ctb := 1<= int(d.s.picHeightInLumaSamples) || qx >= int(d.s.picWidthInLumaSamples) { + continue + } + + if across && !d.filterEdge(px, py, qx, qy) { + continue + } + + bs := d.boundaryStrength(px, py, qx, qy, vertical) + if bs == 0 { + continue + } + + pt, qt := d.tbIndex(px, py), d.tbIndex(qx, qy) + + qp := (int32(d.qpY[pt]) + int32(d.qpY[qt]) + 1) >> 1 + + // 8.7.2.5.3 leaves a side untouched when its coding unit bypassed the + // transform, or is pulse code modulated with filtering turned off. + noP[k>>2], noQ[k>>2] = d.noFilter[pt], d.noFilter[qt] + + if beta, tc := betaTc(qp, bs, sl, d.pic.BitDepth); beta != 0 && tc != 0 { + if deep { + plan[k>>2] = deblockLumaPlan(luma16, base+k*line, line, step, beta, tc) + } else { + plan[k>>2] = deblockLumaPlan(luma8, base+k*line, line, step, beta, tc) + } + } + + if bs != 2 || d.s.chromaArrayType() == 0 { + continue + } + + if (vertical && x%(8*d.s.subWidthC) != 0) || (!vertical && y%(8*d.s.subHeightC) != 0) { + continue + } + + onC[k>>2], qpC[k>>2] = true, qp + } + + d.deblockChromaEdge(x, y, vertical, sl, &onC, &qpC, &noP, &noQ) + + if deep { + deblockLumaEdge(luma16, base, line, step, plan, d.pic.BitDepth, noP, noQ) + } else { + deblockLumaEdge(luma8, base, line, step, plan, d.pic.BitDepth, noP, noQ) + } +} + +// deblockChromaEdge is 8.7.2.5.5 over one edge. The two groups of four luma +// lines are adjacent in the chroma planes, so they share a call when their +// coding units agree. +func (d *ctuDecoder) deblockChromaEdge(x, y int, vertical bool, sl *sliceHeader, + on *[2]bool, qp *[2]int32, noP, noQ *[2]bool, +) { + if !on[0] && !on[1] { + return + } + + sw, sh := d.s.subWidthC, d.s.subHeightC + + // The four-sample luma segment spans 4/subHeightC chroma rows on a + // vertical edge, and 4/subWidthC columns on a horizontal one. + n := 4 / sh + if !vertical { + n = 4 / sw + } + + both := on[0] && on[1] && qp[0] == qp[1] && noP[0] == noP[1] && noQ[0] == noQ[1] + + deep := d.pic.deep() + cb8, cs := d.pic.plane8(1) + cr8, _ := d.pic.plane8(2) + cb16, cs16 := d.pic.plane16(1) + cr16, _ := d.pic.plane16(2) + + if deep { + cs = cs16 + } + + for g := range 2 { + if !on[g] { + continue + } + + cx, cy := x, y+4*g + if !vertical { + cx, cy = x+4*g, y + } + + lines := n + if both { + if g != 0 { + continue + } + + lines = 2 * n + } + + _, tcCb := betaTc(chromaQP(clip3(qp[g]+d.p.cbQPOffset, 0, 57), d.s.chromaArrayType()), + 2, sl, d.pic.BitDepthC) + _, tcCr := betaTc(chromaQP(clip3(qp[g]+d.p.crQPOffset, 0, 57), d.s.chromaArrayType()), + 2, sl, d.pic.BitDepthC) + + if tcCb == 0 && tcCr == 0 { + continue + } + + if deep { + deblockChromaPair(cb16, cr16, cs, cx/sw, cy/sh, lines, vertical, + tcCb, tcCr, d.pic.BitDepthC, noP[g], noQ[g]) + } else { + deblockChromaPair(cb8, cr8, cs, cx/sw, cy/sh, lines, vertical, + tcCb, tcCr, d.pic.BitDepthC, noP[g], noQ[g]) + } + } +} + +func betaTc(qp int32, bs int, sh *sliceHeader, bitDepth int) (int32, int32) { + qb := clip3(qp+int32(sh.betaOffsetDiv2)*2, 0, 51) + beta := int32(betaTable[qb]) * (1 << (bitDepth - 8)) + + qt := clip3(qp+2*int32(bs-1)+int32(sh.tcOffsetDiv2)*2, 0, 53) + tc := int32(tcTable[qt]) * (1 << (bitDepth - 8)) + + return beta, tc +} + +// lumaPlan is what 8.7.2.5.3 decides for one group of four lines. +type lumaPlan struct { + tc int32 + mode uint8 + nDp, nDq uint8 +} + +const ( + lumaNone = iota + lumaStrong + lumaNormal +) + +// deblockLumaPlan is 8.7.2.5.3 over the outer two lines of a group. +func deblockLumaPlan[P pixel](plane []P, base, line, step int, beta, tc int32) lumaPlan { + at := func(l, i int) int32 { + return int32(plane[base+l*line+i*step]) + } + + dp0 := absI32(at(0, -3) - 2*at(0, -2) + at(0, -1)) + dq0 := absI32(at(0, 2) - 2*at(0, 1) + at(0, 0)) + dp3 := absI32(at(3, -3) - 2*at(3, -2) + at(3, -1)) + dq3 := absI32(at(3, 2) - 2*at(3, 1) + at(3, 0)) + + dp, dq := dp0+dp3, dq0+dq3 + if dp+dq >= beta { + return lumaPlan{} + } + + strong := func(l int, d2 int32) bool { + return 2*d2 < beta>>2 && + absI32(at(l, -4)-at(l, -1))+absI32(at(l, 0)-at(l, 3)) < beta>>3 && + absI32(at(l, -1)-at(l, 0)) < (5*tc+1)>>1 + } + + if strong(0, dp0+dq0) && strong(3, dp3+dq3) { + return lumaPlan{tc: tc, mode: lumaStrong} + } + + pl := lumaPlan{tc: tc, mode: lumaNormal} + + if dp < (beta+beta>>1)>>3 { + pl.nDp = 1 + } + + if dq < (beta+beta>>1)>>3 { + pl.nDq = 1 + } + + return pl +} + +// deblockLumaApply is 8.7.2.5.7 over the four lines its plan was taken from. +func deblockLumaApply[P pixel](plane []P, base, line, step int, pl lumaPlan, + bitDepth int, noP, noQ bool, +) { + tc := pl.tc + + at := func(l, i int) int32 { + return int32(plane[base+l*line+i*step]) + } + + set := func(l, i int, v int32) { + if (i < 0 && noP) || (i >= 0 && noQ) { + return + } + + plane[base+l*line+i*step] = P(clip3(v, 0, 1<>3, p0-c, p0+c)) + set(l, -2, clip3((p2+p1+p0+q0+2)>>2, p1-c, p1+c)) + set(l, -3, clip3((2*p3+3*p2+p1+p0+q0+4)>>3, p2-c, p2+c)) + set(l, 0, clip3((p1+2*p0+2*q0+2*q1+q2+4)>>3, q0-c, q0+c)) + set(l, 1, clip3((p0+q0+q1+q2+2)>>2, q1-c, q1+c)) + set(l, 2, clip3((p0+q0+q1+3*q2+2*q3+4)>>3, q2-c, q2+c)) + } + + return + } + + for l := range 4 { + p0, p1, p2 := at(l, -1), at(l, -2), at(l, -3) + q0, q1, q2 := at(l, 0), at(l, 1), at(l, 2) + + delta := (9*(q0-p0) - 3*(q1-p1) + 8) >> 4 + if absI32(delta) >= tc*10 { + continue + } + + delta = clip3(delta, -tc, tc) + + set(l, -1, p0+delta) + set(l, 0, q0-delta) + + if pl.nDp != 0 { + set(l, -2, p1+clip3(((p2+p0+1)>>1-p1+delta)>>1, -(tc>>1), tc>>1)) + } + + if pl.nDq != 0 { + set(l, 1, q1+clip3(((q2+q0+1)>>1-q1-delta)>>1, -(tc>>1), tc>>1)) + } + } +} + +// deblockLumaEdge filters the eight lines of one edge, both groups at once. +func deblockLumaEdge[P pixel](plane []P, base, line, step int, pl [2]lumaPlan, + bitDepth int, noP, noQ [2]bool, +) { + if pl[0].mode == lumaNone && pl[1].mode == lumaNone { + return + } + + if bitDepth == 8 { + if p8, ok := any(plane).([]uint8); ok { + mode, ok := lumaBoth(&pl, &noP, &noQ) + if ok { + flags := int32(0) + if noP[0] { + flags |= 1 + } + + if noQ[0] { + flags |= 2 + } + + if deblockLuma8(p8, base, line, step, mode, pl, flags) { + return + } + } + } + } + + for g := range 2 { + if pl[g].mode == lumaNone { + continue + } + + deblockLumaApply(plane, base+g*4*line, line, step, pl[g], bitDepth, noP[g], noQ[g]) + } +} + +// lumaBoth gives a group without a filter the other's, at a tc of zero. +func lumaBoth(pl *[2]lumaPlan, noP, noQ *[2]bool) (uint8, bool) { + a, b := 0, 1 + if pl[0].mode == lumaNone { + a, b = 1, 0 + } + + if pl[b].mode == lumaNone { + pl[b].mode = pl[a].mode + noP[b], noQ[b] = noP[a], noQ[a] + } + + return pl[0].mode, pl[0].mode == pl[1].mode && noP[0] == noP[1] && noQ[0] == noQ[1] +} + +// deblockLuma8 hands one edge to a kernel, turning it first when it runs down. +func deblockLuma8(p []uint8, base, line, step int, mode uint8, pl [2]lumaPlan, flags int32) bool { + strong, normal := deblockStrongAsm, deblockNormalAsm + if strong == nil || normal == nil { + return false + } + + nd := int32(pl[0].nDp) | int32(pl[0].nDq)<<1 | + int32(pl[1].nDp)<<2 | int32(pl[1].nDq)<<3 + + if step != 1 { + q := p[base-4*step:] + + if mode == lumaStrong { + strong(q, step, pl[0].tc, pl[1].tc, flags) + } else { + normal(q, step, pl[0].tc, pl[1].tc, nd, flags) + } + + return true + } + + if deblockTurnIn == nil { + return false + } + + var buf [8 * 8]uint8 + + deblockTurnIn(buf[:], p[base-4:], line) + + if mode == lumaStrong { + strong(buf[:], 8, pl[0].tc, pl[1].tc, flags) + } else { + normal(buf[:], 8, pl[0].tc, pl[1].tc, nd, flags) + } + + deblockTurnOut(p[base-4:], line, buf[:]) + + return true +} + +// deblockChromaPair is 8.7.2.5.5 over both components at once, which is what +// the edge derivation of 8.7.2.4 gives them in common. +func deblockChromaPair[P pixel](cb, cr []P, stride, x, y, n int, vertical bool, + tcCb, tcCr int32, bitDepth int, noP, noQ bool, +) { + step, line := 1, stride + if !vertical { + step, line = stride, 1 + } + + base := y*stride + x + maxV := int32(1<>3, -tc, tc) + + if !noP { + plane[off-step] = P(clip3(p0+delta, 0, maxV)) + } + + if !noQ { + plane[off] = P(clip3(q0-delta, 0, maxV)) + } +} + +// filterEdge is the filterEdgeFlag derivation of 8.7.2, which suppresses +// filtering across a tile or slice boundary the parameter sets close off. +func (d *ctuDecoder) filterEdge(xP, yP, xQ, yQ int) bool { + w := int(d.s.picWidthInCtbs) + + pRs := (yP>>d.s.ctbLog2SizeY)*w + xP>>d.s.ctbLog2SizeY + qRs := (yQ>>d.s.ctbLog2SizeY)*w + xQ>>d.s.ctbLog2SizeY + + if pRs == qRs { + return true + } + + if !d.p.loopFilterAcrossTiles && d.tileID[d.rsToTs[pRs]] != d.tileID[d.rsToTs[qRs]] { + return false + } + + if d.ctbSliceAddr[pRs] != d.ctbSliceAddr[qRs] { + if !d.sliceLF[d.ctbSliceAddr[qRs]] { + return false + } + } + + return true +} diff --git a/third_party/h265/hevc/deblock_amd64.s b/third_party/h265/hevc/deblock_amd64.s new file mode 100644 index 00000000..b350d711 --- /dev/null +++ b/third_party/h265/hevc/deblock_amd64.s @@ -0,0 +1,378 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// The two luma filters of 8.7.2.5.7 over the eight lines of one edge, with +// position i of line l at p[i*pitch+l]. + +DATA deblkW<>+0(SB)/2, $1 +DATA deblkW<>+2(SB)/2, $2 +DATA deblkW<>+4(SB)/2, $3 +DATA deblkW<>+6(SB)/2, $4 +DATA deblkW<>+8(SB)/2, $8 +DATA deblkW<>+10(SB)/2, $9 +DATA deblkW<>+12(SB)/2, $10 +DATA deblkW<>+14(SB)/2, $0 +GLOBL deblkW<>(SB), RODATA|NOPTR, $16 + +#define ONE deblkW<>+0(SB) +#define TWO deblkW<>+2(SB) +#define THREE deblkW<>+4(SB) +#define FOUR deblkW<>+6(SB) +#define EIGHT deblkW<>+8(SB) +#define NINE deblkW<>+10(SB) +#define TEN deblkW<>+12(SB) + +// ndMask is the four ways 8.7.2.5.7's dEp or dEq can fall over the two halves. +DATA ndMask<>+0(SB)/8, $0x0000000000000000 +DATA ndMask<>+8(SB)/8, $0x0000000000000000 +DATA ndMask<>+16(SB)/8, $0xffffffffffffffff +DATA ndMask<>+24(SB)/8, $0x0000000000000000 +DATA ndMask<>+32(SB)/8, $0x0000000000000000 +DATA ndMask<>+40(SB)/8, $0xffffffffffffffff +DATA ndMask<>+48(SB)/8, $0xffffffffffffffff +DATA ndMask<>+56(SB)/8, $0xffffffffffffffff +GLOBL ndMask<>(SB), RODATA|NOPTR, $64 + +// TCV spreads the thresholds in R9 and R10 over the lanes each governs. +#define TCV(v, t) \ + MOVQ $0x0001000100010001, R11 \ + IMULQ R11, R9 \ + IMULQ R11, R10 \ + MOVQ R9, v \ + MOVQ R10, t \ + VPUNPCKLQDQ t, v, v + +// CLIPC puts v inside base-c .. base+c. +#define CLIPC(v, base, c, t0, t1) \ + VPSUBW c, base, t0 \ + VPADDW c, base, t1 \ + VPMAXSW t0, v, v \ + VPMINSW t1, v, v + +// STORE8 saturates a lane to a byte and writes the eight of them. +#define STORE8(v, t, dst) \ + VPACKUSWB v, v, t \ + MOVQ t, dst + +// func deblockStrong8AVX2(p *uint8, pitch int, tc0, tc1, flags int32) +TEXT ·deblockStrong8AVX2(SB), NOSPLIT, $0-28 + MOVQ p+0(FP), AX + MOVQ pitch+8(FP), R8 + + VPMOVZXBW (AX), X0 + LEAQ (AX)(R8*1), CX + VPMOVZXBW (CX), X1 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X2 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X3 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X4 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X5 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X6 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X7 + + MOVL tc0+16(FP), R9 + MOVL tc1+20(FP), R10 + TCV(X8, X15) + VPADDW X8, X8, X9 + + VPBROADCASTW FOUR, X12 + VPBROADCASTW TWO, X13 + + // p0' from p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 + VPADDW X2, X3, X10 + VPADDW X4, X10, X10 + VPADDW X10, X10, X10 + VPADDW X1, X10, X10 + VPADDW X5, X10, X10 + VPADDW X12, X10, X10 + VPSRAW $3, X10, X10 + CLIPC(X10, X3, X9, X14, X15) + + // p1' from p2 + p1 + p0 + q0 + 2 + VPADDW X1, X2, X11 + VPADDW X3, X11, X11 + VPADDW X4, X11, X11 + VPADDW X13, X11, X11 + VPSRAW $2, X11, X11 + CLIPC(X11, X2, X9, X14, X15) + + MOVL flags+24(FP), DX + TESTL $1, DX + JNZ qside + + // p2' from 2*p3 + 3*p2 + p1 + p0 + q0 + 4 + VPADDW X0, X0, X14 + VPADDW X1, X14, X14 + VPADDW X1, X14, X14 + VPADDW X1, X14, X14 + VPADDW X2, X14, X14 + VPADDW X3, X14, X14 + VPADDW X4, X14, X14 + VPADDW X12, X14, X14 + VPSRAW $3, X14, X14 + CLIPC(X14, X1, X9, X8, X15) + + LEAQ (AX)(R8*1), CX + STORE8(X14, X15, (CX)) + LEAQ (CX)(R8*1), CX + STORE8(X11, X15, (CX)) + LEAQ (CX)(R8*1), CX + STORE8(X10, X15, (CX)) + +qside: + TESTL $2, DX + JNZ done + + // q0' from p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 + VPADDW X3, X4, X10 + VPADDW X5, X10, X10 + VPADDW X10, X10, X10 + VPADDW X2, X10, X10 + VPADDW X6, X10, X10 + VPADDW X12, X10, X10 + VPSRAW $3, X10, X10 + CLIPC(X10, X4, X9, X14, X15) + + // q1' from p0 + q0 + q1 + q2 + 2 + VPADDW X3, X4, X11 + VPADDW X5, X11, X11 + VPADDW X6, X11, X11 + VPADDW X13, X11, X11 + VPSRAW $2, X11, X11 + CLIPC(X11, X5, X9, X14, X15) + + // q2' from p0 + q0 + q1 + 3*q2 + 2*q3 + 4 + VPADDW X6, X6, X14 + VPADDW X6, X14, X14 + VPADDW X7, X14, X14 + VPADDW X7, X14, X14 + VPADDW X3, X14, X14 + VPADDW X4, X14, X14 + VPADDW X5, X14, X14 + VPADDW X12, X14, X14 + VPSRAW $3, X14, X14 + CLIPC(X14, X6, X9, X8, X15) + + LEAQ (AX)(R8*4), CX + STORE8(X10, X15, (CX)) + LEAQ (CX)(R8*1), CX + STORE8(X11, X15, (CX)) + LEAQ (CX)(R8*1), CX + STORE8(X14, X15, (CX)) + +done: + VZEROUPPER + RET + +// func deblockNormal8AVX2(p *uint8, pitch int, tc0, tc1, nd, flags int32) +TEXT ·deblockNormal8AVX2(SB), NOSPLIT, $0-32 + MOVQ p+0(FP), AX + MOVQ pitch+8(FP), R8 + + LEAQ (AX)(R8*1), CX + VPMOVZXBW (CX), X1 // p2 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X2 // p1 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X3 // p0 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X4 // q0 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X5 // q1 + LEAQ (CX)(R8*1), CX + VPMOVZXBW (CX), X6 // q2 + + MOVL tc0+16(FP), R9 + MOVL tc1+20(FP), R10 + TCV(X8, X15) + + // delta = (9*(q0-p0) - 3*(q1-p1) + 8) >> 4 + VPSUBW X3, X4, X10 + VPBROADCASTW NINE, X11 + VPMULLW X11, X10, X10 + VPSUBW X2, X5, X12 + VPBROADCASTW THREE, X11 + VPMULLW X11, X12, X12 + VPSUBW X12, X10, X10 + VPBROADCASTW EIGHT, X11 + VPADDW X11, X10, X10 + VPSRAW $4, X10, X10 + + // keep only the lanes 8.7.2.5.7 leaves inside ten times tc + VPABSW X10, X11 + VPBROADCASTW TEN, X12 + VPMULLW X12, X8, X12 + VPCMPGTW X11, X12, X15 // mask = tc*10 > |delta| + + VPXOR X0, X0, X0 + VPSUBW X8, X0, X13 + VPMAXSW X13, X10, X10 + VPMINSW X8, X10, X10 // delta clipped to +-tc + + VPSRAW $1, X8, X14 // tc>>1 + VPSUBW X14, X0, X7 // -(tc>>1) + + // the dEp and dEq of each half become the lanes their sample may move in + MOVL nd+24(FP), BX + LEAQ ndMask<>(SB), R12 + + MOVL BX, R9 + ANDL $1, R9 + MOVL BX, R10 + SHRL $1, R10 + ANDL $2, R10 + ORL R10, R9 + SHLQ $4, R9 + VMOVDQU (R12)(R9*1), X9 + VPAND X15, X9, X9 + + MOVL BX, R10 + SHRL $1, R10 + ANDL $1, R10 + MOVL BX, R11 + SHRL $2, R11 + ANDL $2, R11 + ORL R11, R10 + SHLQ $4, R10 + VMOVDQU (R12)(R10*1), X13 + VPAND X15, X13, X13 + + MOVL flags+28(FP), DX + TESTL $1, DX + JNZ nqside + + VPADDW X10, X3, X11 + VPBLENDVB X15, X11, X3, X11 + LEAQ (AX)(R8*2), CX + LEAQ (CX)(R8*1), CX + STORE8(X11, X12, (CX)) // p0 + + // p1' from ((p2+p0+1)>>1 - p1 + delta) >> 1 + VPADDW X1, X3, X11 + VPBROADCASTW ONE, X12 + VPADDW X12, X11, X11 + VPSRAW $1, X11, X11 + VPSUBW X2, X11, X11 + VPADDW X10, X11, X11 + VPSRAW $1, X11, X11 + VPMAXSW X7, X11, X11 + VPMINSW X14, X11, X11 + VPADDW X2, X11, X11 + VPBLENDVB X9, X11, X2, X11 + LEAQ (AX)(R8*2), CX + STORE8(X11, X12, (CX)) // p1 + +nqside: + TESTL $2, DX + JNZ ndone + + VPSUBW X10, X4, X11 + VPBLENDVB X15, X11, X4, X11 + LEAQ (AX)(R8*4), CX + STORE8(X11, X12, (CX)) // q0 + + // q1' from ((q2+q0+1)>>1 - q1 - delta) >> 1 + VPADDW X6, X4, X11 + VPBROADCASTW ONE, X12 + VPADDW X12, X11, X11 + VPSRAW $1, X11, X11 + VPSUBW X5, X11, X11 + VPSUBW X10, X11, X11 + VPSRAW $1, X11, X11 + VPMAXSW X7, X11, X11 + VPMINSW X14, X11, X11 + VPADDW X5, X11, X11 + VPBLENDVB X13, X11, X5, X11 + LEAQ (AX)(R8*4), CX + LEAQ (CX)(R8*1), CX + STORE8(X11, X12, (CX)) // q1 + +ndone: + VZEROUPPER + RET + +// TRANSPOSE8 turns eight rows of eight bytes in the low half of X0 through X7 +// into eight columns, two to a register, in X8 through X11. +#define TRANSPOSE8() \ + VPUNPCKLBW X1, X0, X8 \ + VPUNPCKLBW X3, X2, X9 \ + VPUNPCKLBW X5, X4, X10 \ + VPUNPCKLBW X7, X6, X11 \ + VPUNPCKLWD X9, X8, X12 \ + VPUNPCKHWD X9, X8, X13 \ + VPUNPCKLWD X11, X10, X14 \ + VPUNPCKHWD X11, X10, X15 \ + VPUNPCKLDQ X14, X12, X8 \ + VPUNPCKHDQ X14, X12, X9 \ + VPUNPCKLDQ X15, X13, X10 \ + VPUNPCKHDQ X15, X13, X11 + +// func turnIn8AVX2(dst *uint8, src *uint8, stride int) +TEXT ·turnIn8AVX2(SB), NOSPLIT, $0-24 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ stride+16(FP), R8 + + MOVQ (SI), X0 + MOVQ (SI)(R8*1), X1 + LEAQ (SI)(R8*2), CX + MOVQ (CX), X2 + MOVQ (CX)(R8*1), X3 + LEAQ (CX)(R8*2), CX + MOVQ (CX), X4 + MOVQ (CX)(R8*1), X5 + LEAQ (CX)(R8*2), CX + MOVQ (CX), X6 + MOVQ (CX)(R8*1), X7 + + TRANSPOSE8() + + VMOVDQU X8, (DI) + VMOVDQU X9, 16(DI) + VMOVDQU X10, 32(DI) + VMOVDQU X11, 48(DI) + + VZEROUPPER + RET + +// func turnOut8AVX2(dst *uint8, stride int, src *uint8) +TEXT ·turnOut8AVX2(SB), NOSPLIT, $0-24 + MOVQ dst+0(FP), DI + MOVQ stride+8(FP), R8 + MOVQ src+16(FP), SI + + MOVQ (SI), X0 + MOVQ 8(SI), X1 + MOVQ 16(SI), X2 + MOVQ 24(SI), X3 + MOVQ 32(SI), X4 + MOVQ 40(SI), X5 + MOVQ 48(SI), X6 + MOVQ 56(SI), X7 + + TRANSPOSE8() + + MOVQ X8, (DI) + VPEXTRQ $1, X8, R9 + MOVQ R9, (DI)(R8*1) + LEAQ (DI)(R8*2), CX + MOVQ X9, (CX) + VPEXTRQ $1, X9, R9 + MOVQ R9, (CX)(R8*1) + LEAQ (CX)(R8*2), CX + MOVQ X10, (CX) + VPEXTRQ $1, X10, R9 + MOVQ R9, (CX)(R8*1) + LEAQ (CX)(R8*2), CX + MOVQ X11, (CX) + VPEXTRQ $1, X11, R9 + MOVQ R9, (CX)(R8*1) + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/deblock_arm64.s b/third_party/h265/hevc/deblock_arm64.s new file mode 100644 index 00000000..139ee534 --- /dev/null +++ b/third_party/h265/hevc/deblock_arm64.s @@ -0,0 +1,404 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +// The two luma filters of 8.7.2.5.7 over the eight lines of one edge. A lane is +// one line, and the store saturates to the byte range the spec clips to anyway. + +// Every sum 8.7.2.5.7 forms stays inside a signed halfword: the widest is +// 2*p3 + 3*p2 + p1 + p0 + q0 + 4, which eight bit samples cap at 2044, and the +// normal filter's 9*(q0-p0) - 3*(q1-p1) at 3060. Halfwords are what the loads +// and the stores want anyway, which is a widening step each way fewer. +#define SMAX8H(Vd, Vn, Vm) WORD $(0x4e606400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMIN8H(Vd, Vn, Vm) WORD $(0x4e606c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHR8H(Vd, Vn, n) WORD $(0x4f000400 | ((32 - (n)) << 16) | ((Vn) << 5) | (Vd)) +#define SQXTUN8B(Vd, Vn) WORD $(0x2e212800 | ((Vn) << 5) | (Vd)) +#define ABS8H(Vd, Vn) WORD $(0x4e60b800 | ((Vn) << 5) | (Vd)) +#define MUL8H(Vd, Vn, Vm) WORD $(0x4e609c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define CMGT8H(Vd, Vn, Vm) WORD $(0x4e603400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define BSL16B(Vd, Vn, Vm) WORD $(0x6e601c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define ADD8H(Vd, Vn, Vm) WORD $(0x4e608400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SUB8H(Vd, Vn, Vm) WORD $(0x6e608400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define UXTL8H(Vd, Vn) WORD $(0x2f08a400 | ((Vn) << 5) | (Vd)) +#define DUP8H(Vd, Rn) WORD $(0x4e020c00 | ((Rn) << 5) | (Vd)) +#define EOR16B(Vd, Vn, Vm) WORD $(0x6e201c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define AND16B(Vd, Vn, Vm) WORD $(0x4e201c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define MOV16B(Vd, Vn) WORD $(0x4ea01c00 | ((Vn) << 16) | ((Vn) << 5) | (Vd)) + +// LOAD8 widens the eight bytes of one position into eight halfwords. +#define LOAD8(addr, Vd) \ + FMOVD (addr), F20 \ + UXTL8H(Vd, 20) + +// CLIPC puts v inside base-c .. base+c. +#define CLIPC(v, base, c, t0, t1) \ + SUB8H(t0, base, c) \ + ADD8H(t1, base, c) \ + SMAX8H(v, v, t0) \ + SMIN8H(v, v, t1) + +// STORE8 narrows eight halfwords to bytes and writes them. +#define STORE8(v, addr) \ + SQXTUN8B(19, v) \ + FMOVD F19, (addr) + +// TCV spreads the two thresholds over the lanes each governs. +#define TCV(Vd) \ + MOVD $0x0001000100010001, R5 \ + MUL R5, R2, R2 \ + MUL R5, R6, R6 \ + VMOV R2, Vd.D[0] \ + VMOV R6, Vd.D[1] + +// func deblockStrong8NEON(p *uint8, pitch int, tc0, tc1, flags int32) +TEXT ·deblockStrong8NEON(SB), NOSPLIT, $0-28 + MOVD p+0(FP), R0 + MOVD pitch+8(FP), R1 + MOVW tc0+16(FP), R2 + MOVW tc1+20(FP), R6 + MOVW flags+24(FP), R3 + + MOVD R0, R4 + LOAD8(R4, 0) + ADD R1, R4 + LOAD8(R4, 1) + ADD R1, R4 + LOAD8(R4, 2) + ADD R1, R4 + LOAD8(R4, 3) + ADD R1, R4 + LOAD8(R4, 4) + ADD R1, R4 + LOAD8(R4, 5) + ADD R1, R4 + LOAD8(R4, 6) + ADD R1, R4 + LOAD8(R4, 7) + + TCV(V8) + ADD8H(9, 8, 8) + + MOVD $4, R5 + DUP8H(10, 5) + MOVD $2, R5 + DUP8H(11, 5) + + // p0' from p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 + ADD8H(12, 3, 2) + ADD8H(12, 12, 4) + ADD8H(12, 12, 12) + ADD8H(12, 12, 1) + ADD8H(12, 12, 5) + ADD8H(12, 12, 10) + SSHR8H(12, 12, 3) + CLIPC(12, 3, 9, 17, 18) + + // p1' from p2 + p1 + p0 + q0 + 2 + ADD8H(13, 2, 1) + ADD8H(13, 13, 3) + ADD8H(13, 13, 4) + ADD8H(13, 13, 11) + SSHR8H(13, 13, 2) + CLIPC(13, 2, 9, 17, 18) + + TSTW $1, R3 + BNE qside + + // p2' from 2*p3 + 3*p2 + p1 + p0 + q0 + 4 + ADD8H(14, 0, 0) + ADD8H(14, 14, 1) + ADD8H(14, 14, 1) + ADD8H(14, 14, 1) + ADD8H(14, 14, 2) + ADD8H(14, 14, 3) + ADD8H(14, 14, 4) + ADD8H(14, 14, 10) + SSHR8H(14, 14, 3) + CLIPC(14, 1, 9, 17, 18) + + MOVD R0, R4 + ADD R1, R4 + STORE8(14, R4) + ADD R1, R4 + STORE8(13, R4) + ADD R1, R4 + STORE8(12, R4) + +qside: + TSTW $2, R3 + BNE done + + // q0' from p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 + ADD8H(12, 4, 3) + ADD8H(12, 12, 5) + ADD8H(12, 12, 12) + ADD8H(12, 12, 2) + ADD8H(12, 12, 6) + ADD8H(12, 12, 10) + SSHR8H(12, 12, 3) + CLIPC(12, 4, 9, 17, 18) + + // q1' from p0 + q0 + q1 + q2 + 2 + ADD8H(13, 4, 3) + ADD8H(13, 13, 5) + ADD8H(13, 13, 6) + ADD8H(13, 13, 11) + SSHR8H(13, 13, 2) + CLIPC(13, 5, 9, 17, 18) + + // q2' from p0 + q0 + q1 + 3*q2 + 2*q3 + 4 + ADD8H(14, 6, 6) + ADD8H(14, 14, 6) + ADD8H(14, 14, 7) + ADD8H(14, 14, 7) + ADD8H(14, 14, 3) + ADD8H(14, 14, 4) + ADD8H(14, 14, 5) + ADD8H(14, 14, 10) + SSHR8H(14, 14, 3) + CLIPC(14, 6, 9, 17, 18) + + MOVD R0, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + STORE8(12, R4) + ADD R1, R4 + STORE8(13, R4) + ADD R1, R4 + STORE8(14, R4) + +done: + RET + +// func deblockNormal8NEON(p *uint8, pitch int, tc0, tc1, nd, flags int32) +TEXT ·deblockNormal8NEON(SB), NOSPLIT, $0-32 + MOVD p+0(FP), R0 + MOVD pitch+8(FP), R1 + MOVW tc0+16(FP), R2 + MOVW tc1+20(FP), R6 + MOVW nd+24(FP), R7 + MOVW flags+28(FP), R3 + + MOVD R0, R4 + ADD R1, R4 + LOAD8(R4, 1) + ADD R1, R4 + LOAD8(R4, 2) + ADD R1, R4 + LOAD8(R4, 3) + ADD R1, R4 + LOAD8(R4, 4) + ADD R1, R4 + LOAD8(R4, 5) + ADD R1, R4 + LOAD8(R4, 6) + + TCV(V8) + + // delta = (9*(q0-p0) - 3*(q1-p1) + 8) >> 4 + SUB8H(12, 4, 3) + MOVD $9, R5 + DUP8H(15, 5) + MUL8H(12, 12, 15) + SUB8H(13, 5, 2) + MOVD $3, R5 + DUP8H(15, 5) + MUL8H(13, 13, 15) + SUB8H(12, 12, 13) + MOVD $8, R5 + DUP8H(15, 5) + ADD8H(12, 12, 15) + SSHR8H(12, 12, 4) + + // keep only the lanes 8.7.2.5.7 leaves inside ten times tc + ABS8H(21, 12) + MOVD $10, R5 + DUP8H(15, 5) + MUL8H(15, 8, 15) + CMGT8H(16, 15, 21) + + EOR16B(15, 15, 15) + SUB8H(17, 15, 8) + SMAX8H(12, 12, 17) + SMIN8H(12, 12, 8) + + SSHR8H(18, 8, 1) + EOR16B(15, 15, 15) + SUB8H(17, 15, 18) + + // the dEp and dEq of each half become the lanes their sample may move in + AND $1, R7, R5 + NEG R5, R5 + VMOV R5, V9.D[0] + LSR $2, R7, R5 + AND $1, R5, R5 + NEG R5, R5 + VMOV R5, V9.D[1] + AND16B(9, 9, 16) + + LSR $1, R7, R5 + AND $1, R5, R5 + NEG R5, R5 + VMOV R5, V10.D[0] + LSR $3, R7, R5 + AND $1, R5, R5 + NEG R5, R5 + VMOV R5, V10.D[1] + AND16B(10, 10, 16) + + TSTW $1, R3 + BNE nqside + + ADD8H(14, 3, 12) + MOV16B(22, 16) + BSL16B(22, 14, 3) + MOVD R0, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + STORE8(22, R4) + + // p1' from ((p2+p0+1)>>1 - p1 + delta) >> 1 + ADD8H(14, 1, 3) + MOVD $1, R5 + DUP8H(15, 5) + ADD8H(14, 14, 15) + SSHR8H(14, 14, 1) + SUB8H(14, 14, 2) + ADD8H(14, 14, 12) + SSHR8H(14, 14, 1) + SMAX8H(14, 14, 17) + SMIN8H(14, 14, 18) + ADD8H(14, 14, 2) + MOV16B(22, 9) + BSL16B(22, 14, 2) + MOVD R0, R4 + ADD R1, R4 + ADD R1, R4 + STORE8(22, R4) + +nqside: + TSTW $2, R3 + BNE ndone + + SUB8H(14, 4, 12) + MOV16B(22, 16) + BSL16B(22, 14, 4) + MOVD R0, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + STORE8(22, R4) + + // q1' from ((q2+q0+1)>>1 - q1 - delta) >> 1 + ADD8H(14, 6, 4) + MOVD $1, R5 + DUP8H(15, 5) + ADD8H(14, 14, 15) + SSHR8H(14, 14, 1) + SUB8H(14, 14, 5) + SUB8H(14, 14, 12) + SSHR8H(14, 14, 1) + SMAX8H(14, 14, 17) + SMIN8H(14, 14, 18) + ADD8H(14, 14, 5) + MOV16B(22, 10) + BSL16B(22, 14, 5) + MOVD R0, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + ADD R1, R4 + STORE8(22, R4) + +ndone: + RET + +// TRANSPOSE8 turns eight rows of eight bytes in the low half of V0 through V7 +// into eight columns, two to a register, in V8 through V11. +#define TRANSPOSE8() \ + VZIP1 V1.B16, V0.B16, V12.B16 \ + VZIP1 V3.B16, V2.B16, V13.B16 \ + VZIP1 V5.B16, V4.B16, V14.B16 \ + VZIP1 V7.B16, V6.B16, V15.B16 \ + VZIP1 V13.H8, V12.H8, V8.H8 \ + VZIP2 V13.H8, V12.H8, V9.H8 \ + VZIP1 V15.H8, V14.H8, V10.H8 \ + VZIP2 V15.H8, V14.H8, V11.H8 \ + VZIP1 V10.S4, V8.S4, V12.S4 \ + VZIP2 V10.S4, V8.S4, V13.S4 \ + VZIP1 V11.S4, V9.S4, V14.S4 \ + VZIP2 V11.S4, V9.S4, V15.S4 \ + VMOV V12.B16, V8.B16 \ + VMOV V13.B16, V9.B16 \ + VMOV V14.B16, V10.B16 \ + VMOV V15.B16, V11.B16 + +// func turnIn8NEON(dst *uint8, src *uint8, stride int) +TEXT ·turnIn8NEON(SB), NOSPLIT, $0-24 + MOVD dst+0(FP), R0 + MOVD src+8(FP), R1 + MOVD stride+16(FP), R2 + + VLD1 (R1), [V0.B8] + ADD R2, R1 + VLD1 (R1), [V1.B8] + ADD R2, R1 + VLD1 (R1), [V2.B8] + ADD R2, R1 + VLD1 (R1), [V3.B8] + ADD R2, R1 + VLD1 (R1), [V4.B8] + ADD R2, R1 + VLD1 (R1), [V5.B8] + ADD R2, R1 + VLD1 (R1), [V6.B8] + ADD R2, R1 + VLD1 (R1), [V7.B8] + + TRANSPOSE8() + + VST1 [V8.B16, V9.B16, V10.B16, V11.B16], (R0) + RET + +// func turnOut8NEON(dst *uint8, stride int, src *uint8) +TEXT ·turnOut8NEON(SB), NOSPLIT, $0-24 + MOVD dst+0(FP), R0 + MOVD stride+8(FP), R1 + MOVD src+16(FP), R2 + + VLD1.P 8(R2), [V0.B8] + VLD1.P 8(R2), [V1.B8] + VLD1.P 8(R2), [V2.B8] + VLD1.P 8(R2), [V3.B8] + VLD1.P 8(R2), [V4.B8] + VLD1.P 8(R2), [V5.B8] + VLD1.P 8(R2), [V6.B8] + VLD1 (R2), [V7.B8] + + TRANSPOSE8() + + VST1 [V8.B8], (R0) + VMOV V8.D[1], R3 + ADD R1, R0 + MOVD R3, (R0) + ADD R1, R0 + VST1 [V9.B8], (R0) + VMOV V9.D[1], R3 + ADD R1, R0 + MOVD R3, (R0) + ADD R1, R0 + VST1 [V10.B8], (R0) + VMOV V10.D[1], R3 + ADD R1, R0 + MOVD R3, (R0) + ADD R1, R0 + VST1 [V11.B8], (R0) + VMOV V11.D[1], R3 + ADD R1, R0 + MOVD R3, (R0) + RET diff --git a/third_party/h265/hevc/deblock_riscv64.s b/third_party/h265/hevc/deblock_riscv64.s new file mode 100644 index 00000000..7034b19c --- /dev/null +++ b/third_party/h265/hevc/deblock_riscv64.s @@ -0,0 +1,363 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// The two luma filters of 8.7.2.5.7 over the eight lines of one edge, with +// position i of line l at p[i*pitch+l]. + +// LOAD8 widens the eight bytes of one position into eight halfwords. +#define LOAD8(addr, t, Vd) \ + VLE8V (addr), t \ + VZEXTVF2 t, Vd + +// CLIPC puts v inside base-c .. base+c. +#define CLIPC(v, base, c, t0, t1) \ + VSUBVV c, base, t0 \ + VADDVV c, base, t1 \ + VMAXVV t0, v, v \ + VMINVV t1, v, v + +// CLAMP holds v to what a byte can carry. +#define CLAMP(v, hi) \ + VMAXVX X0, v, v \ + VMINVX hi, v, v + +// func deblockStrong8RVV(p *uint8, pitch int, tc0, tc1, flags int32) +TEXT ·deblockStrong8RVV(SB), NOSPLIT, $0-28 + MOV p+0(FP), X10 + MOV pitch+8(FP), X11 + MOVW tc0+16(FP), X12 + MOVW tc1+20(FP), X13 + MOVW flags+24(FP), X14 + + MOV $255, X17 + + VSETIVLI $8, E16, M1, TA, MA, X0 + + MOV X10, X15 + LOAD8(X15, V16, V1) + ADD X11, X15 + LOAD8(X15, V16, V2) + ADD X11, X15 + LOAD8(X15, V16, V3) + ADD X11, X15 + LOAD8(X15, V16, V4) + ADD X11, X15 + LOAD8(X15, V16, V5) + ADD X11, X15 + LOAD8(X15, V16, V6) + ADD X11, X15 + LOAD8(X15, V16, V7) + ADD X11, X15 + LOAD8(X15, V16, V8) + + // the first four lines take tc0 and the rest tc1 + SUB X12, X13, X16 + VIDV V9 + VSRLVI $2, V9, V9 + VMULVX X16, V9, V9 + VADDVX X12, V9, V9 + VADDVV V9, V9, V10 + + // p0' from p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4 + VADDVV V3, V4, V11 + VADDVV V5, V11, V11 + VADDVV V11, V11, V11 + VADDVV V2, V11, V11 + VADDVV V6, V11, V11 + VADDVI $4, V11, V11 + VSRAVI $3, V11, V11 + CLIPC(V11, V4, V10, V15, V16) + CLAMP(V11, X17) + + // p1' from p2 + p1 + p0 + q0 + 2 + VADDVV V2, V3, V12 + VADDVV V4, V12, V12 + VADDVV V5, V12, V12 + VADDVI $2, V12, V12 + VSRAVI $2, V12, V12 + CLIPC(V12, V3, V10, V15, V16) + CLAMP(V12, X17) + + AND $1, X14, X16 + BNE X0, X16, qside + + // p2' from 2*p3 + 3*p2 + p1 + p0 + q0 + 4 + VADDVV V1, V1, V13 + VADDVV V2, V13, V13 + VADDVV V2, V13, V13 + VADDVV V2, V13, V13 + VADDVV V3, V13, V13 + VADDVV V4, V13, V13 + VADDVV V5, V13, V13 + VADDVI $4, V13, V13 + VSRAVI $3, V13, V13 + CLIPC(V13, V2, V10, V15, V16) + CLAMP(V13, X17) + + MOV X10, X15 + ADD X11, X15 + + VSETIVLI $8, E8, MF2, TA, MA, X0 + VNSRLWI $0, V13, V14 + VSE8V V14, (X15) + ADD X11, X15 + VNSRLWI $0, V12, V14 + VSE8V V14, (X15) + ADD X11, X15 + VNSRLWI $0, V11, V14 + VSE8V V14, (X15) + VSETIVLI $8, E16, M1, TA, MA, X0 + +qside: + AND $2, X14, X16 + BNE X0, X16, done + + // q0' from p1 + 2*p0 + 2*q0 + 2*q1 + q2 + 4 + VADDVV V4, V5, V11 + VADDVV V6, V11, V11 + VADDVV V11, V11, V11 + VADDVV V3, V11, V11 + VADDVV V7, V11, V11 + VADDVI $4, V11, V11 + VSRAVI $3, V11, V11 + CLIPC(V11, V5, V10, V15, V16) + CLAMP(V11, X17) + + // q1' from p0 + q0 + q1 + q2 + 2 + VADDVV V4, V5, V12 + VADDVV V6, V12, V12 + VADDVV V7, V12, V12 + VADDVI $2, V12, V12 + VSRAVI $2, V12, V12 + CLIPC(V12, V6, V10, V15, V16) + CLAMP(V12, X17) + + // q2' from p0 + q0 + q1 + 3*q2 + 2*q3 + 4 + VADDVV V7, V7, V13 + VADDVV V7, V13, V13 + VADDVV V8, V13, V13 + VADDVV V8, V13, V13 + VADDVV V4, V13, V13 + VADDVV V5, V13, V13 + VADDVV V6, V13, V13 + VADDVI $4, V13, V13 + VSRAVI $3, V13, V13 + CLIPC(V13, V7, V10, V15, V16) + CLAMP(V13, X17) + + MOV X10, X15 + ADD X11, X15 + ADD X11, X15 + ADD X11, X15 + ADD X11, X15 + + VSETIVLI $8, E8, MF2, TA, MA, X0 + VNSRLWI $0, V11, V14 + VSE8V V14, (X15) + ADD X11, X15 + VNSRLWI $0, V12, V14 + VSE8V V14, (X15) + ADD X11, X15 + VNSRLWI $0, V13, V14 + VSE8V V14, (X15) + +done: + RET + +// func deblockNormal8RVV(p *uint8, pitch int, tc0, tc1, nd, flags int32) +TEXT ·deblockNormal8RVV(SB), NOSPLIT, $0-32 + MOV p+0(FP), X10 + MOV pitch+8(FP), X11 + MOVW tc0+16(FP), X12 + MOVW tc1+20(FP), X13 + MOVW nd+24(FP), X18 + MOVW flags+28(FP), X14 + + MOV $255, X17 + + VSETIVLI $8, E16, M1, TA, MA, X0 + + MOV X10, X15 + ADD X11, X15 + LOAD8(X15, V16, V2) + ADD X11, X15 + LOAD8(X15, V16, V3) + ADD X11, X15 + LOAD8(X15, V16, V4) + ADD X11, X15 + LOAD8(X15, V16, V5) + ADD X11, X15 + LOAD8(X15, V16, V6) + ADD X11, X15 + LOAD8(X15, V16, V7) + + SUB X12, X13, X16 + VIDV V9 + VSRLVI $2, V9, V9 + VMULVX X16, V9, V9 + VADDVX X12, V9, V9 + + // delta = (9*(q0-p0) - 3*(q1-p1) + 8) >> 4 + VSUBVV V4, V5, V11 + MOV $9, X16 + VMULVX X16, V11, V11 + VSUBVV V3, V6, V12 + MOV $3, X16 + VMULVX X16, V12, V12 + VSUBVV V12, V11, V11 + VADDVI $8, V11, V11 + VSRAVI $4, V11, V11 + + // keep only the lanes 8.7.2.5.7 leaves inside ten times tc + VRSUBVX X0, V11, V13 + VMAXVV V13, V11, V13 + MOV $10, X16 + VMULVX X16, V9, V14 + VMSLTVV V14, V13, V19 + + VRSUBVX X0, V9, V15 + VMAXVV V15, V11, V11 + VMINVV V9, V11, V11 + + // the dEp and dEq of each half become the lanes their sample may move in + AND $1, X18, X19 + SRL $2, X18, X20 + AND $1, X20, X20 + SUB X19, X20, X21 + VIDV V14 + VSRLVI $2, V14, V14 + VMULVX X21, V14, V14 + VADDVX X19, V14, V14 + VMSGTVX X0, V14, V20 + + SRL $1, X18, X19 + AND $1, X19, X19 + SRL $3, X18, X20 + AND $1, X20, X20 + SUB X19, X20, X21 + VIDV V14 + VSRLVI $2, V14, V14 + VMULVX X21, V14, V14 + VADDVX X19, V14, V14 + VMSGTVX X0, V14, V21 + + VSRAVI $1, V9, V15 + VRSUBVX X0, V15, V16 + + AND $1, X14, X16 + BNE X0, X16, nqside + + VMV1RV V19, V0 + VADDVV V11, V4, V13 + VMERGEVVM V13, V4, V0, V13 + CLAMP(V13, X17) + + // p1' from ((p2+p0+1)>>1 - p1 + delta) >> 1 + VMANDMM V19, V20, V0 + VADDVV V2, V4, V14 + VADDVI $1, V14, V14 + VSRAVI $1, V14, V14 + VSUBVV V3, V14, V14 + VADDVV V11, V14, V14 + VSRAVI $1, V14, V14 + VMAXVV V16, V14, V14 + VMINVV V15, V14, V14 + VADDVV V3, V14, V14 + VMERGEVVM V14, V3, V0, V14 + CLAMP(V14, X17) + + MOV X10, X15 + ADD X11, X15 + ADD X11, X15 + + VSETIVLI $8, E8, MF2, TA, MA, X0 + VNSRLWI $0, V14, V17 + VSE8V V17, (X15) + ADD X11, X15 + VNSRLWI $0, V13, V17 + VSE8V V17, (X15) + VSETIVLI $8, E16, M1, TA, MA, X0 + +nqside: + AND $2, X14, X16 + BNE X0, X16, ndone + + VMV1RV V19, V0 + VSUBVV V11, V5, V13 + VMERGEVVM V13, V5, V0, V13 + CLAMP(V13, X17) + + // q1' from ((q2+q0+1)>>1 - q1 - delta) >> 1 + VMANDMM V19, V21, V0 + VADDVV V7, V5, V14 + VADDVI $1, V14, V14 + VSRAVI $1, V14, V14 + VSUBVV V6, V14, V14 + VSUBVV V11, V14, V14 + VSRAVI $1, V14, V14 + VMAXVV V16, V14, V14 + VMINVV V15, V14, V14 + VADDVV V6, V14, V14 + VMERGEVVM V14, V6, V0, V14 + CLAMP(V14, X17) + + MOV X10, X15 + ADD X11, X15 + ADD X11, X15 + ADD X11, X15 + ADD X11, X15 + + VSETIVLI $8, E8, MF2, TA, MA, X0 + VNSRLWI $0, V13, V17 + VSE8V V17, (X15) + ADD X11, X15 + VNSRLWI $0, V14, V17 + VSE8V V17, (X15) + +ndone: + RET + +// func turnIn8RVV(dst *uint8, src *uint8, stride int) +TEXT ·turnIn8RVV(SB), NOSPLIT, $0-24 + MOV dst+0(FP), X10 + MOV src+8(FP), X11 + MOV stride+16(FP), X12 + + MOV $8, X13 + MOV $8, X14 + + VSETIVLI $8, E8, M1, TA, MA, X0 + +turnin: + VLE8V (X11), V1 + VSSE8V V1, X13, (X10) + + ADD X12, X11 + ADD $1, X10 + ADD $-1, X14 + BNE X0, X14, turnin + + RET + +// func turnOut8RVV(dst *uint8, stride int, src *uint8) +TEXT ·turnOut8RVV(SB), NOSPLIT, $0-24 + MOV dst+0(FP), X10 + MOV stride+8(FP), X11 + MOV src+16(FP), X12 + + MOV $8, X13 + MOV $8, X14 + + VSETIVLI $8, E8, M1, TA, MA, X0 + +turnout: + VLSE8V (X12), X13, V1 + VSE8V V1, (X10) + + ADD X11, X10 + ADD $1, X12 + ADD $-1, X14 + BNE X0, X14, turnout + + RET diff --git a/third_party/h265/hevc/deblockenc.go b/third_party/h265/hevc/deblockenc.go new file mode 100644 index 00000000..e20a6bb9 --- /dev/null +++ b/third_party/h265/hevc/deblockenc.go @@ -0,0 +1,112 @@ +package hevc + +// edgeV and edgeH mark a 4x4 block as the first column, or the first row, of a +// transform block, which a coding unit's own edges are always among. +const ( + edgeV = 1 << iota + edgeH +) + +// markTU records where a transform block begins, at the granularity 8.7.2 +// reads its edges in. +func (e *intraEncoder[P]) markTU(x, y, n int) { + bw := e.width / 4 + + for j := range n / 4 { + row := e.edges[(y/4+j)*bw+x/4:][:n/4] + + if j == 0 { + for i := range row { + row[i] |= edgeH + } + } + + row[0] |= edgeV + } +} + +// deblockRecon is 8.7.2 over the reconstruction: every vertical edge and then +// every horizontal one, on the eight-sample grid. It runs once the picture is +// whole, which 8.4.4.2.2 predicts from the samples before. +func (e *intraEncoder[P]) deblockRecon() { + var hdr sliceHeader + + for _, vertical := range []bool{true, false} { + for y := 0; y < e.height; y += 8 { + if !vertical && y == 0 { + continue + } + + for x := 0; x < e.width; x += 8 { + if vertical && x == 0 { + continue + } + + e.deblockEdge(x, y, vertical, &hdr) + } + } + } +} + +// deblockEdge filters the two four-sample segments of one edge. Every coding +// unit here is intra, so 8.7.2.4 gives each of them strength two. +func (e *intraEncoder[P]) deblockEdge(x, y int, vertical bool, hdr *sliceHeader) { + bw := e.width / 4 + sw, sh := e.shiftW, e.shiftH + + step, line := 1, e.width + if !vertical { + step, line = e.width, 1 + } + + base := y*e.width + x + + beta, tc := betaTc(int32(e.qp), 2, hdr, e.bitDepth) + + var plan [2]lumaPlan + + for k := 0; k < 8; k += 4 { + qx, qy := x, y+k + if !vertical { + qx, qy = x+k, y + } + + if qx >= e.width || qy >= e.height { + continue + } + + mask := uint8(edgeV) + if !vertical { + mask = edgeH + } + + if e.edges[qy/4*bw+qx/4]&mask == 0 { + continue + } + + if beta != 0 && tc != 0 { + plan[k>>2] = deblockLumaPlan(e.recon[0], base+k*line, line, step, beta, tc) + } + + if e.s.chromaArrayType() == 0 { + continue + } + + if (vertical && x&(8<> sh + if !vertical { + n = 4 >> sw + } + + _, tc := betaTc(int32(e.qpDeblockC), 2, hdr, e.bitDepth) + + deblockChromaPair(e.recon[1], e.recon[2], e.strideC, qx>>sw, qy>>sh, n, vertical, + tc, tc, e.bitDepth, false, false) + } + + deblockLumaEdge(e.recon[0], base, line, step, plan, e.bitDepth, + [2]bool{}, [2]bool{}) +} diff --git a/third_party/h265/hevc/decoder.go b/third_party/h265/hevc/decoder.go new file mode 100644 index 00000000..a4cc8957 --- /dev/null +++ b/third_party/h265/hevc/decoder.go @@ -0,0 +1,605 @@ +/* +Package hevc decodes an HEVC (H.265) bitstream, and encodes an intra-only one. + +[Decoder.DecodeNAL] takes one NAL unit at a time and returns the pictures that +are ready, which is not the same as the pictures it just decoded: a stream that +codes out of display order is held back by sps_max_num_reorder_pics and released +by picture order count. [Decoder.Flush] drains what is left at the end. + + var d hevc.Decoder + + for _, nal := range hevc.SplitAnnexB(data) { + pics, err := d.DecodeNAL(nal) + if err != nil { + return err + } + + for _, p := range pics { + p.Release() + } + } + +[SplitAnnexB] frames a start-code delimited stream and [SplitHVCC] a +length-prefixed one. + +# Pictures + +A [Picture] holds its planes as either 8-bit or 16-bit samples, in Y/Cb/Cr or +Y16/Cb16/Cr16, chosen by the sequence rather than by the plane: both are 16-bit +if either [Picture.BitDepth] or [Picture.BitDepthC] exceeds 8, which 7.4.3.2 +allows to differ. Width and Height stay as decoded because prediction reads the +whole plane; CropX, CropY, CropW and CropH are what a caller should display. + +[Picture.Release] hands the planes back to the decoder to be reused by a later +picture. It is optional, since a picture that is never released is collected +like any other value, but it keeps a long sequence from allocating a fresh set +of planes per frame. Reading the planes afterwards is a mistake; releasing twice +is not. + +# Threading + +[Decoder.Threads] bounds the goroutines a picture may be spread over, across +wavefront rows and the loop filter row bands. Zero means GOMAXPROCS and one +decodes serially. A picture without entropy_coding_sync_enabled_flag, or one a +single block wide, is serial whatever the bound. + +# Encoding + +[Encoder] writes self-contained intra IDR access units from 8-bit 4:2:0 frames +whose dimensions are non-zero and even. A picture that does not fill the coding +grid is padded to it and cropped back by a conformance window. Every frame is +coded on its own, so [Encoder.Flush] never has anything left to return. + + enc, err := hevc.NewEncoder(hevc.EncoderOptions{Width: 1920, Height: 1080, QP: 26}) + if err != nil { + return err + } + + nals, err := enc.Encode(hevc.Frame{Y: y, Cb: cb, Cr: cr, StrideY: ys, StrideC: cs}) + +[MarshalAnnexB] frames the result for a file and [MarshalNAL] writes one unit +for a length-prefixed container, whose configuration record repeats the +[ProfileTierLevel] of the sequence parameter set. + +A picture is one slice of 64x64 coding tree blocks, coded as 32x32 units and as +16x16 ones along an edge a 32x32 does not fit. Prediction searches all 35 intra +modes and the 8x8 transform blocks choose between one transform and four. +[EncoderOptions.Lossless] codes the samples as PCM instead and ignores QP. + +# Errors + +[ErrInvalid] means the bitstream is malformed. [ErrUnsupported] means it is +valid and declares a coding tool this decoder does not implement, which is +refused rather than decoded into a picture that merely looks plausible. Those +tools are cross-component prediction, implicit and explicit RDPCM, and CABAC +bypass alignment; everything else in the range extensions is applied. +*/ +package hevc + +// Decoder decodes a HEVC bitstream one NAL unit at a time. +type Decoder struct { + vps map[uint8]*vps + sps map[uint32]*sps + pps map[uint32]*pps + + cur *Picture + curOut bool + ctu *ctuDecoder + ctuPrev *ctuDecoder + prevSlic *sliceHeader + + dpb []dpbPicture + pool picPool + threads int + frameSizeLimit int + poc pocState + curRPS refPicSet + + // 8.1.3: leading pictures associated with an intra random access point + // that starts decoding reference pictures that were never decoded, and + // are discarded rather than decoded. + seenPicture bool + skipRASL bool + + maxReorder int + maxLatency int + maxDecPicBuf int + budget *DecodeBudget +} + +// FrameSizeLimit refuses a sequence whose pictures are larger than n samples, +// with ErrUnsupported. Zero, the default, accepts anything the level allows. +func (d *Decoder) FrameSizeLimit(n int) { d.frameSizeLimit = n } + +// DecodeNAL consumes one NAL unit and returns whatever pictures that completes, +// in output order. Reordering means a picture may surface several NAL units +// after the one that finished it. +func (d *Decoder) DecodeNAL(nal NALUnit) ([]*Picture, error) { + if d.sps == nil { + d.vps = make(map[uint8]*vps) + d.sps = make(map[uint32]*sps) + d.pps = make(map[uint32]*pps) + } + + switch nal.Type { + case NALVPS: + v, err := parseVPS(nal.RBSP) + if err != nil { + return nil, err + } + + d.vps[v.id] = v + + return nil, nil + + case NALSPS: + s, err := parseSPS(nal.RBSP) + if err != nil { + return nil, err + } + + d.sps[s.id] = s + + return nil, nil + + case NALPPS: + p, err := parsePPS(nal.RBSP) + if err != nil { + return nil, err + } + + d.pps[p.id] = p + + return nil, nil + } + + if nal.Type == NALEOS || nal.Type == NALEOB { + d.seenPicture = false + + return nil, nil + } + + if !nal.Type.IsVCL() { + return nil, nil + } + + if nal.Type.IsIRAP() { + d.skipRASL = !d.seenPicture || nal.Type.IsIDR() || + (nal.Type >= NALBlaWLP && nal.Type <= NALBlaNLP) + d.seenPicture = true + } + + if d.skipRASL && (nal.Type == NALRaslN || nal.Type == NALRaslR) { + return nil, nil + } + + d.seenPicture = true + + return d.decodeSlice(nal) +} + +// Flush ends the sequence and returns every picture still held back for +// reordering, in output order. +func (d *Decoder) Flush() []*Picture { + out := d.finishPicture() + + for { + p := d.dpbBump() + if p == nil { + break + } + + out = append(out, p) + } + + d.cur, d.ctu, d.prevSlic = nil, nil, nil + + for i := range d.dpb { + d.dpb[i].pic.release() + } + + clear(d.dpb) + d.dpb = d.dpb[:0] + + return out +} + +// finishPicture runs the loop filters over the picture the decoder has been +// filling, files it in the buffer and applies the additional bumping of +// C.5.2.3. +func (d *Decoder) finishPicture() []*Picture { + if d.cur == nil { + return nil + } + + if d.ctu != nil { + d.ctu.storeColMotion() + d.ctu.deblock() + d.ctu.applySAO() + } + + d.dpbStore(d.cur, d.curOut) + + // ctu is the signal that a picture is in progress; ctuPrev keeps its + // buffers and its scan tables for the next one. + d.cur, d.ctu = nil, nil + + return d.dpbDrain(false) +} + +func (d *Decoder) decodeSlice(nal NALUnit) ([]*Picture, error) { + p, first, err := d.ppsForSlice(nal) + if err != nil { + return nil, err + } + + s, ok := d.sps[p.spsID] + if !ok { + return nil, ErrInvalid + } + + // 7.4.3.2.1 activates one pair of parameter sets for a whole picture, so a + // set re-sent between its slice segments describes the next one. + if !first && d.ctu != nil { + if p.id != d.ctu.p.id { + return nil, ErrInvalid + } + + s, p = d.ctu.s, d.ctu.p + } + + if n := d.frameSizeLimit; n > 0 && + int(s.picWidthInLumaSamples)*int(s.picHeightInLumaSamples) > n { + return nil, ErrUnsupported + } + + sh, err := parseSliceHeader(nal.RBSP, nal.Type, s, p) + if err != nil { + return nil, err + } + + if sh.dependentSliceSegment { + if d.prevSlic == nil { + return nil, ErrInvalid + } + + sh.inherit(d.prevSlic) + } else { + indep := *sh + d.prevSlic = &indep + } + + if err := p.resolveTileGeometry(s); err != nil { + return nil, err + } + + var done []*Picture + + if sh.firstSliceSegmentInPic { + if !d.budget.take(int64(s.picWidthInLumaSamples) * int64(s.picHeightInLumaSamples)) { + return nil, ErrUnsupported + } + prior := d.cur != nil + + done = append(done, d.finishPicture()...) + + d.maxReorder = int(s.maxNumReorderPics) + d.maxLatency = int(s.maxLatencyIncrease) + d.maxDecPicBuf = int(s.maxDecPicBuffering) + 1 + + // 8.1.3 and 8.3.1: only a random access point that starts decoding + // restarts the count; one in mid-stream keeps it. + noRaslOutput := nal.Type.IsIRAP() && d.skipRASL + + if noRaslOutput { + d.poc = pocState{} + } + + poc := derivePOC(&d.poc, nal.Type, int32(sh.picOrderCntLsb), + s.log2MaxPocLsb, noRaslOutput) + d.poc.update(nal.Type, nal.TemporalID, poc, int32(sh.picOrderCntLsb), s.log2MaxPocLsb) + + rps := deriveRefPicSet(poc, s.log2MaxPocLsb, &sh.stRPS, &sh.ltRPS, sh.ltRPS.numSps) + d.resolveLongTerm(&rps, s.log2MaxPocLsb) + + // C.5.2.2: a random access point that starts decoding either discards + // the buffer or releases all of it, and a clean one always discards. + // Otherwise the reference picture set decides what stays. + switch { + case noRaslOutput && prior: + if !sh.noOutputOfPriorPics && nal.Type != NALCra { + for { + q := d.dpbBump() + if q == nil { + break + } + + done = append(done, q) + } + } + + d.dpb = nil + default: + d.dpbMark(&rps) + d.dpbRemoveUnused() + done = append(done, d.dpbDrain(true)...) + } + + if sh.sliceType != sliceI { + d.generateUnavailable(&rps, s) + } + + d.curRPS = rps + + d.cur = newPicture(&d.pool, s) + d.cur.POC = int(poc) + d.curOut = sh.picOutputFlag + d.ctu = newCTUDecoder(d.ctuPrev, s, p, sh, d.cur) + d.ctu.threads = d.waveThreads() + d.ctuPrev = d.ctu + d.ctu.poc = poc + } + + if d.cur == nil || d.ctu == nil { + return nil, ErrInvalid + } + + d.ctu.sh = sh + + // 7.4.7.1 signals the active reference counts and the list modification in + // every slice header, so the lists belong to the slice, not the picture. + d.buildRefLists(sh) + + if err := d.ctu.decodeSliceData(nal, sh); err != nil { + return nil, err + } + + return done, nil +} + +// ppsForSlice reads far enough into a slice segment header to find the picture +// parameter set it names, and whether it starts a picture. +func (d *Decoder) ppsForSlice(nal NALUnit) (*pps, bool, error) { + var c getBits + c.init(nal.RBSP) + + first := c.bit() != 0 + + if nal.Type >= NALBlaWLP && nal.Type <= 23 { + c.bit() + } + + id := c.ue() + if c.err { + return nil, false, ErrInvalid + } + + p, ok := d.pps[id] + if !ok { + return nil, false, ErrInvalid + } + + return p, first, nil +} + +// decodeSliceData is 7.3.8.1. Tiles and wavefronts split the slice segment into +// substreams that each restart the arithmetic decoder at an entry point. +func (d *ctuDecoder) decodeSliceData(nal NALUnit, sh *sliceHeader) error { + w := int(d.s.picWidthInCtbs) + total := w * int(d.s.picHeightInCtbs) + + starts := d.substreamStarts(nal, sh) + + d.sliceAddrRs = int(sh.sliceSegmentAddress) + if sh.dependentSliceSegment { + d.sliceAddrRs = d.depSliceAddrRs + } else { + d.depSliceAddrRs = int(sh.sliceSegmentAddress) + } + + d.simpleAvail = d.sliceAddrRs == 0 && !d.p.tilesEnabled + + sub := 0 + + start := int(d.rsToTs[sh.sliceSegmentAddress]) + tileStart := start == 0 || d.tileID[start] != d.tileID[start-1] + + if err := d.startSubstream(nal, sh, starts, sub, tileStart); err != nil { + return err + } + + wpp := d.p.entropyCodingSync + + d.sliceLF[d.sliceAddrRs] = sh.loopFilterAcross + + d.slices = append(d.slices, sh) + cur := int32(len(d.slices) - 1) + + if n := d.waveWorkers(sh, starts, wpp); n > 1 { + return d.decodeWavefront(nal, sh, starts, cur, n) + } + + for ts := start; ts < total; ts++ { + rs := int(d.tsToRs[ts]) + + d.ctbSliceAddr[rs] = int32(d.sliceAddrRs) + d.ctbSlice[rs] = cur + x := rs % w << d.s.ctbLog2SizeY + y := rs / w << d.s.ctbLog2SizeY + + if wpp && rs%w == 0 { + // 9.3.1 syncs from the block above-right, but only when 6.4.1 + // makes it available. A new slice starting on a row boundary has + // to initialise instead, and so does every row of a picture one + // block wide, which never has that neighbour at all. + top := rs - w + 1 + availT := w >= 2 && rs >= w && top >= d.sliceAddrRs && + d.tileID[d.rsToTs[rs]] == d.tileID[d.rsToTs[top]] + + oneWide := w < 2 && rs > 0 + + switch { + case availT && d.hasSaved: + d.c.state = d.saved + case ts > start || oneWide: + d.c.initContexts(sh.qpY, sh.sliceType, sh.cabacInit) + } + + d.qpYPrev = sh.qpY + } + + if err := d.codingTreeUnit(x, y); err != nil { + return err + } + + if wpp && rs%w == 1 { + d.saved = d.c.state + d.hasSaved = true + } + + if d.c.decodeTerminate() != 0 { + if d.p.dependentSliceSegmentsEnabled { + d.depSaved = d.c.state + d.hasDepSaved = true + } + + return nil + } + + endOfRow := wpp && rs%w == w-1 + endOfTile := ts+1 < total && d.tileID[ts+1] != d.tileID[ts] + + if endOfRow || endOfTile { + if d.c.decodeTerminate() == 0 { + return ErrInvalid + } + + sub++ + + if err := d.startSubstream(nal, sh, starts, sub, false); err != nil { + return err + } + + if endOfTile { + d.c.initContexts(sh.qpY, sh.sliceType, sh.cabacInit) + d.hasSaved = false + } + + d.qpYPrev = sh.qpY + } + } + + return nil +} + +// substreamStarts converts the entry point offsets, which count bytes of the +// NAL payload, into indices into the RBSP. +func (d *ctuDecoder) substreamStarts(nal NALUnit, sh *sliceHeader) []int { + starts := make([]int, 0, len(sh.entryPointOffsets)+1) + starts = append(starts, sh.dataOffset) + + base := nal.NALOffset(sh.dataOffset) + + for _, off := range sh.entryPointOffsets { + starts = append(starts, nal.RBSPOffset(base+int(off))) + } + + return starts +} + +// startSubstream is 9.3.1. A dependent slice segment carries on with the +// contexts the previous segment ended with, unless it opens a tile, which +// always initialises them. +func (d *ctuDecoder) startSubstream(nal NALUnit, sh *sliceHeader, starts []int, i int, + tileStart bool, +) error { + if i >= len(starts) { + return ErrInvalid + } + + if err := d.c.init(nal.RBSP, starts[i]); err != nil { + return err + } + + // 8.6.1 restarts qPY_PREV at a slice or a tile, so a dependent segment + // carrying on inside a tile keeps the quantisation parameter it inherited. + carry := i == 0 && sh.dependentSliceSegment && d.hasDepSaved && !tileStart + + if i == 0 && !carry { + d.c.initContexts(sh.qpY, sh.sliceType, sh.cabacInit) + } + + if carry { + d.c.state = d.depSaved + + return nil + } + + d.qpYCur = sh.qpY + d.qpYPrev = sh.qpY + + return nil +} + +// codingTreeUnit is 7.3.8.2. +func (d *ctuDecoder) codingTreeUnit(x, y int) error { + if d.sh.saoLuma || d.sh.saoChroma { + d.parseSAO(x, y) + } + + return d.codingQuadtree(x, y, int(d.s.ctbLog2SizeY), 0) +} + +func (d *Decoder) buildRefLists(sh *sliceHeader) { + for l := range 2 { + d.ctu.refPOC[l], d.ctu.refPics[l], d.ctu.refLong[l] = nil, nil, nil + + if sh.sliceType == sliceI || (l == 1 && sh.sliceType != sliceB) { + continue + } + + active := int(sh.numRefIdxL0Active) + entries := sh.listModification.listEntryL0 + modify := sh.listModification.flagL0 + + if l == 1 { + active = int(sh.numRefIdxL1Active) + entries = sh.listModification.listEntryL1 + modify = sh.listModification.flagL1 + } + + pocs := buildRefPicList(&d.curRPS, active, modify, entries, l == 1) + + d.ctu.refPOC[l] = pocs + d.ctu.refPics[l] = make([]*Picture, len(pocs)) + d.ctu.refLong[l] = make([]bool, len(pocs)) + + for i, p := range pocs { + d.ctu.refPics[l][i] = d.dpbFind(p) + d.ctu.refLong[l][i] = d.dpbLongTerm(p) + } + } + + d.ctu.noBackwardPred = true + + for l := range 2 { + for _, p := range d.ctu.refPOC[l] { + if p > int32(d.ctu.poc) { + d.ctu.noBackwardPred = false + } + } + } + + d.ctu.colPic = nil + + if sh.temporalMvp { + l := 1 + if sh.collocatedFromL0 { + l = 0 + } + + if int(sh.collocatedRefIdx) < len(d.ctu.refPics[l]) { + d.ctu.colPic = d.ctu.refPics[l][sh.collocatedRefIdx] + } + } +} diff --git a/third_party/h265/hevc/dequant_amd64.s b/third_party/h265/hevc/dequant_amd64.s new file mode 100644 index 00000000..e3b0afdd --- /dev/null +++ b/third_party/h265/hevc/dequant_amd64.s @@ -0,0 +1,132 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func dequant32AVX2(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) +// +// 8.6.3 once the left shift has been folded into the right one, so the product +// fits 32 bits. m may be nil, which means a flat matrix of sixteen. n is the +// coefficient count, always a multiple of eight. +TEXT ·dequant32AVX2(SB), NOSPLIT, $0-44 + MOVQ coef+0(FP), DI + MOVQ m+8(FP), SI + MOVQ n+16(FP), CX + + MOVL ls+24(FP), AX + MOVQ AX, X1 + VPBROADCASTD X1, Y1 + MOVL rnd+28(FP), AX + MOVQ AX, X2 + VPBROADCASTD X2, Y2 + MOVL lo+36(FP), AX + MOVQ AX, X4 + VPBROADCASTD X4, Y4 + MOVL hi+40(FP), AX + MOVQ AX, X5 + VPBROADCASTD X5, Y5 + + MOVL sh+32(FP), AX + MOVQ AX, X3 + + MOVL $16, AX + MOVQ AX, X6 + VPBROADCASTD X6, Y6 + + TESTQ SI, SI + JZ flat + +scaled: + VMOVDQU (DI), Y0 + VPMOVZXBD (SI), Y7 + VPMULLD Y7, Y0, Y0 + VPMULLD Y1, Y0, Y0 + VPADDD Y2, Y0, Y0 + VPSRAD X3, Y0, Y0 + VPMAXSD Y4, Y0, Y0 + VPMINSD Y5, Y0, Y0 + VMOVDQU Y0, (DI) + + ADDQ $32, DI + ADDQ $8, SI + SUBQ $8, CX + JNZ scaled + + VZEROUPPER + RET + +flat: + VMOVDQU (DI), Y0 + VPMULLD Y6, Y0, Y0 + VPMULLD Y1, Y0, Y0 + VPADDD Y2, Y0, Y0 + VPSRAD X3, Y0, Y0 + VPMAXSD Y4, Y0, Y0 + VPMINSD Y5, Y0, Y0 + VMOVDQU Y0, (DI) + + ADDQ $32, DI + SUBQ $8, CX + JNZ flat + + VZEROUPPER + RET + +// dequant32AVX512 is dequant32AVX2 over sixteen coefficients at a time. +TEXT ·dequant32AVX512(SB), NOSPLIT, $0-44 + MOVQ coef+0(FP), DI + MOVQ m+8(FP), SI + MOVQ n+16(FP), CX + + MOVL ls+24(FP), AX + VPBROADCASTD AX, Z1 + MOVL rnd+28(FP), AX + VPBROADCASTD AX, Z2 + MOVL lo+36(FP), AX + VPBROADCASTD AX, Z4 + MOVL hi+40(FP), AX + VPBROADCASTD AX, Z5 + + MOVL sh+32(FP), AX + MOVQ AX, X3 + + MOVL $16, AX + VPBROADCASTD AX, Z6 + + TESTQ SI, SI + JZ flat512 + +scaled512: + VMOVDQU32 (DI), Z0 + VPMOVZXBD (SI), Z7 + VPMULLD Z7, Z0, Z0 + VPMULLD Z1, Z0, Z0 + VPADDD Z2, Z0, Z0 + VPSRAD X3, Z0, Z0 + VPMAXSD Z4, Z0, Z0 + VPMINSD Z5, Z0, Z0 + VMOVDQU32 Z0, (DI) + + ADDQ $64, DI + ADDQ $16, SI + SUBQ $16, CX + JNZ scaled512 + + VZEROUPPER + RET + +flat512: + VMOVDQU32 (DI), Z0 + VPMULLD Z6, Z0, Z0 + VPMULLD Z1, Z0, Z0 + VPADDD Z2, Z0, Z0 + VPSRAD X3, Z0, Z0 + VPMAXSD Z4, Z0, Z0 + VPMINSD Z5, Z0, Z0 + VMOVDQU32 Z0, (DI) + + ADDQ $64, DI + SUBQ $16, CX + JNZ flat512 + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/dequant_arm64.s b/third_party/h265/hevc/dequant_arm64.s new file mode 100644 index 00000000..b3ceece8 --- /dev/null +++ b/third_party/h265/hevc/dequant_arm64.s @@ -0,0 +1,88 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define MUL4S_(Vd, Vn, Vm) WORD $(0x4ea09c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL4S3(Vd, Vn, Vm) WORD $(0x4ea04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMAX4S(Vd, Vn, Vm) WORD $(0x4ea06400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMIN4S(Vd, Vn, Vm) WORD $(0x4ea06c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func dequant32NEON(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) +// +// 8.6.3 once the left shift has been folded into the right one. m may be nil, +// which means a flat matrix of sixteen. +TEXT ·dequant32NEON(SB), NOSPLIT, $0-44 + MOVD coef+0(FP), R0 + MOVD m+8(FP), R1 + MOVD n+16(FP), R2 + MOVW ls+24(FP), R3 + MOVW rnd+28(FP), R4 + MOVW sh+32(FP), R5 + MOVW lo+36(FP), R6 + MOVW hi+40(FP), R7 + + VDUP R3, V1.S4 + VDUP R4, V2.S4 + NEG R5, R8 + VDUP R8, V3.S4 + VDUP R6, V4.S4 + VDUP R7, V5.S4 + + MOVD $16, R9 + VDUP R9, V6.S4 + + CBZ R1, flat + +scaled: + VLD1 (R0), [V16.S4, V17.S4] + VLD1.P 8(R1), [V7.B8] + VUXTL V7.B8, V7.H8 + VUXTL V7.H4, V18.S4 + VUXTL2 V7.H8, V19.S4 + + MUL4S_(16, 16, 18) + MUL4S_(17, 17, 19) + MUL4S_(16, 16, 1) + MUL4S_(17, 17, 1) + + VADD V2.S4, V16.S4, V16.S4 + VADD V2.S4, V17.S4, V17.S4 + + SSHL4S3(16, 16, 3) + SSHL4S3(17, 17, 3) + SMAX4S(16, 16, 4) + SMAX4S(17, 17, 4) + SMIN4S(16, 16, 5) + SMIN4S(17, 17, 5) + + VST1.P [V16.S4, V17.S4], 32(R0) + + SUB $8, R2 + CBNZ R2, scaled + + RET + +flat: + VLD1 (R0), [V16.S4, V17.S4] + + MUL4S_(16, 16, 6) + MUL4S_(17, 17, 6) + MUL4S_(16, 16, 1) + MUL4S_(17, 17, 1) + + VADD V2.S4, V16.S4, V16.S4 + VADD V2.S4, V17.S4, V17.S4 + + SSHL4S3(16, 16, 3) + SSHL4S3(17, 17, 3) + SMAX4S(16, 16, 4) + SMAX4S(17, 17, 4) + SMIN4S(16, 16, 5) + SMIN4S(17, 17, 5) + + VST1.P [V16.S4, V17.S4], 32(R0) + + SUB $8, R2 + CBNZ R2, flat + + RET diff --git a/third_party/h265/hevc/dequant_riscv64.s b/third_party/h265/hevc/dequant_riscv64.s new file mode 100644 index 00000000..3c237030 --- /dev/null +++ b/third_party/h265/hevc/dequant_riscv64.s @@ -0,0 +1,60 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func dequant32RVV(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) +// +// 8.6.3 once the left shift has been folded into the right one. m may be nil, +// which means a flat matrix of sixteen. +TEXT ·dequant32RVV(SB), NOSPLIT, $0-44 + MOV coef+0(FP), X10 + MOV m+8(FP), X11 + MOV n+16(FP), X12 + MOVW ls+24(FP), X13 + MOVW rnd+28(FP), X14 + MOVW sh+32(FP), X15 + MOVW lo+36(FP), X16 + MOVW hi+40(FP), X17 + + BEQZ X11, flat + +scaled: + VSETVLI X12, E32, M1, TA, MA, X18 + + VLE32V (X10), V1 + VLE8V (X11), V2 + VZEXTVF4 V2, V3 + VMULVV V3, V1, V1 + VMULVX X13, V1, V1 + VADDVX X14, V1, V1 + VSRAVX X15, V1, V1 + VMAXVX X16, V1, V1 + VMINVX X17, V1, V1 + VSE32V V1, (X10) + + SLLI $2, X18, X19 + ADD X19, X10 + ADD X18, X11 + SUB X18, X12 + BNEZ X12, scaled + + RET + +flat: + VSETVLI X12, E32, M1, TA, MA, X18 + + VLE32V (X10), V1 + VSLLVI $4, V1, V1 + VMULVX X13, V1, V1 + VADDVX X14, V1, V1 + VSRAVX X15, V1, V1 + VMAXVX X16, V1, V1 + VMINVX X17, V1, V1 + VSE32V V1, (X10) + + SLLI $2, X18, X19 + ADD X19, X10 + SUB X18, X12 + BNEZ X12, flat + + RET diff --git a/third_party/h265/hevc/dpb.go b/third_party/h265/hevc/dpb.go new file mode 100644 index 00000000..4320aab7 --- /dev/null +++ b/third_party/h265/hevc/dpb.go @@ -0,0 +1,414 @@ +package hevc + +// pocState carries what 8.3.1 needs from the previous picture with TemporalId +// zero that was neither RASL, RADL nor a sub-layer non-reference picture. +type pocState struct { + prevLsb int32 + prevMsb int32 +} + +// derivePOC is the picture order count derivation of 8.3.1. +func derivePOC(st *pocState, nalType NALType, lsb int32, log2MaxLsb uint8, noRaslOutput bool) int32 { + maxLsb := int32(1) << log2MaxLsb + + var msb int32 + + switch { + case nalType.IsIRAP() && noRaslOutput: + msb = 0 + case lsb < st.prevLsb && st.prevLsb-lsb >= maxLsb/2: + msb = st.prevMsb + maxLsb + case lsb > st.prevLsb && lsb-st.prevLsb > maxLsb/2: + msb = st.prevMsb - maxLsb + default: + msb = st.prevMsb + } + + return msb + lsb +} + +// isSubLayerNonRef reports the sub-layer non-reference types, which 8.3.1 +// excludes from the previous-picture search along with RASL and RADL. +func isSubLayerNonRef(t NALType) bool { + return t < 16 && t%2 == 0 +} + +// updatePOCState advances the state 8.3.1 reads, which only pictures at +// temporal layer zero that are not RASL, RADL or sub-layer non-reference do. +func (st *pocState) update(nalType NALType, temporalID uint8, poc, lsb int32, _ uint8) { + if temporalID != 0 || + nalType == NALRaslN || nalType == NALRaslR || + nalType == NALRadlN || nalType == NALRadlR || + isSubLayerNonRef(nalType) { + return + } + + st.prevLsb = lsb + st.prevMsb = poc - lsb +} + +// refPicSet is the result of 8.3.2: the reference pictures the current picture +// may use, by POC, split the way list construction consumes them. +type refPicSet struct { + stCurrBefore []int32 + stCurrAfter []int32 + ltCurr []int32 + stFoll []int32 + ltFoll []int32 + + // A long-term entry whose delta_poc_msb_present_flag is zero names its + // picture by the least significant bits alone, so it can only be resolved + // against what the buffer holds. + ltCurrLsbOnly []bool + ltFollLsbOnly []bool +} + +// deriveRefPicSet is 8.3.2. The long-term entries need the current POC to +// rebuild their most significant bits, so it is passed rather than stored. +func deriveRefPicSet(poc int32, log2MaxLsb uint8, st *shortTermRPS, lt *longTermRPS, + numLtSps int, +) refPicSet { + var rps refPicSet + + for i, d := range st.deltaPocS0 { + if st.usedS0[i] { + rps.stCurrBefore = append(rps.stCurrBefore, poc+d) + } else { + rps.stFoll = append(rps.stFoll, poc+d) + } + } + + for i, d := range st.deltaPocS1 { + if st.usedS1[i] { + rps.stCurrAfter = append(rps.stCurrAfter, poc+d) + } else { + rps.stFoll = append(rps.stFoll, poc+d) + } + } + + maxLsb := int32(1) << log2MaxLsb + + var cycle int32 + + for i := range lt.pocLsbLt { + // DeltaPocMsbCycleLt accumulates within each of the two groups the + // syntax splits long-term references into. + if i == 0 || i == numLtSps { + cycle = int32(lt.deltaPocMsbCycle[i]) + } else { + cycle += int32(lt.deltaPocMsbCycle[i]) + } + + v := int32(lt.pocLsbLt[i]) + if lt.deltaPocMsbPresn[i] { + v = poc - cycle*maxLsb - poc&(maxLsb-1) + v + } + + if lt.usedByCurrPicLt[i] { + rps.ltCurr = append(rps.ltCurr, v) + rps.ltCurrLsbOnly = append(rps.ltCurrLsbOnly, !lt.deltaPocMsbPresn[i]) + } else { + rps.ltFoll = append(rps.ltFoll, v) + rps.ltFollLsbOnly = append(rps.ltFollLsbOnly, !lt.deltaPocMsbPresn[i]) + } + } + + return rps +} + +func (r *refPicSet) numPocTotalCurr() int { + return len(r.stCurrBefore) + len(r.stCurrAfter) + len(r.ltCurr) +} + +// buildRefPicList is 8.3.4. The temporary list repeats the three groups until +// it is long enough, then the modification indices select from it. +func buildRefPicList(rps *refPicSet, numActive int, modify bool, entries []uint32, l1 bool) []int32 { + total := rps.numPocTotalCurr() + if total == 0 { + return nil + } + + n := max(numActive, total) + + first, second := rps.stCurrBefore, rps.stCurrAfter + if l1 { + first, second = rps.stCurrAfter, rps.stCurrBefore + } + + temp := make([]int32, 0, n) + for len(temp) < n { + for _, p := range first { + if len(temp) == n { + break + } + + temp = append(temp, p) + } + + for _, p := range second { + if len(temp) == n { + break + } + + temp = append(temp, p) + } + + for _, p := range rps.ltCurr { + if len(temp) == n { + break + } + + temp = append(temp, p) + } + } + + list := make([]int32, numActive) + + for i := range list { + if modify && i < len(entries) { + if int(entries[i]) >= len(temp) { + return nil + } + + list[i] = temp[entries[i]] + + continue + } + + list[i] = temp[i] + } + + return list +} + +// dpbPicture is one decoded picture buffer entry, C.3. +type dpbPicture struct { + pic *Picture + ref bool + longTerm bool + output bool + latency int +} + +func (d *Decoder) dpbFind(poc int32) *Picture { + for i := range d.dpb { + if int32(d.dpb[i].pic.POC) == poc { + return d.dpb[i].pic + } + } + + return nil +} + +// dpbMark is 8.3.2: everything the current picture's reference picture set +// leaves out stops being a reference. +func (d *Decoder) dpbMark(rps *refPicSet) { + keep := make(map[int32]bool, rps.numPocTotalCurr()) + long := make(map[int32]bool, len(rps.ltCurr)+len(rps.ltFoll)) + + for _, l := range [][]int32{rps.stCurrBefore, rps.stCurrAfter, rps.stFoll} { + for _, p := range l { + keep[p] = true + } + } + + for _, l := range [][]int32{rps.ltCurr, rps.ltFoll} { + for _, p := range l { + keep[p] = true + long[p] = true + } + } + + for i := range d.dpb { + poc := int32(d.dpb[i].pic.POC) + d.dpb[i].ref = keep[poc] + d.dpb[i].longTerm = long[poc] + } +} + +// dpbLongTerm reports whether a reference picture is marked long term, which +// suppresses the motion vector scaling of 8.5.3.2.8. +func (d *Decoder) dpbLongTerm(poc int32) bool { + for i := range d.dpb { + if int32(d.dpb[i].pic.POC) == poc { + return d.dpb[i].longTerm + } + } + + return false +} + +// dpbRemoveUnused drops the entries C.5.2.2 empties, those neither held for +// reference nor waiting to be output. +func (d *Decoder) dpbRemoveUnused() { + kept := d.dpb[:0] + + for _, e := range d.dpb { + if e.ref || e.output { + kept = append(kept, e) + + continue + } + + e.pic.release() + } + + clear(d.dpb[len(kept):]) + d.dpb = kept +} + +func (d *Decoder) dpbNeedOutput() int { + n := 0 + + for _, e := range d.dpb { + if e.output { + n++ + } + } + + return n +} + +// dpbBump is C.5.2.4, releasing the picture with the smallest picture order +// count of those still waiting. +func (d *Decoder) dpbBump() *Picture { + best := -1 + + for i := range d.dpb { + if d.dpb[i].output && (best < 0 || d.dpb[i].pic.POC < d.dpb[best].pic.POC) { + best = i + } + } + + if best < 0 { + return nil + } + + p := d.dpb[best].pic + d.dpb[best].output = false + + // The caller takes a reference of its own; the buffer entry may be the + // last one and drop in dpbRemoveUnused. + p.acquire() + + d.dpbRemoveUnused() + + return p +} + +// dpbFull is the bumping condition shared by C.5.2.2 and C.5.2.3. +func (d *Decoder) dpbFull(includeBuffering bool) bool { + if d.dpbNeedOutput() > d.maxReorder { + return true + } + + if d.maxLatency != 0 { + for _, e := range d.dpb { + if e.output && e.latency >= d.maxReorder+d.maxLatency-1 { + return true + } + } + } + + return includeBuffering && len(d.dpb) >= d.maxDecPicBuf +} + +func (d *Decoder) dpbDrain(includeBuffering bool) []*Picture { + var out []*Picture + + for d.dpbFull(includeBuffering) { + p := d.dpbBump() + if p == nil { + break + } + + out = append(out, p) + } + + return out +} + +// dpbStore is C.5.2.3, which also ages every picture already waiting. +func (d *Decoder) dpbStore(p *Picture, output bool) { + if output { + for i := range d.dpb { + if d.dpb[i].output { + d.dpb[i].latency++ + } + } + } + + d.dpb = append(d.dpb, dpbPicture{pic: p, ref: true, output: output}) +} + +// resolveLongTerm completes the long-term entries of 8.3.2 that carry only the +// least significant bits of their picture order count. +func (d *Decoder) resolveLongTerm(rps *refPicSet, log2MaxLsb uint8) { + mask := int32(1)<= len(lsbOnly) || !lsbOnly[i] { + taken[pocs[i]] = true + + continue + } + + for _, e := range d.dpb { + poc := int32(e.pic.POC) + if e.ref && !taken[poc] && poc&mask == pocs[i]&mask { + pocs[i] = poc + taken[poc] = true + + break + } + } + } + } + + fix(rps.ltCurr, rps.ltCurrLsbOnly) + fix(rps.ltFoll, rps.ltFollLsbOnly) +} + +// generateUnavailable is 8.3.3. A reference the buffer never received is +// replaced by a mid-grey picture so a stream joined at a random access point, +// or one with a broken link, still decodes. +func (d *Decoder) generateUnavailable(rps *refPicSet, s *sps) { + grey := func(poc int32) { + if d.dpbFind(poc) != nil { + return + } + + p := newPicture(&d.pool, s) + p.POC = int(poc) + + for cIdx, plane := range [][]uint8{p.Y, p.Cb, p.Cr} { + mid := uint8(1) << (p.depth(cIdx) - 1) + + for i := range plane { + plane[i] = mid + } + } + + for cIdx, plane := range [][]uint16{p.Y16, p.Cb16, p.Cr16} { + mid := uint16(1) << (p.depth(cIdx) - 1) + + for i := range plane { + plane[i] = mid + } + } + + d.dpb = append(d.dpb, dpbPicture{pic: p, ref: true}) + } + + for _, l := range [][]int32{rps.stCurrBefore, rps.stCurrAfter, rps.ltCurr, + rps.stFoll, rps.ltFoll} { + for _, poc := range l { + grey(poc) + } + } +} diff --git a/third_party/h265/hevc/dsp.go b/third_party/h265/hevc/dsp.go new file mode 100644 index 00000000..ca9aefdc --- /dev/null +++ b/third_party/h265/hevc/dsp.go @@ -0,0 +1,102 @@ +package hevc + +type dspContext struct { + inverseTransform func(coef []int32, n int, dst bool, bitDepth int, extended bool, s *transformScratch) + transformSkip func(coef []int32, n int, rotate bool) + dequant func(coef []int32, m []uint8, n, qp, bitDepth int, extended bool) + + // addResidual8 and addResidual16 are nil unless an implementation is + // compiled in. They handle n of at least eight. + addResidual8 func(dst []uint8, stride int, coef []int32, n, shift int) + addResidual16 func(dst []uint16, stride int, coef []int32, n, shift int, maxV int32) +} + +// oddAsm is the sixteen-wide odd half of 8.6.4.2, nil unless an +// implementation is compiled in. It stands outside dspContext because the +// inverse transform is itself a kernel, so reaching it through dsp would be an +// initialisation cycle. +var oddAsm func(out, in []int32, stride int) + +var forwardTransform8Asm func(dst, src []int32, n int) + +// The luma filters of 8.7.2.5.7 over the eight lines of one edge, nil unless an +// implementation is compiled in. Position i of line l is at p[i*pitch+l], the +// first four lines take tc0 and the rest tc1. +var ( + deblockStrongAsm func(p []uint8, pitch int, tc0, tc1, flags int32) + deblockNormalAsm func(p []uint8, pitch int, tc0, tc1, nd, flags int32) + + // deblockTurnIn and deblockTurnOut put a vertical edge's lines into those + // lanes and back, since only a horizontal one already lies that way. + deblockTurnIn func(dst, src []uint8, stride int) + deblockTurnOut func(dst []uint8, stride int, src []uint8) +) + +// planarAsm is 8.4.4.2.4 for eight-bit output, nil unless an implementation is +// compiled in. It handles n of at least eight. +var planarAsm func(dst []uint8, stride int, r *refSamples, shift int) + +// predUniAsm and predBiAsm are 8.5.3.3.4.2 for eight-bit output, nil unless an +// implementation is compiled in. w is a multiple of eight. +var ( + predUniAsm func(dst []uint8, dstStride int, src []int16, srcStride, w, h, shift int) + predBiAsm func(dst []uint8, dstStride int, a, b []int16, srcStride, w, h, shift int) +) + +// The motion compensation kernels of 8.5.3.3.3, nil unless an implementation +// is compiled in. w is a multiple of eight throughout. +// +// mcTapAsm is one direction over eight-bit samples, with src at the first tap; +// mcTapV16Asm is the vertical half of a two-pass filter, reading the first +// pass at sixteen bits. Both take the tap count, so luma's eight-tap and +// chroma's four-tap share them. mcCopyAsm is the integer-position case. +var ( + mcCopyAsm func(dst []int16, dstStride int, src []uint8, srcStride, w, h, shift int) + + mcTapAsm func(dst []int16, dstStride int, src []uint8, srcStride, tapStride, w, h int, + f []int16) + + mcTapV16Asm func(dst []int16, dstStride int, src []int16, srcStride, w, h, shift int, + f []int16) +) + +// dequant32Asm is 8.6.3 in its 32-bit form, nil unless an implementation is +// compiled in. m may be nil for a flat matrix. +var dequant32Asm func(coef []int32, m []uint8, ls, rnd int32, sh int, lo, hi int32) + +// idctColsAsm is one pass of 8.6.4.2 over eight columns at a time, nil unless +// an implementation is compiled in. n is at least eight. +var idctColsAsm func(dst, src []int32, n int, rnd int32, shift int, lo, hi int32) + +// sse8Asm is the squared error between a plane and a block, nil unless an +// implementation is compiled in. n is a multiple of eight. +var sse8Asm func(src []uint8, srcStride int, block []uint8, blockStride, n int) int64 + +// quantize8Asm is the forward direction of 8.6.3, nil unless an implementation +// is compiled in. +var quantize8Asm func(dst, src []int32, count int, scale, offset int32, qbits int) + +// satd16x8Asm is satd over a sixteen wide and eight tall strip, which is two +// 8x8 blocks, nil unless an implementation is compiled in. +var satd16x8Asm func(src []uint8, srcStride int, pred []uint8, predStride int) int64 + +// transposeAsm transposes an n by n block of int32, nil unless an +// implementation is compiled in. n is a multiple of eight. +var transposeAsm func(dst, src []int32, n int) + +func newDSPGo() *dspContext { + return &dspContext{ + inverseTransform: inverseTransform, + transformSkip: transformSkip, + dequant: dequant, + } +} + +// dsp is resolved at package initialisation, so reading a kernel is a plain +// field load. The inverse transform reads one per basis row. +var dsp = func() *dspContext { + d := newDSPGo() + dspInit(d) + + return d +}() diff --git a/third_party/h265/hevc/dsp_amd64.go b/third_party/h265/hevc/dsp_amd64.go new file mode 100644 index 00000000..9f5119b2 --- /dev/null +++ b/third_party/h265/hevc/dsp_amd64.go @@ -0,0 +1,264 @@ +//go:build amd64 && !noasm + +package hevc + +var ( + hasAVX2 = cpuidAVX2() + hasAVX512 = cpuidAVX512ICL() +) + +func cpuidAVX2() bool + +func cpuidAVX512ICL() bool + +//go:noescape +func addResidual8AVX2(dst *uint8, stride int, coef *int32, n, shift int) + +//go:noescape +func addResidual16AVX2(dst *uint16, stride int, coef *int32, n, shift int, maxV int32) + +//go:noescape +func odd16AVX2(out *int32, in *int32, m *int8, stride int) + +//go:noescape +func predPlanar8AVX2(dst *uint8, stride int, top *int32, left *int32, tr, bl, n, shift int) + +//go:noescape +func predUni8AVX2(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) + +//go:noescape +func predUni8AVX512(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) + +//go:noescape +func mcTap8AVX2(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) + +//go:noescape +func mcTap4AVX2(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) + +//go:noescape +func mcTapV16x8AVX2(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) + +//go:noescape +func mcTapV16x4AVX2(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) + +//go:noescape +func mcCopy8AVX2(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) + +//go:noescape +func mcCopy8AVX512(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) + +//go:noescape +func predBi8AVX2(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) + +//go:noescape +func predBi8AVX512(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) + +//go:noescape +func idctCols8AVX2(dst, src, m *int32, n, mstride, shift int, rnd, lo, hi int32) + +//go:noescape +func predAngular8AVX2(dst *uint8, stride int, ref *int32, angle, n int) + +//go:noescape +func sse8AVX2(src *uint8, srcStride int, block *uint8, blockStride, n int) int64 + +//go:noescape +func quantize8AVX2(dst, src *int32, count int, scale, offset int32, qbits int) + +//go:noescape +func satd16x8AVX2(src *uint8, srcStride int, pred *uint8, predStride int) int64 + +//go:noescape +func transpose8AVX2(dst, src *int32, n int) + +//go:noescape +func forwardTransform8AVX2(dst, src, m *int32, n, shift1, shift2 int) + +//go:noescape +func forwardTransform8AVX512(dst, src, m *int32, n, shift1, shift2 int) + +var forwardTransformMatrix = func() [4][32 * 32]int32 { + var m [4][32 * 32]int32 + + for p, n := range [4]int{4, 8, 16, 32} { + stride := 32 / n + + for x := range n { + for k := range n { + m[p][x*n+k] = int32(transMatrix[k*stride][x]) + } + } + } + + return m +}() + +//go:noescape +func dequant32AVX2(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) + +//go:noescape +func dequant32AVX512(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) + +//go:noescape +func deblockStrong8AVX2(p *uint8, pitch int, tc0, tc1, flags int32) + +//go:noescape +func deblockNormal8AVX2(p *uint8, pitch int, tc0, tc1, nd, flags int32) + +//go:noescape +func turnIn8AVX2(dst *uint8, src *uint8, stride int) + +//go:noescape +func turnOut8AVX2(dst *uint8, stride int, src *uint8) + +func dspInit(d *dspContext) { + if !hasAVX2 { + return + } + + d.addResidual8 = func(dst []uint8, stride int, coef []int32, n, shift int) { + addResidual8AVX2(&dst[0], stride, &coef[0], n, shift) + } + + d.addResidual16 = func(dst []uint16, stride int, coef []int32, n, shift int, maxV int32) { + addResidual16AVX2(&dst[0], stride, &coef[0], n, shift, maxV) + } + + idctColsAsm = func(dst, src []int32, n int, rnd int32, shift int, lo, hi int32) { + idctCols8AVX2(&dst[0], &src[0], &transMatrix32[0][0], n, 32*(32/n), shift, + rnd, lo, hi) + } + + deblockStrongAsm = func(p []uint8, pitch int, tc0, tc1, flags int32) { + deblockStrong8AVX2(&p[0], pitch, tc0, tc1, flags) + } + + deblockNormalAsm = func(p []uint8, pitch int, tc0, tc1, nd, flags int32) { + deblockNormal8AVX2(&p[0], pitch, tc0, tc1, nd, flags) + } + + deblockTurnIn = func(dst, src []uint8, stride int) { + turnIn8AVX2(&dst[0], &src[0], stride) + } + + deblockTurnOut = func(dst []uint8, stride int, src []uint8) { + turnOut8AVX2(&dst[0], stride, &src[0]) + } + + transposeAsm = func(dst, src []int32, n int) { + transpose8AVX2(&dst[0], &src[0], n) + } + + satd16x8Asm = func(src []uint8, srcStride int, pred []uint8, predStride int) int64 { + return satd16x8AVX2(&src[0], srcStride, &pred[0], predStride) + } + + sse8Asm = func(src []uint8, srcStride int, block []uint8, blockStride, n int) int64 { + return sse8AVX2(&src[0], srcStride, &block[0], blockStride, n) + } + + quantize8Asm = func(dst, src []int32, count int, scale, offset int32, qbits int) { + quantize8AVX2(&dst[0], &src[0], count, scale, offset, qbits) + } + + forwardTransform8Asm = func(dst, src []int32, n int) { + if hasAVX512 && n >= 16 { + forwardTransform8AVX512(&dst[0], &src[0], &forwardTransformMatrix[log2(n)-2][0], + n, log2(n)-1, log2(n)+6) + + return + } + + forwardTransform8AVX2(&dst[0], &src[0], &forwardTransformMatrix[log2(n)-2][0], + n, log2(n)-1, log2(n)+6) + } + + oddAsm = func(out, in []int32, stride int) { + odd16AVX2(&out[0], &in[0], &transMatrix[0][0], stride) + } + + mcTapAsm = func(dst []int16, dstStride int, src []uint8, srcStride, tapStride, w, h int, + f []int16, + ) { + if len(f) == 8 { + mcTap8AVX2(&dst[0], dstStride, &src[0], srcStride, tapStride, w, h, &f[0]) + + return + } + + mcTap4AVX2(&dst[0], dstStride, &src[0], srcStride, tapStride, w, h, &f[0]) + } + + mcTapV16Asm = func(dst []int16, dstStride int, src []int16, srcStride, w, h, shift int, + f []int16, + ) { + if len(f) == 8 { + mcTapV16x8AVX2(&dst[0], dstStride, &src[0], srcStride, w, h, shift, &f[0]) + + return + } + + mcTapV16x4AVX2(&dst[0], dstStride, &src[0], srcStride, w, h, shift, &f[0]) + } + + dequant32Asm = func(coef []int32, m []uint8, ls, rnd int32, sh int, lo, hi int32) { + var mp *uint8 + if m != nil { + mp = &m[0] + } + + if hasAVX512 && len(coef) >= 64 { + dequant32AVX512(&coef[0], mp, len(coef), ls, rnd, int32(sh), lo, hi) + + return + } + + dequant32AVX2(&coef[0], mp, len(coef), ls, rnd, int32(sh), lo, hi) + } + + mcCopyAsm = func(dst []int16, dstStride int, src []uint8, srcStride, w, h, shift int) { + if hasAVX512 && w >= 32 { + mcCopy8AVX512(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + + return + } + + mcCopy8AVX2(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + } + + predBiAsm = func(dst []uint8, dstStride int, a, b []int16, srcStride, w, h, shift int) { + if hasAVX512 && w >= 32 { + predBi8AVX512(&dst[0], dstStride, &a[0], &b[0], srcStride, w, h, shift) + + return + } + + predBi8AVX2(&dst[0], dstStride, &a[0], &b[0], srcStride, w, h, shift) + } + + predUniAsm = func(dst []uint8, dstStride int, src []int16, srcStride, w, h, shift int) { + if hasAVX512 && w >= 32 { + predUni8AVX512(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + + return + } + + predUni8AVX2(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + } + + planarAsm = func(dst []uint8, stride int, r *refSamples, shift int) { + n := r.n + predPlanar8AVX2(&dst[0], stride, &r.s[2*n+1], &r.s[2*n-1], + int(r.top(n)), int(r.left(n)), n, shift) + } +} + +func predAngularRows(dst []uint8, stride int, ref []int32, angle, n int) bool { + if !hasAVX2 || n < 8 { + return false + } + + predAngular8AVX2(&dst[0], stride, &ref[0], angle, n) + + return true +} diff --git a/third_party/h265/hevc/dsp_arm64.go b/third_party/h265/hevc/dsp_arm64.go new file mode 100644 index 00000000..e45be935 --- /dev/null +++ b/third_party/h265/hevc/dsp_arm64.go @@ -0,0 +1,205 @@ +//go:build arm64 && !noasm + +package hevc + +//go:noescape +func addResidual8NEON(dst *uint8, stride int, coef *int32, n, shift int) + +//go:noescape +func addResidual16NEON(dst *uint16, stride int, coef *int32, n, shift int, maxV int32) + +//go:noescape +func odd16NEON(out *int32, in *int32, m *int8, stride int) + +//go:noescape +func predPlanar8NEON(dst *uint8, stride int, top *int32, left *int32, tr, bl, n, shift int) + +//go:noescape +func mcTap8NEON(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) + +//go:noescape +func mcTap4NEON(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) + +//go:noescape +func mcTapV16x8NEON(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) + +//go:noescape +func mcTapV16x4NEON(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) + +//go:noescape +func mcCopy8NEON(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) + +//go:noescape +func predUni8NEON(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) + +//go:noescape +func predBi8NEON(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) + +//go:noescape +func idctCols4NEON(dst, src, m *int32, n, mstride, shift int, rnd, lo, hi int32) + +//go:noescape +func predAngular8NEON(dst *uint8, stride int, ref *int32, angle, n int) + +//go:noescape +func sse8NEON(src *uint8, srcStride int, block *uint8, blockStride, n int) int64 + +//go:noescape +func quantize8NEON(dst, src *int32, count int, scale, offset int32, qbits int) + +//go:noescape +func satd16x8NEON(src *uint8, srcStride int, pred *uint8, predStride int) int64 + +//go:noescape +func transpose4NEON(dst, src *int32, n int) + +//go:noescape +func forwardTransform8NEON(dst, src, m *int32, n, shift1, shift2 int) + +//go:noescape +func dequant32NEON(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) + +var forwardTransformMatrixNEON = func() [4][32 * 32]int32 { + var m [4][32 * 32]int32 + + for p, n := range [4]int{4, 8, 16, 32} { + stride := 32 / n + + for x := range n { + for k := range n { + m[p][x*n+k] = int32(transMatrix[k*stride][x]) + } + } + } + + return m +}() + +//go:noescape +func deblockStrong8NEON(p *uint8, pitch int, tc0, tc1, flags int32) + +//go:noescape +func deblockNormal8NEON(p *uint8, pitch int, tc0, tc1, nd, flags int32) + +//go:noescape +func turnIn8NEON(dst *uint8, src *uint8, stride int) + +//go:noescape +func turnOut8NEON(dst *uint8, stride int, src *uint8) + +func dspInit(d *dspContext) { + d.addResidual8 = func(dst []uint8, stride int, coef []int32, n, shift int) { + addResidual8NEON(&dst[0], stride, &coef[0], n, shift) + } + + d.addResidual16 = func(dst []uint16, stride int, coef []int32, n, shift int, maxV int32) { + addResidual16NEON(&dst[0], stride, &coef[0], n, shift, maxV) + } + + idctColsAsm = func(dst, src []int32, n int, rnd int32, shift int, lo, hi int32) { + idctCols4NEON(&dst[0], &src[0], &transMatrix32[0][0], n, 32*(32/n), shift, + rnd, lo, hi) + } + + transposeAsm = func(dst, src []int32, n int) { + transpose4NEON(&dst[0], &src[0], n) + } + + deblockStrongAsm = func(p []uint8, pitch int, tc0, tc1, flags int32) { + deblockStrong8NEON(&p[0], pitch, tc0, tc1, flags) + } + + deblockNormalAsm = func(p []uint8, pitch int, tc0, tc1, nd, flags int32) { + deblockNormal8NEON(&p[0], pitch, tc0, tc1, nd, flags) + } + + deblockTurnIn = func(dst, src []uint8, stride int) { + turnIn8NEON(&dst[0], &src[0], stride) + } + + deblockTurnOut = func(dst []uint8, stride int, src []uint8) { + turnOut8NEON(&dst[0], stride, &src[0]) + } + + satd16x8Asm = func(src []uint8, srcStride int, pred []uint8, predStride int) int64 { + return satd16x8NEON(&src[0], srcStride, &pred[0], predStride) + } + + sse8Asm = func(src []uint8, srcStride int, block []uint8, blockStride, n int) int64 { + return sse8NEON(&src[0], srcStride, &block[0], blockStride, n) + } + + quantize8Asm = func(dst, src []int32, count int, scale, offset int32, qbits int) { + quantize8NEON(&dst[0], &src[0], count, scale, offset, qbits) + } + + forwardTransform8Asm = func(dst, src []int32, n int) { + forwardTransform8NEON(&dst[0], &src[0], &forwardTransformMatrixNEON[log2(n)-2][0], + n, log2(n)-1, log2(n)+6) + } + + oddAsm = func(out, in []int32, stride int) { + odd16NEON(&out[0], &in[0], &transMatrix[0][0], stride) + } + + mcTapAsm = func(dst []int16, dstStride int, src []uint8, srcStride, tapStride, w, h int, + f []int16, + ) { + if len(f) == 8 { + mcTap8NEON(&dst[0], dstStride, &src[0], srcStride, tapStride, w, h, &f[0]) + + return + } + + mcTap4NEON(&dst[0], dstStride, &src[0], srcStride, tapStride, w, h, &f[0]) + } + + mcTapV16Asm = func(dst []int16, dstStride int, src []int16, srcStride, w, h, shift int, + f []int16, + ) { + if len(f) == 8 { + mcTapV16x8NEON(&dst[0], dstStride, &src[0], srcStride, w, h, shift, &f[0]) + + return + } + + mcTapV16x4NEON(&dst[0], dstStride, &src[0], srcStride, w, h, shift, &f[0]) + } + + dequant32Asm = func(coef []int32, m []uint8, ls, rnd int32, sh int, lo, hi int32) { + var mp *uint8 + if m != nil { + mp = &m[0] + } + + dequant32NEON(&coef[0], mp, len(coef), ls, rnd, int32(sh), lo, hi) + } + + mcCopyAsm = func(dst []int16, dstStride int, src []uint8, srcStride, w, h, shift int) { + mcCopy8NEON(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + } + + predBiAsm = func(dst []uint8, dstStride int, a, b []int16, srcStride, w, h, shift int) { + predBi8NEON(&dst[0], dstStride, &a[0], &b[0], srcStride, w, h, shift) + } + + predUniAsm = func(dst []uint8, dstStride int, src []int16, srcStride, w, h, shift int) { + predUni8NEON(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + } + + planarAsm = func(dst []uint8, stride int, r *refSamples, shift int) { + n := r.n + predPlanar8NEON(&dst[0], stride, &r.s[2*n+1], &r.s[2*n-1], + int(r.top(n)), int(r.left(n)), n, shift) + } +} + +func predAngularRows(dst []uint8, stride int, ref []int32, angle, n int) bool { + if n < 8 { + return false + } + + predAngular8NEON(&dst[0], stride, &ref[0], angle, n) + + return true +} diff --git a/third_party/h265/hevc/dsp_noasm.go b/third_party/h265/hevc/dsp_noasm.go new file mode 100644 index 00000000..9bade68f --- /dev/null +++ b/third_party/h265/hevc/dsp_noasm.go @@ -0,0 +1,7 @@ +//go:build noasm || (!amd64 && !arm64 && !(riscv64 && riscv64.rva23u64)) + +package hevc + +func dspInit(*dspContext) {} + +func predAngularRows([]uint8, int, []int32, int, int) bool { return false } diff --git a/third_party/h265/hevc/dsp_riscv64.go b/third_party/h265/hevc/dsp_riscv64.go new file mode 100644 index 00000000..b867ce9e --- /dev/null +++ b/third_party/h265/hevc/dsp_riscv64.go @@ -0,0 +1,187 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +package hevc + +//go:noescape +func addResidual8RVV(dst *uint8, stride int, coef *int32, n, shift int) + +//go:noescape +func addResidual16RVV(dst *uint16, stride int, coef *int32, n, shift int, maxV int32) + +//go:noescape +func odd16RVV(out *int32, in *int32, m *int8, stride int) + +//go:noescape +func predPlanar8RVV(dst *uint8, stride int, top *int32, left *int32, tr, bl, n, shift int) + +//go:noescape +func mcTap8RVV(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h, taps int, f *int16) + +//go:noescape +func mcTapV16RVV(dst *int16, dstStride int, src *int16, srcStride, w, h, shift, taps int, f *int16) + +//go:noescape +func mcCopy8RVV(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) + +//go:noescape +func predUni8RVV(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) + +//go:noescape +func predBi8RVV(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) + +//go:noescape +func idctColsRVV(dst, src, m *int32, n, mstride, shift int, rnd, lo, hi int32) + +//go:noescape +func predAngular8RVV(dst *uint8, stride int, ref *int32, angle, n int) + +//go:noescape +func sse8RVV(src *uint8, srcStride int, block *uint8, blockStride, n int) int64 + +//go:noescape +func quantize8RVV(dst, src *int32, count int, scale, offset int32, qbits int) + +//go:noescape +func satd16x8RVV(src *uint8, srcStride int, pred *uint8, predStride int) int64 + +//go:noescape +func deblockStrong8RVV(p *uint8, pitch int, tc0, tc1, flags int32) + +//go:noescape +func deblockNormal8RVV(p *uint8, pitch int, tc0, tc1, nd, flags int32) + +//go:noescape +func turnIn8RVV(dst *uint8, src *uint8, stride int) + +//go:noescape +func turnOut8RVV(dst *uint8, stride int, src *uint8) + +//go:noescape +func transposeRVV(dst, src *int32, n int) + +//go:noescape +func forwardTransform8RVV(dst, src, m *int32, n, shift1, shift2 int) + +var forwardTransformMatrixRVV = func() [4][32 * 32]int32 { + var m [4][32 * 32]int32 + + for p, n := range [4]int{4, 8, 16, 32} { + stride := 32 / n + + for x := range n { + for k := range n { + m[p][x*n+k] = int32(transMatrix[k*stride][x]) + } + } + } + + return m +}() + +//go:noescape +func dequant32RVV(coef *int32, m *uint8, n int, ls, rnd, sh, lo, hi int32) + +func dspInit(d *dspContext) { + d.addResidual8 = func(dst []uint8, stride int, coef []int32, n, shift int) { + addResidual8RVV(&dst[0], stride, &coef[0], n, shift) + } + + d.addResidual16 = func(dst []uint16, stride int, coef []int32, n, shift int, maxV int32) { + addResidual16RVV(&dst[0], stride, &coef[0], n, shift, maxV) + } + + idctColsAsm = func(dst, src []int32, n int, rnd int32, shift int, lo, hi int32) { + idctColsRVV(&dst[0], &src[0], &transMatrix32[0][0], n, 32*(32/n), shift, + rnd, lo, hi) + } + + transposeAsm = func(dst, src []int32, n int) { + transposeRVV(&dst[0], &src[0], n) + } + + deblockStrongAsm = func(p []uint8, pitch int, tc0, tc1, flags int32) { + deblockStrong8RVV(&p[0], pitch, tc0, tc1, flags) + } + + deblockNormalAsm = func(p []uint8, pitch int, tc0, tc1, nd, flags int32) { + deblockNormal8RVV(&p[0], pitch, tc0, tc1, nd, flags) + } + + deblockTurnIn = func(dst, src []uint8, stride int) { + turnIn8RVV(&dst[0], &src[0], stride) + } + + deblockTurnOut = func(dst []uint8, stride int, src []uint8) { + turnOut8RVV(&dst[0], stride, &src[0]) + } + + satd16x8Asm = func(src []uint8, srcStride int, pred []uint8, predStride int) int64 { + return satd16x8RVV(&src[0], srcStride, &pred[0], predStride) + } + + sse8Asm = func(src []uint8, srcStride int, block []uint8, blockStride, n int) int64 { + return sse8RVV(&src[0], srcStride, &block[0], blockStride, n) + } + + quantize8Asm = func(dst, src []int32, count int, scale, offset int32, qbits int) { + quantize8RVV(&dst[0], &src[0], count, scale, offset, qbits) + } + + forwardTransform8Asm = func(dst, src []int32, n int) { + forwardTransform8RVV(&dst[0], &src[0], &forwardTransformMatrixRVV[log2(n)-2][0], + n, log2(n)-1, log2(n)+6) + } + + oddAsm = func(out, in []int32, stride int) { + odd16RVV(&out[0], &in[0], &transMatrix[0][0], stride) + } + + mcTapAsm = func(dst []int16, dstStride int, src []uint8, srcStride, tapStride, w, h int, + f []int16, + ) { + mcTap8RVV(&dst[0], dstStride, &src[0], srcStride, tapStride, w, h, len(f), &f[0]) + } + + mcTapV16Asm = func(dst []int16, dstStride int, src []int16, srcStride, w, h, shift int, + f []int16, + ) { + mcTapV16RVV(&dst[0], dstStride, &src[0], srcStride, w, h, shift, len(f), &f[0]) + } + + dequant32Asm = func(coef []int32, m []uint8, ls, rnd int32, sh int, lo, hi int32) { + var mp *uint8 + if m != nil { + mp = &m[0] + } + + dequant32RVV(&coef[0], mp, len(coef), ls, rnd, int32(sh), lo, hi) + } + + mcCopyAsm = func(dst []int16, dstStride int, src []uint8, srcStride, w, h, shift int) { + mcCopy8RVV(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + } + + predBiAsm = func(dst []uint8, dstStride int, a, b []int16, srcStride, w, h, shift int) { + predBi8RVV(&dst[0], dstStride, &a[0], &b[0], srcStride, w, h, shift) + } + + predUniAsm = func(dst []uint8, dstStride int, src []int16, srcStride, w, h, shift int) { + predUni8RVV(&dst[0], dstStride, &src[0], srcStride, w, h, shift) + } + + planarAsm = func(dst []uint8, stride int, r *refSamples, shift int) { + n := r.n + predPlanar8RVV(&dst[0], stride, &r.s[2*n+1], &r.s[2*n-1], + int(r.top(n)), int(r.left(n)), n, shift) + } +} + +func predAngularRows(dst []uint8, stride int, ref []int32, angle, n int) bool { + if n < 8 { + return false + } + + predAngular8RVV(&dst[0], stride, &ref[0], angle, n) + + return true +} diff --git a/third_party/h265/hevc/encoder.go b/third_party/h265/hevc/encoder.go new file mode 100644 index 00000000..d92d3c03 --- /dev/null +++ b/third_party/h265/hevc/encoder.go @@ -0,0 +1,275 @@ +package hevc + +import ( + "errors" + "runtime" +) + +// ErrInvalidEncodeInput means the frame or the options do not describe +// something this encoder can code. +var ErrInvalidEncodeInput = errors.New("hevc: invalid encode input") + +// MaxLumaSamples is MaxLumaPs of Table A.8, which every level from 6.0 up +// shares. A picture larger than this has no level to be coded at, so a caller +// with one splits it over a grid of items instead. +const MaxLumaSamples = 35651584 + +// Frame is one picture in the [EncoderOptions.Chroma] sampling. StrideY and +// StrideC are in samples and may exceed the width, so a frame can be a window +// on a larger buffer. A monochrome frame leaves the chroma planes nil. Above +// eight bits the samples come in Y16, Cb16 and Cr16 instead. +type Frame struct { + Y, Cb, Cr []uint8 + Y16, Cb16, Cr16 []uint16 + StrideY, StrideC int +} + +// ChromaFormat is the chroma sampling a picture is coded in, chroma_format_idc +// of 7.4.3.2 by another name. The zero value is 4:2:0. +type ChromaFormat int + +const ( + Chroma420 ChromaFormat = iota + Chroma422 + Chroma444 + ChromaMono +) + +// idc is chroma_format_idc, and sub the SubWidthC and SubHeightC of Table 6-1. +func (c ChromaFormat) idc() uint32 { + switch c { + case Chroma422: + return 2 + case Chroma444: + return 3 + case ChromaMono: + return 0 + default: + return 1 + } +} + +func (c ChromaFormat) sub() (int, int) { + switch c { + case Chroma422: + return 2, 1 + case Chroma444, ChromaMono: + return 1, 1 + default: + return 2, 2 + } +} + +// EncoderOptions configures an [Encoder]. Width and Height must be non-zero, a +// multiple of what Chroma resolves, and no more than [MaxLumaSamples] between +// them; anything the coding tree cannot fill is padded away behind a +// conformance window. QP runs from 1 through 51 and selects 26 when left at +// zero; Lossless codes the samples as PCM instead and ignores QP. +type EncoderOptions struct { + Width, Height int + QP int + Lossless bool + // Chroma is the sampling to code in. The zero value is 4:2:0. + Chroma ChromaFormat + // BitDepth is the sample size, 8 through 12. The zero value is 8. Above + // eight the samples come in the sixteen bit planes of [Frame]. + BitDepth int + // SAO fits the offsets of 8.7.3 to the error left in each coding tree + // block. It codes the picture twice, for about 2.2x the time, 3.5% of luma + // bitrate and half a decibel of chroma. + SAO bool +} + +// Encoder writes self-contained intra IDR access units. It holds the working +// memory one picture needs and reuses it for the next, so it is not safe for +// concurrent use. +type Encoder struct { + width, height int + qp int + lossless bool + threads int + chroma ChromaFormat + subW, subH int + bitDepth int + sao bool + + intra intraEncoder[uint8] + deep *intraEncoder[uint16] + planes [3][]uint8 + planes16 [3][]uint16 +} + +// Threads bounds the goroutines coding one picture's rows. More than one turns +// on the synchronisation of 9.3.1, which costs about 2% of bitrate; zero and +// one code serially and leave it out of the stream. +func (e *Encoder) Threads(n int) { + if e != nil { + e.threads = n + } +} + +func NewEncoder(opts EncoderOptions) (*Encoder, error) { + if opts.Chroma < Chroma420 || opts.Chroma > ChromaMono { + return nil, ErrInvalidEncodeInput + } + + sw, sh := opts.Chroma.sub() + + if opts.Width <= 0 || opts.Height <= 0 || opts.Width%sw != 0 || opts.Height%sh != 0 || + opts.QP < 0 || opts.QP > 51 { + return nil, ErrInvalidEncodeInput + } + + if codedSize(opts.Width)*codedSize(opts.Height) > MaxLumaSamples { + return nil, ErrInvalidEncodeInput + } + + if opts.QP == 0 { + opts.QP = 26 + } + + if opts.BitDepth == 0 { + opts.BitDepth = 8 + } + + if opts.BitDepth < 8 || opts.BitDepth > 12 { + return nil, ErrInvalidEncodeInput + } + + return &Encoder{width: opts.Width, height: opts.Height, qp: opts.QP, + lossless: opts.Lossless, chroma: opts.Chroma, subW: sw, subH: sh, + bitDepth: opts.BitDepth, sao: opts.SAO}, nil +} + +// Encode codes one frame as a complete access unit: a video, a sequence and a +// picture parameter set followed by the slice. The NAL units it returns own +// their bitstream and outlive the next call. +func (e *Encoder) Encode(frame Frame) ([]NALUnit, error) { + if e == nil { + return nil, ErrInvalidEncodeInput + } + + if e.bitDepth <= 8 { + return encodePicture(e, &e.intra, [3][]uint8{frame.Y, frame.Cb, frame.Cr}, + &e.planes, frame.StrideY, frame.StrideC) + } + + if e.deep == nil { + e.deep = new(intraEncoder[uint16]) + } + + return encodePicture(e, e.deep, [3][]uint16{frame.Y16, frame.Cb16, frame.Cr16}, + &e.planes16, frame.StrideY, frame.StrideC) +} + +// encodePicture gathers the frame into the coding grid and codes it, either as +// a slice of its own or, without loss, as pulse code modulated blocks. +func encodePicture[P pixel](e *Encoder, enc *intraEncoder[P], src [3][]P, + planes *[3][]P, strideY, strideC int, +) ([]NALUnit, error) { + mono := e.chroma == ChromaMono + + if strideY < e.width || (!mono && strideC < e.width/e.subW) { + return nil, ErrInvalidEncodeInput + } + + cw, ch := codedSize(e.width), codedSize(e.height) + sw, sh := e.subW, e.subH + stride := [3]int{strideY, strideC, strideC} + width := [3]int{e.width, e.width / sw, e.width / sw} + height := [3]int{e.height, e.height / sh, e.height / sh} + padded := [3][2]int{{cw, ch}, {cw / sw, ch / sh}, {cw / sw, ch / sh}} + + n := 3 + if mono { + n = 1 + planes[1], planes[2] = nil, nil + } + + for i := range n { + plane, ok := padPlane(planes[i], src[i], stride[i], width[i], height[i], + padded[i][0], padded[i][1]) + if !ok { + return nil, ErrInvalidEncodeInput + } + + planes[i] = plane + } + + if e.lossless { + h := encoderHeaders{ + width: cw, height: ch, cropRight: cw - e.width, cropBottom: ch - e.height, + chromaFormat: e.chroma.idc(), subWidthC: sw, subHeightC: sh, + bitDepth: e.bitDepth, + levelIDC: pcmLevelIDC(cw * ch), pcm: true, + } + + return append(h.parameterSets(), NALUnit{Type: NALIdrNLP, + RBSP: pcmSlice(planes[0], planes[1], planes[2], cw, ch, sw, sh, e.bitDepth)}), nil + } + + enc.bitDepth = e.bitDepth + enc.wantSAO = e.sao + enc.threads = e.waveThreads() + + rbsp, err := enc.slice(planes[0], planes[1], planes[2], cw, ch, e.qp) + if err != nil { + return nil, err + } + + return enc.nals(e.width, e.height, rbsp), nil +} + +// Flush ends the sequence. Every frame is coded on its own, so there is never +// anything held back. +func (e *Encoder) Flush() ([]NALUnit, error) { + if e == nil { + return nil, ErrInvalidEncodeInput + } + + return nil, nil +} + +// padPlane gathers a strided plane into dst at paddedW by paddedH, repeating the +// last column and row to fill what the picture does not reach. dst grows only +// when what it already holds is too small. +func padPlane[P pixel](dst, src []P, stride, width, height, paddedW, paddedH int) ([]P, bool) { + if stride <= 0 || width <= 0 || height <= 0 || stride < width || + paddedW < width || paddedH < height || len(src)/stride < height { + return nil, false + } + + if cap(dst) < paddedW*paddedH { + dst = make([]P, 0, paddedW*paddedH) + } + + out := dst[:0] + + for y := range height { + row := src[y*stride : y*stride+width] + out = append(out, row...) + + for range paddedW - width { + out = append(out, row[width-1]) + } + } + + last := out[(height-1)*paddedW : height*paddedW] + for y := height; y < paddedH; y++ { + out = append(out, last...) + } + + return out, true +} + +func (e *Encoder) waveThreads() int { + if e.threads == 0 { + return 1 + } + + if e.threads < 0 { + return runtime.GOMAXPROCS(0) + } + + return e.threads +} diff --git a/third_party/h265/hevc/getbits.go b/third_party/h265/hevc/getbits.go new file mode 100644 index 00000000..b1c88d8f --- /dev/null +++ b/third_party/h265/hevc/getbits.go @@ -0,0 +1,142 @@ +package hevc + +import "math/bits" + +type getBits struct { + state uint64 + bitsLeft int + err bool + index int + data []byte +} + +func (c *getBits) init(data []byte) { + *c = getBits{data: data} +} + +func (c *getBits) refill(n int) { + var state uint32 + + for { + if c.index >= len(c.data) { + c.err = true + if state != 0 { + break + } + + return + } + + state = state<<8 | uint32(c.data[c.index]) + c.index++ + c.bitsLeft += 8 + + if n <= c.bitsLeft { + break + } + } + + c.state |= uint64(state) << (64 - c.bitsLeft) +} + +func (c *getBits) bit() uint32 { + if c.bitsLeft == 0 { + c.refill(1) + } + + state := c.state + c.bitsLeft-- + c.state = state << 1 + + return uint32(state >> 63) +} + +func (c *getBits) bits(n int) uint32 { + if n == 0 { + return 0 + } + + if uint32(n) > uint32(c.bitsLeft) { + c.refill(n) + } + + state := c.state + c.bitsLeft -= n + c.state = state << n + + return uint32(state >> (64 - n)) +} + +func (c *getBits) skip(n int) { + for n > 32 { + c.bits(32) + n -= 32 + } + + c.bits(n) +} + +func (c *getBits) ue() uint32 { + n := 0 + + for c.bit() == 0 { + n++ + + if n > 31 { + c.err = true + + return 0 + } + } + + if n == 0 { + return 0 + } + + return 1<>3, p&7 + + if byteOff >= len(c.data) { + return false + } + + last := len(c.data) + for last > byteOff && c.data[last-1] == 0 { + last-- + } + + if last <= byteOff { + return false + } + + if byteOff < last-1 { + return true + } + + return bitOff < 7-bits.TrailingZeros8(c.data[byteOff]) +} diff --git a/third_party/h265/hevc/headers.go b/third_party/h265/hevc/headers.go new file mode 100644 index 00000000..6d9083dc --- /dev/null +++ b/third_party/h265/hevc/headers.go @@ -0,0 +1,1095 @@ +package hevc + +import "errors" + +// ErrInvalid is returned for a bitstream that cannot be decoded, and +// ErrUnsupported for one using a feature this decoder does not implement. +var ( + ErrInvalid = errors.New("hevc: invalid bitstream") + ErrUnsupported = errors.New("hevc: unsupported feature") +) + +const ( + maxSubLayers = 7 + maxShortTermRPS = 64 + maxLongTermRefPics = 32 + maxRefPicsPerRPS = 16 + maxTileColumns = 22 + maxTileRows = 20 + maxPicSize = 16384 + maxChromaQPOffsets = 6 + minCtbLog2SizeY = 4 + maxCtbLog2SizeY = 6 + maxScalingListSizes = 4 + maxScalingListMats = 6 +) + +type profileTierLevel struct { + profileSpace uint8 + tierFlag bool + profileIDC uint8 + levelIDC uint8 + compatFlags uint32 +} + +type shortTermRPS struct { + deltaPocS0 []int32 + deltaPocS1 []int32 + usedS0 []bool + usedS1 []bool +} + +func (r *shortTermRPS) numDeltaPocs() int { + return len(r.deltaPocS0) + len(r.deltaPocS1) +} + +type scalingList struct { + sl [maxScalingListSizes][maxScalingListMats][64]uint8 + dc [2][maxScalingListMats]uint8 +} + +type vps struct { + id uint8 + maxLayersMinus1 uint8 + maxSubLayersMinus1 uint8 + temporalIDNesting bool + ptl profileTierLevel + maxDecPicBuffering [maxSubLayers]uint32 + maxNumReorderPics [maxSubLayers]uint32 + maxLatencyIncrease [maxSubLayers]uint32 +} + +type sps struct { + vpsID uint8 + maxSubLayersMinus1 uint8 + temporalIDNesting bool + ptl profileTierLevel + id uint32 + + chromaFormatIDC uint32 + separateColourPlane bool + subWidthC, subHeightC int + picWidthInLumaSamples uint32 + picHeightInLumaSamples uint32 + + confWinLeft, confWinRight uint32 + confWinTop, confWinBottom uint32 + + bitDepthLuma, bitDepthChroma uint8 + + // E.3.1: the color description of the sequence, unspecified unless the + // video usability information says otherwise. + colourPrimaries uint16 + transferChar uint16 + matrixCoeffs uint16 + fullRange bool + log2MaxPocLsb uint8 + + maxDecPicBuffering uint32 + maxNumReorderPics uint32 + maxLatencyIncrease uint32 + + minCbLog2SizeY uint8 + ctbLog2SizeY uint8 + ctbSizeY uint32 + minTbLog2SizeY uint8 + maxTbLog2SizeY uint8 + maxTrHierInter uint32 + maxTrHierIntra uint32 + picWidthInCtbs uint32 + picHeightInCtbs uint32 + + scalingListEnabled bool + scalingList scalingList + + ampEnabled bool + saoEnabled bool + + pcmEnabled bool + pcmBitDepthLuma uint8 + pcmBitDepthChroma uint8 + log2MinPcmCbSize uint8 + log2MaxPcmCbSize uint8 + pcmLoopFilterDisabled bool + + stRPS []shortTermRPS + longTermRefPicsPresent bool + ltRefPicPocLsb []uint32 + usedByCurrPicLt []bool + + temporalMvpEnabled bool + strongIntraSmoothing bool + transformSkipRotation bool + transformSkipContext bool + implicitRdpcm bool + explicitRdpcm bool + extendedPrecision bool + intraSmoothingDisabled bool + highPrecisionOffsets bool + persistentRiceAdaptation bool + cabacBypassAlignment bool +} + +type pps struct { + id uint32 + spsID uint32 + + dependentSliceSegmentsEnabled bool + outputFlagPresent bool + numExtraSliceHeaderBits uint8 + signDataHidingEnabled bool + cabacInitPresent bool + + numRefIdxL0DefaultActive uint32 + numRefIdxL1DefaultActive uint32 + + initQP int32 + constrainedIntraPred bool + transformSkipEnabled bool + cuQPDeltaEnabled bool + diffCuQPDeltaDepth uint32 + cbQPOffset int32 + crQPOffset int32 + sliceChromaQPOffsets bool + weightedPred bool + weightedBipred bool + transquantBypass bool + tilesEnabled bool + entropyCodingSync bool + numTileColumns int + numTileRows int + uniformSpacing bool + columnWidthMinus1 []uint32 + rowHeightMinus1 []uint32 + loopFilterAcrossTiles bool + colWidthsInCtbs []uint32 + rowHeightsInCtbs []uint32 + + loopFilterAcrossSlices bool + deblockingControlPresen bool + deblockingOverride bool + deblockingDisabled bool + betaOffsetDiv2 int32 + tcOffsetDiv2 int32 + + scalingListPresent bool + scalingList scalingList + + listsModificationPresent bool + log2ParallelMergeLevel uint32 + sliceHeaderExtensionPresen bool + + log2MaxTransformSkipSize uint32 + crossComponentPrediction bool + chromaQPOffsetList bool + diffCuChromaQPOffsetDep uint32 + chromaQPOffsetListLen uint32 + cbQPOffsetList [maxChromaQPOffsets]int32 + crQPOffsetList [maxChromaQPOffsets]int32 + log2SaoOffsetScaleLuma uint32 + log2SaoOffsetScaleChroma uint32 +} + +func parseProfileTierLevel(c *getBits, profilePresent bool, maxSubLayersMinus1 uint8) profileTierLevel { + var p profileTierLevel + + if profilePresent { + p.profileSpace = uint8(c.bits(2)) + p.tierFlag = c.bit() != 0 + p.profileIDC = uint8(c.bits(5)) + p.compatFlags = c.bits(32) + c.skip(48) + } + + p.levelIDC = uint8(c.bits(8)) + + if maxSubLayersMinus1 == 0 { + return p + } + + var profilePresentSub, levelPresentSub [maxSubLayers]bool + + for i := range int(maxSubLayersMinus1) { + profilePresentSub[i] = c.bit() != 0 + levelPresentSub[i] = c.bit() != 0 + } + + for range 8 - int(maxSubLayersMinus1) { + c.bits(2) + } + + for i := range int(maxSubLayersMinus1) { + if profilePresentSub[i] { + c.skip(88) + } + + if levelPresentSub[i] { + c.bits(8) + } + } + + return p +} + +func parseSubLayerHRD(c *getBits, cpbCnt int, subPicPresent bool) { + for range cpbCnt { + c.ue() + c.ue() + + if subPicPresent { + c.ue() + c.ue() + } + + c.bit() + } +} + +func parseHRD(c *getBits, commonInfPresent bool, maxSubLayersMinus1 uint8) error { + var nalHRD, vclHRD, subPicPresent bool + + if commonInfPresent { + nalHRD = c.bit() != 0 + vclHRD = c.bit() != 0 + + if nalHRD || vclHRD { + subPicPresent = c.bit() != 0 + if subPicPresent { + c.bits(8) + c.bits(5) + c.bit() + c.bits(5) + } + + c.bits(4) + c.bits(4) + + if subPicPresent { + c.bits(4) + } + + c.bits(5) + c.bits(5) + c.bits(5) + } + } + + for range int(maxSubLayersMinus1) + 1 { + fixedRate := c.bit() != 0 + if !fixedRate { + fixedRate = c.bit() != 0 + } + + lowDelay := false + + if fixedRate { + c.ue() + } else { + lowDelay = c.bit() != 0 + } + + cpbCnt := 1 + if !lowDelay { + n := c.ue() + if n > 31 { + return ErrInvalid + } + + cpbCnt = int(n) + 1 + } + + if nalHRD { + parseSubLayerHRD(c, cpbCnt, subPicPresent) + } + + if vclHRD { + parseSubLayerHRD(c, cpbCnt, subPicPresent) + } + } + + return nil +} + +func parseVUI(c *getBits, s *sps, maxSubLayersMinus1 uint8) error { + if c.bit() != 0 { + if c.bits(8) == 255 { + c.bits(16) + c.bits(16) + } + } + + if c.bit() != 0 { + c.bit() + } + + // E.2.1 video_signal_type. The color description defaults to unspecified, + // which newPicture carries so a container with no description of its own + // can fall back to what the sequence declares. + if c.bit() != 0 { + c.bits(3) + + s.fullRange = c.bit() != 0 + + if c.bit() != 0 { + s.colourPrimaries = uint16(c.bits(8)) + s.transferChar = uint16(c.bits(8)) + s.matrixCoeffs = uint16(c.bits(8)) + } + } + + if c.bit() != 0 { + c.ue() + c.ue() + } + + c.bit() + c.bit() + c.bit() + + if c.bit() != 0 { + c.ue() + c.ue() + c.ue() + c.ue() + } + + if c.bit() != 0 { + c.bits(32) + c.bits(32) + + if c.bit() != 0 { + c.ue() + } + + if c.bit() != 0 { + if err := parseHRD(c, true, maxSubLayersMinus1); err != nil { + return err + } + } + } + + if c.bit() != 0 { + c.bit() + c.bit() + c.bit() + c.ue() + c.ue() + c.ue() + c.ue() + c.ue() + } + + return nil +} + +func parseVPS(rbsp []byte) (*vps, error) { + var c getBits + c.init(rbsp) + + v := &vps{} + v.id = uint8(c.bits(4)) + c.bits(2) + v.maxLayersMinus1 = uint8(c.bits(6)) + v.maxSubLayersMinus1 = uint8(c.bits(3)) + + if v.maxSubLayersMinus1 > maxSubLayers-1 { + return nil, ErrInvalid + } + + v.temporalIDNesting = c.bit() != 0 + + if c.bits(16) != 0xffff { + return nil, ErrInvalid + } + + v.ptl = parseProfileTierLevel(&c, true, v.maxSubLayersMinus1) + + start := int(v.maxSubLayersMinus1) + if c.bit() != 0 { + start = 0 + } + + for i := start; i <= int(v.maxSubLayersMinus1); i++ { + v.maxDecPicBuffering[i] = c.ue() + v.maxNumReorderPics[i] = c.ue() + v.maxLatencyIncrease[i] = c.ue() + if v.maxDecPicBuffering[i] > 15 || v.maxNumReorderPics[i] > v.maxDecPicBuffering[i] { + return nil, ErrInvalid + } + } + + maxLayerID := int(c.bits(6)) + + numLayerSetsMinus1 := c.ue() + if numLayerSetsMinus1 > 1023 { + return nil, ErrInvalid + } + + for range int(numLayerSetsMinus1) { + c.skip(maxLayerID + 1) + } + + if c.bit() != 0 { + c.bits(32) + c.bits(32) + + if c.bit() != 0 { + c.ue() + } + + numHRD := c.ue() + if numHRD > 1024 { + return nil, ErrInvalid + } + + for i := range int(numHRD) { + c.ue() + + commonInfPresent := true + if i > 0 { + commonInfPresent = c.bit() != 0 + } + + if err := parseHRD(&c, commonInfPresent, v.maxSubLayersMinus1); err != nil { + return nil, err + } + } + } + + extension := c.bit() != 0 + + if err := checkTrailing(&c, extension); err != nil { + return nil, err + } + + return v, nil +} + +func checkTrailing(c *getBits, extension bool) error { + if c.err { + return ErrInvalid + } + + if !extension && c.moreRBSPData() { + return ErrInvalid + } + + return nil +} + +func parseSPS(rbsp []byte) (*sps, error) { + var c getBits + c.init(rbsp) + + // E.3.1 infers all three as unspecified when the sequence does not say. + s := &sps{colourPrimaries: 2, transferChar: 2, matrixCoeffs: 2} + s.vpsID = uint8(c.bits(4)) + s.maxSubLayersMinus1 = uint8(c.bits(3)) + + if s.maxSubLayersMinus1 > maxSubLayers-1 { + return nil, ErrInvalid + } + + s.temporalIDNesting = c.bit() != 0 + s.ptl = parseProfileTierLevel(&c, true, s.maxSubLayersMinus1) + + s.id = c.ue() + if s.id > 15 { + return nil, ErrInvalid + } + + s.chromaFormatIDC = c.ue() + if s.chromaFormatIDC > 3 { + return nil, ErrInvalid + } + + if s.chromaFormatIDC == 3 { + s.separateColourPlane = c.bit() != 0 + } + + s.subWidthC, s.subHeightC = 1, 1 + + switch s.chromaFormatIDC { + case 1: + s.subWidthC, s.subHeightC = 2, 2 + case 2: + s.subWidthC = 2 + } + + s.picWidthInLumaSamples = c.ue() + s.picHeightInLumaSamples = c.ue() + + if s.picWidthInLumaSamples == 0 || s.picHeightInLumaSamples == 0 || + s.picWidthInLumaSamples > maxPicSize || s.picHeightInLumaSamples > maxPicSize { + return nil, ErrInvalid + } + + if c.bit() != 0 { + s.confWinLeft = c.ue() + s.confWinRight = c.ue() + s.confWinTop = c.ue() + s.confWinBottom = c.ue() + } + + bitDepthLumaMinus8 := c.ue() + bitDepthChromaMinus8 := c.ue() + + if bitDepthLumaMinus8 > 8 || bitDepthChromaMinus8 > 8 { + return nil, ErrUnsupported + } + + s.bitDepthLuma = 8 + uint8(bitDepthLumaMinus8) + s.bitDepthChroma = 8 + uint8(bitDepthChromaMinus8) + + log2MaxPocLsbMinus4 := c.ue() + if log2MaxPocLsbMinus4 > 12 { + return nil, ErrInvalid + } + + s.log2MaxPocLsb = 4 + uint8(log2MaxPocLsbMinus4) + + start := int(s.maxSubLayersMinus1) + if c.bit() != 0 { + start = 0 + } + + for i := start; i <= int(s.maxSubLayersMinus1); i++ { + s.maxDecPicBuffering = c.ue() + s.maxNumReorderPics = c.ue() + s.maxLatencyIncrease = c.ue() + // HEVC's decoded-picture buffer holds at most 16 pictures; the + // syntax element stores that capacity minus one. + if s.maxDecPicBuffering > 15 || s.maxNumReorderPics > s.maxDecPicBuffering { + return nil, ErrInvalid + } + } + + log2MinCbSizeMinus3 := c.ue() + log2DiffMaxMinCbSize := c.ue() + + if log2MinCbSizeMinus3 > 3 || log2DiffMaxMinCbSize > 3 { + return nil, ErrInvalid + } + + s.minCbLog2SizeY = 3 + uint8(log2MinCbSizeMinus3) + s.ctbLog2SizeY = s.minCbLog2SizeY + uint8(log2DiffMaxMinCbSize) + + if s.ctbLog2SizeY < minCtbLog2SizeY || s.ctbLog2SizeY > maxCtbLog2SizeY { + return nil, ErrInvalid + } + + // 7.4.3.2: both dimensions are an integer multiple of MinCbSizeY. Without + // it a coding unit at the edge extends past the picture, and the block + // bookkeeping is sized for what the picture holds. + if mask := uint32(1)< 3 || log2DiffMaxMinTbSize > 3 { + return nil, ErrInvalid + } + + s.minTbLog2SizeY = 2 + uint8(log2MinTbSizeMinus2) + s.maxTbLog2SizeY = s.minTbLog2SizeY + uint8(log2DiffMaxMinTbSize) + + if s.minTbLog2SizeY >= s.minCbLog2SizeY || s.maxTbLog2SizeY > min(s.ctbLog2SizeY, 5) { + return nil, ErrInvalid + } + + s.maxTrHierInter = c.ue() + s.maxTrHierIntra = c.ue() + + s.scalingList = defaultScalingList() + + s.scalingListEnabled = c.bit() != 0 + if s.scalingListEnabled && c.bit() != 0 { + if err := parseScalingListData(&c, &s.scalingList); err != nil { + return nil, err + } + } + + s.ampEnabled = c.bit() != 0 + s.saoEnabled = c.bit() != 0 + + s.log2MinPcmCbSize, s.log2MaxPcmCbSize = 8, 0 + s.pcmBitDepthLuma, s.pcmBitDepthChroma = s.bitDepthLuma, s.bitDepthChroma + + s.pcmEnabled = c.bit() != 0 + if s.pcmEnabled { + s.pcmBitDepthLuma = 1 + uint8(c.bits(4)) + s.pcmBitDepthChroma = 1 + uint8(c.bits(4)) + + if s.pcmBitDepthLuma > s.bitDepthLuma || s.pcmBitDepthChroma > s.bitDepthChroma { + return nil, ErrInvalid + } + + log2MinPcmCbSizeMinus3 := c.ue() + log2DiffMaxMinPcmCbSize := c.ue() + + if log2MinPcmCbSizeMinus3 > 2 || log2DiffMaxMinPcmCbSize > 2 { + return nil, ErrInvalid + } + + s.log2MinPcmCbSize = 3 + uint8(log2MinPcmCbSizeMinus3) + s.log2MaxPcmCbSize = s.log2MinPcmCbSize + uint8(log2DiffMaxMinPcmCbSize) + s.pcmLoopFilterDisabled = c.bit() != 0 + } + + numStRPS := c.ue() + if numStRPS > maxShortTermRPS { + return nil, ErrInvalid + } + + s.stRPS = make([]shortTermRPS, 0, numStRPS) + + for i := range int(numStRPS) { + rps, err := parseShortTermRPS(&c, i, int(numStRPS), s.stRPS) + if err != nil { + return nil, err + } + + s.stRPS = append(s.stRPS, rps) + } + + s.longTermRefPicsPresent = c.bit() != 0 + if s.longTermRefPicsPresent { + n := c.ue() + if n > maxLongTermRefPics { + return nil, ErrInvalid + } + + s.ltRefPicPocLsb = make([]uint32, n) + s.usedByCurrPicLt = make([]bool, n) + + for i := range int(n) { + s.ltRefPicPocLsb[i] = c.bits(int(s.log2MaxPocLsb)) + s.usedByCurrPicLt[i] = c.bit() != 0 + } + } + + s.temporalMvpEnabled = c.bit() != 0 + s.strongIntraSmoothing = c.bit() != 0 + + if c.bit() != 0 { + if err := parseVUI(&c, s, s.maxSubLayersMinus1); err != nil { + return nil, err + } + } + + unparsed := false + + if c.bit() != 0 { + rangeExtension := c.bit() != 0 + multilayerExtension := c.bit() != 0 + extension3D := c.bit() != 0 + sccExtension := c.bit() != 0 + unparsed = c.bits(4) != 0 + + if rangeExtension { + s.transformSkipRotation = c.bit() != 0 + s.transformSkipContext = c.bit() != 0 + s.implicitRdpcm = c.bit() != 0 + s.explicitRdpcm = c.bit() != 0 + s.extendedPrecision = c.bit() != 0 + s.intraSmoothingDisabled = c.bit() != 0 + s.highPrecisionOffsets = c.bit() != 0 + s.persistentRiceAdaptation = c.bit() != 0 + s.cabacBypassAlignment = c.bit() != 0 + } + + // The tools below are parsed so the extension stays in step, but they + // are not applied. A stream that uses one is refused rather than + // decoded into something that merely looks plausible. + if s.implicitRdpcm || s.explicitRdpcm || s.cabacBypassAlignment { + return nil, ErrUnsupported + } + + if multilayerExtension || extension3D || sccExtension { + return nil, ErrUnsupported + } + } + + if err := checkTrailing(&c, unparsed); err != nil { + return nil, err + } + + return s, nil +} + +func parsePPS(rbsp []byte) (*pps, error) { + var c getBits + c.init(rbsp) + + p := &pps{} + p.id = c.ue() + p.spsID = c.ue() + + if p.id > 63 || p.spsID > 15 { + return nil, ErrInvalid + } + + p.dependentSliceSegmentsEnabled = c.bit() != 0 + p.outputFlagPresent = c.bit() != 0 + p.numExtraSliceHeaderBits = uint8(c.bits(3)) + p.signDataHidingEnabled = c.bit() != 0 + p.cabacInitPresent = c.bit() != 0 + p.numRefIdxL0DefaultActive = c.ue() + 1 + p.numRefIdxL1DefaultActive = c.ue() + 1 + + if p.numRefIdxL0DefaultActive > 16 || p.numRefIdxL1DefaultActive > 16 { + return nil, ErrInvalid + } + + p.initQP = c.se() + 26 + p.constrainedIntraPred = c.bit() != 0 + p.transformSkipEnabled = c.bit() != 0 + + p.cuQPDeltaEnabled = c.bit() != 0 + if p.cuQPDeltaEnabled { + p.diffCuQPDeltaDepth = c.ue() + } + + p.cbQPOffset = c.se() + p.crQPOffset = c.se() + + if p.cbQPOffset < -12 || p.cbQPOffset > 12 || p.crQPOffset < -12 || p.crQPOffset > 12 { + return nil, ErrInvalid + } + + p.sliceChromaQPOffsets = c.bit() != 0 + p.weightedPred = c.bit() != 0 + p.weightedBipred = c.bit() != 0 + p.transquantBypass = c.bit() != 0 + p.tilesEnabled = c.bit() != 0 + p.entropyCodingSync = c.bit() != 0 + + p.log2MaxTransformSkipSize = 2 + p.numTileColumns, p.numTileRows = 1, 1 + p.uniformSpacing = true + p.loopFilterAcrossTiles = true + + if p.tilesEnabled { + p.numTileColumns = int(c.ue()) + 1 + p.numTileRows = int(c.ue()) + 1 + + if p.numTileColumns > maxTileColumns || p.numTileRows > maxTileRows { + return nil, ErrInvalid + } + + p.uniformSpacing = c.bit() != 0 + if !p.uniformSpacing { + p.columnWidthMinus1 = make([]uint32, p.numTileColumns-1) + for i := range p.columnWidthMinus1 { + p.columnWidthMinus1[i] = c.ue() + } + + p.rowHeightMinus1 = make([]uint32, p.numTileRows-1) + for i := range p.rowHeightMinus1 { + p.rowHeightMinus1[i] = c.ue() + } + } + + p.loopFilterAcrossTiles = c.bit() != 0 + } + + p.loopFilterAcrossSlices = c.bit() != 0 + + p.deblockingControlPresen = c.bit() != 0 + if p.deblockingControlPresen { + p.deblockingOverride = c.bit() != 0 + p.deblockingDisabled = c.bit() != 0 + + if !p.deblockingDisabled { + p.betaOffsetDiv2 = c.se() + p.tcOffsetDiv2 = c.se() + + if p.betaOffsetDiv2 < -6 || p.betaOffsetDiv2 > 6 || + p.tcOffsetDiv2 < -6 || p.tcOffsetDiv2 > 6 { + return nil, ErrInvalid + } + } + } + + p.scalingList = defaultScalingList() + + p.scalingListPresent = c.bit() != 0 + if p.scalingListPresent { + if err := parseScalingListData(&c, &p.scalingList); err != nil { + return nil, err + } + } + + p.listsModificationPresent = c.bit() != 0 + p.log2ParallelMergeLevel = c.ue() + 2 + p.sliceHeaderExtensionPresen = c.bit() != 0 + + unparsed := false + + if c.bit() != 0 { + rangeExtension := c.bit() != 0 + multilayerExtension := c.bit() != 0 + extension3D := c.bit() != 0 + sccExtension := c.bit() != 0 + unparsed = c.bits(4) != 0 + + if rangeExtension { + if p.transformSkipEnabled { + p.log2MaxTransformSkipSize = c.ue() + 2 + } + + p.crossComponentPrediction = c.bit() != 0 + + p.chromaQPOffsetList = c.bit() != 0 + if p.chromaQPOffsetList { + p.diffCuChromaQPOffsetDep = c.ue() + p.chromaQPOffsetListLen = c.ue() + 1 + + if p.chromaQPOffsetListLen > maxChromaQPOffsets { + return nil, ErrInvalid + } + + for i := range int(p.chromaQPOffsetListLen) { + p.cbQPOffsetList[i] = c.se() + p.crQPOffsetList[i] = c.se() + } + } + + p.log2SaoOffsetScaleLuma = c.ue() + p.log2SaoOffsetScaleChroma = c.ue() + } + + // Parsed to keep the extension in step, but not applied. + if p.crossComponentPrediction { + return nil, ErrUnsupported + } + + if multilayerExtension || extension3D || sccExtension { + return nil, ErrUnsupported + } + } + + if err := checkTrailing(&c, unparsed); err != nil { + return nil, err + } + + return p, nil +} + +func (p *pps) resolveTileGeometry(s *sps) error { + w, h := int(s.picWidthInCtbs), int(s.picHeightInCtbs) + + if !p.tilesEnabled { + p.colWidthsInCtbs = []uint32{uint32(w)} + p.rowHeightsInCtbs = []uint32{uint32(h)} + + return nil + } + + if p.numTileColumns > w || p.numTileRows > h { + return ErrInvalid + } + + cols := make([]uint32, p.numTileColumns) + rows := make([]uint32, p.numTileRows) + + if p.uniformSpacing { + for i := range cols { + cols[i] = uint32((i+1)*w/p.numTileColumns - i*w/p.numTileColumns) + } + + for i := range rows { + rows[i] = uint32((i+1)*h/p.numTileRows - i*h/p.numTileRows) + } + } else { + var sum uint32 + + for i, v := range p.columnWidthMinus1 { + cols[i] = v + 1 + sum += cols[i] + } + + if sum >= uint32(w) { + return ErrInvalid + } + + cols[len(cols)-1] = uint32(w) - sum + + sum = 0 + + for i, v := range p.rowHeightMinus1 { + rows[i] = v + 1 + sum += rows[i] + } + + if sum >= uint32(h) { + return ErrInvalid + } + + rows[len(rows)-1] = uint32(h) - sum + } + + p.colWidthsInCtbs = cols + p.rowHeightsInCtbs = rows + + return nil +} + +func (s *sps) croppedWidth() uint32 { + crop := uint32(s.subWidthC) * (s.confWinLeft + s.confWinRight) + if crop >= s.picWidthInLumaSamples { + return 0 + } + + return s.picWidthInLumaSamples - crop +} + +func (s *sps) croppedHeight() uint32 { + crop := uint32(s.subHeightC) * (s.confWinTop + s.confWinBottom) + if crop >= s.picHeightInLumaSamples { + return 0 + } + + return s.picHeightInLumaSamples - crop +} + +func parseShortTermRPS(c *getBits, idx, numStRPS int, prev []shortTermRPS) (shortTermRPS, error) { + var rps shortTermRPS + + interPred := false + if idx != 0 { + interPred = c.bit() != 0 + } + + if interPred { + deltaIdx := 1 + if idx == numStRPS { + deltaIdx = int(c.ue()) + 1 + } + + if deltaIdx > idx { + return rps, ErrInvalid + } + + ref := &prev[idx-deltaIdx] + + sign := c.bit() != 0 + + absDeltaRpsMinus1 := c.ue() + if absDeltaRpsMinus1 >= 32768 { + return rps, ErrInvalid + } + + deltaRps := int32(absDeltaRpsMinus1) + 1 + if sign { + deltaRps = -deltaRps + } + + n := ref.numDeltaPocs() + used := make([]bool, n+1) + useDelta := make([]bool, n+1) + + for j := range n + 1 { + used[j] = c.bit() != 0 + + useDelta[j] = true + if !used[j] { + useDelta[j] = c.bit() != 0 + } + } + + numNeg, numPos := len(ref.deltaPocS0), len(ref.deltaPocS1) + + for j := numPos - 1; j >= 0; j-- { + if d := ref.deltaPocS1[j] + deltaRps; d < 0 && useDelta[numNeg+j] { + rps.deltaPocS0 = append(rps.deltaPocS0, d) + rps.usedS0 = append(rps.usedS0, used[numNeg+j]) + } + } + + if deltaRps < 0 && useDelta[n] { + rps.deltaPocS0 = append(rps.deltaPocS0, deltaRps) + rps.usedS0 = append(rps.usedS0, used[n]) + } + + for j := range numNeg { + if d := ref.deltaPocS0[j] + deltaRps; d < 0 && useDelta[j] { + rps.deltaPocS0 = append(rps.deltaPocS0, d) + rps.usedS0 = append(rps.usedS0, used[j]) + } + } + + for j := numNeg - 1; j >= 0; j-- { + if d := ref.deltaPocS0[j] + deltaRps; d > 0 && useDelta[j] { + rps.deltaPocS1 = append(rps.deltaPocS1, d) + rps.usedS1 = append(rps.usedS1, used[j]) + } + } + + if deltaRps > 0 && useDelta[n] { + rps.deltaPocS1 = append(rps.deltaPocS1, deltaRps) + rps.usedS1 = append(rps.usedS1, used[n]) + } + + for j := range numPos { + if d := ref.deltaPocS1[j] + deltaRps; d > 0 && useDelta[numNeg+j] { + rps.deltaPocS1 = append(rps.deltaPocS1, d) + rps.usedS1 = append(rps.usedS1, used[numNeg+j]) + } + } + + return rps, nil + } + + numNeg := c.ue() + numPos := c.ue() + + if numNeg > maxRefPicsPerRPS || numPos > maxRefPicsPerRPS { + return rps, ErrInvalid + } + + rps.deltaPocS0 = make([]int32, numNeg) + rps.usedS0 = make([]bool, numNeg) + + var poc int32 + + for i := range int(numNeg) { + d := c.ue() + if d >= 32768 { + return rps, ErrInvalid + } + + poc -= int32(d) + 1 + rps.deltaPocS0[i] = poc + rps.usedS0[i] = c.bit() != 0 + } + + rps.deltaPocS1 = make([]int32, numPos) + rps.usedS1 = make([]bool, numPos) + + poc = 0 + + for i := range int(numPos) { + d := c.ue() + if d >= 32768 { + return rps, ErrInvalid + } + + poc += int32(d) + 1 + rps.deltaPocS1[i] = poc + rps.usedS1[i] = c.bit() != 0 + } + + return rps, nil +} + +func ceilDiv(a, b uint32) uint32 { + return (a + b - 1) / b +} diff --git a/third_party/h265/hevc/headersenc.go b/third_party/h265/hevc/headersenc.go new file mode 100644 index 00000000..67441c93 --- /dev/null +++ b/third_party/h265/hevc/headersenc.go @@ -0,0 +1,215 @@ +package hevc + +type encoderHeaders struct { + // width and height are the coded picture, which 7.4.3.2 requires to be a + // multiple of the minimum coding block size. cropRight and cropBottom are + // the luma samples the conformance window hides beyond the real picture. + width, height int + cropRight, cropBottom int + // chromaFormat is chroma_format_idc, and subWidthC and subHeightC the + // units 7.4.3.2 counts the conformance window offsets in. + chromaFormat uint32 + subWidthC, subHeightC int + bitDepth int + levelIDC uint8 + pcm bool + deblockingDisabled bool + sao bool + signDataHidingEnabled bool + ctbLog2 uint8 + maxTrHierIntra uint32 + wavefront bool +} + +// parameterSets is the video, sequence and picture parameter sets a slice +// coded with these headers needs in front of it. +func (h encoderHeaders) parameterSets() []NALUnit { + return []NALUnit{ + {Type: NALVPS, RBSP: h.vps()}, + {Type: NALSPS, RBSP: h.sps()}, + {Type: NALPPS, RBSP: h.pps()}, + } +} + +// profileTier is 7.3.3: Main tier, progressive frames only. The High tier is +// not defined for the levels this encoder reaches. A.3.2 gives Main eight bit +// 4:2:0 alone and A.3.3 gives Main 10 ten bits of it; anything else is the +// range extension of A.3.5, which spells its limits out in constraint flags. +func (h encoderHeaders) profileTier(w *putBits) { + chroma, depth := h.chromaFormat, max(h.bitDepth, 8) + idc, compat := profileIDC(chroma, depth) + + w.bits(0, 2) + w.bit(0) + w.bits(uint64(idc), 5) + w.bits(uint64(compat), 32) + w.bit(1) + w.bit(0) + w.bit(1) + w.bit(1) + + if idc != 4 { + w.bits(0, 44) + w.bits(uint64(h.levelIDC), 8) + + return + } + + for _, set := range [9]bool{ + depth <= 12, depth <= 10, depth <= 8, + chroma <= 2, chroma <= 1, chroma == 0, + true, false, true, + } { + w.bit(boolToBit(set)) + } + + w.bits(0, 35) + w.bits(uint64(h.levelIDC), 8) +} + +// profileIDC is general_profile_idc and the compatibility flags that go with +// it, the flag for profile j sitting j bits down from the top. +func profileIDC(chromaFormat uint32, bitDepth int) (uint32, uint32) { + switch { + case chromaFormat != 1 || bitDepth > 10: + return 4, 1 << (31 - 4) + case bitDepth > 8: + return 2, 1 << (31 - 2) + default: + return 1, 1<<(31-1) | 1<<(31-2) + } +} + +func (h encoderHeaders) vps() []byte { + var w putBits + w.bits(0, 4) + w.bit(1) + w.bit(1) + w.bits(0, 6) + w.bits(0, 3) + w.bit(1) + w.bits(0xffff, 16) + h.profileTier(&w) + w.bit(1) + w.ue(1) + w.ue(0) + w.ue(0) + w.bits(0, 6) + w.ue(0) + w.bit(0) + w.bit(0) + w.rbspTrailingBits() + + return w.bytes() +} + +func (h encoderHeaders) sps() []byte { + var w putBits + w.bits(0, 4) + w.bits(0, 3) + w.bit(1) + h.profileTier(&w) + w.ue(0) + w.ue(h.chromaFormat) + if h.chromaFormat == 3 { + w.bit(0) + } + w.ue(uint32(h.width)) + w.ue(uint32(h.height)) + if h.cropRight|h.cropBottom != 0 { + w.bit(1) + w.ue(0) + w.ue(uint32(h.cropRight / max(h.subWidthC, 1))) + w.ue(0) + w.ue(uint32(h.cropBottom / max(h.subHeightC, 1))) + } else { + w.bit(0) + } + w.ue(uint32(max(h.bitDepth, 8) - 8)) + w.ue(uint32(max(h.bitDepth, 8) - 8)) + w.ue(4) + w.bit(1) + w.ue(1) + w.ue(0) + w.ue(0) + w.ue(1) + ctbLog2 := h.ctbLog2 + if ctbLog2 == 0 { + ctbLog2 = 4 + } + w.ue(uint32(ctbLog2 - 4)) + w.ue(0) + // 7.4.3.2 caps the transform at the coding tree block, and at 32. + w.ue(uint32(min(ctbLog2, 5) - 2)) + w.ue(0) + w.ue(h.maxTrHierIntra) + w.bit(0) + w.bit(0) + w.bit(boolToBit(h.sao)) + w.bit(boolToBit(h.pcm)) + if h.pcm { + w.bits(uint64(max(h.bitDepth, 8)-1), 4) + w.bits(uint64(max(h.bitDepth, 8)-1), 4) + w.ue(1) + w.ue(0) + w.bit(1) + } + w.ue(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.rbspTrailingBits() + + return w.bytes() +} + +func (h encoderHeaders) pps() []byte { + var w putBits + w.ue(0) + w.ue(0) + w.bit(0) + w.bit(0) + w.bits(0, 3) + w.bit(boolToBit(h.signDataHidingEnabled)) + w.bit(0) + w.ue(0) + w.ue(0) + w.se(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.se(0) + w.se(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.bit(0) + w.bit(boolToBit(h.wavefront)) + w.bit(1) + w.bit(1) + w.bit(0) + w.bit(boolToBit(h.deblockingDisabled)) + if !h.deblockingDisabled { + w.se(0) + w.se(0) + } + w.bit(0) + w.bit(0) + w.ue(0) + w.bit(0) + w.bit(0) + w.rbspTrailingBits() + + return w.bytes() +} + +func boolToBit(v bool) uint32 { + if v { + return 1 + } + + return 0 +} diff --git a/third_party/h265/hevc/idct_amd64.s b/third_party/h265/hevc/idct_amd64.s new file mode 100644 index 00000000..8bbb9c9b --- /dev/null +++ b/third_party/h265/hevc/idct_amd64.s @@ -0,0 +1,147 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func idctCols8AVX2(dst, src, m *int32, n, mstride, shift int, rnd, lo, hi int32) +// +// One pass of 8.6.4.2 over eight columns at a time. Outputs are produced four +// at a time so the even and odd accumulators for the tile stay in registers, +// and j is unrolled by two so the parity is static. +TEXT ·idctCols8AVX2(SB), NOSPLIT, $0-60 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ m+16(FP), R14 + MOVQ n+24(FP), R8 + MOVQ mstride+32(FP), R10 + MOVQ shift+40(FP), CX + + SHLQ $2, R10 + + MOVL rnd+48(FP), AX + MOVQ AX, X10 + VPBROADCASTD X10, Y10 + MOVL lo+52(FP), AX + MOVQ AX, X11 + VPBROADCASTD X11, Y11 + MOVL hi+56(FP), AX + MOVQ AX, X12 + VPBROADCASTD X12, Y12 + MOVQ CX, X13 + + MOVQ R8, R9 + SHRQ $1, R9 + + MOVQ R8, R15 + SHLQ $2, R15 + + XORQ BX, BX + +xloop: + XORQ R11, R11 + +iloop: + VPXOR Y0, Y0, Y0 + VPXOR Y1, Y1, Y1 + VPXOR Y2, Y2, Y2 + VPXOR Y3, Y3, Y3 + VPXOR Y4, Y4, Y4 + VPXOR Y5, Y5, Y5 + VPXOR Y6, Y6, Y6 + VPXOR Y7, Y7, Y7 + + LEAQ (SI)(BX*4), DX + LEAQ (R14)(R11*4), AX + + MOVQ R8, R12 + +jloop: + VMOVDQU (DX), Y8 + VPTEST Y8, Y8 + JZ skipeven + + VPBROADCASTD (AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y0, Y0 + VPBROADCASTD 4(AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y1, Y1 + VPBROADCASTD 8(AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y2, Y2 + VPBROADCASTD 12(AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y3, Y3 + +skipeven: + ADDQ R15, DX + ADDQ R10, AX + + VMOVDQU (DX), Y8 + VPTEST Y8, Y8 + JZ skipodd + + VPBROADCASTD (AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y4, Y4 + VPBROADCASTD 4(AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPBROADCASTD 8(AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y6, Y6 + VPBROADCASTD 12(AX), Y9 + VPMULLD Y8, Y9, Y9 + VPADDD Y9, Y7, Y7 + +skipodd: + ADDQ R15, DX + ADDQ R10, AX + + SUBQ $2, R12 + JNZ jloop + + // The low output rows run forward from i0, the high ones backward from + // n-1-i0, which is the M[j][n-1-i] symmetry. + MOVQ R11, AX + IMULQ R15, AX + LEAQ (DI)(AX*1), R13 + LEAQ (R13)(BX*4), R13 + + MOVQ R8, AX + DECQ AX + SUBQ R11, AX + IMULQ R15, AX + LEAQ (DI)(AX*1), R12 + LEAQ (R12)(BX*4), R12 + +#define EMIT(Ye, Yo) \ + VPADDD Yo, Ye, Y8 \ + VPSUBD Yo, Ye, Y9 \ + VPADDD Y10, Y8, Y8 \ + VPADDD Y10, Y9, Y9 \ + VPSRAD X13, Y8, Y8 \ + VPSRAD X13, Y9, Y9 \ + VPMAXSD Y11, Y8, Y8 \ + VPMINSD Y12, Y8, Y8 \ + VPMAXSD Y11, Y9, Y9 \ + VPMINSD Y12, Y9, Y9 \ + VMOVDQU Y8, (R13) \ + VMOVDQU Y9, (R12) \ + ADDQ R15, R13 \ + SUBQ R15, R12 + + EMIT(Y0, Y4) + EMIT(Y1, Y5) + EMIT(Y2, Y6) + EMIT(Y3, Y7) + + ADDQ $4, R11 + CMPQ R11, R9 + JLT iloop + + ADDQ $8, BX + CMPQ BX, R8 + JLT xloop + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/idct_arm64.s b/third_party/h265/hevc/idct_arm64.s new file mode 100644 index 00000000..66b256f0 --- /dev/null +++ b/third_party/h265/hevc/idct_arm64.s @@ -0,0 +1,152 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define MUL4S(Vd, Vn, Vm) WORD $(0x4ea09c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL4S(Vd, Vn, Vm) WORD $(0x4ea04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMAX4S(Vd, Vn, Vm) WORD $(0x4ea06400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMIN4S(Vd, Vn, Vm) WORD $(0x4ea06c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func idctCols4NEON(dst, src, m *int32, n, mstride, shift int, rnd, lo, hi int32) +// +// One pass of 8.6.4.2 over four columns at a time. Outputs come four at a +// time so the even and odd accumulators stay in registers, and j is unrolled +// by two so the parity is static. +TEXT ·idctCols4NEON(SB), NOSPLIT, $0-60 + MOVD dst+0(FP), R0 + MOVD src+8(FP), R1 + MOVD m+16(FP), R2 + MOVD n+24(FP), R3 + MOVD mstride+32(FP), R4 + MOVD shift+40(FP), R5 + MOVW rnd+48(FP), R6 + MOVW lo+52(FP), R7 + MOVW hi+56(FP), R19 + + LSL $2, R4 + + VDUP R6, V10.S4 + VDUP R7, V11.S4 + VDUP R19, V12.S4 + NEG R5, R8 + VDUP R8, V13.S4 + + LSR $1, R3, R9 + LSL $2, R3, R10 + + MOVD $0, R11 + +xloop: + MOVD $0, R12 + +iloop: + VMOVI $0, V0.B16 + VMOVI $0, V1.B16 + VMOVI $0, V2.B16 + VMOVI $0, V3.B16 + VMOVI $0, V4.B16 + VMOVI $0, V5.B16 + VMOVI $0, V6.B16 + VMOVI $0, V7.B16 + + ADD R11<<2, R1, R13 + ADD R12<<2, R2, R14 + + MOVD R3, R15 + +jloop: + VLD1 (R13), [V8.S4] + VMOV V8.D[0], R16 + VMOV V8.D[1], R17 + ORR R17, R16, R16 + CBZ R16, skipeven + + VLD1 (R14), [V9.S4] + + VDUP V9.S[0], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V0.S4, V0.S4 + VDUP V9.S[1], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V1.S4, V1.S4 + VDUP V9.S[2], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V2.S4, V2.S4 + VDUP V9.S[3], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V3.S4, V3.S4 + +skipeven: + ADD R10, R13 + ADD R4, R14 + + VLD1 (R13), [V8.S4] + VMOV V8.D[0], R16 + VMOV V8.D[1], R17 + ORR R17, R16, R16 + CBZ R16, skipodd + + VLD1 (R14), [V9.S4] + + VDUP V9.S[0], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V4.S4, V4.S4 + VDUP V9.S[1], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V5.S4, V5.S4 + VDUP V9.S[2], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V6.S4, V6.S4 + VDUP V9.S[3], V14.S4 + MUL4S(14, 14, 8) + VADD V14.S4, V7.S4, V7.S4 + +skipodd: + ADD R10, R13 + ADD R4, R14 + + SUB $2, R15 + CBNZ R15, jloop + + // The low output rows run forward from i0, the high ones backward from + // n-1-i0, which is the M[j][n-1-i] symmetry. + MUL R10, R12, R16 + ADD R0, R16 + ADD R11<<2, R16, R16 + + SUB R12, R3, R17 + SUB $1, R17 + MUL R10, R17, R17 + ADD R0, R17 + ADD R11<<2, R17, R17 + +#define EMIT(Ve, Vo) \ + VADD Vo.S4, Ve.S4, V14.S4; \ + VSUB Vo.S4, Ve.S4, V15.S4; \ + VADD V10.S4, V14.S4, V14.S4; \ + VADD V10.S4, V15.S4, V15.S4; \ + SSHL4S(14, 14, 13); \ + SSHL4S(15, 15, 13); \ + SMAX4S(14, 14, 11); \ + SMIN4S(14, 14, 12); \ + SMAX4S(15, 15, 11); \ + SMIN4S(15, 15, 12); \ + VST1 [V14.S4], (R16); \ + VST1 [V15.S4], (R17); \ + ADD R10, R16; \ + SUB R10, R17 + + EMIT(V0, V4) + EMIT(V1, V5) + EMIT(V2, V6) + EMIT(V3, V7) + + ADD $4, R12 + CMP R9, R12 + BLT iloop + + ADD $4, R11 + CMP R3, R11 + BLT xloop + + RET diff --git a/third_party/h265/hevc/idct_riscv64.s b/third_party/h265/hevc/idct_riscv64.s new file mode 100644 index 00000000..602f4f91 --- /dev/null +++ b/third_party/h265/hevc/idct_riscv64.s @@ -0,0 +1,133 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func idctColsRVV(dst, src, m *int32, n, mstride, shift int, rnd, lo, hi int32) +// +// One pass of 8.6.4.2 over as many columns as the vector length takes. Outputs +// come four at a time so the even and odd accumulators stay in registers, and +// j is unrolled by two so the parity is static. +TEXT ·idctColsRVV(SB), NOSPLIT, $0-60 + MOV dst+0(FP), X10 + MOV src+8(FP), X11 + MOV m+16(FP), X12 + MOV n+24(FP), X13 + MOV mstride+32(FP), X14 + MOV shift+40(FP), X15 + MOVW rnd+48(FP), X16 + MOVW lo+52(FP), X17 + MOVW hi+56(FP), X18 + + SLLI $2, X14 + SRLI $3, X13, X19 + SLLI $2, X13, X20 + + MOV $0, X21 + MOV X13, X22 + +xloop: + VSETVLI X22, E32, M1, TA, MA, X23 + + MOV $0, X24 + MOV X19, X8 + +iloop: + VMVVI $0, V1 + VMVVI $0, V2 + VMVVI $0, V3 + VMVVI $0, V4 + VMVVI $0, V5 + VMVVI $0, V6 + VMVVI $0, V7 + VMVVI $0, V8 + + SLLI $2, X21, X30 + ADD X11, X30, X25 + + SLLI $2, X24, X28 + ADD X12, X28 + + MOV X13, X29 + +jloop: + VLE32V (X25), V9 + + MOVW (X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V1, V1 + MOVW 4(X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V2, V2 + MOVW 8(X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V3, V3 + MOVW 12(X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V4, V4 + + ADD X20, X25 + ADD X14, X28 + + VLE32V (X25), V9 + + MOVW (X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V5, V5 + MOVW 4(X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V6, V6 + MOVW 8(X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V7, V7 + MOVW 12(X28), X7 + VMULVX X7, V9, V10 + VADDVV V10, V8, V8 + + ADD X20, X25 + ADD X14, X28 + + ADD $-2, X29 + BNEZ X29, jloop + + // The low output rows run forward from i0, the high ones backward from + // n-1-i0, which is the M[j][n-1-i] symmetry. + MUL X20, X24, X5 + ADD X10, X5 + ADD X30, X5 + + SUB X24, X13, X6 + ADD $-1, X6 + MUL X20, X6, X6 + ADD X10, X6 + ADD X30, X6 + +#define EMIT(Ve, Vo) \ + VADDVV Vo, Ve, V11; \ + VSUBVV Vo, Ve, V12; \ + VADDVX X16, V11, V11; \ + VADDVX X16, V12, V12; \ + VSRAVX X15, V11, V11; \ + VSRAVX X15, V12, V12; \ + VMAXVX X17, V11, V11; \ + VMINVX X18, V11, V11; \ + VMAXVX X17, V12, V12; \ + VMINVX X18, V12, V12; \ + VSE32V V11, (X5); \ + VSE32V V12, (X6); \ + ADD X20, X5; \ + SUB X20, X6 + + EMIT(V1, V5) + EMIT(V2, V6) + EMIT(V3, V7) + EMIT(V4, V8) + + ADD $4, X24 + ADD $-1, X8 + BNEZ X8, iloop + + ADD X23, X21 + SUB X23, X22 + BNEZ X22, xloop + + RET diff --git a/third_party/h265/hevc/inter.go b/third_party/h265/hevc/inter.go new file mode 100644 index 00000000..1af36298 --- /dev/null +++ b/third_party/h265/hevc/inter.go @@ -0,0 +1,633 @@ +package hevc + +func (d *ctuDecoder) mvIndex(x, y int) int { + return (y>>2)*d.mvWidth + x>>2 +} + +// availablePB is 6.4.2. A neighbour inside the current coding block is +// available without consulting the z-scan order of 6.4.1, apart from the one +// partition the clause excludes. +func (d *ctuDecoder) availablePB(xN, yN int) bool { + if xN < 0 || yN < 0 || + xN >= int(d.s.picWidthInLumaSamples) || yN >= int(d.s.picHeightInLumaSamples) { + return false + } + + sameCb := xN >= d.cuX && xN < d.cuX+d.cuSize && yN >= d.cuY && yN < d.cuY+d.cuSize + + if !sameCb { + return d.available(d.curX, d.curY, xN, yN) + } + + return !(d.puW<<1 == d.cuSize && d.puH<<1 == d.cuSize && d.partIdx == 1 && + d.cuY+d.puH <= yN && d.cuX+d.puW > xN) +} + +func (d *ctuDecoder) neighbourMV() neighbour { + return func(x, y int) (*mvInfo, bool) { + if !d.availablePB(x, y) { + return nil, false + } + + i := d.mvIndex(x, y) + if i < 0 || i >= len(d.mvField) || !d.mvValid[i] { + return nil, false + } + + return &d.mvField[i], true + } +} + +// setMV records the motion of a prediction unit and the pictures its reference +// indices name, which 8.5.3.2.8 reads back from a later picture. +func (d *ctuDecoder) setMV(x, y, w, h int, m mvInfo) { + var poc [2]int32 + + var long [2]bool + + for l := range 2 { + if m.pred[l] && int(m.refIdx[l]) < len(d.refPOC[l]) { + poc[l] = d.refPOC[l][m.refIdx[l]] + long[l] = d.refLong[l][m.refIdx[l]] + } + } + + nw, nh := d.blocksIn(x, y, w, h, 2) + + for j := range nh { + k := (y>>2+j)*d.mvWidth + x>>2 + + field := d.mvField[k:][:nw] + pocs := d.mvPoc[k:][:nw] + longs := d.mvLong[k:][:nw] + valid := d.mvValid[k:][:nw] + + for i := range field { + field[i] = m + pocs[i] = poc + longs[i] = long + valid[i] = true + } + } +} + +// mvdCoding is 7.3.8.9. +func (d *ctuDecoder) mvdCoding() mv { + g0x := d.c.decodeBin(ctxAbsMVDGreater0Flag) != 0 + g0y := d.c.decodeBin(ctxAbsMVDGreater0Flag) != 0 + + g1x, g1y := false, false + + if g0x { + g1x = d.c.decodeBin(ctxAbsMVDGreater1Flag+1) != 0 + } + + if g0y { + g1y = d.c.decodeBin(ctxAbsMVDGreater1Flag+1) != 0 + } + + comp := func(g0, g1 bool) int16 { + if !g0 { + return 0 + } + + v := int32(1) + if g1 { + v = d.expGolombBypass(1) + 2 + } + + if d.c.decodeBypass() != 0 { + v = -v + } + + return int16(v) + } + + return mv{comp(g0x, g1x), comp(g0y, g1y)} +} + +// expGolombBypass reads a bypass-coded order-k exponential Golomb value. +func (d *ctuDecoder) expGolombBypass(k int) int32 { + n := 0 + for d.c.decodeBypass() != 0 { + n++ + + if n > 30 { + return 0 + } + } + + v := int32(0) + for i := 0; i < n+k; i++ { + v = v<<1 | int32(d.c.decodeBypass()) + } + + if n == 0 { + return v + } + + return v + int32((1<<(n+k))-(1< 2 && nCbS == 8 { + mx, my, mw, mh, mIdx = xCb, yCb, nCbS, nCbS, 0 + } + + nb := d.neighbourMV() + + lists := [2][]int32{d.refPOC[0], d.refPOC[1]} + + var m mvInfo + + merge := skip + if !skip { + merge = d.c.decodeBin(ctxMergeFlag) != 0 + } + + if partIdx == 0 { + d.lastMerge = merge + } + + if merge { + idx := 0 + + if d.sh.maxNumMergeCand > 1 { + for idx < int(d.sh.maxNumMergeCand)-1 { + var bit uint32 + + if idx == 0 { + bit = d.c.decodeBin(ctxMergeIDX) + } else { + bit = d.c.decodeBypass() + } + + if bit == 0 { + break + } + + idx++ + } + } + + d.curX, d.curY = mx, my + d.puW, d.puH, d.partIdx = mw, mh, mIdx + + cand := mergeCandidates(d.mergeCd[:], nb, mx, my, mw, mh, mIdx, partMode, + int(d.sh.maxNumMergeCand), int(d.p.log2ParallelMergeLevel)) + + d.curX, d.curY = x, y + d.puW, d.puH, d.partIdx = w, h, partIdx + + if len(cand) < int(d.sh.maxNumMergeCand) { + if t, ok := d.temporalMerge(mx, my, mw, mh); ok { + cand = append(cand, t) + } + } + + if d.sh.sliceType == sliceB { + cand = combineBiCandidates(cand, int(d.sh.maxNumMergeCand), lists) + } + + numRef := int(d.sh.numRefIdxL0Active) + if d.sh.sliceType == sliceB { + numRef = min(numRef, int(d.sh.numRefIdxL1Active)) + } + + cand = zeroCandidates(cand, int(d.sh.maxNumMergeCand), numRef, + d.sh.sliceType == sliceB) + + if idx >= len(cand) { + return ErrInvalid + } + + m = cand[idx] + + // 8.5.3.2.1: the smallest prediction units may not be bi-predicted, so + // a merge candidate that is drops to list zero. + if w+h == 12 && m.pred[0] && m.pred[1] { + m.pred[1] = false + m.mv[1] = mv{} + } + } else { + idc := predL0 + if d.sh.sliceType == sliceB { + idc = d.interPredIdc(w, h, depth) + } + + for l := range 2 { + if (l == 0 && idc == predL1) || (l == 1 && idc == predL0) { + continue + } + + active := int(d.sh.numRefIdxL0Active) + if l == 1 { + active = int(d.sh.numRefIdxL1Active) + } + + ref := d.refIdx(active) + + var mvd mv + + if l == 1 && d.sh.mvdL1Zero && idc == predBI { + mvd = mv{} + } else { + mvd = d.mvdCoding() + } + + flag := d.c.decodeBin(ctxMVPLXFlag) + + if int(ref) >= len(lists[l]) { + return ErrInvalid + } + + ab, avail := amvpCandidates(nb, x, y, w, h, l, lists[l][ref], d.poc, lists, + d.refLong, d.refLong[l][ref]) + + var cand [2]mv + + n := 0 + + if avail[0] { + cand[n] = ab[0] + n++ + } + + if avail[1] && !(avail[0] && ab[0] == ab[1]) { + cand[n] = ab[1] + n++ + } + + if n < 2 { + if t, ok := d.temporalMV(x, y, w, h, l, lists[l][ref], d.refLong[l][ref]); ok { + cand[n] = t + n++ + } + } + + p := cand[flag] + + m.mv[l] = mv{p.x + mvd.x, p.y + mvd.y} + m.refIdx[l] = ref + m.pred[l] = true + } + } + + if !m.pred[0] { + m.refIdx[0] = -1 + } + + if !m.pred[1] { + m.refIdx[1] = -1 + } + + d.setMV(x, y, w, h, m) + d.markPU(x, y, w, h, false) + + return d.motionCompensate(x, y, w, h, &m) +} + +func (d *ctuDecoder) motionCompensate(x, y, w, h int, m *mvInfo) error { + var buf [2][]int16 + + for l := range 2 { + if !m.pred[l] { + continue + } + + if int(m.refIdx[l]) >= len(d.refPics[l]) { + return ErrInvalid + } + + ref := d.refPics[l][m.refIdx[l]] + if ref == nil { + return ErrInvalid + } + + buf[l] = d.mcBuf[l][:w*h] + + if d.pic.deep() { + src, stride := ref.plane16(0) + mcLuma(buf[l], w, src, stride, ref.Width, ref.Height, + x+int(m.mv[l].x>>2), y+int(m.mv[l].y>>2), + int(m.mv[l].x&3), int(m.mv[l].y&3), w, h, d.pic.BitDepth, + d.mcTmp[:], d.mcTmp16[:], d.mcPad16[:]) + } else { + src, stride := ref.plane8(0) + mcLuma(buf[l], w, src, stride, ref.Width, ref.Height, + x+int(m.mv[l].x>>2), y+int(m.mv[l].y>>2), + int(m.mv[l].x&3), int(m.mv[l].y&3), w, h, d.pic.BitDepth, + d.mcTmp[:], d.mcTmp16[:], d.mcPad8[:]) + } + } + + if err := d.combine(x, y, w, h, 0, buf, m); err != nil { + return err + } + + if d.s.chromaArrayType() == 0 { + return nil + } + + sw, sh := d.s.subWidthC, d.s.subHeightC + cw, ch := w/sw, h/sh + + if cw == 0 || ch == 0 { + return nil + } + + for cIdx := 1; cIdx <= 2; cIdx++ { + var cbuf [2][]int16 + + for l := range 2 { + if !m.pred[l] { + continue + } + + ref := d.refPics[l][m.refIdx[l]] + cbuf[l] = d.mcBuf[l][:cw*ch] + + mvx := int(m.mv[l].x) * 2 / sw + mvy := int(m.mv[l].y) * 2 / sh + + px, py := x/sw+mvx>>3, y/sh+mvy>>3 + fx, fy := mvx&7, mvy&7 + + if d.pic.deep() { + src, stride := ref.plane16(cIdx) + mcChroma(cbuf[l], cw, src, stride, ref.WidthC, ref.HeightC, + px, py, fx, fy, cw, ch, d.pic.BitDepthC, d.mcTmp[:], d.mcTmp16[:], + d.mcPad16[:]) + } else { + src, stride := ref.plane8(cIdx) + mcChroma(cbuf[l], cw, src, stride, ref.WidthC, ref.HeightC, + px, py, fx, fy, cw, ch, d.pic.BitDepthC, d.mcTmp[:], d.mcTmp16[:], + d.mcPad8[:]) + } + } + + if err := d.combine(x/sw, y/sh, cw, ch, cIdx, cbuf, m); err != nil { + return err + } + } + + return nil +} + +func (d *ctuDecoder) weighted() bool { + return (d.p.weightedPred && d.sh.sliceType == sliceP) || + (d.p.weightedBipred && d.sh.sliceType == sliceB) +} + +func (d *ctuDecoder) combine(x, y, w, h, cIdx int, buf [2][]int16, m *mvInfo) error { + bd := d.pic.depth(cIdx) + + if d.pic.deep() { + plane, stride := d.pic.plane16(cIdx) + + return combineInto(d, plane, y*stride+x, stride, w, h, cIdx, bd, buf, m) + } + + plane, stride := d.pic.plane8(cIdx) + + return combineInto(d, plane, y*stride+x, stride, w, h, cIdx, bd, buf, m) +} + +// combineInto applies 8.5.3.3.4, choosing the default or the explicitly +// weighted process as the picture parameter set requires. +func combineInto[P pixel](d *ctuDecoder, dst []P, off, stride, w, h, cIdx, bd int, + buf [2][]int16, m *mvInfo, +) error { + if !d.weighted() { + return combinePred(dst, off, stride, w, h, bd, buf, m) + } + + wt := &d.sh.weights + + denom := int(wt.lumaLog2Denom) + if cIdx > 0 { + denom = int(wt.chromaLog2Denom) + } + + weight := func(l int) (int, int) { + i := int(m.refIdx[l]) + + if cIdx == 0 { + return int(wt.lumaWeight[l][i]), int(wt.lumaOffset[l][i]) + } + + return int(wt.chromaWeight[l][i][cIdx-1]), int(wt.chromaOffset[l][i][cIdx-1]) + } + + switch { + case m.pred[0] && m.pred[1]: + w0, o0 := weight(0) + w1, o1 := weight(1) + weightBi(dst, off, stride, buf[0], buf[1], w, w, h, w0, w1, o0, o1, denom, bd, + d.s.highPrecisionOffsets) + case m.pred[0]: + w0, o0 := weight(0) + weightUni(dst, off, stride, buf[0], w, w, h, w0, o0, denom, bd, + d.s.highPrecisionOffsets) + case m.pred[1]: + w1, o1 := weight(1) + weightUni(dst, off, stride, buf[1], w, w, h, w1, o1, denom, bd, + d.s.highPrecisionOffsets) + default: + return ErrInvalid + } + + return nil +} + +func combinePred[P pixel](dst []P, off, stride, w, h, bd int, buf [2][]int16, m *mvInfo) error { + switch { + case m.pred[0] && m.pred[1]: + predBi(dst, off, stride, buf[0], buf[1], w, w, h, bd) + case m.pred[0]: + predUni(dst, off, stride, buf[0], w, w, h, bd) + case m.pred[1]: + predUni(dst, off, stride, buf[1], w, w, h, bd) + default: + return ErrInvalid + } + + return nil +} + +// storeColMotion subsamples the picture's motion field to the 16x16 grid the +// temporal predictor reads, recording reference pictures by POC. +func (d *ctuDecoder) storeColMotion() { + for y := 0; y < int(d.s.picHeightInLumaSamples); y += 16 { + for x := 0; x < int(d.s.picWidthInLumaSamples); x += 16 { + c := &d.pic.Col[d.pic.colIndex(x, y)] + + k := d.blkIndex(x, y) + c.intra = d.blk[k].intra + + if c.intra || !d.mvValid[k] { + c.intra = true + + continue + } + + c.info = d.mvField[k] + c.refPoc = d.mvPoc[k] + c.refLong = d.mvLong[k] + } + } +} + +// temporalMV is 8.5.3.2.8 and 8.5.3.2.9: the collocated block at the +// bottom-right of the prediction unit, falling back to its centre. +func (d *ctuDecoder) temporalMV(xPb, yPb, nPbW, nPbH, list int, refPoc int32, refLong bool) (mv, bool) { + if !d.sh.temporalMvp || d.colPic == nil { + return mv{}, false + } + + col := d.colPic + + try := func(x, y int) (*colMotion, bool) { + if x < 0 || y < 0 || x >= col.Width || y >= col.Height { + return nil, false + } + + c := &col.Col[col.colIndex(x, y)] + if c.intra { + return nil, false + } + + return c, true + } + + // 8.5.3.2.9, which the caller falls back from when it yields nothing. + derive := func(c *colMotion) (mv, bool) { + l := 0 + + switch { + case !c.info.pred[0]: + l = 1 + case !c.info.pred[1]: + l = 0 + case d.noBackwardPred: + l = list + case d.sh.collocatedFromL0: + l = 1 + default: + l = 0 + } + + if !c.info.pred[l] { + return mv{}, false + } + + // The collocated reference must match the target in long term status, + // and a long term one is never scaled. + if c.refLong[l] != refLong { + return mv{}, false + } + + if c.refPoc[l] == d.poc || refPoc == d.poc { + return mv{}, false + } + + if refLong || int32(col.POC)-c.refPoc[l] == d.poc-refPoc { + return c.info.mv[l], true + } + + return scaleMV(c.info.mv[l], d.poc, refPoc, int32(col.POC), c.refPoc[l]), true + } + + // The bottom-right candidate is unavailable outside the picture or past the + // coding tree row, and the centre takes over whenever it yields nothing. + if c, ok := try(xPb+nPbW, yPb+nPbH); ok && + yPb>>d.s.ctbLog2SizeY == (yPb+nPbH)>>d.s.ctbLog2SizeY { + if v, ok := derive(c); ok { + return v, true + } + } + + c, ok := try(xPb+nPbW/2, yPb+nPbH/2) + if !ok { + return mv{}, false + } + + return derive(c) +} + +// temporalMerge builds the temporal merge candidate, which uses reference +// index zero in each list the slice has. +func (d *ctuDecoder) temporalMerge(x, y, w, h int) (mvInfo, bool) { + var m mvInfo + + m.refIdx = [2]int8{-1, -1} + + for l := range 2 { + if l == 1 && d.sh.sliceType != sliceB { + continue + } + + if len(d.refPOC[l]) == 0 { + continue + } + + v, ok := d.temporalMV(x, y, w, h, l, d.refPOC[l][0], d.refLong[l][0]) + if !ok { + continue + } + + m.mv[l] = v + m.refIdx[l] = 0 + m.pred[l] = true + } + + return m, m.pred[0] || m.pred[1] +} diff --git a/third_party/h265/hevc/interpred.go b/third_party/h265/hevc/interpred.go new file mode 100644 index 00000000..e5f7e171 --- /dev/null +++ b/third_party/h265/hevc/interpred.go @@ -0,0 +1,482 @@ +package hevc + +// Table 8-11. +// lumaFilter16 is the same table at the width the kernels multiply in. +var lumaFilter16 = func() [4][8]int16 { + var f [4][8]int16 + + for i, row := range lumaFilter { + for j, v := range row { + f[i][j] = int16(v) + } + } + + return f +}() + +var lumaFilter = [4][8]int32{ + {0, 0, 0, 64, 0, 0, 0, 0}, + {-1, 4, -10, 58, 17, -5, 1, 0}, + {-1, 4, -11, 40, 40, -11, 4, -1}, + {0, 1, -5, 17, 58, -10, 4, -1}, +} + +// Table 8-12. +// chromaFilter16 is the same table at the width the kernels multiply in. +var chromaFilter16 = func() [8][4]int16 { + var f [8][4]int16 + + for i, row := range chromaFilter { + for j, v := range row { + f[i][j] = int16(v) + } + } + + return f +}() + +var chromaFilter = [8][4]int32{ + {0, 64, 0, 0}, + {-2, 58, 10, -2}, + {-4, 54, 16, -2}, + {-6, 46, 28, -4}, + {-4, 36, 36, -4}, + {-4, 28, 46, -6}, + {-2, 16, 54, -4}, + {-2, 10, 58, -2}, +} + +func clampInt(v, lo, hi int) int { + if v < lo { + return lo + } + + if v > hi { + return hi + } + + return v +} + +// mcLuma is the luma sample interpolation of 8.5.3.3.3.1. It writes the +// 14-bit intermediate the weighted prediction process consumes. +func mcLuma[P pixel](dst []int16, dstStride int, src []P, srcStride, picW, picH, + x, y, xFrac, yFrac, w, h, bitDepth int, scratch []int32, tmp16 []int16, pad []P, +) { + shift1 := min(4, bitDepth-8) + shift2 := 6 + shift3 := max(2, 14-bitDepth) + + // The eight-tap support reaches three samples back and four forward. When + // it leaves the picture the region is copied out once with the edge + // clamping of 8.5.3.3.3, so the filters below index the source directly. + ox, ew := 0, w + if xFrac != 0 { + ox, ew = -3, w+7 + } + + oy, eh := 0, h + if yFrac != 0 { + oy, eh = -3, h+7 + } + + if x+ox < 0 || y+oy < 0 || x+ox+ew > picW || y+oy+eh > picH { + emulate(pad, src, srcStride, picW, picH, x+ox, y+oy, ew, eh) + + src, srcStride = pad, ew + x, y = -ox, -oy + } + + at := func(px, py int) int32 { + return int32(src[py*srcStride+px]) + } + + // The kernels cover eight-bit samples at widths they can step through + // whole; anything else falls to the loops below. + asm := mcTapAsm + if bitDepth != 8 || w%8 != 0 { + asm = nil + } + + p8, _ := any(src).([]uint8) + if p8 == nil { + asm = nil + } + + switch { + case xFrac == 0 && yFrac == 0: + if p8 != nil && w%8 == 0 && mcCopyAsm != nil { + mcCopyAsm(dst, dstStride, p8[y*srcStride+x:], srcStride, w, h, shift3) + + return + } + + for j := range h { + for i := range w { + dst[j*dstStride+i] = int16(at(x+i, y+j) << shift3) + } + } + + case yFrac == 0: + if asm != nil { + asm(dst, dstStride, p8[y*srcStride+x-3:], srcStride, 1, w, h, + lumaFilter16[xFrac][:]) + + return + } + + f := &lumaFilter[xFrac] + + for j := range h { + for i := range w { + var v int32 + for k := range 8 { + v += f[k] * at(x+i+k-3, y+j) + } + + dst[j*dstStride+i] = int16(v >> shift1) + } + } + + case xFrac == 0: + if asm != nil { + asm(dst, dstStride, p8[(y-3)*srcStride+x:], srcStride, srcStride, w, h, + lumaFilter16[yFrac][:]) + + return + } + + f := &lumaFilter[yFrac] + + for j := range h { + for i := range w { + var v int32 + for k := range 8 { + v += f[k] * at(x+i, y+j+k-3) + } + + dst[j*dstStride+i] = int16(v >> shift1) + } + } + + default: + if asm != nil && mcTapV16Asm != nil { + t := tmp16[:(h+7)*w] + + asm(t, w, p8[(y-3)*srcStride+x-3:], srcStride, 1, w, h+7, + lumaFilter16[xFrac][:]) + mcTapV16Asm(dst, dstStride, t, w, w, h, shift2, lumaFilter16[yFrac][:]) + + return + } + + fx, fy := &lumaFilter[xFrac], &lumaFilter[yFrac] + + tmp := scratch[:(h+7)*w] + + for j := range h + 7 { + for i := range w { + var v int32 + for k := range 8 { + v += fx[k] * at(x+i+k-3, y+j-3) + } + + tmp[j*w+i] = v >> shift1 + } + } + + for j := range h { + for i := range w { + var v int32 + for k := range 8 { + v += fy[k] * tmp[(j+k)*w+i] + } + + dst[j*dstStride+i] = int16(v >> shift2) + } + } + } +} + +// mcChroma is the chroma sample interpolation of 8.5.3.3.3.2. +func mcChroma[P pixel](dst []int16, dstStride int, src []P, srcStride, picW, picH, + x, y, xFrac, yFrac, w, h, bitDepth int, scratch []int32, tmp16 []int16, pad []P, +) { + shift1 := min(4, bitDepth-8) + shift2 := 6 + shift3 := max(2, 14-bitDepth) + + // The four-tap support reaches one sample back and two forward. + ox, ew := 0, w + if xFrac != 0 { + ox, ew = -1, w+3 + } + + oy, eh := 0, h + if yFrac != 0 { + oy, eh = -1, h+3 + } + + if x+ox < 0 || y+oy < 0 || x+ox+ew > picW || y+oy+eh > picH { + emulate(pad, src, srcStride, picW, picH, x+ox, y+oy, ew, eh) + + src, srcStride = pad, ew + x, y = -ox, -oy + } + + at := func(px, py int) int32 { + return int32(src[py*srcStride+px]) + } + + p8, _ := any(src).([]uint8) + + asm := mcTapAsm + if bitDepth != 8 || w%8 != 0 || p8 == nil { + asm = nil + } + + switch { + case xFrac == 0 && yFrac == 0: + if p8 != nil && w%8 == 0 && bitDepth == 8 && mcCopyAsm != nil { + mcCopyAsm(dst, dstStride, p8[y*srcStride+x:], srcStride, w, h, shift3) + + return + } + + for j := range h { + for i := range w { + dst[j*dstStride+i] = int16(at(x+i, y+j) << shift3) + } + } + + case yFrac == 0: + if asm != nil { + asm(dst, dstStride, p8[y*srcStride+x-1:], srcStride, 1, w, h, + chromaFilter16[xFrac][:]) + + return + } + + f := &chromaFilter[xFrac] + + for j := range h { + for i := range w { + var v int32 + for k := range 4 { + v += f[k] * at(x+i+k-1, y+j) + } + + dst[j*dstStride+i] = int16(v >> shift1) + } + } + + case xFrac == 0: + if asm != nil { + asm(dst, dstStride, p8[(y-1)*srcStride+x:], srcStride, srcStride, w, h, + chromaFilter16[yFrac][:]) + + return + } + + f := &chromaFilter[yFrac] + + for j := range h { + for i := range w { + var v int32 + for k := range 4 { + v += f[k] * at(x+i, y+j+k-1) + } + + dst[j*dstStride+i] = int16(v >> shift1) + } + } + + default: + if asm != nil && mcTapV16Asm != nil { + t := tmp16[:(h+3)*w] + + asm(t, w, p8[(y-1)*srcStride+x-1:], srcStride, 1, w, h+3, + chromaFilter16[xFrac][:]) + mcTapV16Asm(dst, dstStride, t, w, w, h, shift2, chromaFilter16[yFrac][:]) + + return + } + + fx, fy := &chromaFilter[xFrac], &chromaFilter[yFrac] + + tmp := scratch[:(h+3)*w] + + for j := range h + 3 { + for i := range w { + var v int32 + for k := range 4 { + v += fx[k] * at(x+i+k-1, y+j-1) + } + + tmp[j*w+i] = v >> shift1 + } + } + + for j := range h { + for i := range w { + var v int32 + for k := range 4 { + v += fy[k] * tmp[(j+k)*w+i] + } + + dst[j*dstStride+i] = int16(v >> shift2) + } + } + } +} + +// emulate copies a region out of a reference picture, repeating the edge +// samples where it falls outside, so a filter reading it needs no bounds +// check. +func emulate[P pixel](dst []P, src []P, srcStride, picW, picH, x, y, w, h int) { + for j := range h { + sy := clampInt(y+j, 0, picH-1) + row := src[sy*srcStride:] + out := dst[j*w : j*w+w] + + // The inside part is a copy; only the overhang repeats. + lo := clampInt(-x, 0, w) + hi := clampInt(picW-x, 0, w) + + for i := range lo { + out[i] = row[0] + } + + if hi > lo { + copy(out[lo:hi], row[x+lo:x+hi]) + } + + for i := hi; i < w; i++ { + out[i] = row[picW-1] + } + } +} + +// predUni is the default uni-prediction of 8.5.3.3.4.2. +func predUni[P pixel](dst []P, dstOff, dstStride int, src []int16, srcStride, w, h, bitDepth int) { + shift := max(2, 14-bitDepth) + + if k := predUniAsm; k != nil && bitDepth == 8 { + if p, ok := any(dst).([]uint8); ok { + if n := w &^ 7; n != 0 { + k(p[dstOff:], dstStride, src, srcStride, n, h, shift) + + if n == w { + return + } + + dstOff += n + src = src[n:] + w -= n + } + } + } + + predUniGo(dst, dstOff, dstStride, src, srcStride, w, h, bitDepth, shift) +} + +func predUniGo[P pixel](dst []P, dstOff, dstStride int, src []int16, srcStride, w, h, bitDepth, shift int) { + off := int32(1) << (shift - 1) + maxV := int32(1)<> shift + dst[dstOff+j*dstStride+i] = P(clip3(v, 0, maxV)) + } + } +} + +// predBi is the default bi-prediction of 8.5.3.3.4.2. +func predBi[P pixel](dst []P, dstOff, dstStride int, a, b []int16, srcStride, w, h, bitDepth int) { + shift := max(2, 14-bitDepth) + 1 + + if k := predBiAsm; k != nil && bitDepth == 8 { + if p, ok := any(dst).([]uint8); ok { + if n := w &^ 7; n != 0 { + k(p[dstOff:], dstStride, a, b, srcStride, n, h, shift) + + if n == w { + return + } + + dstOff += n + a, b = a[n:], b[n:] + w -= n + } + } + } + + predBiGo(dst, dstOff, dstStride, a, b, srcStride, w, h, bitDepth, shift) +} + +func predBiGo[P pixel](dst []P, dstOff, dstStride int, a, b []int16, srcStride, w, h, + bitDepth, shift int, +) { + off := int32(1) << (shift - 1) + maxV := int32(1)<> shift + dst[dstOff+j*dstStride+i] = P(clip3(v, 0, maxV)) + } + } +} + +// weightUni is the explicit weighted uni-prediction of 8.5.3.3.4.3. +func weightUni[P pixel](dst []P, dstOff, dstStride int, src []int16, srcStride, + w, h, weight, offset, denom, bitDepth int, highPrecision bool, +) { + shift1 := max(2, 14-bitDepth) + log2Wd := denom + shift1 + maxV := int32(1)<= 1 { + v = ((v*int32(weight) + 1<<(log2Wd-1)) >> log2Wd) + o + } else { + v = v*int32(weight) + o + } + + dst[dstOff+j*dstStride+i] = P(clip3(v, 0, maxV)) + } + } +} + +// weightBi is the explicit weighted bi-prediction of 8.5.3.3.4.3. +func weightBi[P pixel](dst []P, dstOff, dstStride int, a, b []int16, srcStride, + w, h, w0, w1, o0, o1, denom, bitDepth int, highPrecision bool, +) { + shift1 := max(2, 14-bitDepth) + log2Wd := denom + shift1 + maxV := int32(1)<>(log2Wd+1), 0, maxV)) + } + } +} diff --git a/third_party/h265/hevc/interpred_amd64.s b/third_party/h265/hevc/interpred_amd64.s new file mode 100644 index 00000000..22a171d0 --- /dev/null +++ b/third_party/h265/hevc/interpred_amd64.s @@ -0,0 +1,160 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func predUni8AVX2(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) +// +// 8.5.3.3.4.2 without weights. The add saturates because the Go path sums at +// 32 bits, and a sum that saturates shifts to more than the maximum sample and +// would clip there anyway. The pack then saturates unsigned, which is the clip +// itself. w is a multiple of eight; the caller does any remainder. +TEXT ·predUni8AVX2(SB), NOSPLIT, $0-56 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ w+32(FP), R8 + MOVQ h+40(FP), R9 + MOVQ shift+48(FP), R10 + + // off = 1 << (shift-1), while CL is still free + MOVQ $1, AX + MOVQ R10, CX + DECQ CX + SHLQ CX, AX + MOVQ AX, X1 + + VPBROADCASTW X1, Y1 + MOVQ R10, X2 + + MOVQ srcStride+24(FP), CX + SHLQ $1, CX + +rows: + MOVQ DI, R11 + MOVQ DX, R12 + MOVQ R8, R13 + +wide: + CMPQ R13, $16 + JLT narrow + + VMOVDQU (R12), Y0 + VPADDSW Y1, Y0, Y0 + VPSRAW X2, Y0, Y0 + VPACKUSWB Y0, Y0, Y0 + VPERMQ $0xd8, Y0, Y0 + VMOVDQU X0, (R11) + + ADDQ $32, R12 + ADDQ $16, R11 + SUBQ $16, R13 + JMP wide + +narrow: + TESTQ R13, R13 + JZ next + + VMOVDQU (R12), X0 + VPADDSW X1, X0, X0 + VPSRAW X2, X0, X0 + VPACKUSWB X0, X0, X0 + MOVQ X0, (R11) + + ADDQ $16, R12 + ADDQ $8, R11 + SUBQ $8, R13 + JMP narrow + +next: + ADDQ SI, DI + ADDQ CX, DX + DECQ R9 + JNZ rows + + VZEROUPPER + RET + +// func predUni8AVX512(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) +// +// The 512-bit down-convert saturates unsigned only, so the negative half of the +// clip is a max against zero rather than a signed pack. +TEXT ·predUni8AVX512(SB), NOSPLIT, $0-56 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ w+32(FP), R8 + MOVQ h+40(FP), R9 + MOVQ shift+48(FP), R10 + + MOVQ $1, AX + MOVQ R10, CX + DECQ CX + SHLQ CX, AX + MOVQ AX, X1 + + VPBROADCASTW X1, Z1 + MOVQ R10, X2 + VPXORD Z3, Z3, Z3 + + MOVQ srcStride+24(FP), CX + SHLQ $1, CX + +rows512: + MOVQ DI, R11 + MOVQ DX, R12 + MOVQ R8, R13 + +wide512: + CMPQ R13, $32 + JLT half512 + + VMOVDQU32 (R12), Z0 + VPADDSW Z1, Z0, Z0 + VPSRAW X2, Z0, Z0 + VPMAXSW Z3, Z0, Z0 + VPMOVUSWB Z0, (R11) + + ADDQ $64, R12 + ADDQ $32, R11 + SUBQ $32, R13 + JMP wide512 + +half512: + CMPQ R13, $16 + JLT narrow512 + + VMOVDQU (R12), Y0 + VPADDSW Y1, Y0, Y0 + VPSRAW X2, Y0, Y0 + VPACKUSWB Y0, Y0, Y0 + VPERMQ $0xd8, Y0, Y0 + VMOVDQU X0, (R11) + + ADDQ $32, R12 + ADDQ $16, R11 + SUBQ $16, R13 + JMP half512 + +narrow512: + TESTQ R13, R13 + JZ next512 + + VMOVDQU (R12), X0 + VPADDSW X1, X0, X0 + VPSRAW X2, X0, X0 + VPACKUSWB X0, X0, X0 + MOVQ X0, (R11) + + ADDQ $16, R12 + ADDQ $8, R11 + SUBQ $8, R13 + JMP narrow512 + +next512: + ADDQ SI, DI + ADDQ CX, DX + DECQ R9 + JNZ rows512 + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/interpred_arm64.s b/third_party/h265/hevc/interpred_arm64.s new file mode 100644 index 00000000..fd970b05 --- /dev/null +++ b/third_party/h265/hevc/interpred_arm64.s @@ -0,0 +1,54 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define SQADD8H(Vd, Vn, Vm) WORD $(0x4e600c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL8H(Vd, Vn, Vm) WORD $(0x4e604400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SQXTUN8B2(Vd, Vn) WORD $(0x2e212800 | ((Vn) << 5) | (Vd)) + +// func predUni8NEON(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) +// +// 8.5.3.3.4.2 without weights. The add saturates because the Go path sums at +// 32 bits, and a sum that saturates shifts to more than the maximum sample and +// would clip there anyway. w is a multiple of eight. +TEXT ·predUni8NEON(SB), NOSPLIT, $0-56 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD src+16(FP), R2 + MOVD srcStride+24(FP), R3 + MOVD w+32(FP), R4 + MOVD h+40(FP), R5 + MOVD shift+48(FP), R6 + + LSL $1, R3 + + // off = 1 << (shift-1) + SUB $1, R6, R7 + MOVD $1, R8 + LSL R7, R8, R8 + VDUP R8, V1.H8 + + NEG R6, R9 + VDUP R9, V2.H8 + +rows: + MOVD R0, R10 + MOVD R2, R11 + MOVD R4, R12 + +cols: + VLD1.P 16(R11), [V0.H8] + SQADD8H(0, 0, 1) + SSHL8H(0, 0, 2) + SQXTUN8B2(0, 0) + VST1.P [V0.B8], 8(R10) + + SUB $8, R12 + CBNZ R12, cols + + ADD R1, R0 + ADD R3, R2 + SUB $1, R5 + CBNZ R5, rows + + RET diff --git a/third_party/h265/hevc/interpred_bi_amd64.s b/third_party/h265/hevc/interpred_bi_amd64.s new file mode 100644 index 00000000..56ed62ea --- /dev/null +++ b/third_party/h265/hevc/interpred_bi_amd64.s @@ -0,0 +1,172 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func predBi8AVX2(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) +// +// 8.5.3.3.4.2 for two lists. Both adds saturate: the Go path sums at 32 bits, +// and a sum that saturates shifts to more than the maximum sample and would +// clip there anyway. w is a multiple of eight. +TEXT ·predBi8AVX2(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ a+16(FP), DX + MOVQ b+24(FP), R11 + MOVQ w+40(FP), R8 + MOVQ h+48(FP), R9 + MOVQ shift+56(FP), R10 + + // off = 1 << (shift-1), while CL is still free + MOVQ $1, AX + MOVQ R10, CX + DECQ CX + SHLQ CX, AX + MOVQ AX, X1 + + VPBROADCASTW X1, Y1 + MOVQ R10, X2 + + MOVQ srcStride+32(FP), CX + SHLQ $1, CX + +rows: + MOVQ DI, R12 + MOVQ DX, R13 + MOVQ R11, R14 + MOVQ R8, R15 + +wide: + CMPQ R15, $16 + JLT narrow + + VMOVDQU (R13), Y0 + VPADDSW (R14), Y0, Y0 + VPADDSW Y1, Y0, Y0 + VPSRAW X2, Y0, Y0 + VPACKUSWB Y0, Y0, Y0 + VPERMQ $0xd8, Y0, Y0 + VMOVDQU X0, (R12) + + ADDQ $32, R13 + ADDQ $32, R14 + ADDQ $16, R12 + SUBQ $16, R15 + JMP wide + +narrow: + TESTQ R15, R15 + JZ next + + VMOVDQU (R13), X0 + VPADDSW (R14), X0, X0 + VPADDSW X1, X0, X0 + VPSRAW X2, X0, X0 + VPACKUSWB X0, X0, X0 + MOVQ X0, (R12) + + ADDQ $16, R13 + ADDQ $16, R14 + ADDQ $8, R12 + SUBQ $8, R15 + JMP narrow + +next: + ADDQ SI, DI + ADDQ CX, DX + ADDQ CX, R11 + DECQ R9 + JNZ rows + + VZEROUPPER + RET + +// func predBi8AVX512(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) +TEXT ·predBi8AVX512(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ a+16(FP), DX + MOVQ b+24(FP), R11 + MOVQ w+40(FP), R8 + MOVQ h+48(FP), R9 + MOVQ shift+56(FP), R10 + + MOVQ $1, AX + MOVQ R10, CX + DECQ CX + SHLQ CX, AX + MOVQ AX, X1 + + VPBROADCASTW X1, Z1 + MOVQ R10, X2 + VPXORD Z3, Z3, Z3 + + MOVQ srcStride+32(FP), CX + SHLQ $1, CX + +rows512: + MOVQ DI, R12 + MOVQ DX, R13 + MOVQ R11, R14 + MOVQ R8, R15 + +wide512: + CMPQ R15, $32 + JLT half512 + + VMOVDQU32 (R13), Z0 + VPADDSW (R14), Z0, Z0 + VPADDSW Z1, Z0, Z0 + VPSRAW X2, Z0, Z0 + VPMAXSW Z3, Z0, Z0 + VPMOVUSWB Z0, (R12) + + ADDQ $64, R13 + ADDQ $64, R14 + ADDQ $32, R12 + SUBQ $32, R15 + JMP wide512 + +half512: + CMPQ R15, $16 + JLT narrow512 + + VMOVDQU (R13), Y0 + VPADDSW (R14), Y0, Y0 + VPADDSW Y1, Y0, Y0 + VPSRAW X2, Y0, Y0 + VPACKUSWB Y0, Y0, Y0 + VPERMQ $0xd8, Y0, Y0 + VMOVDQU X0, (R12) + + ADDQ $32, R13 + ADDQ $32, R14 + ADDQ $16, R12 + SUBQ $16, R15 + JMP half512 + +narrow512: + TESTQ R15, R15 + JZ next512 + + VMOVDQU (R13), X0 + VPADDSW (R14), X0, X0 + VPADDSW X1, X0, X0 + VPSRAW X2, X0, X0 + VPACKUSWB X0, X0, X0 + MOVQ X0, (R12) + + ADDQ $16, R13 + ADDQ $16, R14 + ADDQ $8, R12 + SUBQ $8, R15 + JMP narrow512 + +next512: + ADDQ SI, DI + ADDQ CX, DX + ADDQ CX, R11 + DECQ R9 + JNZ rows512 + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/interpred_bi_arm64.s b/third_party/h265/hevc/interpred_bi_arm64.s new file mode 100644 index 00000000..09a481a3 --- /dev/null +++ b/third_party/h265/hevc/interpred_bi_arm64.s @@ -0,0 +1,57 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define SQADD8H_(Vd, Vn, Vm) WORD $(0x4e600c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL8H_(Vd, Vn, Vm) WORD $(0x4e604400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SQXTUN8B3(Vd, Vn) WORD $(0x2e212800 | ((Vn) << 5) | (Vd)) + +// func predBi8NEON(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) +// +// 8.5.3.3.4.2 for two lists. Both adds saturate, which matches the 32-bit sum +// the Go path takes once the shift and clip are applied. +TEXT ·predBi8NEON(SB), NOSPLIT, $0-64 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD a+16(FP), R2 + MOVD b+24(FP), R3 + MOVD srcStride+32(FP), R4 + MOVD w+40(FP), R5 + MOVD h+48(FP), R6 + MOVD shift+56(FP), R7 + + LSL $1, R4 + + SUB $1, R7, R8 + MOVD $1, R9 + LSL R8, R9, R9 + VDUP R9, V1.H8 + + NEG R7, R10 + VDUP R10, V2.H8 + +rows: + MOVD R0, R11 + MOVD R2, R12 + MOVD R3, R13 + MOVD R5, R14 + +cols: + VLD1.P 16(R12), [V0.H8] + VLD1.P 16(R13), [V3.H8] + SQADD8H_(0, 0, 3) + SQADD8H_(0, 0, 1) + SSHL8H_(0, 0, 2) + SQXTUN8B3(0, 0) + VST1.P [V0.B8], 8(R11) + + SUB $8, R14 + CBNZ R14, cols + + ADD R1, R0 + ADD R4, R2 + ADD R4, R3 + SUB $1, R6 + CBNZ R6, rows + + RET diff --git a/third_party/h265/hevc/interpred_bi_riscv64.s b/third_party/h265/hevc/interpred_bi_riscv64.s new file mode 100644 index 00000000..b1ef1678 --- /dev/null +++ b/third_party/h265/hevc/interpred_bi_riscv64.s @@ -0,0 +1,67 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func predBi8RVV(dst *uint8, dstStride int, a, b *int16, srcStride, w, h, shift int) +// +// 8.5.3.3.4.2 for two lists, summed at 32 bits as the Go path does, then +// clamped and narrowed. +TEXT ·predBi8RVV(SB), NOSPLIT, $0-64 + MOV dst+0(FP), X10 + MOV dstStride+8(FP), X11 + MOV a+16(FP), X12 + MOV b+24(FP), X13 + MOV srcStride+32(FP), X14 + MOV w+40(FP), X15 + MOV h+48(FP), X16 + MOV shift+56(FP), X17 + + SLLI $1, X14 + + ADD $-1, X17, X18 + MOV $1, X19 + SLL X18, X19, X19 + + MOV $255, X20 + +rows: + MOV X10, X21 + MOV X12, X22 + MOV X13, X23 + MOV X15, X24 + +cols: + VSETVLI X24, E16, MF2, TA, MA, X25 + + VLE16V (X22), V1 + VLE16V (X23), V2 + + VSETVLI X24, E32, M1, TA, MA, X25 + VSEXTVF2 V1, V3 + VSEXTVF2 V2, V4 + VADDVV V4, V3, V3 + VADDVX X19, V3, V3 + VSRAVX X17, V3, V3 + VMAXVX X0, V3, V3 + VMINVX X20, V3, V3 + + VSETVLI X24, E16, MF2, TA, MA, X25 + VNSRLWI $0, V3, V5 + VSETVLI X24, E8, MF4, TA, MA, X25 + VNSRLWI $0, V5, V6 + VSE8V V6, (X21) + + SLLI $1, X25, X26 + ADD X26, X22 + ADD X26, X23 + ADD X25, X21 + SUB X25, X24 + BNEZ X24, cols + + ADD X11, X10 + ADD X14, X12 + ADD X14, X13 + ADD $-1, X16 + BNEZ X16, rows + + RET diff --git a/third_party/h265/hevc/interpred_copy_amd64.s b/third_party/h265/hevc/interpred_copy_amd64.s new file mode 100644 index 00000000..9539f534 --- /dev/null +++ b/third_party/h265/hevc/interpred_copy_amd64.s @@ -0,0 +1,125 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func mcCopy8AVX2(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) +// +// The integer-position case of 8.5.3.3.3, which is a widening copy into the +// 14-bit intermediate. w is a multiple of eight. +TEXT ·mcCopy8AVX2(SB), NOSPLIT, $0-56 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ srcStride+24(FP), CX + MOVQ w+32(FP), R8 + MOVQ h+40(FP), R9 + MOVQ shift+48(FP), R10 + + SHLQ $1, SI + MOVQ R10, X2 + +rows: + MOVQ DI, R11 + MOVQ DX, R12 + MOVQ R8, R13 + +wide: + CMPQ R13, $16 + JLT narrow + + VPMOVZXBW (R12), Y0 + VPSLLW X2, Y0, Y0 + VMOVDQU Y0, (R11) + + ADDQ $16, R12 + ADDQ $32, R11 + SUBQ $16, R13 + JMP wide + +narrow: + TESTQ R13, R13 + JZ next + + VPMOVZXBW (R12), X0 + VPSLLW X2, X0, X0 + VMOVDQU X0, (R11) + + ADDQ $8, R12 + ADDQ $16, R11 + SUBQ $8, R13 + JMP narrow + +next: + ADDQ SI, DI + ADDQ CX, DX + DECQ R9 + JNZ rows + + VZEROUPPER + RET + +// func mcCopy8AVX512(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) +TEXT ·mcCopy8AVX512(SB), NOSPLIT, $0-56 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ srcStride+24(FP), CX + MOVQ w+32(FP), R8 + MOVQ h+40(FP), R9 + MOVQ shift+48(FP), R10 + + SHLQ $1, SI + MOVQ R10, X2 + +rows512: + MOVQ DI, R11 + MOVQ DX, R12 + MOVQ R8, R13 + +wide512: + CMPQ R13, $32 + JLT half512 + + VPMOVZXBW (R12), Z0 + VPSLLW X2, Z0, Z0 + VMOVDQU32 Z0, (R11) + + ADDQ $32, R12 + ADDQ $64, R11 + SUBQ $32, R13 + JMP wide512 + +half512: + CMPQ R13, $16 + JLT narrow512 + + VPMOVZXBW (R12), Y0 + VPSLLW X2, Y0, Y0 + VMOVDQU Y0, (R11) + + ADDQ $16, R12 + ADDQ $32, R11 + SUBQ $16, R13 + JMP half512 + +narrow512: + TESTQ R13, R13 + JZ next512 + + VPMOVZXBW (R12), X0 + VPSLLW X2, X0, X0 + VMOVDQU X0, (R11) + + ADDQ $8, R12 + ADDQ $16, R11 + SUBQ $8, R13 + JMP narrow512 + +next512: + ADDQ SI, DI + ADDQ CX, DX + DECQ R9 + JNZ rows512 + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/interpred_copy_arm64.s b/third_party/h265/hevc/interpred_copy_arm64.s new file mode 100644 index 00000000..88646862 --- /dev/null +++ b/third_party/h265/hevc/interpred_copy_arm64.s @@ -0,0 +1,42 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define USHL8H(Vd, Vn, Vm) WORD $(0x6e604400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func mcCopy8NEON(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) +// +// The integer-position case of 8.5.3.3.3, a widening copy into the 14-bit +// intermediate. w is a multiple of eight. +TEXT ·mcCopy8NEON(SB), NOSPLIT, $0-56 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD src+16(FP), R2 + MOVD srcStride+24(FP), R3 + MOVD w+32(FP), R4 + MOVD h+40(FP), R5 + MOVD shift+48(FP), R6 + + LSL $1, R1 + VDUP R6, V1.H8 + +rows: + MOVD R0, R7 + MOVD R2, R8 + MOVD R4, R9 + +cols: + VLD1.P 8(R8), [V0.B8] + VUXTL V0.B8, V0.H8 + USHL8H(0, 0, 1) + VST1.P [V0.H8], 16(R7) + + SUB $8, R9 + CBNZ R9, cols + + ADD R1, R0 + ADD R3, R2 + SUB $1, R5 + CBNZ R5, rows + + RET diff --git a/third_party/h265/hevc/interpred_copy_riscv64.s b/third_party/h265/hevc/interpred_copy_riscv64.s new file mode 100644 index 00000000..87d5e8b0 --- /dev/null +++ b/third_party/h265/hevc/interpred_copy_riscv64.s @@ -0,0 +1,44 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func mcCopy8RVV(dst *int16, dstStride int, src *uint8, srcStride, w, h, shift int) +// +// The integer-position case of 8.5.3.3.3, a widening copy into the 14-bit +// intermediate. w is a multiple of eight. +TEXT ·mcCopy8RVV(SB), NOSPLIT, $0-56 + MOV dst+0(FP), X10 + MOV dstStride+8(FP), X11 + MOV src+16(FP), X12 + MOV srcStride+24(FP), X13 + MOV w+32(FP), X14 + MOV h+40(FP), X15 + MOV shift+48(FP), X16 + + SLLI $1, X11 + +rows: + MOV X10, X17 + MOV X12, X18 + MOV X14, X19 + +cols: + VSETVLI X19, E16, M1, TA, MA, X20 + + VLE8V (X18), V1 + VZEXTVF2 V1, V2 + VSLLVX X16, V2, V2 + VSE16V V2, (X17) + + SLLI $1, X20, X21 + ADD X21, X17 + ADD X20, X18 + SUB X20, X19 + BNEZ X19, cols + + ADD X11, X10 + ADD X13, X12 + ADD $-1, X15 + BNEZ X15, rows + + RET diff --git a/third_party/h265/hevc/interpred_riscv64.s b/third_party/h265/hevc/interpred_riscv64.s new file mode 100644 index 00000000..9222308c --- /dev/null +++ b/third_party/h265/hevc/interpred_riscv64.s @@ -0,0 +1,63 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func predUni8RVV(dst *uint8, dstStride int, src *int16, srcStride, w, h, shift int) +// +// 8.5.3.3.4.2 without weights. The sum is taken at 32 bits, as the Go path +// does, then clamped and narrowed. The narrowing shift is logical, so the +// clamp has to come first: the unsigned saturating form would turn a negative +// sample into the maximum rather than zero. +TEXT ·predUni8RVV(SB), NOSPLIT, $0-56 + MOV dst+0(FP), X10 + MOV dstStride+8(FP), X11 + MOV src+16(FP), X12 + MOV srcStride+24(FP), X13 + MOV w+32(FP), X14 + MOV h+40(FP), X15 + MOV shift+48(FP), X16 + + SLLI $1, X13 + + // off = 1 << (shift-1) + ADD $-1, X16, X17 + MOV $1, X18 + SLL X17, X18, X18 + + MOV $255, X24 + +rows: + MOV X10, X19 + MOV X12, X20 + MOV X14, X21 + +cols: + VSETVLI X21, E16, MF2, TA, MA, X22 + + VLE16V (X20), V1 + VSETVLI X21, E32, M1, TA, MA, X22 + VSEXTVF2 V1, V2 + VADDVX X18, V2, V2 + VSRAVX X16, V2, V2 + + VMAXVX X0, V2, V2 + VMINVX X24, V2, V2 + + VSETVLI X21, E16, MF2, TA, MA, X22 + VNSRLWI $0, V2, V3 + VSETVLI X21, E8, MF4, TA, MA, X22 + VNSRLWI $0, V3, V4 + VSE8V V4, (X19) + + SLLI $1, X22, X23 + ADD X23, X20 + ADD X22, X19 + SUB X22, X21 + BNEZ X21, cols + + ADD X11, X10 + ADD X13, X12 + ADD $-1, X15 + BNEZ X15, rows + + RET diff --git a/third_party/h265/hevc/interpred_tap_amd64.s b/third_party/h265/hevc/interpred_tap_amd64.s new file mode 100644 index 00000000..630ed0e2 --- /dev/null +++ b/third_party/h265/hevc/interpred_tap_amd64.s @@ -0,0 +1,253 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func mcTap8AVX2(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) +// +// 8-tap interpolation of 8.5.3.3.3 for eight-bit samples, in one direction. +// tapStride is one for the horizontal pass and the source stride for the +// vertical one; src already points at the first tap. shift1 is zero at eight +// bits and every partial sum stays inside int16. w is a multiple of eight. +TEXT ·mcTap8AVX2(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ srcStride+24(FP), CX + MOVQ tapStride+32(FP), R8 + MOVQ w+40(FP), R9 + MOVQ h+48(FP), R10 + MOVQ f+56(FP), R11 + + SHLQ $1, SI + + VPBROADCASTW 0(R11), Y8 + VPBROADCASTW 2(R11), Y9 + VPBROADCASTW 4(R11), Y10 + VPBROADCASTW 6(R11), Y11 + VPBROADCASTW 8(R11), Y12 + VPBROADCASTW 10(R11), Y13 + VPBROADCASTW 12(R11), Y14 + VPBROADCASTW 14(R11), Y15 + +rows8: + MOVQ DI, R12 + MOVQ DX, R13 + MOVQ R9, R14 + +wide8: + CMPQ R14, $16 + JLT narrow8 + + MOVQ R13, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y8, Y1, Y1 + VMOVDQU Y1, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y9, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y10, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y11, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y12, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y13, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y14, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y15, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VMOVDQU Y0, (R12) + + ADDQ $16, R13 + ADDQ $32, R12 + SUBQ $16, R14 + JMP wide8 + +narrow8: + TESTQ R14, R14 + JZ next8 + + MOVQ R13, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X8, X1, X1 + VMOVDQU X1, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X9, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X10, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X11, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X12, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X13, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X14, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X15, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VMOVDQU X0, (R12) + + ADDQ $8, R13 + ADDQ $16, R12 + SUBQ $8, R14 + JMP narrow8 + +next8: + ADDQ SI, DI + ADDQ CX, DX + DECQ R10 + JNZ rows8 + + VZEROUPPER + RET + +// func mcTap4AVX2(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) +// +// 4-tap interpolation of 8.5.3.3.3 for eight-bit samples, in one direction. +// tapStride is one for the horizontal pass and the source stride for the +// vertical one; src already points at the first tap. shift1 is zero at eight +// bits and every partial sum stays inside int16. w is a multiple of eight. +TEXT ·mcTap4AVX2(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ srcStride+24(FP), CX + MOVQ tapStride+32(FP), R8 + MOVQ w+40(FP), R9 + MOVQ h+48(FP), R10 + MOVQ f+56(FP), R11 + + SHLQ $1, SI + + VPBROADCASTW 0(R11), Y8 + VPBROADCASTW 2(R11), Y9 + VPBROADCASTW 4(R11), Y10 + VPBROADCASTW 6(R11), Y11 + +rows4: + MOVQ DI, R12 + MOVQ DX, R13 + MOVQ R9, R14 + +wide4: + CMPQ R14, $16 + JLT narrow4 + + MOVQ R13, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y8, Y1, Y1 + VMOVDQU Y1, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y9, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y10, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVZXBW (R15), Y1 + VPMULLW Y11, Y1, Y1 + VPADDW Y1, Y0, Y0 + ADDQ R8, R15 + + VMOVDQU Y0, (R12) + + ADDQ $16, R13 + ADDQ $32, R12 + SUBQ $16, R14 + JMP wide4 + +narrow4: + TESTQ R14, R14 + JZ next4 + + MOVQ R13, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X8, X1, X1 + VMOVDQU X1, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X9, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X10, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VPMOVZXBW (R15), X1 + VPMULLW X11, X1, X1 + VPADDW X1, X0, X0 + ADDQ R8, R15 + + VMOVDQU X0, (R12) + + ADDQ $8, R13 + ADDQ $16, R12 + SUBQ $8, R14 + JMP narrow4 + +next4: + ADDQ SI, DI + ADDQ CX, DX + DECQ R10 + JNZ rows4 + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/interpred_tap_arm64.s b/third_party/h265/hevc/interpred_tap_arm64.s new file mode 100644 index 00000000..b55e5e9b --- /dev/null +++ b/third_party/h265/hevc/interpred_tap_arm64.s @@ -0,0 +1,152 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define MUL8H(Vd, Vn, Vm) WORD $(0x4e609c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define MLA8H(Vd, Vn, Vm) WORD $(0x4e609400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func mcTap8NEON(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) +// +// 8-tap interpolation of 8.5.3.3.3 for eight-bit samples, in one direction. +TEXT ·mcTap8NEON(SB), NOSPLIT, $0-64 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD src+16(FP), R2 + MOVD srcStride+24(FP), R3 + MOVD tapStride+32(FP), R8 + MOVD w+40(FP), R9 + MOVD h+48(FP), R10 + MOVD f+56(FP), R11 + + LSL $1, R1 + + VLD1R.P 2(R11), [V16.H8] + VLD1R.P 2(R11), [V17.H8] + VLD1R.P 2(R11), [V18.H8] + VLD1R.P 2(R11), [V19.H8] + VLD1R.P 2(R11), [V20.H8] + VLD1R.P 2(R11), [V21.H8] + VLD1R.P 2(R11), [V22.H8] + VLD1R.P 2(R11), [V23.H8] + +rows8: + MOVD R0, R12 + MOVD R2, R13 + MOVD R9, R14 + +cols8: + MOVD R13, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MUL8H(2, 0, 16) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 17) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 18) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 19) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 20) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 21) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 22) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 23) + ADD R8, R15 + + VST1.P [V2.H8], 16(R12) + + ADD $8, R13 + SUB $8, R14 + CBNZ R14, cols8 + + ADD R1, R0 + ADD R3, R2 + SUB $1, R10 + CBNZ R10, rows8 + + RET + +// func mcTap4NEON(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h int, f *int16) +// +// 4-tap interpolation of 8.5.3.3.3 for eight-bit samples, in one direction. +TEXT ·mcTap4NEON(SB), NOSPLIT, $0-64 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD src+16(FP), R2 + MOVD srcStride+24(FP), R3 + MOVD tapStride+32(FP), R8 + MOVD w+40(FP), R9 + MOVD h+48(FP), R10 + MOVD f+56(FP), R11 + + LSL $1, R1 + + VLD1R.P 2(R11), [V16.H8] + VLD1R.P 2(R11), [V17.H8] + VLD1R.P 2(R11), [V18.H8] + VLD1R.P 2(R11), [V19.H8] + +rows4: + MOVD R0, R12 + MOVD R2, R13 + MOVD R9, R14 + +cols4: + MOVD R13, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MUL8H(2, 0, 16) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 17) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 18) + ADD R8, R15 + + VLD1 (R15), [V0.B8] + VUXTL V0.B8, V0.H8 + MLA8H(2, 0, 19) + ADD R8, R15 + + VST1.P [V2.H8], 16(R12) + + ADD $8, R13 + SUB $8, R14 + CBNZ R14, cols4 + + ADD R1, R0 + ADD R3, R2 + SUB $1, R10 + CBNZ R10, rows4 + + RET diff --git a/third_party/h265/hevc/interpred_tap_riscv64.s b/third_party/h265/hevc/interpred_tap_riscv64.s new file mode 100644 index 00000000..102b6bb6 --- /dev/null +++ b/third_party/h265/hevc/interpred_tap_riscv64.s @@ -0,0 +1,62 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func mcTap8RVV(dst *int16, dstStride int, src *uint8, srcStride, tapStride, w, h, taps int, f *int16) +// +// The eight-tap interpolation of 8.5.3.3.3.1 for eight-bit samples, in one +// direction. tapStride is one for the horizontal pass and the source stride +// for the vertical one; src already points at the first tap. shift1 is zero at +// eight bits and every partial sum stays inside int16. +TEXT ·mcTap8RVV(SB), NOSPLIT, $0-72 + MOV dst+0(FP), X10 + MOV dstStride+8(FP), X11 + MOV src+16(FP), X12 + MOV srcStride+24(FP), X13 + MOV tapStride+32(FP), X14 + MOV w+40(FP), X15 + MOV h+48(FP), X16 + MOV taps+56(FP), X28 + MOV f+64(FP), X17 + + SLLI $1, X11 + +rows: + MOV X10, X18 + MOV X12, X19 + MOV X15, X20 + +cols: + VSETVLI X20, E16, M1, TA, MA, X21 + + MOV X19, X22 + MOV X17, X23 + MOV X28, X24 + + VMVVI $0, V4 + +taps: + VLE8V (X22), V1 + VZEXTVF2 V1, V2 + MOVH (X23), X25 + VMACCVX V2, X25, V4 + + ADD X14, X22 + ADD $2, X23 + ADD $-1, X24 + BNEZ X24, taps + + VSE16V V4, (X18) + + SLLI $1, X21, X26 + ADD X26, X18 + ADD X21, X19 + SUB X21, X20 + BNEZ X20, cols + + ADD X11, X10 + ADD X13, X12 + ADD $-1, X16 + BNEZ X16, rows + + RET diff --git a/third_party/h265/hevc/interpred_tapv_amd64.s b/third_party/h265/hevc/interpred_tapv_amd64.s new file mode 100644 index 00000000..0af1166c --- /dev/null +++ b/third_party/h265/hevc/interpred_tapv_amd64.s @@ -0,0 +1,193 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func mcTapV16x8AVX2(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) +// +// The vertical half of the two-pass 8-tap interpolation, reading the +// horizontal pass at sixteen bits. The products need 32 bits, so this widens +// rather than staying in int16 as the first pass does. w is a multiple of +// eight. +TEXT ·mcTapV16x8AVX2(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ srcStride+24(FP), R8 + MOVQ w+32(FP), R9 + MOVQ h+40(FP), R10 + MOVQ shift+48(FP), R14 + MOVQ f+56(FP), R11 + + SHLQ $1, SI + SHLQ $1, R8 + MOVQ R14, X2 + + MOVWQSX 0(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y8 + MOVWQSX 2(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y9 + MOVWQSX 4(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y10 + MOVWQSX 6(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y11 + MOVWQSX 8(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y12 + MOVWQSX 10(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y13 + MOVWQSX 12(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y14 + MOVWQSX 14(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y15 + +rows8: + MOVQ DI, R12 + MOVQ DX, R13 + MOVQ R9, R14 + +cols8: + MOVQ R13, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y8, Y1, Y1 + VMOVDQU Y1, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y9, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y10, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y11, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y12, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y13, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y14, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y15, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPSRAD X2, Y0, Y0 + VPACKSSDW Y0, Y0, Y0 + VPERMQ $0xd8, Y0, Y0 + VMOVDQU X0, (R12) + + ADDQ $16, R13 + ADDQ $16, R12 + SUBQ $8, R14 + JNZ cols8 + + ADDQ SI, DI + ADDQ R8, DX + DECQ R10 + JNZ rows8 + + VZEROUPPER + RET + +// func mcTapV16x4AVX2(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) +// +// The vertical half of the two-pass 4-tap interpolation, reading the +// horizontal pass at sixteen bits. The products need 32 bits, so this widens +// rather than staying in int16 as the first pass does. w is a multiple of +// eight. +TEXT ·mcTapV16x4AVX2(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ dstStride+8(FP), SI + MOVQ src+16(FP), DX + MOVQ srcStride+24(FP), R8 + MOVQ w+32(FP), R9 + MOVQ h+40(FP), R10 + MOVQ shift+48(FP), R14 + MOVQ f+56(FP), R11 + + SHLQ $1, SI + SHLQ $1, R8 + MOVQ R14, X2 + + MOVWQSX 0(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y8 + MOVWQSX 2(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y9 + MOVWQSX 4(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y10 + MOVWQSX 6(R11), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y11 + +rows4: + MOVQ DI, R12 + MOVQ DX, R13 + MOVQ R9, R14 + +cols4: + MOVQ R13, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y8, Y1, Y1 + VMOVDQU Y1, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y9, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y10, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPMOVSXWD (R15), Y1 + VPMULLD Y11, Y1, Y1 + VPADDD Y1, Y0, Y0 + ADDQ R8, R15 + + VPSRAD X2, Y0, Y0 + VPACKSSDW Y0, Y0, Y0 + VPERMQ $0xd8, Y0, Y0 + VMOVDQU X0, (R12) + + ADDQ $16, R13 + ADDQ $16, R12 + SUBQ $8, R14 + JNZ cols4 + + ADDQ SI, DI + ADDQ R8, DX + DECQ R10 + JNZ rows4 + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/interpred_tapv_arm64.s b/third_party/h265/hevc/interpred_tapv_arm64.s new file mode 100644 index 00000000..5f6d35b4 --- /dev/null +++ b/third_party/h265/hevc/interpred_tapv_arm64.s @@ -0,0 +1,173 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define SMULL4S(Vd, Vn, Vm) WORD $(0x0e60c000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMULL2_4S(Vd, Vn, Vm) WORD $(0x4e60c000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMLAL4S_(Vd, Vn, Vm) WORD $(0x0e608000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMLAL2_4S_(Vd, Vn, Vm) WORD $(0x4e608000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL4S__(Vd, Vn, Vm) WORD $(0x4ea04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SQXTN4H__(Vd, Vn) WORD $(0x0e614800 | ((Vn) << 5) | (Vd)) +#define SQXTN2_8H__(Vd, Vn) WORD $(0x4e614800 | ((Vn) << 5) | (Vd)) + +// func mcTapV16x8NEON(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) +// +// The vertical half of the two-pass 8-tap interpolation, at 32 bits. +TEXT ·mcTapV16x8NEON(SB), NOSPLIT, $0-64 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD src+16(FP), R2 + MOVD srcStride+24(FP), R8 + MOVD w+32(FP), R9 + MOVD h+40(FP), R10 + MOVD shift+48(FP), R6 + MOVD f+56(FP), R11 + + LSL $1, R1 + LSL $1, R8 + + NEG R6, R7 + VDUP R7, V4.S4 + + VLD1R.P 2(R11), [V16.H8] + VLD1R.P 2(R11), [V17.H8] + VLD1R.P 2(R11), [V18.H8] + VLD1R.P 2(R11), [V19.H8] + VLD1R.P 2(R11), [V20.H8] + VLD1R.P 2(R11), [V21.H8] + VLD1R.P 2(R11), [V22.H8] + VLD1R.P 2(R11), [V23.H8] + +rows8: + MOVD R0, R12 + MOVD R2, R13 + MOVD R9, R14 + +cols8: + MOVD R13, R15 + + VLD1 (R15), [V0.H8] + SMULL4S(2, 0, 16) + SMULL2_4S(3, 0, 16) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 17) + SMLAL2_4S_(3, 0, 17) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 18) + SMLAL2_4S_(3, 0, 18) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 19) + SMLAL2_4S_(3, 0, 19) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 20) + SMLAL2_4S_(3, 0, 20) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 21) + SMLAL2_4S_(3, 0, 21) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 22) + SMLAL2_4S_(3, 0, 22) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 23) + SMLAL2_4S_(3, 0, 23) + ADD R8, R15 + + SSHL4S__(2, 2, 4) + SSHL4S__(3, 3, 4) + SQXTN4H__(5, 2) + SQXTN2_8H__(5, 3) + VST1.P [V5.H8], 16(R12) + + ADD $16, R13 + SUB $8, R14 + CBNZ R14, cols8 + + ADD R1, R0 + ADD R8, R2 + SUB $1, R10 + CBNZ R10, rows8 + + RET + +// func mcTapV16x4NEON(dst *int16, dstStride int, src *int16, srcStride, w, h, shift int, f *int16) +// +// The vertical half of the two-pass 4-tap interpolation, at 32 bits. +TEXT ·mcTapV16x4NEON(SB), NOSPLIT, $0-64 + MOVD dst+0(FP), R0 + MOVD dstStride+8(FP), R1 + MOVD src+16(FP), R2 + MOVD srcStride+24(FP), R8 + MOVD w+32(FP), R9 + MOVD h+40(FP), R10 + MOVD shift+48(FP), R6 + MOVD f+56(FP), R11 + + LSL $1, R1 + LSL $1, R8 + + NEG R6, R7 + VDUP R7, V4.S4 + + VLD1R.P 2(R11), [V16.H8] + VLD1R.P 2(R11), [V17.H8] + VLD1R.P 2(R11), [V18.H8] + VLD1R.P 2(R11), [V19.H8] + +rows4: + MOVD R0, R12 + MOVD R2, R13 + MOVD R9, R14 + +cols4: + MOVD R13, R15 + + VLD1 (R15), [V0.H8] + SMULL4S(2, 0, 16) + SMULL2_4S(3, 0, 16) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 17) + SMLAL2_4S_(3, 0, 17) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 18) + SMLAL2_4S_(3, 0, 18) + ADD R8, R15 + + VLD1 (R15), [V0.H8] + SMLAL4S_(2, 0, 19) + SMLAL2_4S_(3, 0, 19) + ADD R8, R15 + + SSHL4S__(2, 2, 4) + SSHL4S__(3, 3, 4) + SQXTN4H__(5, 2) + SQXTN2_8H__(5, 3) + VST1.P [V5.H8], 16(R12) + + ADD $16, R13 + SUB $8, R14 + CBNZ R14, cols4 + + ADD R1, R0 + ADD R8, R2 + SUB $1, R10 + CBNZ R10, rows4 + + RET diff --git a/third_party/h265/hevc/interpred_tapv_riscv64.s b/third_party/h265/hevc/interpred_tapv_riscv64.s new file mode 100644 index 00000000..7a662593 --- /dev/null +++ b/third_party/h265/hevc/interpred_tapv_riscv64.s @@ -0,0 +1,69 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func mcTapV16RVV(dst *int16, dstStride int, src *int16, srcStride, w, h, shift, taps int, f *int16) +// +// The vertical half of the two-pass eight-tap interpolation, reading the +// horizontal pass at sixteen bits. The products need 32 bits, so this widens +// rather than staying in int16 as the first pass does. +TEXT ·mcTapV16RVV(SB), NOSPLIT, $0-72 + MOV dst+0(FP), X10 + MOV dstStride+8(FP), X11 + MOV src+16(FP), X12 + MOV srcStride+24(FP), X13 + MOV w+32(FP), X14 + MOV h+40(FP), X15 + MOV shift+48(FP), X16 + MOV taps+56(FP), X28 + MOV f+64(FP), X17 + + SLLI $1, X11 + SLLI $1, X13 + +rows: + MOV X10, X18 + MOV X12, X19 + MOV X14, X20 + +cols: + VSETVLI X20, E32, M1, TA, MA, X21 + + MOV X19, X22 + MOV X17, X23 + MOV X28, X24 + + VMVVI $0, V4 + +taps: + VSETVLI X20, E16, MF2, TA, MA, X21 + VLE16V (X22), V1 + VSETVLI X20, E32, M1, TA, MA, X21 + VSEXTVF2 V1, V2 + MOVH (X23), X25 + VMACCVX V2, X25, V4 + + ADD X13, X22 + ADD $2, X23 + ADD $-1, X24 + BNEZ X24, taps + + VSRAVX X16, V4, V4 + + VSETVLI X20, E16, MF2, TA, MA, X21 + VNSRLWI $0, V4, V5 + VSE16V V5, (X18) + VSETVLI X20, E32, M1, TA, MA, X21 + + SLLI $1, X21, X26 + ADD X26, X18 + ADD X26, X19 + SUB X21, X20 + BNEZ X20, cols + + ADD X11, X10 + ADD X13, X12 + ADD $-1, X15 + BNEZ X15, rows + + RET diff --git a/third_party/h265/hevc/intrapred.go b/third_party/h265/hevc/intrapred.go new file mode 100644 index 00000000..e0dfd7d6 --- /dev/null +++ b/third_party/h265/hevc/intrapred.go @@ -0,0 +1,356 @@ +package hevc + +type pixel interface { + ~uint8 | ~uint16 +} + +const ( + intraPlanar = 0 + intraDC = 1 + intraHor = 10 + intraVer = 26 +) + +// Table 8-4, indexed by predModeIntra - 2. +var intraPredAngle = [33]int32{ + 32, 26, 21, 17, 13, 9, 5, 2, 0, -2, -5, -9, -13, -17, -21, -26, -32, + -26, -21, -17, -13, -9, -5, -2, 0, 2, 5, 9, 13, 17, 21, 26, 32, +} + +// Table 8-5, indexed by predModeIntra - 11. +var intraInvAngle = [15]int32{ + -4096, -1638, -910, -630, -482, -390, -315, -256, -315, -390, -482, -630, -910, -1638, -4096, +} + +// refSamples holds p[][] flattened in the order 8.4.4.2.2 scans it: the left +// column bottom to top, the corner, then the top row left to right. +type refSamples struct { + s [4*32 + 1]int32 + n int +} + +func (r *refSamples) corner() int32 { return r.s[2*r.n] } +func (r *refSamples) top(x int) int32 { return r.s[2*r.n+1+x] } +func (r *refSamples) left(y int) int32 { return r.s[2*r.n-1-y] } +func (r *refSamples) setTop(x int, v int32) { r.s[2*r.n+1+x] = v } +func (r *refSamples) setLeft(y int, v int32) { r.s[2*r.n-1-y] = v } + +func (r *refSamples) copyFrom(src *refSamples) { + r.n = src.n + copy(r.s[:4*src.n+1], src.s[:4*src.n+1]) +} + +// substitute is 8.4.4.2.2. avail runs in the same order as s. +func (r *refSamples) substitute(avail []bool, bitDepth int) { + n := 4*r.n + 1 + + first := -1 + + for i := range n { + if avail[i] { + first = i + + break + } + } + + if first < 0 { + v := int32(1) << (bitDepth - 1) + for i := range n { + r.s[i] = v + } + + return + } + + r.s[0] = r.s[first] + + for i := 1; i < n; i++ { + if !avail[i] { + r.s[i] = r.s[i-1] + } + } +} + +// filterFlag is the derivation in 8.4.4.2.3. +func filterFlag(mode, n, cIdx int, sps *sps) bool { + if cIdx != 0 && sps.chromaArrayType() != 3 { + return false + } + + if mode == intraDC || n == 4 { + return false + } + + var thres int + + switch n { + case 8: + thres = 7 + case 16: + thres = 1 + case 32: + thres = 0 + default: + return false + } + + return min(abs(mode-intraVer), abs(mode-intraHor)) > thres +} + +func abs(v int) int { + if v < 0 { + return -v + } + + return v +} + +// filterRef is 8.4.4.2.3. +func filterRef(r *refSamples, mode, cIdx, bitDepth int, sps *sps) { + if sps.intraSmoothingDisabled || !filterFlag(mode, r.n, cIdx, sps) { + return + } + + n := r.n + + if sps.strongIntraSmoothing && cIdx == 0 && n == 32 { + lim := int32(1) << (bitDepth - 5) + + if absI32(r.corner()+r.top(2*n-1)-2*r.top(n-1)) < lim && + absI32(r.corner()+r.left(2*n-1)-2*r.left(n-1)) < lim { + c, tr, bl := r.corner(), r.top(2*n-1), r.left(2*n-1) + + for i := range 2*n - 1 { + r.setLeft(i, ((63-int32(i))*c+int32(i+1)*bl+32)>>6) + r.setTop(i, ((63-int32(i))*c+int32(i+1)*tr+32)>>6) + } + + return + } + } + + var f [4*32 + 1]int32 + + f[0] = r.s[0] + f[4*n] = r.s[4*n] + + for i := 1; i < 4*n; i++ { + f[i] = (r.s[i-1] + 2*r.s[i] + r.s[i+1] + 2) >> 2 + } + + copy(r.s[:4*n+1], f[:4*n+1]) +} + +func absI32(v int32) int32 { + if v < 0 { + return -v + } + + return v +} + +func clip1[P pixel](v int32, bitDepth int) P { + return P(clip3(v, 0, 1<= 8 { + if p, ok := any(dst).([]uint8); ok { + k(p[off:], stride, r, shift) + + return + } + } + + predPlanarGo(dst, off, stride, r, n, shift) +} + +func predPlanarGo[P pixel](dst []P, off, stride int, r *refSamples, n, shift int) { + tr, bl := r.top(n), r.left(n) + + for y := range n { + l := r.left(y) + + for x := range n { + v := (int32(n-1-x)*l + int32(x+1)*tr + + int32(n-1-y)*r.top(x) + int32(y+1)*bl + int32(n)) >> shift + dst[off+y*stride+x] = P(v) + } + } +} + +func predDC[P pixel](dst []P, off, stride int, r *refSamples, cIdx int) { + n := r.n + + var sum int32 + for i := range n { + sum += r.top(i) + r.left(i) + } + + dc := (sum + int32(n)) >> (log2(n) + 1) + + for y := range n { + for x := range n { + dst[off+y*stride+x] = P(dc) + } + } + + if cIdx != 0 || n >= 32 { + return + } + + dst[off] = P((r.left(0) + 2*dc + r.top(0) + 2) >> 2) + + for x := 1; x < n; x++ { + dst[off+x] = P((r.top(x) + 3*dc + 2) >> 2) + } + + for y := 1; y < n; y++ { + dst[off+y*stride] = P((r.left(y) + 3*dc + 2) >> 2) + } +} + +func predAngular[P pixel](dst []P, off, stride int, r *refSamples, mode, cIdx, bitDepth int) { + n := r.n + angle := intraPredAngle[mode-2] + + var ref [3 * 32 * 2]int32 + + // The corner sits at 2n in both r.s and ref. + base := 2 * n + + vertical := mode >= 18 + + m := n + if angle >= 0 { + m = 2 * n + } + + if vertical { + copy(ref[base:base+m+1], r.s[base:base+m+1]) + } else { + ref[base] = r.s[base] + + for x := 1; x <= m; x++ { + ref[base+x] = r.s[base-x] + } + } + + if angle < 0 { + if lim := int(int32(n) * angle >> 5); lim < -1 { + inv := intraInvAngle[mode-11] + + for x := -1; x >= lim; x-- { + i := int((int32(x)*inv + 128) >> 8) + + switch { + case i == 0: + ref[base+x] = r.s[base] + case vertical: + ref[base+x] = r.s[base-i] + default: + ref[base+x] = r.s[base+i] + } + } + } + } + + if p, ok := any(dst).([]uint8); ok && predAngular8(p[off:], stride, ref[base:], int(angle), n, vertical) { + finishAngular(dst, off, stride, r, mode, cIdx, bitDepth) + + return + } + + for b := range n { + idx := int(int32(b+1) * angle >> 5) + fact := int32(b+1) * angle & 31 + row := ref[base+idx+1 : base+idx+2+n] + + switch { + case fact == 0 && vertical: + out := dst[off+b*stride : off+b*stride+n] + + for a := range out { + out[a] = P(row[a]) + } + case fact == 0: + for a := range n { + dst[off+a*stride+b] = P(row[a]) + } + case vertical: + out := dst[off+b*stride : off+b*stride+n] + + for a := range out { + out[a] = P(((32-fact)*row[a] + fact*row[a+1] + 16) >> 5) + } + default: + for a := range n { + dst[off+a*stride+b] = P(((32-fact)*row[a] + fact*row[a+1] + 16) >> 5) + } + } + } + + finishAngular(dst, off, stride, r, mode, cIdx, bitDepth) +} + +// predAngular8 runs the kernel. A horizontal mode is the same prediction +// transposed, so it is taken that way and turned back. +func predAngular8(dst []uint8, stride int, ref []int32, angle, n int, vertical bool) bool { + if vertical { + return predAngularRows(dst, stride, ref, angle, n) + } + + var tmp [32 * 32]uint8 + + if !predAngularRows(tmp[:], n, ref, angle, n) { + return false + } + + for y := range n { + row := dst[y*stride : y*stride+n] + + for x := range row { + row[x] = tmp[x*n+y] + } + } + + return true +} + +// finishAngular is the boundary smoothing of 8.4.4.2.6. +func finishAngular[P pixel](dst []P, off, stride int, r *refSamples, mode, cIdx, bitDepth int) { + n := r.n + if cIdx != 0 || n >= 32 { + return + } + + if mode == intraVer { + for y := range n { + dst[off+y*stride] = clip1[P](r.top(0)+(r.left(y)-r.corner())>>1, bitDepth) + } + + return + } + + if mode == intraHor { + for x := range n { + dst[off+x] = clip1[P](r.left(0)+(r.top(x)-r.corner())>>1, bitDepth) + } + } +} diff --git a/third_party/h265/hevc/intrapred_amd64.s b/third_party/h265/hevc/intrapred_amd64.s new file mode 100644 index 00000000..1de4d527 --- /dev/null +++ b/third_party/h265/hevc/intrapred_amd64.s @@ -0,0 +1,168 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +DATA lane<>+0x00(SB)/4, $0 +DATA lane<>+0x04(SB)/4, $1 +DATA lane<>+0x08(SB)/4, $2 +DATA lane<>+0x0c(SB)/4, $3 +DATA lane<>+0x10(SB)/4, $4 +DATA lane<>+0x14(SB)/4, $5 +DATA lane<>+0x18(SB)/4, $6 +DATA lane<>+0x1c(SB)/4, $7 +GLOBL lane<>(SB), RODATA|NOPTR, $32 + +DATA pack<>+0x00(SB)/8, $0x808080800c080400 +DATA pack<>+0x08(SB)/8, $0x8080808080808080 +DATA pack<>+0x10(SB)/8, $0x808080800c080400 +DATA pack<>+0x18(SB)/8, $0x8080808080808080 +GLOBL pack<>(SB), RODATA|NOPTR, $32 + +// func predPlanar8AVX2(dst *uint8, stride int, top *int32, left *int32, tr, bl, n, shift int) +// +// 8.4.4.2.4. left is read backwards, the order 8.4.4.2.2 stores it in, so +// left[-y] is the sample for row y. The result needs no clip. +TEXT ·predPlanar8AVX2(SB), NOSPLIT, $0-64 + MOVQ dst+0(FP), DI + MOVQ stride+8(FP), SI + MOVQ top+16(FP), DX + MOVQ left+24(FP), CX + MOVQ n+48(FP), R8 + MOVQ shift+56(FP), R9 + + VPBROADCASTD tr+32(FP), Y10 + VPBROADCASTD n+48(FP), Y12 + VMOVDQU lane<>(SB), Y11 + VMOVDQU pack<>(SB), Y13 + MOVQ R9, X14 + + XORQ R10, R10 + +rows: + // l = left[-y], w = n-1-y, c = (y+1)*bl + n + MOVQ R10, AX + SHLQ $2, AX + SUBQ AX, CX + VPBROADCASTD (CX), Y0 + ADDQ AX, CX + + MOVQ R8, AX + SUBQ R10, AX + DECQ AX + MOVQ AX, X1 + VPBROADCASTD X1, Y1 + + MOVQ R10, AX + INCQ AX + IMULQ bl+40(FP), AX + ADDQ R8, AX + MOVQ AX, X2 + VPBROADCASTD X2, Y2 + + MOVQ DI, R11 + MOVQ DX, R12 + XORQ R13, R13 + +cols: + // xv = lane + base + 1, and n - xv is n-1-x. + MOVQ R13, AX + INCQ AX + MOVQ AX, X3 + VPBROADCASTD X3, Y3 + VPADDD Y11, Y3, Y3 + VPSUBD Y3, Y12, Y4 + + VPMULLD Y0, Y4, Y4 + VPMULLD Y10, Y3, Y3 + VPADDD Y3, Y4, Y4 + + VMOVDQU (R12), Y5 + VPMULLD Y1, Y5, Y5 + VPADDD Y5, Y4, Y4 + + VPADDD Y2, Y4, Y4 + VPSRAD X14, Y4, Y4 + + VPSHUFB Y13, Y4, Y4 + VEXTRACTI128 $1, Y4, X6 + MOVL X4, (R11) + MOVL X6, 4(R11) + + ADDQ $32, R12 + ADDQ $8, R11 + ADDQ $8, R13 + CMPQ R13, R8 + JLT cols + + ADDQ SI, DI + INCQ R10 + CMPQ R10, R8 + JLT rows + + VZEROUPPER + RET + +// func predAngular8AVX2(dst *uint8, stride int, ref *int32, angle, n int) +// +// The interpolation of 8.4.4.2.6 for a vertical mode, eight outputs at a time. +// ref is the corner, and a negative angle reads the n entries before it. The +// weights sum to 32, so the result is a sample again and needs no clamp, and a +// zero second weight lands on the sample itself. +TEXT ·predAngular8AVX2(SB), NOSPLIT, $0-40 + MOVQ dst+0(FP), DI + MOVQ stride+8(FP), R8 + MOVQ ref+16(FP), SI + MOVQ angle+24(FP), R9 + MOVQ n+32(FP), CX + + MOVL $16, AX + VMOVD AX, X15 + VPBROADCASTD X15, Y15 + + XORQ BX, BX + MOVQ DI, R12 + +rowloop: + LEAQ 1(BX), AX + IMULQ R9, AX + MOVQ AX, DX + SARQ $5, DX + ANDQ $31, AX + + LEAQ 4(SI)(DX*4), R10 + + MOVQ $32, R11 + SUBQ AX, R11 + VMOVD R11, X0 + VPBROADCASTD X0, Y0 + VMOVD AX, X1 + VPBROADCASTD X1, Y1 + + XORQ R13, R13 + +mixloop: + VMOVDQU (R10)(R13*4), Y2 + VMOVDQU 4(R10)(R13*4), Y3 + VPMULLD Y0, Y2, Y2 + VPMULLD Y1, Y3, Y3 + VPADDD Y3, Y2, Y2 + VPADDD Y15, Y2, Y2 + VPSRAD $5, Y2, Y2 + + VPACKSSDW Y2, Y2, Y2 + VPERMQ $0x08, Y2, Y2 + VPACKUSWB X2, X2, X2 + VMOVQ X2, (R12)(R13*1) + + ADDQ $8, R13 + CMPQ R13, CX + JLT mixloop + +nextrow: + ADDQ R8, R12 + INCQ BX + CMPQ BX, CX + JLT rowloop + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/intrapred_arm64.s b/third_party/h265/hevc/intrapred_arm64.s new file mode 100644 index 00000000..152c65c1 --- /dev/null +++ b/third_party/h265/hevc/intrapred_arm64.s @@ -0,0 +1,184 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define MUL4S(Vd, Vn, Vm) WORD $(0x4ea09c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL4S_(Vd, Vn, Vm) WORD $(0x4ea04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SQXTN4H_(Vd, Vn) WORD $(0x0e614800 | ((Vn) << 5) | (Vd)) +#define SQXTN2_8H_(Vd, Vn) WORD $(0x4e614800 | ((Vn) << 5) | (Vd)) +#define SQXTUN8B_(Vd, Vn) WORD $(0x2e212800 | ((Vn) << 5) | (Vd)) + +DATA lanes<>+0x00(SB)/4, $0 +DATA lanes<>+0x04(SB)/4, $1 +DATA lanes<>+0x08(SB)/4, $2 +DATA lanes<>+0x0c(SB)/4, $3 +DATA lanes<>+0x10(SB)/4, $4 +DATA lanes<>+0x14(SB)/4, $5 +DATA lanes<>+0x18(SB)/4, $6 +DATA lanes<>+0x1c(SB)/4, $7 +GLOBL lanes<>(SB), RODATA|NOPTR, $32 + +// func predPlanar8NEON(dst *uint8, stride int, top *int32, left *int32, tr, bl, n, shift int) +// +// 8.4.4.2.4. left is read backwards, the order 8.4.4.2.2 stores it in. +TEXT ·predPlanar8NEON(SB), NOSPLIT, $0-64 + MOVD dst+0(FP), R0 + MOVD stride+8(FP), R1 + MOVD top+16(FP), R2 + MOVD left+24(FP), R3 + MOVD tr+32(FP), R4 + MOVD bl+40(FP), R5 + MOVD n+48(FP), R6 + MOVD shift+56(FP), R7 + + MOVD $lanes<>(SB), R8 + VLD1 (R8), [V16.S4, V17.S4] + + VDUP R6, V18.S4 + VDUP R4, V19.S4 + + NEG R7, R9 + VDUP R9, V20.S4 + + MOVD $0, R10 + +rows: + // l = left[-y], w = n-1-y, c = (y+1)*bl + n + LSL $2, R10, R11 + SUB R11, R3, R12 + MOVW (R12), R13 + VDUP R13, V21.S4 + + SUB R10, R6, R14 + SUB $1, R14 + VDUP R14, V22.S4 + + ADD $1, R10, R15 + MUL R5, R15, R15 + ADD R6, R15 + VDUP R15, V23.S4 + + MOVD R0, R16 + MOVD R2, R17 + MOVD $0, R19 + +cols: + // xv = lanes + base + 1, and n - xv is n-1-x. + ADD $1, R19, R20 + VDUP R20, V0.S4 + VADD V16.S4, V0.S4, V1.S4 + VADD V17.S4, V0.S4, V2.S4 + VSUB V1.S4, V18.S4, V3.S4 + VSUB V2.S4, V18.S4, V4.S4 + + MUL4S(3, 3, 21) + MUL4S(4, 4, 21) + MUL4S(1, 1, 19) + MUL4S(2, 2, 19) + VADD V1.S4, V3.S4, V3.S4 + VADD V2.S4, V4.S4, V4.S4 + + VLD1.P 32(R17), [V5.S4, V6.S4] + MUL4S(5, 5, 22) + MUL4S(6, 6, 22) + VADD V5.S4, V3.S4, V3.S4 + VADD V6.S4, V4.S4, V4.S4 + + VADD V23.S4, V3.S4, V3.S4 + VADD V23.S4, V4.S4, V4.S4 + SSHL4S_(3, 3, 20) + SSHL4S_(4, 4, 20) + + SQXTN4H_(7, 3) + SQXTN2_8H_(7, 4) + SQXTUN8B_(7, 7) + VST1.P [V7.B8], 8(R16) + + ADD $8, R19 + CMP R6, R19 + BLT cols + + ADD R1, R0 + ADD $1, R10 + CMP R6, R10 + BLT rows + + RET + +// func predAngular8NEON(dst *uint8, stride int, ref *int32, angle, n int) +// +// The interpolation of 8.4.4.2.6 for a vertical mode, eight outputs at a time. +// ref is the corner, and a negative angle reads the n entries before it. The +// weights sum to 32, so the result is a sample again and needs no clamp, and a +// zero second weight lands on the sample itself. +TEXT ·predAngular8NEON(SB), NOSPLIT, $0-40 + MOVD dst+0(FP), R0 + MOVD stride+8(FP), R1 + MOVD ref+16(FP), R2 + MOVD angle+24(FP), R3 + MOVD n+32(FP), R4 + + MOVD $16, R5 + VDUP R5, V16.S4 + + MOVD $0, R6 + MOVD R0, R7 + +rowloop: + ADD $1, R6, R8 + MUL R3, R8, R8 + ASR $5, R8, R9 + AND $31, R8, R8 + + LSL $2, R9, R10 + ADD R2, R10 + ADD $4, R10 + ADD $4, R10, R11 + + MOVD $32, R12 + SUB R8, R12, R12 + VDUP R12, V17.S4 + VDUP R8, V18.S4 + + MOVD $0, R13 + MOVD R10, R14 + MOVD R11, R15 + MOVD R7, R16 + +mixloop: + VLD1 (R14), [V2.S4, V3.S4] + VLD1 (R15), [V4.S4, V5.S4] + + MUL4S(2, 2, 17) + MUL4S(3, 3, 17) + MUL4S(4, 4, 18) + MUL4S(5, 5, 18) + + VADD V4.S4, V2.S4, V2.S4 + VADD V5.S4, V3.S4, V3.S4 + VADD V16.S4, V2.S4, V2.S4 + VADD V16.S4, V3.S4, V3.S4 + + VUSHR $5, V2.S4, V2.S4 + VUSHR $5, V3.S4, V3.S4 + + SQXTN4H_(6, 2) + SQXTN2_8H_(6, 3) + SQXTUN8B_(7, 6) + + VST1 [V7.B8], (R16) + + ADD $32, R14 + ADD $32, R15 + ADD $8, R16 + ADD $8, R13 + CMP R4, R13 + BLT mixloop + +nextrow: + ADD $1, R6 + ADD R1, R7 + CMP R4, R6 + BLT rowloop + + RET diff --git a/third_party/h265/hevc/intrapred_riscv64.s b/third_party/h265/hevc/intrapred_riscv64.s new file mode 100644 index 00000000..10a547fb --- /dev/null +++ b/third_party/h265/hevc/intrapred_riscv64.s @@ -0,0 +1,137 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func predPlanar8RVV(dst *uint8, stride int, top *int32, left *int32, tr, bl, n, shift int) +// +// 8.4.4.2.4. left is read backwards, the order 8.4.4.2.2 stores it in. +TEXT ·predPlanar8RVV(SB), NOSPLIT, $0-64 + MOV dst+0(FP), X10 + MOV stride+8(FP), X11 + MOV top+16(FP), X12 + MOV left+24(FP), X13 + MOV tr+32(FP), X14 + MOV bl+40(FP), X15 + MOV n+48(FP), X16 + MOV shift+56(FP), X17 + + MOV $0, X18 + +rows: + // l = left[-y], w = n-1-y, c = (y+1)*bl + n + SLLI $2, X18, X19 + SUB X19, X13, X20 + MOVW (X20), X21 + + SUB X18, X16, X22 + ADD $-1, X22 + + ADD $1, X18, X23 + MUL X15, X23, X23 + ADD X16, X23 + + MOV X10, X24 + MOV X12, X25 + MOV X16, X26 + MOV $0, X28 + +cols: + VSETVLI X26, E32, M1, TA, MA, X30 + + // v = l*(n-1-x) + tr*(x+1) + w*top[x] + c + VIDV V1 + VADDVX X28, V1, V1 + VADDVI $1, V1, V1 + VRSUBVX X16, V1, V2 + VMULVX X21, V2, V2 + VMULVX X14, V1, V1 + VADDVV V1, V2, V2 + + VLE32V (X25), V3 + VMACCVX V3, X22, V2 + + VADDVX X23, V2, V2 + VSRAVX X17, V2, V2 + + VSETVLI X26, E16, MF2, TA, MA, X30 + VNSRLWI $0, V2, V4 + VSETVLI X26, E8, MF4, TA, MA, X30 + VNSRLWI $0, V4, V5 + VSE8V V5, (X24) + + SLLI $2, X30, X31 + ADD X31, X25 + ADD X30, X24 + ADD X30, X28 + SUB X30, X26 + BNEZ X26, cols + + ADD X11, X10 + ADD $1, X18 + BLT X18, X16, rows + + RET + +// func predAngular8RVV(dst *uint8, stride int, ref *int32, angle, n int) +// +// The interpolation of 8.4.4.2.6 for a vertical mode. ref is the corner, and a +// negative angle reads the n entries before it. The weights sum to 32, so the +// result is a sample again, the narrowing shifts need no clamp, and a zero +// second weight lands on the sample itself. +TEXT ·predAngular8RVV(SB), NOSPLIT, $0-40 + MOV dst+0(FP), X10 + MOV stride+8(FP), X11 + MOV ref+16(FP), X12 + MOV angle+24(FP), X13 + MOV n+32(FP), X14 + + MOV $16, X15 + MOV $0, X16 + MOV X10, X17 + +rowloop: + ADD $1, X16, X18 + MUL X13, X18, X18 + SRAI $5, X18, X19 + ANDI $31, X18, X18 + + SLLI $2, X19, X20 + ADD X12, X20 + ADD $4, X20 + ADD $4, X20, X21 + + MOV $32, X22 + SUB X18, X22, X22 + + MOV X14, X23 + MOV X17, X24 + +cols: + VSETVLI X23, E32, M1, TA, MA, X25 + + VLE32V (X20), V1 + VLE32V (X21), V2 + VMULVX X22, V1, V1 + VMULVX X18, V2, V2 + VADDVV V2, V1, V1 + VADDVX X15, V1, V1 + + VSETVLI X23, E16, MF2, TA, MA, X26 + VNSRLWI $5, V1, V3 + + VSETVLI X23, E8, MF4, TA, MA, X26 + VNSRLWI $0, V3, V4 + VSE8V V4, (X24) + + SLLI $2, X25, X26 + ADD X26, X20 + ADD X26, X21 + ADD X25, X24 + SUB X25, X23 + BNEZ X23, cols + + ADD X11, X17 + ADD $1, X16 + BNE X14, X16, rowloop + + RET diff --git a/third_party/h265/hevc/itransform.go b/third_party/h265/hevc/itransform.go new file mode 100644 index 00000000..aec68d53 --- /dev/null +++ b/third_party/h265/hevc/itransform.go @@ -0,0 +1,545 @@ +package hevc + +import "math" + +var levelScale = [6]int32{40, 45, 51, 57, 64, 72} + +var dstMatrix = [4][4]int8{ + {29, 55, 74, 84}, + {74, 74, 0, -74}, + {84, -29, -74, 55}, + {55, -84, 74, -29}, +} + +func clip3(v, lo, hi int32) int32 { + if v < lo { + return lo + } + + if v > hi { + return hi + } + + return v +} + +func boolToInt(v bool) int { + if v { + return 1 + } + + return 0 +} + +func log2(n int) int { + k := 0 + for n > 1 { + n >>= 1 + k++ + } + + return k +} + +// 8.6.3, log2TransformRange. +func transformRange(bitDepth int, extended bool) int { + if !extended { + return 15 + } + + return max(15, bitDepth+6) +} + +// 8.6.3. m is nil when the factors are flat 16. +func dequant(coef []int32, m []uint8, n, qp, bitDepth int, extended bool) { + rng := transformRange(bitDepth, extended) + shift := bitDepth + log2(n) + 10 - rng + lo, hi := int32(-1<= 1 && rng <= 15 { + dequant32(coef, m, int32(levelScale[qp%6]), sh, lo, hi) + + return + } + + scale := int64(levelScale[qp%6]) << (qp / 6) + rnd := int64(1) << (shift - 1) + + clip := func(v int64) int32 { + if v < int64(lo) { + return lo + } + + if v > int64(hi) { + return hi + } + + return int32(v) + } + + // A zero coefficient scales to zero, and most of a block is zero. + if m == nil { + for i, c := range coef { + if c == 0 { + continue + } + + coef[i] = clip((int64(c)*16*scale + rnd) >> shift) + } + + return + } + + for i, c := range coef { + if c == 0 { + continue + } + + coef[i] = clip((int64(c)*int64(m[i])*scale + rnd) >> shift) + } +} + +func dequant32(coef []int32, m []uint8, ls int32, sh int, lo, hi int32) { + rnd := int32(1) << (sh - 1) + + if k := dequant32Asm; k != nil && len(coef)%8 == 0 { + k(coef, m, ls, rnd, sh, lo, hi) + + return + } + + if m == nil { + for i, c := range coef { + if c == 0 { + continue + } + + coef[i] = clip3((c*16*ls+rnd)>>sh, lo, hi) + } + + return + } + + for i, c := range coef { + if c == 0 { + continue + } + + coef[i] = clip3((c*int32(m[i])*ls+rnd)>>sh, lo, hi) + } +} + +// idct is 8.6.4.2, split by size so the even half unrolls instead of +// recursing. Each level transforms the even coefficients at half the size and +// combines them with an odd half computed from the basis rows. +func idct(out, in []int32, n int, s *transformScratch) { + switch n { + case 4: + idct4(out, in) + case 8: + idct8(out, in) + case 16: + idct16(out, in) + default: + idct32(out, in, s) + } +} + +func idct4(out, in []int32) { + _ = out[3] + + e0 := 64 * (in[0] + in[2]) + e1 := 64 * (in[0] - in[2]) + + o0 := 83*in[1] + 36*in[3] + o1 := 36*in[1] - 83*in[3] + + out[0] = e0 + o0 + out[1] = e1 + o1 + out[2] = e1 - o1 + out[3] = e0 - o0 +} + +func idct8(out, in []int32) { + var ev, e, o [4]int32 + + ev[0], ev[1], ev[2], ev[3] = in[0], in[2], in[4], in[6] + idct4(e[:], ev[:]) + + oddGo(o[:], in, 4) + + for i, v := range e { + out[i] = v + o[i] + out[7-i] = v - o[i] + } +} + +func idct16(out, in []int32) { + var ev, e, o [8]int32 + + for i := range ev { + ev[i] = in[2*i] + } + + idct8(e[:], ev[:]) + oddGo(o[:], in, 2) + + for i, v := range e { + out[i] = v + o[i] + out[15-i] = v - o[i] + } +} + +func idct32(out, in []int32, s *transformScratch) { + var ev, e [16]int32 + + for i := range ev { + ev[i] = in[2*i] + } + + idct16(e[:], ev[:]) + + o := s.odd[:] + + // Only the widest butterfly is worth an assembly call; below sixteen the + // call costs more than the vectors save. + if k := oddAsm; k != nil { + k(o, in, 1) + } else { + oddGo(o, in, 1) + } + + for i, v := range e { + out[i] = v + o[i] + out[31-i] = v - o[i] + } +} + +// oddGo accumulates the odd half of one level, a basis row at a time so the +// matrix is indexed once per coefficient and a zero one costs nothing. +func oddGo(out, in []int32, stride int) { + clear(out) + + for j := range out { + c := in[2*j+1] + if c == 0 { + continue + } + + row := transMatrix[(2*j+1)*stride][:len(out)] + acc := out[:len(row)] + + for i, v := range row { + acc[i] += int32(v) * c + } + } +} + +func idst1D(out, in []int32) { + for i := range 4 { + var v int32 + + for j := range 4 { + v += int32(dstMatrix[j][i]) * in[j] + } + + out[i] = v + } +} + +type transformScratch struct { + // odd is the sixteen-wide butterfly accumulator. It lives here rather + // than on the stack because passing a local array to a kernel through a + // function value makes it escape. + odd [16]int32 + col [32]int32 + out [32]int32 + block [32 * 32]int32 + block2 [32 * 32]int32 +} + +// idctColsGo is 8.6.4.2 over eight columns at a time, dense but for the +// even/odd split: M[j][n-1-i] is M[j][i] for even j and its negation for odd j. +func idctColsGo(dst, src []int32, n int, rnd int32, shift int, lo, hi int32) { + half := n / 2 + step := 32 / n + + var acc [2][16 * 8]int32 + + for x0 := 0; x0 < n; x0 += 8 { + clear(acc[0][:half*8]) + clear(acc[1][:half*8]) + + for j := range n { + c := src[j*n+x0:][:8] + + var any int32 + for _, v := range c { + any |= v + } + + if any == 0 { + continue + } + + row := transMatrix[j*step][:half] + a := acc[j&1][:half*8] + + for i, m := range row { + w := int32(m) + + for lane, v := range c { + a[i*8+lane] += w * v + } + } + } + + for i := range half { + e := acc[0][i*8:][:8] + o := acc[1][i*8:][:8] + + lowRow := dst[i*n+x0:][:8] + highRow := dst[(n-1-i)*n+x0:][:8] + + for lane := range 8 { + lowRow[lane] = clip3((e[lane]+o[lane]+rnd)>>shift, lo, hi) + highRow[lane] = clip3((e[lane]-o[lane]+rnd)>>shift, lo, hi) + } + } + } +} + +// transMatrix32 is the basis matrix at the width the kernels broadcast from. +var transMatrix32 = func() [32][32]int32 { + var m [32][32]int32 + + for j, row := range transMatrix { + for i, v := range row { + m[j][i] = int32(v) + } + } + + return m +}() + +// transposeBlock writes the transpose of an n by n block. +func transposeBlock(dst, src []int32, n int) { + if k := transposeAsm; k != nil { + k(dst, src, n) + + return + } + + for y := range n { + row := src[y*n : y*n+n] + + for x, v := range row { + dst[x*n+y] = v + } + } +} + +// 8.6.4.1. +func inverseTransform(coef []int32, n int, dst bool, bitDepth int, extended bool, s *transformScratch) { + rng := transformRange(bitDepth, extended) + lo, hi := int32(-1<= 8 { + block, block2 := s.block[:n*n], s.block2[:n*n] + + k(block, coef[:n*n], n, 64, 7, lo, hi) + transposeBlock(block2, block, n) + k(block, block2, n, 0, 0, math.MinInt32, math.MaxInt32) + transposeBlock(coef[:n*n], block, n) + + return + } + + // A column of zeros transforms to zeros, and residual blocks are mostly + // zero above the last significant coefficient. + col, out := s.col[:n], s.out[:n] + + for x := range n { + var acc int32 + + for y := range col { + v := coef[y*n+x] + col[y] = v + acc |= v + } + + if acc == 0 { + for y := range n { + s.block[y*n+x] = 0 + } + + continue + } + + if dst { + idst1D(out, col) + } else { + idct(out, col, n, s) + } + + for y, v := range out { + s.block[y*n+x] = clip3((v+64)>>7, lo, hi) + } + } + + for y := range n { + row := s.block[y*n : y*n+n] + + if dst { + idst1D(out, row) + } else { + idct(out, row, n, s) + } + + copy(coef[y*n:y*n+n], out) + } +} + +// coeffRange is the transform range of a component, or zero when extended +// precision is off. +func (s *sps) coeffRange(cIdx int) int { + if !s.extendedPrecision { + return 0 + } + + bitDepth := int(s.bitDepthLuma) + if cIdx > 0 { + bitDepth = int(s.bitDepthChroma) + } + + return transformRange(bitDepth, true) +} + +// wideTransform reports whether the basis row sums of 8.6.4.2 can leave +// thirty-two bits. +func wideTransform(bitDepth int, extended bool) bool { + return transformRange(bitDepth, extended) > 15 +} + +func transform1DWide(out, in []int64, n int, dst bool) { + if dst { + for i := range 4 { + var v int64 + + for j := range 4 { + v += int64(dstMatrix[j][i]) * in[j] + } + + out[i] = v + } + + return + } + + step := 32 / n + + for i := range n { + var v int64 + + for j := range n { + v += int64(transMatrix[j*step][i]) * in[j] + } + + out[i] = v + } +} + +// inverseTransformWide is 8.6.4.1 in sixty-four bits, with bdShift folded into +// the row stage. +func inverseTransformWide(coef []int32, n int, dst bool, bitDepth int, shift int, s *transformScratch) { + rng := transformRange(bitDepth, true) + lo, hi := int64(-1<> 7 + + s.block[y*n+x] = int32(min(max(v, lo), hi)) + } + } + + rnd := int64(1) << (shift - 1) + + for y := range n { + for x, v := range s.block[y*n : y*n+n] { + col[x] = int64(v) + } + + transform1DWide(out[:n], col[:n], n, dst) + + for x := range n { + coef[y*n+x] = int32((out[x] + rnd) >> shift) + } + } +} + +// transformSkipWide is 8.6.2 with bdShift folded into tsShift. Extended +// precision keeps bdShift the larger, so the net shift is to the right. +func transformSkipWide(coef []int32, n int, rotate bool, shift int) { + sh := shift - (5 + log2(n)) + rnd := int32(1) << (sh - 1) + + if rotate { + for i, j := 0, len(coef)-1; i < j; i, j = i+1, j-1 { + coef[i], coef[j] = (coef[j]+rnd)>>sh, (coef[i]+rnd)>>sh + } + + if len(coef)%2 == 1 { + coef[len(coef)/2] = (coef[len(coef)/2] + rnd) >> sh + } + + return + } + + for i, v := range coef { + coef[i] = (v + rnd) >> sh + } +} + +// residualShiftBits is bdShift of 8.6.2. +func residualShiftBits(bitDepth int, extended bool) int { + shift := 20 - bitDepth + if extended { + return max(shift, 11) + } + + return shift +} + +// 8.6.2, transform_skip_flag. Not clipped; bdShift follows. +func transformSkip(coef []int32, n int, rotate bool) { + shift := 5 + log2(n) + + if rotate { + for i, j := 0, len(coef)-1; i < j; i, j = i+1, j-1 { + coef[i], coef[j] = coef[j]<+0x00(SB)/8, $0x808080800c080400 +DATA packLow<>+0x08(SB)/8, $0x8080808080808080 +DATA packLow<>+0x10(SB)/8, $0x808080800c080400 +DATA packLow<>+0x18(SB)/8, $0x8080808080808080 +GLOBL packLow<>(SB), RODATA|NOPTR, $32 + +// func addResidual8AVX2(dst *uint8, stride int, coef *int32, n, shift int) +TEXT ·addResidual8AVX2(SB), NOSPLIT, $0-40 + MOVQ dst+0(FP), DI + MOVQ stride+8(FP), SI + MOVQ coef+16(FP), DX + MOVQ n+24(FP), BX + MOVQ shift+32(FP), R8 + + // rnd is 1<<(shift-1), and zero when nothing is shifted. + XORQ R9, R9 + TESTQ R8, R8 + JLE havernd + MOVQ R8, CX + DECQ CX + MOVQ $1, R9 + SHLQ CX, R9 + +havernd: + MOVQ R9, X0 + VPBROADCASTD X0, Y0 + MOVQ R8, X1 + VPXOR Y2, Y2, Y2 + MOVL $255, AX + MOVQ AX, X3 + VPBROADCASTD X3, Y3 + VMOVDQU packLow<>(SB), Y6 + + MOVQ BX, R10 + +rows: + MOVQ DI, R12 + MOVQ BX, R11 + +cols: + VMOVDQU (DX), Y4 + VPADDD Y0, Y4, Y4 + VPSRAD X1, Y4, Y4 + VPMOVZXBD (R12), Y5 + VPADDD Y5, Y4, Y4 + VPMAXSD Y2, Y4, Y4 + VPMINSD Y3, Y4, Y4 + + VPSHUFB Y6, Y4, Y4 + VEXTRACTI128 $1, Y4, X7 + MOVL X4, (R12) + MOVL X7, 4(R12) + + ADDQ $32, DX + ADDQ $8, R12 + SUBQ $8, R11 + JNZ cols + + ADDQ SI, DI + DECQ R10 + JNZ rows + + VZEROUPPER + RET + +// func addResidual16AVX2(dst *uint16, stride int, coef *int32, n, shift int, maxV int32) +TEXT ·addResidual16AVX2(SB), NOSPLIT, $0-44 + MOVQ dst+0(FP), DI + MOVQ stride+8(FP), SI + MOVQ coef+16(FP), DX + MOVQ n+24(FP), BX + MOVQ shift+32(FP), R8 + + SHLQ $1, SI + + XORQ R9, R9 + TESTQ R8, R8 + JLE havernd16 + MOVQ R8, CX + DECQ CX + MOVQ $1, R9 + SHLQ CX, R9 + +havernd16: + MOVQ R9, X0 + VPBROADCASTD X0, Y0 + MOVQ R8, X1 + VPXOR Y2, Y2, Y2 + MOVL maxV+40(FP), AX + MOVQ AX, X3 + VPBROADCASTD X3, Y3 + + MOVQ BX, R10 + +rows16: + MOVQ DI, R12 + MOVQ BX, R11 + +cols16: + VMOVDQU (DX), Y4 + VPADDD Y0, Y4, Y4 + VPSRAD X1, Y4, Y4 + VPMOVZXWD (R12), Y5 + VPADDD Y5, Y4, Y4 + VPMAXSD Y2, Y4, Y4 + VPMINSD Y3, Y4, Y4 + + VPACKUSDW Y4, Y4, Y4 + VEXTRACTI128 $1, Y4, X7 + MOVQ X4, (R12) + MOVQ X7, 8(R12) + + ADDQ $32, DX + ADDQ $16, R12 + SUBQ $8, R11 + JNZ cols16 + + ADDQ SI, DI + DECQ R10 + JNZ rows16 + + VZEROUPPER + RET + +// func odd16AVX2(out *int32, in *int32, m *int8, stride int) +// +// out[i] = sum over j of m[(2j+1)*stride][i] * in[2j+1], sixteen wide. The +// accumulators stay in registers, and a zero coefficient skips a row. +TEXT ·odd16AVX2(SB), NOSPLIT, $0-32 + MOVQ out+0(FP), DI + MOVQ in+8(FP), SI + MOVQ m+16(FP), DX + MOVQ stride+24(FP), R8 + + LEAQ 4(SI), R10 + + // The first basis row is stride rows in, and each step advances by two. + MOVQ R8, R11 + SHLQ $5, R11 + ADDQ R11, DX + SHLQ $1, R11 + + VPXOR Y0, Y0, Y0 + VPXOR Y1, Y1, Y1 + + MOVQ $16, R12 + +loop: + MOVL (R10), AX + TESTL AX, AX + JZ skip + + VPBROADCASTD (R10), Y4 + VPMOVSXBD (DX), Y2 + VPMOVSXBD 8(DX), Y3 + VPMULLD Y4, Y2, Y2 + VPMULLD Y4, Y3, Y3 + VPADDD Y2, Y0, Y0 + VPADDD Y3, Y1, Y1 + +skip: + ADDQ $8, R10 + ADDQ R11, DX + DECQ R12 + JNZ loop + + VMOVDQU Y0, (DI) + VMOVDQU Y1, 32(DI) + VZEROUPPER + RET diff --git a/third_party/h265/hevc/itransform_arm64.s b/third_party/h265/hevc/itransform_arm64.s new file mode 100644 index 00000000..4e39a9b5 --- /dev/null +++ b/third_party/h265/hevc/itransform_arm64.s @@ -0,0 +1,187 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +// Instructions the Go assembler does not know, encoded as gav1d does it. The +// bases came from assembling each form on the board and reading objdump. +#define SSHL4S(Vd, Vn, Vm) WORD $(0x4ea04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SQXTN4H(Vd, Vn) WORD $(0x0e614800 | ((Vn) << 5) | (Vd)) +#define SQXTN2_8H(Vd, Vn) WORD $(0x4e614800 | ((Vn) << 5) | (Vd)) +#define SQXTUN8B(Vd, Vn) WORD $(0x2e212800 | ((Vn) << 5) | (Vd)) +#define SXTL8H(Vd, Vn) WORD $(0x0f08a400 | ((Vn) << 5) | (Vd)) +#define SXTL2_8H(Vd, Vn) WORD $(0x4f08a400 | ((Vn) << 5) | (Vd)) +#define SMLAL4S(Vd, Vn, Vm) WORD $(0x0e608000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMLAL2_4S(Vd, Vn, Vm) WORD $(0x4e608000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMAX4S(Vd, Vn, Vm) WORD $(0x4ea06400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMIN4S(Vd, Vn, Vm) WORD $(0x4ea06c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func addResidual8NEON(dst *uint8, stride int, coef *int32, n, shift int) +TEXT ·addResidual8NEON(SB), NOSPLIT, $0-40 + MOVD dst+0(FP), R0 + MOVD stride+8(FP), R1 + MOVD coef+16(FP), R2 + MOVD n+24(FP), R3 + MOVD shift+32(FP), R4 + + // rnd is 1<<(shift-1), and zero when nothing is shifted. + MOVD $0, R5 + CMP $0, R4 + BLE havernd + MOVD $1, R5 + SUB $1, R4, R6 + LSL R6, R5, R5 + +havernd: + VDUP R5, V0.S4 + NEG R4, R7 + VDUP R7, V1.S4 + + MOVD R3, R8 + +rows: + MOVD R0, R9 + MOVD R3, R10 + +cols: + VLD1.P 32(R2), [V4.S4, V5.S4] + + VADD V0.S4, V4.S4, V4.S4 + VADD V0.S4, V5.S4, V5.S4 + SSHL4S(4, 4, 1) + SSHL4S(5, 5, 1) + + VLD1 (R9), [V6.B8] + VUXTL V6.B8, V6.H8 + VUXTL V6.H4, V7.S4 + VUXTL2 V6.H8, V8.S4 + + VADD V7.S4, V4.S4, V4.S4 + VADD V8.S4, V5.S4, V5.S4 + + SQXTN4H(9, 4) + SQXTN2_8H(9, 5) + SQXTUN8B(9, 9) + + VST1.P [V9.B8], 8(R9) + + SUB $8, R10 + CBNZ R10, cols + + ADD R1, R0 + SUB $1, R8 + CBNZ R8, rows + + RET + +// func addResidual16NEON(dst *uint16, stride int, coef *int32, n, shift int, maxV int32) +TEXT ·addResidual16NEON(SB), NOSPLIT, $0-44 + MOVD dst+0(FP), R0 + MOVD stride+8(FP), R1 + MOVD coef+16(FP), R2 + MOVD n+24(FP), R3 + MOVD shift+32(FP), R4 + MOVW maxV+40(FP), R11 + + LSL $1, R1 + + MOVD $0, R5 + CMP $0, R4 + BLE havernd16 + MOVD $1, R5 + SUB $1, R4, R6 + LSL R6, R5, R5 + +havernd16: + VDUP R5, V0.S4 + NEG R4, R7 + VDUP R7, V1.S4 + VMOVI $0, V2.B16 + VDUP R11, V3.S4 + + MOVD R3, R8 + +rows16: + MOVD R0, R9 + MOVD R3, R10 + +cols16: + VLD1.P 32(R2), [V4.S4, V5.S4] + + VADD V0.S4, V4.S4, V4.S4 + VADD V0.S4, V5.S4, V5.S4 + SSHL4S(4, 4, 1) + SSHL4S(5, 5, 1) + + VLD1 (R9), [V6.H8] + VUXTL V6.H4, V7.S4 + VUXTL2 V6.H8, V8.S4 + + VADD V7.S4, V4.S4, V4.S4 + VADD V8.S4, V5.S4, V5.S4 + + SMAX4S(4, 4, 2) + SMAX4S(5, 5, 2) + SMIN4S(4, 4, 3) + SMIN4S(5, 5, 3) + + SQXTN4H(9, 4) + SQXTN2_8H(9, 5) + + VST1.P [V9.H8], 16(R9) + + SUB $8, R10 + CBNZ R10, cols16 + + ADD R1, R0 + SUB $1, R8 + CBNZ R8, rows16 + + RET + +// func odd16NEON(out *int32, in *int32, m *int8, stride int) +// +// The sixteen-wide butterfly of 8.6.4.2. Coefficients fit int16 after 8.6.3 +// clips them, so the basis row widens to int16 and SMLAL does the widening +// multiply-accumulate into the four int32 accumulators. +TEXT ·odd16NEON(SB), NOSPLIT, $0-32 + MOVD out+0(FP), R0 + MOVD in+8(FP), R1 + MOVD m+16(FP), R2 + MOVD stride+24(FP), R3 + + ADD $4, R1 + + LSL $5, R3, R4 + ADD R4, R2 + LSL $1, R4 + + VMOVI $0, V0.B16 + VMOVI $0, V1.B16 + VMOVI $0, V2.B16 + VMOVI $0, V3.B16 + + MOVD $16, R5 + +loop: + MOVWU (R1), R6 + CBZ R6, skip + + VDUP R6, V4.H8 + + VLD1 (R2), [V5.B16] + SXTL8H(6, 5) + SXTL2_8H(7, 5) + + SMLAL4S(0, 6, 4) + SMLAL2_4S(1, 6, 4) + SMLAL4S(2, 7, 4) + SMLAL2_4S(3, 7, 4) + +skip: + ADD $8, R1 + ADD R4, R2 + SUB $1, R5 + CBNZ R5, loop + + VST1 [V0.S4, V1.S4, V2.S4, V3.S4], (R0) + RET diff --git a/third_party/h265/hevc/itransform_riscv64.s b/third_party/h265/hevc/itransform_riscv64.s new file mode 100644 index 00000000..d178c32c --- /dev/null +++ b/third_party/h265/hevc/itransform_riscv64.s @@ -0,0 +1,161 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func addResidual8RVV(dst *uint8, stride int, coef *int32, n, shift int) +TEXT ·addResidual8RVV(SB), NOSPLIT, $0-40 + MOV dst+0(FP), X10 + MOV stride+8(FP), X11 + MOV coef+16(FP), X12 + MOV n+24(FP), X13 + MOV shift+32(FP), X14 + + // rnd is 1<<(shift-1), and zero when nothing is shifted. + MOV $0, X15 + BLEZ X14, havernd + MOV $1, X15 + ADD $-1, X14, X16 + SLL X16, X15, X15 + +havernd: + MOV $255, X17 + MOV X13, X18 + +rows: + MOV X10, X19 + MOV X13, X20 + +cols: + VSETVLI X20, E32, M1, TA, MA, X21 + + VLE32V (X12), V1 + VADDVX X15, V1, V1 + VSRAVX X14, V1, V1 + VLE8V (X19), V2 + VZEXTVF4 V2, V3 + VADDVV V3, V1, V1 + VMAXVX X0, V1, V1 + VMINVX X17, V1, V1 + + VSETVLI X20, E16, MF2, TA, MA, X21 + VNSRLWI $0, V1, V4 + VSETVLI X20, E8, MF4, TA, MA, X21 + VNSRLWI $0, V4, V5 + VSE8V V5, (X19) + + SLLI $2, X21, X22 + ADD X22, X12 + ADD X21, X19 + SUB X21, X20 + BNEZ X20, cols + + ADD X11, X10 + ADD $-1, X18 + BNEZ X18, rows + + RET + +// func addResidual16RVV(dst *uint16, stride int, coef *int32, n, shift int, maxV int32) +TEXT ·addResidual16RVV(SB), NOSPLIT, $0-44 + MOV dst+0(FP), X10 + MOV stride+8(FP), X11 + MOV coef+16(FP), X12 + MOV n+24(FP), X13 + MOV shift+32(FP), X14 + MOVW maxV+40(FP), X17 + + SLLI $1, X11 + + MOV $0, X15 + BLEZ X14, havernd16 + MOV $1, X15 + ADD $-1, X14, X16 + SLL X16, X15, X15 + +havernd16: + MOV X13, X18 + +rows16: + MOV X10, X19 + MOV X13, X20 + +cols16: + VSETVLI X20, E32, M1, TA, MA, X21 + + VLE32V (X12), V1 + VADDVX X15, V1, V1 + VSRAVX X14, V1, V1 + VLE16V (X19), V2 + VZEXTVF2 V2, V3 + VADDVV V3, V1, V1 + VMAXVX X0, V1, V1 + VMINVX X17, V1, V1 + + VSETVLI X20, E16, MF2, TA, MA, X21 + VNSRLWI $0, V1, V4 + VSE16V V4, (X19) + + SLLI $2, X21, X22 + ADD X22, X12 + SLLI $1, X21, X22 + ADD X22, X19 + SUB X21, X20 + BNEZ X20, cols16 + + ADD X11, X10 + ADD $-1, X18 + BNEZ X18, rows16 + + RET + +// func odd16RVV(out *int32, in *int32, m *int8, stride int) +// +// The sixteen-wide butterfly of 8.6.4.2, chunked by the vector length so it +// does not assume VLEN. +TEXT ·odd16RVV(SB), NOSPLIT, $0-32 + MOV out+0(FP), X10 + MOV in+8(FP), X11 + MOV m+16(FP), X12 + MOV stride+24(FP), X13 + + ADD $4, X11 + + // The first basis row is stride rows in, and each step advances by two. + SLLI $5, X13, X14 + ADD X14, X12 + SLLI $1, X14 + + MOV $16, X15 + +chunk: + VSETVLI X15, E32, M1, TA, MA, X16 + + VMVVI $0, V1 + + MOV X11, X17 + MOV X12, X18 + MOV $16, X19 + +rows2: + MOV (X17), X20 + BEQZ X20, skip + + VLE8V (X18), V2 + VSEXTVF4 V2, V3 + VMACCVX V3, X20, V1 + +skip: + ADD $8, X17 + ADD X14, X18 + ADD $-1, X19 + BNEZ X19, rows2 + + VSE32V V1, (X10) + + SLLI $2, X16, X21 + ADD X21, X10 + ADD X16, X12 + SUB X16, X15 + BNEZ X15, chunk + + RET diff --git a/third_party/h265/hevc/lossyenc.go b/third_party/h265/hevc/lossyenc.go new file mode 100644 index 00000000..b8738f27 --- /dev/null +++ b/third_party/h265/hevc/lossyenc.go @@ -0,0 +1,1559 @@ +package hevc + +import ( + "math" + "slices" +) + +// codedSize rounds a picture dimension up to the minimum coding block size, +// which 7.4.3.2 requires the coded picture to be a multiple of. +func codedSize(n int) int { + return (n + 15) &^ 15 +} + +// nals is the parameter sets a slice coded by this encoder needs, and the +// slice behind them. +func (e *intraEncoder[P]) nals(width, height int, rbsp []byte) []NALUnit { + cw, ch := codedSize(width), codedSize(height) + h := encoderHeaders{ + width: cw, height: ch, cropRight: cw - width, cropBottom: ch - height, + chromaFormat: e.s.chromaFormatIDC, + subWidthC: int(e.s.subWidthC), subHeightC: int(e.s.subHeightC), + bitDepth: e.bitDepth, + levelIDC: pcmLevelIDC(cw * ch), + ctbLog2: 6, maxTrHierIntra: 2, + wavefront: e.wavefront, sao: e.saoOn, + } + + return append(h.parameterSets(), NALUnit{Type: NALIdrNLP, RBSP: rbsp}) +} + +// intraEncoder codes one picture as a single intra slice of 64x64 coding tree +// blocks, at any sampling of 6.2 and any sample size the transforms reach. A +// picture allocates only the bitstream it returns. +type intraEncoder[P pixel] struct { + width, height int + + // qp is SliceQpY; qpY and qpC are the Qp' of 8.6.1 behind it, and + // qpDeblockC the chroma QP 8.7.2 filters by, which takes no offset. + qp, qpY, qpC int + qpDeblockC int + bitDepth int + lambda int64 + // lambdaBase is the same weight at eight bits, which is what rdoq weighs by. + lambdaBase int64 + + src [3][]P + recon [3][]P + + // shiftW and shiftH are SubWidthC and SubHeightC of 6.2 as the shifts they + // only ever are, and strideC the chroma stride they leave. + shiftW, shiftH int + strideC int + + // modes and depth are per 16x16 block, for 8.4.2 and 9.3.4.2.2. coded is + // which 4x4 of each plane has been reconstructed, luma then chroma, which + // is what the reference samples of 8.4.4.2.2 may be read from. edges is + // where a transform block begins, which is what 8.7.2 filters. + modes []int + depth []uint8 + coded [2][]uint8 + edges []uint8 + + bits putBits + cabac cabacWriter + s sps + p pps + + // hint is the last slice's length, so the next one is allocated once + // rather than grown into. + hint int + + // threads is what the rows may spread over, wavefront whether they may. + threads int + wavefront bool + + // sao is 8.7.3's parameters per coding tree block, decided from the + // deblocked picture and written in front of each block on a second pass. + sao [][3]saoParams + saoSrc []P + saoStat saoStats + // wantSAO asks for the second pass; saoOn, saoLuma and saoChroma are what + // it found worth carrying. + wantSAO bool + saoOn, saoLuma, saoChroma bool + + scratch lossyBlockScratch[P] + before cuState[P] + kept cuState[P] + tuBase cuState[P] + tuKept cuState[P] + tu cuTransform +} + +// cuTransform holds both ways of coding a 32x32 coding unit's transform tree: +// one unit of its own size, or four 16x16 ones. +type cuTransform struct { + split bool + y32 [32 * 32]int32 + y [4][16 * 16]int32 + + // c32 and c are the chroma levels, Cb then Cr, with the two blocks 4:2:2 + // stacks laid one after the other. + c32 [2][32 * 32]int32 + c [2][4][16 * 16]int32 + + // whole and quad are the coded block flags, taken where the levels are made. + whole bool + quad [4]bool + wholeC [2][2]bool + quadC [4][2][2]bool +} + +// flat reports whether the unit took one transform and left no residual in it. +func (t *cuTransform) flat() bool { + return !t.split && !t.whole && !anyCBF(t.wholeC) +} + +// anyCBF reports whether either component of either stacked block is coded. +func anyCBF(f [2][2]bool) bool { + return f[0][0] || f[0][1] || f[1][0] || f[1][1] +} + +// cuState is everything coding one 32x32 block changes, so that an arm of the +// size decision can be taken back or put back. +type cuState[P pixel] struct { + cabac cabacWriter + bits []byte + cur, nbits uint8 + y [32 * 32]P + cb, cr [32 * 32]P + modes [4]int + depth [4]uint8 + codedY [64]uint8 + codedC [64]uint8 + edges [64]uint8 +} + +// lossyBlock names one transform block and how it is coded. +type lossyBlock[P pixel] struct { + cIdx int + x, y, n int + mode int + dst bool + + // pred is a prediction already made, which the mode search keeps from its sweep. + pred []P +} + +// lossyBlockScratch is the working memory one block needs. No two blocks are +// ever in flight at once, and the largest is 32x32. +type lossyBlockScratch[P pixel] struct { + pred [32 * 32]P + modePred [modeShortlist][16 * 16]P + avail [4*32 + 1]bool + residual [32 * 32]int32 + coef [32 * 32]int32 + num [32 * 32]int64 + cost [32 * 32]int64 + costZero [32 * 32]int64 + costSig [32 * 32]int64 + reconCoef [32 * 32]int32 + base, ref refSamples + transform transformScratch +} + +type lossyTU8Plan struct { + split bool + y [4][4 * 4]int32 + y8 [8 * 8]int32 + cbfY [4]bool + cbfY8 bool + + // c8 is the chroma of the whole 8x8 block and c that of its four 4x4 ones, + // which only 4:4:4 splits chroma down to. + c8 [2][8 * 8]int32 + c [2][4][4 * 4]int32 + cbfC8 [2][2]bool + cbfC [4][2][2]bool +} + +// slice codes the whole picture. The planes are the coded picture, so a caller +// with one that does not fill the coding grid pads it first. 7.3.8.2 wants the +// offsets of 8.7.3 in front of the block they are fitted to, so asking for them +// codes the picture twice. +func (e *intraEncoder[P]) slice(y, cb, cr []P, width, height, qp int) ([]byte, error) { + e.saoOn = false + + out, err := e.codeSlice(y, cb, cr, width, height, qp) + if err != nil || !e.wantSAO { + return out, err + } + + e.decideSAO() + + if !e.saoOn { + return out, nil + } + + if out, err = e.codeSlice(y, cb, cr, width, height, qp); err != nil { + return nil, err + } + + e.applySAO() + + return out, nil +} + +func (e *intraEncoder[P]) codeSlice(y, cb, cr []P, width, height, qp int) ([]byte, error) { + e.reset(y, cb, cr, width, height, qp) + + rows, cols := ctbCount(height), ctbCount(width) + e.wavefront = e.threads > 1 && rows > 1 && cols > 1 + + if e.wavefront { + subs, err := e.encodeWavefront(rows, cols, min(e.threads, rows)) + if err != nil { + return nil, err + } + + e.deblockRecon() + + out := e.sliceRBSP(subs) + e.hint = len(out) + len(out)/8 + + return out, nil + } + + subs := make([][]byte, rows) + + var sync [nContexts]uint8 + + for k := range rows { + e.startRow(k, &sync) + + if err := e.ctbRow(k, rows, cols, &sync); err != nil { + return nil, err + } + + if e.wavefront { + subs[k] = e.cabac.bytes() + } + } + + if !e.wavefront { + subs = [][]byte{e.cabac.bytes()} + } + + e.deblockRecon() + + out := e.sliceRBSP(subs) + e.hint = len(out) + len(out)/8 + + return out, nil +} + +// sliceRBSP puts the segment header in front of the substreams. 7.4.7.1 counts +// the entry points in the slice data bytes a decoder sees. +func (e *intraEncoder[P]) sliceRBSP(subs [][]byte) []byte { + var w putBits + + w.bit(1) + w.bit(0) + w.ue(0) + w.ue(uint32(sliceI)) + + if e.saoOn { + w.bit(boolToBit(e.saoLuma)) + + if e.s.chromaArrayType() != 0 { + w.bit(boolToBit(e.saoChroma)) + } + } + + w.se(int32(e.qp - 26)) + + // 7.3.6.1 carries slice_loop_filter_across_slices_enabled_flag only while + // a loop filter is on. + w.bit(1) + + if e.wavefront { + sizes := escapedSizes(subs) + + w.ue(uint32(len(sizes))) + + if len(sizes) > 0 { + bits := 1 + for max := slices.Max(sizes); max>>bits != 0; bits++ { + } + + w.ue(uint32(bits - 1)) + + for _, n := range sizes { + w.bits(uint64(n-1), bits) + } + } + } + + w.rbspTrailingBits() + + out := w.bytes() + for _, s := range subs { + out = append(out, s...) + } + + return out +} + +// escapedSizes is the length of every substream but the last, in the bytes the +// emulation prevention of 7.3.1.1 leaves. A header ends on a set bit, so the +// run of zeros never carries into the data. +func escapedSizes(subs [][]byte) []uint32 { + if len(subs) < 2 { + return nil + } + + out := make([]uint32, len(subs)-1) + zeros := 0 + + for i, sub := range subs { + var n uint32 + + for _, b := range sub { + if zeros == 2 && b <= 3 { + n++ + + zeros = 0 + } + + n++ + + if b == 0 { + zeros++ + } else { + zeros = 0 + } + } + + if i < len(out) { + out[i] = n + } + } + + return out +} + +// ctbCount is how many coding tree blocks of 64 samples a dimension takes. +func ctbCount(n int) int { return (n + 63) / 64 } + +// startRow begins a substream. Without the wavefront the rows are one stream. +func (e *intraEncoder[P]) startRow(k int, sync *[nContexts]uint8) { + if !e.wavefront { + if k == 0 { + e.bits = putBits{data: make([]byte, 0, e.hint)} + e.cabac.init(&e.bits, int32(e.qp), sliceI, false) + } + + return + } + + e.bits = putBits{} + e.cabac.init(&e.bits, int32(e.qp), sliceI, false) + + // 9.3.1 hands a row the contexts the row above left after its second block. + if k > 0 { + e.cabac.state = *sync + } +} + +// ctbRow codes one row. The end_of_subset_one_bit of 7.3.8.1 closes every row +// but the last. +func (e *intraEncoder[P]) ctbRow(k, rows, cols int, sync *[nContexts]uint8) error { + for x := range cols { + e.writeSAO(&e.cabac, k*cols+x, cols) + + if err := e.tree(x*64, k*64, 6, 0); err != nil { + return err + } + + last := k == rows-1 && x == cols-1 + e.cabac.encodeTerminate(boolToBit(last)) + + if e.wavefront && x == min(1, cols-1) { + *sync = e.cabac.state + } + + if e.wavefront && !last && x == cols-1 { + e.cabac.encodeTerminate(1) + } + } + + return nil +} + +func (e *intraEncoder[P]) reset(y, cb, cr []P, width, height, qp int) { + e.width, e.height = width, height + e.s = chromaSPS(len(cb), width*height) + e.shiftW, e.shiftH = int(e.s.subWidthC)-1, int(e.s.subHeightC)-1 + e.strideC = width >> e.shiftW + + e.bitDepth = max(e.bitDepth, 8) + if _, ok := any(y).([]uint8); ok { + e.bitDepth = 8 + } + + e.s.bitDepthLuma, e.s.bitDepthChroma = uint8(e.bitDepth), uint8(e.bitDepth) + + off := 6 * (e.bitDepth - 8) + cat := e.s.chromaArrayType() + + e.qp = qp + e.qpY = qp + off + e.qpDeblockC = int(chromaQP(clip3(int32(qp), 0, 57), cat)) + e.qpC = int(chromaQP(clip3(int32(qp), int32(-off), 57), cat)) + off + e.lambda = lossyLambda(e.qpY) + e.lambdaBase = lossyLambda(qp) + e.src = [3][]P{y, cb, cr} + e.p = pps{} + + e.recon[0] = regrow(e.recon[0], len(y)) + e.recon[1] = regrow(e.recon[1], len(cb)) + e.recon[2] = regrow(e.recon[2], len(cr)) + e.modes = regrow(e.modes, width/16*height/16) + e.depth = regrow(e.depth, len(e.modes)) + e.coded[0] = regrow(e.coded[0], width/4*height/4) + e.coded[1] = regrow(e.coded[1], len(cb)/16) + e.edges = regrow(e.edges, width/4*height/4) + + e.bits = putBits{} + e.cabac.init(&e.bits, int32(qp), sliceI, false) +} + +func regrow[T any](s []T, n int) []T { + if cap(s) < n { + return make([]T, n) + } + + s = s[:n] + clear(s) + + return s +} + +func (e *intraEncoder[P]) stride(cIdx int) int { + if cIdx == 0 { + return e.width + } + + return e.strideC +} + +// chromaSPS is the sampling the chroma planes describe by their size, which +// 6.2 fixes: a quarter of the luma is 4:2:0, a half 4:2:2, all of it 4:4:4 and +// none of it monochrome. +func chromaSPS(chroma, luma int) sps { + switch { + case chroma == luma: + return sps{chromaFormatIDC: 3, subWidthC: 1, subHeightC: 1} + case chroma*2 == luma: + return sps{chromaFormatIDC: 2, subWidthC: 2, subHeightC: 1} + case chroma*4 == luma: + return sps{chromaFormatIDC: 1, subWidthC: 2, subHeightC: 2} + default: + return sps{chromaFormatIDC: 0, subWidthC: 1, subHeightC: 1} + } +} + +// chromaTBs is how many transform blocks a component takes over one luma +// transform block. 7.3.8.8 stacks two of them in 4:2:2. +func (e *intraEncoder[P]) chromaTBs() int { + switch e.s.chromaArrayType() { + case 0: + return 0 + case 2: + return 2 + default: + return 1 + } +} + +func (e *intraEncoder[P]) blockQP(cIdx int) int { + if cIdx == 0 { + return e.qpY + } + + return e.qpC +} + +// tree is the coding quadtree of 7.3.8.4. A full 32x32 chooses its own size; a +// block at the picture edge splits without a flag. +func (e *intraEncoder[P]) tree(x0, y0, log2Size, d int) error { + if log2Size == 4 { + return e.leaf(x0, y0, d, -1) + } + + size := 1 << log2Size + + if x0+size <= e.width && y0+size <= e.height { + if log2Size == 5 { + return e.cuSize(x0, y0, d) + } + + e.cabac.encodeBin(ctxSplitCodingUnitFlag+e.splitCtx(x0, y0, d), 1) + } + + half := size / 2 + + for i := range 4 { + x, y := x0+i&1*half, y0+i>>1*half + if x >= e.width || y >= e.height { + continue + } + + if err := e.tree(x, y, log2Size-1, d+1); err != nil { + return err + } + } + + return nil +} + +// cuSize codes a full 32x32 block both ways and keeps the cheaper: one coding +// unit of its own, or four 16x16 ones. +func (e *intraEncoder[P]) cuSize(x0, y0, d int) error { + base, start := len(e.bits.data), e.cabac.rate + ctx := ctxSplitCodingUnitFlag + e.splitCtx(x0, y0, d) + + // Both arms pick their first mode by searching the same top-left 16x16 + // against the same reconstruction, so the search is done once for both. + mode := e.lumaMode(x0, y0, lossyMPM(e.modes, e.width/16, x0/16, y0/16, 4)) + + e.save(&e.before, x0, y0, base) + + e.cabac.encodeBin(ctx, 0) + + if err := e.cu32(x0, y0, d, mode); err != nil { + return err + } + + if e.tu.flat() { + return nil + } + + whole := e.rdCost(e.cuDistortion(x0, y0, 32), e.cabac.rate-start) + + e.save(&e.kept, x0, y0, base) + e.load(&e.before, x0, y0, base) + + e.cabac.encodeBin(ctx, 1) + + // Both halves of the cost only grow with each quadrant, so a split that has + // already lost is abandoned where it stands. + split := int64(0) + + for i := range 4 { + x, y := x0+i&1*16, y0+i>>1*16 + first := -1 + + if i == 0 { + first = mode + } + + if err := e.leaf(x, y, d+1, first); err != nil { + return err + } + + split += e.cuDistortion(x, y, 16) + if e.rdCost(split, e.cabac.rate-start) > whole { + e.load(&e.kept, x0, y0, base) + + return nil + } + } + + if whole <= e.rdCost(split, e.cabac.rate-start) { + e.load(&e.kept, x0, y0, base) + } + + return nil +} + +// cuDistortion is the squared error of a block, chroma included, which is what +// the two arms of the size decision differ over. +func (e *intraEncoder[P]) cuDistortion(x0, y0, n int) int64 { + dist := e.distortion(0, x0, y0, n, e.recon[0][y0*e.width+x0:], e.width) + + cs := e.strideC + cx, cy, cn := x0>>e.shiftW, y0>>e.shiftH, n>>e.shiftW + + for c := 1; c < 3; c++ { + for t := range e.chromaTBs() { + y := cy + t*cn + + dist += e.distortion(c, cx, y, cn, e.recon[c][y*cs+cx:], cs) + } + } + + return dist +} + +func (e *intraEncoder[P]) save(s *cuState[P], x0, y0, base int) { + s.cabac = e.cabac + s.bits = append(s.bits[:0], e.bits.data[base:]...) + s.cur, s.nbits = e.bits.cur, e.bits.nbits + + bw := e.width / 16 + saveRect(s.y[:], e.recon[0], e.width, x0, y0, 32, 32) + saveRect(s.modes[:], e.modes, bw, x0/16, y0/16, 2, 2) + saveRect(s.depth[:], e.depth, bw, x0/16, y0/16, 2, 2) + saveRect(s.codedY[:], e.coded[0], e.width/4, x0/4, y0/4, 8, 8) + saveRect(s.edges[:], e.edges, e.width/4, x0/4, y0/4, 8, 8) + + if e.s.chromaArrayType() == 0 { + return + } + + cs, cw, ch := e.strideC, 32>>e.shiftW, 32>>e.shiftH + cx, cy := x0>>e.shiftW, y0>>e.shiftH + saveRect(s.cb[:], e.recon[1], cs, cx, cy, cw, ch) + saveRect(s.cr[:], e.recon[2], cs, cx, cy, cw, ch) + saveRect(s.codedC[:], e.coded[1], cs/4, cx/4, cy/4, cw/4, ch/4) +} + +func (e *intraEncoder[P]) load(s *cuState[P], x0, y0, base int) { + e.cabac = s.cabac + e.bits.data = append(e.bits.data[:base], s.bits...) + e.bits.cur, e.bits.nbits = s.cur, s.nbits + + bw := e.width / 16 + loadRect(e.recon[0], s.y[:], e.width, x0, y0, 32, 32) + loadRect(e.modes, s.modes[:], bw, x0/16, y0/16, 2, 2) + loadRect(e.depth, s.depth[:], bw, x0/16, y0/16, 2, 2) + loadRect(e.coded[0], s.codedY[:], e.width/4, x0/4, y0/4, 8, 8) + loadRect(e.edges, s.edges[:], e.width/4, x0/4, y0/4, 8, 8) + + if e.s.chromaArrayType() == 0 { + return + } + + cs, cw, ch := e.strideC, 32>>e.shiftW, 32>>e.shiftH + cx, cy := x0>>e.shiftW, y0>>e.shiftH + loadRect(e.recon[1], s.cb[:], cs, cx, cy, cw, ch) + loadRect(e.recon[2], s.cr[:], cs, cx, cy, cw, ch) + loadRect(e.coded[1], s.codedC[:], cs/4, cx/4, cy/4, cw/4, ch/4) +} + +// saveRect lifts a w by h rectangle out of a picture-wide map, loadRect puts +// one back. +func saveRect[T any](dst, src []T, stride, x, y, w, h int) { + for j := range h { + copy(dst[j*w:(j+1)*w], src[(y+j)*stride+x:]) + } +} + +func loadRect[T any](dst, src []T, stride, x, y, w, h int) { + for j := range h { + copy(dst[(y+j)*stride+x:][:w], src[j*w:]) + } +} + +func (e *intraEncoder[P]) splitCtx(x0, y0, d int) int { + blocksWide := e.width / 16 + ctx := 0 + + if x0 > 0 && int(e.depth[y0/16*blocksWide+(x0-1)/16]) > d { + ctx++ + } + + if y0 > 0 && int(e.depth[(y0-1)/16*blocksWide+x0/16]) > d { + ctx++ + } + + return ctx +} + +// leaf codes a 16x16 coding unit, whose transform tree splits to 8x8 and then +// to 4x4 where that is cheaper. A negative mode is searched for. +func (e *intraEncoder[P]) leaf(x0, y0, d, mode int) error { + blocksWide := e.width / 16 + cand := lossyMPM(e.modes, blocksWide, x0/16, y0/16, 4) + + if mode < 0 { + mode = e.lumaMode(x0, y0, cand) + } + + var tus [4]lossyTU8Plan + + for i := range 4 { + tus[i] = e.tu8(x0+i&1*8, y0+i>>1*8, mode) + } + + var root [2][2]bool + + for i := range 4 { + x, y := x0+i&1*8, y0+i>>1*8 + + for c := range 2 { + root[c][0] = root[c][0] || tus[i].cbfC8[c][0] || tus[i].cbfC8[c][1] + } + + if !tus[i].split { + e.markTU(x, y, 8) + + continue + } + + for j := range 4 { + e.markTU(x+j&1*4, y+j>>1*4, 4) + } + } + + e.cabac.encodeBin(ctxPartMode, 1) + lossyIntraLumaMode(&e.cabac, mode, cand) + e.chromaPredMode(&e.cabac) + e.cabac.encodeBin(ctxSplitTransformFlag+1, 1) + e.chromaCBF(&e.cabac, 0, root, root, e.chromaSecond(16, true)) + + for i := range 4 { + if err := e.tu8Code(&e.cabac, &tus[i], mode, root); err != nil { + return err + } + } + + idx := y0/16*blocksWide + x0/16 + e.modes[idx] = mode + e.depth[idx] = uint8(d) + + return nil +} + +// cu32 codes a 32x32 coding unit, choosing between one transform unit of its +// own size and four 16x16 ones. A negative mode is searched for. +func (e *intraEncoder[P]) cu32(x0, y0, d, mode int) error { + blocksWide := e.width / 16 + cand := lossyMPM(e.modes, blocksWide, x0/16, y0/16, 4) + + if mode < 0 { + mode = e.lumaMode(x0, y0, cand) + } + + t := &e.tu + base := len(e.bits.data) + + e.save(&e.tuBase, x0, y0, base) + + coef, cbf := e.codeBlock(lossyBlock[P]{x: x0, y: y0, n: 32, mode: mode}, true) + copy(t.y32[:], coef) + t.whole = cbf + t.wholeC = e.codeChroma(x0, y0, 5, mode, t.c32[0][:], t.c32[1][:]) + + t.split = false + whole := e.rdCost(e.cuDistortion(x0, y0, 32), e.tu32Rate(mode)) + + e.save(&e.tuKept, x0, y0, base) + e.load(&e.tuBase, x0, y0, base) + + for i := range 4 { + x, y := x0+i&1*16, y0+i>>1*16 + + coef, cbf = e.codeBlock(lossyBlock[P]{x: x, y: y, n: 16, mode: mode}, true) + copy(t.y[i][:], coef) + t.quad[i] = cbf + t.quadC[i] = e.codeChroma(x, y, 4, mode, t.c[0][i][:], t.c[1][i][:]) + } + + t.split = true + if whole <= e.rdCost(e.cuDistortion(x0, y0, 32), e.tu32Rate(mode)) { + t.split = false + + e.load(&e.tuKept, x0, y0, base) + } + + if t.split { + for i := range 4 { + e.markTU(x0+i&1*16, y0+i>>1*16, 16) + } + } else { + e.markTU(x0, y0, 32) + } + + lossyIntraLumaMode(&e.cabac, mode, cand) + e.chromaPredMode(&e.cabac) + + if err := e.tu32Tree(&e.cabac, mode); err != nil { + return err + } + + for j := range 2 { + for i := range 2 { + idx := (y0/16+j)*blocksWide + x0/16 + i + e.modes[idx] = mode + e.depth[idx] = uint8(d) + } + } + + return nil +} + +// chromaPredMode is intra_chroma_pred_mode of 7.3.8.5, which Table 8-2 reads +// as the luma mode itself. Monochrome codes none. +func (e *intraEncoder[P]) chromaPredMode(w *cabacWriter) { + if e.chromaTBs() > 0 { + w.encodeBin(ctxIntraChromaPredMode, 0) + } +} + +// chromaMode is the mode the chroma blocks predict with, which Table 8-3 +// remaps for 4:2:2. +func (e *intraEncoder[P]) chromaMode(luma int) int { + if e.s.chromaFormatIDC == 2 { + return int(chroma422Map[luma]) + } + + return luma +} + +// chromaLog2 is the size of one chroma transform block under a luma block of +// log2 samples, which only 4:4:4 leaves alone. +func (e *intraEncoder[P]) chromaLog2(log2 int) int { + return log2 - e.shiftW +} + +// chromaAt reports whether 7.3.8.8 carries chroma at a luma block of n, which +// below eight samples only 4:4:4 does. +func (e *intraEncoder[P]) chromaAt(n int) bool { + return e.chromaTBs() > 0 && (n > 4 || e.s.chromaArrayType() == 3) +} + +// chromaSecond is the condition of 7.3.8.8 under which 4:2:2 gives the second +// of its two stacked blocks a coded block flag of its own. +func (e *intraEncoder[P]) chromaSecond(n int, split bool) bool { + return e.s.chromaArrayType() == 2 && (!split || n == 8) +} + +// codeChroma codes the chroma transform blocks under a luma block of log2 +// samples at (x, y), and returns their coded block flags. +func (e *intraEncoder[P]) codeChroma(x, y, log2, mode int, cb, cr []int32) [2][2]bool { + var cbf [2][2]bool + + cn := 1 << e.chromaLog2(log2) + cx, cy := x>>e.shiftW, y>>e.shiftH + cmode := e.chromaMode(mode) + dst := [2][]int32{cb, cr} + + for c := range 2 { + for t := range e.chromaTBs() { + coef, f := e.codeBlock(lossyBlock[P]{cIdx: c + 1, x: cx, y: cy + t*cn, + n: cn, mode: cmode}, true) + + copy(dst[c][t*cn*cn:], coef) + cbf[c][t] = f + } + } + + return cbf +} + +// chromaCBF writes cbf_cb and cbf_cr of 7.3.8.8, which up gates below the root. +func (e *intraEncoder[P]) chromaCBF(w *cabacWriter, depth int, cbf, up [2][2]bool, second bool) { + if e.chromaTBs() == 0 { + return + } + + for c := range 2 { + if depth != 0 && !up[c][0] { + continue + } + + w.encodeBin(ctxCBFCBCR+depth, boolToBit(cbf[c][0])) + + if second { + w.encodeBin(ctxCBFCBCR+depth, boolToBit(cbf[c][1])) + } + } +} + +// chromaResidual writes the levels of the chroma blocks under one luma block. +// 7.3.8.10 codes both Cb blocks before either Cr one. +func (e *intraEncoder[P]) chromaResidual(w *cabacWriter, log2, mode int, cb, cr []int32, + cbf [2][2]bool, +) error { + clog2 := e.chromaLog2(log2) + n := 1 << (2 * clog2) + cmode := e.chromaMode(mode) + src := [2][]int32{cb, cr} + + for c := range 2 { + for t := range e.chromaTBs() { + if !cbf[c][t] { + continue + } + + if err := e.residual(w, src[c][t*n:(t+1)*n], clog2, c+1, cmode); err != nil { + return err + } + } + } + + return nil +} + +// tu32Rate is what the chosen transform tree costs, coded into a writer that +// only counts. +func (e *intraEncoder[P]) tu32Rate(mode int) int64 { + w := e.cabac.counter() + _ = e.tu32Tree(&w, mode) + + return w.rate +} + +// tu32Tree is the transform_tree of 7.3.8.8 for a 32x32 coding unit. +func (e *intraEncoder[P]) tu32Tree(w *cabacWriter, mode int) error { + t := &e.tu + + root := t.wholeC + if t.split { + root = [2][2]bool{} + + for i := range 4 { + for c := range 2 { + root[c][0] = root[c][0] || t.quadC[i][c][0] || t.quadC[i][c][1] + } + } + } + + w.encodeBin(ctxSplitTransformFlag, boolToBit(t.split)) + e.chromaCBF(w, 0, root, root, e.chromaSecond(32, t.split)) + + if !t.split { + if err := e.codedResidual(w, t.y32[:], t.whole, 5, 0, mode, 0); err != nil { + return err + } + + return e.chromaResidual(w, 5, mode, t.c32[0][:], t.c32[1][:], t.wholeC) + } + + for i := range 4 { + w.encodeBin(ctxSplitTransformFlag+1, 0) + e.chromaCBF(w, 1, t.quadC[i], root, e.chromaSecond(16, false)) + + if err := e.codedResidual(w, t.y[i][:], t.quad[i], 4, 0, mode, 1); err != nil { + return err + } + + if err := e.chromaResidual(w, 4, mode, t.c[0][i][:], t.c[1][i][:], t.quadC[i]); err != nil { + return err + } + } + + return nil +} + +// codedResidual writes cbf_luma and the levels behind it. Table 9-49 gives the +// flag its own context at the root of a transform tree. +func (e *intraEncoder[P]) codedResidual(w *cabacWriter, coef []int32, cbf bool, + log2Size, cIdx, mode, trafoDepth int, +) error { + w.encodeBin(ctxCBFLuma+boolToInt(trafoDepth == 0), boolToBit(cbf)) + + if !cbf { + return nil + } + + return e.residual(w, coef, log2Size, cIdx, mode) +} + +func (e *intraEncoder[P]) residual(w *cabacWriter, coef []int32, log2Size, cIdx, mode int) error { + return encodeResidual(w, &e.s, &e.p, coef, + residualBlock{log2Size: log2Size, cIdx: cIdx, predModeIntra: mode, intra: true}) +} + +// tu8 codes one 8x8 quadrant of a 16x16 coding unit, choosing between one 8x8 +// transform and four 4x4 ones on their coded cost. +func (e *intraEncoder[P]) tu8(x, y, mode int) lossyTU8Plan { + w := e.width + + var before, kept tu8State[P] + + e.saveTU8(&before, x, y) + + quarters := [4]lossyBlock[P]{} + for j := range 4 { + quarters[j] = lossyBlock[P]{x: x + j&1*4, y: y + j>>1*4, n: 4, mode: mode, dst: true} + } + + whole := lossyBlock[P]{x: x, y: y, n: 8, mode: mode} + + split := lossyTU8Plan{split: true} + + for j := range 4 { + coef, cbf := e.codeBlock(quarters[j], true) + copy(split.y[j][:], coef) + split.cbfY[j] = cbf + } + + splitCost := e.rdCost(e.distortion(0, x, y, 8, e.recon[0][y*w+x:], w), + e.tu8Rate(&split, mode)) + + e.saveTU8(&kept, x, y) + e.loadTU8(&before, x, y) + + var unsplit lossyTU8Plan + + coef, cbf := e.codeBlock(whole, true) + copy(unsplit.y8[:], coef) + unsplit.cbfY8 = cbf + + chosen := unsplit + if splitCost < e.rdCost(e.distortion(0, x, y, 8, e.recon[0][y*w+x:], w), + e.tu8Rate(&unsplit, mode)) { + chosen = split + + e.loadTU8(&kept, x, y) + } + + if e.chromaTBs() == 0 { + return chosen + } + + // The luma arms are weighed on luma alone, so the chroma is coded once the + // split it has to follow is settled. + if !chosen.split || !e.chromaAt(4) { + chosen.cbfC8 = e.codeChroma(x, y, 3, mode, chosen.c8[0][:], chosen.c8[1][:]) + + return chosen + } + + for j := range 4 { + bx, by := x+j&1*4, y+j>>1*4 + chosen.cbfC[j] = e.codeChroma(bx, by, 2, mode, chosen.c[0][j][:], chosen.c[1][j][:]) + + for c := range 2 { + chosen.cbfC8[c][0] = chosen.cbfC8[c][0] || chosen.cbfC[j][c][0] + } + } + + return chosen +} + +// tu8Code writes one 8x8 quadrant of a 16x16 coding unit: its split flag, the +// chroma flags 7.3.8.8 puts at this depth, and the levels behind them. +func (e *intraEncoder[P]) tu8Code(w *cabacWriter, p *lossyTU8Plan, mode int, up [2][2]bool) error { + w.encodeBin(ctxSplitTransformFlag+2, boolToBit(p.split)) + e.chromaCBF(w, 1, p.cbfC8, up, e.chromaSecond(8, p.split)) + + if !p.split { + if err := e.codedResidual(w, p.y8[:], p.cbfY8, 3, 0, mode, 1); err != nil { + return err + } + + return e.chromaResidual(w, 3, mode, p.c8[0][:], p.c8[1][:], p.cbfC8) + } + + deep := e.chromaAt(4) + + for j := range 4 { + if deep { + e.chromaCBF(w, 2, p.cbfC[j], p.cbfC8, false) + } + + if err := e.codedResidual(w, p.y[j][:], p.cbfY[j], 2, 0, mode, 2); err != nil { + return err + } + + if !deep { + continue + } + + if err := e.chromaResidual(w, 2, mode, p.c[0][j][:], p.c[1][j][:], p.cbfC[j]); err != nil { + return err + } + } + + if deep { + return nil + } + + // 7.3.8.10 codes the one chroma block of the whole quadrant behind the last + // of its luma blocks. + return e.chromaResidual(w, 3, mode, p.c8[0][:], p.c8[1][:], p.cbfC8) +} + +// tu8State is the reconstruction one 8x8 transform unit leaves behind, so the +// arm that wins does not have to be coded a second time. +type tu8State[P pixel] struct { + y [8 * 8]P + coded [4]uint8 +} + +func (e *intraEncoder[P]) saveTU8(s *tu8State[P], x, y int) { + saveRect(s.y[:], e.recon[0], e.width, x, y, 8, 8) + saveRect(s.coded[:], e.coded[0], e.width/4, x/4, y/4, 2, 2) +} + +func (e *intraEncoder[P]) loadTU8(s *tu8State[P], x, y int) { + loadRect(e.recon[0], s.y[:], e.width, x, y, 8, 8) + loadRect(e.coded[0], s.coded[:], e.width/4, x/4, y/4, 2, 2) +} + +func (e *intraEncoder[P]) lumaMode(x, y int, cand [3]int) int { + b := lossyBlock[P]{x: x, y: y, n: 16} + e.prepareRef(b) + + var ( + short [modeShortlist]int + score [modeShortlist]int64 + slot [modeShortlist]int + ) + + for i := range short { + short[i], score[i], slot[i] = intraPlanar, 1<<62, i + } + + pred := e.scratch.pred[:16*16] + + // The smoothing has one outcome at a fixed size, so it is built once. + filtered := false + + for mode := intraPlanar; mode <= 34; mode++ { + ref := &e.scratch.base + + if filterFlag(mode, 16, 0, &e.s) && !e.s.intraSmoothingDisabled { + if !filtered { + e.scratch.ref.copyFrom(&e.scratch.base) + filterRef(&e.scratch.ref, mode, 0, e.bitDepth, &e.s) + + filtered = true + } + + ref = &e.scratch.ref + } + + intraPredict(pred, 0, 16, ref, mode, 0, e.bitDepth) + + s := e.satd(x, y, pred, 16, score[modeShortlist-1]) + + for i := range short { + if s >= score[i] { + continue + } + + // The prediction goes in the slot the evicted mode gives up. + free := slot[modeShortlist-1] + + copy(short[i+1:], short[i:len(short)-1]) + copy(score[i+1:], score[i:len(score)-1]) + copy(slot[i+1:], slot[i:len(slot)-1]) + short[i], score[i], slot[i] = mode, s, free + copy(e.scratch.modePred[free][:], pred) + + break + } + } + + bestMode, bestCost := short[0], int64(-1) + + for i, mode := range short { + b.mode = mode + b.pred = e.scratch.modePred[slot[i]][:] + coef, trial, cbf := e.blockData(b, false) + + // The rate only adds, so a mode whose distortion alone has lost is not + // coded to find out what it costs. + dist := e.distortion(0, x, y, 16, trial, 16) + if bestCost >= 0 && e.rdCost(dist, 0) >= bestCost { + continue + } + + cost := e.rdCost(dist, e.modeRate(cand, mode, coef, cbf)) + if bestCost < 0 || cost < bestCost { + bestMode, bestCost = mode, cost + } + } + + return bestMode +} + +// satd is the Hadamard transformed absolute difference between the source and a +// prediction, over 8x8 at a time. It stands in for what the residual will cost +// far better than the plain difference does, and for a fraction of coding it. +// The sum only grows, so one that has reached limit is returned short. +func (e *intraEncoder[P]) satd(x, y int, pred []P, n int, limit int64) int64 { + src := e.src[0] + stride := e.width + + var sum int64 + + // The kernels are eight bit; anything deeper takes the Go path. + s8, _ := any(src).([]uint8) + p8, _ := any(pred).([]uint8) + + for by := 0; by < n; by += 8 { + for bx := 0; bx < n; bx += 8 { + if sum >= limit { + return sum + } + + so, po := (y+by)*stride+x+bx, by*n+bx + + if k := satd16x8Asm; k != nil && s8 != nil && bx+16 <= n { + sum += k(s8[so:], stride, p8[po:], n) + bx += 8 + + continue + } + + sum += satd8x8Go(src[so:], stride, pred[po:], n) + } + } + + return sum +} + +// satd8x8Go is one 8x8 of satd, the rows transformed and then the columns. +func satd8x8Go[P pixel](src []P, srcStride int, pred []P, predStride int) int64 { + var d [64]int32 + + for j := range 8 { + row := src[j*srcStride:] + p := pred[j*predStride:] + + for i := range 8 { + d[j*8+i] = int32(row[i]) - int32(p[i]) + } + } + + for j := range 8 { + hadamard8((*[8]int32)(d[j*8 : j*8+8])) + } + + var sum int64 + + var col [8]int32 + + for i := range 8 { + for j := range 8 { + col[j] = d[j*8+i] + } + + hadamard8(&col) + + for j := range 8 { + sum += int64(absLevel(col[j])) + } + } + + return sum +} + +func hadamard8(v *[8]int32) { + var t [8]int32 + + for i := range 4 { + t[i] = v[i] + v[i+4] + t[i+4] = v[i] - v[i+4] + } + + var u [8]int32 + + for _, o := range [2]int{0, 4} { + u[o] = t[o] + t[o+2] + u[o+1] = t[o+1] + t[o+3] + u[o+2] = t[o] - t[o+2] + u[o+3] = t[o+1] - t[o+3] + } + + for _, o := range [4]int{0, 2, 4, 6} { + v[o] = u[o] + u[o+1] + v[o+1] = u[o] - u[o+1] + } +} + +// modeRate is what one mode costs, at rateShift. +func (e *intraEncoder[P]) modeRate(cand [3]int, mode int, coef []int32, cbf bool) int64 { + w := e.cabac.counter() + + lossyIntraLumaMode(&w, mode, cand) + + w.encodeBin(ctxCBFLuma, boolToBit(cbf)) + + if cbf { + _ = encodeResidual(&w, &e.s, &e.p, coef, + residualBlock{log2Size: 4, predModeIntra: mode, intra: true}) + } + + return w.rate +} + +func (e *intraEncoder[P]) tu8Rate(plan *lossyTU8Plan, mode int) int64 { + w := e.cabac.counter() + + w.encodeBin(ctxSplitTransformFlag+2, boolToBit(plan.split)) + + if plan.split { + for i := range plan.y { + e.rateResidual(&w, plan.y[i][:], plan.cbfY[i], 2, mode) + } + } else { + e.rateResidual(&w, plan.y8[:], plan.cbfY8, 3, mode) + } + + return w.rate +} + +// modeShortlist is how many of the 35 intra modes are coded in full. Six and +// eight measure the same; four is worse on a large picture. +const modeShortlist = 6 + +// lambdaShift is the fraction lossyLambda carries. +const lambdaShift = 8 + +// rdCost weighs squared error against bits, both at rateShift. +func (e *intraEncoder[P]) rdCost(dist, rate int64) int64 { + return dist<<(rateShift+lambdaShift) + e.lambda*rate +} + +func (e *intraEncoder[P]) rateResidual(w *cabacWriter, coef []int32, cbf bool, log2Size, mode int) { + w.encodeBin(ctxCBFLuma, boolToBit(cbf)) + + if cbf { + _ = encodeResidual(w, &e.s, &e.p, coef, + residualBlock{log2Size: log2Size, predModeIntra: mode, intra: true}) + } +} + +// distortion is the squared error between the source and block, which is a +// trial reconstruction or a window on the picture reconstruction. +func (e *intraEncoder[P]) distortion(cIdx, x, y, n int, block []P, blockStride int) int64 { + stride := e.stride(cIdx) + src := e.src[cIdx] + + if k := sse8Asm; k != nil { + if s8, ok := any(src).([]uint8); ok { + b8, _ := any(block).([]uint8) + + return k(s8[y*stride+x:], stride, b8, blockStride, n) + } + } + + return sse8Go(src[y*stride+x:], stride, block, blockStride, n) +} + +// sse8Go is the squared error of an n by n block. +func sse8Go[P pixel](src []P, srcStride int, block []P, blockStride, n int) int64 { + var dist int64 + + for j := range n { + for i := range n { + d := int64(src[j*srcStride+i]) - int64(block[j*blockStride+i]) + dist += d * d + } + } + + return dist +} + +// codeBlock codes one transform block and writes its reconstruction back. +func (e *intraEncoder[P]) codeBlock(b lossyBlock[P], rdoq bool) ([]int32, bool) { + e.prepareRef(b) + coef, block, cbf := e.blockData(b, rdoq) + + stride := e.stride(b.cIdx) + for j := range b.n { + copy(e.recon[b.cIdx][(b.y+j)*stride+b.x:], block[j*b.n:(j+1)*b.n]) + } + + e.markCoded(b.cIdx, b.x, b.y, b.n) + + return coef, cbf +} + +// markCoded records that a block of the plane has been reconstructed, at the +// 4x4 granularity the reference samples are looked up in. +func (e *intraEncoder[P]) markCoded(cIdx, x, y, n int) { + coded := e.coded[min(cIdx, 1)] + blocksWide := e.stride(cIdx) / 4 + + for j := range n / 4 { + for i := range n / 4 { + coded[(y/4+j)*blocksWide+x/4+i] = 1 + } + } +} + +// blockData predicts, transforms, quantises and reconstructs one block against +// the reference samples prepareRef has already built. +func (e *intraEncoder[P]) blockData(b lossyBlock[P], rdoq bool) ([]int32, []P, bool) { + n := b.n + count := n * n + stride := e.stride(b.cIdx) + qp := e.blockQP(b.cIdx) + + pred := e.scratch.pred[:count] + residual := e.scratch.residual[:count] + coef := e.scratch.coef[:count] + reconCoef := e.scratch.reconCoef[:count] + + if b.pred != nil { + copy(pred, b.pred) + } else { + e.scratch.ref.copyFrom(&e.scratch.base) + filterRef(&e.scratch.ref, b.mode, b.cIdx, e.bitDepth, &e.s) + intraPredict(pred, 0, n, &e.scratch.ref, b.mode, b.cIdx, e.bitDepth) + } + + src := e.src[b.cIdx] + + for j := range n { + for i := range n { + residual[j*n+i] = int32(src[(b.y+j)*stride+b.x+i]) - int32(pred[j*n+i]) + } + } + + if b.dst { + forwardTransformDST4(reconCoef, residual, e.bitDepth) + } else { + forwardTransform(reconCoef, residual, n, e.bitDepth) + } + + if rdoq { + e.rdoq(coef, reconCoef, n, qp, b.cIdx, b.mode) + } else { + quantize(coef, reconCoef, n, qp, e.bitDepth) + } + + if !hasCoefficients(coef) { + return coef, pred, false + } + + copy(reconCoef, coef) + dequant(reconCoef, nil, n, qp, e.bitDepth, false) + inverseTransform(reconCoef, n, b.dst, e.bitDepth, false, &e.scratch.transform) + addResidual(pred, n, 0, 0, n, residualShiftBits(e.bitDepth, false), reconCoef, e.bitDepth) + + return coef, pred, true +} + +// prepareRef builds the reference samples of 8.4.4.2.2, which do not depend on +// the prediction mode. +func (e *intraEncoder[P]) prepareRef(b lossyBlock[P]) { + n, stride := b.n, e.stride(b.cIdx) + recon := e.recon[b.cIdx] + avail := e.scratch.avail[:4*n+1] + clear(avail) + + e.scratch.base.n = n + coded := e.coded[min(b.cIdx, 1)] + blocksWide := stride / 4 + rows := len(recon) / stride + + for i := range 4*n + 1 { + var nx, ny int + + switch { + case i < 2*n: + nx, ny = b.x-1, b.y+2*n-1-i + case i == 2*n: + nx, ny = b.x-1, b.y-1 + default: + nx, ny = b.x+i-2*n-1, b.y-1 + } + + if nx < 0 || ny < 0 || nx >= stride || ny >= rows || + coded[ny/4*blocksWide+nx/4] == 0 { + continue + } + + e.scratch.base.s[i] = int32(recon[ny*stride+nx]) + avail[i] = true + } + + e.scratch.base.substitute(avail, e.bitDepth) +} + +// lambdaScale is the constant in front of the quantiser's own curve, at Q8, +// which is the usual 0.57. +const lambdaScale = 146 + +// lossyLambda weights bits against squared error at Q8, doubling every three +// QP the way the quantiser's step does. +func lossyLambda(qp int) int64 { + return max(1, int64(math.Round(float64(lambdaScale)*math.Exp2(float64(qp-12)/3)))) +} + +// lossyMPM is the candidate list of 8.4.2. A block on the top edge of its +// coding tree block has no candidate above it. +func lossyMPM(modes []int, blocksWide, x, y, ctbBlocks int) [3]int { + candA, candB := intraDC, intraDC + + if x > 0 { + candA = modes[y*blocksWide+x-1] + } + + if y > 0 && y%ctbBlocks != 0 { + candB = modes[(y-1)*blocksWide+x] + } + + var cand [3]int + + switch { + case candA == candB && candA < 2: + cand = [3]int{intraPlanar, intraDC, intraVer} + case candA == candB: + cand = [3]int{candA, 2 + (candA+29)%32, 2 + (candA-2+1)%32} + default: + cand[0], cand[1] = candA, candB + + switch { + case candA != intraPlanar && candB != intraPlanar: + cand[2] = intraPlanar + case candA != intraDC && candB != intraDC: + cand[2] = intraDC + default: + cand[2] = intraVer + } + } + + return cand +} + +func lossyIntraLumaMode(w *cabacWriter, mode int, cand [3]int) { + for i, m := range cand { + if mode != m { + continue + } + + w.encodeBin(ctxPrevIntraLumaPredFlag, 1) + + if i == 0 { + w.encodeBypass(0) + } else { + w.encodeBypass(1) + w.encodeBypass(uint32(i - 1)) + } + + return + } + + w.encodeBin(ctxPrevIntraLumaPredFlag, 0) + + rem := mode + + for _, m := range cand { + if mode > m { + rem-- + } + } + + w.encodeBypassBits(uint32(rem), 5) +} + +func hasCoefficients(coef []int32) bool { + for _, v := range coef { + if v != 0 { + return true + } + } + + return false +} diff --git a/third_party/h265/hevc/mvpred.go b/third_party/h265/hevc/mvpred.go new file mode 100644 index 00000000..5a1ed7f2 --- /dev/null +++ b/third_party/h265/hevc/mvpred.go @@ -0,0 +1,276 @@ +package hevc + +type mv struct { + x, y int16 +} + +// predFlag records which lists a prediction unit uses. +type mvInfo struct { + mv [2]mv + refIdx [2]int8 + pred [2]bool +} + +func (m *mvInfo) sameMotion(o *mvInfo) bool { + return m.pred == o.pred && m.mv == o.mv && m.refIdx == o.refIdx +} + +// neighbour supplies the motion of an already-decoded block, or reports it +// unavailable. It stands in for the picture-wide motion field. +type neighbour func(x, y int) (*mvInfo, bool) + +// mergeCandidates is the spatial part of 8.5.3.2.2 and 8.5.3.2.3: A1, B1, B0, +// A0 and B2 in that order, with the pruning comparisons the clause specifies +// and the partition rules that stop a 2NxN or Nx2N unit from collapsing onto +// its sibling. +func mergeCandidates(dst []mvInfo, nb neighbour, xPb, yPb, nPbW, nPbH, partIdx, partMode, + maxCand int, parMrgLevel int, +) []mvInfo { + inSameRegion := func(xN, yN int) bool { + return xPb>>parMrgLevel == xN>>parMrgLevel && yPb>>parMrgLevel == yN>>parMrgLevel + } + + get := func(xN, yN int) (*mvInfo, bool) { + if inSameRegion(xN, yN) { + return nil, false + } + + return nb(xN, yN) + } + + cand := dst[:0] + + // A partition rule that excludes A1 or B1 also removes it from the pruning + // comparisons; being pruned as a duplicate does not. + a1, availA1 := get(xPb-1, yPb+nPbH-1) + if partIdx == 1 && (partMode == partModeNx2N || partMode == partModenLx2N || + partMode == partModenRx2N) { + availA1 = false + } + + if availA1 { + cand = append(cand, *a1) + } + + b1, availB1 := get(xPb+nPbW-1, yPb-1) + if partIdx == 1 && (partMode == partMode2NxN || partMode == partMode2NxnU || + partMode == partMode2NxnD) { + availB1 = false + } + + if availB1 && !(availA1 && a1.sameMotion(b1)) { + cand = append(cand, *b1) + } + + if b0, ok := get(xPb+nPbW, yPb-1); ok && !(availB1 && b1.sameMotion(b0)) { + cand = append(cand, *b0) + } + + if a0, ok := get(xPb-1, yPb+nPbH); ok && !(availA1 && a1.sameMotion(a0)) { + cand = append(cand, *a0) + } + + if len(cand) < 4 { + if b2, ok := get(xPb-1, yPb-1); ok && + !(availA1 && a1.sameMotion(b2)) && !(availB1 && b1.sameMotion(b2)) { + cand = append(cand, *b2) + } + } + + if len(cand) > maxCand { + cand = cand[:maxCand] + } + + return cand +} + +// combineBiCandidates is 8.5.3.2.4, which pairs the L0 of one candidate with +// the L1 of another until the list is full. It applies to B slices only. +func combineBiCandidates(cand []mvInfo, maxCand int, lists [2][]int32) []mvInfo { + // Table 8-6, the order the pairs are tried in. + l0Idx := [12]int{0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3} + l1Idx := [12]int{1, 0, 2, 0, 2, 1, 3, 0, 3, 1, 3, 2} + + orig := len(cand) + if orig < 2 { + return cand + } + + for k := 0; k < orig*(orig-1) && len(cand) < maxCand; k++ { + if k >= len(l0Idx) { + break + } + + a, b := &cand[l0Idx[k]], &cand[l1Idx[k]] + + if !a.pred[0] || !b.pred[1] { + continue + } + + if int(a.refIdx[0]) >= len(lists[0]) || int(b.refIdx[1]) >= len(lists[1]) { + continue + } + + if lists[0][a.refIdx[0]] == lists[1][b.refIdx[1]] && a.mv[0] == b.mv[1] { + continue + } + + cand = append(cand, mvInfo{ + mv: [2]mv{a.mv[0], b.mv[1]}, + refIdx: [2]int8{a.refIdx[0], b.refIdx[1]}, + pred: [2]bool{true, true}, + }) + } + + return cand +} + +// zeroCandidates is 8.5.3.2.5, the zero-motion fill that guarantees the list +// reaches its full length. +func zeroCandidates(cand []mvInfo, maxCand, numRefIdx int, biPred bool) []mvInfo { + for i := 0; len(cand) < maxCand; i++ { + r := int8(0) + if i < numRefIdx { + r = int8(i) + } + + c := mvInfo{refIdx: [2]int8{r, r}, pred: [2]bool{true, biPred}} + if !biPred { + c.refIdx[1] = -1 + } + + cand = append(cand, c) + } + + return cand +} + +// scaleMV is the temporal distance scaling of 8.5.3.2.8, shared by the +// temporal merge candidate and the spatial predictors that cross references. +func scaleMV(v mv, currPoc, refPoc, colPoc, colRefPoc int32) mv { + td := clip3(colPoc-colRefPoc, -128, 127) + tb := clip3(currPoc-refPoc, -128, 127) + + if td == 0 { + return v + } + + tx := (16384 + absI32(td)/2) / td + scale := clip3((tb*tx+32)>>6, -4096, 4095) + + sx := scale * int32(v.x) + sy := scale * int32(v.y) + + return mv{ + x: int16(clip3(sign(sx)*((absI32(sx)+127)>>8), -32768, 32767)), + y: int16(clip3(sign(sy)*((absI32(sy)+127)>>8), -32768, 32767)), + } +} + +func sign(v int32) int32 { + switch { + case v < 0: + return -1 + case v > 0: + return 1 + } + + return 0 +} + +const ( + predL0 = iota + predL1 + predBI +) + +// refPic pairs a reference picture with the POC the lists resolved it to. +type refPic struct { + poc int32 + pic *Picture +} + +// amvpCandidates is 8.5.3.2.7. It reports the left and above predictors and +// whether each was found, leaving 8.5.3.2.6 to assemble the list. +func amvpCandidates(nb neighbour, xPb, yPb, nPbW, nPbH int, list int, refPoc int32, + currPoc int32, lists [2][]int32, long [2][]bool, refLong bool, +) (out [2]mv, avail [2]bool) { + direct := func(m *mvInfo) (mv, bool) { + for k := range 2 { + l := list ^ k + + if m.pred[l] && int(m.refIdx[l]) < len(lists[l]) && + lists[l][m.refIdx[l]] == refPoc { + return m.mv[l], true + } + } + + return mv{}, false + } + + // 8.5.3.2.7 takes a neighbour only when its reference matches the target in + // long term status, and never scales a long term vector. + scaled := func(m *mvInfo) (mv, bool) { + for k := range 2 { + l := list ^ k + + if !m.pred[l] || int(m.refIdx[l]) >= len(lists[l]) { + continue + } + + if long[l][m.refIdx[l]] != refLong { + continue + } + + if refLong { + return m.mv[l], true + } + + return scaleMV(m.mv[l], currPoc, refPoc, currPoc, lists[l][m.refIdx[l]]), true + } + + return mv{}, false + } + + sweep := func(pos [][2]int, pick func(*mvInfo) (mv, bool)) (mv, bool) { + for _, p := range pos { + m, ok := nb(p[0], p[1]) + if !ok { + continue + } + + if v, ok := pick(m); ok { + return v, true + } + } + + return mv{}, false + } + + left := [][2]int{{xPb - 1, yPb + nPbH}, {xPb - 1, yPb + nPbH - 1}} + above := [][2]int{{xPb + nPbW, yPb - 1}, {xPb + nPbW - 1, yPb - 1}, {xPb - 1, yPb - 1}} + + isScaled := false + + for _, p := range left { + if _, ok := nb(p[0], p[1]); ok { + isScaled = true + } + } + + out[0], avail[0] = sweep(left, direct) + if !avail[0] { + out[0], avail[0] = sweep(left, scaled) + } + + out[1], avail[1] = sweep(above, direct) + + // With no left neighbour at all the above predictor becomes the first + // candidate and the second is derived again, this time with scaling. + if !isScaled { + out[0], avail[0] = out[1], avail[1] + out[1], avail[1] = sweep(above, scaled) + } + + return out, avail +} diff --git a/third_party/h265/hevc/nal.go b/third_party/h265/hevc/nal.go new file mode 100644 index 00000000..6c355945 --- /dev/null +++ b/third_party/h265/hevc/nal.go @@ -0,0 +1,331 @@ +package hevc + +import "bytes" + +// NALType is the nal_unit_type field of a NAL unit header. +type NALType uint8 + +const ( + NALTrailN NALType = iota + NALTrailR + NALTsaN + NALTsaR + NALStsaN + NALStsaR + NALRadlN + NALRadlR + NALRaslN + NALRaslR +) + +const ( + NALBlaWLP NALType = iota + 16 + NALBlaWRadl + NALBlaNLP + NALIdrWRadl + NALIdrNLP + NALCra +) + +const ( + NALVPS NALType = iota + 32 + NALSPS + NALPPS + NALAUD + NALEOS + NALEOB + NALFD + NALPrefixSEI + NALSuffixSEI +) + +// IsVCL reports whether the unit carries a coded slice segment. +func (t NALType) IsVCL() bool { + return t < 32 +} + +// IsIDR reports whether the unit starts an instantaneous decoding refresh picture. +func (t NALType) IsIDR() bool { + return t == NALIdrWRadl || t == NALIdrNLP +} + +// IsIRAP reports whether the unit starts an intra random access point picture. +func (t NALType) IsIRAP() bool { + return t >= NALBlaWLP && t <= NALCra +} + +// NALUnit is one parsed NAL unit. +type NALUnit struct { + Type NALType + LayerID uint8 + TemporalID uint8 + RBSP []byte + + EPB []uint32 +} + +// ParseNAL parses a single NAL unit with a two-byte header and no framing. +func ParseNAL(data []byte) (NALUnit, bool) { + if len(data) < 2 { + return NALUnit{}, false + } + + b0, b1 := data[0], data[1] + if b0&0x80 != 0 { + return NALUnit{}, false + } + + tidPlus1 := b1 & 0x07 + if tidPlus1 == 0 { + return NALUnit{}, false + } + + rbsp, epb := unescape(data[2:]) + + return NALUnit{ + Type: NALType(b0 >> 1 & 0x3f), + LayerID: b0&0x01<<5 | b1>>3, + TemporalID: tidPlus1 - 1, + RBSP: rbsp, + EPB: epb, + }, true +} + +// SplitAnnexB splits a start-code delimited byte stream into NAL units. +func SplitAnnexB(data []byte) []NALUnit { + var nals []NALUnit + + i, _, ok := startCode(data, 0) + if !ok { + return nals + } + + for i < len(data) { + next, scStart, found := startCode(data, i) + + end := len(data) + if found { + end = scStart + for end > i && data[end-1] == 0 { + end-- + } + } + + if nal, ok := ParseNAL(data[i:end]); ok { + nals = append(nals, nal) + } + + if !found { + break + } + + i = next + } + + return nals +} + +// SplitHVCC splits length-prefixed NAL units, as framed inside hvcC. +func SplitHVCC(data []byte, lengthSize int) []NALUnit { + var nals []NALUnit + + if lengthSize < 1 || lengthSize > 4 { + return nals + } + + for i := 0; i+lengthSize <= len(data); { + n := 0 + for j := range lengthSize { + n = n<<8 | int(data[i+j]) + } + + i += lengthSize + if n < 2 || n > len(data)-i { + break + } + + if nal, ok := ParseNAL(data[i : i+n]); ok { + nals = append(nals, nal) + } + + i += n + } + + return nals +} + +func startCode(data []byte, off int) (next, start int, ok bool) { + for i := off; i+2 < len(data); i++ { + if data[i] != 0 || data[i+1] != 0 { + continue + } + + if data[i+2] == 1 { + return i + 3, i, true + } + + if i+3 < len(data) && data[i+2] == 0 && data[i+3] == 1 { + return i + 4, i, true + } + } + + return 0, 0, false +} + +func unescape(data []byte) ([]byte, []uint32) { + if !bytes.Contains(data, []byte{0, 0, 3}) { + return data, nil + } + + rbsp := make([]byte, 0, len(data)) + + var epb []uint32 + + for i := 0; i < len(data); { + if i+2 < len(data) && data[i] == 0 && data[i+1] == 0 && data[i+2] == 3 { + rbsp = append(rbsp, 0, 0) + epb = append(epb, uint32(i+2)) + i += 3 + + continue + } + + rbsp = append(rbsp, data[i]) + i++ + } + + return rbsp, epb +} + +// RBSPOffset converts a payload-relative byte position, as entry point offsets +// count them, into an index into RBSP. +func (n NALUnit) RBSPOffset(off int) int { + rbsp := off + + for _, p := range n.EPB { + if int(p) >= off { + break + } + + rbsp-- + } + + return rbsp +} + +// NALOffset is the inverse of RBSPOffset. +func (n NALUnit) NALOffset(off int) int { + for _, p := range n.EPB { + if int(p) <= off { + off++ + + continue + } + + break + } + + return off +} + +func marshalNAL(typ NALType, layerID, temporalID uint8, rbsp []byte) []byte { + out := make([]byte, 0, len(rbsp)+2) + out = append(out, + byte(typ)<<1|layerID>>5, + layerID<<3|(temporalID+1)&7, + ) + + return append(out, escapeRBSP(rbsp)...) +} + +func MarshalNAL(nal NALUnit) []byte { + return marshalNAL(nal.Type, nal.LayerID, nal.TemporalID, nal.RBSP) +} + +func marshalAnnexB(nals [][]byte) []byte { + var out []byte + + for _, nal := range nals { + out = append(out, 0, 0, 0, 1) + out = append(out, nal...) + } + + return out +} + +func MarshalAnnexB(nals []NALUnit) []byte { + data := make([][]byte, len(nals)) + for i := range nals { + data[i] = MarshalNAL(nals[i]) + } + + return marshalAnnexB(data) +} + +func marshalHVCC(nals [][]byte, lengthSize int) []byte { + if lengthSize < 1 || lengthSize > 4 { + return nil + } + + var out []byte + + for _, nal := range nals { + if len(nal) == 0 || uint64(len(nal)) >= 1<= 0; i-- { + out = append(out, byte(len(nal)>>uint(i*8))) + } + + out = append(out, nal...) + } + + return out +} + +func escapeRBSP(rbsp []byte) []byte { + out := make([]byte, 0, len(rbsp)) + zeros := 0 + + for _, b := range rbsp { + if zeros == 2 && b <= 3 { + out = append(out, 3) + zeros = 0 + } + + out = append(out, b) + + if b == 0 { + zeros++ + } else { + zeros = 0 + } + } + + return out +} + +// ProfileTierLevel returns the twelve bytes of profile_tier_level, from +// general_profile_space through general_level_idc, out of a sequence parameter +// set RBSP. A container's decoder configuration record repeats them. +func ProfileTierLevel(sps []byte) ([]byte, bool) { + if len(sps) < 13 { + return nil, false + } + + return sps[1:13], true +} + +// SPSFormat is the chroma_format_idc and the two sample sizes a sequence +// parameter set declares. A container's decoder configuration record repeats +// them, and a reader that trusts it over the bitstream has to be told the +// truth. +func SPSFormat(sps []byte) (chromaFormat, bitDepthLuma, bitDepthChroma int, ok bool) { + s, err := parseSPS(sps) + if err != nil { + return 0, 0, 0, false + } + + return int(s.chromaFormatIDC), int(s.bitDepthLuma), int(s.bitDepthChroma), true +} diff --git a/third_party/h265/hevc/pcmenc.go b/third_party/h265/hevc/pcmenc.go new file mode 100644 index 00000000..860688a4 --- /dev/null +++ b/third_party/h265/hevc/pcmenc.go @@ -0,0 +1,64 @@ +package hevc + +func pcmLevelIDC(samples int) uint8 { + for _, level := range []struct { + samples int + idc uint8 + }{ + {36864, 30}, + {122880, 60}, + {245760, 63}, + {552960, 90}, + {983040, 93}, + {2228224, 120}, + {8912896, 150}, + {35651584, 180}, + } { + if samples <= level.samples { + return level.idc + } + } + + return 186 +} + +func pcmSlice[P pixel](y, cb, cr []P, width, height, subW, subH, bitDepth int) []byte { + var bits putBits + bits.bit(1) + bits.bit(0) + bits.ue(0) + bits.ue(uint32(sliceI)) + bits.se(0) + bits.bit(1) + bits.rbspTrailingBits() + + var cabac cabacWriter + cabac.init(&bits, 26, sliceI, false) + + for y0 := 0; y0 < height; y0 += 16 { + for x0 := 0; x0 < width; x0 += 16 { + cabac.encodeBin(ctxPartMode, 1) + cabac.encodeTerminate(1) + cabac.bytes() + + writePCMPlane(&bits, y, width, x0, y0, 16, 16, bitDepth) + + if cb != nil { + writePCMPlane(&bits, cb, width/subW, x0/subW, y0/subH, 16/subW, 16/subH, bitDepth) + writePCMPlane(&bits, cr, width/subW, x0/subW, y0/subH, 16/subW, 16/subH, bitDepth) + } + cabac.reinit() + cabac.encodeTerminate(boolToBit(x0 == width-16 && y0 == height-16)) + } + } + + return cabac.bytes() +} + +func writePCMPlane[P pixel](bits *putBits, plane []P, stride, x, y, w, h, bitDepth int) { + for j := range h { + for i := range w { + bits.bits(uint64(plane[(y+j)*stride+x+i]), bitDepth) + } + } +} diff --git a/third_party/h265/hevc/picture.go b/third_party/h265/hevc/picture.go new file mode 100644 index 00000000..16711d44 --- /dev/null +++ b/third_party/h265/hevc/picture.go @@ -0,0 +1,278 @@ +package hevc + +// Picture is one decoded picture. Planes hold either 8-bit or 16-bit samples +// depending on the bit depth, with Stride in samples. +type Picture struct { + Width, Height int + + // CropW and CropH are the dimensions after the conformance window, which + // is what a caller should display. Width and Height stay as decoded, + // since prediction reads the whole plane. + CropX, CropY int + CropW, CropH int + + ChromaFormat int + + // BitDepth and BitDepthC are the luma and chroma sample depths, which + // 7.4.3.2 lets differ. Both planes are stored 16-bit if either exceeds 8. + BitDepth int + BitDepthC int + + // ColorPrimaries, ColorTransfer, ColorMatrix and FullRange are what the + // sequence declares in its video usability information, as the code points + // of ISO/IEC 23091-2. All three are 2, unspecified, when it declares none. + ColorPrimaries uint16 + ColorTransfer uint16 + ColorMatrix uint16 + FullRange bool + + POC int + + Y, Cb, Cr []uint8 + Y16, Cb16, Cr16 []uint16 + + StrideY, StrideC int + WidthC, HeightC int + + Col []colMotion + ColW int + + pool *picPool + refs int32 +} + +// Release hands the picture's memory back to the decoder that produced it, to +// be reused by a later picture. It is optional: one that is never released is +// collected as any other value would be. Reading the planes afterwards is a +// mistake; releasing twice is not, and does nothing. +func (p *Picture) Release() { + p.release() +} + +func (p *Picture) acquire() { + if p != nil { + p.refs++ + } +} + +func (p *Picture) release() { + if p == nil || p.refs == 0 { + return + } + + p.refs-- + if p.refs > 0 { + return + } + + g := p.geom() + + b := picBufs{ + col: p.Col, + y: p.Y, cb: p.Cb, cr: p.Cr, + y16: p.Y16, cb16: p.Cb16, cr16: p.Cr16, + } + + pool := p.pool + p.pool = nil + + // Dropping the planes turns a read after release into a panic rather than + // a later picture's samples. + p.Col = nil + p.Y, p.Cb, p.Cr = nil, nil, nil + p.Y16, p.Cb16, p.Cr16 = nil, nil, nil + + pool.put(g, b) +} + +// picBufs is the sample memory of one picture, the only part worth recycling. +type picBufs struct { + col []colMotion + y, cb, cr []uint8 + y16, cb16, cr16 []uint16 +} + +// picGeom is everything that fixes a picture's buffer sizes, so a recycled one +// needs no reallocation. +type picGeom struct { + strideY, height int + strideC, heightC int + colLen int + deep bool +} + +func (p *Picture) geom() picGeom { + return picGeom{ + strideY: p.StrideY, height: p.Height, + strideC: p.StrideC, heightC: p.HeightC, + colLen: len(p.Col), + deep: p.Y16 != nil, + } +} + +// picPoolDepth bounds how many pictures of one shape are kept, so a sequence +// that changes resolution cannot make the pool grow without end. +const picPoolDepth = 8 + +// picPool holds the pictures nobody references any more. A decoder keeps one, +// so everything it recycles came from the same sequence. +type picPool struct { + free map[picGeom][]picBufs +} + +func (pl *picPool) get(g picGeom) (picBufs, bool) { + if pl == nil { + return picBufs{}, false + } + + free := pl.free[g] + if len(free) == 0 { + return picBufs{}, false + } + + b := free[len(free)-1] + free[len(free)-1] = picBufs{} + pl.free[g] = free[:len(free)-1] + + return b, true +} + +func (pl *picPool) put(g picGeom, b picBufs) { + if pl == nil { + return + } + + if pl.free == nil { + pl.free = make(map[picGeom][]picBufs) + } + + if len(pl.free[g]) < picPoolDepth { + pl.free[g] = append(pl.free[g], b) + } +} + +func newPicture(pool *picPool, s *sps) *Picture { + p := &Picture{ + Width: int(s.picWidthInLumaSamples), + Height: int(s.picHeightInLumaSamples), + ChromaFormat: int(s.chromaFormatIDC), + BitDepth: int(s.bitDepthLuma), + BitDepthC: int(s.bitDepthChroma), + + ColorPrimaries: s.colourPrimaries, + ColorTransfer: s.transferChar, + ColorMatrix: s.matrixCoeffs, + FullRange: s.fullRange, + } + + p.CropX = int(s.confWinLeft) * s.subWidthC + p.CropY = int(s.confWinTop) * s.subHeightC + p.CropW = int(s.croppedWidth()) + p.CropH = int(s.croppedHeight()) + + p.StrideY = p.Width + p.WidthC = p.Width / s.subWidthC + p.HeightC = p.Height / s.subHeightC + p.StrideC = p.WidthC + + if s.chromaFormatIDC == 0 { + p.WidthC, p.HeightC, p.StrideC = 0, 0, 0 + } + + p.ColW = (p.Width + 15) / 16 + + g := picGeom{ + strideY: p.StrideY, height: p.Height, + strideC: p.StrideC, heightC: p.HeightC, + colLen: p.ColW * ((p.Height + 15) / 16), + deep: max(s.bitDepthLuma, s.bitDepthChroma) > 8, + } + + // A recycled picture keeps only its buffers; everything derived from the + // sequence has already been filled in above, and the samples are zeroed so + // a reused one is indistinguishable from a fresh one. + if r, ok := pool.get(g); ok { + p.Col, p.Y, p.Cb, p.Cr = r.col, r.y, r.cb, r.cr + p.Y16, p.Cb16, p.Cr16 = r.y16, r.cb16, r.cr16 + + clear(p.Col) + clear(p.Y) + clear(p.Cb) + clear(p.Cr) + clear(p.Y16) + clear(p.Cb16) + clear(p.Cr16) + + p.pool, p.refs = pool, 1 + + return p + } + + p.pool, p.refs = pool, 1 + + p.Col = make([]colMotion, g.colLen) + + if g.deep { + p.Y16 = make([]uint16, p.StrideY*p.Height) + p.Cb16 = make([]uint16, p.StrideC*p.HeightC) + p.Cr16 = make([]uint16, p.StrideC*p.HeightC) + + return p + } + + p.Y = make([]uint8, p.StrideY*p.Height) + p.Cb = make([]uint8, p.StrideC*p.HeightC) + p.Cr = make([]uint8, p.StrideC*p.HeightC) + + return p +} + +// deep reports whether the planes hold 16-bit samples. +func (p *Picture) deep() bool { + return p.Y16 != nil +} + +// depth is the sample depth of one component. +func (p *Picture) depth(cIdx int) int { + if cIdx == 0 { + return p.BitDepth + } + + return p.BitDepthC +} + +func (p *Picture) plane8(cIdx int) ([]uint8, int) { + switch cIdx { + case 0: + return p.Y, p.StrideY + case 1: + return p.Cb, p.StrideC + default: + return p.Cr, p.StrideC + } +} + +func (p *Picture) plane16(cIdx int) ([]uint16, int) { + switch cIdx { + case 0: + return p.Y16, p.StrideY + case 1: + return p.Cb16, p.StrideC + default: + return p.Cr16, p.StrideC + } +} + +// The collocated motion field, subsampled to 16x16 as 8.5.3.2.9 allows. +// Reference pictures are held by POC so the collocated picture's own lists are +// not needed later. +type colMotion struct { + info mvInfo + refPoc [2]int32 + refLong [2]bool + intra bool +} + +func (p *Picture) colIndex(x, y int) int { + return (y>>4)*p.ColW + x>>4 +} diff --git a/third_party/h265/hevc/putbits.go b/third_party/h265/hevc/putbits.go new file mode 100644 index 00000000..a22c3ebe --- /dev/null +++ b/third_party/h265/hevc/putbits.go @@ -0,0 +1,66 @@ +package hevc + +type putBits struct { + data []byte + cur uint8 + nbits uint8 +} + +func (w *putBits) bit(v uint32) { + w.cur = w.cur<<1 | uint8(v&1) + w.nbits++ + + if w.nbits == 8 { + w.data = append(w.data, w.cur) + w.cur, w.nbits = 0, 0 + } +} + +func (w *putBits) bits(v uint64, n int) { + for n > 0 { + n-- + w.bit(uint32(v >> n & 1)) + } +} + +func (w *putBits) ue(v uint32) { + n := 0 + + for x := v + 1; x > 1; x >>= 1 { + n++ + } + + for range n { + w.bit(0) + } + + w.bits(uint64(v)+1, n+1) +} + +func (w *putBits) se(v int32) { + var u uint32 + if v <= 0 { + u = uint32(-v) << 1 + } else { + u = uint32(v)<<1 - 1 + } + + w.ue(u) +} + +func (w *putBits) rbspTrailingBits() { + w.bit(1) + + for w.nbits != 0 { + w.bit(0) + } +} + +// count is the number of bits written, which the rate estimates measure. +func (w *putBits) count() int { + return len(w.data)*8 + int(w.nbits) +} + +func (w *putBits) bytes() []byte { + return w.data +} diff --git a/third_party/h265/hevc/rdoq.go b/third_party/h265/hevc/rdoq.go new file mode 100644 index 00000000..6ff227f2 --- /dev/null +++ b/third_party/h265/hevc/rdoq.go @@ -0,0 +1,384 @@ +package hevc + +// Rate distortion optimised quantisation. Rounding a coefficient to the nearest +// level is only right when bits are free; 8.6.3 leaves the encoder to weigh the +// error a coarser level makes against the bits it saves, which is what this +// does, one coefficient at a time and in the order 7.3.8.11 codes them. + +// quantScale is the multiplier of 8.6.3 and the shift that follows it. +func quantScale(n, qp, bitDepth int) (scale int64, qbits uint) { + qbits = uint(14 + qp/6 + 15 - bitDepth - log2(n)) + scale = (int64(1)<<20 + int64(levelScale[qp%6])/2) / int64(levelScale[qp%6]) + + return scale, qbits +} + +// levelDist is the squared picture error one level of the quantiser makes, +// scaled so that levelError's shifted square lands in rdCost's units. A level +// is levelScale[qp%6] << (qp/6) over 64 in the picture, which is the square +// root of this. +func levelDist(qp int) int64 { + return int64(levelScale[qp%6]) * int64(levelScale[qp%6]) << (2 * (qp / 6)) +} + +// levelError is the squared error a level leaves, in the units rdCost weighs +// against bits. A level of the quantiser is levelScale[qp%6] << (qp/6) over 64 +// in the picture, which is where the constant comes from; the shift by 15 keeps +// the square inside 64 bits, and the 19 it is short is carried by the rate. +func levelError(err int64, shift uint, dist int64) int64 { + e := err >> shift + + return e * e * dist +} + +// rdoqState carries what the level passes of 7.3.8.11 make the next coefficient +// cost: which context set the greater-than-one flags are in, how far the +// greater-than-one run has got, and the Rice parameter. +type rdoqState struct { + ctxSet int + greater1Ctx int + lastGreater1 int + numSig int + rice int + started bool + last bool +} + +// binBits is what one context coded bin costs against the contexts as they +// stand, which is the estimate 9.3.4.3 would give it. +func (e *intraEncoder[P]) binBits(ctx int, bin uint32) int64 { + return int64(entropyBits[e.cabac.state[ctx]^uint8(bin&1)]) +} + +// remainingBits is the length of the 9.3.3.11 binarisation, all of it bypass. +func remainingBits(v int32, rice int) int64 { + if v < 3<>rice+1+int32(rice)) << rateShift + } + + k := 0 + for v >= ((1<<(k+1))+2)< 0 { + ctx += 16 + } + + bits += e.binBits(ctxCoeffAbsLevelGreater1Flag+ctx, boolToBit(level > 1)) + want = 2 + + if level > 1 { + base = 2 + + if st.lastGreater1 < 0 { + ctx := st.ctxSet + if cIdx > 0 { + ctx += 4 + } + + bits += e.binBits(ctxCoeffAbsLevelGreater2Flag+ctx, boolToBit(level > 2)) + want = 3 + + if level > 2 { + base = 3 + } + } + } + } + + if base == want { + bits += remainingBits(level-base, st.rice) + } + + return bits +} + +// advance moves the level passes on by one coded coefficient. +func (st *rdoqState) advance(level int32) { + if st.numSig < 8 { + if level > 1 { + if st.lastGreater1 < 0 { + st.lastGreater1 = st.numSig + } + + st.greater1Ctx = 0 + } else if st.greater1Ctx > 0 { + st.greater1Ctx++ + } + } + + if level > 3<> 2 + + num := e.scratch.num[:n*n] + for i, v := range raw[:n*n] { + t := int64(v) + if t < 0 { + t = -t + } + + num[i] = t * scale + } + + // The significance of a sub-block feeds the contexts of the ones before it, + // so it is taken from where the levels round to rather than from decisions + // not yet made. + var csbf [8 * 8]bool + + lastSB, lastPos := -1, -1 + + for i, sb := range sbScan { + for k, pos := range coeffScan { + idx := (int(sb.y)<<2+int(pos.y))*n + int(sb.x)<<2 + int(pos.x) + if (num[idx]+int64(1)<<(qbits-1))>>qbits == 0 { + continue + } + + csbf[int(sb.y)*sbWidth+int(sb.x)] = true + lastSB, lastPos = i, k + } + } + + clear(coef[:n*n]) + + if lastSB < 0 { + return + } + + // Each coefficient's cost is kept so that the last significant position can + // be reconsidered once every level is known. + cost := e.scratch.cost[:n*n] + costZero := e.scratch.costZero[:n*n] + costSig := e.scratch.costSig[:n*n] + + clear(cost) + clear(costZero) + clear(costSig) + + var st rdoqState + + for i := lastSB; i >= 0; i-- { + sb := sbScan[i] + xS, yS := int(sb.x), int(sb.y) + + if !csbf[yS*sbWidth+xS] { + continue + } + + prevCsbf := 0 + if xS+1 < sbWidth && csbf[yS*sbWidth+xS+1] { + prevCsbf++ + } + + if yS+1 < sbWidth && csbf[(yS+1)*sbWidth+xS] { + prevCsbf += 2 + } + + sigSet := newSigCtxSet(xS, yS, log2(n), cIdx, scanIdx, prevCsbf, false) + + st.ctxSet = 0 + if i > 0 && cIdx == 0 { + st.ctxSet = 2 + } + + if st.started && st.greater1Ctx == 0 { + st.ctxSet++ + } + + st.started = true + st.greater1Ctx = 1 + st.lastGreater1 = -1 + st.numSig = 0 + + // A sub-block whose levels cost more than the error of dropping them + // is dropped, which is a saving the flag itself pays for. + coded, dropped := int64(0), int64(0) + optional := i > 0 && i < lastSB + + start := numSbCoeff - 1 + if i == lastSB { + start = lastPos + } + + for k := start; k >= 0; k-- { + pos := coeffScan[k] + idx := (yS<<2+int(pos.y))*n + xS<<2 + int(pos.x) + scan := i*numSbCoeff + k + t := num[idx] + + sig := ctxSignificantCoeffFlag + sigSet.at(int(pos.x), int(pos.y)) + nearest := int32((t + int64(1)<<(qbits-1)) >> qbits) + zero := levelError(t, shift, dist) + + best := int32(0) + chosen := zero + lambda*e.binBits(sig, 0) + sigBits := lambda * e.binBits(sig, 0) + + for level := nearest; level >= max(1, nearest-1); level-- { + c := levelError(t-int64(level)< 0 { + ctx += 2 + } + + if dropped+lambda*e.binBits(ctx, 0) >= coded+lambda*e.binBits(ctx, 1) { + continue + } + + csbf[yS*sbWidth+xS] = false + + for k, pos := range coeffScan { + coef[(yS<<2+int(pos.y))*n+xS<<2+int(pos.x)] = 0 + + scan := i*numSbCoeff + k + cost[scan], costSig[scan] = costZero[scan], 0 + } + } + + e.truncate(coef, cost, costZero, costSig, sbScan, coeffScan, + lastSB*numSbCoeff+lastPos, n, cIdx, scanIdx, lambda) +} + +// truncate reconsiders where the block ends. Coding a nearer coefficient as the +// last one drops everything past it, which pays for itself when what is dropped +// costs more in bits than it is worth in error. +func (e *intraEncoder[P]) truncate(coef []int32, cost, costZero, costSig []int64, + sbScan, coeffScan []scanPos, last, n, cIdx, scanIdx int, lambda int64, +) { + at := func(scan int) int { + sb, pos := sbScan[scan/numSbCoeff], coeffScan[scan%numSbCoeff] + + return (int(sb.y)<<2+int(pos.y))*n + int(sb.x)<<2 + int(pos.x) + } + + base := int64(0) + for scan := 0; scan <= last; scan++ { + base += cost[scan] + } + + best, bestLast := int64(1)<<62, last + + for scan := last; scan >= 0; scan-- { + idx := at(scan) + + level := absLevel(coef[idx]) + if level == 0 { + base -= costSig[scan] + + continue + } + + if total := base - costSig[scan] + lambda*e.lastBits(idx, n, cIdx, scanIdx); total < best { + best, bestLast = total, scan + } + + // Past a level above one there is nothing left worth dropping. + if level > 1 { + break + } + + base += costZero[scan] - cost[scan] + } + + for scan := bestLast + 1; scan <= last; scan++ { + coef[at(scan)] = 0 + } +} + +// lastBits is what last_sig_coeff_x and last_sig_coeff_y cost for a position, +// prefix contexts and bypass suffix together. +func (e *intraEncoder[P]) lastBits(idx, n, cIdx, scanIdx int) int64 { + x, y := idx%n, idx/n + if scanIdx == scanVer { + x, y = y, x + } + + return e.lastCoordBits(ctxLastSignificantCoeffXPrefix, x, log2(n), cIdx) + + e.lastCoordBits(ctxLastSignificantCoeffYPrefix, y, log2(n), cIdx) +} + +func (e *intraEncoder[P]) lastCoordBits(base, v, log2Size, cIdx int) int64 { + prefix := lastSigCoeffPrefix(v) + cMax := log2Size<<1 - 1 + + var bits int64 + + for i := range prefix { + bits += e.binBits(base+lastSigCoeffCtx(log2Size, cIdx, i), 1) + } + + if prefix < cMax { + bits += e.binBits(base+lastSigCoeffCtx(log2Size, cIdx, prefix), 0) + } + + if prefix > 3 { + bits += int64(prefix>>1-1) << rateShift + } + + return bits +} diff --git a/third_party/h265/hevc/residual.go b/third_party/h265/hevc/residual.go new file mode 100644 index 00000000..de70666e --- /dev/null +++ b/third_party/h265/hevc/residual.go @@ -0,0 +1,610 @@ +package hevc + +const numSbCoeff = 16 + +// Table 9-43, the sig_coeff_flag context map for 4x4 blocks. +var sigCtxMap4x4 = [16]uint8{0, 1, 4, 5, 2, 3, 4, 5, 6, 6, 8, 8, 7, 7, 8, 8} + +// scanIndex is the derivation in 7.4.9.11: only small intra blocks depart from +// the diagonal scan, and then only for near-horizontal or near-vertical modes. +func scanIndex(log2Size, cIdx, predModeIntra int, intra bool, chromaArrayType uint32) int { + if !intra { + return scanDiag + } + + if log2Size != 2 && !(log2Size == 3 && (cIdx == 0 || chromaArrayType == 3)) { + return scanDiag + } + + switch { + case predModeIntra >= 6 && predModeIntra <= 14: + return scanVer + case predModeIntra >= 22 && predModeIntra <= 30: + return scanHor + default: + return scanDiag + } +} + +// lastSigCoeffPrefix is the truncated Rice prefix of 9.3.3.2 with the context +// derivation of 9.3.4.2.3. +func lastSigCoeffCtx(log2Size, cIdx, binIdx int) int { + if cIdx == 0 { + return binIdx>>((log2Size+1)>>2) + 3*(log2Size-2) + (log2Size-1)>>2 + } + + return binIdx>>(log2Size-2) + 15 +} + +func (c *cabac) lastSigCoeffPrefix(base, log2Size, cIdx int) int { + cMax := log2Size<<1 - 1 + + v := 0 + for v < cMax && c.decodeBin(base+lastSigCoeffCtx(log2Size, cIdx, v)) != 0 { + v++ + } + + return v +} + +func (c *cabac) lastSigCoeffSuffix(prefix int) int { + if prefix <= 3 { + return prefix + } + + n := prefix>>1 - 1 + suffix := int(c.decodeBypassBits(n)) + + return (1< 0 { + limit = 32 - rng + } + + prefix := 0 + for prefix < limit && c.decodeBypass() != 0 { + prefix++ + } + + if prefix < 3 { + return int32(prefix< 0 && prefix == limit { + return int32((1< 0 { + c.base = 3 + } + + switch { + case log2Size == 3 && scanIdx == scanDiag: + c.base += 9 + case log2Size == 3: + c.base += 15 + default: + c.base += 21 + } + + return c +} + +func (c sigCtxSet) at(x, y int) int { + switch { + case c.flat: + return c.base + case c.is4x4: + return c.small + int(sigCtxMap4x4[y<<2+x]) + case c.sbDC && x|y == 0: + return c.dc + } + + return c.base + int(sigCtxByCsbf[c.prevCsbf][y&3<<2|x&3]) +} + +// sigCoeffCtx is 9.3.4.2.5 transcribed, which sigCtxSet is held to by +// TestSigCtxSetMatchesDerivation. +func sigCoeffCtx(xC, yC, log2Size, cIdx, scanIdx int, prevCsbf int) int { + var sig int + + switch { + case log2Size == 2: + sig = int(sigCtxMap4x4[yC<<2+xC]) + case xC+yC == 0: + sig = 0 + default: + sig = int(sigCtxByCsbf[prevCsbf][yC&3<<2|xC&3]) + + if cIdx == 0 { + if xC>>2+yC>>2 > 0 { + sig += 3 + } + + if log2Size == 3 { + if scanIdx == scanDiag { + sig += 9 + } else { + sig += 15 + } + } else { + sig += 21 + } + } else { + if log2Size == 3 { + sig += 9 + } else { + sig += 12 + } + } + } + + if cIdx == 0 { + return sig + } + + return 27 + sig +} + +type residualBlock struct { + log2Size int + cIdx int + predModeIntra int + intra bool + transquantBypass bool +} + +// decodeResidual is the residual_coding syntax of 7.3.8.11. coef receives the +// transform coefficient levels in raster order and must be zeroed by the +// caller. +func decodeResidual(c *cabac, s *sps, p *pps, _ *sliceHeader, coef []int32, + b residualBlock, statCoeff *[4]uint8, +) (transformSkip bool, err error) { + n := 1 << b.log2Size + + if p.transformSkipEnabled && !b.transquantBypass && + b.log2Size <= int(p.log2MaxTransformSkipSize) { + transformSkip = c.decodeBin(ctxTransformSkipFlag+min(b.cIdx, 1)) != 0 + } + + // 9.3.4.2.5 gives a block that skips the transform one significance + // context throughout, rather than one derived from the position. + flatCtx := s.transformSkipContext && (transformSkip || b.transquantBypass) + + scanIdx := scanIndex(b.log2Size, b.cIdx, b.predModeIntra, b.intra, s.chromaArrayType()) + + xPrefix := c.lastSigCoeffPrefix(ctxLastSignificantCoeffXPrefix, b.log2Size, b.cIdx) + yPrefix := c.lastSigCoeffPrefix(ctxLastSignificantCoeffYPrefix, b.log2Size, b.cIdx) + + lastX := c.lastSigCoeffSuffix(xPrefix) + lastY := c.lastSigCoeffSuffix(yPrefix) + + if scanIdx == scanVer { + lastX, lastY = lastY, lastX + } + + if lastX >= n || lastY >= n { + return transformSkip, ErrInvalid + } + + sbLog2 := b.log2Size - 2 + sbScan := scanOrder[sbLog2][scanIdx] + coeffScan := scanOrder[2][scanIdx] + + lastSubBlock := len(sbScan) - 1 + lastScanPos := numSbCoeff + + for { + if lastScanPos == 0 { + lastScanPos = numSbCoeff + lastSubBlock-- + + if lastSubBlock < 0 { + return transformSkip, ErrInvalid + } + } + + lastScanPos-- + + sb := sbScan[lastSubBlock] + pos := coeffScan[lastScanPos] + + if int(sb.x)<<2+int(pos.x) == lastX && int(sb.y)<<2+int(pos.y) == lastY { + break + } + } + + var ( + csbf [8 * 8]bool + st residualState + ) + + sbWidth := 1 << sbLog2 + + var sig [numSbCoeff]bool + + for i := lastSubBlock; i >= 0; i-- { + sb := sbScan[i] + xS, yS := int(sb.x), int(sb.y) + + inferSbDcSig := false + + if i < lastSubBlock && i > 0 { + ctx := 0 + if xS+1 < sbWidth && csbf[yS*sbWidth+xS+1] { + ctx++ + } + + if yS+1 < sbWidth && csbf[(yS+1)*sbWidth+xS] { + ctx++ + } + + base := ctxSignificantCoeffGroupFlag + if b.cIdx > 0 { + base += 2 + } + + csbf[yS*sbWidth+xS] = c.decodeBin(base+min(ctx, 1)) != 0 + inferSbDcSig = true + } else { + csbf[yS*sbWidth+xS] = true + } + + if !csbf[yS*sbWidth+xS] { + continue + } + + prevCsbf := 0 + if xS+1 < sbWidth && csbf[yS*sbWidth+xS+1] { + prevCsbf++ + } + + if yS+1 < sbWidth && csbf[(yS+1)*sbWidth+xS] { + prevCsbf += 2 + } + + start := numSbCoeff - 1 + if i == lastSubBlock { + start = lastScanPos - 1 + } + + for k := range sig { + sig[k] = false + } + + if i == lastSubBlock { + sig[lastScanPos] = true + } + + // 9.3.4.2.5 varies with the coefficient only through its place inside + // the sub-block; everything else is fixed for the whole of it. + sigSet := newSigCtxSet(xS, yS, b.log2Size, b.cIdx, scanIdx, prevCsbf, flatCtx) + + for k := start; k >= 0; k-- { + if k == 0 && inferSbDcSig && !anyTrue(sig[1:]) { + sig[0] = true + + continue + } + + pos := coeffScan[k] + + ctx := sigSet.at(int(pos.x), int(pos.y)) + sig[k] = c.decodeBin(ctxSignificantCoeffFlag+ctx) != 0 + } + + decodeSubBlockLevels(c, s, p, coef, b, sbScan[i], coeffScan, + &sig, i, n, statCoeff, &st) + } + + return transformSkip, nil +} + +func anyTrue(v []bool) bool { + for _, b := range v { + if b { + return true + } + } + + return false +} + +// residualState carries the greater1 context across the sub-blocks of one +// transform block, as 9.3.4.2.6 requires. +type residualState struct { + started bool + greater1Ctx int + lastGreater1 bool +} + +func decodeSubBlockLevels(c *cabac, s *sps, p *pps, coef []int32, + b residualBlock, sb scanPos, coeffScan []scanPos, sig *[numSbCoeff]bool, + subBlock, n int, statCoeff *[4]uint8, st *residualState, +) { + xS, yS := int(sb.x), int(sb.y) + + ctxSet := 0 + if subBlock > 0 && b.cIdx == 0 { + ctxSet = 2 + } + + lastCtx := 1 + + if st.started { + lastCtx = st.greater1Ctx + if lastCtx > 0 { + if st.lastGreater1 { + lastCtx = 0 + } else { + lastCtx++ + } + } + } + + if lastCtx == 0 { + ctxSet++ + } + + st.started = true + + // The three passes below visit the significant coefficients only, so the + // positions are gathered once instead of rescanning all sixteen. + var posBuf [numSbCoeff]int8 + + npos := 0 + + for k := numSbCoeff - 1; k >= 0; k-- { + if sig[k] { + posBuf[npos] = int8(k) + npos++ + } + } + + if npos == 0 { + return + } + + pos := posBuf[:npos] + + firstSig, lastSig := int(pos[len(pos)-1]), int(pos[0]) + lastGreater1 := -1 + + var greater1 [numSbCoeff]bool + + numGreater1 := 0 + greater1Ctx := 1 + + for _, p8 := range pos { + k := int(p8) + + if numGreater1 < 8 { + ctx := ctxSet*4 + min(3, greater1Ctx) + if b.cIdx > 0 { + ctx += 16 + } + + greater1[k] = c.decodeBin(ctxCoeffAbsLevelGreater1Flag+ctx) != 0 + numGreater1++ + + st.greater1Ctx = greater1Ctx + st.lastGreater1 = greater1[k] + + if greater1[k] { + greater1Ctx = 0 + + if lastGreater1 < 0 { + lastGreater1 = k + } + } else if greater1Ctx > 0 { + greater1Ctx++ + } + } + } + + var greater2 bool + + if lastGreater1 >= 0 { + ctx := ctxSet + if b.cIdx > 0 { + ctx += 4 + } + + greater2 = c.decodeBin(ctxCoeffAbsLevelGreater2Flag+ctx) != 0 + } + + signHidden := lastSig-firstSig > 3 && !b.transquantBypass + + var signs [numSbCoeff]bool + + for _, p8 := range pos { + k := int(p8) + + if p.signDataHidingEnabled && signHidden && k == firstSig { + continue + } + + signs[k] = c.decodeBypass() != 0 + } + + rice := 0 + if s.persistentRiceAdaptation { + rice = int(statCoeff[riceStatIndex(b)] / 4) + } + + rng := s.coeffRange(b.cIdx) + + numSig := 0 + + var sumAbs int32 + + firstRemaining := true + + for _, p8 := range pos { + k := int(p8) + + base := int32(1) + if greater1[k] { + base++ + } + + if k == lastGreater1 && greater2 { + base++ + } + + want := int32(1) + + if numSig < 8 { + want = 2 + if k == lastGreater1 { + want = 3 + } + } + + level := base + + if base == want { + rem := c.coeffAbsLevelRemaining(rice, rng) + level = base + rem + + if s.persistentRiceAdaptation && firstRemaining { + updateStatCoeff(statCoeff, riceStatIndex(b), rem) + firstRemaining = false + } + + if level > 3<= 3<<(stat[i]/4): + stat[i]++ + case 2*rem < 1<<(stat[i]/4) && stat[i] > 0: + stat[i]-- + } +} + +// sigCtxByCsbf is the position part of 9.3.4.2.5, which depends only on the +// coefficient's place within its sub-block and on the two neighbouring +// sub-block flags. Built from the derivation rather than transcribed. +var sigCtxByCsbf = func() [4][numSbCoeff]uint8 { + var t [4][numSbCoeff]uint8 + + for csbf := range 4 { + for yP := range 4 { + for xP := range 4 { + var sig uint8 + + switch csbf { + case 0: + switch { + case xP+yP == 0: + sig = 2 + case xP+yP < 3: + sig = 1 + } + case 1: + switch { + case yP == 0: + sig = 2 + case yP == 1: + sig = 1 + } + case 2: + switch { + case xP == 0: + sig = 2 + case xP == 1: + sig = 1 + } + default: + sig = 2 + } + + t[csbf][yP<<2|xP] = sig + } + } + } + + return t +}() diff --git a/third_party/h265/hevc/residualenc.go b/third_party/h265/hevc/residualenc.go new file mode 100644 index 00000000..64dcc42f --- /dev/null +++ b/third_party/h265/hevc/residualenc.go @@ -0,0 +1,331 @@ +package hevc + +// encodeResidual is the residual_coding syntax of 7.3.8.11. coef holds the +// levels in raster order and must already carry the parity of 7.4.9.11. +func encodeResidual(w *cabacWriter, s *sps, p *pps, coef []int32, b residualBlock) error { + if b.log2Size < 2 || b.log2Size > 5 || b.cIdx < 0 || b.cIdx > 2 || + len(coef) != 1<<(b.log2Size<<1) { + return ErrInvalid + } + + if p.transformSkipEnabled || s.persistentRiceAdaptation || + b.transquantBypass || p.transquantBypass || s.transformSkipContext || s.extendedPrecision { + return ErrUnsupported + } + + n := 1 << b.log2Size + scanIdx := scanIndex(b.log2Size, b.cIdx, b.predModeIntra, b.intra, s.chromaArrayType()) + sbLog2 := b.log2Size - 2 + sbScan := scanOrder[sbLog2][scanIdx] + coeffScan := scanOrder[2][scanIdx] + + lastSubBlock, lastScanPos := -1, -1 + var csbf [8 * 8]bool + + for i, sb := range sbScan { + xS, yS := int(sb.x), int(sb.y) + for k, pos := range coeffScan { + level := coef[(yS<<2+int(pos.y))*n+xS<<2+int(pos.x)] + if level == -1<<31 { + return ErrInvalid + } + if level != 0 { + csbf[yS*(n>>2)+xS] = true + lastSubBlock, lastScanPos = i, k + } + } + } + + if lastSubBlock < 0 { + return ErrInvalid + } + + lastSB := sbScan[lastSubBlock] + lastPos := coeffScan[lastScanPos] + lastX, lastY := int(lastSB.x)<<2+int(lastPos.x), int(lastSB.y)<<2+int(lastPos.y) + if scanIdx == scanVer { + lastX, lastY = lastY, lastX + } + + xPrefix := encodeLastSigCoeffPrefix(w, ctxLastSignificantCoeffXPrefix, lastX, b.log2Size, b.cIdx) + yPrefix := encodeLastSigCoeffPrefix(w, ctxLastSignificantCoeffYPrefix, lastY, b.log2Size, b.cIdx) + encodeLastSigCoeffSuffix(w, lastX, xPrefix) + encodeLastSigCoeffSuffix(w, lastY, yPrefix) + + sbWidth := n >> 2 + var st residualState + + for i := lastSubBlock; i >= 0; i-- { + sb := sbScan[i] + xS, yS := int(sb.x), int(sb.y) + + inferSbDcSig := false + if i < lastSubBlock && i > 0 { + ctx := 0 + if xS+1 < sbWidth && csbf[yS*sbWidth+xS+1] { + ctx++ + } + if yS+1 < sbWidth && csbf[(yS+1)*sbWidth+xS] { + ctx++ + } + + base := ctxSignificantCoeffGroupFlag + if b.cIdx > 0 { + base += 2 + } + w.encodeBin(base+min(ctx, 1), boolToBit(csbf[yS*sbWidth+xS])) + inferSbDcSig = true + } + + if !csbf[yS*sbWidth+xS] && i != 0 { + continue + } + + prevCsbf := 0 + if xS+1 < sbWidth && csbf[yS*sbWidth+xS+1] { + prevCsbf++ + } + if yS+1 < sbWidth && csbf[(yS+1)*sbWidth+xS] { + prevCsbf += 2 + } + + start := numSbCoeff - 1 + if i == lastSubBlock { + start = lastScanPos - 1 + } + + var sig [numSbCoeff]bool + if i == lastSubBlock { + sig[lastScanPos] = true + } + + sigSet := newSigCtxSet(xS, yS, b.log2Size, b.cIdx, scanIdx, prevCsbf, false) + for k := start; k >= 0; k-- { + if k == 0 && inferSbDcSig && !anyTrue(sig[1:]) { + sig[0] = true + continue + } + + pos := coeffScan[k] + level := coef[(yS<<2+int(pos.y))*n+xS<<2+int(pos.x)] + sig[k] = level != 0 + w.encodeBin(ctxSignificantCoeffFlag+sigSet.at(int(pos.x), int(pos.y)), boolToBit(sig[k])) + } + + encodeSubBlockLevels(w, s, p, coef, b, sb, coeffScan, &sig, i, n, &st) + } + + return nil +} + +func encodeLastSigCoeffPrefix(w *cabacWriter, base, v, log2Size, cIdx int) int { + prefix := lastSigCoeffPrefix(v) + cMax := log2Size<<1 - 1 + for i := 0; i < prefix; i++ { + w.encodeBin(base+lastSigCoeffCtx(log2Size, cIdx, i), 1) + } + if prefix < cMax { + w.encodeBin(base+lastSigCoeffCtx(log2Size, cIdx, prefix), 0) + } + + return prefix +} + +func encodeLastSigCoeffSuffix(w *cabacWriter, v, prefix int) { + if prefix > 3 { + n := prefix>>1 - 1 + w.encodeBypassBits(uint32(v-((1<>uint(n))&1 +} + +func (w *cabacWriter) encodeCoeffAbsLevelRemaining(v int32, rice, rng int) { + if v < 3<> rice) { + w.encodeBypass(1) + } + w.encodeBypass(0) + w.encodeBypassBits(uint32(v)&((1<= ((1<<(k+1))+2)< 0 { + limit = 32 - rng + k = min(k, limit-3) + } + + prefix := k + 3 + for range prefix { + w.encodeBypass(1) + } + if prefix < limit { + w.encodeBypass(0) + } + + n := k + rice + if rng > 0 && prefix == limit { + n = rng + } + w.encodeBypassBits(uint32(v-((1< 0 && b.cIdx == 0 { + ctxSet = 2 + } + + lastCtx := 1 + + if st.started { + lastCtx = st.greater1Ctx + if lastCtx > 0 { + if st.lastGreater1 { + lastCtx = 0 + } else { + lastCtx++ + } + } + } + + if lastCtx == 0 { + ctxSet++ + } + + st.started = true + + // The passes visit the significant levels in the same order, so they are + // gathered once and then addressed by rank rather than by scan position. + var lev [numSbCoeff]int32 + + npos := 0 + origin := (int(sb.y)*n + int(sb.x)) << 2 + firstSig, lastSig := -1, -1 + + for k := numSbCoeff - 1; k >= 0; k-- { + if !sig[k] { + continue + } + + if lastSig < 0 { + lastSig = k + } + + firstSig = k + + sp := coeffScan[k] + lev[npos] = coef[origin+int(sp.y)*n+int(sp.x)] + npos++ + } + + if npos == 0 { + return + } + + signHidden := lastSig-firstSig > 3 && !b.transquantBypass + + var greater1 [numSbCoeff]bool + + lastGreater1, greater1Ctx := -1, 1 + + for i := range min(npos, 8) { + greater1[i] = absLevel(lev[i]) > 1 + + ctx := ctxSet*4 + min(3, greater1Ctx) + if b.cIdx > 0 { + ctx += 16 + } + + w.encodeBin(ctxCoeffAbsLevelGreater1Flag+ctx, boolToBit(greater1[i])) + st.greater1Ctx, st.lastGreater1 = greater1Ctx, greater1[i] + + if greater1[i] { + greater1Ctx = 0 + + if lastGreater1 < 0 { + lastGreater1 = i + } + } else if greater1Ctx > 0 { + greater1Ctx++ + } + } + + if lastGreater1 >= 0 { + ctx := ctxSet + if b.cIdx > 0 { + ctx += 4 + } + + w.encodeBin(ctxCoeffAbsLevelGreater2Flag+ctx, boolToBit(absLevel(lev[lastGreater1]) > 2)) + } + + for i := range npos { + if p.signDataHidingEnabled && signHidden && i == npos-1 { + continue + } + + w.encodeBypass(boolToBit(lev[i] < 0)) + } + + rice, rng := 0, s.coeffRange(b.cIdx) + + for i := range npos { + level := absLevel(lev[i]) + + base := int32(1) + if greater1[i] { + base++ + } + + if i == lastGreater1 && level > 2 { + base++ + } + + want := int32(1) + + if i < 8 { + want = 2 + if i == lastGreater1 { + want = 3 + } + } + + if base == want { + w.encodeCoeffAbsLevelRemaining(level-base, rice, rng) + + if level > 3<>d.s.ctbLog2SizeY)*w + x>>d.s.ctbLog2SizeY + ts := int(d.rsToTs[rs]) + + mergeLeft, mergeUp := false, false + + if rs%w > 0 && rs-1 >= d.sliceAddrRs && d.tileID[ts] == d.tileID[d.rsToTs[rs-1]] { + mergeLeft = d.c.decodeBin(ctxSAOMergeFlag) != 0 + } + + if !mergeLeft && rs >= w && rs-w >= d.sliceAddrRs && + d.tileID[ts] == d.tileID[d.rsToTs[rs-w]] { + mergeUp = d.c.decodeBin(ctxSAOMergeFlag) != 0 + } + + ctb := rs + + if mergeLeft { + d.sao[ctb] = d.sao[rs-1] + + return + } + + if mergeUp { + d.sao[ctb] = d.sao[rs-w] + + return + } + + nComp := 1 + if d.s.chromaArrayType() != 0 { + nComp = 3 + } + + for cIdx := range nComp { + if cIdx == 0 && !d.sh.saoLuma { + continue + } + + if cIdx > 0 && !d.sh.saoChroma { + continue + } + + cMax := 1<<(min(d.pic.depth(cIdx), 10)-5) - 1 + + typeIdx := 0 + + if cIdx != 2 { + if d.c.decodeBin(ctxSAOTypeIDX) != 0 { + typeIdx = saoBand + if d.c.decodeBypass() != 0 { + typeIdx = saoEdge + } + } + + d.saoType[cIdx] = typeIdx + } else { + typeIdx = d.saoType[1] + } + + p := &d.sao[ctb][cIdx] + p.typeIdx = typeIdx + + if typeIdx == saoOff { + continue + } + + var offAbs [4]int + + for i := range 4 { + v := 0 + for v < cMax && d.c.decodeBypass() != 0 { + v++ + } + + offAbs[i] = v + } + + // 7.4.9.3 scales every offset by the shift the picture carries. + scale := d.p.log2SaoOffsetScaleLuma + if cIdx > 0 { + scale = d.p.log2SaoOffsetScaleChroma + } + + if typeIdx == saoBand { + for i := range 4 { + p.offset[i] = int32(offAbs[i]) << scale + + if offAbs[i] != 0 && d.c.decodeBypass() != 0 { + p.offset[i] = -p.offset[i] + } + } + + p.band = int(d.c.decodeBypassBits(5)) + + continue + } + + // Edge offsets are signed by position: the first two are positive, + // the last two negative. + for i := range 4 { + p.offset[i] = int32(offAbs[i]) << scale + if i >= 2 { + p.offset[i] = -p.offset[i] + } + } + + if cIdx != 2 { + d.eoClass[cIdx] = int(d.c.decodeBypassBits(2)) + } + + p.class = d.eoClass[min(cIdx, 1)] + } +} + +// grow returns a buffer of at least n elements, reusing b when it is big +// enough. The loop filters run once per picture over the whole plane. +func grow[T any](b []T, n int) []T { + if cap(b) < n { + return make([]T, n) + } + + return b[:n] +} + +// applySAO is 8.7.3. It reads the picture as deblocking left it, so the source +// is copied first and every offset is taken from the unfiltered neighbourhood. +func (d *ctuDecoder) applySAO() { + nComp := 1 + if d.s.chromaArrayType() != 0 { + nComp = 3 + } + + for cIdx := range nComp { + if d.pic.deep() { + plane, stride := d.pic.plane16(cIdx) + d.saoSrc16 = grow(d.saoSrc16, len(plane)) + saoPlane(d, plane, stride, cIdx, d.saoSrc16) + } else { + plane, stride := d.pic.plane8(cIdx) + d.saoSrc8 = grow(d.saoSrc8, len(plane)) + saoPlane(d, plane, stride, cIdx, d.saoSrc8) + } + } +} + +func saoPlane[P pixel](d *ctuDecoder, plane []P, stride, cIdx int, src []P) { + sw, sh := 1, 1 + if cIdx > 0 { + sw, sh = d.s.subWidthC, d.s.subHeightC + } + + w, h := d.pic.Width/sw, d.pic.Height/sh + if w == 0 || h == 0 { + return + } + + maxV := int32(1)<= h || y+b[1] < 0 || y+b[1] >= h { + continue + } + + xlo = max(xlo, max(-a[0], -b[0])) + xhi = min(min(x0+ctbW, w), w-max(a[0], b[0])) + } + + // Only the first and last row and column of a coding tree block + // can reach across one, so the interior needs no availability test. + ilo, ihi := xlo, xhi + + if !band { + if a[1] != 0 && (y == y0 || y == min(y0+ctbH, h)-1) { + ihi = ilo + } else if a[0] != 0 { + ilo = min(max(xlo, x0+1), xhi) + ihi = max(min(xhi, x0+ctbW-1), ilo) + } + } + + for x := xlo; x < ilo; x++ { + saoSample(d, plane, src, stride, x, y, w, h, sw, sh, p, a, b, shift, maxV) + } + + for x := ihi; x < xhi; x++ { + saoSample(d, plane, src, stride, x, y, w, h, sw, sh, p, a, b, shift, maxV) + } + + // The next sample whose transform block may differ. + next := func(x int) int { + return min((x*sw>>d.minTbLog2+1)<>shift) - p.band) & 31; k < 4 { + plane[y*stride+x] = P(clip3(v+p.offset[k], 0, maxV)) + } + + return + } + + if x+a[0] < 0 || x+a[0] >= w || y+a[1] < 0 || y+a[1] >= h || + x+b[0] < 0 || x+b[0] >= w || y+b[1] < 0 || y+b[1] >= h { + return + } + + if !d.saoNeighbour(x, y, a, sw, sh) || !d.saoNeighbour(x, y, b, sw, sh) { + return + } + + va := int32(src[(y+a[1])*stride+x+a[0]]) + vb := int32(src[(y+b[1])*stride+x+b[0]]) + + if cat := sign(v-va) + sign(v-vb); cat != 0 { + k := cat + 2 + if cat > 0 { + k = cat + 1 + } + + plane[y*stride+x] = P(clip3(v+p.offset[k], 0, maxV)) + } +} + +// saoBandRow is the band offset of 8.7.3 over a run of samples. +func saoBandRow[P pixel](dst, src []P, n, band int, offset *[4]int32, shift int, maxV int32) { + for i, s := range src[:n] { + v := int32(s) + + if k := (int(v>>shift) - band) & 31; k < 4 { + dst[i] = P(clip3(v+offset[k], 0, maxV)) + } + } +} + +// saoEdgeRow is the edge offset of 8.7.3 over a run of samples, with the two +// neighbours the class compares against passed as their own rows. +func saoEdgeRow[P pixel](dst, src, na, nb []P, n int, offset *[4]int32, maxV int32) { + for i, s := range src[:n] { + v := int32(s) + + cat := sign(v-int32(na[i])) + sign(v-int32(nb[i])) + if cat == 0 { + continue + } + + k := cat + 2 + if cat > 0 { + k = cat + 1 + } + + dst[i] = P(clip3(v+offset[k], 0, maxV)) + } +} + +// saoNeighbour is the availability part of 8.7.3: an edge offset sample is +// left alone when the neighbour it compares against sits across a tile or +// slice boundary that filtering may not cross. +func (d *ctuDecoder) saoNeighbour(x, y int, off [2]int, sw, sh int) bool { + return d.filterEdge(x*sw, y*sh, (x+off[0])*sw, (y+off[1])*sh) +} diff --git a/third_party/h265/hevc/saoenc.go b/third_party/h265/hevc/saoenc.go new file mode 100644 index 00000000..3becac31 --- /dev/null +++ b/third_party/h265/hevc/saoenc.go @@ -0,0 +1,449 @@ +package hevc + +// saoCand is one candidate: the squared error it saves against the bins it takes. +type saoCand struct { + p saoParams + gain int64 + bins int64 +} + +// saoMaxOffset is cMax of 7.3.8.3. +func saoMaxOffset(bitDepth int) int32 { + return int32(1)<<(min(bitDepth, 10)-5) - 1 +} + +// decideSAO fits every coding tree block against the picture deblocking left, +// which the second coding pass then writes in front of each of them. +func (e *intraEncoder[P]) decideSAO() { + rows, cols := ctbCount(e.height), ctbCount(e.width) + e.sao = regrow(e.sao, rows*cols) + e.saoLuma, e.saoChroma = false, false + + nComp := 1 + if e.s.chromaArrayType() != 0 { + nComp = 3 + } + + for ctb := range e.sao { + x0, y0 := ctb%cols*64, ctb/cols*64 + + for cIdx := range nComp { + e.sao[ctb][cIdx] = saoParams{} + } + + e.sao[ctb][0] = e.saoFor(0, x0, y0).p + e.saoLuma = e.saoLuma || e.sao[ctb][0].typeIdx != saoOff + + if nComp == 1 { + continue + } + + // 7.3.8.3 gives Cb and Cr one type and one class between them. + cb, cr := e.saoChromaPair(x0, y0) + e.sao[ctb][1], e.sao[ctb][2] = cb, cr + e.saoChroma = e.saoChroma || cb.typeIdx != saoOff + } + + // A component nothing uses leaves the slice header, and its syntax with it. + if !e.saoLuma { + for ctb := range e.sao { + e.sao[ctb][0] = saoParams{} + } + } + + if !e.saoChroma { + for ctb := range e.sao { + e.sao[ctb][1], e.sao[ctb][2] = saoParams{}, saoParams{} + } + } + + e.saoOn = e.saoLuma || e.saoChroma +} + +// saoBin is one category's error, summed and counted. +type saoBin struct{ sum, cnt int64 } + +// saoStats is what one walk of a coding tree block tells all thirty six +// candidates. +type saoStats struct { + band [32]saoBin + edge [4][4]saoBin +} + +// saoFor is the best parameters for one component of one coding tree block. +func (e *intraEncoder[P]) saoFor(cIdx, x0, y0 int) saoCand { + e.saoGather(cIdx, x0, y0) + + var best saoCand + + for band := range 32 { + if c := e.saoBandCand(cIdx, band); e.saoBetter(c, best) { + best = c + } + } + + for class := range 4 { + if c := e.saoEdgeCand(cIdx, class); e.saoBetter(c, best) { + best = c + } + } + + return best +} + +// saoChromaPair picks one type and class for both chroma components on their +// combined cost, with the offsets each of them wants. +func (e *intraEncoder[P]) saoChromaPair(x0, y0 int) (saoParams, saoParams) { + var ( + best saoCand + bestCb, bestCr saoParams + cb [32]saoCand + cbEdge [4]saoCand + ) + + e.saoGather(1, x0, y0) + + for band := range 32 { + cb[band] = e.saoBandCand(1, band) + } + + for class := range 4 { + cbEdge[class] = e.saoEdgeCand(1, class) + } + + e.saoGather(2, x0, y0) + + try := func(a, b saoCand) { + joint := saoCand{p: a.p, gain: a.gain + b.gain, bins: a.bins + b.bins} + + if e.saoBetter(joint, best) { + best, bestCb, bestCr = joint, a.p, b.p + } + } + + for band := range 32 { + try(cb[band], e.saoBandCand(2, band)) + } + + for class := range 4 { + try(cbEdge[class], e.saoEdgeCand(2, class)) + } + + return bestCb, bestCr +} + +// saoBetter weighs a candidate against the one held and against doing nothing. +func (e *intraEncoder[P]) saoBetter(c, best saoCand) bool { + if c.gain <= 0 { + return false + } + + return c.gain< + best.gain< 0 { + sw, sh = e.shiftW, e.shiftH + } + + cx0, cy0 := x0>>sw, y0>>sh + cx1, cy1 := min(cx0+64>>sw, w), min(cy0+64>>sh, h) + + src, rec := e.src[cIdx], e.recon[cIdx] + + for y := cy0; y < cy1; y++ { + row := y * stride + + // Only the outermost row and column reach outside the plane. + inner := y > 0 && y < h-1 + + for x := cx0; x < cx1; x++ { + v := int32(rec[row+x]) + d := int64(src[row+x]) - int64(v) + + b := &st.band[v>>shift] + b.sum += d + b.cnt++ + + if !inner || x == 0 || x == w-1 { + continue + } + + for class := range 4 { + a, o := eoOffsets[class][0], eoOffsets[class][1] + + va := int32(rec[(y+a[1])*stride+x+a[0]]) + vb := int32(rec[(y+o[1])*stride+x+o[0]]) + + cat := sign(v-va) + sign(v-vb) + if cat == 0 { + continue + } + + k := cat + 2 + if cat > 0 { + k = cat + 1 + } + + c := &st.edge[class][k] + c.sum += d + c.cnt++ + } + } + } +} + +// planeSize is the sample count of a component either way. +func (e *intraEncoder[P]) planeSize(cIdx int) (int, int) { + if cIdx == 0 { + return e.width, e.height + } + + return e.width >> e.shiftW, e.height >> e.shiftH +} + +// writeSAO is the sao syntax of 7.3.8.3, in front of one coding tree block. +func (e *intraEncoder[P]) writeSAO(w *cabacWriter, ctb, cols int) { + if !e.saoOn { + return + } + + if ctb%cols > 0 { + w.encodeBin(ctxSAOMergeFlag, 0) + } + + if ctb >= cols { + w.encodeBin(ctxSAOMergeFlag, 0) + } + + nComp := 1 + if e.s.chromaArrayType() != 0 { + nComp = 3 + } + + top := saoMaxOffset(e.bitDepth) + + for cIdx := range nComp { + if cIdx == 0 && !e.saoLuma { + continue + } + + if cIdx > 0 && !e.saoChroma { + continue + } + + p := &e.sao[ctb][cIdx] + + if cIdx != 2 { + w.encodeBin(ctxSAOTypeIDX, boolToBit(p.typeIdx != saoOff)) + + if p.typeIdx != saoOff { + w.encodeBypass(boolToBit(p.typeIdx == saoEdge)) + } + } + + if p.typeIdx == saoOff { + continue + } + + for k := range 4 { + v := p.offset[k] + if v < 0 { + v = -v + } + + for i := int32(0); i < v; i++ { + w.encodeBypass(1) + } + + if v < top { + w.encodeBypass(0) + } + } + + if p.typeIdx == saoBand { + for k := range 4 { + if p.offset[k] != 0 { + w.encodeBypass(boolToBit(p.offset[k] < 0)) + } + } + + w.encodeBypassBits(uint32(p.band), 5) + + continue + } + + if cIdx != 2 { + w.encodeBypassBits(uint32(p.class), 2) + } + } +} + +// applySAO is 8.7.3 over the reconstruction, so it stays what a decoder makes. +func (e *intraEncoder[P]) applySAO() { + if !e.saoOn { + return + } + + cols := ctbCount(e.width) + + nComp := 1 + if e.s.chromaArrayType() != 0 { + nComp = 3 + } + + for cIdx := range nComp { + if cIdx == 0 && !e.saoLuma || cIdx > 0 && !e.saoChroma { + continue + } + + stride := e.stride(cIdx) + w, h := e.planeSize(cIdx) + + e.saoSrc = regrow(e.saoSrc, len(e.recon[cIdx])) + copy(e.saoSrc, e.recon[cIdx]) + + maxV := int32(1)< 0 { + sw, sh = e.shiftW, e.shiftH + } + + for ctb := range e.sao { + p := &e.sao[ctb][cIdx] + if p.typeIdx == saoOff { + continue + } + + x0, y0 := ctb%cols*64>>sw, ctb/cols*64>>sh + a, b := eoOffsets[p.class][0], eoOffsets[p.class][1] + + for y := y0; y < min(y0+64>>sh, h); y++ { + for x := x0; x < min(x0+64>>sw, w); x++ { + v := int32(e.saoSrc[y*stride+x]) + + if p.typeIdx == saoBand { + if k := (int(v>>shift) - p.band) & 31; k < 4 { + e.recon[cIdx][y*stride+x] = P(clip3(v+p.offset[k], 0, maxV)) + } + + continue + } + + if x+a[0] < 0 || x+a[0] >= w || y+a[1] < 0 || y+a[1] >= h || + x+b[0] < 0 || x+b[0] >= w || y+b[1] < 0 || y+b[1] >= h { + continue + } + + va := int32(e.saoSrc[(y+a[1])*stride+x+a[0]]) + vb := int32(e.saoSrc[(y+b[1])*stride+x+b[0]]) + + cat := sign(v-va) + sign(v-vb) + if cat == 0 { + continue + } + + k := cat + 2 + if cat > 0 { + k = cat + 1 + } + + e.recon[cIdx][y*stride+x] = P(clip3(v+p.offset[k], 0, maxV)) + } + } + } + } +} diff --git a/third_party/h265/hevc/satd_amd64.s b/third_party/h265/hevc/satd_amd64.s new file mode 100644 index 00000000..0c1763aa --- /dev/null +++ b/third_party/h265/hevc/satd_amd64.s @@ -0,0 +1,193 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func satd16x8AVX2(src *uint8, srcStride int, pred *uint8, predStride int) int64 +// +// satd over a sixteen wide and eight tall strip. Y0 to Y7 hold the rows as +// sixteen int16, one 8x8 per lane, and every butterfly and unpack is lane local +// so the two ride through together. Differences reach 255 and each pass scales +// by eight, which int16 holds. +TEXT ·satd16x8AVX2(SB), NOSPLIT, $0-40 + MOVQ src+0(FP), SI + MOVQ srcStride+8(FP), R8 + MOVQ pred+16(FP), DI + MOVQ predStride+24(FP), R9 + + VPMOVZXBW (SI), Y0 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y0, Y0 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y1 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y1, Y1 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y2 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y2, Y2 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y3 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y3, Y3 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y4 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y4, Y4 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y5 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y5, Y5 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y6 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y6, Y6 + + ADDQ R8, SI + ADDQ R9, DI + VPMOVZXBW (SI), Y7 + VPMOVZXBW (DI), Y8 + VPSUBW Y8, Y7, Y7 + + VPADDW Y4, Y0, Y8 + VPSUBW Y4, Y0, Y12 + VPADDW Y5, Y1, Y9 + VPSUBW Y5, Y1, Y13 + VPADDW Y6, Y2, Y10 + VPSUBW Y6, Y2, Y14 + VPADDW Y7, Y3, Y11 + VPSUBW Y7, Y3, Y15 + + VPADDW Y10, Y8, Y0 + VPADDW Y11, Y9, Y1 + VPSUBW Y10, Y8, Y2 + VPSUBW Y11, Y9, Y3 + VPADDW Y14, Y12, Y4 + VPADDW Y15, Y13, Y5 + VPSUBW Y14, Y12, Y6 + VPSUBW Y15, Y13, Y7 + + VPADDW Y1, Y0, Y8 + VPSUBW Y1, Y0, Y9 + VPADDW Y3, Y2, Y10 + VPSUBW Y3, Y2, Y11 + VPADDW Y5, Y4, Y12 + VPSUBW Y5, Y4, Y13 + VPADDW Y7, Y6, Y14 + VPSUBW Y7, Y6, Y15 + + // Transpose within each lane, so the second pass lands on the rows. + VPUNPCKLWD Y9, Y8, Y0 + VPUNPCKHWD Y9, Y8, Y1 + VPUNPCKLWD Y11, Y10, Y2 + VPUNPCKHWD Y11, Y10, Y3 + VPUNPCKLWD Y13, Y12, Y4 + VPUNPCKHWD Y13, Y12, Y5 + VPUNPCKLWD Y15, Y14, Y6 + VPUNPCKHWD Y15, Y14, Y7 + + VPUNPCKLDQ Y2, Y0, Y8 + VPUNPCKHDQ Y2, Y0, Y9 + VPUNPCKLDQ Y3, Y1, Y10 + VPUNPCKHDQ Y3, Y1, Y11 + VPUNPCKLDQ Y6, Y4, Y12 + VPUNPCKHDQ Y6, Y4, Y13 + VPUNPCKLDQ Y7, Y5, Y14 + VPUNPCKHDQ Y7, Y5, Y15 + + VPUNPCKLQDQ Y12, Y8, Y0 + VPUNPCKHQDQ Y12, Y8, Y1 + VPUNPCKLQDQ Y13, Y9, Y2 + VPUNPCKHQDQ Y13, Y9, Y3 + VPUNPCKLQDQ Y14, Y10, Y4 + VPUNPCKHQDQ Y14, Y10, Y5 + VPUNPCKLQDQ Y15, Y11, Y6 + VPUNPCKHQDQ Y15, Y11, Y7 + + VPADDW Y4, Y0, Y8 + VPSUBW Y4, Y0, Y12 + VPADDW Y5, Y1, Y9 + VPSUBW Y5, Y1, Y13 + VPADDW Y6, Y2, Y10 + VPSUBW Y6, Y2, Y14 + VPADDW Y7, Y3, Y11 + VPSUBW Y7, Y3, Y15 + + VPADDW Y10, Y8, Y0 + VPADDW Y11, Y9, Y1 + VPSUBW Y10, Y8, Y2 + VPSUBW Y11, Y9, Y3 + VPADDW Y14, Y12, Y4 + VPADDW Y15, Y13, Y5 + VPSUBW Y14, Y12, Y6 + VPSUBW Y15, Y13, Y7 + + VPADDW Y1, Y0, Y8 + VPSUBW Y1, Y0, Y9 + VPADDW Y3, Y2, Y10 + VPSUBW Y3, Y2, Y11 + VPADDW Y5, Y4, Y12 + VPSUBW Y5, Y4, Y13 + VPADDW Y7, Y6, Y14 + VPSUBW Y7, Y6, Y15 + + // The pairwise multiply by one widens as it adds. + MOVL $0x00010001, AX + VMOVD AX, X1 + VPBROADCASTD X1, Y1 + + VPABSW Y8, Y8 + VPMADDWD Y1, Y8, Y0 + + VPABSW Y9, Y9 + VPMADDWD Y1, Y9, Y9 + VPADDD Y9, Y0, Y0 + + VPABSW Y10, Y10 + VPMADDWD Y1, Y10, Y10 + VPADDD Y10, Y0, Y0 + + VPABSW Y11, Y11 + VPMADDWD Y1, Y11, Y11 + VPADDD Y11, Y0, Y0 + + VPABSW Y12, Y12 + VPMADDWD Y1, Y12, Y12 + VPADDD Y12, Y0, Y0 + + VPABSW Y13, Y13 + VPMADDWD Y1, Y13, Y13 + VPADDD Y13, Y0, Y0 + + VPABSW Y14, Y14 + VPMADDWD Y1, Y14, Y14 + VPADDD Y14, Y0, Y0 + + VPABSW Y15, Y15 + VPMADDWD Y1, Y15, Y15 + VPADDD Y15, Y0, Y0 + + VEXTRACTI128 $1, Y0, X1 + VPADDD X1, X0, X0 + VPSHUFD $0x4e, X0, X1 + VPADDD X1, X0, X0 + VPSHUFD $0xb1, X0, X1 + VPADDD X1, X0, X0 + + VMOVD X0, AX + MOVLQZX AX, AX + MOVQ AX, ret+32(FP) + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/satd_arm64.s b/third_party/h265/hevc/satd_arm64.s new file mode 100644 index 00000000..8ea26786 --- /dev/null +++ b/third_party/h265/hevc/satd_arm64.s @@ -0,0 +1,199 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define ABS8H(Vd, Vn) WORD $(0x4e60b800 | ((Vn) << 5) | (Vd)) +#define UADALP4S(Vd, Vn) WORD $(0x6e606800 | ((Vn) << 5) | (Vd)) + +// func satd16x8NEON(src *uint8, srcStride int, pred *uint8, predStride int) int64 +// +// satd over a sixteen wide and eight tall strip, one 8x8 at a time: a row of +// eight int16 is exactly one register, and both halves accumulate into the same +// pairwise sum. Differences reach 255 and each pass scales by eight, which +// int16 holds. +TEXT ·satd16x8NEON(SB), NOSPLIT, $0-40 + MOVD src+0(FP), R0 + MOVD srcStride+8(FP), R1 + MOVD pred+16(FP), R2 + MOVD predStride+24(FP), R3 + + VMOVI $0, V16.B16 + + MOVD $2, R4 + +half: + MOVD R0, R5 + MOVD R2, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V0.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V0.H8, V0.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V1.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V1.H8, V1.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V2.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V2.H8, V2.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V3.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V3.H8, V3.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V4.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V4.H8, V4.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V5.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V5.H8, V5.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V6.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V6.H8, V6.H8 + ADD R1, R5 + ADD R3, R6 + + VLD1 (R5), [V17.B8] + VUXTL V17.B8, V7.H8 + VLD1 (R6), [V17.B8] + VUXTL V17.B8, V17.H8 + VSUB V17.H8, V7.H8, V7.H8 + + VADD V4.H8, V0.H8, V8.H8 + VSUB V4.H8, V0.H8, V12.H8 + VADD V5.H8, V1.H8, V9.H8 + VSUB V5.H8, V1.H8, V13.H8 + VADD V6.H8, V2.H8, V10.H8 + VSUB V6.H8, V2.H8, V14.H8 + VADD V7.H8, V3.H8, V11.H8 + VSUB V7.H8, V3.H8, V15.H8 + + VADD V10.H8, V8.H8, V0.H8 + VADD V11.H8, V9.H8, V1.H8 + VSUB V10.H8, V8.H8, V2.H8 + VSUB V11.H8, V9.H8, V3.H8 + VADD V14.H8, V12.H8, V4.H8 + VADD V15.H8, V13.H8, V5.H8 + VSUB V14.H8, V12.H8, V6.H8 + VSUB V15.H8, V13.H8, V7.H8 + + VADD V1.H8, V0.H8, V8.H8 + VSUB V1.H8, V0.H8, V9.H8 + VADD V3.H8, V2.H8, V10.H8 + VSUB V3.H8, V2.H8, V11.H8 + VADD V5.H8, V4.H8, V12.H8 + VSUB V5.H8, V4.H8, V13.H8 + VADD V7.H8, V6.H8, V14.H8 + VSUB V7.H8, V6.H8, V15.H8 + + // Transpose, so the second pass lands on the rows. + VTRN1 V9.H8, V8.H8, V0.H8 + VTRN2 V9.H8, V8.H8, V1.H8 + VTRN1 V11.H8, V10.H8, V2.H8 + VTRN2 V11.H8, V10.H8, V3.H8 + VTRN1 V13.H8, V12.H8, V4.H8 + VTRN2 V13.H8, V12.H8, V5.H8 + VTRN1 V15.H8, V14.H8, V6.H8 + VTRN2 V15.H8, V14.H8, V7.H8 + + VTRN1 V2.S4, V0.S4, V8.S4 + VTRN2 V2.S4, V0.S4, V10.S4 + VTRN1 V3.S4, V1.S4, V9.S4 + VTRN2 V3.S4, V1.S4, V11.S4 + VTRN1 V6.S4, V4.S4, V12.S4 + VTRN2 V6.S4, V4.S4, V14.S4 + VTRN1 V7.S4, V5.S4, V13.S4 + VTRN2 V7.S4, V5.S4, V15.S4 + + VTRN1 V12.D2, V8.D2, V0.D2 + VTRN2 V12.D2, V8.D2, V4.D2 + VTRN1 V13.D2, V9.D2, V1.D2 + VTRN2 V13.D2, V9.D2, V5.D2 + VTRN1 V14.D2, V10.D2, V2.D2 + VTRN2 V14.D2, V10.D2, V6.D2 + VTRN1 V15.D2, V11.D2, V3.D2 + VTRN2 V15.D2, V11.D2, V7.D2 + + VADD V4.H8, V0.H8, V8.H8 + VSUB V4.H8, V0.H8, V12.H8 + VADD V5.H8, V1.H8, V9.H8 + VSUB V5.H8, V1.H8, V13.H8 + VADD V6.H8, V2.H8, V10.H8 + VSUB V6.H8, V2.H8, V14.H8 + VADD V7.H8, V3.H8, V11.H8 + VSUB V7.H8, V3.H8, V15.H8 + + VADD V10.H8, V8.H8, V0.H8 + VADD V11.H8, V9.H8, V1.H8 + VSUB V10.H8, V8.H8, V2.H8 + VSUB V11.H8, V9.H8, V3.H8 + VADD V14.H8, V12.H8, V4.H8 + VADD V15.H8, V13.H8, V5.H8 + VSUB V14.H8, V12.H8, V6.H8 + VSUB V15.H8, V13.H8, V7.H8 + + VADD V1.H8, V0.H8, V8.H8 + VSUB V1.H8, V0.H8, V9.H8 + VADD V3.H8, V2.H8, V10.H8 + VSUB V3.H8, V2.H8, V11.H8 + VADD V5.H8, V4.H8, V12.H8 + VSUB V5.H8, V4.H8, V13.H8 + VADD V7.H8, V6.H8, V14.H8 + VSUB V7.H8, V6.H8, V15.H8 + + ABS8H(8, 8) + UADALP4S(16, 8) + ABS8H(9, 9) + UADALP4S(16, 9) + ABS8H(10, 10) + UADALP4S(16, 10) + ABS8H(11, 11) + UADALP4S(16, 11) + ABS8H(12, 12) + UADALP4S(16, 12) + ABS8H(13, 13) + UADALP4S(16, 13) + ABS8H(14, 14) + UADALP4S(16, 14) + ABS8H(15, 15) + UADALP4S(16, 15) + + ADD $8, R0 + ADD $8, R2 + + SUB $1, R4 + CBNZ R4, half + + VADDV V16.S4, V17 + VMOV V17.S[0], R5 + + MOVD R5, ret+32(FP) + RET diff --git a/third_party/h265/hevc/satd_riscv64.s b/third_party/h265/hevc/satd_riscv64.s new file mode 100644 index 00000000..d10d6a3e --- /dev/null +++ b/third_party/h265/hevc/satd_riscv64.s @@ -0,0 +1,236 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func satd16x8RVV(src *uint8, srcStride int, pred *uint8, predStride int) int64 +// +// satd over a sixteen wide and eight tall strip, one 8x8 at a time. There is no +// shuffle network: the rows go back out with the strided store and come in +// again contiguously, which is the transpose. Differences reach 255 and each +// pass scales by eight, which int16 holds. +TEXT ·satd16x8RVV(SB), NOSPLIT, $128-40 + MOV src+0(FP), X10 + MOV srcStride+8(FP), X11 + MOV pred+16(FP), X12 + MOV predStride+24(FP), X13 + + MOV $buf-128(SP), X14 + MOV $16, X15 + + VSETIVLI $8, E32, M1, TA, MA, X0 + VMVVI $0, V20 + + MOV $2, X16 + +half: + MOV X10, X5 + MOV X12, X6 + + VSETIVLI $8, E16, M1, TA, MA, X0 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V0 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V1 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V2 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V3 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V4 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V5 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V6 + ADD X11, X5 + ADD X13, X6 + + VLE8V (X5), V16 + VLE8V (X6), V17 + VZEXTVF2 V16, V18 + VZEXTVF2 V17, V19 + VSUBVV V19, V18, V7 + + VADDVV V4, V0, V8 + VSUBVV V4, V0, V12 + VADDVV V5, V1, V9 + VSUBVV V5, V1, V13 + VADDVV V6, V2, V10 + VSUBVV V6, V2, V14 + VADDVV V7, V3, V11 + VSUBVV V7, V3, V15 + + VADDVV V10, V8, V0 + VADDVV V11, V9, V1 + VSUBVV V10, V8, V2 + VSUBVV V11, V9, V3 + VADDVV V14, V12, V4 + VADDVV V15, V13, V5 + VSUBVV V14, V12, V6 + VSUBVV V15, V13, V7 + + VADDVV V1, V0, V8 + VSUBVV V1, V0, V9 + VADDVV V3, V2, V10 + VSUBVV V3, V2, V11 + VADDVV V5, V4, V12 + VSUBVV V5, V4, V13 + VADDVV V7, V6, V14 + VSUBVV V7, V6, V15 + + // Scatter down the buffer's columns, then read the rows back. + MOV X14, X18 + VSSE16V V8, X15, (X18) + ADD $2, X18 + VSSE16V V9, X15, (X18) + ADD $2, X18 + VSSE16V V10, X15, (X18) + ADD $2, X18 + VSSE16V V11, X15, (X18) + ADD $2, X18 + VSSE16V V12, X15, (X18) + ADD $2, X18 + VSSE16V V13, X15, (X18) + ADD $2, X18 + VSSE16V V14, X15, (X18) + ADD $2, X18 + VSSE16V V15, X15, (X18) + + MOV X14, X18 + VLE16V (X18), V0 + ADD $16, X18 + VLE16V (X18), V1 + ADD $16, X18 + VLE16V (X18), V2 + ADD $16, X18 + VLE16V (X18), V3 + ADD $16, X18 + VLE16V (X18), V4 + ADD $16, X18 + VLE16V (X18), V5 + ADD $16, X18 + VLE16V (X18), V6 + ADD $16, X18 + VLE16V (X18), V7 + + VADDVV V4, V0, V8 + VSUBVV V4, V0, V12 + VADDVV V5, V1, V9 + VSUBVV V5, V1, V13 + VADDVV V6, V2, V10 + VSUBVV V6, V2, V14 + VADDVV V7, V3, V11 + VSUBVV V7, V3, V15 + + VADDVV V10, V8, V0 + VADDVV V11, V9, V1 + VSUBVV V10, V8, V2 + VSUBVV V11, V9, V3 + VADDVV V14, V12, V4 + VADDVV V15, V13, V5 + VSUBVV V14, V12, V6 + VSUBVV V15, V13, V7 + + VADDVV V1, V0, V8 + VSUBVV V1, V0, V9 + VADDVV V3, V2, V10 + VSUBVV V3, V2, V11 + VADDVV V5, V4, V12 + VSUBVV V5, V4, V13 + VADDVV V7, V6, V14 + VSUBVV V7, V6, V15 + + // The widening comes before the absolute value: the sums leave int16. + VSETIVLI $8, E32, M1, TA, MA, X0 + + VSEXTVF2 V8, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V9, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V10, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V11, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V12, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V13, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V14, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + VSEXTVF2 V15, V18 + VRSUBVX X0, V18, V19 + VMAXVV V18, V19, V19 + VADDVV V19, V20, V20 + + ADD $8, X10 + ADD $8, X12 + + ADD $-1, X16 + BNEZ X16, half + + VMVVI $0, V21 + VREDSUMVS V21, V20, V22 + VMVXS V22, X17 + + MOV X17, ret+32(FP) + RET diff --git a/third_party/h265/hevc/scaling.go b/third_party/h265/hevc/scaling.go new file mode 100644 index 00000000..1757bc3d --- /dev/null +++ b/third_party/h265/hevc/scaling.go @@ -0,0 +1,151 @@ +package hevc + +var defaultScalingListIntra = [64]uint8{ + 16, 16, 16, 16, 17, 18, 21, 24, + 16, 16, 16, 16, 17, 19, 22, 25, + 16, 16, 17, 18, 20, 22, 25, 29, + 16, 16, 18, 21, 24, 27, 31, 36, + 17, 17, 20, 24, 30, 35, 41, 47, + 18, 19, 22, 27, 35, 44, 54, 65, + 21, 22, 25, 31, 41, 54, 70, 88, + 24, 25, 29, 36, 47, 65, 88, 115, +} + +var defaultScalingListInter = [64]uint8{ + 16, 16, 16, 16, 17, 18, 20, 24, + 16, 16, 16, 17, 18, 20, 24, 25, + 16, 16, 17, 18, 20, 24, 25, 28, + 16, 17, 18, 20, 24, 25, 28, 33, + 17, 18, 20, 24, 25, 28, 33, 41, + 18, 20, 24, 25, 28, 33, 41, 54, + 20, 24, 25, 28, 33, 41, 54, 71, + 24, 25, 28, 33, 41, 54, 71, 91, +} + +func defaultScalingList() scalingList { + var sl scalingList + + for m := range sl.sl[0] { + for i := range 16 { + sl.sl[0][m][i] = 16 + } + } + + for s := 1; s < maxScalingListSizes; s++ { + for m := range sl.sl[s] { + if m < 3 { + sl.sl[s][m] = defaultScalingListIntra + } else { + sl.sl[s][m] = defaultScalingListInter + } + } + } + + for s := range sl.dc { + for m := range sl.dc[s] { + sl.dc[s][m] = 16 + } + } + + return sl +} + +func parseScalingListData(c *getBits, sl *scalingList) error { + for sizeID := range maxScalingListSizes { + step := 1 + if sizeID == 3 { + step = 3 + } + + for matrixID := 0; matrixID < maxScalingListMats; matrixID += step { + if c.bit() == 0 { + delta := int(c.ue()) * step + if delta > matrixID { + return ErrInvalid + } + + if delta == 0 { + continue + } + + ref := matrixID - delta + sl.sl[sizeID][matrixID] = sl.sl[sizeID][ref] + + if sizeID > 1 { + sl.dc[sizeID-2][matrixID] = sl.dc[sizeID-2][ref] + } + + continue + } + + next := int32(8) + + if sizeID > 1 { + dc := c.se() + if dc < -7 || dc > 247 { + return ErrInvalid + } + + next = dc + 8 + sl.dc[sizeID-2][matrixID] = uint8(next) + } + + scan, size := scanOrder[3][scanDiag], 8 + if sizeID == 0 { + scan, size = scanOrder[2][scanDiag], 4 + } + + for _, p := range scan { + d := c.se() + if d < -128 || d > 127 { + return ErrInvalid + } + + next = (next + d + 256) % 256 + sl.sl[sizeID][matrixID][int(p.y)*size+int(p.x)] = uint8(next) + } + } + } + + if c.err { + return ErrInvalid + } + + return nil +} + +// factors is the ScalingFactor derivation of 7.4.5, replicating the eight by +// eight lists across the larger transform sizes and overriding the DC term. +func (sl *scalingList) factors() [maxScalingListSizes][maxScalingListMats][]uint8 { + var out [maxScalingListSizes][maxScalingListMats][]uint8 + + for sizeID := range maxScalingListSizes { + n := 4 << sizeID + rep := n / 8 + + for matrixID := range maxScalingListMats { + f := make([]uint8, n*n) + + if sizeID == 0 { + copy(f, sl.sl[0][matrixID][:16]) + out[sizeID][matrixID] = f + + continue + } + + for y := range n { + for x := range n { + f[y*n+x] = sl.sl[sizeID][matrixID][y/rep*8+x/rep] + } + } + + if sizeID > 1 { + f[0] = sl.dc[sizeID-2][matrixID] + } + + out[sizeID][matrixID] = f + } + } + + return out +} diff --git a/third_party/h265/hevc/scan.go b/third_party/h265/hevc/scan.go new file mode 100644 index 00000000..63cf9b4c --- /dev/null +++ b/third_party/h265/hevc/scan.go @@ -0,0 +1,63 @@ +package hevc + +type scanPos struct { + x, y uint8 +} + +const ( + scanDiag = iota + scanHor + scanVer + nScanOrders +) + +const maxScanLog2 = 5 + +func buildDiagScan(size int) []scanPos { + scan := make([]scanPos, 0, size*size) + + for d := range 2*size - 1 { + for y := min(d, size-1); y >= max(0, d-size+1); y-- { + scan = append(scan, scanPos{uint8(d - y), uint8(y)}) + } + } + + return scan +} + +func buildHorScan(size int) []scanPos { + scan := make([]scanPos, 0, size*size) + + for y := range size { + for x := range size { + scan = append(scan, scanPos{uint8(x), uint8(y)}) + } + } + + return scan +} + +func buildVerScan(size int) []scanPos { + scan := make([]scanPos, 0, size*size) + + for x := range size { + for y := range size { + scan = append(scan, scanPos{uint8(x), uint8(y)}) + } + } + + return scan +} + +// scanOrder is ScanOrder[log2BlockSize][scanIdx] of 6.5. +var scanOrder [maxScanLog2 + 1][nScanOrders][]scanPos + +func init() { + for k := range scanOrder { + size := 1 << k + + scanOrder[k][scanDiag] = buildDiagScan(size) + scanOrder[k][scanHor] = buildHorScan(size) + scanOrder[k][scanVer] = buildVerScan(size) + } +} diff --git a/third_party/h265/hevc/slice.go b/third_party/h265/hevc/slice.go new file mode 100644 index 00000000..90f02c2f --- /dev/null +++ b/third_party/h265/hevc/slice.go @@ -0,0 +1,575 @@ +package hevc + +import "math/bits" + +type sliceType uint8 + +const ( + sliceB sliceType = iota + sliceP + sliceI +) + +const maxRefs = 16 + +type longTermRPS struct { + numSps int + pocLsbLt []uint32 + usedByCurrPicLt []bool + deltaPocMsbPresn []bool + deltaPocMsbCycle []uint32 +} + +type refPicListModification struct { + flagL0 bool + listEntryL0 []uint32 + flagL1 bool + listEntryL1 []uint32 +} + +type predWeightTable struct { + lumaLog2Denom uint8 + chromaLog2Denom uint8 + lumaWeight [2][maxRefs]int16 + lumaOffset [2][maxRefs]int16 + chromaWeight [2][maxRefs][2]int16 + chromaOffset [2][maxRefs][2]int16 +} + +type sliceHeader struct { + nalType NALType + + firstSliceSegmentInPic bool + noOutputOfPriorPics bool + ppsID uint32 + dependentSliceSegment bool + sliceSegmentAddress uint32 + + sliceType sliceType + picOutputFlag bool + colourPlaneID uint8 + + picOrderCntLsb uint32 + stRPSFromSPS bool + stRPSIdx uint32 + stRPS shortTermRPS + ltRPS longTermRPS + temporalMvp bool + numPocTotalCurr uint32 + + saoLuma bool + saoChroma bool + + numRefIdxL0Active uint32 + numRefIdxL1Active uint32 + listModification refPicListModification + mvdL1Zero bool + cabacInit bool + collocatedFromL0 bool + collocatedRefIdx uint32 + maxNumMergeCand uint32 + weights predWeightTable + + qpDelta int32 + qpY int32 + cbQPOffset int32 + crQPOffset int32 + cuChromaQPOffset bool + deblockingDisabled bool + betaOffsetDiv2 int32 + tcOffsetDiv2 int32 + loopFilterAcross bool + + entryPointOffsets []uint32 + + dataOffset int +} + +func ceilLog2(n uint32) int { + if n <= 1 { + return 0 + } + + return bits.Len32(n - 1) +} + +func (s *sps) chromaArrayType() uint32 { + if s.separateColourPlane { + return 0 + } + + return s.chromaFormatIDC +} + +func (h *sliceHeader) inherit(prev *sliceHeader) { + addr := h.sliceSegmentAddress + entry := h.entryPointOffsets + off := h.dataOffset + first := h.firstSliceSegmentInPic + dep := h.dependentSliceSegment + nal := h.nalType + ppsID := h.ppsID + noOutput := h.noOutputOfPriorPics + + *h = *prev + + h.sliceSegmentAddress = addr + h.entryPointOffsets = entry + h.dataOffset = off + h.firstSliceSegmentInPic = first + h.dependentSliceSegment = dep + h.nalType = nal + h.ppsID = ppsID + h.noOutputOfPriorPics = noOutput +} + +func parseSliceHeader(rbsp []byte, nalType NALType, s *sps, p *pps) (*sliceHeader, error) { + var c getBits + c.init(rbsp) + + h := &sliceHeader{nalType: nalType} + h.firstSliceSegmentInPic = c.bit() != 0 + + if nalType >= NALBlaWLP && nalType <= 23 { + h.noOutputOfPriorPics = c.bit() != 0 + } + + h.ppsID = c.ue() + if h.ppsID != p.id { + return nil, ErrInvalid + } + + numCtbs := s.picWidthInCtbs * s.picHeightInCtbs + + if !h.firstSliceSegmentInPic { + if p.dependentSliceSegmentsEnabled { + h.dependentSliceSegment = c.bit() != 0 + } + + h.sliceSegmentAddress = c.bits(ceilLog2(numCtbs)) + if h.sliceSegmentAddress >= numCtbs { + return nil, ErrInvalid + } + } + + h.picOutputFlag = true + h.collocatedFromL0 = true + h.maxNumMergeCand = 5 + h.numRefIdxL0Active = p.numRefIdxL0DefaultActive + h.numRefIdxL1Active = p.numRefIdxL1DefaultActive + h.deblockingDisabled = p.deblockingDisabled + h.betaOffsetDiv2 = p.betaOffsetDiv2 + h.tcOffsetDiv2 = p.tcOffsetDiv2 + h.loopFilterAcross = p.loopFilterAcrossSlices + + if !h.dependentSliceSegment { + c.skip(int(p.numExtraSliceHeaderBits)) + + t := c.ue() + if t > 2 { + return nil, ErrInvalid + } + + h.sliceType = sliceType(t) + + if p.outputFlagPresent { + h.picOutputFlag = c.bit() != 0 + } + + if s.separateColourPlane { + h.colourPlaneID = uint8(c.bits(2)) + } + + if !nalType.IsIDR() { + h.picOrderCntLsb = c.bits(int(s.log2MaxPocLsb)) + + h.stRPSFromSPS = c.bit() != 0 + if !h.stRPSFromSPS { + rps, err := parseShortTermRPS(&c, len(s.stRPS), len(s.stRPS), s.stRPS) + if err != nil { + return nil, err + } + + h.stRPS = rps + } else { + if len(s.stRPS) == 0 { + return nil, ErrInvalid + } + + if len(s.stRPS) > 1 { + h.stRPSIdx = c.bits(ceilLog2(uint32(len(s.stRPS)))) + } + + if int(h.stRPSIdx) >= len(s.stRPS) { + return nil, ErrInvalid + } + + h.stRPS = s.stRPS[h.stRPSIdx] + } + + if s.longTermRefPicsPresent { + lt, err := parseLongTermRPS(&c, s) + if err != nil { + return nil, err + } + + h.ltRPS = lt + } + + if s.temporalMvpEnabled { + h.temporalMvp = c.bit() != 0 + } + } + + h.numPocTotalCurr = numPocTotalCurr(&h.stRPS, &h.ltRPS) + + if s.saoEnabled { + h.saoLuma = c.bit() != 0 + + if s.chromaArrayType() != 0 { + h.saoChroma = c.bit() != 0 + } + } + + if h.sliceType != sliceI { + if c.bit() != 0 { + h.numRefIdxL0Active = c.ue() + 1 + + if h.sliceType == sliceB { + h.numRefIdxL1Active = c.ue() + 1 + } + } + + if h.numRefIdxL0Active > maxRefs || h.numRefIdxL1Active > maxRefs { + return nil, ErrInvalid + } + + if p.listsModificationPresent && h.numPocTotalCurr > 1 { + if err := parseRefPicListModification(&c, h); err != nil { + return nil, err + } + } + + if h.sliceType == sliceB { + h.mvdL1Zero = c.bit() != 0 + } + + if p.cabacInitPresent { + h.cabacInit = c.bit() != 0 + } + + if h.temporalMvp { + if h.sliceType == sliceB { + h.collocatedFromL0 = c.bit() != 0 + } + + active := h.numRefIdxL1Active + if h.collocatedFromL0 { + active = h.numRefIdxL0Active + } + + if active > 1 { + h.collocatedRefIdx = c.ue() + if h.collocatedRefIdx >= active { + return nil, ErrInvalid + } + } + } + + if (p.weightedPred && h.sliceType == sliceP) || + (p.weightedBipred && h.sliceType == sliceB) { + if err := parsePredWeightTable(&c, h, s); err != nil { + return nil, err + } + } + + n := c.ue() + if n > 4 { + return nil, ErrInvalid + } + + h.maxNumMergeCand = 5 - n + } + + h.qpDelta = c.se() + h.qpY = p.initQP + h.qpDelta + + if h.qpY < -(6*int32(s.bitDepthLuma)-48) || h.qpY > 51 { + return nil, ErrInvalid + } + + if p.sliceChromaQPOffsets { + h.cbQPOffset = c.se() + h.crQPOffset = c.se() + + if h.cbQPOffset < -12 || h.cbQPOffset > 12 || + h.crQPOffset < -12 || h.crQPOffset > 12 { + return nil, ErrInvalid + } + } + + if p.chromaQPOffsetList { + h.cuChromaQPOffset = c.bit() != 0 + } + + if p.deblockingOverride && c.bit() != 0 { + h.deblockingDisabled = c.bit() != 0 + + if !h.deblockingDisabled { + h.betaOffsetDiv2 = c.se() + h.tcOffsetDiv2 = c.se() + + if h.betaOffsetDiv2 < -6 || h.betaOffsetDiv2 > 6 || + h.tcOffsetDiv2 < -6 || h.tcOffsetDiv2 > 6 { + return nil, ErrInvalid + } + } + } + + if p.loopFilterAcrossSlices && (h.saoLuma || h.saoChroma || !h.deblockingDisabled) { + h.loopFilterAcross = c.bit() != 0 + } + } + + if p.tilesEnabled || p.entropyCodingSync { + n := c.ue() + if n > numCtbs { + return nil, ErrInvalid + } + + if n > 0 { + lenMinus1 := c.ue() + if lenMinus1 > 31 { + return nil, ErrInvalid + } + + h.entryPointOffsets = make([]uint32, n) + + var cum uint32 + + for i := range h.entryPointOffsets { + v := c.bits(int(lenMinus1) + 1) + + if cum+v+1 < cum { + return nil, ErrInvalid + } + + cum += v + 1 + h.entryPointOffsets[i] = cum + } + } + } + + if p.sliceHeaderExtensionPresen { + n := c.ue() + if n > uint32(len(rbsp)) { + return nil, ErrInvalid + } + + c.skip(int(n) * 8) + } + + if c.bit() != 1 { + return nil, ErrInvalid + } + + c.byteAlign() + + if c.err { + return nil, ErrInvalid + } + + h.dataOffset = c.pos() / 8 + + return h, nil +} + +func numPocTotalCurr(st *shortTermRPS, lt *longTermRPS) uint32 { + var n uint32 + + for _, u := range st.usedS0 { + if u { + n++ + } + } + + for _, u := range st.usedS1 { + if u { + n++ + } + } + + for _, u := range lt.usedByCurrPicLt { + if u { + n++ + } + } + + return n +} + +func parseRefPicListModification(c *getBits, h *sliceHeader) error { + n := ceilLog2(h.numPocTotalCurr) + + h.listModification.flagL0 = c.bit() != 0 + if h.listModification.flagL0 { + h.listModification.listEntryL0 = make([]uint32, h.numRefIdxL0Active) + + for i := range h.listModification.listEntryL0 { + v := c.bits(n) + if v >= h.numPocTotalCurr { + return ErrInvalid + } + + h.listModification.listEntryL0[i] = v + } + } + + if h.sliceType != sliceB { + return nil + } + + h.listModification.flagL1 = c.bit() != 0 + if h.listModification.flagL1 { + h.listModification.listEntryL1 = make([]uint32, h.numRefIdxL1Active) + + for i := range h.listModification.listEntryL1 { + v := c.bits(n) + if v >= h.numPocTotalCurr { + return ErrInvalid + } + + h.listModification.listEntryL1[i] = v + } + } + + return nil +} + +func parseLongTermRPS(c *getBits, s *sps) (longTermRPS, error) { + var lt longTermRPS + + var numSps uint32 + if len(s.ltRefPicPocLsb) > 0 { + numSps = c.ue() + } + + numPics := c.ue() + + if numSps > uint32(len(s.ltRefPicPocLsb)) || numSps+numPics > maxLongTermRefPics { + return lt, ErrInvalid + } + + total := int(numSps + numPics) + lt.numSps = int(numSps) + lt.pocLsbLt = make([]uint32, total) + lt.usedByCurrPicLt = make([]bool, total) + lt.deltaPocMsbPresn = make([]bool, total) + lt.deltaPocMsbCycle = make([]uint32, total) + + for i := range total { + if uint32(i) < numSps { + var idx uint32 + if len(s.ltRefPicPocLsb) > 1 { + idx = c.bits(ceilLog2(uint32(len(s.ltRefPicPocLsb)))) + } + + if int(idx) >= len(s.ltRefPicPocLsb) { + return lt, ErrInvalid + } + + lt.pocLsbLt[i] = s.ltRefPicPocLsb[idx] + lt.usedByCurrPicLt[i] = s.usedByCurrPicLt[idx] + } else { + lt.pocLsbLt[i] = c.bits(int(s.log2MaxPocLsb)) + lt.usedByCurrPicLt[i] = c.bit() != 0 + } + + lt.deltaPocMsbPresn[i] = c.bit() != 0 + if lt.deltaPocMsbPresn[i] { + lt.deltaPocMsbCycle[i] = c.ue() + } + } + + return lt, nil +} + +func parsePredWeightTable(c *getBits, h *sliceHeader, s *sps) error { + w := &h.weights + + denom := c.ue() + if denom > 7 { + return ErrInvalid + } + + w.lumaLog2Denom = uint8(denom) + + chromaDenom := int32(denom) + if s.chromaArrayType() != 0 { + chromaDenom += c.se() + + if chromaDenom < 0 || chromaDenom > 7 { + return ErrInvalid + } + } + + w.chromaLog2Denom = uint8(chromaDenom) + + // 7.4.7.3, WpOffsetHalfRangeC: the sample depth under high precision + // offsets, eight bits otherwise. + half := int32(128) + if s.highPrecisionOffsets { + half = 1 << (int32(s.bitDepthChroma) - 1) + } + + lists := 1 + if h.sliceType == sliceB { + lists = 2 + } + + counts := [2]uint32{h.numRefIdxL0Active, h.numRefIdxL1Active} + + for l := range lists { + n := int(counts[l]) + + var lumaFlag, chromaFlag [maxRefs]bool + + for i := range n { + lumaFlag[i] = c.bit() != 0 + } + + if s.chromaArrayType() != 0 { + for i := range n { + chromaFlag[i] = c.bit() != 0 + } + } + + for i := range n { + if lumaFlag[i] { + w.lumaWeight[l][i] = int16(1<>w.chromaLog2Denom + w.chromaOffset[l][i][j] = int16(clip3(off, -half, half-1)) + } + } + } + + return nil +} diff --git a/third_party/h265/hevc/sse_amd64.s b/third_party/h265/hevc/sse_amd64.s new file mode 100644 index 00000000..bb0f744c --- /dev/null +++ b/third_party/h265/hevc/sse_amd64.s @@ -0,0 +1,69 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func sse8AVX2(src *uint8, srcStride int, block *uint8, blockStride, n int) int64 +// +// The squared error of an n by n block, the pairwise multiply squaring and +// adding in one step. +TEXT ·sse8AVX2(SB), NOSPLIT, $0-48 + MOVQ src+0(FP), SI + MOVQ srcStride+8(FP), R8 + MOVQ block+16(FP), DI + MOVQ blockStride+24(FP), R9 + MOVQ n+32(FP), CX + + VPXOR Y0, Y0, Y0 + + XORQ BX, BX + +rowloop: + XORQ DX, DX + +colloop: + MOVQ CX, AX + SUBQ DX, AX + CMPQ AX, $16 + JLT half + + VPMOVZXBW (SI)(DX*1), Y1 + VPMOVZXBW (DI)(DX*1), Y2 + VPSUBW Y2, Y1, Y1 + VPMADDWD Y1, Y1, Y1 + VPADDD Y1, Y0, Y0 + + ADDQ $16, DX + JMP next + +half: + VPMOVZXBW (SI)(DX*1), X1 + VPMOVZXBW (DI)(DX*1), X2 + VPSUBW X2, X1, X1 + VPMADDWD X1, X1, X1 + VPADDD Y1, Y0, Y0 + + ADDQ $8, DX + +next: + CMPQ DX, CX + JLT colloop + + ADDQ R8, SI + ADDQ R9, DI + INCQ BX + CMPQ BX, CX + JLT rowloop + + VEXTRACTI128 $1, Y0, X1 + VPADDD X1, X0, X0 + VPSHUFD $0x4e, X0, X1 + VPADDD X1, X0, X0 + VPSHUFD $0xb1, X0, X1 + VPADDD X1, X0, X0 + + VMOVD X0, AX + MOVLQZX AX, AX + MOVQ AX, ret+40(FP) + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/sse_arm64.s b/third_party/h265/hevc/sse_arm64.s new file mode 100644 index 00000000..81330af7 --- /dev/null +++ b/third_party/h265/hevc/sse_arm64.s @@ -0,0 +1,82 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define SMLAL4S(Vd, Vn, Vm) WORD $(0x0e608000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMLAL2_4S(Vd, Vn, Vm) WORD $(0x4e608000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func sse8NEON(src *uint8, srcStride int, block *uint8, blockStride, n int) int64 +// +// The squared error of an n by n block. +TEXT ·sse8NEON(SB), NOSPLIT, $0-48 + MOVD src+0(FP), R0 + MOVD srcStride+8(FP), R1 + MOVD block+16(FP), R2 + MOVD blockStride+24(FP), R3 + MOVD n+32(FP), R4 + + VMOVI $0, V16.B16 + + MOVD $0, R5 + +rowloop: + MOVD R0, R6 + MOVD R2, R7 + MOVD $0, R8 + +colloop: + SUB R8, R4, R9 + CMP $16, R9 + BLT half + + VLD1 (R6), [V0.B16] + VLD1 (R7), [V1.B16] + + VUXTL V0.B8, V2.H8 + VUXTL V1.B8, V3.H8 + VSUB V3.H8, V2.H8, V2.H8 + VUXTL2 V0.B16, V4.H8 + VUXTL2 V1.B16, V5.H8 + VSUB V5.H8, V4.H8, V4.H8 + + SMLAL4S(16, 2, 2) + SMLAL2_4S(16, 2, 2) + SMLAL4S(16, 4, 4) + SMLAL2_4S(16, 4, 4) + + ADD $16, R6 + ADD $16, R7 + ADD $16, R8 + + B next + +half: + VLD1 (R6), [V0.B8] + VLD1 (R7), [V1.B8] + + VUXTL V0.B8, V2.H8 + VUXTL V1.B8, V3.H8 + VSUB V3.H8, V2.H8, V2.H8 + + SMLAL4S(16, 2, 2) + SMLAL2_4S(16, 2, 2) + + ADD $8, R6 + ADD $8, R7 + ADD $8, R8 + +next: + CMP R4, R8 + BLT colloop + + ADD $1, R5 + ADD R1, R0 + ADD R3, R2 + CMP R4, R5 + BLT rowloop + + VADDV V16.S4, V17 + VMOV V17.S[0], R6 + + MOVD R6, ret+40(FP) + RET diff --git a/third_party/h265/hevc/sse_riscv64.s b/third_party/h265/hevc/sse_riscv64.s new file mode 100644 index 00000000..2e5e5157 --- /dev/null +++ b/third_party/h265/hevc/sse_riscv64.s @@ -0,0 +1,55 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func sse8RVV(src *uint8, srcStride int, block *uint8, blockStride, n int) int64 +// +// The squared error of an n by n block. n and the vector length are both powers +// of two, so one length serves every chunk. +TEXT ·sse8RVV(SB), NOSPLIT, $0-48 + MOV src+0(FP), X10 + MOV srcStride+8(FP), X11 + MOV block+16(FP), X12 + MOV blockStride+24(FP), X13 + MOV n+32(FP), X14 + + VSETVLI X14, E16, M1, TA, MA, X15 + + VSETVLI X15, E32, M2, TA, MA, X0 + VMVVI $0, V8 + + MOV $0, X16 + +rowloop: + MOV X10, X17 + MOV X12, X18 + MOV $0, X19 + +colloop: + VSETVLI X15, E16, M1, TA, MA, X0 + + VLE8V (X17), V1 + VLE8V (X18), V2 + VZEXTVF2 V1, V3 + VZEXTVF2 V2, V4 + VSUBVV V4, V3, V3 + + VWMACCVV V3, V3, V8 + + ADD X15, X17 + ADD X15, X18 + ADD X15, X19 + BLT X19, X14, colloop + + ADD X11, X10 + ADD X13, X12 + ADD $1, X16 + BLT X16, X14, rowloop + + VSETVLI X15, E32, M2, TA, MA, X0 + VMVVI $0, V12 + VREDSUMVS V12, V8, V14 + VMVXS V14, X20 + + MOV X20, ret+40(FP) + RET diff --git a/third_party/h265/hevc/transformenc.go b/third_party/h265/hevc/transformenc.go new file mode 100644 index 00000000..e5e74dd4 --- /dev/null +++ b/third_party/h265/hevc/transformenc.go @@ -0,0 +1,141 @@ +package hevc + +func forwardTransform(dst, src []int32, n, bitDepth int) { + if bitDepth == 8 && transform8Safe(src[:n*n]) { + forwardTransform8(dst, src, n) + + return + } + + forwardTransformWide(dst, src, n, bitDepth) +} + +func transform8Safe(src []int32) bool { + for _, v := range src { + if v < -255 || v > 255 { + return false + } + } + + return true +} + +func forwardTransform8(dst, src []int32, n int) { + if k := forwardTransform8Asm; k != nil { + k(dst, src, n) + + return + } + + forwardTransform8Go(dst, src, n) +} + +func forwardTransform8Go(dst, src []int32, n int) { + shift1 := log2(n) - 1 + shift2 := log2(n) + 6 + var mid [32 * 32]int32 + stride := 32 / n + + for y := range n { + for k := range n { + var sum int32 + for x := range n { + sum += int32(transMatrix[k*stride][x]) * src[y*n+x] + } + mid[y*n+k] = (sum + 1<> uint(shift1) + } + } + + for k := range n { + for v := range n { + var sum int32 + for y := range n { + sum += int32(transMatrix[v*stride][y]) * mid[y*n+k] + } + dst[v*n+k] = (sum + 1<> uint(shift2) + } + } +} + +func forwardTransformWide(dst, src []int32, n, bitDepth int) { + shift1 := log2(n) + bitDepth - 9 + shift2 := log2(n) + 6 + var mid [32 * 32]int64 + stride := 32 / n + + for y := range n { + for k := range n { + var sum int64 + for x := range n { + sum += int64(transMatrix[k*stride][x]) * int64(src[y*n+x]) + } + mid[y*n+k] = (sum + 1<> uint(shift1) + } + } + + for k := range n { + for v := range n { + var sum int64 + for y := range n { + sum += int64(transMatrix[v*stride][y]) * mid[y*n+k] + } + dst[v*n+k] = int32((sum + 1<> uint(shift2)) + } + } +} + +func forwardTransformDST4(dst, src []int32, bitDepth int) { + shift1 := bitDepth - 7 + shift2 := 8 + var mid [16]int32 + + for y := range 4 { + for k := range 4 { + var sum int32 + for x := range 4 { + sum += int32(dstMatrix[k][x]) * src[y*4+x] + } + mid[y*4+k] = (sum + 1<> uint(shift1) + } + } + + for k := range 4 { + for v := range 4 { + var sum int32 + for y := range 4 { + sum += int32(dstMatrix[v][y]) * mid[y*4+k] + } + dst[v*4+k] = (sum + 1<> uint(shift2) + } + } +} + +// quantize is 8.6.3 run backwards. +func quantize(dst, src []int32, n, qp, bitDepth int) { + scale, qbits := quantScale(n, qp, bitDepth) + offset := int64(1<>qbits, int64(0x7fff)) + if v < 0 { + level = -level + } + + dst[i] = int32(level) + } +} diff --git a/third_party/h265/hevc/transformenc_amd64.s b/third_party/h265/hevc/transformenc_amd64.s new file mode 100644 index 00000000..02d20a75 --- /dev/null +++ b/third_party/h265/hevc/transformenc_amd64.s @@ -0,0 +1,344 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +TEXT ·forwardTransform8AVX2(SB), $4096-48 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ m+16(FP), R14 + MOVQ n+24(FP), R8 + MOVQ R8, R9 + SHLQ $2, R9 + + CMPQ R8, $4 + JEQ four + + MOVQ shift1+32(FP), CX + MOVQ CX, X14 + DECQ CX + MOVQ $1, R10 + SHLQ CL, R10 + MOVQ R10, X15 + VPBROADCASTD X15, Y15 + + MOVQ SI, R10 + LEAQ 0(SP), R11 + MOVQ R8, R12 + +row8: + XORQ BX, BX + +coef8: + VPXOR Y0, Y0, Y0 + MOVQ R10, AX + LEAQ (R14)(BX*1), DX + MOVQ R8, CX + +sum8: + VPBROADCASTD (AX), Y1 + VMOVDQU (DX), Y2 + VPMULLD Y1, Y2, Y2 + VPADDD Y2, Y0, Y0 + ADDQ $4, AX + ADDQ R9, DX + DECQ CX + JNZ sum8 + + VPADDD Y15, Y0, Y0 + VPSRAD X14, Y0, Y0 + VMOVDQU Y0, (R11)(BX*1) + ADDQ $32, BX + CMPQ BX, R9 + JLT coef8 + + ADDQ R9, R10 + ADDQ R9, R11 + DECQ R12 + JNZ row8 + + MOVQ shift2+40(FP), CX + MOVQ CX, X14 + DECQ CX + MOVQ $1, R10 + SHLQ CL, R10 + MOVQ R10, X15 + VPBROADCASTD X15, Y15 + + LEAQ 0(SP), R10 + MOVQ R14, R11 + MOVQ R8, R12 + +out8: + XORQ BX, BX + +outcoef8: + VPXOR Y0, Y0, Y0 + MOVQ R10, AX + MOVQ R11, DX + MOVQ R8, CX + +outsum8: + VMOVDQU (AX)(BX*1), Y1 + VPBROADCASTD (DX), Y2 + VPMULLD Y1, Y2, Y2 + VPADDD Y2, Y0, Y0 + ADDQ R9, AX + ADDQ R9, DX + DECQ CX + JNZ outsum8 + + VPADDD Y15, Y0, Y0 + VPSRAD X14, Y0, Y0 + VMOVDQU Y0, (DI)(BX*1) + ADDQ $32, BX + CMPQ BX, R9 + JLT outcoef8 + + ADDQ R9, DI + ADDQ $4, R11 + DECQ R12 + JNZ out8 + + VZEROUPPER + RET + +four: + MOVQ shift1+32(FP), CX + MOVQ CX, X14 + DECQ CX + MOVQ $1, R10 + SHLQ CL, R10 + MOVQ R10, X15 + VPBROADCASTD X15, X15 + + MOVQ SI, R10 + LEAQ 0(SP), R11 + MOVQ R8, R12 + +row4: + XORQ BX, BX + +coef4: + VPXOR X0, X0, X0 + MOVQ R10, AX + LEAQ (R14)(BX*1), DX + MOVQ R8, CX + +sum4: + VPBROADCASTD (AX), X1 + VMOVDQU (DX), X2 + VPMULLD X1, X2, X2 + VPADDD X2, X0, X0 + ADDQ $4, AX + ADDQ R9, DX + DECQ CX + JNZ sum4 + + VPADDD X15, X0, X0 + VPSRAD X14, X0, X0 + VMOVDQU X0, (R11)(BX*1) + ADDQ $16, BX + CMPQ BX, R9 + JLT coef4 + + ADDQ R9, R10 + ADDQ R9, R11 + DECQ R12 + JNZ row4 + + MOVQ shift2+40(FP), CX + MOVQ CX, X14 + DECQ CX + MOVQ $1, R10 + SHLQ CL, R10 + MOVQ R10, X15 + VPBROADCASTD X15, X15 + + LEAQ 0(SP), R10 + MOVQ R14, R11 + MOVQ R8, R12 + +out4: + XORQ BX, BX + +outcoef4: + VPXOR X0, X0, X0 + MOVQ R10, AX + MOVQ R11, DX + MOVQ R8, CX + +outsum4: + VMOVDQU (AX)(BX*1), X1 + VPBROADCASTD (DX), X2 + VPMULLD X1, X2, X2 + VPADDD X2, X0, X0 + ADDQ R9, AX + ADDQ R9, DX + DECQ CX + JNZ outsum4 + + VPADDD X15, X0, X0 + VPSRAD X14, X0, X0 + VMOVDQU X0, (DI)(BX*1) + ADDQ $16, BX + CMPQ BX, R9 + JLT outcoef4 + + ADDQ R9, DI + ADDQ $4, R11 + DECQ R12 + JNZ out4 + + VZEROUPPER + RET + +TEXT ·forwardTransform8AVX512(SB), $4096-48 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ m+16(FP), R14 + MOVQ n+24(FP), R8 + MOVQ R8, R9 + SHLQ $2, R9 + + MOVQ shift1+32(FP), CX + MOVQ CX, X14 + DECQ CX + MOVQ $1, R10 + SHLQ CL, R10 + MOVQ R10, X15 + VPBROADCASTD X15, Z15 + + MOVQ SI, R10 + LEAQ 0(SP), R11 + MOVQ R8, R12 + +row16: + XORQ BX, BX + +coef16: + VPXORD Z0, Z0, Z0 + MOVQ R10, AX + LEAQ (R14)(BX*1), DX + MOVQ R8, CX + +sum16: + VPBROADCASTD (AX), Z1 + VMOVDQU32 (DX), Z2 + VPMULLD Z1, Z2, Z2 + VPADDD Z2, Z0, Z0 + ADDQ $4, AX + ADDQ R9, DX + DECQ CX + JNZ sum16 + + VPADDD Z15, Z0, Z0 + VPSRAD X14, Z0, Z0 + VMOVDQU32 Z0, (R11)(BX*1) + ADDQ $64, BX + CMPQ BX, R9 + JLT coef16 + + ADDQ R9, R10 + ADDQ R9, R11 + DECQ R12 + JNZ row16 + + MOVQ shift2+40(FP), CX + MOVQ CX, X14 + DECQ CX + MOVQ $1, R10 + SHLQ CL, R10 + MOVQ R10, X15 + VPBROADCASTD X15, Z15 + + LEAQ 0(SP), R10 + MOVQ R14, R11 + MOVQ R8, R12 + +out16: + XORQ BX, BX + +outcoef16: + VPXORD Z0, Z0, Z0 + MOVQ R10, AX + MOVQ R11, DX + MOVQ R8, CX + +outsum16: + VMOVDQU32 (AX)(BX*1), Z1 + VPBROADCASTD (DX), Z2 + VPMULLD Z1, Z2, Z2 + VPADDD Z2, Z0, Z0 + ADDQ R9, AX + ADDQ R9, DX + DECQ CX + JNZ outsum16 + + VPADDD Z15, Z0, Z0 + VPSRAD X14, Z0, Z0 + VMOVDQU32 Z0, (DI)(BX*1) + ADDQ $64, BX + CMPQ BX, R9 + JLT outcoef16 + + ADDQ R9, DI + ADDQ $4, R11 + DECQ R12 + JNZ out16 + + VZEROUPPER + RET + +// func quantize8AVX2(dst, src *int32, count int, scale, offset int32, qbits int) +// +// The forward direction of 8.6.3. The magnitude is unsigned, which keeps the +// widening multiply exact over the whole int32 range. +TEXT ·quantize8AVX2(SB), NOSPLIT, $0-40 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ count+16(FP), CX + MOVL scale+24(FP), AX + MOVL offset+28(FP), DX + MOVQ qbits+32(FP), R8 + + VMOVD AX, X10 + VPBROADCASTD X10, Y10 + + MOVLQZX DX, DX + VMOVQ DX, X11 + VPBROADCASTQ X11, Y11 + + MOVL $0x7fff, AX + VMOVD AX, X12 + VPBROADCASTD X12, Y12 + + VMOVQ R8, X13 + + XORQ BX, BX + +loop: + VMOVDQU (SI)(BX*4), Y1 + VPABSD Y1, Y2 + + VPMULUDQ Y10, Y2, Y3 + VPSRLQ $32, Y2, Y4 + VPMULUDQ Y10, Y4, Y4 + + VPADDQ Y11, Y3, Y3 + VPADDQ Y11, Y4, Y4 + VPSRLQ X13, Y3, Y3 + VPSRLQ X13, Y4, Y4 + + VPSLLQ $32, Y4, Y4 + VPOR Y4, Y3, Y3 + + VPMINSD Y12, Y3, Y3 + VPSIGND Y1, Y3, Y3 + VMOVDQU Y3, (DI)(BX*4) + + ADDQ $8, BX + CMPQ BX, CX + JLT loop + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/transformenc_arm64.s b/third_party/h265/hevc/transformenc_arm64.s new file mode 100644 index 00000000..68542e2b --- /dev/null +++ b/third_party/h265/hevc/transformenc_arm64.s @@ -0,0 +1,170 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +#define MUL4S(Vd, Vn, Vm) WORD $(0x4ea09c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHL4S(Vd, Vn, Vm) WORD $(0x4ea04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) + +// func forwardTransform8NEON(dst, src, m *int32, n, shift1, shift2 int) +TEXT ·forwardTransform8NEON(SB), $4096-48 + MOVD dst+0(FP), R0 + MOVD src+8(FP), R1 + MOVD m+16(FP), R2 + MOVD n+24(FP), R3 + MOVD shift1+32(FP), R4 + + LSL $2, R3, R5 + + MOVD $1, R6 + SUB $1, R4, R7 + LSL R7, R6, R6 + VDUP R6, V3.S4 + NEG R4, R7 + VDUP R7, V4.S4 + + MOVD RSP, R10 + MOVD R3, R8 + +row: + MOVD $0, R11 + +rowcoef: + VMOVI $0, V0.B16 + MOVD R1, R12 + ADD R11, R2, R13 + MOVD R3, R14 + +rowsum: + MOVW (R12), R15 + VDUP R15, V1.S4 + VLD1 (R13), [V2.S4] + MUL4S(2, 2, 1) + VADD V2.S4, V0.S4, V0.S4 + ADD $4, R12 + ADD R5, R13 + SUB $1, R14 + CBNZ R14, rowsum + + VADD V3.S4, V0.S4, V0.S4 + SSHL4S(0, 0, 4) + ADD R11, R10, R15 + VST1 [V0.S4], (R15) + ADD $16, R11 + CMP R5, R11 + BLT rowcoef + + ADD R5, R1 + ADD R5, R10 + SUB $1, R8 + CBNZ R8, row + + MOVD shift2+40(FP), R4 + MOVD $1, R6 + SUB $1, R4, R7 + LSL R7, R6, R6 + VDUP R6, V3.S4 + NEG R4, R7 + VDUP R7, V4.S4 + + MOVD RSP, R10 + MOVD R2, R9 + MOVD R3, R8 + +out: + MOVD $0, R11 + +outcoef: + VMOVI $0, V0.B16 + ADD R11, R10, R12 + MOVD R9, R13 + MOVD R3, R14 + +outsum: + VLD1 (R12), [V1.S4] + MOVW (R13), R15 + VDUP R15, V2.S4 + MUL4S(1, 1, 2) + VADD V1.S4, V0.S4, V0.S4 + ADD R5, R12 + ADD R5, R13 + SUB $1, R14 + CBNZ R14, outsum + + VADD V3.S4, V0.S4, V0.S4 + SSHL4S(0, 0, 4) + ADD R11, R0, R15 + VST1 [V0.S4], (R15) + ADD $16, R11 + CMP R5, R11 + BLT outcoef + + ADD R5, R0 + ADD $4, R9 + SUB $1, R8 + CBNZ R8, out + + RET + +#define ABS4S(Vd, Vn) WORD $(0x4ea0b800 | ((Vn) << 5) | (Vd)) +#define UMULL2D(Vd, Vn, Vm) WORD $(0x2ea0c000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define UMULL2_2D(Vd, Vn, Vm) WORD $(0x6ea0c000 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define USHL2D(Vd, Vn, Vm) WORD $(0x6ee04400 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SMIN4S(Vd, Vn, Vm) WORD $(0x4ea06c00 | ((Vm) << 16) | ((Vn) << 5) | (Vd)) +#define SSHR31_4S(Vd, Vn) WORD $(0x4f210400 | ((Vn) << 5) | (Vd)) + +// func quantize8NEON(dst, src *int32, count int, scale, offset int32, qbits int) +// +// The forward direction of 8.6.3. The magnitude is unsigned, which keeps the +// widening multiply exact over the whole int32 range. +TEXT ·quantize8NEON(SB), NOSPLIT, $0-40 + MOVD dst+0(FP), R0 + MOVD src+8(FP), R1 + MOVD count+16(FP), R2 + MOVW scale+24(FP), R3 + MOVW offset+28(FP), R4 + MOVD qbits+32(FP), R5 + + VDUP R3, V20.S4 + + AND $0xffffffff, R4, R4 + VDUP R4, V21.D2 + + NEG R5, R6 + VDUP R6, V22.D2 + + MOVD $0x7fff, R7 + VDUP R7, V23.S4 + + MOVD $0, R8 + +loop: + VLD1 (R1), [V0.S4] + + ABS4S(1, 0) + + UMULL2D(2, 1, 20) + UMULL2_2D(3, 1, 20) + + VADD V21.D2, V2.D2, V2.D2 + VADD V21.D2, V3.D2, V3.D2 + + USHL2D(2, 2, 22) + USHL2D(3, 3, 22) + + VUZP1 V3.S4, V2.S4, V4.S4 + + SMIN4S(4, 4, 23) + + SSHR31_4S(5, 0) + VEOR V5.B16, V4.B16, V4.B16 + VSUB V5.S4, V4.S4, V4.S4 + + VST1 [V4.S4], (R0) + + ADD $16, R1 + ADD $16, R0 + ADD $4, R8 + CMP R2, R8 + BLT loop + + RET diff --git a/third_party/h265/hevc/transformenc_riscv64.s b/third_party/h265/hevc/transformenc_riscv64.s new file mode 100644 index 00000000..5de6a9ac --- /dev/null +++ b/third_party/h265/hevc/transformenc_riscv64.s @@ -0,0 +1,154 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func forwardTransform8RVV(dst, src, m *int32, n, shift1, shift2 int) +TEXT ·forwardTransform8RVV(SB), $4096-48 + MOV dst+0(FP), X10 + MOV src+8(FP), X11 + MOV m+16(FP), X12 + MOV n+24(FP), X13 + MOV shift1+32(FP), X14 + MOV shift2+40(FP), X15 + + ADD $8, SP, X16 + SLLI $2, X13, X17 + + MOV $1, X18 + ADD $-1, X14, X19 + SLL X19, X18, X18 + MOV $1, X19 + ADD $-1, X15, X20 + SLL X20, X19, X19 + + MOV X11, X20 + MOV X16, X21 + MOV X13, X22 + +rows: + MOV X13, X23 + MOV $0, X24 + +cols: + VSETVLI X23, E32, M1, TA, MA, X26 + VMVVI $0, V1 + + MOV X20, X28 + ADD X12, X24, X29 + MOV X13, X30 + +sum: + MOVW (X28), X31 + VLE32V (X29), V2 + VMACCVX V2, X31, V1 + ADD $4, X28 + ADD X17, X29 + ADD $-1, X30 + BNEZ X30, sum + + VADDVX X18, V1, V1 + VSRAVX X14, V1, V1 + ADD X21, X24, X28 + VSE32V V1, (X28) + + SLLI $2, X26, X29 + ADD X29, X24 + SUB X26, X23 + BNEZ X23, cols + + ADD X17, X20 + ADD X17, X21 + ADD $-1, X22 + BNEZ X22, rows + + MOV X13, X22 + MOV X10, X20 + MOV X12, X21 + +outrows: + MOV X13, X23 + MOV $0, X24 + +outcols: + VSETVLI X23, E32, M1, TA, MA, X26 + VMVVI $0, V1 + + ADD X16, X24, X28 + MOV X21, X29 + MOV X13, X30 + +outsum: + VLE32V (X28), V2 + MOVW (X29), X31 + VMACCVX V2, X31, V1 + ADD X17, X28 + ADD X17, X29 + ADD $-1, X30 + BNEZ X30, outsum + + VADDVX X19, V1, V1 + VSRAVX X15, V1, V1 + ADD X20, X24, X28 + VSE32V V1, (X28) + + SLLI $2, X26, X29 + ADD X29, X24 + SUB X26, X23 + BNEZ X23, outcols + + ADD X17, X20 + ADD $4, X21 + ADD $-1, X22 + BNEZ X22, outrows + + RET + +// func quantize8RVV(dst, src *int32, count int, scale, offset int32, qbits int) +// +// The forward direction of 8.6.3. The magnitude is unsigned, which keeps the +// widening multiply exact over the whole int32 range. +TEXT ·quantize8RVV(SB), NOSPLIT, $0-40 + MOV dst+0(FP), X10 + MOV src+8(FP), X11 + MOV count+16(FP), X12 + MOVW scale+24(FP), X13 + MOVW offset+28(FP), X14 + MOV qbits+32(FP), X15 + + SLLI $32, X14, X14 + SRLI $32, X14, X14 + + MOV $0x7fff, X16 + +loop: + VSETVLI X12, E32, M1, TA, MA, X17 + + VLE32V (X11), V1 + + VRSUBVX X0, V1, V2 + VMAXVV V1, V2, V2 + + VWMULUVX X13, V2, V4 + + VSETVLI X17, E64, M2, TA, MA, X0 + VADDVX X14, V4, V4 + VSRLVX X15, V4, V4 + + VSETVLI X17, E32, M1, TA, MA, X0 + VNSRLWI $0, V4, V6 + + VMINVX X16, V6, V6 + + VSRAVI $31, V1, V7 + VXORVV V7, V6, V6 + VSUBVV V7, V6, V6 + + VSE32V V6, (X10) + + SLLI $2, X17, X18 + ADD X18, X11 + ADD X18, X10 + SUB X17, X12 + BNEZ X12, loop + + RET diff --git a/third_party/h265/hevc/transpose_amd64.s b/third_party/h265/hevc/transpose_amd64.s new file mode 100644 index 00000000..634ce7c6 --- /dev/null +++ b/third_party/h265/hevc/transpose_amd64.s @@ -0,0 +1,101 @@ +//go:build amd64 && !noasm + +#include "textflag.h" + +// func transpose8AVX2(dst, src *int32, n int) +// +// Transposes an n by n block of int32 in eight by eight tiles, the usual +// unpack-then-cross-lane sequence. +TEXT ·transpose8AVX2(SB), NOSPLIT, $0-24 + MOVQ dst+0(FP), DI + MOVQ src+8(FP), SI + MOVQ n+16(FP), CX + + MOVQ CX, R8 + SHLQ $2, R8 + + XORQ R9, R9 + +yloop: + XORQ R10, R10 + +xloop: + MOVQ R9, AX + IMULQ R8, AX + LEAQ (SI)(AX*1), R11 + LEAQ (R11)(R10*4), R11 + + MOVQ R10, AX + IMULQ R8, AX + LEAQ (DI)(AX*1), R12 + LEAQ (R12)(R9*4), R12 + + VMOVDQU (R11), Y0 + ADDQ R8, R11 + VMOVDQU (R11), Y1 + ADDQ R8, R11 + VMOVDQU (R11), Y2 + ADDQ R8, R11 + VMOVDQU (R11), Y3 + ADDQ R8, R11 + VMOVDQU (R11), Y4 + ADDQ R8, R11 + VMOVDQU (R11), Y5 + ADDQ R8, R11 + VMOVDQU (R11), Y6 + ADDQ R8, R11 + VMOVDQU (R11), Y7 + + VPUNPCKLDQ Y1, Y0, Y8 + VPUNPCKHDQ Y1, Y0, Y9 + VPUNPCKLDQ Y3, Y2, Y10 + VPUNPCKHDQ Y3, Y2, Y11 + VPUNPCKLDQ Y5, Y4, Y12 + VPUNPCKHDQ Y5, Y4, Y13 + VPUNPCKLDQ Y7, Y6, Y14 + VPUNPCKHDQ Y7, Y6, Y15 + + VPUNPCKLQDQ Y10, Y8, Y0 + VPUNPCKHQDQ Y10, Y8, Y1 + VPUNPCKLQDQ Y11, Y9, Y2 + VPUNPCKHQDQ Y11, Y9, Y3 + VPUNPCKLQDQ Y14, Y12, Y4 + VPUNPCKHQDQ Y14, Y12, Y5 + VPUNPCKLQDQ Y15, Y13, Y6 + VPUNPCKHQDQ Y15, Y13, Y7 + + VPERM2I128 $0x20, Y4, Y0, Y8 + VPERM2I128 $0x20, Y5, Y1, Y9 + VPERM2I128 $0x20, Y6, Y2, Y10 + VPERM2I128 $0x20, Y7, Y3, Y11 + VPERM2I128 $0x31, Y4, Y0, Y12 + VPERM2I128 $0x31, Y5, Y1, Y13 + VPERM2I128 $0x31, Y6, Y2, Y14 + VPERM2I128 $0x31, Y7, Y3, Y15 + + VMOVDQU Y8, (R12) + ADDQ R8, R12 + VMOVDQU Y9, (R12) + ADDQ R8, R12 + VMOVDQU Y10, (R12) + ADDQ R8, R12 + VMOVDQU Y11, (R12) + ADDQ R8, R12 + VMOVDQU Y12, (R12) + ADDQ R8, R12 + VMOVDQU Y13, (R12) + ADDQ R8, R12 + VMOVDQU Y14, (R12) + ADDQ R8, R12 + VMOVDQU Y15, (R12) + + ADDQ $8, R10 + CMPQ R10, CX + JLT xloop + + ADDQ $8, R9 + CMPQ R9, CX + JLT yloop + + VZEROUPPER + RET diff --git a/third_party/h265/hevc/transpose_arm64.s b/third_party/h265/hevc/transpose_arm64.s new file mode 100644 index 00000000..d5e2cfb8 --- /dev/null +++ b/third_party/h265/hevc/transpose_arm64.s @@ -0,0 +1,64 @@ +//go:build arm64 && !noasm + +#include "textflag.h" + +// func transpose4NEON(dst, src *int32, n int) +// +// Transposes an n by n block of int32 in four by four tiles, the interleave +// twice at element width then at pair width. +TEXT ·transpose4NEON(SB), NOSPLIT, $0-24 + MOVD dst+0(FP), R0 + MOVD src+8(FP), R1 + MOVD n+16(FP), R2 + + LSL $2, R2, R3 + + MOVD $0, R4 + +yloop: + MOVD $0, R5 + +xloop: + MUL R3, R4, R6 + ADD R1, R6 + ADD R5<<2, R6, R6 + + MUL R3, R5, R7 + ADD R0, R7 + ADD R4<<2, R7, R7 + + VLD1 (R6), [V0.S4] + ADD R3, R6 + VLD1 (R6), [V1.S4] + ADD R3, R6 + VLD1 (R6), [V2.S4] + ADD R3, R6 + VLD1 (R6), [V3.S4] + + VTRN1 V1.S4, V0.S4, V4.S4 + VTRN2 V1.S4, V0.S4, V5.S4 + VTRN1 V3.S4, V2.S4, V6.S4 + VTRN2 V3.S4, V2.S4, V7.S4 + + VTRN1 V6.D2, V4.D2, V8.D2 + VTRN1 V7.D2, V5.D2, V9.D2 + VTRN2 V6.D2, V4.D2, V10.D2 + VTRN2 V7.D2, V5.D2, V11.D2 + + VST1 [V8.S4], (R7) + ADD R3, R7 + VST1 [V9.S4], (R7) + ADD R3, R7 + VST1 [V10.S4], (R7) + ADD R3, R7 + VST1 [V11.S4], (R7) + + ADD $4, R5 + CMP R2, R5 + BLT xloop + + ADD $4, R4 + CMP R2, R4 + BLT yloop + + RET diff --git a/third_party/h265/hevc/transpose_riscv64.s b/third_party/h265/hevc/transpose_riscv64.s new file mode 100644 index 00000000..975b7617 --- /dev/null +++ b/third_party/h265/hevc/transpose_riscv64.s @@ -0,0 +1,42 @@ +//go:build riscv64 && riscv64.rva23u64 && !noasm + +#include "textflag.h" + +// func transposeRVV(dst, src *int32, n int) +// +// Transposes an n by n block of int32. A row is read contiguously and written +// with the strided store, so no shuffle network is needed. +TEXT ·transposeRVV(SB), NOSPLIT, $0-24 + MOV dst+0(FP), X10 + MOV src+8(FP), X11 + MOV n+16(FP), X12 + + SLLI $2, X12, X13 + + MOV X12, X14 + MOV X10, X15 + +rows: + MOV X12, X16 + MOV X11, X17 + MOV X15, X18 + +cols: + VSETVLI X16, E32, M1, TA, MA, X19 + + VLE32V (X17), V1 + VSSE32V V1, X13, (X18) + + SLLI $2, X19, X20 + ADD X20, X17 + MUL X13, X19, X20 + ADD X20, X18 + SUB X19, X16 + BNEZ X16, cols + + ADD X13, X11 + ADD $4, X15 + ADD $-1, X14 + BNEZ X14, rows + + RET diff --git a/third_party/h265/hevc/wavefront.go b/third_party/h265/hevc/wavefront.go new file mode 100644 index 00000000..5802b79e --- /dev/null +++ b/third_party/h265/hevc/wavefront.go @@ -0,0 +1,281 @@ +package hevc + +import ( + "runtime" + "sync" +) + +// Threads bounds the goroutines decoding one picture's wavefront rows. Zero +// means GOMAXPROCS, one decodes serially. It is read once per slice segment, +// so changing it mid-stream takes effect at the next one. +func (d *Decoder) Threads(n int) { d.threads = n } + +func (d *Decoder) waveThreads() int { + if d.threads == 0 { + return runtime.GOMAXPROCS(0) + } + + return max(d.threads, 1) +} + +// waveWorkers reports how many goroutines 7.3.8.1 may be spread over. The +// wavefront path takes whole rows of one tile, so anything else — tiles, a +// segment starting mid-row, a single row — stays on the serial loop. +func (d *ctuDecoder) waveWorkers(sh *sliceHeader, starts []int, wpp bool) int { + w := int(d.s.picWidthInCtbs) + + // 9.3.1 hands a row the state of the block above-right, which a picture one + // block wide does not have: every row initialises instead, and each one + // needs the whole row above reconstructed before it starts. + if !wpp || d.p.tilesEnabled || len(starts) < 2 || w < 2 { + return 1 + } + + // A dependent segment carries the contexts the previous one ended with, + // and persistent Rice adaptation carries a running state; neither is + // exercised by anything here, so both stay on the serial loop. + if d.p.dependentSliceSegmentsEnabled || d.s.persistentRiceAdaptation { + return 1 + } + + if int(sh.sliceSegmentAddress)%w != 0 { + return 1 + } + + if int(sh.sliceSegmentAddress)/w+len(starts) > int(d.s.picHeightInCtbs) { + return 1 + } + + return min(d.threads, len(starts)) +} + +// wave is the row progress a wavefront synchronises on. done[k] counts the +// coding tree blocks of row k that are reconstructed, and ctx[k] is the +// context state 9.3.1 hands to the row below, valid once done[k] reaches two. +type wave struct { + mu sync.Mutex + cond *sync.Cond + done []int + ctx [][nContexts]uint8 + err error + bad bool +} + +func newWave(rows, first int) *wave { + v := &wave{ + done: make([]int, rows), + ctx: make([][nContexts]uint8, rows), + } + + v.cond = sync.NewCond(&v.mu) + v.done[0] = first + + return v +} + +// await blocks until row k has reconstructed n blocks, reporting false when +// another row has already failed and there is nothing left to wait for. +func (v *wave) await(k, n int) bool { + v.mu.Lock() + defer v.mu.Unlock() + + for v.done[k] < n && !v.bad { + v.cond.Wait() + } + + return !v.bad +} + +func (v *wave) advance(k, n int) { + v.mu.Lock() + v.done[k] = n + v.mu.Unlock() + + v.cond.Broadcast() +} + +// saveCtx publishes the state of 9.3.1 together with the progress that makes +// it readable, so a waiting row never sees one without the other. +func (v *wave) saveCtx(k int, state [nContexts]uint8, n int) { + v.mu.Lock() + v.ctx[k] = state + v.done[k] = n + v.mu.Unlock() + + v.cond.Broadcast() +} + +func (v *wave) fail(err error) { + v.mu.Lock() + + if v.err == nil { + v.err = err + } + + v.bad = true + v.mu.Unlock() + + v.cond.Broadcast() +} + +func (v *wave) failed() bool { + v.mu.Lock() + defer v.mu.Unlock() + + return v.bad +} + +// decodeWavefront is 7.3.8.1 with the rows of the segment decoded at once. +// Each row runs on its own copy of the block decoder: the tables indexed by +// position are slices and stay shared, while the scratch and the arithmetic +// decoder are values and come out per row. +func (d *ctuDecoder) decodeWavefront(nal NALUnit, sh *sliceHeader, starts []int, + cur int32, workers int, +) error { + w := int(d.s.picWidthInCtbs) + rows := len(starts) + first := int(sh.sliceSegmentAddress) / w + + v := newWave(rows, 0) + + var wg sync.WaitGroup + + for id := range workers { + wg.Add(1) + + go func() { + defer wg.Done() + + r := *d + + for k := id; k < rows; k += workers { + if v.failed() { + return + } + + if err := r.decodeWaveRow(nal, sh, starts, v, k, first+k, cur); err != nil { + v.fail(err) + + return + } + } + }() + } + + wg.Wait() + + if v.err != nil { + return v.err + } + + if rows > 1 { + d.saved = v.ctx[rows-1] + d.hasSaved = true + } + + return nil +} + +// decodeWaveRow decodes one coding tree block row of the segment. +func (d *ctuDecoder) decodeWaveRow(nal NALUnit, sh *sliceHeader, starts []int, v *wave, + k, row int, cur int32, +) error { + w := int(d.s.picWidthInCtbs) + + if err := d.startSubstream(nal, sh, starts, k, k == 0); err != nil { + return err + } + + if k > 0 { + // The row above has to reach its second block before this one can + // start, which is both the context handoff and the samples 6.4.1 needs. + if !v.await(k-1, 2) { + return nil + } + + top := row*w - w + 1 + if top >= d.sliceAddrRs { + d.c.state = v.ctx[k-1] + } else { + d.c.initContexts(sh.qpY, sh.sliceType, sh.cabacInit) + } + } + + d.qpYPrev = sh.qpY + d.qpYCur = sh.qpY + + for col := range w { + if k > 0 && !v.await(k-1, min(col+2, w)) { + return nil + } + + rs := row*w + col + + d.ctbSliceAddr[rs] = int32(d.sliceAddrRs) + d.ctbSlice[rs] = cur + + if err := d.codingTreeUnit(col< 0 { + if !v.await(k-1, min(2, cols)) { + return nil, nil + } + + e.cabac.state = v.ctx[k-1] + } + + for x := range cols { + if k > 0 && !v.await(k-1, min(x+2, cols)) { + return nil, nil + } + + e.writeSAO(&e.cabac, k*cols+x, cols) + + if err := e.tree(x*64, k*64, 6, 0); err != nil { + return nil, err + } + + last := k == rows-1 && x == cols-1 + e.cabac.encodeTerminate(boolToBit(last)) + + if x == min(1, cols-1) { + v.saveCtx(k, e.cabac.state, x+1) + } else { + v.advance(k, x+1) + } + + if !last && x == cols-1 { + e.cabac.encodeTerminate(1) + } + } + + return e.cabac.bytes(), nil +} diff --git a/todos.md b/todos.md index ae85c6bb..3843d1ae 100644 --- a/todos.md +++ b/todos.md @@ -8,10 +8,9 @@ All four safeguards are implemented: bounded ICO selection, SVG expansion limits enforced WASM AVIF selection, and GIF memory accounting. Full `make verify` and both Windows internal-package cross-builds pass. Hosted review, finding dispositions and final CI/Qodana/CodeQL evidence are tracked in -[PR #27](https://github.com/frathe/picfetch/pull/27). The live GoLand build-tag -refresh and re-inspection remain pending; the committed Qodana configuration -passed hosted analysis. Reload/apply the local `no_emoji nodynamic` module tags -and inspect the imaging import again before closing this remaining local task. +[PR #27](https://github.com/frathe/picfetch/pull/27). The local `no_emoji nodynamic` module tags were applied in GoLand on +2026-09-16 and the imaging loader re-inspects clear; the committed Qodana +configuration passed hosted analysis. Compatibility limits and evidence: [implementation plan](finished_refactorings/2026-09-15-image-input-hardening.md). @@ -100,12 +99,50 @@ blocked-writer timeout and diagnostic tests. Ronin accepted the absent hard tota native-memory cap on macOS; WASM/IPC/deadline/sandbox protections remain mandatory. The compiler needs a helper-only executable-memory entitlement; the interpreter timed out on an ordinary 12-megapixel fixture under the same deadline. -Production decoding remains disabled pending shared app/analysis admission, -canonical imaging integration, Linux/Windows enforcement, final packaging and -compatibility checks. The updated source instructions also require retaining or -verifying equivalence of the historical maintained h265 patches before selecting -the shipped source. Native Intel and full packaged qualification remain open. See +Production decoding remains disabled pending native Linux/Windows/Intel +qualification, distribution-package verification and representative camera +compatibility checks. The historical maintained h265 production copy is restored +with exact baseline/replacement guards; its native qualification is in progress. +Intel passed sandbox/small-image checks but the 12MP compiler fixture reached +the initial 30-second deadline. A documented finite 60-second candidate retains +all other bounds; fresh native timing and full packaged qualification remain open. See [qualification evidence](docs/heic/qualification.md). +The Linux no-cgo amd64/arm64 candidate now cross-builds with a synchronized +default-deny runtime policy and verified-before-input address-space controls. +Its native guard matrix is wired; actual Linux execution remains pending CI. +Windows now has suspended AppContainer creation, explicit stdio handles and +Job Object process/commit-memory/CPU/kill-on-close restrictions. The child +verifies token/job state before readiness. AMD64/ARM64 cross-builds and Windows +vet pass; native controls and ordinary fixtures await `heic-windows` CI. +Dedicated helper permissions and MSIX packaging remain qualification gates. +Package staging now records fixed helper paths, post-signing hashes and exact +notices. The complete macOS app and nested helper pass strict signature checks. +The updater now preserves authenticated companion files and rollback; native +macOS controls verify the complete signed bundle after install and rollback. +The released updater still omits the first helper-bearing package and deletes +its cache, leaving a macOS signature mismatch. That initial transition requires +a complete package reinstall or separately qualified bridge before release. +Windows Authenticode/MSIX execution and native CI remain unverified. +The complete implementation checkpoint and its remaining qualification gates +are tracked in draft PR #28. The earlier P0-only signing attempt failed without +publishing; the current checkpoint includes the subsequent integration work. +The shared client lane and bounded pipe service are implemented with fair +foreground/background admission, grant-before-read, framed canonical output +and joined cancellation. Inherited analysis pipe components pass native macOS +subprocess tests; Windows native execution remains pending. The canonical +imaging Reader/Source now passes admission, metadata, pixel-fidelity and ordinary +format regressions. Application ownership and GUI/analysis consumer injection +are implemented with joined shutdown. Native activation and compatibility +qualification remain open; construction currently supplies no HEIC owner. +Additional [ordinary compatibility checks](docs/heic/compatibility-2026-09-16.md) +cover real-helper synthetic metadata/orientation, alpha and a known ten-bit +ramp. One hash-verified public-domain Samsung S23 Ultra photograph decodes in +20.414 seconds with correct upright dimensions and metadata. Its P3 pixels +differ from color-managed ImageIO; broader camera and faithful color claims +remain unqualified. Faithful ICC/wide-gamut/PQ/HLG/gain-map display is not implemented: +the decoder leaves source-space RGB and the guest drops the color description. +These color classes are not deliberately rejected. This is a support boundary, +not a claim that more test fixtures would establish HDR/color management. The [independent alternatives](docs/image-codec-alternatives-2026-09-15.md#heic-alternatives) include libheif/libde265 with LGPL distribution work and hpvcd with unresolved From 30f5b1038c84d28576027cd4efc2f8c5f852ae45 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 08:28:41 +0200 Subject: [PATCH 05/30] Reconcile useful HEIC hardening and threat-model omissions --- .gitignore | 1 + AGENTS.md | 2 + ARCHITECTURE.md | 8 + Makefile | 3 +- THREAT-MODEL.md | 330 ++++++++++++++++++ docs/heic/history-reconciliation.md | 129 +++++++ docs/heic/qualification.md | 19 +- internal/heicdecode/worker/runtime.go | 15 +- internal/heicdecode/worker/runtime_test.go | 50 ++- plans/2026-09-15-isolated-heic-restoration.md | 45 +++ qodana.yaml | 1 + scripts/heicbuild/guest_test.go | 29 +- scripts/heicbuild/testdata/README.md | 24 ++ scripts/heicbuild/testdata/chroma422.heic | Bin 0 -> 22466 bytes scripts/heicbuild/testdata/chroma444.heic | Bin 0 -> 21527 bytes scripts/heicbuild/testdata/lossless.heic | Bin 0 -> 37654 bytes scripts/heicbuild/testdata/thumb.heic | Bin 0 -> 20337 bytes scripts/heicguest/decoder.json | 6 +- scripts/qodanaconfig/main.go | 25 ++ scripts/qodanaconfig/main_test.go | 22 ++ todos.md | 93 +++-- 21 files changed, 721 insertions(+), 81 deletions(-) create mode 100644 THREAT-MODEL.md create mode 100644 docs/heic/history-reconciliation.md create mode 100644 scripts/heicbuild/testdata/chroma422.heic create mode 100644 scripts/heicbuild/testdata/chroma444.heic create mode 100644 scripts/heicbuild/testdata/lossless.heic create mode 100644 scripts/heicbuild/testdata/thumb.heic create mode 100644 scripts/qodanaconfig/main.go create mode 100644 scripts/qodanaconfig/main_test.go diff --git a/.gitignore b/.gitignore index b780eae0..f8c4ed17 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ bin/ coverage/ .DS_Store fyne-cross/ +/fyne_metadata_init.go internal/ui/testdata/failed/ .idea .vscode diff --git a/AGENTS.md b/AGENTS.md index 8bd9c5cb..a8842101 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -110,6 +110,8 @@ precedence over its default handoff procedure. - Use `internal/uitest` for synthetic image formats, temp URIs, approximate comparisons, and OS seam stubs. UI tests should build through `newTestUI`/`newTestViewer`, which mirror production startup. - `CanvasObject.Visible()` is the object's own hidden flag, not a statement about the tree it is in: a widget that was built and then left out of its container still reports `true`. A test that asserts only `Visible()` therefore passes on a widget that never reaches the screen. When the fact under test is "this is *in* the surface", walk the container from its root — see `infoview`'s `inCard` in `card_test.go`. `Visible()` alone is enough only for a widget already known to be in the tree whose show/hide is what moves. - Keep platform-specific behavior in existing build-tag pairs and preserve no-cgo AVIF decoding through `gen2brain` WASM; Fyne itself still requires a C/OpenGL toolchain. +- **HEIC source changes:** Read [the maintained-source record](third_party/h265/PICFETCH.md) before changing the decoder or its build. Preserve local hardening until equivalent upstream checks are verified. HEIC parsing belongs only in the separate WASI guest; keep the native import guard and fail-closed application boundary. `make test-h265` covers ordinary WASI fixtures, not the historical full decoder suite. +- **Security-boundary changes:** Reconcile [THREAT-MODEL.md](THREAT-MODEL.md) when parser ownership, worker permissions, memory limits, sensitive persistence or update authority changes; distinguish implemented controls from platform qualification. ## Build and Verification diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 91a0b5a8..758a0eaf 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -4,6 +4,8 @@ Navigation map for AI agents. PicFetch is a Fyne desktop image viewer: one binary, split into `internal/...` packages. Start here to find a file. Standing rules (data flow, concurrency, conventions, build) live in `AGENTS.md` — do not duplicate them here. +`THREAT-MODEL.md` maps application assets, trust boundaries and residual risks; +HEIC execution and distribution evidence lives in `docs/heic/qualification.md`. ## Package map @@ -47,6 +49,12 @@ the raw events outside the repository; the generated assignment lives at | `docker-race.sh` | Public Make runner: unique host artifact directory, attached Docker lifecycle, raw streams and console retention, exit/memory/OOM diagnostics before cleanup. | | `main_test.go` | Command-boundary fixtures for event streams and capture, deterministic planning, every manifest rejection, build-selected runnable forms, parallel-call refusal, exact filter generation, package partitioning, and Make contract expansion. | +### `scripts/qodanaconfig` + +Validates the root Qodana YAML mapping before Make's exact test-path inventory +check. `main_test.go` covers malformed mappings, commented parents and duplicate +keys; text path matching alone cannot establish YAML validity. + ### `internal/similarity` Local content analysis shared by the viewer and its reproducible experiment. diff --git a/Makefile b/Makefile index 32f31fba..31318694 100644 --- a/Makefile +++ b/Makefile @@ -194,7 +194,8 @@ sync-qodana-test-exclusions: ## Synchronize Qodana's duplication exclusions with fi; \ $(MAKE) --no-print-directory check-qodana-test-exclusions -check-qodana-test-exclusions: ## Fail if qodana.yaml does not exclude every *_test.go from duplication checks +check-qodana-test-exclusions: ## Validate Qodana YAML and require every *_test.go duplication exclusion + go run ./scripts/qodanaconfig @set -eu; \ listed=$$(mktemp); \ test_files=$$(mktemp); \ diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md new file mode 100644 index 00000000..ebc8fdbd --- /dev/null +++ b/THREAT-MODEL.md @@ -0,0 +1,330 @@ +# PicFetch threat model + +**Updated:** 2026-09-16 + +**Source baseline:** PR #28 at commit +52ed2dfb2500d8a6b8b0895e0cba353c934915e0, with the history-reconciliation changes +in this PR. This adapts the historical model from 73cb3c9 and its fc127b44 +implementation baseline; it does not import the old worker implementation. + +This model records assets, trust boundaries, implemented controls and residual +risks. It is a static source/documentation assessment, not an exhaustive audit +or verification of every installed binary. Risk categories are not confirmed +vulnerability findings. [ARCHITECTURE.md](ARCHITECTURE.md) is the package map; +[HEIC qualification](docs/heic/qualification.md) records runtime evidence and +[history reconciliation](docs/heic/history-reconciliation.md) records carryover. + +**Production HEIC viewing remains disabled on every platform.** The candidate +has an isolated WASI helper and shared application/analysis admission, but +native Windows, final distribution, compatibility and upgrade qualification +remain incomplete. Test or CI results for one platform do not qualify another. +The accepted macOS design lacks a hard total native-memory cap; memory pressure +and application/system crashes remain possible. Capability isolation and finite +WASM/input/output/job/time limits remain mandatory. + +## 1. Application and assets + +PicFetch is a Go/Fyne desktop image viewer. Files arrive through command-line +paths, drag-and-drop, native pickers and macOS Open With events. Opening a file +can also discover sibling images; folder opening can recursively scan a tree. +Production supports common raster formats, SVG, AVIF and embedded JPEG +previews from camera RAW containers. HEIC/HEIF is a disabled candidate. PicFetch +also handles EXIF metadata, save/export, clipboard, Trash, wallpaper, favorites, +mosaics and session paths. + +Optional features add network and native-code dependencies: Similarity Explorer +installs model/runtime assets and analyzes locally in a subprocess; EXIF maps +fetch tiles; standalone builds offer GitHub updates. Microsoft Store builds use +their separate distribution policy. PicFetch has no account system, listening +application server or privileged daemon. Desktop input and optional outbound +traffic, rather than web sessions or server-side roles, define this model. + +Assets to protect include: + +- Images, GPS and other metadata, paths, previews and similarity representations. +- Original files and user-selected destinations during writes and deletion. +- Application integrity, installed native libraries and release provenance. +- Desktop and host availability, including memory, CPU and storage. +- Release, signing and Store credentials and the authority to distribute updates. + +## 2. Attacker capabilities and trust assumptions + +**Untrusted content:** an attacker can supply image/container bytes, filenames, +metadata, dimensions, animation data and SVG structure through a download, +message, removable device or shared folder. Opening or previewing a file does +not make its internals trusted. A writable shared tree can contain symlinks and +can change while PicFetch reads or mutates it. Network services and their +responses are inputs too, subject to HTTPS and feature-specific integrity checks. + +**Local configuration:** selected paths, preferences, environment variables, +`PATH`, proxy/CA configuration and asset overrides are normally controlled by +the operator. Installed OS helpers and their output are part of the local trust +base. These assumptions can change when launch configuration or directories are +shared with a less-trusted party. App-local state should be protected by suitable +OS directory permissions; PicFetch does not encrypt it as a separate boundary. + +**Process authority:** normal operation assumes PicFetch is not elevated. Each +process has the authority actually granted by its OS account, access controls, +entitlements, sandbox and privacy permissions. Two processes with the same user +ID need not have identical access: macOS TCC/App Sandbox and Windows application +write controls can matter. A same-user prerequisite does not by itself dismiss +a defect that lets PicFetch act with authority the attacker lacks. + +**User intent:** opening content authorizes reading for viewing, not arbitrary +file mutation or disclosure. Save, export, metadata removal, Trash and wallpaper +actions must respect the user's selected operation and target. Confirmation is +an interaction boundary, not proof that all affected paths are safe. + +**Supply chain:** the OS, Go/runtime implementations, shipped dependencies, +checksum pins and update trust roots are trusted components. Maintainers control +source, build tags, embedded assets and workflows. Repository permissions, +release accounts, signing services and protected environments are separate +operational boundaries. Integrity verification against a trusted pin establishes +which bytes were obtained; it does not prove those bytes are free of defects. + +## 3. Content parsing and resource use + +Most image work runs inside the GUI process. Decoder code executes with its +host process's effective privileges. A memory-safety defect that enables +arbitrary code execution could expose that authority; an ordinary panic or +out-of-memory failure primarily affects availability and does not itself prove +code execution or arbitrary filesystem access. Go memory safety, third-party +native code, runtime trust, resource limits and OS confinement are distinct +parts of the assessment. + +The canonical [loader](internal/imaging/loader.go) defaults to a **512 MiB +encoded-file limit**, configurable in settings, and checks probed raster +dimensions against **200 million pixels**. [GIF handling](internal/imaging/gif.go) +bounds animation storage and frame count before full animation decode. +[SVG handling](internal/imaging/vector.go) and +[raster sizing](internal/imaging/svg.go) include encoded-source, XML-depth, +expansion-work and rasterization limits, plus recovery around rasterizer panics. +ICO admission validates the selected +directory entry and embedded dimensions. AVIF build guards require its WASM +implementation. These are scoped controls, not a claim +that all parser paths recover panics or all intermediate allocations are bounded. + +Large accepted images, concurrent operations and decoder/runtime overhead can +still exhaust resources. A header check is not a bound on every operation needed +to read that header; many in-process decoder calls cannot be interrupted in +place. Image-cache budgets are not process-wide memory quotas. No universal CPU +or total-memory bound is established here. Codec/runtime selection must also be +checked for the actual build; this model does not claim every format runs in WASM. + +### Candidate HEIC helper boundary + +The [image reader](internal/imaging/source.go) performs bounded leading-brand +recognition and routes HEIC to an explicitly injected shared client. The default +reader refuses it. HEIC configuration, pixels and Exif parsing run in a fixed +WASI guest inside a dedicated, disposable [helper](cmd/picfetch-heic-worker/main.go). +The guest is built from the exact maintained h265 production source; image bytes +are data, not executable modules. No native codec is imported into the viewer. +HEIC refusal does not trigger parent metadata parsing or RAW/JPEG fallback. + +The [runtime](internal/heicdecode/worker/runtime.go) supplies bounded standard +streams without guest filesystem mounts, environment, clock, randomness or +sockets. It caps WASM linear memory at **1 GiB** and reserves the capped backing +store once to avoid transient old/new buffers on growth. This does not cap the +native Go/wazero process or parent/cached pixel storage. The native Go memory +target remains soft. + +[Limits](internal/heicdecode/limits.go) permit at most **64 MiB encoded input**, +**64 million pixels**, **256,000,000 output bytes**, **64 KiB normalized metadata**, +**4096 diagnostic bytes**, and **60 seconds** per request, including admission. +The output cap admits at most 32 million NRGBA64 pixels. One shared lane covers +the app and its analysis descendants; bounded queues prioritize interactive work +without indefinitely starving background requests. Bulk reads wait for admission +and helper readiness. Cancellation retires the process and pipes before releasing +the lane. Validated pixels and metadata cross back through the codec-free +[protocol](internal/heicdecode/protocol.go); helper identity is pinned to the +trusted installed package. Hashes are not an independent package signature. + +| Platform | Candidate native helper boundary | +| --- | --- | +| Linux x64/ARM64 | Thread-synchronized default-deny seccomp, resource limits and a 2 GiB address-space ceiling before input. This is not a physical-RAM/cgroup limit. | +| Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native qualification still fails and activation is blocked. | +| macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | + +Actual platform controls are verified before helper readiness; unsupported or +failed setup refuses input. OS controls and WASI restrictions protect different +boundaries. A decoder failure, runtime compromise and OS sandbox escape are +separate events. The fixed module, Go, wazero and kernel are trusted components; +containment is not proof of absence of defects. See the qualification record for +native execution evidence, executable-memory tradeoff and incomplete package +checks. A stricter memory reservation may refuse a job when native headroom is +insufficient; raising limits or dropping isolation is not a fallback. + +Container transforms run in the guest. ICC/wide-gamut/HDR presentation is not +implemented: some such files can decode into untagged pixels rather than being +rejected. Successful decode and 16-bit transport do not establish color fidelity. +These HEIC controls do not isolate other codecs, rendering, or native ONNX work. + +## 4. Filesystem discovery and mutation + +[Folder scanning](internal/filescan/filescan.go) resolves symlinks for cycle +detection and deduplication, supports cancellation and defaults to **200,000 +results**. It does not confine discovery beneath the originally selected folder: +a symlink can lead to other accessible files. A selected tree is not a stable +snapshot, especially on shared storage. + +[Save/export/metadata writes](internal/imaging/save.go) use temporary files, +file synchronization and rename replacement, coordinated by +[in-process path transactions](internal/imaging/mutations.go). Save-through-link +intentionally follows the target; export resolves parent links and refuses an +existing symlink leaf. These controls reduce partial writes and conflicts among +PicFetch operations; they do not lock out another process changing the filesystem. +[Deletion](internal/ui/deletion/deletion.go) uses an OS Trash operation after a +confirmation that defaults to Cancel. Recoverability depends on the OS/storage. + +OS integration adapters handle paths through platform-specific argument, URI or +data transport. Their correctness and the trustworthiness of installed helpers +remain part of the boundary; a filename is not authorization for a command. +Assess any unintended access or mutation by its actual target, user consent and +authority crossed, including shared-folder and application-specific permissions. + +## 5. Similarity analysis, assets and caches + +[Similarity Explorer](internal/similarity/client.go) sends source paths and +requests over local pipes to its own analysis subprocess. It uses native ONNX +Runtime, checks source versions and verifies pinned assets before loading. +Native inference requires cgo; the no-cgo implementation reports it unavailable. +HEIC requests from analysis use explicit inherited pipes to the same +application-owned HEIC admission lane; analysis workers cannot choose a helper +executable or start an independent lane. The analysis process itself retains +separate privileges and is not a general sandbox for other image codecs. + +| Platform | Analysis-worker network control | +| --- | --- | +| Linux x64/ARM64 | Worker installs a thread-synchronized seccomp network-denial policy; setup failure stops startup. | +| macOS | Worker launches under a `sandbox-exec` network-denial profile. | +| Windows | Ordinary subprocess; no OS network isolation is configured. | + +[Runtime checks](internal/similarity/offline.go) require actual TCP/UDP denial +before analysis on macOS/Linux; merely being disconnected does not satisfy them. +These network policies do not establish comprehensive filesystem confinement. +The worker retains filesystem access subject to its effective OS permissions; +Windows also permits networking. The [encoder](internal/similarity/encoder.go) +requests the telemetry opt-out before library loading and requires the runtime +API opt-out to succeed before session creation. This is not proof that every +dependency or build can never communicate. + +[Asset installation](internal/similarity/assets_install.go) requires a user +download action, uses pinned sources, checks expected sizes and SHA-256, restricts +HTTPS redirects to listed provider domains, and extracts named runtime members +into staging before publication. Analysis itself does not start downloads. +Store builds use verified bundled runtime DLLs and download model data; model +cache overrides cannot replace the bundled runtime. These checks still trust +the selected upstream model/runtime and the shipped pins. + +Worker events cross back into the parent and are part of its input-validation +boundary. [Cache records](internal/similarity/cache_payload.go) have size, +version, vector and preview checks, but cached paths, image facts, previews and +representations remain sensitive local data. Hash-based filenames do not +anonymize those contents. Filesystem protection and user-selected persistence +matter independently of cache integrity checks. + +## 6. Network and privacy + +Normal viewing and similarity analysis do not intentionally upload images or +representations. Optional downloads, update checks and maps do generate outbound +traffic and disclose ordinary connection information. This local-processing +design is not a guarantee against disclosure following a compromised component. + +The [EXIF map](internal/ui/exifwin/exifwin.go) starts collapsed in a fresh window. +Expansion requests tiles for the image's location; while expanded it follows +navigation to subsequent GPS images. The configured +[tile origin](internal/ui/exifwin/tiles.go) is OpenStreetMap. Requests include +tile coordinates and a PicFetch user agent, not the source image, but the tile +area can reveal sensitive location information alongside the client's network +address. A configured origin alone is not a guarantee about redirect recipients. +The fetcher limits concurrency, response bytes and cache storage and uses +timeouts; these limits are not a total decode-memory guarantee. + +Favorites, sessions, thumbnails, presets and analysis caches are unencrypted +local state. Their exposure depends on directory permissions, backups, storage +sharing and the authority of other processes. Metadata removal/omission is +privacy-sensitive: failure to honor the selected export or removal behavior can +expose location or identity when a user shares the result. GPS disclosure can +have serious consequences even when only one image is affected. + +## 7. Updates and release supply chain + +Standalone builds support manual update checks and optional automatic checks, +which default off. Disabling checks does not discard an already completed stage +scheduled for installation at shutdown. [Store builds](internal/distribution/distribution_store.go) +disable the GitHub update channel. + +[Fresh downloads](internal/update/download.go) have a **200 MiB archive-download +cap** and require successful Sigstore release-attestation verification before +extraction, independently of an optional GitHub API digest. The +[verification policy](internal/update/attest.go) binds the archive digest, asset +name, repository, tag and package URL to the expected GitHub release-service +identity, using TUF trust and a signed timestamp. This authenticates the release +artifact; it does not establish that its source was reviewed or its behavior is +safe. [Extraction](internal/update/extract.go) rejects nonlocal paths and archive +links. The download cap is not an aggregate expanded-size quota. + +Persisted staging stores provenance fields and the full extracted companion-file +inventory locally. Reuse/apply checks helper and manifest identity, rejects +missing/changed/unexpected companion files and validates the platform; +it relies on trusted local staging state rather than cryptographically sealed +metadata. Any claimed abuse must establish the attacker's existing permissions, +PicFetch's destination authority and the boundary actually crossed. + +The candidate updater installs Linux/Windows helper files with executable +replacement and rollback, and replaces the entire signed macOS app bundle. +The currently released updater cannot perform the first helper-bearing upgrade: +it drops the helper and deletes staging, invalidating the enclosing macOS +signature. The first transition needs a complete reinstall or a separately +qualified bridge. New updater tests do not fix an already installed old updater. + +The [release workflow](.github/workflows/release.yml) configures CI gates, +Windows signing/verification and release publication dependencies. +[Signing documentation](docs/release-signing.md) describes required environment +protection and credential handling. Configuration does not prove that live +environment approvals are enabled, a particular CI run passed, or a downloaded +artifact is correctly signed. macOS packaging verifies ad-hoc bundle/helper +signatures; that does not establish Developer ID/notarization or App Store +qualification. Manual-download and Store distribution have their own +provenance/installation paths; the in-app updater's +checks must not be attributed to every installation method. + +Compromise of trusted source, dependencies, workflows, signing accounts or +release services can affect many installations. Signatures and checksums do +not make a malicious authorized release safe. Operational release qualification +must be tied to the actual tag, build and distributed artifacts. + +## 8. Severity guidance + +These are project triage starting points, not automatic or universal ratings. +Use demonstrated impact, exploitability, user interaction, persistence, +recoverability, data sensitivity and the real permission boundary. Distinguish +a confirmed defect from an untested hypothesis. + +| Starting point | Example impact to assess | +| --- | --- | +| Critical | Reliable code execution through ordinary content opening, or a compromised update/release path distributing attacker code broadly. Scope and prerequisites still matter. | +| High | Substantial unauthorized file access, destructive mutation, sensitive disclosure or code installation across a meaningful OS/application permission boundary. | +| Medium | Repeatable application resource exhaustion or crash with limited, recoverable impact; limited integrity/privacy failures when the actual consequences justify this level. | +| Low | Recoverable local-state errors or non-sensitive diagnostic/thumbnail defects that add little authority or impact beyond what the attacker already possesses. | + +A same-user prerequisite lowers concern only when the attacker already has +equivalent relevant authority. Conversely, a nominally local issue can cross +TCC, sandbox, write-control or release boundaries. GPS exposure may warrant +high severity depending on context; availability failures can be more serious +when persistent, destructive or capable of destabilizing the host. Neither a +single-process crash nor user interaction determines the rating by itself. + +## 9. Maintenance and reporting + +Update the baseline and review this model when decoder/runtime choices, worker +permissions, network behavior, file mutation, persistence or distribution change. +Record implementation and qualification separately; planned safeguards and +successful source checks are not substitutes for deployment evidence. + +Use the repository's existing [security policy](.github/SECURITY.md) to report +suspected vulnerabilities privately. Its preferred route is +[GitHub Security Advisories](https://github.com/frathe/picfetch/security/advisories/new). +Include the affected version/build, platform and impact; do not post sensitive +reports or private sample images in a public issue. This model adds no separate +disclosure policy or response-time commitment. diff --git a/docs/heic/history-reconciliation.md b/docs/heic/history-reconciliation.md new file mode 100644 index 00000000..24c81b1e --- /dev/null +++ b/docs/heic/history-reconciliation.md @@ -0,0 +1,129 @@ +# HEIC branch history reconciliation + +Date: 2026-09-16. This record accounts for the two commits on +`feature/heic-hardening` against PR #28's published `52ed2df` baseline and the +reconciliation change that contains this document. Neither historical commit +is an ancestor of the PR. Their source remains accessible on the original +branch; no history is rewritten. + +## Scope and acceptance + +Ronin authorized restoring useful omissions into the same PR. The lead owns +code, documentation, review and fixes. One read-only scout checked ordinary +fixture provenance; the CI/review agent remains paused. This extends the +existing Deep plan rather than replacing the new helper architecture. + +| Acceptance | Verification | +| --- | --- | +| Preserved decoder hardening | Compare all 107 `PICFETCH-SOURCE.json` entries byte for byte against `fc127b44`; `make check-heic-wasm`. | +| Qodana YAML rejected before path checks | `go test ./scripts/qodanaconfig`; actual Make gate rejects malformed YAML in an isolated temporary checkout. | +| Fixed guest backing storage and unchanged ceiling | `TestRuntimeMemoryGrowthReusesBacking` under compiler and interpreter; owned runtime regression suite and native macOS helper tests. | +| Useful ordinary compatibility coverage restored | `make test-h265` through the fixed WASI artifact; exact fixture hashes/provenance in testdata README. | +| Current app-wide threat model | Check relative links and review every changed assertion against the current source/qualification record. | +| Reviewable publication | Focused tests, build/provenance/import/Qodana/shard checks, GoLand inspections, signed commit and matching GitHub PR head. | + +## `fc127b44` — Harden and isolate HEIC decoding + +All **107 production/source-license files** in the maintained-source manifest +are byte-identical to the historical commit. These include the decoder's local +input/work/allocation checks. The following table accounts for every remaining +non-vendored path changed by that commit, grouped by responsibility. + +| Historical paths | Current disposition | +| --- | --- | +| `.gitignore` | Restore `/fyne_metadata_init.go`; generated Fyne metadata remains local. | +| `AGENTS.md` | Restore source-maintenance and WASI-only ownership guidance, using current commands and honest test scope; omit the obsolete RSS-test command. | +| `ARCHITECTURE.md` | Current helper/client/guest map supersedes the historical module map; add the restored YAML-validator package and threat-model pointer. | +| `Makefile` | Current guest/build/native/package targets replace old targets. Restore YAML syntax validation. Host and guest advisory scans already remain present. | +| `THIRD-PARTY-NOTICES.md` | Current h265/Go/wazero notices and packaging inventory replace historical inline notices. | +| `docs/find-more-like-this/dependency-qualification.md` | Current source/license/runtime limitations live in `qualification.md` and `third_party/h265/PICFETCH.md`; old qualification is historical evidence, not current release approval. | +| `go.mod`, `go.sum` | Current root/guest replacements select the exact maintained h265 source; removed Rust decoder remains absent. | +| `internal/heicdecode/client.go`, `command_unix.go`, `command_windows.go`, `worker.go` | Replaced by dedicated `cmd/picfetch-heic-worker`, `client/`, `worker/` and `winisolation/`, with shared app-family admission and native restrictions. Do not restore self-execution/ordinary-privilege launch. | +| `internal/heicdecode/register.go`, `internal/imaging/heic.go` | Replaced by explicit injected `imaging.Reader`/`Source`; production activation remains disabled instead of globally registering HEIC. | +| `internal/heicdecode/runtime.go` | Replaced by `worker/runtime.go`; restore capped one-time backing storage with a real memory-growth regression. | +| `internal/heicdecode/wire/wire.go` | Current codec-free request/response/readiness/metadata protocol replaces it; retains bounded NRGBA8/NRGBA64 transport. | +| `internal/heicdecode/decoder.json`, `decoder.wasm`, `scripts/heicwasm/main.go`, `scripts/heicwasmbuild/main.go` | Superseded by separate `scripts/heicguest`, `scripts/heicbuild`, its exact manifest and helper-only embedded artifact. | +| `internal/heicdecode/client_test.go`, `runtime_test.go`, `testdata/capabilities/main.go` | Current owned process/IPC/memory/cancellation/capability tests cover the new boundary. Restore the omitted memory-growth allocation property; old test binaries and protocol are not current tests. | +| `internal/imaging/exif.go`, `loader.go`, `internal/similarity/analyze.go`, `facts.go`, `search_worker.go`, `internal/ui/exifwin/metadata.go`, `filework.go` | Current injected reader and shared analysis pipes propagate context, validated pixels and metadata; byte-only helpers refuse HEIC/native preview fallback. | +| `internal/imaging/heic_test.go` | Current source, native-helper and guest tests cover admission, upright metadata/pixels, cancellation, alpha and explicit ten-bit output. Extend ordinary container/chroma coverage below; no claim of full historical test equivalence. | +| `internal/imaging/heic_leak_test.go` | Legacy in-process/RSS comparison does not qualify the new process-family budget. Native memory/cleanup guards and platform qualification replace that claim. | +| `internal/imaging/save.go` | HEIC encoding remains unavailable; current ordinary-image save behavior does not require the old decoder comment. | +| `plans/2026-09-14-heic-hardening.md`, `plans/2026-09-14-heic-isolation.md`, `todos.md` | Historical evidence remains in Git; current restoration plan, qualification and todos own incomplete work. | +| `qodana.yaml` | Current exact exclusions cover present files, including restored validator tests; old exclusions for absent paths are obsolete. | +| `scripts/qodanaconfig/main.go` | Restore actual YAML parsing before Make's text inventory; reuse the existing pinned YAML dependency. | + +The historical vendored `PICFETCH.md` is replaced by the current provenance, +upgrade and qualification record. An additional manifest pins the unchanged +production copy. + +### Historical test-tree disposition + +The old vendored tree also contained 21 test files, 90 fixture/corpus files and +one upstream workflow absent at `52ed2df`. Copying that entire tree would restore +native decoder/assembly and encoder testing plus historical reproducer/fuzz +inputs, rather than qualify PicFetch's current WASI-only path. + +Restore four unchanged ordinary positive fixtures (`chroma422`, `chroma444`, +`lossless`, `thumb`) and their configuration/decode agreement checks through +the current bounded guest. Strengthen the existing alpha fixture to check its +left/middle/right ramp. Keep existing ordinary metadata, orientation, ten-bit, +input-admission and owned containment tests. This is useful additional coverage, +**not** the complete historical decoder suite or a security certification. +The remaining historical tests/fixtures remain available in the old commit; +none is represented as having passed or being covered by these eight fixtures. + +## `73cb3c9` — added threat model + +Restore a current root `THREAT-MODEL.md`, retaining its application assets, +attacker/operator/user-intent assumptions, filesystem and cache/privacy risks, +release authority, severity guidance and private-reporting policy. + +Replace the historical HEIC section: the new helper has per-platform OS +restrictions, 64 MiB input, a 60-second ceiling, shared GUI/analysis admission, +new paths and explicit disabled production status. Update package/updater +boundaries and document the first-upgrade limitation. The old document remains +historical evidence; it is not copied as an assertion of current behavior. + +## Verification evidence + +- Before changes, the actual Make exclusion-check recipe accepted malformed + `exclude: [` YAML (exit 0) in an isolated temporary repository. +- Before memory preallocation, both owned memory-growth regression cases + failed because growth replaced the backing buffer; restoring the setting + passes while preserving refusal above the two-page ceiling. +- The YAML validator's five cases pass. The actual Make gate now rejects the + same malformed YAML and accepts valid configuration. Exact Qodana exclusions + include the new test file. +- Focused race runs pass for `internal/heicdecode/worker`, `scripts/heicbuild` + and `scripts/qodanaconfig` (14.833 s, 17.929 s and 1.184 s). The fixture run + exercises all eight ordinary inputs. Owned memory/cancellation regressions + also pass with `heicinterpreter` (0.416 s). +- `make generate-heic-wasm` refreshes the input manifest without changing the + guest artifact. `make verify-build` passes formatting, TUF, Qodana, generated + assets/notices, source and artifact reproducibility, native import guards, + vet and build. The initial restricted-cache failure was rerun with access to + the existing Go cache; no source or policy was weakened. +- `make heic-native-macos` passes all four required Apple Silicon guards with + preallocation enabled: sandbox/readiness/decode/cancellation, both runtime + engines, signed bundle install/rollback, and the legacy upgrade limitation. + The interpreter's expected deadline is a successful containment check, not + a claim that it decoded the 12MP image. +- GoLand inspections, including weak warnings, are clear for all five changed + Go files. The runtime test was re-inspected after its owned module ceiling + was corrected. All local threat-model links resolve; the lead checked + changed behavior claims against source and qualification evidence. +- The final read-only inventory confirms 107/107 source/license hashes and + 4/4 recovered fixture bytes match `fc127b44`, with no mismatches. +- Local canonical shard validation remains unverified: the Linux-only direct + target was mistakenly invoked on macOS, then the documented Docker target + could not start because the daemon was unavailable. No UI test or shard + assignment changed. Native Linux CI remains the canonical gate. + +Publication uses the existing PR branch and configured commit signer, without +merging or rewriting either historical branch. The final task response records +the resulting commit and remote-head verification. Production activation and +the separately paused CI/GitHub review loop are outside this reconciliation's +completion claim. At baseline `52ed2df`, native Linux/macOS guards and all UI +race shards passed, while Windows HEIC guards and the non-UI Linux race job +failed. Those results do not qualify the new memory configuration on other +platforms; fresh CI is required. diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md index c972e4bb..bba00550 100644 --- a/docs/heic/qualification.md +++ b/docs/heic/qualification.md @@ -61,7 +61,9 @@ implementation is preserved in full; no complete equivalence to upstream's different table representation is claimed. All 107 production/source-notice files are byte-identical to the clean historical subtree, including unused native assembly. The WASI guest selects `noasm`; native application imports -remain prohibited. The historical test corpus and THREAT-MODEL.md are not copied. +remain prohibited. The historical full test corpus is not imported. Selected +ordinary fixtures and a current application-wide [threat model](../../THREAT-MODEL.md) +are restored by the [history reconciliation](history-reconciliation.md). The exact upstream base module sum is `h1:rnpfo8I4PFhohbij8ySYZlJFn07TTwV+/uWBrKsOEas=` and its ZIP SHA-256 is @@ -115,6 +117,13 @@ only the generated explicit-depth gradient is used as ten-bit evidence. ## Resource and compatibility limits +The WASI runtime reserves its capped backing store once; memory growth reuses +that store instead of temporarily retaining old and replacement guest buffers. +An owned two-page module tests stable backing storage and ceiling refusal for +both explicit module maxima and the runtime-imposed maximum. This is not a +whole-helper RSS guarantee; it increases up-front virtual memory reservation, +so native platform qualification must include this configuration. + The candidate production maxima remain 64 MiB input, 64M pixels, 256,000,000 output bytes, 64 KiB normalized metadata, 4096-byte diagnostics, 60 seconds, 1 GiB WASM linear memory, and a requested 2 GiB native worker budget. @@ -209,10 +218,10 @@ once sandboxing and finite decoder memory are verified, even though the native helper lacks a guaranteed hard total-memory cap and can cause memory pressure or crashes. Capability restrictions remain mandatory. This supersedes the original whole-worker-cap gate for macOS; the proposed 2 GiB number was an engineering -starting point. The current candidate launches a helper through its isolated -client tests; the application has not yet adopted that client. -Implementation continues with bounded host allocations, byte-only validated IPC, -finite jobs/time, cancellation/cleanup, shared admission and platform sandboxing. +starting point. Application/analysis injection of the shared client is now +implemented, while production construction still supplies no HEIC owner. +Bounded host allocations, byte-only validated IPC, finite jobs/time, +cancellation/cleanup, shared admission and platform sandboxing remain required. ## Native macOS helper evidence, 2026-09-16 diff --git a/internal/heicdecode/worker/runtime.go b/internal/heicdecode/worker/runtime.go index 2647405b..3799cc51 100644 --- a/internal/heicdecode/worker/runtime.go +++ b/internal/heicdecode/worker/runtime.go @@ -29,10 +29,7 @@ func execute(ctx context.Context, module []byte, stdin io.Reader, stdout, stderr } ctx, cancel := context.WithTimeout(ctx, limits.Timeout) defer cancel() - config := runtimeConfig(). - WithMemoryLimitPages(uint32(limits.WASMMemoryBytes / (64 * 1024))). - WithCloseOnContextDone(true) - runtime := wazero.NewRuntimeWithConfig(ctx, config) + runtime := newGuestRuntime(ctx, limits) defer func() { _ = runtime.Close(context.Background()) }() if _, err := wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { return err @@ -55,6 +52,16 @@ func execute(ctx context.Context, module []byte, stdin io.Reader, stdout, stderr return err } +func newGuestRuntime(ctx context.Context, limits heicdecode.Limits) wazero.Runtime { + // Reserve the capped backing store once so growth cannot transiently retain + // both an old and a replacement guest buffer. Host memory is still separate. + config := runtimeConfig(). + WithMemoryLimitPages(uint32(limits.WASMMemoryBytes / (64 * 1024))). + WithMemoryCapacityFromMax(true). + WithCloseOnContextDone(true) + return wazero.NewRuntimeWithConfig(ctx, config) +} + type limitedWriter struct { writer io.Writer remaining int64 diff --git a/internal/heicdecode/worker/runtime_test.go b/internal/heicdecode/worker/runtime_test.go index 53e1ab9d..88e3b65a 100644 --- a/internal/heicdecode/worker/runtime_test.go +++ b/internal/heicdecode/worker/runtime_test.go @@ -73,6 +73,50 @@ func TestRuntimeCancelsOwnedLoop(t *testing.T) { } } +func TestRuntimeMemoryGrowthReusesBacking(t *testing.T) { + for _, explicitMax := range []bool{false, true} { + name := "runtime maximum" + memorySection := []byte{5, 3, 1, 0, 1} + if explicitMax { + name = "module maximum" + memorySection = []byte{5, 4, 1, 1, 1, 2} + } + t.Run(name, func(t *testing.T) { + ctx := context.Background() + limits := heicdecode.DefaultLimits(0) + limits.WASMMemoryBytes = 2 * 64 * 1024 + runtime := newGuestRuntime(ctx, limits) + defer func() { _ = runtime.Close(ctx) }() + // An owned module exports one page of memory and no code/imports. + moduleBytes := append([]byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0}, memorySection...) + moduleBytes = append(moduleBytes, 7, 10, 1, 6, 'm', 'e', 'm', 'o', 'r', 'y', 2, 0) + module, err := runtime.Instantiate(ctx, moduleBytes) + if err != nil { + t.Fatal(err) + } + memory := module.Memory() + before, ok := memory.Read(0, 1) + if !ok { + t.Fatal("initial memory unavailable") + } + before[0] = 42 + if previous, ok := memory.Grow(1); !ok || previous != 1 { + t.Fatalf("allowed growth = %d, %v", previous, ok) + } + after, ok := memory.Read(0, 1) + if !ok || after[0] != 42 { + t.Fatal("growth lost existing data") + } + if &before[0] != &after[0] { + t.Fatal("growth replaced the guest backing buffer") + } + if _, ok := memory.Grow(1); ok { + t.Fatal("growth exceeded the two-page ceiling") + } + }) + } +} + func TestRuntimeBoundsGuestDiagnostics(t *testing.T) { limits := heicdecode.DefaultLimits(0) var diagnostic bytes.Buffer @@ -158,13 +202,13 @@ func diagnosticModule() []byte { return module } -// ownedModule builds one function and a one-or-two-page memory from literal -// instructions. It has no imports, image input, or third-party parser code. +// ownedModule builds one function with a fixed one-or-two-page memory ceiling. +// It has no imports, image input, or third-party parser code. func ownedModule(pages byte, body []byte) []byte { module := []byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0, 1, 4, 1, 0x60, 0, 0, // one () -> () type 3, 2, 1, 0, // one function - 5, 4, 1, 1, pages, 2, // bounded memory + 5, 4, 1, 1, pages, pages, // bounded memory 7, 10, 1, 6, '_', 's', 't', 'a', 'r', 't', 0, 0, 10, byte(len(body) + 3), 1, byte(len(body) + 1), 0} return append(module, body...) diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 28f46078..fef2bab8 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1,5 +1,12 @@ # Isolated HEIC/HEIF restoration +**Current status:** production HEIC remains disabled. This chronological plan's +original 30-second/all-platform hard-memory requirements were superseded by +the recorded 60-second ceiling and accepted macOS native-memory limitation. +Use [qualification](../docs/heic/qualification.md) and +[history reconciliation](../docs/heic/history-reconciliation.md) for the current +implementation and the disposition of the original branch's changes. + Date: 2026-09-15. Route: **Deep SDD/TDD**. The deliverable is decode-only HEIC/HEIF support through one bounded, disposable WASI decoder helper, admitted only on platforms where both process-family memory enforcement and capability @@ -872,3 +879,41 @@ historical prototype. Neither branch nor the historical hardening commit is merged. The missing documents are reported for separate intentional integration. HEIC activation remains disabled, all qualification limitations remain explicit, and no history rewrite, merge or release is authorized by this checkpoint. + + +### Historical omission reconciliation (2026-09-16) + +Ronin authorized restoring useful omissions from `feature/heic-hardening` +commits `fc127b44` and `73cb3c9` into the existing PR, including signed commit +and push. The earlier checkpoint's deliberate document omission is superseded +by this authorization. The CI/review agent remains paused; no merge, release, +activation or history rewrite is included. + +The lead restored capped one-time guest backing storage, YAML validation before +Qodana path checks, four unchanged ordinary positive fixtures, stronger alpha +coverage, the generated Fyne metadata ignore and an adapted app-wide threat +model. The 107 maintained production/source-license files were already present +byte for byte; the current helper architecture replaces the older worker. +[The reconciliation ledger](../docs/heic/history-reconciliation.md) accounts +for every historical non-vendored path and the selected/omitted test coverage. + +The lead owned implementation, all review and fixes. One bounded read-only +scout checked ordinary fixture provenance and final source/fixture identity +while the lead reviewed code and ran checks (no writes, decoder execution or +review delegation). It confirmed 107/107 source/license files and 4/4 restored +fixtures with no mismatches. This adds evidence to the existing Deep plan. + +The Make gate first accepted malformed YAML; the restored parser rejects it. +Both memory-growth cases first replaced the backing buffer; preallocation makes +them pass without raising the ceiling. Focused worker/build-tool/validator race +regressions and interpreter memory/cancellation tests pass. All four native +Apple Silicon guards pass after preallocation. The guest regenerates unchanged; +`make verify-build` and GoLand inspections of all changed Go files pass. + +Canonical shard validation could not complete locally: the Linux-only direct +target was accidentally run on macOS, and the documented Docker target then +found no running daemon. No UI test or assignment changed. Current baseline CI +has passing Linux/macOS native guards and UI shards, but failing Windows HEIC +and non-UI Linux race jobs. Fresh CI must qualify the new configuration. These +and distribution/color/upgrade/signing gates remain explicit in `todos.md`; +this reconciliation does not claim feature or review-loop completion. diff --git a/qodana.yaml b/qodana.yaml index 685e0f79..26e76459 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -403,6 +403,7 @@ exclude: - "scripts/nativeguards/main_test.go" - "scripts/plistdoctypes/doctypes_test.go" - "scripts/plistdoctypes/main_test.go" + - "scripts/qodanaconfig/main_test.go" - "scripts/releasenotes/main_test.go" - "scripts/releasenotes/notes_test.go" - "scripts/storepublish/main_test.go" diff --git a/scripts/heicbuild/guest_test.go b/scripts/heicbuild/guest_test.go index 1d49c37f..5672bb8e 100644 --- a/scripts/heicbuild/guest_test.go +++ b/scripts/heicbuild/guest_test.go @@ -37,10 +37,12 @@ func TestWASIGuestOrdinaryFixtures(t *testing.T) { } defer func() { _ = compiled.Close(context.Background()) }() for _, tt := range []struct { - name string - sixteen, alpha bool + name string + depth int + alpha bool }{ - {"basic.heic", false, false}, {"main10.heic", false, false}, {"tenbit.heic", true, false}, {"alpha.heic", false, true}, + {"basic.heic", 8, false}, {"main10.heic", 8, false}, {"tenbit.heic", 16, false}, {"alpha.heic", 8, true}, + {"chroma422.heic", 0, false}, {"chroma444.heic", 0, false}, {"lossless.heic", 0, false}, {"thumb.heic", 0, false}, } { t.Run(tt.name, func(t *testing.T) { input, err := os.ReadFile(filepath.Join("testdata", tt.name)) @@ -51,8 +53,11 @@ func TestWASIGuestOrdinaryFixtures(t *testing.T) { if result.Image == nil || result.Image.Bounds().Empty() { t.Fatal("missing decoded image") } - _, sixteen := result.Image.(*image.NRGBA64) - if sixteen != tt.sixteen { + depth := 8 + if _, sixteen := result.Image.(*image.NRGBA64); sixteen { + depth = 16 + } + if tt.depth != 0 && depth != tt.depth { t.Fatalf("pixel type = %T", result.Image) } if tt.alpha { @@ -60,15 +65,11 @@ func TestWASIGuestOrdinaryFixtures(t *testing.T) { if !ok { t.Fatalf("alpha type = %T", result.Image) } - transparent := false - for i := 3; i < len(img.Pix); i += 4 { - if img.Pix[i] < 255 { - transparent = true - break - } - } - if !transparent { - t.Fatal("alpha was flattened") + left := img.NRGBAAt(0, 0).A + middle := img.NRGBAAt(img.Bounds().Dx()/2, 0).A + right := img.NRGBAAt(img.Bounds().Dx()-1, 0).A + if left > 8 || right < 240 || middle <= left || middle >= right { + t.Fatalf("alpha ramp was lost: left=%d middle=%d right=%d", left, middle, right) } } config := runGuest(t, runtime, compiled, input, heicdecode.DecodeConfig) diff --git a/scripts/heicbuild/testdata/README.md b/scripts/heicbuild/testdata/README.md index dfa9f195..6ed01a25 100644 --- a/scripts/heicbuild/testdata/README.md +++ b/scripts/heicbuild/testdata/README.md @@ -31,3 +31,27 @@ config/decode dimensions. They do not establish colorimetric fidelity, broad camera compatibility, Exif/container-orientation precedence, production sandbox qualification, or a whole-worker memory ceiling. Runtime memory is not measured by the WASM linear-memory cap. + +## Recovered ordinary fixtures + +The following unchanged positive fixtures were recovered from +fc127b44e1c99447b8d150256563c6d4f99b8ad3 under +third_party/h265/heic/testdata and compared byte for byte with upstream h265 +v0.2.2, commit 665fd95984177afef4a7efca7d50638e4b695c7a. They cover ordinary +4:2:2, 4:4:4, lossless and embedded-thumbnail containers. The repository MIT +license and both copyright notices are retained in the existing h265 notice; +no additional original-media provenance is asserted. + +| File | Bytes | SHA-256 | +| --- | ---: | --- | +| chroma422.heic | 22466 | 66ab3939ee65e456c5dd251c11c3bbc06988a97b3204fe07783a3099c5feac03 | +| chroma444.heic | 21527 | 922d8b5fbc5016b03c23fb1cbb8a481055657134c05197b264c56a2d124b5dca | +| lossless.heic | 37654 | ed6be32433f7faa64fea894ecf8119fbdffbdc91420d7d08933812577ace594a | +| thumb.heic | 20337 | 45c4dd0be12e0dc796ec057ba783ac8e6dfac04351a3b93279a430d9c0017531 | + +All eight small fixtures exercise Decode, DecodeConfig and DecodeExif through +the bounded WASI guest. Configuration must agree with displayed dimensions; +the alpha fixture must retain its endpoint and midpoint ramp. This restores +useful positive coverage without asserting pixel equivalence or importing the +historical full codec tests/benchmark/encoder/reproducer suites. Existing +libde265 YUV-plane digests are not RGBA-protocol pixel references. diff --git a/scripts/heicbuild/testdata/chroma422.heic b/scripts/heicbuild/testdata/chroma422.heic new file mode 100644 index 0000000000000000000000000000000000000000..ebfa58acb1a6776cdc361f26bc6cbb1a94055c05 GIT binary patch literal 22466 zcmYIvW0WRM&}G}4wrx#g+O}=mwr$(CZQGuVT=D}H5FodN;^ z!ZmgFus1ica0mKlHWsFg|HU>I2Bttjz{)lz&IbR@|1%1c-ARtxAf0V?+!uDU0|Ac=7?H@4#`G3sZ z)rj%GaLK~n(f%K{SlAoc{X^G(f)Fqm)PLIl8225}*U#G<5D+4${=ds$@B_mE0|5Ue zfCA;P|L1|YJ3;sj{%O>L!2fgR{}<|Epb*iuDo9H^+M&#U6aLEv{m%gr8U9O$6b2q} ztT*Hb0s=xYva@!yHM0J1`S3sx{{N;>Eu8F4{^36Z=KtsJ{tYC13wMiu2m}fR_1_9H zEbMLmw|W0M02TlO3ij{T6>W?S{`F2(loGfOf(apZS!wxd4;Qj>E{lfmVAAdGoU0kk z`_HD)Jr1PtLr{b+s83?+u0zu+Ow>vS-?g?#N|fwsTLi6fg0X7PFl4fDP3Dyxs|$#`euroXK&iia*0f{<*L2~pPAnS zs)ae}(H3y;O^`W4l#blDMc=M0elRiU#(#(xV}|u`f;J$myk>As!Q@Tmz*)fhMUSeL z>-EY-eSUly5y2gkf@bgA0io^&i!S~Nwc<#yWt0;b<+MQIL_0wN7;Jf<5`8L&?}yJA z0J6OO9*sNt{mZJ+AGxu5szwmwQ|nn{hZ*1(%0}MhG1eGHDDPvehvb7=9Vb7)a0_dT zI#nQ!QN1ol82q&^Xaguwp?G;zFj_#nxP|HjyKw>6&~1FHTp3y^-+>(~ zQeT2E)d#|QT{&(Y`?&Bp8>_j{GZ4m>H=p*TMasMgnv4CTh2vlX zd23`wJ6#Y3s)meBJ&sLBwyWc?Me5cKO;+6}ym0da##MJeE&1U0U8U&xjWs-tK)_#l z8n5W&rQJMi`QDedtTjwl#Boo4Bp(llY47zBvy9KZeOO3dP=0WP7ZdpNS~FQ6Ip7w5 zt%dkfPY8(hc{PVwwD=?Jf7LD>Lv%viM{`)qDS`%~cQ~kubE%4VWBavv4VY1A7&K&; zcy=f+AOX_S>2|P-hr$K(X~>l}8Od~n=4m!$o&M4uPsqVN2;0Hpjvak}Zg`ne^c>?r zWib_zx=1jA#;(L4R*k*}{mx$^*We~r?)7DGY$BvX>yl{^AH(F^N=e=er&MGelp!4X z(Z{OolO&M;82krf9WPjHl<<)TcilmA{ZC5A1c?=$M*hrmG z$uid*D|*U-35|0&M@93~U3vZ4poL?)yZrgYr==7nLX3F#vPJ^XVfhBXe{>kjsy3$IU zDr)OaoF3#iQ{aC8_&{7OT-l|&NTMLN`DMd~sk5B2$ENNq9m=pJnnf;pM+)VS();2Y zV@_@+tHFQ{YFdC>Ik)s6Mcp3uGvRFh56LTn96!`GQ2g!?qwY1vC0%*f%(?xS{`%CD zRy&}a&{GsFToV!i4R6X+fFx*q`y{Owdfrzh*6PFjvF!~sv&8|QN^3pev~|P z)OA-6-fp7QF0$Ab%_2vfU;V11M&|RwZmroF0?&Z7$~r0}tjned)5*Ss*pDCL)X?7u ze$6V1?1+Q)oaDJwZJ9W2ZR;e}V|#BJeO8GUccyaj%qv(GGnEgsztFE(v^!%73_VbN zd(|d&G9pkmv4=ekaXxinwhf_50V2%M9EDtp zt@ZYNshHW|3>j$USla>9rb;4}$%F_~Kh|mcg6#3D_T#uP=KWUwmSgQT?Vc`}xbFy1 zJ6&|GzrZ`_*iR|<0cle)az+$*l}w;+^IpYekkQ$-hy=H0a)%Yv5A7K z3nwV)8hAItU)z>*T)d7d7mo#V;C5dT0Gua+I}+bt((XMubDXz>iBIV20 zW~p_9=<9mGlpDk^vn`QrO2p^34Ud8{e{$YJZDDNfT7wSqbTZpLYz_RF$qR#Em#tWW zoe}X-?(3$ zC1hrd?b_CKd`$6zO2JXf$+BkZ#OhDJH^Cf!xCgzAai6*$+NzYP!bcAj^-#Xe@_C_H z{9klgmrq_V-lqZYu9H((7fQzNhg3_=7+@T_TOWo@|t{wuTLE*5#y?7Hn#rRmvmv3Wxj62nZG0DB($%X5u{ z&zA>?{65+e6gzQ|t2^TLMrnsuUQQKVRo<42t!5I9zb#(w1dnnTFWgwsMFrKlER&>! z)Z=T3x4?$*_rf``34zp|Jeg1fxm=B~)Syqc4I<^StP;g+^{MWNe99kjlwpQY(wEj8 z29Of=qDt2qCWBtb#ES4FvU+2 zB%Op0XW?G%;k?L~Z+}4j$^V`3z2c1uVN-nIvAVWpac6fd!iOC!f}ad$e+1-zDAd8qZbCaHNBbqp-g91k&ZS0i8O zQsHm5z()n!x!T!~x3LGZtrg6VR}O)#9KtH(nB6ZwT${=El1yjC+AY*V=!TOvkdjp* zhK^7>oX9_$JwH3&B9AP;U;&1Ta@F)bSobJ&+uVED{ard!!Rx{wHCrG_<7<7)nYFnC z9yYIk)wM1i9SR6|WNg@>lr#zi@hWY>zvexZ|DZKU!y60zWl&Ma8;=p~Gh^p&*9bGL z;6N99p6Z8p+U31C(U3GZ)ST2@l(J_v_ZcoxX`&BP%YyXNNW}k{Npw9fk8RvJ`xEla zfM2b3mv_T{sMB@$=N7!cTmo{Shwobpehb%3Fv1tHVa|e=#Q=KI_XR6|tN*=2f1h0Abo!1AdNlBXl`CPdSGA;ziSk)`Ob&0FEFM+981Jd=%+WMnA+j>viN%M@ zF7k%f+610}I0ROj0so#$>fp**V2_Ej^wlzk8#T*J9glwAgTsdOq)6kB;?oI*m*#?c zn$|we-!b}oHhe6|k7KrMcPMk8`Q$ti$}Sf+K=7&)T1Q;D9N`PjCg!+-;@Kmc-z!6L^zEsvPkGU~6CO&9~l%>mMD?6OAs)Tvh2CLqhm>^$Di~)hIxpYmKOasBYa7 zR!NH|4Bk(~UJS%Zw~#zcBh{+$ld+xfy;(nFvzY&Tomg}j86@#~(1qXzLnLV4T7yJHxf*;@-t3Xd^UY6*zi8BfTQw)I9QI?UCZ_m z(4}Epu_`bOlY3vM;BAlGz@JPD4rYJEMtm$0DgGIFrdFZp>D*e4g zd$}}e_zD?^xGBoG{r)Qi>B%T$+xfTJ&b;hIJe#0Eoij2OpY^+LUJGkV6bxVcSRkQ& zn-8cbVul@{3yvn7ZFIH9hY__z8#RV#^!b^Yt&b}ctomfUS&$1{h@E*Be&ElSk(;})=WV@QK- z;ix)2?~_rJ?8NqL#%Z>JB2Q1mwoZ?32T!9TN1Kt3)Y3XSQjB`X%hz?$t0m<(ML0AO ze}QBwNe2J5nHnI##N;+{5Q6A*+NXYEDr1NbzCaMS+ITV5mC1*rVpV&-+?h13Am2Sb z-bBY9x7J=_5DS@ev4?fY)174b6PtysRBYmam>FxWQN%q|@^qjU?BW4(_Z<7sJjNtay`*s(v#tZvl6?Sv~Xe0Yg46qw&Q9vuC0$; zH?}|3%R$te+}LuWkd5CpA)bjSI*HH(bX*hs)P`dXYi%1b!~`4H zWDq}UWU>5L|7RuBlV5tDL>*VmZPF*_0JImITXN;VQfTNL@uJc9!#Wqg;i(EKZYhaS z_G=>(+*lCaQt5Rb#W%}3GDhA0`gXK6uW{qaDJ^AUW=*}79q-zs>qWt5DSS$ zQJd3BH`*SM`i$=m?=H*Vds*q#SFU0`dH)2CrFePk1{IZ4g&l=MO^UpU%8YEZ*ROAv z)cD(9HStIH*KOLRD34seM9*n<`CG4xH`W|fT&@bdgwi*YKMpMpG$CS&5-UNid}r#j zDHf*OaF**~qjVHe^8-w$K#q6!pXGe;RC)>e6bUI$nfq_@Fct#Ai~481@-=w*A9rNL zaz}g`@KInn=;Biu0TF6~8{fQAcRtqSJ>~*ysg<=dhhx$Jp8J^^E|Ld7#G{4}0#?0{47wM{Mk-L*2`&D6_BxKLcKqe|{`(>=FB0x%(eV3xsazJ047a{w={NeKf^@JNmcx+@3` zVw-PYi0I^cAOhJEG;wdTooLUUt!H6V6G?&0^+|mI{Ewxo$D%XLOZAUnO8C}$oJ3U^7SpNK&-)n0!xI2m3M5EnC-Pvac37=H%!qpZ(*LGmZL zq8z3h)y6(Q{W6U~ovH>A-W*ccOH0lX7WTCM4n(8@pd{HE=-1xO_9C?t;n9LRnp;37 z+Ba}>c_Ac#$}FaO{VWSgT9K`eq==ad@%^1+Ry{VKEIJRNdobc{LzBV6tpAK;h$a{> zDpw+Iq8}8FGb6??G_#(|y=2L5ERUMH7_lK(KD}uyb#Ge(ExKSh8}r8GNg=?4tn1#hvlgP2Ldu>uo2rwE75C3*T8P4`pM_Ln(YtX?L%fD7 zvA9USCqk=&=S~D-r}VfvSL!@o%T}6XKtydMG-|1n>`ngB-qWQssje385^m5_7{i9%6Tx=RedJ z(s^a2@;ROtOC)BsI$V{^Qbib}AU`3Oyp=M-);TOGAl@jOhOZSi-^_&?rGm+zi<0l` z9j=>!Jl<6&;I^(|GDReJdeJ}IGrn$5V@!#q{!x)Q;O?cjiz`=U3W;#NMQ7*75_ck{ z;0>nsaZH(?_0Mk7Qf-lG?T(3HB!pe{P1Ou_gKiM^L5Inxc{P0dU>PB||Qn~`u;5L5M)`Up3ifUu>%1_nLdeT8Z(L$wod7^bwaJJ3e1H(V{fIxoRb zLzT<0Fa%?`QfdvScfG-98L^S&36f6xN>@?quWL~}HX=TJVM;CJ8@eXvZ#~N{xAD3D zsWHuoMQavzFz3}9o?2EQ?fP{I`>;DghBa73-2v1v#iQmET&z}DX-1D-wa<5X{Xqy8 zQoBkJlC%Za$rzm6AU;*__C1VSHU172Am*@ms(Z{Rrp-4OLj2?>VNMn~KR3Vq5T+4o z;<*&kXsIrog}VzBHT9n?I3j8@bSAO*hd^RqJA)#EWZN6;LOA*N)J1_)iyn?BJ(e>4 zJ|EplpvK0RL;c*cJ1wxbncA@7x8l5yo4{a5KP``-A~bd$m40qR1t8RkJ(i#iOnxow z1?0VbdbntmC65cC%&as7_7dD)0C6{RioY5PKH$i}JfpBa{_*2(?=pLincFIvuD+Rn z#Yj`=1pAhxp%^f8lpjhqsHlMT6y#o-Hm9Mx{g#(8eo1{6O<I=gJ3$@%}+%7*&LS%7*?D_u5M=!|RcEWf!mc1`%vJomTjV2LEk^Cc1{|wUIt^Mv0gSK>h~h*iUUq%4Rl*AdT1##XN`=cx~8V zrZ2DJ*+_9a75?kAQ_$xjMr2^eX;yiTyP-l;9|EI~WVL~bVp6RMC~xo7TJ5`_)D$kT z^;23=d?{a}1QBwjxZ6vt=5fik^~$2CQKe|m%X&)SOdS9-ufFAfV#z30N7jx&2W_mO zxf5v2UZ%J>&#%p85jyK#t2XYksQ~r+2-TsM>NYw)2#Kt!D}7?Lo>MQUO4gR;{YehI zwBXcIoqp9HBw#*hTD&u9OI~jm!*E$nl{oxMcB4i<5@p^@PxUIx_z!O^vh|O!;ZvOh zf$eYkTS=7LB7Mbc<^vJs!>fvbGRk{bTQ+DCQ(kOQ8~Rm-;7x?=T5$mkjH~Z^^pc`- zAdo-{HOpF+PwCp`2EWcsI}}&G`9CFITbVa1`5f-gq5@5m1qwS?Rs|ibe?vdQEoFt# zfd1;hE)S0XI6YKv9Mjenovdo434Og3(R*dt@W=caEMWe+04w?`I#Zw%B^lc3k?O%* z$s$@49O{4WQ&HJCfM_f875mkYVFl^-Tg^G56#eR(4PgzHy7B`ZUiC{of^DJItBQ%NxbPk?9hD<%3m>6t`ScWSvUR5RO!N(Q=U%2ecqsx&U&o&e zMt?P`ibo#em~J-t%pbsHF)cz-Qj%(5L+TQZ23ntjrU&0e($kbRv!_V5T(rn?cZe-r zR`vduI3=?xKfHj%JaHoGtv|wPid|1jYR|KM4@=OZWLQ;G7DwmUnJ&0~S5|+OFl*(q!&h3DU4V;NBs%~Awf7O_^(7qZ zb?Y^G@vEc-pi&JqK#EgE@&~WfcagfOcDo+eIUp=TjRf^kRf)9FLpGAq$#3KSEzpK} zW#B6_CRQxI;%}B1c{A^)q`EIuUnbfkyc7;Z$m6dQjFWmv7d@S8Duly8cox-+0WNM< zLg6>YVu=r+X|8X0?@z=7Pm`GpyS7059f6o?Fcw^zjH8+_sm~UZfQF7$O_GT$5MSMp_u*Yx2=N9f^4DY0l8*@4gf`w;16vFI+T3rH_LCEJg8f^I z?lm_IT0IcMePS>&<|pup9^H_uu80A|RODmGxg%Hh9;u1I{;Dp5b76O+yp}cR_#lu* zLfUnRWBoM?+^PJ0a2~UE%379%6;~I@ft~#0zepv2r=(mCsO`dm_YIaXiK@%#$tJmB2Wulu9uW~kym@saE<&1S{~%+E$DR%HWS&-AphaPZ;@VW5dws9qN~~Ee+}*>q%tm6~oQOkMVIp$&WBn_G zJp;4kmabvH%HiGbp7wh-lQI}zdPeu?Ro9%jpQDr=y;gQo-%prRoA1ntKv4p+YSqS# zr|Ud(-E*XNOU&4){8ZA(6H|G=d%UMJ=ZVtSIL|((Qy39ARv%VQ;^3G*qV}<8`pobw z^^c6TQRfGIbE4lcc|M0L&BNFF(!mmn4%kWUw9%2yT%mD1UOCOVT+e>aN?s}B3Roiv zyGTsbtEx+l0_-61xI%dx7<}{K%~b)jm1<7*!x^AZn)R)B{qGm#MsFc}htjBxgu}aC zaN?)Kp^Y1DY1{i4vI`&CC}X`%st8)d93e|uVi|5+Vr7e(k4vwXpuGBZhvyXs*pPFpa zsd#DKw6F&{zcZ;3zkq^+Xq=@15LJ{v#$Z?1<6oXZA_sf4Ck@9DrRDlx*plj=T4JrW zcJ$_EvdGfH(QH{=arM7idAs+K=%yC3Amj{O-hM?+`?_d+q?rA-9PPC8l)U7TkT#E_ z%ZVV@5MsWd^-A>=fp+<;k{#)yQPWn}-Iu<(isPJRTBlQfbOCed?DE^BbyFK^3lvb8 z&%H;|1vJ|lYT|FI_vX2WT^A|^Z4SEbs?#KR>%8aa16S{naYOp*1>rIrw`Hm;qy!pH z$Q|(n0zTbZ1LZ`mU&S)~z8e-tN;?Z?;-^-*U$@+1LTOLNE;jD9IXF5nV5QS+7Yr$o z_lvnUWc9mis)t@KFW2W5GWdqR2gcRnr3iX0>?~rUDu1Pa@doxhuhvl&#sA;tL2`h6 zbaoML!4*-Ye3mbAOqMi+)fFh9W>Kt(XS4}_hi$-4qVPJJ=IM$$^$2o8ZVlZo%7 zgPv}aJUZrgEMKL=tAZp9tIn^JOwVpdJ}y2Rkrb1_*y-)XI&PkLBc;pK!fk>%7m8#j z6_X*ki-Ib7n#z=~L@Hj%T6Fic6?ju_)`QTRH5C=ndzXUY_hzt%!LPp?&|Qi zDy4dWmY=e9N7bO9BPri{K;Px+sIDSK%xmBHH6-QR2ENmaF)D(QB-^bjF`%R{4?#0S>~vjhQwDii65-c+Hr=_A==Y7PHAU_&R!4fQRz0*fS;5Lj+8 z*ilv!!TzGMm~h?>GZEe{8N19VGQ#J(RCd1HiGb8Y!69Co5VUZhn%)VEke*+3`ZFNr zHFRFTT|GBAHfsAW8XV(8$j~DEA=M#@B@E(WI2WM zh1xq+If5l$l(>S|>#I%unN}V7gg7acdZ~!E17z$&VEeh>KGtuYyxw;(y=er*l|V3l zyg)(iF$^IVFn7p%vrRIzJf}jtg8ZlpTt5S3k$F z*}N>)m?QLt6c~h2@hFo71yY1CO&`>aRfkduccI0BzkXhSsTf`s|$@M1;my zaSdTJ>fzK=vflRiiF<9;`QCrca)bF+{m(cQY^!_1Dg(Q66R>kLs%k-SHc!SIPpwpA zD9NB1tt5!R-h8#o5`k;sJ%bxWk$n5 zPW_?@H9(9)F3Vg(&jsPnsLi5ow(uG`EF5RzXF$!*NrZ!f4d9*)@Uy~_<+YaJH*;=B zg=$fT23)%X-sz&l%RGj4pJwuIhwdfvM3b320da#zrPlGw_@w>fXByA%$ExgEp$0{J z592u${NU|FXOi!4k+*$l-f96Kvqur=dCt3)^8)$bhNoKG$JZ8h7*|<1Sob+;*!02~ zOUaq!6YZCSHlBGSLm7osxCG}W+jR*{m9fO3Ri3{}(U_F6m%K;Cq^orp_jn~bk`sSz zStIAf_Bfh=s2X5?ZLo{22vFiXQ*0isPN>Gc3J>f*;cOI!=-M3Ca9b)Yswx`ZN-AX+ z>#hO&?J#y6;URre#`k33U>|jN@j~Ik@?e!`_4_ga>58!9O+?dolo4PhO39RQkV$4L zi?~Qj{jLe@NyIaTeNWxd$g#)K?@|Hta~T5wibORa&1GQ@%ki6X=hBqK`tsUBH9P~% zrvc=o5O2 zl6`Iu?bp+!X3R)11`#TbU=N%c=nxp_n6a6f1%q0dG6%cX9ggl_xc}QXhAa8TLTp4>`_>+&-QL{C1i1Veh z0&*HB+iMB^BK{oKL)Mp&LkK^tlpOzHzJqHQL#=Kg`DJkS5Nym6op{ka$Q9Y}1DW8a zkdw58q6OLrXG|_67;=f|d4O(&Um(R`Lc3$D$De(%NQ*A4+dgRw(LsDIsu#zK^qL%D zSa5>xMBrMST_4k`g?YYNKhZF~GTwC*+;qtDT?gL$dZ#-tRvSwdD z-u2_tVrxRyZE%R(C;TR#m1p)IUJb&2%dTpg0K~f^(K?}C+KZnzt51r(1EpF2sUY(B z4D9an9fRz!_P_gsk5MVdwYS$hgMIn;I9iZSJsjtAAL?GZ~Vgs71Cj??qlzbX2A(ssQr z(cn&qL!Uv|kvb<8*Zsf=yO?v@I^N8#)$_D!oU$r&I{5sXMoO`Yan$|txmtvuib1m= z^#j{4clk>)_p)qPk!Vc6XN$|>u;gTx$wnF}dnCJ)WY3p62)oATq9-U+ko~!~D$cD6 zrIsEhN)Qtl?ARGk-Yz^1ua-uV0(-%!1EgGjQA|O#hGWGmLO8DC#&mnHZQdG0ubWK? z`uc@Ze^O`iG2bu@Q*a9$_mi*fHGx8>%B)8=YvF5Zg@Z>WGjN+b&&4`8zhG^e#C*==!!?k&Ebm28kIr|hpX4}k&Z)#G$ zG8Axz7&z?A-2*&^)DQYX9~zCEuOZaJjkOoZaT5-MqTP!LK<;sxA$Rp`nkb&P2AS`Y zM&KL|(D1!PY67`H1~l_r^Ea8zdzzo&Kh#Y=kPI(+EKny*R7tjC(^X!5T3^Cl8e`f) z!ZA7gOm#!s4%aJKWU0PlAc;jBKNN?G{AygrzVEA}>flZ3GB7GJuJpm4odA7O#8s(y zw-1Vr5Dh~K34B8Uh`PDmr{VIs4F|AWwIphd{Cu*#&jhHv_SZ%2in!?HsqcNtU}{4T zKLdlON3D#YEeQX{m!kyUoC>db&Qs?E{H)(=D^w5UtNavD7#bvy+lk(z1p`0|=J1eJ zzj7ywkS%{ZdO_0=FLl%z>B=XYmVLU?rVS|sdDr>goZ#n*n9Oa1L7%PEu`9)gdUKDC zS9kC}wpaGE>E$^UA#y>1@g%NX8fPzMq}@ojA5hX!1}Gc=DR{{G3bDz$!*8S;Ri}b< z7P4N`ASXE@N-e}*e%yf~(kgB@GeP57)+Vi+@}RgBYH4MD#?r9~&alyb;j~KBjF}kR zb(Pw-R0)ldxwk1V3?q^+wV|IQV@XW4oyO3gGJi6C?y%jt!rWZ3ogP1Zbp<4c&!2rq zdkY*{r6})T3+VA2z|>054OH`ZgEZb=mT5#8NODyO=VrtTCv}rPAHq)%n%8D^Zat^^ z61Y`e3M}5vty?h+t4Oe6#=j-7pa9>I}3n+vR}3?O_35SjWKqj2;AkL1Xdm(ba3JpvcC3(1 zqY(Pn=d;4Xaac&{e5|{fzk^t0StvyiMyilMnl&^SVv8A*jvnN0Z=;NIiMF(++A8ot6&ZTszL4a?-j7r<>s&N%e8d+&Hq7>js5q50Rba&LnI_4L26Edb3wt@o0V`u>CmYSb=FX)gnd`hw zk?50K=miC<`|m%sn%uW+qYpxleyITZ?fZ$Xc+kd?pkWspsRMaZfs~Ky=z0@W3aB54 z?0a4Z^~A~~fCEWe*hAa=lVB^B*B!8@B`DViwth&A4RqH&gEnuK{BUdzBIvhi``epV zfAO|O!rp*hu8sj>p#IZ0lD8+G?XoMZV1_*#AY!2!-)YkB3Ho;H?lOca$(yS+Tf;j@6f z5}9D-@Z)oABIrFKljaom%`j1Lht*3xZF{q@emS3p7r@BVaoAiWTUXvUqe$#Wpp_DY z+B|&{VBQ2)Oqnc$c(>0;?kKr}D9egtDBOxn5D=5@n3-Ep;0Zx>*kU)hT-n-2o_DXK zc9}Y8HZP=tT(i^Lh9)X$O!t;Y;4|w@{;IQ<{ciO#AkqPP5@P`uSrY@D4nVR7e-6Gw z5EOX^8cyi+<*Y_VYWam;QFF%iUSLU9$%Y+SX}IH&DB&Zm-j>R zrML8*__p_{S9gxM32<+lb%(7-i|gF|9Bnr{*ABWyN9s__K;9asX@UQRL0%WM@mkB! z_vIdrg-L1`4`*6a&n2kkCfb@L#!#&$0P@Z-MS|Vjq2%Cw;aF=?G%4o&tYt9Z1bj2W zZ+AAQC8JOK;E}={Pmo{FnP1mGwCO4)7o`Wd#h2*7yV#&qw`X&BQKr80oi4W*4F>dl z?qx99gRz)Ohm; z%QP3uSgmiiJ%fOLeIg=jQMZ~|**Sss1gNrVsjaCMI|I+6Q{Vmtvj0LQdpgJ% z`mL0?D*5+&Rxe}>GY4T$ACd?)xA`?gc!_({Ldr%w(ci$l4|#*B(-kVVxhYV{rj3fW z!+UpDB_+768O0=lFSt*9BgybSg=U<-L_t@TBtGtlb*78*fSxUeb(BCtA=S8FuUILU zG+#uR!+d-ba;%N>@}T(|PmP`XXNnz)-(!c3sk*t&!QwMydXquh!JPWsVlER0qfJH{ zbUav@tTl6wQA6R~h}oULs6d1%o5uyS?1djjHrXUqNC;lTl+tT7GK-xQk79QE`lcZdbLa`u`$8p{2OHSJT z#y5lW+Dj?hRY7X_#{m=M0wsLmIOFrXy+ig^p|>?Y-@e!*FDVP2WG(T>v&F145CME20< zy3z{2xe#nXa5lUY1r$Ai?29)oZa^pM3Ay0jkLpX)ovaDOdiFqX6c}>`W$_S;f zl3SzAM*tV{`MNW9>2rgu6Vfz9rtJgu1~?4`pWO&{wsQ<0FUVX(1@BTwMkdwV`i@L> zlusQC^R@V6Xx^U-G@<=q#!&1_3{Kzo=u(*26nh|~BZ^UXrqJp4K{RO;_+jQ^nc zsGn?_fHO*Ex(OdO*%%Ta|E>U+cch+QKe-F-=%8upGl1#rv)D=`NB0(INELzW zNa}!Ig~hF+8;md3Qw?6>6>27yb`EHGNZmC)l>$v|Ev&Z31>F1LH@&w*$*(Xb_Gq)MDAFE5d%hIpaNQEiH>C0zK( z{7%wnT36w?g0klxT*3DVe7lQ*F}9STA{axjlQ|(E2lh&N zX0+%|9r8C*Z-BX1kXkswQ`Z=H-N9-16?~v?G$2A}2oquygttR2sNi{_FPOI}uV6AZ z>v_*1?-B@tVb@gGNZkm>u$lJF&od1>&@hnwhCdNQ)XTNMa}H0k@X12An!$T~X~E6m zmsRlZI`ACTOkQT?QKVUb>o2r=C#9QB&^F4RF<1|nHP6TG z5!efqQqf;}e>3OUBaaJM+UWY`DR3dBz3gc~_h`#QEnph&M1AqBQludo_r3PlTAVmVA9<4UHR%-Ov&we+WiPAnDSa?q^7vZyD<4p?hy-aQ%f4 zwI&p28b}B@HBczi?9y*7)w|90BU&o+B&rk_kv){ZlZ~gvKSc~=qrG|;?PA8q$^=t`}pCmGa?eNU|JN$W>mcD8mxAM+~Qg%NY- zjywIxs#3Smnzv61{<@I*ZUKM=jPkA-Y&B;!iCJPbYSta)T(#ueBcYYm;jRZ^5?|we zqg4mhcqW$jz90o745?nz$()oPMpatiMmVexF3&tpvt&5)F5s|yOA!^>=NB-DB()Co zQihMihXdUYzS9p^S;Q#R57RwuzW+td9ykrrJP~cPH?;AxZ@l-|T4*=f6p4~KQk_F2 zkfItM(?|^I7^!{e9A5xIXD2$Q18!?UfcxYTX6qr+^JF}j9my|}R%&rUG)3U+PDe5A z)2%mhPlF(y!fb-t35Lan&dc9jQJ0jwQvMen@&(2uBhw_7GCE0$V&Ycp!vTTZHtajB zJqn@zD)H;`P@f!wyovNvBjoTR0?^+{6Wm13_R@pYD+`&= zKBc@Au|Pg2t~nK-KK#WNQ-W8b@eNe9KlH45y;vcde^&lRx33F37=;I#pj+J;nqa%7 z>F!CJNwvboBrzH*qp!^f-_%V@bdw0t9<(|_l@i|N?qFJ-@I0AT;l_oQ!>gS|h^C23 zN?Y-o+AEq{MJowm!q&iVsp;3(9y77Ky60*D3VuRQi|g&Q-E(AY|AqW*a+R#9y^%)Q zg8#Otx^3vzPQ+5)lDq#2WQeOwnBy@&Lbr~?4PaS?#tMdk~zEPb2LGtQ{w z;b?0pL`+AtYR^`)Kq53Hyn$gd;0sL&mrW6{Y7d43n{Lh^dW!yV@A>Ue5{%_S+C4jI z0P_nNXUm`b*{Jg+eHnBoUA35m^SSuqud8O}uDwD&j>&0dR$4WM?7((etC#=oL0cVh zeI4w&mw_hvvmNyzM`FeZxRc2<1xwR|pttvC9Q@??(4O?#xO9FJZiQ>$0(--fgl&~q zLz45ACt!ii=C_M&2(sSV?FH>;XRBzGvJw=}K$P%O(p6Gfh4K?<&P^9=#}pv&39yVc zg0cNJ3%1QG3X+rZ`278D%Dc?UiW89=Esd>jyzdw1SO13X9Km8X=ox-U4gTR~2Kx_@?=Z6-t1lGxgVv0h6ADek0HTe}HocG0Y zek?(MLRe+^TA%&Y`*0k^`lxmi|B*Ge43?z_Vp|^JLIHr@LGeli-o`W9o-zvyO|Ci{ zq-GRG;Au4Gt9T-P=MNRsiH{{a?q)|bB_JVE9tTcPL7hiIj2_aDVc`SfQ3ijVJj9>E zmyHQprAz@!M+_g!{+Ok@)vri|8q|+k<-U^D(Fi9%=3RWVOfa3;zP_d>dlbh>)52;I z-j&ZrbUiZ&(2HRU!x-jNjykF6aPZJzQ?CNnwRneiGYN!7lU%#eW0Kn1UY2~P*~9TC zJ<)sO%DNy76owr+eIXq&5HhJ4Z1_P*+pzs zko_w@IL#lA=*I|rg30dj{O(b^S)9E-}dgt&p?7N!raS-R>x=^ARf%7*eW24=2b(Klm zYP}A(KD_{Ej+cWy524BfP8U96XPHxzZ~3*XBptD;8OrjXvXK%mq&MoN*GgTFtY=6*>&QH$+N)g6D~h7qt+tl{7;W>1JrZR)wE6 z>p^zUZTp_K{mUBhweS@5k{^CTlN%QHV*WT=i&Mh7u4^JVZYJ4ph`S7E-i`)0E z8~OSKnyaZE=HmKS6~Zr4DUyUZBu;oQ3itBBJ2G`zx8A`Uzri{c%d*2ts?8uRBo+aq zbxMdBUakWaAR?~`en6>LX@BJ!oPv@w1;Gg|z7~&)m=TLXXE;#-`arT1qyjG39_ZQH zk4eZsnP!NF-sl|n`K{G0wQS~=v0HV#oIgtI^_uW{O^|gQpewH^D@KR|H#=&=07-#O zX6<9ttLGIy>+gPyU2^l#;W?K(Wsj^Vh7Qrum?^@Wk;yu5YIw}TGIH)?lAAuoh}q9r za8>rNI0~;^xglcxMlMk!G3b6@UfM2qpz^J@A?!*dV`DWQ>CpREFfAP7PEyj;Gh}}s zPiRogJ`ZZrQD0tnIW|U-#m6Q4EiTHlv=kFPUtvs(&Rb-DNKe)58W$#P7P43qRTzx_ zTHsEA>+PG$_g>Pgy6eY9<@L4z>Gsh72__fW=({!)NpBWU)eI&f55q`<5Eps;>X#p_ zU}*b5y(?kZu;nE-FHiOOf3@k={69GR|BnqJCy3dtDr;nVr5G4I0VZdMq5#(SS!Wk3 z$5aXzP0a&?b@PLaayj*Fd^S%8oW~j*RQzv+YFchIdSj1t(L&^eCRU-UoxY6~(?rvx zAbD6?9o=uU_5nM!?r6QrX2}+D8|7WlCe_PiLL(#Z*Y@Z8VL=ej24tB;> zDSqvn(YSFnM=Fw2!ri-Sd(x_ZrAr22RTOiJtFdCkXYKsmPLeBuRml8&b#n}QGqEAo zB$f5ge*L!lGfV@(v1>{CYJh=Q_Q;%-*{)6n z?#(?}22275&&+$t@e>z64Ie>IsHb9&lhN2!fER1N?<73=ed*jKT9B4j5Cnl^P>cDw zzuN`cbf;x*+tsTca&7PcQmIr#HQdiJk}^aoh9n*}qFi4mg@piYJ+5u#59g-mse~V) zsZ2gER{?Y`-pqgmo;jXp#3~sW+}1LAf^j%P8Muo6Wx?Urw-; z4PPRt1w*pTLsrF?^ZSK`w`C_W^^N#z+U$qd0@7WVnx~TaR?MIC(}ZbQE&FV|iW;-L=5_n|bLdCkD223w7=W z7{XUP;#i*}WS1F+55z4-$ zU5wdo!c{H!FZu0ke1j^SPJ~~qvMMYxd25E>u+lA@#%{$|GV4PQT7rl`eq<7xRAV`1 zCd?nw_1ImDRP`_=a5I33vDXLbRFJV0Gt(6`!9v8==AVGMAhDEP6sy2t;BG8IS zY6y|ZE@Yid=9PhmDs(^37ECeA_qqbq2CvasLg0!cXF=R|Du}jv*9~%cVKJl%(%5mGiWgEEw4&5Y zAGoXtD*KLHFndIkV)Kyx^F!57aMdp10zsZ3byDcS_zAl;3Y6zk6vZ^)^M?qhol$8~ z_6u^8l$MDmLfO9IN3k&Rs|<7?lJ0lc_XQMj9%Y*F(eqtkEbeTx02#>eofTL8!)ly= z=XKj$lDu$Peh{#zj7eO`M0@f4`}Ur|b4No}{syE*-d!FDAWoE9kbNjHh64suHVO=z z7~Sc_`_vc%*4R!?#Am$!xo~ZLXal1hj4O()pT>R#`R1@kqRGN<&4P?Fdpv?Ha-m!H z)#!LF9thRZ9Iw9M;X>Bnv?@Xrg>p`^(E*=q;s`&$27?o;MSm`1#oPC2j2~KA9x~h> zBeU0!h9EkVzV>!p@Eti@E-XU;@E72?{m8PVeO5F}dc~?CV&{cEO#SpCVH@5S@3MTT z9Ktw_LWT)kqm+=29B}5WplUgJezYUrd)ODoM#lQYZ}O5zyeObw)A#u;^!xmNMZ@zq zKF_13N;v!F+s1e~C>K+*aiF&!O7#mNIKaPsMA0g=pN1oAhSd!cH7@{qPhW}yzl-4= zit?-|V=#z}CCs79+SMp;npNRU3bCA^uXAu_DuUZ35wt%VJ&p-PN$53UC*Gq5Ud1RD z_3NVm71U#nDXZ(I;Z=uJq4hnx2nWoMmzTLcc!SP;kYGhSC_6NX2p-j4Ram2sPdR(z z941*u4@EB4+d|h%;eZ{weKh4`jKQpGlsC|dc>Vt;C4;Wz5FdAHo2Rnd1?_o_88nA2z>xQxW-JoijV;XS)fs9po6Sm(}2Hweu4OI!c7SzUxR<3)% zG|vvKW5YUKev|C?NvuM@#a@|$0(EcmPGqF*z#?mn#bBty|{{wV*(sCR3Hniibfq@O30M%ospM?~x?qr@$w^c>N? z7$(gLy1l`t$l!Uq1t{Nqrb|Hf^>MS%9Qa;kMu@5;uk#wHPqCkSE|vtbUEnS`%T_r~ zsVP>J@2?xe4w=07V-7pqe%*qerQQ72eCV$d7IBwvgSuhaZ80;_$K@)PGBZda1C@;keU){C`=iKJUNRs*v}2AC9u z96c35N%s5*6bkX;<@EaVrx;tDdQhlTJ|)7>zTRsoA@|9Ff(N)Wo0ZD|d2G6!evGmy zg3HZB-71PsaJ1D&_70g!LL9uUlYi}Q8r&*M;$+txcxM0g5QgE0FZK5iF5r1f==#Y8 zmbu>vk~j7GObYH4DFj@LS$N;A09?lXGsDARm9^0U*;ETduzdG8?G@)0N^p%v~X$ zaIB11;T&KHsSvLX-z(1xY}ko8v4 z49s9fI5tHmau6$|5ksp+t5;iWjCOR@W@UVAS+qc}24OGUen&&-5>`GdwBhV2R0)7c zu9U_Z9?To8R%>XOZtmI{MOuoCsQi;ESfP*r`#t#ED@JR{RN+ zjw>io>wy1Sg%6s@%^Tj$3r^Q4#8VPXs@uH~fz& zal84EU%dXGST)>L(AgZ^lcSfghJ1&l)1wpy)1=&X>Ya63?m~AJfU{EiPOY~6a0vHA zQyfFmf_iaDY%U$p;%o1+#RgE=2@2lkfv+0VLN2XKv-?S;m#f6)7RAcxyp~DdZa+)% zHa=k5R2o%`{uv$5Ng!278Or9+GEAn{?h;7}T?&V%9sS#&FIXS;f8{;uD&48dViU?q zetSaNo35z@%^*kBY%@ZOB3tSyUV*Cd5X%CV_PqT$Mx=m;3-}YzTC!u-Myg{C%7knu zdHMo>Ifq&^+oE-SI3UQXnz&7Ihsdz1HeH)>RC9%3db4ww%7k{o2|-kgOeX{ir!oFr zoFU0o66idS=Rq;bDqwZtgNw0gg!&V{NnuE=dcYGEX=we*n!8RdYjB?dq}y96?RiJg z#yp|rz~@GS;(ut8&t*EeiR5PlG+R)yD;jqscMob~RE0GryHiWMXU}F-@P^SA>$1C? z1-k3BWS5F2JY+|H%K8Vy8&~+S)cZ|ZOze*vE&+4^(N2|Hp&41|%H#Ur7WoCYCB|sa z9Wm8=Sc{*c$|@5H2akc5f2l0k5W-wZW??1^;Np|_6-G1xe=9|m`eF>P{I10oJ^9Ehwg=0Jl@83mo{{ci$M>1_ z+Qqe+D|f+9V^hWt1|m`8dt?nMKjrs6IkXCw>~3>OjzBST*}cc`~GLvT7IvO{fzh&o{qa{u}rKLzm=tEXI&t%Q1gam zGE011y#Z{UCXbhV?nLFZC4jgK+zWNg)embq!h+Bj%dHBl2V8<$*UN8(J95vEG6CP> zj-D(nOz4N zyp);h&qT>YX@*9F*`fiBe`YB~fjS^02mxZkE%pLfM_7ce;1>vo`a-?HaD*nv?UgFP zb7at)-KI>PeJ{VPjJ^fz-%jCw3xCMh9owQ{2~24`eOLUc?ciYrwD1uf@(j_wDy zj=>~gLH+N6Lu?=8JSj&;#d}EaznpqWr!K8(TEL*~mF5z=+?R)q1XV47Xf^bhjd2cE zREcD~J|LeR+*~i({iek7eT&s+Ag*NU3K2LQ^^_*-^s1B4^|IU zlqDa%1GAiv%zTD<;OvB;o^j{p4!iQmRk)k~-IDje;GTgNK!nMmT0CV;O0F>)lbKsI z%X{&-I9*s{P|b(_0Gsuz6$`0};4BZ|%w|B!6Vb(}AR7NkSsjXOTOOTNwvEEO?f>)`ny8d=OMS-lVwg-0S;;77J3e@y3;8Rmd`Rn>Gg@v&9@{6B0dwpDp6aP`rf z>rdy2p6-8B*bzKF+<#SlD}vG&A0rX*u^F0@)W`t=v45fEdBy~tmg}@O84;i>>P@;g z3SaH({W=>yBdop0<>r;Gf(V@B5H&Pm(KqG?q<5|L!N%KnWaKWP8f8VaQAL<1=8`skU&C09(=r`yAoYK9EZR6VRd4VvA87lCD> z85>z5c(2#y_O5PodT^*4^E3cqa`b|xghgyiE@d_Ji9x%|IBuw5cG+nFi?esD%vV_V zMwLYW^f}J3a9V^dh1BW^!J?wBbpji!L_0tL3Yn+w*s`5LqU^Q*{|fn)eXE?o)2vn} zDX~;cj*Xz=EqdXyE-NGV z`UgS-6m_R2@0UA4AQ2*p>b<*+apYgOxT=Zk{8HV7VJ<+M*I$pWZRB~(`fD!agKFw8 z^0V_l0EuggeJ(m!2CcEZKQuJA--0|caVkd_9PTVTmOCUU)SUGyUIAs{vXT&)XuN;S zXpk2rDKd6BsmUdC+{IG)yv`YR%!U%`PWO?xckBdfT^RL11(Df(oy<_Xj3^_CWj3fJ zFNeIlk=dNfB469+{NGJK6-oi)2_z)gc`r3wZ_gFYAE5yjlg6OHyv_u~?(Dz85@PRN z+lkQy!H)ot^Ki85H5zAugvr_`)M_=Ha?qN;7NDrb6NB(r=cYjo0@D#Y>&pzF?f^LI zp+ct+TtPM8P__UF10%f-n-iqVI+wO9DWV3;;5U)Z6}^hOw%}#P;zUum((WF4>p_>W zO~Z7)JMvZ95Uo9Bod&hPdq$n^kW&YmKJp#5<23I^g}{FQn!82!m#T}#C=!yOJ&9pm z&sAX6BxH_py;3TNj0ogL>`-U(`EoWq%L-(vq6Sl@T%BIJ1tf#3CtjG}I^=ri>*wiY znOBes1tlYuqQX+|j6B94me7lALyN+dCF#3T@EH%-`?6hIS_jRJ9u$$t6t+fHX&}x? zbYS7YhrQsB>?=p~#JrxdlKNA@#`exFPmi2bgL_GLX#gn~75xEFgB|hqXL$2oSj_$X zvmFW`_HR(Qr47zg`6m;nQr%f1cS@pcuEslWn}yxKL@$XL zXkk#pTUPH6=$Y4!ot>}I4_G;e>+8!4j=3_BliigFO>VjkC9-BQk{ktlh5FqdVZEOdhEPv@|~q zgoohiiDOs&eSkgM;SP>v!K2QbAg`YX^1aLS=LtU>CT{AUzB~nhzW^ah^@16^j}IM% z?BLdVCVaSSgL^N+B=oD9>g!KJLa6y}W(KE{Ry$P3#flU2OflyFz>U852AF$@{wr1WICXjaxf^rj`+`nl+=IQf$=<2fT9iAhY89z(# zRwZA2suNp^vc{dQXsM%h=mX=tmS*5|$XyL5IB$Of;8ybg3kLIo)4{?THDZ!-Y6?%^pu7EuLYs$C$s7yA_WbOHQtpOpO+AO7 zA$=Y{oCg&I@XJfnMQ6Mh;*n{2e21IluAY1Ri)iDPsr7Z*#u^mJqR!qB>VKoBp(SBe z-!q(5b;DxAO2wof;rn-VB~HDq%ME!3m1kg|2@!JI4r literal 0 HcmV?d00001 diff --git a/scripts/heicbuild/testdata/chroma444.heic b/scripts/heicbuild/testdata/chroma444.heic new file mode 100644 index 0000000000000000000000000000000000000000..d08b5fb8fe5dbbedb8613366ea6242b4bce694c6 GIT binary patch literal 21527 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 literal 0 HcmV?d00001 diff --git a/scripts/heicbuild/testdata/thumb.heic b/scripts/heicbuild/testdata/thumb.heic new file mode 100644 index 0000000000000000000000000000000000000000..ab28ecd2e527c5d7571df8f9a757cfa98a87de45 GIT binary patch literal 20337 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%0DTb-mlIHC$yG(<6uO?xCio=-oP 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 NOPuuST3Yt{;jT`S3Jd@M literal 0 HcmV?d00001 diff --git a/scripts/heicguest/decoder.json b/scripts/heicguest/decoder.json index 2122f55d..03d18b39 100644 --- a/scripts/heicguest/decoder.json +++ b/scripts/heicguest/decoder.json @@ -23,12 +23,16 @@ "scripts/heicbuild/fixture.go": "dd205a231c22f464ff86a5d922e1ee95bdca03f1e4b1ac864439cf4fdea9b512", "scripts/heicbuild/main.go": "17daa03d417139ac4b2639749871bae48e8f72290804a7a2d13776ac5669360f", "scripts/heicbuild/source.go": "fa21510be758ac3a4634e0db028f0920747c9efb05bc903c2c4429bed0d46857", - "scripts/heicbuild/testdata/README.md": "72e49786cb220bf0f46e95de5816379218f740b89c8766222495b0b5235381e7", + "scripts/heicbuild/testdata/README.md": "bad7e52474096919ae14e0d82cddb5bc73b79434473f9402c1c82ada91ae19f5", "scripts/heicbuild/testdata/alpha.heic": "130c9f6c9a9bdefe2fc4b17427ff37b78423f2d3a935f82cfe55a9782f6d0f51", "scripts/heicbuild/testdata/basic.heic": "b3e3ee1e64f7ae42948bd9f83465c9ea110116a662d603d677d3ff262b8e4cfe", + "scripts/heicbuild/testdata/chroma422.heic": "66ab3939ee65e456c5dd251c11c3bbc06988a97b3204fe07783a3099c5feac03", + "scripts/heicbuild/testdata/chroma444.heic": "922d8b5fbc5016b03c23fb1cbb8a481055657134c05197b264c56a2d124b5dca", + "scripts/heicbuild/testdata/lossless.heic": "ed6be32433f7faa64fea894ecf8119fbdffbdc91420d7d08933812577ace594a", "scripts/heicbuild/testdata/main10.heic": "b3e3ee1e64f7ae42948bd9f83465c9ea110116a662d603d677d3ff262b8e4cfe", "scripts/heicbuild/testdata/photo-gradient.heic.gz": "231ad09fcb41297c9c1facf29cbd2249b3f9e945dda6b71cd81bdb18e226c183", "scripts/heicbuild/testdata/tenbit.heic": "e8026ee08b531a212a29250b66f663e36fc3fb953ce7d7c5d7c9ed048e499eba", + "scripts/heicbuild/testdata/thumb.heic": "45c4dd0be12e0dc796ec057ba783ac8e6dfac04351a3b93279a430d9c0017531", "scripts/heicguest/fixturegen/main.go": "b5bc075560ca280ff6b37b50cc48d4758e03c726c0c3235fc3accb28f402701b", "scripts/heicguest/fixturephoto/main.go": "798bfc8742bb2a16fb69d4a31d70e71960c702123108aaf0f47c3b1d2509f474", "scripts/heicguest/go.mod": "d14233c7c06337b99f56f934d76a99a8ac94086b13cc2176ce3fa9920f7ff1a5", diff --git a/scripts/qodanaconfig/main.go b/scripts/qodanaconfig/main.go new file mode 100644 index 00000000..14f48d56 --- /dev/null +++ b/scripts/qodanaconfig/main.go @@ -0,0 +1,25 @@ +// Command qodanaconfig validates YAML before the exclusion inventory check. +package main + +import ( + "fmt" + "os" + + "go.yaml.in/yaml/v3" +) + +func main() { + data, err := os.ReadFile("qodana.yaml") + if err == nil { + err = validate(data) + } + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "invalid qodana.yaml: %v\n", err) + os.Exit(1) + } +} + +func validate(data []byte) error { + var document map[string]any + return yaml.Unmarshal(data, &document) +} diff --git a/scripts/qodanaconfig/main_test.go b/scripts/qodanaconfig/main_test.go new file mode 100644 index 00000000..853954f8 --- /dev/null +++ b/scripts/qodanaconfig/main_test.go @@ -0,0 +1,22 @@ +package main + +import "testing" + +func TestValidateQodanaSyntax(t *testing.T) { + for _, tt := range []struct { + name, data string + valid bool + }{ + {"ordinary configuration", "version: \"1.0\"\nexclude:\n - name: DuplicatedCode\n paths:\n - sample_test.go\n", true}, + {"unfinished sequence", "version: \"1.0\"\nexclude: [\n", false}, + {"duplicate root key", "exclude: []\nexclude: []\n", false}, + {"commented parent mapping", "version: \"1.0\"\n#exclude:\n - name: DuplicatedCode\n", false}, + {"sequence root", "- DuplicatedCode\n", false}, + } { + t.Run(tt.name, func(t *testing.T) { + if err := validate([]byte(tt.data)); (err == nil) != tt.valid { + t.Fatalf("valid = %v, error = %v", tt.valid, err) + } + }) + } +} diff --git a/todos.md b/todos.md index 3843d1ae..5c43d837 100644 --- a/todos.md +++ b/todos.md @@ -90,59 +90,46 @@ do not authorize restoring a decoder. Restoration work is authorized and tracked in [the active plan](plans/2026-09-15-isolated-heic-restoration.md) and -[draft PR #28](https://github.com/frathe/picfetch/pull/28). Local source access is -resolved. The pinned WASI development guest, NRGBA8/NRGBA64 protocol, ordinary -fixtures and reproducible source/artifact/import guards are present. A signed -macOS App Sandbox helper now passes owned file/network-denial, ordinary decode -and cancellation checks. Its bounded parent transport passes owned crash, -blocked-writer timeout and diagnostic tests. Ronin accepted the absent hard total -native-memory cap on macOS; WASM/IPC/deadline/sandbox protections remain mandatory. -The compiler needs a helper-only executable-memory entitlement; the interpreter -timed out on an ordinary 12-megapixel fixture under the same deadline. -Production decoding remains disabled pending native Linux/Windows/Intel -qualification, distribution-package verification and representative camera -compatibility checks. The historical maintained h265 production copy is restored -with exact baseline/replacement guards; its native qualification is in progress. -Intel passed sandbox/small-image checks but the 12MP compiler fixture reached -the initial 30-second deadline. A documented finite 60-second candidate retains -all other bounds; fresh native timing and full packaged qualification remain open. See -[qualification evidence](docs/heic/qualification.md). -The Linux no-cgo amd64/arm64 candidate now cross-builds with a synchronized -default-deny runtime policy and verified-before-input address-space controls. -Its native guard matrix is wired; actual Linux execution remains pending CI. -Windows now has suspended AppContainer creation, explicit stdio handles and -Job Object process/commit-memory/CPU/kill-on-close restrictions. The child -verifies token/job state before readiness. AMD64/ARM64 cross-builds and Windows -vet pass; native controls and ordinary fixtures await `heic-windows` CI. -Dedicated helper permissions and MSIX packaging remain qualification gates. -Package staging now records fixed helper paths, post-signing hashes and exact -notices. The complete macOS app and nested helper pass strict signature checks. -The updater now preserves authenticated companion files and rollback; native -macOS controls verify the complete signed bundle after install and rollback. -The released updater still omits the first helper-bearing package and deletes -its cache, leaving a macOS signature mismatch. That initial transition requires -a complete package reinstall or separately qualified bridge before release. -Windows Authenticode/MSIX execution and native CI remain unverified. -The complete implementation checkpoint and its remaining qualification gates -are tracked in draft PR #28. The earlier P0-only signing attempt failed without -publishing; the current checkpoint includes the subsequent integration work. -The shared client lane and bounded pipe service are implemented with fair -foreground/background admission, grant-before-read, framed canonical output -and joined cancellation. Inherited analysis pipe components pass native macOS -subprocess tests; Windows native execution remains pending. The canonical -imaging Reader/Source now passes admission, metadata, pixel-fidelity and ordinary -format regressions. Application ownership and GUI/analysis consumer injection -are implemented with joined shutdown. Native activation and compatibility -qualification remain open; construction currently supplies no HEIC owner. -Additional [ordinary compatibility checks](docs/heic/compatibility-2026-09-16.md) -cover real-helper synthetic metadata/orientation, alpha and a known ten-bit -ramp. One hash-verified public-domain Samsung S23 Ultra photograph decodes in -20.414 seconds with correct upright dimensions and metadata. Its P3 pixels -differ from color-managed ImageIO; broader camera and faithful color claims -remain unqualified. Faithful ICC/wide-gamut/PQ/HLG/gain-map display is not implemented: -the decoder leaves source-space RGB and the guest drops the color description. -These color classes are not deliberately rejected. This is a support boundary, -not a claim that more test fixtures would establish HDR/color management. +[draft PR #28](https://github.com/frathe/picfetch/pull/28). The signed `52ed2df` +checkpoint publishes the maintained-source WASI guest, native helper boundaries, +shared GUI/analysis admission, canonical imaging integration and authenticated +package/update handling. Production construction still supplies no HEIC owner. + +The September 16 [history reconciliation](docs/heic/history-reconciliation.md) +accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files +were preserved byte for byte. It restores the current app-wide threat model, +fixed WASM backing storage, Qodana YAML guard, four ordinary fixtures and Fyne +metadata ignore rule. Focused race/interpreter tests, native Apple Silicon +guards, build/provenance/import checks and GoLand inspections pass. No complete +historical decoder-suite equivalence is claimed. + +Remaining qualification: + +- Fresh native CI must exercise the restored memory configuration. On baseline + `52ed2df`, Linux amd64/arm64 and macOS Intel/Apple Silicon helper guards and + all UI race shards pass; Windows HEIC guards and the non-UI Linux race job + fail. The CI/GitHub review agent remains paused at Ronin's request. Review + reports and required CI must be addressed before acceptance. Local canonical + shard verification is unavailable because the Docker daemon is stopped. +- Ronin accepted the absent hard total native-memory cap on macOS. WASM, + transport, deadline and sandbox controls remain mandatory; helper-only + executable-memory permission is required. The compiler succeeds on the + ordinary 12MP fixture; the interpreter reaches the finite deadline. +- Complete distribution-package, Windows Authenticode/MSIX and upgrade + qualification remain open. The released updater drops the new helper and + deletes staging, leaving an invalid macOS enclosing signature. The first + transition requires a complete reinstall or a separately qualified bridge. +- [Compatibility evidence](docs/heic/compatibility-2026-09-16.md) covers ordinary + synthetic metadata/orientation, alpha and ten-bit transport plus one verified + Samsung S23 Ultra photo. Broader camera coverage remains open. Faithful + ICC/wide-gamut/PQ/HLG/gain-map display is absent and those color classes are + not deliberately rejected; more fixtures alone cannot establish it. +- The initial cloud foundation commit is unsigned; the PR's signing prerequisite + remains open. No history rewrite, merge, release or production activation is + authorized by this reconciliation. + +See [qualification evidence](docs/heic/qualification.md) and the current +[threat model](THREAT-MODEL.md) for controls and accepted limitations. The [independent alternatives](docs/image-codec-alternatives-2026-09-15.md#heic-alternatives) include libheif/libde265 with LGPL distribution work and hpvcd with unresolved From 08a71f257108e77a485f8f53debab03e125043a1 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 09:43:20 +0200 Subject: [PATCH 06/30] Withdraw eager WASM allocation after native Linux regression --- THREAT-MODEL.md | 13 ++--- docs/heic/history-reconciliation.md | 47 +++++++++++++---- docs/heic/qualification.md | 13 ++--- internal/heicdecode/worker/runtime.go | 15 ++---- internal/heicdecode/worker/runtime_test.go | 50 ++----------------- plans/2026-09-15-isolated-heic-restoration.md | 18 +++++++ todos.md | 7 +-- 7 files changed, 80 insertions(+), 83 deletions(-) diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index ebc8fdbd..3186a946 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -123,10 +123,11 @@ HEIC refusal does not trigger parent metadata parsing or RAW/JPEG fallback. The [runtime](internal/heicdecode/worker/runtime.go) supplies bounded standard streams without guest filesystem mounts, environment, clock, randomness or -sockets. It caps WASM linear memory at **1 GiB** and reserves the capped backing -store once to avoid transient old/new buffers on growth. This does not cap the -native Go/wazero process or parent/cached pixel storage. The native Go memory -target remains soft. +sockets. It caps WASM linear memory at **1 GiB**. Growth can temporarily retain +old and replacement backing buffers; the linear-memory ceiling does not cover +that overlap, the native Go/wazero process or parent/cached pixels. Eager +reservation was rejected after it broke native Linux qualification. The native +Go memory target remains soft. [Limits](internal/heicdecode/limits.go) permit at most **64 MiB encoded input**, **64 million pixels**, **256,000,000 output bytes**, **64 KiB normalized metadata**, @@ -151,8 +152,8 @@ boundaries. A decoder failure, runtime compromise and OS sandbox escape are separate events. The fixed module, Go, wazero and kernel are trusted components; containment is not proof of absence of defects. See the qualification record for native execution evidence, executable-memory tradeoff and incomplete package -checks. A stricter memory reservation may refuse a job when native headroom is -insufficient; raising limits or dropping isolation is not a fallback. +checks. Insufficient native headroom may refuse a job; raising limits or +dropping isolation is not a fallback. Container transforms run in the guest. ICC/wide-gamut/HDR presentation is not implemented: some such files can decode into untagged pixels rather than being diff --git a/docs/heic/history-reconciliation.md b/docs/heic/history-reconciliation.md index 24c81b1e..a1461bb5 100644 --- a/docs/heic/history-reconciliation.md +++ b/docs/heic/history-reconciliation.md @@ -17,7 +17,7 @@ existing Deep plan rather than replacing the new helper architecture. | --- | --- | | Preserved decoder hardening | Compare all 107 `PICFETCH-SOURCE.json` entries byte for byte against `fc127b44`; `make check-heic-wasm`. | | Qodana YAML rejected before path checks | `go test ./scripts/qodanaconfig`; actual Make gate rejects malformed YAML in an isolated temporary checkout. | -| Fixed guest backing storage and unchanged ceiling | `TestRuntimeMemoryGrowthReusesBacking` under compiler and interpreter; owned runtime regression suite and native macOS helper tests. | +| Evaluate historical eager memory allocation without breaking isolation | Trial runtime/native guards, then restore the prior allocation strategy if current native constraints reject it; keep all memory and sandbox limits unchanged. | | Useful ordinary compatibility coverage restored | `make test-h265` through the fixed WASI artifact; exact fixture hashes/provenance in testdata README. | | Current app-wide threat model | Check relative links and review every changed assertion against the current source/qualification record. | | Reviewable publication | Focused tests, build/provenance/import/Qodana/shard checks, GoLand inspections, signed commit and matching GitHub PR head. | @@ -40,10 +40,10 @@ non-vendored path changed by that commit, grouped by responsibility. | `go.mod`, `go.sum` | Current root/guest replacements select the exact maintained h265 source; removed Rust decoder remains absent. | | `internal/heicdecode/client.go`, `command_unix.go`, `command_windows.go`, `worker.go` | Replaced by dedicated `cmd/picfetch-heic-worker`, `client/`, `worker/` and `winisolation/`, with shared app-family admission and native restrictions. Do not restore self-execution/ordinary-privilege launch. | | `internal/heicdecode/register.go`, `internal/imaging/heic.go` | Replaced by explicit injected `imaging.Reader`/`Source`; production activation remains disabled instead of globally registering HEIC. | -| `internal/heicdecode/runtime.go` | Replaced by `worker/runtime.go`; restore capped one-time backing storage with a real memory-growth regression. | +| `internal/heicdecode/runtime.go` | Replaced by `worker/runtime.go`. Historical eager maximum-capacity allocation was trialed, then withdrawn after native Linux failures; the existing linear/native ceilings remain unchanged. | | `internal/heicdecode/wire/wire.go` | Current codec-free request/response/readiness/metadata protocol replaces it; retains bounded NRGBA8/NRGBA64 transport. | | `internal/heicdecode/decoder.json`, `decoder.wasm`, `scripts/heicwasm/main.go`, `scripts/heicwasmbuild/main.go` | Superseded by separate `scripts/heicguest`, `scripts/heicbuild`, its exact manifest and helper-only embedded artifact. | -| `internal/heicdecode/client_test.go`, `runtime_test.go`, `testdata/capabilities/main.go` | Current owned process/IPC/memory/cancellation/capability tests cover the new boundary. Restore the omitted memory-growth allocation property; old test binaries and protocol are not current tests. | +| `internal/heicdecode/client_test.go`, `runtime_test.go`, `testdata/capabilities/main.go` | Current owned process/IPC/memory/cancellation/capability tests cover the new boundary. Current ceiling/cancellation tests remain; the trial stable-backing regression was removed with the incompatible eager-allocation option. Old test binaries and protocol are not current tests. | | `internal/imaging/exif.go`, `loader.go`, `internal/similarity/analyze.go`, `facts.go`, `search_worker.go`, `internal/ui/exifwin/metadata.go`, `filework.go` | Current injected reader and shared analysis pipes propagate context, validated pixels and metadata; byte-only helpers refuse HEIC/native preview fallback. | | `internal/imaging/heic_test.go` | Current source, native-helper and guest tests cover admission, upright metadata/pixels, cancellation, alpha and explicit ten-bit output. Extend ordinary container/chroma coverage below; no claim of full historical test equivalence. | | `internal/imaging/heic_leak_test.go` | Legacy in-process/RSS comparison does not qualify the new process-family budget. Native memory/cleanup guards and platform qualification replace that claim. | @@ -88,9 +88,10 @@ historical evidence; it is not copied as an assertion of current behavior. - Before changes, the actual Make exclusion-check recipe accepted malformed `exclude: [` YAML (exit 0) in an isolated temporary repository. -- Before memory preallocation, both owned memory-growth regression cases - failed because growth replaced the backing buffer; restoring the setting - passes while preserving refusal above the two-page ceiling. +- In the allocation trial, both owned memory-growth regression cases first + failed because growth replaced the backing buffer, then passed with eager + reservation while preserving ceiling refusal. This was not sufficient native + qualification; the option and its pointer-stability test were later removed. - The YAML validator's five cases pass. The actual Make gate now rejects the same malformed YAML and accepts valid configuration. Exact Qodana exclusions include the new test file. @@ -103,8 +104,8 @@ historical evidence; it is not copied as an assertion of current behavior. assets/notices, source and artifact reproducibility, native import guards, vet and build. The initial restricted-cache failure was rerun with access to the existing Go cache; no source or policy was weakened. -- `make heic-native-macos` passes all four required Apple Silicon guards with - preallocation enabled: sandbox/readiness/decode/cancellation, both runtime +- `make heic-native-macos` passes all four required Apple Silicon guards during + the preallocation trial: sandbox/readiness/decode/cancellation, both runtime engines, signed bundle install/rollback, and the legacy upgrade limitation. The interpreter's expected deadline is a successful containment check, not a claim that it decoded the 12MP image. @@ -125,5 +126,31 @@ the resulting commit and remote-head verification. Production activation and the separately paused CI/GitHub review loop are outside this reconciliation's completion claim. At baseline `52ed2df`, native Linux/macOS guards and all UI race shards passed, while Windows HEIC guards and the non-UI Linux race job -failed. Those results do not qualify the new memory configuration on other -platforms; fresh CI is required. +failed. Fresh CI must verify the reconciliation and its native Linux correction. + +### Native Linux regression caught before handoff + +Signed trial commit `30f5b10` reached PR #28 and triggered native CI run +[35064245412](https://github.com/frathe/picfetch/actions/runs/35064245412). +Both Linux architectures failed `TestNativeSandboxHelper` on the ordinary +ten-bit and 12MP fixtures; they passed at `52ed2df`. The amd64 event artifact +records a closed response pipe and `HEIC helper exceeded diagnostic limit` +for both fixtures. The native policy guard itself passed. Bounded diagnostics +intentionally discard content, so no exact inner fatal message is claimed. + +The only production runtime change was `WithMemoryCapacityFromMax(true)`. +Eager allocation competes with host/runtime mappings under the 2 GiB Linux +address-space ceiling, but the precise allocation-versus-policy mechanism is +not established by the captured error. The useful-omissions scope does not +justify a new allocator or a larger security budget. Restore `runtime.go` and +`runtime_test.go` exactly to `52ed2df`, retaining the existing ceiling tests, +and require the unchanged native Linux guards to pass again. All sandbox, +WASM/native memory, diagnostic and deadline limits remain intact. The other +restored omissions remain included. Current threat/qualification records +explicitly retain transient backing-buffer overlap as a limitation. + +After withdrawing the option, focused worker race tests pass (14.419 s), as do +interpreter memory/cancellation tests (0.303 s). Both restored runtime files +have clear GoLand inspections and exactly match `52ed2df`. The subsequent PR +CI run is the required native Linux confirmation; its status is reported in the +PR description and final handoff rather than inferred from local Mac results. diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md index bba00550..bbd01a8c 100644 --- a/docs/heic/qualification.md +++ b/docs/heic/qualification.md @@ -117,12 +117,13 @@ only the generated explicit-depth gradient is used as ten-bit evidence. ## Resource and compatibility limits -The WASI runtime reserves its capped backing store once; memory growth reuses -that store instead of temporarily retaining old and replacement guest buffers. -An owned two-page module tests stable backing storage and ceiling refusal for -both explicit module maxima and the runtime-imposed maximum. This is not a -whole-helper RSS guarantee; it increases up-front virtual memory reservation, -so native platform qualification must include this configuration. +The WASI runtime enforces a linear-memory ceiling, but guest growth can +temporarily retain old and replacement backing buffers. Eager maximum-capacity +allocation was trialed during history reconciliation and passed local runtime +and native Apple Silicon tests. It broke both native Linux architectures on +ordinary fixtures, so it was withdrawn without raising limits or relaxing +seccomp. Neither allocation strategy establishes a whole-helper RSS guarantee. +See [the reconciliation evidence](history-reconciliation.md). The candidate production maxima remain 64 MiB input, 64M pixels, 256,000,000 output bytes, 64 KiB normalized metadata, 4096-byte diagnostics, 60 seconds, diff --git a/internal/heicdecode/worker/runtime.go b/internal/heicdecode/worker/runtime.go index 3799cc51..2647405b 100644 --- a/internal/heicdecode/worker/runtime.go +++ b/internal/heicdecode/worker/runtime.go @@ -29,7 +29,10 @@ func execute(ctx context.Context, module []byte, stdin io.Reader, stdout, stderr } ctx, cancel := context.WithTimeout(ctx, limits.Timeout) defer cancel() - runtime := newGuestRuntime(ctx, limits) + config := runtimeConfig(). + WithMemoryLimitPages(uint32(limits.WASMMemoryBytes / (64 * 1024))). + WithCloseOnContextDone(true) + runtime := wazero.NewRuntimeWithConfig(ctx, config) defer func() { _ = runtime.Close(context.Background()) }() if _, err := wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { return err @@ -52,16 +55,6 @@ func execute(ctx context.Context, module []byte, stdin io.Reader, stdout, stderr return err } -func newGuestRuntime(ctx context.Context, limits heicdecode.Limits) wazero.Runtime { - // Reserve the capped backing store once so growth cannot transiently retain - // both an old and a replacement guest buffer. Host memory is still separate. - config := runtimeConfig(). - WithMemoryLimitPages(uint32(limits.WASMMemoryBytes / (64 * 1024))). - WithMemoryCapacityFromMax(true). - WithCloseOnContextDone(true) - return wazero.NewRuntimeWithConfig(ctx, config) -} - type limitedWriter struct { writer io.Writer remaining int64 diff --git a/internal/heicdecode/worker/runtime_test.go b/internal/heicdecode/worker/runtime_test.go index 88e3b65a..53e1ab9d 100644 --- a/internal/heicdecode/worker/runtime_test.go +++ b/internal/heicdecode/worker/runtime_test.go @@ -73,50 +73,6 @@ func TestRuntimeCancelsOwnedLoop(t *testing.T) { } } -func TestRuntimeMemoryGrowthReusesBacking(t *testing.T) { - for _, explicitMax := range []bool{false, true} { - name := "runtime maximum" - memorySection := []byte{5, 3, 1, 0, 1} - if explicitMax { - name = "module maximum" - memorySection = []byte{5, 4, 1, 1, 1, 2} - } - t.Run(name, func(t *testing.T) { - ctx := context.Background() - limits := heicdecode.DefaultLimits(0) - limits.WASMMemoryBytes = 2 * 64 * 1024 - runtime := newGuestRuntime(ctx, limits) - defer func() { _ = runtime.Close(ctx) }() - // An owned module exports one page of memory and no code/imports. - moduleBytes := append([]byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0}, memorySection...) - moduleBytes = append(moduleBytes, 7, 10, 1, 6, 'm', 'e', 'm', 'o', 'r', 'y', 2, 0) - module, err := runtime.Instantiate(ctx, moduleBytes) - if err != nil { - t.Fatal(err) - } - memory := module.Memory() - before, ok := memory.Read(0, 1) - if !ok { - t.Fatal("initial memory unavailable") - } - before[0] = 42 - if previous, ok := memory.Grow(1); !ok || previous != 1 { - t.Fatalf("allowed growth = %d, %v", previous, ok) - } - after, ok := memory.Read(0, 1) - if !ok || after[0] != 42 { - t.Fatal("growth lost existing data") - } - if &before[0] != &after[0] { - t.Fatal("growth replaced the guest backing buffer") - } - if _, ok := memory.Grow(1); ok { - t.Fatal("growth exceeded the two-page ceiling") - } - }) - } -} - func TestRuntimeBoundsGuestDiagnostics(t *testing.T) { limits := heicdecode.DefaultLimits(0) var diagnostic bytes.Buffer @@ -202,13 +158,13 @@ func diagnosticModule() []byte { return module } -// ownedModule builds one function with a fixed one-or-two-page memory ceiling. -// It has no imports, image input, or third-party parser code. +// ownedModule builds one function and a one-or-two-page memory from literal +// instructions. It has no imports, image input, or third-party parser code. func ownedModule(pages byte, body []byte) []byte { module := []byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0, 1, 4, 1, 0x60, 0, 0, // one () -> () type 3, 2, 1, 0, // one function - 5, 4, 1, 1, pages, pages, // bounded memory + 5, 4, 1, 1, pages, 2, // bounded memory 7, 10, 1, 6, '_', 's', 't', 'a', 'r', 't', 0, 0, 10, byte(len(body) + 3), 1, byte(len(body) + 1), 0} return append(module, body...) diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index fef2bab8..8f4b88f2 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -917,3 +917,21 @@ has passing Linux/macOS native guards and UI shards, but failing Windows HEIC and non-UI Linux race jobs. Fresh CI must qualify the new configuration. These and distribution/color/upgrade/signing gates remain explicit in `todos.md`; this reconciliation does not claim feature or review-loop completion. + + +### Native regression follow-up before reconciliation handoff + +The signed reconciliation `30f5b10` was pushed and verified as PR #28's head. +Fresh native Linux amd64 and arm64 guards then failed on both ordinary decoder +fixtures while the native policy guard passed. The captured amd64 events show +bounded diagnostic overflow and a closed response pipe; they do not expose the +inner runtime fatal message. This is a new regression relative to `52ed2df`. + +Withdraw the optional eager WASM backing reservation, the sole production +runtime change, restoring both runtime files exactly to the passing baseline. +Do not enlarge native/guest limits, alter seccomp, suppress tests or introduce +an experimental allocator. Keep the other reconciled omissions. The existing +native Linux guard is the regression check; its new CI result must establish +whether this correction restores the prior behavior. Current threat and +qualification documents retain temporary backing-buffer overlap as a residual +memory cost. Earlier preallocation evidence above describes the trial only. diff --git a/todos.md b/todos.md index 5c43d837..113dd43a 100644 --- a/todos.md +++ b/todos.md @@ -98,14 +98,15 @@ package/update handling. Production construction still supplies no HEIC owner. The September 16 [history reconciliation](docs/heic/history-reconciliation.md) accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files were preserved byte for byte. It restores the current app-wide threat model, -fixed WASM backing storage, Qodana YAML guard, four ordinary fixtures and Fyne -metadata ignore rule. Focused race/interpreter tests, native Apple Silicon +Qodana YAML guard, four ordinary fixtures and Fyne metadata ignore rule. The +historical eager WASM allocation option was withdrawn after fresh native Linux +CI failed; existing memory ceilings and sandbox policy remain intact. Focused race/interpreter tests, native Apple Silicon guards, build/provenance/import checks and GoLand inspections pass. No complete historical decoder-suite equivalence is claimed. Remaining qualification: -- Fresh native CI must exercise the restored memory configuration. On baseline +- Fresh native CI must verify the withdrawn eager-allocation trial. On baseline `52ed2df`, Linux amd64/arm64 and macOS Intel/Apple Silicon helper guards and all UI race shards pass; Windows HEIC guards and the non-UI Linux race job fail. The CI/GitHub review agent remains paused at Ronin's request. Review From 7f045be170ca1c7e674a085829e5955b83967d0e Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 10:52:29 +0200 Subject: [PATCH 07/30] Fix native HEIC qualification and review findings --- .github/workflows/ci.yml | 3 ++ THREAT-MODEL.md | 6 +++ .../winisolation/native_windows_test.go | 4 ++ .../winisolation/process_windows.go | 14 +++++- .../winisolation/profile_windows.go | 27 ++++++++++++ internal/similarity/cache_lifecycle_test.go | 2 +- internal/similarity/cache_records.go | 22 +++++++++- internal/similarity/cache_test.go | 22 ++++++++-- plans/2026-09-15-isolated-heic-restoration.md | 44 +++++++++++++++++++ qodana.yaml | 21 +++++++++ scripts/msixstage/msixstage_test.go | 5 ++- todos.md | 12 ++--- 12 files changed, 166 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 76a631e0..4c15ba58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,6 +187,9 @@ jobs: heic-windows: name: Windows ${{ matrix.arch }} HEIC sandbox and pipe guards (attempt ${{ github.run_attempt }}) + env: + # The shipped Windows helper is pure Go; ARM runners lack a native C compiler. + CGO_ENABLED: '0' strategy: fail-fast: false matrix: diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 3186a946..2f423e3f 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -144,6 +144,12 @@ trusted installed package. Hashes are not an independent package signature. | --- | --- | | Linux x64/ARM64 | Thread-synchronized default-deny seccomp, resource limits and a 2 GiB address-space ceiling before input. This is not a physical-RAM/cgroup limit. | | Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native qualification still fails and activation is blocked. | + +Windows helper startup supplies only `GOMAXPROCS` and the OS-reported +`SystemRoot`; it does not inherit the parent's environment or search path. +Profile creation uses a bounded per-user/session cross-process mutex. These +startup corrections still require passing native CI; they grant no additional +AppContainer capabilities or filesystem rights. | macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | Actual platform controls are verified before helper readiness; unsupported or diff --git a/internal/heicdecode/winisolation/native_windows_test.go b/internal/heicdecode/winisolation/native_windows_test.go index 172e34a9..72a69fb5 100644 --- a/internal/heicdecode/winisolation/native_windows_test.go +++ b/internal/heicdecode/winisolation/native_windows_test.go @@ -45,6 +45,10 @@ func ownedPolicyControl(limits heicdecode.Limits) error { if os.Getenv("PICFETCH_OWNED_PARENT_ENVIRONMENT") != "" { return errors.New("parent environment reached the helper") } + windowsDirectory, err := windows.GetWindowsDirectory() + if err != nil || os.Getenv("SystemRoot") != windowsDirectory { + return fmt.Errorf("helper SystemRoot does not match Windows directory: %w", err) + } // The request is capped at 65 MiB even if the tested restriction is broken. // No page is touched; an unexpected success is freed immediately. if limits.OSProcessBytes != 64*1024*1024 { diff --git a/internal/heicdecode/winisolation/process_windows.go b/internal/heicdecode/winisolation/process_windows.go index 058db682..9d19606f 100644 --- a/internal/heicdecode/winisolation/process_windows.go +++ b/internal/heicdecode/winisolation/process_windows.go @@ -115,11 +115,21 @@ func Start(executable string, args []string, stdio [3]*os.File, limits heicdecod if err != nil { return nil, err } - // No parent environment, search path or user image location enters the child. + // Supply the system installation directory required by AppContainer startup, + // without inheriting the parent's environment or DLL search path. environment, err := windows.UTF16FromString("GOMAXPROCS=1") if err != nil { return nil, err } + windowsDirectory, err := windows.GetWindowsDirectory() + if err != nil { + return nil, fmt.Errorf("locate Windows directory: %w", err) + } + systemRoot, err := windows.UTF16FromString("SystemRoot=" + windowsDirectory) + if err != nil { + return nil, err + } + environment = append(environment, systemRoot...) environment = append(environment, 0) directory, err := windows.UTF16PtrFromString(filepath.Dir(executable)) if err != nil { @@ -128,7 +138,7 @@ func Start(executable string, args []string, stdio [3]*os.File, limits heicdecod var information windows.ProcessInformation flags := uint32(windows.CREATE_SUSPENDED | windows.CREATE_UNICODE_ENVIRONMENT | windows.EXTENDED_STARTUPINFO_PRESENT | windows.CREATE_NO_WINDOW) if err = windows.CreateProcess(path, command, nil, nil, true, flags, &environment[0], directory, &startup.StartupInfo, &information); err != nil { - return nil, err + return nil, fmt.Errorf("create AppContainer process: %w", err) } runtime.KeepAlive(capability) runtime.KeepAlive(handles) diff --git a/internal/heicdecode/winisolation/profile_windows.go b/internal/heicdecode/winisolation/profile_windows.go index c9564cdc..f02b8e8f 100644 --- a/internal/heicdecode/winisolation/profile_windows.go +++ b/internal/heicdecode/winisolation/profile_windows.go @@ -5,6 +5,7 @@ package winisolation import ( + "errors" "fmt" "path/filepath" "runtime" @@ -25,6 +26,32 @@ func containerSID(create bool) (*windows.SID, error) { library := windows.NewLazySystemDLL("userenv.dll") var sid *windows.SID if create { + // Profile registration is shared by all PicFetch processes for this + // user. Serialize it across processes; a Go mutex cannot do that. + // Win32 mutex ownership is bound to the acquiring OS thread. + runtime.LockOSThread() + defer runtime.UnlockOSThread() + user, userErr := windows.GetCurrentProcessToken().GetTokenUser() + if userErr != nil { + return nil, userErr + } + mutexName, nameErr := windows.UTF16PtrFromString(`Local\` + containerName + "." + user.User.Sid.String()) + if nameErr != nil { + return nil, nameErr + } + mutex, mutexErr := windows.CreateMutex(nil, false, mutexName) + if mutexErr != nil && !errors.Is(mutexErr, windows.ERROR_ALREADY_EXISTS) { + return nil, fmt.Errorf("open HEIC profile lock: %w", mutexErr) + } + defer func() { _ = windows.CloseHandle(mutex) }() + state, waitErr := windows.WaitForSingleObject(mutex, 10000) + if waitErr != nil { + return nil, fmt.Errorf("wait for HEIC profile lock: %w", waitErr) + } + if state != windows.WAIT_OBJECT_0 && state != windows.WAIT_ABANDONED { + return nil, fmt.Errorf("HEIC profile lock wait returned %d", state) + } + defer func() { _ = windows.ReleaseMutex(mutex) }() procedure := library.NewProc("CreateAppContainerProfile") if err = procedure.Find(); err != nil { return nil, err diff --git a/internal/similarity/cache_lifecycle_test.go b/internal/similarity/cache_lifecycle_test.go index 154e81ae..6b2a6987 100644 --- a/internal/similarity/cache_lifecycle_test.go +++ b/internal/similarity/cache_lifecycle_test.go @@ -364,7 +364,7 @@ func TestAnalysisCacheConfinementManagedUsageAndTemps(t *testing.T) { } } files, err := favstore.Load(policy.Roots.FavoritesDir, "Trip") - if err != nil || len(files) != 1 || files[0].Path() != item.Path { + if err != nil || len(files) != 1 || filepath.FromSlash(files[0].Path()) != item.Path { t.Fatalf("cleanup changed Favorite membership: %v, %v", files, err) } if data, err := os.ReadFile(item.Path); err != nil || string(data) != "source" { diff --git a/internal/similarity/cache_records.go b/internal/similarity/cache_records.go index 2f3972c5..d17e0c9b 100644 --- a/internal/similarity/cache_records.go +++ b/internal/similarity/cache_records.go @@ -3,6 +3,7 @@ package similarity import ( "context" "errors" + "fmt" "io/fs" "os" "regexp" @@ -37,7 +38,7 @@ func (i *analysisInventory) scan(ctx context.Context, roots CacheRoots, progress var root *os.Root var err error if favorite != nil { - root, err = favorite.root.OpenRoot("analysis") + root, err = openAnalysisDirectory(favorite.root, "analysis") } else { parent, openErr := os.OpenRoot(base) if errors.Is(openErr, os.ErrNotExist) { @@ -47,7 +48,7 @@ func (i *analysisInventory) scan(ctx context.Context, roots CacheRoots, progress failures = append(failures, openErr) return } - root, err = parent.OpenRoot(relative) + root, err = openAnalysisDirectory(parent, relative) _ = parent.Close() } if errors.Is(err, os.ErrNotExist) { @@ -124,3 +125,20 @@ func (i *analysisInventory) scan(ctx context.Context, roots CacheRoots, progress i.usage.Incomplete = i.usage.General.Incomplete || i.usage.Favorite.Incomplete return errors.Join(failures...) } + +// Windows can report a regular file passed to OpenRoot as ErrNotExist. Keep +// that invalid cache layout visible as a partial inventory, rather than +// reporting an empty, healthy cache. The opened parent pins this check. +func openAnalysisDirectory(parent *os.Root, name string) (*os.Root, error) { + root, err := parent.OpenRoot(name) + if errors.Is(err, os.ErrNotExist) { + info, statErr := parent.Stat(name) + if statErr == nil && !info.IsDir() { + return nil, fmt.Errorf("analysis cache %s is not a directory", name) + } + if statErr != nil && !errors.Is(statErr, os.ErrNotExist) { + return nil, statErr + } + } + return root, err +} diff --git a/internal/similarity/cache_test.go b/internal/similarity/cache_test.go index 68ff329a..fddbe81c 100644 --- a/internal/similarity/cache_test.go +++ b/internal/similarity/cache_test.go @@ -5,6 +5,7 @@ import ( "errors" "os" "path/filepath" + "runtime" "testing" "fyne.io/fyne/v2" @@ -62,10 +63,17 @@ func TestFavoriteAnalysisFollowsOpenedDirectory(t *testing.T) { t.Fatal(err) } defer func() { _ = root.Close() }() - if err := os.Rename(favstore.Dir(dir, "Trip"), filepath.Join(dir, "Moved")); err != nil { - t.Fatal(err) + renameErr := os.Rename(favstore.Dir(dir, "Trip"), filepath.Join(dir, "Moved")) + if runtime.GOOS == "windows" { + // Windows pins an os.Root directory against rename. Verify the + // same membership guarantee through that platform's refusal. + if renameErr == nil { + t.Fatal("Windows renamed a retained directory root") + } + } else if renameErr != nil { + t.Fatal(renameErr) } - if replacement { + if replacement && renameErr == nil { if err := favstore.Save(dir, "Trip", []fyne.URI{storage.NewFileURI(other)}); err != nil { t.Fatal(err) } @@ -77,6 +85,14 @@ func TestFavoriteAnalysisFollowsOpenedDirectory(t *testing.T) { if len(favorite.members) != 1 || !favorite.members[original] || favorite.members[other] || !favorite.current() { t.Fatalf("opened directory associated with replacement membership: %v", favorite.members) } + if renameErr != nil { + if err := root.Close(); err != nil { + t.Fatal(err) + } + if err := os.Rename(favstore.Dir(dir, "Trip"), filepath.Join(dir, "Moved")); err != nil { + t.Fatalf("released directory still cannot be renamed: %v", err) + } + } }) } } diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 8f4b88f2..edb53c2e 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -935,3 +935,47 @@ native Linux guard is the regression check; its new CI result must establish whether this correction restores the prior behavior. Current threat and qualification documents retain temporary backing-buffer overlap as a residual memory cost. Earlier preallocation evidence above describes the trial only. + +### GitHub Codex review loop (2026-09-16) + +Ronin resumed the review loop on PR #28 at `08a71f2`. This authorizes fix +commits, pushes and review discussion; merge, release, production activation +and history rewriting remain outside scope. Existing code/security reviews +cover only `a3c4d92`, and there are no unresolved review threads at entry. + +Route: Deep continuation for native Windows failures. Lead owns all assessment, +implementation and fixes. One read-only scout retrieves Qodana/CodeQL evidence +while the lead diagnoses CI: G1 bounded artifact collection, G2 retained API/ +SARIF outputs, G3 no tracked writes, G4/G5 independent evidence not yet held by +lead. Budget: one scout, no implementation delegation, focused local tests; +the complete suite runs in native CI as required by the review-loop agreement. + +Acceptance commands/evidence: + +- `go test -tags no_emoji,nodynamic ./scripts/msixstage ./scripts/nativeguards` + verifies packaging notice contracts and native runner selection. +- Focused changed HEIC/client/cache tests and Windows cross-compilation verify + local changes; native `heic-windows` CI on both architectures must run every + required sandbox/pipe guard without skips. No relaxed isolation controls. +- Inspect changed code with GoLand, and fetch post-suppression Qodana SARIF, + CodeQL analyses and failed job events after every relevant push. +- Final `gh pr view` plus review/thread API evidence must establish a fresh + clean Codex code review and completed security review on the latest head, + actionable static findings resolved, and required CI passing. + +Round 1 local evidence: focused `msixstage`, `nativeguards`, `qodanaconfig`, +HEIC client and affected similarity tests pass. Both Windows architecture +guard binaries cross-compile. The notice assertion was observed failing on +the old commands, then passing after updating its archive contract; removing +the privacy notice from the new archive command fails it again. GoLand reports +no findings for all seven changed Go files. Formatting and exact Qodana +configuration checks pass. Native Windows behavior awaits hosted execution. + +At the entry head, CodeQL Go/Actions each report zero SARIF results (merge +`575fde0` has `08a71f2` as head parent), and the PR-ref alerts list is empty. +Qodana's 14 post-suppression findings are dispositioned with exact-file scopes: +five false `errors.As` target warnings (`*heicdecode.Failure` implements error), +four harmless maintained-source casts, two scoped builtin-shadowing names, +one partial NAL switch followed by explicit remaining-type handling, and two +retained codec constructors. The nested guest uses NewDecodeBudget; retained +encoder API does not require deletion. Fresh reports must verify these scopes. diff --git a/qodana.yaml b/qodana.yaml index 26e76459..3f13d4d8 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -63,12 +63,27 @@ exclude: # Explicit types in fixtures are intentional test scaffolding. - "internal/imaging/orientation_test.go" - "internal/ui/mosaic_test.go" + # Preserve the exact maintained codec source; these casts are harmless. + - "third_party/h265/hevc/itransform.go" + - "third_party/h265/hevc/lossyenc.go" + - "third_party/h265/hevc/decoder.go" # The JPEG fast path handles four subsampling ratios; other ratios use the # generic scaler below. TestScaleForExport_PreservesJPEGFilterPixels covers # all six ratios and verifies exact CatmullRom output. - name: GoSwitchMissingCasesForIotaConsts paths: - "internal/imaging/thumbnail.go" + # Remaining NAL types have explicit EOS/non-VCL handling after the switch. + - "third_party/h265/hevc/decoder.go" + # *heicdecode.Failure implements error in protocol.go. Qodana's PR analysis + # fails to resolve that method; these standard **Failure targets are valid + # and covered by broker refusal/remote admission tests and go vet. + - name: GoErrorsAs + paths: + - "internal/heicdecode/client/broker.go" + - "internal/heicdecode/client/remote.go" + - "internal/heicdecode/client/remote_test.go" + - "internal/similarity/heic_test.go" # Product names (Microsoft/Store/GitHub) keep their capitalization in CLI # diagnostics; these files do not report sentence-capitalization defects. - name: GoErrorStringFormat @@ -96,6 +111,9 @@ exclude: - name: GoReservedWordUsedAsName paths: - "internal/ui/exif_test.go" + # Scoped locals in the maintained codec retain their source identities. + - "third_party/h265/hevc/itransform.go" + - "third_party/h265/hevc/lossyenc.go" # writeTempPNGFile takes ownership and closes the file on every path; # the Darwin/Windows callers remove the returned filename after use. - name: GoResourceLeak @@ -450,6 +468,9 @@ exclude: - "third_party/h265/heic/exif.go" - "third_party/h265/heic/heic.go" - "third_party/h265/hevc/nal.go" + # Public retained codec API; NewDecodeBudget is used by the nested module. + - "third_party/h265/hevc/budget.go" + - "third_party/h265/hevc/encoder.go" - name: GoUnusedFunction paths: - "third_party/h265/heic/ycbcr.go" diff --git a/scripts/msixstage/msixstage_test.go b/scripts/msixstage/msixstage_test.go index 677a283b..ff699147 100644 --- a/scripts/msixstage/msixstage_test.go +++ b/scripts/msixstage/msixstage_test.go @@ -292,8 +292,9 @@ func TestStandaloneArchivesRetainNotices(t *testing.T) { t.Fatal(err) } for _, want := range []string{ - `"picfetch.exe" ../LICENSE ../THIRD-PARTY-NOTICES.md ../PRIVACY.md -j`, - `-C .. LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md`, + `cp ../LICENSE ../THIRD-PARTY-NOTICES.md ../PRIVACY.md "heic-windows-$arch/"`, + `picfetch.exe heic LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md)`, + `-C "heic-linux-$arch" heic -C "$GITHUB_WORKSPACE" LICENSE THIRD-PARTY-NOTICES.md PRIVACY.md`, `@('LICENSE', 'THIRD-PARTY-NOTICES.md', 'PRIVACY.md')`, `Compress-Archive -Path $packageFiles`, } { diff --git a/todos.md b/todos.md index 113dd43a..46bbfdbd 100644 --- a/todos.md +++ b/todos.md @@ -106,12 +106,12 @@ historical decoder-suite equivalence is claimed. Remaining qualification: -- Fresh native CI must verify the withdrawn eager-allocation trial. On baseline - `52ed2df`, Linux amd64/arm64 and macOS Intel/Apple Silicon helper guards and - all UI race shards pass; Windows HEIC guards and the non-UI Linux race job - fail. The CI/GitHub review agent remains paused at Ronin's request. Review - reports and required CI must be addressed before acceptance. Local canonical - shard verification is unavailable because the Docker daemon is stopped. +- Ronin resumed the GitHub Codex review loop on September 16. At `08a71f2`, + Linux amd64/arm64 and macOS Intel/Apple Silicon helper guards and all UI race + shards pass. Windows HEIC guards and a stale packaging-notice assertion in + the non-UI Linux race job fail. Fresh code/security reviews, static-report + dispositions and required CI remain pending in the active plan. Local + canonical shard verification is unavailable because the Docker daemon is stopped. - Ronin accepted the absent hard total native-memory cap on macOS. WASM, transport, deadline and sandbox controls remain mandatory; helper-only executable-memory permission is required. The compiler succeeds on the From ae1f7f5b3a4fdb3043ba1ef6f6dc0ff77afbf39f Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 10:53:06 +0200 Subject: [PATCH 08/30] Keep the platform boundary table intact --- THREAT-MODEL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 2f423e3f..0cf83eb0 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -144,13 +144,13 @@ trusted installed package. Hashes are not an independent package signature. | --- | --- | | Linux x64/ARM64 | Thread-synchronized default-deny seccomp, resource limits and a 2 GiB address-space ceiling before input. This is not a physical-RAM/cgroup limit. | | Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native qualification still fails and activation is blocked. | +| macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | Windows helper startup supplies only `GOMAXPROCS` and the OS-reported `SystemRoot`; it does not inherit the parent's environment or search path. Profile creation uses a bounded per-user/session cross-process mutex. These startup corrections still require passing native CI; they grant no additional AppContainer capabilities or filesystem rights. -| macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | Actual platform controls are verified before helper readiness; unsupported or failed setup refuses input. OS controls and WASI restrictions protect different From fa89ab6e74d36259f2b76e287a3a6ad70d97bde4 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 10:58:09 +0200 Subject: [PATCH 09/30] Supply the OS profile location for AppContainer startup --- THREAT-MODEL.md | 3 ++- .../heicdecode/winisolation/native_windows_test.go | 10 ++++++++-- .../heicdecode/winisolation/process_windows.go | 14 ++++++++++++-- plans/2026-09-15-isolated-heic-restoration.md | 8 ++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 0cf83eb0..4747bf56 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -147,7 +147,8 @@ trusted installed package. Hashes are not an independent package signature. | macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | Windows helper startup supplies only `GOMAXPROCS` and the OS-reported -`SystemRoot`; it does not inherit the parent's environment or search path. +`SystemRoot`/`LOCALAPPDATA`; it does not inherit the parent's environment or +search path. Windows redirects the profile directory for the AppContainer. Profile creation uses a bounded per-user/session cross-process mutex. These startup corrections still require passing native CI; they grant no additional AppContainer capabilities or filesystem rights. diff --git a/internal/heicdecode/winisolation/native_windows_test.go b/internal/heicdecode/winisolation/native_windows_test.go index 72a69fb5..b7e3408e 100644 --- a/internal/heicdecode/winisolation/native_windows_test.go +++ b/internal/heicdecode/winisolation/native_windows_test.go @@ -46,8 +46,14 @@ func ownedPolicyControl(limits heicdecode.Limits) error { return errors.New("parent environment reached the helper") } windowsDirectory, err := windows.GetWindowsDirectory() - if err != nil || os.Getenv("SystemRoot") != windowsDirectory { - return fmt.Errorf("helper SystemRoot does not match Windows directory: %w", err) + if err != nil { + return err + } + if os.Getenv("SystemRoot") != windowsDirectory { + return errors.New("helper SystemRoot does not match Windows directory") + } + if os.Getenv("LOCALAPPDATA") == "" { + return errors.New("helper has no AppContainer profile directory") } // The request is capped at 65 MiB even if the tested restriction is broken. // No page is touched; an unexpected success is freed immediately. diff --git a/internal/heicdecode/winisolation/process_windows.go b/internal/heicdecode/winisolation/process_windows.go index 9d19606f..9810518c 100644 --- a/internal/heicdecode/winisolation/process_windows.go +++ b/internal/heicdecode/winisolation/process_windows.go @@ -115,12 +115,22 @@ func Start(executable string, args []string, stdio [3]*os.File, limits heicdecod if err != nil { return nil, err } - // Supply the system installation directory required by AppContainer startup, - // without inheriting the parent's environment or DLL search path. + // AppContainer creation needs LOCALAPPDATA to locate its profile. Obtain + // OS directory values directly, without inheriting the parent's environment + // or DLL search path. Windows redirects LOCALAPPDATA for the child. environment, err := windows.UTF16FromString("GOMAXPROCS=1") if err != nil { return nil, err } + profileDirectory, err := windows.KnownFolderPath(windows.FOLDERID_LocalAppData, 0) + if err != nil { + return nil, fmt.Errorf("locate local application data: %w", err) + } + localAppData, err := windows.UTF16FromString("LOCALAPPDATA=" + profileDirectory) + if err != nil { + return nil, err + } + environment = append(environment, localAppData...) windowsDirectory, err := windows.GetWindowsDirectory() if err != nil { return nil, fmt.Errorf("locate Windows directory: %w", err) diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index edb53c2e..57a4a2e5 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -979,3 +979,11 @@ four harmless maintained-source casts, two scoped builtin-shadowing names, one partial NAL switch followed by explicit remaining-type handling, and two retained codec constructors. The nested guest uses NewDecodeBudget; retained encoder API does not require deletion. Fresh reports must verify these scopes. + +Round 1 native Windows x64 now passes the cache cases, and profile-creation +errors are absent. AppContainer creation still returns ERROR_ENVVAR_NOT_FOUND; +adding SystemRoot alone did not solve startup. The next correction adds only +LOCALAPPDATA from SHGetKnownFolderPath. Chromium's `CreateFilteredEnvironment` +documents this AppContainer requirement, independently confirmed by the +maintainer's environment bisection in Convira/convira-sandbox issue #1. Native +guards remain the acceptance evidence; no unrestricted launch is substituted. From 11e0583cd97404fd4ab3511351e071e9c1a64eb4 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 11:03:48 +0200 Subject: [PATCH 10/30] Launch pipe-only HEIC helpers without a console --- internal/heicdecode/winisolation/process_windows.go | 4 +++- plans/2026-09-15-isolated-heic-restoration.md | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/internal/heicdecode/winisolation/process_windows.go b/internal/heicdecode/winisolation/process_windows.go index 9810518c..06f6f0fc 100644 --- a/internal/heicdecode/winisolation/process_windows.go +++ b/internal/heicdecode/winisolation/process_windows.go @@ -146,7 +146,9 @@ func Start(executable string, args []string, stdio [3]*os.File, limits heicdecod return nil, err } var information windows.ProcessInformation - flags := uint32(windows.CREATE_SUSPENDED | windows.CREATE_UNICODE_ENVIRONMENT | windows.EXTENDED_STARTUPINFO_PRESENT | windows.CREATE_NO_WINDOW) + // The helper uses only inherited pipes. Avoid hidden-console initialization + // and its console host inside this one-process AppContainer. + flags := uint32(windows.CREATE_SUSPENDED | windows.CREATE_UNICODE_ENVIRONMENT | windows.EXTENDED_STARTUPINFO_PRESENT | windows.DETACHED_PROCESS) if err = windows.CreateProcess(path, command, nil, nil, true, flags, &environment[0], directory, &startup.StartupInfo, &information); err != nil { return nil, fmt.Errorf("create AppContainer process: %w", err) } diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 57a4a2e5..34495854 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -987,3 +987,10 @@ LOCALAPPDATA from SHGetKnownFolderPath. Chromium's `CreateFilteredEnvironment` documents this AppContainer requirement, independently confirmed by the maintainer's environment bisection in Convira/convira-sandbox issue #1. Native guards remain the acceptance evidence; no unrestricted launch is substituted. + +Round 2 (`fa89ab6`) creates the process successfully on Windows but its native +control exits before Go initialization with STATUS_DLL_INIT_FAILED +(`0xc0000142`). Test the console-initialization hypothesis by using +DETACHED_PROCESS for this pipe-only helper instead of CREATE_NO_WINDOW. +The same AppContainer, child-process restriction, handles and job limits apply. +The native positive policy and ordinary decode guards must still pass. From a86bb358adacd6e22ba9c50651543535a72a3b23 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 11:09:49 +0200 Subject: [PATCH 11/30] Pin Windows job buffers across uintptr API wrappers --- internal/heicdecode/winisolation/policy_windows.go | 14 ++++++++++---- .../heicdecode/winisolation/process_windows.go | 7 ++++++- plans/2026-09-15-isolated-heic-restoration.md | 9 +++++++++ 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/internal/heicdecode/winisolation/policy_windows.go b/internal/heicdecode/winisolation/policy_windows.go index 9c130c56..2299ff8e 100644 --- a/internal/heicdecode/winisolation/policy_windows.go +++ b/internal/heicdecode/winisolation/policy_windows.go @@ -4,6 +4,7 @@ package winisolation import ( "errors" + "fmt" "runtime" "time" "unsafe" @@ -35,8 +36,13 @@ func jobLimits(limits heicdecode.Limits) windows.JOBOBJECT_EXTENDED_LIMIT_INFORM func verifyJob(job windows.Handle, limits heicdecode.Limits) error { var actual windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION + // x/sys accepts a uintptr here, so its lazy DLL resolution cannot keep a + // Go stack address valid if the stack grows before the native call. + var pinned runtime.Pinner + pinned.Pin(&actual) + defer pinned.Unpin() if err := windows.QueryInformationJobObject(job, windows.JobObjectExtendedLimitInformation, uintptr(unsafe.Pointer(&actual)), uint32(unsafe.Sizeof(actual)), nil); err != nil { - return err + return fmt.Errorf("query HEIC job limits: %w", err) } wanted := jobLimits(limits) if actual.BasicLimitInformation.LimitFlags != wanted.BasicLimitInformation.LimitFlags || @@ -58,20 +64,20 @@ func Verify(limits heicdecode.Limits) error { var isContainer uint32 var length uint32 if err := windows.GetTokenInformation(token, tokenIsAppContainer, (*byte)(unsafe.Pointer(&isContainer)), uint32(unsafe.Sizeof(isContainer)), &length); err != nil { - return err + return fmt.Errorf("query HEIC AppContainer token: %w", err) } if isContainer != 1 { return errors.New("HEIC helper is not an AppContainer process") } var buffer [4096]byte if err := windows.GetTokenInformation(token, tokenCapabilities, &buffer[0], uint32(len(buffer)), &length); err != nil { - return err + return fmt.Errorf("query HEIC token capabilities: %w", err) } if length < 4 || (*windows.Tokengroups)(unsafe.Pointer(&buffer[0])).GroupCount != 0 { return errors.New("HEIC helper has unexpected AppContainer capabilities") } if err := windows.GetTokenInformation(token, tokenAppContainerSID, &buffer[0], uint32(len(buffer)), &length); err != nil { - return err + return fmt.Errorf("query HEIC AppContainer identity: %w", err) } if length < uint32(unsafe.Sizeof(uintptr(0))) { return errors.New("HEIC helper has no AppContainer SID") diff --git a/internal/heicdecode/winisolation/process_windows.go b/internal/heicdecode/winisolation/process_windows.go index 06f6f0fc..feb25516 100644 --- a/internal/heicdecode/winisolation/process_windows.go +++ b/internal/heicdecode/winisolation/process_windows.go @@ -65,8 +65,13 @@ func Start(executable string, args []string, stdio [3]*os.File, limits heicdecod } }() policy := jobLimits(limits) + // SetInformationJobObject carries this address as uintptr through its + // Go wrapper; pin it across lazy DLL resolution and the native call. + var pinned runtime.Pinner + pinned.Pin(&policy) + defer pinned.Unpin() if _, err = windows.SetInformationJobObject(job, windows.JobObjectExtendedLimitInformation, uintptr(unsafe.Pointer(&policy)), uint32(unsafe.Sizeof(policy))); err != nil { - return nil, err + return nil, fmt.Errorf("set HEIC job limits: %w", err) } if err = verifyJob(job, limits); err != nil { return nil, err diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 34495854..f49778c1 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -994,3 +994,12 @@ control exits before Go initialization with STATUS_DLL_INIT_FAILED DETACHED_PROCESS for this pipe-only helper instead of CREATE_NO_WINDOW. The same AppContainer, child-process restriction, handles and job limits apply. The native positive policy and ordinary decode guards must still pass. + +Round 3 (`11e0583`) passes Windows owned-peer, inherited transport and +cancellation tests. The native control now enters Go and returns +ERROR_NOACCESS during policy verification. The x/sys job-query/set wrappers +accept raw uintptr addresses and perform lazy DLL resolution; compiler escape +output confirms the pointed-to structs remain on the movable Go stack. Pin +both buffers across those calls and add stage-specific errors. Token queries +already accept typed pointers. Native policy/ordinary-image guards are the +regression oracle; no syscall result or sandbox check is bypassed. From 6537ac011fac18c30c6bb189856663419663f3e2 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 11:15:28 +0200 Subject: [PATCH 12/30] Align native Windows token information buffers --- internal/heicdecode/winisolation/policy_windows.go | 9 ++++++--- plans/2026-09-15-isolated-heic-restoration.md | 11 +++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/internal/heicdecode/winisolation/policy_windows.go b/internal/heicdecode/winisolation/policy_windows.go index 2299ff8e..64b15580 100644 --- a/internal/heicdecode/winisolation/policy_windows.go +++ b/internal/heicdecode/winisolation/policy_windows.go @@ -69,14 +69,17 @@ func Verify(limits heicdecode.Limits) error { if isContainer != 1 { return errors.New("HEIC helper is not an AppContainer process") } - var buffer [4096]byte - if err := windows.GetTokenInformation(token, tokenCapabilities, &buffer[0], uint32(len(buffer)), &length); err != nil { + // TOKEN_GROUPS and TOKEN_APPCONTAINER_INFORMATION contain native pointers. + // A byte array on the Go stack has no pointer-alignment guarantee. + var buffer [512]uintptr + data := (*byte)(unsafe.Pointer(&buffer[0])) + if err := windows.GetTokenInformation(token, tokenCapabilities, data, uint32(unsafe.Sizeof(buffer)), &length); err != nil { return fmt.Errorf("query HEIC token capabilities: %w", err) } if length < 4 || (*windows.Tokengroups)(unsafe.Pointer(&buffer[0])).GroupCount != 0 { return errors.New("HEIC helper has unexpected AppContainer capabilities") } - if err := windows.GetTokenInformation(token, tokenAppContainerSID, &buffer[0], uint32(len(buffer)), &length); err != nil { + if err := windows.GetTokenInformation(token, tokenAppContainerSID, data, uint32(unsafe.Sizeof(buffer)), &length); err != nil { return fmt.Errorf("query HEIC AppContainer identity: %w", err) } if length < uint32(unsafe.Sizeof(uintptr(0))) { diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index f49778c1..49421645 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1003,3 +1003,14 @@ output confirms the pointed-to structs remain on the movable Go stack. Pin both buffers across those calls and add stage-specific errors. Token queries already accept typed pointers. Native policy/ordinary-image guards are the regression oracle; no syscall result or sandbox check is bypassed. + +Round 4 (`a86bb35`) identifies the remaining ERROR_NOACCESS specifically in +GetTokenInformation(TokenCapabilities), before any job query. Pinning job +buffers fixes a separate pointer-lifetime defect, not this observed failure. +The token buffer was a byte array with byte alignment, although TOKEN_GROUPS +and TOKEN_APPCONTAINER_INFORMATION contain native pointers. Use the same +4096-byte capacity in a uintptr array to guarantee alignment. The native +positive guard remains mandatory on both architectures. +The Windows amd64 compiler listing confirms the defect and correction: the +old buffer starts at `SP+79`; the uintptr buffer starts at `SP+88`. Windows +ARM64 vet and GoLand inspection pass. From c77d9bdcfc093d6ff8a237da9187866b6ef457c7 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 11:29:58 +0200 Subject: [PATCH 13/30] Keep repository programs outside the Windows signing job --- .github/workflows/release.yml | 41 ++++++++++------ THREAT-MODEL.md | 3 ++ docs/release-signing.md | 8 +-- plans/2026-09-15-isolated-heic-restoration.md | 10 ++++ scripts/msixstage/msixstage_test.go | 49 +++++++++++++++++++ 5 files changed, 93 insertions(+), 18 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index abfc54b7..ece5393f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -119,13 +119,7 @@ jobs: permissions: contents: read steps: - - name: Check out code - uses: actions/checkout@v7 - - name: Set up Go - uses: actions/setup-go@v7 - with: - go-version-file: go.mod - cache-dependency-path: go.sum + # No checkout, repository programs or build toolchain may run with the signer. - name: Download unsigned Windows artifacts uses: actions/download-artifact@v8 with: @@ -185,19 +179,36 @@ jobs: if ($LASTEXITCODE -ne 0) { throw "Signing failed for $($archive.Name)." } - & $signtool.FullName verify /pa /all /v /tw $executable - if ($LASTEXITCODE -ne 0) { - throw "Signature verification failed for $($archive.Name)." - } $helper = Join-Path $unpacked 'heic/picfetch-heic-worker.exe' if (-not (Test-Path -LiteralPath $helper -PathType Leaf)) { throw 'The HEIC helper is missing.' } & $signtool.FullName sign /fd sha256 /tr http://time.certum.pl /td sha256 /sha1 $env:CERTUM_CERT_THUMBPRINT /v $helper if ($LASTEXITCODE -ne 0) { throw 'HEIC helper signing failed.' } - & $signtool.FullName verify /pa /all /v /tw $helper - if ($LASTEXITCODE -ne 0) { throw 'HEIC helper signature verification failed.' } $arch = if ($archive.BaseName.EndsWith('-amd64')) { 'amd64' } else { 'arm64' } - go run ./scripts/heicpackage -mode finalize -os windows -arch $arch -out $unpacked - if ($LASTEXITCODE -ne 0) { throw 'HEIC post-signing manifest verification failed.' } + + # Only fixed data operations run after authentication. Never execute + # repository code here, even to refresh a post-signing digest. + $manifestPath = Join-Path $unpacked 'heic/manifest.json' + if ((Get-Item -LiteralPath $manifestPath -ErrorAction Stop).Length -gt 4096) { + throw 'The HEIC manifest is too large.' + } + $manifest = Get-Content -LiteralPath $manifestPath -Raw | ConvertFrom-Json -AsHashtable + if ($manifest.version -ne 1 -or $manifest.goos -cne 'windows' -or $manifest.goarch -cne $arch -or + $manifest.guestSHA256 -cnotmatch '^[0-9a-f]{64}$' -or $manifest.guestSHA256 -ceq ('0' * 64)) { + throw 'The HEIC manifest target or guest digest is invalid.' + } + $finalManifest = [ordered]@{ + version = 1 + goos = 'windows' + goarch = $arch + executableSHA256 = (Get-FileHash -LiteralPath $helper -Algorithm SHA256).Hash.ToLowerInvariant() + guestSHA256 = $manifest.guestSHA256 + } + $finalManifest | ConvertTo-Json | Set-Content -LiteralPath $manifestPath -Encoding utf8NoBOM + + foreach ($signedFile in @($executable, $helper)) { + & $signtool.FullName verify /pa /all /v /tw $signedFile + if ($LASTEXITCODE -ne 0) { throw "Final signature verification failed: $signedFile" } + } $packageFiles = @($executable, (Join-Path $unpacked 'heic')) foreach ($name in @('LICENSE', 'THIRD-PARTY-NOTICES.md', 'PRIVACY.md')) { diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 4747bf56..d1d6d985 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -288,6 +288,9 @@ qualified bridge. New updater tests do not fix an already installed old updater. The [release workflow](.github/workflows/release.yml) configures CI gates, Windows signing/verification and release publication dependencies. +The protected Windows signing job has no repository checkout/toolchain and +executes no repository programs. Fixed PowerShell data operations refresh the +post-signing helper digest; both executable signatures are checked afterward. [Signing documentation](docs/release-signing.md) describes required environment protection and credential handling. Configuration does not prove that live environment approvals are enabled, a particular CI run passed, or a downloaded diff --git a/docs/release-signing.md b/docs/release-signing.md index 0170881b..3de0918b 100644 --- a/docs/release-signing.md +++ b/docs/release-signing.md @@ -42,9 +42,11 @@ the action installs it. 1. A v* tag runs the normal reusable CI test gate. 2. The Linux cross-build produces the two unsigned Windows ZIP artifacts. 3. The sign-windows job waits for the protected release-signing environment, - downloads those artifacts, and authenticates SimplySign. -4. SignTool signs each picfetch.exe with SHA-256 and Certum's RFC-3161 - timestamp service, then verifies the embedded signature. + downloads those artifacts, and authenticates SimplySign. It has no source + checkout or build toolchain and never executes repository programs. +4. SignTool signs each picfetch.exe and its HEIC helper with SHA-256 and Certum's + RFC-3161 timestamp service. Fixed PowerShell hash/JSON commands refresh the + helper manifest, then both executable signatures are verified before packing. 5. The job uploads new signed Windows ZIP artifacts. 6. The final release job publishes macOS, Linux, and only the signed Windows ZIPs. It does not download the unsigned Windows artifacts. diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 49421645..50b14ca1 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1014,3 +1014,13 @@ positive guard remains mandatory on both architectures. The Windows amd64 compiler listing confirms the defect and correction: the old buffer starts at `SP+79`; the uintptr buffer starts at `SP+88`. Windows ARM64 vet and GoLand inspection pass. + +The security review of `11e0583` reported P1 thread `4024388304`: repository +`go run` in the authenticated Windows signing job can use the live signer. +Confirmed. Remove checkout/setup-go from that job and replace finalization +with fixed PowerShell JSON validation and SHA-256 commands; verify both signed +executables after these data operations and before packing. The signing action, +environment approval and artifact names stay fixed. Regression +`TestReleaseSigningDoesNotExecuteRepositoryCode` was observed red for checkout, +toolchain and Go execution; it must pass after the workflow correction. +No real signing service, release tag or publication is exercised by this loop. diff --git a/scripts/msixstage/msixstage_test.go b/scripts/msixstage/msixstage_test.go index ff699147..02e0f5b3 100644 --- a/scripts/msixstage/msixstage_test.go +++ b/scripts/msixstage/msixstage_test.go @@ -18,6 +18,8 @@ import ( "strings" "testing" + "go.yaml.in/yaml/v3" + "github.com/frathe/picfetch/internal/imaging" ) @@ -311,6 +313,53 @@ func TestStandaloneArchivesRetainNotices(t *testing.T) { } } +func TestReleaseSigningDoesNotExecuteRepositoryCode(t *testing.T) { + data, err := os.ReadFile("../../.github/workflows/release.yml") + if err != nil { + t.Fatal(err) + } + var workflow struct { + Jobs map[string]struct { + Environment string + Steps []struct{ Uses, Run string } + } + } + if err := yaml.Unmarshal(data, &workflow); err != nil { + t.Fatal(err) + } + signing, ok := workflow.Jobs["sign-windows"] + if !ok || signing.Environment != "release-signing" { + t.Fatal("protected signing job is missing") + } + var commands strings.Builder + for _, step := range signing.Steps { + if step.Uses != "" && !strings.HasPrefix(step.Uses, "actions/download-artifact@") && + !strings.HasPrefix(step.Uses, "actions/upload-artifact@") && + step.Uses != "dismine/windows-app-signing-setup-action@89ae3b032d4bc7a5b98d1a42a34e61ecb6faad64" { + t.Errorf("signing job admits a checkout, toolchain or unreviewed action: %s", step.Uses) + } + commands.WriteString(step.Run) + } + script := commands.String() + if regexp.MustCompile(`\bgo\s+(run|build|test|generate)\b`).MatchString(script) { + t.Error("repository Go code executes in the signing environment") + } + for _, want := range []string{ + "Get-FileHash -LiteralPath $helper -Algorithm SHA256", + "ConvertTo-Json", + "Set-Content -LiteralPath $manifestPath -Encoding utf8NoBOM", + "foreach ($signedFile in @($executable, $helper))", + "verify /pa /all /v /tw $signedFile", + } { + if !strings.Contains(script, want) { + t.Errorf("fixed manifest/signature finalization missing: %s", want) + } + } + if strings.LastIndex(script, "verify /pa /all /v /tw $signedFile") < strings.LastIndex(script, "Set-Content -LiteralPath $manifestPath") { + t.Error("final signature verification must follow manifest finalization") + } +} + func TestMicrosoftStoreWorkflowAndBuildTarget(t *testing.T) { root := filepath.Clean(filepath.Join("..", "..")) workflow, err := os.ReadFile(filepath.Join(root, ".github", "workflows", "microsoft-store.yml")) From 3973811e6cb01e6922f7c4e01d8225698d75f55b Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 11:54:43 +0200 Subject: [PATCH 14/30] Correct the Windows policy probe and expose bounded startup diagnostics --- internal/heicdecode/client/client_test.go | 38 +++++++- internal/heicdecode/client/process.go | 14 ++- .../winisolation/native_windows_test.go | 4 +- internal/heicdecode/worker/main.go | 5 +- plans/2026-09-15-isolated-heic-restoration.md | 28 ++++++ scripts/msixstage/msixstage_test.go | 94 +++++++++++++++++++ scripts/nativeguards/main.go | 1 + todos.md | 11 ++- 8 files changed, 185 insertions(+), 10 deletions(-) diff --git a/internal/heicdecode/client/client_test.go b/internal/heicdecode/client/client_test.go index 229cb7a7..e1325c08 100644 --- a/internal/heicdecode/client/client_test.go +++ b/internal/heicdecode/client/client_test.go @@ -94,10 +94,19 @@ func TestMain(m *testing.M) { if err := json.Unmarshal([]byte(os.Args[2]), &limits); err != nil { os.Exit(2) } + mode := strings.TrimSuffix(filepath.Base(os.Args[0]), ".exe") + if mode == "startup" { + _, _ = fmt.Fprintln(os.Stderr, "owned startup refusal") + os.Exit(3) + } + if mode == "startup-overflow" { + _, _ = io.CopyN(os.Stderr, zeroReader{}, int64(limits.MaxDiagnosticBytes)+1) + os.Exit(3) + } if err := heicdecode.WriteReady(os.Stdout, heicdecode.Ready{WASMMemoryBytes: limits.WASMMemoryBytes, NativeMemoryBytes: limits.OSProcessBytes}); err != nil { os.Exit(2) } - switch strings.TrimSuffix(filepath.Base(os.Args[0]), ".exe") { + switch mode { case "success": request, err := heicdecode.ReadRequest(os.Stdin, limits) if err != nil { @@ -114,6 +123,7 @@ func TestMain(m *testing.M) { time.Sleep(time.Hour) } case "crash": + _, _ = fmt.Fprintln(os.Stderr, "owned post-readiness diagnostic") os.Exit(7) case "diagnostics": _, _ = io.CopyN(os.Stderr, zeroReader{}, int64(limits.MaxDiagnosticBytes)+1) @@ -210,6 +220,32 @@ func TestOwnedPeerCrashAndDiagnosticsFailClosed(t *testing.T) { if !errors.Is(err, want) { t.Fatalf("peer did not exercise expected boundary: %v, want %v", err, want) } + if strings.Contains(err.Error(), "owned post-readiness diagnostic") { + t.Fatal("post-readiness helper diagnostics reached the caller") + } + }) + } +} + +func TestOwnedPeerStartupDiagnostics(t *testing.T) { + for _, mode := range []string{"startup", "startup-overflow"} { + t.Run(mode, func(t *testing.T) { + client := ownedPeer(t, mode, 5*time.Second) + called := false + _, err := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + called = true + return nil, nil + }) + if called || !errors.Is(err, ErrUnavailable) { + t.Fatalf("startup refusal: input called=%v, err=%v", called, err) + } + if mode == "startup" { + if !strings.Contains(err.Error(), `"owned startup refusal\n"`) { + t.Fatalf("bounded startup diagnostic missing: %v", err) + } + } else if !errors.Is(err, ErrDiagnosticLimit) || strings.Contains(err.Error(), "startup diagnostic") { + t.Fatalf("oversized startup diagnostic not bounded: %v", err) + } }) } } diff --git a/internal/heicdecode/client/process.go b/internal/heicdecode/client/process.go index cac0e74c..1a85ff2c 100644 --- a/internal/heicdecode/client/process.go +++ b/internal/heicdecode/client/process.go @@ -1,6 +1,7 @@ package client import ( + "bytes" "context" "encoding/json" "errors" @@ -92,12 +93,14 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) _ = errRead.Close() }) var pipeWork sync.WaitGroup - var diagnosticErr error // Read only after pipeWork.Wait. + var readinessFailed bool + var diagnostic bytes.Buffer // Read only after pipeWork.Wait. + var diagnosticErr error // Read only after pipeWork.Wait. pipeWork.Add(1) stderrDone := make(chan error, 1) go func() { defer pipeWork.Done() - count, readErr := io.Copy(io.Discard, io.LimitReader(errRead, int64(c.config.Limits.MaxDiagnosticBytes)+1)) + count, readErr := io.Copy(&diagnostic, io.LimitReader(errRead, int64(c.config.Limits.MaxDiagnosticBytes)+1)) if count > int64(c.config.Limits.MaxDiagnosticBytes) { readErr = ErrDiagnosticLimit diagnosticErr = readErr @@ -116,6 +119,10 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) if diagnosticErr != nil { result = empty resultErr = errors.Join(resultErr, diagnosticErr) + } else if readinessFailed && diagnostic.Len() > 0 { + // Readiness precedes all image input. Quote its bounded startup + // diagnostic, but never publish parser diagnostics after readiness. + resultErr = fmt.Errorf("%w: startup diagnostic %q", resultErr, diagnostic.String()) } if resultErr == nil && processErr != nil { result = empty @@ -126,6 +133,9 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) if err != nil || ready.WASMMemoryBytes != c.config.Limits.WASMMemoryBytes || ready.NativeMemoryBytes > c.config.Limits.OSProcessBytes || (runtime.GOOS != "darwin" && ready.NativeMemoryBytes == 0) { + readinessFailed = true + process.Kill() + _ = <-stderrDone return empty, fmt.Errorf("%w: native readiness", ErrUnavailable) } if err = ctx.Err(); err != nil { diff --git a/internal/heicdecode/winisolation/native_windows_test.go b/internal/heicdecode/winisolation/native_windows_test.go index b7e3408e..18cca1f1 100644 --- a/internal/heicdecode/winisolation/native_windows_test.go +++ b/internal/heicdecode/winisolation/native_windows_test.go @@ -69,7 +69,9 @@ func ownedPolicyControl(limits heicdecode.Limits) error { return fmt.Errorf("unexpected commitment refusal: %w", err) } // A second copy of this inert control must be refused by the kernel. - child, err := os.StartProcess(os.Args[0], []string{os.Args[0], "--owned-exit"}, &os.ProcAttr{}) + child, err := os.StartProcess(os.Args[0], []string{os.Args[0], "--owned-exit"}, &os.ProcAttr{ + Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, + }) if child != nil { _ = child.Kill() _, _ = child.Wait() diff --git a/internal/heicdecode/worker/main.go b/internal/heicdecode/worker/main.go index a115b55e..68d5b8ed 100644 --- a/internal/heicdecode/worker/main.go +++ b/internal/heicdecode/worker/main.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "net" "os" "runtime" @@ -39,11 +40,13 @@ func Main(args []string) int { debug.SetMemoryLimit(limits.OSProcessBytes - limits.OSProcessBytes/4) nativeMemory, err := isolate(limits) if err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) return 3 } ctx, cancel := context.WithTimeout(context.Background(), limits.Timeout) defer cancel() if err = verifyDenial(ctx, args[2], args[3], args[4], args[5]); err != nil { + _, _ = fmt.Fprintln(os.Stderr, err) return 3 } if err = heicdecode.WriteReady(os.Stdout, heicdecode.Ready{WASMMemoryBytes: limits.WASMMemoryBytes, NativeMemoryBytes: nativeMemory}); err != nil { @@ -89,7 +92,7 @@ func verifyDenial(ctx context.Context, readPath, writePath, tcpAddress, udpAddre _ = connection.Close() } if !permissionDenied(dialErr) { - return errors.New("HEIC native network denial unavailable") + return fmt.Errorf("HEIC native %s denial unavailable: %v", network, dialErr) } } return ctx.Err() diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 50b14ca1..f9aa301b 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1024,3 +1024,31 @@ environment approval and artifact names stay fixed. Regression `TestReleaseSigningDoesNotExecuteRepositoryCode` was observed red for checkout, toolchain and Go execution; it must pass after the workflow correction. No real signing service, release tag or publication is exercised by this loop. + +Round 5 (`6537ac0`) passes the native token and job queries and the bounded +commitment refusal. Its inert child-process control fails in Go before reaching +the kernel: syscall.StartProcess returns EINVAL when ProcAttr.Files has fewer +than three entries. Supply the owned control's three standard handles and keep +requiring an actual permission/quota/child-policy refusal. The real helper still +fails readiness; add bounded, quoted startup diagnostics to distinguish native +policy, file denial and TCP/UDP denial. They are available only before any image +input; diagnostics after readiness remain private and overflow remains fatal. +Owned-peer regression tests cover this boundary. No denial criterion changes. + +Qodana `35078625681` has zero post-suppression findings for `6537ac0`. CodeQL +`35078625690` has zero Go/Actions results and no open PR alerts; its merge parents +include that exact head. CI `35078625610` passes every job except the two Windows +HEIC guards. Focused client/worker/package tests, ARM64 cross-compilation, +format/exclusion checks and GoLand inspections pass for the next corrections. +`TestWindowsHEICManifestFinalization` extracts the actual fixed PowerShell data +transformation and runs it on inert helper bytes, including both targets, an +invalid target, a zero guest digest and an oversized manifest. Native Windows +CI requires this guard without skips; local macOS only compiles it. No test +authenticates a signer or runs the fixture as an executable. + +The SSH signing delay cleared on resumption: security fix `c77d9bd` is signed +and present on PR #28. Focused tests, vet, format/exclusion checks and GoLand +inspections pass for the remaining local changes. Required remaining work: +publish native diagnostics and the PowerShell fixture test, dispose of thread +`4024388304`, complete another fresh review, pass both Windows native guards, +and inspect final CI/static reports for the eventual head. diff --git a/scripts/msixstage/msixstage_test.go b/scripts/msixstage/msixstage_test.go index 02e0f5b3..1904d03a 100644 --- a/scripts/msixstage/msixstage_test.go +++ b/scripts/msixstage/msixstage_test.go @@ -3,6 +3,7 @@ package main import ( "bytes" "context" + "crypto/sha256" "encoding/json" "encoding/xml" "errors" @@ -14,12 +15,15 @@ import ( "os/exec" "path/filepath" "regexp" + "runtime" "strconv" "strings" "testing" + "time" "go.yaml.in/yaml/v3" + "github.com/frathe/picfetch/internal/heicdecode/client" "github.com/frathe/picfetch/internal/imaging" ) @@ -360,6 +364,96 @@ func TestReleaseSigningDoesNotExecuteRepositoryCode(t *testing.T) { } } +// Execute only the fixed data transformation from the real workflow, with an +// inert helper file. This never authenticates a signer or executes an artifact. +func TestWindowsHEICManifestFinalization(t *testing.T) { + if runtime.GOOS != "windows" { + t.Skip("requires the native Windows PowerShell used by release signing") + } + data, err := os.ReadFile("../../.github/workflows/release.yml") + if err != nil { + t.Fatal(err) + } + var workflow struct { + Jobs map[string]struct{ Steps []struct{ Run string } } + } + if err = yaml.Unmarshal(data, &workflow); err != nil { + t.Fatal(err) + } + var transform string + for _, step := range workflow.Jobs["sign-windows"].Steps { + start := strings.Index(step.Run, "$manifestPath =") + end := strings.Index(step.Run, "foreach ($signedFile") + if start >= 0 && end > start { + transform = step.Run[start:end] + } + } + if transform == "" { + t.Fatal("fixed manifest transformation is missing") + } + for _, tc := range []struct { + name, arch, target, guest string + oversized, rejected bool + }{ + {"amd64", "amd64", "amd64", strings.Repeat("a", 64), false, false}, + {"arm64", "arm64", "arm64", strings.Repeat("b", 64), false, false}, + {"wrong target", "amd64", "arm64", strings.Repeat("a", 64), false, true}, + {"zero guest", "amd64", "amd64", strings.Repeat("0", 64), false, true}, + {"oversized", "amd64", "amd64", strings.Repeat("a", 64), true, true}, + } { + t.Run(tc.name, func(t *testing.T) { + root := filepath.Join(t.TempDir(), "owned ' data") + if err := os.MkdirAll(filepath.Join(root, "heic"), 0700); err != nil { + t.Fatal(err) + } + helper, manifest, err := client.PackagePaths(root, "windows") + if err != nil { + t.Fatal(err) + } + inert := []byte("owned inert helper hash fixture") + if err = os.WriteFile(helper, inert, 0600); err != nil { + t.Fatal(err) + } + record := client.PackageManifest{Version: 1, GOOS: "windows", GOARCH: tc.target, ExecutableSHA256: strings.Repeat("0", 64), GuestSHA256: tc.guest} + encoded, err := json.Marshal(record) + if err != nil { + t.Fatal(err) + } + if tc.oversized { + encoded = append(encoded, bytes.Repeat([]byte(" "), 4096)...) + } + if err = os.WriteFile(manifest, encoded, 0600); err != nil { + t.Fatal(err) + } + script := "param([string]$unpacked, [string]$arch)\n$ErrorActionPreference = 'Stop'\n$helper = Join-Path $unpacked 'heic/picfetch-heic-worker.exe'\n" + transform + path := filepath.Join(t.TempDir(), "finalize.ps1") + if err = os.WriteFile(path, []byte(script), 0600); err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) + defer cancel() + output, runErr := exec.CommandContext(ctx, "pwsh", "-NoProfile", "-NonInteractive", "-File", path, root, tc.arch).CombinedOutput() + if ctx.Err() != nil || (runErr != nil) != tc.rejected { + t.Fatalf("finalization: %v, context=%v, output=%s", runErr, ctx.Err(), output) + } + if tc.rejected { + return + } + _, digest, err := client.LoadPackage(root, "windows", tc.arch) + if err != nil || digest != sha256.Sum256(inert) { + t.Fatalf("finalized package: digest=%x err=%v", digest, err) + } + updated, err := os.ReadFile(manifest) + if err != nil { + t.Fatal(err) + } + if err = json.Unmarshal(updated, &record); err != nil || record.GuestSHA256 != tc.guest { + t.Fatalf("guest identity changed: %+v, %v", record, err) + } + }) + } +} + func TestMicrosoftStoreWorkflowAndBuildTarget(t *testing.T) { root := filepath.Clean(filepath.Join("..", "..")) workflow, err := os.ReadFile(filepath.Join(root, ".github", "workflows", "microsoft-store.yml")) diff --git a/scripts/nativeguards/main.go b/scripts/nativeguards/main.go index 77bb1d35..0aea6ed4 100644 --- a/scripts/nativeguards/main.go +++ b/scripts/nativeguards/main.go @@ -52,6 +52,7 @@ func suiteFor(name, hostOS string) (suite, error) { s.require("internal/update", "TestApplyWindows_ReplacesDestAndKeepsOld", "TestApplyWindows_MissingStagedBinaryRestoresDest", "TestWindowsRelaunchCommand_PassesThePIDInTheInheritedEnvironment", "TestClassifyApplyError_WindowsErrno", "TestWaitMilliseconds_NeverConvertsToAnUnboundedWait", "TestDownloadedCompanionsRemainVerifiedAfterPersistence", "TestApplyInstallsCompanionsAndRollsBackOnBinaryFailure") s.require("internal/ui/autoupdate", "TestUpdater_AutomaticAndManualShareCompleteTransaction", "TestApplyStagedUpdate_SuccessRemovesTheStageOnEveryPlatform") s.require("internal/distribution", "TestStoreManaged_DefaultBuildIsFalse") + s.require("scripts/msixstage", "TestWindowsHEICManifestFinalization") case "macos": s.goos = "darwin" s.require("", "TestInstall_GraftsOntoGLFWsDelegate") diff --git a/todos.md b/todos.md index 46bbfdbd..9fe9fdc9 100644 --- a/todos.md +++ b/todos.md @@ -106,11 +106,12 @@ historical decoder-suite equivalence is claimed. Remaining qualification: -- Ronin resumed the GitHub Codex review loop on September 16. At `08a71f2`, - Linux amd64/arm64 and macOS Intel/Apple Silicon helper guards and all UI race - shards pass. Windows HEIC guards and a stale packaging-notice assertion in - the non-UI Linux race job fail. Fresh code/security reviews, static-report - dispositions and required CI remain pending in the active plan. Local +- Ronin resumed the GitHub Codex review loop on September 16. At `6537ac0`, + all Linux race shards, Linux amd64/arm64 and macOS Intel/Apple Silicon helper + guards, ordinary Windows and validation pass. Windows HEIC qualification + still fails. Qodana's post-suppression report and both CodeQL reports contain + zero results. The fresh security review found repository execution in the + signing job; its confirmed fix and another review round are in progress. Local canonical shard verification is unavailable because the Docker daemon is stopped. - Ronin accepted the absent hard total native-memory cap on macOS. WASM, transport, deadline and sandbox controls remain mandatory; helper-only From 6021a5f04013e5c9756e600dddc1703c2768bcb7 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 12:09:41 +0200 Subject: [PATCH 15/30] Verify Windows loopback denial against native isolation policy --- ARCHITECTURE.md | 4 + THREAT-MODEL.md | 8 ++ internal/heicdecode/client/client_test.go | 38 +++++++++ internal/heicdecode/client/probes.go | 82 +++++++++++++++++++ internal/heicdecode/client/process.go | 14 ++-- internal/heicdecode/worker/isolate_windows.go | 39 +++++++++ internal/heicdecode/worker/main.go | 13 ++- internal/heicdecode/worker/network_other.go | 12 +++ internal/heicdecode/worker/runtime_test.go | 10 +++ plans/2026-09-15-isolated-heic-restoration.md | 35 ++++++++ scripts/msixstage/msixstage_test.go | 2 +- scripts/nativeguards/main.go | 1 + todos.md | 12 +-- 13 files changed, 253 insertions(+), 17 deletions(-) create mode 100644 internal/heicdecode/client/probes.go create mode 100644 internal/heicdecode/worker/network_other.go diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 758a0eaf..b9711035 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -623,6 +623,8 @@ grants. `broker.go` serves at most eight explicit pipe connections through that same lane, sending native-ready grants before remote bulk reads and retaining admission through result delivery. `remote.go` validates frames and joins cancellation; a disconnected queued peer is observed through one control byte. +`probes.go` owns checked loopback listeners and a bounded UDP echo worker, closed +and joined before image input or at failed-start cleanup. `attachment.go` supplies explicit inherited pipes and observes parent-copy, service and remote lifetimes. GUI construction and analysis requests share one optional owner; production currently supplies none pending qualification. @@ -639,6 +641,8 @@ stdio/scheduling operations. It verifies RLIMIT_AS/CPU/core/file/descriptor limits and a no-access oversized-mapping refusal before readiness. Its native qualification is a separate `heic-linux` CI suite. Windows amd64/arm64 uses `winisolation` below and verifies its token/job before the same denial probes. +Windows additionally confirms timed-out loopback probes through the native +network-isolation diagnostic API; other platforms require permission errors. Other builds refuse startup. Native-memory readiness is explicitly zero on macOS; its Go memory target is not a hard OS cap. The helper alone may diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index d1d6d985..47c2975d 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -153,6 +153,14 @@ Profile creation uses a bounded per-user/session cross-process mutex. These startup corrections still require passing native CI; they grant no additional AppContainer capabilities or filesystem rights. +Windows can drop blocked loopback traffic instead of returning a permission +error. Both parent-owned listeners are positively checked before launch, and +UDP has a bounded one-byte echo worker. A helper timeout qualifies only with a +live request and a successful native network-isolation diagnosis identifying a +missing capability. Successful communication, an absent listener or an API +failure refuses readiness. The listeners close before image input; their worker +is joined on every path. Linux/macOS still require explicit permission refusal. + Actual platform controls are verified before helper readiness; unsupported or failed setup refuses input. OS controls and WASI restrictions protect different boundaries. A decoder failure, runtime compromise and OS sandbox escape are diff --git a/internal/heicdecode/client/client_test.go b/internal/heicdecode/client/client_test.go index e1325c08..d2e6f340 100644 --- a/internal/heicdecode/client/client_test.go +++ b/internal/heicdecode/client/client_test.go @@ -250,6 +250,44 @@ func TestOwnedPeerStartupDiagnostics(t *testing.T) { } } +func TestOwnedNativeProbesEchoAndJoin(t *testing.T) { + probes, err := openNativeProbes(context.Background()) + if err != nil { + t.Fatal(err) + } + defer probes.close() + connection, err := net.DialTimeout("udp4", probes.udp.LocalAddr().String(), time.Second) + if err != nil { + t.Fatal(err) + } + defer func() { _ = connection.Close() }() + _ = connection.SetDeadline(time.Now().Add(time.Second)) + if _, err = connection.Write([]byte{0}); err != nil { + t.Fatal(err) + } + var reply [1]byte + if _, err = io.ReadFull(connection, reply[:]); err != nil || reply[0] != 0 { + t.Fatalf("owned probe echo: %v, %v", reply, err) + } + probes.close() + select { + case <-probes.udpDone: + default: + t.Fatal("probe close did not join its worker") + } + if _, _, err = probes.udp.ReadFrom(reply[:]); !errors.Is(err, net.ErrClosed) { + t.Fatalf("probe listener remained open: %v", err) + } + ctx, cancel := context.WithCancel(context.Background()) + cancel() + if unexpected, err := openNativeProbes(ctx); !errors.Is(err, context.Canceled) || unexpected != nil { + if unexpected != nil { + unexpected.close() + } + t.Fatalf("cancelled probe setup: %v", err) + } +} + func TestStopCancelsAdmittedAndWaitingSources(t *testing.T) { client := ownedPeer(t, "hang", 5*time.Second) entered := make(chan struct{}) diff --git a/internal/heicdecode/client/probes.go b/internal/heicdecode/client/probes.go new file mode 100644 index 00000000..478ea288 --- /dev/null +++ b/internal/heicdecode/client/probes.go @@ -0,0 +1,82 @@ +package client + +import ( + "context" + "fmt" + "io" + "net" + "time" +) + +// nativeProbes owns only disposable loopback listeners. The parent first +// verifies they work, so a helper timeout cannot stand for an absent listener. +type nativeProbes struct { + tcp net.Listener + udp net.PacketConn + udpDone chan struct{} +} + +func openNativeProbes(ctx context.Context) (*nativeProbes, error) { + tcp, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + return nil, err + } + p := &nativeProbes{tcp: tcp} + p.udp, err = net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + p.close() + return nil, err + } + p.udpDone = make(chan struct{}) + go func() { + defer close(p.udpDone) + var packet [1]byte + for { + n, from, readErr := p.udp.ReadFrom(packet[:]) + if readErr != nil { + return + } + if n == 1 && packet[0] == 0 { + _ = p.udp.SetWriteDeadline(time.Now().Add(time.Second)) + _, _ = p.udp.WriteTo(packet[:], from) + } + } + }() + for i, address := range []string{p.tcp.Addr().String(), p.udp.LocalAddr().String()} { + network := "tcp4" + if i == 1 { + network = "udp4" + } + dialer := net.Dialer{Timeout: time.Second} + connection, checkErr := dialer.DialContext(ctx, network, address) + if connection != nil { + if i == 1 { + _ = connection.SetDeadline(time.Now().Add(time.Second)) + _, checkErr = connection.Write([]byte{0}) + if checkErr == nil { + var reply [1]byte + _, checkErr = io.ReadFull(connection, reply[:]) + if checkErr == nil && reply[0] != 0 { + checkErr = fmt.Errorf("unexpected native UDP probe reply") + } + } + } + _ = connection.Close() + } + if checkErr != nil { + p.close() + return nil, fmt.Errorf("verify owned %s listener: %w", network, checkErr) + } + } + return p, nil +} + +func (p *nativeProbes) close() { + _ = p.tcp.Close() + if p.udp != nil { + _ = p.udp.Close() + } + if p.udpDone != nil { + <-p.udpDone + } +} diff --git a/internal/heicdecode/client/process.go b/internal/heicdecode/client/process.go index 1a85ff2c..07d82364 100644 --- a/internal/heicdecode/client/process.go +++ b/internal/heicdecode/client/process.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "io" - "net" "os" "os/exec" "path/filepath" @@ -30,21 +29,16 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) } // Both endpoints belong to this request. A failed sandbox can reach only // these disposable loopback sockets, never an unrelated network service. - tcp, err := net.Listen("tcp4", "127.0.0.1:0") + probes, err := openNativeProbes(ctx) if err != nil { return empty, err } - defer func() { _ = tcp.Close() }() - udp, err := net.ListenPacket("udp4", "127.0.0.1:0") - if err != nil { - return empty, err - } - defer func() { _ = udp.Close() }() + defer probes.close() limitsJSON, err := json.Marshal(c.config.Limits) if err != nil { return empty, err } - cmd := exec.Command(c.config.Executable, "--heic-worker-v2", string(limitsJSON), readPath, writePath, tcp.Addr().String(), udp.LocalAddr().String()) + cmd := exec.Command(c.config.Executable, "--heic-worker-v2", string(limitsJSON), readPath, writePath, probes.tcp.Addr().String(), probes.udp.LocalAddr().String()) cmd.Env = []string{"GOMAXPROCS=1"} cmd.Dir = string(filepath.Separator) var pipes []*os.File @@ -138,6 +132,8 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) _ = <-stderrDone return empty, fmt.Errorf("%w: native readiness", ErrUnavailable) } + // No loopback listener remains reachable when image bytes are admitted. + probes.close() if err = ctx.Err(); err != nil { return empty, err } diff --git a/internal/heicdecode/worker/isolate_windows.go b/internal/heicdecode/worker/isolate_windows.go index eabf5bb8..bebdf054 100644 --- a/internal/heicdecode/worker/isolate_windows.go +++ b/internal/heicdecode/worker/isolate_windows.go @@ -3,6 +3,14 @@ package worker import ( + "context" + "errors" + "fmt" + "net" + "unsafe" + + "golang.org/x/sys/windows" + "github.com/frathe/picfetch/internal/heicdecode" "github.com/frathe/picfetch/internal/heicdecode/winisolation" ) @@ -13,3 +21,34 @@ func isolate(limits heicdecode.Limits) (int64, error) { } return limits.OSProcessBytes, nil } + +// Windows drops blocked AppContainer loopback packets. A timeout therefore +// needs independent policy evidence; it never suffices by itself. +func confirmNetworkDenial(ctx context.Context, host string, probeErr error) error { + if err := ctx.Err(); err != nil { + return err + } + var networkErr net.Error + if host != "127.0.0.1" || !errors.As(probeErr, &networkErr) || !networkErr.Timeout() { + return errors.New("expected a timed-out owned loopback probe") + } + server, err := windows.UTF16PtrFromString(host) + if err != nil { + return err + } + query := windows.NewLazySystemDLL("Firewallapi.dll").NewProc("NetworkIsolationDiagnoseConnectFailureAndGetInfo") + if err = query.Find(); err != nil { + return err + } + // NETISO_ERROR_TYPE: 0 means no isolation failure, 1..3 identify missing + // network capabilities, and 4 is the invalid/sentinel value. + reason := uint32(4) + code, _, _ := query.Call(uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(&reason))) + if code != 0 { + return fmt.Errorf("query HEIC network isolation: %w", windows.Errno(code)) + } + if reason < 1 || reason > 3 { + return fmt.Errorf("HEIC network isolation did not confirm a missing capability: %d", reason) + } + return ctx.Err() +} diff --git a/internal/heicdecode/worker/main.go b/internal/heicdecode/worker/main.go index 68d5b8ed..4dc3579a 100644 --- a/internal/heicdecode/worker/main.go +++ b/internal/heicdecode/worker/main.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net" "os" "runtime" @@ -88,11 +89,18 @@ func verifyDenial(ctx context.Context, readPath, writePath, tcpAddress, udpAddre if i == 1 { _ = connection.SetWriteDeadline(time.Now().Add(time.Second)) _, dialErr = connection.Write([]byte{0}) + if runtime.GOOS == "windows" && dialErr == nil { + _ = connection.SetReadDeadline(time.Now().Add(time.Second)) + var reply [1]byte + _, dialErr = io.ReadFull(connection, reply[:]) + } } _ = connection.Close() } if !permissionDenied(dialErr) { - return fmt.Errorf("HEIC native %s denial unavailable: %v", network, dialErr) + if confirmErr := confirmNetworkDenial(ctx, host, dialErr); confirmErr != nil { + return fmt.Errorf("HEIC native %s denial unavailable: %v (%w)", network, dialErr, confirmErr) + } } } return ctx.Err() @@ -100,6 +108,7 @@ func verifyDenial(ctx context.Context, readPath, writePath, tcpAddress, udpAddre func permissionDenied(err error) bool { // Winsock reports WSAEACCES (10013), while file APIs use the ordinary - // permission mapping. Refused connections or timeouts do not prove denial. + // permission mapping. A timeout alone never proves denial; Windows may + // separately confirm its dropped loopback traffic through the native API. return errors.Is(err, os.ErrPermission) || (runtime.GOOS == "windows" && errors.Is(err, syscall.Errno(10013))) } diff --git a/internal/heicdecode/worker/network_other.go b/internal/heicdecode/worker/network_other.go new file mode 100644 index 00000000..10178062 --- /dev/null +++ b/internal/heicdecode/worker/network_other.go @@ -0,0 +1,12 @@ +//go:build !windows || (!amd64 && !arm64) + +package worker + +import ( + "context" + "errors" +) + +func confirmNetworkDenial(_ context.Context, _ string, _ error) error { + return errors.New("explicit native permission refusal required") +} diff --git a/internal/heicdecode/worker/runtime_test.go b/internal/heicdecode/worker/runtime_test.go index 53e1ab9d..13ed9be1 100644 --- a/internal/heicdecode/worker/runtime_test.go +++ b/internal/heicdecode/worker/runtime_test.go @@ -182,3 +182,13 @@ func TestNativeDenialErrorsRequirePermission(t *testing.T) { } } } + +func TestNativeNetworkDenialRejectsUnisolatedProcess(t *testing.T) { + // Even on Windows a timeout is insufficient in an ordinary process. The + // native API must identify an actual missing AppContainer capability. + for _, probeErr := range []error{nil, os.ErrDeadlineExceeded, context.Canceled, errors.New("connection refused")} { + if err := confirmNetworkDenial(context.Background(), "127.0.0.1", probeErr); err == nil { + t.Fatalf("unisolated network failure accepted as denial: %v", probeErr) + } + } +} diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index f9aa301b..cec43059 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1052,3 +1052,38 @@ inspections pass for the remaining local changes. Required remaining work: publish native diagnostics and the PowerShell fixture test, dispose of thread `4024388304`, complete another fresh review, pass both Windows native guards, and inspect final CI/static reports for the eventual head. + +Round 6 (`3973811`) passes Windows token/job, commitment, process denial and +the real PowerShell manifest-transformation guard. Both real helper fixtures +stop on a TCP loopback timeout. Windows' AppContainer loopback filter drops +packets rather than necessarily returning WSAEACCES. Chromium's native tests +likewise observe TCP/UDP timeouts; Microsoft's diagnostic API can identify a +missing network capability. Sources: +[Windows loopback filtering](https://learn.microsoft.com/en-us/windows/security/operating-system-security/network-security/windows-firewall/filter-origin-documentation#appcontainer-loopback), +[native Chromium controls](https://chromium.googlesource.com/chromium/src/+/90ebe709881f7572f250d30e9ec77a39b5d8a482/sandbox/win/src/app_container_test.cc), +[NetworkIsolationDiagnoseConnectFailureAndGetInfo](https://learn.microsoft.com/en-us/windows/win32/api/netfw/nf-netfw-networkisolationdiagnoseconnectfailureandgetinfo). + +Lead-owned correction: retain empty-capability AppContainer/job verification, +all file denial checks and existing sandbox limits. Validate both parent-owned +loopback listeners before launching the helper. Keep a bounded one-byte UDP +echo worker with close/join cleanup; Windows must receive no echo. A Windows +timeout qualifies only while the request is live and the native diagnostic API +successfully identifies a missing capability. An ordinary timeout without this +policy evidence, a refused connection, successful communication, cancellation +or an API error still fails closed. Linux/macOS still require permission errors. +Focused client/worker tests, Windows cross-builds and both native Windows CI +jobs are the acceptance commands; GoLand must inspect all changed code. + +The ordinary Windows suite additionally exposed an existing jq fixture check +that expected LF-only output; normalize surrounding whitespace while retaining +the exact `false` result and failing exit requirement. No environment policy is +changed. The startup-diagnostic test was also negatively verified locally by +removing its delivery, observing the expected failure, restoring and passing. + +Local evidence for round 6: focused client, worker, msixstage and nativeguards +tests pass; the new probe lifetime and startup cases pass under race. Windows +amd64 cross-build and ARM64 focused vet pass. Every changed Go file has clear +GoLand inspections, including weak warnings. Qodana/CodeQL for `3973811` contain +zero results; full CI passes except the three Windows jobs described above. +Code review comment `5695648748` and security comment `5695706814` explicitly +report no findings on `c77d9bd`; thread `4024388304` is resolved with fix evidence. diff --git a/scripts/msixstage/msixstage_test.go b/scripts/msixstage/msixstage_test.go index 1904d03a..3fedccdd 100644 --- a/scripts/msixstage/msixstage_test.go +++ b/scripts/msixstage/msixstage_test.go @@ -597,7 +597,7 @@ func testStoreEnvironmentPolicy(t *testing.T) { cmd := exec.Command("jq", "-e", "-s", "-f", "../storepublish/environment-policy.jq") cmd.Stdin = strings.NewReader(environment + "\n" + branches + "\n" + custom) out, err := cmd.CombinedOutput() - if (err == nil) != (change == "valid") || (err != nil && string(out) != "false\n") { + if (err == nil) != (change == "valid") || (err != nil && strings.TrimSpace(string(out)) != "false") { t.Fatalf("policy %s: %s (%v)", change, out, err) } }) diff --git a/scripts/nativeguards/main.go b/scripts/nativeguards/main.go index 0aea6ed4..69d22120 100644 --- a/scripts/nativeguards/main.go +++ b/scripts/nativeguards/main.go @@ -74,6 +74,7 @@ func suiteFor(name, hostOS string) (suite, error) { s.goos = "windows" s.tags = "heicnative" s.require("internal/heicdecode/winisolation", "TestNativeWindowsJobAndToken", "TestNativeWindowsUnsandboxedRefused") + s.require("internal/heicdecode/worker", "TestNativeNetworkDenialRejectsUnisolatedProcess") s.require("internal/heicdecode/client", "TestNativeSandboxHelper") s.require("internal/heicdecode/client", "TestInheritedRemoteUsesOwner", "TestInheritedRemoteCancellationJoins", "TestAttachmentStopWithoutProcessStartJoinsOwner", "TestRemoteQueuedCancellationReleasesService", "TestRemoteOutputRetainsAdmissionAndStopJoins") s.require("internal/similarity", "TestAnalysisWorkersUseHEICOwner", "TestAnalysisHEICAttachmentStartFailureJoins") diff --git a/todos.md b/todos.md index 9fe9fdc9..61a68698 100644 --- a/todos.md +++ b/todos.md @@ -106,12 +106,14 @@ historical decoder-suite equivalence is claimed. Remaining qualification: -- Ronin resumed the GitHub Codex review loop on September 16. At `6537ac0`, +- Ronin resumed the GitHub Codex review loop on September 16. At `3973811`, all Linux race shards, Linux amd64/arm64 and macOS Intel/Apple Silicon helper - guards, ordinary Windows and validation pass. Windows HEIC qualification - still fails. Qodana's post-suppression report and both CodeQL reports contain - zero results. The fresh security review found repository execution in the - signing job; its confirmed fix and another review round are in progress. Local + guards and validation pass. Windows HEIC qualification still fails on loopback + timeout interpretation; the ordinary suite exposes a CRLF fixture assertion. + Qodana's post-suppression report and both CodeQL reports contain zero results. + The signing-job security finding is fixed, resolved and followed by clean + code/security reviews on `c77d9bd`. The Windows corrections and another review + round are in progress. Local canonical shard verification is unavailable because the Docker daemon is stopped. - Ronin accepted the absent hard total native-memory cap on macOS. WASM, transport, deadline and sandbox controls remain mandatory; helper-only From 665dd4b1e9418a0001336e4d7dbc2617e9813aa4 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 12:17:30 +0200 Subject: [PATCH 16/30] Verify AppContainer loopback exemptions before readiness --- ARCHITECTURE.md | 3 +- THREAT-MODEL.md | 5 +- .../heicdecode/winisolation/policy_windows.go | 72 ++++++++++++++++++- internal/heicdecode/worker/isolate_windows.go | 21 +----- internal/heicdecode/worker/runtime_test.go | 2 +- plans/2026-09-15-isolated-heic-restoration.md | 14 ++++ 6 files changed, 91 insertions(+), 26 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index b9711035..8689121e 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -642,7 +642,8 @@ limits and a no-access oversized-mapping refusal before readiness. Its native qualification is a separate `heic-linux` CI suite. Windows amd64/arm64 uses `winisolation` below and verifies its token/job before the same denial probes. Windows additionally confirms timed-out loopback probes through the native -network-isolation diagnostic API; other platforms require permission errors. +loopback exemption API and verified AppContainer token; other platforms require +permission errors. Other builds refuse startup. Native-memory readiness is explicitly zero on macOS; its Go memory target is not a hard OS cap. The helper alone may diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 47c2975d..fde3318f 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -156,8 +156,9 @@ AppContainer capabilities or filesystem rights. Windows can drop blocked loopback traffic instead of returning a permission error. Both parent-owned listeners are positively checked before launch, and UDP has a bounded one-byte echo worker. A helper timeout qualifies only with a -live request and a successful native network-isolation diagnosis identifying a -missing capability. Successful communication, an absent listener or an API +live request and a verified zero-capability AppContainer identity that the +native loopback exemption query confirms is not exempt. Successful +communication, an absent listener or an API failure refuses readiness. The listeners close before image input; their worker is joined on every path. Linux/macOS still require explicit permission refusal. diff --git a/internal/heicdecode/winisolation/policy_windows.go b/internal/heicdecode/winisolation/policy_windows.go index 64b15580..12f259d7 100644 --- a/internal/heicdecode/winisolation/policy_windows.go +++ b/internal/heicdecode/winisolation/policy_windows.go @@ -60,6 +60,14 @@ func Verify(limits heicdecode.Limits) error { if err := limits.Validate(); err != nil { return err } + if err := verifyToken(); err != nil { + return err + } + // A null handle queries the caller's immediate job even in a nested job. + return verifyJob(0, limits) +} + +func verifyToken() error { token := windows.GetCurrentProcessToken() var isContainer uint32 var length uint32 @@ -96,6 +104,66 @@ func Verify(limits heicdecode.Limits) error { if !matches { return errors.New("HEIC helper has an unexpected AppContainer identity") } - // A null handle queries the caller's immediate job even in a nested job. - return verifyJob(0, limits) + return nil +} + +// VerifyLoopbackIsolation requires the verified zero-capability AppContainer +// identity to be absent from Windows' explicit loopback exemptions. Capability +// diagnosis alone does not cover loopback, which Windows filters separately. +func VerifyLoopbackIsolation() (resultErr error) { + if err := verifyToken(); err != nil { + return err + } + expected, err := containerSID(false) + if err != nil { + return err + } + defer func() { _ = windows.FreeSid(expected) }() + query := windows.NewLazySystemDLL("Firewallapi.dll").NewProc("NetworkIsolationGetAppContainerConfig") + kernel := windows.NewLazySystemDLL("kernel32.dll") + getHeap, free := kernel.NewProc("GetProcessHeap"), kernel.NewProc("HeapFree") + for _, proc := range []*windows.LazyProc{query, getHeap, free} { + if err = proc.Find(); err != nil { + return err + } + } + heap, _, heapErr := getHeap.Call() + if heap == 0 { + return fmt.Errorf("get HEIC isolation query heap: %w", heapErr) + } + var count uint32 + var entries *windows.SIDAndAttributes + code, _, _ := query.Call(uintptr(unsafe.Pointer(&count)), uintptr(unsafe.Pointer(&entries))) + if code != 0 { + return fmt.Errorf("query HEIC loopback exemptions: %w", windows.Errno(code)) + } + if count != 0 && entries == nil { + return errors.New("HEIC loopback exemption query returned no entries") + } + items := unsafe.Slice(entries, count) + // The API allocates both the array and each SID on the process heap. + // https://learn.microsoft.com/windows/win32/api/networkisolation/nf-networkisolation-networkisolationgetappcontainerconfig + defer func() { + for _, item := range items { + if item.Sid != nil { + if ok, _, _ := free.Call(heap, 0, uintptr(unsafe.Pointer(item.Sid))); ok == 0 { + resultErr = errors.Join(resultErr, errors.New("free HEIC loopback exemption SID")) + } + } + } + if entries != nil { + if ok, _, _ := free.Call(heap, 0, uintptr(unsafe.Pointer(entries))); ok == 0 { + resultErr = errors.Join(resultErr, errors.New("free HEIC loopback exemption array")) + } + } + }() + for _, item := range items { + if item.Sid == nil { + return errors.New("HEIC loopback exemption query returned an invalid SID") + } + if expected.Equals(item.Sid) { + return errors.New("HEIC AppContainer has a loopback exemption") + } + } + return nil } diff --git a/internal/heicdecode/worker/isolate_windows.go b/internal/heicdecode/worker/isolate_windows.go index bebdf054..478eb471 100644 --- a/internal/heicdecode/worker/isolate_windows.go +++ b/internal/heicdecode/worker/isolate_windows.go @@ -5,11 +5,7 @@ package worker import ( "context" "errors" - "fmt" "net" - "unsafe" - - "golang.org/x/sys/windows" "github.com/frathe/picfetch/internal/heicdecode" "github.com/frathe/picfetch/internal/heicdecode/winisolation" @@ -32,23 +28,8 @@ func confirmNetworkDenial(ctx context.Context, host string, probeErr error) erro if host != "127.0.0.1" || !errors.As(probeErr, &networkErr) || !networkErr.Timeout() { return errors.New("expected a timed-out owned loopback probe") } - server, err := windows.UTF16PtrFromString(host) - if err != nil { - return err - } - query := windows.NewLazySystemDLL("Firewallapi.dll").NewProc("NetworkIsolationDiagnoseConnectFailureAndGetInfo") - if err = query.Find(); err != nil { + if err := winisolation.VerifyLoopbackIsolation(); err != nil { return err } - // NETISO_ERROR_TYPE: 0 means no isolation failure, 1..3 identify missing - // network capabilities, and 4 is the invalid/sentinel value. - reason := uint32(4) - code, _, _ := query.Call(uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(&reason))) - if code != 0 { - return fmt.Errorf("query HEIC network isolation: %w", windows.Errno(code)) - } - if reason < 1 || reason > 3 { - return fmt.Errorf("HEIC network isolation did not confirm a missing capability: %d", reason) - } return ctx.Err() } diff --git a/internal/heicdecode/worker/runtime_test.go b/internal/heicdecode/worker/runtime_test.go index 13ed9be1..7c948ac0 100644 --- a/internal/heicdecode/worker/runtime_test.go +++ b/internal/heicdecode/worker/runtime_test.go @@ -185,7 +185,7 @@ func TestNativeDenialErrorsRequirePermission(t *testing.T) { func TestNativeNetworkDenialRejectsUnisolatedProcess(t *testing.T) { // Even on Windows a timeout is insufficient in an ordinary process. The - // native API must identify an actual missing AppContainer capability. + // native API must confirm the nonexempt AppContainer identity and policy. for _, probeErr := range []error{nil, os.ErrDeadlineExceeded, context.Canceled, errors.New("connection refused")} { if err := confirmNetworkDenial(context.Background(), "127.0.0.1", probeErr); err == nil { t.Fatalf("unisolated network failure accepted as denial: %v", probeErr) diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index cec43059..a0486489 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1087,3 +1087,17 @@ GoLand inspections, including weak warnings. Qodana/CodeQL for `3973811` contain zero results; full CI passes except the three Windows jobs described above. Code review comment `5695648748` and security comment `5695706814` explicitly report no findings on `c77d9bd`; thread `4024388304` is resolved with fix evidence. + +Round 7 (`6021a5f`) passes the ordinary Windows suite. The native capability +diagnostic returns NETISO_ERROR_TYPE_NONE for loopback, so readiness correctly +remains closed. Loopback filtering is distinct from Internet/private-network +capability checks. Replace that diagnostic with the documented +[NetworkIsolationGetAppContainerConfig](https://learn.microsoft.com/en-us/windows/win32/api/networkisolation/nf-networkisolation-networkisolationgetappcontainerconfig) +query: verify the exact empty-capability AppContainer token again and require +its SID to be absent from the explicit loopback exemption list. Query errors, +invalid results and exemptions refuse readiness. Retain the positively checked +owned listeners, negative traffic observations and all existing OS/WASI limits. +The generic capability API is removed. The unsandboxed-process regression and +both native Windows helper fixtures remain required. The UDP listener guard was +negatively verified by breaking the echo, observing setup refusal, restoring +and passing; a broken listener cannot qualify as blocked worker traffic. From ee5cc67d125c1462d02a8ec480521b6b9dd27123 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 12:23:36 +0200 Subject: [PATCH 17/30] Gate loopback exemptions in the launcher and drain helper diagnostics --- ARCHITECTURE.md | 9 +++--- THREAT-MODEL.md | 6 ++-- internal/heicdecode/client/process.go | 18 ++++++++---- .../winisolation/native_windows_test.go | 28 +++++++++++++++++++ .../heicdecode/winisolation/policy_windows.go | 28 +++++++++---------- .../winisolation/process_windows.go | 3 ++ internal/heicdecode/worker/isolate_windows.go | 4 ++- plans/2026-09-15-isolated-heic-restoration.md | 21 ++++++++++++++ 8 files changed, 90 insertions(+), 27 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 8689121e..52dcfab4 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -641,9 +641,9 @@ stdio/scheduling operations. It verifies RLIMIT_AS/CPU/core/file/descriptor limits and a no-access oversized-mapping refusal before readiness. Its native qualification is a separate `heic-linux` CI suite. Windows amd64/arm64 uses `winisolation` below and verifies its token/job before the same denial probes. -Windows additionally confirms timed-out loopback probes through the native -loopback exemption API and verified AppContainer token; other platforms require -permission errors. +Windows additionally confirms timed-out loopback probes with a verified +AppContainer token after the parent checks the native loopback exemption list; +other platforms require permission errors. Other builds refuse startup. Native-memory readiness is explicitly zero on macOS; its Go memory target is not a hard OS cap. The helper alone may @@ -656,7 +656,8 @@ Fyne or a native HEIC codec. Final application packaging/activation is pending. ### `internal/heicdecode/winisolation` Windows-only helper process boundary. `process_windows.go` creates a suspended -zero-capability AppContainer with three explicit inherited stdio handles, +zero-capability AppContainer after refusing its explicit loopback exemption, +with three explicit inherited stdio handles, assigns a private one-process Job Object with committed-memory/user-CPU limits and kill-on-close, then resumes. `policy_windows.go` queries the actual token, identity, capabilities and immediate job before worker readiness. Process Kill diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index fde3318f..6e5e7650 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -156,8 +156,10 @@ AppContainer capabilities or filesystem rights. Windows can drop blocked loopback traffic instead of returning a permission error. Both parent-owned listeners are positively checked before launch, and UDP has a bounded one-byte echo worker. A helper timeout qualifies only with a -live request and a verified zero-capability AppContainer identity that the -native loopback exemption query confirms is not exempt. Successful +live request and a verified zero-capability AppContainer identity. Before +creating each helper, the parent must confirm through the native loopback +exemption API that this identity is not exempt; the AppContainer itself cannot +perform this privileged query. Successful communication, an absent listener or an API failure refuses readiness. The listeners close before image input; their worker is joined on every path. Linux/macOS still require explicit permission refusal. diff --git a/internal/heicdecode/client/process.go b/internal/heicdecode/client/process.go index 07d82364..87b9eca7 100644 --- a/internal/heicdecode/client/process.go +++ b/internal/heicdecode/client/process.go @@ -90,20 +90,27 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) var readinessFailed bool var diagnostic bytes.Buffer // Read only after pipeWork.Wait. var diagnosticErr error // Read only after pipeWork.Wait. + var stderrErr error // Read only after stderrDone closes. pipeWork.Add(1) - stderrDone := make(chan error, 1) + stderrDone := make(chan struct{}) go func() { defer pipeWork.Done() + defer close(stderrDone) count, readErr := io.Copy(&diagnostic, io.LimitReader(errRead, int64(c.config.Limits.MaxDiagnosticBytes)+1)) if count > int64(c.config.Limits.MaxDiagnosticBytes) { readErr = ErrDiagnosticLimit diagnosticErr = readErr cancel() } - stderrDone <- readErr + stderrErr = readErr }() // Every return after Start waits for process exit and all transport workers. defer func() { + // Stop the producer, then drain its bounded diagnostics before closing + // our read end. Otherwise stdout EOF can race the overflow reader and + // turn a diagnostic-limit failure into an ordinary protocol error. + process.Kill() + <-stderrDone cancel() cancelWork.Wait() // Kill the group before reaping its leader, so its PID cannot be @@ -129,7 +136,7 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) (runtime.GOOS != "darwin" && ready.NativeMemoryBytes == 0) { readinessFailed = true process.Kill() - _ = <-stderrDone + <-stderrDone return empty, fmt.Errorf("%w: native readiness", ErrUnavailable) } // No loopback listener remains reachable when image bytes are admitted. @@ -159,8 +166,9 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) if err = <-writeDone; err != nil { return empty, err } - if err = <-stderrDone; err != nil { - return empty, err + <-stderrDone + if stderrErr != nil { + return empty, stderrErr } if err = ctx.Err(); err != nil { return empty, err diff --git a/internal/heicdecode/winisolation/native_windows_test.go b/internal/heicdecode/winisolation/native_windows_test.go index 18cca1f1..7151ee4c 100644 --- a/internal/heicdecode/winisolation/native_windows_test.go +++ b/internal/heicdecode/winisolation/native_windows_test.go @@ -148,3 +148,31 @@ func TestNativeWindowsUnsandboxedRefused(t *testing.T) { t.Fatal("ordinary test process accepted as isolated helper") } } + +func TestLoopbackExemptionRefusesHelperIdentity(t *testing.T) { + expected, err := containerSID(false) + if err != nil { + t.Fatal(err) + } + defer func() { _ = windows.FreeSid(expected) }() + other, err := windows.StringToSid("S-1-15-2-1") + if err != nil { + t.Fatal(err) + } + for _, tc := range []struct { + name string + entries []windows.SIDAndAttributes + rejected bool + }{ + {"no exemptions", nil, false}, + {"unrelated identity", []windows.SIDAndAttributes{{Sid: other}}, false}, + {"helper identity", []windows.SIDAndAttributes{{Sid: other}, {Sid: expected}}, true}, + {"invalid identity", []windows.SIDAndAttributes{{Sid: nil}}, true}, + } { + t.Run(tc.name, func(t *testing.T) { + if err := validateLoopbackExemptions(expected, tc.entries); (err != nil) != tc.rejected { + t.Fatalf("loopback exemption policy: %v", err) + } + }) + } +} diff --git a/internal/heicdecode/winisolation/policy_windows.go b/internal/heicdecode/winisolation/policy_windows.go index 12f259d7..d495742f 100644 --- a/internal/heicdecode/winisolation/policy_windows.go +++ b/internal/heicdecode/winisolation/policy_windows.go @@ -60,14 +60,17 @@ func Verify(limits heicdecode.Limits) error { if err := limits.Validate(); err != nil { return err } - if err := verifyToken(); err != nil { + if err := VerifyAppContainer(); err != nil { return err } // A null handle queries the caller's immediate job even in a nested job. return verifyJob(0, limits) } -func verifyToken() error { +// VerifyAppContainer checks the exact helper identity and zero capabilities. +// The launcher separately checks privileged loopback configuration before +// creation; the worker can recheck this token after its traffic probes. +func VerifyAppContainer() error { token := windows.GetCurrentProcessToken() var isContainer uint32 var length uint32 @@ -107,23 +110,14 @@ func verifyToken() error { return nil } -// VerifyLoopbackIsolation requires the verified zero-capability AppContainer -// identity to be absent from Windows' explicit loopback exemptions. Capability -// diagnosis alone does not cover loopback, which Windows filters separately. -func VerifyLoopbackIsolation() (resultErr error) { - if err := verifyToken(); err != nil { - return err - } - expected, err := containerSID(false) - if err != nil { - return err - } - defer func() { _ = windows.FreeSid(expected) }() +// The parent checks the native loopback exemption list on every launch. Windows +// denies this query to the restricted helper; no capability is added to it. +func verifyLoopbackIsolation(expected *windows.SID) (resultErr error) { query := windows.NewLazySystemDLL("Firewallapi.dll").NewProc("NetworkIsolationGetAppContainerConfig") kernel := windows.NewLazySystemDLL("kernel32.dll") getHeap, free := kernel.NewProc("GetProcessHeap"), kernel.NewProc("HeapFree") for _, proc := range []*windows.LazyProc{query, getHeap, free} { - if err = proc.Find(); err != nil { + if err := proc.Find(); err != nil { return err } } @@ -157,6 +151,10 @@ func VerifyLoopbackIsolation() (resultErr error) { } } }() + return validateLoopbackExemptions(expected, items) +} + +func validateLoopbackExemptions(expected *windows.SID, items []windows.SIDAndAttributes) error { for _, item := range items { if item.Sid == nil { return errors.New("HEIC loopback exemption query returned an invalid SID") diff --git a/internal/heicdecode/winisolation/process_windows.go b/internal/heicdecode/winisolation/process_windows.go index feb25516..51908091 100644 --- a/internal/heicdecode/winisolation/process_windows.go +++ b/internal/heicdecode/winisolation/process_windows.go @@ -55,6 +55,9 @@ func Start(executable string, args []string, stdio [3]*os.File, limits heicdecod return nil, err } defer func() { _ = windows.FreeSid(sid) }() + if err = verifyLoopbackIsolation(sid); err != nil { + return nil, err + } job, err := windows.CreateJobObject(nil, nil) if err != nil { return nil, err diff --git a/internal/heicdecode/worker/isolate_windows.go b/internal/heicdecode/worker/isolate_windows.go index 478eb471..9cd0fa9c 100644 --- a/internal/heicdecode/worker/isolate_windows.go +++ b/internal/heicdecode/worker/isolate_windows.go @@ -28,7 +28,9 @@ func confirmNetworkDenial(ctx context.Context, host string, probeErr error) erro if host != "127.0.0.1" || !errors.As(probeErr, &networkErr) || !networkErr.Timeout() { return errors.New("expected a timed-out owned loopback probe") } - if err := winisolation.VerifyLoopbackIsolation(); err != nil { + // Start already refused an explicit loopback exemption before creation. + // That privileged query is denied inside the zero-capability container. + if err := winisolation.VerifyAppContainer(); err != nil { return err } return ctx.Err() diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index a0486489..11cf3163 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1101,3 +1101,24 @@ The generic capability API is removed. The unsandboxed-process regression and both native Windows helper fixtures remain required. The UDP listener guard was negatively verified by breaking the echo, observing setup refusal, restoring and passing; a broken listener cannot qualify as blocked worker traffic. + +The completed `6021a5f` Intel macOS job also exposed a diagnostic cleanup race: +`TestOwnedPeerCrashAndDiagnosticsFailClosed/diagnostics` observed stdout EOF +without the expected diagnostic-overflow error. Cleanup cancelled and closed +the stderr reader before its goroutine had drained the helper's already-written +bytes. Terminate the producer first, wait for the bounded stderr drain, then +close the transport and join all work. External cancellation/deadline still +closes reads immediately. Preserve the existing overflow regression and run it +repeatedly under race; native Intel CI must pass it as well. + +Round 8 (`665dd4b`) confirms that Windows denies the loopback-configuration API +inside AppContainer. The read belongs to the trusted launcher: before creating +each helper, it must successfully query the native list and refuse the exact +helper SID if exempt. No result is cached. The child independently verifies +its exact empty-capability token and job, observes blocked traffic to checked +owned listeners, and rechecks the token before accepting a timeout. Missing +parent policy evidence prevents process creation; this grants no new child +permission. Synthetic exemption-list cases cover the exact identity, an +unrelated SID, no exemption and invalid entries without changing OS policy. +Windows also reproduces the diagnostic-drain race. Its correction passes 25 +focused race repetitions plus the client package; GoLand reports no findings. From fad62e69d896171aa3dd59508fb1c4cf536e7fb5 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 12:33:36 +0200 Subject: [PATCH 18/30] Record passing native qualification and remaining release gates --- ARCHITECTURE.md | 3 +- THREAT-MODEL.md | 7 ++-- docs/heic/qualification.md | 41 ++++++++++++++++--- plans/2026-09-15-isolated-heic-restoration.md | 29 +++++++++++++ todos.md | 19 ++++----- 5 files changed, 80 insertions(+), 19 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 52dcfab4..f223845c 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -665,7 +665,8 @@ and Wait serialize handle retirement. `profile_windows.go` owns the stable AppContainer profile and explicit read/execute provisioning for a dedicated helper file and its directory, with no inherited ACL grant. Launch does not change ACLs. Native controls and ordinary decoder fixtures are required by the -`heic-windows` amd64/arm64 CI suite; native execution remains unverified. +`heic-windows` amd64/arm64 CI suite. Both native suites pass at `ee5cc67`; +distribution-package and standard-user qualification remain separate gates. ### `scripts/heicpackage` diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 6e5e7650..20e6d94e 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -143,15 +143,16 @@ trusted installed package. Hashes are not an independent package signature. | Platform | Candidate native helper boundary | | --- | --- | | Linux x64/ARM64 | Thread-synchronized default-deny seccomp, resource limits and a 2 GiB address-space ceiling before input. This is not a physical-RAM/cgroup limit. | -| Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native qualification still fails and activation is blocked. | +| Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native CI controls and ordinary decoding pass; distribution and standard-user qualification remain open. | | macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | Windows helper startup supplies only `GOMAXPROCS` and the OS-reported `SystemRoot`/`LOCALAPPDATA`; it does not inherit the parent's environment or search path. Windows redirects the profile directory for the AppContainer. Profile creation uses a bounded per-user/session cross-process mutex. These -startup corrections still require passing native CI; they grant no additional -AppContainer capabilities or filesystem rights. +startup controls pass native x64/ARM64 CI at `ee5cc67`; they grant no additional +AppContainer capabilities or filesystem rights. Hosted runner results do not +qualify every Windows installation or its ordinary-user firewall API access. Windows can drop blocked loopback traffic instead of returning a permission error. Both parent-owned listeners are positively checked before launch, and diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md index bbd01a8c..7631321d 100644 --- a/docs/heic/qualification.md +++ b/docs/heic/qualification.md @@ -165,9 +165,9 @@ recorded in the [ordinary compatibility report](compatibility-2026-09-16.md). | Platform | Documented candidate | Implemented/runtime verified here | Admission | | --- | --- | --- | --- | -| Linux x64/ARM64 | All-thread seccomp, hard RLIMIT_AS virtual-address-space ceiling, CPU/core/file/descriptor limits before input; bounded WASI and parent lifetime | Candidate cross-builds; portable syscall-policy controls pass. Native helper execution and packaged application qualification await CI. No RSS or cgroup limit is claimed. | Disabled | -| Windows x64/ARM64 | AppContainer/restricted capabilities plus Job Object aggregate commit-memory/process/CPU/kill-on-close limits, explicit inherited pipes and suspended setup | AppContainer/suspended launch and job controls cross-build; owned native controls are wired in CI. Native Windows and MSIX execution remain unverified. | Disabled | -| macOS Intel/Apple Silicon | Independently entitled App Sandbox helper bundle, hardened runtime, bounded WASI, parent-owned pipes/deadline/group termination | Apple Silicon native ordinary decode, read/create/TCP/UDP denial and cancellation verified below. Intel/packaged application qualification pending. Hard total native cap absent by explicit approval. | Disabled pending qualification | +| Linux x64/ARM64 | All-thread seccomp, hard RLIMIT_AS virtual-address-space ceiling, CPU/core/file/descriptor limits before input; bounded WASI and parent lifetime | Both native helper suites pass in hosted CI. Packaged application qualification remains open. No RSS or cgroup limit is claimed. | Disabled | +| Windows x64/ARM64 | AppContainer/restricted capabilities plus Job Object aggregate commit-memory/process/CPU/kill-on-close limits, explicit inherited pipes and suspended setup | Both native policy/transport/ordinary-decoding suites pass at `ee5cc67`. Standard-user, Authenticode/MSIX and distribution execution remain separate qualification gates. | Disabled | +| macOS Intel/Apple Silicon | Independently entitled App Sandbox helper bundle, hardened runtime, bounded WASI, parent-owned pipes/deadline/group termination | Both architectures have passed native ordinary decode, read/create/TCP/UDP denial and cancellation in CI. Packaged application qualification remains open. Hard total native cap absent by explicit approval. | Disabled pending qualification | Linux's [cgroup v2 documentation](https://docs.kernel.org/admin-guide/cgroup-v2.html) describes charged memory and explicitly permits temporary `memory.max` overshoot. @@ -398,8 +398,39 @@ controls, inherited-pipe cancellation, analysis attachment cleanup, and ordinary ten-bit/12-megapixel decode. The memory control uses a 64 MiB job and a fixed 65 MiB commitment attempt, touches no pages, and frees any unexpected allocation immediately. It is a bounded OS-policy control, not an image decoder stress test. -Cross-build/vet/IDE results establish compilation only; no Windows execution has -been observed on this macOS host. +Cross-build/vet/IDE results establish compilation only. The Windows execution +evidence below comes from native hosted runners. + +## Native Windows qualification checkpoint (2026-09-16) + +At `ee5cc67`, [CI run 35084746959](https://github.com/frathe/picfetch/actions/runs/35084746959) +passes both Windows HEIC suites, including token/job checks, fixed bounded +commitment refusal, child-process denial, unsandboxed refusal, inherited-pipe +cancellation and ordinary helper decoding. The native runner rejects skipped +required guards. `windows-latest` runs amd64; `windows-11-arm` runs ARM64. + +| Ordinary fixture | Windows amd64 | Windows ARM64 | Verified result | +| --- | --- | --- | --- | +| `tenbit.heic` | 4.316 s | 4.104 s | 16 x 16, NRGBA64 retained | +| `photo-gradient.heic.gz` | 17.396 s | 14.740 s | 4032 x 3024 | + +The launcher checks the native loopback exemption list on every launch and +refuses an exempt helper SID or query failure. This privileged read cannot run +inside AppContainer. The helper verifies its exact zero-capability token and +job before file/network probes. Parent-owned TCP/UDP listeners are positively +checked first; UDP uses a bounded one-byte echo worker. Windows' packet-drop +semantics may produce a timeout, accepted only with a live request, the verified +token and the launcher's nonexemption gate. A successful connection/echo refuses +readiness. Listeners close and their worker joins before image bytes are read. +Linux/macOS continue to require explicit permission errors. + +The ordinary Windows suite also runs the release workflow's fixed manifest +transformation on inert helper bytes, verifying both targets and invalid-input +rejection without signing credentials. The protected signing job has no +repository checkout/toolchain execution and verifies both executables after +manifest finalization. Actual Authenticode/MSIX, final distribution execution +and nonadministrator Windows launches remain unverified; these hosted results +do not activate HEIC support or qualify the first released-updater transition. ## Package updates and first-upgrade limitation diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 11cf3163..87b5c4cc 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -1122,3 +1122,32 @@ permission. Synthetic exemption-list cases cover the exact identity, an unrelated SID, no exemption and invalid entries without changing OS policy. Windows also reproduces the diagnostic-drain race. Its correction passes 25 focused race repetitions plus the client package; GoLand reports no findings. + +### Passing code checkpoint and final documentation follow-up + +At `ee5cc67`, [CI 35084746959](https://github.com/frathe/picfetch/actions/runs/35084746959) +passes validation, all four Linux race partitions, Linux/Windows amd64+arm64 +HEIC native suites, ordinary Windows and macOS Intel/Apple Silicon native +suites. Required native guards run without skips. Windows ordinary ten-bit +decoding takes 4.316 s (amd64) / 4.104 s (ARM64); the 12MP fixture takes +17.396 s / 14.740 s. The actual PowerShell manifest transformation passes on +inert fixtures; the diagnostic-overflow regression passes on both Windows +architectures and Intel macOS. Hosted evidence now supersedes cross-build-only +qualification statements, without claiming standard-user or packaged Windows +qualification. + +Code-review comment `5695988308` reports no findings on this exact checkpoint. +The confirmed security thread `4024388304` is fixed by `c77d9bd`, replied to and +resolved; later code/security reviews on `c77d9bd` and `6021a5f` are clean. +The current security review and a fresh complete review/CI round for the final +documentation-only follow-up remain mandatory before loop completion. Final +head, review comments, check conclusions and static-report provenance are +recorded in the PR discussion and `.scratch/pr28-review/` after those services +finish; this evidence capture does not change the reviewed source tree. + +The follow-up updates this plan, `todos.md`, architecture, threat model and +native qualification evidence only. HEIC stays disabled. Distribution/license +closure, real Authenticode/MSIX, nonadministrator Windows behavior, broader +camera/color qualification, the first released-updater transition and the +unsigned initial foundation's merge prerequisite remain explicit. No merge, +release, production activation or history rewrite is included in this loop. diff --git a/todos.md b/todos.md index 61a68698..83587cc3 100644 --- a/todos.md +++ b/todos.md @@ -106,21 +106,20 @@ historical decoder-suite equivalence is claimed. Remaining qualification: -- Ronin resumed the GitHub Codex review loop on September 16. At `3973811`, - all Linux race shards, Linux amd64/arm64 and macOS Intel/Apple Silicon helper - guards and validation pass. Windows HEIC qualification still fails on loopback - timeout interpretation; the ordinary suite exposes a CRLF fixture assertion. - Qodana's post-suppression report and both CodeQL reports contain zero results. - The signing-job security finding is fixed, resolved and followed by clean - code/security reviews on `c77d9bd`. The Windows corrections and another review - round are in progress. Local - canonical shard verification is unavailable because the Docker daemon is stopped. +- At code checkpoint `ee5cc67`, all hosted CI passes: every Linux race shard, + Linux and Windows amd64/arm64 helper guards, macOS Intel/Apple Silicon native + guards, ordinary Windows and validation. The signing-job security finding is + fixed in `c77d9bd` and resolved; subsequent code/security rounds are clean. + Qodana and CodeQL checks pass. Final evidence and review of the documentation + follow-up are tracked in [PR #28](https://github.com/frathe/picfetch/pull/28) + and the active plan. No broad local race suite was duplicated. - Ronin accepted the absent hard total native-memory cap on macOS. WASM, transport, deadline and sandbox controls remain mandatory; helper-only executable-memory permission is required. The compiler succeeds on the ordinary 12MP fixture; the interpreter reaches the finite deadline. - Complete distribution-package, Windows Authenticode/MSIX and upgrade - qualification remain open. The released updater drops the new helper and + qualification remain open, including nonadministrator Windows access to the + launch-time loopback configuration query. The released updater drops the new helper and deletes staging, leaving an invalid macOS enclosing signature. The first transition requires a complete reinstall or a separately qualified bridge. - [Compatibility evidence](docs/heic/compatibility-2026-09-16.md) covers ordinary From f41fe630158baa1c65f8dc75122c332dcddd4a1d Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 15:43:34 +0200 Subject: [PATCH 19/30] add restart-only experimental HEIC opt-in --- .github/testshards/internal-ui.tsv | 5 +- .github/workflows/ci.yml | 68 ++++- AGENTS.md | 2 +- ARCHITECTURE.md | 42 ++- Makefile | 1 + THREAT-MODEL.md | 36 ++- docs/heic/experimental-opt-in.md | 102 +++++++ docs/heic/qualification.md | 19 +- internal/explorerpresets/presets.go | 3 +- internal/filescan/filescan.go | 37 ++- internal/filescan/filescan_test.go | 38 +++ internal/heicdecode/client/broker.go | 6 +- internal/heicdecode/client/client.go | 48 +++- internal/heicdecode/client/client_test.go | 18 ++ internal/heicdecode/client/installed_other.go | 12 + .../client/installed_unsupported_windows.go | 9 + .../heicdecode/client/installed_windows.go | 216 ++++++++++++++ .../client/installed_windows_test.go | 255 +++++++++++++++++ .../heicdecode/client/native_platform_test.go | 10 +- internal/heicdecode/client/package.go | 58 ++++ internal/heicdecode/client/package_test.go | 85 ++++++ internal/heicdecode/client/process.go | 20 +- internal/heicdecode/client/staging.go | 142 ++++++++++ .../winisolation/native_windows_test.go | 12 + .../heicdecode/winisolation/policy_windows.go | 17 +- internal/imaging/source.go | 31 ++ internal/imaging/source_test.go | 33 +++ internal/preferences/preferences.go | 6 + internal/preferences/preferences_test.go | 16 ++ internal/similarity/heic_native_test.go | 115 ++++++++ internal/similarity/heic_test.go | 57 +++- internal/ui/drop.go | 8 +- internal/ui/explorer/feature.go | 6 +- internal/ui/explorer/feature_test.go | 78 +++++ internal/ui/explorer/preset_fields.go | 4 +- internal/ui/explorer/preset_workflow.go | 2 +- internal/ui/features.go | 3 +- internal/ui/harness_test.go | 16 +- internal/ui/images.go | 17 ++ internal/ui/images_native_other_test.go | 14 + internal/ui/images_native_test.go | 232 +++++++++++++++ internal/ui/images_native_windows_test.go | 134 +++++++++ internal/ui/images_test.go | 267 +++++++++++++++++- internal/ui/load.go | 2 + internal/ui/memlimits.go | 10 + internal/ui/menu.go | 2 +- internal/ui/run.go | 1 + internal/ui/settingswin/settingswin.go | 31 +- internal/ui/settingswin/settingswin_test.go | 167 ++++++++++- internal/ui/startup.go | 24 +- packaging/heic/qualify-windows-child.ps1 | 55 ++++ packaging/heic/qualify-windows.ps1 | 120 ++++++++ plans/2026-09-15-isolated-heic-restoration.md | 21 ++ plans/2026-09-16-experimental-heic-opt-in.md | 187 ++++++++++++ qodana.yaml | 5 + scripts/heicbuild/main.go | 6 +- scripts/heicguest/decoder.json | 2 +- scripts/nativeguards/main.go | 32 ++- scripts/nativeguards/main_test.go | 60 +++- todos.md | 26 +- translations/de.json | 6 +- translations/en.json | 6 +- 62 files changed, 2950 insertions(+), 113 deletions(-) create mode 100644 docs/heic/experimental-opt-in.md create mode 100644 internal/heicdecode/client/installed_other.go create mode 100644 internal/heicdecode/client/installed_unsupported_windows.go create mode 100644 internal/heicdecode/client/installed_windows.go create mode 100644 internal/heicdecode/client/installed_windows_test.go create mode 100644 internal/heicdecode/client/staging.go create mode 100644 internal/similarity/heic_native_test.go create mode 100644 internal/ui/images_native_other_test.go create mode 100644 internal/ui/images_native_test.go create mode 100644 internal/ui/images_native_windows_test.go create mode 100644 packaging/heic/qualify-windows-child.ps1 create mode 100644 packaging/heic/qualify-windows.ps1 create mode 100644 plans/2026-09-16-experimental-heic-opt-in.md diff --git a/.github/testshards/internal-ui.tsv b/.github/testshards/internal-ui.tsv index f7fa59c1..4bd41740 100644 --- a/.github/testshards/internal-ui.tsv +++ b/.github/testshards/internal-ui.tsv @@ -6,7 +6,7 @@ # baseline-attempts: 1 # weights: single CI attempt; projected test sums, not measured shard runtimes # ui-1: 238 entries, 470.520s projected weight sum -# ui-2: 248 entries, 470.530s projected weight sum +# ui-2: 251 entries, 470.530s projected weight sum # ui-3: 202 entries, 504.870s projected weight sum # rebalance: 27 whole-test moves; slowest projected sum within 5% of mean # evidence: finished_refactorings/2026-09-11-ui-shard-rebalance.md @@ -333,6 +333,9 @@ TestE2E_LaunchWithSavedSessionShowsRestoreLink ui-2 TestE2E_SuccessfulDropShowsImage ui-2 TestExifLink_OpensExifWindow ui-2 TestExifNavigationCancelsMetadataBeforeTheNextImageLoads ui-2 +TestExperimentalHEICAdmission ui-2 +TestExperimentalHEICRestartOnly ui-2 +TestExperimentalHEICStartup ui-2 TestExportAs_CancelWritesNothing ui-2 TestExportAs_ReportsAFailedWrite ui-2 TestExportAs_RotationCorrectsDimensionTagsButNotFilenameOrToast ui-2 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c15ba58..dd7292b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -207,14 +207,76 @@ jobs: with: go-version-file: go.mod cache-dependency-path: go.sum - - name: Qualify HEIC AppContainer, job limits, inherited handles and cancellation - run: go run ./scripts/nativeguards -suite heic-windows -capture "${{ runner.temp }}/native-guards-heic-windows.json" + - name: Qualify HEIC as a disposable standard user + shell: pwsh + run: ./packaging/heic/qualify-windows.ps1 -Scenario standalone -EvidenceDirectory "${{ runner.temp }}/heic-standard-user" - name: Upload native guard events if: always() uses: actions/upload-artifact@v7 with: name: native-guards-Windows-HEIC-${{ matrix.arch }}-${{ github.run_id }}-attempt-${{ github.run_attempt }} - path: ${{ runner.temp }}/native-guards-heic-windows.json + path: ${{ runner.temp }}/heic-standard-user/ + if-no-files-found: error + retention-days: 14 + + heic-msix-build: + name: Build complete HEIC test-MSIX inputs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache-dependency-path: go.sum + - name: Build Store-managed applications for both native targets + run: make package-windows-store + - uses: actions/upload-artifact@v7 + with: + name: heic-qualification-store-executables + path: bin/picfetch-microsoft-store-*.exe + if-no-files-found: error + retention-days: 14 + + heic-msix: + name: Installed MSIX ${{ matrix.arch }} HEIC activation (attempt ${{ github.run_attempt }}) + needs: heic-msix-build + env: + CGO_ENABLED: '0' + strategy: + fail-fast: false + matrix: + include: + - runner: windows-latest + arch: amd64 + runtime: x64 + - runner: windows-11-arm + arch: arm64 + runtime: arm64 + runs-on: ${{ matrix.runner }} + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-go@v7 + with: + go-version-file: go.mod + cache-dependency-path: go.sum + - uses: actions/download-artifact@v8 + with: + name: heic-qualification-store-executables + path: dist/executables + - name: Fetch the build-time pinned runtime package + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + Invoke-WebRequest -Uri 'https://github.com/microsoft/onnxruntime/releases/download/v1.29.0/onnxruntime-win-${{ matrix.runtime }}-1.29.0.zip' -OutFile dist/runtime.zip + - name: Install and activate the disposable test-MSIX as a standard user + shell: pwsh + run: ./packaging/heic/qualify-windows.ps1 -Scenario msix -Executable dist/executables/picfetch-microsoft-store-${{ matrix.arch }}.exe -RuntimeArchive dist/runtime.zip -EvidenceDirectory "${{ runner.temp }}/heic-installed-msix" + - name: Upload installed activation and provisioning evidence + if: always() + uses: actions/upload-artifact@v7 + with: + name: native-guards-Windows-MSIX-${{ matrix.arch }}-${{ github.run_id }}-attempt-${{ github.run_attempt }} + path: ${{ runner.temp }}/heic-installed-msix/ if-no-files-found: error retention-days: 14 diff --git a/AGENTS.md b/AGENTS.md index a8842101..46a549ee 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -120,7 +120,7 @@ precedence over its default handoff procedure. - Direct Go commands that import imaging require `-tags no_emoji,nodynamic`; Make targets supply them. The build guard rejects missing `nodynamic` or enabled `wasm2go` before decoder initialization. - `make package-mac` runs `go run -tags no_emoji,nodynamic ./scripts/plistdoctypes` to derive the packaged app's `CFBundleTypeExtensions` from `imaging.SupportedExtensions()`; it no longer depends on `python3`. - Match CI before handoff with `make verify`: formatting/TUF checks, vet and build run from the repository root, and the race suite runs through the same Linux/amd64 Docker path as `make test`. -- **HEIC/HEIF support is disabled** pending decoder distribution and security qualification. See [the removal record](finished_refactorings/2026-09-14-remove-heic-decoder.md) before considering restoration. +- **HEIC/HEIF is default-off and restart-only** through Experimental Settings. Before changing activation or packaging, read [the activation record](docs/heic/experimental-opt-in.md) for complete-package requirements and unverified native/release gates. Retain every sandbox, identity and resource check. - Run focused tests while iterating, e.g. `go test -tags no_emoji,nodynamic -run TestE2E -v ./internal/ui/...`; the complete suite remains the final check. - **GoLand inspections before feature completion:** Inspect every changed code file with GoLand, review all findings (including weak warnings), and fix confirmed issues before finalizing a feature. Document and mitigate confirmed false positives with narrowly scoped suppressions or exclusions. Re-run inspections after fixes or mitigations, and report unavailable or incomplete inspection results as unverified. - Golden screenshots are under `internal/ui/testdata/`. Regenerate only with `make golden` (Docker linux/amd64), inspect `internal/ui/testdata/failed/*.png`, and never commit failed renders. diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index f223845c..b8c37274 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -495,7 +495,7 @@ The concurrency invariant: see `AGENTS.md` § Concurrency and Fyne. | `run.go` | `Run`: restore startup viewer, start runtime (`favstore.DefaultDir`, position polling), register shutdown and CLI drop, enter the Fyne loop. Shutdown retires title/menu updates, cancels feature work and flushes preferences without rebuilding retired native menus. Store-managed builds skip GitHub update startup and staged-binary apply. Explicit trial startup reserves new evidence, isolates Favorites/presets/updates, disables update activity, auto-opens Explorer after the ordinary scan, and joins its signal watcher and workers before finalizing evidence. | | `build.go` | `buildViewer` composes widgets and `registerFeatures` modules and snapshots `distribution.StoreManaged` onto the viewer. Overlay tail: copy selection, similarity map, grid, comparison (including its pointer shield), delete confirm, export prompt, toast. Desktop canvases also receive the chained comparison key-down hook for exact physical `Ctrl+L`; ordinary typed-key and shortcut wiring remains separate. | | `startup.go` | `loadStartupState` / `restoreStartupGeometry` / `buildStartupViewer` — the one load→build→restore path shared by `Run` and tests. | -| `images.go` | One optional app-family HEIC owner and immutable foreground/background `imaging.Reader` values injected before GUI and analysis work. Shutdown Stop/Wait owns complete helper/pipe retirement. Production construction supplies no owner until package/platform qualification. | +| `images.go` | One optional app-family HEIC owner and immutable foreground/background `imaging.Reader` values injected before GUI and analysis work. Shutdown Stop/Wait owns complete helper/pipe retirement. Startup loads preferences first and creates one owner only for a valid, opted-in installed helper package; unavailable status is separate from immutable admission. | | `components.go` | Dropzone, scan, sort, and info-overlay constructors. Toast stays in `toast.go`. | | `trane.go` | Welcome-screen Trane: hosts `widgets.Gaze` with a compact 17-cell atlas. Owns pointer/window-layout coordinates, scaled dead zone, immutable decode cache and magenta-spill correction within five source pixels of transparency. Hide/MouseOut forget pointer position and circle progress. A hover-only surface preserves input across the restore link; ten circles request `Help.ShowFinis`. No timers or background workers. `scripts/appassets` retains the used pixels from `assets/trane/codex-pet/spritesheet.webp`. | | `explorer.go` | Root adapter for Explorer: captures duplicate-prepared sources, composes setup acknowledgment with preferences, maps frozen cohort identities to collection indexes, and coordinates map/Grid/image transitions. The feature owns workflow, dialogs, workers and delivery. `explorerInput` retains collection/launch/window policy only. | @@ -559,7 +559,7 @@ The concurrency invariant: see `AGENTS.md` § Concurrency and Fyne. | `internal/ui/exifwin/` | EXIF panel (E): `metadata.go` owns cancellable source reads, generation-checked tag/GPS/action presentation and separate `MetadataDone` completion. `stripwork.go` owns cancellable removal, busy admission and a committed `WriteResult` in the Host notification. GPS map (`tiles.go`, `tilework.go`, `startWarm`): four shared workers, a 64-job queue, 256 expiring failure entries and a 16 MiB encoded-byte cache. Navigation/close cancels old reads and tile sessions; collapse cancels tiles. `uiqueue.go` owns result delivery and Settle waits/drains removal, metadata, warm and tile workers repeatedly. Shutdown Stop is terminal. Geometry via `widgets.Singleton`. | 4-method `Host`. | | `internal/ui/help/` | Manual, About, What's New (`whatsnew.go`), Help menu; embeds `manual.md` / `manual_de.md`. Secret search phrase calls the viewer’s registered `SetOnSpiral` callback; `finis` in manual search opens the cursor-following companion (`finis.go`, embedded `finis.webp`), hosting `widgets.Gaze` with centered portrait geometry and its own hover surface. `ShowFinis` also serves welcome Trane; ten independent circles reveal the localized, wrapped bubble in `finis_clue.go`, whose click opens an empty focused manual search. | `New(app, title, art)` plus optional event callbacks. | | `internal/ui/spiral/` | Full-screen shader easter egg. `tunnel.go` owns serial preview admission and three texture slots; `playback.go` advances bounded GIF frames on the existing UI clock with independent flight origins; `flow.go` owns cycles, batch variation and route selection; `flight.go` owns safe route geometry used for admission/retirement; `shader.go` renders depth, feather and translucent composition. `uiqueue.go` marshals preview/frame callbacks with session checks. H toggles local help; F1 invokes the viewer's manual callback. The shared centre stays within a resized viewport. | Viewer supplies a frozen URI value to `Show` / `ShowForGesture`; `Close` cancels on UI and test `Settle` joins/drains off UI. Process shutdown does not join uninterruptible preview source reads. | -| `internal/ui/settingswin/` | Settings: General/Appearance/Updates/Limits, update dialogs, snapshot seed, live apply, Singleton geometry. `Show(State, storeManaged)` replaces the GitHub update controls with Store-owned-update copy when applicable. | `Show(State, bool)` + Host (`ApplySettings`, `CheckForUpdatesNow`, `PerformUpdate`). | +| `internal/ui/settingswin/` | Settings: General/Appearance/Updates/Limits, optional Cache, then Experimental; General always opens first. Snapshot seed, live apply, restart-only HEIC intent, unavailable explanation, update dialogs and Singleton geometry. `Show(State, storeManaged)` replaces the GitHub update controls with Store-owned-update copy when applicable. | `Show(State, bool)` + Host (`ApplySettings`, `CheckForUpdatesNow`, `PerformUpdate`). | | `internal/ui/favorites/` | Favorites menu and add/overwrite/manage/remove dialogs. `New` does no disk I/O; `SetDir` from `Run`. `SetCommandsEnabled` preserves Add's file availability while disabling both static and dynamically rebuilt menu entries during comparison. | 6-method `Host`. | | `internal/ui/menus/` | The stateful File/Window/Actions menu items and their whole Checked/Disabled matrix as `Apply(State) (changed bool)`, a pure function of a value snapshot. `ComparisonActive` applies a final all-ordinary-items-disabled override while leaving Help available. Fyne-typed but viewer-free, unit-testable with no app. Menu-bar assembly, the Darwin native-bar fold, the real shortcut bindings, and every action the items run all stay in `internal/ui`. | No Host: `Apply(State)` over a value snapshot built by `menu.go`'s `menuState()`. | | `internal/ui/autoupdate/` | Shared serialized automatic/manual update worker: lazy verifier/client preparation, check/download progress events, matching-stage reuse, all-worker settle, last-check-day persistence, staged apply/relaunch intent, the What's-New cache (`whatsnew.go`), and the apply-failure cache (`applyfailure.go`) — `ApplyStagedUpdate` writes it when `update.Apply` fails, and `internal/ui` reads and clears it on the next launch. Both caches are one JSON document each in `app.Cache()`, over the `saveCacheJSON` / `loadCacheJSON` / `clearCacheJSON` helpers in `cache.go`; a failed relaunch is deliberately *not* recorded, since it happens after the new binary is installed and verified. | No Host: takes a `context.Context` and a staleness func per call (`Start` / `StartManual`), plus `Persist` and per-`Updater` verifier-factory seams — cancellation stays the viewer's own `requestLifecycle`, not promoted here. | @@ -580,7 +580,7 @@ Encode/write-back for a subset of formats lives in `save.go`; `mutations.go` ser |------|----------------| | `bytecache.go` | `ByteCache[V]`: goroutine-safe LRU by estimated bytes. `Add` admits foreground images even over budget; generation-bound `CacheWriter.AddIfRoom` admits display preloads only into remaining space without eviction or promotion. `AddIfFits` keeps its existing individual-size gate and may evict. `LoadedImage.DecodedBytes` shares retained pixel/vector accounting with the mosaic repeat cache. | | `loader.go` | `LoadedImage`, `NewImgCache`, `ReadAndProbe`, `CaptureDateContext` (cancellable metadata reads), `DecodeLoaded` (pixels), `DecodeRecord` (complete full-cache facts), `LoadImage`, `IsSupportedImage`, `SupportedExtensions`, `MaxEncodedBytes` / `InputTooLargeError`. | -| `source.go`, `source_kind.go` | Immutable `Reader` and `Source` share ordinary probe/decode algorithms and carry validated HEIC pixels/normalized metadata without retaining encoded HEIC bytes. Reader injection selects the shared owner; zero value refuses HEIC. Bounded leading file-type dispatch precedes bulk reads and prevents native HEIC metadata/preview fallback. `InspectMetadata` returns normalized values, byte count and JPEG strip capability from one source read. | +| `source.go`, `source_kind.go` | Immutable `Reader` and `Source` share ordinary probe/decode algorithms and carry validated HEIC pixels/normalized metadata without retaining encoded HEIC bytes. Reader injection selects the shared owner; zero value refuses HEIC. Reader format queries capture this capability; package-level queries and OS associations stay unchanged. Bounded leading file-type dispatch precedes bulk reads and prevents native HEIC metadata/preview fallback. `InspectMetadata` returns normalized values, byte count and JPEG strip capability from one source read. | | `ico.go` | Explicit ICO probe/decode dispatch, independent of the desktop driver's decoder registration: validates directory/payload spans and dimensions, selects the same single image for probe/decode, delegates PNG or normalized uncompressed DIB pixels to existing decoders, and applies icon transparency. | | `raw.go` | Largest embedded JPEG from TIFF IFDs or SOI scan (CR3/RAF). | | `svg.go` | SVG detection, logical-size floor (`MinVectorWidth`/`Height` = UI `startW`/`startH`), `ClampVectorRaster` / `MaxVectorRasterPixels`. | @@ -603,14 +603,14 @@ Encode/write-back for a subset of formats lives in `save.go`; `mutations.go` ser ### `internal/heicdecode` -Codec-free boundary for the proposed isolated HEIC/HEIF decoder. `limits.go` +Codec-free boundary for the experimental isolated HEIC/HEIF decoder. `limits.go` defines separate finite resource contracts; it does not install OS controls. `request.go` frames one byte-only operation. `protocol.go` validates versioned responses, dimensions, NRGBA8/NRGBA64 layout, operation-specific payload lengths, normalized metadata and exact EOF before publication. `metadata.go` rejects unknown/duplicate fields and invalid bounded values. `ready.go` reports actual -startup memory controls separately from requested limits. HEIC viewing remains -disabled pending platform/package qualification and production activation. +startup memory controls separately from requested limits. HEIC viewing is +default-off and restart-only; full package/platform qualification remains a gate. ### `internal/heicdecode/client`, `worker`, and `cmd/picfetch-heic-worker` @@ -627,9 +627,18 @@ cancellation; a disconnected queued peer is observed through one control byte. and joined before image input or at failed-start cleanup. `attachment.go` supplies explicit inherited pipes and observes parent-copy, service and remote lifetimes. GUI construction and analysis requests share one -optional owner; production currently supplies none pending qualification. -`package.go` bounds and validates the trusted installed-package manifest, fixes +optional owner. Preferences select that owner once at startup, before file +admission; checkbox edits never replace it. `package.go` discovers the installation +from the executable, bounds and validates the trusted installed-package manifest, fixes helper paths per OS, checks the target and pins the post-signing executable. +`staging.go` verifies copied bytes before atomic content-addressed publication. +`installed_windows.go` owns a private user/SYSTEM cache, cross-process publication +lock, minimal AppContainer read/execute preparation, write/delete-denying leases +and safe deferred obsolete-copy cleanup. It never changes Store installation +files. Client Stop/Wait releases its leases only after admitted work joins. +Other platforms use the verified installed helper directly. Unsupported Windows +architectures refuse preparation. Native readiness and per-launch identity checks +remain mandatory, and `Unavailable` records failures without changing capability. `worker` embeds the fixed WASI artifact and streams bounded stdio through wazero with finite linear memory and a deadline. Native code accepts no image paths. @@ -651,7 +660,10 @@ import the embedded guest runtime. `packaging/heic` holds the macOS bundle and entitlement templates; `heicinterpreter` is the qualification runtime variant. `cmd/picfetch-heic-worker` is the minimal single-request entry point, without -Fyne or a native HEIC codec. Final application packaging/activation is pending. +Fyne or a native HEIC codec. `internal/similarity/heic_native_test.go` verifies +successful native pixels across inherited analysis pipes and repeated retained +search previews after normal file admission. Application activation evidence and its outstanding +gates are tracked in `docs/heic/experimental-opt-in.md`. ### `internal/heicdecode/winisolation` @@ -665,8 +677,8 @@ and Wait serialize handle retirement. `profile_windows.go` owns the stable AppContainer profile and explicit read/execute provisioning for a dedicated helper file and its directory, with no inherited ACL grant. Launch does not change ACLs. Native controls and ordinary decoder fixtures are required by the -`heic-windows` amd64/arm64 CI suite. Both native suites pass at `ee5cc67`; -distribution-package and standard-user qualification remain separate gates. +`heic-windows` amd64/arm64 CI suite. Historical helper results at `ee5cc67` +do not qualify the new standard-user or installed-MSIX activation paths. ### `scripts/heicpackage` @@ -676,7 +688,11 @@ the binary target, uses pure Go for Linux/Windows, and builds/signs/verifies the macOS App Sandbox bundle. `finalize` refreshes the manifest after Windows Authenticode signing. Native helper tests use the same staging tool. Makefile and release/MSIX assembly retain the helper directory; package creation alone -does not enable production HEIC. +does not enable the saved HEIC preference. `packaging/heic/qualify-windows*.ps1` +separates disposable CI account/signing provisioning from standard-user execution. +Native application fixtures exercise executable-derived startup, Settings, +admission, native decode and shutdown; MSIX uses the real application activation +manager and checks package identity and unchanged installed helper permissions. ### `scripts/heicguest` and `scripts/heicbuild` @@ -961,7 +977,7 @@ when the user opened a single file. | File | Responsibility | |------|----------------| -| `filescan.go` | `Images(ctx, uris, max, progress)` (recursive); `Siblings(ctx, file, max, progress)` (parent dir only, opened file seeded first); symlink-cycle + per-call dedupe. | +| `filescan.go` | `Images(ctx, uris, max, progress, opts...)` (recursive); `Siblings(ctx, file, max, progress, opts...)` (parent dir only, opened file seeded first); optional `WithAdmission` captures a reader capability, omitted/nil retains package defaults. Symlink-cycle + per-call dedupe. | ### `internal/launch` diff --git a/Makefile b/Makefile index 31318694..219117bc 100644 --- a/Makefile +++ b/Makefile @@ -630,6 +630,7 @@ heic-native-linux: ## Qualify the no-cgo HEIC helper's syscall and native addres heic-native-windows: ## Qualify the HEIC AppContainer helper, job limits and inherited pipes on Windows mkdir -p .scratch/heic-qualification go run ./scripts/nativeguards -suite heic-windows -capture .scratch/heic-qualification/native-windows.json + pwsh -NoProfile -File packaging/heic/qualify-windows-child.ps1 -RequireInstalledMSIX -Configuration "$(HEIC_MSIX_CONFIGURATION)" .PHONY: heic-security-govulncheck heic-security-govulncheck: ## Scan the separate WASI guest module (including its fixed fixture generator) diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 20e6d94e..42299569 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -14,10 +14,14 @@ vulnerability findings. [ARCHITECTURE.md](ARCHITECTURE.md) is the package map; [HEIC qualification](docs/heic/qualification.md) records runtime evidence and [history reconciliation](docs/heic/history-reconciliation.md) records carryover. -**Production HEIC viewing remains disabled on every platform.** The candidate -has an isolated WASI helper and shared application/analysis admission, but -native Windows, final distribution, compatibility and upgrade qualification -remain incomplete. Test or CI results for one platform do not qualify another. +**HEIC viewing is default-off and requires a restart after an explicit +Experimental Settings opt-in.** Startup validates the executable-derived helper +package before constructing an immutable shared capability. Missing/corrupt +packages or failed isolation remain unavailable while ordinary viewing works. +Windows private staging, standard-user and installed-MSIX activation are new +paths awaiting native evidence; historical helper results do not qualify them. +Distribution clearance, production signing and broad color/camera qualification +remain release gates. See the [activation record](docs/heic/experimental-opt-in.md). The accepted macOS design lacks a hard total native-memory cap; memory pressure and application/system crashes remain possible. Capability isolation and finite WASM/input/output/job/time limits remain mandatory. @@ -28,7 +32,7 @@ PicFetch is a Go/Fyne desktop image viewer. Files arrive through command-line paths, drag-and-drop, native pickers and macOS Open With events. Opening a file can also discover sibling images; folder opening can recursively scan a tree. Production supports common raster formats, SVG, AVIF and embedded JPEG -previews from camera RAW containers. HEIC/HEIF is a disabled candidate. PicFetch +previews from camera RAW containers. HEIC/HEIF is an experimental opt-in. PicFetch also handles EXIF metadata, save/export, clipboard, Trash, wallpaper, favorites, mosaics and session paths. @@ -111,7 +115,7 @@ place. Image-cache budgets are not process-wide memory quotas. No universal CPU or total-memory bound is established here. Codec/runtime selection must also be checked for the actual build; this model does not claim every format runs in WASM. -### Candidate HEIC helper boundary +### Experimental HEIC helper boundary The [image reader](internal/imaging/source.go) performs bounded leading-brand recognition and routes HEIC to an explicitly injected shared client. The default @@ -146,6 +150,26 @@ trusted installed package. Hashes are not an independent package signature. | Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native CI controls and ordinary decoding pass; distribution and standard-user qualification remain open. | | macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | +The saved `experimentalHEIC` value describes user intent, separately from the +session's configured reader and its latest availability failure. Scanning, +restored sessions and Favorites use that same reader predicate. A failed helper +never selects a different decoder or replaces the service. Existing package +format queries and OS associations remain unchanged; sequence admission and +HEIC encoding stay unsupported. + +Windows copies the verified installed helper into a dedicated user/SYSTEM-only +cache. A cross-process file lock serializes publication and cleanup. Copies are +bounded and hashed again before atomic publication; only the AppContainer's +read/execute grant is prepared, on the copied executable and its containing +directory. Reparse points and hard-linked executable entries are refused before +permission changes. Client-held file/directory handles deny replacement/deletion +until Stop/Wait has joined work. Each launch still verifies the pinned hash and +native readiness. A damaged inactive copy is rebuilt; obsolete live copies are +retained until a later safe cleanup. Cache/staging failure refuses activation. +The installed manifest remains part of the enclosing authenticated package; +a content hash does not establish publisher authenticity. Store source files +and their ACLs are never staging targets, and Store update authority is unchanged. + Windows helper startup supplies only `GOMAXPROCS` and the OS-reported `SystemRoot`/`LOCALAPPDATA`; it does not inherit the parent's environment or search path. Windows redirects the profile directory for the AppContainer. diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md new file mode 100644 index 00000000..a887e6f5 --- /dev/null +++ b/docs/heic/experimental-opt-in.md @@ -0,0 +1,102 @@ +# Experimental HEIC activation + +Status: implementation in progress, 2026-09-16. The +[active plan](../../plans/2026-09-16-experimental-heic-opt-in.md) owns current +verification; [qualification](qualification.md) preserves earlier helper/source +evidence. This record is not release approval. + +## Settings and installation + +Experimental is the last Settings tab, including when Cache is present. General +opens by default. “Experimental HEIC support” persists as `experimentalHEIC`, +false when absent, and takes effect only at the next startup. Colors may be +inaccurate; HDR display remains unsupported. Still `.heic` and `.heif` are the +only added formats; sequence rejection and the absence of HEIC encoding remain. + +Startup reads preferences before constructing the shared viewer/preview/analysis +owner. The saved checkbox, immutable session capability and latest unavailable +status are separate. Missing or invalid packages retain the preference and show +an explanation in Experimental. Ordinary image formats continue to work. No +alternative decoder, runtime download, elevation prompt or relaxed sandbox is +available as a fallback. Package-level format queries and OS associations remain +unchanged. Saved Explorer HEIC rules remain editable when HEIC is disabled. + +Development builds need the complete helper package. `go run .` or copying only +the main executable does not supply it. On macOS use `make package-mac`: the +running binary must be in `PicFetch.app/Contents/MacOS`, with the independently +signed helper in the fixed nested bundle. Linux and Windows require the `heic` +directory next to the main executable, with the architecture-matched helper, +manifest and notices produced by `scripts/heicpackage`. Preserve that directory +when assembling an installed package; packaging alone leaves the preference off. +Windows uses a verified private copy under the application's cache and never +changes immutable Store files or their permissions. Client shutdown releases +copy leases only after work joins; active obsolete copies defer cleanup. + +The first transition from the released updater still requires a complete +reinstall or a separately qualified bridge. That updater cannot preserve the +new companion/helper package, and on macOS can invalidate the enclosing +signature. This feature does not qualify or implement that bridge. + +## Native evidence commands + +- `make heic-native-macos`: native Intel or Apple Silicon, independently signed + helper and enclosing test app, shared application startup and native decode. +- `make heic-native-linux`: native amd64 or arm64; retains no-cgo helper seccomp + and finite resource tests, then requires application startup and admission. +- `make heic-native-windows HEIC_MSIX_CONFIGURATION=`: run as + a standard user; executes helper/cache/application guards, then installs and + activates the disposable test-MSIX described by that configuration. + +Each native suite also requires `TestNativeHEICAnalysisPixels`: successfully +decoded pixels reach an analysis subprocess and two preview queries in one +retained search subprocess through the shared owner, with cancellation/join +checks. This test uses the owned HEIC fixture and does not run model inference. + +The application fixture is `TestNativePackagedHEICActivation` under `heicnative`. +It relocates the application test executable to the fixed package layout and +runs the shared startup/viewer harness. It exercises the real checkbox across +separate viewer lifetimes, HEIC/HEIF admission, native helper decoding, ordinary +viewing, cancellation and shutdown. Fyne's test driver supplies the surface; +this is application-constructor/package-boundary evidence, not a production GUI +smoke test. The installed-MSIX entry is `TestNativeInstalledHEICActivation`, +compiled with `heicnative,microsoftstore` alongside the actual Store executable. +Windows activates its declared test application through +[IApplicationActivationManager](https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-iapplicationactivationmanager). +It requires actual package identity, Store-managed behavior, a nonadministrator +token and unchanged installed helper bytes/ACLs. + +CI's `packaging/heic/qualify-windows.ps1` provisions a disposable local standard +account on a GitHub-hosted runner. For MSIX it adds a separate test application, +uses a disposable signing certificate, and records setup separately from +application execution. `qualify-windows-child.ps1` performs the unelevated work +and removes its test package. The parent removes its account, owned workspace +and certificate/trust entry. Neither script is called by PicFetch. CI runs both +architectures for standalone and installed-MSIX scenarios. Runtime or permission +query failures fail the gate; there is no successful skip or elevated substitute. +For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, +`Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` +and architecture-matched `Dependency`. Provision only disposable test state. + +The Windows cache uses Win32 sharing restrictions to retain leased executables +and serialize publishers; copied bytes are checked before publication and again +before launch. The underlying semantics are documented in +[CreateFile](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew). +Native execution remains necessary to qualify ACLs, concurrent publication and +Store identity; cross-compilation is not that evidence. + +## Current verification and remaining gates + +Focused preference/Settings/admission/Explorer and helper-publication tests pass +locally. Native macOS arm64 application-constructor activation passes with the +unchanged helper entitlement and finite limits. Windows amd64/arm64 test binaries +compile. Native Windows, installed-MSIX, Linux and macOS amd64 results for these +new paths remain unverified until their new CI jobs execute. Production GUI +smoke tests remain distinct from the test-driver fixture. See the plan for exact +commands, recorded red/green results and inspections as they complete. + +All prior sandbox, integrity and resource controls remain. macOS still has the +previously accepted absence of a guaranteed total native-memory cap; WASM, +input/output and deadline limits remain mandatory. Decoder source and dependency +versions are unchanged. Distribution/licensing clearance (including patent and +source traceability questions), production signing and broader camera/color +qualification remain release gates. Successful decoding is not color fidelity. diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md index 7631321d..32c2523d 100644 --- a/docs/heic/qualification.md +++ b/docs/heic/qualification.md @@ -2,15 +2,16 @@ ## Current disposition -**HEIC viewing is still disabled on every production platform.** This branch -contains a reproducible WASI guest, codec-free protocol, bounded parent launcher -and a minimal helper. Native Apple Silicon tests exercise a signed App Sandbox -bundle and real decoding. Shared app/analysis admission and canonical imaging -integration now have focused regression coverage. Linux and Windows restrictions are -implemented but await native CI. Package construction and updater integration -are implemented, with native macOS signed-bundle evidence. Native distribution -qualification, the first-upgrade transition and representative camera -compatibility remain activation gates. No release or merge is authorized by this record. +The September 16 [experimental activation record](experimental-opt-in.md) +supersedes the earlier disabled-constructor status. The implementation now has +a default-off, restart-only Settings preference and executable-derived package +activation. Existing helper/source evidence below remains historical evidence; +it does not qualify the new Windows cache, standard-user or installed-MSIX +paths. Native macOS arm64 application-constructor coverage passes locally; +remaining platform/package runs, complete CI and fresh reviews are pending. +Distribution clearance, production signing, the first-upgrade transition and +broader camera/color qualification remain release gates. No release or merge +is authorized by this record. The subsequent source-retention instruction is implemented by restoring the exact maintained production copy in `third_party/h265`. The earlier unmodified diff --git a/internal/explorerpresets/presets.go b/internal/explorerpresets/presets.go index 0340d83f..c66cb4ae 100644 --- a/internal/explorerpresets/presets.go +++ b/internal/explorerpresets/presets.go @@ -61,7 +61,8 @@ func (r Rule) Validate() error { } } if r.Format != "" { - valid := false + // Saved rules survive changes in the session's experimental capability. + valid := r.Format == "heic" || r.Format == "heif" for _, ext := range imaging.SupportedExtensions() { ext = strings.TrimPrefix(ext, ".") if ext == "jpeg" { diff --git a/internal/filescan/filescan.go b/internal/filescan/filescan.go index 43329e60..ae724faa 100644 --- a/internal/filescan/filescan.go +++ b/internal/filescan/filescan.go @@ -35,6 +35,31 @@ import ( // cap) pass that instead. const DefaultMax = 200_000 +type options struct{ admit func(fyne.URI) bool } + +// Option configures one scan without changing the package's default admission. +type Option func(*options) + +// WithAdmission uses a session's immutable format capability. Nil retains the +// ordinary package-level policy. +func WithAdmission(admit func(fyne.URI) bool) Option { + return func(o *options) { + if admit != nil { + o.admit = admit + } + } +} + +func admission(opts []Option) func(fyne.URI) bool { + o := options{admit: imaging.IsSupportedImage} + for _, option := range opts { + if option != nil { + option(&o) + } + } + return o.admit +} + // realPathOf resolves u's filesystem path through any symlinks, falling // back to the URI's own path if that fails (a broken symlink, or a // filesystem race between the scan and something else touching the same @@ -65,7 +90,8 @@ func realPathOf(u fyne.URI) string { // discards a superseded scan's result anyway (as internal/ui's handleDrop // does) only needs the walk to stop touching the filesystem promptly, not // to finish correctly. -func Images(ctx context.Context, uris []fyne.URI, max int, progress func(n int)) (images []fyne.URI, truncated bool) { +func Images(ctx context.Context, uris []fyne.URI, max int, progress func(n int), opts ...Option) (images []fyne.URI, truncated bool) { + admit := admission(opts) if max < 1 { max = 1 } @@ -122,7 +148,7 @@ func Images(ctx context.Context, uris []fyne.URI, max int, progress func(n int)) return } - if !imaging.IsSupportedImage(u) { + if !admit(u) { return } @@ -175,7 +201,8 @@ func Images(ctx context.Context, uris []fyne.URI, max int, progress func(n int)) // when it is a supported image, otherwise empty. ctx is checked before any // work and before each child; an already-cancelled context returns nil, // false rather than a partial directory. -func Siblings(ctx context.Context, file fyne.URI, max int, progress func(n int)) (images []fyne.URI, truncated bool) { +func Siblings(ctx context.Context, file fyne.URI, max int, progress func(n int), opts ...Option) (images []fyne.URI, truncated bool) { + admit := admission(opts) if max < 1 { max = 1 } @@ -193,7 +220,7 @@ func Siblings(ctx context.Context, file fyne.URI, max int, progress func(n int)) if canList, err := storage.CanList(u); err == nil && canList { return } - if !imaging.IsSupportedImage(u) { + if !admit(u) { return } pathOf := realPathOf(u) @@ -214,7 +241,7 @@ func Siblings(ctx context.Context, file fyne.URI, max int, progress func(n int)) } } - if imaging.IsSupportedImage(file) { + if admit(file) { add(file) } if truncated { diff --git a/internal/filescan/filescan_test.go b/internal/filescan/filescan_test.go index d7dbdb05..c31a352b 100644 --- a/internal/filescan/filescan_test.go +++ b/internal/filescan/filescan_test.go @@ -50,6 +50,44 @@ func TestImages_EmptyInput(t *testing.T) { } } +func TestExperimentalHEICAdmission(t *testing.T) { + dir := t.TempDir() + for _, name := range []string{"photo.heic", "other.heif", "ordinary.png", "ignore.txt"} { + if err := os.WriteFile(filepath.Join(dir, name), []byte("owned scan fixture"), 0600); err != nil { + t.Fatal(err) + } + } + file := storage.NewFileURI(filepath.Join(dir, "photo.heic")) + admit := WithAdmission(func(u fyne.URI) bool { + return u.Extension() == ".heic" || u.Extension() == ".heif" || u.Extension() == ".png" + }) + for _, active := range []bool{false, true} { + option := WithAdmission(nil) + want := 1 + if active { + option, want = admit, 3 + } + images, truncated := Images(context.Background(), []fyne.URI{storage.NewFileURI(dir), file}, DefaultMax, nil, option) + if len(images) != want || truncated { + t.Fatalf("recursive active=%v: %v, truncated=%v", active, images, truncated) + } + images, truncated = Siblings(context.Background(), file, DefaultMax, nil, option) + if len(images) != want || truncated || (active && images[0].String() != file.String()) { + t.Fatalf("siblings active=%v: %v, truncated=%v", active, images, truncated) + } + } + images, truncated := Images(context.Background(), []fyne.URI{file, file}, 1, nil, admit) + if len(images) != 1 || !truncated { + t.Fatal("custom admission lost the scan cap") + } + ctx, cancel := context.WithCancel(context.Background()) + cancel() + images, truncated = Siblings(ctx, file, DefaultMax, nil, admit) + if len(images) != 0 || truncated { + t.Fatal("cancelled custom scan admitted a source") + } +} + func TestImages_FiltersUnsupportedFiles(t *testing.T) { jpegURI := uitest.TempJPEGURI(t, "keep.jpg", 4, 4, color.White) pngPath := uitest.WriteTempFile(t, "keep.png", uitest.EncodePNG(t, 4, 4, color.White)) diff --git a/internal/heicdecode/client/broker.go b/internal/heicdecode/client/broker.go index 99484dfb..0666b3d9 100644 --- a/internal/heicdecode/client/broker.go +++ b/internal/heicdecode/client/broker.go @@ -126,6 +126,9 @@ func (c *Client) serveRequest(ctx context.Context, op heicdecode.Operation, inpu return data, resultErr }) } + if ctx.Err() == nil { + c.recordAvailability(decodeErr) + } if inputErr != nil { return inputErr } @@ -204,8 +207,7 @@ func writeBrokerResult(w io.Writer, op heicdecode.Operation, result heicdecode.R if decodeErr == nil { return heicdecode.WriteResponse(w, op, result, limits) } - var failure *heicdecode.Failure - if errors.As(decodeErr, &failure) { + if failure, ok := errors.AsType[*heicdecode.Failure](decodeErr); ok { return heicdecode.WriteFailure(w, failure.Status, failure.Diagnostic, limits) } return heicdecode.WriteFailure(w, heicdecode.StatusUnavailable, "helper request failed", limits) diff --git a/internal/heicdecode/client/client.go b/internal/heicdecode/client/client.go index fd817599..e27a58b7 100644 --- a/internal/heicdecode/client/client.go +++ b/internal/heicdecode/client/client.go @@ -36,15 +36,18 @@ type Input func(ctx context.Context, maxBytes int64) ([]byte, error) // Client admits one job and at most 64 pending callers. Stop is nonblocking; // Wait joins active process/pipe work and cancelled waiting callers off the UI. type Client struct { - config Config - ctx context.Context - cancel context.CancelFunc - lane admissionQueue - mu sync.Mutex - closed bool - active int - services int - work sync.WaitGroup + config Config + ctx context.Context + cancel context.CancelFunc + lane admissionQueue + mu sync.Mutex + closed bool + active int + services int + work sync.WaitGroup + unavailable bool + release func() + releaseOnce sync.Once } func New(config Config) (*Client, error) { @@ -65,7 +68,31 @@ func (c *Client) Stop() { c.mu.Unlock() } -func (c *Client) Wait() { c.work.Wait() } +func (c *Client) Wait() { + c.work.Wait() + c.mu.Lock() + closed := c.closed + c.mu.Unlock() + if closed && c.release != nil { + c.releaseOnce.Do(c.release) + } +} + +// Unavailable reports the latest helper identity/readiness failure, separately +// from immutable reader capability and the user's saved preference. +func (c *Client) Unavailable() bool { + c.mu.Lock() + defer c.mu.Unlock() + return c.unavailable +} + +func (c *Client) recordAvailability(err error) { + if err == nil || errors.Is(err, ErrUnavailable) { + c.mu.Lock() + c.unavailable = err != nil + c.mu.Unlock() + } +} // Do retains admission until source work, the helper, all pipes, and output // validation have finished. A cancelled queued call never invokes input. @@ -86,6 +113,7 @@ func (c *Client) DoWithPriority(ctx context.Context, priority Priority, op heicd result, err = c.run(ctx, op, input) return err }) + c.recordAvailability(err) if err != nil { return heicdecode.Response{}, err } diff --git a/internal/heicdecode/client/client_test.go b/internal/heicdecode/client/client_test.go index d2e6f340..99460cfd 100644 --- a/internal/heicdecode/client/client_test.go +++ b/internal/heicdecode/client/client_test.go @@ -321,3 +321,21 @@ func TestStopCancelsAdmittedAndWaitingSources(t *testing.T) { } } } + +func TestUnavailableProbeStorageRefusesSource(t *testing.T) { + owner := ownedPeer(t, "success", time.Second) + blocked := filepath.Join(t.TempDir(), "not-a-directory") + if err := os.WriteFile(blocked, []byte("owned refusal"), 0600); err != nil { + t.Fatal(err) + } + for _, key := range []string{"TMPDIR", "TEMP", "TMP"} { + t.Setenv(key, blocked) + } + _, err := owner.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + t.Fatal("failed sandbox preparation read image input") + return nil, nil + }) + if !errors.Is(err, ErrUnavailable) || !owner.Unavailable() { + t.Fatalf("failed sandbox preparation did not report unavailable: %v", err) + } +} diff --git a/internal/heicdecode/client/installed_other.go b/internal/heicdecode/client/installed_other.go new file mode 100644 index 00000000..8c8073e4 --- /dev/null +++ b/internal/heicdecode/client/installed_other.go @@ -0,0 +1,12 @@ +//go:build !windows + +package client + +import "context" + +func prepareInstalled(ctx context.Context, helper string, _ [32]byte, _ string) (string, func(), error) { + if err := ctx.Err(); err != nil { + return "", nil, err + } + return helper, func() {}, nil +} diff --git a/internal/heicdecode/client/installed_unsupported_windows.go b/internal/heicdecode/client/installed_unsupported_windows.go new file mode 100644 index 00000000..eb01e1a4 --- /dev/null +++ b/internal/heicdecode/client/installed_unsupported_windows.go @@ -0,0 +1,9 @@ +//go:build windows && !amd64 && !arm64 + +package client + +import "context" + +func prepareInstalled(_ context.Context, _ string, _ [32]byte, _ string) (string, func(), error) { + return "", nil, ErrUnavailable +} diff --git a/internal/heicdecode/client/installed_windows.go b/internal/heicdecode/client/installed_windows.go new file mode 100644 index 00000000..af85e88b --- /dev/null +++ b/internal/heicdecode/client/installed_windows.go @@ -0,0 +1,216 @@ +//go:build windows && (amd64 || arm64) + +package client + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "sync" + "time" + "unsafe" + + "golang.org/x/sys/windows" + + "github.com/frathe/picfetch/internal/heicdecode/winisolation" +) + +func prepareInstalled(ctx context.Context, source string, digest [32]byte, root string) (string, func(), error) { + if err := ctx.Err(); err != nil { + return "", nil, err + } + if err := privateCacheDirectory(root); err != nil { + return "", nil, err + } + rootHandle, err := pinCachePath(root, true) + if err != nil { + return "", nil, err + } + handles := []windows.Handle{rootHandle} + var once sync.Once + release := func() { + once.Do(func() { + for i := len(handles) - 1; i >= 0; i-- { + _ = windows.CloseHandle(handles[i]) + } + }) + } + success := false + defer func() { + if !success { + release() + } + }() + locked, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + lock, err := lockCache(locked, filepath.Join(root, "publication.lock")) + if err != nil { + return "", nil, err + } + defer func() { _ = windows.CloseHandle(lock) }() + path, err := stageHelper(ctx, source, digest, root, func(path string) error { + // Reject reparse points and hard links before changing a copy's permissions. + file, err := pinCachePath(path, false) + if err != nil { + return err + } + defer func() { _ = windows.CloseHandle(file) }() + return winisolation.PrepareExecutable(path) + }) + if err != nil { + return "", nil, err + } + for _, entry := range []struct { + path string + directory bool + }{{filepath.Dir(path), true}, {path, false}} { + handle, pinErr := pinCachePath(entry.path, entry.directory) + if pinErr != nil { + return "", nil, pinErr + } + handles = append(handles, handle) + } + // Verify the published bytes while write/delete-denying leases are held. + if err = verifyStaged(ctx, path, digest); err != nil { + return "", nil, err + } + cleanObsoleteHelpers(root, filepath.Dir(path)) + success = true + return path, release, nil +} + +// Only this user and SYSTEM receive inherited access to the private cache. +// The helper receives its separate, noninherited read/execute grant later. +func privateCacheDirectory(root string) error { + if !filepath.IsAbs(root) || filepath.Dir(root) == root { + return ErrUnavailable + } + if err := os.MkdirAll(filepath.Dir(root), 0700); err != nil { + return err + } + user, err := windows.GetCurrentProcessToken().GetTokenUser() + if err != nil { + return err + } + sid := user.User.Sid.String() + descriptor, err := windows.SecurityDescriptorFromString("O:" + sid + "D:P(A;OICI;FA;;;" + sid + ")(A;OICI;FA;;;SY)") + if err != nil { + return err + } + name, err := windows.UTF16PtrFromString(root) + if err != nil { + return err + } + attributes := windows.SecurityAttributes{Length: uint32(unsafe.Sizeof(windows.SecurityAttributes{})), SecurityDescriptor: descriptor} + if err = windows.CreateDirectory(name, &attributes); err != nil && !errors.Is(err, windows.ERROR_ALREADY_EXISTS) { + return err + } + handle, err := pinCachePath(root, true) + if err != nil { + return err + } + defer func() { _ = windows.CloseHandle(handle) }() + existing, err := windows.GetSecurityInfo(handle, windows.SE_FILE_OBJECT, windows.OWNER_SECURITY_INFORMATION) + if err != nil { + return err + } + owner, _, err := existing.Owner() + if err != nil { + return err + } + if owner == nil || !windows.EqualSid(owner, user.User.Sid) { + return fmt.Errorf("%w: private cache owner", ErrUnavailable) + } + acl, _, err := descriptor.DACL() + if err != nil { + return err + } + return windows.SetSecurityInfo(handle, windows.SE_FILE_OBJECT, windows.DACL_SECURITY_INFORMATION|windows.PROTECTED_DACL_SECURITY_INFORMATION, nil, nil, acl, nil) +} + +func pinCachePath(path string, directory bool) (windows.Handle, error) { + name, err := windows.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + flags := uint32(windows.FILE_FLAG_OPEN_REPARSE_POINT) + access, share := uint32(windows.GENERIC_READ), uint32(windows.FILE_SHARE_READ) + if directory { + flags |= windows.FILE_FLAG_BACKUP_SEMANTICS + access = windows.FILE_READ_ATTRIBUTES | windows.READ_CONTROL | windows.WRITE_DAC + share |= windows.FILE_SHARE_WRITE + } + handle, err := windows.CreateFile(name, access, share, nil, windows.OPEN_EXISTING, flags, 0) + if err != nil { + return 0, err + } + var info windows.ByHandleFileInformation + err = windows.GetFileInformationByHandle(handle, &info) + if err == nil && (info.FileAttributes&windows.FILE_ATTRIBUTE_REPARSE_POINT != 0 || (info.FileAttributes&windows.FILE_ATTRIBUTE_DIRECTORY != 0) != directory || (!directory && info.NumberOfLinks != 1)) { + err = fmt.Errorf("%w: private cache entry identity", ErrUnavailable) + } + if err != nil { + _ = windows.CloseHandle(handle) + return 0, err + } + return handle, nil +} + +func lockCache(ctx context.Context, path string) (windows.Handle, error) { + name, err := windows.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + for { + if err = ctx.Err(); err != nil { + return 0, err + } + handle, openErr := windows.CreateFile(name, windows.GENERIC_READ|windows.GENERIC_WRITE, 0, nil, windows.OPEN_ALWAYS, windows.FILE_FLAG_OPEN_REPARSE_POINT, 0) + if openErr == nil { + var info windows.ByHandleFileInformation + if err = windows.GetFileInformationByHandle(handle, &info); err == nil && (info.FileAttributes&(windows.FILE_ATTRIBUTE_REPARSE_POINT|windows.FILE_ATTRIBUTE_DIRECTORY) != 0 || info.NumberOfLinks != 1) { + err = ErrUnavailable + } + if err != nil { + _ = windows.CloseHandle(handle) + return 0, err + } + return handle, nil + } + if !errors.Is(openErr, windows.ERROR_SHARING_VIOLATION) { + return 0, openErr + } + timer := time.NewTimer(25 * time.Millisecond) + select { + case <-ctx.Done(): + timer.Stop() + return 0, ctx.Err() + case <-timer.C: + } + } +} + +func cleanObsoleteHelpers(root, current string) { + entries, err := os.ReadDir(root) + if err != nil { + return + } + for _, entry := range entries { + path := filepath.Join(root, entry.Name()) + if path == current || !entry.IsDir() || entry.Type()&os.ModeSymlink != 0 { + continue + } + arch, digest, ok := strings.Cut(entry.Name(), "-") + decoded, err := hex.DecodeString(digest) + if !ok || (arch != "amd64" && arch != "arm64") || err != nil || len(decoded) != 32 || hex.EncodeToString(decoded) != digest { + continue + } + // An active client holds a write/delete-denying file lease. A failed removal + // is safe to defer until a later startup; never recursively force cleanup. + _ = removeStaged(path) + } +} diff --git a/internal/heicdecode/client/installed_windows_test.go b/internal/heicdecode/client/installed_windows_test.go new file mode 100644 index 00000000..202723d4 --- /dev/null +++ b/internal/heicdecode/client/installed_windows_test.go @@ -0,0 +1,255 @@ +//go:build windows && (amd64 || arm64) + +package client + +import ( + "bufio" + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func TestWindowsInstalledHelperCache(t *testing.T) { + source := filepath.Join(t.TempDir(), "owned.exe") + data := []byte("owned fixture, never executed") + if err := os.WriteFile(source, data, 0700); err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(data) + root := filepath.Join(t.TempDir(), "private-cache") + staged, release, err := prepareInstalled(context.Background(), source, digest, root) + if err != nil { + t.Fatal(err) + } + defer release() + if staged == source || !strings.Contains(staged, hex.EncodeToString(digest[:])) { + t.Fatal("installed source was not privately staged") + } + first, err := os.Stat(staged) + if err != nil { + t.Fatal(err) + } + reused, release2, err := prepareInstalled(context.Background(), source, digest, root) + if err != nil { + t.Fatal(err) + } + defer release2() + info, err := os.Stat(reused) + if err != nil || !os.SameFile(first, info) { + t.Fatal("valid active helper copy was replaced") + } + if err = os.WriteFile(staged, []byte("damaged"), 0700); err == nil { + t.Fatal("active executable was writable") + } + if err = os.Remove(staged); err == nil { + t.Fatal("active executable was deletable") + } + release() + release2() + if err = os.WriteFile(staged, []byte("damaged"), 0700); err != nil { + t.Fatal(err) + } + repaired, release3, err := prepareInstalled(context.Background(), source, digest, root) + if err != nil { + t.Fatal(err) + } + defer release3() + got, err := os.ReadFile(repaired) + if err != nil || string(got) != string(data) { + t.Fatal("damaged cache was not repaired") + } + newer := []byte("owned newer helper") + if err = os.WriteFile(source, newer, 0700); err != nil { + t.Fatal(err) + } + current, release4, err := prepareInstalled(context.Background(), source, sha256.Sum256(newer), root) + if err != nil { + t.Fatal(err) + } + defer release4() + if _, err = os.Stat(repaired); err != nil { + t.Fatal("removed obsolete helper while leased") + } + release3() + again, release5, err := prepareInstalled(context.Background(), source, sha256.Sum256(newer), root) + if err != nil { + t.Fatal(err) + } + defer release5() + if again != current { + t.Fatal("current helper path changed") + } + if _, err = os.Stat(repaired); !errors.Is(err, os.ErrNotExist) { + t.Fatalf("unused obsolete copy survived cleanup: %v", err) + } + ctx, cancel := context.WithCancel(context.Background()) + cancel() + if _, _, err = prepareInstalled(ctx, source, sha256.Sum256(newer), root); !errors.Is(err, context.Canceled) { + t.Fatalf("canceled stage: %v", err) + } +} + +func TestWindowsCacheLeaseWaitsForShutdown(t *testing.T) { + source := filepath.Join(t.TempDir(), "owned.exe") + data := []byte("owned helper") + if err := os.WriteFile(source, data, 0700); err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(data) + path, release, err := prepareInstalled(context.Background(), source, digest, filepath.Join(t.TempDir(), "cache")) + if err != nil { + t.Fatal(err) + } + owner, err := New(Config{Executable: path, SHA256: digest, Limits: heicdecode.DefaultLimits(0)}) + if err != nil { + release() + t.Fatal(err) + } + owner.release = release + defer func() { owner.Stop(); owner.Wait() }() + owner.Wait() + if err = os.Remove(path); err == nil { + t.Fatal("nonterminal Wait released the helper lease") + } + owner.Stop() + owner.Wait() + owner.Wait() + if err = os.Remove(path); err != nil { + t.Fatalf("shutdown retained the helper lease: %v", err) + } +} + +func TestWindowsConcurrentHelperStaging(t *testing.T) { + source := filepath.Join(t.TempDir(), "owned.exe") + data := []byte("owned simultaneous publication") + if err := os.WriteFile(source, data, 0700); err != nil { + t.Fatal(err) + } + root := filepath.Join(t.TempDir(), "cache") + config, err := json.Marshal([]string{source, root}) + if err != nil { + t.Fatal(err) + } + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + type peer struct { + command *exec.Cmd + input io.WriteCloser + output *bufio.Reader + } + var peers []peer + for range 3 { + cmd := exec.CommandContext(ctx, executable, "-test.run=^TestWindowsHelperCachePeer$") + cmd.Env = append(os.Environ(), "PICFETCH_HEIC_CACHE_TEST_PEER="+string(config)) + input, pipeErr := cmd.StdinPipe() + if pipeErr != nil { + t.Fatal(pipeErr) + } + output, pipeErr := cmd.StdoutPipe() + if pipeErr != nil { + t.Fatal(pipeErr) + } + cmd.Stderr = os.Stderr + if err = cmd.Start(); err != nil { + t.Fatal(err) + } + peers = append(peers, peer{cmd, input, bufio.NewReader(output)}) + } + defer func() { + for _, peer := range peers { + _ = peer.input.Close() + _ = peer.command.Wait() + } + }() + var selected string + for _, peer := range peers { + line, readErr := peer.output.ReadString('\n') + if readErr != nil || !strings.HasPrefix(line, "ready ") { + t.Fatalf("cache peer: %q, %v", line, readErr) + } + path := strings.TrimSpace(strings.TrimPrefix(line, "ready ")) + if selected != "" && selected != path { + t.Fatal("concurrent publishers selected different copies") + } + selected = path + } + if got, readErr := os.ReadFile(selected); readErr != nil || string(got) != string(data) { + t.Fatal("concurrent publication exposed incomplete bytes") + } + for _, peer := range peers { + if err = peer.input.Close(); err != nil { + t.Fatal(err) + } + if err = peer.command.Wait(); err != nil { + t.Fatal(err) + } + } + peers = nil +} + +func TestWindowsHelperCachePeer(t *testing.T) { + value := os.Getenv("PICFETCH_HEIC_CACHE_TEST_PEER") + if value == "" { + return + } + var args []string + if err := json.Unmarshal([]byte(value), &args); err != nil || len(args) != 2 { + t.Fatal("invalid owned peer configuration") + } + data, err := os.ReadFile(args[0]) + if err != nil { + t.Fatal(err) + } + path, release, err := prepareInstalled(context.Background(), args[0], sha256.Sum256(data), args[1]) + if err != nil { + t.Fatal(err) + } + defer release() + fmt.Println("ready " + path) + _, _ = io.Copy(io.Discard, os.Stdin) +} + +func TestWindowsHelperCacheRejectsHardLinksAndNonDirectories(t *testing.T) { + source := filepath.Join(t.TempDir(), "owned.exe") + data := []byte("owned helper") + if err := os.WriteFile(source, data, 0700); err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(data) + root := filepath.Join(t.TempDir(), "cache") + path, release, err := prepareInstalled(context.Background(), source, digest, root) + if err != nil { + t.Fatal(err) + } + release() + if err = os.Remove(path); err != nil { + t.Fatal(err) + } + if err = os.Link(source, path); err != nil { + t.Fatal(err) + } + if _, stop, err := prepareInstalled(context.Background(), source, digest, root); err == nil { + stop() + t.Fatal("cache hard link could change installed source permissions") + } + if _, stop, err := prepareInstalled(context.Background(), source, digest, source); err == nil { + stop() + t.Fatal("file accepted as private cache directory") + } +} diff --git a/internal/heicdecode/client/native_platform_test.go b/internal/heicdecode/client/native_platform_test.go index c1bdbbe6..64af9873 100644 --- a/internal/heicdecode/client/native_platform_test.go +++ b/internal/heicdecode/client/native_platform_test.go @@ -29,14 +29,14 @@ func TestNativeSandboxHelper(t *testing.T) { if output, buildErr := build.CombinedOutput(); buildErr != nil { t.Fatalf("stage helper package: %v: %s", buildErr, output) } - executable, digest, err := LoadPackage(packageRoot, runtime.GOOS, runtime.GOARCH) - if err != nil { - t.Fatal(err) + mainExecutable := filepath.Join(packageRoot, "picfetch") + if runtime.GOOS == "windows" { + mainExecutable += ".exe" } - if err = prepareNativeHelper(executable); err != nil { + if err = os.WriteFile(mainExecutable, []byte("owned installation marker"), 0700); err != nil { t.Fatal(err) } - client, err := New(Config{Executable: executable, SHA256: digest, Limits: heicdecode.DefaultLimits(0)}) + client, err := OpenInstalled(context.Background(), mainExecutable, filepath.Join(t.TempDir(), "heic-helpers"), heicdecode.DefaultLimits(0)) if err != nil { t.Fatal(err) } diff --git a/internal/heicdecode/client/package.go b/internal/heicdecode/client/package.go index 7cc8a517..040de013 100644 --- a/internal/heicdecode/client/package.go +++ b/internal/heicdecode/client/package.go @@ -2,6 +2,7 @@ package client import ( "bytes" + "context" "crypto/sha256" "encoding/hex" "encoding/json" @@ -10,8 +11,65 @@ import ( "io" "os" "path/filepath" + "runtime" + "strings" + + "github.com/frathe/picfetch/internal/heicdecode" ) +// InstallationRoot discovers only the package containing the running binary. +// A macOS standalone executable is deliberately not a complete app package. +func InstallationRoot(executable, system string) (string, error) { + if !filepath.IsAbs(executable) { + return "", ErrUnavailable + } + executable, err := filepath.EvalSymlinks(executable) + if err != nil { + return "", err + } + dir := filepath.Dir(executable) + switch system { + case "darwin": + contents := filepath.Dir(dir) + root := filepath.Dir(contents) + if filepath.Base(dir) != "MacOS" || filepath.Base(contents) != "Contents" || !strings.HasSuffix(strings.ToLower(root), ".app") { + return "", ErrUnavailable + } + return root, nil + case "linux", "windows": + return dir, nil + default: + return "", ErrUnavailable + } +} + +// OpenInstalled creates the one app-owned client from a complete local package. +// Preparation never chooses another decoder or downloads a missing helper. +func OpenInstalled(ctx context.Context, executable, privateDir string, limits heicdecode.Limits) (*Client, error) { + if err := ctx.Err(); err != nil { + return nil, err + } + root, err := InstallationRoot(executable, runtime.GOOS) + if err != nil { + return nil, err + } + helper, digest, err := LoadPackage(root, runtime.GOOS, runtime.GOARCH) + if err != nil { + return nil, err + } + helper, release, err := prepareInstalled(ctx, helper, digest, privateDir) + if err != nil { + return nil, err + } + owner, err := New(Config{Executable: helper, SHA256: digest, Limits: limits}) + if err != nil { + release() + return nil, err + } + owner.release = release + return owner, nil +} + // PackageManifest records the post-signing helper identity within a trusted // installed package. It is not an independent signature: package authenticity // belongs to the enclosing TUF archive or platform bundle/package signature. diff --git a/internal/heicdecode/client/package_test.go b/internal/heicdecode/client/package_test.go index cf9ab2ed..c31e4796 100644 --- a/internal/heicdecode/client/package_test.go +++ b/internal/heicdecode/client/package_test.go @@ -1,11 +1,15 @@ package client import ( + "bytes" + "context" "crypto/sha256" "encoding/hex" "encoding/json" + "errors" "os" "path/filepath" + "strings" "testing" ) @@ -81,3 +85,84 @@ func TestPackagedHelperRejectsUntrustedManifestChoices(t *testing.T) { t.Fatal("relative installation root accepted") } } + +func TestStagedHelperPublication(t *testing.T) { + source := filepath.Join(t.TempDir(), "packaged.exe") + data := []byte("owned packaged helper") + if err := os.WriteFile(source, data, 0700); err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(data) + root := t.TempDir() + prepared := 0 + prepare := func(path string) error { + prepared++ + got, err := os.ReadFile(path) + if err != nil || !bytes.Equal(got, data) { + t.Fatal("permissions prepared before verified copy existed") + } + if path == source { + t.Fatal("changed installed helper permissions") + } + return nil + } + staged, err := stageHelper(context.Background(), source, digest, root, prepare) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(staged, hex.EncodeToString(digest[:])) { + t.Fatal("copy is not content addressed") + } + first, err := os.Stat(staged) + if err != nil { + t.Fatal(err) + } + reused, err := stageHelper(context.Background(), source, digest, root, prepare) + if err != nil || reused != staged { + t.Fatalf("reuse: %q %v", reused, err) + } + second, err := os.Stat(reused) + if err != nil || !os.SameFile(first, second) { + t.Fatal("valid copy was replaced") + } + if err = os.WriteFile(staged, []byte("damaged"), 0700); err != nil { + t.Fatal(err) + } + repaired, err := stageHelper(context.Background(), source, digest, root, prepare) + if err != nil || repaired != staged { + t.Fatalf("repair: %q %v", repaired, err) + } + got, err := os.ReadFile(repaired) + if err != nil || !bytes.Equal(got, data) || prepared != 3 { + t.Fatal("damaged copy not repaired/prepared") + } + if err = os.WriteFile(source, []byte("changed installed source"), 0700); err != nil { + t.Fatal(err) + } + if _, err = stageHelper(context.Background(), source, digest, t.TempDir(), prepare); err == nil { + t.Fatal("published a changed source") + } + ctx, cancel := context.WithCancel(context.Background()) + cancel() + if _, err = stageHelper(ctx, source, digest, root, prepare); !errors.Is(err, context.Canceled) { + t.Fatalf("cancellation: %v", err) + } +} + +func TestStagedHelperPreparationFailure(t *testing.T) { + source := filepath.Join(t.TempDir(), "packaged.exe") + data := []byte("owned helper") + if err := os.WriteFile(source, data, 0700); err != nil { + t.Fatal(err) + } + root := t.TempDir() + denied := errors.New("owned permission denial") + _, err := stageHelper(context.Background(), source, sha256.Sum256(data), root, func(_ string) error { return denied }) + if !errors.Is(err, denied) { + t.Fatalf("preparation error lost: %v", err) + } + entries, err := os.ReadDir(root) + if err != nil || len(entries) != 0 { + t.Fatalf("failed preparation published or leaked a copy: %v, %v", entries, err) + } +} diff --git a/internal/heicdecode/client/process.go b/internal/heicdecode/client/process.go index 87b9eca7..c7acac14 100644 --- a/internal/heicdecode/client/process.go +++ b/internal/heicdecode/client/process.go @@ -20,23 +20,23 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) var empty heicdecode.Response probe, err := os.MkdirTemp("", "picfetch-heic-probe-") if err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } defer func() { _ = os.RemoveAll(probe) }() readPath, writePath := filepath.Join(probe, "read"), filepath.Join(probe, "write") if err = os.WriteFile(readPath, []byte("PicFetch owned sandbox probe\n"), 0600); err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } // Both endpoints belong to this request. A failed sandbox can reach only // these disposable loopback sockets, never an unrelated network service. probes, err := openNativeProbes(ctx) if err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } defer probes.close() limitsJSON, err := json.Marshal(c.config.Limits) if err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } cmd := exec.Command(c.config.Executable, "--heic-worker-v2", string(limitsJSON), readPath, writePath, probes.tcp.Addr().String(), probes.udp.LocalAddr().String()) cmd.Env = []string{"GOMAXPROCS=1"} @@ -56,15 +56,15 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) } inRead, inWrite, err := newPipe() if err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } outRead, outWrite, err := newPipe() if err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } errRead, errWrite, err := newPipe() if err != nil { - return empty, err + return empty, fmt.Errorf("%w: setup: %v", ErrUnavailable, err) } cmd.Stdin, cmd.Stdout, cmd.Stderr = inRead, outWrite, errWrite process, err := startProcess(cmd, c.config.Limits) @@ -152,13 +152,11 @@ func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) return empty, err } writeDone := make(chan error, 1) - pipeWork.Add(1) - go func() { - defer pipeWork.Done() + pipeWork.Go(func() { writeErr := heicdecode.WriteRequest(inWrite, heicdecode.Request{Operation: op, Input: data}, c.config.Limits) _ = inWrite.Close() writeDone <- writeErr - }() + }) decoded, readErr := heicdecode.ReadResponse(outRead, op, c.config.Limits) if readErr != nil { return empty, readErr diff --git a/internal/heicdecode/client/staging.go b/internal/heicdecode/client/staging.go new file mode 100644 index 00000000..20ae3be4 --- /dev/null +++ b/internal/heicdecode/client/staging.go @@ -0,0 +1,142 @@ +package client + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "runtime" +) + +const stagedExecutable = "picfetch-heic-worker.exe" + +// stageHelper runs while the caller holds the private cache's publication lock. +// Preparation operates on owned copies only, before their directory is published. +func stageHelper(ctx context.Context, source string, digest [32]byte, root string, prepare func(string) error) (string, error) { + if err := ctx.Err(); err != nil { + return "", err + } + directory := filepath.Join(root, runtime.GOARCH+"-"+hex.EncodeToString(digest[:])) + target := filepath.Join(directory, stagedExecutable) + if info, err := os.Lstat(directory); err == nil { + if !info.IsDir() || info.Mode()&os.ModeSymlink != 0 { + return "", ErrUnavailable + } + if err = verifyStaged(ctx, target, digest); err == nil { + if err = prepare(target); err != nil { + return "", err + } + return target, ctx.Err() + } + if ctx.Err() != nil { + return "", ctx.Err() + } + // A Windows lease prevents removing any copy used by another app instance. + // Remove only the known file and empty directory; never recurse into a cache entry. + if err = removeStaged(directory); err != nil { + return "", err + } + } else if !errors.Is(err, os.ErrNotExist) { + return "", err + } + temporary, err := os.MkdirTemp(root, ".stage-") + if err != nil { + return "", err + } + defer func() { _ = removeStaged(temporary) }() + copied := filepath.Join(temporary, stagedExecutable) + if err = copyStaged(ctx, source, copied); err != nil { + return "", err + } + if err = verifyStaged(ctx, copied, digest); err != nil { + return "", err + } + if err = prepare(copied); err != nil { + return "", err + } + if err = ctx.Err(); err != nil { + return "", err + } + if err = os.Rename(temporary, directory); err != nil { + return "", err + } + return target, nil +} + +func removeStaged(directory string) error { + if err := os.Remove(filepath.Join(directory, stagedExecutable)); err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + return os.Remove(directory) +} + +func copyStaged(ctx context.Context, source, destination string) error { + input, err := os.Open(source) + if err != nil { + return err + } + defer func() { _ = input.Close() }() + info, err := input.Stat() + if err != nil { + return err + } + if !info.Mode().IsRegular() || info.Size() <= 0 || info.Size() > 64*1024*1024 { + return ErrUnavailable + } + output, err := os.OpenFile(destination, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0700) + if err != nil { + return err + } + defer func() { _ = output.Close() }() + n, err := io.Copy(output, io.LimitReader(stagingReader{ctx, input}, 64*1024*1024+1)) + if err != nil { + return err + } + if n != info.Size() { + return fmt.Errorf("%w: packaged helper size changed", ErrUnavailable) + } + if err = output.Sync(); err != nil { + return err + } + return output.Close() +} + +func verifyStaged(ctx context.Context, path string, digest [32]byte) error { + info, err := os.Lstat(path) + if err != nil { + return err + } + if !info.Mode().IsRegular() || info.Size() <= 0 || info.Size() > 64*1024*1024 { + return ErrUnavailable + } + input, err := os.Open(path) + if err != nil { + return err + } + defer func() { _ = input.Close() }() + hash := sha256.New() + n, err := io.Copy(hash, io.LimitReader(stagingReader{ctx, input}, 64*1024*1024+1)) + if err != nil { + return err + } + if n != info.Size() || string(hash.Sum(nil)) != string(digest[:]) { + return fmt.Errorf("%w: staged helper identity", ErrUnavailable) + } + return ctx.Err() +} + +type stagingReader struct { + ctx context.Context + reader io.Reader +} + +func (r stagingReader) Read(p []byte) (int, error) { + if err := r.ctx.Err(); err != nil { + return 0, err + } + return r.reader.Read(p) +} diff --git a/internal/heicdecode/winisolation/native_windows_test.go b/internal/heicdecode/winisolation/native_windows_test.go index 7151ee4c..02c8e890 100644 --- a/internal/heicdecode/winisolation/native_windows_test.go +++ b/internal/heicdecode/winisolation/native_windows_test.go @@ -176,3 +176,15 @@ func TestLoopbackExemptionRefusesHelperIdentity(t *testing.T) { }) } } + +func TestLoopbackPermissionQueryFailureRefused(t *testing.T) { + if err := validateLoopbackQuery(uintptr(windows.ERROR_ACCESS_DENIED), 0, nil); !errors.Is(err, windows.ERROR_ACCESS_DENIED) { + t.Fatalf("permission-query failure accepted or obscured: %v", err) + } + if err := validateLoopbackQuery(0, 1, nil); err == nil { + t.Fatal("missing native query entries accepted") + } + if err := validateLoopbackQuery(0, 0, nil); err != nil { + t.Fatalf("successful empty native query rejected: %v", err) + } +} diff --git a/internal/heicdecode/winisolation/policy_windows.go b/internal/heicdecode/winisolation/policy_windows.go index d495742f..790fa270 100644 --- a/internal/heicdecode/winisolation/policy_windows.go +++ b/internal/heicdecode/winisolation/policy_windows.go @@ -128,11 +128,8 @@ func verifyLoopbackIsolation(expected *windows.SID) (resultErr error) { var count uint32 var entries *windows.SIDAndAttributes code, _, _ := query.Call(uintptr(unsafe.Pointer(&count)), uintptr(unsafe.Pointer(&entries))) - if code != 0 { - return fmt.Errorf("query HEIC loopback exemptions: %w", windows.Errno(code)) - } - if count != 0 && entries == nil { - return errors.New("HEIC loopback exemption query returned no entries") + if err := validateLoopbackQuery(code, count, entries); err != nil { + return err } items := unsafe.Slice(entries, count) // The API allocates both the array and each SID on the process heap. @@ -165,3 +162,13 @@ func validateLoopbackExemptions(expected *windows.SID, items []windows.SIDAndAtt } return nil } + +func validateLoopbackQuery(code uintptr, count uint32, entries *windows.SIDAndAttributes) error { + if code != 0 { + return fmt.Errorf("query HEIC loopback exemptions: %w", windows.Errno(code)) + } + if count != 0 && entries == nil { + return errors.New("HEIC loopback exemption query returned no entries") + } + return nil +} diff --git a/internal/imaging/source.go b/internal/imaging/source.go index 25c6a5c8..4e50b7ec 100644 --- a/internal/imaging/source.go +++ b/internal/imaging/source.go @@ -41,6 +41,37 @@ type Source struct { func NewReader(decode HEICDecoder) Reader { return Reader{heic: decode} } +// SupportedExtensions describes this reader's immutable decode capability. +// Package-level declarations deliberately exclude experimental formats. +func (r Reader) SupportedExtensions() []string { + extensions := SupportedExtensions() + if r.heic != nil { + extensions = append(extensions, ".heic", ".heif") + } + return extensions +} + +// IsSupportedImage admits still HEIC only when this reader has an owner. +// It preserves the ordinary extension-first lookup and never decodes a source. +func (r Reader) IsSupportedImage(u fyne.URI) bool { + switch strings.ToLower(u.Extension()) { + case ".heic", ".heif": + return r.heic != nil + case ".heics", ".heifs": + return false + } + if IsSupportedImage(u) { + return true + } + if r.heic != nil { + switch strings.ToLower(u.MimeType()) { + case "image/heic", "image/heif": + return true + } + } + return false +} + // Read probes ordinary images without decoding their pixels; HEIC bounds and // pixels arrive together so a later Decode cannot start another helper job. func (r Reader) Read(ctx context.Context, u fyne.URI) (*Source, error) { diff --git a/internal/imaging/source_test.go b/internal/imaging/source_test.go index 372f6ca0..98de7587 100644 --- a/internal/imaging/source_test.go +++ b/internal/imaging/source_test.go @@ -11,6 +11,7 @@ import ( "io" "os" "path/filepath" + "slices" "sync" "sync/atomic" "testing" @@ -22,6 +23,38 @@ import ( "github.com/frathe/picfetch/internal/uitest" ) +func TestExperimentalHEICFormats(t *testing.T) { + configured := NewReader(func(_ context.Context, _ heicdecode.Operation, _ client.Input) (heicdecode.Response, error) { + t.Fatal("format admission decoded a source") + return heicdecode.Response{}, nil + }) + for _, ext := range []string{".heic", ".HEIF"} { + u := uitest.FakeURI{FileName: "photo" + ext, Ext: ext} + if !configured.IsSupportedImage(u) || (Reader{}).IsSupportedImage(u) || IsSupportedImage(u) { + t.Fatalf("unexpected session admission for %s", ext) + } + } + for _, ext := range []string{".heics", ".heifs"} { + if configured.IsSupportedImage(uitest.FakeURI{FileName: "sequence" + ext, Ext: ext}) { + t.Fatalf("sequence admitted: %s", ext) + } + } + for _, ext := range SupportedExtensions() { + u := uitest.FakeURI{FileName: "ordinary" + ext, Ext: ext} + if !configured.IsSupportedImage(u) || !(Reader{}).IsSupportedImage(u) { + t.Fatalf("ordinary format lost: %s", ext) + } + } + formats := configured.SupportedExtensions() + if !slices.Contains(formats, ".heic") || !slices.Contains(formats, ".heif") || slices.Contains(SupportedExtensions(), ".heic") { + t.Fatal("experimental format declarations escaped the reader") + } + formats[len(formats)-1] = ".changed" + if slices.Contains(configured.SupportedExtensions(), ".changed") { + t.Fatal("format result aliases reader state") + } +} + func TestSourceHEICAdmissionAndPixels(t *testing.T) { data, err := os.ReadFile(filepath.Join("testdata", "test_exif.heic")) if err != nil { diff --git a/internal/preferences/preferences.go b/internal/preferences/preferences.go index 89f7927b..3cae7466 100644 --- a/internal/preferences/preferences.go +++ b/internal/preferences/preferences.go @@ -38,6 +38,7 @@ const ( keyWindowPosSet = "windowPosSet" keyFavoritePreviewCache = "favoritePreviewCache" + keyExperimentalHEIC = "experimentalHEIC" keySimilarityFavoriteCache = "similarityFavoriteCache" keySimilarityLooseCache = "similarityLooseCache" keyAnalysisCacheLimitMiB = "analysisCacheLimitMiB" @@ -162,6 +163,9 @@ type State struct { // check) so that a user who explicitly turns it off can have that // choice persist. FavoritePreviewCache bool + // ExperimentalHEIC is saved intent for the next application launch. + // Runtime capability belongs to the application's immutable image services. + ExperimentalHEIC bool // SimilarityFavoriteCache and SimilarityAutoFit default on; automatic map updates default off. SimilarityFavoriteCache, SimilarityAutoUpdate, SimilarityAutoFit bool SimilarityLooseCache bool @@ -234,6 +238,7 @@ func Save(app fyne.App, s State) { p.SetString(keyThemeMode, s.ThemeMode.PrefValue()) p.SetBool(keySlideShuffle, s.SlideShuffle) p.SetBool(keyFavoritePreviewCache, s.FavoritePreviewCache) + p.SetBool(keyExperimentalHEIC, s.ExperimentalHEIC) p.SetBool(keySimilarityFavoriteCache, s.SimilarityFavoriteCache) p.SetBool(keySimilarityLooseCache, s.SimilarityLooseCache) if s.AnalysisCacheLimitMiB > 0 && uint64(s.AnalysisCacheLimitMiB) <= ^uint64(0)/(1024*1024) { @@ -387,6 +392,7 @@ func Load(app fyne.App) State { MosaicWindow: loadGeometry(p, mosaicWinKeys), MosaicSettings: mosaicSettings, FavoritePreviewCache: p.BoolWithFallback(keyFavoritePreviewCache, true), + ExperimentalHEIC: p.Bool(keyExperimentalHEIC), SimilarityFavoriteCache: p.BoolWithFallback(keySimilarityFavoriteCache, true), SimilarityLooseCache: p.BoolWithFallback(keySimilarityLooseCache, true), AnalysisCacheLimitMiB: analysisCacheLimit(p.IntWithFallback(keyAnalysisCacheLimitMiB, 2048)), diff --git a/internal/preferences/preferences_test.go b/internal/preferences/preferences_test.go index ea05c6b8..e53bb9df 100644 --- a/internal/preferences/preferences_test.go +++ b/internal/preferences/preferences_test.go @@ -50,6 +50,22 @@ func TestAnalysisCachePreferences(t *testing.T) { } } +func TestExperimentalHEICPreferences(t *testing.T) { + app := test.NewApp() + if Load(app).ExperimentalHEIC { + t.Fatal("missing preference enabled HEIC") + } + for _, enabled := range []bool{true, false} { + Save(app, State{ExperimentalHEIC: enabled}) + if got := Load(app).ExperimentalHEIC; got != enabled { + t.Fatalf("saved HEIC = %v, want %v", got, enabled) + } + if app.Preferences().Bool("experimentalHEIC") != enabled { + t.Fatal("HEIC preference stored under the wrong key") + } + } +} + func TestMosaicPreferences_DefaultsAndRoundTrip(t *testing.T) { app := test.NewApp() if got := Load(app).MosaicSettings; got != mosaic.DefaultSettings() { diff --git a/internal/similarity/heic_native_test.go b/internal/similarity/heic_native_test.go new file mode 100644 index 00000000..83e1ec48 --- /dev/null +++ b/internal/similarity/heic_native_test.go @@ -0,0 +1,115 @@ +//go:build heicnative && (darwin || linux || windows) && (amd64 || arm64) + +package similarity + +import ( + "context" + "errors" + "fmt" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + + "github.com/frathe/picfetch/internal/filescan" + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" +) + +func TestNativeHEICAnalysisPixels(t *testing.T) { + repository, err := filepath.Abs(filepath.Join("..", "..")) + if err != nil { + t.Fatal(err) + } + root := t.TempDir() + if runtime.GOOS == "darwin" { + root = filepath.Join(root, "PicFetch.app") + } + build := exec.Command("go", "run", "./scripts/heicpackage", "-os", runtime.GOOS, "-arch", runtime.GOARCH, "-out", root) + build.Dir = repository + if output, buildErr := build.CombinedOutput(); buildErr != nil { + t.Fatalf("stage native analysis helper: %v: %s", buildErr, output) + } + marker := filepath.Join(root, "picfetch") + if runtime.GOOS == "darwin" { + marker = filepath.Join(root, "Contents", "MacOS", "picfetch") + + } + if err = os.MkdirAll(filepath.Dir(marker), 0700); err != nil { + t.Fatal(err) + } + if err = os.WriteFile(marker, []byte("owned package marker"), 0700); err != nil { + t.Fatal(err) + } + owner, err := heicclient.OpenInstalled(context.Background(), marker, filepath.Join(t.TempDir(), "cache"), heicdecode.DefaultLimits(0)) + if err != nil { + t.Fatal(err) + } + defer func() { owner.Stop(); owner.Wait() }() + _ = RegisterLocalFiles() + reader := imaging.NewReader(owner.Do) + uri := storage.NewFileURI(filepath.Join(repository, "scripts", "heicbuild", "testdata", "tenbit.heic")) + admitted, truncated := filescan.Images(context.Background(), []fyne.URI{uri}, 2, nil, filescan.WithAdmission(reader.IsSupportedImage)) + if truncated || len(admitted) != 1 { + t.Fatal("native analysis source was not admitted") + } + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + for _, search := range []bool{false, true} { + for _, cancelAfterDelivery := range []bool{false, true} { + t.Run(fmt.Sprintf("search=%v/cancel=%v", search, cancelAfterDelivery), func(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + cmd := exec.CommandContext(ctx, executable, "-test.run=^TestHEICAnalysisHelper$", "-test.timeout=25s") + cmd.Env = append(os.Environ(), "PICFETCH_OWNED_HEIC_ANALYSIS=pixels") + req := request{Paths: []string{admitted[0].Path()}} + client := Client{HEIC: owner} + seen := 0 + var runErr error + if search { + req.Search = &SearchRequest{SessionID: 17, Paths: req.Paths} + queries := make(chan SearchQuery, 2) + runErr = client.searchCommand(ctx, cmd, req, queries, func(event SearchEvent) { + if event.Kind == SearchReady { + queries <- SearchQuery{ID: 1, ReferencePath: req.Paths[0]} + } else if event.Kind == SearchFinal { + seen++ + if seen == 1 { + queries <- SearchQuery{ID: 2, ReferencePath: req.Paths[0]} + } else if cancelAfterDelivery { + cancel() + } + } + }) + } else { + runErr = client.analyzeCommand(ctx, cmd, req, nil, func(event Event) { + if event.Complete { + seen++ + if cancelAfterDelivery { + cancel() + } + } + }) + } + want := 1 + if search { + want = 2 + } + if seen != want || (!cancelAfterDelivery && runErr != nil) || (cancelAfterDelivery && !errors.Is(runErr, context.Canceled)) { + t.Fatalf("native pixel deliveries=%d, want %d: %v", seen, want, runErr) + } + if cmd.ProcessState == nil { + t.Fatal("native pixel consumer returned before process join") + } + }) + } + } +} diff --git a/internal/similarity/heic_test.go b/internal/similarity/heic_test.go index eb5aecbb..8242e843 100644 --- a/internal/similarity/heic_test.go +++ b/internal/similarity/heic_test.go @@ -89,7 +89,8 @@ func TestHEICAnalysisHelper(_ *testing.T) { func ownedHEICAnalysis() error { var req request - if err := json.NewDecoder(os.Stdin).Decode(&req); err != nil { + decoder := json.NewDecoder(os.Stdin) + if err := decoder.Decode(&req); err != nil { return err } if req.HEIC == nil { @@ -101,6 +102,9 @@ func ownedHEICAnalysis() error { } defer cleanup() _ = RegisterLocalFiles() + if len(req.Paths) == 1 { + return ownedHEICPixels(req, decoder) + } // The HEIC suffix forces dispatch; the owner refuses before invoking // the bulk input callback, so no encoded file content is needed. file, err := os.CreateTemp("", "picfetch-owned-analysis-*.heic") @@ -127,6 +131,57 @@ func ownedHEICAnalysis() error { return err } +// The native fixture uses real decoder pixels through the inherited owner. +// Model inference is outside this pipe/preview boundary test. +func ownedHEICPixels(req request, decoder *json.Decoder) error { + path := req.Paths[0] + source, err := req.reader.Read(context.Background(), storage.NewFileURI(path)) + if err != nil { + return err + } + pixels, err := source.Decode(context.Background(), 1) + if err != nil || pixels == nil || len(pixels.Frames) != 1 || pixels.Frames[0].Bounds().Size() != image.Pt(16, 16) { + return fmt.Errorf("native analysis pixels: %v", err) + } + output := json.NewEncoder(os.Stdout) + if req.Search == nil { + return output.Encode(Event{Complete: true}) + } + if err = output.Encode(SearchEvent{SessionID: req.Search.SessionID, Revision: 1, Kind: SearchReady}); err != nil { + return err + } + info, err := os.Stat(path) + if err != nil { + return err + } + data, err := os.ReadFile(path) + if err != nil { + return err + } + p := searchPreparer{reader: req.reader, versions: map[string]os.FileInfo{path: info}} + for revision := uint64(2); revision <= 3; revision++ { + var query SearchQuery + if err = decoder.Decode(&query); err != nil { + return err + } + if query.ReferencePath != path || query.ID != revision-1 { + return fmt.Errorf("unexpected retained query") + } + item, previewErr := p.completePreview(context.Background(), Item{Path: path, SHA256: fmt.Sprintf("%x", sha256.Sum256(data))}) + if previewErr != nil { + return previewErr + } + preview, previewErr := jpeg.Decode(bytes.NewReader(item.Preview)) + if previewErr != nil || preview.Bounds().Size() != image.Pt(16, 16) { + return fmt.Errorf("native retained preview: %v", previewErr) + } + if err = output.Encode(SearchEvent{SessionID: req.Search.SessionID, QueryID: query.ID, Revision: revision, Kind: SearchFinal, Processed: 1, Total: 1}); err != nil { + return err + } + } + return nil +} + func TestAnalysisHEICAttachmentStartFailureJoins(t *testing.T) { executable, err := os.Executable() if err != nil { diff --git a/internal/ui/drop.go b/internal/ui/drop.go index a55f0c1e..6b38817b 100644 --- a/internal/ui/drop.go +++ b/internal/ui/drop.go @@ -10,7 +10,6 @@ import ( "fyne.io/fyne/v2/storage" "github.com/frathe/picfetch/internal/filescan" - "github.com/frathe/picfetch/internal/imaging" ) // cancelScan aborts a scan in progress (Escape while v.scanOp.active is true). @@ -138,13 +137,14 @@ func (v *viewer) handleCollectionDrop(uris []fyne.URI, favoriteDir string) { } } - expandSiblings := favoriteDir == "" && !merging && !hasDirs && len(uris) == 1 && imaging.IsSupportedImage(uris[0]) + admit := v.images.foreground.IsSupportedImage + expandSiblings := favoriteDir == "" && !merging && !hasDirs && len(uris) == 1 && admit(uris[0]) scan := func(progress func(int)) (images []fyne.URI, truncated bool) { if expandSiblings { - return filescan.Siblings(token.context(), uris[0], maxScan, progress) + return filescan.Siblings(token.context(), uris[0], maxScan, progress, filescan.WithAdmission(admit)) } - return filescan.Images(token.context(), uris, maxScan, progress) + return filescan.Images(token.context(), uris, maxScan, progress, filescan.WithAdmission(admit)) } if !hasDirs && !expandSiblings { diff --git a/internal/ui/explorer/feature.go b/internal/ui/explorer/feature.go index 6b82697a..f001a60e 100644 --- a/internal/ui/explorer/feature.go +++ b/internal/ui/explorer/feature.go @@ -11,6 +11,7 @@ import ( "github.com/frathe/picfetch/internal/explorerpresets" "github.com/frathe/picfetch/internal/explorertrial" "github.com/frathe/picfetch/internal/favstore" + "github.com/frathe/picfetch/internal/imaging" "github.com/frathe/picfetch/internal/similarity" ) @@ -54,6 +55,7 @@ type Options struct { App fyne.App Discussions func() Client similarity.Client + Images imaging.Reader Analyze similarity.Provider Queue UIQueue Presets *explorerpresets.Store @@ -92,6 +94,7 @@ type Feature struct { stopping bool introSeen, assetsReady bool client similarity.Client + images imaging.Reader supported bool trial *explorertrial.Session trialRun, trialEvent int @@ -128,6 +131,7 @@ func NewFeature(host WorkflowHost, options Options) *Feature { func (f *Feature) Configure(options Options) { f.app, f.discussions = options.App, options.Discussions f.client, f.analyze = options.Client, options.Analyze + f.images = options.Images f.ui = options.Queue if f.ui == nil { f.ui = featureQueue{} @@ -142,7 +146,7 @@ func (f *Feature) Configure(options Options) { func (f *Feature) Options() Options { return Options{ App: f.app, Discussions: f.discussions, - Client: f.client, Analyze: f.analyze, Queue: f.ui, Presets: f.presets, + Client: f.client, Images: f.images, Analyze: f.analyze, Queue: f.ui, Presets: f.presets, Supported: f.supported, AssetsReady: f.assetsReady, Settings: f.Settings(), Trial: f.trial, } diff --git a/internal/ui/explorer/feature_test.go b/internal/ui/explorer/feature_test.go index c694e637..f6f2888e 100644 --- a/internal/ui/explorer/feature_test.go +++ b/internal/ui/explorer/feature_test.go @@ -17,6 +17,9 @@ import ( "github.com/frathe/picfetch/internal/explorerpresets" "github.com/frathe/picfetch/internal/explorertrial" + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" "github.com/frathe/picfetch/internal/similarity" "github.com/frathe/picfetch/internal/ui/explorer" "github.com/frathe/picfetch/internal/uitest" @@ -310,3 +313,78 @@ func TestFeatureCanceledBarrierRecordsTrialExit(t *testing.T) { t.Fatalf("canceled predecessor wait lost exit observation: analyzed=%v summary=%+v", analyzed, summary) } } + +func TestExperimentalHEICPresetFormats(t *testing.T) { + for _, active := range []bool{false, true} { + t.Run(fmt.Sprint(active), func(t *testing.T) { + app := test.NewApp() + t.Cleanup(app.Quit) + host := &featureHost{win: app.NewWindow("Explorer")} + reader := imaging.Reader{} + if active { + reader = imaging.NewReader(func(_ context.Context, _ heicdecode.Operation, _ heicclient.Input) (heicdecode.Response, error) { + t.Fatal("format choices attempted decoding") + return heicdecode.Response{}, nil + }) + } + store := &explorerpresets.Store{Dir: t.TempDir()} + provider := func(_ context.Context, paths []string, _ <-chan similarity.Control, emit func(similarity.Event)) error { + var items []similarity.Item + for _, path := range paths { + items = append(items, similarity.Item{Path: path, Cohort: "unassigned", Preview: uitest.EncodeJPEG(t, 4, 3, color.White)}) + } + emit(similarity.Event{Complete: true, Total: len(paths), Successful: len(paths), Items: items}) + return nil + } + f := explorer.NewFeature(host, explorer.Options{App: app, Queue: &uitest.UIQueue{}, Images: reader, Presets: store, Analyze: provider}) + t.Cleanup(func() { f.Stop(); f.Settle() }) + host.win.SetContent(f.Surface().Overlay()) + f.Open(explorer.OpenRequest{Sources: []string{"/a.jpg", "/b.jpg"}}) + f.Settle() + f.ShowSimilarityPresets() + f.Settle() + test.Tap(featureButton(t, host, "New preset")) + var formats *widget.Select + walkFeature(host.win.Canvas().Overlays().Top(), func(o fyne.CanvasObject) { + if field, ok := o.(*widget.Select); ok && field.PlaceHolder == lang.L("File type") { + formats = field + } + }) + if formats == nil { + t.Fatal("file type control is not in the preset dialog") + } + for _, ext := range []string{"heic", "heif"} { + if slices.Contains(formats.Options, ext) != active { + t.Fatalf("%s offered = %v, active = %v", ext, formats.Options, active) + } + } + f.Close() + f.Open(explorer.OpenRequest{Sources: []string{"/a.jpg", "/b.jpg"}}) + f.Settle() + // A saved HEIC rule remains editable and persistable with HEIC disabled. + saved, err := store.Save(context.Background(), explorerpresets.Preset{Name: "Saved HEIC", Rule: explorerpresets.Rule{Format: "heic"}}) + if err != nil { + t.Fatalf("saved HEIC rule rejected: %v", err) + } + f.ShowSimilarityPresets() + f.Settle() + test.Tap(featureButton(t, host, "Saved HEIC")) + formats = nil + walkFeature(host.win.Canvas().Overlays().Top(), func(o fyne.CanvasObject) { + if field, ok := o.(*widget.Select); ok && field.PlaceHolder == lang.L("File type") { + formats = field + } + }) + if formats == nil || formats.Selected != "heic" { + t.Fatal("existing HEIC rule was lost") + } + featureEntry(t, host, "Preset name", "Renamed HEIC") + test.Tap(featureButton(t, host, "Save preset")) + f.Settle() + records, err := store.Load(context.Background()) + if err != nil || len(records) != 1 || records[0].ID != saved.ID || records[0].Rule.Format != "heic" || records[0].Name != "Renamed HEIC" { + t.Fatalf("saved rule changed unexpectedly: %v, %v", records, err) + } + }) + } +} diff --git a/internal/ui/explorer/preset_fields.go b/internal/ui/explorer/preset_fields.go index 289a5c49..f9587cd9 100644 --- a/internal/ui/explorer/preset_fields.go +++ b/internal/ui/explorer/preset_fields.go @@ -15,12 +15,12 @@ import ( "github.com/frathe/picfetch/internal/imaging" ) -func presetRuleFields(rule explorerpresets.Rule, changed func()) (*widget.Form, func() explorerpresets.Rule) { +func presetRuleFields(reader imaging.Reader, rule explorerpresets.Rule, changed func()) (*widget.Form, func() explorerpresets.Rule) { makeName := widget.NewEntry() makeName.SetPlaceHolder(lang.L("Camera make")) makeName.SetText(rule.Make) formats := []string{lang.L("Any file type")} - for _, ext := range imaging.SupportedExtensions() { + for _, ext := range reader.SupportedExtensions() { ext = strings.TrimPrefix(ext, ".") if ext == "jpeg" { ext = "jpg" diff --git a/internal/ui/explorer/preset_workflow.go b/internal/ui/explorer/preset_workflow.go index 43abaa4b..bd2de362 100644 --- a/internal/ui/explorer/preset_workflow.go +++ b/internal/ui/explorer/preset_workflow.go @@ -95,7 +95,7 @@ func (f *Feature) editSimilarityPreset(p explorerpresets.Preset) { name.SetPlaceHolder(lang.L("Preset name")) name.SetText(p.Name) var refresh func(string) - rules, readRule := presetRuleFields(p.Rule, func() { + rules, readRule := presetRuleFields(f.images, p.Rule, func() { if refresh != nil { refresh("") } diff --git a/internal/ui/features.go b/internal/ui/features.go index 1db16b69..09587d59 100644 --- a/internal/ui/features.go +++ b/internal/ui/features.go @@ -113,7 +113,7 @@ func registerFeatures(view *viewer, application fyne.App, window fyne.Window, pr // registered before saved cache limits are applied. view.grid = grid.NewWithReader(view, window, view.dupes, view.images.background) view.explorer = explorerui.NewFeature(explorerHost{view}, explorerui.Options{ - Client: similarity.Client{HEIC: view.images.owner}, App: application, Discussions: view.help.ShowDiscussions, Supported: similarity.SupportedPlatform(), + Client: similarity.Client{HEIC: view.images.owner}, Images: view.images.foreground, App: application, Discussions: view.help.ShowDiscussions, Supported: similarity.SupportedPlatform(), Settings: explorerui.Settings{CacheFavorites: prefs.SimilarityFavoriteCache, AutoFit: prefs.SimilarityAutoFit, Automatic: prefs.SimilarityAutoUpdate, IntroSeen: prefs.SimilarityIntroSeen}, }) view.visualsearch = searchui.New(searchHost{view}, searchui.Options{Provider: (similarity.Client{HEIC: view.images.owner}).Search}) @@ -144,6 +144,7 @@ func registerFeatures(view *viewer, application fyne.App, window fyne.Window, pr view.pushDuplicateDistance(view.DuplicateDistance()) view.SetFavoritePreviewCache(prefs.FavoritePreviewCache) + view.settings.experimentalHEIC = prefs.ExperimentalHEIC // Restore update prefs without SetCheckForUpdates: that setter starts a // network check. Day must be in place before startViewerRuntime's // maybeStartUpdateCheck so Due sees the saved calendar day. diff --git a/internal/ui/harness_test.go b/internal/ui/harness_test.go index 92264d1b..0e271e52 100644 --- a/internal/ui/harness_test.go +++ b/internal/ui/harness_test.go @@ -80,10 +80,15 @@ func TestMain(m *testing.M) { // a window, not just this one. func newTestUI(t *testing.T) (*viewer, fyne.Window, func() bool) { t.Helper() - return newTestUIWithImages(t, imageServices{}) + return newTestUIWithStartupImages(t, nil) } -func newTestUIWithImages(t *testing.T, images imageServices) (v *viewer, win fyne.Window, closed func() bool) { +func newTestUIWithImages(t *testing.T, images imageServices) (*viewer, fyne.Window, func() bool) { + t.Helper() + return newTestUIWithStartupImages(t, &images) +} + +func newTestUIWithStartupImages(t *testing.T, override *imageServices) (v *viewer, win fyne.Window, closed func() bool) { t.Helper() // Reassert the shared app as the current one before building: the @@ -107,7 +112,12 @@ func newTestUIWithImages(t *testing.T, images imageServices) (v *viewer, win fyn } startup := loadStartupState(testApp) - startup.images = images + if override != nil { + startup.images.Stop() + startup.images.Wait() + startup.images = *override + } + images := startup.images v, win = buildConfiguredViewer(testApp, startup) v.display.SetUIQueue(&uitest.UIQueue{}) v.grid.SetUIQueue(&uitest.UIQueue{}) diff --git a/internal/ui/images.go b/internal/ui/images.go index 1cf87bc7..f825339e 100644 --- a/internal/ui/images.go +++ b/internal/ui/images.go @@ -6,6 +6,7 @@ import ( "github.com/frathe/picfetch/internal/heicdecode" heicclient "github.com/frathe/picfetch/internal/heicdecode/client" "github.com/frathe/picfetch/internal/imaging" + "github.com/frathe/picfetch/internal/preferences" ) // imageServices owns one admission lane for this viewer and its analysis @@ -13,6 +14,22 @@ import ( type imageServices struct { owner *heicclient.Client foreground, background imaging.Reader + startupError error +} + +func installedImageServices(prefs preferences.State, executable, privateDir string) imageServices { + if !prefs.ExperimentalHEIC { + return imageServices{} + } + owner, err := heicclient.OpenInstalled(context.Background(), executable, privateDir, heicdecode.DefaultLimits(int64(prefs.MaxFileSizeMB)*1024*1024)) + if err != nil { + return imageServices{startupError: err} + } + return newImageServices(owner) +} + +func (s imageServices) unavailable() bool { + return s.startupError != nil || (s.owner != nil && s.owner.Unavailable()) } func newImageServices(owner *heicclient.Client) imageServices { diff --git a/internal/ui/images_native_other_test.go b/internal/ui/images_native_other_test.go new file mode 100644 index 00000000..4468bd24 --- /dev/null +++ b/internal/ui/images_native_other_test.go @@ -0,0 +1,14 @@ +//go:build heicnative && (darwin || linux) && (amd64 || arm64) + +package ui + +import ( + "os" + "testing" +) + +func verifyNativeHEICIdentity(t *testing.T) { + t.Helper() + t.Logf("native execution uid=%d", os.Getuid()) +} +func preserveNativeHEICInstallation(_ *testing.T, _ string) func() { return func() {} } diff --git a/internal/ui/images_native_test.go b/internal/ui/images_native_test.go new file mode 100644 index 00000000..0118701f --- /dev/null +++ b/internal/ui/images_native_test.go @@ -0,0 +1,232 @@ +//go:build heicnative && (darwin || linux || windows) && (amd64 || arm64) + +package ui + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "image/color" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "testing" + "time" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/test" + + "github.com/frathe/picfetch/internal/distribution" + "github.com/frathe/picfetch/internal/heicdecode" + heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/preferences" + "github.com/frathe/picfetch/internal/uitest" +) + +// Only the test executable understands these fixture environment variables. +// The production entry point has no HEIC override or qualification dispatcher. +func TestNativePackagedHEICActivation(t *testing.T) { + if os.Getenv("PICFETCH_HEIC_ACTIVATION_CHILD") != "1" { + runOwnedHEICApplication(t) + return + } + verifyNativeHEICIdentity(t) + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + root, err := heicclient.InstallationRoot(executable, runtime.GOOS) + if err != nil { + t.Fatal(err) + } + helper, digest, err := heicclient.LoadPackage(root, runtime.GOOS, runtime.GOARCH) + if err != nil { + t.Fatal(err) + } + unchanged := preserveNativeHEICInstallation(t, helper) + defer unchanged() + t.Logf("application=%s helper=%s sha256=%x os=%s arch=%s store=%v", executable, helper, digest, runtime.GOOS, runtime.GOARCH, distribution.StoreManaged) + before := testApp + testApp = nativeHEICApp{App: before, cache: nativeHEICCache{Cache: before.Cache(), root: storage.NewFileURI(t.TempDir())}} + t.Cleanup(func() { testApp = before; fyne.SetCurrentApp(before) }) + preferences.Save(testApp, preferences.State{}) + uri := storage.NewFileURI(filepath.Join(t.TempDir(), "owned.heic")) + fixture, err := os.ReadFile(os.Getenv("PICFETCH_HEIC_ACTIVATION_FIXTURE")) + if err != nil { + t.Fatal(err) + } + if err = os.WriteFile(uri.Path(), fixture, 0600); err != nil { + t.Fatal(err) + } + heif := storage.NewFileURI(filepath.Join(filepath.Dir(uri.Path()), "owned.heif")) + if err = os.WriteFile(heif.Path(), fixture, 0600); err != nil { + t.Fatal(err) + } + t.Run("enable stays inactive until restart", func(t *testing.T) { + v, _, _ := newTestUI(t) + if v.images.owner != nil || v.images.foreground.IsSupportedImage(uri) { + t.Fatal("default startup enabled HEIC") + } + v.showSettings() + check := experimentalHEICCheckbox(t) + if check.Checked { + t.Fatal("checkbox did not default off") + } + test.Tap(check) + preferences.Save(testApp, v.currentPreferences()) + if v.images.owner != nil || !preferences.Load(testApp).ExperimentalHEIC { + t.Fatal("checkbox changed this session or lost intent") + } + }) + t.Run("restarted viewer decodes through native helper", func(t *testing.T) { + v, _, _ := newTestUI(t) + if v.images.owner == nil { + t.Fatalf("packaged startup unavailable: %v", v.images.startupError) + } + if v.storeManaged != distribution.StoreManaged || v.explorer.Options().Client.HEIC != v.images.owner { + t.Fatal("distribution or shared ownership changed") + } + dropAndWait(t, v, uri, heif) + if v.img.Image == nil || v.img.Image.Bounds().Dx() != 16 || v.img.Image.Bounds().Dy() != 16 { + t.Fatal("native HEIC viewing did not produce the owned fixture") + } + if err := v.grid.Warm(); err != nil { + t.Fatal(err) + } + if !v.grid.Cached(uri) || !v.grid.Cached(heif) { + t.Fatal("native HEIC did not reach grid previews") + } + entered, done := make(chan struct{}), make(chan error, 1) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go func() { + _, decodeErr := v.images.owner.Do(ctx, heicdecode.Decode, func(ctx context.Context, _ int64) ([]byte, error) { + close(entered) + <-ctx.Done() + return nil, ctx.Err() + }) + done <- decodeErr + }() + select { + case <-entered: + case decodeErr := <-done: + t.Fatalf("native readiness failed before cancellation: %v", decodeErr) + case <-time.After(30 * time.Second): + t.Fatal("native cancellation input was not admitted") + } + cancel() + if err := <-done; !errors.Is(err, context.Canceled) { + t.Fatalf("native cancellation: %v", err) + } + owner := v.images.owner + v.showSettings() + test.Tap(experimentalHEICCheckbox(t)) + preferences.Save(testApp, v.currentPreferences()) + if v.images.owner != owner || !v.images.foreground.IsSupportedImage(uri) { + t.Fatal("disabling replaced the running decoder") + } + }) + t.Run("disabled restart and ordinary viewing", func(t *testing.T) { + v, _, _ := newTestUI(t) + if v.images.owner != nil || v.images.foreground.IsSupportedImage(uri) { + t.Fatal("restart did not disable HEIC") + } + ordinary := storage.NewFileURI(uitest.WriteTempFile(t, "ordinary.png", uitest.EncodePNG(t, 3, 2, color.White))) + dropAndWait(t, v, uri, ordinary) + if len(v.state.files) != 1 || v.img.Image == nil || v.img.Image.Bounds().Dx() != 3 { + t.Fatal("ordinary viewing changed with HEIC disabled") + } + }) + _, after, err := heicclient.LoadPackage(root, runtime.GOOS, runtime.GOARCH) + if err != nil || after != digest { + t.Fatal("activation modified the installed helper package") + } + t.Log("native application startup, admission, cancellation and shutdown completed") +} + +type nativeHEICApp struct { + fyne.App + cache fyne.Cache +} + +func (a nativeHEICApp) Cache() fyne.Cache { return a.cache } + +type nativeHEICCache struct { + fyne.Cache + root fyne.URI +} + +func (c nativeHEICCache) RootURI() fyne.URI { return c.root } + +func runOwnedHEICApplication(t *testing.T) { + t.Helper() + verifyNativeHEICIdentity(t) + repository, err := filepath.Abs(filepath.Join("..", "..")) + if err != nil { + t.Fatal(err) + } + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + root := t.TempDir() + destination := filepath.Join(root, "picfetch") + if runtime.GOOS == "windows" { + destination += ".exe" + } + if runtime.GOOS == "darwin" { + root = filepath.Join(root, "PicFetch.app") + destination = filepath.Join(root, "Contents", "MacOS", "picfetch") + } + if err = os.MkdirAll(filepath.Dir(destination), 0700); err != nil { + t.Fatal(err) + } + source, err := os.Open(executable) + if err != nil { + t.Fatal(err) + } + defer func() { _ = source.Close() }() + output, err := os.OpenFile(destination, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0700) + if err != nil { + t.Fatal(err) + } + _, copyErr := io.Copy(output, source) + closeErr := output.Close() + if err = errors.Join(copyErr, closeErr); err != nil { + t.Fatal(err) + } + run := func(command *exec.Cmd) { + t.Helper() + command.Dir = repository + output, err := command.CombinedOutput() + t.Logf("%s\n%s", command.String(), output) + if err != nil { + t.Fatalf("native application fixture: %v", err) + } + } + run(exec.Command("go", "run", "./scripts/heicpackage", "-os", runtime.GOOS, "-arch", runtime.GOARCH, "-out", root)) + if runtime.GOOS == "darwin" { + plist := `CFBundleIdentifiercom.frathe.PicFetch.HEICQualificationCFBundleExecutablepicfetchCFBundlePackageTypeAPPL` + if err = os.WriteFile(filepath.Join(root, "Contents", "Info.plist"), []byte(plist), 0600); err != nil { + t.Fatal(err) + } + run(exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", root)) + run(exec.Command("/usr/bin/codesign", "--verify", "--deep", "--strict", "--verbose=2", root)) + } + bytes, err := os.ReadFile(destination) + if err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(bytes) + t.Logf("owned application sha256=%s", hex.EncodeToString(digest[:])) + ctx, cancel := context.WithTimeout(context.Background(), 4*time.Minute) + defer cancel() + command := exec.CommandContext(ctx, destination, "-test.run=^TestNativePackagedHEICActivation$", "-test.v", "-test.timeout=3m") + command.Env = append(os.Environ(), "PICFETCH_HEIC_ACTIVATION_CHILD=1", fmt.Sprintf("PICFETCH_HEIC_ACTIVATION_FIXTURE=%s", filepath.Join(repository, "scripts", "heicbuild", "testdata", "tenbit.heic"))) + run(command) +} diff --git a/internal/ui/images_native_windows_test.go b/internal/ui/images_native_windows_test.go new file mode 100644 index 00000000..912b908c --- /dev/null +++ b/internal/ui/images_native_windows_test.go @@ -0,0 +1,134 @@ +//go:build heicnative && windows && (amd64 || arm64) + +package ui + +import ( + "encoding/json" + "log" + "os" + "path/filepath" + "runtime" + "testing" + "unsafe" + + "golang.org/x/sys/windows" + + "github.com/frathe/picfetch/internal/distribution" +) + +func verifyNativeHEICIdentity(t *testing.T) { + t.Helper() + token := windows.GetCurrentProcessToken() + user, err := token.GetTokenUser() + if err != nil { + t.Fatal(err) + } + groups, err := token.GetTokenGroups() + if err != nil { + t.Fatal(err) + } + administrators, err := windows.CreateWellKnownSid(windows.WinBuiltinAdministratorsSid) + if err != nil { + t.Fatal(err) + } + for _, group := range groups.AllGroups() { + if windows.EqualSid(group.Sid, administrators) { + t.Fatal("native HEIC qualification requires a standard user, including no filtered administrator membership") + } + } + t.Logf("standard-user sid=%s", user.User.Sid.String()) + if os.Getenv("PICFETCH_HEIC_ACTIVATION_MSIX") != "1" { + return + } + if !distribution.StoreManaged { + t.Fatal("installed test-MSIX is not Store-managed") + } + procedure := windows.NewLazySystemDLL("kernel32.dll").NewProc("GetCurrentPackageFullName") + if err = procedure.Find(); err != nil { + t.Fatal(err) + } + var count uint32 + result, _, _ := procedure.Call(uintptr(unsafe.Pointer(&count)), 0) + if result != uintptr(windows.ERROR_INSUFFICIENT_BUFFER) || count == 0 || count > 32768 { + t.Fatalf("installed test-MSIX has no package identity: %d", result) + } + name := make([]uint16, count) + result, _, _ = procedure.Call(uintptr(unsafe.Pointer(&count)), uintptr(unsafe.Pointer(&name[0]))) + if result != 0 { + t.Fatalf("read package identity: %d", result) + } + t.Logf("installed MSIX identity=%s", windows.UTF16ToString(name)) +} + +func preserveNativeHEICInstallation(t *testing.T, helper string) func() { + t.Helper() + read := func() string { + t.Helper() + descriptor, err := windows.GetNamedSecurityInfo(helper, windows.SE_FILE_OBJECT, windows.OWNER_SECURITY_INFORMATION|windows.DACL_SECURITY_INFORMATION) + if err != nil { + t.Fatal(err) + } + return descriptor.String() + } + before := read() + return func() { + if read() != before { + t.Error("activation modified immutable installed helper permissions") + } + } +} + +// The installed test package declares this probe as a separate application. +// Windows activates that application through its normal launch contract. +func TestNativeInstalledHEICActivation(t *testing.T) { + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + root := filepath.Dir(executable) + configBytes, err := os.ReadFile(filepath.Join(root, "heic-activation.json")) + if err != nil { + t.Fatal("installed test-MSIX configuration is required: ", err) + } + var config struct{ Evidence, Commit, UserSID string } + if err = json.Unmarshal(configBytes, &config); err != nil || !filepath.IsAbs(config.Evidence) || config.Commit == "" || config.UserSID == "" { + t.Fatal("invalid installed test-MSIX evidence configuration") + } + output, err := os.OpenFile(config.Evidence+".log", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) + if err != nil { + t.Fatal(err) + } + // This process runs only this native fixture. Keep its log open through the + // testing package's final PASS/FAIL output; process exit closes the handle. + os.Stdout, os.Stderr = output, output + log.SetOutput(output) + t.Cleanup(func() { + record := struct { + Test, OS, Arch, Commit string + Passed bool + }{ + "TestNativeInstalledHEICActivation", runtime.GOOS, runtime.GOARCH, config.Commit, !t.Failed(), + } + data, encodeErr := json.MarshalIndent(record, "", " ") + if encodeErr != nil { + t.Error(encodeErr) + return + } + temporary := config.Evidence + ".pending" + if writeErr := os.WriteFile(temporary, data, 0600); writeErr != nil { + t.Error(writeErr) + return + } + if renameErr := os.Rename(temporary, config.Evidence+".json"); renameErr != nil { + t.Error(renameErr) + } + }) + user, err := windows.GetCurrentProcessToken().GetTokenUser() + if err != nil || user.User.Sid.String() != config.UserSID { + t.Fatal("installed activation did not use the provisioned standard account") + } + t.Setenv("PICFETCH_HEIC_ACTIVATION_CHILD", "1") + t.Setenv("PICFETCH_HEIC_ACTIVATION_MSIX", "1") + t.Setenv("PICFETCH_HEIC_ACTIVATION_FIXTURE", filepath.Join(root, "heic-activation-fixture.heic")) + TestNativePackagedHEICActivation(t) +} diff --git a/internal/ui/images_test.go b/internal/ui/images_test.go index c94438ed..6dd54d50 100644 --- a/internal/ui/images_test.go +++ b/internal/ui/images_test.go @@ -2,25 +2,175 @@ package ui import ( "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" "errors" "image" + "image/color" "os" "os/exec" + "path/filepath" + "runtime" + "slices" "strings" "sync/atomic" "testing" "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/storage" + "fyne.io/fyne/v2/test" + "fyne.io/fyne/v2/widget" "github.com/frathe/picfetch/internal/filesort" "github.com/frathe/picfetch/internal/heicdecode" heicclient "github.com/frathe/picfetch/internal/heicdecode/client" "github.com/frathe/picfetch/internal/imaging" mosaiccore "github.com/frathe/picfetch/internal/mosaic" + "github.com/frathe/picfetch/internal/preferences" "github.com/frathe/picfetch/internal/uitest" ) +func ownedHEICInstallation(t *testing.T) (executable, helper, private string) { + t.Helper() + root := t.TempDir() + executable = filepath.Join(root, "picfetch") + if runtime.GOOS == "darwin" { + root = filepath.Join(root, "PicFetch.app") + executable = filepath.Join(root, "Contents", "MacOS", "picfetch") + } + if err := os.MkdirAll(filepath.Dir(executable), 0700); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(executable, []byte("owned main executable"), 0700); err != nil { + t.Fatal(err) + } + private = t.TempDir() + helper, manifest, err := heicclient.PackagePaths(root, runtime.GOOS) + if err != nil { + t.Fatal(err) + } + for _, dir := range []string{filepath.Dir(helper), filepath.Dir(manifest)} { + if err = os.MkdirAll(dir, 0700); err != nil { + t.Fatal(err) + } + } + data := []byte("owned helper, never executed by this test") + if err = os.WriteFile(helper, data, 0700); err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(data) + record, err := json.Marshal(heicclient.PackageManifest{Version: 1, GOOS: runtime.GOOS, GOARCH: runtime.GOARCH, + ExecutableSHA256: hex.EncodeToString(digest[:]), GuestSHA256: hex.EncodeToString(digest[:])}) + if err != nil { + t.Fatal(err) + } + if err = os.WriteFile(manifest, record, 0600); err != nil { + t.Fatal(err) + } + return executable, helper, private +} + +func TestExperimentalHEICStartup(t *testing.T) { + executable, helper, private := ownedHEICInstallation(t) + if got := installedImageServices(preferences.State{}, "missing", private); got.owner != nil || got.startupError != nil { + t.Fatal("disabled startup attempted HEIC activation") + } + prefs := preferences.State{ExperimentalHEIC: true} + missing := installedImageServices(prefs, filepath.Join(t.TempDir(), "missing"), private) + if missing.owner != nil || missing.startupError == nil { + t.Fatal("enabled missing package did not report unavailability") + } + services := installedImageServices(prefs, executable, private) + defer func() { services.Stop(); services.Wait() }() + if services.owner == nil || services.startupError != nil || !services.foreground.IsSupportedImage(storage.NewFileURI("photo.heic")) { + t.Fatalf("complete opt-in package not activated: %v", services.startupError) + } + if runtime.GOOS == "windows" { + // Native client tests cover the copied executable's protected identity. + return + } + if err := os.WriteFile(helper, []byte("changed"), 0700); err != nil { + t.Fatal(err) + } + _, err := services.owner.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + t.Fatal("changed helper read source input") + return nil, nil + }) + if !errors.Is(err, heicclient.ErrUnavailable) || !services.unavailable() { + t.Fatalf("changed helper not reported unavailable: %v", err) + } +} + +func TestExperimentalHEICAdmission(t *testing.T) { + reader := imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + if _, err := input(ctx, 128); err != nil { + return heicdecode.Response{}, err + } + result := heicdecode.Response{} + if op == heicdecode.Decode { + result.Image = image.NewNRGBA(image.Rect(0, 0, 3, 2)) + result.Config = image.Config{Width: 3, Height: 2} + } + return result, nil + }) + for _, active := range []bool{false, true} { + for _, route := range []string{"direct", "folder", "siblings", "restored", "favorite"} { + name := route + "/disabled" + services := imageServices{} + if active { + name = route + "/active" + services = imageServices{foreground: reader, background: reader} + } + t.Run(name, func(t *testing.T) { + v, _, _ := newTestUIWithImages(t, services) + dir := t.TempDir() + var files []fyne.URI + for _, filename := range []string{"still.heic", "still.heif", "ordinary.png"} { + data := []byte("owned source") + if filename == "ordinary.png" { + data = uitest.EncodePNG(t, 3, 2, color.White) + } + path := filepath.Join(dir, filename) + if err := os.WriteFile(path, data, 0600); err != nil { + t.Fatal(err) + } + files = append(files, storage.NewFileURI(path)) + } + switch route { + case "direct": + v.handleDrop(files) + case "folder": + v.handleDrop([]fyne.URI{storage.NewFileURI(dir)}) + case "siblings": + v.handleDrop(files[:1]) + case "restored": + v.savedSession = files + v.restoreSession() + case "favorite": + v.OpenFavorite(t.TempDir(), files) + } + waitForScan(t, v) + want := 1 + if active { + want = 3 + } else if route == "siblings" { + want = 0 + } + if want > 0 { + waitForSort(t, v) + waitUntilLoaded(t, v) + } + if len(v.state.files) != want { + t.Fatalf("admitted %d sources, want %d", len(v.state.files), want) + } + }) + } + } +} + func TestHEICSourceConsumers(t *testing.T) { var foreground, background atomic.Int64 reader := func(calls *atomic.Int64) imaging.Reader { @@ -46,11 +196,7 @@ func TestHEICSourceConsumers(t *testing.T) { late := storage.NewFileURI(uitest.WriteTempFile(t, "late.heic", []byte("late"))) early := storage.NewFileURI(uitest.WriteTempFile(t, "early.heic", []byte("early"))) files := []fyne.URI{late, early} - // Format advertisement stays disabled during qualification; install this - // owned source set directly and exercise the ordinary viewer load path. - v.state.replaceFiles(files, files) - v.ShowImage(0) - waitUntilLoaded(t, v) + dropAndWait(t, v, files...) v.display.Settle() if foreground.Load() == 0 || !v.display.Snapshot().HasEXIF { t.Fatal("viewer did not inject its foreground reader") @@ -132,3 +278,114 @@ func TestHEICOwnerStopsWithViewer(t *testing.T) { t.Fatalf("viewer left owner admission open: %v", err) } } + +func experimentalHEICCheckbox(t *testing.T) *widget.Check { + t.Helper() + for _, win := range testApp.Driver().AllWindows() { + if win.Title() != lang.L("Settings") { + continue + } + surface := win.Content() + if wrapper, ok := surface.(*fyne.Container); ok && len(wrapper.Objects) == 1 { + surface = wrapper.Objects[0] + } + tabs, ok := surface.(*container.AppTabs) + if !ok { + t.Fatal("Settings surface has no tabs") + } + tab := tabs.Items[len(tabs.Items)-1] + if tab.Text != lang.L("Experimental") { + t.Fatal("Experimental is not the last Settings tab") + } + t.Cleanup(func() { + if slices.Contains(testApp.Driver().AllWindows(), win) { + win.Close() + } + }) + tabs.Select(tab) + var found *widget.Check + var walk func(fyne.CanvasObject) + walk = func(obj fyne.CanvasObject) { + switch value := obj.(type) { + case *fyne.Container: + for _, child := range value.Objects { + walk(child) + } + case *container.Scroll: + walk(value.Content) + case *widget.Check: + if value.Text == lang.L("Experimental HEIC support") { + found = value + } + } + } + walk(tab.Content) + if found == nil { + t.Fatal("Experimental checkbox is not in the Settings surface") + } + return found + } + t.Fatal("Settings window was not opened") + return nil +} + +func TestExperimentalHEICRestartOnly(t *testing.T) { + before := preferences.Load(testApp) + t.Cleanup(func() { preferences.Save(testApp, before) }) + preferences.Save(testApp, preferences.State{}) + executable, _, private := ownedHEICInstallation(t) + heic := storage.NewFileURI("owned.heic") + t.Run("enable requires restart", func(t *testing.T) { + v, _, _ := newTestUI(t) + v.showSettings() + check := experimentalHEICCheckbox(t) + if check.Checked || v.images.foreground.IsSupportedImage(heic) { + t.Fatal("HEIC enabled by default") + } + test.Tap(check) + preferences.Save(testApp, v.currentPreferences()) + if !preferences.Load(testApp).ExperimentalHEIC || v.images.foreground.IsSupportedImage(heic) || v.images.owner != nil { + t.Fatal("enabling changed the running capability or lost the preference") + } + }) + t.Run("disable requires restart", func(t *testing.T) { + services := installedImageServices(preferences.Load(testApp), executable, private) + if services.owner == nil { + t.Fatalf("restart did not activate saved preference: %v", services.startupError) + } + v, _, _ := newTestUIWithImages(t, services) + v.showSettings() + check := experimentalHEICCheckbox(t) + if !check.Checked { + t.Fatal("saved preference was not restored to the checkbox") + } + test.Tap(check) + preferences.Save(testApp, v.currentPreferences()) + if preferences.Load(testApp).ExperimentalHEIC || v.images.owner != services.owner || !v.images.foreground.IsSupportedImage(heic) { + t.Fatal("disabling replaced the running owner or lost the preference") + } + }) + t.Run("restart disables", func(t *testing.T) { + services := installedImageServices(preferences.Load(testApp), executable, private) + v, _, _ := newTestUIWithImages(t, services) + if v.images.owner != nil || v.images.foreground.IsSupportedImage(heic) { + t.Fatal("disabled preference did not take effect after restart") + } + }) + t.Run("unavailable retains intent and ordinary viewing", func(t *testing.T) { + prefs := preferences.Load(testApp) + prefs.ExperimentalHEIC = true + preferences.Save(testApp, prefs) + services := installedImageServices(prefs, filepath.Join(t.TempDir(), "missing"), private) + v, _, _ := newTestUIWithImages(t, services) + v.showSettings() + if !experimentalHEICCheckbox(t).Checked || !v.images.unavailable() { + t.Fatal("unavailable package lost saved intent or explanation state") + } + ordinary := storage.NewFileURI(uitest.WriteTempFile(t, "ordinary.png", uitest.EncodePNG(t, 3, 2, color.White))) + dropAndWait(t, v, ordinary) + if !v.currentPreferences().ExperimentalHEIC || v.images.owner != nil || v.img.Image == nil { + t.Fatal("ordinary viewing did not survive unavailable HEIC") + } + }) +} diff --git a/internal/ui/load.go b/internal/ui/load.go index 68410068..333457c9 100644 --- a/internal/ui/load.go +++ b/internal/ui/load.go @@ -63,6 +63,7 @@ func (v *viewer) imageProbed(bounds image.Rectangle) { // imagePresented runs synchronously after coherent display publication and // before the owner admits animation or neighbor work and completes the load. func (v *viewer) imagePresented(snapshot display.Snapshot) []fyne.URI { + v.settingsWin.SetHEICUnavailable(v.images.unavailable()) v.syncPresentationLogicalSize() v.dropzone.Hide() v.welcomeArt.Hide() @@ -107,6 +108,7 @@ func (v *viewer) applyLoadedTitle(snapshot display.Snapshot) { } func (v *viewer) imageLoadFailed(source fyne.URI, err error) fyne.URI { + v.settingsWin.SetHEICUnavailable(v.images.unavailable()) msg := fmt.Sprintf(lang.L("could not read %q: %v"), source.Name(), err) var dimensions *imaging.InvalidDimensionsError var tooLarge *imaging.InputTooLargeError diff --git a/internal/ui/memlimits.go b/internal/ui/memlimits.go index de82cc73..b6a98c41 100644 --- a/internal/ui/memlimits.go +++ b/internal/ui/memlimits.go @@ -63,6 +63,7 @@ type settings struct { // from preferences.State.FavoritePreviewCache in features.go and read // back into it by currentPreferences (run.go). favPreviewCache bool + experimentalHEIC bool looseAnalysisCache bool analysisCacheMiB int @@ -232,6 +233,7 @@ func (v *viewer) settingsState() preferences.State { MaxThumbCacheMB: v.MaxThumbCacheMB(), MaxFileSizeMB: v.MaxFileSizeMB(), FavoritePreviewCache: v.FavoritePreviewCache(), + ExperimentalHEIC: v.settings.experimentalHEIC, SimilarityFavoriteCache: v.explorer.Settings().CacheFavorites, SimilarityLooseCache: v.settings.looseAnalysisCache, AnalysisCacheLimitMiB: v.settings.analysisCacheMiB, @@ -244,6 +246,11 @@ func (v *viewer) settingsState() preferences.State { } } +func (v *viewer) showSettings() { + v.settingsWin.SetHEICUnavailable(v.images.unavailable()) + v.settingsWin.Show(v.settingsState(), v.storeManaged) +} + func applySettingChange[T comparable](prev, next T, apply func(T)) { if next != prev { apply(next) @@ -267,6 +274,9 @@ func (v *viewer) applyLimitSettings(prev, next preferences.State) { } func (v *viewer) applyIntegrationSettings(prev, next preferences.State) { + applySettingChange(prev.ExperimentalHEIC, next.ExperimentalHEIC, func(on bool) { + v.settings.experimentalHEIC = on + }) applySettingChange(prev.SimilarityFavoriteCache, next.SimilarityFavoriteCache, func(on bool) { settings := v.explorer.Settings() settings.CacheFavorites = on diff --git a/internal/ui/menu.go b/internal/ui/menu.go index 8888e107..3109a213 100644 --- a/internal/ui/menu.go +++ b/internal/ui/menu.go @@ -23,7 +23,7 @@ func buildMainMenu(view *viewer) *fyne.MainMenu { SaveRotation: func() { view.saveRotation() }, PromptExport: func() { view.promptExport() }, CloseFiles: func() { view.closeFiles() }, - ShowSettings: func() { view.settingsWin.Show(view.settingsState(), view.storeManaged) }, + ShowSettings: view.showSettings, ShowViewer: view.showViewer, ShowExplorer: view.showExplorer, diff --git a/internal/ui/run.go b/internal/ui/run.go index dabdaa1c..a5dc319a 100644 --- a/internal/ui/run.go +++ b/internal/ui/run.go @@ -244,6 +244,7 @@ func (v *viewer) currentPreferences() preferences.State { MaxThumbCacheMB: v.settings.thumbCacheMB, MaxFileSizeMB: v.settings.maxFileMB, FavoritePreviewCache: v.settings.favPreviewCache, + ExperimentalHEIC: v.settings.experimentalHEIC, SimilarityFavoriteCache: v.explorer.Settings().CacheFavorites, SimilarityLooseCache: v.settings.looseAnalysisCache, AnalysisCacheLimitMiB: v.settings.analysisCacheMiB, diff --git a/internal/ui/settingswin/settingswin.go b/internal/ui/settingswin/settingswin.go index 92587afe..c7c247a6 100644 --- a/internal/ui/settingswin/settingswin.go +++ b/internal/ui/settingswin/settingswin.go @@ -31,7 +31,7 @@ import ( ) const ( - windowW = 520.0 + windowW = 640.0 windowH = 520.0 // time.Duration is an int64 nanosecond count. Reject a larger number of @@ -68,6 +68,8 @@ type Window struct { updatesManagedByStore bool cacheContent func() fyne.CanvasObject cacheClosed func() + heicUnavailable bool + heicExplanation *widget.Label // prefs is the form snapshot Show seeded, mutated by each control, and // pushed back through Host.ApplySettings. Ignored while the window is @@ -85,6 +87,7 @@ type Window struct { mergeCheck, shuffleCheck *widget.Check favPreviewCheck, updateCheck *widget.Check staticSizeCheck *widget.Check + experimentalHEIC *widget.Check updateNow *widget.Button updateVersion *widget.Label updateManaged *widget.Label @@ -125,6 +128,19 @@ func (w *Window) SetCacheTab(content func() fyne.CanvasObject, closed func()) { w.cacheContent, w.cacheClosed = content, closed } +// SetHEICUnavailable supplies the current session's status before Show. +// Saved intent remains in the preference snapshot. +func (w *Window) SetHEICUnavailable(unavailable bool) { + w.heicUnavailable = unavailable + if w.heicExplanation != nil { + if unavailable { + w.heicExplanation.Show() + } else { + w.heicExplanation.Hide() + } + } +} + // ConfirmClearAnalysis owns confirmation on the live Settings window. func (w *Window) ConfirmClearAnalysis(answer func(bool)) { if w.win.Window() == nil { @@ -152,6 +168,8 @@ func (w *Window) Show(prefs preferences.State, updatesManagedByStore bool) { w.mergeCheck, w.shuffleCheck = nil, nil w.favPreviewCheck, w.updateCheck = nil, nil w.staticSizeCheck = nil + w.experimentalHEIC = nil + w.heicExplanation = nil w.updateNow = nil w.updateVersion = nil w.updateManaged = nil @@ -400,6 +418,17 @@ func (w *Window) build() fyne.CanvasObject { if w.cacheContent != nil { tabs.Append(container.NewTabItem(lang.L("Cache"), container.NewPadded(container.NewVScroll(w.cacheContent())))) } + w.experimentalHEIC = widget.NewCheck(lang.L("Experimental HEIC support"), func(on bool) { + w.apply(func(s *preferences.State) { s.ExperimentalHEIC = on }) + }) + w.experimentalHEIC.Checked = w.prefs.ExperimentalHEIC + warning := widget.NewLabel(lang.L("Restart PicFetch to apply. Colors may be inaccurate; HDR is not supported.")) + warning.Wrapping = fyne.TextWrapWord + w.heicExplanation = widget.NewLabel(lang.L("Experimental HEIC support is unavailable. Check the installed helper package and sandbox permissions.")) + w.heicExplanation.Wrapping = fyne.TextWrapWord + w.SetHEICUnavailable(w.heicUnavailable) + experimental := container.NewVBox(w.experimentalHEIC, warning, w.heicExplanation) + tabs.Append(container.NewTabItem(lang.L("Experimental"), container.NewPadded(container.NewVScroll(experimental)))) return tabs } diff --git a/internal/ui/settingswin/settingswin_test.go b/internal/ui/settingswin/settingswin_test.go index 0ad451ba..7aa81e29 100644 --- a/internal/ui/settingswin/settingswin_test.go +++ b/internal/ui/settingswin/settingswin_test.go @@ -1,14 +1,20 @@ package settingswin import ( + "encoding/json" "errors" + "fmt" + "image/png" "os" + "path/filepath" "testing" "time" "fyne.io/fyne/v2" + fynecanvas "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/test" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/frathe/picfetch/internal/appearance" @@ -698,7 +704,7 @@ func TestSettingsCacheTabCompositionAndClose(t *testing.T) { } }) tabs := settingsTabs(t, w) - if len(tabs.Items) != 5 || !containsCanvasObject(tabs.Items[4].Content, content) { + if len(tabs.Items) != 6 || !containsCanvasObject(tabs.Items[4].Content, content) || tabs.Items[5].Text != "Experimental" { t.Fatal("cache content was not attached to Settings") } w.win.Window().Close() @@ -753,7 +759,7 @@ func TestSettingsTabs_GroupControlsAndOpenOnGeneral(t *testing.T) { w := newUpdateTestWindow(t, &fakeHost{}) tabs := settingsTabs(t, w) - wantLabels := []string{"General", "Appearance", "Updates", "Limits"} + wantLabels := []string{"General", "Appearance", "Updates", "Limits", "Experimental"} if len(tabs.Items) != len(wantLabels) { t.Fatalf("tab count = %d, want %d", len(tabs.Items), len(wantLabels)) } @@ -842,6 +848,46 @@ func TestSettingsTabs_GroupControlsAndOpenOnGeneral(t *testing.T) { } } +func TestExperimentalHEICControl(t *testing.T) { + for _, store := range []bool{false, true} { + host := &fakeHost{} + w := New(testApp, host) + w.SetHEICUnavailable(true) + w.Show(host.prefs, store) + tabs := settingsTabs(t, w) + experimental := tabs.Items[len(tabs.Items)-1] + if experimental.Text != "Experimental" || tabs.SelectedIndex() != 0 || w.experimentalHEIC.Checked { + t.Fatal("experimental tab or default preference changed") + } + content := tabVBox(t, experimental) + if len(content.Objects) != 3 || content.Objects[0] != w.experimentalHEIC { + t.Fatal("experimental control is not in the tab surface") + } + if label, ok := content.Objects[1].(*widget.Label); !ok || label.Text != "Restart PicFetch to apply. Colors may be inaccurate; HDR is not supported." { + t.Fatal("restart/color explanation is not beneath the checkbox") + } + if label, ok := content.Objects[2].(*widget.Label); !ok || label.Text != "Experimental HEIC support is unavailable. Check the installed helper package and sandbox permissions." { + t.Fatal("unavailable package has no localized explanation") + } + for _, tab := range tabs.Items[:len(tabs.Items)-1] { + if containsCanvasObject(tab.Content, w.experimentalHEIC) { + t.Fatal("HEIC control occurs outside Experimental") + } + } + test.Tap(w.experimentalHEIC) + if !lastApply(t, host).ExperimentalHEIC || host.prevCalls[0].ExperimentalHEIC { + t.Fatal("checkbox did not apply the saved choice") + } + tabs.Select(experimental) + w.win.Window().Close() + w.Show(host.prefs, store) + if settingsTabs(t, w).SelectedIndex() != 0 || !w.experimentalHEIC.Checked { + t.Fatal("reopening lost saved intent or selected Experimental") + } + w.win.Window().Close() + } +} + func TestUpdatesTab_ShowsCurrentVersionAndBuild(t *testing.T) { app := metadataApp{ App: testApp, @@ -1102,3 +1148,120 @@ func TestApply_PassesThePreviousSnapshot(t *testing.T) { t.Error("second prev is not the first push's next — the chain is broken") } } + +func TestExperimentalHEICUnavailableStatus(t *testing.T) { + w := newUpdateTestWindow(t, &fakeHost{}) + tabs := settingsTabs(t, w) + content := tabVBox(t, tabs.Items[len(tabs.Items)-1]) + w.SetHEICUnavailable(true) + w.Show(preferences.State{}, false) + if len(content.Objects) != 3 || !content.Objects[2].Visible() { + t.Fatal("late helper failure did not reach the already-open Settings surface") + } + if tabs.SelectedIndex() != 0 { + t.Fatal("unavailable status selected Experimental automatically") + } + w.SetHEICUnavailable(false) + if content.Objects[2].Visible() { + t.Fatal("successful later launch retained stale unavailability") + } +} + +func TestExperimentalHEICLayout(t *testing.T) { + original := testApp.Settings().Theme() + t.Cleanup(func() { testApp.Settings().SetTheme(original) }) + testApp.Settings().SetTheme(theme.DefaultTheme()) + for _, locale := range []string{"en", "de"} { + data, err := os.ReadFile(filepath.Join("..", "..", "..", "translations", locale+".json")) + if err != nil { + t.Fatal(err) + } + var strings map[string]string + if err = json.Unmarshal(data, &strings); err != nil { + t.Fatal(err) + } + for _, mode := range []appearance.Mode{appearance.Light, appearance.Dark} { + for _, cache := range []bool{false, true} { + for _, store := range []bool{false, true} { + name := fmt.Sprintf("%s-%s-cache%v-store%v", locale, mode.PrefValue(), cache, store) + t.Run(name, func(t *testing.T) { + appearance.Apply(testApp, mode) + w := New(testApp, &fakeHost{}) + w.SetHEICUnavailable(true) + if cache { + w.SetCacheTab(func() fyne.CanvasObject { return widget.NewLabel("Owned cache surface") }, nil) + } + w.Show(preferences.State{}, store) + t.Cleanup(func() { w.win.Window().Close(); w.WaitForTracking() }) + tabs := settingsTabs(t, w) + for _, tab := range tabs.Items { + tab.Text = strings[tab.Text] + } + tab := tabs.Items[len(tabs.Items)-1] + content := tabVBox(t, tab) + w.experimentalHEIC.Text = strings[w.experimentalHEIC.Text] + w.experimentalHEIC.Refresh() + for _, obj := range content.Objects[1:] { + label := obj.(*widget.Label) + label.SetText(strings[label.Text]) + } + tabs.Refresh() + tabs.Select(tab) + win := w.win.Window() + win.Resize(fyne.NewSize(windowW, windowH)) + canvas := win.Canvas() + canvas.Content().Refresh() + if !visibleTabLabel(tabs, tab.Text) { + t.Fatal("Experimental tab label is hidden behind overflow at the default size") + } + if minimum := canvas.Content().MinSize(); minimum.Width > windowW || minimum.Height > windowH { + t.Fatalf("Settings no longer fits its default size: %v", minimum) + } + for _, obj := range content.Objects { + if obj.Size().Width <= 0 || obj.Position().X+obj.Size().Width > content.Size().Width+1 { + t.Fatalf("Experimental content exceeds its surface: %T %v %v", obj, obj.Position(), obj.Size()) + } + } + if directory := os.Getenv("PICFETCH_SETTINGS_LAYOUT_OUTPUT"); directory != "" { + if err := os.MkdirAll(directory, 0700); err != nil { + t.Fatal(err) + } + file, err := os.Create(filepath.Join(directory, name+".png")) + if err != nil { + t.Fatal(err) + } + encodeErr := png.Encode(file, canvas.Capture()) + closeErr := file.Close() + if err = errors.Join(encodeErr, closeErr); err != nil { + t.Fatal(err) + } + } + }) + } + } + } + } +} + +func visibleTabLabel(object fyne.CanvasObject, text string) bool { + if !object.Visible() { + return false + } + switch value := object.(type) { + case *fynecanvas.Text: + return value.Text == text + case *fyne.Container: + for _, child := range value.Objects { + if visibleTabLabel(child, text) { + return true + } + } + case fyne.Widget: + for _, child := range test.WidgetRenderer(value).Objects() { + if visibleTabLabel(child, text) { + return true + } + } + } + return false +} diff --git a/internal/ui/startup.go b/internal/ui/startup.go index 9b8c1307..d66c2a35 100644 --- a/internal/ui/startup.go +++ b/internal/ui/startup.go @@ -5,6 +5,9 @@ package ui import ( + "os" + "path/filepath" + "fyne.io/fyne/v2" "github.com/frathe/picfetch/internal/filescan" @@ -24,10 +27,27 @@ type startupState struct { // loadStartupState reads persistence and fills only preference defaults that // have no distinct zero-value meaning. func loadStartupState(application fyne.App) startupState { + prefs := normalizePreferenceDefaults(preferences.Load(application)) + images := imageServices{} + if prefs.ExperimentalHEIC { + executable, err := os.Executable() + if err != nil { + images.startupError = err + } else { + var privateDir string + if root := application.Cache().RootURI(); root != nil && root.Scheme() == "file" { + privateDir = filepath.Join(root.Path(), "heic-helpers") + } + images = installedImageServices(prefs, executable, privateDir) + } + if images.startupError != nil { + fyne.LogError("Experimental HEIC package is unavailable", images.startupError) + } + } return startupState{ - images: newImageServices(nil), + images: images, savedSession: session.Load(application), - prefs: normalizePreferenceDefaults(preferences.Load(application)), + prefs: prefs, } } diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 new file mode 100644 index 00000000..7ca4828e --- /dev/null +++ b/packaging/heic/qualify-windows-child.ps1 @@ -0,0 +1,55 @@ +param([Parameter(Mandatory = $true)][string]$Configuration, [switch]$RequireInstalledMSIX) +$ErrorActionPreference = 'Stop' +$config = Get-Content -LiteralPath $Configuration -Raw | ConvertFrom-Json +if ($RequireInstalledMSIX -and $config.Scenario -ne 'msix') { throw 'Installed-MSIX configuration is required for the complete Windows native gate.' } +Set-Location -LiteralPath $config.Repository +$env:GOCACHE = Join-Path $config.Work 'go-cache' +$env:GOPATH = Join-Path $config.Work 'go-path' +$env:CGO_ENABLED = '0' +$env:TEMP = Join-Path $config.Work 'user-temp' +$env:TMP = $env:TEMP +New-Item -ItemType Directory -Path $env:TEMP -Force | Out-Null +& whoami /all +if ($LASTEXITCODE -ne 0) { throw 'Cannot record native execution identity.' } +if ($config.Scenario -eq 'standalone') { + & $config.Go run ./scripts/nativeguards -suite heic-windows -capture (Join-Path $config.Evidence 'native-windows.json') + if ($LASTEXITCODE -ne 0) { throw 'Native HEIC guards failed under the standard account.' } + exit 0 +} +$package = $null +try { + Add-AppxPackage -Path $config.Package -DependencyPath $config.Dependency + $package = Get-AppxPackage -Name $config.PackageName + if (-not $package) { throw 'The test-MSIX was not installed for the standard user.' } + $package | Format-List Name, PackageFullName, PackageFamilyName, InstallLocation, Architecture + Add-Type -TypeDefinition @' +using System; +using System.Runtime.InteropServices; +[ComImport, Guid("2E941141-7F97-4756-BA1D-9DECDE894A3D"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] +interface IHEICApplicationActivationManager { + [PreserveSig] int ActivateApplication([MarshalAs(UnmanagedType.LPWStr)] string app, [MarshalAs(UnmanagedType.LPWStr)] string args, uint options, out uint processId); +} +public static class HEICInstalledActivation { + public static uint Start(string app) { + var type = Type.GetTypeFromCLSID(new Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")); + var manager = (IHEICApplicationActivationManager)Activator.CreateInstance(type); + uint processId; + int result = manager.ActivateApplication(app, "-test.run=^TestNativeInstalledHEICActivation$ -test.v -test.timeout=4m", 0, out processId); + Marshal.ThrowExceptionForHR(result); + return processId; + } +} +'@ + $activationPID = [HEICInstalledActivation]::Start($package.PackageFamilyName + '!HEICQualification') + $process = [System.Diagnostics.Process]::GetProcessById($activationPID) + if (-not $process.WaitForExit(300000)) { $process.Kill(); throw 'Installed activation did not terminate within five minutes.' } + $resultPath = Join-Path $config.Evidence 'installed-msix.json' + if (-not (Test-Path -LiteralPath $resultPath)) { throw 'Installed activation did not produce its completion record.' } + $result = Get-Content -LiteralPath $resultPath -Raw | ConvertFrom-Json + Get-Content -LiteralPath (Join-Path $config.Evidence 'installed-msix.log') + if ($process.ExitCode -ne 0 -or -not $result.Passed -or $result.Test -ne 'TestNativeInstalledHEICActivation' -or $result.OS -ne 'windows' -or $result.Arch -ne $config.Arch -or $result.Commit -ne $config.Commit) { + throw 'Installed standard-user MSIX activation did not pass for this build.' + } +} finally { + if ($package) { Remove-AppxPackage -Package $package.PackageFullName } +} diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 new file mode 100644 index 00000000..713fb339 --- /dev/null +++ b/packaging/heic/qualify-windows.ps1 @@ -0,0 +1,120 @@ +# Provisions disposable CI-only account/package state. Application tests run +# under that standard account; none of this provisioning is in PicFetch. +param( + [ValidateSet('standalone', 'msix')][string]$Scenario = 'standalone', + [Parameter(Mandatory = $true)][string]$EvidenceDirectory, + [string]$Executable, + [string]$RuntimeArchive +) +$ErrorActionPreference = 'Stop' +if ($env:GITHUB_ACTIONS -ne 'true' -or $env:RUNNER_ENVIRONMENT -ne 'github-hosted') { + throw 'Disposable-account provisioning is restricted to GitHub-hosted CI. Run nativeguards directly as a standard user for local standalone qualification.' +} +$repository = (Get-Location).Path +$go = (Get-Command go).Source +$architecture = (& $go env GOARCH).Trim() +if ($architecture -notin @('amd64', 'arm64')) { throw 'A native amd64 or arm64 host is required.' } +$identity = [Guid]::NewGuid().ToString('N') +$userName = 'pfheic' + $identity.Substring(0, 10) +$workRoot = Join-Path $env:RUNNER_TEMP ('heic-owned-' + $identity) +$copy = Join-Path $workRoot 'repository' +$evidence = Join-Path $workRoot 'evidence' +$certificate = $null +$trusted = $null +$account = $null +New-Item -ItemType Directory -Path $workRoot, $evidence -Force | Out-Null +New-Item -ItemType Directory -Path $EvidenceDirectory -Force | Out-Null +try { + $secret = ConvertTo-SecureString ('Pf!' + [Guid]::NewGuid().ToString('N') + '9a') -AsPlainText -Force + $account = New-LocalUser -Name $userName -Password $secret -Description 'Disposable PicFetch HEIC qualification account' + Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account + $credential = [PSCredential]::new("$env:COMPUTERNAME\$userName", $secret) + & icacls $workRoot /grant "*$($account.SID.Value):(OI)(CI)M" | Out-Null + if ($LASTEXITCODE -ne 0) { throw 'Could not prepare the owned qualification workspace.' } + & robocopy $repository $copy /E /XJ /XD .git .scratch bin fyne-cross /NFL /NDL /NJH /NJS | Out-Null + if ($LASTEXITCODE -ge 8) { throw 'Could not copy the source into the owned qualification workspace.' } + $config = @{ + Scenario = $Scenario; Repository = $copy; Go = $go; Work = $workRoot + Evidence = $evidence; Arch = $architecture; Commit = $env:GITHUB_SHA + } + if ($Scenario -eq 'msix') { + if (-not $Executable -or -not $RuntimeArchive) { throw 'MSIX qualification requires the built Store executable and pinned runtime archive.' } + $stage = Join-Path $workRoot 'stage' + & $go run -tags no_emoji,nodynamic ./scripts/msixstage -arch $architecture -exe $Executable -runtime-archive $RuntimeArchive -out $stage + if ($LASTEXITCODE -ne 0) { throw 'MSIX staging failed.' } + & $go run ./scripts/heicpackage -os windows -arch $architecture -out $stage + if ($LASTEXITCODE -ne 0) { throw 'HEIC helper staging failed.' } + & $go test -tags no_emoji,nodynamic,heicnative,microsoftstore -c -o (Join-Path $stage 'heic-activation.test.exe') ./internal/ui + if ($LASTEXITCODE -ne 0) { throw 'Application activation probe build failed.' } + Copy-Item -LiteralPath (Join-Path $repository 'scripts/heicbuild/testdata/tenbit.heic') -Destination (Join-Path $stage 'heic-activation-fixture.heic') + @{ Evidence = (Join-Path $evidence 'installed-msix'); Commit = $env:GITHUB_SHA; UserSID = $account.SID.Value } | + ConvertTo-Json | Set-Content -LiteralPath (Join-Path $stage 'heic-activation.json') -Encoding utf8NoBOM + $manifestPath = Join-Path $stage 'AppxManifest.xml' + [xml]$manifest = Get-Content -LiteralPath $manifestPath -Raw + $publisher = 'CN=PicFetch HEIC Qualification ' + $identity + $packageName = 'PicFetch.HEICQualification.' + $identity + $manifest.Package.Identity.SetAttribute('Name', $packageName) + $manifest.Package.Identity.SetAttribute('Publisher', $publisher) + $probe = $manifest.Package.Applications.Application.CloneNode($true) + $probe.SetAttribute('Id', 'HEICQualification') + $probe.SetAttribute('Executable', 'heic-activation.test.exe') + $probe.RemoveChild($probe.Extensions) | Out-Null + $manifest.Package.Applications.AppendChild($probe) | Out-Null + $manifest.Save($manifestPath) + $sdk = 'C:\Program Files (x86)\Windows Kits\10\bin' + $makeappx = Get-ChildItem -LiteralPath $sdk -Filter MakeAppx.exe -Recurse | Where-Object FullName -Match '\\x64\\MakeAppx\.exe$' | Sort-Object FullName -Descending | Select-Object -First 1 + $signtool = Get-ChildItem -LiteralPath $sdk -Filter SignTool.exe -Recurse | Where-Object FullName -Match '\\x64\\SignTool\.exe$' | Sort-Object FullName -Descending | Select-Object -First 1 + if (-not $makeappx -or -not $signtool) { throw 'The Windows SDK packaging/signing tools are required.' } + $package = Join-Path $workRoot 'qualification.msix' + & $makeappx.FullName pack /o /h SHA256 /d $stage /p $package + if ($LASTEXITCODE -ne 0) { throw 'Test-MSIX packing failed.' } + $certificate = New-SelfSignedCertificate -Type Custom -Subject $publisher -KeyUsage DigitalSignature -CertStoreLocation 'Cert:\CurrentUser\My' -TextExtension @('2.5.29.37={text}1.3.6.1.5.5.7.3.3') + $trusted = [System.Security.Cryptography.X509Certificates.X509Store]::new('TrustedPeople', 'LocalMachine') + $trusted.Open('ReadWrite') + $trusted.Add($certificate) + & $signtool.FullName sign /fd SHA256 /sha1 $certificate.Thumbprint $package + if ($LASTEXITCODE -ne 0) { throw 'Disposable package signing failed.' } + & $signtool.FullName verify /pa /all /v $package + if ($LASTEXITCODE -ne 0) { throw 'Disposable package verification failed.' } + $frameworkArch = if ($architecture -eq 'amd64') { 'x64' } else { 'arm64' } + $frameworkRoot = 'C:\Program Files (x86)\Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.VCLibs.Desktop\14.0' + $framework = Get-ChildItem -LiteralPath $frameworkRoot -Filter "*$frameworkArch*.appx" -Recurse | Where-Object FullName -Match '\\Retail\\' | Sort-Object FullName -Descending | Select-Object -First 1 + if (-not $framework) { throw 'The architecture-matched Desktop C++ framework is required.' } + $dependency = Join-Path $workRoot $framework.Name + Copy-Item -LiteralPath $framework.FullName -Destination $dependency + $config.Package = $package; $config.PackageName = $packageName; $config.Dependency = $dependency + @{ + Commit = $env:GITHUB_SHA; Arch = $architecture; StandardUserSID = $account.SID.Value + Package = $packageName; SHA256 = (Get-FileHash -LiteralPath $package -Algorithm SHA256).Hash + TestCertificate = $certificate.Thumbprint + Helper = (Get-Content -LiteralPath (Join-Path $stage 'heic/manifest.json') -Raw | ConvertFrom-Json) + } | ConvertTo-Json -Depth 5 | Set-Content -LiteralPath (Join-Path $evidence 'package-setup.json') -Encoding utf8NoBOM + } + $configPath = Join-Path $workRoot 'configuration.json' + $config | ConvertTo-Json | Set-Content -LiteralPath $configPath -Encoding utf8NoBOM + $child = Join-Path $copy 'packaging/heic/qualify-windows-child.ps1' + $powershell = (Get-Command pwsh).Source + $process = Start-Process -FilePath $powershell -Credential $credential -LoadUserProfile -WorkingDirectory $copy -ArgumentList @('-NoProfile', '-File', "`"$child`"", '-Configuration', "`"$configPath`"") -PassThru -Wait -RedirectStandardOutput (Join-Path $evidence 'standard-user.stdout.log') -RedirectStandardError (Join-Path $evidence 'standard-user.stderr.log') + Get-Content -LiteralPath (Join-Path $evidence 'standard-user.stdout.log') + Get-Content -LiteralPath (Join-Path $evidence 'standard-user.stderr.log') + if ($process.ExitCode -ne 0) { throw "Standard-user qualification failed with exit $($process.ExitCode)." } +} finally { + try { + Copy-Item -Path (Join-Path $evidence '*') -Destination $EvidenceDirectory -Recurse -Force + } finally { + try { + if ($trusted) { + try { if ($certificate) { $trusted.Remove($certificate) } } finally { $trusted.Close() } + } + if ($certificate) { Remove-Item -LiteralPath ("Cert:\CurrentUser\My\" + $certificate.Thumbprint) } + } finally { + try { + if ($account) { + try { + Get-CimInstance -ClassName Win32_UserProfile -Filter "SID='$($account.SID.Value)'" | Remove-CimInstance + } finally { Remove-LocalUser -SID $account.SID } + } + } finally { Remove-Item -LiteralPath $workRoot -Recurse -Force } + } + } +} diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index 87b5c4cc..4a9d8de3 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -7,6 +7,18 @@ Use [qualification](../docs/heic/qualification.md) and [history reconciliation](../docs/heic/history-reconciliation.md) for the current implementation and the disposition of the original branch's changes. +**Next specified work (2026-09-16):** +[Experimental HEIC opt-in across all platforms](../.scratch/experimental-heic-opt-in/spec.md) +is the ready-for-agent specification for a default-off, restart-only Settings +option, shared immutable admission, Windows private helper staging and installed +MSIX activation. It supersedes this plan's original format-exposure scope for +that preview: package-level format queries and OS associations stay unchanged. +Native packaged activation on both architectures of all three operating systems, +standard-user Windows and installed test-MSIX remains required. Permission-query +failure is a blocker; the accepted macOS memory limitation remains unchanged. +This is specification only. Production activation, implementation evidence and +release clearance remain pending. + Date: 2026-09-15. Route: **Deep SDD/TDD**. The deliverable is decode-only HEIC/HEIF support through one bounded, disposable WASI decoder helper, admitted only on platforms where both process-family memory enforcement and capability @@ -1151,3 +1163,12 @@ closure, real Authenticode/MSIX, nonadministrator Windows behavior, broader camera/color qualification, the first released-updater transition and the unsigned initial foundation's merge prerequisite remain explicit. No merge, release, production activation or history rewrite is included in this loop. + +### Experimental activation follow-up, 2026-09-16 + +The accepted opt-in implementation is tracked in +[the new active plan](2026-09-16-experimental-heic-opt-in.md). Its default-off +startup wiring supersedes earlier statements here that production always +constructs an empty image service. This plan's earlier execution/review results +remain historical; they do not qualify the later private Windows cache or +installed application paths. Decoder source and native limits are unchanged. diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md new file mode 100644 index 00000000..83915647 --- /dev/null +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -0,0 +1,187 @@ +# Experimental HEIC opt-in implementation + +Date: 2026-09-16. Route: Deep SDD/TDD. Status: in progress. + +Deliver the accepted [spec](../.scratch/experimental-heic-opt-in/spec.md) through +the [nine approved tickets](../.scratch/experimental-heic-opt-in/issues/README.md). +Ronin invoked `/implement use SDD and TDD`; the preceding breakdown is accepted. +The prior restoration plan remains the historical helper qualification record. +Initial HEAD: `fad62e69d896171aa3dd59508fb1c4cf536e7fb5`; existing plan/todos edits +are the specification pointers prepared in this conversation. + +## Contracts and limits + +- `imaging.Reader.IsSupportedImage(fyne.URI) bool` and + `SupportedExtensions() []string` describe the reader's immutable capability. + Zero reader and package-level queries remain unchanged. +- `filescan.Option` and `WithAdmission(func(fyne.URI) bool) Option` extend + `Images`/`Siblings` with optional arguments; omitted/nil admission uses the + existing default. All viewer opens capture its foreground reader predicate. +- `preferences.State.ExperimentalHEIC` persists as `experimentalHEIC`, false by + default. Settings edits affect the saved intent only. Startup loads preferences + before constructing one shared HEIC owner; readers never change mid-session. +- Startup package discovery derives the installation from the running executable. + Package/launch failures retain intent and supply localized unavailable status. + Fixed helper identity and all existing readiness/admission/limits remain intact. +- Windows preparation publishes verified content-addressed copies in private + app storage; its exact lifetime contract is pinned before T04 code. Safe + cleanup may defer, but it cannot remove a copy in use or publish partial bytes. +- No decoder source/dependency/OS association/CLI override changes. Mac total + native-memory limitation remains accepted. Production signing, distribution + clearance and broad color qualification remain release gates. + +## Task graph and file map + +`01 -> 02 -> {03, 04, 06, 07}`; `04 -> {05, 08}`; +`{03, 05, 06, 07, 08} -> 09`. + +| Ticket | Files / modules | Test and verification | Owner / budget | +| --- | --- | --- | --- | +| 01 | imaging source, filescan, UI drop/images tests; architecture | Real admission through injected reader; T01 execution gate | Lead; 0 implementation spawns; 1 review; focused only | +| 02 | preferences, UI startup/images/settings/run/features, settingswin, translations | Actual Settings surface and saved choice across viewer lifetimes; T02 gate | Lead; 0 implementation spawns; 2 reviews; focused only | +| 03 | UI consumers, Explorer preset choices, similarity integration tests | Admitted uncached inputs reach shared readers/owner; T03 gate | Lead; 0 implementation spawns; 1 review; focused only | +| 04 | HEIC client package/preparation platform files, winisolation, startup | Verified copied launch, concurrent publishers, damaged cache, lifecycle; T04 gate | Lead; 0 implementation spawns; 2 reviews; native evidence required | +| 05 | msixstage/Store workflow, nativeguards and package activation fixtures | Installed test-MSIX under standard user on both architectures; T05 gate | Lead; 0 implementation spawns; 1 review; native evidence required | +| 06 | macOS packaged activation fixtures/nativeguards/CI | Complete native app on amd64/arm64; T06 gate | Lead; 0 implementation spawns; 1 review; native evidence required | +| 07 | Linux packaged activation fixtures/nativeguards/CI | Complete native app on amd64/arm64; T07 gate | Lead; 0 implementation spawns; 1 review; native evidence required | +| 08 | Windows native account/package fixture/nativeguards/CI | Standard-user package on amd64/arm64; T08 gate | Lead; 0 implementation spawns; 1 review; native evidence required | +| 09 | all touched code inspections, plan/todos/architecture/threat/qualification | Parent AC1–12, complete CI and fresh code/security reviews | Lead; 0 implementation spawns; final review; full suite once | + +Each ticket's exact commands and acceptance cases are in the linked execution +record. Run one behavioral red/green slice at a time, using the accepted seams. +Missing native environments and permission-query failures remain unverified +blockers. No helper-only or cross-build result substitutes for packaged runtime. +Update this file with exact new native invocation contracts before qualification. + +## Delegation + +One read-only Windows API/lifetime scout runs alongside lead-owned ticket 01. +G1: bounded current API question; G2: reported call sites checked with source; +G3: no writes; G4: three platform files rather than full feature context; +G5: lead has not traced this platform lifetime. No design, review, platform +implementation or user-visible strings are delegated. Additional scouts require +a recorded bounded question; no concurrent code ownership overlaps. + +## Evidence and cost ledger + +| Slice | Red / green / inspection evidence | Status | +| --- | --- | --- | +| Publication | Nine tickets published, ticket 01 claimed; prior spec preserved | Complete | +| 01 | Real-admission consumer red: unsupported scan never began sort; green imaging/filescan and direct/folder/sibling/session/Favorite UI cases | Implemented; final gate pending | +| 02 | Red: missing Experimental tab/default activation; green preference and real-checkbox separate-lifetime tests. Later red: stale open Settings; green live status update | Implemented; final gate pending | +| 03 | Red: active HEIC choices absent and saved rule rejected; green Explorer real-dialog save/rename and source consumers; native successful analysis and two retained preview queries pass, missing-owner negative control fails as expected | Implemented; final gate pending | +| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests compile on both architectures | Native Windows execution unverified | +| 05, 08 | Standard-user provisioning and real installed-MSIX activation fixtures/CI added. Source installation bytes/ACLs checked; real package identity and exact provisioned user required | Native execution and PowerShell runtime unverified | +| 06 | Native macOS arm64 signed application-constructor fixture passed; real HEIC decode, restart, cancellation and shutdown | Intel and production GUI smoke unverified | +| 07 | Linux native target now requires application fixture in addition to helper/seccomp/resource suite | Native execution unverified | +| 09 | Focused package race suite and make verify-build pass. Initial IDE batch: 47 files; only three weak warnings (one redundant type fixed; two test duplication reports already excluded by exact Qodana paths). English/German light/dark, Cache/Store layout matrix rendered; German overflow seen red and default widened | Native matrix, complete CI and fresh reviews pending | + +Budget: one initial read-only scout; lead implementation and fixes; focused +tests during iteration; complete suite once at final gate. No qualification, +commit, push, review or release is claimed by this plan's creation. + +Second read-only scout: locate packaged-activation runners and evidence hooks +in `scripts/nativeguards/main.go`, `.github/workflows/ci.yml`, and +`.github/workflows/microsoft-store.yml`. G1–G5: bounded three-file read, +source-location oracle, no writes, independent native context, not yet traced +by lead. Lead continues restart/Explorer implementation. No design delegated. + +### Native application fixture contract + +`TestNativePackagedHEICActivation` is a `heicnative` application-package test. +The native guard runner must require it separately from the broad helper suites. +It copies the application test executable into the fixed installation layout, +runs `go run ./scripts/heicpackage -os -arch -out `, +and on macOS independently verifies the helper and ad-hoc signs/verifies the +enclosing application. The relocated executable runs the existing shared +startup/viewer harness, actual Settings checkbox, normal admission and native +helper. This is application-constructor evidence using Fyne's test driver; +rendered layout and production GUI/package qualification remain separate checks. +Windows execution additionally requires a real non-administrator token. Installed +MSIX uses a disposable signed test package and requires real package identity; +its immutable source helper bytes and ACLs are compared around activation. +No production CLI flag or activation environment variable is introduced. + +### Local verification checkpoint + +- `go test -race -tags no_emoji,nodynamic -count=1 ./internal/heicdecode/... ./internal/filescan ./internal/imaging ./internal/preferences ./internal/ui/settingswin ./internal/ui/explorer`: all pass (client 8.654 s, worker 14.357 s, imaging 24.185 s; remaining packages 1.199–5.924 s). +- `make verify-build`: pass, including vet/build, all existing notice/asset checks, + native import guard and reproduced WASI artifact. +- `make generate-heic-wasm`: refreshed only the build-tool status-message digest + in decoder.json; guest hash remains `cdaf9af71d8a8624c620a2ca8f90865a00a2d2dc228bb8bdb058564726d769ed`. +- `make check-qodana-test-exclusions`: pass. Root UI tests are assigned in ui-2. +- `make verify` and `make check-test-shards`: blocked by absent Docker daemon + socket. A direct host shard check correctly cannot qualify the Linux/amd64 + manifest (its macOS-only runnable differs); no assignment is added for that + platform-only test. Do not bypass the canonical platform requirement. +- `gh pr view`: existing PR #28 remains at initial `fad62e69`; all current work + is local and uncommitted. No fresh CI/review is claimed for these changes. +- Layout PNGs: `.scratch/experimental-heic-opt-in/evidence/layout/` (16 locale, + theme, optional Cache and Store combinations). Existing small saved geometry + retains Fyne's overflow behavior; a new default Settings window is 640x520. + +Lead review found a pre-input native-probe storage failure that was not classified +unavailable. Its owned-file regression failed first, then passed after setup +errors were classified without changing any policy or limit. Request cancellation +continues to take precedence over availability diagnostics. The lead owns all +review/fixes; the code-review skill's separate standards/spec axes are applied +inline because the repository agreement prohibits delegated reviews. + +### Final local review checkpoint + +The lead applied both standards and spec review axes and fixed the evidence gap +in successful analysis subprocess coverage. `TestNativeHEICAnalysisPixels` +uses a complete native helper package, admits the owned fixture through filescan, +and verifies pixels through the shared owner into analysis and two uncached +preview queries in one retained search subprocess. It also checks cancellation +and process joining. Removing the attached owner produced the expected failure +before restoration. No model inference or color-fidelity claim follows from it. +All three platform suites now require this guard; the registry test was observed +failing before registration and passing afterward. + +- Focused UI/Settings race regressions: pass (`internal/ui` 14.941 s, + `settingswin` 4.076 s); translation/manual guards pass. +- Native analysis/attachment/preview race regressions: pass (14.379 s). +- `GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go vet -tags no_emoji,nodynamic ./internal/...`: pass. +- Final installed Store UI and native analysis test binaries compile for Windows + amd64 and arm64; execution remains unverified. +- `make security-govulncheck`: no reachable vulnerabilities in the application; + one required-module finding outside imported packages/called symbols. Separate + WASI guest scan reports no vulnerabilities. Dependency versions are unchanged. +- Packaging/registry tests pass: nativeguards, heicpackage, plistdoctypes, + msixstage (3.987 s); Explorer preset validation exercised by UI tests. +- Final GoLand inspection covers 49 changed code/configuration files, including + weak warnings, with no timeouts. Two intentional duplicate-test-setup reports + are covered by existing exact DuplicatedCode exclusions. Machine-readable + evidence: `.scratch/experimental-heic-opt-in/evidence/goland-inspections.json`. +- Sixteen Settings renders pass. English dark and German light with Cache were + visually inspected at 640x520; all tabs and full explanatory text fit. + +A third bounded read-only scout task inventoried analysis/retained-search test +names and source-entry paths while the lead finished verification. It reused +the existing scout (one spawned agent total; three bounded tasks across recon +and final evidence phases). Its source citations exposed the positive-pixel +coverage gap; the lead designed, wrote and verified the additional tests. +No review or fix was delegated. Review budget for ticket 03 increased from one +to two rounds to close that gap; native gate rerun is justified by its new +required guard. No complete broad race suite was repeated. + +Outstanding before acceptance: native Linux and Windows on both architectures, +installed standard-user test-MSIX on both architectures, macOS Intel, complete +native Linux/amd64 suite and canonical shard check, fresh latest-commit CI, +post-suppression Qodana/CodeQL and Codex code/security reviews. Docker is stopped +locally. The branch still requires explicit authorization to commit/push under +AGENTS.md; no publication or review-loop invocation has occurred. Production GUI +smoke and release licensing/signing/camera/color gates remain separately open. + +Final native capture: `make heic-native-macos` passes all six required guards, +including signed helper/runtime, signed update/reinstall, packaged application +and successful analysis pixels. The final application test took 5.120 s and the +analysis test 8.640 s; package totals: client 77.488 s, update 4.209 s, +similarity 10.627 s, UI 5.626 s. No mandatory guard skipped; the unrelated +Store-only policy test correctly skips in this non-Store suite. Raw events are +`.scratch/heic-qualification/native-macos.json`; command output is +`.scratch/experimental-heic-opt-in/evidence/native-macos-run.log`. +Final formatting, Qodana exclusion, provenance and native import checks pass. +The import check needed ordinary Go module-cache access after a sandboxed cache +write failed; rerun with that access passed without policy/source changes. diff --git a/qodana.yaml b/qodana.yaml index 3f13d4d8..4c1ce464 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -159,6 +159,7 @@ exclude: - "internal/heicdecode/client/native_darwin_test.go" - "internal/heicdecode/client/native_platform_test.go" - "internal/heicdecode/client/package_test.go" + - "internal/heicdecode/client/installed_windows_test.go" - "internal/heicdecode/client/peer_other_test.go" - "internal/heicdecode/client/peer_windows_test.go" - "internal/heicdecode/client/process_unix_test.go" @@ -213,6 +214,7 @@ exclude: - "internal/similarity/cache_store_test.go" - "internal/similarity/cache_test.go" - "internal/similarity/grouping_test.go" + - "internal/similarity/heic_native_test.go" - "internal/similarity/heic_test.go" - "internal/similarity/offline_test.go" - "internal/similarity/search_pipeline_test.go" @@ -315,6 +317,9 @@ exclude: - "internal/ui/help/search_test.go" - "internal/ui/help/whatsnew_test.go" - "internal/ui/images_test.go" + - "internal/ui/images_native_test.go" + - "internal/ui/images_native_other_test.go" + - "internal/ui/images_native_windows_test.go" - "internal/ui/imgcache_test.go" - "internal/ui/info_test.go" - "internal/ui/infoview/card_test.go" diff --git a/scripts/heicbuild/main.go b/scripts/heicbuild/main.go index e449eb3f..9c357e40 100644 --- a/scripts/heicbuild/main.go +++ b/scripts/heicbuild/main.go @@ -142,7 +142,7 @@ func run(mode string) error { if err = os.WriteFile(filepath.Join(root, manifestPath), append(data, '\n'), 0644); err != nil { return err } - fmt.Println("Built development guest and refreshed its provenance manifest; production HEIC remains disabled") + fmt.Println("Built isolated HEIC guest and refreshed its provenance manifest; activation remains opt-in") return nil } @@ -340,7 +340,7 @@ func checkImports(root string) error { if err != nil { return err } - for _, line := range strings.Split(string(data), "\n") { + for line := range strings.SplitSeq(string(data), "\n") { line = strings.TrimSpace(line) if line != "" && line != "github.com/frathe/picfetch v0.0.0" && line != decoderModule+" "+decoderVersion && line != "github.com/frathe/picfetch/scripts/heicguest" { return fmt.Errorf("unreviewed guest dependency: %s", line) @@ -350,7 +350,7 @@ func checkImports(root string) error { if err != nil { return err } - for _, line := range strings.Split(string(data), "\n") { + for line := range strings.SplitSeq(string(data), "\n") { if forbiddenImport(line) { return fmt.Errorf("native graph contains %s", line) } diff --git a/scripts/heicguest/decoder.json b/scripts/heicguest/decoder.json index 03d18b39..771134c7 100644 --- a/scripts/heicguest/decoder.json +++ b/scripts/heicguest/decoder.json @@ -21,7 +21,7 @@ "internal/heicdecode/request.go": "39bd8fe6af5e228681e0c819e82159c3ecb1c5109ae56513fe9b5faa6ff75ed3", "internal/heicdecode/worker/decoder.wasm": "cdaf9af71d8a8624c620a2ca8f90865a00a2d2dc228bb8bdb058564726d769ed", "scripts/heicbuild/fixture.go": "dd205a231c22f464ff86a5d922e1ee95bdca03f1e4b1ac864439cf4fdea9b512", - "scripts/heicbuild/main.go": "17daa03d417139ac4b2639749871bae48e8f72290804a7a2d13776ac5669360f", + "scripts/heicbuild/main.go": "2ff88583a41a65c30101db37e437b3a870aa44f68415a3284ca86e171d289e75", "scripts/heicbuild/source.go": "fa21510be758ac3a4634e0db028f0920747c9efb05bc903c2c4429bed0d46857", "scripts/heicbuild/testdata/README.md": "bad7e52474096919ae14e0d82cddb5bc73b79434473f9402c1c82ada91ae19f5", "scripts/heicbuild/testdata/alpha.heic": "130c9f6c9a9bdefe2fc4b17427ff37b78423f2d3a935f82cfe55a9782f6d0f51", diff --git a/scripts/nativeguards/main.go b/scripts/nativeguards/main.go index 69d22120..c2131313 100644 --- a/scripts/nativeguards/main.go +++ b/scripts/nativeguards/main.go @@ -23,6 +23,7 @@ type suite struct { name, goos, tags string packages []string guards []guard + focused map[string]string } type goRunner func(context.Context, []string, io.Writer) error @@ -73,9 +74,9 @@ func suiteFor(name, hostOS string) (suite, error) { case "heic-windows": s.goos = "windows" s.tags = "heicnative" - s.require("internal/heicdecode/winisolation", "TestNativeWindowsJobAndToken", "TestNativeWindowsUnsandboxedRefused") + s.require("internal/heicdecode/winisolation", "TestNativeWindowsJobAndToken", "TestNativeWindowsUnsandboxedRefused", "TestLoopbackPermissionQueryFailureRefused") s.require("internal/heicdecode/worker", "TestNativeNetworkDenialRejectsUnisolatedProcess") - s.require("internal/heicdecode/client", "TestNativeSandboxHelper") + s.require("internal/heicdecode/client", "TestNativeSandboxHelper", "TestWindowsInstalledHelperCache", "TestWindowsCacheLeaseWaitsForShutdown", "TestWindowsConcurrentHelperStaging", "TestWindowsHelperCacheRejectsHardLinksAndNonDirectories") s.require("internal/heicdecode/client", "TestInheritedRemoteUsesOwner", "TestInheritedRemoteCancellationJoins", "TestAttachmentStopWithoutProcessStartJoinsOwner", "TestRemoteQueuedCancellationReleasesService", "TestRemoteOutputRetainsAdmissionAndStopJoins") s.require("internal/similarity", "TestAnalysisWorkersUseHEICOwner", "TestAnalysisHEICAttachmentStartFailureJoins") case "store": @@ -85,6 +86,11 @@ func suiteFor(name, hostOS string) (suite, error) { default: return suite{}, fmt.Errorf("unknown native suite %q", name) } + if strings.HasPrefix(name, "heic-") { + s.require("internal/ui", "TestNativePackagedHEICActivation") + s.require("internal/similarity", "TestNativeHEICAnalysisPixels") + s.focused = map[string]string{"./internal/ui": "^TestNativePackagedHEICActivation$"} + } if s.goos != "" && s.goos != hostOS { return suite{}, fmt.Errorf("suite %s requires native %s, running on %s", name, s.goos, hostOS) } @@ -119,8 +125,26 @@ func runSuite(ctx context.Context, s suite, execute goRunner, log, capture io.Wr } } var raw bytes.Buffer - args := append(s.testArgs("-json", "-v", "-timeout=30m"), s.packages...) - executionErr := execute(ctx, args, io.MultiWriter(capture, &raw)) + var executionErrors []error + var full []string + for _, pkg := range s.packages { + if s.focused[pkg] == "" { + full = append(full, pkg) + } + } + if len(full) > 0 { + args := append(s.testArgs("-json", "-v", "-timeout=30m"), full...) + executionErrors = append(executionErrors, execute(ctx, args, io.MultiWriter(capture, &raw))) + } + // UI golden tests belong to Linux CI. These suites require the native + // application boundary fixture without rerunning unrelated UI surfaces. + for _, pkg := range s.packages { + if focus := s.focused[pkg]; focus != "" { + args := append(s.testArgs("-json", "-v", "-timeout=30m", "-run", focus), pkg) + executionErrors = append(executionErrors, execute(ctx, args, io.MultiWriter(capture, &raw))) + } + } + executionErr := errors.Join(executionErrors...) evidenceErr := validateEvents(&raw, s.guards, log) return errors.Join(executionErr, evidenceErr) } diff --git a/scripts/nativeguards/main_test.go b/scripts/nativeguards/main_test.go index 9d00092b..6ddb31b0 100644 --- a/scripts/nativeguards/main_test.go +++ b/scripts/nativeguards/main_test.go @@ -27,6 +27,12 @@ func TestNativeSuitesSelectPlatformAndDistributionGuards(t *testing.T) { {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/update", "TestNativeMacUpdatePreservesSignedBundle", "heicnative"}, {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/update", "TestNativeMacLegacyUpdateRequiresCompleteReinstall", "heicnative"}, {"heic-linux", "linux", "github.com/frathe/picfetch/internal/heicdecode/client", "TestNativeSandboxHelper", "heicnative"}, + {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/ui", "TestNativePackagedHEICActivation", "heicnative"}, + {"heic-macos", "darwin", "github.com/frathe/picfetch/internal/similarity", "TestNativeHEICAnalysisPixels", "heicnative"}, + {"heic-linux", "linux", "github.com/frathe/picfetch/internal/similarity", "TestNativeHEICAnalysisPixels", "heicnative"}, + {"heic-windows", "windows", "github.com/frathe/picfetch/internal/similarity", "TestNativeHEICAnalysisPixels", "heicnative"}, + {"heic-linux", "linux", "github.com/frathe/picfetch/internal/ui", "TestNativePackagedHEICActivation", "heicnative"}, + {"heic-windows", "windows", "github.com/frathe/picfetch/internal/ui", "TestNativePackagedHEICActivation", "heicnative"}, {"heic-linux", "linux", "github.com/frathe/picfetch/internal/heicdecode/worker", "TestNativeLinuxRuntimePolicy", "heicnative"}, {"heic-windows", "windows", "github.com/frathe/picfetch/internal/heicdecode/client", "TestInheritedRemoteCancellationJoins", "heicnative"}, {"heic-windows", "windows", "github.com/frathe/picfetch/internal/similarity", "TestAnalysisWorkersUseHEICOwner", "heicnative"}, @@ -155,12 +161,64 @@ func TestNativeCIExecutesAndRetainsEveryDeclaredSuite(t *testing.T) { t.Fatal(err) } text := string(data) - for _, name := range []string{"windows", "macos", "heic-macos", "heic-linux", "heic-windows", "store"} { + for _, name := range []string{"windows", "macos", "heic-macos", "heic-linux", "store"} { if !strings.Contains(text, "./scripts/nativeguards -suite "+name+" -capture") { t.Errorf("CI omits %s guard runner", name) } } + child, err := os.ReadFile("../../packaging/heic/qualify-windows-child.ps1") + if err != nil { + t.Fatal(err) + } + for _, required := range []string{"./packaging/heic/qualify-windows.ps1 -Scenario standalone", "./packaging/heic/qualify-windows.ps1 -Scenario msix", "native-guards-Windows-MSIX-${{ matrix.arch }}", "heic-standard-user/", "heic-installed-msix/"} { + if !strings.Contains(text, required) { + t.Errorf("CI omits Windows qualification contract %q", required) + } + } + if !strings.Contains(string(child), "./scripts/nativeguards -suite heic-windows -capture") || !strings.Contains(string(child), "HEICInstalledActivation") { + t.Fatal("standard-user runner lost native or installed activation") + } if !strings.Contains(text, "native-guards-${{ runner.os }}") || !strings.Contains(text, "if: always()") { t.Fatal("raw native guard evidence not retained") } } + +func TestNativeApplicationGuardRunsWithHelperSuite(t *testing.T) { + s, err := suiteFor("heic-linux", "linux") + if err != nil { + t.Fatal(err) + } + var calls [][]string + execute := func(_ context.Context, args []string, out io.Writer) error { + calls = append(calls, slices.Clone(args)) + for _, g := range s.guards { + pkg := "./" + strings.TrimPrefix(g.Package, "github.com/frathe/picfetch/") + if !slices.Contains(args, pkg) { + continue + } + if slices.Contains(args, "-list") { + _, _ = fmt.Fprintln(out, g.Test) + } else { + _, _ = io.WriteString(out, eventsFor(g, "run", "pass")) + } + } + return nil + } + if err = runSuite(context.Background(), s, execute, io.Discard, io.Discard); err != nil { + t.Fatal(err) + } + var helper, application bool + for _, args := range calls { + if slices.Contains(args, "-list") { + continue + } + if slices.Contains(args, "./internal/ui") { + application = slices.Contains(args, "-run") && slices.Contains(args, "^TestNativePackagedHEICActivation$") + } else { + helper = !slices.Contains(args, "-run") + } + } + if !helper || !application { + t.Fatalf("native runner lost helper or application coverage: %v", calls) + } +} diff --git a/todos.md b/todos.md index 83587cc3..19a26037 100644 --- a/todos.md +++ b/todos.md @@ -82,9 +82,9 @@ new identifier `frathe.picfetch` before the next WinGet publication; See the ### Reconsider HEIC support after licensing and security qualification -HEIC/HEIF is currently unsupported. A future restoration needs a documented -distribution grant or another qualified decoder, containment and platform -verification. The previous fork-upgrade watch [MA-023](needs_refactoring.md#ma-023) +HEIC/HEIF remains default-off. Experimental activation is being implemented +under the accepted September 16 spec; distribution clearance, containment and +platform verification remain required. The previous fork-upgrade watch [MA-023](needs_refactoring.md#ma-023) is closed by removal. Retained [options and source evidence](docs/find-more-like-this/old-heic-wasm-options.md) do not authorize restoring a decoder. @@ -93,7 +93,21 @@ Restoration work is authorized and tracked in [draft PR #28](https://github.com/frathe/picfetch/pull/28). The signed `52ed2df` checkpoint publishes the maintained-source WASI guest, native helper boundaries, shared GUI/analysis admission, canonical imaging integration and authenticated -package/update handling. Production construction still supplies no HEIC owner. +package/update handling. The current opt-in work now constructs an owner only +after an enabled preference and validated installed package. + +- [ ] Implement the [Experimental HEIC opt-in spec](.scratch/experimental-heic-opt-in/spec.md): + default-off, restart-only Settings activation on macOS/Linux/Windows and MSIX, + immutable session admission and verified private Windows helper staging. + Require native packaged activation on amd64/arm64, standard-user Windows and + installed disposable-signed test-MSIX; permission-query failure remains a + blocker. Retain the accepted macOS memory limitation and separate release + gates for licensing/distribution, production signing and camera/color + qualification. Implementation is in progress in the [active opt-in plan](plans/2026-09-16-experimental-heic-opt-in.md). + Settings/restart, admission, Explorer and private staging are implemented; + focused race tests, inspections, security checks and native macOS arm64 + application-constructor/analysis evidence pass. Native Windows/MSIX, remaining architectures, complete CI and fresh + reviews remain unverified. See the [activation record](docs/heic/experimental-opt-in.md). The September 16 [history reconciliation](docs/heic/history-reconciliation.md) accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files @@ -128,7 +142,7 @@ Remaining qualification: ICC/wide-gamut/PQ/HLG/gain-map display is absent and those color classes are not deliberately rejected; more fixtures alone cannot establish it. - The initial cloud foundation commit is unsigned; the PR's signing prerequisite - remains open. No history rewrite, merge, release or production activation is + remains open. No history rewrite, merge or release is authorized by this reconciliation. See [qualification evidence](docs/heic/qualification.md) and the current @@ -141,7 +155,7 @@ gen2brain replacements. The authorized review of h265 v0.2.3 found an invalid result invariant, incomplete translated-source provenance and unresolved HEVC patent obligations. Its still decoder can also fall back to sequence decoding, so a future adapter must reject sequences explicitly. The local fix does not -qualify the library; HEIC remains disabled. +qualify the library; experimental activation is tracked separately above. ### Retire the GitHub-hosted Intel macOS runner before August 2027 diff --git a/translations/de.json b/translations/de.json index 7792662d..620dd51d 100644 --- a/translations/de.json +++ b/translations/de.json @@ -494,5 +494,9 @@ "Usage is incomplete.": "Speicherverbrauch ist unvollständig erfasst.", "Processed %d records (%.1f MB).": "%d Einträge (%.1f MB) verarbeitet.", "Working...": "Wird verarbeitet...", - "Apply cache limit": "Cache-Limit anwenden" + "Apply cache limit": "Cache-Limit anwenden", + "Experimental": "Experimentell", + "Experimental HEIC support": "Experimentelle HEIC-Unterstützung", + "Restart PicFetch to apply. Colors may be inaccurate; HDR is not supported.": "Zum Anwenden PicFetch neu starten. Farben können ungenau sein; HDR wird nicht unterstützt.", + "Experimental HEIC support is unavailable. Check the installed helper package and sandbox permissions.": "Die experimentelle HEIC-Unterstützung ist nicht verfügbar. Prüfe das installierte Hilfsprogramm-Paket und die Sandbox-Berechtigungen." } diff --git a/translations/en.json b/translations/en.json index 0fb38a4b..c78c57db 100644 --- a/translations/en.json +++ b/translations/en.json @@ -494,5 +494,9 @@ "Usage is incomplete.": "Usage is incomplete.", "Processed %d records (%.1f MB).": "Processed %d records (%.1f MB).", "Working...": "Working...", - "Apply cache limit": "Apply cache limit" + "Apply cache limit": "Apply cache limit", + "Experimental": "Experimental", + "Experimental HEIC support": "Experimental HEIC support", + "Restart PicFetch to apply. Colors may be inaccurate; HDR is not supported.": "Restart PicFetch to apply. Colors may be inaccurate; HDR is not supported.", + "Experimental HEIC support is unavailable. Check the installed helper package and sandbox permissions.": "Experimental HEIC support is unavailable. Check the installed helper package and sandbox permissions." } From 085d1850a4943aeacaa775cdc0ca6f8796743009 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 15:56:16 +0200 Subject: [PATCH 20/30] Fix native HEIC qualification environments and test ownership --- .github/workflows/ci.yml | 4 ++ docs/heic/experimental-opt-in.md | 10 +++-- internal/heicdecode/client/peer_other_test.go | 2 - .../heicdecode/client/peer_windows_test.go | 2 - internal/ui/images_native_test.go | 6 +-- internal/ui/images_test.go | 27 ++++++++---- packaging/heic/qualify-windows-child.ps1 | 36 ++++++++++++++++ packaging/heic/qualify-windows.ps1 | 2 +- plans/2026-09-16-experimental-heic-opt-in.md | 41 +++++++++++++++++++ scripts/heicguest/decoder.json | 2 +- scripts/nativeguards/main.go | 20 ++++++--- scripts/nativeguards/main_test.go | 22 ++++++++++ todos.md | 5 ++- 13 files changed, 151 insertions(+), 28 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dd7292b7..7bdbc103 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -174,6 +174,10 @@ jobs: with: go-version-file: go.mod cache-dependency-path: go.sum + - name: Install Linux application fixture dependencies + run: | + sudo apt-get update + sudo apt-get install -y gcc libgl1-mesa-dev xorg-dev libwayland-dev libxkbcommon-dev - name: Qualify HEIC native isolation and address-space ceiling run: go run ./scripts/nativeguards -suite heic-linux -capture "${{ runner.temp }}/native-guards-heic-linux.json" - name: Upload native guard events diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index a887e6f5..a6f51580 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -68,7 +68,10 @@ token and unchanged installed helper bytes/ACLs. CI's `packaging/heic/qualify-windows.ps1` provisions a disposable local standard account on a GitHub-hosted runner. For MSIX it adds a separate test application, uses a disposable signing certificate, and records setup separately from -application execution. `qualify-windows-child.ps1` performs the unelevated work +application execution. The child replaces inherited runner profile variables +with the loaded standard user's native environment via +[CreateEnvironmentBlock](https://learn.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-createenvironmentblock). +`qualify-windows-child.ps1` performs the unelevated work and removes its test package. The parent removes its account, owned workspace and certificate/trust entry. Neither script is called by PicFetch. CI runs both architectures for standalone and installed-MSIX scenarios. Runtime or permission @@ -89,8 +92,9 @@ Store identity; cross-compilation is not that evidence. Focused preference/Settings/admission/Explorer and helper-publication tests pass locally. Native macOS arm64 application-constructor activation passes with the unchanged helper entitlement and finite limits. Windows amd64/arm64 test binaries -compile. Native Windows, installed-MSIX, Linux and macOS amd64 results for these -new paths remain unverified until their new CI jobs execute. Production GUI +compile. Both macOS architectures pass the native CI constructor/analysis guards at +`f41fe63`. Native Windows, installed-MSIX and Linux qualification remain open +while CI fixture corrections are verified. Production GUI smoke tests remain distinct from the test-driver fixture. See the plan for exact commands, recorded red/green results and inspections as they complete. diff --git a/internal/heicdecode/client/peer_other_test.go b/internal/heicdecode/client/peer_other_test.go index 500d34e1..82d464f9 100644 --- a/internal/heicdecode/client/peer_other_test.go +++ b/internal/heicdecode/client/peer_other_test.go @@ -5,5 +5,3 @@ package client import "os" func installOwnedPeer(source, destination string) error { return os.Link(source, destination) } - -func prepareNativeHelper(_ string) error { return nil } diff --git a/internal/heicdecode/client/peer_windows_test.go b/internal/heicdecode/client/peer_windows_test.go index d0913b25..6cd970b4 100644 --- a/internal/heicdecode/client/peer_windows_test.go +++ b/internal/heicdecode/client/peer_windows_test.go @@ -29,5 +29,3 @@ func installOwnedPeer(source, destination string) error { } return winisolation.PrepareExecutable(destination) } - -func prepareNativeHelper(path string) error { return winisolation.PrepareExecutable(path) } diff --git a/internal/ui/images_native_test.go b/internal/ui/images_native_test.go index 0118701f..7f71d4a3 100644 --- a/internal/ui/images_native_test.go +++ b/internal/ui/images_native_test.go @@ -72,8 +72,7 @@ func TestNativePackagedHEICActivation(t *testing.T) { if v.images.owner != nil || v.images.foreground.IsSupportedImage(uri) { t.Fatal("default startup enabled HEIC") } - v.showSettings() - check := experimentalHEICCheckbox(t) + check := experimentalHEICCheckbox(t, v) if check.Checked { t.Fatal("checkbox did not default off") } @@ -124,8 +123,7 @@ func TestNativePackagedHEICActivation(t *testing.T) { t.Fatalf("native cancellation: %v", err) } owner := v.images.owner - v.showSettings() - test.Tap(experimentalHEICCheckbox(t)) + test.Tap(experimentalHEICCheckbox(t, v)) preferences.Save(testApp, v.currentPreferences()) if v.images.owner != owner || !v.images.foreground.IsSupportedImage(uri) { t.Fatal("disabling replaced the running decoder") diff --git a/internal/ui/images_test.go b/internal/ui/images_test.go index 6dd54d50..061aa048 100644 --- a/internal/ui/images_test.go +++ b/internal/ui/images_test.go @@ -279,10 +279,15 @@ func TestHEICOwnerStopsWithViewer(t *testing.T) { } } -func experimentalHEICCheckbox(t *testing.T) *widget.Check { +func experimentalHEICCheckbox(t *testing.T, v *viewer) *widget.Check { t.Helper() + before := slices.Clone(testApp.Driver().AllWindows()) + if v.settingsWin.Open() { + t.Fatal("fixture requires this viewer's Settings to be closed") + } + v.showSettings() for _, win := range testApp.Driver().AllWindows() { - if win.Title() != lang.L("Settings") { + if slices.Contains(before, win) || win.Title() != lang.L("Settings") { continue } surface := win.Content() @@ -330,6 +335,15 @@ func experimentalHEICCheckbox(t *testing.T) *widget.Check { } func TestExperimentalHEICRestartOnly(t *testing.T) { + // Another viewer's Settings surface must not receive this viewer's edits. + prior := testApp.NewWindow(lang.L("Settings")) + prior.SetContent(container.NewAppTabs(container.NewTabItem(lang.L("Experimental"), widget.NewCheck(lang.L("Experimental HEIC support"), nil)))) + prior.Show() + t.Cleanup(func() { + if slices.Contains(testApp.Driver().AllWindows(), prior) { + prior.Close() + } + }) before := preferences.Load(testApp) t.Cleanup(func() { preferences.Save(testApp, before) }) preferences.Save(testApp, preferences.State{}) @@ -337,8 +351,7 @@ func TestExperimentalHEICRestartOnly(t *testing.T) { heic := storage.NewFileURI("owned.heic") t.Run("enable requires restart", func(t *testing.T) { v, _, _ := newTestUI(t) - v.showSettings() - check := experimentalHEICCheckbox(t) + check := experimentalHEICCheckbox(t, v) if check.Checked || v.images.foreground.IsSupportedImage(heic) { t.Fatal("HEIC enabled by default") } @@ -354,8 +367,7 @@ func TestExperimentalHEICRestartOnly(t *testing.T) { t.Fatalf("restart did not activate saved preference: %v", services.startupError) } v, _, _ := newTestUIWithImages(t, services) - v.showSettings() - check := experimentalHEICCheckbox(t) + check := experimentalHEICCheckbox(t, v) if !check.Checked { t.Fatal("saved preference was not restored to the checkbox") } @@ -378,8 +390,7 @@ func TestExperimentalHEICRestartOnly(t *testing.T) { preferences.Save(testApp, prefs) services := installedImageServices(prefs, filepath.Join(t.TempDir(), "missing"), private) v, _, _ := newTestUIWithImages(t, services) - v.showSettings() - if !experimentalHEICCheckbox(t).Checked || !v.images.unavailable() { + if !experimentalHEICCheckbox(t, v).Checked || !v.images.unavailable() { t.Fatal("unavailable package lost saved intent or explanation state") } ordinary := storage.NewFileURI(uitest.WriteTempFile(t, "ordinary.png", uitest.EncodePNG(t, 3, 2, color.White))) diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 index 7ca4828e..9075d12d 100644 --- a/packaging/heic/qualify-windows-child.ps1 +++ b/packaging/heic/qualify-windows-child.ps1 @@ -3,6 +3,42 @@ $ErrorActionPreference = 'Stop' $config = Get-Content -LiteralPath $Configuration -Raw | ConvertFrom-Json if ($RequireInstalledMSIX -and $config.Scenario -ne 'msix') { throw 'Installed-MSIX configuration is required for the complete Windows native gate.' } Set-Location -LiteralPath $config.Repository +# Start-Process with credentials still inherits the runner's environment. +# Replace profile values with the loaded standard user's native environment +# before any known-folder query. This changes only the owned CI test process. +Add-Type -TypeDefinition @' +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Security.Principal; +public static class HEICStandardUserEnvironment { + [DllImport("userenv.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool CreateEnvironmentBlock(out IntPtr block, IntPtr token, [MarshalAs(UnmanagedType.Bool)] bool inherit); + [DllImport("userenv.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool DestroyEnvironmentBlock(IntPtr block); + public static void Apply() { + using (var identity = WindowsIdentity.GetCurrent()) { + IntPtr block; + if (!CreateEnvironmentBlock(out block, identity.Token, false)) throw new Win32Exception(Marshal.GetLastWin32Error()); + try { + for (IntPtr cursor = block; Marshal.ReadInt16(cursor) != 0;) { + string entry = Marshal.PtrToStringUni(cursor); + cursor = IntPtr.Add(cursor, (entry.Length + 1) * 2); + int separator = entry.IndexOf('='); + if (separator > 0) Environment.SetEnvironmentVariable(entry.Substring(0, separator), entry.Substring(separator + 1)); + } + } finally { if (!DestroyEnvironmentBlock(block)) throw new Win32Exception(Marshal.GetLastWin32Error()); } + } + } +} +'@ +[HEICStandardUserEnvironment]::Apply() +$env:PATH = (Split-Path -Parent $config.Go) + ';' + $env:PATH +$profileDirectory = [Environment]::GetFolderPath([Environment+SpecialFolder]::LocalApplicationData) +if (-not $profileDirectory) { throw 'The standard user has no accessible local application-data folder.' } +Write-Output "Standard-user local application data: $profileDirectory" $env:GOCACHE = Join-Path $config.Work 'go-cache' $env:GOPATH = Join-Path $config.Work 'go-path' $env:CGO_ENABLED = '0' diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 index 713fb339..a49e249c 100644 --- a/packaging/heic/qualify-windows.ps1 +++ b/packaging/heic/qualify-windows.ps1 @@ -52,7 +52,7 @@ try { $manifestPath = Join-Path $stage 'AppxManifest.xml' [xml]$manifest = Get-Content -LiteralPath $manifestPath -Raw $publisher = 'CN=PicFetch HEIC Qualification ' + $identity - $packageName = 'PicFetch.HEICQualification.' + $identity + $packageName = 'PicFetch.HEIC.' + $identity $manifest.Package.Identity.SetAttribute('Name', $packageName) $manifest.Package.Identity.SetAttribute('Publisher', $publisher) $probe = $manifest.Package.Applications.Application.CloneNode($true) diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index 83915647..e222ea06 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -185,3 +185,44 @@ Store-only policy test correctly skips in this non-Store suite. Raw events are Final formatting, Qodana exclusion, provenance and native import checks pass. The import check needed ordinary Go module-cache access after a sandboxed cache write failed; rerun with that access passed without policy/source changes. + +## PR review loop — f41fe63 + +Ronin committed/pushed the implementation as `f41fe630158baa1c65f8dc75122c332dcddd4a1d` +and resumed the requested CI/Codex loop on September 16. The working tree was +clean on entry. Fix commits, pushes, review requests/replies and dispositions +follow the repository's invoked review-loop authorization; no merge/release is +included. One read-only scout task located existing Linux CGo setup while the +lead investigated provenance. All fixes and reviews remain lead-owned. + +CI 35103830559 passes both macOS native architectures, ordinary Windows, the +Store executable build, the non-UI race partition and UI shards 1/3. The remaining +failures are addressed in this first correction, pending a fresh run: + +- Regenerate provenance after committed `SplitSeq` build-tool cleanup. The guest + artifact is unchanged and both provenance/import checks pass locally. +- Keep Linux helper/analysis guards no-CGo, but enable CGo for the separately + executed GUI inventory/fixture and install the existing X11/C build inputs. + The runner regression failed for both GUI command modes before correction. +- The restart test selected another viewer's Settings surface. An owned prior + window reproduces the exact failure; selecting only the window opened by the + tested viewer fixes it. Focused UI race tests pass (2.947 s). +- The disposable standard account passes SID/nonadministrator checks, but + known-folder lookup is denied. The fixture now imports its loaded user's + environment with CreateEnvironmentBlock before native activation, replacing + inherited privileged-runner profile values. No application fallback or + permission-query relaxation is added; native CI must qualify the correction. +- Shorten the disposable MSIX identity to fit the manifest's 50-character limit. +- Qodana's final post-suppression SARIF has one confirmed unused test function; + remove both platform variants now that OpenInstalled owns helper preparation. + Start-report warnings are not the final result set. + +Focused nativeguards/client tests pass, along with changed-file GoLand checks. +The three mixed-receiver IDE warnings in the runner are fixed. Two intentional +local test-setup duplication notices remain documented under their existing exact +Qodana exclusions; no production warning is suppressed. GoLand build reports +success but cannot collect detailed build messages in this project. + +Docker is available again and its canonical shard check passes: 691 runnables, +three shards. The daemon is Linux/aarch64; the complete native AMD64 gate correctly +refuses emulation. Full race verification stays in hosted native CI. diff --git a/scripts/heicguest/decoder.json b/scripts/heicguest/decoder.json index 771134c7..bc9ef658 100644 --- a/scripts/heicguest/decoder.json +++ b/scripts/heicguest/decoder.json @@ -21,7 +21,7 @@ "internal/heicdecode/request.go": "39bd8fe6af5e228681e0c819e82159c3ecb1c5109ae56513fe9b5faa6ff75ed3", "internal/heicdecode/worker/decoder.wasm": "cdaf9af71d8a8624c620a2ca8f90865a00a2d2dc228bb8bdb058564726d769ed", "scripts/heicbuild/fixture.go": "dd205a231c22f464ff86a5d922e1ee95bdca03f1e4b1ac864439cf4fdea9b512", - "scripts/heicbuild/main.go": "2ff88583a41a65c30101db37e437b3a870aa44f68415a3284ca86e171d289e75", + "scripts/heicbuild/main.go": "ef335b3738f657b1b88012c0eae85477a48150667e6fe1a229d28adc3a389ecf", "scripts/heicbuild/source.go": "fa21510be758ac3a4634e0db028f0920747c9efb05bc903c2c4429bed0d46857", "scripts/heicbuild/testdata/README.md": "bad7e52474096919ae14e0d82cddb5bc73b79434473f9402c1c82ada91ae19f5", "scripts/heicbuild/testdata/alpha.heic": "130c9f6c9a9bdefe2fc4b17427ff37b78423f2d3a935f82cfe55a9782f6d0f51", diff --git a/scripts/nativeguards/main.go b/scripts/nativeguards/main.go index c2131313..18c0e33a 100644 --- a/scripts/nativeguards/main.go +++ b/scripts/nativeguards/main.go @@ -201,6 +201,20 @@ func validateEvents(input io.Reader, required []guard, log io.Writer) error { return errors.Join(failures...) } +func (s *suite) command(ctx context.Context, args []string) *exec.Cmd { + cmd := exec.CommandContext(ctx, "go", args...) + if s.name == "heic-linux" { + // Keep the helper qualification on its pure Go runtime. Only the + // separately executed GUI fixture needs the existing C/X11 adapters. + cgo := "0" + if slices.Contains(args, "./internal/ui") { + cgo = "1" + } + cmd.Env = append(os.Environ(), "CGO_ENABLED="+cgo) + } + return cmd +} + func run(args []string, stdout, stderr io.Writer) error { flags := flag.NewFlagSet("nativeguards", flag.ContinueOnError) flags.SetOutput(stderr) @@ -226,11 +240,7 @@ func run(args []string, stdout, stderr io.Writer) error { ctx, cancel := context.WithTimeout(context.Background(), 40*time.Minute) defer cancel() execute := func(ctx context.Context, args []string, out io.Writer) error { - cmd := exec.CommandContext(ctx, "go", args...) - if s.name == "heic-linux" { - // The standalone Linux helper policy supports the pure Go runtime. - cmd.Env = append(os.Environ(), "CGO_ENABLED=0") - } + cmd := s.command(ctx, args) cmd.Stdout = out cmd.Stderr = stderr return cmd.Run() diff --git a/scripts/nativeguards/main_test.go b/scripts/nativeguards/main_test.go index 6ddb31b0..343daa27 100644 --- a/scripts/nativeguards/main_test.go +++ b/scripts/nativeguards/main_test.go @@ -222,3 +222,25 @@ func TestNativeApplicationGuardRunsWithHelperSuite(t *testing.T) { t.Fatalf("native runner lost helper or application coverage: %v", calls) } } + +func TestLinuxApplicationUsesCGOWithoutChangingHelperBuild(t *testing.T) { + t.Setenv("CGO_ENABLED", "unexpected") + s, err := suiteFor("heic-linux", "linux") + if err != nil { + t.Fatal(err) + } + for _, pkg := range []string{"./internal/ui", "./internal/heicdecode/client", "./internal/heicdecode/worker", "./internal/similarity"} { + for _, flags := range [][]string{{"-list", "."}, {"-json", "-run", "TestNative"}} { + command := s.command(context.Background(), append(s.testArgs(flags...), pkg)) + want := "CGO_ENABLED=0" + if pkg == "./internal/ui" { + want = "CGO_ENABLED=1" + } + for _, value := range command.Environ() { + if strings.HasPrefix(value, "CGO_ENABLED=") && value != want { + t.Errorf("%s %v: %s, want %s", pkg, flags, value, want) + } + } + } + } +} diff --git a/todos.md b/todos.md index 19a26037..69807593 100644 --- a/todos.md +++ b/todos.md @@ -106,8 +106,9 @@ after an enabled preference and validated installed package. qualification. Implementation is in progress in the [active opt-in plan](plans/2026-09-16-experimental-heic-opt-in.md). Settings/restart, admission, Explorer and private staging are implemented; focused race tests, inspections, security checks and native macOS arm64 - application-constructor/analysis evidence pass. Native Windows/MSIX, remaining architectures, complete CI and fresh - reviews remain unverified. See the [activation record](docs/heic/experimental-opt-in.md). + application-constructor/analysis evidence pass. Both macOS architectures now pass native CI; Linux runner setup, the + disposable Windows environment and test-MSIX identity are being corrected. + Their qualification, complete CI and fresh reviews remain open. See the [activation record](docs/heic/experimental-opt-in.md). The September 16 [history reconciliation](docs/heic/history-reconciliation.md) accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files From 9ea4ddebac8af07884e9a49d972b56a7e2e95ec5 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 16:15:49 +0200 Subject: [PATCH 21/30] Fix Linux native analysis setup and Windows qualification exit status --- docs/heic/experimental-opt-in.md | 14 +++++-- packaging/heic/qualify-windows.ps1 | 3 ++ plans/2026-09-16-experimental-heic-opt-in.md | 44 ++++++++++++++++++-- scripts/nativeguards/main.go | 11 +++-- scripts/nativeguards/main_test.go | 10 +++-- todos.md | 10 +++-- 6 files changed, 75 insertions(+), 17 deletions(-) diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index a6f51580..04f07213 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -76,6 +76,11 @@ and removes its test package. The parent removes its account, owned workspace and certificate/trust entry. Neither script is called by PicFetch. CI runs both architectures for standalone and installed-MSIX scenarios. Runtime or permission query failures fail the gate; there is no successful skip or elevated substitute. +At `085d185`, both standard-user standalone event streams pass. Both installed +MSIX jobs reach package installation but activation returns 0x80070520: the +alternate-user process has a loaded profile, not an interactive Windows logon. +Microsoft requires an [interactive user for packaged application execution](https://learn.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-debug). +That installed-MSIX gate remains blocked pending a qualified execution session. For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, `Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` and architecture-matched `Dependency`. Provision only disposable test state. @@ -91,10 +96,11 @@ Store identity; cross-compilation is not that evidence. Focused preference/Settings/admission/Explorer and helper-publication tests pass locally. Native macOS arm64 application-constructor activation passes with the -unchanged helper entitlement and finite limits. Windows amd64/arm64 test binaries -compile. Both macOS architectures pass the native CI constructor/analysis guards at -`f41fe63`. Native Windows, installed-MSIX and Linux qualification remain open -while CI fixture corrections are verified. Production GUI +unchanged helper entitlement and finite limits. Both macOS architectures and +both standard-user Windows event streams pass the native constructor/analysis +guards at `085d185`. All Linux race partitions pass at that checkpoint. Native +Linux and the Windows wrapper corrections still require a fresh CI run; +installed-MSIX activation remains blocked as described above. Production GUI smoke tests remain distinct from the test-driver fixture. See the plan for exact commands, recorded red/green results and inspections as they complete. diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 index a49e249c..f4db7e71 100644 --- a/packaging/heic/qualify-windows.ps1 +++ b/packaging/heic/qualify-windows.ps1 @@ -118,3 +118,6 @@ try { } } } +# Robocopy's successful "files copied" status is nonzero. Do not let that +# stale native-command status fail GitHub's wrapper after all checks/cleanup. +exit 0 diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index e222ea06..27b68cf7 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -70,9 +70,9 @@ a recorded bounded question; no concurrent code ownership overlaps. | 01 | Real-admission consumer red: unsupported scan never began sort; green imaging/filescan and direct/folder/sibling/session/Favorite UI cases | Implemented; final gate pending | | 02 | Red: missing Experimental tab/default activation; green preference and real-checkbox separate-lifetime tests. Later red: stale open Settings; green live status update | Implemented; final gate pending | | 03 | Red: active HEIC choices absent and saved rule rejected; green Explorer real-dialog save/rename and source consumers; native successful analysis and two retained preview queries pass, missing-owner negative control fails as expected | Implemented; final gate pending | -| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests compile on both architectures | Native Windows execution unverified | -| 05, 08 | Standard-user provisioning and real installed-MSIX activation fixtures/CI added. Source installation bytes/ACLs checked; real package identity and exact provisioned user required | Native execution and PowerShell runtime unverified | -| 06 | Native macOS arm64 signed application-constructor fixture passed; real HEIC decode, restart, cancellation and shutdown | Intel and production GUI smoke unverified | +| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests pass natively on both architectures at 085d185 | Fresh final-commit qualification pending | +| 05, 08 | Standard-user standalone guards pass on both architectures at 085d185. Disposable signed MSIX installs, but activation fails with 0x80070520 in the alternate-user session | Installed-MSIX qualification blocked; wrapper exit correction pending | +| 06 | Both native macOS architectures pass signed application-constructor and analysis guards at 085d185; real HEIC decode, restart, cancellation and shutdown | Fresh final-commit qualification and production GUI smoke pending | | 07 | Linux native target now requires application fixture in addition to helper/seccomp/resource suite | Native execution unverified | | 09 | Focused package race suite and make verify-build pass. Initial IDE batch: 47 files; only three weak warnings (one redundant type fixed; two test duplication reports already excluded by exact Qodana paths). English/German light/dark, Cache/Store layout matrix rendered; German overflow seen red and default widened | Native matrix, complete CI and fresh reviews pending | @@ -226,3 +226,41 @@ success but cannot collect detailed build messages in this project. Docker is available again and its canonical shard check passes: 691 runnables, three shards. The daemon is Linux/aarch64; the complete native AMD64 gate correctly refuses emulation. Full race verification stays in hosted native CI. + +## PR review loop — 085d185 + +CI 35105325751 passes validation, every Linux race partition (including the +previously failing Settings shard), ordinary Windows, the Store executable +build and both native macOS architectures. Both standard-user Windows native +event streams contain all required passes and no failed events, including the +permission query, AppContainer/job checks, concurrent staging, native application +activation and analysis. Their parent jobs report failure only because GitHub's +PowerShell wrapper propagates Robocopy's successful copy status of 1. An explicit +success exit after all checks and cleanup corrects that wrapper; exceptions still +fail before reaching it. + +Both Linux native inventories expose another CGo consumer: similarity's test +fixtures import the desktop stubs. The runner regression first failed for its +inventory and execution commands, then passed after separating its complete +suite with CGo enabled. The helper/client/worker suites retain CGO_ENABLED=0. +The focused nativeguards package passes; Linux Docker compilation and the +analysis-owner regression pass with heicnative (0.403 s). This emulated check +does not qualify native seccomp or resource controls. + +Both installed-MSIX jobs now pack, sign and install successfully for the actual +standard account, but IApplicationActivationManager returns 0x80070520 (no logon +session). Microsoft documents that a [packaged application runs as an interactive +user](https://learn.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-debug). +The loaded alternate-user profile is not proof of an interactive Windows logon. +Installed activation remains a failed gate; no elevated/debug-token substitute +or successful skip is accepted. A fifth bounded read-only scout task checks +Microsoft's documented direct executable launch semantics while the lead owns +the fixture decision and other fixes; it reuses the existing scout and changes +no files. + +Qodana's final post-suppression SARIF at 085d185 contains zero findings. Codex's +security report for that commit says no security issues; its code review is +still running. CodeQL's previous two results are existing dismissed false +positives, revalidated against the current exact-name archive admission and +checked integer conversion; no open alerts were returned. Current-head CodeQL +results and all final-head reviews must still be inspected before acceptance. diff --git a/scripts/nativeguards/main.go b/scripts/nativeguards/main.go index 18c0e33a..5cb4d046 100644 --- a/scripts/nativeguards/main.go +++ b/scripts/nativeguards/main.go @@ -90,6 +90,11 @@ func suiteFor(name, hostOS string) (suite, error) { s.require("internal/ui", "TestNativePackagedHEICActivation") s.require("internal/similarity", "TestNativeHEICAnalysisPixels") s.focused = map[string]string{"./internal/ui": "^TestNativePackagedHEICActivation$"} + if name == "heic-linux" { + // Analysis tests import desktop stubs. Run their complete suite with + // CGo separately from the standalone helper's pure Go tests. + s.focused["./internal/similarity"] = "." + } } if s.goos != "" && s.goos != hostOS { return suite{}, fmt.Errorf("suite %s requires native %s, running on %s", name, s.goos, hostOS) @@ -204,10 +209,10 @@ func validateEvents(input io.Reader, required []guard, log io.Writer) error { func (s *suite) command(ctx context.Context, args []string) *exec.Cmd { cmd := exec.CommandContext(ctx, "go", args...) if s.name == "heic-linux" { - // Keep the helper qualification on its pure Go runtime. Only the - // separately executed GUI fixture needs the existing C/X11 adapters. + // Keep the helper qualification on its pure Go runtime. The separately + // executed application tests need the existing C/X11 adapters. cgo := "0" - if slices.Contains(args, "./internal/ui") { + if slices.Contains(args, "./internal/ui") || slices.Contains(args, "./internal/similarity") { cgo = "1" } cmd.Env = append(os.Environ(), "CGO_ENABLED="+cgo) diff --git a/scripts/nativeguards/main_test.go b/scripts/nativeguards/main_test.go index 343daa27..9f98b568 100644 --- a/scripts/nativeguards/main_test.go +++ b/scripts/nativeguards/main_test.go @@ -207,19 +207,21 @@ func TestNativeApplicationGuardRunsWithHelperSuite(t *testing.T) { if err = runSuite(context.Background(), s, execute, io.Discard, io.Discard); err != nil { t.Fatal(err) } - var helper, application bool + var helper, application, analysis bool for _, args := range calls { if slices.Contains(args, "-list") { continue } if slices.Contains(args, "./internal/ui") { application = slices.Contains(args, "-run") && slices.Contains(args, "^TestNativePackagedHEICActivation$") + } else if slices.Contains(args, "./internal/similarity") { + analysis = slices.Contains(args, "-run") && slices.Contains(args, ".") && !slices.Contains(args, "./internal/heicdecode/client") } else { helper = !slices.Contains(args, "-run") } } - if !helper || !application { - t.Fatalf("native runner lost helper or application coverage: %v", calls) + if !helper || !application || !analysis { + t.Fatalf("native runner lost helper, application or analysis coverage: %v", calls) } } @@ -233,7 +235,7 @@ func TestLinuxApplicationUsesCGOWithoutChangingHelperBuild(t *testing.T) { for _, flags := range [][]string{{"-list", "."}, {"-json", "-run", "TestNative"}} { command := s.command(context.Background(), append(s.testArgs(flags...), pkg)) want := "CGO_ENABLED=0" - if pkg == "./internal/ui" { + if pkg == "./internal/ui" || pkg == "./internal/similarity" { want = "CGO_ENABLED=1" } for _, value := range command.Environ() { diff --git a/todos.md b/todos.md index 69807593..25926c98 100644 --- a/todos.md +++ b/todos.md @@ -106,9 +106,13 @@ after an enabled preference and validated installed package. qualification. Implementation is in progress in the [active opt-in plan](plans/2026-09-16-experimental-heic-opt-in.md). Settings/restart, admission, Explorer and private staging are implemented; focused race tests, inspections, security checks and native macOS arm64 - application-constructor/analysis evidence pass. Both macOS architectures now pass native CI; Linux runner setup, the - disposable Windows environment and test-MSIX identity are being corrected. - Their qualification, complete CI and fresh reviews remain open. See the [activation record](docs/heic/experimental-opt-in.md). + application-constructor/analysis evidence pass. At `085d185`, both macOS + architectures and all Linux race shards pass. Both standard-user Windows + event streams pass, including permission queries and staging; the parent exit + status and Linux analysis-fixture CGo setup are being corrected. Installed + MSIX succeeds but activation fails without an interactive logon session. + Qodana reports zero findings and security review is clean at that checkpoint. + Complete native CI and final-head reviews remain open. See the [activation record](docs/heic/experimental-opt-in.md). The September 16 [history reconciliation](docs/heic/history-reconciliation.md) accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files From 4aca7bef9a1c9f7ffbcfae0a982d93dea17e9e54 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 16:39:42 +0200 Subject: [PATCH 22/30] Preserve live HEIC input limits and launch installed MSIX fixtures directly --- docs/heic/experimental-opt-in.md | 23 ++++++--- internal/ui/images.go | 4 +- internal/ui/images_native_test.go | 40 ++++++++++++++- internal/ui/images_native_windows_test.go | 2 +- packaging/heic/qualify-windows-child.ps1 | 30 ++++------- plans/2026-09-16-experimental-heic-opt-in.md | 52 ++++++++++++++++++++ scripts/nativeguards/main_test.go | 2 +- todos.md | 15 +++--- 8 files changed, 130 insertions(+), 38 deletions(-) diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index 04f07213..877d8e32 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -20,6 +20,9 @@ an explanation in Experimental. Ordinary image formats continue to work. No alternative decoder, runtime download, elevation prompt or relaxed sandbox is available as a fallback. Package-level format queries and OS associations remain unchanged. Saved Explorer HEIC rules remain editable when HEIC is disabled. +The live file-size setting applies to each new read through that reader. The +shared owner's fixed 64 MiB HEIC input ceiling still bounds every request, even +when the user chooses a higher limit for ordinary formats. Development builds need the complete helper package. `go run .` or copying only the main executable does not supply it. On macOS use `make package-mac`: the @@ -60,8 +63,9 @@ viewing, cancellation and shutdown. Fyne's test driver supplies the surface; this is application-constructor/package-boundary evidence, not a production GUI smoke test. The installed-MSIX entry is `TestNativeInstalledHEICActivation`, compiled with `heicnative,microsoftstore` alongside the actual Store executable. -Windows activates its declared test application through -[IApplicationActivationManager](https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-iapplicationactivationmanager). +The fixture launches the declared test executable directly from its installed +WindowsApps path. Windows can resolve package identity during this ordinary +process launch, as described by a [Microsoft Terminal maintainer](https://github.com/microsoft/terminal/discussions/20060). It requires actual package identity, Store-managed behavior, a nonadministrator token and unchanged installed helper bytes/ACLs. @@ -77,10 +81,12 @@ and certificate/trust entry. Neither script is called by PicFetch. CI runs both architectures for standalone and installed-MSIX scenarios. Runtime or permission query failures fail the gate; there is no successful skip or elevated substitute. At `085d185`, both standard-user standalone event streams pass. Both installed -MSIX jobs reach package installation but activation returns 0x80070520: the -alternate-user process has a loaded profile, not an interactive Windows logon. +MSIX jobs reach package installation but IApplicationActivationManager returns +0x80070520 for the alternate-user process with its loaded profile. Microsoft requires an [interactive user for packaged application execution](https://learn.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-debug). -That installed-MSIX gate remains blocked pending a qualified execution session. +The direct-launch fixture must establish actual package identity and pass every +existing guard on both architectures before this gate is qualified; otherwise +an interactive standard-user test environment remains necessary. For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, `Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` and architecture-matched `Dependency`. Provision only disposable test state. @@ -98,9 +104,10 @@ Focused preference/Settings/admission/Explorer and helper-publication tests pass locally. Native macOS arm64 application-constructor activation passes with the unchanged helper entitlement and finite limits. Both macOS architectures and both standard-user Windows event streams pass the native constructor/analysis -guards at `085d185`. All Linux race partitions pass at that checkpoint. Native -Linux and the Windows wrapper corrections still require a fresh CI run; -installed-MSIX activation remains blocked as described above. Production GUI +guards at `085d185`. The Linux and Windows runner corrections pass natively on +both architectures at `9ea4dde`, along with all Linux race partitions. The live +file-size regression passes natively on macOS arm64; fresh cross-platform CI +and installed-MSIX activation remain outstanding as described above. Production GUI smoke tests remain distinct from the test-driver fixture. See the plan for exact commands, recorded red/green results and inspections as they complete. diff --git a/internal/ui/images.go b/internal/ui/images.go index f825339e..65159390 100644 --- a/internal/ui/images.go +++ b/internal/ui/images.go @@ -21,7 +21,9 @@ func installedImageServices(prefs preferences.State, executable, privateDir stri if !prefs.ExperimentalHEIC { return imageServices{} } - owner, err := heicclient.OpenInstalled(context.Background(), executable, privateDir, heicdecode.DefaultLimits(int64(prefs.MaxFileSizeMB)*1024*1024)) + // Readers apply the current file-size setting to each request. Keep the + // shared owner's hard ceiling independent of that live preference. + owner, err := heicclient.OpenInstalled(context.Background(), executable, privateDir, heicdecode.DefaultLimits(0)) if err != nil { return imageServices{startupError: err} } diff --git a/internal/ui/images_native_test.go b/internal/ui/images_native_test.go index 7f71d4a3..14f8c163 100644 --- a/internal/ui/images_native_test.go +++ b/internal/ui/images_native_test.go @@ -5,6 +5,7 @@ package ui import ( "context" "crypto/sha256" + "encoding/binary" "encoding/hex" "errors" "fmt" @@ -14,6 +15,7 @@ import ( "os/exec" "path/filepath" "runtime" + "slices" "testing" "time" @@ -24,6 +26,7 @@ import ( "github.com/frathe/picfetch/internal/distribution" "github.com/frathe/picfetch/internal/heicdecode" heicclient "github.com/frathe/picfetch/internal/heicdecode/client" + "github.com/frathe/picfetch/internal/imaging" "github.com/frathe/picfetch/internal/preferences" "github.com/frathe/picfetch/internal/uitest" ) @@ -54,7 +57,7 @@ func TestNativePackagedHEICActivation(t *testing.T) { before := testApp testApp = nativeHEICApp{App: before, cache: nativeHEICCache{Cache: before.Cache(), root: storage.NewFileURI(t.TempDir())}} t.Cleanup(func() { testApp = before; fyne.SetCurrentApp(before) }) - preferences.Save(testApp, preferences.State{}) + preferences.Save(testApp, preferences.State{MaxFileSizeMB: 1}) uri := storage.NewFileURI(filepath.Join(t.TempDir(), "owned.heic")) fixture, err := os.ReadFile(os.Getenv("PICFETCH_HEIC_ACTIVATION_FIXTURE")) if err != nil { @@ -100,6 +103,41 @@ func TestNativePackagedHEICActivation(t *testing.T) { if !v.grid.Cached(uri) || !v.grid.Cached(heif) { t.Fatal("native HEIC did not reach grid previews") } + t.Run("live file-size limit", func(t *testing.T) { + // A valid free-space box grows the owned image above the initial + // one-MiB preference without changing its decoded pixels. + free := make([]byte, 1024*1024) + binary.BigEndian.PutUint32(free, uint32(len(free))) + copy(free[4:], "free") + large := storage.NewFileURI(uitest.WriteTempFile(t, "larger.heic", append(slices.Clone(fixture), free...))) + owner := v.images.owner + for _, reader := range []imaging.Reader{v.images.foreground, v.images.background} { + v.SetMaxFileSizeMB(1) + var tooLarge *imaging.InputTooLargeError + if _, err := reader.Read(context.Background(), large); !errors.As(err, &tooLarge) { + t.Fatalf("lowered live limit admitted the image: %v", err) + } + v.SetMaxFileSizeMB(2) + source, err := reader.Read(context.Background(), large) + if err != nil { + t.Fatalf("raised live limit still rejected the image: %v", err) + } + if source.Bounds().Dx() != 16 || source.Bounds().Dy() != 16 || v.images.owner != owner { + t.Fatal("live limit changed native pixels or replaced the shared owner") + } + } + v.SetMaxFileSizeMB(128) + checked := errors.New("input ceiling checked") + _, err := owner.Do(context.Background(), heicdecode.Decode, func(_ context.Context, maxBytes int64) ([]byte, error) { + if maxBytes != 64*1024*1024 { + t.Errorf("native hard input ceiling changed: %d", maxBytes) + } + return nil, checked + }) + if !errors.Is(err, checked) { + t.Fatalf("native hard input ceiling was not checked: %v", err) + } + }) entered, done := make(chan struct{}), make(chan error, 1) ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/internal/ui/images_native_windows_test.go b/internal/ui/images_native_windows_test.go index 912b908c..38a95c5a 100644 --- a/internal/ui/images_native_windows_test.go +++ b/internal/ui/images_native_windows_test.go @@ -79,7 +79,7 @@ func preserveNativeHEICInstallation(t *testing.T, helper string) func() { } // The installed test package declares this probe as a separate application. -// Windows activates that application through its normal launch contract. +// Windows launches its installed executable with the package's real identity. func TestNativeInstalledHEICActivation(t *testing.T) { executable, err := os.Executable() if err != nil { diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 index 9075d12d..c3460c76 100644 --- a/packaging/heic/qualify-windows-child.ps1 +++ b/packaging/heic/qualify-windows-child.ps1 @@ -58,26 +58,16 @@ try { $package = Get-AppxPackage -Name $config.PackageName if (-not $package) { throw 'The test-MSIX was not installed for the standard user.' } $package | Format-List Name, PackageFullName, PackageFamilyName, InstallLocation, Architecture - Add-Type -TypeDefinition @' -using System; -using System.Runtime.InteropServices; -[ComImport, Guid("2E941141-7F97-4756-BA1D-9DECDE894A3D"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] -interface IHEICApplicationActivationManager { - [PreserveSig] int ActivateApplication([MarshalAs(UnmanagedType.LPWStr)] string app, [MarshalAs(UnmanagedType.LPWStr)] string args, uint options, out uint processId); -} -public static class HEICInstalledActivation { - public static uint Start(string app) { - var type = Type.GetTypeFromCLSID(new Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")); - var manager = (IHEICApplicationActivationManager)Activator.CreateInstance(type); - uint processId; - int result = manager.ActivateApplication(app, "-test.run=^TestNativeInstalledHEICActivation$ -test.v -test.timeout=4m", 0, out processId); - Marshal.ThrowExceptionForHR(result); - return processId; - } -} -'@ - $activationPID = [HEICInstalledActivation]::Start($package.PackageFamilyName + '!HEICQualification') - $process = [System.Diagnostics.Process]::GetProcessById($activationPID) + # Normal installed executable launch lets Windows resolve package identity. + # The probe requires actual identity and the exact standard-user token; + # running an unpackaged copy cannot satisfy the installed-MSIX guard. + $start = [System.Diagnostics.ProcessStartInfo]::new() + $start.FileName = Join-Path $package.InstallLocation 'heic-activation.test.exe' + $start.Arguments = '-test.run=^TestNativeInstalledHEICActivation$ -test.v -test.timeout=4m' + $start.WorkingDirectory = $package.InstallLocation + $start.UseShellExecute = $false + $process = [System.Diagnostics.Process]::Start($start) + if (-not $process) { throw 'Windows did not start the installed test application.' } if (-not $process.WaitForExit(300000)) { $process.Kill(); throw 'Installed activation did not terminate within five minutes.' } $resultPath = Join-Path $config.Evidence 'installed-msix.json' if (-not (Test-Path -LiteralPath $resultPath)) { throw 'Installed activation did not produce its completion record.' } diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index 27b68cf7..75cd1f55 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -264,3 +264,55 @@ still running. CodeQL's previous two results are existing dismissed false positives, revalidated against the current exact-name archive admission and checked integer conversion; no open alerts were returned. Current-head CodeQL results and all final-head reviews must still be inspected before acceptance. + +### Installed executable launch follow-up + +The native installed-MSIX activation failure is the red evidence for a bounded +fixture correction. A [Microsoft Terminal maintainer's explanation](https://github.com/microsoft/terminal/discussions/20060) +establishes that ordinary CreateProcess on an installed WindowsApps executable +can resolve its package identity. It does not guarantee success in our +alternate-user session. The fixture now uses that ordinary launch path, leaving +the declared test application and every runtime package identity, exact user, +nonadministrator, Store policy, installed-byte/ACL and native-helper assertion +intact. No debug activation, access-control changes or fake identity is used. +Both native architectures must pass; a launch or permission failure still blocks +qualification. The existing child-script registration guard now names the test +entry point instead of the removed local COM wrapper class. No production code +changes. + +The 085d185 Go CodeQL analysis could not be processed (HTTP 422, analysis +1786545678, rules_count 0, Unknown Error), despite its successful workflow. This +is unverified, not an empty clean analysis; a fresh run must produce a readable +result set. No repository self-hosted runners are configured. + +### Code review disposition and native progress + +Codex's code review of 085d185 reports one confirmed P2: startup permanently +captured a low file-size preference in the immutable HEIC owner. The native +application regression starts at 1 MiB and uses the owned image with a valid +free-space box to exceed that limit. Raising to 2 MiB failed with the original +1 MiB error before the fix. Startup now uses the fixed hard HEIC limits; +imaging.Reader already applies the current user limit on each new read. +Foreground and background reads pass both increase/decrease cases through the +same owner, and a 128 MiB setting still grants at most 64 MiB to input. +The signed native macOS application regression passes (6.913 s). Evidence: +`native-live-input-{red,green}.log` in the opt-in evidence directory. No new +top-level test, Qodana scope or shard entry is introduced. Changed-code GoLand +inspection is clear, including weak warnings. + +At 9ea4dde, both Linux and standard-user Windows native jobs pass, as do all +Linux race partitions, ordinary Windows and validation. Qodana's final SARIF +again has zero findings. CodeQL Go processing recovered (analysis 1786683225): +34 rules and the same two existing dismissed false positives; Actions has 17 +rules and zero results. Installed-MSIX qualification remains pending the +direct-launch fixture. The fresh code/security review must cover the final +fix commit after the P2 thread is answered and resolved. + +The final 9ea4dde CI run (35107489388) completes with every job passing except +installed-MSIX activation on amd64/arm64, both still reporting 0x80070520 before +the direct-launch correction. Focused UI race regressions for the new fix pass +(5.872 s); formatting is clean. The correction and direct-launch fixture are +staged, but the configured SSH signer refused the commit on September 16 at +14:26 UTC (`commit.gpgsign=true`, agent refused operation). Signing remains +enabled. Publication, the P2 reply/resolution and fresh final-head reviews await +the user's signing-agent unlock; no new commit or native MSIX success is claimed. diff --git a/scripts/nativeguards/main_test.go b/scripts/nativeguards/main_test.go index 9f98b568..0da2ef85 100644 --- a/scripts/nativeguards/main_test.go +++ b/scripts/nativeguards/main_test.go @@ -175,7 +175,7 @@ func TestNativeCIExecutesAndRetainsEveryDeclaredSuite(t *testing.T) { t.Errorf("CI omits Windows qualification contract %q", required) } } - if !strings.Contains(string(child), "./scripts/nativeguards -suite heic-windows -capture") || !strings.Contains(string(child), "HEICInstalledActivation") { + if !strings.Contains(string(child), "./scripts/nativeguards -suite heic-windows -capture") || !strings.Contains(string(child), "TestNativeInstalledHEICActivation") { t.Fatal("standard-user runner lost native or installed activation") } if !strings.Contains(text, "native-guards-${{ runner.os }}") || !strings.Contains(text, "if: always()") { diff --git a/todos.md b/todos.md index 25926c98..41a1e87b 100644 --- a/todos.md +++ b/todos.md @@ -106,12 +106,15 @@ after an enabled preference and validated installed package. qualification. Implementation is in progress in the [active opt-in plan](plans/2026-09-16-experimental-heic-opt-in.md). Settings/restart, admission, Explorer and private staging are implemented; focused race tests, inspections, security checks and native macOS arm64 - application-constructor/analysis evidence pass. At `085d185`, both macOS - architectures and all Linux race shards pass. Both standard-user Windows - event streams pass, including permission queries and staging; the parent exit - status and Linux analysis-fixture CGo setup are being corrected. Installed - MSIX succeeds but activation fails without an interactive logon session. - Qodana reports zero findings and security review is clean at that checkpoint. + application-constructor/analysis evidence pass. At `9ea4dde`, both Linux and + standard-user Windows architectures and all Linux race shards pass; both + macOS architectures passed the preceding checkpoint. Installed MSIX succeeds + but COM activation fails in the alternate-user session; ordinary installed + executable launch is being qualified with all identity checks intact. + The confirmed live file-size review finding is fixed with native red/green + coverage. Qodana reports zero findings; CodeQL processing recovered with only + its two previously dismissed false positives. Security review is clean at + `085d185`. Complete native CI and final-head reviews remain open. See the [activation record](docs/heic/experimental-opt-in.md). The September 16 [history reconciliation](docs/heic/history-reconciliation.md) From 69fef1ac9080c32601b33b7c9408a797a48baad0 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 16:50:52 +0200 Subject: [PATCH 23/30] Use owned working directory for installed MSIX qualification --- packaging/heic/qualify-windows-child.ps1 | 2 +- plans/2026-09-16-experimental-heic-opt-in.md | 24 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 index c3460c76..74905abe 100644 --- a/packaging/heic/qualify-windows-child.ps1 +++ b/packaging/heic/qualify-windows-child.ps1 @@ -64,7 +64,7 @@ try { $start = [System.Diagnostics.ProcessStartInfo]::new() $start.FileName = Join-Path $package.InstallLocation 'heic-activation.test.exe' $start.Arguments = '-test.run=^TestNativeInstalledHEICActivation$ -test.v -test.timeout=4m' - $start.WorkingDirectory = $package.InstallLocation + $start.WorkingDirectory = $config.Work $start.UseShellExecute = $false $process = [System.Diagnostics.Process]::Start($start) if (-not $process) { throw 'Windows did not start the installed test application.' } diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index 75cd1f55..d19946fa 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -316,3 +316,27 @@ staged, but the configured SSH signer refused the commit on September 16 at 14:26 UTC (`commit.gpgsign=true`, agent refused operation). Signing remains enabled. Publication, the P2 reply/resolution and fresh final-head reviews await the user's signing-agent unlock; no new commit or native MSIX success is claimed. + +## PR review loop — 4aca7be + +Ronin unlocked the signer and authorized retry. The signed fix commit is pushed; +the confirmed P2 thread was answered with red/green evidence and resolved. Fresh +Codex code review reports no findings on 4aca7be; security review is running. +All six standalone native OS/architecture jobs pass, as do all four Linux race +partitions, ordinary Windows, validation and Store executable construction. +Final Qodana SARIF has zero findings. CodeQL Go analysis 1786844866 processes +successfully with the same two dismissed false positives; Actions has zero +results. Raw native artifacts are retained under the opt-in evidence directory. + +Direct installed-MSIX launch still fails before the test process starts: +Access denied. The fixture had selected the protected WindowsApps package as +its current directory. One bounded follow-up starts from its already writable +owned workspace, retaining the absolute installed executable, real identity +and every other guard. This tests whether directory access is the remaining +launcher issue; it is not proof that the alternate-user session is sufficient. +Failed launch or permission checks remain blockers. + +GitHub's separate dynamic AI code-scanning job fails before analysis with a +service error: HTTP 400, "The requested model is not supported." Its log is +`ai-scanning-4aca7be.log`; this is distinct from the passing CodeQL workflow +and requested Codex reviews. No scanner setting or gate is disabled. From 8aa317a0c27ee30133a72ba875cf8d1d9acf97d8 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 17:04:33 +0200 Subject: [PATCH 24/30] Record verified HEIC platforms and remaining MSIX qualification blocker --- ARCHITECTURE.md | 6 ++- THREAT-MODEL.md | 20 ++++++---- docs/heic/experimental-opt-in.md | 35 +++++++++-------- plans/2026-09-16-experimental-heic-opt-in.md | 40 +++++++++++++++++--- todos.md | 23 ++++++----- 5 files changed, 83 insertions(+), 41 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index b8c37274..68d718cd 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -677,8 +677,10 @@ and Wait serialize handle retirement. `profile_windows.go` owns the stable AppContainer profile and explicit read/execute provisioning for a dedicated helper file and its directory, with no inherited ACL grant. Launch does not change ACLs. Native controls and ordinary decoder fixtures are required by the -`heic-windows` amd64/arm64 CI suite. Historical helper results at `ee5cc67` -do not qualify the new standard-user or installed-MSIX activation paths. +`heic-windows` amd64/arm64 CI suite. Standalone standard-user qualification passes +on both architectures at `69fef1a`, including private helper staging and the +loopback permission query. Installed-MSIX activation remains blocked before +the test process starts and requires separate package-context evidence. ### `scripts/heicpackage` diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 42299569..00cfa677 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -18,8 +18,9 @@ vulnerability findings. [ARCHITECTURE.md](ARCHITECTURE.md) is the package map; Experimental Settings opt-in.** Startup validates the executable-derived helper package before constructing an immutable shared capability. Missing/corrupt packages or failed isolation remain unavailable while ordinary viewing works. -Windows private staging, standard-user and installed-MSIX activation are new -paths awaiting native evidence; historical helper results do not qualify them. +Windows private staging and standalone standard-user activation pass native +x64/ARM64 qualification at 69fef1a. Installed-MSIX activation remains blocked +before the test process starts; standalone helper results do not qualify it. Distribution clearance, production signing and broad color/camera qualification remain release gates. See the [activation record](docs/heic/experimental-opt-in.md). The accepted macOS design lacks a hard total native-memory cap; memory pressure @@ -135,7 +136,10 @@ Go memory target remains soft. [Limits](internal/heicdecode/limits.go) permit at most **64 MiB encoded input**, **64 million pixels**, **256,000,000 output bytes**, **64 KiB normalized metadata**, -**4096 diagnostic bytes**, and **60 seconds** per request, including admission. +**4096 diagnostic bytes**, and **60 seconds** per request after admission. +Readers apply the current user file-size limit to each new read, bounded by the +shared owner's fixed 64 MiB ceiling. Raising the live preference cannot raise +that hard HEIC ceiling or replace the owner. The output cap admits at most 32 million NRGBA64 pixels. One shared lane covers the app and its analysis descendants; bounded queues prioritize interactive work without indefinitely starving background requests. Bulk reads wait for admission @@ -147,7 +151,7 @@ trusted installed package. Hashes are not an independent package signature. | Platform | Candidate native helper boundary | | --- | --- | | Linux x64/ARM64 | Thread-synchronized default-deny seccomp, resource limits and a 2 GiB address-space ceiling before input. This is not a physical-RAM/cgroup limit. | -| Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Native CI controls and ordinary decoding pass; distribution and standard-user qualification remain open. | +| Windows x64/ARM64 | Suspended zero-capability AppContainer setup, explicit inherited handles, private Job Object committed-memory/CPU/process limits and kill-on-close. Standalone standard-user native guards pass on both architectures; installed-MSIX and production distribution remain unqualified. | | macOS Intel/Apple Silicon | Separately entitled App Sandbox helper and Hardened Runtime with verified owned file/network denial; helper-only executable-memory entitlement for wazero. No guaranteed hard total native-memory ceiling. | The saved `experimentalHEIC` value describes user intent, separately from the @@ -174,9 +178,11 @@ Windows helper startup supplies only `GOMAXPROCS` and the OS-reported `SystemRoot`/`LOCALAPPDATA`; it does not inherit the parent's environment or search path. Windows redirects the profile directory for the AppContainer. Profile creation uses a bounded per-user/session cross-process mutex. These -startup controls pass native x64/ARM64 CI at `ee5cc67`; they grant no additional -AppContainer capabilities or filesystem rights. Hosted runner results do not -qualify every Windows installation or its ordinary-user firewall API access. +startup controls pass standalone standard-user x64/ARM64 CI at `69fef1a`, including +the launch-time loopback permission query; they grant no additional AppContainer +capabilities or filesystem rights. Hosted runner results do not qualify every +Windows installation. The installed-MSIX test process cannot start in the hosted +alternate-user session, so its package-context behavior remains unverified. Windows can drop blocked loopback traffic instead of returning a permission error. Both parent-owned listeners are positively checked before launch, and diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index 877d8e32..dd97e9e0 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -80,13 +80,16 @@ and removes its test package. The parent removes its account, owned workspace and certificate/trust entry. Neither script is called by PicFetch. CI runs both architectures for standalone and installed-MSIX scenarios. Runtime or permission query failures fail the gate; there is no successful skip or elevated substitute. -At `085d185`, both standard-user standalone event streams pass. Both installed -MSIX jobs reach package installation but IApplicationActivationManager returns -0x80070520 for the alternate-user process with its loaded profile. +At `69fef1a`, standalone standard-user qualification passes on both architectures. +Installed-MSIX activation remains blocked: IApplicationActivationManager returned +0x80070520, and ordinary installed-executable launch returns Access denied with +either the installed directory or the owned writable workspace as its working +directory. Both packages install successfully; their test process never starts. Microsoft requires an [interactive user for packaged application execution](https://learn.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-debug). -The direct-launch fixture must establish actual package identity and pass every -existing guard on both architectures before this gate is qualified; otherwise -an interactive standard-user test environment remains necessary. +Qualification now needs native x64 and ARM64 environments with an interactive +standard-user session. Actual package identity and every existing guard must +pass there before this gate is complete. The hosted alternate-user fixture +does not establish installed Store helper activation, staging or sandbox behavior. For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, `Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` and architecture-matched `Dependency`. Provision only disposable test state. @@ -100,16 +103,16 @@ Store identity; cross-compilation is not that evidence. ## Current verification and remaining gates -Focused preference/Settings/admission/Explorer and helper-publication tests pass -locally. Native macOS arm64 application-constructor activation passes with the -unchanged helper entitlement and finite limits. Both macOS architectures and -both standard-user Windows event streams pass the native constructor/analysis -guards at `085d185`. The Linux and Windows runner corrections pass natively on -both architectures at `9ea4dde`, along with all Linux race partitions. The live -file-size regression passes natively on macOS arm64; fresh cross-platform CI -and installed-MSIX activation remain outstanding as described above. Production GUI -smoke tests remain distinct from the test-driver fixture. See the plan for exact -commands, recorded red/green results and inspections as they complete. +At `69fef1a`, native Linux, macOS and standalone standard-user Windows pass on +both architectures, including packaged startup, the live file-size regression, +analysis and platform sandbox guards. All four Linux race partitions, ordinary +Windows, validation and Store executable construction pass. Installed-MSIX is +the only failing job in CI run 35111412255. Fresh Codex code/security reviews +report no findings; final Qodana SARIF is empty, and CodeQL contains only its two +previously assessed dismissed false positives. GitHub's separate dynamic AI +scanner fails before analysis because its service rejects the configured model. +That scan remains unverified. Production GUI smoke tests remain distinct from +the test-driver fixture. See the plan for exact evidence and remaining gates. All prior sandbox, integrity and resource controls remain. macOS still has the previously accepted absence of a guaranteed total native-memory cap; WASM, diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index d19946fa..b65c58d8 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -1,6 +1,7 @@ # Experimental HEIC opt-in implementation -Date: 2026-09-16. Route: Deep SDD/TDD. Status: in progress. +Date: 2026-09-16. Route: Deep SDD/TDD. Status: implemented; installed-MSIX +qualification and an external AI scan remain blocked. Deliver the accepted [spec](../.scratch/experimental-heic-opt-in/spec.md) through the [nine approved tickets](../.scratch/experimental-heic-opt-in/issues/README.md). @@ -70,11 +71,11 @@ a recorded bounded question; no concurrent code ownership overlaps. | 01 | Real-admission consumer red: unsupported scan never began sort; green imaging/filescan and direct/folder/sibling/session/Favorite UI cases | Implemented; final gate pending | | 02 | Red: missing Experimental tab/default activation; green preference and real-checkbox separate-lifetime tests. Later red: stale open Settings; green live status update | Implemented; final gate pending | | 03 | Red: active HEIC choices absent and saved rule rejected; green Explorer real-dialog save/rename and source consumers; native successful analysis and two retained preview queries pass, missing-owner negative control fails as expected | Implemented; final gate pending | -| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests pass natively on both architectures at 085d185 | Fresh final-commit qualification pending | -| 05, 08 | Standard-user standalone guards pass on both architectures at 085d185. Disposable signed MSIX installs, but activation fails with 0x80070520 in the alternate-user session | Installed-MSIX qualification blocked; wrapper exit correction pending | -| 06 | Both native macOS architectures pass signed application-constructor and analysis guards at 085d185; real HEIC decode, restart, cancellation and shutdown | Fresh final-commit qualification and production GUI smoke pending | -| 07 | Linux native target now requires application fixture in addition to helper/seccomp/resource suite | Native execution unverified | -| 09 | Focused package race suite and make verify-build pass. Initial IDE batch: 47 files; only three weak warnings (one redundant type fixed; two test duplication reports already excluded by exact Qodana paths). English/German light/dark, Cache/Store layout matrix rendered; German overflow seen red and default widened | Native matrix, complete CI and fresh reviews pending | +| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests pass natively on both architectures at 69fef1a | Standalone native qualification passes; installed-MSIX open | +| 05, 08 | Standard-user standalone guards pass on both architectures at 69fef1a. Disposable signed MSIX installs, but both COM and direct activation fail before the test process starts | Installed-MSIX qualification blocked on a suitable interactive standard-user environment | +| 06 | Both native macOS architectures pass signed application-constructor and analysis guards at 69fef1a; real HEIC decode, restart, cancellation and shutdown | Native qualification passes; production GUI smoke remains separate | +| 07 | Both native Linux architectures pass application, analysis, helper/seccomp/resource guards at 69fef1a | Native qualification passes | +| 09 | Complete Linux race partitions and validation pass at 69fef1a. Fresh code/security reviews have no findings; Qodana has zero final results, CodeQL only its two existing dismissed false positives. IDE and sixteen Settings layouts verified | Installed-MSIX and the external GitHub AI scanner remain blocked | Budget: one initial read-only scout; lead implementation and fixes; focused tests during iteration; complete suite once at final gate. No qualification, @@ -340,3 +341,30 @@ GitHub's separate dynamic AI code-scanning job fails before analysis with a service error: HTTP 400, "The requested model is not supported." Its log is `ai-scanning-4aca7be.log`; this is distinct from the passing CodeQL workflow and requested Codex reviews. No scanner setting or gate is disabled. + +## Qualification checkpoint — 69fef1a + +CI run 35111412255 is complete. Every job passes except installed-MSIX activation +on both architectures. The direct launcher also returns Access denied when +started from the owned writable workspace, so the extra working-directory +permission demand was not the blocker. The installed test process never starts; +no package-context helper or sandbox success is claimed. The next qualification +requires native x64/ARM64 environments with interactive standard-user sessions. +All identity/permission checks and the failing gates remain intact. + +Fresh Codex code review (comment 5699569800) and security review (5699579439) +report no findings on 69fef1a. Both prior review threads are resolved. Final +Qodana SARIF has zero findings. CodeQL Go analysis 1786920301 has the same two +previously assessed dismissed false positives; Actions analysis 1786878185 has +zero findings, and the open-alert query is empty. The separate dynamic AI scan +35111413724 fails before analysis with the same unsupported-model service error. + +Evidence is under `.scratch/experimental-heic-opt-in/evidence/`: native artifacts +for all six platform/architecture combinations at 4aca7be, corresponding final +CI runs, `ci-msix-{amd64,arm64}-69fef1a.log`, `qodana-69fef1a.sarif.json`, +`codeql-69fef1a-go.sarif.json`, and `ai-scanning-69fef1a.log`. No broad local race +suite was duplicated. Local Docker remains aarch64; its canonical shard inventory +passes, while full AMD64 verification stays in native CI. Production GUI smoke, +licensing/distribution, production signing and broader camera/color gates remain +separate. This plan stays active because required installed-MSIX qualification +is incomplete; the draft PR is not ready for acceptance. diff --git a/todos.md b/todos.md index 41a1e87b..e5f874d5 100644 --- a/todos.md +++ b/todos.md @@ -106,16 +106,18 @@ after an enabled preference and validated installed package. qualification. Implementation is in progress in the [active opt-in plan](plans/2026-09-16-experimental-heic-opt-in.md). Settings/restart, admission, Explorer and private staging are implemented; focused race tests, inspections, security checks and native macOS arm64 - application-constructor/analysis evidence pass. At `9ea4dde`, both Linux and - standard-user Windows architectures and all Linux race shards pass; both - macOS architectures passed the preceding checkpoint. Installed MSIX succeeds - but COM activation fails in the alternate-user session; ordinary installed - executable launch is being qualified with all identity checks intact. + application-constructor/analysis evidence pass. At `69fef1a`, native Linux, + macOS and standard-user Windows pass on both architectures, and all Linux race + partitions pass. Installed MSIX succeeds, but COM activation and direct launch + both fail before the test application starts, even from a writable workspace. + This requires native x64/ARM64 environments with interactive standard-user + sessions; no suitable repository runner is configured. The confirmed live file-size review finding is fixed with native red/green coverage. Qodana reports zero findings; CodeQL processing recovered with only - its two previously dismissed false positives. Security review is clean at - `085d185`. - Complete native CI and final-head reviews remain open. See the [activation record](docs/heic/experimental-opt-in.md). + its two previously dismissed false positives. Code/security reviews are clean + at `69fef1a`. GitHub's separate AI scanner fails before analysis because its + configured model is unsupported. Installed-MSIX qualification and that external + scan remain open. See the [activation record](docs/heic/experimental-opt-in.md). The September 16 [history reconciliation](docs/heic/history-reconciliation.md) accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files @@ -140,8 +142,9 @@ Remaining qualification: executable-memory permission is required. The compiler succeeds on the ordinary 12MP fixture; the interpreter reaches the finite deadline. - Complete distribution-package, Windows Authenticode/MSIX and upgrade - qualification remain open, including nonadministrator Windows access to the - launch-time loopback configuration query. The released updater drops the new helper and + qualification remain open. Nonadministrator launch-time loopback queries pass + in standalone Windows native CI on both architectures; installed-MSIX execution + is still unqualified. The released updater drops the new helper and deletes staging, leaving an invalid macOS enclosing signature. The first transition requires a complete reinstall or a separately qualified bridge. - [Compatibility evidence](docs/heic/compatibility-2026-09-16.md) covers ordinary From c1b68906cdcc96913fca8fdfa13b11f5ba2e03fa Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 18:11:44 +0200 Subject: [PATCH 25/30] test: qualify HEIC consumers and packaged failure recovery --- .github/testshards/internal-ui.tsv | 4 +- docs/heic/experimental-opt-in.md | 10 +- internal/ui/images_native_test.go | 260 +++++++++++++++++-- internal/ui/images_test.go | 179 +++++++++++++ plans/2026-09-16-experimental-heic-opt-in.md | 138 +++++++++- todos.md | 12 + 6 files changed, 569 insertions(+), 34 deletions(-) diff --git a/.github/testshards/internal-ui.tsv b/.github/testshards/internal-ui.tsv index 4bd41740..18911d4d 100644 --- a/.github/testshards/internal-ui.tsv +++ b/.github/testshards/internal-ui.tsv @@ -6,7 +6,7 @@ # baseline-attempts: 1 # weights: single CI attempt; projected test sums, not measured shard runtimes # ui-1: 238 entries, 470.520s projected weight sum -# ui-2: 251 entries, 470.530s projected weight sum +# ui-2: 253 entries, 470.530s projected weight sum # ui-3: 202 entries, 504.870s projected weight sum # rebalance: 27 whole-test moves; slowest projected sum within 5% of mean # evidence: finished_refactorings/2026-09-11-ui-shard-rebalance.md @@ -333,7 +333,9 @@ TestE2E_LaunchWithSavedSessionShowsRestoreLink ui-2 TestE2E_SuccessfulDropShowsImage ui-2 TestExifLink_OpensExifWindow ui-2 TestExifNavigationCancelsMetadataBeforeTheNextImageLoads ui-2 +TestExperimentalHEICActiveAnalysis ui-2 TestExperimentalHEICAdmission ui-2 +TestExperimentalHEICPreviewConsumers ui-2 TestExperimentalHEICRestartOnly ui-2 TestExperimentalHEICStartup ui-2 TestExportAs_CancelWritesNothing ui-2 diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index dd97e9e0..6b9476ca 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -61,7 +61,15 @@ runs the shared startup/viewer harness. It exercises the real checkbox across separate viewer lifetimes, HEIC/HEIF admission, native helper decoding, ordinary viewing, cancellation and shutdown. Fyne's test driver supplies the surface; this is application-constructor/package-boundary evidence, not a production GUI -smoke test. The installed-MSIX entry is `TestNativeInstalledHEICActivation`, +smoke test. Its resumed coverage adds mixed-directory navigation, a foreground +source held after native readiness across a saved Settings edit and collection +replacement, and ordinary viewing after missing/invalid/wrong-target package +inputs. macOS also exercises an owned helper signed without App Sandbox: native +readiness refuses it before bulk source reads, and ordinary viewing recovers. +All damaged-package fixtures are disposable standalone copies; installed MSIX +files remain immutable. These additions pass locally on macOS arm64 with race +detection; the current plan records subsequent cross-platform CI results. +The installed-MSIX entry is `TestNativeInstalledHEICActivation`, compiled with `heicnative,microsoftstore` alongside the actual Store executable. The fixture launches the declared test executable directly from its installed WindowsApps path. Windows can resolve package identity during this ordinary diff --git a/internal/ui/images_native_test.go b/internal/ui/images_native_test.go index 14f8c163..a477376a 100644 --- a/internal/ui/images_native_test.go +++ b/internal/ui/images_native_test.go @@ -7,8 +7,10 @@ import ( "crypto/sha256" "encoding/binary" "encoding/hex" + "encoding/json" "errors" "fmt" + "image" "image/color" "io" "os" @@ -16,6 +18,8 @@ import ( "path/filepath" "runtime" "slices" + "sync" + "sync/atomic" "testing" "time" @@ -47,6 +51,14 @@ func TestNativePackagedHEICActivation(t *testing.T) { if err != nil { t.Fatal(err) } + if failure := os.Getenv("PICFETCH_HEIC_ACTIVATION_FAILURE"); failure != "" { + if failure == "sandbox readiness" { + t.Run("TestExperimentalHEICReadinessRefusal", testNativeHEICReadinessRefusal) + } else { + t.Run("TestExperimentalHEICUnavailable/"+failure, testNativeHEICUnavailable) + } + return + } helper, digest, err := heicclient.LoadPackage(root, runtime.GOOS, runtime.GOARCH) if err != nil { t.Fatal(err) @@ -70,6 +82,10 @@ func TestNativePackagedHEICActivation(t *testing.T) { if err = os.WriteFile(heif.Path(), fixture, 0600); err != nil { t.Fatal(err) } + ordinary := storage.NewFileURI(filepath.Join(filepath.Dir(uri.Path()), "ordinary.png")) + if err = os.WriteFile(ordinary.Path(), uitest.EncodePNG(t, 3, 2, color.White), 0600); err != nil { + t.Fatal(err) + } t.Run("enable stays inactive until restart", func(t *testing.T) { v, _, _ := newTestUI(t) if v.images.owner != nil || v.images.foreground.IsSupportedImage(uri) { @@ -103,6 +119,24 @@ func TestNativePackagedHEICActivation(t *testing.T) { if !v.grid.Cached(uri) || !v.grid.Cached(heif) { t.Fatal("native HEIC did not reach grid previews") } + t.Run("TestExperimentalHEICMixedDirectoryNavigation", func(t *testing.T) { + dropAndWait(t, v, storage.NewFileURI(filepath.Dir(uri.Path()))) + if len(v.state.files) != 3 { + t.Fatalf("mixed directory admitted %d images, want 3", len(v.state.files)) + } + for i, file := range v.state.files { + v.ShowImage(i) + waitUntilLoaded(t, v) + want := image.Pt(16, 16) + if file.String() == ordinary.String() { + want = image.Pt(3, 2) + } + if v.img.Image == nil || v.img.Image.Bounds().Size() != want || v.display.Snapshot().Displayed.Source.String() != file.String() { + t.Fatalf("mixed directory navigation did not display %s", file.Name()) + } + } + v.display.Settle() + }) t.Run("live file-size limit", func(t *testing.T) { // A valid free-space box grows the owned image above the initial // one-MiB preference without changing its decoded pixels. @@ -138,27 +172,29 @@ func TestNativePackagedHEICActivation(t *testing.T) { t.Fatalf("native hard input ceiling was not checked: %v", err) } }) - entered, done := make(chan struct{}), make(chan error, 1) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - go func() { - _, decodeErr := v.images.owner.Do(ctx, heicdecode.Decode, func(ctx context.Context, _ int64) ([]byte, error) { - close(entered) - <-ctx.Done() - return nil, ctx.Err() - }) - done <- decodeErr - }() + entered, closed := make(chan struct{}), make(chan struct{}) + var readOnce, closeOnce sync.Once + unblock := func() { closeOnce.Do(func() { close(closed) }) } + defer unblock() + held := uitest.ReaderURI(storage.NewFileURI(uitest.WriteTempFile(t, "a-held.heic", fixture)), func() (io.ReadCloser, error) { + return uitest.ReadCloser{ + ReadFunc: func(_ []byte) (int, error) { + readOnce.Do(func() { close(entered) }) + <-closed + return 0, os.ErrClosed + }, + CloseFunc: func() error { unblock(); return nil }, + }, nil + }) + // The source's first byte read follows actual native readiness. Hold + // that foreground read until navigation closes it through cancellation. + v.handleDrop([]fyne.URI{held, ordinary}) + waitForScan(t, v) + waitForSort(t, v) select { case <-entered: - case decodeErr := <-done: - t.Fatalf("native readiness failed before cancellation: %v", decodeErr) - case <-time.After(30 * time.Second): - t.Fatal("native cancellation input was not admitted") - } - cancel() - if err := <-done; !errors.Is(err, context.Canceled) { - t.Fatalf("native cancellation: %v", err) + case <-time.After(testTimeout): + t.Fatal("native foreground source was not admitted") } owner := v.images.owner test.Tap(experimentalHEICCheckbox(t, v)) @@ -166,6 +202,29 @@ func TestNativePackagedHEICActivation(t *testing.T) { if v.images.owner != owner || !v.images.foreground.IsSupportedImage(uri) { t.Fatal("disabling replaced the running decoder") } + select { + case <-closed: + t.Fatal("Settings retired active native work") + default: + } + retired := v.display.LoadDone() + replacement := storage.NewFileURI(uitest.WriteTempFile(t, "replacement.png", uitest.EncodePNG(t, 5, 4, color.White))) + dropAndWait(t, v, replacement) + waitHandle(t, "retired native HEIC load", retired) + select { + case <-closed: + default: + t.Fatal("navigation did not close the retired native source") + } + v.display.Settle() + if len(v.state.files) != 1 || v.img.Image == nil || v.img.Image.Bounds().Size() != image.Pt(5, 4) || v.display.Snapshot().Displayed.Source.String() != replacement.String() { + t.Fatal("retired native work replaced ordinary viewing") + } + // Disabling remains restart-only even after cancellation and replacement. + dropAndWait(t, v, uri, heif) + if v.img.Image == nil || v.img.Image.Bounds().Size() != image.Pt(16, 16) || v.images.owner != owner { + t.Fatal("active capability did not survive Settings and source replacement") + } }) t.Run("disabled restart and ordinary viewing", func(t *testing.T) { v, _, _ := newTestUI(t) @@ -185,6 +244,57 @@ func TestNativePackagedHEICActivation(t *testing.T) { t.Log("native application startup, admission, cancellation and shutdown completed") } +func testNativeHEICUnavailable(t *testing.T) { + preferences.Save(testApp, preferences.State{ExperimentalHEIC: true}) + v, _, _ := newTestUI(t) + if v.images.owner != nil || v.images.startupError == nil || !v.images.unavailable() || v.settingsWin.Open() { + t.Fatal("invalid installed package did not fail closed without opening Settings") + } + dir := t.TempDir() + heic := storage.NewFileURI(filepath.Join(dir, "unavailable.heic")) + if err := os.WriteFile(heic.Path(), []byte("owned source must remain unadmitted"), 0600); err != nil { + t.Fatal(err) + } + ordinary := storage.NewFileURI(filepath.Join(dir, "ordinary.png")) + if err := os.WriteFile(ordinary.Path(), uitest.EncodePNG(t, 5, 4, color.White), 0600); err != nil { + t.Fatal(err) + } + dropAndWait(t, v, storage.NewFileURI(dir)) + if v.FileCount() != 1 || v.state.files[0].String() != ordinary.String() || v.img.Image == nil || v.img.Image.Bounds().Size() != image.Pt(5, 4) { + t.Fatal("invalid native package disrupted ordinary directory viewing") + } + if !experimentalHEICCheckbox(t, v).Checked || !preferences.Load(testApp).ExperimentalHEIC || v.images.foreground.IsSupportedImage(heic) { + t.Fatal("invalid native package lost intent or admitted HEIC") + } +} + +func testNativeHEICReadinessRefusal(t *testing.T) { + preferences.Save(testApp, preferences.State{ExperimentalHEIC: true}) + v, _, _ := newTestUI(t) + if v.images.owner == nil || v.images.unavailable() { + t.Fatalf("readiness fixture failed before native launch: %v", v.images.startupError) + } + owner := v.images.owner + var bulkRead atomic.Bool + heic := uitest.ReaderURI(storage.NewFileURI(uitest.WriteTempFile(t, "a-unready.heic", []byte("owned"))), func() (io.ReadCloser, error) { + return uitest.ReadCloser{ + ReadFunc: func(_ []byte) (int, error) { bulkRead.Store(true); return 0, io.EOF }, + CloseFunc: func() error { return nil }, + }, nil + }) + ordinary := storage.NewFileURI(uitest.WriteTempFile(t, "ordinary.png", uitest.EncodePNG(t, 5, 4, color.White))) + dropAndWait(t, v, heic, ordinary) + if bulkRead.Load() || !v.images.unavailable() || v.images.owner != owner { + t.Fatal("native readiness refusal read source bytes, lost status or replaced ownership") + } + if v.FileCount() != 1 || v.state.files[0].String() != ordinary.String() || v.img.Image == nil || v.img.Image.Bounds().Size() != image.Pt(5, 4) || v.settingsWin.Open() { + t.Fatal("native readiness refusal disrupted ordinary viewing or opened Settings") + } + if !experimentalHEICCheckbox(t, v).Checked || !v.images.foreground.IsSupportedImage(heic) { + t.Fatal("native readiness refusal changed saved intent or immutable capability") + } +} + type nativeHEICApp struct { fyne.App cache fyne.Cache @@ -236,7 +346,7 @@ func runOwnedHEICApplication(t *testing.T) { if err = errors.Join(copyErr, closeErr); err != nil { t.Fatal(err) } - run := func(command *exec.Cmd) { + run := func(t *testing.T, command *exec.Cmd) { t.Helper() command.Dir = repository output, err := command.CombinedOutput() @@ -245,14 +355,14 @@ func runOwnedHEICApplication(t *testing.T) { t.Fatalf("native application fixture: %v", err) } } - run(exec.Command("go", "run", "./scripts/heicpackage", "-os", runtime.GOOS, "-arch", runtime.GOARCH, "-out", root)) + run(t, exec.Command("go", "run", "./scripts/heicpackage", "-os", runtime.GOOS, "-arch", runtime.GOARCH, "-out", root)) if runtime.GOOS == "darwin" { plist := `CFBundleIdentifiercom.frathe.PicFetch.HEICQualificationCFBundleExecutablepicfetchCFBundlePackageTypeAPPL` if err = os.WriteFile(filepath.Join(root, "Contents", "Info.plist"), []byte(plist), 0600); err != nil { t.Fatal(err) } - run(exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", root)) - run(exec.Command("/usr/bin/codesign", "--verify", "--deep", "--strict", "--verbose=2", root)) + run(t, exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", root)) + run(t, exec.Command("/usr/bin/codesign", "--verify", "--deep", "--strict", "--verbose=2", root)) } bytes, err := os.ReadFile(destination) if err != nil { @@ -264,5 +374,107 @@ func runOwnedHEICApplication(t *testing.T) { defer cancel() command := exec.CommandContext(ctx, destination, "-test.run=^TestNativePackagedHEICActivation$", "-test.v", "-test.timeout=3m") command.Env = append(os.Environ(), "PICFETCH_HEIC_ACTIVATION_CHILD=1", fmt.Sprintf("PICFETCH_HEIC_ACTIVATION_FIXTURE=%s", filepath.Join(repository, "scripts", "heicbuild", "testdata", "tenbit.heic"))) - run(command) + run(t, command) + + // These mutations apply only to this disposable standalone fixture after + // its successful child has exited. Installed MSIX bytes are never changed. + helper, manifest, err := heicclient.PackagePaths(root, runtime.GOOS) + if err != nil { + t.Fatal(err) + } + manifestBytes, err := os.ReadFile(manifest) + if err != nil { + t.Fatal(err) + } + helperBytes, err := os.ReadFile(helper) + if err != nil { + t.Fatal(err) + } + runFailure := func(t *testing.T, failure string) { + t.Helper() + failureContext, stop := context.WithTimeout(context.Background(), time.Minute) + defer stop() + probe := exec.CommandContext(failureContext, destination, "-test.run=^TestNativePackagedHEICActivation$", "-test.v", "-test.timeout=45s") + probe.Env = append(os.Environ(), "PICFETCH_HEIC_ACTIVATION_CHILD=1", "PICFETCH_HEIC_ACTIVATION_FAILURE="+failure) + output, err := probe.CombinedOutput() + t.Logf("failure=%s\n%s", failure, output) + if err != nil { + t.Fatalf("native package refusal: %v", err) + } + } + for _, failure := range []string{"missing helper", "missing manifest", "invalid manifest", "wrong target", "helper identity"} { + t.Run(failure, func(t *testing.T) { + // Restore both inputs before each independent failure scenario. + if err := os.WriteFile(manifest, manifestBytes, 0600); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(helper, helperBytes, 0700); err != nil { + t.Fatal(err) + } + var mutationErr error + switch failure { + case "missing helper": + mutationErr = os.Remove(helper) + case "missing manifest": + mutationErr = os.Remove(manifest) + case "invalid manifest": + mutationErr = os.WriteFile(manifest, []byte("invalid owned manifest"), 0600) + case "wrong target": + var record heicclient.PackageManifest + mutationErr = json.Unmarshal(manifestBytes, &record) + if mutationErr == nil { + record.GOARCH = "amd64" + if runtime.GOARCH == record.GOARCH { + record.GOARCH = "arm64" + } + var data []byte + data, mutationErr = json.Marshal(record) + if mutationErr == nil { + mutationErr = os.WriteFile(manifest, data, 0600) + } + } + case "helper identity": + mutationErr = os.WriteFile(helper, []byte("changed owned helper"), 0700) + } + if mutationErr != nil { + t.Fatal(mutationErr) + } + runFailure(t, failure) + }) + } + if runtime.GOOS == "darwin" { + t.Run("sandbox readiness", func(t *testing.T) { + if err := os.WriteFile(helper, helperBytes, 0700); err != nil { + t.Fatal(err) + } + // Independently sign this owned negative helper without App Sandbox. + // The real worker must refuse readiness; no production policy changes. + entitlements := filepath.Join(t.TempDir(), "empty.plist") + if err := os.WriteFile(entitlements, []byte(``), 0600); err != nil { + t.Fatal(err) + } + bundle := filepath.Dir(filepath.Dir(filepath.Dir(helper))) + run(t, exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", "--entitlements", entitlements, bundle)) + data, err := os.ReadFile(helper) + if err != nil { + t.Fatal(err) + } + digest := sha256.Sum256(data) + var record heicclient.PackageManifest + if err = json.Unmarshal(manifestBytes, &record); err != nil { + t.Fatal(err) + } + record.ExecutableSHA256 = hex.EncodeToString(digest[:]) + data, err = json.Marshal(record) + if err != nil { + t.Fatal(err) + } + if err = os.WriteFile(manifest, data, 0600); err != nil { + t.Fatal(err) + } + run(t, exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", root)) + run(t, exec.Command("/usr/bin/codesign", "--verify", "--deep", "--strict", "--verbose=2", root)) + runFailure(t, "sandbox readiness") + }) + } } diff --git a/internal/ui/images_test.go b/internal/ui/images_test.go index 061aa048..fe698576 100644 --- a/internal/ui/images_test.go +++ b/internal/ui/images_test.go @@ -16,8 +16,10 @@ import ( "strings" "sync/atomic" "testing" + "time" "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/storage" @@ -30,6 +32,8 @@ import ( "github.com/frathe/picfetch/internal/imaging" mosaiccore "github.com/frathe/picfetch/internal/mosaic" "github.com/frathe/picfetch/internal/preferences" + "github.com/frathe/picfetch/internal/similarity" + explorerui "github.com/frathe/picfetch/internal/ui/explorer" "github.com/frathe/picfetch/internal/uitest" ) @@ -242,6 +246,173 @@ func TestHEICSourceConsumers(t *testing.T) { } } +// A notice observes callback submission, so preview assertions never infer +// completion from a read counter or race the worker's subsequent delivery. +type heicPreviewQueue struct { + uitest.UIQueue + notice chan struct{} +} + +func (q *heicPreviewQueue) Do(f func()) { + q.UIQueue.Do(f) + select { + case q.notice <- struct{}{}: + default: + } +} + +func TestExperimentalHEICPreviewConsumers(t *testing.T) { + var decoded atomic.Int64 + reader := imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + if _, err := input(ctx, 128); err != nil { + return heicdecode.Response{}, err + } + if op != heicdecode.Decode { + return heicdecode.Response{}, nil + } + decoded.Add(1) + pixels := image.NewNRGBA(image.Rect(0, 0, 8, 6)) + for y := 0; y < 6; y++ { + for x := 0; x < 8; x++ { + pixels.SetNRGBA(x, y, color.NRGBA{R: uint8(x * 30), G: uint8(y * 40), A: 255}) + } + } + return heicdecode.Response{Image: pixels, Config: image.Config{Width: 8, Height: 6}}, nil + }) + v, _, _ := newTestUIWithImages(t, imageServices{foreground: reader, background: reader}) + first := storage.NewFileURI(uitest.WriteTempFile(t, "first.heic", []byte("owned"))) + second := storage.NewFileURI(uitest.WriteTempFile(t, "second.heif", []byte("owned"))) + dropAndWait(t, v, first, second) + v.display.Settle() + t.Run("uncached duplicate previews", func(t *testing.T) { + if v.grid.Cached(first) || v.grid.Cached(second) { + t.Fatal("duplicate fixture already has cached thumbnails") + } + before := decoded.Load() + v.grid.SetBrowsingDuplicates(true) + v.grid.Settle() + if !v.grid.BrowseReady() || len(v.grid.ResultIndexes()) != 2 || decoded.Load() <= before { + t.Fatal("admitted HEIC sources did not produce a duplicate group") + } + for _, uri := range []fyne.URI{first, second} { + pixels, ok := v.grid.CachedThumb(uri) + if !ok || pixels.Bounds().Dx() == 0 || pixels.Bounds().Dy() == 0 { + t.Fatal("duplicate browsing did not produce HEIC previews") + } + } + }) + t.Run("uncached Spiral preview", func(t *testing.T) { + queue := &heicPreviewQueue{notice: make(chan struct{}, 1)} + v.spiral.SetUIQueue(queue) + before := decoded.Load() + v.openSpiral() + defer func() { v.spiral.Close(); v.spiral.Settle() }() + var shader *canvas.Shader + for _, win := range testApp.Driver().AllWindows() { + if win.Title() == lang.L("Hypno Spiral") { + shader, _ = win.Content().(*canvas.Shader) + } + } + if shader == nil { + t.Fatal("Spiral shader is absent from the window") + } + deadline := time.NewTimer(testTimeout) + defer deadline.Stop() + for { + select { + case <-queue.notice: + queue.Drain() + pixels := shader.Textures["traveller0"] + if pixels != nil && pixels.Bounds().Size() == image.Pt(8, 6) { + if decoded.Load() <= before { + t.Fatal("Spiral used cached pixels instead of its HEIC reader") + } + return + } + case <-deadline.C: + t.Fatal("admitted HEIC preview did not reach the Spiral shader") + } + } + }) +} + +func TestExperimentalHEICActiveAnalysis(t *testing.T) { + before := preferences.Load(testApp) + t.Cleanup(func() { preferences.Save(testApp, before) }) + preferences.Save(testApp, preferences.State{ExperimentalHEIC: true}) + reader := imaging.NewReader(func(ctx context.Context, op heicdecode.Operation, input heicclient.Input) (heicdecode.Response, error) { + if _, err := input(ctx, 128); err != nil { + return heicdecode.Response{}, err + } + if op != heicdecode.Decode { + return heicdecode.Response{}, nil + } + return heicdecode.Response{Image: image.NewNRGBA(image.Rect(0, 0, 8, 6)), Config: image.Config{Width: 8, Height: 6}}, nil + }) + v, _, _ := newTestUIWithImages(t, imageServices{foreground: reader, background: reader}) + first := storage.NewFileURI(uitest.WriteTempFile(t, "first.heic", []byte("owned"))) + second := storage.NewFileURI(uitest.WriteTempFile(t, "second.heif", []byte("owned"))) + dropAndWait(t, v, first, second) + v.display.Settle() + started, stopped := make(chan error, 1), make(chan struct{}) + preview := uitest.EncodeJPEG(t, 8, 6, color.White) + configureExplorer(v, func(options *explorerui.Options) { + options.Analyze = func(ctx context.Context, paths []string, _ <-chan similarity.Control, emit func(similarity.Event)) error { + defer close(stopped) + source, err := v.images.background.Read(ctx, storage.NewFileURI(paths[0])) + if err == nil && source.Bounds().Size() != image.Pt(8, 6) { + err = errors.New("analysis did not receive HEIC pixels") + } + started <- err + if err != nil { + return err + } + <-ctx.Done() + emit(similarity.Event{Complete: true, Total: len(paths), Successful: len(paths), Items: []similarity.Item{{Path: paths[0], Cohort: "retired", Position: []float32{0, 0}, Preview: preview}}}) + return ctx.Err() + } + }) + explorerMenu(t, v).Action() + select { + case err := <-started: + if err != nil { + t.Fatal(err) + } + case <-time.After(testTimeout): + t.Fatal("HEIC analysis did not begin") + } + analysis := observeExplorer(v.explorer) + check := experimentalHEICCheckbox(t, v) + test.Tap(check) + preferences.Save(testApp, v.currentPreferences()) + if preferences.Load(testApp).ExperimentalHEIC || !v.images.foreground.IsSupportedImage(first) || !v.images.background.IsSupportedImage(second) { + t.Fatal("active analysis Settings edit changed session capability or lost saved intent") + } + if !analysis.current() { + t.Fatal("saved HEIC edit retired the active analysis session") + } + select { + case <-stopped: + t.Fatal("saved HEIC edit cancelled active analysis") + default: + } + replacement := storage.NewFileURI(uitest.WriteTempFile(t, "replacement.png", uitest.EncodePNG(t, 5, 4, color.White))) + dropAndWait(t, v, replacement) + select { + case <-stopped: + case <-time.After(testTimeout): + t.Fatal("source replacement did not cancel HEIC analysis") + } + v.settleExplorer() + if len(explorerPiles(v)) != 0 || v.FileCount() != 1 || v.img.Image == nil || v.img.Image.Bounds().Size() != image.Pt(5, 4) { + t.Fatal("retired HEIC analysis changed replacement viewing") + } + dropAndWait(t, v, first, second) + if v.FileCount() != 2 || v.img.Image == nil || v.img.Image.Bounds().Size() != image.Pt(8, 6) { + t.Fatal("saved disable stopped HEIC before restart") + } +} + func TestHEICOwnerStopsWithViewer(t *testing.T) { executable, err := os.Executable() if err != nil { @@ -309,6 +480,7 @@ func experimentalHEICCheckbox(t *testing.T, v *viewer) *widget.Check { }) tabs.Select(tab) var found *widget.Check + var unavailable *widget.Label var walk func(fyne.CanvasObject) walk = func(obj fyne.CanvasObject) { switch value := obj.(type) { @@ -322,12 +494,19 @@ func experimentalHEICCheckbox(t *testing.T, v *viewer) *widget.Check { if value.Text == lang.L("Experimental HEIC support") { found = value } + case *widget.Label: + if value.Text == lang.L("Experimental HEIC support is unavailable. Check the installed helper package and sandbox permissions.") { + unavailable = value + } } } walk(tab.Content) if found == nil { t.Fatal("Experimental checkbox is not in the Settings surface") } + if v.images.unavailable() && (unavailable == nil || !unavailable.Visible()) { + t.Fatal("unavailable HEIC explanation is not visible in Experimental") + } return found } t.Fatal("Settings window was not opened") diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index b65c58d8..fd486d62 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -1,7 +1,13 @@ # Experimental HEIC opt-in implementation -Date: 2026-09-16. Route: Deep SDD/TDD. Status: implemented; installed-MSIX -qualification and an external AI scan remain blocked. +Date: 2026-09-16. Route: Deep SDD/TDD. Status: implementation integrated; +remaining checklist evidence, installed-MSIX qualification and an external AI +scan keep final acceptance open. + +Resuming agent: start with the [handoff](../.scratch/experimental-heic-opt-in/handoff.md) +and reconciled ticket checklists. On 2026-09-16, 44/57 items are checked and +tickets 01/02/03/04 are resolved. Later handoff notes distinguish completed native +constructor tests from compound application scenarios still needing proof. Deliver the accepted [spec](../.scratch/experimental-heic-opt-in/spec.md) through the [nine approved tickets](../.scratch/experimental-heic-opt-in/issues/README.md). @@ -65,16 +71,36 @@ a recorded bounded question; no concurrent code ownership overlaps. ## Evidence and cost ledger +Resume 2026-09-16: retain Deep routing and approved seams. One read-only scout +locates existing consumer evidence and completion observables in the UI tests, +Spiral and Grid while the lead traces native activation fixtures. G1: bounded +consumer/lifetime question; G2: source-location claims checked with `rg`/reads; +G3: no writes; G4: consumer sweep is smaller than the complete feature context; +G5: lead has not traced these consumers in this resumed session. No design, +review or fixes delegated. Lead adds missing behavioral coverage one slice at +a time, negatively verifies new guards, and keeps native environment blockers +explicit. Budget: one scout, focused tests, complete suite through CI. + +Resumed slice A (lead): extend `internal/ui/images_native_test.go` through the +existing packaged constructor to prove mixed-directory HEIC/HEIF/PNG navigation, +saved disable during an admitted native request, cancellation of a retired +foreground load on collection replacement, ordinary replacement pixels, and +continued HEIC use before restart. Existing package construction and execution +commands below remain unchanged. Verify with +`go test -tags no_emoji,nodynamic,heicnative -count=1 -run '^TestNativePackagedHEICActivation$' -v ./internal/ui`; +observe a negative control before recording green. No new runtime seam or +decoder behavior is planned. Other architectures require fresh native CI. + | Slice | Red / green / inspection evidence | Status | | --- | --- | --- | | Publication | Nine tickets published, ticket 01 claimed; prior spec preserved | Complete | -| 01 | Real-admission consumer red: unsupported scan never began sort; green imaging/filescan and direct/folder/sibling/session/Favorite UI cases | Implemented; final gate pending | -| 02 | Red: missing Experimental tab/default activation; green preference and real-checkbox separate-lifetime tests. Later red: stale open Settings; green live status update | Implemented; final gate pending | -| 03 | Red: active HEIC choices absent and saved rule rejected; green Explorer real-dialog save/rename and source consumers; native successful analysis and two retained preview queries pass, missing-owner negative control fails as expected | Implemented; final gate pending | -| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests pass natively on both architectures at 69fef1a | Standalone native qualification passes; installed-MSIX open | +| 01 | Real-admission consumer red: unsupported scan never began sort; green imaging/filescan and direct/folder/sibling/session/Favorite UI cases | Ticket resolved; integrated final gate separate | +| 02 | Red: missing Experimental tab/default activation; green preference and real-checkbox separate-lifetime tests. Later red: stale open Settings; green live status update | Ticket resolved; platform/final gates separate | +| 03 | Red: active HEIC choices absent and saved rule rejected; green Explorer/source consumers and native analysis/retained queries. Resumed uncached duplicate/Spiral and active-analysis/source-replacement guards pass with negative controls | 6/6 items complete; final integrated native gate remains separate | +| 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests pass natively on both architectures at 69fef1a | Ticket resolved for staging; installed-MSIX context separate | | 05, 08 | Standard-user standalone guards pass on both architectures at 69fef1a. Disposable signed MSIX installs, but both COM and direct activation fail before the test process starts | Installed-MSIX qualification blocked on a suitable interactive standard-user environment | -| 06 | Both native macOS architectures pass signed application-constructor and analysis guards at 69fef1a; real HEIC decode, restart, cancellation and shutdown | Native qualification passes; production GUI smoke remains separate | -| 07 | Both native Linux architectures pass application, analysis, helper/seccomp/resource guards at 69fef1a | Native qualification passes | +| 06 | Both native macOS architectures pass signed application-constructor and analysis guards at 69fef1a; real HEIC decode, restart, cancellation and shutdown | 4/6 items complete; combined packaged failure/navigation evidence remains; production GUI smoke separate | +| 07 | Both native Linux architectures pass application, analysis, helper/seccomp/resource guards at 69fef1a | 4/6 items complete; combined native directory/failure scenarios remain | | 09 | Complete Linux race partitions and validation pass at 69fef1a. Fresh code/security reviews have no findings; Qodana has zero final results, CodeQL only its two existing dismissed false positives. IDE and sixteen Settings layouts verified | Installed-MSIX and the external GitHub AI scanner remain blocked | Budget: one initial read-only scout; lead implementation and fixes; focused @@ -368,3 +394,99 @@ passes, while full AMD64 verification stays in native CI. Production GUI smoke, licensing/distribution, production signing and broader camera/color gates remain separate. This plan stays active because required installed-MSIX qualification is incomplete; the draft PR is not ready for acceptance. + +### Online investigation of alternate-user MSIX activation + +At Ronin's request, stop speculative launcher changes and examine primary +sources. Microsoft's [WindowsAppSDK issue 2555](https://github.com/microsoft/WindowsAppSDK/issues/2555) +records the same `0x80070520` during packaged-component activation as another +user inside the desktop session owner's session. The maintainer specifically +identifies the [CreateProcessWithLogonW/MSIX interaction](https://github.com/microsoft/WindowsAppSDK/issues/2555#issuecomment-1190815856) +as an OS issue. Its closed-not-planned status and later OS escalation do not +establish a fix. This strongly matches our COM failure; the exact failed OS +check behind our direct-launch Access denied remains untraced. + +The next qualification needs the standard test user to own the desktop session +and run the ordinary activation launcher from that session. Record both process +SID and desktop-session ownership before launching. A credential process with +a loaded profile does not establish this arrangement. Do not label GitHub ARM +runners categorically headless: the [runner maintainer's investigation](https://github.com/actions/runner-images/issues/14049#issuecomment-5217338266) +found an interactive desktop for the runner account. No supported workaround +for our secondary-account launch was found, and no further CI retry is justified +without changing that prerequisite. Native installed-MSIX proof remains open. + +The detailed source assessment and next qualification procedure are recorded in +`.scratch/experimental-heic-opt-in/evidence/msix-activation-research.md`. +The current hosted-only provisioner must be split from session-local execution +before offering a manual or interactive-runner path. No implementation or gate +was changed by this research. Reused the existing read-only scout for one bounded +primary-source issue search (zero new spawns); lead verified cited comments with +`gh api`, retained all assessment/design ownership and wrote the record. + +The unchanged Windows ARM64 standalone retry at `8aa317a` passes all five native +packages with no failed event records. Its original analysis-pixel failure is +retained as unexplained intermittent evidence, not reported as fixed. Fresh +Codex code/security reviews of that head are clean (comments 5699763980 and +5699899622); Qodana has zero final results and CodeQL only the two existing +dismissed false positives. Both installed-MSIX jobs and the separate unsupported- +model AI scanner remain unsuccessful. + +### Resumed consumer and packaged-application evidence — 2026-09-16 + +Lead-owned slice B extends `images_test.go` at the approved startup/admission, +Grid, Spiral shader and Explorer Analyze seams. The two new root tests are +assigned to ui-2 (253 entries). `TestExperimentalHEICPreviewConsumers` establishes +uncached duplicate previews and actual Spiral shader pixels after ordinary +admission. `TestExperimentalHEICActiveAnalysis` establishes positive HEIC pixels, +saved disable while analysis remains current, source replacement/cancellation, +late-map refusal and continued HEIC use until restart. Native inherited analysis +and retained-search proof remains in the existing native suite. + +Slice A now holds an actual foreground source read after native readiness, +changes the checkbox while that load is active, replaces its collection and +observes source closure plus retired-load completion. The fresh ordinary surface +survives, and the same owner decodes HEIC again before restart. It also opens a +mixed HEIC/HEIF/PNG directory and navigates each source. Each owned standalone +package is then relaunched with a missing helper, missing/invalid manifest, +wrong architecture or changed helper identity. All cases preserve intent and +the localized explanation and display the ordinary member of a mixed directory. +These fixture mutations never touch installed MSIX files. + +On macOS a final owned negative helper is ad-hoc signed with an empty entitlement +plist using `codesign --force --sign - --options runtime --entitlements +`. Its manifest pins those exact bytes; the enclosing app +is re-signed and checked with `codesign --verify --deep --strict --verbose=2`. +Actual readiness refusal must precede any bulk source read; the configured owner +and saved intent remain stable and ordinary PNG viewing recovers. Production +entitlements, code, dependencies and decoder bytes are unchanged. + +Meaningful negative controls (all temporary edits restored): removing Grid and +Spiral reader injection fails both preview cases; closing Explorer on the saved +choice fails the active-session assertion; discarding startup errors fails every +invalid-package case; giving the negative helper its normal sandbox entitlements +fails the readiness-refusal assertion. Logs are `evidence/resume-*-negative.log`. +These are new coverage for already implemented behavior; no production defect +or runtime fix is claimed. + +Local green: the T03 HEIC/injected-reader race gate, Explorer/preset package gate, +and client race gate pass. The client gate initially failed because the tool +sandbox prohibited its owned loopback binds; the identical unsandboxed command +passes (8.643 s), with both logs retained. The expanded real macOS arm64 packaged +fixture passes with race detection (25.637 s), including all six refusal cases. +Other native architectures and the complete suite require the fresh CI round. +Installed-MSIX/session prerequisites, Windows combined ACL/query/concurrent-app +failure evidence and the external AI scanner remain open. One read-only consumer +scout was used; all tests, negative controls, assessment and fixes stayed with +the lead. Final gates/inspection and new-head CI/review results follow below. + +Final local gates: `make verify-build` passes, including formatting, exact Qodana +exclusions, reproducible guest/provenance, native import guard, vet and build. +Its first sandboxed attempt was blocked by Go-cache writes; the unchanged +unsandboxed command passed. `make check-test-shards` passes the canonical +Linux/amd64 inventory with 693 tests. Package/native-runner/plist tests pass. +`make security-govulncheck` reports zero reachable native vulnerabilities and +no guest vulnerabilities (one module-only native advisory remains unreachable). +GoLand inspections of both changed code files are clean, including warnings; +`resume-goland-inspections.json` retains the results. New test inventory is +retained in `resume-test-inventory.log`. The full race suite remains a CI gate +under the authorized review-loop procedure. diff --git a/todos.md b/todos.md index e5f874d5..fb30b3de 100644 --- a/todos.md +++ b/todos.md @@ -99,6 +99,13 @@ after an enabled preference and validated installed package. - [ ] Implement the [Experimental HEIC opt-in spec](.scratch/experimental-heic-opt-in/spec.md): default-off, restart-only Settings activation on macOS/Linux/Windows and MSIX, immutable session admission and verified private Windows helper staging. + [Agent handoff](.scratch/experimental-heic-opt-in/handoff.md): 44/57 ticket + checklist items complete; tickets 01/02/03/04 resolved. Resumed consumer tests + prove uncached duplicate/Spiral pixels and active-analysis Settings/replacement + behavior. Expanded macOS arm64 native race tests prove mixed-directory navigation, + foreground cancellation, package/target failure recovery and sandbox-readiness + refusal with ordinary viewing intact. Fresh cross-platform CI and remaining + Windows application-failure scenarios are still required. Require native packaged activation on amd64/arm64, standard-user Windows and installed disposable-signed test-MSIX; permission-query failure remains a blocker. Retain the accepted macOS memory limitation and separate release @@ -112,6 +119,11 @@ after an enabled preference and validated installed package. both fail before the test application starts, even from a writable workspace. This requires native x64/ARM64 environments with interactive standard-user sessions; no suitable repository runner is configured. + [Microsoft's documented alternate-user activation limitation](https://github.com/microsoft/WindowsAppSDK/issues/2555#issuecomment-1190815856) + closely matches the COM failure. Run the launcher in a desktop session owned + by the test account and verify that ownership before retrying; loading its + profile in the runner user's session is insufficient evidence. Split fixture + preparation from execution for that path; keep the existing failing gates. The confirmed live file-size review finding is fixed with native red/green coverage. Qodana reports zero findings; CodeQL processing recovered with only its two previously dismissed false positives. Code/security reviews are clean From 7f5c1da382e4ccb48c2ff4ab08d5e0bb5da08406 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 18:23:58 +0200 Subject: [PATCH 26/30] docs: record resumed HEIC qualification and remaining Windows gates --- docs/heic/experimental-opt-in.md | 27 +++++---- plans/2026-09-16-experimental-heic-opt-in.md | 44 ++++++++++++-- todos.md | 60 +++++++++----------- 3 files changed, 83 insertions(+), 48 deletions(-) diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index 6b9476ca..3cf99ba7 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -111,16 +111,23 @@ Store identity; cross-compilation is not that evidence. ## Current verification and remaining gates -At `69fef1a`, native Linux, macOS and standalone standard-user Windows pass on -both architectures, including packaged startup, the live file-size regression, -analysis and platform sandbox guards. All four Linux race partitions, ordinary -Windows, validation and Store executable construction pass. Installed-MSIX is -the only failing job in CI run 35111412255. Fresh Codex code/security reviews -report no findings; final Qodana SARIF is empty, and CodeQL contains only its two -previously assessed dismissed false positives. GitHub's separate dynamic AI -scanner fails before analysis because its service rejects the configured model. -That scan remains unverified. Production GUI smoke tests remain distinct from -the test-driver fixture. See the plan for exact evidence and remaining gates. +At `c1b6890`, native Linux, macOS and standalone standard-user Windows pass on +both architectures on first attempt, including the expanded application +failure/navigation cases. All four Linux race partitions, ordinary Windows, +validation and Store input construction pass. Installed-MSIX remains the only +failing scenario in CI 35120395881: both packages install, but the test process +cannot start (Access denied). Standard-user desktop-session prerequisites and +Windows combined application-level ACL/query/concurrent-lifetime cases remain +open. The old intermittent ARM64 analysis failure did not recur; no root-cause +fix is claimed. + +Fresh Codex code/security reviews report no findings for the implementation +commit. Final Qodana SARIF is empty; CodeQL contains only its two previously +assessed dismissed false positives. GitHub's separate dynamic AI scanner still +fails before analysis because its service rejects the configured model. That +scan remains unverified. Production GUI smoke tests remain distinct from the +test-driver fixture. See the plan and PR #28 for checkpoint and subsequent +documentation-only review/CI evidence. All prior sandbox, integrity and resource controls remain. macOS still has the previously accepted absence of a guaranteed total native-memory cap; WASM, diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index fd486d62..46d0119f 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -5,8 +5,8 @@ remaining checklist evidence, installed-MSIX qualification and an external AI scan keep final acceptance open. Resuming agent: start with the [handoff](../.scratch/experimental-heic-opt-in/handoff.md) -and reconciled ticket checklists. On 2026-09-16, 44/57 items are checked and -tickets 01/02/03/04 are resolved. Later handoff notes distinguish completed native +and reconciled ticket checklists. On 2026-09-16, 48/57 items are checked and +tickets 01/02/03/04/06/07 are resolved. Later handoff notes distinguish completed native constructor tests from compound application scenarios still needing proof. Deliver the accepted [spec](../.scratch/experimental-heic-opt-in/spec.md) through @@ -99,8 +99,8 @@ decoder behavior is planned. Other architectures require fresh native CI. | 03 | Red: active HEIC choices absent and saved rule rejected; green Explorer/source consumers and native analysis/retained queries. Resumed uncached duplicate/Spiral and active-analysis/source-replacement guards pass with negative controls | 6/6 items complete; final integrated native gate remains separate | | 04 | Red: no staging publication; green owned bounded copy/reuse/repair/cancel/preparation-refusal cases. Windows cache/concurrent-process/lease tests pass natively on both architectures at 69fef1a | Ticket resolved for staging; installed-MSIX context separate | | 05, 08 | Standard-user standalone guards pass on both architectures at 69fef1a. Disposable signed MSIX installs, but both COM and direct activation fail before the test process starts | Installed-MSIX qualification blocked on a suitable interactive standard-user environment | -| 06 | Both native macOS architectures pass signed application-constructor and analysis guards at 69fef1a; real HEIC decode, restart, cancellation and shutdown | 4/6 items complete; combined packaged failure/navigation evidence remains; production GUI smoke separate | -| 07 | Both native Linux architectures pass application, analysis, helper/seccomp/resource guards at 69fef1a | 4/6 items complete; combined native directory/failure scenarios remain | +| 06 | Both native macOS architectures pass expanded package failure, sandbox-readiness refusal, navigation/cancellation and analysis guards at c1b6890 | 6/6 items complete; production GUI smoke and release clearance remain separate | +| 07 | Both native Linux architectures pass mixed-directory, package-failure recovery, navigation/cancellation, analysis and helper/seccomp/resource guards at c1b6890 | 6/6 items complete | | 09 | Complete Linux race partitions and validation pass at 69fef1a. Fresh code/security reviews have no findings; Qodana has zero final results, CodeQL only its two existing dismissed false positives. IDE and sixteen Settings layouts verified | Installed-MSIX and the external GitHub AI scanner remain blocked | Budget: one initial read-only scout; lead implementation and fixes; focused @@ -490,3 +490,39 @@ GoLand inspections of both changed code files are clean, including warnings; `resume-goland-inspections.json` retains the results. New test inventory is retained in `resume-test-inventory.log`. The full race suite remains a CI gate under the authorized review-loop procedure. + +### Integrated checkpoint — c1b6890 + +[CI 35120395881](https://github.com/frathe/picfetch/actions/runs/35120395881) +passes validation, all four Linux race partitions, ordinary Windows, Store input +construction and all six standalone native platform/architecture targets on the +first attempt. Retained `resume-{linux,macos,windows}-{amd64,arm64}` artifacts +contain the mandatory package guards, with no skipped or failed application +scenarios. The prior unexplained ARM64 analysis failure did not recur; no fix is +claimed. Both installed-MSIX jobs still install successfully and then fail +`Process.Start` with Access denied before the test app produces evidence. + +Fresh [code review](https://github.com/frathe/picfetch/pull/28#issuecomment-5700753505) +and [security review](https://github.com/frathe/picfetch/pull/28#issuecomment-5700821584) +report no findings for c1b6890. Both earlier review threads remain resolved. +Qodana run 35120395935 has zero post-suppression SARIF results. CodeQL run +35120395948 passes: Actions analysis 1787413575 has zero results, Go analysis +1787457184 has exactly the two existing dismissed false positives (fixed runtime +archive allowlist and bounded integer conversion), validated against unchanged +source; no open alerts. GitHub AI scan 35120401536 still fails before analysis +with HTTP 400, requested model unsupported. Its failed log and both new MSIX +logs are retained as `resume-*-failure.log`; neither failure counts as success. + +48/57 ticket items are complete: 01/02/03/04/06/07 are resolved. Ticket 08 retains +combined application-level private-storage/ACL and failed-query recovery plus +concurrent application lifetime evidence; native navigation/source replacement +is now demonstrated. Ticket 05 needs the provisioner/executor split and native +x64/ARM64 desktops owned by the standard test account. No environment access was +supplied during this resume, and no such access was inferred. Ticket 09 remains +open for those Windows cases and complete required CI/external scan results. +Release, production signing and distribution/color qualification remain separate. + +The documentation follow-up records this completed implementation checkpoint; +it changes no executable or test inputs. Its fresh PR checks/reviews remain +visible on PR #28. The local handoff and evidence directory preserve current +operational state without rewriting the historical native results above. diff --git a/todos.md b/todos.md index fb30b3de..8d5730d5 100644 --- a/todos.md +++ b/todos.md @@ -96,40 +96,32 @@ shared GUI/analysis admission, canonical imaging integration and authenticated package/update handling. The current opt-in work now constructs an owner only after an enabled preference and validated installed package. -- [ ] Implement the [Experimental HEIC opt-in spec](.scratch/experimental-heic-opt-in/spec.md): - default-off, restart-only Settings activation on macOS/Linux/Windows and MSIX, - immutable session admission and verified private Windows helper staging. - [Agent handoff](.scratch/experimental-heic-opt-in/handoff.md): 44/57 ticket - checklist items complete; tickets 01/02/03/04 resolved. Resumed consumer tests - prove uncached duplicate/Spiral pixels and active-analysis Settings/replacement - behavior. Expanded macOS arm64 native race tests prove mixed-directory navigation, - foreground cancellation, package/target failure recovery and sandbox-readiness - refusal with ordinary viewing intact. Fresh cross-platform CI and remaining - Windows application-failure scenarios are still required. - Require native packaged activation on amd64/arm64, standard-user Windows and - installed disposable-signed test-MSIX; permission-query failure remains a - blocker. Retain the accepted macOS memory limitation and separate release - gates for licensing/distribution, production signing and camera/color - qualification. Implementation is in progress in the [active opt-in plan](plans/2026-09-16-experimental-heic-opt-in.md). - Settings/restart, admission, Explorer and private staging are implemented; - focused race tests, inspections, security checks and native macOS arm64 - application-constructor/analysis evidence pass. At `69fef1a`, native Linux, - macOS and standard-user Windows pass on both architectures, and all Linux race - partitions pass. Installed MSIX succeeds, but COM activation and direct launch - both fail before the test application starts, even from a writable workspace. - This requires native x64/ARM64 environments with interactive standard-user - sessions; no suitable repository runner is configured. - [Microsoft's documented alternate-user activation limitation](https://github.com/microsoft/WindowsAppSDK/issues/2555#issuecomment-1190815856) - closely matches the COM failure. Run the launcher in a desktop session owned - by the test account and verify that ownership before retrying; loading its - profile in the runner user's session is insufficient evidence. Split fixture - preparation from execution for that path; keep the existing failing gates. - The confirmed live file-size review finding is fixed with native red/green - coverage. Qodana reports zero findings; CodeQL processing recovered with only - its two previously dismissed false positives. Code/security reviews are clean - at `69fef1a`. GitHub's separate AI scanner fails before analysis because its - configured model is unsupported. Installed-MSIX qualification and that external - scan remain open. See the [activation record](docs/heic/experimental-opt-in.md). +- [ ] Complete the [Experimental HEIC opt-in spec](.scratch/experimental-heic-opt-in/spec.md): + default-off, restart-only activation, immutable session admission and verified + private Windows helper staging are integrated. The [handoff](.scratch/experimental-heic-opt-in/handoff.md) + records 48/57 completed checklist items; tickets 01/02/03/04/06/07 are resolved. + At `c1b6890`, all six standalone native platform/architecture targets, all four + Linux race partitions, validation, ordinary Windows and Store input construction + pass on first attempt. New evidence covers uncached duplicate/Spiral pixels, + active-analysis Settings/source replacement, native directory navigation, + foreground cancellation, invalid-package recovery and macOS readiness refusal. + GoLand, local build/provenance/import checks, shard inventory and dependency + scans pass. Fresh Codex code/security reviews are clean; final Qodana has zero + results and CodeQL only its two previously dismissed false positives. + Remaining: Windows application-level private-storage/ACL and failed-query + recovery plus concurrent application lifetimes (08), installed-MSIX activation + (05), and final integrated qualification (09). Both MSIX packages install but + their test processes still fail to start with Access denied. Split fixture + preparation from execution and qualify native x64/ARM64 desktops owned by the + standard account; a loaded profile under alternate credentials is insufficient. + No suitable environment access was supplied. The separate GitHub AI scanner + still fails before analysis with an unsupported-model HTTP 400. Keep all failing + gates and permission checks. The [active plan](plans/2026-09-16-experimental-heic-opt-in.md) + and [activation record](docs/heic/experimental-opt-in.md) retain exact evidence. + The earlier ARM64 analysis failure remains unexplained despite the fresh pass. + Production signing, licensing/distribution, broader camera/color qualification, + the accepted macOS total-memory limit and the full-reinstallation/qualified- + bridge requirement remain separate release constraints. The September 16 [history reconciliation](docs/heic/history-reconciliation.md) accounts for `fc127b44` and `73cb3c9`: all 107 production/source-license files From 98d3895edf5679f774ab5d891bd75e8d1013e9ab Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 18:59:21 +0200 Subject: [PATCH 27/30] Qualify installed MSIX under its desktop owner with a fresh standard token --- ARCHITECTURE.md | 6 ++- THREAT-MODEL.md | 6 ++- docs/heic/experimental-opt-in.md | 51 ++++++++++--------- internal/ui/images_native_windows_test.go | 12 ++++- packaging/heic/qualify-windows-child.ps1 | 10 ++++ packaging/heic/qualify-windows-session.ps1 | 43 ++++++++++++++++ packaging/heic/qualify-windows.ps1 | 44 ++++++++++++++--- plans/2026-09-16-experimental-heic-opt-in.md | 52 ++++++++++++++++++++ todos.md | 8 +-- 9 files changed, 193 insertions(+), 39 deletions(-) create mode 100644 packaging/heic/qualify-windows-session.ps1 diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 68d718cd..070ae590 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -692,9 +692,11 @@ Authenticode signing. Native helper tests use the same staging tool. Makefile and release/MSIX assembly retain the helper directory; package creation alone does not enable the saved HEIC preference. `packaging/heic/qualify-windows*.ps1` separates disposable CI account/signing provisioning from standard-user execution. +`qualify-windows-session.ps1` verifies the desktop owner and session for installed +MSIX tests; the hosted provisioner obtains a fresh Users-only logon of that owner. Native application fixtures exercise executable-derived startup, Settings, -admission, native decode and shutdown; MSIX uses the real application activation -manager and checks package identity and unchanged installed helper permissions. +admission, native decode and shutdown; MSIX launches its registered installed +executable and checks package identity and unchanged installed helper permissions. ### `scripts/heicguest` and `scripts/heicbuild` diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 00cfa677..2d94c5b5 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -181,8 +181,10 @@ Profile creation uses a bounded per-user/session cross-process mutex. These startup controls pass standalone standard-user x64/ARM64 CI at `69fef1a`, including the launch-time loopback permission query; they grant no additional AppContainer capabilities or filesystem rights. Hosted runner results do not qualify every -Windows installation. The installed-MSIX test process cannot start in the hosted -alternate-user session, so its package-context behavior remains unverified. +Windows installation. Installed-MSIX qualification now checks desktop-session +ownership and obtains a fresh standard-user logon of that owner on disposable +hosted VMs. The earlier alternate-user launch failed before application startup; +package-context behavior remains unverified until both native CI targets pass. Windows can drop blocked loopback traffic instead of returning a permission error. Both parent-owned listeners are positively checked before launch, and diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index 3cf99ba7..57c10707 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -77,30 +77,35 @@ process launch, as described by a [Microsoft Terminal maintainer](https://github It requires actual package identity, Store-managed behavior, a nonadministrator token and unchanged installed helper bytes/ACLs. -CI's `packaging/heic/qualify-windows.ps1` provisions a disposable local standard -account on a GitHub-hosted runner. For MSIX it adds a separate test application, -uses a disposable signing certificate, and records setup separately from -application execution. The child replaces inherited runner profile variables -with the loaded standard user's native environment via +CI's `packaging/heic/qualify-windows.ps1` provisions disposable test state on +GitHub-hosted runners only. Standalone qualification creates a Users-only account. +Installed-MSIX qualification uses the desktop owner's local account: the +provisioner resets its disposable password, temporarily removes other local +group memberships, and obtains a fresh Users-only logon. Its existing +administrative process prepares the package and restores membership afterwards. +The password reset is confined to the ephemeral hosted VM; this provisioner +must never run on a persistent workstation. The package uses a disposable +signing certificate and a separate test application. + +`qualify-windows-session.ps1` queries the actual Terminal Services session owner. +The child must match that SID and session, and rejects Administrators membership +including deny-only membership. The installed test independently requires that +SID/session, a standard-user token and actual package identity. The child replaces +inherited profile variables using [CreateEnvironmentBlock](https://learn.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-createenvironmentblock). -`qualify-windows-child.ps1` performs the unelevated work -and removes its test package. The parent removes its account, owned workspace -and certificate/trust entry. Neither script is called by PicFetch. CI runs both -architectures for standalone and installed-MSIX scenarios. Runtime or permission -query failures fail the gate; there is no successful skip or elevated substitute. -At `69fef1a`, standalone standard-user qualification passes on both architectures. -Installed-MSIX activation remains blocked: IApplicationActivationManager returned -0x80070520, and ordinary installed-executable launch returns Access denied with -either the installed directory or the owned writable workspace as its working -directory. Both packages install successfully; their test process never starts. -Microsoft requires an [interactive user for packaged application execution](https://learn.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-debug). -Qualification now needs native x64 and ARM64 environments with an interactive -standard-user session. Actual package identity and every existing guard must -pass there before this gate is complete. The hosted alternate-user fixture -does not establish installed Store helper activation, staging or sandbox behavior. -For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, -`Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` -and architecture-matched `Dependency`. Provision only disposable test state. +It removes its test package; the parent removes the owned workspace and test +certificate/trust entry. Neither script is called by PicFetch. + +Both architectures passed standalone qualification at `69fef1a`. Through +`7f5c1da`, installed-MSIX activation failed before the test process started: +COM activation returned 0x80070520 and direct launch returned Access denied. +The alternate account did not own the desktop session. The same-owner fresh +logon arrangement is under native CI qualification; no positive result is +claimed yet. It must pass every existing identity, permission, resource and +sandbox guard. For local session-owned execution, the configuration supplies +`Scenario: "msix"`, `Repository`, `Go`, `Work`, `Evidence`, `Arch`, `Commit`, +`UserSID`, `SessionID`, the signed `Package`, its `PackageName` and +architecture-matched `Dependency`. Provision only disposable test state. The Windows cache uses Win32 sharing restrictions to retain leased executables and serialize publishers; copied bytes are checked before publication and again diff --git a/internal/ui/images_native_windows_test.go b/internal/ui/images_native_windows_test.go index 38a95c5a..061897ee 100644 --- a/internal/ui/images_native_windows_test.go +++ b/internal/ui/images_native_windows_test.go @@ -90,8 +90,11 @@ func TestNativeInstalledHEICActivation(t *testing.T) { if err != nil { t.Fatal("installed test-MSIX configuration is required: ", err) } - var config struct{ Evidence, Commit, UserSID string } - if err = json.Unmarshal(configBytes, &config); err != nil || !filepath.IsAbs(config.Evidence) || config.Commit == "" || config.UserSID == "" { + var config struct { + Evidence, Commit, UserSID string + SessionID uint32 + } + if err = json.Unmarshal(configBytes, &config); err != nil || !filepath.IsAbs(config.Evidence) || config.Commit == "" || config.UserSID == "" || config.SessionID == 0 { t.Fatal("invalid installed test-MSIX evidence configuration") } output, err := os.OpenFile(config.Evidence+".log", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) @@ -127,6 +130,11 @@ func TestNativeInstalledHEICActivation(t *testing.T) { if err != nil || user.User.Sid.String() != config.UserSID { t.Fatal("installed activation did not use the provisioned standard account") } + var sessionID uint32 + if err = windows.ProcessIdToSessionId(uint32(os.Getpid()), &sessionID); err != nil || sessionID != config.SessionID { + t.Fatal("installed activation did not use the provisioned desktop session") + } + t.Logf("installed MSIX session=%d", sessionID) t.Setenv("PICFETCH_HEIC_ACTIVATION_CHILD", "1") t.Setenv("PICFETCH_HEIC_ACTIVATION_MSIX", "1") t.Setenv("PICFETCH_HEIC_ACTIVATION_FIXTURE", filepath.Join(root, "heic-activation-fixture.heic")) diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 index 74905abe..0090abbb 100644 --- a/packaging/heic/qualify-windows-child.ps1 +++ b/packaging/heic/qualify-windows-child.ps1 @@ -52,6 +52,16 @@ if ($config.Scenario -eq 'standalone') { if ($LASTEXITCODE -ne 0) { throw 'Native HEIC guards failed under the standard account.' } exit 0 } +. (Join-Path $PSScriptRoot 'qualify-windows-session.ps1') +$desktop = Get-HEICDesktopIdentity +if ($desktop.UserSID -ne $config.UserSID -or $desktop.SessionID -ne $config.SessionID) { + throw 'MSIX execution does not match the provisioned desktop owner/session.' +} +$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() +try { + if ($identity.Groups.Value -contains 'S-1-5-32-544') { throw 'MSIX execution requires a fresh standard-user token, not a filtered administrator.' } +} finally { $identity.Dispose() } +$desktop | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $config.Evidence 'standard-user-session.json') -Encoding utf8NoBOM $package = $null try { Add-AppxPackage -Path $config.Package -DependencyPath $config.Dependency diff --git a/packaging/heic/qualify-windows-session.ps1 b/packaging/heic/qualify-windows-session.ps1 new file mode 100644 index 00000000..6b6c0890 --- /dev/null +++ b/packaging/heic/qualify-windows-session.ps1 @@ -0,0 +1,43 @@ +# Read the owner of this process's actual Terminal Services session. A loaded +# profile or an interactive logon type alone does not establish session ownership. +Add-Type -TypeDefinition @' +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Security.Principal; +public static class HEICDesktopSession { + [DllImport("wtsapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool WTSQuerySessionInformationW(IntPtr server, int session, int kind, out IntPtr buffer, out int bytes); + [DllImport("wtsapi32.dll")] + static extern void WTSFreeMemory(IntPtr buffer); + static string Query(int session, int kind) { + IntPtr buffer; + int bytes; + if (!WTSQuerySessionInformationW(IntPtr.Zero, session, kind, out buffer, out bytes)) + throw new Win32Exception(Marshal.GetLastWin32Error()); + try { + if (bytes < 2) throw new InvalidOperationException("Session has no owner."); + return Marshal.PtrToStringUni(buffer); + } finally { WTSFreeMemory(buffer); } + } + public static SecurityIdentifier Owner(int session) { + if (session == 0) throw new InvalidOperationException("MSIX qualification requires a desktop session."); + string user = Query(session, 5); // WTSUserName + string domain = Query(session, 7); // WTSDomainName + if (String.IsNullOrEmpty(user) || String.IsNullOrEmpty(domain)) + throw new InvalidOperationException("Session has no named owner."); + return (SecurityIdentifier)new NTAccount(domain, user).Translate(typeof(SecurityIdentifier)); + } +} +'@ + +function Get-HEICDesktopIdentity { + $session = [System.Diagnostics.Process]::GetCurrentProcess().SessionId + $owner = [HEICDesktopSession]::Owner($session) + $current = [System.Security.Principal.WindowsIdentity]::GetCurrent() + try { + if ($current.User.Value -ne $owner.Value) { throw 'MSIX launch account must own its desktop session.' } + [pscustomobject]@{ SessionID = $session; UserSID = $current.User.Value; Name = $current.Name } + } finally { $current.Dispose() } +} diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 index f4db7e71..cccb7b35 100644 --- a/packaging/heic/qualify-windows.ps1 +++ b/packaging/heic/qualify-windows.ps1 @@ -1,5 +1,5 @@ -# Provisions disposable CI-only account/package state. Application tests run -# under that standard account; none of this provisioning is in PicFetch. +# Provisions disposable CI-only account/package state. MSIX uses a fresh +# standard-user logon of the desktop owner; none of this is in PicFetch. param( [ValidateSet('standalone', 'msix')][string]$Scenario = 'standalone', [Parameter(Mandatory = $true)][string]$EvidenceDirectory, @@ -22,12 +22,39 @@ $evidence = Join-Path $workRoot 'evidence' $certificate = $null $trusted = $null $account = $null +$createdAccount = $false +$removedGroups = @() +$addedUsers = $false New-Item -ItemType Directory -Path $workRoot, $evidence -Force | Out-Null New-Item -ItemType Directory -Path $EvidenceDirectory -Force | Out-Null try { $secret = ConvertTo-SecureString ('Pf!' + [Guid]::NewGuid().ToString('N') + '9a') -AsPlainText -Force - $account = New-LocalUser -Name $userName -Password $secret -Description 'Disposable PicFetch HEIC qualification account' - Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account + $desktop = $null + if ($Scenario -eq 'msix') { + . (Join-Path $PSScriptRoot 'qualify-windows-session.ps1') + $desktop = Get-HEICDesktopIdentity + $account = Get-LocalUser -SID $desktop.UserSID + $userName = $account.Name + # This VM is disposable. Keep the administrative provisioner's existing + # token, but authenticate the child after removing local group rights. + # A new logon must be Users-only; a filtered admin token is not accepted. + Set-LocalUser -SID $account.SID -Password $secret + foreach ($group in Get-LocalGroup) { + if ($group.SID.Value -eq 'S-1-5-32-545') { continue } + if (Get-LocalGroupMember -SID $group.SID | Where-Object { $_.SID.Value -eq $account.SID.Value }) { + Remove-LocalGroupMember -SID $group.SID -Member $account + $removedGroups += $group.SID + } + } + if (-not (Get-LocalGroupMember -SID 'S-1-5-32-545' | Where-Object { $_.SID.Value -eq $account.SID.Value })) { + Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account + $addedUsers = $true + } + } else { + $account = New-LocalUser -Name $userName -Password $secret -Description 'Disposable PicFetch HEIC qualification account' + $createdAccount = $true + Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account + } $credential = [PSCredential]::new("$env:COMPUTERNAME\$userName", $secret) & icacls $workRoot /grant "*$($account.SID.Value):(OI)(CI)M" | Out-Null if ($LASTEXITCODE -ne 0) { throw 'Could not prepare the owned qualification workspace.' } @@ -36,6 +63,7 @@ try { $config = @{ Scenario = $Scenario; Repository = $copy; Go = $go; Work = $workRoot Evidence = $evidence; Arch = $architecture; Commit = $env:GITHUB_SHA + UserSID = $account.SID.Value } if ($Scenario -eq 'msix') { if (-not $Executable -or -not $RuntimeArchive) { throw 'MSIX qualification requires the built Store executable and pinned runtime archive.' } @@ -47,7 +75,9 @@ try { & $go test -tags no_emoji,nodynamic,heicnative,microsoftstore -c -o (Join-Path $stage 'heic-activation.test.exe') ./internal/ui if ($LASTEXITCODE -ne 0) { throw 'Application activation probe build failed.' } Copy-Item -LiteralPath (Join-Path $repository 'scripts/heicbuild/testdata/tenbit.heic') -Destination (Join-Path $stage 'heic-activation-fixture.heic') - @{ Evidence = (Join-Path $evidence 'installed-msix'); Commit = $env:GITHUB_SHA; UserSID = $account.SID.Value } | + $config.SessionID = $desktop.SessionID + $desktop | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $evidence 'desktop-session.json') -Encoding utf8NoBOM + @{ Evidence = (Join-Path $evidence 'installed-msix'); Commit = $env:GITHUB_SHA; UserSID = $account.SID.Value; SessionID = $desktop.SessionID } | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $stage 'heic-activation.json') -Encoding utf8NoBOM $manifestPath = Join-Path $stage 'AppxManifest.xml' [xml]$manifest = Get-Content -LiteralPath $manifestPath -Raw @@ -109,7 +139,9 @@ try { if ($certificate) { Remove-Item -LiteralPath ("Cert:\CurrentUser\My\" + $certificate.Thumbprint) } } finally { try { - if ($account) { + foreach ($groupSID in $removedGroups) { Add-LocalGroupMember -SID $groupSID -Member $account } + if ($addedUsers) { Remove-LocalGroupMember -SID 'S-1-5-32-545' -Member $account } + if ($createdAccount) { try { Get-CimInstance -ClassName Win32_UserProfile -Filter "SID='$($account.SID.Value)'" | Remove-CimInstance } finally { Remove-LocalUser -SID $account.SID } diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index 46d0119f..b4757a9a 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -526,3 +526,55 @@ The documentation follow-up records this completed implementation checkpoint; it changes no executable or test inputs. Its fresh PR checks/reviews remain visible on PR #28. The local handoff and evidence directory preserve current operational state without rewriting the historical native results above. + +### Installed-MSIX CI repair — 2026-09-16 + +User asks to fix the two failing CI workers. Continue the Deep route, with the +lead owning diagnosis, implementation and review. The existing installed +`TestNativeInstalledHEICActivation` seam is the acceptance test: both native +architectures must execute it successfully from the registered package, under +the exact standard-user SID, retaining every sandbox and resource assertion. +`gh run view 35121709978 --job --log-failed` reproduces the observed red +verdict (104882311939 amd64; 104882311951 arm64); retained logs show successful +installation followed by Access denied before any test completion record. +Native CI is the only available execution environment, so its minutes-long +loop is the honest exception to the diagnosing skill's seconds-long target. + +Ranked hypotheses: desktop-owner/credential SID mismatch; direct executable +launch instead of registered activation; incomplete registration/permissions. +Qualification must not use debugging tokens, relaxed WindowsApps ACLs, +administrator execution, an extracted binary or skipped guards. + +Read-only source scout delegation: G1 yes (one bounded Windows API/source +question); G2 yes (lead fetches and checks every cited primary-source URL); +G3 yes (no writes); G4 yes (independent API/source discovery); G5 yes (new +session/token source search, not existing code review). S/W: cannot answer via +one repository search; no implementation specification delegated. Existing +scout can be reused. Lead concurrently investigates the actual launcher and +CI logs. Cost: one scout, no delegated design/review/fixes. + +First hypothesis probe changes only the CI account/session arrangement, retaining +direct installed-executable launch and all existing application guards. A new +shared PowerShell session reader checks WTS owner SID against the process user; +the child and installed test require the provisioned SID/session. Hosted MSIX +provisioning resets only the ephemeral runner account password, removes its local +memberships except Users before fresh authentication, and restores memberships +with its retained administrative token. No persistent-host execution is admitted. +Standalone qualification still uses a newly created disposable account. + +Microsoft documents token creation on authentication and its group/logon SIDs: +https://learn.microsoft.com/en-us/windows/win32/secauthz/access-tokens . A Microsoft +engineer confirms Windows 11 supports installed executable activation with +identity: https://github.com/microsoft/WindowsAppSDK/discussions/2391 . +Those primitives do not guarantee same-SID fresh-logon MSIX behavior: native CI +is the decisive experiment, not a claimed success. The existing installed test +is the real regression seam, already red on both jobs; no source-string test +is substituted for execution. + +Pre-push focused tests: nativeguards, msixstage and heicpackage pass; GoLand +reports no findings in all four changed/new code files, including warnings. +The first cross-compile attempt was blocked by sandboxed Go-cache access; +unsandboxed architecture-matched builds are used for that check. + +Both amd64 and arm64 installed-test cross-compiles pass. The complete native +CI jobs remain the required green signal for the account/session change. diff --git a/todos.md b/todos.md index 8d5730d5..9a13cfb3 100644 --- a/todos.md +++ b/todos.md @@ -111,10 +111,10 @@ after an enabled preference and validated installed package. Remaining: Windows application-level private-storage/ACL and failed-query recovery plus concurrent application lifetimes (08), installed-MSIX activation (05), and final integrated qualification (09). Both MSIX packages install but - their test processes still fail to start with Access denied. Split fixture - preparation from execution and qualify native x64/ARM64 desktops owned by the - standard account; a loaded profile under alternate credentials is insufficient. - No suitable environment access was supplied. The separate GitHub AI scanner + their test processes failed to start with Access denied through `7f5c1da`. + The CI repair tests a fresh Users-only logon of the actual desktop owner, with + SID/session and token checks; both native results remain required. + The separate GitHub AI scanner still fails before analysis with an unsupported-model HTTP 400. Keep all failing gates and permission checks. The [active plan](plans/2026-09-16-experimental-heic-opt-in.md) and [activation record](docs/heic/experimental-opt-in.md) retain exact evidence. From e8ea7d49cbfa4e4e9b2a81c4ac4750e78e4c0bb7 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 19:16:00 +0200 Subject: [PATCH 28/30] Test installed MSIX with explicit standard-user authentication --- ARCHITECTURE.md | 9 +-- THREAT-MODEL.md | 6 +- docs/heic/experimental-opt-in.md | 59 ++++++++-------- internal/ui/images_native_windows_test.go | 12 +--- packaging/heic/qualify-windows-child.ps1 | 13 +--- packaging/heic/qualify-windows-logon.ps1 | 74 ++++++++++++++++++++ packaging/heic/qualify-windows-session.ps1 | 43 ------------ packaging/heic/qualify-windows.ps1 | 57 +++++---------- plans/2026-09-16-experimental-heic-opt-in.md | 50 +++++++++++++ todos.md | 11 +-- 10 files changed, 190 insertions(+), 144 deletions(-) create mode 100644 packaging/heic/qualify-windows-logon.ps1 delete mode 100644 packaging/heic/qualify-windows-session.ps1 diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 070ae590..42ee7dfb 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -692,11 +692,12 @@ Authenticode signing. Native helper tests use the same staging tool. Makefile and release/MSIX assembly retain the helper directory; package creation alone does not enable the saved HEIC preference. `packaging/heic/qualify-windows*.ps1` separates disposable CI account/signing provisioning from standard-user execution. -`qualify-windows-session.ps1` verifies the desktop owner and session for installed -MSIX tests; the hosted provisioner obtains a fresh Users-only logon of that owner. +`qualify-windows-logon.ps1` authenticates the installed test account explicitly +and starts the fixture with its primary token; this CI-only route is under +native qualification. Native application fixtures exercise executable-derived startup, Settings, -admission, native decode and shutdown; MSIX launches its registered installed -executable and checks package identity and unchanged installed helper permissions. +admission, native decode and shutdown; MSIX uses the real application activation +manager and checks package identity and unchanged installed helper permissions. ### `scripts/heicguest` and `scripts/heicbuild` diff --git a/THREAT-MODEL.md b/THREAT-MODEL.md index 2d94c5b5..00cfa677 100644 --- a/THREAT-MODEL.md +++ b/THREAT-MODEL.md @@ -181,10 +181,8 @@ Profile creation uses a bounded per-user/session cross-process mutex. These startup controls pass standalone standard-user x64/ARM64 CI at `69fef1a`, including the launch-time loopback permission query; they grant no additional AppContainer capabilities or filesystem rights. Hosted runner results do not qualify every -Windows installation. Installed-MSIX qualification now checks desktop-session -ownership and obtains a fresh standard-user logon of that owner on disposable -hosted VMs. The earlier alternate-user launch failed before application startup; -package-context behavior remains unverified until both native CI targets pass. +Windows installation. The installed-MSIX test process cannot start in the hosted +alternate-user session, so its package-context behavior remains unverified. Windows can drop blocked loopback traffic instead of returning a permission error. Both parent-owned listeners are positively checked before launch, and diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index 57c10707..2bc198a6 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -77,35 +77,38 @@ process launch, as described by a [Microsoft Terminal maintainer](https://github It requires actual package identity, Store-managed behavior, a nonadministrator token and unchanged installed helper bytes/ACLs. -CI's `packaging/heic/qualify-windows.ps1` provisions disposable test state on -GitHub-hosted runners only. Standalone qualification creates a Users-only account. -Installed-MSIX qualification uses the desktop owner's local account: the -provisioner resets its disposable password, temporarily removes other local -group memberships, and obtains a fresh Users-only logon. Its existing -administrative process prepares the package and restores membership afterwards. -The password reset is confined to the ephemeral hosted VM; this provisioner -must never run on a persistent workstation. The package uses a disposable -signing certificate and a separate test application. - -`qualify-windows-session.ps1` queries the actual Terminal Services session owner. -The child must match that SID and session, and rejects Administrators membership -including deny-only membership. The installed test independently requires that -SID/session, a standard-user token and actual package identity. The child replaces -inherited profile variables using +CI's `packaging/heic/qualify-windows.ps1` provisions a disposable local standard +account on a GitHub-hosted runner. For MSIX it adds a separate test application, +uses a disposable signing certificate, and records setup separately from +application execution. The child replaces inherited runner profile variables +with the loaded standard user's native environment via [CreateEnvironmentBlock](https://learn.microsoft.com/en-us/windows/win32/api/userenv/nf-userenv-createenvironmentblock). -It removes its test package; the parent removes the owned workspace and test -certificate/trust entry. Neither script is called by PicFetch. - -Both architectures passed standalone qualification at `69fef1a`. Through -`7f5c1da`, installed-MSIX activation failed before the test process started: -COM activation returned 0x80070520 and direct launch returned Access denied. -The alternate account did not own the desktop session. The same-owner fresh -logon arrangement is under native CI qualification; no positive result is -claimed yet. It must pass every existing identity, permission, resource and -sandbox guard. For local session-owned execution, the configuration supplies -`Scenario: "msix"`, `Repository`, `Go`, `Work`, `Evidence`, `Arch`, `Commit`, -`UserSID`, `SessionID`, the signed `Package`, its `PackageName` and -architecture-matched `Dependency`. Provision only disposable test state. +`qualify-windows-child.ps1` performs the unelevated work +and removes its test package. The parent removes its account, owned workspace +and certificate/trust entry. Neither script is called by PicFetch. CI runs both +architectures for standalone and installed-MSIX scenarios. Runtime or permission +query failures fail the gate; there is no successful skip or elevated substitute. +At `69fef1a`, standalone standard-user qualification passes on both architectures. +Installed-MSIX activation remains blocked: IApplicationActivationManager returned +0x80070520, and ordinary installed-executable launch returns Access denied with +either the installed directory or the owned writable workspace as its working +directory. Both packages install successfully; their test process never starts. +Microsoft requires an [interactive user for packaged application execution](https://learn.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-debug). +Qualification now needs native x64 and ARM64 environments with an interactive +standard-user session. Actual package identity and every existing guard must +pass there before this gate is complete. The hosted alternate-user fixture +does not establish installed Store helper activation, staging or sandbox behavior. +A same-desktop-owner experiment at `98d3895` also failed on both hosted +architectures: Windows refused to remove the protected account from +Administrators (STATUS_SPECIAL_ACCOUNT, 0xC0000124). That account-changing +experiment was removed. A fresh standard-user desktop remains an environment +prerequisite, not a demonstrated hosted-CI configuration. A second controlled +experiment replaces only the credential process-creation API with explicit +`LogonUserW` authentication and `CreateProcessWithTokenW`. Its application-token +and package assertions remain unchanged; both native results are required. +For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, +`Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` +and architecture-matched `Dependency`. Provision only disposable test state. The Windows cache uses Win32 sharing restrictions to retain leased executables and serialize publishers; copied bytes are checked before publication and again diff --git a/internal/ui/images_native_windows_test.go b/internal/ui/images_native_windows_test.go index 061897ee..38a95c5a 100644 --- a/internal/ui/images_native_windows_test.go +++ b/internal/ui/images_native_windows_test.go @@ -90,11 +90,8 @@ func TestNativeInstalledHEICActivation(t *testing.T) { if err != nil { t.Fatal("installed test-MSIX configuration is required: ", err) } - var config struct { - Evidence, Commit, UserSID string - SessionID uint32 - } - if err = json.Unmarshal(configBytes, &config); err != nil || !filepath.IsAbs(config.Evidence) || config.Commit == "" || config.UserSID == "" || config.SessionID == 0 { + var config struct{ Evidence, Commit, UserSID string } + if err = json.Unmarshal(configBytes, &config); err != nil || !filepath.IsAbs(config.Evidence) || config.Commit == "" || config.UserSID == "" { t.Fatal("invalid installed test-MSIX evidence configuration") } output, err := os.OpenFile(config.Evidence+".log", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) @@ -130,11 +127,6 @@ func TestNativeInstalledHEICActivation(t *testing.T) { if err != nil || user.User.Sid.String() != config.UserSID { t.Fatal("installed activation did not use the provisioned standard account") } - var sessionID uint32 - if err = windows.ProcessIdToSessionId(uint32(os.Getpid()), &sessionID); err != nil || sessionID != config.SessionID { - t.Fatal("installed activation did not use the provisioned desktop session") - } - t.Logf("installed MSIX session=%d", sessionID) t.Setenv("PICFETCH_HEIC_ACTIVATION_CHILD", "1") t.Setenv("PICFETCH_HEIC_ACTIVATION_MSIX", "1") t.Setenv("PICFETCH_HEIC_ACTIVATION_FIXTURE", filepath.Join(root, "heic-activation-fixture.heic")) diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 index 0090abbb..86795465 100644 --- a/packaging/heic/qualify-windows-child.ps1 +++ b/packaging/heic/qualify-windows-child.ps1 @@ -1,6 +1,7 @@ -param([Parameter(Mandatory = $true)][string]$Configuration, [switch]$RequireInstalledMSIX) +param([Parameter(Mandatory = $true)][string]$Configuration, [switch]$RequireInstalledMSIX, [switch]$Transcript) $ErrorActionPreference = 'Stop' $config = Get-Content -LiteralPath $Configuration -Raw | ConvertFrom-Json +if ($Transcript) { Start-Transcript -LiteralPath (Join-Path $config.Evidence 'standard-user.stdout.log') -Force | Out-Null } if ($RequireInstalledMSIX -and $config.Scenario -ne 'msix') { throw 'Installed-MSIX configuration is required for the complete Windows native gate.' } Set-Location -LiteralPath $config.Repository # Start-Process with credentials still inherits the runner's environment. @@ -52,16 +53,6 @@ if ($config.Scenario -eq 'standalone') { if ($LASTEXITCODE -ne 0) { throw 'Native HEIC guards failed under the standard account.' } exit 0 } -. (Join-Path $PSScriptRoot 'qualify-windows-session.ps1') -$desktop = Get-HEICDesktopIdentity -if ($desktop.UserSID -ne $config.UserSID -or $desktop.SessionID -ne $config.SessionID) { - throw 'MSIX execution does not match the provisioned desktop owner/session.' -} -$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() -try { - if ($identity.Groups.Value -contains 'S-1-5-32-544') { throw 'MSIX execution requires a fresh standard-user token, not a filtered administrator.' } -} finally { $identity.Dispose() } -$desktop | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $config.Evidence 'standard-user-session.json') -Encoding utf8NoBOM $package = $null try { Add-AppxPackage -Path $config.Package -DependencyPath $config.Dependency diff --git a/packaging/heic/qualify-windows-logon.ps1 b/packaging/heic/qualify-windows-logon.ps1 new file mode 100644 index 00000000..c9007852 --- /dev/null +++ b/packaging/heic/qualify-windows-logon.ps1 @@ -0,0 +1,74 @@ +# CI-only alternate-user process creation using an explicitly authenticated +# primary token. The installed test still verifies the actual account/groups. +Add-Type -TypeDefinition @' +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +public static class HEICStandardUserLogon { + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct StartupInfo { + public int Size; + public string Reserved, Desktop, Title; + public uint X, Y, Width, Height, XChars, YChars, Fill, Flags; + public ushort Show, ReservedSize; + public IntPtr ReservedBytes, Input, Output, Error; + } + [StructLayout(LayoutKind.Sequential)] + struct ProcessInfo { + public IntPtr Process, Thread; + public uint ProcessId, ThreadId; + } + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool LogonUserW(string user, string domain, IntPtr password, uint type, uint provider, out IntPtr token); + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool CreateProcessWithTokenW(IntPtr token, uint logonFlags, string application, + StringBuilder command, uint flags, IntPtr environment, string directory, ref StartupInfo startup, out ProcessInfo process); + [DllImport("kernel32.dll", SetLastError = true)] + static extern uint WaitForSingleObject(IntPtr handle, uint milliseconds); + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool GetExitCodeProcess(IntPtr process, out uint code); + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool TerminateProcess(IntPtr process, uint code); + [DllImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool CloseHandle(IntPtr handle); + public static uint Run(string user, string domain, SecureString password, string application, string arguments, string directory) { + IntPtr token = IntPtr.Zero; + IntPtr secret = Marshal.SecureStringToGlobalAllocUnicode(password); + try { + // LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT. This authenticates + // the Users-only account; it does not derive a filtered administrator token. + if (!LogonUserW(user, domain, secret, 2, 0, out token)) + throw new Win32Exception(Marshal.GetLastWin32Error(), "Standard-user authentication failed."); + } finally { Marshal.ZeroFreeGlobalAllocUnicode(secret); } + try { + var startup = new StartupInfo { Size = Marshal.SizeOf(typeof(StartupInfo)) }; + var command = new StringBuilder("\"" + application + "\" " + arguments); + ProcessInfo process; + // LOGON_WITH_PROFILE; Windows supplies the account's environment and grants + // that account access to the inherited desktop when Desktop is null. + if (!CreateProcessWithTokenW(token, 1, application, command, 0, IntPtr.Zero, directory, ref startup, out process)) + throw new Win32Exception(Marshal.GetLastWin32Error(), "Standard-user process creation failed."); + try { + uint wait = WaitForSingleObject(process.Process, 600000); + if (wait != 0) { + int error = Marshal.GetLastWin32Error(); + if (!TerminateProcess(process.Process, 1)) throw new Win32Exception(Marshal.GetLastWin32Error()); + WaitForSingleObject(process.Process, 10000); + if (wait == 258) throw new TimeoutException("Standard-user qualification exceeded ten minutes."); + throw new Win32Exception(error, "Cannot wait for standard-user qualification."); + } + uint code; + if (!GetExitCodeProcess(process.Process, out code)) throw new Win32Exception(Marshal.GetLastWin32Error()); + return code; + } finally { CloseHandle(process.Thread); CloseHandle(process.Process); } + } finally { CloseHandle(token); } + } +} +'@ diff --git a/packaging/heic/qualify-windows-session.ps1 b/packaging/heic/qualify-windows-session.ps1 deleted file mode 100644 index 6b6c0890..00000000 --- a/packaging/heic/qualify-windows-session.ps1 +++ /dev/null @@ -1,43 +0,0 @@ -# Read the owner of this process's actual Terminal Services session. A loaded -# profile or an interactive logon type alone does not establish session ownership. -Add-Type -TypeDefinition @' -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using System.Security.Principal; -public static class HEICDesktopSession { - [DllImport("wtsapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool WTSQuerySessionInformationW(IntPtr server, int session, int kind, out IntPtr buffer, out int bytes); - [DllImport("wtsapi32.dll")] - static extern void WTSFreeMemory(IntPtr buffer); - static string Query(int session, int kind) { - IntPtr buffer; - int bytes; - if (!WTSQuerySessionInformationW(IntPtr.Zero, session, kind, out buffer, out bytes)) - throw new Win32Exception(Marshal.GetLastWin32Error()); - try { - if (bytes < 2) throw new InvalidOperationException("Session has no owner."); - return Marshal.PtrToStringUni(buffer); - } finally { WTSFreeMemory(buffer); } - } - public static SecurityIdentifier Owner(int session) { - if (session == 0) throw new InvalidOperationException("MSIX qualification requires a desktop session."); - string user = Query(session, 5); // WTSUserName - string domain = Query(session, 7); // WTSDomainName - if (String.IsNullOrEmpty(user) || String.IsNullOrEmpty(domain)) - throw new InvalidOperationException("Session has no named owner."); - return (SecurityIdentifier)new NTAccount(domain, user).Translate(typeof(SecurityIdentifier)); - } -} -'@ - -function Get-HEICDesktopIdentity { - $session = [System.Diagnostics.Process]::GetCurrentProcess().SessionId - $owner = [HEICDesktopSession]::Owner($session) - $current = [System.Security.Principal.WindowsIdentity]::GetCurrent() - try { - if ($current.User.Value -ne $owner.Value) { throw 'MSIX launch account must own its desktop session.' } - [pscustomobject]@{ SessionID = $session; UserSID = $current.User.Value; Name = $current.Name } - } finally { $current.Dispose() } -} diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 index cccb7b35..9be99eee 100644 --- a/packaging/heic/qualify-windows.ps1 +++ b/packaging/heic/qualify-windows.ps1 @@ -1,5 +1,5 @@ -# Provisions disposable CI-only account/package state. MSIX uses a fresh -# standard-user logon of the desktop owner; none of this is in PicFetch. +# Provisions disposable CI-only account/package state. Application tests run +# under that standard account; none of this provisioning is in PicFetch. param( [ValidateSet('standalone', 'msix')][string]$Scenario = 'standalone', [Parameter(Mandatory = $true)][string]$EvidenceDirectory, @@ -22,39 +22,12 @@ $evidence = Join-Path $workRoot 'evidence' $certificate = $null $trusted = $null $account = $null -$createdAccount = $false -$removedGroups = @() -$addedUsers = $false New-Item -ItemType Directory -Path $workRoot, $evidence -Force | Out-Null New-Item -ItemType Directory -Path $EvidenceDirectory -Force | Out-Null try { $secret = ConvertTo-SecureString ('Pf!' + [Guid]::NewGuid().ToString('N') + '9a') -AsPlainText -Force - $desktop = $null - if ($Scenario -eq 'msix') { - . (Join-Path $PSScriptRoot 'qualify-windows-session.ps1') - $desktop = Get-HEICDesktopIdentity - $account = Get-LocalUser -SID $desktop.UserSID - $userName = $account.Name - # This VM is disposable. Keep the administrative provisioner's existing - # token, but authenticate the child after removing local group rights. - # A new logon must be Users-only; a filtered admin token is not accepted. - Set-LocalUser -SID $account.SID -Password $secret - foreach ($group in Get-LocalGroup) { - if ($group.SID.Value -eq 'S-1-5-32-545') { continue } - if (Get-LocalGroupMember -SID $group.SID | Where-Object { $_.SID.Value -eq $account.SID.Value }) { - Remove-LocalGroupMember -SID $group.SID -Member $account - $removedGroups += $group.SID - } - } - if (-not (Get-LocalGroupMember -SID 'S-1-5-32-545' | Where-Object { $_.SID.Value -eq $account.SID.Value })) { - Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account - $addedUsers = $true - } - } else { - $account = New-LocalUser -Name $userName -Password $secret -Description 'Disposable PicFetch HEIC qualification account' - $createdAccount = $true - Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account - } + $account = New-LocalUser -Name $userName -Password $secret -Description 'Disposable PicFetch HEIC qualification account' + Add-LocalGroupMember -SID 'S-1-5-32-545' -Member $account $credential = [PSCredential]::new("$env:COMPUTERNAME\$userName", $secret) & icacls $workRoot /grant "*$($account.SID.Value):(OI)(CI)M" | Out-Null if ($LASTEXITCODE -ne 0) { throw 'Could not prepare the owned qualification workspace.' } @@ -63,7 +36,6 @@ try { $config = @{ Scenario = $Scenario; Repository = $copy; Go = $go; Work = $workRoot Evidence = $evidence; Arch = $architecture; Commit = $env:GITHUB_SHA - UserSID = $account.SID.Value } if ($Scenario -eq 'msix') { if (-not $Executable -or -not $RuntimeArchive) { throw 'MSIX qualification requires the built Store executable and pinned runtime archive.' } @@ -75,9 +47,7 @@ try { & $go test -tags no_emoji,nodynamic,heicnative,microsoftstore -c -o (Join-Path $stage 'heic-activation.test.exe') ./internal/ui if ($LASTEXITCODE -ne 0) { throw 'Application activation probe build failed.' } Copy-Item -LiteralPath (Join-Path $repository 'scripts/heicbuild/testdata/tenbit.heic') -Destination (Join-Path $stage 'heic-activation-fixture.heic') - $config.SessionID = $desktop.SessionID - $desktop | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $evidence 'desktop-session.json') -Encoding utf8NoBOM - @{ Evidence = (Join-Path $evidence 'installed-msix'); Commit = $env:GITHUB_SHA; UserSID = $account.SID.Value; SessionID = $desktop.SessionID } | + @{ Evidence = (Join-Path $evidence 'installed-msix'); Commit = $env:GITHUB_SHA; UserSID = $account.SID.Value } | ConvertTo-Json | Set-Content -LiteralPath (Join-Path $stage 'heic-activation.json') -Encoding utf8NoBOM $manifestPath = Join-Path $stage 'AppxManifest.xml' [xml]$manifest = Get-Content -LiteralPath $manifestPath -Raw @@ -124,10 +94,19 @@ try { $config | ConvertTo-Json | Set-Content -LiteralPath $configPath -Encoding utf8NoBOM $child = Join-Path $copy 'packaging/heic/qualify-windows-child.ps1' $powershell = (Get-Command pwsh).Source - $process = Start-Process -FilePath $powershell -Credential $credential -LoadUserProfile -WorkingDirectory $copy -ArgumentList @('-NoProfile', '-File', "`"$child`"", '-Configuration', "`"$configPath`"") -PassThru -Wait -RedirectStandardOutput (Join-Path $evidence 'standard-user.stdout.log') -RedirectStandardError (Join-Path $evidence 'standard-user.stderr.log') + $exitCode = 0 + if ($Scenario -eq 'msix') { + . (Join-Path $PSScriptRoot 'qualify-windows-logon.ps1') + New-Item -ItemType File -Path (Join-Path $evidence 'standard-user.stderr.log') | Out-Null + $arguments = "-NoProfile -NonInteractive -File `"$child`" -Configuration `"$configPath`" -Transcript" + $exitCode = [HEICStandardUserLogon]::Run($userName, $env:COMPUTERNAME, $secret, $powershell, $arguments, $copy) + } else { + $process = Start-Process -FilePath $powershell -Credential $credential -LoadUserProfile -WorkingDirectory $copy -ArgumentList @('-NoProfile', '-File', "`"$child`"", '-Configuration', "`"$configPath`"") -PassThru -Wait -RedirectStandardOutput (Join-Path $evidence 'standard-user.stdout.log') -RedirectStandardError (Join-Path $evidence 'standard-user.stderr.log') + $exitCode = $process.ExitCode + } Get-Content -LiteralPath (Join-Path $evidence 'standard-user.stdout.log') Get-Content -LiteralPath (Join-Path $evidence 'standard-user.stderr.log') - if ($process.ExitCode -ne 0) { throw "Standard-user qualification failed with exit $($process.ExitCode)." } + if ($exitCode -ne 0) { throw "Standard-user qualification failed with exit $exitCode." } } finally { try { Copy-Item -Path (Join-Path $evidence '*') -Destination $EvidenceDirectory -Recurse -Force @@ -139,9 +118,7 @@ try { if ($certificate) { Remove-Item -LiteralPath ("Cert:\CurrentUser\My\" + $certificate.Thumbprint) } } finally { try { - foreach ($groupSID in $removedGroups) { Add-LocalGroupMember -SID $groupSID -Member $account } - if ($addedUsers) { Remove-LocalGroupMember -SID 'S-1-5-32-545' -Member $account } - if ($createdAccount) { + if ($account) { try { Get-CimInstance -ClassName Win32_UserProfile -Filter "SID='$($account.SID.Value)'" | Remove-CimInstance } finally { Remove-LocalUser -SID $account.SID } diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index b4757a9a..9fea17a3 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -578,3 +578,53 @@ unsandboxed architecture-matched builds are used for that check. Both amd64 and arm64 installed-test cross-compiles pass. The complete native CI jobs remain the required green signal for the account/session change. + + +Experiment result: **not a fix**. At `98d3895`, native CI 35125370261 passes +every job except the same two installed-MSIX workers. Jobs 104894975201 and +104894975308 fail before package construction when removing the desktop account +from Administrators: NTSTATUS 3221225764 / 0xC0000124 (STATUS_SPECIAL_ACCOUNT). +Microsoft documents that the built-in Administrator cannot be removed from +Administrators: +https://learn.microsoft.com/en-us/windows/security/identity-protection/access-control/local-accounts . +The fresh standard-token experiment therefore cannot run on either hosted image. +Retained raw logs: `evidence/fix-98d3895-{amd64,arm64}.log`. No installed test +completed, and no positive package-context result is claimed. + +The failed account/password mutation and its dependent session assertions are +removed. The previously existing fixture and all mandatory gates are restored; +no WindowsApps ACL, standard-user requirement, identity check, sandbox control or +required job is relaxed. This avoids leaving an unsupported test setup in the +branch. The user has been asked whether native x64/ARM64 standard-user desktop +environments are available; no external access or paid infrastructure is assumed. + +Local `make verify-build`, focused package tests and both Windows cross-compiles +passed for the experiment. Native CI's other thirteen ordinary jobs passed. +Actual post-suppression Qodana report has zero findings. Fresh Codex code review +5701461799 reports no findings on 98d3895; this does not change the failed CI +verdict. Only read-only source discovery was delegated; all changes, assessment +and cleanup were performed by the lead. + + +Remaining API hypothesis: the failure may depend specifically on +CreateProcessWithLogonW's token/logon handling rather than every different-SID +process in that desktop. Microsoft documents LogonUserW -> primary token -> +CreateProcessWithTokenW as a supported ordinary process launch: +https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprocesswithtokenw . +It does not guarantee MSIX activation. The second experiment changes only the +MSIX child launcher to that explicit authentication path; the old standalone +launcher, disposable Users-only account, installed executable launch, identity +checks and sandbox tests stay unchanged. The child's PowerShell transcript +preserves output without adding a command-shell quoting layer or inherited +administrator token. The same two native jobs are the red/green oracle. If the +same activation error remains, this API-specific hypothesis is rejected too. + +The lead wrote the CI-only helper; source scout found no confirmed supported +cross-user MSIX workaround. No secondary design/fix/review was delegated. +Temporary PowerShell tooling under /tmp is used only for syntax/C# compilation; +it adds no shipped dependency or runtime change. + +Second experiment pre-push: all three PowerShell scripts parse with the temporary +PowerShell 7.5.3 runtime; the embedded C# compiles. Focused nativeguards/msixstage/ +heicpackage tests pass, and GoLand reports no findings in the three script files. +The failed first experiment's code and its dependent Go assertions are removed. diff --git a/todos.md b/todos.md index 9a13cfb3..e4e65097 100644 --- a/todos.md +++ b/todos.md @@ -111,10 +111,13 @@ after an enabled preference and validated installed package. Remaining: Windows application-level private-storage/ACL and failed-query recovery plus concurrent application lifetimes (08), installed-MSIX activation (05), and final integrated qualification (09). Both MSIX packages install but - their test processes failed to start with Access denied through `7f5c1da`. - The CI repair tests a fresh Users-only logon of the actual desktop owner, with - SID/session and token checks; both native results remain required. - The separate GitHub AI scanner + their test processes still fail to start with Access denied. Split fixture + preparation from execution and qualify native x64/ARM64 desktops owned by the + standard account; a loaded profile under alternate credentials is insufficient. + The same-owner fresh-logon experiment at `98d3895` also failed: both hosted + desktops use a protected account that Windows refuses to remove from + Administrators (0xC0000124). The experiment was removed; all gates remain. + Suitable environment access is still unresolved. The separate GitHub AI scanner still fails before analysis with an unsupported-model HTTP 400. Keep all failing gates and permission checks. The [active plan](plans/2026-09-16-experimental-heic-opt-in.md) and [activation record](docs/heic/experimental-opt-in.md) retain exact evidence. From dea62b96b9c3cbbe5d2d3d557b9e53840232d748 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 19:38:13 +0200 Subject: [PATCH 29/30] Launch the noninteractive MSIX fixture without a console --- ARCHITECTURE.md | 5 +++-- packaging/heic/qualify-windows-logon.ps1 | 21 ++++++++++++++++---- packaging/heic/qualify-windows.ps1 | 14 ++++++++++++- plans/2026-09-16-experimental-heic-opt-in.md | 20 +++++++++++++++++++ 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 42ee7dfb..49cedbb3 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -696,8 +696,9 @@ separates disposable CI account/signing provisioning from standard-user executio and starts the fixture with its primary token; this CI-only route is under native qualification. Native application fixtures exercise executable-derived startup, Settings, -admission, native decode and shutdown; MSIX uses the real application activation -manager and checks package identity and unchanged installed helper permissions. +admission, native decode and shutdown; MSIX launches its registered installed +WindowsApps executable directly and checks package identity and unchanged +installed helper permissions. ### `scripts/heicguest` and `scripts/heicbuild` diff --git a/packaging/heic/qualify-windows-logon.ps1 b/packaging/heic/qualify-windows-logon.ps1 index c9007852..1931a476 100644 --- a/packaging/heic/qualify-windows-logon.ps1 +++ b/packaging/heic/qualify-windows-logon.ps1 @@ -3,6 +3,8 @@ Add-Type -TypeDefinition @' using System; using System.ComponentModel; +using System.Diagnostics; +using System.IO; using System.Runtime.InteropServices; using System.Security; using System.Text; @@ -38,7 +40,7 @@ public static class HEICStandardUserLogon { [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool CloseHandle(IntPtr handle); - public static uint Run(string user, string domain, SecureString password, string application, string arguments, string directory) { + public static uint Run(string user, string domain, SecureString password, string application, string arguments, string directory, string transcript) { IntPtr token = IntPtr.Zero; IntPtr secret = Marshal.SecureStringToGlobalAllocUnicode(password); try { @@ -53,15 +55,26 @@ public static class HEICStandardUserLogon { ProcessInfo process; // LOGON_WITH_PROFILE; Windows supplies the account's environment and grants // that account access to the inherited desktop when Desktop is null. - if (!CreateProcessWithTokenW(token, 1, application, command, 0, IntPtr.Zero, directory, ref startup, out process)) + const uint createNoWindow = 0x08000000; + if (!CreateProcessWithTokenW(token, 1, application, command, createNoWindow, IntPtr.Zero, directory, ref startup, out process)) throw new Win32Exception(Marshal.GetLastWin32Error(), "Standard-user process creation failed."); try { - uint wait = WaitForSingleObject(process.Process, 600000); + var elapsed = Stopwatch.StartNew(); + uint wait; + string timeout = "Standard-user qualification exceeded ten minutes."; + do { + wait = WaitForSingleObject(process.Process, 1000); + if (wait != 258) break; + if (elapsed.ElapsedMilliseconds >= 60000 && !File.Exists(transcript)) { + timeout = "Standard-user PowerShell did not begin its transcript within one minute."; + break; + } + } while (elapsed.ElapsedMilliseconds < 600000); if (wait != 0) { int error = Marshal.GetLastWin32Error(); if (!TerminateProcess(process.Process, 1)) throw new Win32Exception(Marshal.GetLastWin32Error()); WaitForSingleObject(process.Process, 10000); - if (wait == 258) throw new TimeoutException("Standard-user qualification exceeded ten minutes."); + if (wait == 258) throw new TimeoutException(timeout); throw new Win32Exception(error, "Cannot wait for standard-user qualification."); } uint code; diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 index 9be99eee..08c43e84 100644 --- a/packaging/heic/qualify-windows.ps1 +++ b/packaging/heic/qualify-windows.ps1 @@ -99,7 +99,19 @@ try { . (Join-Path $PSScriptRoot 'qualify-windows-logon.ps1') New-Item -ItemType File -Path (Join-Path $evidence 'standard-user.stderr.log') | Out-Null $arguments = "-NoProfile -NonInteractive -File `"$child`" -Configuration `"$configPath`" -Transcript" - $exitCode = [HEICStandardUserLogon]::Run($userName, $env:COMPUTERNAME, $secret, $powershell, $arguments, $copy) + $activationStarted = Get-Date + try { + $exitCode = [HEICStandardUserLogon]::Run($userName, $env:COMPUTERNAME, $secret, $powershell, $arguments, $copy, (Join-Path $evidence 'standard-user.stdout.log')) + } finally { + $events = foreach ($channel in @('Microsoft-Windows-AppModel-Runtime/Admin', 'Microsoft-Windows-AppXDeploymentServer/Operational')) { + try { + $packageEvents = @(Get-WinEvent -FilterHashtable @{ LogName = $channel; StartTime = $activationStarted } -MaxEvents 100 | + Where-Object { $_.Message -like "*$packageName*" } | Select-Object TimeCreated, Id, LevelDisplayName, Message) + @{ Channel = $channel; Events = $packageEvents } + } catch { @{ Channel = $channel; QueryError = $_.Exception.Message } } + } + ConvertTo-Json -InputObject @($events) -Depth 5 | Set-Content -LiteralPath (Join-Path $evidence 'activation-events.json') -Encoding utf8NoBOM + } } else { $process = Start-Process -FilePath $powershell -Credential $credential -LoadUserProfile -WorkingDirectory $copy -ArgumentList @('-NoProfile', '-File', "`"$child`"", '-Configuration', "`"$configPath`"") -PassThru -Wait -RedirectStandardOutput (Join-Path $evidence 'standard-user.stdout.log') -RedirectStandardError (Join-Path $evidence 'standard-user.stderr.log') $exitCode = $process.ExitCode diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index 9fea17a3..53030107 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -628,3 +628,23 @@ Second experiment pre-push: all three PowerShell scripts parse with the temporar PowerShell 7.5.3 runtime; the embedded C# compiles. Focused nativeguards/msixstage/ heicpackage tests pass, and GoLand reports no findings in the three script files. The failed first experiment's code and its dependent Go assertions are removed. + +At `e8ea7d4`, CI 35127126778 again passes every ordinary job and fails only the +two installed-MSIX jobs. Both explicit-token processes time out after ten +minutes. Both evidence artifacts contain package setup and an empty stderr file, +but no PowerShell transcript or installed-test completion record. This does not +establish successful script startup or test execution. Raw logs and artifacts +are retained under `evidence/fix-e8ea7d4-*`. Qodana post-suppression findings: 0; +CodeQL has only the two existing dismissed results in unchanged files. Fresh +security review 5701706446 is clean. The code reviewer correctly identified a +stale ARCHITECTURE.md claim about COM activation (thread PRRT_kwDOT5ODVc6jCf-e); +the lead corrected it to direct installed WindowsApps executable launch. + +Next controlled probe uses CREATE_NO_WINDOW for the noninteractive PowerShell +process, as supported by CreateProcessWithTokenW. No app token, package identity +or helper policy changes. The loop now checks transcript creation as an explicit +startup observation with a one-minute limit, while retaining ten minutes after +startup for complete qualification. The parent also captures bounded package- +specific AppModel/deployment events separately from the test result. This narrows +future failure evidence; no lack of evidence can satisfy the gate. PowerShell +parsing, embedded C# compilation, nativeguards tests and GoLand inspections pass. From 66edeb51f6c51c11560961d62f1456a0e5dd0554 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 19:50:42 +0200 Subject: [PATCH 30/30] Retain MSIX activation diagnostics and remove unsuccessful launch experiments --- ARCHITECTURE.md | 5 +- docs/heic/experimental-opt-in.md | 19 +++-- packaging/heic/qualify-windows-child.ps1 | 3 +- packaging/heic/qualify-windows-logon.ps1 | 87 -------------------- packaging/heic/qualify-windows.ps1 | 19 ++--- plans/2026-09-16-experimental-heic-opt-in.md | 16 ++++ todos.md | 5 +- 7 files changed, 40 insertions(+), 114 deletions(-) delete mode 100644 packaging/heic/qualify-windows-logon.ps1 diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 49cedbb3..ccd5a422 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -692,9 +692,8 @@ Authenticode signing. Native helper tests use the same staging tool. Makefile and release/MSIX assembly retain the helper directory; package creation alone does not enable the saved HEIC preference. `packaging/heic/qualify-windows*.ps1` separates disposable CI account/signing provisioning from standard-user execution. -`qualify-windows-logon.ps1` authenticates the installed test account explicitly -and starts the fixture with its primary token; this CI-only route is under -native qualification. +The provisioner retains package-specific Windows activation/deployment events +as diagnostic evidence, separately from the mandatory application test result. Native application fixtures exercise executable-derived startup, Settings, admission, native decode and shutdown; MSIX launches its registered installed WindowsApps executable directly and checks package identity and unchanged diff --git a/docs/heic/experimental-opt-in.md b/docs/heic/experimental-opt-in.md index 2bc198a6..89a29682 100644 --- a/docs/heic/experimental-opt-in.md +++ b/docs/heic/experimental-opt-in.md @@ -98,14 +98,17 @@ Qualification now needs native x64 and ARM64 environments with an interactive standard-user session. Actual package identity and every existing guard must pass there before this gate is complete. The hosted alternate-user fixture does not establish installed Store helper activation, staging or sandbox behavior. -A same-desktop-owner experiment at `98d3895` also failed on both hosted -architectures: Windows refused to remove the protected account from -Administrators (STATUS_SPECIAL_ACCOUNT, 0xC0000124). That account-changing -experiment was removed. A fresh standard-user desktop remains an environment -prerequisite, not a demonstrated hosted-CI configuration. A second controlled -experiment replaces only the credential process-creation API with explicit -`LogonUserW` authentication and `CreateProcessWithTokenW`. Its application-token -and package assertions remain unchanged; both native results are required. +The same-desktop-owner experiment at `98d3895` failed on both architectures: +Windows refused to remove the protected account from Administrators +(STATUS_SPECIAL_ACCOUNT, 0xC0000124). Explicit `LogonUserW` / +`CreateProcessWithTokenW` experiments at `e8ea7d4` and `dea62b9` also failed before +producing a child transcript, including with console creation disabled. All +unsuccessful account/token-launch changes were removed. The original fixture +now retains bounded package-specific Windows AppModel/deployment events in +`activation-events.json`; these diagnostics cannot substitute for the installed +test's completion record. No hosted configuration tried so far establishes +successful standard-user MSIX activation. A known-working native standard-user +desktop on each architecture remains the next qualification environment. For a local MSIX run, the configuration supplies `Scenario: "msix"`, `Repository`, `Go`, `Work`, `Evidence`, `Arch`, `Commit`, the signed `Package`, its `PackageName` and architecture-matched `Dependency`. Provision only disposable test state. diff --git a/packaging/heic/qualify-windows-child.ps1 b/packaging/heic/qualify-windows-child.ps1 index 86795465..74905abe 100644 --- a/packaging/heic/qualify-windows-child.ps1 +++ b/packaging/heic/qualify-windows-child.ps1 @@ -1,7 +1,6 @@ -param([Parameter(Mandatory = $true)][string]$Configuration, [switch]$RequireInstalledMSIX, [switch]$Transcript) +param([Parameter(Mandatory = $true)][string]$Configuration, [switch]$RequireInstalledMSIX) $ErrorActionPreference = 'Stop' $config = Get-Content -LiteralPath $Configuration -Raw | ConvertFrom-Json -if ($Transcript) { Start-Transcript -LiteralPath (Join-Path $config.Evidence 'standard-user.stdout.log') -Force | Out-Null } if ($RequireInstalledMSIX -and $config.Scenario -ne 'msix') { throw 'Installed-MSIX configuration is required for the complete Windows native gate.' } Set-Location -LiteralPath $config.Repository # Start-Process with credentials still inherits the runner's environment. diff --git a/packaging/heic/qualify-windows-logon.ps1 b/packaging/heic/qualify-windows-logon.ps1 deleted file mode 100644 index 1931a476..00000000 --- a/packaging/heic/qualify-windows-logon.ps1 +++ /dev/null @@ -1,87 +0,0 @@ -# CI-only alternate-user process creation using an explicitly authenticated -# primary token. The installed test still verifies the actual account/groups. -Add-Type -TypeDefinition @' -using System; -using System.ComponentModel; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Security; -using System.Text; -public static class HEICStandardUserLogon { - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - struct StartupInfo { - public int Size; - public string Reserved, Desktop, Title; - public uint X, Y, Width, Height, XChars, YChars, Fill, Flags; - public ushort Show, ReservedSize; - public IntPtr ReservedBytes, Input, Output, Error; - } - [StructLayout(LayoutKind.Sequential)] - struct ProcessInfo { - public IntPtr Process, Thread; - public uint ProcessId, ThreadId; - } - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool LogonUserW(string user, string domain, IntPtr password, uint type, uint provider, out IntPtr token); - [DllImport("advapi32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool CreateProcessWithTokenW(IntPtr token, uint logonFlags, string application, - StringBuilder command, uint flags, IntPtr environment, string directory, ref StartupInfo startup, out ProcessInfo process); - [DllImport("kernel32.dll", SetLastError = true)] - static extern uint WaitForSingleObject(IntPtr handle, uint milliseconds); - [DllImport("kernel32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool GetExitCodeProcess(IntPtr process, out uint code); - [DllImport("kernel32.dll", SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool TerminateProcess(IntPtr process, uint code); - [DllImport("kernel32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool CloseHandle(IntPtr handle); - public static uint Run(string user, string domain, SecureString password, string application, string arguments, string directory, string transcript) { - IntPtr token = IntPtr.Zero; - IntPtr secret = Marshal.SecureStringToGlobalAllocUnicode(password); - try { - // LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT. This authenticates - // the Users-only account; it does not derive a filtered administrator token. - if (!LogonUserW(user, domain, secret, 2, 0, out token)) - throw new Win32Exception(Marshal.GetLastWin32Error(), "Standard-user authentication failed."); - } finally { Marshal.ZeroFreeGlobalAllocUnicode(secret); } - try { - var startup = new StartupInfo { Size = Marshal.SizeOf(typeof(StartupInfo)) }; - var command = new StringBuilder("\"" + application + "\" " + arguments); - ProcessInfo process; - // LOGON_WITH_PROFILE; Windows supplies the account's environment and grants - // that account access to the inherited desktop when Desktop is null. - const uint createNoWindow = 0x08000000; - if (!CreateProcessWithTokenW(token, 1, application, command, createNoWindow, IntPtr.Zero, directory, ref startup, out process)) - throw new Win32Exception(Marshal.GetLastWin32Error(), "Standard-user process creation failed."); - try { - var elapsed = Stopwatch.StartNew(); - uint wait; - string timeout = "Standard-user qualification exceeded ten minutes."; - do { - wait = WaitForSingleObject(process.Process, 1000); - if (wait != 258) break; - if (elapsed.ElapsedMilliseconds >= 60000 && !File.Exists(transcript)) { - timeout = "Standard-user PowerShell did not begin its transcript within one minute."; - break; - } - } while (elapsed.ElapsedMilliseconds < 600000); - if (wait != 0) { - int error = Marshal.GetLastWin32Error(); - if (!TerminateProcess(process.Process, 1)) throw new Win32Exception(Marshal.GetLastWin32Error()); - WaitForSingleObject(process.Process, 10000); - if (wait == 258) throw new TimeoutException(timeout); - throw new Win32Exception(error, "Cannot wait for standard-user qualification."); - } - uint code; - if (!GetExitCodeProcess(process.Process, out code)) throw new Win32Exception(Marshal.GetLastWin32Error()); - return code; - } finally { CloseHandle(process.Thread); CloseHandle(process.Process); } - } finally { CloseHandle(token); } - } -} -'@ diff --git a/packaging/heic/qualify-windows.ps1 b/packaging/heic/qualify-windows.ps1 index 08c43e84..6bb27615 100644 --- a/packaging/heic/qualify-windows.ps1 +++ b/packaging/heic/qualify-windows.ps1 @@ -94,15 +94,11 @@ try { $config | ConvertTo-Json | Set-Content -LiteralPath $configPath -Encoding utf8NoBOM $child = Join-Path $copy 'packaging/heic/qualify-windows-child.ps1' $powershell = (Get-Command pwsh).Source - $exitCode = 0 - if ($Scenario -eq 'msix') { - . (Join-Path $PSScriptRoot 'qualify-windows-logon.ps1') - New-Item -ItemType File -Path (Join-Path $evidence 'standard-user.stderr.log') | Out-Null - $arguments = "-NoProfile -NonInteractive -File `"$child`" -Configuration `"$configPath`" -Transcript" - $activationStarted = Get-Date - try { - $exitCode = [HEICStandardUserLogon]::Run($userName, $env:COMPUTERNAME, $secret, $powershell, $arguments, $copy, (Join-Path $evidence 'standard-user.stdout.log')) - } finally { + $activationStarted = Get-Date + try { + $process = Start-Process -FilePath $powershell -Credential $credential -LoadUserProfile -WorkingDirectory $copy -ArgumentList @('-NoProfile', '-File', "`"$child`"", '-Configuration', "`"$configPath`"") -PassThru -Wait -RedirectStandardOutput (Join-Path $evidence 'standard-user.stdout.log') -RedirectStandardError (Join-Path $evidence 'standard-user.stderr.log') + } finally { + if ($Scenario -eq 'msix') { $events = foreach ($channel in @('Microsoft-Windows-AppModel-Runtime/Admin', 'Microsoft-Windows-AppXDeploymentServer/Operational')) { try { $packageEvents = @(Get-WinEvent -FilterHashtable @{ LogName = $channel; StartTime = $activationStarted } -MaxEvents 100 | @@ -112,13 +108,10 @@ try { } ConvertTo-Json -InputObject @($events) -Depth 5 | Set-Content -LiteralPath (Join-Path $evidence 'activation-events.json') -Encoding utf8NoBOM } - } else { - $process = Start-Process -FilePath $powershell -Credential $credential -LoadUserProfile -WorkingDirectory $copy -ArgumentList @('-NoProfile', '-File', "`"$child`"", '-Configuration', "`"$configPath`"") -PassThru -Wait -RedirectStandardOutput (Join-Path $evidence 'standard-user.stdout.log') -RedirectStandardError (Join-Path $evidence 'standard-user.stderr.log') - $exitCode = $process.ExitCode } Get-Content -LiteralPath (Join-Path $evidence 'standard-user.stdout.log') Get-Content -LiteralPath (Join-Path $evidence 'standard-user.stderr.log') - if ($exitCode -ne 0) { throw "Standard-user qualification failed with exit $exitCode." } + if ($process.ExitCode -ne 0) { throw "Standard-user qualification failed with exit $($process.ExitCode)." } } finally { try { Copy-Item -Path (Join-Path $evidence '*') -Destination $EvidenceDirectory -Recurse -Force diff --git a/plans/2026-09-16-experimental-heic-opt-in.md b/plans/2026-09-16-experimental-heic-opt-in.md index 53030107..d1807c52 100644 --- a/plans/2026-09-16-experimental-heic-opt-in.md +++ b/plans/2026-09-16-experimental-heic-opt-in.md @@ -648,3 +648,19 @@ startup for complete qualification. The parent also captures bounded package- specific AppModel/deployment events separately from the test result. This narrows future failure evidence; no lack of evidence can satisfy the gate. PowerShell parsing, embedded C# compilation, nativeguards tests and GoLand inspections pass. + +At `dea62b9`, CI 35129438751 fails only the same two installed-MSIX jobs. Both +console-free launches now hit the one-minute missing-transcript deadline; +AppModel/deployment event queries on amd64 find no events in that interval. The +experiment still never supplies an installed test result. Thus it does not fix +the original gate, and the explicit-token launcher, transcript switch and startup +polling are removed. Standard-user creation and execution are restored exactly +to their previously tested implementation. Only bounded Windows event capture +and the corrected architecture/evidence documentation remain from this repair +attempt. No production Go, package contents, token guard or sandbox control is +changed relative to 7f5c1da. + +Final focused package tests, PowerShell parsing and GoLand script inspections +pass. The user has not provided additional native environments; the two installed +qualification gates remain unresolved. The working tree must not imply a successful +fix, and no gate is skipped or replaced by elevated/debug-token execution. diff --git a/todos.md b/todos.md index e4e65097..a558d8d5 100644 --- a/todos.md +++ b/todos.md @@ -116,7 +116,10 @@ after an enabled preference and validated installed package. standard account; a loaded profile under alternate credentials is insufficient. The same-owner fresh-logon experiment at `98d3895` also failed: both hosted desktops use a protected account that Windows refuses to remove from - Administrators (0xC0000124). The experiment was removed; all gates remain. + Administrators (0xC0000124). Explicit-token launch attempts also stalled before + the standard-user script began, including without console creation. All failed + launcher/account experiments were removed; package-specific Windows events + are retained with the restored original fixture. Both gates remain failing. Suitable environment access is still unresolved. The separate GitHub AI scanner still fails before analysis with an unsupported-model HTTP 400. Keep all failing gates and permission checks. The [active plan](plans/2026-09-16-experimental-heic-opt-in.md)

        L$lq1nhf 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%0DWmCpO9TcK5O0`Z> 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 delta 1321074 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∈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 z%0A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

      EVJA?tR@{(IRE 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 +)Ml#SQ#xgLPjnNDoC&n`{3x#ou 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 fp8vR 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≫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 q^nkeN{!NgBhUSYGn)mnKGbY=7R)HU2gI!|>UJ< ../.. diff --git a/scripts/heicguest/go.sum b/scripts/heicguest/go.sum new file mode 100644 index 00000000..2cb5a36b --- /dev/null +++ b/scripts/heicguest/go.sum @@ -0,0 +1,2 @@ +github.com/gen2brain/h265 v0.2.3 h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk= +github.com/gen2brain/h265 v0.2.3/go.mod h1:kefpLxLhGpNCUG/q/aabJcD6GqB9Nhet3fNi9xX9Wzw= diff --git a/scripts/heicguest/main.go b/scripts/heicguest/main.go new file mode 100644 index 00000000..3dd73ebe --- /dev/null +++ b/scripts/heicguest/main.go @@ -0,0 +1,166 @@ +//go:build wasip1 && wasm + +// The development guest is WASI-only. It is not embedded in or launched by the +// application until mandatory host isolation and memory controls are qualified. +package main + +import ( + "bytes" + "encoding/binary" + "errors" + "image" + "io" + "os" + + "github.com/gen2brain/h265/heic" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func main() { + limits := heicdecode.DefaultLimits(0) + request, err := heicdecode.ReadRequest(os.Stdin, limits) + if err != nil { + _ = heicdecode.WriteFailure(os.Stdout, heicdecode.StatusRejected, "invalid request", limits) + return + } + limits.MaxPixels = request.MaxPixels + limits.MaxOutputBytes = request.MaxOutputBytes + result, status := decode(request, limits) + if status != 0 { + _ = heicdecode.WriteFailure(os.Stdout, status, "decode refused", limits) + return + } + if err = heicdecode.WriteResponse(os.Stdout, request.Operation, result, limits); err != nil { + // A transport failure may leave a partial response. The parent rejects it. + os.Exit(1) + } +} + +func decode(request heicdecode.Request, limits heicdecode.Limits) (result heicdecode.Response, status heicdecode.Status) { + defer func() { + if recover() != nil { + result = heicdecode.Response{} + status = heicdecode.StatusInternal + } + }() + if status = stillContainer(request.Input); status != 0 { + return result, status + } + reader := bytes.NewReader(request.Input) + exif, err := heic.DecodeExif(reader) + if err != nil && !errors.Is(err, heic.ErrNoExif) { + return result, heicdecode.StatusRejected + } + if exif != nil { + result.Metadata = &heicdecode.Metadata{Orientation: exif.Orientation, Make: exif.Make, Model: exif.Model, Software: exif.Software, DateTime: exif.DateTime, DateTimeOriginal: exif.DateTimeOriginal, ExposureTime: exif.ExposureTime, FNumber: exif.FNumber, ISOSpeed: exif.ISOSpeed, FocalLength: exif.FocalLength, Flash: exif.Flash, GPSLatitude: exif.GPSLatitude, GPSLongitude: exif.GPSLongitude, GPSAltitude: exif.GPSAltitude, Copyright: exif.Copyright, Artist: exif.Artist} + } + if request.Operation == heicdecode.DecodeExif { + return result, 0 + } + // Config also decodes so it reports transformed dimensions consistently. + // A header-only transformed-config API must be qualified before optimizing it. + if _, err = reader.Seek(0, io.SeekStart); err != nil { + return result, heicdecode.StatusInternal + } + img, err := heic.Decode(reader, heic.Options{AutoRotate: true, FrameSizeLimit: int(limits.MaxPixels), Threads: 1}) + if err != nil { + if errors.Is(err, heic.ErrUnsupported) { + return result, heicdecode.StatusUnsupported + } + return result, heicdecode.StatusRejected + } + img, status = canonicalPixels(img, limits) + if status != 0 { + return heicdecode.Response{}, status + } + result.Config = image.Config{Width: img.Bounds().Dx(), Height: img.Bounds().Dy(), ColorModel: img.ColorModel()} + if request.Operation == heicdecode.Decode { + result.Image = img + } + return result, 0 +} + +// Reject all movie boxes, including a still item accompanied by a sequence. The +// upstream still API otherwise falls back to decoding every sequence frame. +// This scan runs exclusively inside the guest, before upstream container work. +func stillContainer(data []byte) heicdecode.Status { + seenType, seenMeta := false, false + for len(data) > 0 { + if len(data) < 8 { + return heicdecode.StatusRejected + } + size := uint64(binary.BigEndian.Uint32(data[:4])) + kind := string(data[4:8]) + header := uint64(8) + if size == 1 { + if len(data) < 16 { + return heicdecode.StatusRejected + } + size = binary.BigEndian.Uint64(data[8:16]) + header = 16 + } else if size == 0 { + size = uint64(len(data)) + } + if size < header || size > uint64(len(data)) { + return heicdecode.StatusRejected + } + switch kind { + case "moov": + return heicdecode.StatusUnsupported + case "ftyp": + seenType = true + case "meta": + seenMeta = true + } + data = data[int(size):] + } + if !seenType || !seenMeta { + return heicdecode.StatusRejected + } + return 0 +} + +func canonicalPixels(img image.Image, limits heicdecode.Limits) (image.Image, heicdecode.Status) { + if img == nil { + return nil, heicdecode.StatusRejected + } + var pix []byte + var stride, size int + var rect image.Rectangle + switch m := img.(type) { + case *image.NRGBA: + if m == nil { + return nil, heicdecode.StatusRejected + } + pix, stride, size, rect = m.Pix, m.Stride, 4, m.Rect + case *image.NRGBA64: + if m == nil { + return nil, heicdecode.StatusRejected + } + pix, stride, size, rect = m.Pix, m.Stride, 8, m.Rect + default: + return nil, heicdecode.StatusUnsupported + } + width, height := int64(rect.Dx()), int64(rect.Dy()) + if width <= 0 || height <= 0 || width > limits.MaxPixels || height > limits.MaxPixels || width*height > limits.MaxPixels || width*height*int64(size) > limits.MaxOutputBytes { + return nil, heicdecode.StatusResourceLimit + } + row := int(width) * size + if stride < row || int64(stride)*(height-1)+int64(row) > int64(len(pix)) { + return nil, heicdecode.StatusRejected + } + if rect.Min == (image.Point{}) && stride == row && len(pix) == row*int(height) { + return img, 0 + } + // Normalize padded/cropped output without color conversion or bit-depth loss. + out := make([]byte, row*int(height)) + for y := 0; y < int(height); y++ { + copy(out[y*row:(y+1)*row], pix[y*stride:y*stride+row]) + } + bounds := image.Rect(0, 0, int(width), int(height)) + if size == 8 { + return &image.NRGBA64{Pix: out, Stride: row, Rect: bounds}, 0 + } + return &image.NRGBA{Pix: out, Stride: row, Rect: bounds}, 0 +} diff --git a/todos.md b/todos.md index cc4ef8fb..2deb5604 100644 --- a/todos.md +++ b/todos.md @@ -89,13 +89,17 @@ verification. The previous fork-upgrade watch [MA-023](needs_refactoring.md#ma-0 is closed by removal. Retained [options and source evidence](docs/find-more-like-this/old-heic-wasm-options.md) do not authorize restoring a decoder. -Restoration work is now authorized and tracked in -`plans/2026-09-15-isolated-heic-restoration.md`. The bounded parent protocol and -safe-testing boundary are present, but decoding and format exposure remain -disabled until the exact h265 source/guest closure can be retrieved and reviewed -and mandatory native isolation is runtime-qualified. The Codex Cloud checkout -cannot currently retrieve the candidate source (module proxy HTTP 403) or supply -Windows/macOS/native Linux isolation evidence. +Restoration work is authorized and tracked in +[the active plan](plans/2026-09-15-isolated-heic-restoration.md) and +[draft PR #28](https://github.com/frathe/picfetch/pull/28). Local source access is +resolved. The pinned WASI development guest, NRGBA8/NRGBA64 protocol, ordinary +fixtures and reproducible source/artifact/import guards are present. Production +decoding remains disabled: native helper restrictions, a real whole-worker memory +budget, shared app/analysis admission, signing/packaging and compatibility checks +are unfinished. A local macOS probe rejected the proposed 2 GiB address-space +limit below existing virtual mappings; separate macOS protection research is +ongoing. Linux/Windows native enforcement is unverified. See +[qualification evidence](docs/heic/qualification.md). The [independent alternatives](docs/image-codec-alternatives-2026-09-15.md#heic-alternatives) include libheif/libde265 with LGPL distribution work and hpvcd with unresolved From c4a89d13c2ed0efc48d9d82641d2a704abf80329 Mon Sep 17 00:00:00 2001 From: frathe Date: Wed, 16 Sep 2026 00:34:27 +0200 Subject: [PATCH 03/30] Add a bounded HEIC helper with verified macOS isolation --- .github/workflows/ci.yml | 3 + ARCHITECTURE.md | 37 +++- Makefile | 12 +- cmd/picfetch-heic-worker/main.go | 13 ++ docs/heic/qualification.md | 114 ++++++++-- docs/heic/robustness-testing.md | 19 +- internal/heicdecode/client/client.go | 132 +++++++++++ internal/heicdecode/client/client_test.go | 201 +++++++++++++++++ .../heicdecode/client/native_darwin_test.go | 207 ++++++++++++++++++ internal/heicdecode/client/process.go | 163 ++++++++++++++ internal/heicdecode/client/process_other.go | 13 ++ internal/heicdecode/client/process_unix.go | 18 ++ .../heicdecode/client/process_unix_test.go | 72 ++++++ internal/heicdecode/limits.go | 10 +- internal/heicdecode/metadata_test.go | 2 +- internal/heicdecode/protocol.go | 2 + internal/heicdecode/protocol_test.go | 2 +- internal/heicdecode/ready.go | 47 ++++ internal/heicdecode/ready_test.go | 30 +++ .../heicdecode/worker}/decoder.wasm | Bin 5429315 -> 5429315 bytes internal/heicdecode/worker/engine_compiler.go | 7 + .../heicdecode/worker/engine_interpreter.go | 9 + internal/heicdecode/worker/isolate_darwin.go | 37 ++++ internal/heicdecode/worker/isolate_other.go | 13 ++ internal/heicdecode/worker/main.go | 97 ++++++++ internal/heicdecode/worker/runtime.go | 75 +++++++ internal/heicdecode/worker/runtime_test.go | 171 +++++++++++++++ packaging/heic/macos.Info.plist | 16 ++ packaging/heic/macos.entitlements.plist | 12 + plans/2026-09-15-isolated-heic-restoration.md | 112 ++++++++++ qodana.yaml | 5 + scripts/heicbuild/fixture.go | 42 +++- scripts/heicbuild/guest_test.go | 43 ++-- scripts/heicbuild/main.go | 19 +- scripts/heicbuild/main_test.go | 11 + scripts/heicbuild/testdata/README.md | 9 + .../heicbuild/testdata/photo-gradient.heic.gz | Bin 0 -> 850679 bytes scripts/heicguest/decoder.json | 15 +- scripts/heicguest/fixturephoto/main.go | 29 +++ scripts/nativeguards/main.go | 8 +- scripts/nativeguards/main_test.go | 1 + todos.md | 18 +- 42 files changed, 1767 insertions(+), 79 deletions(-) create mode 100644 cmd/picfetch-heic-worker/main.go create mode 100644 internal/heicdecode/client/client.go create mode 100644 internal/heicdecode/client/client_test.go create mode 100644 internal/heicdecode/client/native_darwin_test.go create mode 100644 internal/heicdecode/client/process.go create mode 100644 internal/heicdecode/client/process_other.go create mode 100644 internal/heicdecode/client/process_unix.go create mode 100644 internal/heicdecode/client/process_unix_test.go create mode 100644 internal/heicdecode/ready.go create mode 100644 internal/heicdecode/ready_test.go rename {scripts/heicguest => internal/heicdecode/worker}/decoder.wasm (99%) create mode 100644 internal/heicdecode/worker/engine_compiler.go create mode 100644 internal/heicdecode/worker/engine_interpreter.go create mode 100644 internal/heicdecode/worker/isolate_darwin.go create mode 100644 internal/heicdecode/worker/isolate_other.go create mode 100644 internal/heicdecode/worker/main.go create mode 100644 internal/heicdecode/worker/runtime.go create mode 100644 internal/heicdecode/worker/runtime_test.go create mode 100644 packaging/heic/macos.Info.plist create mode 100644 packaging/heic/macos.entitlements.plist create mode 100644 scripts/heicbuild/testdata/photo-gradient.heic.gz create mode 100644 scripts/heicguest/fixturephoto/main.go diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eba21905..727eadbe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -209,6 +209,9 @@ jobs: - name: Check Explorer runtime selection and worker exit run: go test ./internal/ort ./internal/similarity ./scripts/explorereval -count=1 + - name: Qualify signed HEIC App Sandbox helper + run: go run ./scripts/nativeguards -suite heic-macos -capture "${{ runner.temp }}/native-guards-heic-macos.json" + - name: Qualify Intel Explorer download and offline inference if: matrix.arch == 'amd64' run: make explorer-install-test diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 05fb91e5..5946464e 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -594,8 +594,29 @@ defines separate finite resource contracts; it does not install OS controls. `request.go` frames one byte-only operation. `protocol.go` validates versioned responses, dimensions, NRGBA8/NRGBA64 layout, operation-specific payload lengths, normalized metadata and exact EOF before publication. `metadata.go` rejects -unknown/duplicate fields and invalid bounded values. No production launcher, -family-wide broker or native helper is installed; HEIC remains unsupported. +unknown/duplicate fields and invalid bounded values. `ready.go` reports actual +startup memory controls separately from requested limits. HEIC viewing remains +disabled pending app-family integration and platform/package qualification. + +### `internal/heicdecode/client`, `worker`, and `cmd/picfetch-heic-worker` + +`client` owns one admitted request, bounded waiting, executable hash validation, +parent-owned file/loopback probes, readiness, bounded pipes and response checks. +Admission precedes source reads. Stop cancels pending/active work; Wait joins +process and pipe completion. Unix group termination precedes leader reap. +This instance is not yet shared across app and analysis processes. + +`worker` embeds the fixed WASI artifact and streams bounded stdio through wazero +with finite linear memory and a deadline. Native code accepts no image paths. +Its macOS cgo boundary verifies the App Sandbox entitlement; the entry point +then verifies denied owned file reads/creation and TCP/UDP access before input. +Other platforms currently refuse startup. Native-memory readiness is explicitly +zero on macOS; its Go memory target is not a hard OS cap. The helper alone may +import the embedded guest runtime. `packaging/heic` holds the macOS bundle and +entitlement templates; `heicinterpreter` is the qualification runtime variant. + +`cmd/picfetch-heic-worker` is the minimal single-request entry point, without +Fyne or a native HEIC codec. Final application packaging/integration is pending. ### `scripts/heicguest` and `scripts/heicbuild` @@ -603,14 +624,16 @@ Development-only HEIC/WASI qualification. `heicguest` is a separate module pinne to unmodified h265 v0.2.3. Its WASI-only entry point rejects movie containers, decodes still pixels/config/Exif in the guest, preserves straight-alpha precision and emits `internal/heicdecode`'s protocol. `fixturegen` writes one fixed ordinary -ten-bit gradient. Neither command is an application entry point or a shipped -helper. The checked guest artifact is not embedded in the viewer. +ten-bit gradient; `fixturephoto` writes one fixed ordinary 12-megapixel gradient. +Neither generator is an application encoder. The checked guest artifact lives +under `internal/heicdecode/worker`; it is not embedded in the viewer. `heicbuild` implements the Make build/provenance/import guards. It checks source, notices and complete build-input hashes, reproduces the guest byte-for-byte and -rejects native codec imports. Its fixed fixture generator and tests use wazero's -interpreter with bounded linear memory and byte streams. This does not implement -a native worker-family memory cap. See `docs/heic/qualification.md`, the active +rejects native codec and viewer-to-worker imports. Fixed generators and tests +use bounded linear memory and byte streams. The native helper qualification +compares interpreter and compiler under the same deadline. This does not +implement a native worker-family memory cap. See `docs/heic/qualification.md`, the active restoration plan and `docs/heic/robustness-testing.md` for status and remaining platform, compatibility and distribution gates. diff --git a/Makefile b/Makefile index cff139a7..c688626d 100644 --- a/Makefile +++ b/Makefile @@ -604,12 +604,20 @@ heic-check-provenance: ## Verify pinned source/notices and reproduce the HEIC gu heic-check-imports: ## Reject native HEIC codec imports and unreviewed guest dependencies go run ./scripts/heicbuild imports -heic-check-guest: ## Test the development guest against small licensed ordinary fixtures - go test -tags "$(APP_TAGS)" ./internal/heicdecode ./scripts/heicbuild +heic-check-guest: ## Test the guest and owned runtime/transport boundaries + go test -tags "$(APP_TAGS)" ./internal/heicdecode/... ./scripts/heicbuild heic-fixture: ## Reproduce the fixed 16x16 ten-bit fixture inside WASI go run ./scripts/heicbuild fixture +.PHONY: heic-photo-fixture heic-native-macos +heic-photo-fixture: ## Reproduce the fixed 12-megapixel qualification gradient inside WASI + go run ./scripts/heicbuild photo-fixture + +heic-native-macos: ## Qualify signed sandboxed helpers and bounded runtime choice on native macOS + mkdir -p .scratch/heic-qualification + go run ./scripts/nativeguards -suite heic-macos -capture .scratch/heic-qualification/native-macos.json + .PHONY: heic-security-govulncheck heic-security-govulncheck: ## Scan the separate WASI guest module (including its fixed fixture generator) @scanner="$$(go tool -n govulncheck)"; \ diff --git a/cmd/picfetch-heic-worker/main.go b/cmd/picfetch-heic-worker/main.go new file mode 100644 index 00000000..43c81d41 --- /dev/null +++ b/cmd/picfetch-heic-worker/main.go @@ -0,0 +1,13 @@ +// Command picfetch-heic-worker is the minimal disposable HEIC helper. It has no +// GUI, image-format registration, native HEIC codec, or user-facing CLI mode. +package main + +import ( + "os" + + "github.com/frathe/picfetch/internal/heicdecode/worker" +) + +func main() { + os.Exit(worker.Main(os.Args[1:])) +} diff --git a/docs/heic/qualification.md b/docs/heic/qualification.md index 1d340d14..8d6a412e 100644 --- a/docs/heic/qualification.md +++ b/docs/heic/qualification.md @@ -3,11 +3,17 @@ ## Current disposition **HEIC viewing is still disabled on every production platform.** This branch -contains a reproducible development WASI guest and codec-free protocol. It has -no production helper launcher, family-wide admission broker, signed helper, -packaging integration, or mandatory OS memory/capability enforcement. Those are -required before enabling formats. The application and similarity paths retain -their current behavior. No release or merge is authorized by this record. +contains a reproducible WASI guest, codec-free protocol, bounded parent launcher +and a minimal helper. Native Apple Silicon tests exercise a signed App Sandbox +bundle and real decoding; Linux/Windows enforcement, shared app/analysis +admission, final packaging and canonical imaging integration are incomplete. +Those remain activation gates. No release or merge is authorized by this record. + +The subsequent source-retention instruction also requires reconciling the +maintained `third_party/h265` copy recorded in the historical checkout with this +candidate's upstream v0.2.3. Its local hardening must be retained unless equivalent +upstream checks are verified. The historical patch record has been read; this +candidate does not yet establish that equivalence or select final shipped source. ## Exact source and distribution inventory @@ -16,8 +22,8 @@ their current behavior. No release or merge is authorized by this record. | h265 HEIC/HEVC code | `github.com/gen2brain/h265` v0.2.3, commit `b2d46ba787d8f0a2025bd106443ab1b1c7cd010f`; module sum `h1:+fEP2Xf1CoZ21SxA2YpqnPZb6Y/hAEkcgjU1gMsOhrk=`; module ZIP SHA-256 `2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a` | Unmodified upstream. MIT text and both upstream copyright notices preserved in `notices/h265-LICENSE`. | | Guest compiler/runtime | Go 1.27.1, `wasip1/wasm`, no CGo, no assembly | BSD license and patent grant in `notices/Go-LICENSE` and `notices/Go-PATENTS`. The selected guest graph has no vendored third-party standard-library imports. | | PicFetch adapter/protocol | This branch's `scripts/heicguest` and `internal/heicdecode`; exact input hashes in `scripts/heicguest/decoder.json` | PicFetch MIT. Adapter changes do not patch or vendor the upstream source. | -| Development WASI host | Existing wazero v1.12.0; used by the fixed fixture generator and guest ABI tests | Apache-2.0 license and NOTICE in `notices/wazero-LICENSE` and `notices/wazero-NOTICE`. No version upgrade. | -| Production helper / OS library | Not implemented or shipped | Complete native-helper closure remains a gate; no new native decoder/runtime has been admitted. | +| WASI host | Existing wazero v1.12.0; fixed guest, helper and qualification tools | Apache-2.0 license and NOTICE in `notices/wazero-LICENSE` and `notices/wazero-NOTICE`. No version upgrade. | +| Native helper / OS library | `cmd/picfetch-heic-worker`, codec-free boundary, Go/wazero; macOS uses system Security/CoreFoundation frameworks via cgo | Separate minimal executable, no Fyne or native HEIC codec. Final shipped closure and notice placement remain packaging gates. | The [pinned upstream README](https://github.com/gen2brain/h265/blob/b2d46ba787d8f0a2025bd106443ab1b1c7cd010f/README.md) describes a pure-Go implementation without module dependencies and names @@ -91,11 +97,13 @@ only the generated explicit-depth gradient is used as ten-bit evidence. The candidate production maxima remain 64 MiB input, 64M pixels, 256,000,000 output bytes, 64 KiB normalized metadata, 4096-byte diagnostics, 30 seconds, -1 GiB WASM linear memory, and a separately enforced 2 GiB worker-family budget. +1 GiB WASM linear memory, and a requested 2 GiB native worker budget. The output cap allows at most 32M NRGBA64 pixels. The protocol accepts only positive finite limits; resource fields are contracts, not OS enforcement. -Guest decoding sets upstream `Threads: 1`. A native Go helper's runtime thread -count is a separate, still-unimplemented OS limit. +Guest decoding sets upstream `Threads: 1`. The helper sets Go's thread ceiling +to 32 and GOMAXPROCS to 1; this is not an OS process-family thread quota. Its +1.5 GiB Go memory target is soft. Readiness explicitly reports zero hard native +memory bytes on macOS under Ronin's accepted availability tradeoff. The development fixture tests use 1 MiB input, 1M pixels, 8 MiB output, 128 MiB WASM linear memory, bounded stderr/stdout, and a deadline. They provide no @@ -116,7 +124,7 @@ unqualified. No application integration may silently assume they are solved. | --- | --- | --- | --- | | Linux x64/ARM64 | Delegated cgroup v2 with `memory.max`, `memory.swap.max=0`, process limits and restricted filesystem/network/syscalls installed across threads before input | No Linux kernel/daemon in this worktree; no delegated hierarchy or packaged helper tested | Disabled | | Windows x64/ARM64 | AppContainer/restricted capabilities plus Job Object aggregate commit-memory/process/CPU/kill-on-close limits, explicit inherited pipes and suspended setup | No native Windows or MSIX execution; no helper/restriction implementation | Disabled | -| macOS Intel/Apple Silicon | Separate sandboxed helper/XPC for privileges; a supported hard-memory mechanism must still be established | One bounded Apple Silicon address-space feasibility probe only; no decoder or sandbox qualification | Disabled | +| macOS Intel/Apple Silicon | Independently entitled App Sandbox helper bundle, hardened runtime, bounded WASI, parent-owned pipes/deadline/group termination | Apple Silicon native ordinary decode, read/create/TCP/UDP denial and cancellation verified below. Intel/packaged application qualification pending. Hard total native cap absent by explicit approval. | Viewer integration pending | Linux's [cgroup v2 documentation](https://docs.kernel.org/admin-guide/cgroup-v2.html) describes charged memory and explicitly permits temporary `memory.max` overshoot. @@ -158,8 +166,8 @@ clang -x c -Wall -Wextra -Werror docs/heic/macos-rlimit-probe.c.txt -o /tmp/picf ``` This eliminates this specific 2 GiB address-space setting on this host; it does -not prove all macOS resource strategies impossible. Separate macOS protection -research is ongoing at Ronin's request. No weaker protection has been accepted. +not prove all macOS resource strategies impossible. The later approval below +supersedes that hard-native-memory gate, without removing sandbox requirements. ## Subsequent explicit macOS decision @@ -168,6 +176,84 @@ once sandboxing and finite decoder memory are verified, even though the native helper lacks a guaranteed hard total-memory cap and can cause memory pressure or crashes. Capability restrictions remain mandatory. This supersedes the original whole-worker-cap gate for macOS; the proposed 2 GiB number was an engineering -starting point. The current candidate still does not launch a production helper. +starting point. The current candidate launches a helper through its isolated +client tests; the application has not yet adopted that client. Implementation continues with bounded host allocations, byte-only validated IPC, finite jobs/time, cancellation/cleanup, shared admission and platform sandboxing. + +## Native macOS helper evidence, 2026-09-16 + +The selected public route is an independently entitled helper `.app` bundle. +`SecTaskCopyValueForEntitlement` verifies App Sandbox at startup; owned external +read/create and owned loopback TCP/UDP probes must all return EPERM/EACCES before +the helper sends readiness or reads image input. A plain ad-hoc signed executable +aborted before main on this host; the signed bundle starts and strict codesign +verification passes. No deprecated `sandbox_init`/`sandbox-exec` route is used. +Apple recommends App Sandbox for computation helpers and describes separate +container rights in its [secure-helper guide](https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/DesigningSecureHelpers/DesigningSecureHelpers.html) +and [current sandbox guide](https://developer.apple.com/documentation/security/protecting-user-data-with-app-sandbox). + +App Sandbox is not zero native filesystem authority: the helper can access its +own container and some system resources. It also does not prove zero possible +native descendants. The guest gets no filesystem preopens, environment, socket +descriptors or native execution bridge. Generic WASI imports are not granted +capabilities. The trusted native host compiles only the fixed embedded module; +image bytes enter solely through bounded stdin. Parent code uses an absolute +hash-pinned executable, explicit stdio, a minimal environment, and no user image +paths in helper arguments. Trusted probe paths contain no image data. + +The parent owns one admitted operation, at most 64 waiters, the 30-second +deadline, every pipe and process wait. It kills the Unix group before reaping +its leader (preventing PID reuse before a late kill) and joins pipe work before +releasing admission. An owned peer and descendant pass cancellation with an +observable connection close; deliberately killing only the leader makes that +guard fail. App-family sharing remains pending; one Client is not yet a complete +cross-process broker. + +### Executable-memory decision + +Pinned wazero v1.12.0 maps anonymous code pages read/write and then changes them +to read/execute; it does not use MAP_JIT. See +[allocation](https://github.com/tetratelabs/wazero/blob/v1.12.0/internal/platform/mmap_other.go) +and [protection](https://github.com/tetratelabs/wazero/blob/v1.12.0/internal/platform/mmap_unix.go). +Apple's [allow-jit entitlement](https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.security.cs.allow-jit) +specifically concerns MAP_JIT. The working compiler bundle therefore needs the +broader [unsigned-executable-memory exception](https://developer.apple.com/documentation/bundleresources/entitlements/com.apple.security.cs.allow-unsigned-executable-memory). +No dynamic-library validation, DYLD-environment, executable-page-protection, +network or user-file exception is added. + +Actual controls on macOS 27.0 (26A428), arm64, Go 1.27.1: + +| Hardened, App Sandbox helper | Ordinary 320x240 image | Owned 4032x3024 lossless gradient | +| --- | --- | --- | +| Interpreter, no executable-memory exception | 1.5206 s, decoded | Parent deadline at 30.0093 s; terminated and joined | +| Compiler, required unsigned-executable-memory exception | 1.6174 s, decoded | 7.4040 s, correct dimensions | + +These are single cold runs including startup and compilation, not a general +performance guarantee. The initial comparison used the raw fixture; its checked +gzip wrapper now saves repository space without changing HEIC bytes. A separate +real ten-bit decode plus read/create/TCP/UDP denial and cancellation test passed +in 1.94 s with the hardened compiler bundle. Hardened Runtime without the +required exception refused the real decode, while its cancellation check passed. + +Keep the compiler in the disposable helper: the interpreter failed the existing +deadline on an ordinary image of a common camera size. The broader entitlement +increases native executable-memory authority and therefore the trusted runtime +surface; it does not grant file or network access. Images are data, never modules +to compile. App Sandbox, WASI validation, fixed code, bounded IPC and process +termination remain separate protections, not a guarantee against every unknown +native/runtime/kernel defect. Developer ID signing/notarization, Intel execution, +own-container identity across updates and final packaged launch remain to verify. + +Reproduce with `make heic-native-macos`; the native suite refuses skipped guards. +It uses only owned peers/probes and ordinary fixtures. Pure boundary tests also +verify initial/growing WASM memory limits, an owned loop's deadline, bounded +diagnostics, changed-helper refusal, blocked-writer timeout, crash, and Stop/Wait. +An owned WASI capability control confirms no filesystem preopen and detects a +deliberately installed temporary directory. The canonical native target passed +in 46.377 s after adding missing-sandbox refusal and descendant cleanup. Its +gzip-wrapped 12-megapixel fixture took 7.1366 s with the compiler; the interpreter +reached the unchanged deadline at 30.0108 s. Raw HEIC bytes are unchanged. +Full app functionality and broad camera/color/orientation qualification remain +open. The separate macOS research informed this record; native results above +come from this implementation task, not from documentation alone. diff --git a/docs/heic/robustness-testing.md b/docs/heic/robustness-testing.md index fb5a03a3..6759a60d 100644 --- a/docs/heic/robustness-testing.md +++ b/docs/heic/robustness-testing.md @@ -24,11 +24,13 @@ after its provenance and safe handling are reviewed. ## Budgets and observables The initial ceiling for a complete operation is 30 seconds. The separate maxima -are 1 GiB WASM linear memory, 2 GiB for the OS-enforced helper process family, +are 1 GiB WASM linear memory, a requested 2 GiB native-process budget, 64 MiB encoded HEIC input (further reduced by a positive user limit), 64 million pixels, checked NRGBA8/NRGBA64 output, 64 KiB metadata, 4096-byte diagnostics, one guest decode lane and one live helper per application instance. Native -helper thread/process ceilings require separate OS enforcement. Measurements +helper thread/process ceilings require separate OS enforcement. Ronin approved +macOS's absent hard native-memory cap once sandbox/WASM bounds are verified; +readiness reports this absence, and a soft Go memory target is not a hard cap. Measurements on representative photographs must account for parent input, pipe buffers, guest backing, wazero/Go overhead, output staging and application caches. Limits may be lowered from evidence; they must remain finite. @@ -55,7 +57,16 @@ The development guest is a separate WASI-only module. Its positive fixture ABI tests use three distinct ordinary images (RGB, alpha, and an explicitly ten-bit gradient) plus the upstream byte-identical `main10.heic` alias. Parent protocol checks use bounded owned messages. No upstream negative test corpus, historical -reproducer, fuzz campaign, crash/hang/memory-exhaustion campaign or native -capability test was run. Source/artifact guards are negatively exercised using +reproducer or fuzz campaign was run. Owned helper peers now exercise crash, +blocked-writer timeout, excess diagnostics, descendant cleanup and Stop/Wait. +Owned tiny WASM modules exercise memory-page admission/growth, loop termination, +diagnostic bounds and absent filesystem preopens. A deliberately granted +temporary directory is detected; leader-only termination fails the descendant +guard. Both controls are restored to their required production behavior. +The real signed macOS helper checks owned file read/create and loopback TCP/UDP +denial before ordinary image input, then verifies decode and cancellation. A +fixed ordinary 12-megapixel gradient compares runtimes within the existing +deadline; it is not an image-parser attack or a memory-exhaustion campaign. +Source/artifact guards are negatively exercised using owned source text and missing files. Full status and remaining gates are in [qualification.md](qualification.md). diff --git a/internal/heicdecode/client/client.go b/internal/heicdecode/client/client.go new file mode 100644 index 00000000..6945ad73 --- /dev/null +++ b/internal/heicdecode/client/client.go @@ -0,0 +1,132 @@ +// Package client owns bounded HEIC helper admission, transport and process +// lifetime. The app-family service must share one Client across its consumers. +package client + +import ( + "context" + "crypto/sha256" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +var ( + ErrUnavailable = errors.New("isolated HEIC helper unavailable") + ErrBusy = errors.New("HEIC request queue is full") + ErrDiagnosticLimit = errors.New("HEIC helper exceeded diagnostic limit") +) + +// Config is immutable after New. SHA256 pins the packaged, already signed +// helper executable. An absent helper or pin never selects an ambient program. +type Config struct { + Executable string + SHA256 [32]byte + Limits heicdecode.Limits +} + +// Input reads a source only after admission and native sandbox readiness. It +// must honor ctx and maxBytes, and may not return a larger encoded allocation. +type Input func(ctx context.Context, maxBytes int64) ([]byte, error) + +// Client admits one job and at most 64 pending callers. Stop is nonblocking; +// Wait joins active process/pipe work and cancelled waiting callers off the UI. +type Client struct { + config Config + ctx context.Context + cancel context.CancelFunc + slot chan struct{} + mu sync.Mutex + closed bool + active int + work sync.WaitGroup +} + +func New(config Config) (*Client, error) { + if err := config.Limits.Validate(); err != nil { + return nil, err + } + if !filepath.IsAbs(config.Executable) || config.SHA256 == [32]byte{} { + return nil, ErrUnavailable + } + ctx, cancel := context.WithCancel(context.Background()) + return &Client{config: config, ctx: ctx, cancel: cancel, slot: make(chan struct{}, 1)}, nil +} + +func (c *Client) Stop() { + c.mu.Lock() + c.closed = true + c.cancel() + c.mu.Unlock() +} + +func (c *Client) Wait() { c.work.Wait() } + +// Do retains admission until source work, the helper, all pipes, and output +// validation have finished. A cancelled queued call never invokes input. +func (c *Client) Do(ctx context.Context, op heicdecode.Operation, input Input) (heicdecode.Response, error) { + c.mu.Lock() + if c.closed { + c.mu.Unlock() + return heicdecode.Response{}, context.Canceled + } + if c.active >= 65 { + c.mu.Unlock() + return heicdecode.Response{}, ErrBusy + } + c.active++ + c.work.Add(1) + c.mu.Unlock() + defer func() { + c.mu.Lock() + c.active-- + c.mu.Unlock() + c.work.Done() + }() + ctx, cancel := context.WithCancel(ctx) + stop := context.AfterFunc(c.ctx, cancel) + defer func() { stop(); cancel() }() + select { + case c.slot <- struct{}{}: + defer func() { <-c.slot }() + case <-ctx.Done(): + return heicdecode.Response{}, ctx.Err() + } + ctx, deadline := context.WithTimeout(ctx, c.config.Limits.Timeout) + defer deadline() + if err := ctx.Err(); err != nil { + return heicdecode.Response{}, err + } + if err := c.verifyExecutable(ctx); err != nil { + return heicdecode.Response{}, err + } + result, err := c.run(ctx, op, input) + if ctx.Err() != nil { + return heicdecode.Response{}, ctx.Err() + } + return result, err +} + +func (c *Client) verifyExecutable(ctx context.Context) error { + file, err := os.Open(c.config.Executable) + if err != nil { + return fmt.Errorf("%w: missing executable", ErrUnavailable) + } + defer func() { _ = file.Close() }() + info, err := file.Stat() + if err != nil || !info.Mode().IsRegular() || info.Size() <= 0 || info.Size() > 64*1024*1024 { + return fmt.Errorf("%w: executable size or type", ErrUnavailable) + } + hash := sha256.New() + if _, err = io.Copy(hash, io.LimitReader(file, 64*1024*1024+1)); err != nil { + return fmt.Errorf("%w: executable read", ErrUnavailable) + } + if string(hash.Sum(nil)) != string(c.config.SHA256[:]) { + return fmt.Errorf("%w: executable identity", ErrUnavailable) + } + return ctx.Err() +} diff --git a/internal/heicdecode/client/client_test.go b/internal/heicdecode/client/client_test.go new file mode 100644 index 00000000..ba440f27 --- /dev/null +++ b/internal/heicdecode/client/client_test.go @@ -0,0 +1,201 @@ +package client + +import ( + "context" + "crypto/sha256" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "io" + "net" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func TestRejectsChangedHelperBeforeReadingSource(t *testing.T) { + path := filepath.Join(t.TempDir(), "helper") + if err := os.WriteFile(path, []byte("changed helper"), 0700); err != nil { + t.Fatal(err) + } + client, err := New(Config{Executable: path, SHA256: sha256.Sum256([]byte("expected helper")), Limits: heicdecode.DefaultLimits(0)}) + if err != nil { + t.Fatal(err) + } + defer client.Stop() + read := false + _, err = client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + read = true + return nil, nil + }) + if !errors.Is(err, ErrUnavailable) || read { + t.Fatalf("changed helper: err=%v, source read=%v", err, read) + } + client.Stop() + client.Wait() +} + +// TestMain also supplies an owned protocol peer. It is never a decoder or OS +// sandbox test: these modes exercise only the parent's process/pipe boundary. +func TestMain(m *testing.M) { + if len(os.Args) == 3 && os.Args[1] == "--owned-heic-descendant" { + connection, err := net.DialTimeout("tcp4", os.Args[2], time.Second) + if err != nil { + os.Exit(2) + } + if err = binary.Write(connection, binary.LittleEndian, uint32(os.Getpid())); err != nil { + os.Exit(2) + } + _, _ = io.Copy(io.Discard, connection) + _ = connection.Close() + os.Exit(0) + } + if len(os.Args) == 7 && os.Args[1] == "--heic-worker-v2" { + var limits heicdecode.Limits + if err := json.Unmarshal([]byte(os.Args[2]), &limits); err != nil { + os.Exit(2) + } + if err := heicdecode.WriteReady(os.Stdout, heicdecode.Ready{WASMMemoryBytes: limits.WASMMemoryBytes, NativeMemoryBytes: limits.OSProcessBytes}); err != nil { + os.Exit(2) + } + switch filepath.Base(os.Args[0]) { + case "hang": + // Remain alive with all pipes open until the parent terminates us. + for { + time.Sleep(time.Hour) + } + case "crash": + os.Exit(7) + case "diagnostics": + _, _ = io.CopyN(os.Stderr, zeroReader{}, int64(limits.MaxDiagnosticBytes)+1) + os.Exit(0) + case "family": + request, err := heicdecode.ReadRequest(os.Stdin, limits) + if err != nil { + os.Exit(2) + } + // This peer launches only another copy of its own test executable. + // The source contains the test's owned loopback listener address. + descendant := exec.Command(os.Args[0], "--owned-heic-descendant", string(request.Input)) + descendant.Stdout, descendant.Stderr = os.Stdout, os.Stderr + if err = descendant.Run(); err != nil { + os.Exit(2) + } + os.Exit(0) + default: + os.Exit(2) + } + } + os.Exit(m.Run()) +} + +type zeroReader struct{} + +func (zeroReader) Read(p []byte) (int, error) { clear(p); return len(p), nil } + +func ownedPeer(t *testing.T, mode string, timeout time.Duration) *Client { + t.Helper() + executable, err := os.Executable() + if err != nil { + t.Fatal(err) + } + path := filepath.Join(t.TempDir(), mode) + // A hard link preserves executable identity without a second binary-sized + // test allocation. Its basename selects an owned protocol behavior above. + if err = os.Link(executable, path); err != nil { + t.Fatal(err) + } + file, err := os.Open(path) + if err != nil { + t.Fatal(err) + } + hash := sha256.New() + _, copyErr := io.Copy(hash, file) + _ = file.Close() + if copyErr != nil { + t.Fatal(copyErr) + } + var digest [32]byte + copy(digest[:], hash.Sum(nil)) + limits := heicdecode.DefaultLimits(1024 * 1024) + limits.Timeout = timeout + client, err := New(Config{Executable: path, SHA256: digest, Limits: limits}) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { client.Stop(); client.Wait() }) + return client +} + +func TestOwnedPeerTimeoutJoinsBlockedWriter(t *testing.T) { + client := ownedPeer(t, "hang", 500*time.Millisecond) + _, err := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + // Larger than a pipe buffer; the peer deliberately never reads stdin. + return make([]byte, 1024*1024), nil + }) + if !errors.Is(err, context.DeadlineExceeded) { + t.Fatalf("blocked peer termination: %v", err) + } + client.Stop() + client.Wait() +} + +func TestOwnedPeerCrashAndDiagnosticsFailClosed(t *testing.T) { + for _, mode := range []string{"crash", "diagnostics"} { + t.Run(mode, func(t *testing.T) { + client := ownedPeer(t, mode, 5*time.Second) + response, err := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + return []byte("owned protocol test input"), nil + }) + if err == nil || response.Image != nil { + t.Fatalf("invalid peer response accepted: %+v, %v", response, err) + } + want := heicdecode.ErrInvalidResponse + if mode == "diagnostics" { + want = ErrDiagnosticLimit + } + if !errors.Is(err, want) { + t.Fatalf("peer did not exercise expected boundary: %v, want %v", err, want) + } + }) + } +} + +func TestStopCancelsAdmittedAndWaitingSources(t *testing.T) { + client := ownedPeer(t, "hang", 5*time.Second) + entered := make(chan struct{}) + done := make(chan error, 2) + go func() { + _, err := client.Do(context.Background(), heicdecode.Decode, func(ctx context.Context, _ int64) ([]byte, error) { + close(entered) + <-ctx.Done() + return nil, ctx.Err() + }) + done <- err + }() + select { + case <-entered: + case err := <-done: + t.Fatalf("owned peer readiness: %v", err) + case <-time.After(5 * time.Second): + t.Fatal("owned peer never reached source admission") + } + go func() { + _, err := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + return nil, fmt.Errorf("waiting source was admitted") + }) + done <- err + }() + client.Stop() + client.Wait() + for range 2 { + if err := <-done; !errors.Is(err, context.Canceled) { + t.Fatalf("stop result: %v", err) + } + } +} diff --git a/internal/heicdecode/client/native_darwin_test.go b/internal/heicdecode/client/native_darwin_test.go new file mode 100644 index 00000000..0fd0b2ab --- /dev/null +++ b/internal/heicdecode/client/native_darwin_test.go @@ -0,0 +1,207 @@ +//go:build heicnative && darwin && cgo + +package client + +import ( + "compress/gzip" + "context" + "crypto/sha256" + "errors" + "image" + "io" + "os" + "os/exec" + "path/filepath" + "testing" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// Run on macOS outside a surrounding sandbox after building with heicnative. +// It creates an ad-hoc signed helper bundle and uses only owned probe files, +// owned loopback listeners and ordinary licensed image fixtures. +func TestNativeMacSandboxHelper(t *testing.T) { + root, err := filepath.Abs(filepath.Join("..", "..", "..")) + if err != nil { + t.Fatal(err) + } + config := buildNativeMacHelper(t, root, "compiler") + config.Limits.MaxInputBytes = 1024 * 1024 + config.Limits.WASMMemoryBytes = 128 * 1024 * 1024 + config.Limits.MaxPixels = 1024 * 1024 + config.Limits.MaxOutputBytes = 8 * 1024 * 1024 + client, err := New(config) + if err != nil { + t.Fatal(err) + } + defer func() { client.Stop(); client.Wait() }() + fixture := filepath.Join(root, "scripts", "heicbuild", "testdata", "tenbit.heic") + t.Run("missing sandbox refuses source", func(t *testing.T) { + unprotected := buildNativeMacHelper(t, root, "unprotected-control") + other, newErr := New(unprotected) + if newErr != nil { + t.Fatal(newErr) + } + defer func() { other.Stop(); other.Wait() }() + read := false + _, decodeErr := other.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + read = true + return nil, nil + }) + if !errors.Is(decodeErr, ErrUnavailable) || read { + t.Fatalf("missing sandbox: error=%v, read=%v", decodeErr, read) + } + }) + t.Run("ordinary image after native readiness", func(t *testing.T) { + result, decodeErr := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + return os.ReadFile(fixture) + }) + if decodeErr != nil { + t.Fatal(decodeErr) + } + if img, ok := result.Image.(*image.NRGBA64); !ok || img.Bounds().Dx() != 16 || img.Bounds().Dy() != 16 { + t.Fatalf("ordinary ten-bit result: %T", result.Image) + } + }) + t.Run("cancellation joins admitted and queued work", func(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + entered := make(chan struct{}) + done := make(chan error, 1) + go func() { + _, decodeErr := client.Do(ctx, heicdecode.Decode, func(ctx context.Context, _ int64) ([]byte, error) { + close(entered) + <-ctx.Done() + return nil, ctx.Err() + }) + done <- decodeErr + }() + select { + case <-entered: + case err = <-done: + t.Fatalf("failed before source admission: %v", err) + case <-time.After(30 * time.Second): + t.Fatal("source was never admitted") + } + cancelled, cancelQueued := context.WithCancel(context.Background()) + cancelQueued() + _, queuedErr := client.Do(cancelled, heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + t.Error("cancelled queued source was read") + return nil, nil + }) + if !errors.Is(queuedErr, context.Canceled) { + t.Fatalf("queued cancellation: %v", queuedErr) + } + cancel() + if decodeErr := <-done; !errors.Is(decodeErr, context.Canceled) { + t.Fatalf("admitted cancellation: %v", decodeErr) + } + client.Stop() + client.Wait() + }) +} + +func buildNativeMacHelper(t *testing.T, root, engine string) Config { + t.Helper() + var err error + tags := "no_emoji,nodynamic" + entitlements := filepath.Join(root, "packaging", "heic", "macos.entitlements.plist") + if engine == "interpreter" { + tags += ",heicinterpreter" + entitlements = filepath.Join(t.TempDir(), "interpreter.plist") + const minimal = `com.apple.security.app-sandbox` + if err = os.WriteFile(entitlements, []byte(minimal), 0600); err != nil { + t.Fatal(err) + } + } + if engine == "unprotected-control" { + entitlements = filepath.Join(t.TempDir(), "no-sandbox.plist") + const empty = `` + if err = os.WriteFile(entitlements, []byte(empty), 0600); err != nil { + t.Fatal(err) + } + } + bundle := filepath.Join(t.TempDir(), "HEICWorker.app") + executable := filepath.Join(bundle, "Contents", "MacOS", "picfetch-heic-worker") + if err = os.MkdirAll(filepath.Dir(executable), 0700); err != nil { + t.Fatal(err) + } + build := exec.Command("go", "build", "-tags", tags, "-o", executable, "./cmd/picfetch-heic-worker") + build.Dir = root + if out, buildErr := build.CombinedOutput(); buildErr != nil { + t.Fatalf("build helper: %v: %s", buildErr, out) + } + plist, err := os.ReadFile(filepath.Join(root, "packaging", "heic", "macos.Info.plist")) + if err != nil { + t.Fatal(err) + } + if err = os.WriteFile(filepath.Join(bundle, "Contents", "Info.plist"), plist, 0600); err != nil { + t.Fatal(err) + } + sign := exec.Command("/usr/bin/codesign", "--force", "--sign", "-", "--options", "runtime", "--entitlements", entitlements, bundle) + if out, signErr := sign.CombinedOutput(); signErr != nil { + t.Fatalf("sign helper: %v: %s", signErr, out) + } + verify := exec.Command("/usr/bin/codesign", "--verify", "--strict", bundle) + if out, verifyErr := verify.CombinedOutput(); verifyErr != nil { + t.Fatalf("verify helper: %v: %s", verifyErr, out) + } + contents, err := os.ReadFile(executable) + if err != nil { + t.Fatal(err) + } + limits := heicdecode.DefaultLimits(0) + config := Config{Executable: executable, SHA256: sha256.Sum256(contents), Limits: limits} + return config +} + +// This comparison records an ordinary owned image within the production +// deadline. Interpreter deadline refusal is an observed result, not a skipped +// sandbox gate or permission to extend resource limits. +func TestNativeMacRuntimeChoice(t *testing.T) { + root, err := filepath.Abs(filepath.Join("..", "..", "..")) + if err != nil { + t.Fatal(err) + } + for _, engine := range []string{"interpreter", "compiler"} { + t.Run(engine, func(t *testing.T) { + config := buildNativeMacHelper(t, root, engine) + client, err := New(config) + if err != nil { + t.Fatal(err) + } + defer func() { client.Stop(); client.Wait() }() + for _, name := range []string{"basic.heic", "photo-gradient.heic.gz"} { + start := time.Now() + result, err := client.Do(context.Background(), heicdecode.Decode, func(_ context.Context, maxBytes int64) ([]byte, error) { + path := filepath.Join(root, "scripts", "heicbuild", "testdata", name) + if name == "basic.heic" { + return os.ReadFile(path) + } + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer func() { _ = file.Close() }() + reader, err := gzip.NewReader(file) + if err != nil { + return nil, err + } + defer func() { _ = reader.Close() }() + return io.ReadAll(io.LimitReader(reader, maxBytes+1)) + }) + if err != nil { + t.Logf("%s: elapsed=%s, result=%v", name, time.Since(start), err) + if engine != "interpreter" || !errors.Is(err, context.DeadlineExceeded) { + t.Fatal(err) + } + continue + } + t.Logf("%s: elapsed=%s, bounds=%v", name, time.Since(start), result.Image.Bounds()) + if name == "photo-gradient.heic.gz" && result.Image.Bounds() != image.Rect(0, 0, 4032, 3024) { + t.Fatal("gradient dimensions differ") + } + } + }) + } +} diff --git a/internal/heicdecode/client/process.go b/internal/heicdecode/client/process.go new file mode 100644 index 00000000..50d53cee --- /dev/null +++ b/internal/heicdecode/client/process.go @@ -0,0 +1,163 @@ +package client + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net" + "os" + "os/exec" + "path/filepath" + "runtime" + "sync" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func (c *Client) run(ctx context.Context, op heicdecode.Operation, input Input) (result heicdecode.Response, resultErr error) { + var empty heicdecode.Response + probe, err := os.MkdirTemp("", "picfetch-heic-probe-") + if err != nil { + return empty, err + } + defer func() { _ = os.RemoveAll(probe) }() + readPath, writePath := filepath.Join(probe, "read"), filepath.Join(probe, "write") + if err = os.WriteFile(readPath, []byte("PicFetch owned sandbox probe\n"), 0600); err != nil { + return empty, err + } + // Both endpoints belong to this request. A failed sandbox can reach only + // these disposable loopback sockets, never an unrelated network service. + tcp, err := net.Listen("tcp4", "127.0.0.1:0") + if err != nil { + return empty, err + } + defer func() { _ = tcp.Close() }() + udp, err := net.ListenPacket("udp4", "127.0.0.1:0") + if err != nil { + return empty, err + } + defer func() { _ = udp.Close() }() + limitsJSON, err := json.Marshal(c.config.Limits) + if err != nil { + return empty, err + } + cmd := exec.Command(c.config.Executable, "--heic-worker-v2", string(limitsJSON), readPath, writePath, tcp.Addr().String(), udp.LocalAddr().String()) + cmd.Env = []string{"GOMAXPROCS=1"} + cmd.Dir = string(filepath.Separator) + configureProcess(cmd) + var pipes []*os.File + defer func() { + for _, file := range pipes { + _ = file.Close() + } + }() + newPipe := func() (*os.File, *os.File, error) { + reader, writer, pipeErr := os.Pipe() + if pipeErr == nil { + pipes = append(pipes, reader, writer) + } + return reader, writer, pipeErr + } + inRead, inWrite, err := newPipe() + if err != nil { + return empty, err + } + outRead, outWrite, err := newPipe() + if err != nil { + return empty, err + } + errRead, errWrite, err := newPipe() + if err != nil { + return empty, err + } + cmd.Stdin, cmd.Stdout, cmd.Stderr = inRead, outWrite, errWrite + if err = cmd.Start(); err != nil { + return empty, fmt.Errorf("%w: launch: %v", ErrUnavailable, err) + } + _ = inRead.Close() + _ = outWrite.Close() + _ = errWrite.Close() + // Own every pipe rather than relying on exec.Cmd's background copy loops. + // On cancellation, close both transport directions and terminate the family. + ctx, cancel := context.WithCancel(ctx) + var cancelWork sync.WaitGroup + cancelWork.Add(1) + context.AfterFunc(ctx, func() { + defer cancelWork.Done() + killProcess(cmd) + _ = inWrite.Close() + _ = outRead.Close() + _ = errRead.Close() + }) + var pipeWork sync.WaitGroup + var diagnosticErr error // Read only after pipeWork.Wait. + pipeWork.Add(1) + stderrDone := make(chan error, 1) + go func() { + defer pipeWork.Done() + count, readErr := io.Copy(io.Discard, io.LimitReader(errRead, int64(c.config.Limits.MaxDiagnosticBytes)+1)) + if count > int64(c.config.Limits.MaxDiagnosticBytes) { + readErr = ErrDiagnosticLimit + diagnosticErr = readErr + cancel() + } + stderrDone <- readErr + }() + // Every return after Start waits for process exit and all transport workers. + defer func() { + cancel() + cancelWork.Wait() + // Kill the group before reaping its leader, so its PID cannot be + // recycled between Wait and a late cancellation callback. + processErr := cmd.Wait() + pipeWork.Wait() + if diagnosticErr != nil { + result = empty + resultErr = errors.Join(resultErr, diagnosticErr) + } + if resultErr == nil && processErr != nil { + result = empty + resultErr = fmt.Errorf("HEIC helper exit: %w", processErr) + } + }() + ready, err := heicdecode.ReadReady(outRead) + if err != nil || ready.WASMMemoryBytes != c.config.Limits.WASMMemoryBytes || + ready.NativeMemoryBytes > c.config.Limits.OSProcessBytes || + (runtime.GOOS != "darwin" && ready.NativeMemoryBytes == 0) { + return empty, fmt.Errorf("%w: native readiness", ErrUnavailable) + } + if err = ctx.Err(); err != nil { + return empty, err + } + data, err := input(ctx, c.config.Limits.MaxInputBytes) + if err != nil { + return empty, err + } + if err = ctx.Err(); err != nil { + return empty, err + } + writeDone := make(chan error, 1) + pipeWork.Add(1) + go func() { + defer pipeWork.Done() + writeErr := heicdecode.WriteRequest(inWrite, heicdecode.Request{Operation: op, Input: data}, c.config.Limits) + _ = inWrite.Close() + writeDone <- writeErr + }() + decoded, readErr := heicdecode.ReadResponse(outRead, op, c.config.Limits) + if readErr != nil { + return empty, readErr + } + if err = <-writeDone; err != nil { + return empty, err + } + if err = <-stderrDone; err != nil { + return empty, err + } + if err = ctx.Err(); err != nil { + return empty, err + } + return decoded, nil +} diff --git a/internal/heicdecode/client/process_other.go b/internal/heicdecode/client/process_other.go new file mode 100644 index 00000000..1ba5d94a --- /dev/null +++ b/internal/heicdecode/client/process_other.go @@ -0,0 +1,13 @@ +//go:build !darwin && !linux + +package client + +import "os/exec" + +func configureProcess(_ *exec.Cmd) {} + +func killProcess(cmd *exec.Cmd) { + if cmd.Process != nil { + _ = cmd.Process.Kill() + } +} diff --git a/internal/heicdecode/client/process_unix.go b/internal/heicdecode/client/process_unix.go new file mode 100644 index 00000000..42c4371a --- /dev/null +++ b/internal/heicdecode/client/process_unix.go @@ -0,0 +1,18 @@ +//go:build darwin || linux + +package client + +import ( + "os/exec" + "syscall" +) + +func configureProcess(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} +} + +func killProcess(cmd *exec.Cmd) { + if cmd.Process != nil { + _ = syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL) + } +} diff --git a/internal/heicdecode/client/process_unix_test.go b/internal/heicdecode/client/process_unix_test.go new file mode 100644 index 00000000..5138868a --- /dev/null +++ b/internal/heicdecode/client/process_unix_test.go @@ -0,0 +1,72 @@ +//go:build darwin || linux + +package client + +import ( + "context" + "encoding/binary" + "errors" + "io" + "net" + "os" + "testing" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func TestOwnedPeerCancellationTerminatesDescendant(t *testing.T) { + listener, err := net.ListenTCP("tcp4", &net.TCPAddr{IP: net.IPv4(127, 0, 0, 1)}) + if err != nil { + t.Fatal(err) + } + defer func() { _ = listener.Close() }() + if err = listener.SetDeadline(time.Now().Add(5 * time.Second)); err != nil { + t.Fatal(err) + } + client := ownedPeer(t, "family", 10*time.Second) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + done := make(chan error, 1) + go func() { + _, decodeErr := client.Do(ctx, heicdecode.Decode, func(_ context.Context, _ int64) ([]byte, error) { + return []byte(listener.Addr().String()), nil + }) + done <- decodeErr + }() + connection, err := listener.AcceptTCP() + if err != nil { + t.Fatal(err) + } + defer func() { _ = connection.Close() }() + if err = connection.SetReadDeadline(time.Now().Add(5 * time.Second)); err != nil { + t.Fatal(err) + } + var pid uint32 + if err = binary.Read(connection, binary.LittleEndian, &pid); err != nil { + t.Fatal(err) + } + // If the group-kill guard regresses, clean up the still-connected owned + // descendant after the bounded EOF assertion. Never poll PID existence. + exited := false + defer func() { + if !exited { + if process, findErr := os.FindProcess(int(pid)); findErr == nil { + _ = process.Kill() + _ = process.Release() + } + } + }() + cancel() + if err = <-done; !errors.Is(err, context.Canceled) { + t.Fatalf("family cancellation: %v", err) + } + var unexpected [1]byte + _, err = connection.Read(unexpected[:]) + exited = errors.Is(err, io.EOF) + if !exited { + t.Fatalf("descendant kept its connection after client joined: %v", err) + } + client.Stop() + client.Wait() +} diff --git a/internal/heicdecode/limits.go b/internal/heicdecode/limits.go index f1423f08..91974a0e 100644 --- a/internal/heicdecode/limits.go +++ b/internal/heicdecode/limits.go @@ -11,7 +11,7 @@ import ( const ( hardMaxInputBytes int64 = 64 * 1024 * 1024 hardMaxPixels int64 = 64_000_000 - hardMaxOutputBytes int64 = hardMaxPixels * 4 + hardMaxOutputBytes = hardMaxPixels * 4 hardMaxMetadataBytes = 64 * 1024 hardMaxDiagnosticBytes = 4096 ) @@ -19,8 +19,10 @@ const ( var ErrInvalidLimits = errors.New("invalid HEIC decoder limits") // Limits is the complete finite resource contract for one helper request. -// OSProcessBytes must be enforced over the complete helper process family; -// WASMMemoryBytes is the separate linear-memory ceiling inside that process. +// WASMMemoryBytes is an enforced linear-memory ceiling. OSProcessBytes is the +// requested native-process budget; Ready separately reports the hard OS memory +// control actually installed. macOS explicitly permits an absent hard native +// cap, while retaining bounded WASM and transport and verified OS sandboxing. type Limits struct { Timeout time.Duration WASMMemoryBytes int64 @@ -30,7 +32,7 @@ type Limits struct { MaxOutputBytes int64 MaxMetadataBytes uint32 MaxDiagnosticBytes uint32 - MaxThreads uint32 + MaxThreads uint32 // Decoder threads; the native Go host has its own finite thread ceiling. MaxLiveJobs uint32 } diff --git a/internal/heicdecode/metadata_test.go b/internal/heicdecode/metadata_test.go index 026fd491..58ccb087 100644 --- a/internal/heicdecode/metadata_test.go +++ b/internal/heicdecode/metadata_test.go @@ -12,7 +12,7 @@ func TestMetadataRejectsUnvalidatedFields(t *testing.T) { } } got, err := readMetadata([]byte(`{"Orientation":6,"GPSLatitude":0,"GPSLongitude":0,"DateTimeOriginal":"2026:09:15 12:30:00","Make":"Camera"}`)) - if err != nil || got.Orientation != 6 || got.Make != "Camera" { + if err != nil || got == nil || got.Orientation != 6 || got.Make != "Camera" { t.Fatalf("metadata = %+v, %v", got, err) } } diff --git a/internal/heicdecode/protocol.go b/internal/heicdecode/protocol.go index 9c0c5209..08780792 100644 --- a/internal/heicdecode/protocol.go +++ b/internal/heicdecode/protocol.go @@ -25,6 +25,8 @@ var ErrInvalidResponse = errors.New("invalid HEIC helper response") // Status classifies a bounded worker refusal, independently of transport errors. type Status uint16 +// Worker statuses include values used only by the separate WASI guest module. +// noinspection GoUnusedConst const ( StatusRejected Status = 1 + iota StatusUnsupported diff --git a/internal/heicdecode/protocol_test.go b/internal/heicdecode/protocol_test.go index 831aa57e..183a9084 100644 --- a/internal/heicdecode/protocol_test.go +++ b/internal/heicdecode/protocol_test.go @@ -88,7 +88,7 @@ func responseBytes(t *testing.T, width, height uint32, format, depth uint16, pix t.Helper() var out bytes.Buffer out.WriteString(responseMagic) - values := []any{uint16(protocolVersion), uint16(statusOK), width, height, uint32(width * 4), depth, format, + values := []any{uint16(protocolVersion), uint16(statusOK), width, height, width * 4, depth, format, uint64(len(pixels)), uint32(len(metadata)), uint32(len(diagnostic))} for _, value := range values { if err := binary.Write(&out, binary.LittleEndian, value); err != nil { diff --git a/internal/heicdecode/ready.go b/internal/heicdecode/ready.go new file mode 100644 index 00000000..41e9d6ee --- /dev/null +++ b/internal/heicdecode/ready.go @@ -0,0 +1,47 @@ +package heicdecode + +import ( + "encoding/binary" + "errors" + "io" +) + +// Ready is sent before any image input. File and network denial must have been +// observed by native probes. NativeMemoryBytes is zero when no hard OS memory +// ceiling was installed; macOS permits that explicitly approved limitation. +type Ready struct { + WASMMemoryBytes int64 + NativeMemoryBytes int64 +} + +// WriteReady publishes a fixed-size startup acknowledgement. The worker calls +// it only after platform policy and actual capability checks have succeeded. +func WriteReady(w io.Writer, ready Ready) error { + if !ready.valid() { + return errors.New("invalid HEIC worker readiness") + } + var data [24]byte + copy(data[:8], "PHREADY2") + binary.LittleEndian.PutUint64(data[8:16], uint64(ready.WASMMemoryBytes)) + binary.LittleEndian.PutUint64(data[16:24], uint64(ready.NativeMemoryBytes)) + return writeAll(w, data[:]) +} + +// ReadReady reads only the startup frame; the later response follows on the +// same pipe. It never consumes image output or infers native OS memory bounds. +func ReadReady(r io.Reader) (Ready, error) { + var data [24]byte + if _, err := io.ReadFull(r, data[:]); err != nil { + return Ready{}, err + } + ready := Ready{WASMMemoryBytes: int64(binary.LittleEndian.Uint64(data[8:16])), NativeMemoryBytes: int64(binary.LittleEndian.Uint64(data[16:24]))} + if string(data[:8]) != "PHREADY2" || !ready.valid() { + return Ready{}, errors.New("invalid HEIC worker readiness") + } + return ready, nil +} + +func (r Ready) valid() bool { + return r.WASMMemoryBytes > 0 && r.WASMMemoryBytes <= 1024*1024*1024 && r.WASMMemoryBytes%(64*1024) == 0 && + (r.NativeMemoryBytes == 0 || r.NativeMemoryBytes >= r.WASMMemoryBytes && r.NativeMemoryBytes <= 2*1024*1024*1024) +} diff --git a/internal/heicdecode/ready_test.go b/internal/heicdecode/ready_test.go new file mode 100644 index 00000000..9550fdaa --- /dev/null +++ b/internal/heicdecode/ready_test.go @@ -0,0 +1,30 @@ +package heicdecode + +import ( + "bytes" + "encoding/binary" + "testing" +) + +func TestReadinessReportsActualMemoryControl(t *testing.T) { + for _, native := range []int64{0, 2 * 1024 * 1024 * 1024} { + var stream bytes.Buffer + want := Ready{WASMMemoryBytes: 1024 * 1024 * 1024, NativeMemoryBytes: native} + if err := WriteReady(&stream, want); err != nil { + t.Fatal(err) + } + stream.WriteString("following response") + got, err := ReadReady(&stream) + if err != nil || got != want || stream.String() != "following response" { + t.Fatalf("readiness = %+v, %v, remaining=%q", got, err, stream.String()) + } + } + for _, memory := range []uint64{0, 1, 1024*1024*1024 + 65536, 1 << 63} { + var frame [24]byte + copy(frame[:8], "PHREADY2") + binary.LittleEndian.PutUint64(frame[8:16], memory) + if _, err := ReadReady(bytes.NewReader(frame[:])); err == nil { + t.Fatalf("accepted invalid memory control %d", memory) + } + } +} diff --git a/scripts/heicguest/decoder.wasm b/internal/heicdecode/worker/decoder.wasm similarity index 99% rename from scripts/heicguest/decoder.wasm rename to internal/heicdecode/worker/decoder.wasm index 981d4ccd909cc3e1db887f27cbc4ccfa15f77fae..2da94e118f72be7c42e8bcf4f41656dc446e0d06 100644 GIT binary patch delta 1171 zcma)*Pi$0G6vp2<_f4lWo!WmholaYz1D!IZtpn7-f&(qSmPe^rL=u6dA<@LTaAPDf znwk)Dk})ZX28|cpU`&)hs~U*|39+daI@8e@aRDgm!c{lJNJt=T@VoPebm>ceIp6#4 z_wGISzV{aA^1KL62nmZ4TRc)DUa1wI_@zz)QZG+QgEUH$G)s#FB_yp9mNtnt%y`50R{CEk>k}d-W}B6%HglX}+(R3=a2WgT!DZ=d(*5h{_$A5|VEjmtb z^Kt#@U1!(cb~b|%Z-DD+K{s^0RWK9#nYotgxse;Fm2EhUSm+NTKiwh@Q;=KC!t}Fo zmUU+lJ2^(pdUw$op`t#C`=Ov};UKooHBXeXPGK%$?`@@iSNw~@Ih;~#+kYzcm*U^d z{YUyv(Mb+At0r#7({@deS`_et2BXm_1*p#ZB;l*5%;>*P7pXlomYKfitWf&UeFuz! zvCN_Sdv5+pJ9Ync_iWR6`MuYe^5a*wmDhK!yNT!{NYB@{rC`60PvFR^SQ7pY-M{4a z#l|2fz^kjG->r%+!~a{)EV+Y`N08>*F|$2b6$$9K6*b1tPdZ?5u^>!Hk zYq~S*_W9m}JOLK;fvg+$B+lE`h<-EcCOor{r}Y=c{SxwmzG~b#$ZvHq>rQy)A%D;# zIXA4XowxNuZfuQyC+8lE{)B-W;5IPJpGB9!a+jqa;Guqyb2rB5f^B(052(iCmCd{h zPrzr|S;o;^hWsAnKsEYGC2C3?{;Wp*v59s-M!^uMMrSHff%hT!T>rD|Zi##YX-?7f v*ISP8Rd|c(fxHX$W(M-(Qw8cx&tBOFCcq0|KX?&Lf&<{C%Wgc= z-`Q6FDb_@7!8jEw_{Dm?r{LedG*`XcwbVWeJs9PD@Mt}$bzr^sG~o>0Xs=VXTt_vEZ0is)v3X1_C}y=yZRcScP(i(C##y9RQc{05XFkoRL@bar)Z#p%Y$GE^gQbyGj16s4^oKXQWy=GtI+H>qB8oGI7%4U3_)4r zOzGGxcJn^X*MqZ8KRwi+;(c{kRdX1p!TwiDSz}m>IB-X)yNYuPXEBBi*!PtBUGXjR z{<;2Z*6B%BsY>*$QMNx!)d~barO{@l3Mvo0N`&T=H}u$vky=mdybqr^e-r+{^vE*@ z41hszVt2rk5ql2|YNKHWL( zcEmS8ZU%cxqT?mepW)xvho{|S!wX1rlgw)WmPD#_X4>tJH=MVvX0Qqrn<~oZ^0R#a ze^f8bxE-NSAO+meTQY9cm%LzG1Nx(k+wD6J`KA8axaT0h)mM!>4(aLHj63X`gq+g- zSvRV(7i>L|9coysq4aoio&$K6Ygz7zXcvP2gRy8EgUXdB?7d{Lu6g?adPw diff --git a/internal/heicdecode/worker/engine_compiler.go b/internal/heicdecode/worker/engine_compiler.go new file mode 100644 index 00000000..4c5fe77c --- /dev/null +++ b/internal/heicdecode/worker/engine_compiler.go @@ -0,0 +1,7 @@ +//go:build !heicinterpreter + +package worker + +import "github.com/tetratelabs/wazero" + +func runtimeConfig() wazero.RuntimeConfig { return wazero.NewRuntimeConfigCompiler() } diff --git a/internal/heicdecode/worker/engine_interpreter.go b/internal/heicdecode/worker/engine_interpreter.go new file mode 100644 index 00000000..ae71cfa8 --- /dev/null +++ b/internal/heicdecode/worker/engine_interpreter.go @@ -0,0 +1,9 @@ +//go:build heicinterpreter + +package worker + +import "github.com/tetratelabs/wazero" + +// The interpreter variant permits native performance/signing qualification +// without granting generated-code authority. It uses the same finite limits. +func runtimeConfig() wazero.RuntimeConfig { return wazero.NewRuntimeConfigInterpreter() } diff --git a/internal/heicdecode/worker/isolate_darwin.go b/internal/heicdecode/worker/isolate_darwin.go new file mode 100644 index 00000000..52b22657 --- /dev/null +++ b/internal/heicdecode/worker/isolate_darwin.go @@ -0,0 +1,37 @@ +//go:build darwin && cgo + +package worker + +/* +#cgo LDFLAGS: -framework Security -framework CoreFoundation +#include +#include + +static int picfetchAppSandbox(void) { + SecTaskRef task = SecTaskCreateFromSelf(kCFAllocatorDefault); + if (task == NULL) return 0; + CFTypeRef value = SecTaskCopyValueForEntitlement(task, CFSTR("com.apple.security.app-sandbox"), NULL); + int enabled = value != NULL && CFGetTypeID(value) == CFBooleanGetTypeID() && CFBooleanGetValue((CFBooleanRef)value); + if (value != NULL) CFRelease(value); + CFRelease(task); + return enabled; +} +*/ +import "C" + +import ( + "errors" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func isolate(_ heicdecode.Limits) (int64, error) { + // App Sandbox is established by macOS at exec from the signed helper + // bundle's entitlement. No deprecated custom Seatbelt API is used. + if C.picfetchAppSandbox() != 1 { + return 0, errors.New("HEIC helper lacks App Sandbox entitlement") + } + // Capability probes in Main must also observe actual file/network denial. + // Ronin explicitly accepted no guaranteed whole-native-process memory cap. + return 0, nil +} diff --git a/internal/heicdecode/worker/isolate_other.go b/internal/heicdecode/worker/isolate_other.go new file mode 100644 index 00000000..641ab4e9 --- /dev/null +++ b/internal/heicdecode/worker/isolate_other.go @@ -0,0 +1,13 @@ +//go:build !darwin || !cgo + +package worker + +import ( + "errors" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +func isolate(_ heicdecode.Limits) (int64, error) { + return 0, errors.New("HEIC native sandbox is unavailable on this build") +} diff --git a/internal/heicdecode/worker/main.go b/internal/heicdecode/worker/main.go new file mode 100644 index 00000000..49495fb0 --- /dev/null +++ b/internal/heicdecode/worker/main.go @@ -0,0 +1,97 @@ +package worker + +import ( + "context" + "encoding/json" + "errors" + "net" + "os" + "runtime" + "runtime/debug" + "syscall" + "time" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// Main serves one request in the dedicated, disposable helper process. Probe +// paths and loopback endpoints are parent-owned launch controls, never supplied +// by an image. Any missing platform restriction exits before reading stdin. +func Main(args []string) int { + if len(args) != 6 || args[0] != "--heic-worker-v2" || len(args[1]) > 2048 { + return 2 + } + var limits heicdecode.Limits + if err := json.Unmarshal([]byte(args[1]), &limits); err != nil || limits.Validate() != nil { + return 2 + } + for _, arg := range args[2:] { + if len(arg) == 0 || len(arg) > 4096 { + return 2 + } + } + runtime.GOMAXPROCS(1) + debug.SetMaxThreads(32) + // A Go runtime target, explicitly not a hard cap for native process memory. + debug.SetMemoryLimit(limits.OSProcessBytes - limits.OSProcessBytes/4) + nativeMemory, err := isolate(limits) + if err != nil { + return 3 + } + ctx, cancel := context.WithTimeout(context.Background(), limits.Timeout) + defer cancel() + if err = verifyDenial(ctx, args[2], args[3], args[4], args[5]); err != nil { + return 3 + } + if err = heicdecode.WriteReady(os.Stdout, heicdecode.Ready{WASMMemoryBytes: limits.WASMMemoryBytes, NativeMemoryBytes: nativeMemory}); err != nil { + return 4 + } + if err = execute(ctx, decoder, os.Stdin, os.Stdout, os.Stderr, limits); err != nil { + return 4 + } + return 0 +} + +func verifyDenial(ctx context.Context, readPath, writePath, tcpAddress, udpAddress string) error { + file, err := os.Open(readPath) + if file != nil { + _ = file.Close() + } + if !permissionDenied(err) { + return errors.New("HEIC native file-read denial unavailable") + } + file, err = os.OpenFile(writePath, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0600) + if file != nil { + _ = file.Close() + } + if !permissionDenied(err) { + return errors.New("HEIC native file-write denial unavailable") + } + for i, address := range []string{tcpAddress, udpAddress} { + host, _, splitErr := net.SplitHostPort(address) + if splitErr != nil || host != "127.0.0.1" { + return errors.New("HEIC capability probe must be loopback") + } + network := "tcp4" + if i == 1 { + network = "udp4" + } + dialer := net.Dialer{Timeout: time.Second} + connection, dialErr := dialer.DialContext(ctx, network, address) + if connection != nil { + if i == 1 { + _ = connection.SetWriteDeadline(time.Now().Add(time.Second)) + _, dialErr = connection.Write([]byte{0}) + } + _ = connection.Close() + } + if !permissionDenied(dialErr) { + return errors.New("HEIC native network denial unavailable") + } + } + return ctx.Err() +} + +func permissionDenied(err error) bool { + return errors.Is(err, syscall.EPERM) || errors.Is(err, syscall.EACCES) +} diff --git a/internal/heicdecode/worker/runtime.go b/internal/heicdecode/worker/runtime.go new file mode 100644 index 00000000..2647405b --- /dev/null +++ b/internal/heicdecode/worker/runtime.go @@ -0,0 +1,75 @@ +// Package worker hosts the fixed WASI HEIC module in the dedicated helper. +// Only cmd/picfetch-heic-worker may import it in a production binary. +package worker + +import ( + "context" + _ "embed" + "errors" + "io" + + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// decoder is reproduced and verified by scripts/heicbuild. It is never loaded +// from a request, a user preference, or an environment variable. +// +//go:embed decoder.wasm +var decoder []byte + +// execute requires the caller to establish native isolation first. Production +// reaches it only through Main; package tests also use small owned WASM modules +// to observe the runtime's memory and cancellation boundaries independently. +func execute(ctx context.Context, module []byte, stdin io.Reader, stdout, stderr io.Writer, limits heicdecode.Limits) error { + if err := limits.Validate(); err != nil { + return err + } + ctx, cancel := context.WithTimeout(ctx, limits.Timeout) + defer cancel() + config := runtimeConfig(). + WithMemoryLimitPages(uint32(limits.WASMMemoryBytes / (64 * 1024))). + WithCloseOnContextDone(true) + runtime := wazero.NewRuntimeWithConfig(ctx, config) + defer func() { _ = runtime.Close(context.Background()) }() + if _, err := wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { + return err + } + // All stream limits include their fixed protocol header. No image-sized + // host buffer is used: WASI copies directly between guest memory and pipes. + output := &limitedWriter{writer: stdout, remaining: limits.MaxOutputBytes + int64(limits.MaxMetadataBytes) + int64(limits.MaxDiagnosticBytes) + 40} + diagnostic := &limitedWriter{writer: stderr, remaining: int64(limits.MaxDiagnosticBytes)} + moduleConfig := wazero.NewModuleConfig(). + WithStdin(io.LimitReader(stdin, limits.MaxInputBytes+24+1)). + WithStdout(output).WithStderr(diagnostic) + // No filesystem, environment, clock, random source, or socket capability. + _, err := runtime.InstantiateWithConfig(ctx, module, moduleConfig) + if ctx.Err() != nil { + return ctx.Err() + } + if output.exceeded || diagnostic.exceeded { + return errors.New("HEIC guest exceeded stream limit") + } + return err +} + +type limitedWriter struct { + writer io.Writer + remaining int64 + exceeded bool +} + +func (w *limitedWriter) Write(p []byte) (int, error) { + if int64(len(p)) > w.remaining { + w.exceeded = true + return 0, errors.New("HEIC stream limit") + } + n, err := w.writer.Write(p) + w.remaining -= int64(n) + if n < len(p) && err == nil { + err = io.ErrShortWrite + } + return n, err +} diff --git a/internal/heicdecode/worker/runtime_test.go b/internal/heicdecode/worker/runtime_test.go new file mode 100644 index 00000000..8b60775a --- /dev/null +++ b/internal/heicdecode/worker/runtime_test.go @@ -0,0 +1,171 @@ +package worker + +import ( + "bytes" + "context" + "errors" + "io" + "os" + "path/filepath" + "testing" + "time" + + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" + + "github.com/frathe/picfetch/internal/heicdecode" +) + +// This runtime seam tests WASI bounds only. Native sandbox qualification is a +// separate subprocess test; it cannot be inferred from an in-process runtime. +func TestRuntimeOrdinaryFixture(t *testing.T) { + input, err := os.ReadFile(filepath.Join("..", "..", "..", "scripts", "heicbuild", "testdata", "tenbit.heic")) + if err != nil { + t.Fatal(err) + } + limits := heicdecode.DefaultLimits(1024 * 1024) + limits.WASMMemoryBytes = 128 * 1024 * 1024 + limits.MaxPixels = 1024 * 1024 + limits.MaxOutputBytes = 8 * 1024 * 1024 + var in, out, diagnostic bytes.Buffer + if err = heicdecode.WriteRequest(&in, heicdecode.Request{Operation: heicdecode.Decode, Input: input}, limits); err != nil { + t.Fatal(err) + } + ctx, cancel := context.WithTimeout(context.Background(), limits.Timeout) + defer cancel() + if err = execute(ctx, decoder, &in, &out, &diagnostic, limits); err != nil { + t.Fatalf("execute: %v (%s)", err, diagnostic.String()) + } + result, err := heicdecode.ReadResponse(&out, heicdecode.Decode, limits) + if err != nil { + t.Fatal(err) + } + if result.Image == nil || result.Image.Bounds().Dx() != 16 || result.Image.Bounds().Dy() != 16 { + t.Fatalf("unexpected ordinary fixture result: %+v", result.Config) + } +} + +func TestRuntimeEnforcesMemoryLimit(t *testing.T) { + limits := heicdecode.DefaultLimits(0) + if err := execute(context.Background(), ownedModule(2, []byte{0x0b}), bytes.NewReader(nil), io.Discard, io.Discard, limits); err != nil { + t.Fatalf("owned positive control is invalid: %v", err) + } + limits.WASMMemoryBytes = 64 * 1024 + // This owned module declares two pages; no image or codec is involved. + if err := execute(context.Background(), ownedModule(2, []byte{0x0b}), bytes.NewReader(nil), io.Discard, io.Discard, limits); err == nil { + t.Fatal("module exceeding initial linear-memory limit was admitted") + } + // memory.grow(1) must return -1 at the one-page limit. Trap if it succeeds. + grow := []byte{0x41, 1, 0x40, 0, 0x41, 0x7f, 0x47, 0x04, 0x40, 0, 0x0b, 0x0b} + if err := execute(context.Background(), ownedModule(1, grow), bytes.NewReader(nil), io.Discard, io.Discard, limits); err != nil { + t.Fatalf("growth was not refused at the limit: %v", err) + } +} + +func TestRuntimeCancelsOwnedLoop(t *testing.T) { + limits := heicdecode.DefaultLimits(0) + limits.Timeout = 50 * time.Millisecond + // A PicFetch-owned loop exercises context termination, not a decoder defect. + loop := []byte{0x03, 0x40, 0x0c, 0, 0x0b, 0x0b} + err := execute(context.Background(), ownedModule(1, loop), bytes.NewReader(nil), io.Discard, io.Discard, limits) + if !errors.Is(err, context.DeadlineExceeded) { + t.Fatalf("loop termination = %v", err) + } +} + +func TestRuntimeBoundsGuestDiagnostics(t *testing.T) { + limits := heicdecode.DefaultLimits(0) + var diagnostic bytes.Buffer + if err := execute(context.Background(), diagnosticModule(), bytes.NewReader(nil), io.Discard, &diagnostic, limits); err != nil || diagnostic.String() != "ok" { + t.Fatalf("owned diagnostic positive control: err=%v, bytes=%q", err, diagnostic.String()) + } + diagnostic.Reset() + limits.MaxDiagnosticBytes = 1 + // The owned module writes two bytes to stderr. Both the WASI errno and + // process result must report refusal; the host must not forward those bytes. + err := execute(context.Background(), diagnosticModule(), bytes.NewReader(nil), io.Discard, &diagnostic, limits) + if err == nil || diagnostic.Len() != 0 { + t.Fatalf("diagnostic bound: err=%v, forwarded=%d", err, diagnostic.Len()) + } +} + +func TestRuntimeHasNoFilesystemPreopen(t *testing.T) { + module := preopenModule() + limits := heicdecode.DefaultLimits(0) + if err := execute(context.Background(), module, bytes.NewReader(nil), io.Discard, io.Discard, limits); err != nil { + t.Fatalf("filesystem descriptor available to guest: %v", err) + } + // Deliberately give the owned control a temporary directory. Its assertion + // must now trap, demonstrating that it observes a real preopen capability. + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + runtime := wazero.NewRuntimeWithConfig(ctx, runtimeConfig().WithCloseOnContextDone(true)) + defer func() { _ = runtime.Close(context.Background()) }() + if _, err := wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { + t.Fatal(err) + } + config := wazero.NewModuleConfig().WithFSConfig(wazero.NewFSConfig().WithDirMount(t.TempDir(), "/")) + if _, err := runtime.InstantiateWithConfig(ctx, module, config); err == nil { + t.Fatal("owned control did not detect the deliberately installed preopen") + } +} + +// preopenModule traps unless fd_prestat_get(3) returns WASI EBADF (8). +// Literal module layouts keep each capability control independently readable. +// +// noinspection DuplicatedCode +func preopenModule() []byte { + module := []byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0} + section := func(id byte, content []byte) { + module = append(module, id, byte(len(content))) + module = append(module, content...) + } + section(1, []byte{2, 0x60, 0, 0, 0x60, 2, 0x7f, 0x7f, 1, 0x7f}) + imports := append([]byte{1, 22}, []byte("wasi_snapshot_preview1")...) + imports = append(imports, 14) + imports = append(imports, []byte("fd_prestat_get")...) + section(2, append(imports, 0, 1)) + section(3, []byte{1, 0}) + section(5, []byte{1, 1, 1, 1}) + section(7, []byte{2, 6, '_', 's', 't', 'a', 'r', 't', 0, 1, 6, 'm', 'e', 'm', 'o', 'r', 'y', 2, 0}) + body := []byte{0, 0x41, 3, 0x41, 0, 0x10, 0, 0x41, 8, 0x47, 0x04, 0x40, 0, 0x0b, 0x0b} + section(10, append([]byte{1, byte(len(body))}, body...)) + return module +} + +// diagnosticModule retains its literal layout for an independent stream control. +// +// noinspection DuplicatedCode +func diagnosticModule() []byte { + module := []byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0} + section := func(id byte, content []byte) { + module = append(module, id, byte(len(content))) + module = append(module, content...) + } + section(1, []byte{2, 0x60, 0, 0, 0x60, 4, 0x7f, 0x7f, 0x7f, 0x7f, 1, 0x7f}) + imports := append([]byte{1, 22}, []byte("wasi_snapshot_preview1")...) + imports = append(imports, 8) + imports = append(imports, []byte("fd_write")...) + section(2, append(imports, 0, 1)) + section(3, []byte{1, 0}) + section(5, []byte{1, 1, 1, 1}) + section(7, []byte{2, 6, '_', 's', 't', 'a', 'r', 't', 0, 1, 6, 'm', 'e', 'm', 'o', 'r', 'y', 2, 0}) + // fd_write(stderr, iovec at 0, count 1, result at 12); discard errno. + body := []byte{0, 0x41, 2, 0x41, 0, 0x41, 1, 0x41, 12, 0x10, 0, 0x1a, 0x0b} + section(10, append([]byte{1, byte(len(body))}, body...)) + // One iovec points to the two literal bytes following it. + section(11, []byte{1, 0, 0x41, 0, 0x0b, 10, 8, 0, 0, 0, 2, 0, 0, 0, 'o', 'k'}) + return module +} + +// ownedModule builds one function and a one-or-two-page memory from literal +// instructions. It has no imports, image input, or third-party parser code. +func ownedModule(pages byte, body []byte) []byte { + module := []byte{0, 0x61, 0x73, 0x6d, 1, 0, 0, 0, + 1, 4, 1, 0x60, 0, 0, // one () -> () type + 3, 2, 1, 0, // one function + 5, 4, 1, 1, pages, 2, // bounded memory + 7, 10, 1, 6, '_', 's', 't', 'a', 'r', 't', 0, 0, + 10, byte(len(body) + 3), 1, byte(len(body) + 1), 0} + return append(module, body...) +} diff --git a/packaging/heic/macos.Info.plist b/packaging/heic/macos.Info.plist new file mode 100644 index 00000000..9e2cc855 --- /dev/null +++ b/packaging/heic/macos.Info.plist @@ -0,0 +1,16 @@ + + + + + CFBundleIdentifier + io.github.frathe.picfetch.heic-worker + CFBundleExecutable + picfetch-heic-worker + CFBundleName + PicFetch HEIC Worker + CFBundlePackageType + APPL + CFBundleVersion + 1 + + diff --git a/packaging/heic/macos.entitlements.plist b/packaging/heic/macos.entitlements.plist new file mode 100644 index 00000000..e76d714c --- /dev/null +++ b/packaging/heic/macos.entitlements.plist @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + + com.apple.security.cs.allow-unsigned-executable-memory + + + diff --git a/plans/2026-09-15-isolated-heic-restoration.md b/plans/2026-09-15-isolated-heic-restoration.md index c27b75fc..ede93c37 100644 --- a/plans/2026-09-15-isolated-heic-restoration.md +++ b/plans/2026-09-15-isolated-heic-restoration.md @@ -280,3 +280,115 @@ qualification remains required before exposure. All commits/pushes remain permitted; no merge/release. The dedicated macOS research task supplies further primary-source implementation guidance. No alternative runtime migration is selected by this approval. + +## Production continuation task graph + +P1 runtime/helper -> P2 native launch and sandbox -> P3 family admission -> +P4 canonical source integration -> P5 packaging/platform verification. The lead +owns all implementation, review and fixes. Each boundary lands with focused +tests before consumers are changed; platform refusal remains explicit. + +| Task | Files / contract | Required evidence | +| --- | --- | --- | +| P1 | `internal/heicdecode/worker`: fixed embedded WASI artifact, bounded streaming stdin/stdout/stderr, linear memory ceiling and context termination. `cmd/picfetch-heic-worker`: minimal entry point, no Fyne/native codec. Move the artifact into the worker package; maintain provenance. | Owned runtime boundary controls and ordinary fixtures with `go test -tags no_emoji,nodynamic ./internal/heicdecode/worker ./scripts/heicbuild`; import and reproducibility guards. | +| P2 | Native platform launch establishes restrictions before image input; parent verifies helper identity/readiness and owns timeout, pipes and process join. Capability evidence distinguishes actual OS controls from soft native-memory targets. | Native owned file/socket controls plus ordinary decode; absent sandbox and invalid identity fail closed; cancellation joins helper and all pipe work. Cross-builds are recorded separately from native execution. | +| P3 | One app-family admission owner serves GUI and analysis consumers. Acquire before bulk source reads; bounded waiting and cancelled queues; release only after helper/output cleanup. | Concurrent GUI/analysis fixture consumers never exceed one admitted HEIC request; queue cancellation and shutdown join are observable. | +| P4 | Canonical imaging source carries either ordinary encoded bytes or already validated HEIC pixels/metadata, so probe/decode do not retain a second queued HEIC buffer or decode twice. | Display, thumbnail, metadata and similarity focused regressions; ordinary formats unchanged. | +| P5 | Build/package helper identity and notices; truthful per-platform admission and format declarations; native Linux CI and available macOS tests, GoLand inspections. | Package checks, import/provenance guards, native platform tests and full required CI. Missing native evidence is unverified. | + +One additional bounded read-only scout maps source retention and subprocess/UI +lifetime owners across consumers while the lead implements P1. This independent +breadth question needs call-path context beyond a grep; it performs no edits or +review and chooses no architecture. P1-P5 budget: one scout, zero implementation +spawns, one focused review per boundary plus the final gate. The prior whole +worker cap gate above is historical and superseded only for the explicitly +approved macOS limitation. + +Publication: candidate `b64cca35430917cec6e59bd1c26ee4e6c86310b0` is pushed +and GitHub reports its signature valid. The cloud foundation `a3c4d92` is +unsigned. No history rewrite is authorized or performed; the full PR range +requires signing cleanup before merge. + +### P1/P2 continuation evidence (2026-09-16) + +- Fixed artifact moved to the helper-only worker package; native import guard + rejects accidentally linking it into the viewer. The parent owns hash pinning, + bounded waiting/streams, pre-read admission, readiness, process-group teardown + before leader reap, and joined pipe workers. Shared GUI/analysis admission is + still P3; the new Client alone does not satisfy that criterion. +- Owned WASM initial/growth/deadline/diagnostic controls and ordinary decode pass. + Owned parent peers pass changed identity, blocked writer timeout, crash, + diagnostic overflow, active/queued cancellation and Stop/Wait under race. +- Real macOS 27.0 arm64 helper bundle verifies App Sandbox and denied owned + file-read/create/TCP/UDP before input. Ordinary ten-bit decode and cancellation + pass with strict bundle signature verification. Native other-platform startup + still fails closed. Direct no-cgo macOS also fails closed. +- Hardened Runtime without an executable-memory exception refused compiler + decoding. Pinned wazero uses RW -> RX without MAP_JIT; Apple's broader unsigned + executable memory entitlement is needed by this implementation. It is confined + to the helper; no library-validation, DYLD, network or user-file exception. +- Interpreter comparison with unchanged finite bounds: basic 320x240 1.5206 s; + owned valid 4032x3024 gradient reached 30.0093 s and was terminated/joined. + Compiler: 1.6174 s and 7.4040 s respectively. Keep compiler on this evidence, + document increased trusted native executable-memory authority and own-container + rights. These two fixtures are not broad camera qualification. +- Candidate b64cca3 CI failed only on the race-instrumented development + interpreter's 15-second basic/main10 deadline. Fixture ABI tests now use the + production compiler, one test-owned compiled module and the actual 30-second + contract. No production resource bound was increased. Other CI jobs passed. +- The independent macOS research has completed; public App Sandbox supports the + selected bundle route. No new memory-risk approval is needed. User-owned + historical THREAT-MODEL.md in the separate saved checkout is not imported or + edited by this feature work. + +P2's platform continuation uses one further read-only scout to map the pinned +Windows API surface and official launch/job/AppContainer semantics while the +lead completes macOS validation. It writes no code and performs no review or +security testing. This bounded independent breadth survey replaces repeated +cold exploration; all design and fixes stay with the lead. Cumulative scout +count is three including the original source/OS phase; no implementation spawns. + +### Worker publication gate and updated source requirement + +- Focused race tests pass: protocol 1.205 s, client 1.718 s, worker 15.419 s, + guest/build guards 16.506 s, nativeguard tooling 1.236 s. +- `make verify-build` passes formatting, generated assets/notices, exact Qodana + exclusions, source/artifact reproducibility, native import guards, vet and + build. The first restricted run could not write Go's module stat cache; the + same target passed with authorized standard cache access. Full native + Linux/amd64 race and platform CI remain required; no local Docker daemon. +- `make heic-native-macos` passes both required native guards, 46.377 s total. + Missing entitlement refuses before source read; real ten-bit decode, + read/create/TCP/UDP denial, cancellation and owned descendant cleanup pass. + Canonical compressed gradient: compiler 7.1366 s; interpreter terminated and + joined at 30.0108 s under the unchanged 30-second deadline. +- Owned preopen control passes without filesystem access and traps when given + a temporary directory. Temporarily changing group termination to leader-only + makes the descendant test fail at its bounded EOF assertion; exact source + restored and the focused/native suites pass afterward. +- GoLand worktree access is resolved. All 34 changed Go files were inspected, + including weak warnings. Fixed fixture cleanup, ignored errors, nullable test + metadata and redundant types/conversions. Guest-only protocol enum values use + a verified `GoUnusedConst` suppression on that declaration; literal owned + WASM controls use verified function-scoped duplication suppressions and the + existing exact test-file Qodana exclusion. Final re-inspections are clear. +- Qodana run 35024568046's post-suppression SARIF was retrieved and its b64cca3 + revision verified. All seven results were inspected: five corrected issues + and the two separately compiled guest-status false positives above. This is + disposition of the prior commit, not a clean report for the pending commit. +- One read-only evidence-retrieval scout downloaded that report while the lead + inspected/fixed code. Another bounded source inventory now maps historical + local patches; it performs no review, edits or upstream test/fuzz execution. + These two additional independent scouts exceed the prior count explicitly; + all architecture, equivalence assessment and implementation remain with T0. + +The coordinator relayed newer user source instructions: retain the maintained +`third_party/h265` hardening until equivalent upstream checks are verified; +never add native/in-process fallback. Read the historical `PICFETCH.md` in the +separate saved checkout. It records additional coded-work, extent/table, NAL, +frame-retention and transformed-config changes beyond this candidate's source +selection. P0 now reconciles that source and records each patch disposition +before P4/P5 activation; the independently verified P1/P2 worker boundary can +be published while HEIC remains disabled. Do not copy or edit the user's +historical `THREAT-MODEL.md`. No source-equivalence conclusion follows solely +from the newer upstream version or the updated AGENTS wording. diff --git a/qodana.yaml b/qodana.yaml index 0d81d97c..7c9a86d4 100644 --- a/qodana.yaml +++ b/qodana.yaml @@ -131,10 +131,15 @@ exclude: - "internal/hdbscan/hdbscan_test.go" - "internal/hdbscan/labels_test.go" - "internal/hdbscan/sets_test.go" + - "internal/heicdecode/client/client_test.go" + - "internal/heicdecode/client/native_darwin_test.go" + - "internal/heicdecode/client/process_unix_test.go" - "internal/heicdecode/metadata_test.go" - "internal/heicdecode/protocol_test.go" + - "internal/heicdecode/ready_test.go" - "internal/heicdecode/request_test.go" - "internal/heicdecode/response_test.go" + - "internal/heicdecode/worker/runtime_test.go" - "internal/imaging/avif_policy_test.go" - "internal/imaging/bytecache_test.go" - "internal/imaging/dhash_test.go" diff --git a/scripts/heicbuild/fixture.go b/scripts/heicbuild/fixture.go index 40543c40..2c959856 100644 --- a/scripts/heicbuild/fixture.go +++ b/scripts/heicbuild/fixture.go @@ -2,10 +2,12 @@ package main import ( "bytes" + "compress/gzip" "context" "errors" "os" "path/filepath" + "strings" "time" "github.com/tetratelabs/wazero" @@ -15,38 +17,62 @@ import ( // generateFixture runs only the fixed-input fixture generator. It accepts no // image path or input data. It cannot be used as an unrestricted decoder helper. func generateFixture(root string) error { + return generateFixedFixture(root, "./fixturegen", "tenbit.heic", 128*1024*1024, 64*1024, 15*time.Second, wazero.NewRuntimeConfigInterpreter()) +} + +func generatePhotoFixture(root string) error { + return generateFixedFixture(root, "./fixturephoto", "photo-gradient.heic.gz", 1024*1024*1024, 64*1024*1024, 30*time.Second, wazero.NewRuntimeConfigCompiler()) +} + +func generateFixedFixture(root, source, target string, memory, outputBytes int64, timeout time.Duration, config wazero.RuntimeConfig) error { dir, err := os.MkdirTemp("", "picfetch-heic-fixture-") if err != nil { return err } defer func() { _ = os.RemoveAll(dir) }() artifact := filepath.Join(dir, "fixture.wasm") - if _, err = goCommand(root, true, "build", "-mod=readonly", "-tags=noasm", "-trimpath", "-buildvcs=false", "-ldflags=-s -w -buildid=", "-o", artifact, "./fixturegen"); err != nil { + if _, err = goCommand(root, true, "build", "-mod=readonly", "-tags=noasm", "-trimpath", "-buildvcs=false", "-ldflags=-s -w -buildid=", "-o", artifact, source); err != nil { return err } wasm, err := os.ReadFile(artifact) if err != nil { return err } - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - runtime := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigInterpreter().WithMemoryLimitPages(2048).WithCloseOnContextDone(true)) + runtime := wazero.NewRuntimeWithConfig(ctx, config.WithMemoryLimitPages(uint32(memory/(64*1024))).WithCloseOnContextDone(true)) defer func() { _ = runtime.Close(context.Background()) }() if _, err = wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { return err } - output := &fixtureOutput{} + output := &fixtureOutput{limit: outputBytes} if _, err = runtime.InstantiateWithConfig(ctx, wasm, wazero.NewModuleConfig().WithStdout(output)); err != nil { return err } - return os.WriteFile(filepath.Join(root, "scripts/heicbuild/testdata/tenbit.heic"), output.Bytes(), 0644) + data := output.Bytes() + if strings.HasSuffix(target, ".gz") { + var compressed bytes.Buffer + writer := gzip.NewWriter(&compressed) + if _, err = writer.Write(data); err != nil { + _ = writer.Close() + return err + } + if err = writer.Close(); err != nil { + return err + } + data = compressed.Bytes() + } + return os.WriteFile(filepath.Join(root, "scripts/heicbuild/testdata", target), data, 0644) } -type fixtureOutput struct{ bytes.Buffer } +type fixtureOutput struct { + bytes.Buffer + limit int64 +} func (w *fixtureOutput) Write(p []byte) (int, error) { - if len(p) > 64*1024-w.Len() { - return 0, errors.New("fixed fixture exceeded 64 KiB output") + if int64(len(p)) > w.limit-int64(w.Len()) { + return 0, errors.New("fixed fixture exceeded output limit") } return w.Buffer.Write(p) } diff --git a/scripts/heicbuild/guest_test.go b/scripts/heicbuild/guest_test.go index 1ba9e417..1d49c37f 100644 --- a/scripts/heicbuild/guest_test.go +++ b/scripts/heicbuild/guest_test.go @@ -8,7 +8,6 @@ import ( "os" "path/filepath" "testing" - "time" "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1" @@ -19,10 +18,24 @@ import ( // Only unchanged licensed small ordinary fixtures enter the development guest. // This proves the guest ABI, not native helper resource or sandbox enforcement. func TestWASIGuestOrdinaryFixtures(t *testing.T) { - wasm, err := os.ReadFile(filepath.Join("..", "heicguest", "decoder.wasm")) + wasm, err := os.ReadFile(filepath.Join("..", "..", "internal", "heicdecode", "worker", "decoder.wasm")) if err != nil { t.Fatal(err) } + // Compile the fixed artifact once for ABI checks. Native helper tests + // separately cover the real cold-start deadline for every disposable job. + ctx, cancel := context.WithTimeout(context.Background(), heicdecode.DefaultLimits(0).Timeout) + defer cancel() + runtime := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigCompiler().WithMemoryLimitPages(2048).WithCloseOnContextDone(true)) + defer func() { _ = runtime.Close(context.Background()) }() + if _, err = wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { + t.Fatal(err) + } + compiled, err := runtime.CompileModule(ctx, wasm) + if err != nil { + t.Fatal(err) + } + defer func() { _ = compiled.Close(context.Background()) }() for _, tt := range []struct { name string sixteen, alpha bool @@ -34,7 +47,7 @@ func TestWASIGuestOrdinaryFixtures(t *testing.T) { if err != nil { t.Fatal(err) } - result := runGuest(t, wasm, input, heicdecode.Decode) + result := runGuest(t, runtime, compiled, input, heicdecode.Decode) if result.Image == nil || result.Image.Bounds().Empty() { t.Fatal("missing decoded image") } @@ -58,40 +71,30 @@ func TestWASIGuestOrdinaryFixtures(t *testing.T) { t.Fatal("alpha was flattened") } } - config := runGuest(t, wasm, input, heicdecode.DecodeConfig) + config := runGuest(t, runtime, compiled, input, heicdecode.DecodeConfig) if config.Image != nil || config.Config.Width != result.Image.Bounds().Dx() || config.Config.Height != result.Image.Bounds().Dy() { t.Fatal("config differs from displayed dimensions") } - _ = runGuest(t, wasm, input, heicdecode.DecodeExif) + _ = runGuest(t, runtime, compiled, input, heicdecode.DecodeExif) }) } } -func runGuest(t *testing.T, wasm, input []byte, op heicdecode.Operation) heicdecode.Response { +func runGuest(t *testing.T, runtime wazero.Runtime, compiled wazero.CompiledModule, input []byte, op heicdecode.Operation) heicdecode.Response { t.Helper() - ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) - defer cancel() limits := heicdecode.DefaultLimits(1024 * 1024) + ctx, cancel := context.WithTimeout(context.Background(), limits.Timeout) + defer cancel() limits.MaxPixels = 1024 * 1024 limits.MaxOutputBytes = 8 * 1024 * 1024 var request bytes.Buffer if err := heicdecode.WriteRequest(&request, heicdecode.Request{Operation: op, Input: input}, limits); err != nil { t.Fatal(err) } - // Interpreter avoids executable JIT memory; WASI has no preopens, environment, - // real clock, random source, or sockets. The 128 MiB cap is linear memory only. - runtime := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigInterpreter().WithMemoryLimitPages(2048).WithCloseOnContextDone(true)) - defer func() { - if err := runtime.Close(context.Background()); err != nil { - t.Error(err) - } - }() - if _, err := wasi_snapshot_preview1.Instantiate(ctx, runtime); err != nil { - t.Fatal(err) - } + // No preopens, environment, real clock, random source, or socket handles. output := &boundedOutput{limit: int(limits.MaxOutputBytes) + int(limits.MaxMetadataBytes) + 4096} config := wazero.NewModuleConfig().WithStdin(&request).WithStdout(output).WithStderr(&boundedOutput{limit: 4096}) - if _, err := runtime.InstantiateWithConfig(ctx, wasm, config); err != nil { + if _, err := runtime.InstantiateModule(ctx, compiled, config); err != nil { t.Fatal(err) } result, err := heicdecode.ReadResponse(bytes.NewReader(output.Bytes()), op, limits) diff --git a/scripts/heicbuild/main.go b/scripts/heicbuild/main.go index 23eaebda..2bc82418 100644 --- a/scripts/heicbuild/main.go +++ b/scripts/heicbuild/main.go @@ -29,7 +29,7 @@ const ( decoderZipSHA = "2838bcb83b8da357a19788ad5d8a9d55c16bd4a12961fa81e3ab282974f1ed7a" compilerVersion = "go1.27.1" guestDir = "scripts/heicguest" - guestArtifact = guestDir + "/decoder.wasm" + guestArtifact = "internal/heicdecode/worker/decoder.wasm" manifestPath = guestDir + "/decoder.json" ) @@ -41,11 +41,11 @@ type manifest struct { func main() { if len(os.Args) != 2 { - fmt.Fprintln(os.Stderr, "usage: heicbuild build|check|imports|fixture") + _, _ = fmt.Fprintln(os.Stderr, "usage: heicbuild build|check|imports|fixture|photo-fixture") os.Exit(2) } if err := run(os.Args[1]); err != nil { - fmt.Fprintln(os.Stderr, err) + _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } } @@ -58,7 +58,7 @@ func run(mode string) error { if mode == "imports" { return checkImports(root) } - if mode != "build" && mode != "check" && mode != "fixture" { + if mode != "build" && mode != "check" && mode != "fixture" && mode != "photo-fixture" { return errors.New("unknown heicbuild mode") } if err = verifySource(root); err != nil { @@ -67,6 +67,9 @@ func run(mode string) error { if mode == "fixture" { return generateFixture(root) } + if mode == "photo-fixture" { + return generatePhotoFixture(root) + } files, err := buildInputs(root) if err != nil { return err @@ -223,6 +226,11 @@ func buildInputs(root string) ([]string, error) { return err } if d.IsDir() { + // The native host is outside the guest's compiled dependency graph. + // Its embedded artifact is inventoried explicitly below. + if dir == "internal/heicdecode" && path != filepath.Join(root, dir) { + return filepath.SkipDir + } return nil } name := filepath.ToSlash(strings.TrimPrefix(path, root+string(filepath.Separator))) @@ -306,6 +314,9 @@ func checkNativeSources(root string) error { if forbiddenImport(imported) { return fmt.Errorf("forbidden native codec import %s in %s", imported, rel) } + if imported == "github.com/frathe/picfetch/internal/heicdecode/worker" && rel != "cmd/picfetch-heic-worker/main.go" { + return fmt.Errorf("embedded HEIC runtime is helper-only: %s", rel) + } } return nil }) diff --git a/scripts/heicbuild/main_test.go b/scripts/heicbuild/main_test.go index 2745e3ec..bafe5238 100644 --- a/scripts/heicbuild/main_test.go +++ b/scripts/heicbuild/main_test.go @@ -42,3 +42,14 @@ func TestImportGuardRejectsNativeCodec(t *testing.T) { t.Fatal(err) } } + +func TestImportGuardKeepsGuestRuntimeOutOfViewer(t *testing.T) { + root := t.TempDir() + file := filepath.Join(root, "viewer.go") + if err := os.WriteFile(file, []byte("package sample\nimport _ \"github.com/frathe/picfetch/internal/heicdecode/worker\"\n"), 0600); err != nil { + t.Fatal(err) + } + if err := checkNativeSources(root); err == nil { + t.Fatal("viewer imported the embedded guest runtime") + } +} diff --git a/scripts/heicbuild/testdata/README.md b/scripts/heicbuild/testdata/README.md index 6426b3c0..dfa9f195 100644 --- a/scripts/heicbuild/testdata/README.md +++ b/scripts/heicbuild/testdata/README.md @@ -16,6 +16,15 @@ linear memory, 64 KiB output, and 15 seconds. It is a test-asset tool, not an application encoder. The generator and generated fixture use PicFetch's MIT license. Generation uses unmodified h265 v0.2.3, with its MIT notice retained. +`photo-gradient.heic.gz` contains one PicFetch-owned ordinary 4032x3024 color +gradient, encoded as eight-bit 4:2:0 lossless HEIC by `fixturephoto` inside WASI. +Reproduce with `make heic-photo-fixture` (30 s, 1 GiB guest memory, 64 MiB output). +The gzip wrapper only reduces repository size; native qualification decompresses +it through a byte limit after admission. The 18,384,780 decoded file bytes have +SHA-256 `f3600151fccf6a016fc870a4faaf051480aa12f53bc1e9083c0c1c092a7b955f`. +This is a throughput fixture, not a claim of camera/color/HDR compatibility. +It has the same PicFetch MIT/upstream encoder notice obligations above. + The tests cover successful byte transport, nonempty pixels, alpha retention, NRGBA64 output for the explicit ten-bit fixture, and matching transformed config/decode dimensions. They do not establish colorimetric fidelity, broad diff --git a/scripts/heicbuild/testdata/photo-gradient.heic.gz b/scripts/heicbuild/testdata/photo-gradient.heic.gz new file mode 100644 index 0000000000000000000000000000000000000000..e5bb99274c291b8c7f62bd909704b8496afa0b06 GIT binary patch literal 850679 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�C0w4-FI$VW~2yTOx@A~!YOWZ;9&BSFU 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�5PuE$DhiCBV*VQm)W89Dh6O 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

      Mdevi2o;6o3w=7OaEzjs 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 z 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⋙Ty&NNe)c_O_CYXv| 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%0ApxgBQ&Jj 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