From db5f3791c51b8a73960bcd7610152e8770ac577e Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 12 Sep 2026 16:48:59 +0200 Subject: [PATCH 01/55] Enable automatic clipboard yanks with the remote provider --- pkgbuilds/omarchy-nvim/PKGBUILD | 2 +- pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pkgbuilds/omarchy-nvim/PKGBUILD b/pkgbuilds/omarchy-nvim/PKGBUILD index d8f6414..e08f8e5 100644 --- a/pkgbuilds/omarchy-nvim/PKGBUILD +++ b/pkgbuilds/omarchy-nvim/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: Ryan Hughes pkgname=omarchy-nvim pkgver=2026.8.13 -pkgrel=1 +pkgrel=2 pkgdesc="Pre-built LazyVim configuration with cached plugins" arch=('any') url="https://github.com/LazyVim/LazyVim" diff --git a/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua b/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua index b54c54e..5f3248a 100644 --- a/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua +++ b/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua @@ -88,6 +88,9 @@ function M.setup() end end + -- LazyVim disables clipboard syncing over SSH; our provider supports it. + vim.opt.clipboard = "unnamedplus" + vim.g.clipboard = { name = "OmarchyRemoteClipboard", copy = { ["+"] = copy("+"), ["*"] = copy("*") }, From c095aa4ccc84e417e0b29cb4c50181a0c6600740 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 13 Sep 2026 17:46:10 +0200 Subject: [PATCH 02/55] Keep remote clipboard paste fast and cover provider transports --- .../lua/config/remote_clipboard.lua | 66 +++++++--- tests/neovim-remote-clipboard.lua | 123 ++++++++++++++++++ tests/neovim-remote-clipboard.sh | 7 + 3 files changed, 177 insertions(+), 19 deletions(-) create mode 100644 tests/neovim-remote-clipboard.lua create mode 100755 tests/neovim-remote-clipboard.sh diff --git a/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua b/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua index 5f3248a..d35d109 100644 --- a/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua +++ b/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua @@ -1,9 +1,8 @@ --- Clipboard for sessions whose yanks may need to reach another machine: --- every copy is emitted as OSC 52 (inside tmux this becomes a tmux buffer, --- rebroadcast to every attached client, local or SSH). Paste prefers the --- local Wayland clipboard when one is available, so content copied in other --- apps remains pasteable; without a display, paste is an OSC 52 query that --- tmux (or the terminal) answers. +-- Copies reach the local Wayland clipboard and attached terminals. Reads use +-- Wayland or tmux's buffer, falling back to this Neovim's last copy. Never query +-- the terminal with OSC 52: support for writes does not imply permission to read, +-- and an unanswered query blocks ordinary paste for ten seconds. To insert new +-- text from the host when no readable clipboard exists, use terminal paste. local M = {} local function proc_lines(pid, file) @@ -54,10 +53,15 @@ function M.setup() and vim.fn.executable("wl-copy") == 1 and vim.fn.executable("wl-paste") == 1 + local has_tmux = in_tmux and vim.fn.executable("tmux") == 1 + local last_copy = {} + local function copy(register) local emit = osc52.copy(register) - return function(lines) + return function(lines, regtype) + last_copy[register] = { vim.deepcopy(lines), regtype } + if has_wayland then local cmd = { "wl-copy", "--sensitive", "--type", "text/plain" } if register == "*" then @@ -67,36 +71,60 @@ function M.setup() end if vim.g.omarchy_remote_clipboard_osc52 ~= false then + if has_tmux and register == "+" then + -- Let tmux emit OSC 52, avoiding its input parser's payload size limit. + vim.fn.system({ "tmux", "load-buffer", "-w", "-" }, lines) + if vim.v.shell_error == 0 then + return + end + end emit(lines) end end end local function paste(register) - if not has_wayland then - return osc52.paste(register) - end - return function() - local cmd = { "wl-paste", "--no-newline" } - if register == "*" then - cmd[#cmd + 1] = "--primary" + local cmd + -- tmux's buffer is shared between Neovim instances in the session. Over + -- SSH, prefer it to the remote machine's unrelated graphical clipboard. + if has_tmux and register == "+" and (in_ssh or not has_wayland) + and vim.g.omarchy_remote_clipboard_osc52 ~= false then + cmd = { "tmux", "save-buffer", "-" } + elseif has_wayland then + cmd = { "wl-paste", "--no-newline" } + if register == "*" then + cmd[#cmd + 1] = "--primary" + end end - local lines = vim.fn.systemlist(cmd, "", 1) - return vim.v.shell_error == 0 and lines or {} + if cmd then + local lines = vim.fn.systemlist(cmd, "", 1) + if vim.v.shell_error == 0 then + -- An empty clipboard is valid; only failed reads use the fallback. + if last_copy[register] and vim.deep_equal(lines, last_copy[register][1]) then + return vim.deepcopy(last_copy[register]) + end + return lines + end + end + + return vim.deepcopy(last_copy[register] or { {}, "v" }) end end - -- LazyVim disables clipboard syncing over SSH; our provider supports it. - vim.opt.clipboard = "unnamedplus" - vim.g.clipboard = { name = "OmarchyRemoteClipboard", copy = { ["+"] = copy("+"), ["*"] = copy("*") }, paste = { ["+"] = paste("+"), ["*"] = paste("*") }, cache_enabled = 0, } + + -- LazyVim clears this over SSH. Users can opt out before setup or override + -- the option afterward in config/options.lua. + if vim.g.omarchy_remote_clipboard_sync ~= false then + vim.opt.clipboard:append("unnamedplus") + end end return M diff --git a/tests/neovim-remote-clipboard.lua b/tests/neovim-remote-clipboard.lua new file mode 100644 index 0000000..165ea45 --- /dev/null +++ b/tests/neovim-remote-clipboard.lua @@ -0,0 +1,123 @@ +local provider = assert(vim.env.TEST_PROVIDER) +local real_system, real_systemlist = vim.fn.system, vim.fn.systemlist +local real_executable, real_readfile = vim.fn.executable, vim.fn.readfile +local writes, reads, emitted, read_result, failed, write_failed + +local function setup(env, options) + for _, key in ipairs({ "SSH_CONNECTION", "SSH_TTY", "TMUX", "HERDR_PANE_ID", "WAYLAND_DISPLAY" }) do + vim.env[key] = nil + end + for key, value in pairs(env) do vim.env[key] = value end + vim.g.clipboard = nil + vim.g.omarchy_remote_clipboard_sync = options and options.sync + vim.g.omarchy_remote_clipboard_osc52 = options and options.osc52 + vim.opt.clipboard = options and options.clipboard or "" + writes, reads, emitted = {}, {}, {} + read_result, failed, write_failed = nil, false, false + vim.fn.readfile = function(path, ...) + if path:match("^/proc/") then return {} end + return real_readfile(path, ...) + end + vim.fn.executable = function(cmd) + if cmd == "tmux" or cmd == "wl-copy" or cmd == "wl-paste" then return 1 end + return real_executable(cmd) + end + vim.fn.system = function(cmd, lines) + writes[#writes + 1] = { cmd, vim.deepcopy(lines) } + real_system({ "sh", "-c", write_failed and "exit 1" or "exit 0" }) + return "" + end + vim.fn.systemlist = function(cmd) + reads[#reads + 1] = cmd + real_system({ "sh", "-c", failed and "exit 1" or "exit 0" }) + return vim.deepcopy(read_result or {}) + end + vim.api.nvim_ui_send = function(data) emitted[#emitted + 1] = data end + -- A clipboard read must never reach Neovim's synchronous OSC 52 query. + require("vim.ui.clipboard.osc52").paste = function() error("OSC 52 read attempted") end + dofile(provider).setup() + vim.cmd("unlet! g:loaded_clipboard_provider") + vim.cmd("runtime autoload/provider/clipboard.vim") +end + +local function equal(actual, expected) + assert(vim.deep_equal(actual, expected), vim.inspect(actual) .. " != " .. vim.inspect(expected)) +end +local function put_yank() + vim.api.nvim_buf_set_lines(0, 0, -1, false, { "probe" }) + vim.cmd("normal! gg0yy") + -- Unnamed clipboard writes are deferred until the command loop returns. + vim.cmd("redraw") + local start = vim.uv.hrtime() + vim.cmd("normal! p") + assert((vim.uv.hrtime() - start) / 1e6 < 1000, "paste blocked") + equal(vim.api.nvim_buf_get_lines(0, 0, -1, false), { "probe", "probe" }) +end + +setup({}) +assert(vim.g.clipboard == nil and vim.o.clipboard == "", "local config changed") +for _, env in ipairs({ { SSH_CONNECTION = "test" }, { SSH_TTY = "test" }, { HERDR_PANE_ID = "test" } }) do + setup(env) + assert(vim.o.clipboard == "unnamedplus") + put_yank() + assert(#emitted > 0 and emitted[1]:find("\27]52;c;", 1, true)) + assert(#reads == 0) + equal(vim.g.clipboard.paste["*"](), { {}, "v" }) + for _, regtype in ipairs({ "v", "V", "\22" .. "3" }) do + vim.g.clipboard.copy["*"]({ "abc" }, regtype) + equal(vim.g.clipboard.paste["*"](), { { "abc" }, regtype }) + end +end +print("ok - local, SSH, SSH_TTY and Herdr setup; real yy/p; no OSC 52 reads; register types") + +setup({ SSH_CONNECTION = "test" }, { sync = false, clipboard = "unnamed" }) +assert(vim.o.clipboard == "unnamed") +setup({ SSH_CONNECTION = "test" }, { clipboard = "unnamed" }) +assert(vim.o.clipboard:find("unnamedplus", 1, true) and vim.o.clipboard:find("unnamed,", 1, true)) +vim.opt.clipboard = "" +assert(vim.o.clipboard == "", "user override must win") +setup({ SSH_CONNECTION = "test" }, { osc52 = false }) +put_yank() +assert(#emitted == 0) +print("ok - sync and OSC 52 opt-outs; existing clipboard flags and subsequent overrides") + +setup({ SSH_CONNECTION = "test", TMUX = "test" }) +local large = { string.rep("x", 1024 * 1024 + 1) } +vim.g.clipboard.copy["+"](large, "v") +equal(writes[1], { { "tmux", "load-buffer", "-w", "-" }, large }) +assert(#emitted == 0) +read_result = { "external buffer" } +equal(vim.g.clipboard.paste["+"](), read_result) +equal(reads[1], { "tmux", "save-buffer", "-" }) +failed = true +equal(vim.g.clipboard.paste["+"](), { large, "v" }) +write_failed = true +vim.g.clipboard.copy["+"]({ "retry" }, "v") +assert(#emitted == 1) +print("ok - tmux large yanks, shared buffer reads, failed read and write fallbacks") + +setup({ TMUX = "test" }, { osc52 = false }) +put_yank() +assert(#writes == 0 and #reads == 0 and #emitted == 0) +setup({ TMUX = "test" }) +failed = true +put_yank() +print("ok - tmux-only yanks and paste; opt-out does not read a stale tmux buffer") + +setup({ HERDR_PANE_ID = "test", WAYLAND_DISPLAY = "test" }) +vim.g.clipboard.copy["*"]({ "primary" }, "v") +equal(writes[1][1], { "wl-copy", "--sensitive", "--type", "text/plain", "--primary" }) +read_result = { "from another app" } +equal(vim.g.clipboard.paste["*"](), read_result) +equal(reads[1], { "wl-paste", "--no-newline", "--primary" }) +read_result = {} +equal(vim.g.clipboard.paste["*"](), {}) +failed = true +equal(vim.g.clipboard.paste["*"](), { { "primary" }, "v" }) +setup({ SSH_CONNECTION = "test", WAYLAND_DISPLAY = "test", TMUX = "test" }) +vim.g.clipboard.copy["+"]({ "both" }, "v") +assert(#writes == 2) +read_result = { "both" } +equal(vim.g.clipboard.paste["+"](), { { "both" }, "v" }) +equal(reads[1], { "tmux", "save-buffer", "-" }) +print("ok - Wayland primary, external, empty and failed reads; SSH prefers tmux") diff --git a/tests/neovim-remote-clipboard.sh b/tests/neovim-remote-clipboard.sh new file mode 100755 index 0000000..50e089a --- /dev/null +++ b/tests/neovim-remote-clipboard.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -euo pipefail +root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd) +export TEST_PROVIDER="$root/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua" +export NVIM_LOG_FILE=$(mktemp) +trap 'rm -f "$NVIM_LOG_FILE"' EXIT +nvim --clean -n --headless -i NONE -l "$root/tests/neovim-remote-clipboard.lua" From 3bfc327f8f94809558104584aebe5c2e3b6828c0 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 13 Sep 2026 17:49:36 +0200 Subject: [PATCH 03/55] Run Neovim clipboard regression tests in CI --- .github/workflows/test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3d0a68e..bb8d248 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,9 +39,10 @@ jobs: -w /workspace \ archlinux:base-devel bash -lc ' set -euo pipefail - pacman -Syu --noconfirm git jq + pacman -Syu --noconfirm git jq neovim ./bin/sync-upstream self-test ./bin/sync-rebuilds --self-test ./bin/omarchy-pkgs self-test ./bin/omarchy-release self-test + ./tests/neovim-remote-clipboard.sh ' From 0022e278c6041f7455c320b22c3bcc93acf4fe86 Mon Sep 17 00:00:00 2001 From: Ryan Hughes Date: Sun, 13 Sep 2026 19:48:41 -0400 Subject: [PATCH 04/55] Respect tmux clipboard policy and preserve empty reads --- .github/workflows/test.yml | 3 +- .../lua/config/remote_clipboard.lua | 34 +++- tests/neovim-clipboard-tmux.py | 148 ++++++++++++++++++ tests/neovim-remote-clipboard.lua | 12 +- 4 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 tests/neovim-clipboard-tmux.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bb8d248..a84333d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,10 +39,11 @@ jobs: -w /workspace \ archlinux:base-devel bash -lc ' set -euo pipefail - pacman -Syu --noconfirm git jq neovim + pacman -Syu --noconfirm git jq neovim tmux python ./bin/sync-upstream self-test ./bin/sync-rebuilds --self-test ./bin/omarchy-pkgs self-test ./bin/omarchy-release self-test ./tests/neovim-remote-clipboard.sh + python tests/neovim-clipboard-tmux.py ' diff --git a/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua b/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua index d35d109..f287de6 100644 --- a/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua +++ b/pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua @@ -56,6 +56,11 @@ function M.setup() local has_tmux = in_tmux and vim.fn.executable("tmux") == 1 local last_copy = {} + local function tmux_export_enabled() + local setting = vim.fn.systemlist({ "tmux", "show-options", "-sv", "set-clipboard" }) + return vim.v.shell_error == 0 and (setting[1] == "on" or setting[1] == "external") + end + local function copy(register) local emit = osc52.copy(register) @@ -72,8 +77,21 @@ function M.setup() if vim.g.omarchy_remote_clipboard_osc52 ~= false then if has_tmux and register == "+" then + -- tmux ignores zero-byte loads. Record the current buffer's identity + -- instead: all Neovim instances see empty until a new buffer arrives, + -- without deleting the user's shared tmux clipboard history. + if #lines == 0 or (#lines == 1 and lines[1] == "") then + vim.fn.system({ "tmux", "set-option", "-sF", "@omarchy-nvim-cleared-buffer", "#{buffer_name}" }) + return + end -- Let tmux emit OSC 52, avoiding its input parser's payload size limit. - vim.fn.system({ "tmux", "load-buffer", "-w", "-" }, lines) + -- Explicit -w bypasses set-clipboard, so honor the user's policy first. + local cmd = { "tmux", "load-buffer" } + if tmux_export_enabled() then + cmd[#cmd + 1] = "-w" + end + cmd[#cmd + 1] = "-" + vim.fn.system(cmd, lines) if vim.v.shell_error == 0 then return end @@ -86,11 +104,21 @@ function M.setup() local function paste(register) return function() local cmd - -- tmux's buffer is shared between Neovim instances in the session. Over + -- tmux's buffer is shared between Neovim instances on the server. Over -- SSH, prefer it to the remote machine's unrelated graphical clipboard. if has_tmux and register == "+" and (in_ssh or not has_wayland) and vim.g.omarchy_remote_clipboard_osc52 ~= false then - cmd = { "tmux", "save-buffer", "-" } + local buffers = vim.fn.systemlist({ "tmux", "display-message", "-p", + "#{buffer_name}\n#{@omarchy-nvim-cleared-buffer}" }) + if vim.v.shell_error ~= 0 then + return vim.deepcopy(last_copy[register] or { {}, "v" }) + end + if not buffers[1] or buffers[1] == "" or buffers[1] == buffers[2] then + return { {}, "v" } + end + -- Pin the buffer selected above: a concurrent copy must not change + -- which payload we read after checking its identity against the marker. + cmd = { "tmux", "save-buffer", "-b", buffers[1], "-" } elseif has_wayland then cmd = { "wl-paste", "--no-newline" } if register == "*" then diff --git a/tests/neovim-clipboard-tmux.py b/tests/neovim-clipboard-tmux.py new file mode 100644 index 0000000..6dd7220 --- /dev/null +++ b/tests/neovim-clipboard-tmux.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +"""Exercise the provider against real, isolated tmux buffers and fake terminals.""" +import base64 +import fcntl +import json +import os +from pathlib import Path +import pty +import select +import struct +import subprocess +import tempfile +import termios +import time + +ROOT = Path(__file__).resolve().parents[1] +PROVIDER = ROOT / "pkgbuilds/omarchy-nvim/lua/config/remote_clipboard.lua" + + +def drain(fd, seconds=0.1): + data = b"" + deadline = time.monotonic() + seconds + while time.monotonic() < deadline: + if select.select([fd], [], [], max(0, deadline - time.monotonic()))[0]: + try: + data += os.read(fd, 65536) + except OSError: + break + return data + + +with tempfile.TemporaryDirectory(prefix="nvim-tmux-test-") as directory: + root = Path(directory) + command = ["tmux", "-S", str(root / "socket"), "-f", "/dev/null"] + clients = [] + + def tmux(*args): + return subprocess.check_output(command + list(args), text=True) + + driver = root / "driver.lua" + driver.write_text(r''' +local request = vim.json.decode(table.concat(vim.fn.readfile(vim.env.TEST_REQUEST), "\n")) +dofile(vim.env.TEST_PROVIDER).setup() +if request.operation == "copy" then + vim.fn.setreg("+", request.lines, request.regtype or "v") +else + local value = vim.g.clipboard.paste["+"]() + local lines = type(value[1]) == "table" and value[1] or value + io.write(vim.json.encode(lines)) +end +''') + + def nvim(operation, lines=None, regtype="v"): + request = root / "request.json" + request.write_text(json.dumps(dict(operation=operation, lines=lines, regtype=regtype))) + env = dict(os.environ) + for key in ("WAYLAND_DISPLAY", "DISPLAY", "HERDR_PANE_ID", "SSH_TTY"): + env.pop(key, None) + env.update( + TMUX=tmux("display-message", "-p", "#{socket_path},#{pid},0").strip(), + TMUX_PANE=tmux("display-message", "-p", "-t", "A:0.0", "#{pane_id}").strip(), + SSH_CONNECTION="test", TEST_PROVIDER=str(PROVIDER), + TEST_REQUEST=str(request), + ) + result = subprocess.run( + ["nvim", "--clean", "-n", "--headless", "-i", "NONE", "-l", str(driver)], + env=env, cwd=root, capture_output=True, text=True, timeout=15, + ) + assert result.returncode == 0, result.stderr + if operation == "paste": + return json.loads(result.stdout) + + try: + tmux("new-session", "-d", "-s", "A") + tmux("new-session", "-d", "-s", "B") + tmux("set-option", "-s", "terminal-features", "xterm*:clipboard") + tmux("set-option", "-g", "set-clipboard", "off") + # Every nvim() call is a separate instance: clearing must be shared. + nvim("copy", [""]) + assert nvim("paste") == [], "empty server clipboard did not stay empty" + tmux("set-buffer", "older history") + nvim("copy", ["private previous value"]) + assert nvim("paste") == ["private previous value"] + history = tmux("list-buffers") + for _ in range(2): + nvim("copy", [""]) + assert nvim("paste") == [], "clear returned stale clipboard text" + assert tmux("list-buffers") == history, "clear destroyed tmux history" + tmux("set-buffer", "external copy") + assert nvim("paste") == ["external copy"], "new copy did not supersede clear" + nvim("copy", [""]) + nvim("copy", ["new Neovim copy"]) + assert nvim("paste") == ["new Neovim copy"] + print("ok - shared empty clipboard, preserved history, and subsequent copies") + + for lines, regtype in [(["line"], "V"), (["a", "b"], "v"), + (["x" * (1024 * 1024 + 1)], "v"), + (["$(touch NEVER) `id`; quotes ' \"", "λ\u001b\n"], "v")]: + nvim("copy", lines, regtype) + # Neovim represents embedded NUL bytes as newline inside a list item. + expected = list(lines) + if regtype == "V": + expected.append("") + actual = nvim("paste") + assert actual == expected, ("transport changed clipboard bytes", repr(actual)[:200], repr(expected)[:200]) + assert not (root / "NEVER").exists(), "clipboard content executed as shell code" + print("ok - real transport: linewise, multiline, large and literal/control payloads") + + # Attach three PTYs, never the developer's terminal or clipboard. + for session in ("A", "A", "B"): + master, slave = pty.openpty() + fcntl.ioctl(slave, termios.TIOCSWINSZ, struct.pack("HHHH", 24, 80, 0, 0)) + + def controlling_tty(): + os.setsid() + fcntl.ioctl(0, termios.TIOCSCTTY, 0) + + env = dict(os.environ, TERM="xterm-256color") + env.pop("TMUX", None) + env.pop("TMUX_PANE", None) + process = subprocess.Popen( + command + ["attach-session", "-t", session], stdin=slave, + stdout=slave, stderr=slave, env=env, preexec_fn=controlling_tty, + ) + os.close(slave) + clients.append((master, process)) + drain(master) + for policy in ("off", "on", "external", "off"): + tmux("set-option", "-s", "set-clipboard", policy) + for fd, _ in clients: + drain(fd) + payload = "synthetic-export-" + policy + nvim("copy", [payload]) + outputs = [drain(fd, 0.3) for fd, _ in clients] + exports = [b"\x1b]52;" in output for output in outputs] + assert not exports[2], "clipboard escaped into an unrelated session" + if policy == "off": + assert not any(exports), "set-clipboard off leaked OSC 52" + else: + assert sum(exports[:2]) == 1, "expected one selected tmux client" + assert any(base64.b64encode(payload.encode()) in output for output in outputs[:2]) + assert nvim("paste") == [payload], "export policy broke internal paste" + print("ok - real clients: export policy, policy changes, selected-client isolation") + finally: + subprocess.run(command + ["kill-server"], capture_output=True) + for fd, process in clients: + process.wait(timeout=5) + os.close(fd) diff --git a/tests/neovim-remote-clipboard.lua b/tests/neovim-remote-clipboard.lua index 165ea45..478d445 100644 --- a/tests/neovim-remote-clipboard.lua +++ b/tests/neovim-remote-clipboard.lua @@ -28,6 +28,14 @@ local function setup(env, options) return "" end vim.fn.systemlist = function(cmd) + if cmd[2] == "show-options" then + real_system({ "sh", "-c", "exit 0" }) + return { "on" } + end + if cmd[2] == "display-message" then + real_system({ "sh", "-c", failed and "exit 1" or "exit 0" }) + return { "buffer-test", "" } + end reads[#reads + 1] = cmd real_system({ "sh", "-c", failed and "exit 1" or "exit 0" }) return vim.deepcopy(read_result or {}) @@ -88,7 +96,7 @@ equal(writes[1], { { "tmux", "load-buffer", "-w", "-" }, large }) assert(#emitted == 0) read_result = { "external buffer" } equal(vim.g.clipboard.paste["+"](), read_result) -equal(reads[1], { "tmux", "save-buffer", "-" }) +equal(reads[1], { "tmux", "save-buffer", "-b", "buffer-test", "-" }) failed = true equal(vim.g.clipboard.paste["+"](), { large, "v" }) write_failed = true @@ -119,5 +127,5 @@ vim.g.clipboard.copy["+"]({ "both" }, "v") assert(#writes == 2) read_result = { "both" } equal(vim.g.clipboard.paste["+"](), { { "both" }, "v" }) -equal(reads[1], { "tmux", "save-buffer", "-" }) +equal(reads[1], { "tmux", "save-buffer", "-b", "buffer-test", "-" }) print("ok - Wayland primary, external, empty and failed reads; SSH prefers tmux") From 3c3df29faaef3e7e468ea5bedf333fa15e850cc5 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Mon, 14 Sep 2026 21:56:11 -0400 Subject: [PATCH 05/55] Build cursor-bin for aarch64 with the vendor AppImage --- pkgbuilds/cursor-bin/PKGBUILD | 87 +++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/pkgbuilds/cursor-bin/PKGBUILD b/pkgbuilds/cursor-bin/PKGBUILD index d0a3e32..bf67be0 100644 --- a/pkgbuilds/cursor-bin/PKGBUILD +++ b/pkgbuilds/cursor-bin/PKGBUILD @@ -2,24 +2,28 @@ pkgname=cursor-bin pkgver=3.20.21 -pkgrel=2 +pkgrel=3 pkgdesc='AI-first coding environment' -arch=('x86_64') +arch=('x86_64' 'aarch64') url="https://www.cursor.com" license=('LicenseRef-Cursor_EULA') # upstream uses Electron newer than internal VSCode _electron=electron42 -depends=(xdg-utils ripgrep $_electron nodejs - 'gcc-libs' 'hicolor-icon-theme' 'libxkbfile') +depends=('hicolor-icon-theme') +depends_x86_64=(xdg-utils ripgrep $_electron nodejs gcc-libs libxkbfile) +depends_aarch64=(fuse2) +makedepends_aarch64=(squashfs-tools) options=(!strip !debug) # Don't break ext of VSCode _commit=f09fca384ceca23f7bf21f9c23655b162641d747 -source=("https://downloads.cursor.com/production/${_commit}/linux/x64/deb/amd64/deb/cursor_${pkgver}_amd64.deb" +source_x86_64=("https://downloads.cursor.com/production/${_commit}/linux/x64/deb/amd64/deb/cursor_${pkgver}_amd64.deb" "https://gitlab.archlinux.org/archlinux/packaging/packages/code/-/raw/main/code."{sh,mjs} rg.sh) -sha512sums=('8329138d207309d16410f1cb58da18eea1a034a35f2bdd022ef9b373bb8f1b3d80e489e65256b7283c40e10da77962d158bfa3a64e742337a942633810d80dbe' '937299c6cb6be2f8d25f7dbc95cf77423875c5f8353b8bd6cd7cc8e5603cbf8405b14dbf8bd615db2e3b36ed680fc8e1909410815f7f8587b7267a699e00ab37' '793f9ff6306e3992ac89802d98110cba288ea1181a901467333293b7d76182ef9792c2a39ff49d9347a18a174b1f42bc58862091dff583f4146c2704eea28033' 'e79fe7659f59d1ae02fc68816399bfd31587315df6cdb6ccf1d0ca76f7cdc692c2a42b30591c0091147bd97ef14b1c7745dc26bd7cb3ea6bba45698e5044fa2a') -noextract=(cursor_${pkgver}_amd64.deb) # avoid double tarball +sha512sums_x86_64=('8329138d207309d16410f1cb58da18eea1a034a35f2bdd022ef9b373bb8f1b3d80e489e65256b7283c40e10da77962d158bfa3a64e742337a942633810d80dbe' '937299c6cb6be2f8d25f7dbc95cf77423875c5f8353b8bd6cd7cc8e5603cbf8405b14dbf8bd615db2e3b36ed680fc8e1909410815f7f8587b7267a699e00ab37' '793f9ff6306e3992ac89802d98110cba288ea1181a901467333293b7d76182ef9792c2a39ff49d9347a18a174b1f42bc58862091dff583f4146c2704eea28033' 'e79fe7659f59d1ae02fc68816399bfd31587315df6cdb6ccf1d0ca76f7cdc692c2a42b30591c0091147bd97ef14b1c7745dc26bd7cb3ea6bba45698e5044fa2a') +noextract=(cursor_${pkgver}_amd64.deb "Cursor-${pkgver}-aarch64.AppImage") # avoid double tarball +source_aarch64=("Cursor-${pkgver}-aarch64.AppImage::https://downloads.cursor.com/production/${_commit}/linux/arm64/Cursor-${pkgver}-aarch64.AppImage") +sha512sums_aarch64=('7612459f1d9338ba4c2df8e223412901d6c8785f0439e80ae771fe5037f39ac7016a2004589d1049f8f2d254ae06236942193d99558b49960309113e7faeb72e') _app=usr/share/cursor/resources/app -package() { +_package_x86_64() { # Exclude electron bsdtar -xOf ${noextract[0]} data.tar.xz | tar -xJf - -C "$pkgdir" \ --exclude 'usr/share/cursor/[^r]*' --exclude 'usr/share/cursor/*.pak' @@ -36,3 +40,70 @@ package() { install -d "$pkgdir"/usr/bin ln -sf /usr/share/cursor/cursor "$pkgdir"/usr/bin/cursor } + +# ARM keeps the vendor Electron runtime; x86_64 retains system Electron. +prepare() { + [[ "$CARCH" == aarch64 ]] || return 0 + local img="${srcdir}/Cursor-${pkgver}-aarch64.AppImage" + local offset + offset="$(LC_ALL=C grep -aobm1 $'hsqs' "$img" | cut -d: -f1)" + [[ -n "$offset" ]] || { echo "no squashfs (hsqs) magic in $img" >&2; return 1; } + # -no-xattrs: the squashfs carries security.selinux, and unsquashfs exits 2 + # when the builder user cannot write them. Extract only the desktop/icon + # trees; the AppImage itself is the runtime payload. + unsquashfs -no-xattrs -f -o "$offset" -d "${srcdir}/squashfs-root" "$img" \ + usr/share/applications usr/share/icons usr/share/pixmaps +} + +_rewrite_desktop() { + local src="$1" dest="$2" + # Embedded Exec lines are /usr/share/cursor/cursor plus arguments (%F, + # --new-window %F, --open-url %U). Rewrite only the binary path. + sed -E \ + -e 's|^Exec=/usr/share/cursor/cursor|Exec=/usr/bin/cursor|' \ + -e 's|^TryExec=.*|TryExec=/usr/bin/cursor|' \ + "$src" | install -Dm644 /dev/stdin "$dest" +} + +_package_aarch64() { + install -Dm755 "${srcdir}/Cursor-${pkgver}-aarch64.AppImage" \ + "${pkgdir}/opt/cursor-bin/cursor.AppImage" + + install -Dm755 /dev/stdin "${pkgdir}/usr/bin/cursor" <<'EOF' +#!/bin/bash +exec /opt/cursor-bin/cursor.AppImage "$@" +EOF + + local root="${srcdir}/squashfs-root" + _rewrite_desktop \ + "$root/usr/share/applications/cursor.desktop" \ + "${pkgdir}/usr/share/applications/cursor.desktop" + _rewrite_desktop \ + "$root/usr/share/applications/cursor-url-handler.desktop" \ + "${pkgdir}/usr/share/applications/cursor-url-handler.desktop" + + local icon_src icon_dest + while IFS= read -r -d '' icon_src; do + icon_dest="${icon_src#"$root"}" + # Desktop files say Icon=co.anysphere.cursor; the hicolor set in the + # squashfs is named cursor.png. Install under the name the entries use. + if [[ "$(basename "$icon_dest")" == cursor.png ]]; then + icon_dest="$(dirname "$icon_dest")/co.anysphere.cursor.png" + elif [[ "$(basename "$icon_dest")" == cursor.svg ]]; then + icon_dest="$(dirname "$icon_dest")/co.anysphere.cursor.svg" + fi + install -Dm644 "$icon_src" "${pkgdir}${icon_dest}" + done < <(find "$root/usr/share/icons" -type f \( -name '*.png' -o -name '*.svg' \) -print0 2>/dev/null) + + if [[ -f "$root/usr/share/pixmaps/co.anysphere.cursor.png" ]]; then + install -Dm644 "$root/usr/share/pixmaps/co.anysphere.cursor.png" \ + "${pkgdir}/usr/share/pixmaps/co.anysphere.cursor.png" + fi +} + +package() { + case "$CARCH" in + x86_64) _package_x86_64 ;; + aarch64) _package_aarch64 ;; + esac +} From 6877d75e875aa272e7544d406163e5adc9f255ae Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Mon, 14 Sep 2026 21:57:39 -0400 Subject: [PATCH 06/55] Package Apple Video Decoder firmware and the VA-API driver --- pkgbuilds/avd-fw/.omarchy/package.json | 9 +++ pkgbuilds/avd-fw/PKGBUILD | 51 +++++++++++++++++ .../.omarchy/package.json | 12 ++++ pkgbuilds/libva-v4l2_request-avd/PKGBUILD | 55 +++++++++++++++++++ .../libva-v4l2_request-avd.install | 21 +++++++ 5 files changed, 148 insertions(+) create mode 100644 pkgbuilds/avd-fw/.omarchy/package.json create mode 100644 pkgbuilds/avd-fw/PKGBUILD create mode 100644 pkgbuilds/libva-v4l2_request-avd/.omarchy/package.json create mode 100644 pkgbuilds/libva-v4l2_request-avd/PKGBUILD create mode 100644 pkgbuilds/libva-v4l2_request-avd/libva-v4l2_request-avd.install diff --git a/pkgbuilds/avd-fw/.omarchy/package.json b/pkgbuilds/avd-fw/.omarchy/package.json new file mode 100644 index 0000000..2d609e6 --- /dev/null +++ b/pkgbuilds/avd-fw/.omarchy/package.json @@ -0,0 +1,9 @@ +{ + "source": "local", + "upstream": { + "watch": { + "pattern": "v(?P[0-9]+(?:\\.[0-9]+)*)", + "git_tags": "https://github.com/AsahiLinux/avd-fw.git" + } + } +} diff --git a/pkgbuilds/avd-fw/PKGBUILD b/pkgbuilds/avd-fw/PKGBUILD new file mode 100644 index 0000000..b24e65e --- /dev/null +++ b/pkgbuilds/avd-fw/PKGBUILD @@ -0,0 +1,51 @@ +# Open replacement firmware for the Apple Video Decoder. +# Built from AsahiLinux sources, without extracting proprietary firmware. + +pkgname=avd-fw +pkgver=0.1 +pkgrel=1 +pkgdesc='Open replacement firmware for the Apple Video Decoder (AVD) on Apple Silicon' +# The images are raw Cortex-M3 firmware, identical whatever host builds them, +# so this is an 'any' package (as linux-firmware is) rather than an aarch64 one. +arch=('any') +url='https://github.com/AsahiLinux/avd-fw' +license=('MIT') +# clang cross-compiles to arm-none-eabi out of the box, so no arm-none-eabi +# toolchain is required; llvm supplies llvm-objcopy, which meson.build looks +# up by name to turn each linked ELF into a padded raw image. +makedepends=('meson' 'clang' 'llvm') +# !buildflags is load-bearing: makepkg's CFLAGS/LDFLAGS target the aarch64 host +# and would be injected into a bare-metal Cortex-M3 build. !strip keeps makepkg +# from running the host strip over raw firmware images. +options=('!strip' '!debug' '!buildflags' '!lto') +source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz") +sha256sums=('2e131244275cb15c94243e41eec8a2a665ec895cfe3a818181549db991e62c67') + +build() { + # The cross file selects clang, pins the host machine to cortex-m3 and sets + # libdir=lib, which lands the images in /usr/lib/firmware/apple. + # + # Optimization is pinned to match upstream's Makefile (-O2). Meson's default + # buildtype is "debug" (-O0 -g), which would ship unoptimized firmware; the + # MMIO accessors in src/util.c go through a volatile typedef, so -O2 cannot + # elide register reads or writes. + meson setup \ + --cross-file "$pkgname-$pkgver/llvm.ini" \ + --prefix=/usr \ + -Doptimization=2 \ + -Ddebug=false \ + "$pkgname-$pkgver" build + + meson compile -C build +} + +package() { + meson install -C build --destdir "$pkgdir" + + # meson installs custom_target outputs 0755; these are firmware blobs, not + # programs, and every other firmware file on the system is 0644. + chmod 644 "$pkgdir"/usr/lib/firmware/apple/*.bin + + install -Dm644 "$pkgname-$pkgver/LICENSE" \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSE" +} diff --git a/pkgbuilds/libva-v4l2_request-avd/.omarchy/package.json b/pkgbuilds/libva-v4l2_request-avd/.omarchy/package.json new file mode 100644 index 0000000..5dc4867 --- /dev/null +++ b/pkgbuilds/libva-v4l2_request-avd/.omarchy/package.json @@ -0,0 +1,12 @@ +{ + "source": "local", + "upstream": { + "watch": { + "git_tags": "https://github.com/sofus13/libva-v4l2_request.git", + "pattern": "(?P[0-9]+(?:\\.[0-9]+)*)" + } + }, + "rebuild_on": [ + "libva" + ] +} diff --git a/pkgbuilds/libva-v4l2_request-avd/PKGBUILD b/pkgbuilds/libva-v4l2_request-avd/PKGBUILD new file mode 100644 index 0000000..255f542 --- /dev/null +++ b/pkgbuilds/libva-v4l2_request-avd/PKGBUILD @@ -0,0 +1,55 @@ +# VA-API driver with Apple Video Decoder fixes from the sofus13 fork. +# The asahi alias lets libva discover it on Apple Silicon. + +_fork=sofus13 +pkgname=libva-v4l2_request-avd +pkgver=1.3 +pkgrel=1 +pkgdesc='VA-API driver for V4L2 stateless decoders, with Apple Video Decoder (AVD) support' +arch=('aarch64') +url="https://github.com/$_fork/libva-v4l2_request" +license=('GPL-3.0-or-later') +# The driver is a dlopen()ed plugin: it links only libc and exports the VA +# backend entry point (__vaDriverInit_1_24), so libva is a runtime rather than +# a link-time dependency -- and that symbol is versioned, so this needs a +# rebuild whenever libva's driver ABI is bumped. libdrm is only used for +# drm_fourcc.h constants at compile time. +depends=('glibc' 'libva') +makedepends=('meson' 'libdrm') +provides=('libva-v4l2_request') +conflicts=('libva-v4l2_request') +install="$pkgname.install" +source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/$pkgver.tar.gz") +sha256sums=('3670a1712f9f0a5a61bd44a781eba81dd9b2e0fd8271417ca8a9fbbed9dccfe9') + +build() { + # driverdir is left unset so meson takes it from libva's pkg-config + # (/usr/lib/dri); the codec set is decided by configure-time checks against + # the kernel uapi headers, so linux-api-headers governs what gets built in. + # Plain meson rather than arch-meson: the latter lives in devtools, which is + # not a safe assumption outside a clean chroot. buildtype=plain hands the + # compiler makepkg's own CFLAGS/LDFLAGS, which is what arch-meson does too. + meson setup \ + --prefix=/usr \ + --buildtype=plain \ + --wrap-mode=nodownload \ + "libva-v4l2_request-$pkgver" build + meson compile -C build +} + +package() { + meson install -C build --destdir "$pkgdir" + + # libva picks its driver from the DRM driver name of the render node, which + # on Apple Silicon is "asahi", so it looks for asahi_drv_video.so. Nothing + # else ships that name (mesa provides no VA driver for asahi), so aliasing it + # here makes every VA-API application find the decoder with no environment + # variable at all. If mesa ever ships its own asahi_drv_video.so this will + # collide and pacman will say so at install time. + ln -sf v4l2_request_drv_video.so "$pkgdir/usr/lib/dri/asahi_drv_video.so" + + install -Dm644 "libva-v4l2_request-$pkgver/COPYING" \ + "$pkgdir/usr/share/licenses/$pkgname/COPYING" + install -Dm644 "libva-v4l2_request-$pkgver/README" \ + "$pkgdir/usr/share/doc/$pkgname/README" +} diff --git a/pkgbuilds/libva-v4l2_request-avd/libva-v4l2_request-avd.install b/pkgbuilds/libva-v4l2_request-avd/libva-v4l2_request-avd.install new file mode 100644 index 0000000..e56488b --- /dev/null +++ b/pkgbuilds/libva-v4l2_request-avd/libva-v4l2_request-avd.install @@ -0,0 +1,21 @@ +post_install() { + cat <<'MSG' +==> This package installs itself as asahi_drv_video.so as well, which is the + name libva looks for on Apple Silicon, so VA-API applications should pick + the decoder up with no configuration. + + If something does not, select it explicitly for the session: + + LIBVA_DRIVER_NAME=v4l2_request + +==> Check with: vainfo +==> mpv: mpv --hwdec=vaapi video.mp4 +==> Firefox: additionally needs MOZ_DISABLE_RDD_SANDBOX=1, because the RDD + sandbox blocks the /dev/video* and /dev/media* access this + driver requires. That weakens Firefox's media sandbox. +MSG +} + +post_upgrade() { + post_install +} From 73d63378240a9a7a245f6241116bd35636986596 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Mon, 14 Sep 2026 23:13:18 -0400 Subject: [PATCH 07/55] Simplify ARM Cursor packaging with the vendor Debian archive --- pkgbuilds/cursor-bin/PKGBUILD | 105 +++++++++------------------------- 1 file changed, 27 insertions(+), 78 deletions(-) diff --git a/pkgbuilds/cursor-bin/PKGBUILD b/pkgbuilds/cursor-bin/PKGBUILD index bf67be0..0364840 100644 --- a/pkgbuilds/cursor-bin/PKGBUILD +++ b/pkgbuilds/cursor-bin/PKGBUILD @@ -9,26 +9,42 @@ url="https://www.cursor.com" license=('LicenseRef-Cursor_EULA') # upstream uses Electron newer than internal VSCode _electron=electron42 -depends=('hicolor-icon-theme') -depends_x86_64=(xdg-utils ripgrep $_electron nodejs gcc-libs libxkbfile) -depends_aarch64=(fuse2) -makedepends_aarch64=(squashfs-tools) +depends=(xdg-utils gcc-libs hicolor-icon-theme libxkbfile) +depends_x86_64=(ripgrep $_electron nodejs) +# ARM retains bundled Electron because electron42 is unavailable in ALARM. +depends_aarch64=( + alsa-lib at-spi2-core ca-certificates cairo curl dbus expat glib2 glibc gtk3 + libcups libsecret libx11 libxcb libxcomposite libxdamage libxext libxfixes + libxkbcommon libxrandr mesa nspr nss pango systemd-libs which +) options=(!strip !debug) # Don't break ext of VSCode _commit=f09fca384ceca23f7bf21f9c23655b162641d747 source_x86_64=("https://downloads.cursor.com/production/${_commit}/linux/x64/deb/amd64/deb/cursor_${pkgver}_amd64.deb" "https://gitlab.archlinux.org/archlinux/packaging/packages/code/-/raw/main/code."{sh,mjs} rg.sh) sha512sums_x86_64=('8329138d207309d16410f1cb58da18eea1a034a35f2bdd022ef9b373bb8f1b3d80e489e65256b7283c40e10da77962d158bfa3a64e742337a942633810d80dbe' '937299c6cb6be2f8d25f7dbc95cf77423875c5f8353b8bd6cd7cc8e5603cbf8405b14dbf8bd615db2e3b36ed680fc8e1909410815f7f8587b7267a699e00ab37' '793f9ff6306e3992ac89802d98110cba288ea1181a901467333293b7d76182ef9792c2a39ff49d9347a18a174b1f42bc58862091dff583f4146c2704eea28033' 'e79fe7659f59d1ae02fc68816399bfd31587315df6cdb6ccf1d0ca76f7cdc692c2a42b30591c0091147bd97ef14b1c7745dc26bd7cb3ea6bba45698e5044fa2a') -noextract=(cursor_${pkgver}_amd64.deb "Cursor-${pkgver}-aarch64.AppImage") # avoid double tarball -source_aarch64=("Cursor-${pkgver}-aarch64.AppImage::https://downloads.cursor.com/production/${_commit}/linux/arm64/Cursor-${pkgver}-aarch64.AppImage") -sha512sums_aarch64=('7612459f1d9338ba4c2df8e223412901d6c8785f0439e80ae771fe5037f39ac7016a2004589d1049f8f2d254ae06236942193d99558b49960309113e7faeb72e') +source_aarch64=("https://downloads.cursor.com/production/${_commit}/linux/arm64/deb/arm64/deb/cursor_${pkgver}_arm64.deb") +sha512sums_aarch64=('fe2e2bb77901d24bc2e21b1528b8fef2f75e5b68078f47ea96109f2903dea730a074b851a56f9a0d5404dc35243e2a7f156cbd24a5c687df74590a9b93ce0bad') +noextract=(cursor_${pkgver}_amd64.deb cursor_${pkgver}_arm64.deb) # avoid double tarball _app=usr/share/cursor/resources/app -_package_x86_64() { - # Exclude electron - bsdtar -xOf ${noextract[0]} data.tar.xz | tar -xJf - -C "$pkgdir" \ - --exclude 'usr/share/cursor/[^r]*' --exclude 'usr/share/cursor/*.pak' +package() { + local deb="cursor_${pkgver}_amd64.deb" + local -a excludes=(--exclude 'usr/share/cursor/[^r]*' --exclude 'usr/share/cursor/*.pak') + if [[ "$CARCH" == aarch64 ]]; then + deb="cursor_${pkgver}_arm64.deb" + # Keep bundled Electron; omit Debian's AppArmor and sysctl settings. + excludes=(--exclude './etc') + fi + bsdtar -xOf "${srcdir}/${deb}" data.tar.xz | tar -xJf - -C "$pkgdir" "${excludes[@]}" cd "$pkgdir" mv usr/share/zsh/{vendor-completions,site-functions} + if [[ "$CARCH" == aarch64 ]]; then + install -d usr/bin + ln -s /usr/share/cursor/bin/cursor usr/bin/cursor + # Use Electron's unprivileged namespace sandbox. + chmod 0755 usr/share/cursor/chrome-sandbox + return + fi ln -sf /usr/bin/node ${_app}/resources/helpers/node install -Dm755 "${srcdir}/rg.sh" ${_app}/node_modules/@vscode/ripgrep/bin/rg ln -sf /usr/bin/xdg-open ${_app}/node_modules/open/xdg-open @@ -40,70 +56,3 @@ _package_x86_64() { install -d "$pkgdir"/usr/bin ln -sf /usr/share/cursor/cursor "$pkgdir"/usr/bin/cursor } - -# ARM keeps the vendor Electron runtime; x86_64 retains system Electron. -prepare() { - [[ "$CARCH" == aarch64 ]] || return 0 - local img="${srcdir}/Cursor-${pkgver}-aarch64.AppImage" - local offset - offset="$(LC_ALL=C grep -aobm1 $'hsqs' "$img" | cut -d: -f1)" - [[ -n "$offset" ]] || { echo "no squashfs (hsqs) magic in $img" >&2; return 1; } - # -no-xattrs: the squashfs carries security.selinux, and unsquashfs exits 2 - # when the builder user cannot write them. Extract only the desktop/icon - # trees; the AppImage itself is the runtime payload. - unsquashfs -no-xattrs -f -o "$offset" -d "${srcdir}/squashfs-root" "$img" \ - usr/share/applications usr/share/icons usr/share/pixmaps -} - -_rewrite_desktop() { - local src="$1" dest="$2" - # Embedded Exec lines are /usr/share/cursor/cursor plus arguments (%F, - # --new-window %F, --open-url %U). Rewrite only the binary path. - sed -E \ - -e 's|^Exec=/usr/share/cursor/cursor|Exec=/usr/bin/cursor|' \ - -e 's|^TryExec=.*|TryExec=/usr/bin/cursor|' \ - "$src" | install -Dm644 /dev/stdin "$dest" -} - -_package_aarch64() { - install -Dm755 "${srcdir}/Cursor-${pkgver}-aarch64.AppImage" \ - "${pkgdir}/opt/cursor-bin/cursor.AppImage" - - install -Dm755 /dev/stdin "${pkgdir}/usr/bin/cursor" <<'EOF' -#!/bin/bash -exec /opt/cursor-bin/cursor.AppImage "$@" -EOF - - local root="${srcdir}/squashfs-root" - _rewrite_desktop \ - "$root/usr/share/applications/cursor.desktop" \ - "${pkgdir}/usr/share/applications/cursor.desktop" - _rewrite_desktop \ - "$root/usr/share/applications/cursor-url-handler.desktop" \ - "${pkgdir}/usr/share/applications/cursor-url-handler.desktop" - - local icon_src icon_dest - while IFS= read -r -d '' icon_src; do - icon_dest="${icon_src#"$root"}" - # Desktop files say Icon=co.anysphere.cursor; the hicolor set in the - # squashfs is named cursor.png. Install under the name the entries use. - if [[ "$(basename "$icon_dest")" == cursor.png ]]; then - icon_dest="$(dirname "$icon_dest")/co.anysphere.cursor.png" - elif [[ "$(basename "$icon_dest")" == cursor.svg ]]; then - icon_dest="$(dirname "$icon_dest")/co.anysphere.cursor.svg" - fi - install -Dm644 "$icon_src" "${pkgdir}${icon_dest}" - done < <(find "$root/usr/share/icons" -type f \( -name '*.png' -o -name '*.svg' \) -print0 2>/dev/null) - - if [[ -f "$root/usr/share/pixmaps/co.anysphere.cursor.png" ]]; then - install -Dm644 "$root/usr/share/pixmaps/co.anysphere.cursor.png" \ - "${pkgdir}/usr/share/pixmaps/co.anysphere.cursor.png" - fi -} - -package() { - case "$CARCH" in - x86_64) _package_x86_64 ;; - aarch64) _package_aarch64 ;; - esac -} From 8fcea0cdf351296e8365624523fece09902aaf21 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Tue, 22 Sep 2026 18:20:22 +1000 Subject: [PATCH 08/55] Add linux-aurora: Apple Silicon kernel for the edge and rc channels Aurora Silicon's fork of the Asahi kernel (DisplayPort alt-mode and USB4 for external displays, VRR, ISP and AOP drivers) as an aarch64-only split package, linux-aurora and linux-aurora-headers, pinned to an immutable commit that was cold-boot qualified on a MacBook Pro 14" M1 Pro and 16" M2 Max. It provides and conflicts with linux-asahi so Macs move over in one explicit transaction, and pkgrel 9 orders it after the last build the maralcbr fork published, so already-installed Macs upgrade on -Syu. Metadata: skip_build like the x86 kernels (built only by its own PR), release_ring fast with channels edge and rc, so one merge publishes the same artifact to edge/aarch64 and rc/aarch64 and stable keeps asahi-alarm's linux-asahi. No x86 job is emitted and no shared tooling changes. --- pkgbuilds/linux-aurora/.omarchy/package.json | 6 + pkgbuilds/linux-aurora/PKGBUILD | 225 + pkgbuilds/linux-aurora/config | 9280 ++++++++++++++++++ pkgbuilds/linux-aurora/rust-toolchain.toml | 4 + 4 files changed, 9515 insertions(+) create mode 100644 pkgbuilds/linux-aurora/.omarchy/package.json create mode 100644 pkgbuilds/linux-aurora/PKGBUILD create mode 100644 pkgbuilds/linux-aurora/config create mode 100644 pkgbuilds/linux-aurora/rust-toolchain.toml diff --git a/pkgbuilds/linux-aurora/.omarchy/package.json b/pkgbuilds/linux-aurora/.omarchy/package.json new file mode 100644 index 0000000..7336e72 --- /dev/null +++ b/pkgbuilds/linux-aurora/.omarchy/package.json @@ -0,0 +1,6 @@ +{ + "source": "local", + "skip_build": true, + "release_ring": "fast", + "channels": ["edge", "rc"] +} diff --git a/pkgbuilds/linux-aurora/PKGBUILD b/pkgbuilds/linux-aurora/PKGBUILD new file mode 100644 index 0000000..129c807 --- /dev/null +++ b/pkgbuilds/linux-aurora/PKGBUILD @@ -0,0 +1,225 @@ +# AArch64 Apple Silicon (Aurora Silicon) +# Based on the asahi-alarm linux-asahi package by Jos Dehaes and Matthias Kurz. +# +# Aurora Silicon maintain a fork of the Asahi kernel carrying DisplayPort +# alt-mode and USB4 support for external monitors, variable refresh rate, and +# the ISP and AOP drivers. Those changes touch device trees, the type-C stack +# and DRM, so they cannot ship as a module: this is a whole alternative kernel +# for Macs on the Omarchy edge and rc channels. The stable channel keeps +# asahi-alarm's linux-asahi. + +_auroraver=7.1.12 +_aurorarel=2 +pkgrel=9 + +# Immutable pin on aurora-silicon/linux (branch aurora-wip). Every bump is a +# PR that moves _commit and the archive checksum; the pinned commit is cold-boot +# qualified on MacBook Pro 14" M1 Pro (j314s) and 16" M2 Max (j416c) first. +_commit=2439016d2e8d3a0d8aebcd243f29604a91f201c9 + +_m1n1_version=1.6.1 + +pkgbase=linux-aurora +_srcname=linux-${_commit} +_kernelname=${pkgbase#linux} +_desc="AArch64 Apple Silicon (Aurora kernel)" +pkgver="${_auroraver}.aurora${_aurorarel}" +arch=('aarch64') +url="https://github.com/aurora-silicon/linux" +license=('GPL2') + +makedepends=( + base-devel bc dtc kmod libelf pahole cpio perl rustup rust-bindgen tar xz xmlto python +) +options=('!strip') +source=( + https://github.com/aurora-silicon/linux/archive/${_commit}.tar.gz + config # the main kernel config file + rust-toolchain.toml +) +sha256sums=('6347354537148120fc5448afcb8671a558ce336f731c70690cd88062a903f84d' + '4228006ad9c5fcc2237b91b3fd1f70934d23e6d8bdb012faf5a763e042a6edee' + '2a95563bb9f5b216cc3c170a17e9471448bc63a7084bdd67df23d074939b366c') + +# Kbuild takes ARCH literally and knows arm64, not aarch64. +export ARCH=arm64 +export KBUILD_BUILD_HOST=archlinux +export KBUILD_BUILD_USER=$pkgbase +export KBUILD_BUILD_TIMESTAMP="$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})" + +prepare() { + cd $_srcname + + echo "Setting version..." + echo "-$_aurorarel-$pkgrel" > localversion.10-pkgrel + + local src + for src in "${source[@]}"; do + src="${src%%::*}" + src="${src##*/}" + [[ $src = *.patch ]] || continue + echo "Applying patch $src..." + patch -Np1 < "../$src" + done + + echo "Pinning the Rust toolchain..." + cp ../rust-toolchain.toml . + + echo "Creating build directories..." + mkdir -p build/base + + echo "Setting config (base)..." + cp ../config build/base/.config + make olddefconfig prepare O=$PWD/build/base + diff -u ../config build/base/.config || : + make -s kernelrelease O=$PWD/build/base > build/base/version + + echo "Prepared $pkgbase version $(=$_m1n1_version") + optdepends=('crda: to set the correct wireless channels of your country' + 'linux-firmware: firmware images needed for some devices') + provides=(WIREGUARD-MODULE linux=${pkgver} linux-asahi=${pkgver}) + replaces=(wireguard-arch) + conflicts=(linux-asahi) + + local kernver="$(<$O/version)" + local modulesdir="$pkgdir/usr/lib/modules/$kernver" + + echo "Installing boot image..." + # systemd expects to find the kernel here to allow hibernation + # https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344 + install -Dm644 "$O"/arch/arm64/boot/Image "$modulesdir/vmlinuz" + + # Used by mkinitcpio to name the kernel + echo "$1" | install -Dm644 /dev/stdin "$modulesdir/pkgbase" + + echo "Installing modules..." + make O="$O" INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 modules_install + + echo "Installing device trees..." + install -Dt "$modulesdir/dtbs" "$O"/arch/arm64/boot/dts/apple/*.dtb + + # remove build and source links + rm -f "$modulesdir"/{source,build} +} + +_package() { + cd $_srcname + export O="$PWD/build/base" + _package_kernel "$pkgbase" +} + +_package-headers() { + pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel" + depends=(pahole) + provides=(linux-asahi-headers=${pkgver}) + conflicts=(linux-asahi-headers) + + KARCH=arm64 + + cd $_srcname + O=build/base + local builddir="$pkgdir/usr/lib/modules/$(<${O}/version)/build" + + echo "Installing build files..." + install -Dt "$builddir" -m644 $O/.config Makefile $O/Module.symvers $O/System.map \ + localversion.* $O/version $O/vmlinux + install -Dt "$builddir/kernel" -m644 kernel/Makefile + cp -t "$builddir" -a scripts $O/scripts + + # required when STACK_VALIDATION is enabled + #install -Dt "$builddir/tools/objtool" tools/objtool/objtool + + # required when DEBUG_INFO_BTF_MODULES is enabled + install -Dt "$builddir/tools/bpf/resolve_btfids" $O/tools/bpf/resolve_btfids/resolve_btfids + + echo "Installing headers..." + cp -t "$builddir" -a include $O/include + + install -Dt "${builddir}/arch/${KARCH}" -m644 arch/${KARCH}/Makefile + install -Dt "${builddir}/arch/${KARCH}/kernel" -m644 $O/arch/${KARCH}/kernel/asm-offsets.s + cp -t "${builddir}/arch/${KARCH}" -a arch/${KARCH}/include $O/arch/${KARCH}/include + + install -Dt "$builddir/drivers/md" -m644 drivers/md/*.h + install -Dt "$builddir/net/mac80211" -m644 net/mac80211/*.h + + # https://bugs.archlinux.org/task/13146 + install -Dt "$builddir/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h + + # https://bugs.archlinux.org/task/20402 + install -Dt "$builddir/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h + install -Dt "$builddir/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h + install -Dt "$builddir/drivers/media/tuners" -m644 drivers/media/tuners/*.h + + # https://bugs.archlinux.org/task/71392 + install -Dt "$builddir/drivers/iio/common/hid-sensors" -m644 drivers/iio/common/hid-sensors/*.h + + echo "Installing KConfig files..." + find . -name 'Kconfig*' -exec install -Dm644 {} "$builddir/{}" \; + + echo "Installing unstripped VDSO..." + make O="$O" INSTALL_MOD_PATH="$pkgdir/usr" vdso_install link= + + echo "Removing unneeded architectures..." + local arch + for arch in "$builddir"/arch/*/; do + [[ $arch = */${KARCH}/ ]] && continue + echo "Removing $(basename "$arch")" + rm -r "$arch" + done + + echo "Removing documentation..." + rm -r "$builddir/Documentation" + + echo "Removing broken symlinks..." + find -L "$builddir" -type l -printf 'Removing %P\n' -delete + + echo "Removing loose objects..." + find "$builddir" -type f -name '*.o' -printf 'Removing %P\n' -delete + + echo "Removing cmd files..." + find "$builddir" -type f -name '*.cmd' -printf 'Removing %P\n' -delete + + echo "Stripping build tools..." + local file + while read -rd '' file; do + case "$(file --no-sandbox -bi "$file")" in + application/x-sharedlib\;*) # Libraries (.so) + strip -v $STRIP_SHARED "$file" ;; + application/x-archive\;*) # Libraries (.a) + strip -v $STRIP_STATIC "$file" ;; + application/x-executable\;*) # Binaries + strip -v $STRIP_BINARIES "$file" ;; + application/x-pie-executable\;*) # Relocatable binaries + strip -v $STRIP_SHARED "$file" ;; + esac + done < <(find "$builddir" -type f -perm -u+x ! -name vmlinux -print0) + + echo "Stripping vmlinux..." + strip -v $STRIP_STATIC "$builddir/vmlinux" + + echo "Adding symlink..." + mkdir -p "$pkgdir/usr/src" + ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase" + +} + +pkgname=("$pkgbase" "$pkgbase-headers") +for _p in "${pkgname[@]}"; do + eval "package_$_p() { + $(declare -f "_package${_p#$pkgbase}") + _package${_p#$pkgbase} + }" +done + +# vim:set ts=8 sts=2 sw=2 et: diff --git a/pkgbuilds/linux-aurora/config b/pkgbuilds/linux-aurora/config new file mode 100644 index 0000000..04e5fba --- /dev/null +++ b/pkgbuilds/linux-aurora/config @@ -0,0 +1,9280 @@ +# +# Automatically generated file; DO NOT EDIT. +# Linux/arm64 7.1.6 Kernel Configuration +# +CONFIG_CC_VERSION_TEXT="gcc (GCC) 15.2.1 20260209" +CONFIG_CC_IS_GCC=y +CONFIG_GCC_VERSION=150201 +CONFIG_CLANG_VERSION=0 +CONFIG_AS_IS_GNU=y +CONFIG_AS_VERSION=24600 +CONFIG_LD_IS_BFD=y +CONFIG_LD_VERSION=24600 +CONFIG_LLD_VERSION=0 +CONFIG_RUSTC_VERSION=109301 +CONFIG_RUST_IS_AVAILABLE=y +CONFIG_RUSTC_LLVM_VERSION=210108 +CONFIG_RUSTC_LLVM_MAJOR_VERSION=21 +CONFIG_CC_CAN_LINK=y +CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y +CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y +CONFIG_TOOLS_SUPPORT_RELR=y +CONFIG_CC_HAS_ASM_INLINE=y +CONFIG_CC_HAS_ASSUME=y +CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y +CONFIG_CC_HAS_COUNTED_BY=y +CONFIG_CC_HAS_MULTIDIMENSIONAL_NONSTRING=y +CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y +CONFIG_RUSTC_HAS_SPAN_FILE=y +CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y +CONFIG_RUSTC_HAS_FILE_WITH_NUL=y +CONFIG_RUSTC_HAS_FILE_AS_C_STR=y +CONFIG_PAHOLE_VERSION=131 +CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_TABLE_SORT=y +CONFIG_THREAD_INFO_IN_TASK=y + +# +# General setup +# +CONFIG_INIT_ENV_ARG_LIMIT=32 +# CONFIG_COMPILE_TEST is not set +# CONFIG_WERROR is not set +CONFIG_LOCALVERSION="-ARCH" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_BUILD_SALT="" +CONFIG_DEFAULT_INIT="" +CONFIG_DEFAULT_HOSTNAME="(none)" +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +CONFIG_POSIX_MQUEUE=y +CONFIG_POSIX_MQUEUE_SYSCTL=y +CONFIG_WATCH_QUEUE=y +CONFIG_CROSS_MEMORY_ATTACH=y +CONFIG_AUDIT=y +CONFIG_HAVE_ARCH_AUDITSYSCALL=y +CONFIG_AUDITSYSCALL=y + +# +# IRQ subsystem +# +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_INJECTION=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_GENERIC_IRQ_IPI_MUX=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_GENERIC_IRQ_STAT_SNAPSHOT=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +CONFIG_GENERIC_IRQ_KEXEC_CLEAR_VM_FORWARD=y +# end of IRQ subsystem + +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +# CONFIG_NO_HZ_IDLE is not set +CONFIG_NO_HZ_FULL=y +CONFIG_CONTEXT_TRACKING_USER=y +# CONFIG_CONTEXT_TRACKING_USER_FORCE is not set +# CONFIG_NO_HZ is not set +CONFIG_HIGH_RES_TIMERS=y +# CONFIG_POSIX_AUX_CLOCKS is not set +# end of Timers subsystem + +CONFIG_BPF=y +CONFIG_HAVE_EBPF_JIT=y +CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y + +# +# BPF subsystem +# +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +# CONFIG_BPF_JIT_ALWAYS_ON is not set +CONFIG_BPF_JIT_DEFAULT_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +# CONFIG_BPF_PRELOAD is not set +# CONFIG_BPF_LSM is not set +# end of BPF subsystem + +CONFIG_PREEMPT_BUILD=y +CONFIG_ARCH_HAS_PREEMPT_LAZY=y +CONFIG_PREEMPT=y +# CONFIG_PREEMPT_LAZY is not set +# CONFIG_PREEMPT_RT is not set +CONFIG_PREEMPT_COUNT=y +CONFIG_PREEMPTION=y +CONFIG_PREEMPT_DYNAMIC=y +# CONFIG_SCHED_CORE is not set +# CONFIG_SCHED_CLASS_EXT is not set + +# +# CPU/Task time and stats accounting +# +CONFIG_VIRT_CPU_ACCOUNTING=y +CONFIG_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_SCHED_AVG_IRQ=y +CONFIG_SCHED_HW_PRESSURE=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y +CONFIG_PSI=y +# CONFIG_PSI_DEFAULT_DISABLED is not set +# end of CPU/Task time and stats accounting + +CONFIG_CPU_ISOLATION=y + +# +# RCU Subsystem +# +CONFIG_TREE_RCU=y +CONFIG_PREEMPT_RCU=y +# CONFIG_RCU_EXPERT is not set +CONFIG_TREE_SRCU=y +CONFIG_TASKS_RCU_GENERIC=y +CONFIG_NEED_TASKS_RCU=y +CONFIG_TASKS_RCU=y +CONFIG_TASKS_TRACE_RCU=y +CONFIG_RCU_STALL_COMMON=y +CONFIG_RCU_NEED_SEGCBLIST=y +CONFIG_RCU_NOCB_CPU=y +# CONFIG_RCU_NOCB_CPU_DEFAULT_ALL is not set +# CONFIG_RCU_LAZY is not set +# end of RCU Subsystem + +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_IKHEADERS is not set +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +# CONFIG_PRINTK_INDEX is not set +CONFIG_GENERIC_SCHED_CLOCK=y + +# +# Scheduler features +# +CONFIG_UCLAMP_TASK=y +CONFIG_UCLAMP_BUCKETS_COUNT=5 +# CONFIG_SCHED_PROXY_EXEC is not set +# end of Scheduler features + +CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y +CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y +CONFIG_CC_HAS_INT128=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_CC_MS_EXTENSIONS="-fms-extensions" +CONFIG_GCC10_NO_ARRAY_BOUNDS=y +CONFIG_CC_NO_ARRAY_BOUNDS=y +CONFIG_GCC_NO_STRINGOP_OVERFLOW=y +CONFIG_CC_NO_STRINGOP_OVERFLOW=y +CONFIG_ARCH_SUPPORTS_INT128=y +CONFIG_SLAB_OBJ_EXT=y +CONFIG_CGROUPS=y +CONFIG_PAGE_COUNTER=y +# CONFIG_CGROUP_FAVOR_DYNMODS is not set +CONFIG_MEMCG=y +# CONFIG_MEMCG_V1 is not set +CONFIG_BLK_CGROUP=y +CONFIG_CGROUP_WRITEBACK=y +CONFIG_CGROUP_SCHED=y +CONFIG_GROUP_SCHED_WEIGHT=y +CONFIG_GROUP_SCHED_BANDWIDTH=y +CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_SCHED_MM_CID=y +CONFIG_UCLAMP_TASK_GROUP=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +# CONFIG_CGROUP_DMEM is not set +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_HUGETLB=y +CONFIG_CPUSETS=y +# CONFIG_CPUSETS_V1 is not set +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_CGROUP_MISC=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_SOCK_CGROUP_DATA=y +CONFIG_NAMESPACES=y +CONFIG_UTS_NS=y +CONFIG_TIME_NS=y +CONFIG_TIME_NS_VDSO=y +CONFIG_IPC_NS=y +CONFIG_USER_NS=y +CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_CHECKPOINT_RESTORE=y +CONFIG_SCHED_AUTOGROUP=y +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_RD_GZIP=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_RD_XZ=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_RD_ZSTD=y +CONFIG_BOOT_CONFIG=y +# CONFIG_BOOT_CONFIG_FORCE is not set +# CONFIG_BOOT_CONFIG_EMBED is not set +CONFIG_CMDLINE_LOG_WRAP_IDEAL_LEN=1021 +CONFIG_INITRAMFS_PRESERVE_MTIME=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set +CONFIG_LD_ORPHAN_WARN=y +CONFIG_LD_ORPHAN_WARN_LEVEL="warn" +CONFIG_SYSCTL=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_EXPERT=y +CONFIG_MULTIUSER=y +# CONFIG_SGETMASK_SYSCALL is not set +CONFIG_FHANDLE=y +CONFIG_POSIX_TIMERS=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +# CONFIG_BASE_SMALL is not set +CONFIG_FUTEX=y +CONFIG_FUTEX_PI=y +CONFIG_FUTEX_PRIVATE_HASH=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_IO_URING=y +# CONFIG_IO_URING_MOCK_FILE is not set +CONFIG_ADVISE_SYSCALLS=y +CONFIG_MEMBARRIER=y +CONFIG_KCMP=y +CONFIG_RSEQ=y +# CONFIG_RSEQ_STATS is not set +# CONFIG_RSEQ_DEBUG_DEFAULT_ENABLE is not set +# CONFIG_DEBUG_RSEQ is not set +CONFIG_CACHESTAT_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_SELFTEST is not set +CONFIG_KALLSYMS_ALL=y +CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y +CONFIG_ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS=y +CONFIG_HAVE_PERF_EVENTS=y +CONFIG_GUEST_PERF_EVENTS=y + +# +# Kernel Performance Events And Counters +# +CONFIG_PERF_EVENTS=y +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set +# end of Kernel Performance Events And Counters + +CONFIG_SYSTEM_DATA_VERIFICATION=y +CONFIG_PROFILING=y +CONFIG_RUST=y +CONFIG_RUSTC_VERSION_TEXT="rustc 1.93.1 (01f6ddf75 2026-02-11)" +CONFIG_BINDGEN_VERSION_TEXT="bindgen 0.72.1" +CONFIG_TRACEPOINTS=y + +# +# Kexec and crash features +# +CONFIG_VMCORE_INFO=y +CONFIG_KEXEC_CORE=y +# CONFIG_KEXEC is not set +CONFIG_KEXEC_FILE=y +# CONFIG_KEXEC_SIG is not set +# CONFIG_CRASH_DUMP is not set +# end of Kexec and crash features + +# +# Live Update and Kexec HandOver +# +# CONFIG_KEXEC_HANDOVER is not set +# end of Live Update and Kexec HandOver +# end of General setup + +CONFIG_ARM64=y +CONFIG_RUSTC_SUPPORTS_ARM64=y +CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_64BIT=y +CONFIG_MMU=y +CONFIG_ARM64_CONT_PTE_SHIFT=7 +CONFIG_ARM64_CONT_PMD_SHIFT=5 +CONFIG_ARCH_MMAP_RND_BITS_MIN=16 +CONFIG_ARCH_MMAP_RND_BITS_MAX=31 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=9 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16 +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_SMP=y +CONFIG_KERNEL_MODE_NEON=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_ARCH_SUPPORTS_UPROBES=y +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y +CONFIG_ARM64_ACTLR_STATE=y + +# +# Platform selection +# +# CONFIG_ARCH_ACTIONS is not set +# CONFIG_ARCH_AIROHA is not set +# CONFIG_ARCH_SUNXI is not set +# CONFIG_ARCH_ALPINE is not set +CONFIG_ARCH_APPLE=y +# CONFIG_ARCH_AXIADO is not set +# CONFIG_ARCH_BCM is not set +# CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_BITMAIN is not set +# CONFIG_ARCH_BLAIZE is not set +# CONFIG_ARCH_BST is not set +# CONFIG_ARCH_CIX is not set +# CONFIG_ARCH_EXYNOS is not set +# CONFIG_ARCH_K3 is not set +# CONFIG_ARCH_LG1K is not set +# CONFIG_ARCH_HISI is not set +# CONFIG_ARCH_KEEMBAY is not set +# CONFIG_ARCH_MEDIATEK is not set +# CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MICROCHIP is not set +# CONFIG_ARCH_MMP is not set +# CONFIG_ARCH_MVEBU is not set +# CONFIG_ARCH_NXP is not set +# CONFIG_ARCH_MA35 is not set +# CONFIG_ARCH_NPCM is not set +# CONFIG_ARCH_PENSANDO is not set +# CONFIG_ARCH_QCOM is not set +# CONFIG_ARCH_REALTEK is not set +# CONFIG_ARCH_RENESAS is not set +# CONFIG_ARCH_ROCKCHIP is not set +# CONFIG_ARCH_SEATTLE is not set +# CONFIG_ARCH_INTEL_SOCFPGA is not set +# CONFIG_ARCH_SOPHGO is not set +# CONFIG_ARCH_STM32 is not set +# CONFIG_ARCH_SYNQUACER is not set +# CONFIG_ARCH_TEGRA is not set +# CONFIG_ARCH_SPRD is not set +# CONFIG_ARCH_THUNDER is not set +# CONFIG_ARCH_THUNDER2 is not set +# CONFIG_ARCH_UNIPHIER is not set +# CONFIG_ARCH_VEXPRESS is not set +# CONFIG_ARCH_VISCONTI is not set +# CONFIG_ARCH_XGENE is not set +# CONFIG_ARCH_ZYNQMP is not set +# end of Platform selection + +# +# Kernel Features +# + +# +# ARM errata workarounds via the alternatives framework +# +# CONFIG_AMPERE_ERRATUM_AC03_CPU_38 is not set +CONFIG_AMPERE_ERRATUM_AC04_CPU_23=y +# CONFIG_ARM64_ERRATUM_826319 is not set +# CONFIG_ARM64_ERRATUM_827319 is not set +# CONFIG_ARM64_ERRATUM_824069 is not set +# CONFIG_ARM64_ERRATUM_819472 is not set +# CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_834220 is not set +# CONFIG_ARM64_ERRATUM_843419 is not set +# CONFIG_ARM64_ERRATUM_1024718 is not set +# CONFIG_ARM64_ERRATUM_1165522 is not set +# CONFIG_ARM64_ERRATUM_1319367 is not set +# CONFIG_ARM64_ERRATUM_1530923 is not set +CONFIG_ARM64_WORKAROUND_REPEAT_TLBI=y +# CONFIG_ARM64_ERRATUM_2441007 is not set +# CONFIG_ARM64_ERRATUM_1286807 is not set +# CONFIG_ARM64_ERRATUM_1463225 is not set +# CONFIG_ARM64_ERRATUM_1542419 is not set +# CONFIG_ARM64_ERRATUM_1508412 is not set +# CONFIG_ARM64_ERRATUM_2051678 is not set +# CONFIG_ARM64_ERRATUM_2077057 is not set +# CONFIG_ARM64_ERRATUM_2658417 is not set +# CONFIG_ARM64_ERRATUM_2054223 is not set +# CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set +# CONFIG_ARM64_ERRATUM_2457168 is not set +# CONFIG_ARM64_ERRATUM_2645198 is not set +CONFIG_ARM64_WORKAROUND_SPECULATIVE_UNPRIV_LOAD=y +CONFIG_ARM64_ERRATUM_2966298=y +CONFIG_ARM64_ERRATUM_3117295=y +CONFIG_ARM64_ERRATUM_3194386=y +CONFIG_ARM64_ERRATUM_4311569=y +CONFIG_ARM64_ERRATUM_4193714=y +CONFIG_ARM64_ERRATUM_4118414=y +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +CONFIG_HISILICON_ERRATUM_162100801=y +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +CONFIG_ROCKCHIP_ERRATUM_3568002=y +# CONFIG_ROCKCHIP_ERRATUM_3588001 is not set +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +# end of ARM errata workarounds via the alternatives framework + +# CONFIG_ARM64_4K_PAGES is not set +CONFIG_ARM64_16K_PAGES=y +# CONFIG_ARM64_64K_PAGES is not set +# CONFIG_ARM64_VA_BITS_36 is not set +# CONFIG_ARM64_VA_BITS_47 is not set +CONFIG_ARM64_VA_BITS_48=y +# CONFIG_ARM64_VA_BITS_52 is not set +CONFIG_ARM64_VA_BITS=48 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PA_BITS=48 +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_NR_CPUS=64 +CONFIG_HOTPLUG_CPU=y +# CONFIG_NUMA is not set +# CONFIG_HZ_100 is not set +# CONFIG_HZ_250 is not set +# CONFIG_HZ_300 is not set +CONFIG_HZ_1000=y +CONFIG_HZ=1000 +CONFIG_SCHED_HRTICK=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_HW_PERF_EVENTS=y +CONFIG_CC_HAVE_SHADOW_CALL_STACK=y +CONFIG_PARAVIRT=y +CONFIG_PARAVIRT_TIME_ACCOUNTING=y +CONFIG_ARCH_SUPPORTS_KEXEC=y +CONFIG_ARCH_SUPPORTS_KEXEC_FILE=y +CONFIG_ARCH_SELECTS_KEXEC_FILE=y +CONFIG_ARCH_SUPPORTS_KEXEC_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_IMAGE_VERIFY_SIG=y +CONFIG_ARCH_DEFAULT_KEXEC_IMAGE_VERIFY_SIG=y +CONFIG_ARCH_SUPPORTS_KEXEC_HANDOVER=y +CONFIG_ARCH_SUPPORTS_CRASH_DUMP=y +CONFIG_ARCH_DEFAULT_CRASH_DUMP=y +CONFIG_TRANS_TABLE=y +# CONFIG_XEN is not set +CONFIG_ARCH_FORCE_MAX_ORDER=11 +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y +# CONFIG_ARM64_SW_TTBR0_PAN is not set +CONFIG_ARM64_TAGGED_ADDR_ABI=y +# CONFIG_COMPAT is not set + +# +# ARMv8.1 architectural features +# +CONFIG_ARM64_HW_AFDBM=y +# end of ARMv8.1 architectural features + +# +# ARMv8.2 architectural features +# +# CONFIG_ARM64_PMEM is not set +CONFIG_ARM64_RAS_EXTN=y +CONFIG_ARM64_CNP=y +# end of ARMv8.2 architectural features + +# +# ARMv8.3 architectural features +# +CONFIG_ARM64_PTR_AUTH=y +CONFIG_ARM64_PTR_AUTH_KERNEL=y +CONFIG_CC_HAS_BRANCH_PROT_PAC_RET=y +CONFIG_AS_HAS_CFI_NEGATE_RA_STATE=y +# end of ARMv8.3 architectural features + +# +# ARMv8.4 architectural features +# +CONFIG_ARM64_AMU_EXTN=y +CONFIG_ARM64_TLB_RANGE=y +# CONFIG_ARM64_MPAM is not set +# end of ARMv8.4 architectural features + +# +# ARMv8.5 architectural features +# +CONFIG_AS_HAS_ARMV8_5=y +CONFIG_ARM64_BTI=y +CONFIG_CC_HAS_BRANCH_PROT_PAC_RET_BTI=y +CONFIG_ARM64_E0PD=y +CONFIG_ARM64_AS_HAS_MTE=y +CONFIG_ARM64_MTE=y +# end of ARMv8.5 architectural features + +# +# ARMv8.7 architectural features +# +CONFIG_ARM64_EPAN=y +# end of ARMv8.7 architectural features + +CONFIG_AS_HAS_MOPS=y + +# +# ARMv8.9 architectural features +# +CONFIG_ARM64_POE=y +CONFIG_ARCH_PKEY_BITS=3 +CONFIG_ARM64_HAFT=y +# end of ARMv8.9 architectural features + +# +# ARMv9.4 architectural features +# +CONFIG_ARM64_GCS=y +# end of ARMv9.4 architectural features + +CONFIG_AS_HAS_LSUI=y + +# +# ARMv9.6 architectural features +# +CONFIG_ARM64_LSUI=y +# end of ARMv9.6 architectural features + +CONFIG_ARM64_SVE=y +CONFIG_ARM64_SME=y +# CONFIG_ARM64_PSEUDO_NMI is not set +CONFIG_ARM64_MEMORY_MODEL_CONTROL=y +CONFIG_RELOCATABLE=y +# CONFIG_RANDOMIZE_BASE is not set +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_STACKPROTECTOR_PER_TASK=y +# end of Kernel Features + +# +# Boot options +# +CONFIG_CMDLINE="" +CONFIG_EFI_STUB=y +CONFIG_EFI=y +# CONFIG_COMPRESSED_INSTALL is not set +CONFIG_DMI=y +# end of Boot options + +# +# Power management options +# +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_SUSPEND_SKIP_SYNC is not set +# CONFIG_HIBERNATION is not set +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_USERSPACE_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set +CONFIG_PM_QOS_CPU_SYSTEM_WAKEUP=y +CONFIG_PM=y +CONFIG_PM_DEBUG=y +# CONFIG_PM_ADVANCED_DEBUG is not set +# CONFIG_PM_TEST_SUSPEND is not set +CONFIG_PM_SLEEP_DEBUG=y +# CONFIG_DPM_WATCHDOG is not set +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_CPU_PM=y +CONFIG_ENERGY_MODEL=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +# end of Power management options + +# +# CPU Power Management +# + +# +# CPU Idle +# +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_IDLE_GOV_TEO=y +CONFIG_DT_IDLE_STATES=y +CONFIG_DT_IDLE_GENPD=y + +# +# ARM CPU Idle Drivers +# +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +CONFIG_ARM_APPLE_CPUIDLE=y +# end of ARM CPU Idle Drivers +# end of CPU Idle + +# +# CPU Frequency scaling +# +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_STAT=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set +# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y + +# +# CPU frequency scaling drivers +# +CONFIG_CPUFREQ_DT=y +# CONFIG_CPUFREQ_DT_RUST is not set +# CONFIG_CPUFREQ_VIRT is not set +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_ARM_APPLE_SOC_CPUFREQ=y +# end of CPU Frequency scaling +# end of CPU Power Management + +CONFIG_ARCH_SUPPORTS_ACPI=y +# CONFIG_ACPI is not set +CONFIG_KVM_COMMON=y +CONFIG_HAVE_KVM_IRQCHIP=y +CONFIG_HAVE_KVM_IRQ_ROUTING=y +CONFIG_HAVE_KVM_DIRTY_RING=y +CONFIG_HAVE_KVM_DIRTY_RING_ACQ_REL=y +CONFIG_NEED_KVM_DIRTY_RING_WITH_BITMAP=y +CONFIG_KVM_MMIO=y +CONFIG_HAVE_KVM_MSI=y +CONFIG_HAVE_KVM_READONLY_MEM=y +CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y +CONFIG_KVM_VFIO=y +CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y +CONFIG_HAVE_KVM_IRQ_BYPASS=y +CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE=y +CONFIG_VIRT_XFER_TO_GUEST_WORK=y +CONFIG_KVM_GENERIC_HARDWARE_ENABLING=y +CONFIG_KVM_GUEST_MEMFD=y +CONFIG_VIRTUALIZATION=y +CONFIG_KVM=y +# CONFIG_PTDUMP_STAGE2_DEBUGFS is not set +# CONFIG_NVHE_EL2_DEBUG is not set +CONFIG_HAVE_LIVEPATCH=y +CONFIG_CPU_MITIGATIONS=y + +# +# General architecture-dependent options +# +CONFIG_ARCH_HAS_SUBPAGE_FAULTS=y +CONFIG_HOTPLUG_SMT=y +CONFIG_ARCH_SUPPORTS_SCHED_SMT=y +CONFIG_ARCH_SUPPORTS_SCHED_CLUSTER=y +CONFIG_ARCH_SUPPORTS_SCHED_MC=y +CONFIG_SCHED_SMT=y +CONFIG_SCHED_CLUSTER=y +CONFIG_SCHED_MC=y +CONFIG_HOTPLUG_CORE_SYNC=y +CONFIG_HOTPLUG_CORE_SYNC_DEAD=y +CONFIG_GENERIC_IRQ_ENTRY=y +CONFIG_KPROBES=y +CONFIG_JUMP_LABEL=y +# CONFIG_STATIC_KEYS_SELFTEST is not set +CONFIG_UPROBES=y +CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y +CONFIG_KRETPROBES=y +CONFIG_HAVE_IOREMAP_PROT=y +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y +CONFIG_HAVE_NMI=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_NMI_SUPPORT=y +CONFIG_HAVE_ARCH_TRACEHOOK=y +CONFIG_HAVE_DMA_CONTIGUOUS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_ARCH_HAS_FORTIFY_SOURCE=y +CONFIG_ARCH_HAS_KEEPINITRD=y +CONFIG_ARCH_HAS_SET_MEMORY=y +CONFIG_ARCH_HAS_SET_DIRECT_MAP=y +CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_HAVE_ASM_MODVERSIONS=y +CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y +CONFIG_HAVE_RSEQ=y +CONFIG_HAVE_RUST=y +CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y +CONFIG_HAVE_HW_BREAKPOINT=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y +CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y +CONFIG_MMU_GATHER_TABLE_FREE=y +CONFIG_MMU_GATHER_RCU_TABLE_FREE=y +CONFIG_MMU_LAZY_TLB_REFCOUNT=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_ARCH_HAS_NMI_SAFE_THIS_CPU_OPS=y +CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_HAVE_ARCH_SECCOMP=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP=y +CONFIG_SECCOMP_FILTER=y +# CONFIG_SECCOMP_CACHE_DEBUG is not set +CONFIG_HAVE_ARCH_KSTACK_ERASE=y +CONFIG_HAVE_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_SUPPORTS_SHADOW_CALL_STACK=y +# CONFIG_SHADOW_CALL_STACK is not set +CONFIG_ARCH_SUPPORTS_LTO_CLANG=y +CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y +CONFIG_LTO_NONE=y +CONFIG_ARCH_SUPPORTS_CFI=y +CONFIG_HAVE_CONTEXT_TRACKING_USER=y +CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_PV_STEAL_CLOCK_GEN=y +CONFIG_HAVE_MOVE_PUD=y +CONFIG_HAVE_MOVE_PMD=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_HAVE_ARCH_HUGE_VMAP=y +CONFIG_HAVE_ARCH_HUGE_VMALLOC=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +CONFIG_HAVE_MOD_ARCH_SPECIFIC=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_ARCH_WANTS_EXECMEM_LATE=y +CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y +CONFIG_SOFTIRQ_ON_OWN_STACK=y +CONFIG_ARCH_HAS_ELF_RANDOMIZE=y +CONFIG_HAVE_ARCH_MMAP_RND_BITS=y +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_HAVE_PAGE_SIZE_16KB=y +CONFIG_PAGE_SIZE_16KB=y +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_PAGE_SHIFT=14 +CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_ARCH_SUPPORTS_RT=y +CONFIG_HAVE_ARCH_VMAP_STACK=y +CONFIG_VMAP_STACK=y +CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +# CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT is not set +CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y +CONFIG_STRICT_KERNEL_RWX=y +CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y +CONFIG_STRICT_MODULE_RWX=y +CONFIG_HAVE_ARCH_COMPILER_H=y +CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_ARCH_HAS_RELR=y +CONFIG_RELR=y +CONFIG_ARCH_HAS_MEM_ENCRYPT=y +CONFIG_ARCH_HAS_CC_PLATFORM=y +CONFIG_HAVE_PREEMPT_DYNAMIC=y +CONFIG_HAVE_PREEMPT_DYNAMIC_KEY=y +CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y +CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y +CONFIG_ARCH_HAVE_TRACE_MMIO_ACCESS=y +CONFIG_ARCH_HAS_HW_PTE_YOUNG=y +CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=y +CONFIG_ARCH_HAS_KERNEL_FPU_SUPPORT=y + +# +# GCOV-based kernel profiling +# +# CONFIG_GCOV_KERNEL is not set +CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y +# end of GCOV-based kernel profiling + +CONFIG_HAVE_GCC_PLUGINS=y +# CONFIG_GCC_PLUGINS is not set +CONFIG_FUNCTION_ALIGNMENT_4B=y +CONFIG_FUNCTION_ALIGNMENT=4 +CONFIG_CC_HAS_MIN_FUNCTION_ALIGNMENT=y +CONFIG_CC_HAS_SANE_FUNCTION_ALIGNMENT=y +CONFIG_HAVE_ARCH_GET_SECUREBOOT=y +# end of General architecture-dependent options + +CONFIG_RT_MUTEXES=y +CONFIG_MODULES=y +# CONFIG_MODULE_DEBUG is not set +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +# CONFIG_MODULE_SIG is not set +# CONFIG_MODULE_COMPRESS is not set +# CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set +CONFIG_MODPROBE_PATH="/sbin/modprobe" +# CONFIG_TRIM_UNUSED_KSYMS is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_BLOCK=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BLK_RQ_ALLOC_TIME=y +CONFIG_BLK_CGROUP_RWSTAT=y +CONFIG_BLK_CGROUP_PUNT_BIO=y +CONFIG_BLK_DEV_BSG_COMMON=y +CONFIG_BLK_ICQ=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_WRITE_MOUNTED=y +CONFIG_BLK_DEV_ZONED=y +CONFIG_BLK_DEV_THROTTLING=y +CONFIG_BLK_WBT=y +CONFIG_BLK_WBT_MQ=y +# CONFIG_BLK_CGROUP_IOLATENCY is not set +CONFIG_BLK_CGROUP_IOCOST=y +CONFIG_BLK_CGROUP_IOPRIO=y +CONFIG_BLK_DEBUG_FS=y +CONFIG_BLK_SED_OPAL=y +# CONFIG_BLK_INLINE_ENCRYPTION is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_AIX_PARTITION=y +CONFIG_OSF_PARTITION=y +CONFIG_AMIGA_PARTITION=y +# CONFIG_ATARI_PARTITION is not set +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +# CONFIG_ULTRIX_PARTITION is not set +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y +# CONFIG_SYSV68_PARTITION is not set +# CONFIG_CMDLINE_PARTITION is not set +# CONFIG_OF_PARTITION is not set +# end of Partition Types + +CONFIG_BLK_PM=y +CONFIG_BLOCK_HOLDER_DEPRECATED=y +CONFIG_BLK_MQ_STACKING=y + +# +# IO Schedulers +# +CONFIG_MQ_IOSCHED_DEADLINE=y +CONFIG_MQ_IOSCHED_KYBER=y +CONFIG_IOSCHED_BFQ=y +CONFIG_BFQ_GROUP_IOSCHED=y +# CONFIG_BFQ_CGROUP_DEBUG is not set +# end of IO Schedulers + +CONFIG_PREEMPT_NOTIFIERS=y +CONFIG_PADATA=y +CONFIG_ASN1=y +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_ARCH_USE_QUEUED_SPINLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_ARCH_USE_QUEUED_RWLOCKS=y +CONFIG_QUEUED_RWLOCKS=y +CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE=y +CONFIG_ARCH_HAS_SYSCALL_WRAPPER=y +CONFIG_FREEZER=y + +# +# Executable file formats +# +CONFIG_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_STATE=y +CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y +CONFIG_ARCH_HAVE_ELF_PROT=y +CONFIG_ARCH_USE_GNU_PROPERTY=y +CONFIG_ELFCORE=y +CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y +CONFIG_BINFMT_SCRIPT=y +CONFIG_BINFMT_MISC=y +CONFIG_COREDUMP=y +# end of Executable file formats + +# +# Memory Management options +# +CONFIG_SWAP=y +CONFIG_ZSWAP=y +# CONFIG_ZSWAP_DEFAULT_ON is not set +CONFIG_ZSWAP_SHRINKER_DEFAULT_ON=y +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_DEFLATE is not set +CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZO=y +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_842 is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4 is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_LZ4HC is not set +# CONFIG_ZSWAP_COMPRESSOR_DEFAULT_ZSTD is not set +CONFIG_ZSWAP_COMPRESSOR_DEFAULT="lzo" +CONFIG_ZSMALLOC=y + +# +# Zsmalloc allocator options +# + +# +# Zsmalloc is a common backend allocator for zswap & zram +# +# CONFIG_ZSMALLOC_STAT is not set +CONFIG_ZSMALLOC_CHAIN_SIZE=8 +# end of Zsmalloc allocator options + +# +# Slab allocator options +# +CONFIG_SLUB=y +CONFIG_KVFREE_RCU_BATCHED=y +# CONFIG_SLUB_TINY is not set +CONFIG_SLAB_MERGE_DEFAULT=y +CONFIG_SLAB_FREELIST_RANDOM=y +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLAB_BUCKETS is not set +# CONFIG_SLUB_STATS is not set +# CONFIG_RANDOM_KMALLOC_CACHES is not set +# end of Slab allocator options + +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_HAVE_GUP_FAST=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_EXCLUSIVE_SYSTEM_RAM=y +CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y +# CONFIG_MEMORY_HOTPLUG is not set +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_SPLIT_PTE_PTLOCKS=y +CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y +CONFIG_SPLIT_PMD_PTLOCKS=y +CONFIG_BALLOON=y +CONFIG_BALLOON_MIGRATION=y +CONFIG_COMPACTION=y +CONFIG_COMPACT_UNEVICTABLE_DEFAULT=1 +CONFIG_PAGE_REPORTING=y +CONFIG_MIGRATION=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y +CONFIG_CONTIG_ALLOC=y +CONFIG_PCP_BATCH_SCALE_MAX=5 +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_MMU_NOTIFIER=y +CONFIG_KSM=y +CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 +CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y +# CONFIG_MEMORY_FAILURE is not set +# CONFIG_TRANSPARENT_HUGEPAGE is not set +CONFIG_PAGE_MAPCOUNT=y +CONFIG_PGTABLE_HAS_HUGE_LEAVES=y +CONFIG_HAVE_GIGANTIC_FOLIOS=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +# CONFIG_CMA_SYSFS is not set +CONFIG_CMA_AREAS=7 +CONFIG_PAGE_BLOCK_MAX_ORDER=11 +CONFIG_GENERIC_EARLY_IOREMAP=y +# CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set +# CONFIG_IDLE_PAGE_TRACKING is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y +CONFIG_ARCH_HAS_ZONE_DMA_SET=y +CONFIG_ZONE_DMA=y +CONFIG_ZONE_DMA32=y +CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y +CONFIG_ARCH_HAS_PKEYS=y +CONFIG_ARCH_USES_PG_ARCH_2=y +CONFIG_ARCH_USES_PG_ARCH_3=y +CONFIG_VM_EVENT_COUNTERS=y +# CONFIG_PERCPU_STATS is not set +# CONFIG_GUP_TEST is not set +# CONFIG_DMAPOOL_TEST is not set +CONFIG_ARCH_HAS_PTE_SPECIAL=y +CONFIG_MEMFD_CREATE=y +CONFIG_SECRETMEM=y +# CONFIG_ANON_VMA_NAME is not set +# CONFIG_USERFAULTFD is not set +# CONFIG_LRU_GEN is not set +CONFIG_ARCH_SUPPORTS_PER_VMA_LOCK=y +CONFIG_PER_VMA_LOCK=y +CONFIG_LOCK_MM_AND_FIND_VMA=y +CONFIG_EXECMEM=y +CONFIG_ARCH_HAS_USER_SHADOW_STACK=y +CONFIG_PT_RECLAIM=y +CONFIG_ARCH_HAS_LAZY_MMU_MODE=y + +# +# Data Access Monitoring +# +# CONFIG_DAMON is not set +# end of Data Access Monitoring +# end of Memory Management options + +CONFIG_NET=y +CONFIG_NET_INGRESS=y +CONFIG_NET_EGRESS=y +CONFIG_NET_XGRESS=y +CONFIG_NET_REDIRECT=y +CONFIG_SKB_EXTENSIONS=y +CONFIG_NET_DEVMEM=y +CONFIG_NET_CRC32C=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m +# CONFIG_INET_PSP is not set +CONFIG_UNIX=y +CONFIG_AF_UNIX_OOB=y +CONFIG_UNIX_DIAG=m +CONFIG_TLS=m +# CONFIG_TLS_DEVICE is not set +# CONFIG_TLS_TOE is not set +CONFIG_XFRM=y +CONFIG_XFRM_ALGO=y +CONFIG_XFRM_USER=y +# CONFIG_XFRM_INTERFACE is not set +CONFIG_XFRM_SUB_POLICY=y +CONFIG_XFRM_MIGRATE=y +CONFIG_XFRM_STATISTICS=y +CONFIG_XFRM_AH=m +CONFIG_XFRM_ESP=m +CONFIG_XFRM_IPCOMP=m +CONFIG_NET_KEY=m +CONFIG_NET_KEY_MIGRATE=y +CONFIG_XFRM_IPTFS=m +# CONFIG_DIBS is not set +# CONFIG_XDP_SOCKETS is not set +CONFIG_NET_HANDSHAKE=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_FIB_TRIE_STATS=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_ROUTE_CLASSID=y +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IP_TUNNEL=m +CONFIG_NET_IPGRE=m +CONFIG_NET_IPGRE_BROADCAST=y +CONFIG_IP_MROUTE_COMMON=y +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m +CONFIG_NET_UDP_TUNNEL=m +CONFIG_NET_FOU=m +CONFIG_NET_FOU_IP_TUNNELS=y +CONFIG_INET_AH=m +CONFIG_INET_ESP=m +# CONFIG_INET_ESP_OFFLOAD is not set +# CONFIG_INET_ESPINTCP is not set +CONFIG_INET_IPCOMP=m +CONFIG_INET_TABLE_PERTURB_ORDER=16 +CONFIG_INET_XFRM_TUNNEL=m +CONFIG_INET_TUNNEL=m +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +CONFIG_INET_UDP_DIAG=m +CONFIG_INET_RAW_DIAG=m +# CONFIG_INET_DIAG_DESTROY is not set +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_BIC=m +CONFIG_TCP_CONG_CUBIC=y +CONFIG_TCP_CONG_WESTWOOD=m +CONFIG_TCP_CONG_HTCP=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_VEGAS=m +CONFIG_TCP_CONG_NV=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_CONG_BBR=m +CONFIG_DEFAULT_CUBIC=y +# CONFIG_DEFAULT_RENO is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_AO is not set +CONFIG_TCP_MD5SIG=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +# CONFIG_INET6_ESP_OFFLOAD is not set +# CONFIG_INET6_ESPINTCP is not set +CONFIG_INET6_IPCOMP=m +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_ILA=m +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_IPV6_VTI=m +CONFIG_IPV6_SIT=m +CONFIG_IPV6_SIT_6RD=y +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m +CONFIG_IPV6_FOU=m +CONFIG_IPV6_FOU_TUNNEL=m +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_IPV6_MROUTE=y +CONFIG_IPV6_MROUTE_MULTIPLE_TABLES=y +CONFIG_IPV6_PIMSM_V2=y +CONFIG_IPV6_SEG6_LWTUNNEL=y +CONFIG_IPV6_SEG6_HMAC=y +CONFIG_IPV6_SEG6_BPF=y +# CONFIG_IPV6_RPL_LWTUNNEL is not set +# CONFIG_IPV6_IOAM6_LWTUNNEL is not set +CONFIG_NETLABEL=y +CONFIG_MPTCP=y +CONFIG_INET_MPTCP_DIAG=m +CONFIG_MPTCP_IPV6=y +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NETWORK_PHY_TIMESTAMPING=y +CONFIG_NETFILTER=y +CONFIG_NETFILTER_ADVANCED=y +CONFIG_BRIDGE_NETFILTER=m + +# +# Core Netfilter Configuration +# +CONFIG_NETFILTER_INGRESS=y +CONFIG_NETFILTER_EGRESS=y +CONFIG_NETFILTER_SKIP_EGRESS=y +CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_FAMILY_BRIDGE=y +CONFIG_NETFILTER_FAMILY_ARP=y +CONFIG_NETFILTER_BPF_LINK=y +CONFIG_NETFILTER_NETLINK_HOOK=m +CONFIG_NETFILTER_NETLINK_ACCT=m +CONFIG_NETFILTER_NETLINK_QUEUE=m +CONFIG_NETFILTER_NETLINK_LOG=m +CONFIG_NETFILTER_NETLINK_OSF=m +CONFIG_NF_CONNTRACK=m +CONFIG_NF_LOG_SYSLOG=m +CONFIG_NETFILTER_CONNCOUNT=m +CONFIG_NF_CONNTRACK_MARK=y +CONFIG_NF_CONNTRACK_ZONES=y +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_LABELS=y +CONFIG_NF_CONNTRACK_OVS=y +CONFIG_NF_CT_PROTO_GRE=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_BROADCAST=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_CT_NETLINK_HELPER=m +CONFIG_NETFILTER_NETLINK_GLUE_CT=y +CONFIG_NF_NAT=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_TFTP=m +CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y +CONFIG_NF_NAT_OVS=y +CONFIG_NETFILTER_SYNPROXY=m +CONFIG_NF_TABLES=m +CONFIG_NF_TABLES_INET=y +CONFIG_NF_TABLES_NETDEV=y +CONFIG_NFT_NUMGEN=m +CONFIG_NFT_CT=m +# CONFIG_NFT_EXTHDR_DCCP is not set +CONFIG_NFT_FLOW_OFFLOAD=m +CONFIG_NFT_CONNLIMIT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_NAT=m +CONFIG_NFT_TUNNEL=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_QUOTA=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_REJECT_INET=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NFT_FIB=m +CONFIG_NFT_FIB_INET=m +CONFIG_NFT_XFRM=m +CONFIG_NFT_SOCKET=m +CONFIG_NFT_OSF=m +CONFIG_NFT_TPROXY=m +CONFIG_NFT_SYNPROXY=m +CONFIG_NF_DUP_NETDEV=m +CONFIG_NFT_DUP_NETDEV=m +CONFIG_NFT_FWD_NETDEV=m +CONFIG_NFT_FIB_NETDEV=m +CONFIG_NFT_REJECT_NETDEV=m +CONFIG_NF_FLOW_TABLE_INET=m +CONFIG_NF_FLOW_TABLE=m +CONFIG_NF_FLOW_TABLE_PROCFS=y +CONFIG_NETFILTER_XTABLES=y +CONFIG_NETFILTER_XTABLES_LEGACY=y + +# +# Xtables combined modules +# +CONFIG_NETFILTER_XT_MARK=m +CONFIG_NETFILTER_XT_CONNMARK=m +CONFIG_NETFILTER_XT_SET=m + +# +# Xtables targets +# +CONFIG_NETFILTER_XT_TARGET_AUDIT=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_CT=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HL=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_NAT=m +CONFIG_NETFILTER_XT_TARGET_NETMAP=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m +CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m + +# +# Xtables matches +# +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ECN=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_HL=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +# end of Core Netfilter Configuration + +CONFIG_IP_SET=m +CONFIG_IP_SET_MAX=256 +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_IPMAC=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_IPV6=y +# CONFIG_IP_VS_DEBUG is not set +CONFIG_IP_VS_TAB_BITS=12 + +# +# IPVS transport protocol load balancing support +# +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_AH_ESP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y + +# +# IPVS scheduler +# +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_MH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_TWOS=m + +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + +# +# IPVS MH scheduler +# +CONFIG_IP_VS_MH_TAB_INDEX=12 + +# +# IPVS application helper +# +CONFIG_IP_VS_FTP=m +CONFIG_IP_VS_NFCT=y +CONFIG_IP_VS_PE_SIP=m + +# +# IP: Netfilter Configuration +# +CONFIG_NF_DEFRAG_IPV4=m +CONFIG_IP_NF_IPTABLES_LEGACY=m +CONFIG_NF_SOCKET_IPV4=m +CONFIG_NF_TPROXY_IPV4=m +CONFIG_NF_TABLES_IPV4=y +CONFIG_NFT_REJECT_IPV4=m +CONFIG_NFT_DUP_IPV4=m +CONFIG_NFT_FIB_IPV4=m +CONFIG_NF_TABLES_ARP=y +CONFIG_NF_DUP_IPV4=m +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_NF_REJECT_IPV4=y +CONFIG_NF_NAT_SNMP_BASIC=m +CONFIG_NF_NAT_PPTP=m +CONFIG_NF_NAT_H323=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_NFT_COMPAT_ARP=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +# end of IP: Netfilter Configuration + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_IPTABLES_LEGACY=m +CONFIG_NF_SOCKET_IPV6=m +CONFIG_NF_TPROXY_IPV6=m +CONFIG_NF_TABLES_IPV6=y +CONFIG_NFT_REJECT_IPV6=m +CONFIG_NFT_DUP_IPV6=m +CONFIG_NFT_FIB_IPV6=m +CONFIG_NF_DUP_IPV6=m +CONFIG_NF_REJECT_IPV6=m +CONFIG_NF_LOG_IPV6=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_AH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_MATCH_FRAG=m +CONFIG_IP6_NF_MATCH_OPTS=m +CONFIG_IP6_NF_MATCH_HL=m +CONFIG_IP6_NF_MATCH_IPV6HEADER=m +CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_RPFILTER=m +CONFIG_IP6_NF_MATCH_RT=m +CONFIG_IP6_NF_MATCH_SRH=m +CONFIG_IP6_NF_TARGET_HL=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +CONFIG_IP6_NF_TARGET_SYNPROXY=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_RAW=m +CONFIG_IP6_NF_SECURITY=m +CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m +# end of IPv6: Netfilter Configuration + +CONFIG_NF_DEFRAG_IPV6=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +CONFIG_NFT_BRIDGE_REJECT=m +CONFIG_NF_CONNTRACK_BRIDGE=m +CONFIG_BRIDGE_NF_EBTABLES_LEGACY=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_IP6=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_IP_SCTP=m +# CONFIG_SCTP_DBG_OBJCNT is not set +CONFIG_SCTP_DEFAULT_COOKIE_HMAC_SHA256=y +# CONFIG_SCTP_DEFAULT_COOKIE_HMAC_NONE is not set +CONFIG_INET_SCTP_DIAG=m +CONFIG_RDS=m +CONFIG_RDS_TCP=m +# CONFIG_RDS_DEBUG is not set +CONFIG_TIPC=m +CONFIG_TIPC_MEDIA_UDP=y +CONFIG_TIPC_CRYPTO=y +CONFIG_TIPC_DIAG=m +CONFIG_ATM=m +CONFIG_ATM_BR2684=m +# CONFIG_ATM_BR2684_IPFILTER is not set +CONFIG_L2TP=m +CONFIG_L2TP_DEBUGFS=m +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=m +CONFIG_L2TP_ETH=m +CONFIG_STP=m +CONFIG_GARP=m +CONFIG_MRP=m +CONFIG_BRIDGE=m +CONFIG_BRIDGE_IGMP_SNOOPING=y +CONFIG_BRIDGE_VLAN_FILTERING=y +# CONFIG_BRIDGE_MRP is not set +# CONFIG_BRIDGE_CFM is not set +CONFIG_NET_DSA=m +CONFIG_NET_DSA_TAG_NONE=m +# CONFIG_NET_DSA_TAG_AR9331 is not set +CONFIG_NET_DSA_TAG_BRCM_COMMON=m +CONFIG_NET_DSA_TAG_BRCM=m +CONFIG_NET_DSA_TAG_BRCM_LEGACY=m +CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS=m +CONFIG_NET_DSA_TAG_BRCM_PREPEND=m +# CONFIG_NET_DSA_TAG_HELLCREEK is not set +# CONFIG_NET_DSA_TAG_GSWIP is not set +CONFIG_NET_DSA_TAG_DSA_COMMON=m +CONFIG_NET_DSA_TAG_DSA=m +CONFIG_NET_DSA_TAG_EDSA=m +# CONFIG_NET_DSA_TAG_MTK is not set +# CONFIG_NET_DSA_TAG_MXL_862XX is not set +# CONFIG_NET_DSA_TAG_MXL_GSW1XX is not set +# CONFIG_NET_DSA_TAG_KSZ is not set +# CONFIG_NET_DSA_TAG_OCELOT is not set +# CONFIG_NET_DSA_TAG_OCELOT_8021Q is not set +CONFIG_NET_DSA_TAG_QCA=m +# CONFIG_NET_DSA_TAG_RTL4_A is not set +# CONFIG_NET_DSA_TAG_RTL8_4 is not set +# CONFIG_NET_DSA_TAG_RZN1_A5PSW is not set +# CONFIG_NET_DSA_TAG_LAN9303 is not set +# CONFIG_NET_DSA_TAG_SJA1105 is not set +CONFIG_NET_DSA_TAG_TRAILER=m +# CONFIG_NET_DSA_TAG_VSC73XX_8021Q is not set +# CONFIG_NET_DSA_TAG_XRS700X is not set +# CONFIG_NET_DSA_TAG_YT921X is not set +CONFIG_VLAN_8021Q=m +CONFIG_VLAN_8021Q_GVRP=y +CONFIG_VLAN_8021Q_MVRP=y +CONFIG_LLC=m +# CONFIG_LLC2 is not set +CONFIG_ATALK=m +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_PHONET is not set +CONFIG_6LOWPAN=m +# CONFIG_6LOWPAN_DEBUGFS is not set +CONFIG_6LOWPAN_NHC=m +CONFIG_6LOWPAN_NHC_DEST=m +CONFIG_6LOWPAN_NHC_FRAGMENT=m +CONFIG_6LOWPAN_NHC_HOP=m +CONFIG_6LOWPAN_NHC_IPV6=m +CONFIG_6LOWPAN_NHC_MOBILITY=m +CONFIG_6LOWPAN_NHC_ROUTING=m +CONFIG_6LOWPAN_NHC_UDP=m +CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m +CONFIG_6LOWPAN_GHC_UDP=m +CONFIG_6LOWPAN_GHC_ICMPV6=m +CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m +CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m +CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m +CONFIG_IEEE802154=m +# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set +CONFIG_IEEE802154_SOCKET=m +CONFIG_IEEE802154_6LOWPAN=m +CONFIG_MAC802154=m +CONFIG_NET_SCHED=y + +# +# Queueing/Scheduling +# +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_HFSC=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_MULTIQ=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFB=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_CBS=m +CONFIG_NET_SCH_ETF=m +CONFIG_NET_SCH_MQPRIO_LIB=m +CONFIG_NET_SCH_TAPRIO=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_NETEM=m +CONFIG_NET_SCH_DRR=m +CONFIG_NET_SCH_MQPRIO=m +CONFIG_NET_SCH_SKBPRIO=m +CONFIG_NET_SCH_CHOKE=m +CONFIG_NET_SCH_QFQ=m +CONFIG_NET_SCH_CODEL=m +CONFIG_NET_SCH_FQ_CODEL=y +CONFIG_NET_SCH_CAKE=m +CONFIG_NET_SCH_FQ=m +CONFIG_NET_SCH_HHF=m +CONFIG_NET_SCH_PIE=m +CONFIG_NET_SCH_FQ_PIE=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_SCH_PLUG=m +CONFIG_NET_SCH_ETS=m +# CONFIG_NET_SCH_BPF is not set +# CONFIG_NET_SCH_DUALPI2 is not set +# CONFIG_NET_SCH_DEFAULT is not set + +# +# Classification +# +CONFIG_NET_CLS=y +CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_CLS_U32_PERF=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=m +CONFIG_NET_CLS_CGROUP=y +CONFIG_NET_CLS_BPF=m +CONFIG_NET_CLS_FLOWER=m +CONFIG_NET_CLS_MATCHALL=m +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_STACK=32 +CONFIG_NET_EMATCH_CMP=m +CONFIG_NET_EMATCH_NBYTE=m +CONFIG_NET_EMATCH_U32=m +CONFIG_NET_EMATCH_META=m +CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_EMATCH_CANID=m +CONFIG_NET_EMATCH_IPSET=m +CONFIG_NET_EMATCH_IPT=m +CONFIG_NET_CLS_ACT=y +CONFIG_NET_ACT_POLICE=m +CONFIG_NET_ACT_GACT=m +CONFIG_GACT_PROB=y +CONFIG_NET_ACT_MIRRED=m +CONFIG_NET_ACT_SAMPLE=m +CONFIG_NET_ACT_NAT=m +CONFIG_NET_ACT_PEDIT=m +CONFIG_NET_ACT_SIMP=m +CONFIG_NET_ACT_SKBEDIT=m +CONFIG_NET_ACT_CSUM=m +# CONFIG_NET_ACT_MPLS is not set +CONFIG_NET_ACT_VLAN=m +CONFIG_NET_ACT_BPF=m +CONFIG_NET_ACT_CONNMARK=m +CONFIG_NET_ACT_CTINFO=m +CONFIG_NET_ACT_SKBMOD=m +CONFIG_NET_ACT_IFE=m +CONFIG_NET_ACT_TUNNEL_KEY=m +CONFIG_NET_ACT_CT=m +CONFIG_NET_ACT_GATE=m +CONFIG_NET_IFE_SKBMARK=m +CONFIG_NET_IFE_SKBPRIO=m +CONFIG_NET_IFE_SKBTCINDEX=m +# CONFIG_NET_TC_SKB_EXT is not set +CONFIG_NET_SCH_FIFO=y +CONFIG_DCB=y +CONFIG_DNS_RESOLVER=y +CONFIG_BATMAN_ADV=m +# CONFIG_BATMAN_ADV_BATMAN_V is not set +CONFIG_BATMAN_ADV_BLA=y +CONFIG_BATMAN_ADV_DAT=y +CONFIG_BATMAN_ADV_MCAST=y +# CONFIG_BATMAN_ADV_DEBUG is not set +# CONFIG_BATMAN_ADV_TRACING is not set +CONFIG_OPENVSWITCH=m +CONFIG_OPENVSWITCH_GRE=m +CONFIG_OPENVSWITCH_VXLAN=m +CONFIG_OPENVSWITCH_GENEVE=m +CONFIG_VSOCKETS=m +CONFIG_VSOCKETS_DIAG=m +CONFIG_VSOCKETS_LOOPBACK=m +CONFIG_VIRTIO_VSOCKETS=m +CONFIG_VIRTIO_VSOCKETS_COMMON=m +CONFIG_NETLINK_DIAG=m +CONFIG_MPLS=y +CONFIG_NET_MPLS_GSO=m +CONFIG_MPLS_ROUTING=m +CONFIG_MPLS_IPTUNNEL=m +CONFIG_NET_NSH=m +# CONFIG_HSR is not set +CONFIG_NET_SWITCHDEV=y +CONFIG_NET_L3_MASTER_DEV=y +CONFIG_QRTR=m +CONFIG_QRTR_TUN=m +# CONFIG_NET_NCSI is not set +CONFIG_PCPU_DEV_REFCNT=y +CONFIG_MAX_SKB_FRAGS=17 +CONFIG_RPS=y +CONFIG_RFS_ACCEL=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_XPS=y +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CGROUP_NET_CLASSID=y +CONFIG_NET_RX_BUSY_POLL=y +CONFIG_BQL=y +CONFIG_BPF_STREAM_PARSER=y +CONFIG_NET_FLOW_LIMIT=y + +# +# Network testing +# +CONFIG_NET_PKTGEN=m +# CONFIG_NET_DROP_MONITOR is not set +# end of Network testing +# end of Networking options + +CONFIG_CAN=m +CONFIG_CAN_RAW=m +CONFIG_CAN_BCM=m +CONFIG_CAN_GW=m +# CONFIG_CAN_J1939 is not set +# CONFIG_CAN_ISOTP is not set +CONFIG_BT=m +CONFIG_BT_BREDR=y +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m +CONFIG_BT_LE=y +CONFIG_BT_LE_L2CAP_ECRED=y +CONFIG_BT_6LOWPAN=m +# CONFIG_BT_LEDS is not set +CONFIG_BT_MSFTEXT=y +# CONFIG_BT_AOSPEXT is not set +CONFIG_BT_BRCMEXT=y +# CONFIG_BT_DEBUGFS is not set +# CONFIG_BT_SELFTEST is not set + +# +# Bluetooth device drivers +# +CONFIG_BT_INTEL=m +CONFIG_BT_BCM=m +CONFIG_BT_RTL=m +CONFIG_BT_QCA=m +CONFIG_BT_HCIBTUSB=m +# CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set +CONFIG_BT_HCIBTUSB_POLL_SYNC=y +CONFIG_BT_HCIBTUSB_BCM=y +# CONFIG_BT_HCIBTUSB_MTK is not set +CONFIG_BT_HCIBTUSB_RTL=y +CONFIG_BT_HCIBTSDIO=m +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_SERDEV=y +CONFIG_BT_HCIUART_H4=y +# CONFIG_BT_HCIUART_NOKIA is not set +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_LL=y +CONFIG_BT_HCIUART_3WIRE=y +CONFIG_BT_HCIUART_INTEL=y +CONFIG_BT_HCIUART_BCM=y +CONFIG_BT_HCIUART_RTL=y +CONFIG_BT_HCIUART_QCA=y +# CONFIG_BT_HCIUART_AG6XX is not set +CONFIG_BT_HCIUART_MRVL=y +# CONFIG_BT_HCIUART_AML is not set +CONFIG_BT_HCIBCM203X=m +CONFIG_BT_HCIBCM4377=m +CONFIG_BT_HCIBPA10X=m +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_BT_ATH3K=m +# CONFIG_BT_MTKSDIO is not set +# CONFIG_BT_MTKUART is not set +CONFIG_BT_HCIRSI=m +# CONFIG_BT_VIRTIO is not set +# CONFIG_BT_NXPUART is not set +# end of Bluetooth device drivers + +# CONFIG_AF_RXRPC is not set +# CONFIG_AF_KCM is not set +CONFIG_STREAM_PARSER=y +# CONFIG_MCTP is not set +CONFIG_FIB_RULES=y +CONFIG_WIRELESS=y +CONFIG_WEXT_CORE=y +CONFIG_WEXT_PROC=y +CONFIG_CFG80211=m +# CONFIG_NL80211_TESTMODE is not set +# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set +# CONFIG_CFG80211_CERTIFICATION_ONUS is not set +CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y +CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS=y +CONFIG_CFG80211_DEFAULT_PS=y +CONFIG_CFG80211_DEBUGFS=y +CONFIG_CFG80211_CRDA_SUPPORT=y +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=m +CONFIG_MAC80211_HAS_RC=y +CONFIG_MAC80211_RC_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" +CONFIG_MAC80211_MESH=y +CONFIG_MAC80211_LEDS=y +CONFIG_MAC80211_DEBUGFS=y +# CONFIG_MAC80211_MESSAGE_TRACING is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 +CONFIG_RFKILL=m +CONFIG_RFKILL_LEDS=y +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +CONFIG_NET_9P=m +CONFIG_NET_9P_FD=m +CONFIG_NET_9P_VIRTIO=m +# CONFIG_NET_9P_USBG is not set +# CONFIG_NET_9P_DEBUG is not set +CONFIG_CEPH_LIB=m +# CONFIG_CEPH_LIB_PRETTYDEBUG is not set +# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set +CONFIG_NFC=m +CONFIG_NFC_DIGITAL=m +CONFIG_NFC_NCI=m +# CONFIG_NFC_NCI_SPI is not set +# CONFIG_NFC_NCI_UART is not set +CONFIG_NFC_HCI=m +CONFIG_NFC_SHDLC=y + +# +# Near Field Communication (NFC) devices +# +# CONFIG_NFC_TRF7970A is not set +CONFIG_NFC_SIM=m +CONFIG_NFC_PORT100=m +# CONFIG_NFC_VIRTUAL_NCI is not set +# CONFIG_NFC_FDP is not set +CONFIG_NFC_PN544=m +CONFIG_NFC_PN544_I2C=m +# CONFIG_NFC_PN533_USB is not set +# CONFIG_NFC_PN533_I2C is not set +# CONFIG_NFC_PN532_UART is not set +CONFIG_NFC_MICROREAD=m +CONFIG_NFC_MICROREAD_I2C=m +CONFIG_NFC_MRVL=m +CONFIG_NFC_MRVL_USB=m +# CONFIG_NFC_MRVL_I2C is not set +CONFIG_NFC_ST21NFCA=m +CONFIG_NFC_ST21NFCA_I2C=m +# CONFIG_NFC_ST_NCI_I2C is not set +# CONFIG_NFC_ST_NCI_SPI is not set +# CONFIG_NFC_NXP_NCI is not set +CONFIG_NFC_S3FWRN5=m +CONFIG_NFC_S3FWRN5_I2C=m +# CONFIG_NFC_S3FWRN82_UART is not set +# CONFIG_NFC_ST95HF is not set +# end of Near Field Communication (NFC) devices + +CONFIG_PSAMPLE=m +CONFIG_NET_IFE=m +CONFIG_LWTUNNEL=y +CONFIG_LWTUNNEL_BPF=y +CONFIG_DST_CACHE=y +CONFIG_GRO_CELLS=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_NET_DEVLINK=y +CONFIG_PAGE_POOL=y +CONFIG_PAGE_POOL_STATS=y +CONFIG_FAILOVER=m +CONFIG_ETHTOOL_NETLINK=y + +# +# Device Drivers +# +CONFIG_ARM_AMBA=y +CONFIG_HAVE_PCI=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_PCI=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_SYSCALL=y +CONFIG_PCIEPORTBUS=y +CONFIG_HOTPLUG_PCI_PCIE=y +CONFIG_PCIEAER=y +CONFIG_PCIEAER_INJECT=m +CONFIG_PCIE_ECRC=y +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set +CONFIG_PCIE_PME=y +# CONFIG_PCIE_DPC is not set +# CONFIG_PCIE_PTM is not set +CONFIG_PCI_MSI=y +CONFIG_PCI_QUIRKS=y +# CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set +CONFIG_PCI_STUB=m +# CONFIG_PCI_PF_STUB is not set +CONFIG_PCI_ATS=y +# CONFIG_PCI_TSM is not set +# CONFIG_PCI_DOE is not set +CONFIG_PCI_ECAM=y +CONFIG_PCI_IOV=y +# CONFIG_PCI_NPEM is not set +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y +# CONFIG_PCIE_TPH is not set +CONFIG_PCI_LABEL=y +CONFIG_PCI_DYNAMIC_OF_NODES=y +# CONFIG_PCIE_BUS_TUNE_OFF is not set +CONFIG_PCIE_BUS_DEFAULT=y +# CONFIG_PCIE_BUS_SAFE is not set +# CONFIG_PCIE_BUS_PERFORMANCE is not set +# CONFIG_PCIE_BUS_PEER2PEER is not set +CONFIG_VGA_ARB=y +CONFIG_VGA_ARB_MAX_GPUS=16 +CONFIG_HOTPLUG_PCI=y +# CONFIG_HOTPLUG_PCI_CPCI is not set +# CONFIG_HOTPLUG_PCI_OCTEONEP is not set +# CONFIG_HOTPLUG_PCI_SHPC is not set + +# +# PCI controller drivers +# +CONFIG_PCI_HOST_COMMON=y +# CONFIG_PCIE_ALTERA is not set +CONFIG_PCIE_APPLE_MSI_DOORBELL_ADDR=0xfffff000 +CONFIG_PCIE_APPLE=y +# CONFIG_PCI_HOST_THUNDER_PEM is not set +# CONFIG_PCI_HOST_THUNDER_ECAM is not set +# CONFIG_PCI_FTPCI100 is not set +# CONFIG_PCI_HOST_GENERIC is not set +# CONFIG_PCI_XGENE is not set +# CONFIG_PCIE_XILINX is not set + +# +# Cadence-based PCIe controllers +# +# CONFIG_PCIE_CADENCE_PLAT_HOST is not set +# end of Cadence-based PCIe controllers + +# +# DesignWare-based PCIe controllers +# +# CONFIG_PCIE_AL is not set +# CONFIG_PCIE_AMD_MDB is not set +# CONFIG_PCI_MESON is not set +# CONFIG_PCI_HISI is not set +# CONFIG_PCIE_KIRIN is not set +# CONFIG_PCIE_DW_PLAT_HOST is not set +# end of DesignWare-based PCIe controllers + +# +# Mobiveil-based PCIe controllers +# +# end of Mobiveil-based PCIe controllers + +# +# PLDA-based PCIe controllers +# +# CONFIG_PCIE_MICROCHIP_HOST is not set +# end of PLDA-based PCIe controllers +# end of PCI controller drivers + +# +# PCI Endpoint +# +# CONFIG_PCI_ENDPOINT is not set +# end of PCI Endpoint + +# +# PCI switch controller drivers +# +# CONFIG_PCI_SW_SWITCHTEC is not set +# end of PCI switch controller drivers + +CONFIG_PCI_PWRCTRL=y +CONFIG_PCI_PWRCTRL_GENERIC=y +# CONFIG_PCI_PWRCTRL_TC9563 is not set +# CONFIG_CXL_BUS is not set +# CONFIG_PCCARD is not set +# CONFIG_RAPIDIO is not set +# CONFIG_PC104 is not set + +# +# Generic Driver Options +# +# CONFIG_UEVENT_HELPER is not set +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_DEVTMPFS_SAFE is not set +CONFIG_DRIVER_DEFERRED_PROBE_TIMEOUT=10 +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y + +# +# Firmware loader +# +CONFIG_FW_LOADER=y +CONFIG_FW_LOADER_DEBUG=y +CONFIG_RUST_FW_LOADER_ABSTRACTIONS=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_FW_LOADER_USER_HELPER is not set +CONFIG_FW_LOADER_COMPRESS=y +CONFIG_FW_LOADER_COMPRESS_XZ=y +CONFIG_FW_LOADER_COMPRESS_ZSTD=y +CONFIG_FW_CACHE=y +# CONFIG_FW_UPLOAD is not set +# end of Firmware loader + +CONFIG_WANT_DEV_COREDUMP=y +CONFIG_ALLOW_DEV_COREDUMP=y +CONFIG_DEV_COREDUMP=y +# CONFIG_DEBUG_DRIVER is not set +CONFIG_DEBUG_DEVRES=y +# CONFIG_DEBUG_TEST_DRIVER_REMOVE is not set +# CONFIG_TEST_ASYNC_DRIVER_PROBE is not set +CONFIG_GENERIC_CPU_DEVICES=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_SPMI=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y +# CONFIG_DMA_FENCE_TRACE is not set +CONFIG_GENERIC_ARCH_TOPOLOGY=y +# CONFIG_FW_DEVLINK_SYNC_STATE_TIMEOUT is not set +# end of Generic Driver Options + +# +# Bus devices +# +# CONFIG_MOXTET is not set +# CONFIG_VEXPRESS_CONFIG is not set +# CONFIG_MHI_BUS is not set +# CONFIG_MHI_BUS_EP is not set +# end of Bus devices + +# CONFIG_CACHEMAINT_FOR_HOTPLUG is not set +CONFIG_CONNECTOR=y +CONFIG_PROC_EVENTS=y + +# +# Firmware Drivers +# + +# +# ARM System Control and Management Interface Protocol +# +# CONFIG_ARM_SCMI_PROTOCOL is not set +# end of ARM System Control and Management Interface Protocol + +# CONFIG_ARM_SDE_INTERFACE is not set +# CONFIG_FIRMWARE_MEMMAP is not set +CONFIG_DMIID=y +CONFIG_DMI_SYSFS=y +# CONFIG_FW_CFG_SYSFS is not set +# CONFIG_SYSFB_SIMPLEFB is not set +# CONFIG_ARM_FFA_TRANSPORT is not set +CONFIG_FW_CS_DSP=m +# CONFIG_GOOGLE_FIRMWARE is not set + +# +# EFI (Extensible Firmware Interface) Support +# +CONFIG_EFI_ESRT=y +CONFIG_EFI_VARS_PSTORE=y +CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE=y +CONFIG_EFI_PARAMS_FROM_FDT=y +CONFIG_EFI_RUNTIME_WRAPPERS=y +CONFIG_EFI_GENERIC_STUB=y +# CONFIG_EFI_ZBOOT is not set +# CONFIG_EFI_ARMSTUB_DTB_LOADER is not set +CONFIG_EFI_BOOTLOADER_CONTROL=y +# CONFIG_EFI_CAPSULE_LOADER is not set +# CONFIG_EFI_TEST is not set +# CONFIG_RESET_ATTACK_MITIGATION is not set +# CONFIG_EFI_DISABLE_PCI_DMA is not set +CONFIG_EFI_EARLYCON=y +# CONFIG_EFI_DISABLE_RUNTIME is not set +# CONFIG_EFI_COCO_SECRET is not set +# CONFIG_OVMF_DEBUG_LOG is not set +# end of EFI (Extensible Firmware Interface) Support + +CONFIG_ARM_PSCI_FW=y +# CONFIG_ARM_PSCI_CHECKER is not set + +# +# Qualcomm firmware drivers +# +# end of Qualcomm firmware drivers + +CONFIG_HAVE_ARM_SMCCC=y +CONFIG_HAVE_ARM_SMCCC_DISCOVERY=y +# CONFIG_ARM_SMCCC_SOC_ID is not set + +# +# Tegra firmware driver +# +# end of Tegra firmware driver +# end of Firmware Drivers + +# CONFIG_FWCTL is not set +CONFIG_GNSS=m +CONFIG_GNSS_SERIAL=m +CONFIG_GNSS_MTK_SERIAL=m +CONFIG_GNSS_SIRF_SERIAL=m +CONFIG_GNSS_UBX_SERIAL=m +CONFIG_GNSS_USB=m +CONFIG_MTD=y +# CONFIG_MTD_TESTS is not set + +# +# Partition parsers +# +# CONFIG_MTD_CMDLINE_PARTS is not set +CONFIG_MTD_OF_PARTS=m +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +# end of Partition parsers + +# +# User Modules And Translation Layers +# +CONFIG_MTD_BLKDEVS=m +CONFIG_MTD_BLOCK=m +# CONFIG_MTD_BLOCK_RO is not set + +# +# Note that in some cases UBI block is preferred. See MTD_UBI_BLOCK. +# +# CONFIG_FTL is not set +# CONFIG_NFTL is not set +# CONFIG_INFTL is not set +# CONFIG_RFD_FTL is not set +# CONFIG_SSFDC is not set +# CONFIG_SM_FTL is not set +# CONFIG_MTD_OOPS is not set +# CONFIG_MTD_SWAP is not set +# CONFIG_MTD_PARTITIONED_MASTER is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=m +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=m +# CONFIG_MTD_CFI_ADV_OPTIONS is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +CONFIG_MTD_CFI_INTELEXT=m +CONFIG_MTD_CFI_AMDSTD=m +CONFIG_MTD_CFI_STAA=m +CONFIG_MTD_CFI_UTIL=m +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# end of RAM/ROM/Flash chip drivers + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +# CONFIG_MTD_PHYSMAP is not set +# CONFIG_MTD_PLATRAM is not set +# end of Mapping drivers for chip access + +# +# Self-contained MTD device drivers +# +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_DATAFLASH is not set +# CONFIG_MTD_MCHP23K256 is not set +# CONFIG_MTD_MCHP48L640 is not set +# CONFIG_MTD_SST25L is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOCG3 is not set +# end of Self-contained MTD device drivers + +# +# NAND +# +# CONFIG_MTD_ONENAND is not set +# CONFIG_MTD_RAW_NAND is not set +# CONFIG_MTD_SPI_NAND is not set + +# +# ECC engine support +# +# CONFIG_MTD_NAND_ECC_SW_HAMMING is not set +# CONFIG_MTD_NAND_ECC_SW_BCH is not set +# CONFIG_MTD_NAND_ECC_MXIC is not set +# end of ECC engine support +# end of NAND + +# +# LPDDR & LPDDR2 PCM memory drivers +# +# CONFIG_MTD_LPDDR is not set +# end of LPDDR & LPDDR2 PCM memory drivers + +CONFIG_MTD_SPI_NOR=m +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y +# CONFIG_MTD_SPI_NOR_SWP_DISABLE is not set +# CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE is not set +CONFIG_MTD_SPI_NOR_SWP_KEEP=y +# CONFIG_MTD_UBI is not set +# CONFIG_MTD_HYPERBUS is not set +CONFIG_DTC=y +CONFIG_OF=y +# CONFIG_OF_UNITTEST is not set +CONFIG_OF_FLATTREE=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_KOBJ=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_IRQ=y +CONFIG_OF_RESERVED_MEM=y +CONFIG_OF_RESOLVE=y +CONFIG_OF_OVERLAY=y +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +CONFIG_BLK_DEV_NULL_BLK=m +# CONFIG_BLK_DEV_RUST_NULL is not set +CONFIG_CDROM=y +# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set +CONFIG_ZRAM=m +CONFIG_ZRAM_BACKEND_LZ4=y +CONFIG_ZRAM_BACKEND_LZ4HC=y +CONFIG_ZRAM_BACKEND_ZSTD=y +CONFIG_ZRAM_BACKEND_DEFLATE=y +CONFIG_ZRAM_BACKEND_842=y +CONFIG_ZRAM_BACKEND_LZO=y +CONFIG_ZRAM_DEF_COMP_LZORLE=y +# CONFIG_ZRAM_DEF_COMP_LZO is not set +# CONFIG_ZRAM_DEF_COMP_LZ4 is not set +# CONFIG_ZRAM_DEF_COMP_LZ4HC is not set +# CONFIG_ZRAM_DEF_COMP_ZSTD is not set +# CONFIG_ZRAM_DEF_COMP_DEFLATE is not set +# CONFIG_ZRAM_DEF_COMP_842 is not set +CONFIG_ZRAM_DEF_COMP="lzo-rle" +CONFIG_ZRAM_WRITEBACK=y +# CONFIG_ZRAM_TRACK_ENTRY_ACTIME is not set +# CONFIG_ZRAM_MEMORY_TRACKING is not set +CONFIG_ZRAM_MULTI_COMP=y +CONFIG_BLK_DEV_LOOP=m +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 +CONFIG_BLK_DEV_DRBD=m +# CONFIG_DRBD_FAULT_INJECTION is not set +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=16384 +CONFIG_ATA_OVER_ETH=m +CONFIG_VIRTIO_BLK=y +CONFIG_BLK_DEV_RBD=m +# CONFIG_BLK_DEV_UBLK is not set +# CONFIG_BLK_DEV_ZONED_LOOP is not set + +# +# NVME Support +# +CONFIG_NVME_CORE=y +CONFIG_BLK_DEV_NVME=y +CONFIG_NVME_MULTIPATH=y +CONFIG_NVME_VERBOSE_ERRORS=y +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_FC is not set +# CONFIG_NVME_TCP is not set +# CONFIG_NVME_HOST_AUTH is not set +CONFIG_NVME_APPLE=y +# CONFIG_NVME_TARGET is not set +# end of NVME Support + +# +# Misc devices +# +# CONFIG_AD525X_DPOT is not set +# CONFIG_DUMMY_IRQ is not set +# CONFIG_PHANTOM is not set +# CONFIG_RPMB is not set +# CONFIG_TI_FPC202 is not set +CONFIG_TIFM_CORE=y +# CONFIG_TIFM_7XX1 is not set +# CONFIG_ICS932S401 is not set +CONFIG_ENCLOSURE_SERVICES=m +# CONFIG_HI6421V600_IRQ is not set +# CONFIG_HP_ILO is not set +# CONFIG_APDS9802ALS is not set +# CONFIG_ISL29003 is not set +# CONFIG_ISL29020 is not set +# CONFIG_SENSORS_TSL2550 is not set +# CONFIG_SENSORS_BH1770 is not set +# CONFIG_SENSORS_APDS990X is not set +# CONFIG_HMC6352 is not set +# CONFIG_DS1682 is not set +# CONFIG_LATTICE_ECP3_CONFIG is not set +# CONFIG_SRAM is not set +# CONFIG_DW_XDATA_PCIE is not set +# CONFIG_PCI_ENDPOINT_TEST is not set +# CONFIG_XILINX_SDFEC is not set +# CONFIG_HISI_HIKEY_USB is not set +# CONFIG_OPEN_DICE is not set +CONFIG_NTSYNC=y +# CONFIG_VCPU_STALL_DETECTOR is not set +# CONFIG_NSM is not set +# CONFIG_MCHP_LAN966X_PCI is not set +# CONFIG_C2PORT is not set + +# +# EEPROM support +# +CONFIG_EEPROM_AT24=m +# CONFIG_EEPROM_AT25 is not set +# CONFIG_EEPROM_MAX6875 is not set +CONFIG_EEPROM_93CX6=m +# CONFIG_EEPROM_93XX46 is not set +# CONFIG_EEPROM_IDT_89HPESX is not set +# CONFIG_EEPROM_EE1004 is not set +# CONFIG_EEPROM_M24LR is not set +# end of EEPROM support + +CONFIG_CB710_CORE=y +# CONFIG_CB710_DEBUG is not set +CONFIG_CB710_DEBUG_ASSUMPTIONS=y +# CONFIG_SENSORS_LIS3_SPI is not set +# CONFIG_SENSORS_LIS3_I2C is not set +# CONFIG_ALTERA_STAPL is not set +# CONFIG_VMWARE_VMCI is not set +# CONFIG_GENWQE is not set +# CONFIG_BCM_VK is not set +# CONFIG_MISC_ALCOR_PCI is not set +# CONFIG_MISC_RTSX_PCI is not set +# CONFIG_MISC_RTSX_USB is not set +CONFIG_UACCE=m +# CONFIG_PVPANIC is not set +# CONFIG_GP_PCI1XXXX is not set +# CONFIG_KEBA_CP500 is not set +# CONFIG_AMD_SBRMI_I2C is not set +# CONFIG_MISC_RP1 is not set +# end of Misc devices + +# +# SCSI device support +# +CONFIG_SCSI_MOD=y +CONFIG_RAID_ATTRS=m +CONFIG_SCSI_COMMON=y +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +CONFIG_SCSI_NETLINK=y +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_ST=m +CONFIG_BLK_DEV_SR=y +CONFIG_CHR_DEV_SG=y +CONFIG_BLK_DEV_BSG=y +CONFIG_CHR_DEV_SCH=m +CONFIG_SCSI_ENCLOSURE=m +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y + +# +# SCSI Transports +# +CONFIG_SCSI_SPI_ATTRS=m +CONFIG_SCSI_FC_ATTRS=m +CONFIG_SCSI_ISCSI_ATTRS=m +CONFIG_SCSI_SAS_ATTRS=m +CONFIG_SCSI_SAS_LIBSAS=m +CONFIG_SCSI_SAS_HOST_SMP=y +CONFIG_SCSI_SRP_ATTRS=m +# end of SCSI Transports + +CONFIG_SCSI_LOWLEVEL=y +CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m +# CONFIG_SCSI_CXGB3_ISCSI is not set +# CONFIG_SCSI_CXGB4_ISCSI is not set +# CONFIG_SCSI_BNX2_ISCSI is not set +# CONFIG_BE2ISCSI is not set +# CONFIG_BLK_DEV_3W_XXXX_RAID is not set +# CONFIG_SCSI_HPSA is not set +# CONFIG_SCSI_3W_9XXX is not set +# CONFIG_SCSI_3W_SAS is not set +# CONFIG_SCSI_ACARD is not set +# CONFIG_SCSI_AACRAID is not set +# CONFIG_SCSI_AIC7XXX is not set +# CONFIG_SCSI_AIC79XX is not set +# CONFIG_SCSI_AIC94XX is not set +# CONFIG_SCSI_MVSAS is not set +# CONFIG_SCSI_MVUMI is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_ARCMSR is not set +# CONFIG_SCSI_ESAS2R is not set +# CONFIG_MEGARAID_NEWGEN is not set +# CONFIG_MEGARAID_LEGACY is not set +# CONFIG_MEGARAID_SAS is not set +# CONFIG_SCSI_MPT3SAS is not set +# CONFIG_SCSI_MPT2SAS is not set +# CONFIG_SCSI_MPI3MR is not set +# CONFIG_SCSI_SMARTPQI is not set +# CONFIG_SCSI_HPTIOP is not set +# CONFIG_SCSI_BUSLOGIC is not set +# CONFIG_SCSI_MYRB is not set +# CONFIG_SCSI_MYRS is not set +# CONFIG_LIBFC is not set +# CONFIG_SCSI_SNIC is not set +# CONFIG_SCSI_DMX3191D is not set +# CONFIG_SCSI_FDOMAIN_PCI is not set +# CONFIG_SCSI_IPS is not set +# CONFIG_SCSI_INITIO is not set +# CONFIG_SCSI_INIA100 is not set +# CONFIG_SCSI_STEX is not set +# CONFIG_SCSI_SYM53C8XX_2 is not set +# CONFIG_SCSI_IPR is not set +# CONFIG_SCSI_QLOGIC_1280 is not set +# CONFIG_SCSI_QLA_FC is not set +# CONFIG_SCSI_QLA_ISCSI is not set +# CONFIG_SCSI_LPFC is not set +# CONFIG_SCSI_EFCT is not set +# CONFIG_SCSI_DC395x is not set +# CONFIG_SCSI_AM53C974 is not set +# CONFIG_SCSI_WD719X is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_PMCRAID is not set +# CONFIG_SCSI_PM8001 is not set +# CONFIG_SCSI_BFA_FC is not set +CONFIG_SCSI_VIRTIO=y +# CONFIG_SCSI_CHELSIO_FCOE is not set +CONFIG_SCSI_DH=y +CONFIG_SCSI_DH_RDAC=m +CONFIG_SCSI_DH_HP_SW=m +CONFIG_SCSI_DH_EMC=m +CONFIG_SCSI_DH_ALUA=m +# end of SCSI device support + +# CONFIG_ATA is not set +CONFIG_MD=y +CONFIG_BLK_DEV_MD=y +CONFIG_MD_BITMAP=y +# CONFIG_MD_LLBITMAP is not set +CONFIG_MD_AUTODETECT=y +CONFIG_MD_BITMAP_FILE=y +# CONFIG_MD_LINEAR is not set +CONFIG_MD_RAID0=m +CONFIG_MD_RAID1=m +CONFIG_MD_RAID10=m +CONFIG_MD_RAID456=m +CONFIG_MD_CLUSTER=m +CONFIG_BCACHE=m +# CONFIG_BCACHE_DEBUG is not set +# CONFIG_BCACHE_ASYNC_REGISTRATION is not set +CONFIG_BLK_DEV_DM_BUILTIN=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_DEBUG=y +CONFIG_DM_BUFIO=y +# CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING is not set +CONFIG_DM_BIO_PRISON=m +CONFIG_DM_PERSISTENT_DATA=m +# CONFIG_DM_UNSTRIPED is not set +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=y +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m +CONFIG_DM_CACHE_SMQ=m +CONFIG_DM_WRITECACHE=m +# CONFIG_DM_EBS is not set +# CONFIG_DM_ERA is not set +# CONFIG_DM_CLONE is not set +CONFIG_DM_MIRROR=y +CONFIG_DM_LOG_USERSPACE=m +CONFIG_DM_RAID=m +CONFIG_DM_ZERO=y +CONFIG_DM_MULTIPATH=m +CONFIG_DM_MULTIPATH_QL=m +CONFIG_DM_MULTIPATH_ST=m +# CONFIG_DM_MULTIPATH_HST is not set +# CONFIG_DM_MULTIPATH_IOA is not set +CONFIG_DM_DELAY=m +CONFIG_DM_DUST=m +CONFIG_DM_INIT=y +CONFIG_DM_UEVENT=y +CONFIG_DM_FLAKEY=m +CONFIG_DM_VERITY=m +# CONFIG_DM_VERITY_VERIFY_ROOTHASH_SIG is not set +CONFIG_DM_VERITY_FEC=y +CONFIG_DM_SWITCH=m +CONFIG_DM_LOG_WRITES=m +CONFIG_DM_INTEGRITY=m +CONFIG_DM_ZONED=m +CONFIG_DM_AUDIT=y +# CONFIG_DM_VDO is not set +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m +CONFIG_LOOPBACK_TARGET=m +CONFIG_ISCSI_TARGET=m +# CONFIG_REMOTE_TARGET is not set +# CONFIG_FUSION is not set + +# +# IEEE 1394 (FireWire) support +# +# CONFIG_FIREWIRE is not set +# CONFIG_FIREWIRE_NOSY is not set +# end of IEEE 1394 (FireWire) support + +CONFIG_NETDEVICES=y +CONFIG_MII=m +CONFIG_NET_CORE=y +CONFIG_BONDING=m +CONFIG_DUMMY=m +CONFIG_WIREGUARD=m +# CONFIG_WIREGUARD_DEBUG is not set +# CONFIG_OVPN is not set +CONFIG_EQUALIZER=m +CONFIG_NET_FC=y +CONFIG_IFB=m +CONFIG_NET_TEAM=m +CONFIG_NET_TEAM_MODE_BROADCAST=m +CONFIG_NET_TEAM_MODE_ROUNDROBIN=m +CONFIG_NET_TEAM_MODE_RANDOM=m +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m +CONFIG_NET_TEAM_MODE_LOADBALANCE=m +CONFIG_MACVLAN=m +CONFIG_MACVTAP=m +CONFIG_IPVLAN_L3S=y +CONFIG_IPVLAN=m +CONFIG_IPVTAP=m +CONFIG_VXLAN=m +CONFIG_GENEVE=m +# CONFIG_BAREUDP is not set +# CONFIG_GTP is not set +# CONFIG_PFCP is not set +# CONFIG_AMT is not set +# CONFIG_MACSEC is not set +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +# CONFIG_NETCONSOLE_EXTENDED_LOG is not set +CONFIG_NETPOLL=y +CONFIG_NET_POLL_CONTROLLER=y +CONFIG_TUN=m +CONFIG_TAP=m +# CONFIG_TUN_VNET_CROSS_LE is not set +CONFIG_VETH=m +CONFIG_VIRTIO_NET=m +CONFIG_NLMON=m +# CONFIG_NETKIT is not set +CONFIG_NET_VRF=m +# CONFIG_VSOCKMON is not set +# CONFIG_ARCNET is not set +# CONFIG_ATM_DRIVERS is not set + +# +# Distributed Switch Architecture drivers +# +CONFIG_B53=m +# CONFIG_B53_SPI_DRIVER is not set +# CONFIG_B53_MDIO_DRIVER is not set +# CONFIG_B53_MMAP_DRIVER is not set +# CONFIG_B53_SRAB_DRIVER is not set +# CONFIG_B53_SERDES is not set +CONFIG_NET_DSA_BCM_SF2=m +# CONFIG_NET_DSA_LOOP is not set +# CONFIG_NET_DSA_HIRSCHMANN_HELLCREEK is not set +# CONFIG_NET_DSA_LANTIQ_GSWIP is not set +# CONFIG_NET_DSA_MXL_GSW1XX is not set +# CONFIG_NET_DSA_MT7530 is not set +CONFIG_NET_DSA_MV88E6060=m +# CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON is not set +CONFIG_NET_DSA_MV88E6XXX=m +CONFIG_NET_DSA_MV88E6XXX_PTP=y +CONFIG_NET_DSA_MV88E6XXX_LEDS=y +# CONFIG_NET_DSA_MXL862 is not set +# CONFIG_NET_DSA_AR9331 is not set +CONFIG_NET_DSA_QCA8K=m +# CONFIG_NET_DSA_QCA8K_LEDS_SUPPORT is not set +# CONFIG_NET_DSA_SJA1105 is not set +# CONFIG_NET_DSA_XRS700X_I2C is not set +# CONFIG_NET_DSA_XRS700X_MDIO is not set +# CONFIG_NET_DSA_REALTEK is not set +# CONFIG_NET_DSA_KS8995 is not set +# CONFIG_NET_DSA_SMSC_LAN9303_I2C is not set +# CONFIG_NET_DSA_SMSC_LAN9303_MDIO is not set +# CONFIG_NET_DSA_VITESSE_VSC73XX_SPI is not set +# CONFIG_NET_DSA_VITESSE_VSC73XX_PLATFORM is not set +# CONFIG_NET_DSA_YT921X is not set +# end of Distributed Switch Architecture drivers + +CONFIG_ETHERNET=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_ALTERA_TSE is not set +# CONFIG_NET_VENDOR_AMAZON is not set +# CONFIG_NET_VENDOR_AMD is not set +CONFIG_NET_VENDOR_AQUANTIA=y +CONFIG_AQTION=m +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ASIX is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +CONFIG_NET_VENDOR_BROADCOM=y +# CONFIG_B44 is not set +# CONFIG_BCMGENET is not set +# CONFIG_BNX2 is not set +# CONFIG_CNIC is not set +CONFIG_TIGON3=m +CONFIG_TIGON3_HWMON=y +# CONFIG_BNX2X is not set +# CONFIG_SYSTEMPORT is not set +# CONFIG_BNXT is not set +# CONFIG_BNGE is not set +# CONFIG_NET_VENDOR_CADENCE is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_NET_VENDOR_DAVICOM is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_HISILICON is not set +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_JME is not set +CONFIG_NET_VENDOR_ADI=y +# CONFIG_ADIN1110 is not set +# CONFIG_NET_VENDOR_LITEX is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +CONFIG_NET_VENDOR_META=y +# CONFIG_FBNIC is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set +CONFIG_NET_VENDOR_MUCSE=y +# CONFIG_MGBE is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_FEALNX is not set +# CONFIG_NET_VENDOR_NI is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_ETHOC is not set +# CONFIG_NET_VENDOR_PENSANDO is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_REALTEK is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WANGXUN is not set +# CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_NET_VENDOR_XILINX is not set +# CONFIG_FDDI is not set +CONFIG_PHYLINK=m +CONFIG_PHYLIB=y +CONFIG_SWPHY=y +CONFIG_PHY_PACKAGE=y +CONFIG_LED_TRIGGER_PHY=y +CONFIG_PHYLIB_LEDS=y +CONFIG_FIXED_PHY=y +CONFIG_RUST_PHYLIB_ABSTRACTIONS=y +CONFIG_SFP=m + +# +# MII PHY device drivers +# +# CONFIG_AS21XXX_PHY is not set +# CONFIG_AIR_EN8811H_PHY is not set +CONFIG_AMD_PHY=m +# CONFIG_ADIN_PHY is not set +# CONFIG_ADIN1100_PHY is not set +# CONFIG_AMCC_QT2025_PHY is not set +# CONFIG_AQUANTIA_PHY is not set +CONFIG_AX88796B_PHY=m +# CONFIG_AX88796B_RUST_PHY is not set +CONFIG_BROADCOM_PHY=m +CONFIG_BCM54140_PHY=m +CONFIG_BCM7XXX_PHY=m +# CONFIG_BCM84881_PHY is not set +CONFIG_BCM87XX_PHY=m +CONFIG_BCM_NET_PHYLIB=m +CONFIG_BCM_NET_PHYPTP=m +CONFIG_CICADA_PHY=m +# CONFIG_CORTINA_PHY is not set +CONFIG_DAVICOM_PHY=m +CONFIG_ICPLUS_PHY=m +CONFIG_LXT_PHY=m +# CONFIG_INTEL_XWAY_PHY is not set +CONFIG_LSI_ET1011C_PHY=m +CONFIG_MARVELL_PHY=m +CONFIG_MARVELL_10G_PHY=m +# CONFIG_MARVELL_88Q2XXX_PHY is not set +# CONFIG_MARVELL_88X2222_PHY is not set +# CONFIG_MAXLINEAR_GPHY is not set +# CONFIG_MAXLINEAR_86110_PHY is not set +# CONFIG_MEDIATEK_GE_PHY is not set +CONFIG_MICREL_PHY=m +# CONFIG_MICROCHIP_T1S_PHY is not set +CONFIG_MICROCHIP_PHY=m +# CONFIG_MICROCHIP_T1_PHY is not set +# CONFIG_MICROSEMI_PHY is not set +# CONFIG_MOTORCOMM_PHY is not set +CONFIG_NATIONAL_PHY=m +# CONFIG_NXP_CBTX_PHY is not set +# CONFIG_NXP_C45_TJA11XX_PHY is not set +# CONFIG_NXP_TJA11XX_PHY is not set +# CONFIG_NCN26000_PHY is not set +CONFIG_QCOM_NET_PHYLIB=y +CONFIG_AT803X_PHY=y +# CONFIG_QCA83XX_PHY is not set +# CONFIG_QCA808X_PHY is not set +# CONFIG_QCA807X_PHY is not set +CONFIG_QSEMI_PHY=m +CONFIG_REALTEK_PHY=y +CONFIG_REALTEK_PHY_HWMON=y +# CONFIG_RENESAS_PHY is not set +CONFIG_ROCKCHIP_PHY=y +CONFIG_SMSC_PHY=m +CONFIG_STE10XP=m +# CONFIG_TERANETICS_PHY is not set +# CONFIG_DP83822_PHY is not set +# CONFIG_DP83TC811_PHY is not set +CONFIG_DP83848_PHY=m +CONFIG_DP83867_PHY=m +# CONFIG_DP83869_PHY is not set +# CONFIG_DP83TD510_PHY is not set +# CONFIG_DP83TG720_PHY is not set +CONFIG_VITESSE_PHY=m +# CONFIG_XILINX_GMII2RGMII is not set +# CONFIG_PSE_CONTROLLER is not set +CONFIG_CAN_DEV=m +CONFIG_CAN_VCAN=m +CONFIG_CAN_VXCAN=m +# CONFIG_CAN_NETLINK is not set +# CONFIG_CAN_DEBUG_DEVICES is not set +CONFIG_FWNODE_MDIO=y +CONFIG_OF_MDIO=y +CONFIG_MDIO_BITBANG=m +CONFIG_MDIO_BCM_UNIMAC=y +# CONFIG_MDIO_GPIO is not set +# CONFIG_MDIO_HISI_FEMAC is not set +CONFIG_MDIO_I2C=m +# CONFIG_MDIO_MVUSB is not set +# CONFIG_MDIO_MSCC_MIIM is not set +# CONFIG_MDIO_OCTEON is not set +# CONFIG_MDIO_IPQ4019 is not set +# CONFIG_MDIO_IPQ8064 is not set +# CONFIG_MDIO_THUNDER is not set + +# +# MDIO Multiplexers +# +CONFIG_MDIO_BUS_MUX=m +CONFIG_MDIO_BUS_MUX_GPIO=m +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +CONFIG_MDIO_BUS_MUX_MMIOREG=m + +# +# PCS device drivers +# +# CONFIG_PCS_XPCS is not set +# end of PCS device drivers + +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOATM=m +CONFIG_PPPOE=m +# CONFIG_PPPOE_HASH_BITS_1 is not set +# CONFIG_PPPOE_HASH_BITS_2 is not set +CONFIG_PPPOE_HASH_BITS_4=y +# CONFIG_PPPOE_HASH_BITS_8 is not set +CONFIG_PPPOE_HASH_BITS=4 +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_SLIP=m +CONFIG_SLHC=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +# CONFIG_SLIP_MODE_SLIP6 is not set +CONFIG_USB_NET_DRIVERS=y +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_LAN78XX=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_AX88179_178A=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +CONFIG_USB_NET_HUAWEI_CDC_NCM=m +CONFIG_USB_NET_CDC_MBIM=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_SR9700=m +CONFIG_USB_NET_SR9800=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_MCS7830=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET_ENABLE=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_KC2190=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_NET_CX82310_ETH=m +CONFIG_USB_NET_KALMIA=m +CONFIG_USB_NET_QMI_WWAN=m +CONFIG_USB_HSO=m +CONFIG_USB_NET_INT51X1=m +CONFIG_USB_IPHETH=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_VL600=m +CONFIG_USB_NET_CH9200=m +CONFIG_USB_NET_AQC111=m +CONFIG_USB_RTL8153_ECM=m +CONFIG_WLAN=y +# CONFIG_WLAN_VENDOR_ADMTEK is not set +CONFIG_ATH_COMMON=m +CONFIG_WLAN_VENDOR_ATH=y +# CONFIG_ATH_DEBUG is not set +# CONFIG_ATH5K is not set +# CONFIG_ATH5K_PCI is not set +CONFIG_ATH9K_HW=m +CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_BTCOEX_SUPPORT=y +# CONFIG_ATH9K is not set +CONFIG_ATH9K_HTC=m +# CONFIG_ATH9K_HTC_DEBUGFS is not set +CONFIG_CARL9170=m +CONFIG_CARL9170_LEDS=y +# CONFIG_CARL9170_DEBUGFS is not set +CONFIG_CARL9170_WPC=y +# CONFIG_CARL9170_HWRNG is not set +CONFIG_ATH6KL=m +# CONFIG_ATH6KL_SDIO is not set +CONFIG_ATH6KL_USB=m +# CONFIG_ATH6KL_DEBUG is not set +# CONFIG_ATH6KL_TRACING is not set +CONFIG_AR5523=m +# CONFIG_WIL6210 is not set +CONFIG_ATH10K=m +CONFIG_ATH10K_CE=y +# CONFIG_ATH10K_PCI is not set +# CONFIG_ATH10K_SDIO is not set +CONFIG_ATH10K_USB=m +# CONFIG_ATH10K_DEBUG is not set +CONFIG_ATH10K_DEBUGFS=y +CONFIG_ATH10K_LEDS=y +# CONFIG_ATH10K_SPECTRAL is not set +# CONFIG_ATH10K_TRACING is not set +# CONFIG_WCN36XX is not set +# CONFIG_ATH11K is not set +# CONFIG_ATH12K is not set +CONFIG_WLAN_VENDOR_ATMEL=y +CONFIG_AT76C50X_USB=m +CONFIG_WLAN_VENDOR_BROADCOM=y +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +CONFIG_BRCMUTIL=m +# CONFIG_BRCMSMAC is not set +CONFIG_BRCMFMAC=m +CONFIG_BRCMFMAC_PROTO_BCDC=y +CONFIG_BRCMFMAC_PROTO_MSGBUF=y +# CONFIG_BRCMFMAC_SDIO is not set +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +# CONFIG_BRCM_TRACING is not set +# CONFIG_BRCMDBG is not set +CONFIG_WLAN_VENDOR_INTEL=y +# CONFIG_IPW2100 is not set +# CONFIG_IPW2200 is not set +# CONFIG_IWL4965 is not set +# CONFIG_IWL3945 is not set +# CONFIG_IWLWIFI is not set +CONFIG_WLAN_VENDOR_INTERSIL=y +CONFIG_P54_COMMON=m +CONFIG_P54_USB=m +# CONFIG_P54_PCI is not set +# CONFIG_P54_SPI is not set +CONFIG_P54_LEDS=y +CONFIG_WLAN_VENDOR_MARVELL=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +# CONFIG_LIBERTAS_SDIO is not set +# CONFIG_LIBERTAS_SPI is not set +# CONFIG_LIBERTAS_DEBUG is not set +CONFIG_LIBERTAS_MESH=y +CONFIG_LIBERTAS_THINFIRM=m +# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set +CONFIG_LIBERTAS_THINFIRM_USB=m +CONFIG_MWIFIEX=m +# CONFIG_MWIFIEX_SDIO is not set +# CONFIG_MWIFIEX_PCIE is not set +CONFIG_MWIFIEX_USB=m +# CONFIG_MWL8K is not set +CONFIG_WLAN_VENDOR_MEDIATEK=y +CONFIG_MT7601U=m +CONFIG_MT76_CORE=m +CONFIG_MT76_LEDS=y +CONFIG_MT76_USB=m +CONFIG_MT76x02_LIB=m +CONFIG_MT76x02_USB=m +CONFIG_MT76_CONNAC_LIB=m +CONFIG_MT76x0_COMMON=m +CONFIG_MT76x0U=m +# CONFIG_MT76x0E is not set +CONFIG_MT76x2_COMMON=m +# CONFIG_MT76x2E is not set +CONFIG_MT76x2U=m +# CONFIG_MT7603E is not set +CONFIG_MT7615_COMMON=m +# CONFIG_MT7615E is not set +CONFIG_MT7663_USB_SDIO_COMMON=m +CONFIG_MT7663U=m +# CONFIG_MT7663S is not set +# CONFIG_MT7915E is not set +# CONFIG_MT7921E is not set +# CONFIG_MT7921S is not set +# CONFIG_MT7921U is not set +# CONFIG_MT7996E is not set +# CONFIG_MT7925E is not set +# CONFIG_MT7925U is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +# CONFIG_WLAN_VENDOR_PURELIFI is not set +CONFIG_WLAN_VENDOR_RALINK=y +CONFIG_RT2X00=m +# CONFIG_RT2400PCI is not set +# CONFIG_RT2500PCI is not set +# CONFIG_RT61PCI is not set +# CONFIG_RT2800PCI is not set +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT33XX=y +CONFIG_RT2800USB_RT35XX=y +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RT2800_LIB=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +CONFIG_RT2X00_LIB_DEBUGFS=y +# CONFIG_RT2X00_DEBUG is not set +CONFIG_WLAN_VENDOR_REALTEK=y +# CONFIG_RTL8180 is not set +CONFIG_RTL8187=m +CONFIG_RTL8187_LEDS=y +CONFIG_RTL_CARDS=m +# CONFIG_RTL8192CE is not set +# CONFIG_RTL8192SE is not set +# CONFIG_RTL8192DE is not set +# CONFIG_RTL8723AE is not set +# CONFIG_RTL8723BE is not set +# CONFIG_RTL8188EE is not set +# CONFIG_RTL8192EE is not set +# CONFIG_RTL8821AE is not set +CONFIG_RTL8192CU=m +# CONFIG_RTL8192DU is not set +CONFIG_RTLWIFI=m +CONFIG_RTLWIFI_USB=m +CONFIG_RTLWIFI_DEBUG=y +CONFIG_RTL8192C_COMMON=m +CONFIG_RTL8XXXU=m +# CONFIG_RTL8XXXU_UNTESTED is not set +# CONFIG_RTW88 is not set +# CONFIG_RTW89 is not set +CONFIG_WLAN_VENDOR_RSI=y +CONFIG_RSI_91X=m +CONFIG_RSI_DEBUGFS=y +# CONFIG_RSI_SDIO is not set +CONFIG_RSI_USB=m +CONFIG_RSI_COEX=y +CONFIG_WLAN_VENDOR_SILABS=y +# CONFIG_WFX is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set +CONFIG_WLAN_VENDOR_ZYDAS=y +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +# CONFIG_WLAN_VENDOR_QUANTENNA is not set +# CONFIG_MAC80211_HWSIM is not set +# CONFIG_VIRT_WIFI is not set +# CONFIG_WAN is not set +CONFIG_IEEE802154_DRIVERS=m +CONFIG_IEEE802154_FAKELB=m +# CONFIG_IEEE802154_AT86RF230 is not set +# CONFIG_IEEE802154_MRF24J40 is not set +# CONFIG_IEEE802154_CC2520 is not set +CONFIG_IEEE802154_ATUSB=m +# CONFIG_IEEE802154_ADF7242 is not set +# CONFIG_IEEE802154_CA8210 is not set +# CONFIG_IEEE802154_MCR20A is not set +# CONFIG_IEEE802154_HWSIM is not set + +# +# Wireless WAN +# +# CONFIG_WWAN is not set +# end of Wireless WAN + +# CONFIG_VMXNET3 is not set +# CONFIG_NETDEVSIM is not set +CONFIG_NET_FAILOVER=m + +# +# Input device support +# +CONFIG_INPUT=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_INPUT_SPARSEKMAP is not set +# CONFIG_INPUT_MATRIXKMAP is not set + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_JOYDEV=m +CONFIG_INPUT_EVDEV=y + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ADC is not set +# CONFIG_KEYBOARD_ADP5588 is not set +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_QT1050 is not set +# CONFIG_KEYBOARD_QT1070 is not set +# CONFIG_KEYBOARD_QT2160 is not set +# CONFIG_KEYBOARD_DLINK_DIR685 is not set +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_GPIO=m +CONFIG_KEYBOARD_GPIO_POLLED=m +# CONFIG_KEYBOARD_TCA8418 is not set +# CONFIG_KEYBOARD_MATRIX is not set +# CONFIG_KEYBOARD_CHARLIEPLEX is not set +# CONFIG_KEYBOARD_LM8323 is not set +# CONFIG_KEYBOARD_LM8333 is not set +# CONFIG_KEYBOARD_MAX7359 is not set +# CONFIG_KEYBOARD_MPR121 is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_OPENCORES is not set +# CONFIG_KEYBOARD_PINEPHONE is not set +# CONFIG_KEYBOARD_SAMSUNG is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_OMAP4 is not set +# CONFIG_KEYBOARD_TM2_TOUCHKEY is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_CAP11XX is not set +# CONFIG_KEYBOARD_BCM is not set +# CONFIG_KEYBOARD_CYPRESS_SF is not set +CONFIG_INPUT_MOUSE=y +# CONFIG_MOUSE_PS2 is not set +# CONFIG_MOUSE_SERIAL is not set +CONFIG_MOUSE_APPLETOUCH=m +CONFIG_MOUSE_BCM5974=m +# CONFIG_MOUSE_CYAPA is not set +# CONFIG_MOUSE_ELAN_I2C is not set +# CONFIG_MOUSE_VSXXXAA is not set +# CONFIG_MOUSE_GPIO is not set +# CONFIG_MOUSE_SYNAPTICS_I2C is not set +CONFIG_MOUSE_SYNAPTICS_USB=m +CONFIG_INPUT_JOYSTICK=y +# CONFIG_JOYSTICK_ANALOG is not set +# CONFIG_JOYSTICK_A3D is not set +# CONFIG_JOYSTICK_ADC is not set +# CONFIG_JOYSTICK_ADI is not set +# CONFIG_JOYSTICK_COBRA is not set +# CONFIG_JOYSTICK_GF2K is not set +# CONFIG_JOYSTICK_GRIP is not set +# CONFIG_JOYSTICK_GRIP_MP is not set +# CONFIG_JOYSTICK_GUILLEMOT is not set +# CONFIG_JOYSTICK_INTERACT is not set +# CONFIG_JOYSTICK_SIDEWINDER is not set +# CONFIG_JOYSTICK_TMDC is not set +CONFIG_JOYSTICK_IFORCE=m +CONFIG_JOYSTICK_IFORCE_USB=m +# CONFIG_JOYSTICK_WARRIOR is not set +# CONFIG_JOYSTICK_MAGELLAN is not set +# CONFIG_JOYSTICK_SPACEORB is not set +# CONFIG_JOYSTICK_SPACEBALL is not set +# CONFIG_JOYSTICK_STINGER is not set +# CONFIG_JOYSTICK_TWIDJOY is not set +# CONFIG_JOYSTICK_ZHENHUA is not set +# CONFIG_JOYSTICK_AS5011 is not set +# CONFIG_JOYSTICK_JOYDUMP is not set +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +# CONFIG_JOYSTICK_PSXPAD_SPI is not set +# CONFIG_JOYSTICK_PXRC is not set +# CONFIG_JOYSTICK_QWIIC is not set +# CONFIG_JOYSTICK_FSIA6B is not set +# CONFIG_JOYSTICK_SENSEHAT is not set +# CONFIG_JOYSTICK_SEESAW is not set +CONFIG_INPUT_TABLET=y +CONFIG_TABLET_USB_ACECAD=m +CONFIG_TABLET_USB_AIPTEK=m +CONFIG_TABLET_USB_HANWANG=m +CONFIG_TABLET_USB_KBTAB=m +CONFIG_TABLET_USB_PEGASUS=m +# CONFIG_TABLET_SERIAL_WACOM4 is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_AD7877 is not set +# CONFIG_TOUCHSCREEN_AD7879 is not set +# CONFIG_TOUCHSCREEN_ADC is not set +CONFIG_TOUCHSCREEN_APPLE_Z2=m +# CONFIG_TOUCHSCREEN_AR1021_I2C is not set +# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set +# CONFIG_TOUCHSCREEN_BU21013 is not set +# CONFIG_TOUCHSCREEN_BU21029 is not set +# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set +# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set +# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set +# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set +# CONFIG_TOUCHSCREEN_CYTTSP5 is not set +# CONFIG_TOUCHSCREEN_DYNAPRO is not set +# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set +# CONFIG_TOUCHSCREEN_EETI is not set +# CONFIG_TOUCHSCREEN_EGALAX is not set +# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GOODIX is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_I2C is not set +# CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI is not set +# CONFIG_TOUCHSCREEN_HIDEEP is not set +# CONFIG_TOUCHSCREEN_HIMAX_HX852X is not set +# CONFIG_TOUCHSCREEN_HYCON_HY46XX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set +# CONFIG_TOUCHSCREEN_HYNITRON_CST816X is not set +# CONFIG_TOUCHSCREEN_ILI210X is not set +# CONFIG_TOUCHSCREEN_ILITEK is not set +# CONFIG_TOUCHSCREEN_S6SY761 is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_EKTF2127 is not set +# CONFIG_TOUCHSCREEN_ELAN is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set +# CONFIG_TOUCHSCREEN_WACOM_I2C is not set +# CONFIG_TOUCHSCREEN_MAX11801 is not set +# CONFIG_TOUCHSCREEN_MMS114 is not set +# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set +# CONFIG_TOUCHSCREEN_MSG2638 is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_NOVATEK_NVT_TS is not set +# CONFIG_TOUCHSCREEN_IMAGIS is not set +# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_PIXCIR is not set +# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_TOUCHSCREEN_TSC_SERIO is not set +# CONFIG_TOUCHSCREEN_TSC2004 is not set +# CONFIG_TOUCHSCREEN_TSC2005 is not set +# CONFIG_TOUCHSCREEN_TSC2007 is not set +# CONFIG_TOUCHSCREEN_RM_TS is not set +# CONFIG_TOUCHSCREEN_SILEAD is not set +# CONFIG_TOUCHSCREEN_SIS_I2C is not set +# CONFIG_TOUCHSCREEN_ST1232 is not set +# CONFIG_TOUCHSCREEN_STMFTS is not set +# CONFIG_TOUCHSCREEN_SUR40 is not set +# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set +# CONFIG_TOUCHSCREEN_SX8654 is not set +# CONFIG_TOUCHSCREEN_TPS6507X is not set +# CONFIG_TOUCHSCREEN_ZET6223 is not set +# CONFIG_TOUCHSCREEN_ZFORCE is not set +# CONFIG_TOUCHSCREEN_COLIBRI_VF50 is not set +# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set +# CONFIG_TOUCHSCREEN_IQS5XX is not set +# CONFIG_TOUCHSCREEN_IQS7211 is not set +# CONFIG_TOUCHSCREEN_ZINITIX is not set +# CONFIG_TOUCHSCREEN_HIMAX_HX83112B is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_AD714X is not set +# CONFIG_INPUT_ATMEL_CAPTOUCH is not set +# CONFIG_INPUT_AW86927 is not set +# CONFIG_INPUT_BMA150 is not set +CONFIG_INPUT_E3X0_BUTTON=m +# CONFIG_INPUT_MMA8450 is not set +# CONFIG_INPUT_GPIO_BEEPER is not set +# CONFIG_INPUT_GPIO_DECODER is not set +# CONFIG_INPUT_GPIO_VIBRA is not set +CONFIG_INPUT_ATI_REMOTE2=m +CONFIG_INPUT_KEYSPAN_REMOTE=m +# CONFIG_INPUT_KXTJ9 is not set +CONFIG_INPUT_POWERMATE=m +CONFIG_INPUT_YEALINK=m +CONFIG_INPUT_CM109=m +# CONFIG_INPUT_REGULATOR_HAPTIC is not set +CONFIG_INPUT_UINPUT=m +# CONFIG_INPUT_PCF8574 is not set +CONFIG_INPUT_PWM_BEEPER=m +CONFIG_INPUT_PWM_VIBRA=m +# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set +# CONFIG_INPUT_DA7280_HAPTICS is not set +# CONFIG_INPUT_ADXL34X is not set +# CONFIG_INPUT_IMS_PCU is not set +# CONFIG_INPUT_IQS269A is not set +# CONFIG_INPUT_IQS626A is not set +# CONFIG_INPUT_IQS7222 is not set +# CONFIG_INPUT_CMA3000 is not set +# CONFIG_INPUT_DRV260X_HAPTICS is not set +# CONFIG_INPUT_DRV2665_HAPTICS is not set +# CONFIG_INPUT_DRV2667_HAPTICS is not set +CONFIG_INPUT_MACSMC_INPUT=y +# CONFIG_RMI4_CORE is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set +# end of Hardware I/O ports +# end of Input device support + +# +# Character devices +# +CONFIG_TTY=y +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y +CONFIG_VT_HW_CONSOLE_BINDING=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_LEGACY_TIOCSTI=y +CONFIG_LDISC_AUTOLOAD=y + +# +# Serial drivers +# +CONFIG_SERIAL_EARLYCON=y +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_EARLYCON_SEMIHOST is not set +CONFIG_SERIAL_SAMSUNG=y +CONFIG_SERIAL_SAMSUNG_UARTS=4 +CONFIG_SERIAL_SAMSUNG_CONSOLE=y +# CONFIG_SERIAL_MAX3100 is not set +# CONFIG_SERIAL_MAX310X is not set +# CONFIG_SERIAL_UARTLITE is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +# CONFIG_SERIAL_JSM is not set +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SERIAL_SCCNXP is not set +# CONFIG_SERIAL_SC16IS7XX is not set +# CONFIG_SERIAL_ALTERA_JTAGUART is not set +# CONFIG_SERIAL_ALTERA_UART is not set +# CONFIG_SERIAL_XILINX_PS_UART is not set +# CONFIG_SERIAL_ARC is not set +# CONFIG_SERIAL_RP2 is not set +# CONFIG_SERIAL_FSL_LPUART is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +# CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set +# CONFIG_SERIAL_SPRD is not set +# end of Serial drivers + +CONFIG_SERIAL_NONSTANDARD=y +# CONFIG_MOXA_INTELLIO is not set +# CONFIG_MOXA_SMARTIO is not set +# CONFIG_N_HDLC is not set +# CONFIG_N_GSM is not set +CONFIG_NOZOMI=m +# CONFIG_NULL_TTY is not set +CONFIG_HVC_DRIVER=y +# CONFIG_HVC_DCC is not set +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +# CONFIG_TTY_PRINTK is not set +CONFIG_VIRTIO_CONSOLE=y +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_HW_RANDOM_TIMERIOMEM is not set +# CONFIG_HW_RANDOM_BA431 is not set +CONFIG_HW_RANDOM_VIRTIO=m +# CONFIG_HW_RANDOM_CCTRNG is not set +# CONFIG_HW_RANDOM_XIPHERA is not set +# CONFIG_HW_RANDOM_ARM_SMCCC_TRNG is not set +# CONFIG_HW_RANDOM_CN10K is not set +# CONFIG_APPLICOM is not set +CONFIG_DEVMEM=y +CONFIG_DEVPORT=y +# CONFIG_TCG_TPM is not set +# CONFIG_XILLYBUS is not set +# CONFIG_XILLYUSB is not set +# end of Character devices + +# +# I2C support +# +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=m +CONFIG_I2C_MUX=y + +# +# Multiplexer I2C Chip support +# +CONFIG_I2C_ARB_GPIO_CHALLENGE=m +CONFIG_I2C_MUX_GPIO=m +CONFIG_I2C_MUX_GPMUX=m +# CONFIG_I2C_MUX_LTC4306 is not set +CONFIG_I2C_MUX_PCA9541=m +CONFIG_I2C_MUX_PCA954x=y +CONFIG_I2C_MUX_PINCTRL=m +CONFIG_I2C_MUX_REG=m +CONFIG_I2C_DEMUX_PINCTRL=m +# CONFIG_I2C_MUX_MLXCPLD is not set +# end of Multiplexer I2C Chip support + +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_ALGOBIT=m + +# +# I2C Hardware Bus support +# + +# +# PC SMBus host controller drivers +# +# CONFIG_I2C_ALI1535 is not set +# CONFIG_I2C_ALI1563 is not set +# CONFIG_I2C_ALI15X3 is not set +# CONFIG_I2C_AMD756 is not set +# CONFIG_I2C_AMD8111 is not set +# CONFIG_I2C_I801 is not set +# CONFIG_I2C_ISCH is not set +# CONFIG_I2C_PIIX4 is not set +# CONFIG_I2C_NFORCE2 is not set +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_SIS5595 is not set +# CONFIG_I2C_SIS630 is not set +# CONFIG_I2C_SIS96X is not set +# CONFIG_I2C_VIA is not set +# CONFIG_I2C_VIAPRO is not set + +# +# I2C system bus drivers (mostly embedded / system-on-chip) +# +# CONFIG_I2C_CADENCE is not set +# CONFIG_I2C_CBUS_GPIO is not set +# CONFIG_I2C_DESIGNWARE_CORE is not set +# CONFIG_I2C_EMEV2 is not set +# CONFIG_I2C_GPIO is not set +# CONFIG_I2C_HISI is not set +# CONFIG_I2C_NOMADIK is not set +# CONFIG_I2C_OCORES is not set +CONFIG_I2C_APPLE=y +# CONFIG_I2C_PCA_PLATFORM is not set +# CONFIG_I2C_RK3X is not set +# CONFIG_I2C_SIMTEC is not set +# CONFIG_I2C_THUNDERX is not set +# CONFIG_I2C_XILINX is not set + +# +# External I2C/SMBus adapter drivers +# +# CONFIG_I2C_DIOLAN_U2C is not set +# CONFIG_I2C_CP2615 is not set +# CONFIG_I2C_PCI1XXXX is not set +# CONFIG_I2C_ROBOTFUZZ_OSIF is not set +# CONFIG_I2C_TAOS_EVM is not set +# CONFIG_I2C_TINY_USB is not set + +# +# Other I2C/SMBus bus drivers +# +# CONFIG_I2C_VIRTIO is not set +# end of I2C Hardware Bus support + +# CONFIG_I2C_STUB is not set +# CONFIG_I2C_SLAVE is not set +# CONFIG_I2C_DEBUG_CORE is not set +# CONFIG_I2C_DEBUG_ALGO is not set +# CONFIG_I2C_DEBUG_BUS is not set +# end of I2C support + +# CONFIG_I3C is not set +CONFIG_I3C_OR_I2C=y +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_ALTERA is not set +CONFIG_SPI_APPLE=y +# CONFIG_SPI_AXI_SPI_ENGINE is not set +# CONFIG_SPI_BITBANG is not set +# CONFIG_SPI_CADENCE is not set +# CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_CADENCE_XSPI is not set +# CONFIG_SPI_CH341 is not set +# CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_GPIO is not set +# CONFIG_SPI_FSL_SPI is not set +# CONFIG_SPI_MICROCHIP_CORE_QSPI is not set +# CONFIG_SPI_MICROCHIP_CORE_SPI is not set +# CONFIG_SPI_OC_TINY is not set +# CONFIG_SPI_PCI1XXXX is not set +# CONFIG_SPI_PL022 is not set +# CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set +# CONFIG_SPI_SN_F_OSPI is not set +# CONFIG_SPI_MXIC is not set +# CONFIG_SPI_THUNDERX is not set +CONFIG_SPI_VIRTIO=m +# CONFIG_SPI_XCOMM is not set +# CONFIG_SPI_XILINX is not set +# CONFIG_SPI_ZYNQMP_GQSPI is not set +# CONFIG_SPI_AMD is not set + +# +# SPI Multiplexer support +# +# CONFIG_SPI_MUX is not set + +# +# SPI Protocol Masters +# +CONFIG_SPI_SPIDEV=m +# CONFIG_SPI_LOOPBACK_TEST is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_SLAVE is not set +CONFIG_SPI_DYNAMIC=y +CONFIG_SPMI=y +CONFIG_SPMI_APPLE=y +# CONFIG_SPMI_HISI3670 is not set +# CONFIG_HSI is not set +CONFIG_PPS=y +# CONFIG_PPS_DEBUG is not set + +# +# PPS clients support +# +# CONFIG_PPS_CLIENT_KTIMER is not set +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_GPIO=m +# CONFIG_PPS_GENERATOR is not set + +# +# PTP clock support +# +CONFIG_PTP_1588_CLOCK=m +CONFIG_PTP_1588_CLOCK_OPTIONAL=m +# CONFIG_DP83640_PHY is not set +# CONFIG_PTP_1588_CLOCK_INES is not set +CONFIG_PTP_1588_CLOCK_KVM=m +CONFIG_PTP_1588_CLOCK_VMCLOCK=m +# CONFIG_PTP_1588_CLOCK_IDT82P33 is not set +# CONFIG_PTP_1588_CLOCK_IDTCM is not set +# CONFIG_PTP_1588_CLOCK_FC3W is not set +# CONFIG_PTP_1588_CLOCK_MOCK is not set +# CONFIG_PTP_NETC_V4_TIMER is not set +# end of PTP clock support + +# +# DPLL device support +# +# CONFIG_ZL3073X_I2C is not set +# CONFIG_ZL3073X_SPI is not set +# end of DPLL device support + +CONFIG_PINCTRL=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_PINMUX=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +# CONFIG_DEBUG_PINCTRL is not set +CONFIG_PINCTRL_APPLE_GPIO=y +# CONFIG_PINCTRL_AW9523 is not set +# CONFIG_PINCTRL_CY8C95X0 is not set +# CONFIG_PINCTRL_MCP23S08 is not set +# CONFIG_PINCTRL_MICROCHIP_SGPIO is not set +# CONFIG_PINCTRL_OCELOT is not set +# CONFIG_PINCTRL_SINGLE is not set +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PINCTRL_SX150X is not set + +# +# Renesas pinctrl drivers +# +# end of Renesas pinctrl drivers + +CONFIG_GPIOLIB_LEGACY=y +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_FASTPATH_LIMIT=512 +CONFIG_OF_GPIO=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_DEBUG_GPIO is not set +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_SYSFS_LEGACY=y +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_CDEV_V1=y + +# +# Memory mapped GPIO drivers +# +# CONFIG_GPIO_74XX_MMIO is not set +# CONFIG_GPIO_ALTERA is not set +# CONFIG_GPIO_BY_PINCTRL is not set +# CONFIG_GPIO_CADENCE is not set +# CONFIG_GPIO_DWAPB is not set +# CONFIG_GPIO_FTGPIO010 is not set +# CONFIG_GPIO_GENERIC_PLATFORM is not set +# CONFIG_GPIO_GRGPIO is not set +# CONFIG_GPIO_HISI is not set +# CONFIG_GPIO_HLWD is not set +# CONFIG_GPIO_LOGICVC is not set +# CONFIG_GPIO_MB86S7X is not set +# CONFIG_GPIO_PL061 is not set +# CONFIG_GPIO_POLARFIRE_SOC is not set +# CONFIG_GPIO_SIFIVE is not set +# CONFIG_GPIO_SYSCON is not set +# CONFIG_GPIO_XGENE is not set +# CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_AMD_FCH is not set +# end of Memory mapped GPIO drivers + +# +# I2C GPIO expanders +# +# CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_FXL6408 is not set +# CONFIG_GPIO_DS4520 is not set +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_MAX7300 is not set +# CONFIG_GPIO_MAX732X is not set +# CONFIG_GPIO_PCA953X is not set +# CONFIG_GPIO_PCA9570 is not set +# CONFIG_GPIO_PCF857X is not set +# CONFIG_GPIO_TPIC2810 is not set +# end of I2C GPIO expanders + +# +# MFD GPIO expanders +# +CONFIG_GPIO_MACSMC=y +# end of MFD GPIO expanders + +# +# PCI GPIO expanders +# +# CONFIG_GPIO_BT8XX is not set +# CONFIG_GPIO_PCI_IDIO_16 is not set +# CONFIG_GPIO_PCIE_IDIO_24 is not set +# CONFIG_GPIO_RDC321X is not set +# end of PCI GPIO expanders + +# +# SPI GPIO expanders +# +# CONFIG_GPIO_74X164 is not set +# CONFIG_GPIO_MAX3191X is not set +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MC33880 is not set +# CONFIG_GPIO_PISOSR is not set +# CONFIG_GPIO_XRA1403 is not set +# end of SPI GPIO expanders + +# +# USB GPIO expanders +# +# CONFIG_GPIO_MPSSE is not set +# end of USB GPIO expanders + +# +# Virtual GPIO drivers +# +# CONFIG_GPIO_AGGREGATOR is not set +# CONFIG_GPIO_LATCH is not set +# CONFIG_GPIO_LINE_MUX is not set +# CONFIG_GPIO_MOCKUP is not set +# CONFIG_GPIO_VIRTIO is not set +# CONFIG_GPIO_SIM is not set +# end of Virtual GPIO drivers + +# +# GPIO Debugging utilities +# +# CONFIG_GPIO_SLOPPY_LOGIC_ANALYZER is not set +# CONFIG_GPIO_VIRTUSER is not set +# end of GPIO Debugging utilities + +# CONFIG_W1 is not set +CONFIG_POWER_RESET=y +# CONFIG_POWER_RESET_GPIO is not set +# CONFIG_POWER_RESET_GPIO_RESTART is not set +CONFIG_POWER_RESET_MACSMC=y +# CONFIG_POWER_RESET_LTC2952 is not set +# CONFIG_POWER_RESET_REGULATOR is not set +# CONFIG_POWER_RESET_RESTART is not set +# CONFIG_POWER_RESET_XGENE is not set +# CONFIG_POWER_RESET_SYSCON is not set +# CONFIG_POWER_RESET_SYSCON_POWEROFF is not set +# CONFIG_SYSCON_REBOOT_MODE is not set +# CONFIG_NVMEM_REBOOT_MODE is not set +# CONFIG_POWER_RESET_QEMU_VIRT_CTRL is not set +CONFIG_POWER_SEQUENCING=y +# CONFIG_POWER_SEQUENCING_QCOM_WCN is not set +# CONFIG_POWER_SEQUENCING_PCIE_M2 is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_POWER_SUPPLY_HWMON=y +# CONFIG_GENERIC_ADC_BATTERY is not set +# CONFIG_IP5XXX_POWER is not set +# CONFIG_TEST_POWER is not set +# CONFIG_CHARGER_ADP5061 is not set +# CONFIG_BATTERY_CHAGALL is not set +# CONFIG_BATTERY_CW2015 is not set +# CONFIG_BATTERY_DS2780 is not set +# CONFIG_BATTERY_DS2781 is not set +# CONFIG_BATTERY_DS2782 is not set +# CONFIG_BATTERY_SAMSUNG_SDI is not set +# CONFIG_BATTERY_S2MU005 is not set +# CONFIG_BATTERY_SBS is not set +# CONFIG_CHARGER_SBS is not set +# CONFIG_MANAGER_SBS is not set +# CONFIG_BATTERY_BQ27XXX is not set +# CONFIG_BATTERY_MAX17040 is not set +# CONFIG_BATTERY_MAX17042 is not set +# CONFIG_BATTERY_MAX1720X is not set +# CONFIG_CHARGER_ISP1704 is not set +# CONFIG_CHARGER_MAX8903 is not set +# CONFIG_CHARGER_LP8727 is not set +# CONFIG_CHARGER_GPIO is not set +# CONFIG_CHARGER_MANAGER is not set +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_LTC4162L is not set +# CONFIG_CHARGER_DETECTOR_MAX14656 is not set +# CONFIG_CHARGER_MAX77976 is not set +# CONFIG_CHARGER_MAX8971 is not set +# CONFIG_CHARGER_BQ2415X is not set +# CONFIG_CHARGER_BQ24190 is not set +# CONFIG_CHARGER_BQ24257 is not set +# CONFIG_CHARGER_BQ24735 is not set +# CONFIG_CHARGER_BQ2515X is not set +# CONFIG_CHARGER_BQ25890 is not set +# CONFIG_CHARGER_BQ25980 is not set +# CONFIG_CHARGER_BQ256XX is not set +# CONFIG_CHARGER_SMB347 is not set +# CONFIG_BATTERY_GAUGE_LTC2941 is not set +# CONFIG_BATTERY_GOLDFISH is not set +# CONFIG_BATTERY_RT5033 is not set +# CONFIG_CHARGER_RT9455 is not set +# CONFIG_CHARGER_RT9467 is not set +# CONFIG_CHARGER_RT9471 is not set +# CONFIG_CHARGER_RT9756 is not set +# CONFIG_CHARGER_UCS1002 is not set +# CONFIG_CHARGER_BD99954 is not set +# CONFIG_BATTERY_UG3105 is not set +# CONFIG_FUEL_GAUGE_MM8013 is not set +CONFIG_MACSMC_POWER=y +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set + +# +# Native drivers +# +# CONFIG_SENSORS_AD7314 is not set +# CONFIG_SENSORS_AD7414 is not set +# CONFIG_SENSORS_AD7418 is not set +# CONFIG_SENSORS_ADM1025 is not set +# CONFIG_SENSORS_ADM1026 is not set +# CONFIG_SENSORS_ADM1029 is not set +# CONFIG_SENSORS_ADM1031 is not set +# CONFIG_SENSORS_ADM1177 is not set +# CONFIG_SENSORS_ADM9240 is not set +# CONFIG_SENSORS_ADT7310 is not set +# CONFIG_SENSORS_ADT7410 is not set +# CONFIG_SENSORS_ADT7411 is not set +# CONFIG_SENSORS_ADT7462 is not set +# CONFIG_SENSORS_ADT7470 is not set +# CONFIG_SENSORS_ADT7475 is not set +# CONFIG_SENSORS_AHT10 is not set +# CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set +# CONFIG_SENSORS_AS370 is not set +# CONFIG_SENSORS_ASC7621 is not set +# CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set +# CONFIG_SENSORS_AXI_FAN_CONTROL is not set +# CONFIG_SENSORS_ATXP1 is not set +# CONFIG_SENSORS_CHIPCAP2 is not set +# CONFIG_SENSORS_CORSAIR_CPRO is not set +# CONFIG_SENSORS_CORSAIR_PSU is not set +# CONFIG_SENSORS_DS620 is not set +# CONFIG_SENSORS_DS1621 is not set +# CONFIG_SENSORS_I5K_AMB is not set +# CONFIG_SENSORS_F71805F is not set +# CONFIG_SENSORS_F71882FG is not set +# CONFIG_SENSORS_F75375S is not set +# CONFIG_SENSORS_FTSTEUTATES is not set +# CONFIG_SENSORS_GIGABYTE_WATERFORCE is not set +# CONFIG_SENSORS_GL518SM is not set +# CONFIG_SENSORS_GL520SM is not set +# CONFIG_SENSORS_G760A is not set +# CONFIG_SENSORS_G762 is not set +# CONFIG_SENSORS_GPIO_FAN is not set +# CONFIG_SENSORS_HIH6130 is not set +# CONFIG_SENSORS_HS3001 is not set +# CONFIG_SENSORS_HTU31 is not set +# CONFIG_SENSORS_IIO_HWMON is not set +# CONFIG_SENSORS_ISL28022 is not set +# CONFIG_SENSORS_IT87 is not set +# CONFIG_SENSORS_JC42 is not set +# CONFIG_SENSORS_POWERZ is not set +# CONFIG_SENSORS_POWR1220 is not set +# CONFIG_SENSORS_LINEAGE is not set +# CONFIG_SENSORS_LTC2945 is not set +# CONFIG_SENSORS_LTC2947_I2C is not set +# CONFIG_SENSORS_LTC2947_SPI is not set +# CONFIG_SENSORS_LTC2990 is not set +# CONFIG_SENSORS_LTC2991 is not set +# CONFIG_SENSORS_LTC2992 is not set +# CONFIG_SENSORS_LTC4151 is not set +# CONFIG_SENSORS_LTC4215 is not set +# CONFIG_SENSORS_LTC4222 is not set +# CONFIG_SENSORS_LTC4245 is not set +# CONFIG_SENSORS_LTC4260 is not set +# CONFIG_SENSORS_LTC4261 is not set +# CONFIG_SENSORS_LTC4282 is not set +CONFIG_SENSORS_MACSMC_HWMON=y +# CONFIG_SENSORS_MAX1111 is not set +# CONFIG_SENSORS_MAX127 is not set +# CONFIG_SENSORS_MAX16065 is not set +# CONFIG_SENSORS_MAX1619 is not set +# CONFIG_SENSORS_MAX1668 is not set +# CONFIG_SENSORS_MAX197 is not set +# CONFIG_SENSORS_MAX31722 is not set +# CONFIG_SENSORS_MAX31730 is not set +# CONFIG_SENSORS_MAX31760 is not set +# CONFIG_MAX31827 is not set +# CONFIG_SENSORS_MAX6620 is not set +# CONFIG_SENSORS_MAX6621 is not set +# CONFIG_SENSORS_MAX6639 is not set +# CONFIG_SENSORS_MAX6650 is not set +# CONFIG_SENSORS_MAX6697 is not set +# CONFIG_SENSORS_MAX31790 is not set +# CONFIG_SENSORS_MC34VR500 is not set +# CONFIG_SENSORS_MCP3021 is not set +# CONFIG_SENSORS_MCP9982 is not set +# CONFIG_SENSORS_TC654 is not set +# CONFIG_SENSORS_TPS23861 is not set +# CONFIG_SENSORS_MR75203 is not set +# CONFIG_SENSORS_ADCXX is not set +# CONFIG_SENSORS_LM63 is not set +# CONFIG_SENSORS_LM70 is not set +# CONFIG_SENSORS_LM73 is not set +# CONFIG_SENSORS_LM75 is not set +# CONFIG_SENSORS_LM77 is not set +# CONFIG_SENSORS_LM78 is not set +# CONFIG_SENSORS_LM80 is not set +# CONFIG_SENSORS_LM83 is not set +# CONFIG_SENSORS_LM85 is not set +# CONFIG_SENSORS_LM87 is not set +# CONFIG_SENSORS_LM90 is not set +# CONFIG_SENSORS_LM92 is not set +# CONFIG_SENSORS_LM93 is not set +# CONFIG_SENSORS_LM95234 is not set +# CONFIG_SENSORS_LM95241 is not set +# CONFIG_SENSORS_LM95245 is not set +# CONFIG_SENSORS_PC87360 is not set +# CONFIG_SENSORS_PC87427 is not set +# CONFIG_SENSORS_NTC_THERMISTOR is not set +# CONFIG_SENSORS_NCT6683 is not set +# CONFIG_SENSORS_NCT6775 is not set +# CONFIG_SENSORS_NCT6775_I2C is not set +# CONFIG_SENSORS_NCT7363 is not set +# CONFIG_SENSORS_NCT7802 is not set +# CONFIG_SENSORS_NCT7904 is not set +# CONFIG_SENSORS_NPCM7XX is not set +# CONFIG_SENSORS_NZXT_KRAKEN2 is not set +# CONFIG_SENSORS_NZXT_KRAKEN3 is not set +# CONFIG_SENSORS_NZXT_SMART2 is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set +# CONFIG_SENSORS_PCF8591 is not set +# CONFIG_PMBUS is not set +# CONFIG_SENSORS_PT5161L is not set +# CONFIG_SENSORS_PWM_FAN is not set +# CONFIG_SENSORS_SBTSI is not set +# CONFIG_SENSORS_SHT15 is not set +# CONFIG_SENSORS_SHT21 is not set +# CONFIG_SENSORS_SHT3x is not set +# CONFIG_SENSORS_SHT4x is not set +# CONFIG_SENSORS_SHTC1 is not set +# CONFIG_SENSORS_SIS5595 is not set +# CONFIG_SENSORS_DME1737 is not set +# CONFIG_SENSORS_EMC1403 is not set +# CONFIG_SENSORS_EMC2103 is not set +# CONFIG_SENSORS_EMC2305 is not set +# CONFIG_SENSORS_EMC6W201 is not set +# CONFIG_SENSORS_SMSC47M1 is not set +# CONFIG_SENSORS_SMSC47M192 is not set +# CONFIG_SENSORS_SMSC47B397 is not set +# CONFIG_SENSORS_SCH5627 is not set +# CONFIG_SENSORS_SCH5636 is not set +# CONFIG_SENSORS_STTS751 is not set +# CONFIG_SENSORS_ADC128D818 is not set +# CONFIG_SENSORS_ADS7828 is not set +# CONFIG_SENSORS_ADS7871 is not set +# CONFIG_SENSORS_AMC6821 is not set +# CONFIG_SENSORS_INA209 is not set +# CONFIG_SENSORS_INA2XX is not set +# CONFIG_SENSORS_INA238 is not set +# CONFIG_SENSORS_INA3221 is not set +# CONFIG_SENSORS_SPD5118 is not set +# CONFIG_SENSORS_TC74 is not set +# CONFIG_SENSORS_THMC50 is not set +# CONFIG_SENSORS_TMP102 is not set +# CONFIG_SENSORS_TMP103 is not set +# CONFIG_SENSORS_TMP108 is not set +# CONFIG_SENSORS_TMP401 is not set +# CONFIG_SENSORS_TMP421 is not set +# CONFIG_SENSORS_TMP464 is not set +# CONFIG_SENSORS_TMP513 is not set +# CONFIG_SENSORS_TSC1641 is not set +# CONFIG_SENSORS_VIA686A is not set +# CONFIG_SENSORS_VT1211 is not set +# CONFIG_SENSORS_VT8231 is not set +# CONFIG_SENSORS_W83773G is not set +# CONFIG_SENSORS_W83781D is not set +# CONFIG_SENSORS_W83791D is not set +# CONFIG_SENSORS_W83792D is not set +# CONFIG_SENSORS_W83793 is not set +# CONFIG_SENSORS_W83795 is not set +# CONFIG_SENSORS_W83L785TS is not set +# CONFIG_SENSORS_W83L786NG is not set +# CONFIG_SENSORS_W83627HF is not set +# CONFIG_SENSORS_W83627EHF is not set +CONFIG_THERMAL=y +# CONFIG_THERMAL_NETLINK is not set +# CONFIG_THERMAL_STATISTICS is not set +# CONFIG_THERMAL_DEBUGFS is not set +# CONFIG_THERMAL_CORE_TESTING is not set +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set +# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set +# CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR is not set +# CONFIG_THERMAL_DEFAULT_GOV_BANG_BANG is not set +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_BANG_BANG=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y +CONFIG_CPU_FREQ_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +# CONFIG_PCIE_THERMAL is not set +CONFIG_THERMAL_EMULATION=y +# CONFIG_THERMAL_MMIO is not set +# CONFIG_GENERIC_ADC_THERMAL is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y +# CONFIG_WATCHDOG_NOWAYOUT is not set +CONFIG_WATCHDOG_HANDLE_BOOT_ENABLED=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +# CONFIG_WATCHDOG_SYSFS is not set +# CONFIG_WATCHDOG_HRTIMER_PRETIMEOUT is not set + +# +# Watchdog Pretimeout Governors +# +# CONFIG_WATCHDOG_PRETIMEOUT_GOV is not set + +# +# Watchdog Device Drivers +# +CONFIG_SOFT_WATCHDOG=m +# CONFIG_GPIO_WATCHDOG is not set +# CONFIG_XILINX_WATCHDOG is not set +# CONFIG_XILINX_WINDOW_WATCHDOG is not set +# CONFIG_ZIIRAVE_WATCHDOG is not set +# CONFIG_ARM_SP805_WATCHDOG is not set +# CONFIG_ARM_SBSA_WATCHDOG is not set +# CONFIG_CADENCE_WATCHDOG is not set +# CONFIG_DW_WATCHDOG is not set +# CONFIG_MAX63XX_WATCHDOG is not set +# CONFIG_ARM_SMC_WATCHDOG is not set +CONFIG_APPLE_WATCHDOG=y +# CONFIG_ALIM7101_WDT is not set +# CONFIG_I6300ESB_WDT is not set +# CONFIG_HP_WATCHDOG is not set +# CONFIG_MEN_A21_WDT is not set + +# +# PCI-based Watchdog Cards +# +# CONFIG_PCIPCWATCHDOG is not set +# CONFIG_WDTPCI is not set + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set +CONFIG_BCMA_POSSIBLE=y +# CONFIG_BCMA is not set + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y +# CONFIG_MFD_ADP5585 is not set +# CONFIG_MFD_ACT8945A is not set +# CONFIG_MFD_AS3711 is not set +# CONFIG_MFD_SMPRO is not set +# CONFIG_MFD_AS3722 is not set +# CONFIG_PMIC_ADP5520 is not set +# CONFIG_MFD_AAT2870_CORE is not set +# CONFIG_MFD_ATMEL_FLEXCOM is not set +# CONFIG_MFD_ATMEL_HLCDC is not set +# CONFIG_MFD_BCM590XX is not set +# CONFIG_MFD_BD9571MWV is not set +# CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_CS40L50_I2C is not set +# CONFIG_MFD_CS40L50_SPI is not set +# CONFIG_MFD_CS42L43_I2C is not set +# CONFIG_MFD_LOCHNAGAR is not set +CONFIG_MFD_MACSMC=y +# CONFIG_MFD_MADERA is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_DA9052_SPI is not set +# CONFIG_MFD_DA9052_I2C is not set +# CONFIG_MFD_DA9055 is not set +# CONFIG_MFD_DA9062 is not set +# CONFIG_MFD_DA9063 is not set +# CONFIG_MFD_DA9150 is not set +# CONFIG_MFD_DLN2 is not set +# CONFIG_MFD_GATEWORKS_GSC is not set +# CONFIG_MFD_MC13XXX_SPI is not set +# CONFIG_MFD_MC13XXX_I2C is not set +# CONFIG_MFD_MP2629 is not set +# CONFIG_MFD_PF1550 is not set +# CONFIG_MFD_HI6421_PMIC is not set +# CONFIG_MFD_HI6421_SPMI is not set +# CONFIG_LPC_ICH is not set +# CONFIG_LPC_SCH is not set +# CONFIG_MFD_IQS62X is not set +# CONFIG_MFD_JANZ_CMODIO is not set +# CONFIG_MFD_KEMPLD is not set +# CONFIG_MFD_88PM800 is not set +# CONFIG_MFD_88PM805 is not set +# CONFIG_MFD_88PM860X is not set +# CONFIG_MFD_88PM886_PMIC is not set +# CONFIG_MFD_MAX5970 is not set +# CONFIG_MFD_MAX14577 is not set +# CONFIG_MFD_MAX77541 is not set +# CONFIG_MFD_MAX77620 is not set +# CONFIG_MFD_MAX77650 is not set +# CONFIG_MFD_MAX77686 is not set +# CONFIG_MFD_MAX77693 is not set +# CONFIG_MFD_MAX77705 is not set +# CONFIG_MFD_MAX77714 is not set +# CONFIG_MFD_MAX77759 is not set +# CONFIG_MFD_MAX77843 is not set +# CONFIG_MFD_MAX8907 is not set +# CONFIG_MFD_MAX8925 is not set +# CONFIG_MFD_MAX8997 is not set +# CONFIG_MFD_MAX8998 is not set +# CONFIG_MFD_MT6360 is not set +# CONFIG_MFD_MT6370 is not set +# CONFIG_MFD_MT6397 is not set +# CONFIG_MFD_MENF21BMC is not set +# CONFIG_MFD_NCT6694 is not set +# CONFIG_MFD_OCELOT is not set +# CONFIG_EZX_PCAP is not set +# CONFIG_MFD_CPCAP is not set +# CONFIG_MFD_VIPERBOARD is not set +# CONFIG_MFD_NTXEC is not set +# CONFIG_MFD_RETU is not set +# CONFIG_MFD_SY7636A is not set +# CONFIG_MFD_RDC321X is not set +# CONFIG_MFD_RT4831 is not set +# CONFIG_MFD_RT5033 is not set +# CONFIG_MFD_RT5120 is not set +# CONFIG_MFD_RC5T583 is not set +# CONFIG_MFD_RK8XX_I2C is not set +# CONFIG_MFD_RK8XX_SPI is not set +# CONFIG_MFD_RN5T618 is not set +# CONFIG_MFD_SEC_I2C is not set +# CONFIG_MFD_SI476X_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_SKY81452 is not set +# CONFIG_MFD_STMPE is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_LP3943 is not set +# CONFIG_MFD_LP8788 is not set +# CONFIG_MFD_TI_LMU is not set +# CONFIG_MFD_BQ257XX is not set +# CONFIG_MFD_PALMAS is not set +# CONFIG_TPS6105X is not set +# CONFIG_TPS65010 is not set +# CONFIG_TPS6507X is not set +# CONFIG_MFD_TPS65086 is not set +# CONFIG_MFD_TPS65090 is not set +# CONFIG_MFD_TPS65217 is not set +# CONFIG_MFD_TI_LP873X is not set +# CONFIG_MFD_TI_LP87565 is not set +# CONFIG_MFD_TPS65218 is not set +# CONFIG_MFD_TPS65219 is not set +# CONFIG_MFD_TPS6586X is not set +# CONFIG_MFD_TPS65910 is not set +# CONFIG_MFD_TPS65912_I2C is not set +# CONFIG_MFD_TPS65912_SPI is not set +# CONFIG_MFD_TPS6594_I2C is not set +# CONFIG_MFD_TPS6594_SPI is not set +# CONFIG_TWL4030_CORE is not set +# CONFIG_TWL6040_CORE is not set +# CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_VX855 is not set +# CONFIG_MFD_ARIZONA_I2C is not set +# CONFIG_MFD_ARIZONA_SPI is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM831X_I2C is not set +# CONFIG_MFD_WM831X_SPI is not set +# CONFIG_MFD_WM8350_I2C is not set +# CONFIG_MFD_WM8994 is not set +# CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_ROHM_BD71828 is not set +# CONFIG_MFD_ROHM_BD957XMUF is not set +# CONFIG_MFD_ROHM_BD96801 is not set +# CONFIG_MFD_STPMIC1 is not set +# CONFIG_MFD_STMFX is not set +# CONFIG_MFD_ATC260X_I2C is not set +# CONFIG_MFD_QCOM_PM8008 is not set +# CONFIG_RAVE_SP_CORE is not set +# CONFIG_MFD_INTEL_M10_BMC_SPI is not set +# CONFIG_MFD_QNAP_MCU is not set +# CONFIG_MFD_RSMU_I2C is not set +# CONFIG_MFD_RSMU_SPI is not set +# CONFIG_MFD_MAX7360 is not set +# end of Multifunction device drivers + +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_DEBUG is not set +CONFIG_REGULATOR_FIXED_VOLTAGE=y +# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set +# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set +# CONFIG_REGULATOR_NETLINK_EVENTS is not set +# CONFIG_REGULATOR_88PG86X is not set +# CONFIG_REGULATOR_ACT8865 is not set +# CONFIG_REGULATOR_AD5398 is not set +# CONFIG_REGULATOR_ADP5055 is not set +# CONFIG_REGULATOR_AW37503 is not set +# CONFIG_REGULATOR_DA9121 is not set +# CONFIG_REGULATOR_DA9210 is not set +# CONFIG_REGULATOR_DA9211 is not set +# CONFIG_REGULATOR_FAN53555 is not set +# CONFIG_REGULATOR_FAN53880 is not set +# CONFIG_REGULATOR_GPIO is not set +# CONFIG_REGULATOR_ISL9305 is not set +# CONFIG_REGULATOR_ISL6271A is not set +# CONFIG_REGULATOR_FP9931 is not set +# CONFIG_REGULATOR_LP3971 is not set +# CONFIG_REGULATOR_LP3972 is not set +# CONFIG_REGULATOR_LP872X is not set +# CONFIG_REGULATOR_LP8755 is not set +# CONFIG_REGULATOR_LTC3589 is not set +# CONFIG_REGULATOR_LTC3676 is not set +# CONFIG_REGULATOR_MAX1586 is not set +# CONFIG_REGULATOR_MAX77503 is not set +# CONFIG_REGULATOR_MAX77675 is not set +# CONFIG_REGULATOR_MAX77857 is not set +# CONFIG_REGULATOR_MAX8649 is not set +# CONFIG_REGULATOR_MAX8660 is not set +# CONFIG_REGULATOR_MAX8893 is not set +# CONFIG_REGULATOR_MAX8952 is not set +# CONFIG_REGULATOR_MAX8973 is not set +# CONFIG_REGULATOR_MAX20086 is not set +# CONFIG_REGULATOR_MAX20411 is not set +# CONFIG_REGULATOR_MAX77826 is not set +# CONFIG_REGULATOR_MAX77838 is not set +# CONFIG_REGULATOR_MCP16502 is not set +# CONFIG_REGULATOR_MP5416 is not set +# CONFIG_REGULATOR_MP8859 is not set +# CONFIG_REGULATOR_MP886X is not set +# CONFIG_REGULATOR_MPQ7920 is not set +# CONFIG_REGULATOR_MT6311 is not set +# CONFIG_REGULATOR_MT6315 is not set +# CONFIG_REGULATOR_MT6316 is not set +# CONFIG_REGULATOR_MT6363 is not set +# CONFIG_REGULATOR_PCA9450 is not set +# CONFIG_REGULATOR_PF9453 is not set +# CONFIG_REGULATOR_PF0900 is not set +# CONFIG_REGULATOR_PF530X is not set +# CONFIG_REGULATOR_PF8X00 is not set +# CONFIG_REGULATOR_PFUZE100 is not set +# CONFIG_REGULATOR_PV88060 is not set +# CONFIG_REGULATOR_PV88080 is not set +# CONFIG_REGULATOR_PV88090 is not set +# CONFIG_REGULATOR_PWM is not set +# CONFIG_REGULATOR_QCOM_SPMI is not set +# CONFIG_REGULATOR_QCOM_USB_VBUS is not set +# CONFIG_REGULATOR_RAA215300 is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2 is not set +# CONFIG_REGULATOR_RT4801 is not set +# CONFIG_REGULATOR_RT4803 is not set +# CONFIG_REGULATOR_RT5133 is not set +# CONFIG_REGULATOR_RT5190A is not set +# CONFIG_REGULATOR_RT5739 is not set +# CONFIG_REGULATOR_RT5759 is not set +# CONFIG_REGULATOR_RT6160 is not set +# CONFIG_REGULATOR_RT6190 is not set +# CONFIG_REGULATOR_RT6245 is not set +# CONFIG_REGULATOR_RT8092 is not set +# CONFIG_REGULATOR_RTQ2134 is not set +# CONFIG_REGULATOR_RTMV20 is not set +# CONFIG_REGULATOR_RTQ6752 is not set +# CONFIG_REGULATOR_RTQ2208 is not set +# CONFIG_REGULATOR_SLG51000 is not set +# CONFIG_REGULATOR_SY8106A is not set +# CONFIG_REGULATOR_SY8824X is not set +# CONFIG_REGULATOR_SY8827N is not set +# CONFIG_REGULATOR_TPS51632 is not set +# CONFIG_REGULATOR_TPS62360 is not set +# CONFIG_REGULATOR_TPS6286X is not set +# CONFIG_REGULATOR_TPS6287X is not set +# CONFIG_REGULATOR_TPS65023 is not set +# CONFIG_REGULATOR_TPS6507X is not set +# CONFIG_REGULATOR_TPS65132 is not set +# CONFIG_REGULATOR_TPS65185 is not set +# CONFIG_REGULATOR_TPS6524X is not set +# CONFIG_REGULATOR_VCTRL is not set +# CONFIG_REGULATOR_QCOM_LABIBB is not set +CONFIG_RC_CORE=m +CONFIG_LIRC=y +CONFIG_RC_MAP=m +CONFIG_RC_DECODERS=y +CONFIG_IR_IMON_DECODER=m +CONFIG_IR_JVC_DECODER=m +CONFIG_IR_MCE_KBD_DECODER=m +CONFIG_IR_NEC_DECODER=m +CONFIG_IR_RC5_DECODER=m +CONFIG_IR_RC6_DECODER=m +CONFIG_IR_RCMM_DECODER=m +CONFIG_IR_SANYO_DECODER=m +CONFIG_IR_SHARP_DECODER=m +CONFIG_IR_SONY_DECODER=m +CONFIG_IR_XMP_DECODER=m +CONFIG_RC_DEVICES=y +# CONFIG_IR_GPIO_CIR is not set +# CONFIG_IR_GPIO_TX is not set +CONFIG_IR_HIX5HD2=m +CONFIG_IR_IGORPLUGUSB=m +CONFIG_IR_IGUANA=m +CONFIG_IR_IMON=m +CONFIG_IR_IMON_RAW=m +CONFIG_IR_MCEUSB=m +# CONFIG_IR_PWM_TX is not set +CONFIG_IR_REDRAT3=m +# CONFIG_IR_SERIAL is not set +# CONFIG_IR_SPI is not set +CONFIG_IR_STREAMZAP=m +CONFIG_IR_TOY=m +CONFIG_IR_TTUSBIR=m +CONFIG_RC_ATI_REMOTE=m +CONFIG_RC_LOOPBACK=m +# CONFIG_RC_XBOX_DVD is not set +CONFIG_CEC_CORE=m + +# +# CEC support +# +# CONFIG_MEDIA_CEC_RC is not set +CONFIG_MEDIA_CEC_SUPPORT=y +# CONFIG_CEC_CH7322 is not set +# CONFIG_CEC_NXP_TDA9950 is not set +# CONFIG_CEC_GPIO is not set +# CONFIG_USB_EXTRON_DA_HD_4K_PLUS_CEC is not set +# CONFIG_USB_PULSE8_CEC is not set +# CONFIG_USB_RAINSHADOW_CEC is not set +# end of CEC support + +CONFIG_MEDIA_SUPPORT=m +# CONFIG_MEDIA_SUPPORT_FILTER is not set +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y + +# +# Media device types +# +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +# end of Media device types + +# +# Media core support +# +CONFIG_VIDEO_DEV=m +CONFIG_MEDIA_CONTROLLER=y +CONFIG_DVB_CORE=m +# end of Media core support + +# +# Video4Linux options +# +CONFIG_VIDEO_V4L2_I2C=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_VIDEO_TUNER=m +CONFIG_V4L2_H264=m +CONFIG_V4L2_VP9=m +CONFIG_V4L2_MEM2MEM_DEV=m +# CONFIG_V4L2_FLASH_LED_CLASS is not set +CONFIG_V4L2_FWNODE=m +CONFIG_V4L2_ASYNC=m +# end of Video4Linux options + +# +# Media controller options +# +CONFIG_MEDIA_CONTROLLER_DVB=y +# end of Media controller options + +# +# Digital TV options +# +# CONFIG_DVB_MMAP is not set +CONFIG_DVB_NET=y +CONFIG_DVB_MAX_ADAPTERS=8 +CONFIG_DVB_DYNAMIC_MINORS=y +# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set +# CONFIG_DVB_ULE_DEBUG is not set +# end of Digital TV options + +# +# Media drivers +# + +# +# Media drivers +# +CONFIG_MEDIA_USB_SUPPORT=y + +# +# Webcam devices +# +CONFIG_USB_GSPCA=m +CONFIG_USB_GSPCA_BENQ=m +CONFIG_USB_GSPCA_CONEX=m +CONFIG_USB_GSPCA_CPIA1=m +CONFIG_USB_GSPCA_DTCS033=m +CONFIG_USB_GSPCA_ETOMS=m +CONFIG_USB_GSPCA_FINEPIX=m +CONFIG_USB_GSPCA_JEILINJ=m +CONFIG_USB_GSPCA_JL2005BCD=m +CONFIG_USB_GSPCA_KINECT=m +CONFIG_USB_GSPCA_KONICA=m +CONFIG_USB_GSPCA_MARS=m +CONFIG_USB_GSPCA_MR97310A=m +CONFIG_USB_GSPCA_NW80X=m +CONFIG_USB_GSPCA_OV519=m +CONFIG_USB_GSPCA_OV534=m +CONFIG_USB_GSPCA_OV534_9=m +CONFIG_USB_GSPCA_PAC207=m +CONFIG_USB_GSPCA_PAC7302=m +CONFIG_USB_GSPCA_PAC7311=m +CONFIG_USB_GSPCA_SE401=m +CONFIG_USB_GSPCA_SN9C2028=m +CONFIG_USB_GSPCA_SN9C20X=m +CONFIG_USB_GSPCA_SONIXB=m +CONFIG_USB_GSPCA_SONIXJ=m +CONFIG_USB_GSPCA_SPCA1528=m +CONFIG_USB_GSPCA_SPCA500=m +CONFIG_USB_GSPCA_SPCA501=m +CONFIG_USB_GSPCA_SPCA505=m +CONFIG_USB_GSPCA_SPCA506=m +CONFIG_USB_GSPCA_SPCA508=m +CONFIG_USB_GSPCA_SPCA561=m +CONFIG_USB_GSPCA_SQ905=m +CONFIG_USB_GSPCA_SQ905C=m +CONFIG_USB_GSPCA_SQ930X=m +CONFIG_USB_GSPCA_STK014=m +CONFIG_USB_GSPCA_STK1135=m +CONFIG_USB_GSPCA_STV0680=m +CONFIG_USB_GSPCA_SUNPLUS=m +CONFIG_USB_GSPCA_T613=m +CONFIG_USB_GSPCA_TOPRO=m +CONFIG_USB_GSPCA_TOUPTEK=m +CONFIG_USB_GSPCA_TV8532=m +CONFIG_USB_GSPCA_VC032X=m +CONFIG_USB_GSPCA_VICAM=m +CONFIG_USB_GSPCA_XIRLINK_CIT=m +CONFIG_USB_GSPCA_ZC3XX=m +CONFIG_USB_GL860=m +CONFIG_USB_M5602=m +CONFIG_USB_STV06XX=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_PWC_INPUT_EVDEV=y +CONFIG_USB_S2255=m +CONFIG_VIDEO_USBTV=m +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y + +# +# Analog TV USB devices +# +CONFIG_VIDEO_GO7007=m +CONFIG_VIDEO_GO7007_USB=m +CONFIG_VIDEO_GO7007_LOADER=m +CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m +CONFIG_VIDEO_HDPVR=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +CONFIG_VIDEO_PVRUSB2_DVB=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_STK1160=m + +# +# Analog/digital TV USB devices +# +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_AU0828_V4L2=y +CONFIG_VIDEO_AU0828_RC=y +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_RC=y +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m + +# +# Digital TV USB devices +# +CONFIG_DVB_AS102=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB_ZD1301=m +CONFIG_DVB_USB=m +# CONFIG_DVB_USB_DEBUG is not set +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +# CONFIG_DVB_USB_CXUSB_ANALOG is not set +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIB3000MC=m +CONFIG_DVB_USB_DIBUSB_MB=m +# CONFIG_DVB_USB_DIBUSB_MB_FAULTY is not set +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +CONFIG_SMS_USB_DRV=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m + +# +# Webcam, TV (analog/digital) USB devices +# +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=m + +# +# Software defined radio USB devices +# +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +# CONFIG_USB_MSI2500 is not set +# CONFIG_MEDIA_PCI_SUPPORT is not set +CONFIG_RADIO_ADAPTERS=m +CONFIG_RADIO_MAXIRADIO=m +# CONFIG_RADIO_SAA7706H is not set +CONFIG_RADIO_SHARK=m +CONFIG_RADIO_SHARK2=m +CONFIG_RADIO_SI4713=m +CONFIG_RADIO_TEA575X=m +# CONFIG_RADIO_TEA5764 is not set +# CONFIG_RADIO_TEF6862 is not set +CONFIG_USB_DSBR=m +CONFIG_USB_KEENE=m +CONFIG_USB_MA901=m +CONFIG_USB_MR800=m +CONFIG_USB_RAREMONO=m +CONFIG_RADIO_SI470X=m +CONFIG_USB_SI470X=m +# CONFIG_I2C_SI470X is not set +CONFIG_USB_SI4713=m +# CONFIG_PLATFORM_SI4713 is not set +CONFIG_I2C_SI4713=m +CONFIG_MEDIA_PLATFORM_DRIVERS=y +CONFIG_V4L_PLATFORM_DRIVERS=y +# CONFIG_SDR_PLATFORM_DRIVERS is not set +# CONFIG_DVB_PLATFORM_DRIVERS is not set +CONFIG_V4L_MEM2MEM_DRIVERS=y +# CONFIG_VIDEO_MEM2MEM_DEINTERLACE is not set +# CONFIG_VIDEO_MUX is not set + +# +# Allegro DVT media platform drivers +# + +# +# Amlogic media platform drivers +# + +# +# Amphion drivers +# + +# +# Apple media platform drivers +# +CONFIG_VIDEO_APPLE_ISP=m +CONFIG_VIDEO_APPLE_AVD=m + +# +# ARM media platform drivers +# + +# +# Aspeed media platform drivers +# + +# +# Atmel media platform drivers +# + +# +# Cadence media platform drivers +# +# CONFIG_VIDEO_CADENCE_CSI2RX is not set +# CONFIG_VIDEO_CADENCE_CSI2TX is not set + +# +# Chips&Media media platform drivers +# + +# +# Intel media platform drivers +# + +# +# Marvell media platform drivers +# +# CONFIG_VIDEO_CAFE_CCIC is not set + +# +# Mediatek media platform drivers +# + +# +# Microchip Technology, Inc. media platform drivers +# + +# +# Nuvoton media platform drivers +# + +# +# NVidia media platform drivers +# + +# +# NXP media platform drivers +# + +# +# Qualcomm media platform drivers +# + +# +# Raspberry Pi media platform drivers +# +# CONFIG_VIDEO_RP1_CFE is not set + +# +# Renesas media platform drivers +# + +# +# Rockchip media platform drivers +# + +# +# Samsung media platform drivers +# + +# +# STMicroelectronics media platform drivers +# + +# +# Sunxi media platform drivers +# + +# +# Texas Instruments drivers +# + +# +# Verisilicon media platform drivers +# + +# +# VIA media platform drivers +# + +# +# Xilinx media platform drivers +# +# CONFIG_VIDEO_XILINX is not set + +# +# MMC/SDIO DVB adapters +# +# CONFIG_SMS_SDIO_DRV is not set +# CONFIG_V4L_TEST_DRIVERS is not set +# CONFIG_DVB_TEST_DRIVERS is not set +CONFIG_MEDIA_COMMON_OPTIONS=y + +# +# common driver options +# +CONFIG_CYPRESS_FIRMWARE=m +CONFIG_TTPCI_EEPROM=m +CONFIG_UVC_COMMON=m +CONFIG_VIDEO_CX2341X=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_DVB_B2C2_FLEXCOP=m +CONFIG_SMS_SIANO_MDTV=m +CONFIG_SMS_SIANO_RC=y +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_V4L2=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m +CONFIG_VIDEOBUF2_DMA_SG=m +# end of Media drivers + +# +# Media ancillary drivers +# +CONFIG_MEDIA_ATTACH=y + +# +# IR I2C driver auto-selected by 'Autoselect ancillary drivers' +# +CONFIG_VIDEO_IR_I2C=m +CONFIG_VIDEO_CAMERA_SENSOR=y +# CONFIG_VIDEO_ALVIUM_CSI2 is not set +# CONFIG_VIDEO_AR0521 is not set +# CONFIG_VIDEO_GC0308 is not set +# CONFIG_VIDEO_GC0310 is not set +# CONFIG_VIDEO_GC05A2 is not set +# CONFIG_VIDEO_GC08A3 is not set +# CONFIG_VIDEO_GC2145 is not set +# CONFIG_VIDEO_HI556 is not set +# CONFIG_VIDEO_HI846 is not set +# CONFIG_VIDEO_HI847 is not set +# CONFIG_VIDEO_IMX111 is not set +# CONFIG_VIDEO_IMX208 is not set +# CONFIG_VIDEO_IMX214 is not set +# CONFIG_VIDEO_IMX219 is not set +# CONFIG_VIDEO_IMX258 is not set +# CONFIG_VIDEO_IMX274 is not set +# CONFIG_VIDEO_IMX283 is not set +# CONFIG_VIDEO_IMX290 is not set +# CONFIG_VIDEO_IMX296 is not set +# CONFIG_VIDEO_IMX319 is not set +# CONFIG_VIDEO_IMX334 is not set +# CONFIG_VIDEO_IMX335 is not set +# CONFIG_VIDEO_IMX355 is not set +# CONFIG_VIDEO_IMX412 is not set +# CONFIG_VIDEO_IMX415 is not set +# CONFIG_VIDEO_MT9M001 is not set +# CONFIG_VIDEO_MT9M111 is not set +# CONFIG_VIDEO_MT9M114 is not set +# CONFIG_VIDEO_MT9P031 is not set +# CONFIG_VIDEO_MT9T112 is not set +CONFIG_VIDEO_MT9V011=m +# CONFIG_VIDEO_MT9V032 is not set +# CONFIG_VIDEO_MT9V111 is not set +# CONFIG_VIDEO_OG01A1B is not set +# CONFIG_VIDEO_OG0VE1B is not set +# CONFIG_VIDEO_OS05B10 is not set +# CONFIG_VIDEO_OV01A10 is not set +# CONFIG_VIDEO_OV02A10 is not set +# CONFIG_VIDEO_OV02E10 is not set +# CONFIG_VIDEO_OV02C10 is not set +# CONFIG_VIDEO_OV08D10 is not set +# CONFIG_VIDEO_OV08X40 is not set +# CONFIG_VIDEO_OV13858 is not set +# CONFIG_VIDEO_OV13B10 is not set +CONFIG_VIDEO_OV2640=m +# CONFIG_VIDEO_OV2659 is not set +# CONFIG_VIDEO_OV2680 is not set +# CONFIG_VIDEO_OV2685 is not set +# CONFIG_VIDEO_OV2732 is not set +# CONFIG_VIDEO_OV2735 is not set +# CONFIG_VIDEO_OV4689 is not set +# CONFIG_VIDEO_OV5640 is not set +# CONFIG_VIDEO_OV5645 is not set +# CONFIG_VIDEO_OV5647 is not set +# CONFIG_VIDEO_OV5648 is not set +# CONFIG_VIDEO_OV5670 is not set +# CONFIG_VIDEO_OV5675 is not set +# CONFIG_VIDEO_OV5693 is not set +# CONFIG_VIDEO_OV5695 is not set +# CONFIG_VIDEO_OV6211 is not set +# CONFIG_VIDEO_OV64A40 is not set +# CONFIG_VIDEO_OV7251 is not set +CONFIG_VIDEO_OV7640=m +# CONFIG_VIDEO_OV7670 is not set +# CONFIG_VIDEO_OV772X is not set +# CONFIG_VIDEO_OV7740 is not set +# CONFIG_VIDEO_OV8856 is not set +# CONFIG_VIDEO_OV8858 is not set +# CONFIG_VIDEO_OV8865 is not set +# CONFIG_VIDEO_OV9282 is not set +# CONFIG_VIDEO_OV9640 is not set +# CONFIG_VIDEO_OV9650 is not set +# CONFIG_VIDEO_RDACM20 is not set +# CONFIG_VIDEO_RDACM21 is not set +# CONFIG_VIDEO_RJ54N1 is not set +# CONFIG_VIDEO_S5C73M3 is not set +# CONFIG_VIDEO_S5K3M5 is not set +# CONFIG_VIDEO_S5K5BAF is not set +# CONFIG_VIDEO_S5K6A3 is not set +# CONFIG_VIDEO_S5KJN1 is not set +# CONFIG_VIDEO_VD55G1 is not set +# CONFIG_VIDEO_VD56G3 is not set +# CONFIG_VIDEO_VGXY61 is not set +# CONFIG_VIDEO_CCS is not set +# CONFIG_VIDEO_ET8EK8 is not set + +# +# Camera ISPs +# +# CONFIG_VIDEO_THP7312 is not set +# end of Camera ISPs + +CONFIG_VIDEO_CAMERA_LENS=y +# CONFIG_VIDEO_AD5820 is not set +# CONFIG_VIDEO_AK7375 is not set +# CONFIG_VIDEO_DW9714 is not set +# CONFIG_VIDEO_DW9719 is not set +# CONFIG_VIDEO_DW9768 is not set +# CONFIG_VIDEO_DW9807_VCM is not set + +# +# Flash devices +# +# CONFIG_VIDEO_ADP1653 is not set +# CONFIG_VIDEO_LM3560 is not set +# CONFIG_VIDEO_LM3646 is not set +# end of Flash devices + +# +# Audio decoders, processors and mixers +# +CONFIG_VIDEO_CS3308=m +CONFIG_VIDEO_CS5345=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_SONY_BTF_MPX=m +# CONFIG_VIDEO_TDA1997X is not set +CONFIG_VIDEO_TDA7432=m +CONFIG_VIDEO_TDA9840=m +CONFIG_VIDEO_TEA6415C=m +CONFIG_VIDEO_TEA6420=m +# CONFIG_VIDEO_TLV320AIC23B is not set +CONFIG_VIDEO_TVAUDIO=m +CONFIG_VIDEO_UDA1342=m +CONFIG_VIDEO_VP27SMPX=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_WM8775=m +# end of Audio decoders, processors and mixers + +# +# RDS decoders +# +CONFIG_VIDEO_SAA6588=m +# end of RDS decoders + +# +# Video decoders +# +# CONFIG_VIDEO_ADV7180 is not set +# CONFIG_VIDEO_ADV7183 is not set +# CONFIG_VIDEO_ADV748X is not set +# CONFIG_VIDEO_ADV7604 is not set +# CONFIG_VIDEO_ADV7842 is not set +# CONFIG_VIDEO_BT819 is not set +# CONFIG_VIDEO_BT856 is not set +# CONFIG_VIDEO_BT866 is not set +# CONFIG_VIDEO_ISL7998X is not set +# CONFIG_VIDEO_KS0127 is not set +# CONFIG_VIDEO_MAX9286 is not set +# CONFIG_VIDEO_ML86V7667 is not set +# CONFIG_VIDEO_SAA7110 is not set +CONFIG_VIDEO_SAA711X=m +# CONFIG_VIDEO_TC358743 is not set +# CONFIG_VIDEO_TC358746 is not set +# CONFIG_VIDEO_TVP514X is not set +CONFIG_VIDEO_TVP5150=m +# CONFIG_VIDEO_TVP7002 is not set +CONFIG_VIDEO_TW2804=m +# CONFIG_VIDEO_TW9900 is not set +CONFIG_VIDEO_TW9903=m +CONFIG_VIDEO_TW9906=m +# CONFIG_VIDEO_TW9910 is not set +# CONFIG_VIDEO_VPX3220 is not set + +# +# Video and audio decoders +# +CONFIG_VIDEO_SAA717X=m +CONFIG_VIDEO_CX25840=m +# end of Video decoders + +# +# Video encoders +# +# CONFIG_VIDEO_ADV7170 is not set +# CONFIG_VIDEO_ADV7175 is not set +# CONFIG_VIDEO_ADV7343 is not set +# CONFIG_VIDEO_ADV7393 is not set +# CONFIG_VIDEO_ADV7511 is not set +# CONFIG_VIDEO_AK881X is not set +# CONFIG_VIDEO_SAA7127 is not set +# CONFIG_VIDEO_SAA7185 is not set +# CONFIG_VIDEO_THS8200 is not set +# end of Video encoders + +# +# Video improvement chips +# +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m +# end of Video improvement chips + +# +# Audio/Video compression chips +# +CONFIG_VIDEO_SAA6752HS=m +# end of Audio/Video compression chips + +# +# SDR tuner chips +# +# CONFIG_SDR_MAX2175 is not set +# end of SDR tuner chips + +# +# Miscellaneous helper chips +# +# CONFIG_VIDEO_I2C is not set +CONFIG_VIDEO_M52790=m +# CONFIG_VIDEO_ST_MIPID02 is not set +# CONFIG_VIDEO_THS7303 is not set +# end of Miscellaneous helper chips + +# +# Video serializers and deserializers +# +# CONFIG_VIDEO_DS90UB913 is not set +# CONFIG_VIDEO_DS90UB953 is not set +# CONFIG_VIDEO_DS90UB960 is not set +# CONFIG_VIDEO_MAX96714 is not set +# CONFIG_VIDEO_MAX96717 is not set +# end of Video serializers and deserializers + +# +# Media SPI Adapters +# +# CONFIG_CXD2880_SPI_DRV is not set +# CONFIG_VIDEO_GS1662 is not set +# end of Media SPI Adapters + +CONFIG_MEDIA_TUNER=m + +# +# Customize TV tuners +# +CONFIG_MEDIA_TUNER_E4000=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m +CONFIG_MEDIA_TUNER_FC2580=m +CONFIG_MEDIA_TUNER_IT913X=m +CONFIG_MEDIA_TUNER_M88RS6000T=m +CONFIG_MEDIA_TUNER_MAX2165=m +CONFIG_MEDIA_TUNER_MC44S803=m +# CONFIG_MEDIA_TUNER_MSI001 is not set +CONFIG_MEDIA_TUNER_MT2060=m +CONFIG_MEDIA_TUNER_MT2063=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_MT2131=m +CONFIG_MEDIA_TUNER_MT2266=m +CONFIG_MEDIA_TUNER_MXL301RF=m +CONFIG_MEDIA_TUNER_MXL5005S=m +CONFIG_MEDIA_TUNER_MXL5007T=m +CONFIG_MEDIA_TUNER_QM1D1B0004=m +CONFIG_MEDIA_TUNER_QM1D1C0042=m +CONFIG_MEDIA_TUNER_QT1010=m +CONFIG_MEDIA_TUNER_R820T=m +CONFIG_MEDIA_TUNER_SI2157=m +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_TDA18250=m +CONFIG_MEDIA_TUNER_TDA18271=m +CONFIG_MEDIA_TUNER_TDA827X=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_TUA9001=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC4000=m +CONFIG_MEDIA_TUNER_XC5000=m +# end of Customize TV tuners + +# +# Customise DVB Frontends +# + +# +# Multistandard (satellite) frontends +# +CONFIG_DVB_M88DS3103=m +CONFIG_DVB_MXL5XX=m +CONFIG_DVB_STB0899=m +CONFIG_DVB_STB6100=m +CONFIG_DVB_STV090x=m +CONFIG_DVB_STV0910=m +CONFIG_DVB_STV6110x=m +CONFIG_DVB_STV6111=m + +# +# Multistandard (cable + terrestrial) frontends +# +CONFIG_DVB_DRXK=m +CONFIG_DVB_MN88472=m +CONFIG_DVB_MN88473=m +CONFIG_DVB_SI2165=m +CONFIG_DVB_TDA18271C2DD=m + +# +# DVB-S (satellite) frontends +# +CONFIG_DVB_CX24110=m +CONFIG_DVB_CX24116=m +CONFIG_DVB_CX24117=m +CONFIG_DVB_CX24120=m +CONFIG_DVB_CX24123=m +CONFIG_DVB_DS3000=m +CONFIG_DVB_MB86A16=m +CONFIG_DVB_MT312=m +CONFIG_DVB_S5H1420=m +CONFIG_DVB_SI21XX=m +CONFIG_DVB_STB6000=m +CONFIG_DVB_STV0288=m +CONFIG_DVB_STV0299=m +CONFIG_DVB_STV0900=m +CONFIG_DVB_STV6110=m +CONFIG_DVB_TDA10071=m +CONFIG_DVB_TDA10086=m +CONFIG_DVB_TDA8083=m +CONFIG_DVB_TDA8261=m +CONFIG_DVB_TDA826X=m +CONFIG_DVB_TS2020=m +CONFIG_DVB_TUA6100=m +CONFIG_DVB_TUNER_CX24113=m +CONFIG_DVB_TUNER_ITD1000=m +CONFIG_DVB_VES1X93=m +CONFIG_DVB_ZL10036=m +CONFIG_DVB_ZL10039=m + +# +# DVB-T (terrestrial) frontends +# +CONFIG_DVB_AF9013=m +CONFIG_DVB_AS102_FE=m +CONFIG_DVB_CX22700=m +CONFIG_DVB_CX22702=m +CONFIG_DVB_CXD2820R=m +CONFIG_DVB_CXD2841ER=m +CONFIG_DVB_DIB3000MB=m +CONFIG_DVB_DIB3000MC=m +CONFIG_DVB_DIB7000M=m +CONFIG_DVB_DIB7000P=m +# CONFIG_DVB_DIB9000 is not set +CONFIG_DVB_DRXD=m +CONFIG_DVB_EC100=m +CONFIG_DVB_GP8PSK_FE=m +CONFIG_DVB_L64781=m +CONFIG_DVB_MT352=m +CONFIG_DVB_NXT6000=m +CONFIG_DVB_RTL2830=m +CONFIG_DVB_RTL2832=m +CONFIG_DVB_RTL2832_SDR=m +# CONFIG_DVB_S5H1432 is not set +CONFIG_DVB_SI2168=m +CONFIG_DVB_SP887X=m +CONFIG_DVB_STV0367=m +CONFIG_DVB_TDA10048=m +CONFIG_DVB_TDA1004X=m +CONFIG_DVB_ZD1301_DEMOD=m +CONFIG_DVB_ZL10353=m +# CONFIG_DVB_CXD2880 is not set + +# +# DVB-C (cable) frontends +# +CONFIG_DVB_STV0297=m +CONFIG_DVB_TDA10021=m +CONFIG_DVB_TDA10023=m +CONFIG_DVB_VES1820=m + +# +# ATSC (North American/Korean Terrestrial/Cable DTV) frontends +# +CONFIG_DVB_AU8522=m +CONFIG_DVB_AU8522_DTV=m +CONFIG_DVB_AU8522_V4L=m +CONFIG_DVB_BCM3510=m +CONFIG_DVB_LG2160=m +CONFIG_DVB_LGDT3305=m +CONFIG_DVB_LGDT3306A=m +CONFIG_DVB_LGDT330X=m +CONFIG_DVB_MXL692=m +CONFIG_DVB_NXT200X=m +CONFIG_DVB_OR51132=m +CONFIG_DVB_OR51211=m +CONFIG_DVB_S5H1409=m +CONFIG_DVB_S5H1411=m + +# +# ISDB-T (terrestrial) frontends +# +CONFIG_DVB_DIB8000=m +CONFIG_DVB_MB86A20S=m +CONFIG_DVB_S921=m + +# +# ISDB-S (satellite) & ISDB-T (terrestrial) frontends +# +# CONFIG_DVB_MN88443X is not set +CONFIG_DVB_TC90522=m + +# +# Digital terrestrial only tuners/PLL +# +CONFIG_DVB_PLL=m +CONFIG_DVB_TUNER_DIB0070=m +CONFIG_DVB_TUNER_DIB0090=m + +# +# SEC control devices for DVB-S +# +CONFIG_DVB_A8293=m +CONFIG_DVB_AF9033=m +# CONFIG_DVB_ASCOT2E is not set +CONFIG_DVB_ATBM8830=m +# CONFIG_DVB_HELENE is not set +# CONFIG_DVB_HORUS3A is not set +CONFIG_DVB_ISL6405=m +CONFIG_DVB_ISL6421=m +CONFIG_DVB_ISL6423=m +CONFIG_DVB_IX2505V=m +# CONFIG_DVB_LGS8GL5 is not set +CONFIG_DVB_LGS8GXX=m +CONFIG_DVB_LNBH25=m +# CONFIG_DVB_LNBH29 is not set +CONFIG_DVB_LNBP21=m +CONFIG_DVB_LNBP22=m +CONFIG_DVB_M88RS2000=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_DRX39XYJ=m + +# +# Common Interface (EN50221) controller drivers +# +CONFIG_DVB_CXD2099=m +CONFIG_DVB_SP2=m +# end of Customise DVB Frontends + +# +# Tools to develop new frontends +# +# CONFIG_DVB_DUMMY_FE is not set +# end of Media ancillary drivers + +# +# Graphics support +# +CONFIG_APERTURE_HELPERS=y +CONFIG_VIDEO=y +# CONFIG_AUXDISPLAY is not set +# CONFIG_NOVA_CORE is not set +CONFIG_DRM=y + +# +# DRM debugging options +# +# CONFIG_DRM_WERROR is not set +# CONFIG_DRM_DEBUG_MM is not set +# end of DRM debugging options + +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_KMS_HELPER=y +# CONFIG_DRM_PANIC is not set +# CONFIG_DRM_RAS is not set +# CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set +# CONFIG_DRM_DEBUG_MODESET_LOCK is not set +CONFIG_DRM_CLIENT=y +CONFIG_DRM_CLIENT_LIB=y +CONFIG_DRM_CLIENT_SELECTION=y +CONFIG_DRM_CLIENT_SETUP=y + +# +# Supported DRM clients +# +CONFIG_DRM_FBDEV_EMULATION=y +CONFIG_DRM_FBDEV_OVERALLOC=100 +# CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set +# CONFIG_DRM_CLIENT_LOG is not set +CONFIG_DRM_CLIENT_DEFAULT_FBDEV=y +CONFIG_DRM_CLIENT_DEFAULT="fbdev" +# end of Supported DRM clients + +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_DISPLAY_HELPER=m +CONFIG_DRM_BRIDGE_CONNECTOR=y +# CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set +# CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set +CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y +CONFIG_DRM_EXEC=y +CONFIG_DRM_GPUVM=y +CONFIG_DRM_GEM_DMA_HELPER=m +CONFIG_DRM_GEM_SHMEM_HELPER=y +CONFIG_RUST_DRM_GEM_SHMEM_HELPER=y +CONFIG_DRM_SCHED=y +CONFIG_DRM_ADP=m +# CONFIG_DRM_AMDGPU is not set +CONFIG_DRM_APPLE=m +CONFIG_DRM_APPLE_AUDIO=y +# CONFIG_DRM_APPLE_DEBUG is not set + +# +# ARM devices +# +# CONFIG_DRM_HDLCD is not set +# CONFIG_DRM_MALI_DISPLAY is not set +# CONFIG_DRM_KOMEDA is not set +# end of ARM devices + +CONFIG_RUST_DRM_SCHED=y +CONFIG_RUST_DRM_GPUVM=y +CONFIG_DRM_ASAHI=y +# CONFIG_DRM_ASAHI_DEBUG_ALLOCATOR is not set +# CONFIG_DRM_AST is not set +CONFIG_DRM_BRIDGE=y +CONFIG_DRM_PANEL_BRIDGE=y + +# +# Display Interface Bridges +# +# CONFIG_DRM_CHIPONE_ICN6211 is not set +# CONFIG_DRM_CHRONTEL_CH7033 is not set +# CONFIG_DRM_DISPLAY_CONNECTOR is not set +# CONFIG_DRM_I2C_NXP_TDA998X is not set +# CONFIG_DRM_ITE_IT6263 is not set +# CONFIG_DRM_ITE_IT6505 is not set +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9211 is not set +# CONFIG_DRM_LONTIUM_LT9611 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +# CONFIG_DRM_LONTIUM_LT8713SX is not set +# CONFIG_DRM_ITE_IT66121 is not set +# CONFIG_DRM_LVDS_CODEC is not set +# CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW is not set +# CONFIG_DRM_NWL_MIPI_DSI is not set +# CONFIG_DRM_NXP_PTN3460 is not set +# CONFIG_DRM_PARADE_PS8622 is not set +# CONFIG_DRM_PARADE_PS8640 is not set +# CONFIG_DRM_SAMSUNG_DSIM is not set +# CONFIG_DRM_SIL_SII8620 is not set +# CONFIG_DRM_SII902X is not set +# CONFIG_DRM_SII9234 is not set +# CONFIG_DRM_SIMPLE_BRIDGE is not set +# CONFIG_DRM_SOLOMON_SSD2825 is not set +# CONFIG_DRM_THINE_THC63LVD1024 is not set +# CONFIG_DRM_TOSHIBA_TC358762 is not set +# CONFIG_DRM_TOSHIBA_TC358764 is not set +# CONFIG_DRM_TOSHIBA_TC358767 is not set +# CONFIG_DRM_TOSHIBA_TC358768 is not set +# CONFIG_DRM_TOSHIBA_TC358775 is not set +# CONFIG_DRM_TI_DLPC3433 is not set +# CONFIG_DRM_TI_TDP158 is not set +# CONFIG_DRM_TI_TFP410 is not set +# CONFIG_DRM_TI_SN65DSI83 is not set +# CONFIG_DRM_TI_SN65DSI86 is not set +# CONFIG_DRM_TI_TPD12S015 is not set +# CONFIG_DRM_WAVESHARE_BRIDGE is not set +# CONFIG_DRM_ANALOGIX_ANX6345 is not set +# CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ANALOGIX_ANX7625 is not set +# CONFIG_DRM_I2C_ADV7511 is not set +# CONFIG_DRM_CDNS_DSI is not set +# CONFIG_DRM_CDNS_MHDP8546 is not set +# end of Display Interface Bridges + +# CONFIG_DRM_ETNAVIV is not set +# CONFIG_DRM_GUD is not set +# CONFIG_DRM_HISI_HIBMC is not set +# CONFIG_DRM_HISI_KIRIN is not set +# CONFIG_DRM_POWERVR is not set +# CONFIG_DRM_LIMA is not set +# CONFIG_DRM_LOGICVC is not set +# CONFIG_DRM_MGAG200 is not set +# CONFIG_DRM_NOUVEAU is not set +# CONFIG_DRM_NOVA is not set +CONFIG_DRM_PANEL=y + +# +# Display Panels +# +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_ARM_VERSATILE is not set +# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set +# CONFIG_DRM_PANEL_AUO_A030JTN01 is not set +# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set +# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set +# CONFIG_DRM_PANEL_BOE_TD4320 is not set +# CONFIG_DRM_PANEL_BOE_TH101MB31UIG002_28A is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set +# CONFIG_DRM_PANEL_BOE_TV101WUM_LL2 is not set +# CONFIG_DRM_PANEL_EBBG_FT8719 is not set +# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set +# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set +# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set +# CONFIG_DRM_PANEL_DSI_CM is not set +# CONFIG_DRM_PANEL_LVDS is not set +# CONFIG_DRM_PANEL_HIMAX_HX8279 is not set +# CONFIG_DRM_PANEL_HIMAX_HX83102 is not set +# CONFIG_DRM_PANEL_HIMAX_HX83112A is not set +# CONFIG_DRM_PANEL_HIMAX_HX83112B is not set +# CONFIG_DRM_PANEL_HIMAX_HX83121A is not set +# CONFIG_DRM_PANEL_HIMAX_HX8394 is not set +# CONFIG_DRM_PANEL_HYDIS_HV101HD1 is not set +# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9806E_DSI is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set +# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set +# CONFIG_DRM_PANEL_JADARD_JD9365DA_H3 is not set +# CONFIG_DRM_PANEL_JDI_LPM102A188A is not set +# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set +# CONFIG_DRM_PANEL_JDI_R63452 is not set +# CONFIG_DRM_PANEL_KHADAS_TS050 is not set +# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set +# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set +# CONFIG_DRM_PANEL_LINCOLNTECH_LCD197 is not set +# CONFIG_DRM_PANEL_LG_LB035Q02 is not set +# CONFIG_DRM_PANEL_LG_LD070WX3 is not set +# CONFIG_DRM_PANEL_LG_LG4573 is not set +# CONFIG_DRM_PANEL_LG_SW43408 is not set +# CONFIG_DRM_PANEL_LXD_M9189A is not set +# CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966 is not set +# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set +# CONFIG_DRM_PANEL_MOTOROLA_MOT is not set +# CONFIG_DRM_PANEL_NEC_NL8048HL11 is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3051D is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36523 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672E is not set +# CONFIG_DRM_PANEL_NOVATEK_NT37700F is not set +# CONFIG_DRM_PANEL_NOVATEK_NT37801 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT39016 is not set +# CONFIG_DRM_PANEL_OLIMEX_LCD_OLINUXINO is not set +# CONFIG_DRM_PANEL_ORISETECH_OTA5601A is not set +# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set +# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set +# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set +# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM67200 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set +# CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set +# CONFIG_DRM_PANEL_RENESAS_R61307 is not set +# CONFIG_DRM_PANEL_RENESAS_R69328 is not set +# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set +# CONFIG_DRM_PANEL_SAMSUNG_AMS581VF01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_AMS639RQ08 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS427AP24 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E88A0_AMS452EF01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set +# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LD9040 is not set +# CONFIG_DRM_PANEL_SAMSUNG_LTL106HL02 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3FA7 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D7AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3FC2X01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA8 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E63M0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8AA5X01_AMS561RA01 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6E8FC0 is not set +# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set +# CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set +# CONFIG_DRM_PANEL_SHARP_LQ079L1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set +# CONFIG_DRM_PANEL_SHARP_LS037V7DW01 is not set +# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set +# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set +# CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_SONY_ACX565AKM is not set +# CONFIG_DRM_PANEL_SONY_TD4353_JDI is not set +# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set +# CONFIG_DRM_PANEL_STARTEK_KD070FHFID015 is not set +# CONFIG_DRM_PANEL_EDP is not set +CONFIG_DRM_PANEL_SIMPLE=m +CONFIG_DRM_PANEL_SUMMIT=m +# CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set +# CONFIG_DRM_PANEL_SYNAPTICS_TDDI is not set +# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set +# CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set +# CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set +# CONFIG_DRM_PANEL_TPO_TPG110 is not set +# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set +# CONFIG_DRM_PANEL_VISIONOX_G2647FB105 is not set +# CONFIG_DRM_PANEL_VISIONOX_R66451 is not set +# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set +# CONFIG_DRM_PANEL_VISIONOX_RM692E5 is not set +# CONFIG_DRM_PANEL_VISIONOX_VTDR6130 is not set +# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set +# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set +# end of Display Panels + +# CONFIG_DRM_PANFROST is not set +# CONFIG_DRM_PANTHOR is not set +# CONFIG_DRM_PL111 is not set +# CONFIG_DRM_QXL is not set +# CONFIG_DRM_RADEON is not set +# CONFIG_DRM_ST7571 is not set +# CONFIG_DRM_ST7586 is not set +# CONFIG_DRM_ST7735R is not set +# CONFIG_DRM_ST7920 is not set +# CONFIG_DRM_SSD130X is not set + +# +# Drivers for system framebuffers +# +CONFIG_DRM_SYSFB_HELPER=y +# CONFIG_DRM_EFIDRM is not set +CONFIG_DRM_SIMPLEDRM=y +# end of Drivers for system framebuffers + +# CONFIG_DRM_TIDSS is not set +# CONFIG_DRM_ARCPGU is not set +CONFIG_DRM_BOCHS=y +# CONFIG_DRM_CIRRUS_QEMU is not set +# CONFIG_DRM_GM12U320 is not set +# CONFIG_DRM_PANEL_MIPI_DBI is not set +# CONFIG_DRM_PIXPAPER is not set +# CONFIG_TINYDRM_HX8357D is not set +# CONFIG_TINYDRM_ILI9163 is not set +# CONFIG_TINYDRM_ILI9225 is not set +# CONFIG_TINYDRM_ILI9341 is not set +# CONFIG_TINYDRM_ILI9486 is not set +# CONFIG_TINYDRM_MI0283QT is not set +# CONFIG_TINYDRM_REPAPER is not set +# CONFIG_TINYDRM_SHARP_MEMORY is not set +# CONFIG_DRM_TYR is not set +# CONFIG_DRM_UDL is not set +# CONFIG_DRM_VGEM is not set +CONFIG_DRM_VIRTIO_GPU=m +CONFIG_DRM_VIRTIO_GPU_KMS=y +# CONFIG_DRM_VKMS is not set +# CONFIG_DRM_VMWGFX is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y + +# +# Frame buffer Devices +# +CONFIG_FB=y +# CONFIG_FB_CIRRUS is not set +# CONFIG_FB_PM2 is not set +# CONFIG_FB_CYBER2000 is not set +# CONFIG_FB_ASILIANT is not set +# CONFIG_FB_IMSTT is not set +# CONFIG_FB_UVESA is not set +# CONFIG_FB_EFI is not set +# CONFIG_FB_OPENCORES is not set +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_NVIDIA is not set +# CONFIG_FB_RIVA is not set +# CONFIG_FB_I740 is not set +# CONFIG_FB_MATROX is not set +# CONFIG_FB_RADEON is not set +# CONFIG_FB_ATY128 is not set +# CONFIG_FB_ATY is not set +# CONFIG_FB_S3 is not set +# CONFIG_FB_SAVAGE is not set +# CONFIG_FB_SIS is not set +# CONFIG_FB_NEOMAGIC is not set +# CONFIG_FB_KYRO is not set +# CONFIG_FB_3DFX is not set +# CONFIG_FB_VOODOO1 is not set +# CONFIG_FB_VT8623 is not set +# CONFIG_FB_TRIDENT is not set +# CONFIG_FB_ARK is not set +# CONFIG_FB_PM3 is not set +# CONFIG_FB_CARMINE is not set +# CONFIG_FB_SMSCUFX is not set +CONFIG_FB_UDL=m +# CONFIG_FB_IBM_GXT4500 is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_FB_SSD1307 is not set +# CONFIG_FB_SM712 is not set +CONFIG_FB_CORE=y +CONFIG_FB_NOTIFY=y +CONFIG_FB_DEVICE=y +CONFIG_FB_SYS_FILLRECT=y +CONFIG_FB_SYS_COPYAREA=y +CONFIG_FB_SYS_IMAGEBLIT=y +# CONFIG_FB_FOREIGN_ENDIAN is not set +CONFIG_FB_SYSMEM_FOPS=y +CONFIG_FB_DEFERRED_IO=y +CONFIG_FB_DMAMEM_HELPERS=y +CONFIG_FB_DMAMEM_HELPERS_DEFERRED=y +CONFIG_FB_SYSMEM_HELPERS=y +CONFIG_FB_SYSMEM_HELPERS_DEFERRED=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_TILEBLITTING=y +# end of Frame buffer Devices + +# +# Backlight & LCD device support +# +CONFIG_LCD_CLASS_DEVICE=m +# CONFIG_LCD_L4F00242T03 is not set +# CONFIG_LCD_LMS283GF05 is not set +# CONFIG_LCD_LTV350QV is not set +# CONFIG_LCD_ILI922X is not set +# CONFIG_LCD_ILI9320 is not set +# CONFIG_LCD_TDO24M is not set +# CONFIG_LCD_VGG2432A4 is not set +CONFIG_LCD_PLATFORM=m +# CONFIG_LCD_AMS369FG06 is not set +# CONFIG_LCD_LMS501KF03 is not set +# CONFIG_LCD_HX8357 is not set +# CONFIG_LCD_OTM3225A is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_AW99706 is not set +# CONFIG_BACKLIGHT_KTD253 is not set +# CONFIG_BACKLIGHT_KTD2801 is not set +# CONFIG_BACKLIGHT_KTZ8866 is not set +# CONFIG_BACKLIGHT_PWM is not set +# CONFIG_BACKLIGHT_APPLE_DWI is not set +# CONFIG_BACKLIGHT_QCOM_WLED is not set +# CONFIG_BACKLIGHT_ADP8860 is not set +# CONFIG_BACKLIGHT_ADP8870 is not set +# CONFIG_BACKLIGHT_LM3509 is not set +# CONFIG_BACKLIGHT_LM3630A is not set +# CONFIG_BACKLIGHT_LM3639 is not set +# CONFIG_BACKLIGHT_LP855X is not set +# CONFIG_BACKLIGHT_MP3309C is not set +CONFIG_BACKLIGHT_GPIO=m +# CONFIG_BACKLIGHT_LV5207LP is not set +# CONFIG_BACKLIGHT_BD6107 is not set +# CONFIG_BACKLIGHT_ARCXCNN is not set +# CONFIG_BACKLIGHT_LED is not set +# end of Backlight & LCD device support + +CONFIG_VIDEOMODE_HELPERS=y +CONFIG_HDMI=y +# CONFIG_FIRMWARE_EDID is not set + +# +# Console display driver support +# +CONFIG_DUMMY_CONSOLE=y +CONFIG_DUMMY_CONSOLE_COLUMNS=80 +CONFIG_DUMMY_CONSOLE_ROWS=25 +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set +# end of Console display driver support + +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_LOGO_LINUX_CLUT224_FILE="drivers/video/logo/logo_linux_clut224.ppm" +CONFIG_TRACE_GPU_MEM=y +# end of Graphics support + +CONFIG_DRM_ACCEL=y +# CONFIG_DRM_ACCEL_ARM_ETHOSU is not set +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SOUND_OSS_CORE_PRECLAIM=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_DMAENGINE_PCM=y +CONFIG_SND_HWDEP=m +CONFIG_SND_SEQ_DEVICE=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_COMPRESS_OFFLOAD=y +CONFIG_SND_COMPRESS_ACCEL=y +CONFIG_SND_JACK=y +CONFIG_SND_JACK_INPUT_DEV=y +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +CONFIG_SND_PCM_TIMER=y +CONFIG_SND_HRTIMER=m +CONFIG_SND_DYNAMIC_MINORS=y +CONFIG_SND_MAX_CARDS=32 +# CONFIG_SND_SUPPORT_OLD_API is not set +CONFIG_SND_PROC_FS=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_CTL_FAST_LOOKUP=y +# CONFIG_SND_DEBUG is not set +CONFIG_SND_CTL_INPUT_VALIDATION=y +# CONFIG_SND_UTIMER is not set +CONFIG_SND_VMASTER=y +CONFIG_SND_SEQUENCER=m +CONFIG_SND_SEQ_DUMMY=m +CONFIG_SND_SEQUENCER_OSS=m +CONFIG_SND_SEQ_HRTIMER_DEFAULT=y +CONFIG_SND_SEQ_MIDI_EVENT=m +CONFIG_SND_SEQ_MIDI=m +CONFIG_SND_SEQ_VIRMIDI=m +# CONFIG_SND_SEQ_UMP is not set +CONFIG_SND_MPU401_UART=m +CONFIG_SND_DRIVERS=y +CONFIG_SND_DUMMY=m +CONFIG_SND_ALOOP=m +# CONFIG_SND_PCMTEST is not set +CONFIG_SND_VIRMIDI=m +CONFIG_SND_MTPAV=m +CONFIG_SND_SERIAL_U16550=m +# CONFIG_SND_SERIAL_GENERIC is not set +CONFIG_SND_MPU401=m +# CONFIG_SND_PCI is not set + +# +# HD-Audio +# +# CONFIG_SND_HDA_INTEL is not set +# end of HD-Audio + +# CONFIG_SND_SPI is not set +CONFIG_SND_USB=y +CONFIG_SND_USB_AUDIO=m +# CONFIG_SND_USB_AUDIO_MIDI_V2 is not set +CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y +CONFIG_SND_USB_UA101=m +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m +# CONFIG_SND_BCD2000 is not set +CONFIG_SND_USB_LINE6=m +CONFIG_SND_USB_POD=m +CONFIG_SND_USB_PODHD=m +CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_USB_VARIAX=m +CONFIG_SND_SOC=y +CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y +CONFIG_SND_SOC_COMPRESS=y +# CONFIG_SND_SOC_USB is not set + +# +# Analog Devices +# +# CONFIG_SND_SOC_ADI_AXI_I2S is not set +# CONFIG_SND_SOC_ADI_AXI_SPDIF is not set +# end of Analog Devices + +# +# AMD +# +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_AMD_ACP_CONFIG is not set +# end of AMD + +# +# Apple +# +CONFIG_SND_SOC_APPLE_AOP_AUDIO=m +CONFIG_SND_SOC_APPLE_MCA=m +CONFIG_SND_SOC_APPLE_MACAUDIO=m +# end of Apple + +# +# Atmel +# +# CONFIG_SND_SOC_MIKROE_PROTO is not set +# end of Atmel + +# +# Au1x +# +# end of Au1x + +# +# Broadcom +# +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# end of Broadcom + +# +# Cirrus Logic +# +# end of Cirrus Logic + +# +# DesignWare +# +# CONFIG_SND_DESIGNWARE_I2S is not set +# end of DesignWare + +# +# Freescale +# + +# +# Common SoC Audio options for Freescale CPUs: +# +CONFIG_SND_SOC_FSL_ASRC=m +CONFIG_SND_SOC_FSL_SAI=m +# CONFIG_SND_SOC_FSL_MQS is not set +CONFIG_SND_SOC_FSL_AUDMIX=m +CONFIG_SND_SOC_FSL_SSI=m +CONFIG_SND_SOC_FSL_SPDIF=m +CONFIG_SND_SOC_FSL_ESAI=m +CONFIG_SND_SOC_FSL_MICFIL=m +CONFIG_SND_SOC_FSL_EASRC=m +# CONFIG_SND_SOC_FSL_XCVR is not set +CONFIG_SND_SOC_FSL_UTILS=m +CONFIG_SND_SOC_IMX_AUDMUX=m +# end of Freescale + +# +# Google +# +# CONFIG_SND_SOC_CHV3_I2S is not set +# end of Google + +# +# Hisilicon +# +# CONFIG_SND_I2S_HI6210_I2S is not set +# end of Hisilicon + +# +# JZ4740 +# +# end of JZ4740 + +# +# Kirkwood +# +# end of Kirkwood + +# +# Loongson +# +# end of Loongson + +# +# Intel +# +# end of Intel + +# +# Mediatek +# +# CONFIG_SND_SOC_MTK_BTCVSD is not set +# end of Mediatek + +# +# PXA +# +# end of PXA + +# +# SoundWire (SDCA) +# +CONFIG_SND_SOC_SDCA_OPTIONAL=y +# end of SoundWire (SDCA) + +# +# ST SPEAr +# +# end of ST SPEAr + +# +# Spreadtrum +# +# end of Spreadtrum + +# +# STMicroelectronics STM32 +# +# end of STMicroelectronics STM32 + +# +# Tegra +# +# end of Tegra + +# +# Xilinx +# +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# end of Xilinx + +# +# Xtensa +# +# CONFIG_SND_SOC_XTFPGA_I2S is not set +# end of Xtensa + +# CONFIG_SND_SOC_SOF_TOPLEVEL is not set +CONFIG_SND_SOC_I2C_AND_SPI=y + +# +# CODEC drivers +# +CONFIG_SND_SOC_WM_ADSP=m +# CONFIG_SND_SOC_AC97_CODEC is not set +# CONFIG_SND_SOC_ADAU1372_I2C is not set +# CONFIG_SND_SOC_ADAU1372_SPI is not set +# CONFIG_SND_SOC_ADAU1373 is not set +# CONFIG_SND_SOC_ADAU1701 is not set +# CONFIG_SND_SOC_ADAU1761_I2C is not set +# CONFIG_SND_SOC_ADAU1761_SPI is not set +# CONFIG_SND_SOC_ADAU7002 is not set +# CONFIG_SND_SOC_ADAU7118_HW is not set +# CONFIG_SND_SOC_ADAU7118_I2C is not set +# CONFIG_SND_SOC_AK4104 is not set +# CONFIG_SND_SOC_AK4118 is not set +# CONFIG_SND_SOC_AK4375 is not set +# CONFIG_SND_SOC_AK4458 is not set +# CONFIG_SND_SOC_AK4554 is not set +# CONFIG_SND_SOC_AK4613 is not set +# CONFIG_SND_SOC_AK4619 is not set +# CONFIG_SND_SOC_AK4642 is not set +# CONFIG_SND_SOC_AK5386 is not set +# CONFIG_SND_SOC_AK5558 is not set +# CONFIG_SND_SOC_ALC5623 is not set +# CONFIG_SND_SOC_AUDIO_IIO_AUX is not set +# CONFIG_SND_SOC_AW8738 is not set +# CONFIG_SND_SOC_AW88395 is not set +# CONFIG_SND_SOC_AW88166 is not set +# CONFIG_SND_SOC_AW88261 is not set +# CONFIG_SND_SOC_AW88081 is not set +# CONFIG_SND_SOC_AW87390 is not set +# CONFIG_SND_SOC_AW88399 is not set +# CONFIG_SND_SOC_BD28623 is not set +CONFIG_SND_SOC_BT_SCO=m +# CONFIG_SND_SOC_CHV3_CODEC is not set +CONFIG_SND_SOC_CS35L32=m +CONFIG_SND_SOC_CS35L33=m +CONFIG_SND_SOC_CS35L34=m +CONFIG_SND_SOC_CS35L35=m +CONFIG_SND_SOC_CS35L36=m +CONFIG_SND_SOC_CS35L41_LIB=m +CONFIG_SND_SOC_CS35L41=m +CONFIG_SND_SOC_CS35L41_SPI=m +CONFIG_SND_SOC_CS35L41_I2C=m +CONFIG_SND_SOC_CS35L45=m +CONFIG_SND_SOC_CS35L45_SPI=m +CONFIG_SND_SOC_CS35L45_I2C=m +# CONFIG_SND_SOC_CS35L56_I2C is not set +# CONFIG_SND_SOC_CS35L56_SPI is not set +CONFIG_SND_SOC_CS42L42_CORE=m +CONFIG_SND_SOC_CS42L42=m +CONFIG_SND_SOC_CS42L51=m +CONFIG_SND_SOC_CS42L51_I2C=m +CONFIG_SND_SOC_CS42L52=m +CONFIG_SND_SOC_CS42L56=m +CONFIG_SND_SOC_CS42L73=m +CONFIG_SND_SOC_CS42L83=m +CONFIG_SND_SOC_CS42L84=m +CONFIG_SND_SOC_CS4234=m +CONFIG_SND_SOC_CS4265=m +CONFIG_SND_SOC_CS4270=m +CONFIG_SND_SOC_CS4271=m +CONFIG_SND_SOC_CS4271_I2C=m +CONFIG_SND_SOC_CS4271_SPI=m +CONFIG_SND_SOC_CS42XX8=m +CONFIG_SND_SOC_CS42XX8_I2C=m +CONFIG_SND_SOC_CS43130=m +CONFIG_SND_SOC_CS4341=m +CONFIG_SND_SOC_CS4349=m +# CONFIG_SND_SOC_CS48L32 is not set +CONFIG_SND_SOC_CS53L30=m +# CONFIG_SND_SOC_CS530X_I2C is not set +# CONFIG_SND_SOC_CS530X_SPI is not set +# CONFIG_SND_SOC_CX2072X is not set +# CONFIG_SND_SOC_DA7213 is not set +# CONFIG_SND_SOC_DMIC is not set +# CONFIG_SND_SOC_ES7134 is not set +# CONFIG_SND_SOC_ES7241 is not set +# CONFIG_SND_SOC_ES8311 is not set +# CONFIG_SND_SOC_ES8316 is not set +# CONFIG_SND_SOC_ES8323 is not set +# CONFIG_SND_SOC_ES8326 is not set +# CONFIG_SND_SOC_ES8328_I2C is not set +# CONFIG_SND_SOC_ES8328_SPI is not set +# CONFIG_SND_SOC_ES8375 is not set +# CONFIG_SND_SOC_ES8389 is not set +# CONFIG_SND_SOC_FS210X is not set +# CONFIG_SND_SOC_GTM601 is not set +# CONFIG_SND_SOC_HDA is not set +# CONFIG_SND_SOC_ICS43432 is not set +# CONFIG_SND_SOC_IDT821034 is not set +# CONFIG_SND_SOC_MAX98088 is not set +# CONFIG_SND_SOC_MAX98090 is not set +# CONFIG_SND_SOC_MAX98357A is not set +# CONFIG_SND_SOC_MAX98504 is not set +# CONFIG_SND_SOC_MAX9867 is not set +# CONFIG_SND_SOC_MAX98927 is not set +# CONFIG_SND_SOC_MAX98520 is not set +# CONFIG_SND_SOC_MAX98373_I2C is not set +# CONFIG_SND_SOC_MAX98388 is not set +# CONFIG_SND_SOC_MAX98390 is not set +# CONFIG_SND_SOC_MAX98396 is not set +# CONFIG_SND_SOC_MAX9860 is not set +# CONFIG_SND_SOC_MSM8916_WCD_ANALOG is not set +# CONFIG_SND_SOC_MSM8916_WCD_DIGITAL is not set +# CONFIG_SND_SOC_PCM1681 is not set +# CONFIG_SND_SOC_PCM1754 is not set +# CONFIG_SND_SOC_PCM1789_I2C is not set +# CONFIG_SND_SOC_PCM179X_I2C is not set +# CONFIG_SND_SOC_PCM179X_SPI is not set +# CONFIG_SND_SOC_PCM186X_I2C is not set +# CONFIG_SND_SOC_PCM186X_SPI is not set +# CONFIG_SND_SOC_PCM3060_I2C is not set +# CONFIG_SND_SOC_PCM3060_SPI is not set +# CONFIG_SND_SOC_PCM3168A_I2C is not set +# CONFIG_SND_SOC_PCM3168A_SPI is not set +# CONFIG_SND_SOC_PCM5102A is not set +# CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_PCM6240 is not set +# CONFIG_SND_SOC_PEB2466 is not set +# CONFIG_SND_SOC_RT5575 is not set +# CONFIG_SND_SOC_RT5616 is not set +# CONFIG_SND_SOC_RT5631 is not set +# CONFIG_SND_SOC_RT5640 is not set +# CONFIG_SND_SOC_RT5659 is not set +# CONFIG_SND_SOC_RT9120 is not set +# CONFIG_SND_SOC_RT9123 is not set +# CONFIG_SND_SOC_RT9123P is not set +# CONFIG_SND_SOC_RTQ9124 is not set +# CONFIG_SND_SOC_RTQ9128 is not set +# CONFIG_SND_SOC_SGTL5000 is not set +# CONFIG_SND_SOC_SIMPLE_AMPLIFIER is not set +# CONFIG_SND_SOC_SIMPLE_MUX is not set +# CONFIG_SND_SOC_SMA1303 is not set +# CONFIG_SND_SOC_SMA1307 is not set +# CONFIG_SND_SOC_SPDIF is not set +# CONFIG_SND_SOC_SRC4XXX_I2C is not set +# CONFIG_SND_SOC_SSM2305 is not set +# CONFIG_SND_SOC_SSM2518 is not set +# CONFIG_SND_SOC_SSM2602_SPI is not set +# CONFIG_SND_SOC_SSM2602_I2C is not set +# CONFIG_SND_SOC_SSM3515 is not set +# CONFIG_SND_SOC_SSM4567 is not set +# CONFIG_SND_SOC_STA32X is not set +# CONFIG_SND_SOC_STA350 is not set +# CONFIG_SND_SOC_STI_SAS is not set +CONFIG_SND_SOC_TAS2552=m +CONFIG_SND_SOC_TAS2562=m +CONFIG_SND_SOC_TAS2764=m +CONFIG_SND_SOC_TAS2770=m +CONFIG_SND_SOC_TAS2780=m +# CONFIG_SND_SOC_TAS2781_I2C is not set +CONFIG_SND_SOC_TAS5086=m +CONFIG_SND_SOC_TAS571X=m +CONFIG_SND_SOC_TAS5720=m +CONFIG_SND_SOC_TAS5805M=m +CONFIG_SND_SOC_TAS6424=m +# CONFIG_SND_SOC_TDA7419 is not set +# CONFIG_SND_SOC_TFA9879 is not set +# CONFIG_SND_SOC_TFA989X is not set +# CONFIG_SND_SOC_TLV320ADC3XXX is not set +# CONFIG_SND_SOC_TLV320AIC23_I2C is not set +# CONFIG_SND_SOC_TLV320AIC23_SPI is not set +# CONFIG_SND_SOC_TLV320AIC31XX is not set +# CONFIG_SND_SOC_TLV320AIC32X4_I2C is not set +# CONFIG_SND_SOC_TLV320AIC32X4_SPI is not set +# CONFIG_SND_SOC_TLV320AIC3X_I2C is not set +# CONFIG_SND_SOC_TLV320AIC3X_SPI is not set +# CONFIG_SND_SOC_TLV320ADCX140 is not set +# CONFIG_SND_SOC_TS3A227E is not set +# CONFIG_SND_SOC_TSCS42XX is not set +# CONFIG_SND_SOC_TSCS454 is not set +# CONFIG_SND_SOC_UDA1334 is not set +# CONFIG_SND_SOC_UDA1342 is not set +# CONFIG_SND_SOC_UDA1380 is not set +# CONFIG_SND_SOC_WM8510 is not set +# CONFIG_SND_SOC_WM8523 is not set +# CONFIG_SND_SOC_WM8524 is not set +# CONFIG_SND_SOC_WM8580 is not set +# CONFIG_SND_SOC_WM8711 is not set +# CONFIG_SND_SOC_WM8728 is not set +# CONFIG_SND_SOC_WM8731_I2C is not set +# CONFIG_SND_SOC_WM8731_SPI is not set +# CONFIG_SND_SOC_WM8737 is not set +# CONFIG_SND_SOC_WM8741 is not set +# CONFIG_SND_SOC_WM8750 is not set +# CONFIG_SND_SOC_WM8753 is not set +# CONFIG_SND_SOC_WM8770 is not set +# CONFIG_SND_SOC_WM8776 is not set +# CONFIG_SND_SOC_WM8782 is not set +# CONFIG_SND_SOC_WM8804_I2C is not set +# CONFIG_SND_SOC_WM8804_SPI is not set +# CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set +# CONFIG_SND_SOC_WM8940 is not set +# CONFIG_SND_SOC_WM8960 is not set +# CONFIG_SND_SOC_WM8961 is not set +# CONFIG_SND_SOC_WM8962 is not set +# CONFIG_SND_SOC_WM8974 is not set +# CONFIG_SND_SOC_WM8978 is not set +# CONFIG_SND_SOC_WM8985 is not set +# CONFIG_SND_SOC_ZL38060 is not set +# CONFIG_SND_SOC_MAX9759 is not set +# CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6357 is not set +# CONFIG_SND_SOC_MT6358 is not set +# CONFIG_SND_SOC_MT6660 is not set +# CONFIG_SND_SOC_NAU8315 is not set +# CONFIG_SND_SOC_NAU8325 is not set +# CONFIG_SND_SOC_NAU8540 is not set +# CONFIG_SND_SOC_NAU8810 is not set +# CONFIG_SND_SOC_NAU8821 is not set +# CONFIG_SND_SOC_NAU8822 is not set +# CONFIG_SND_SOC_NAU8824 is not set +# CONFIG_SND_SOC_NTP8918 is not set +# CONFIG_SND_SOC_NTP8835 is not set +# CONFIG_SND_SOC_TPA6130A2 is not set +# CONFIG_SND_SOC_LPASS_WSA_MACRO is not set +# CONFIG_SND_SOC_LPASS_VA_MACRO is not set +# CONFIG_SND_SOC_LPASS_RX_MACRO is not set +# CONFIG_SND_SOC_LPASS_TX_MACRO is not set +# end of CODEC drivers + +# +# Generic drivers +# +CONFIG_SND_SIMPLE_CARD_UTILS=m +CONFIG_SND_SIMPLE_CARD=m +CONFIG_SND_AUDIO_GRAPH_CARD=m +CONFIG_SND_AUDIO_GRAPH_CARD2=m +# CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE is not set +# CONFIG_SND_TEST_COMPONENT is not set +# end of Generic drivers + +CONFIG_SND_VIRTIO=m +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=m +CONFIG_HID_GENERIC=y +CONFIG_HID_HAPTIC=y + +# +# Special HID drivers +# +CONFIG_HID_A4TECH=m +CONFIG_HID_ACCUTOUCH=m +CONFIG_HID_ACRUX=m +CONFIG_HID_ACRUX_FF=y +CONFIG_HID_APPLE=m +CONFIG_HID_APPLEIR=m +# CONFIG_HID_ASUS is not set +CONFIG_HID_AUREAL=m +CONFIG_HID_BELKIN=m +CONFIG_HID_BETOP_FF=m +# CONFIG_HID_BIGBEN_FF is not set +CONFIG_HID_CHERRY=m +CONFIG_HID_CHICONY=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_COUGAR=m +CONFIG_HID_MACALLY=m +CONFIG_HID_PRODIKEYS=m +CONFIG_HID_CMEDIA=m +CONFIG_HID_CP2112=m +# CONFIG_HID_CREATIVE_SB0540 is not set +CONFIG_HID_CYPRESS=m +CONFIG_HID_DRAGONRISE=m +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=m +# CONFIG_HID_ELAN is not set +CONFIG_HID_ELECOM=m +CONFIG_HID_ELO=m +# CONFIG_HID_EVISION is not set +CONFIG_HID_EZKEY=m +CONFIG_HID_FT260=m +CONFIG_HID_GEMBIRD=m +CONFIG_HID_GFRM=m +CONFIG_HID_GLORIOUS=m +CONFIG_HID_HOLTEK=m +CONFIG_HOLTEK_FF=y +# CONFIG_HID_GOODIX_SPI is not set +# CONFIG_HID_GOOGLE_STADIA_FF is not set +# CONFIG_HID_VIVALDI is not set +CONFIG_HID_GT683R=m +CONFIG_HID_KEYTOUCH=m +CONFIG_HID_KYE=m +# CONFIG_HID_KYSONA is not set +CONFIG_HID_UCLOGIC=m +CONFIG_HID_WALTOP=m +CONFIG_HID_VIEWSONIC=m +# CONFIG_HID_VRC2 is not set +CONFIG_HID_XIAOMI=m +CONFIG_HID_GYRATION=m +CONFIG_HID_ICADE=m +CONFIG_HID_ITE=m +CONFIG_HID_JABRA=m +CONFIG_HID_TWINHAN=m +CONFIG_HID_KENSINGTON=m +CONFIG_HID_LCPOWER=m +CONFIG_HID_LED=m +# CONFIG_HID_LENOVO is not set +# CONFIG_HID_LENOVO_GO is not set +# CONFIG_HID_LENOVO_GO_S is not set +CONFIG_HID_LETSKETCH=m +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m +CONFIG_HID_LOGITECH_HIDPP=m +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_LOGIWHEELS_FF=y +CONFIG_HID_MAGICMOUSE=m +CONFIG_HID_MALTRON=m +CONFIG_HID_MAYFLASH=m +# CONFIG_HID_MEGAWORLD_FF is not set +CONFIG_HID_REDRAGON=m +CONFIG_HID_MICROSOFT=m +CONFIG_HID_MONTEREY=m +CONFIG_HID_MULTITOUCH=m +CONFIG_HID_NINTENDO=m +CONFIG_NINTENDO_FF=y +CONFIG_HID_NTI=m +CONFIG_HID_NTRIG=m +# CONFIG_HID_NVIDIA_SHIELD is not set +CONFIG_HID_ORTEK=m +CONFIG_HID_PANTHERLORD=m +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=m +CONFIG_HID_PETALYNX=m +CONFIG_HID_PICOLCD=m +CONFIG_HID_PICOLCD_FB=y +CONFIG_HID_PICOLCD_BACKLIGHT=y +CONFIG_HID_PICOLCD_LCD=y +CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PICOLCD_CIR=y +CONFIG_HID_PLANTRONICS=m +CONFIG_HID_PLAYSTATION=m +CONFIG_PLAYSTATION_FF=y +# CONFIG_HID_PXRC is not set +# CONFIG_HID_RAPOO is not set +# CONFIG_HID_RAZER is not set +CONFIG_HID_PRIMAX=m +CONFIG_HID_RETRODE=m +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SEMITEK=m +# CONFIG_HID_SIGMAMICRO is not set +CONFIG_HID_SONY=m +CONFIG_SONY_FF=y +CONFIG_HID_SPEEDLINK=m +CONFIG_HID_STEAM=m +# CONFIG_STEAM_FF is not set +CONFIG_HID_STEELSERIES=m +CONFIG_HID_SUNPLUS=m +# CONFIG_HID_RMI is not set +CONFIG_HID_GREENASIA=m +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=m +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=m +CONFIG_HID_TOPSEED=m +# CONFIG_HID_TOPRE is not set +CONFIG_HID_THINGM=m +CONFIG_HID_THRUSTMASTER=m +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_UDRAW_PS3=m +CONFIG_HID_U2FZERO=m +# CONFIG_HID_UNIVERSAL_PIDFF is not set +CONFIG_HID_WACOM=m +CONFIG_HID_WIIMOTE=m +# CONFIG_HID_WINWING is not set +CONFIG_HID_XINMO=m +CONFIG_HID_ZEROPLUS=m +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=m +CONFIG_HID_SENSOR_HUB=m +CONFIG_HID_SENSOR_CUSTOM_SENSOR=m +CONFIG_HID_ALPS=m +# CONFIG_HID_MCP2200 is not set +CONFIG_HID_MCP2221=m +# CONFIG_HID_HUAWEI is not set +# end of Special HID drivers + +# +# HID-BPF support +# +# end of HID-BPF support + +CONFIG_I2C_HID=y +# CONFIG_I2C_HID_OF is not set +# CONFIG_I2C_HID_OF_ELAN is not set +# CONFIG_I2C_HID_OF_GOODIX is not set + +# +# USB HID support +# +CONFIG_USB_HID=m +CONFIG_HID_PID=y +CONFIG_USB_HIDDEV=y + +# +# USB HID Boot Protocol drivers +# +# CONFIG_USB_KBD is not set +# CONFIG_USB_MOUSE is not set +# end of USB HID Boot Protocol drivers +# end of USB HID support + +# +# SPI HID support +# +CONFIG_SPI_HID_APPLE_OF=y +# end of SPI HID support + +CONFIG_SPI_HID_APPLE_CORE=y + +# +# DockChannel HID support +# +CONFIG_HID_DOCKCHANNEL=m +# end of DockChannel HID support + +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=y +CONFIG_USB_LED_TRIG=y +CONFIG_USB_ULPI_BUS=y +CONFIG_USB_CONN_GPIO=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB=y +CONFIG_USB_PCI=y +# CONFIG_USB_PCI_AMD is not set +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y + +# +# Miscellaneous USB options +# +CONFIG_USB_DEFAULT_PERSIST=y +# CONFIG_USB_FEW_INIT_RETRIES is not set +# CONFIG_USB_DYNAMIC_MINORS is not set +CONFIG_USB_OTG=y +# CONFIG_USB_OTG_PRODUCTLIST is not set +# CONFIG_USB_OTG_DISABLE_EXTERNAL_HUB is not set +# CONFIG_USB_OTG_FSM is not set +# CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 +CONFIG_USB_DEFAULT_AUTHORIZATION_MODE=1 +CONFIG_USB_MON=m + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +CONFIG_USB_XHCI_HCD=m +# CONFIG_USB_XHCI_DBGCAP is not set +CONFIG_USB_XHCI_PCI=m +CONFIG_USB_XHCI_PCI_RENESAS=m +CONFIG_USB_XHCI_PCI_ASMEDIA=y +CONFIG_USB_XHCI_PLATFORM=m +# CONFIG_USB_XHCI_SIDEBAND is not set +# CONFIG_USB_EHCI_HCD is not set +# CONFIG_USB_OXU210HP_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_MAX3421_HCD is not set +# CONFIG_USB_OHCI_HCD is not set +# CONFIG_USB_UHCI_HCD is not set +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HCD_TEST_MODE is not set + +# +# USB Device Class drivers +# +CONFIG_USB_ACM=m +CONFIG_USB_PRINTER=m +CONFIG_USB_WDM=m +CONFIG_USB_TMC=m + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; see USB_STORAGE Help for more info +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_REALTEK=m +CONFIG_REALTEK_AUTOPM=y +CONFIG_USB_STORAGE_DATAFAB=m +CONFIG_USB_STORAGE_FREECOM=m +CONFIG_USB_STORAGE_ISD200=m +CONFIG_USB_STORAGE_USBAT=m +CONFIG_USB_STORAGE_SDDR09=m +CONFIG_USB_STORAGE_SDDR55=m +CONFIG_USB_STORAGE_JUMPSHOT=m +CONFIG_USB_STORAGE_ALAUDA=m +CONFIG_USB_STORAGE_ONETOUCH=m +CONFIG_USB_STORAGE_KARMA=m +CONFIG_USB_STORAGE_CYPRESS_ATACB=m +CONFIG_USB_STORAGE_ENE_UB6250=m +CONFIG_USB_UAS=m + +# +# USB Imaging devices +# +CONFIG_USB_MDC800=m +CONFIG_USB_MICROTEK=m +CONFIG_USBIP_CORE=m +CONFIG_USBIP_VHCI_HCD=m +CONFIG_USBIP_VHCI_HC_PORTS=8 +CONFIG_USBIP_VHCI_NR_HCS=1 +CONFIG_USBIP_HOST=m +CONFIG_USBIP_VUDC=m +# CONFIG_USBIP_DEBUG is not set + +# +# USB dual-mode controller drivers +# +# CONFIG_USB_CDNS_SUPPORT is not set +# CONFIG_USB_MUSB_HDRC is not set +CONFIG_USB_DWC3=m +CONFIG_USB_DWC3_ULPI=y +# CONFIG_USB_DWC3_HOST is not set +# CONFIG_USB_DWC3_GADGET is not set +CONFIG_USB_DWC3_DUAL_ROLE=y + +# +# Platform Glue Driver Support +# +CONFIG_USB_DWC3_HAPS=m +CONFIG_USB_DWC3_OF_SIMPLE=m +CONFIG_USB_DWC3_GENERIC_PLAT=m +CONFIG_USB_DWC3_APPLE=m +# CONFIG_USB_DWC3_GOOGLE is not set +# CONFIG_USB_DWC2 is not set +CONFIG_USB_CHIPIDEA=m +CONFIG_USB_CHIPIDEA_UDC=y +CONFIG_USB_CHIPIDEA_PCI=m +CONFIG_USB_CHIPIDEA_MSM=m +CONFIG_USB_CHIPIDEA_NPCM=m +CONFIG_USB_CHIPIDEA_IMX=m +CONFIG_USB_CHIPIDEA_GENERIC=m +CONFIG_USB_CHIPIDEA_TEGRA=m +CONFIG_USB_ISP1760=y +CONFIG_USB_ISP1760_HCD=y +CONFIG_USB_ISP1760_HOST_ROLE=y + +# +# USB port drivers +# +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_SIMPLE=m +CONFIG_USB_SERIAL_AIRCABLE=m +CONFIG_USB_SERIAL_ARK3116=m +CONFIG_USB_SERIAL_BELKIN=m +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_WHITEHEAT=m +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_CYPRESS_M8=m +CONFIG_USB_SERIAL_EMPEG=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_VISOR=m +CONFIG_USB_SERIAL_IPAQ=m +CONFIG_USB_SERIAL_IR=m +CONFIG_USB_SERIAL_EDGEPORT=m +CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_F81232=m +CONFIG_USB_SERIAL_F8153X=m +CONFIG_USB_SERIAL_GARMIN=m +CONFIG_USB_SERIAL_IPW=m +CONFIG_USB_SERIAL_IUU=m +CONFIG_USB_SERIAL_KEYSPAN_PDA=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_KLSI=m +CONFIG_USB_SERIAL_KOBIL_SCT=m +CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_METRO=m +CONFIG_USB_SERIAL_MOS7720=m +CONFIG_USB_SERIAL_MOS7840=m +CONFIG_USB_SERIAL_MXUPORT=m +CONFIG_USB_SERIAL_NAVMAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_OTI6858=m +CONFIG_USB_SERIAL_QCAUX=m +CONFIG_USB_SERIAL_QUALCOMM=m +CONFIG_USB_SERIAL_SPCP8X5=m +CONFIG_USB_SERIAL_SAFE=m +CONFIG_USB_SERIAL_SAFE_PADDED=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_SYMBOL=m +CONFIG_USB_SERIAL_TI=m +CONFIG_USB_SERIAL_CYBERJACK=m +CONFIG_USB_SERIAL_WWAN=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_SERIAL_OMNINET=m +CONFIG_USB_SERIAL_OPTICON=m +CONFIG_USB_SERIAL_XSENS_MT=m +CONFIG_USB_SERIAL_WISHBONE=m +CONFIG_USB_SERIAL_SSU100=m +CONFIG_USB_SERIAL_QT2=m +CONFIG_USB_SERIAL_UPD78F0730=m +CONFIG_USB_SERIAL_XR=m +CONFIG_USB_SERIAL_DEBUG=m + +# +# USB Miscellaneous drivers +# +CONFIG_USB_EMI62=m +CONFIG_USB_EMI26=m +CONFIG_USB_ADUTUX=m +CONFIG_USB_SEVSEG=m +CONFIG_USB_LEGOTOWER=m +CONFIG_USB_LCD=m +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +CONFIG_USB_IDMOUSE=m +CONFIG_USB_APPLEDISPLAY=m +CONFIG_APPLE_MFI_FASTCHARGE=m +CONFIG_USB_LD=m +CONFIG_USB_TRANCEVIBRATOR=m +CONFIG_USB_IOWARRIOR=m +# CONFIG_USB_TEST is not set +# CONFIG_USB_EHSET_TEST_FIXTURE is not set +CONFIG_USB_ISIGHTFW=m +CONFIG_USB_YUREX=m +CONFIG_USB_EZUSB_FX2=m +# CONFIG_USB_HUB_USB251XB is not set +# CONFIG_USB_HSIC_USB3503 is not set +# CONFIG_USB_HSIC_USB4604 is not set +# CONFIG_USB_LINK_LAYER_TEST is not set +CONFIG_USB_CHAOSKEY=m +# CONFIG_USB_ONBOARD_DEV is not set +CONFIG_USB_ATM=m +# CONFIG_USB_SPEEDTOUCH is not set +CONFIG_USB_CXACRU=m +CONFIG_USB_UEAGLEATM=m +CONFIG_USB_XUSBATM=m + +# +# USB Physical Layer drivers +# +CONFIG_USB_PHY=y +CONFIG_NOP_USB_XCEIV=m +# CONFIG_USB_ISP1301 is not set +CONFIG_USB_ULPI=y +CONFIG_USB_ULPI_VIEWPORT=y +# end of USB Physical Layer drivers + +CONFIG_USB_GADGET=m +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +# CONFIG_USB_GADGET_DEBUG_FS is not set +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 +# CONFIG_U_SERIAL_CONSOLE is not set + +# +# USB Peripheral Controller +# +# CONFIG_USB_GR_UDC is not set +# CONFIG_USB_R8A66597 is not set +# CONFIG_USB_PXA27X is not set +# CONFIG_USB_SNP_UDC_PLAT is not set +# CONFIG_USB_M66592 is not set +# CONFIG_USB_BDC_UDC is not set +# CONFIG_USB_AMD5536UDC is not set +# CONFIG_USB_NET2280 is not set +# CONFIG_USB_GOKU is not set +# CONFIG_USB_EG20T is not set +# CONFIG_USB_GADGET_XILINX is not set +# CONFIG_USB_MAX3420_UDC is not set +# CONFIG_USB_DUMMY_HCD is not set +# end of USB Peripheral Controller + +CONFIG_USB_LIBCOMPOSITE=m +CONFIG_USB_F_ACM=m +CONFIG_USB_U_SERIAL=m +CONFIG_USB_U_ETHER=m +CONFIG_USB_U_AUDIO=m +CONFIG_USB_F_SERIAL=m +CONFIG_USB_F_OBEX=m +CONFIG_USB_F_NCM=m +CONFIG_USB_F_ECM=m +CONFIG_USB_F_EEM=m +CONFIG_USB_F_SUBSET=m +CONFIG_USB_F_RNDIS=m +CONFIG_USB_F_MASS_STORAGE=m +CONFIG_USB_F_FS=m +CONFIG_USB_F_UAC1=m +CONFIG_USB_F_UAC1_LEGACY=m +CONFIG_USB_F_UAC2=m +CONFIG_USB_F_UVC=m +CONFIG_USB_F_MIDI=m +CONFIG_USB_F_HID=m +CONFIG_USB_F_PRINTER=m +CONFIG_USB_F_TCM=m +CONFIG_USB_CONFIGFS=m +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_OBEX=y +CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_ECM_SUBSET=y +CONFIG_USB_CONFIGFS_RNDIS=y +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_UAC1=y +CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y +CONFIG_USB_CONFIGFS_F_UAC2=y +CONFIG_USB_CONFIGFS_F_MIDI=y +# CONFIG_USB_CONFIGFS_F_MIDI2 is not set +CONFIG_USB_CONFIGFS_F_HID=y +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_USB_CONFIGFS_F_PRINTER=y +CONFIG_USB_CONFIGFS_F_TCM=y + +# +# USB Gadget precomposed configurations +# +# CONFIG_USB_ZERO is not set +CONFIG_USB_AUDIO=m +CONFIG_GADGET_UAC1=y +# CONFIG_GADGET_UAC1_LEGACY is not set +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_ETH_EEM=y +CONFIG_USB_G_NCM=m +CONFIG_USB_GADGETFS=m +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_FUNCTIONFS_ETH=y +CONFIG_USB_FUNCTIONFS_RNDIS=y +CONFIG_USB_FUNCTIONFS_GENERIC=y +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_GADGET_TARGET=m +CONFIG_USB_G_SERIAL=m +CONFIG_USB_MIDI_GADGET=m +CONFIG_USB_G_PRINTER=m +CONFIG_USB_CDC_COMPOSITE=m +CONFIG_USB_G_ACM_MS=m +CONFIG_USB_G_MULTI=m +CONFIG_USB_G_MULTI_RNDIS=y +CONFIG_USB_G_MULTI_CDC=y +CONFIG_USB_G_HID=m +# CONFIG_USB_G_DBGP is not set +CONFIG_USB_G_WEBCAM=m +# CONFIG_USB_RAW_GADGET is not set +# end of USB Gadget precomposed configurations + +CONFIG_TYPEC=m +CONFIG_TYPEC_TCPM=m +CONFIG_TYPEC_TCPCI=m +# CONFIG_TYPEC_RT1711H is not set +# CONFIG_TYPEC_TCPCI_MAXIM is not set +# CONFIG_TYPEC_FUSB302 is not set +CONFIG_TYPEC_UCSI=m +# CONFIG_UCSI_CCG is not set +# CONFIG_UCSI_STM32G0 is not set +CONFIG_TYPEC_TPS6598X_CORE=m +CONFIG_TYPEC_TPS6598X=m +# CONFIG_TYPEC_SN201202X is not set +# CONFIG_TYPEC_ANX7411 is not set +# CONFIG_TYPEC_RT1719 is not set +# CONFIG_TYPEC_HD3SS3220 is not set +# CONFIG_TYPEC_STUSB160X is not set +# CONFIG_TYPEC_WUSB3801 is not set + +# +# USB Type-C Multiplexer/DeMultiplexer Switch support +# +# CONFIG_TYPEC_MUX_FSA4480 is not set +# CONFIG_TYPEC_MUX_GPIO_SBU is not set +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_MUX_IT5205 is not set +# CONFIG_TYPEC_MUX_NB7VPQ904M is not set +# CONFIG_TYPEC_MUX_PS883X is not set +# CONFIG_TYPEC_MUX_PTN36502 is not set +# CONFIG_TYPEC_MUX_TUSB1046 is not set +# CONFIG_TYPEC_MUX_WCD939X_USBSS is not set +# end of USB Type-C Multiplexer/DeMultiplexer Switch support + +# +# USB Type-C Alternate Mode drivers +# +CONFIG_TYPEC_DP_ALTMODE=m +# CONFIG_TYPEC_NVIDIA_ALTMODE is not set +# CONFIG_TYPEC_TBT_ALTMODE is not set +# end of USB Type-C Alternate Mode drivers + +CONFIG_USB_ROLE_SWITCH=y +CONFIG_MMC=m +CONFIG_PWRSEQ_EMMC=m +CONFIG_PWRSEQ_SD8787=m +CONFIG_PWRSEQ_SIMPLE=m +CONFIG_MMC_BLOCK=m +CONFIG_MMC_BLOCK_MINORS=32 +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_ARMMMCI is not set +CONFIG_MMC_SDHCI=m +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_UHS2=m +CONFIG_MMC_SDHCI_PCI=m +# CONFIG_MMC_RICOH_MMC is not set +# CONFIG_MMC_SDHCI_PLTFM is not set +# CONFIG_MMC_TIFM_SD is not set +# CONFIG_MMC_SPI is not set +# CONFIG_MMC_CB710 is not set +# CONFIG_MMC_VIA_SDMMC is not set +# CONFIG_MMC_DW is not set +# CONFIG_MMC_VUB300 is not set +# CONFIG_MMC_USHC is not set +# CONFIG_MMC_USDHI6ROL0 is not set +CONFIG_MMC_CQHCI=m +# CONFIG_MMC_HSQ is not set +# CONFIG_MMC_TOSHIBA_PCI is not set +# CONFIG_MMC_MTK is not set +# CONFIG_SCSI_UFSHCD is not set +# CONFIG_MEMSTICK is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_CLASS_FLASH=m +CONFIG_LEDS_CLASS_MULTICOLOR=m +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set + +# +# LED drivers +# +# CONFIG_LEDS_AN30259A is not set +# CONFIG_LEDS_OSRAM_AMS_AS3668 is not set +# CONFIG_LEDS_AW200XX is not set +# CONFIG_LEDS_AW2013 is not set +# CONFIG_LEDS_BCM6328 is not set +# CONFIG_LEDS_BCM6358 is not set +# CONFIG_LEDS_CR0014114 is not set +# CONFIG_LEDS_EL15203000 is not set +# CONFIG_LEDS_LM3530 is not set +# CONFIG_LEDS_LM3532 is not set +# CONFIG_LEDS_LM3642 is not set +# CONFIG_LEDS_LM3692X is not set +# CONFIG_LEDS_PCA9532 is not set +CONFIG_LEDS_GPIO=m +# CONFIG_LEDS_LP3944 is not set +# CONFIG_LEDS_LP3952 is not set +# CONFIG_LEDS_LP50XX is not set +# CONFIG_LEDS_LP55XX_COMMON is not set +# CONFIG_LEDS_LP8860 is not set +# CONFIG_LEDS_LP8864 is not set +# CONFIG_LEDS_PCA955X is not set +# CONFIG_LEDS_PCA963X is not set +# CONFIG_LEDS_PCA995X is not set +# CONFIG_LEDS_DAC124S085 is not set +CONFIG_LEDS_PWM=y +# CONFIG_LEDS_REGULATOR is not set +# CONFIG_LEDS_BD2606MVV is not set +# CONFIG_LEDS_BD2802 is not set +# CONFIG_LEDS_LT3593 is not set +# CONFIG_LEDS_TCA6507 is not set +# CONFIG_LEDS_TLC591XX is not set +# CONFIG_LEDS_LM355x is not set +# CONFIG_LEDS_IS31FL319X is not set +# CONFIG_LEDS_IS31FL32XX is not set + +# +# LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM) +# +# CONFIG_LEDS_BLINKM is not set +CONFIG_LEDS_SYSCON=y +# CONFIG_LEDS_MLXREG is not set +CONFIG_LEDS_USER=m +# CONFIG_LEDS_SPI_BYTE is not set +# CONFIG_LEDS_LM3697 is not set +# CONFIG_LEDS_ST1202 is not set + +# +# Flash and Torch LED drivers +# +# CONFIG_LEDS_AAT1290 is not set +# CONFIG_LEDS_AS3645A is not set +# CONFIG_LEDS_KTD2692 is not set +# CONFIG_LEDS_LM3601X is not set +# CONFIG_LEDS_RT4505 is not set +# CONFIG_LEDS_RT8515 is not set +# CONFIG_LEDS_SGM3140 is not set +# CONFIG_LEDS_SY7802 is not set +# CONFIG_LEDS_TPS6131X is not set + +# +# RGB LED drivers +# +# CONFIG_LEDS_GROUP_MULTICOLOR is not set +# CONFIG_LEDS_KTD202X is not set +# CONFIG_LEDS_LP5812 is not set +# CONFIG_LEDS_NCP5623 is not set +# CONFIG_LEDS_PWM_MULTICOLOR is not set +# CONFIG_LEDS_QCOM_LPG is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_MTD=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_ACTIVITY=y +# CONFIG_LEDS_TRIGGER_GPIO is not set +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y + +# +# iptables trigger is under Netfilter config (LED target) +# +CONFIG_LEDS_TRIGGER_TRANSIENT=y +CONFIG_LEDS_TRIGGER_CAMERA=y +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LEDS_TRIGGER_NETDEV=y +CONFIG_LEDS_TRIGGER_PATTERN=m +CONFIG_LEDS_TRIGGER_TTY=m +# CONFIG_LEDS_TRIGGER_INPUT_EVENTS is not set + +# +# Simatic LED drivers +# +CONFIG_ACCESSIBILITY=y +CONFIG_A11Y_BRAILLE_CONSOLE=y + +# +# Speakup console speech +# +CONFIG_SPEAKUP=m +CONFIG_SPEAKUP_SYNTH_ACNTSA=m +CONFIG_SPEAKUP_SYNTH_APOLLO=m +CONFIG_SPEAKUP_SYNTH_AUDPTR=m +CONFIG_SPEAKUP_SYNTH_BNS=m +CONFIG_SPEAKUP_SYNTH_DECTLK=m +CONFIG_SPEAKUP_SYNTH_DECEXT=m +CONFIG_SPEAKUP_SYNTH_LTLK=m +CONFIG_SPEAKUP_SYNTH_SOFT=m +CONFIG_SPEAKUP_SYNTH_SPKOUT=m +CONFIG_SPEAKUP_SYNTH_TXPRT=m +# CONFIG_SPEAKUP_SYNTH_DUMMY is not set +# end of Speakup console speech + +# CONFIG_INFINIBAND is not set +CONFIG_EDAC_SUPPORT=y +# CONFIG_EDAC is not set +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=y +CONFIG_RTC_HCTOSYS_DEVICE="rtc0" +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_DEBUG is not set +CONFIG_RTC_NVMEM=y + +# +# RTC interfaces +# +CONFIG_RTC_INTF_SYSFS=y +CONFIG_RTC_INTF_PROC=y +CONFIG_RTC_INTF_DEV=y +CONFIG_RTC_INTF_DEV_UIE_EMUL=y +# CONFIG_RTC_DRV_TEST is not set + +# +# I2C RTC drivers +# +# CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set +# CONFIG_RTC_DRV_ABX80X is not set +# CONFIG_RTC_DRV_DS1307 is not set +# CONFIG_RTC_DRV_DS1374 is not set +# CONFIG_RTC_DRV_DS1672 is not set +# CONFIG_RTC_DRV_HYM8563 is not set +# CONFIG_RTC_DRV_MAX6900 is not set +# CONFIG_RTC_DRV_MAX31335 is not set +# CONFIG_RTC_DRV_NCT3018Y is not set +# CONFIG_RTC_DRV_RS5C372 is not set +# CONFIG_RTC_DRV_ISL1208 is not set +# CONFIG_RTC_DRV_ISL12022 is not set +# CONFIG_RTC_DRV_ISL12026 is not set +# CONFIG_RTC_DRV_X1205 is not set +# CONFIG_RTC_DRV_PCF8523 is not set +# CONFIG_RTC_DRV_PCF85363 is not set +# CONFIG_RTC_DRV_PCF8563 is not set +# CONFIG_RTC_DRV_PCF8583 is not set +# CONFIG_RTC_DRV_M41T80 is not set +# CONFIG_RTC_DRV_BQ32K is not set +# CONFIG_RTC_DRV_S35390A is not set +# CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8010 is not set +# CONFIG_RTC_DRV_RX8111 is not set +# CONFIG_RTC_DRV_RX8581 is not set +# CONFIG_RTC_DRV_RX8025 is not set +# CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set +# CONFIG_RTC_DRV_RV3032 is not set +# CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD2405AL is not set +# CONFIG_RTC_DRV_SD3078 is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_M41T93 is not set +# CONFIG_RTC_DRV_M41T94 is not set +# CONFIG_RTC_DRV_DS1302 is not set +# CONFIG_RTC_DRV_DS1305 is not set +# CONFIG_RTC_DRV_DS1343 is not set +# CONFIG_RTC_DRV_DS1347 is not set +# CONFIG_RTC_DRV_DS1390 is not set +# CONFIG_RTC_DRV_MAX6916 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RX4581 is not set +# CONFIG_RTC_DRV_RS5C348 is not set +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_PCF2123 is not set +# CONFIG_RTC_DRV_MCP795 is not set +CONFIG_RTC_I2C_AND_SPI=y + +# +# SPI and I2C RTC drivers +# +# CONFIG_RTC_DRV_DS3232 is not set +# CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_PCF85063 is not set +# CONFIG_RTC_DRV_RV3029C2 is not set +# CONFIG_RTC_DRV_RX6110 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_DS1286 is not set +# CONFIG_RTC_DRV_DS1511 is not set +# CONFIG_RTC_DRV_DS1553 is not set +# CONFIG_RTC_DRV_DS1685_FAMILY is not set +# CONFIG_RTC_DRV_DS1742 is not set +# CONFIG_RTC_DRV_DS2404 is not set +# CONFIG_RTC_DRV_EFI is not set +# CONFIG_RTC_DRV_STK17TA8 is not set +# CONFIG_RTC_DRV_M48T86 is not set +# CONFIG_RTC_DRV_M48T35 is not set +# CONFIG_RTC_DRV_M48T59 is not set +# CONFIG_RTC_DRV_MSM6242 is not set +# CONFIG_RTC_DRV_RP5C01 is not set +# CONFIG_RTC_DRV_ZYNQMP is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_PL030 is not set +# CONFIG_RTC_DRV_PL031 is not set +# CONFIG_RTC_DRV_CADENCE is not set +# CONFIG_RTC_DRV_FTRTC010 is not set +# CONFIG_RTC_DRV_R7301 is not set +# CONFIG_RTC_DRV_GOLDFISH is not set +CONFIG_RTC_DRV_MACSMC=y + +# +# HID Sensor RTC drivers +# +# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set +CONFIG_DMADEVICES=y +# CONFIG_DMADEVICES_DEBUG is not set + +# +# DMA Devices +# +CONFIG_DMA_ENGINE=y +CONFIG_DMA_VIRTUAL_CHANNELS=y +CONFIG_DMA_OF=y +# CONFIG_ALTERA_MSGDMA is not set +# CONFIG_AMBA_PL08X is not set +CONFIG_APPLE_ADMAC=y +CONFIG_APPLE_SIO=m +# CONFIG_ARM_DMA350 is not set +# CONFIG_DW_AXI_DMAC is not set +# CONFIG_FSL_EDMA is not set +# CONFIG_FSL_QDMA is not set +# CONFIG_INTEL_IDMA64 is not set +# CONFIG_MV_XOR_V2 is not set +# CONFIG_PL330_DMA is not set +# CONFIG_PLX_DMA is not set +# CONFIG_SWITCHTEC_DMA is not set +# CONFIG_XILINX_DMA is not set +# CONFIG_XILINX_XDMA is not set +# CONFIG_XILINX_ZYNQMP_DMA is not set +# CONFIG_XILINX_ZYNQMP_DPDMA is not set +# CONFIG_AMD_QDMA is not set +# CONFIG_QCOM_HIDMA_MGMT is not set +# CONFIG_QCOM_HIDMA is not set +# CONFIG_DW_DMAC is not set +# CONFIG_DW_DMAC_PCI is not set +# CONFIG_DW_EDMA is not set +# CONFIG_SF_PDMA is not set + +# +# DMA Clients +# +# CONFIG_ASYNC_TX_DMA is not set +# CONFIG_DMATEST is not set + +# +# DMABUF options +# +CONFIG_SYNC_FILE=y +# CONFIG_SW_SYNC is not set +# CONFIG_UDMABUF is not set +# CONFIG_DMABUF_DEBUG is not set +# CONFIG_DMABUF_SELFTESTS is not set +# CONFIG_DMABUF_HEAPS is not set +# end of DMABUF options + +# CONFIG_UIO is not set +CONFIG_VFIO=m +CONFIG_VFIO_GROUP=y +CONFIG_VFIO_CONTAINER=y +CONFIG_VFIO_IOMMU_TYPE1=m +# CONFIG_VFIO_NOIOMMU is not set +CONFIG_VFIO_VIRQFD=y +# CONFIG_VFIO_DEBUGFS is not set + +# +# VFIO support for PCI devices +# +CONFIG_VFIO_PCI_CORE=m +CONFIG_VFIO_PCI_INTX=y +CONFIG_VFIO_PCI=m +# CONFIG_VIRTIO_VFIO_PCI is not set +# CONFIG_NVGRACE_GPU_VFIO_PCI is not set +# end of VFIO support for PCI devices + +# +# VFIO support for platform devices +# +CONFIG_VFIO_PLATFORM_BASE=m +CONFIG_VFIO_PLATFORM=m +# CONFIG_VFIO_AMBA is not set + +# +# VFIO platform reset drivers +# +# CONFIG_VFIO_PLATFORM_CALXEDAXGMAC_RESET is not set +# CONFIG_VFIO_PLATFORM_AMDXGBE_RESET is not set +# end of VFIO platform reset drivers +# end of VFIO support for platform devices + +CONFIG_IRQ_BYPASS_MANAGER=y +# CONFIG_VIRT_DRIVERS is not set +CONFIG_VIRTIO_ANCHOR=y +CONFIG_VIRTIO=y +CONFIG_VIRTIO_PCI_LIB=m +CONFIG_VIRTIO_PCI_LIB_LEGACY=m +CONFIG_VIRTIO_MENU=y +CONFIG_VIRTIO_PCI=m +CONFIG_VIRTIO_PCI_LEGACY=y +CONFIG_VIRTIO_BALLOON=m +CONFIG_VIRTIO_INPUT=m +CONFIG_VIRTIO_MMIO=m +# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set +CONFIG_VIRTIO_DMA_SHARED_BUFFER=m +# CONFIG_VIRTIO_DEBUG is not set +# CONFIG_VIRTIO_RTC is not set +# CONFIG_VDPA is not set +CONFIG_VHOST_IOTLB=m +CONFIG_VHOST_TASK=y +CONFIG_VHOST=m +CONFIG_VHOST_MENU=y +CONFIG_VHOST_NET=m +CONFIG_VHOST_SCSI=m +CONFIG_VHOST_VSOCK=m +# CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set +CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL=y + +# +# Microsoft Hyper-V guest support +# +# CONFIG_HYPERV is not set +# end of Microsoft Hyper-V guest support + +# CONFIG_GREYBUS is not set +# CONFIG_COMEDI is not set +# CONFIG_GPIB is not set +CONFIG_STAGING=y +# CONFIG_RTL8723BS is not set + +# +# IIO staging drivers +# + +# +# Accelerometers +# +# CONFIG_ADIS16203 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD7816 is not set +# end of Analog to digital converters + +# +# Analog digital bi-direction converters +# +# CONFIG_ADT7316 is not set +# end of Analog digital bi-direction converters + +# +# Direct Digital Synthesis +# +# CONFIG_AD9832 is not set +# CONFIG_AD9834 is not set +# end of Direct Digital Synthesis + +# +# Network Analyzer, Impedance Converters +# +# CONFIG_AD5933 is not set +# end of Network Analyzer, Impedance Converters +# end of IIO staging drivers + +# CONFIG_FB_SM750 is not set +CONFIG_STAGING_MEDIA=y +# CONFIG_DVB_AV7110 is not set +# CONFIG_VIDEO_MAX96712 is not set +# CONFIG_STAGING_MEDIA_DEPRECATED is not set +# CONFIG_FB_TFT is not set +# CONFIG_XIL_AXIS_FIFO is not set +# CONFIG_VME_BUS is not set +# CONFIG_GOLDFISH is not set +# CONFIG_CHROME_PLATFORMS is not set +# CONFIG_MELLANOX_PLATFORM is not set +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_ARM64_PLATFORM_DEVICES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_CLK_PREPARE=y +CONFIG_COMMON_CLK=y + +# +# Clock driver for ARM Reference designs +# +# CONFIG_CLK_ICST is not set +CONFIG_CLK_SP810=y +# end of Clock driver for ARM Reference designs + +# CONFIG_LMK04832 is not set +CONFIG_COMMON_CLK_APPLE_NCO=y +# CONFIG_COMMON_CLK_MAX9485 is not set +# CONFIG_COMMON_CLK_SI5341 is not set +# CONFIG_COMMON_CLK_SI5351 is not set +# CONFIG_COMMON_CLK_SI514 is not set +# CONFIG_COMMON_CLK_SI544 is not set +# CONFIG_COMMON_CLK_SI570 is not set +# CONFIG_COMMON_CLK_CDCE706 is not set +# CONFIG_COMMON_CLK_CDCE925 is not set +# CONFIG_COMMON_CLK_CS2000_CP is not set +# CONFIG_COMMON_CLK_AXI_CLKGEN is not set +# CONFIG_COMMON_CLK_XGENE is not set +# CONFIG_COMMON_CLK_PWM is not set +# CONFIG_COMMON_CLK_RS9_PCIE is not set +# CONFIG_COMMON_CLK_SI521XX is not set +# CONFIG_COMMON_CLK_VC3 is not set +# CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_VC7 is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set +# CONFIG_XILINX_VCU is not set +# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set +# CONFIG_HWSPINLOCK is not set + +# +# Clock Source drivers +# +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set +# CONFIG_ARM_TIMER_SP804 is not set +# end of Clock Source drivers + +# CONFIG_MAILBOX is not set +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y + +# +# Generic IOMMU Pagetable Support +# +CONFIG_IOMMU_IO_PGTABLE=y +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +CONFIG_IOMMU_IO_PGTABLE_ARMV7S=y +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S_SELFTEST is not set +CONFIG_IOMMU_IO_PGTABLE_DART=y +# end of Generic IOMMU Pagetable Support + +# CONFIG_IOMMU_DEBUGFS is not set +CONFIG_IOMMU_DEFAULT_DMA_STRICT=y +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +CONFIG_OF_IOMMU=y +CONFIG_IOMMU_DMA=y +# CONFIG_ARM_SMMU is not set +# CONFIG_ARM_SMMU_V3 is not set +# CONFIG_IOMMUFD is not set +CONFIG_APPLE_DART=y +# CONFIG_VIRTIO_IOMMU is not set + +# +# Remoteproc drivers +# +# CONFIG_REMOTEPROC is not set +# end of Remoteproc drivers + +# +# Rpmsg drivers +# +# CONFIG_RPMSG_VIRTIO is not set +# end of Rpmsg drivers + +# CONFIG_SOUNDWIRE is not set + +# +# SOC (System On Chip) specific Drivers +# + +# +# Amlogic SoC drivers +# +# end of Amlogic SoC drivers + +# +# Apple SoC drivers +# +CONFIG_APPLE_DOCKCHANNEL=y +CONFIG_APPLE_MAILBOX=y +CONFIG_APPLE_PMGR_MISC=y +CONFIG_APPLE_RTKIT=y +CONFIG_APPLE_RTKIT_HELPER=y +CONFIG_APPLE_SART=y +CONFIG_APPLE_TUNABLE=m +CONFIG_RUST_APPLE_MAILBOX=y +CONFIG_RUST_APPLE_RTKIT=y +CONFIG_APPLE_AOP=m +CONFIG_APPLE_SEP=y +CONFIG_APPLE_PMP=y +# end of Apple SoC drivers + +# +# Broadcom SoC drivers +# +# end of Broadcom SoC drivers + +# +# NXP/Freescale QorIQ SoC drivers +# +# CONFIG_QUICC_ENGINE is not set +# CONFIG_FSL_RCPM is not set +# end of NXP/Freescale QorIQ SoC drivers + +# +# fujitsu SoC drivers +# +# end of fujitsu SoC drivers + +# +# i.MX SoC drivers +# +# end of i.MX SoC drivers + +# +# Enable LiteX SoC Builder specific drivers +# +# CONFIG_LITEX_SOC_CONTROLLER is not set +# end of Enable LiteX SoC Builder specific drivers + +# CONFIG_WPCM450_SOC is not set + +# +# Qualcomm SoC drivers +# +# CONFIG_QCOM_PBS is not set +# end of Qualcomm SoC drivers + +# CONFIG_SOC_TI is not set + +# +# Xilinx SoC drivers +# +# end of Xilinx SoC drivers +# end of SOC (System On Chip) specific Drivers + +# +# PM Domains +# + +# +# Amlogic PM Domains +# +# end of Amlogic PM Domains + +CONFIG_APPLE_PMGR_PWRSTATE=y +CONFIG_APPLE_PMP_REPORT=y + +# +# Broadcom PM Domains +# +# end of Broadcom PM Domains + +# +# i.MX PM Domains +# +# end of i.MX PM Domains + +# +# Qualcomm PM Domains +# +# end of Qualcomm PM Domains +# end of PM Domains + +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +CONFIG_DEVFREQ_GOV_PASSIVE=y + +# +# DEVFREQ Drivers +# +CONFIG_PM_DEVFREQ_EVENT=y +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +# CONFIG_EXTCON_ADC_JACK is not set +# CONFIG_EXTCON_FSA9480 is not set +CONFIG_EXTCON_GPIO=y +# CONFIG_EXTCON_LC824206XA is not set +# CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_MAX14526 is not set +# CONFIG_EXTCON_PTN5150 is not set +# CONFIG_EXTCON_RT8973A is not set +# CONFIG_EXTCON_SM5502 is not set +CONFIG_EXTCON_USB_GPIO=y +# CONFIG_EXTCON_USBC_TUSB320 is not set +# CONFIG_MEMORY is not set +CONFIG_IIO=y +# CONFIG_IIO_BUFFER is not set +# CONFIG_IIO_CONFIGFS is not set +# CONFIG_IIO_TRIGGER is not set +# CONFIG_IIO_SW_DEVICE is not set +# CONFIG_IIO_SW_TRIGGER is not set +# CONFIG_IIO_TRIGGERED_EVENT is not set + +# +# Accelerometers +# +# CONFIG_ADIS16201 is not set +# CONFIG_ADIS16209 is not set +# CONFIG_ADXL313_I2C is not set +# CONFIG_ADXL313_SPI is not set +# CONFIG_ADXL345_I2C is not set +# CONFIG_ADXL345_SPI is not set +# CONFIG_ADXL355_I2C is not set +# CONFIG_ADXL355_SPI is not set +# CONFIG_ADXL367_SPI is not set +# CONFIG_ADXL367_I2C is not set +# CONFIG_ADXL372_SPI is not set +# CONFIG_ADXL372_I2C is not set +# CONFIG_ADXL380_SPI is not set +# CONFIG_ADXL380_I2C is not set +# CONFIG_BMA180 is not set +# CONFIG_BMA220 is not set +# CONFIG_BMA400 is not set +# CONFIG_BMC150_ACCEL is not set +# CONFIG_BMI088_ACCEL is not set +# CONFIG_DA280 is not set +# CONFIG_DA311 is not set +# CONFIG_DMARD06 is not set +# CONFIG_DMARD09 is not set +# CONFIG_DMARD10 is not set +# CONFIG_FXLS8962AF_I2C is not set +# CONFIG_FXLS8962AF_SPI is not set +# CONFIG_HID_SENSOR_ACCEL_3D is not set +# CONFIG_IIO_ST_ACCEL_3AXIS is not set +# CONFIG_IIO_KX022A_SPI is not set +# CONFIG_IIO_KX022A_I2C is not set +# CONFIG_KXSD9 is not set +# CONFIG_KXCJK1013 is not set +# CONFIG_MC3230 is not set +# CONFIG_MMA7455_I2C is not set +# CONFIG_MMA7455_SPI is not set +# CONFIG_MMA7660 is not set +# CONFIG_MMA8452 is not set +# CONFIG_MMA9551 is not set +# CONFIG_MMA9553 is not set +# CONFIG_MSA311 is not set +# CONFIG_MXC4005 is not set +# CONFIG_MXC6255 is not set +# CONFIG_SCA3000 is not set +# CONFIG_SCA3300 is not set +# CONFIG_STK8312 is not set +# CONFIG_STK8BA50 is not set +# end of Accelerometers + +# +# Analog to digital converters +# +# CONFIG_AD4000 is not set +# CONFIG_AD4030 is not set +# CONFIG_AD4080 is not set +# CONFIG_AD4130 is not set +# CONFIG_AD4134 is not set +# CONFIG_AD4170_4 is not set +# CONFIG_AD4695 is not set +# CONFIG_AD4851 is not set +# CONFIG_AD7091R5 is not set +# CONFIG_AD7091R8 is not set +# CONFIG_AD7124 is not set +# CONFIG_AD7173 is not set +# CONFIG_AD7191 is not set +# CONFIG_AD7192 is not set +# CONFIG_AD7266 is not set +# CONFIG_AD7280 is not set +# CONFIG_AD7291 is not set +# CONFIG_AD7292 is not set +# CONFIG_AD7298 is not set +# CONFIG_AD7380 is not set +# CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set +# CONFIG_AD7625 is not set +# CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set +# CONFIG_AD7779 is not set +# CONFIG_AD7780 is not set +# CONFIG_AD7791 is not set +# CONFIG_AD7793 is not set +# CONFIG_AD7887 is not set +# CONFIG_AD7923 is not set +# CONFIG_AD7944 is not set +# CONFIG_AD7949 is not set +# CONFIG_AD799X is not set +# CONFIG_AD9467 is not set +# CONFIG_ADE9000 is not set +# CONFIG_CC10001_ADC is not set +# CONFIG_ENVELOPE_DETECTOR is not set +# CONFIG_GEHC_PMC_ADC is not set +# CONFIG_HI8435 is not set +# CONFIG_HX711 is not set +# CONFIG_INA2XX_ADC is not set +# CONFIG_LTC2309 is not set +# CONFIG_LTC2471 is not set +# CONFIG_LTC2485 is not set +# CONFIG_LTC2496 is not set +# CONFIG_LTC2497 is not set +# CONFIG_MAX1027 is not set +# CONFIG_MAX11100 is not set +# CONFIG_MAX1118 is not set +# CONFIG_MAX11205 is not set +# CONFIG_MAX11410 is not set +# CONFIG_MAX1241 is not set +# CONFIG_MAX1363 is not set +# CONFIG_MAX14001 is not set +# CONFIG_MAX34408 is not set +# CONFIG_MAX9611 is not set +# CONFIG_MCP320X is not set +# CONFIG_MCP3422 is not set +# CONFIG_MCP3564 is not set +# CONFIG_MCP3911 is not set +# CONFIG_NAU7802 is not set +# CONFIG_NCT7201 is not set +# CONFIG_PAC1921 is not set +# CONFIG_PAC1934 is not set +# CONFIG_QCOM_SPMI_IADC is not set +# CONFIG_QCOM_SPMI_VADC is not set +# CONFIG_QCOM_SPMI_ADC5 is not set +# CONFIG_QCOM_SPMI_ADC5_GEN3 is not set +# CONFIG_ROHM_BD79112 is not set +# CONFIG_ROHM_BD79124 is not set +# CONFIG_RICHTEK_RTQ6056 is not set +# CONFIG_SD_ADC_MODULATOR is not set +# CONFIG_TI_ADC081C is not set +# CONFIG_TI_ADC0832 is not set +# CONFIG_TI_ADC084S021 is not set +# CONFIG_TI_ADC108S102 is not set +# CONFIG_TI_ADC12138 is not set +# CONFIG_TI_ADC128S052 is not set +# CONFIG_TI_ADC161S626 is not set +# CONFIG_TI_ADS1015 is not set +# CONFIG_TI_ADS1018 is not set +# CONFIG_TI_ADS1100 is not set +# CONFIG_TI_ADS1119 is not set +# CONFIG_TI_ADS124S08 is not set +# CONFIG_TI_ADS1298 is not set +# CONFIG_TI_ADS131E08 is not set +# CONFIG_TI_ADS131M02 is not set +# CONFIG_TI_ADS7138 is not set +# CONFIG_TI_ADS7924 is not set +# CONFIG_TI_ADS7950 is not set +# CONFIG_TI_ADS8344 is not set +# CONFIG_TI_ADS8688 is not set +# CONFIG_TI_LMP92064 is not set +# CONFIG_TI_TLC4541 is not set +# CONFIG_TI_TSC2046 is not set +# CONFIG_VF610_ADC is not set +# CONFIG_XILINX_XADC is not set +# end of Analog to digital converters + +# +# Analog to digital and digital to analog converters +# +# CONFIG_AD74115 is not set +# CONFIG_AD74413R is not set +# end of Analog to digital and digital to analog converters + +# +# Analog Front Ends +# +# CONFIG_IIO_RESCALE is not set +# end of Analog Front Ends + +# +# Amplifiers +# +# CONFIG_AD8366 is not set +# CONFIG_ADA4250 is not set +# CONFIG_ADL8113 is not set +# CONFIG_HMC425 is not set +# end of Amplifiers + +# +# Capacitance to digital converters +# +# CONFIG_AD7150 is not set +# CONFIG_AD7746 is not set +# end of Capacitance to digital converters + +# +# Chemical Sensors +# +# CONFIG_AOSONG_AGS02MA is not set +# CONFIG_ATLAS_PH_SENSOR is not set +# CONFIG_ATLAS_EZO_SENSOR is not set +# CONFIG_BME680 is not set +# CONFIG_CCS811 is not set +# CONFIG_ENS160 is not set +# CONFIG_IAQCORE is not set +# CONFIG_MHZ19B is not set +# CONFIG_PMS7003 is not set +# CONFIG_SCD30_CORE is not set +# CONFIG_SCD4X is not set +# CONFIG_SEN0322 is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SENSIRION_SGP40 is not set +# CONFIG_SPS30_I2C is not set +# CONFIG_SPS30_SERIAL is not set +# CONFIG_SENSEAIR_SUNRISE_CO2 is not set +# CONFIG_VZ89X is not set +# end of Chemical Sensors + +CONFIG_IIO_AOP_SENSOR_LAS=m +CONFIG_IIO_AOP_SENSOR_ALS=m + +# +# Hid Sensor IIO Common +# +# CONFIG_HID_SENSOR_IIO_COMMON is not set +# end of Hid Sensor IIO Common + +# +# IIO SCMI Sensors +# +# end of IIO SCMI Sensors + +# +# SSP Sensor Common +# +# CONFIG_IIO_SSP_SENSORHUB is not set +# end of SSP Sensor Common + +# +# Digital to analog converters +# +# CONFIG_AD3530R is not set +# CONFIG_AD3552R_HS is not set +# CONFIG_AD3552R is not set +# CONFIG_AD5064 is not set +# CONFIG_AD5360 is not set +# CONFIG_AD5380 is not set +# CONFIG_AD5421 is not set +# CONFIG_AD5446_SPI is not set +# CONFIG_AD5446_I2C is not set +# CONFIG_AD5449 is not set +# CONFIG_AD5592R is not set +# CONFIG_AD5593R is not set +# CONFIG_AD5504 is not set +# CONFIG_AD5624R_SPI is not set +# CONFIG_AD9739A is not set +# CONFIG_LTC2688 is not set +# CONFIG_AD5686_SPI is not set +# CONFIG_AD5696_I2C is not set +# CONFIG_AD5755 is not set +# CONFIG_AD5758 is not set +# CONFIG_AD5761 is not set +# CONFIG_AD5764 is not set +# CONFIG_AD5766 is not set +# CONFIG_AD5770R is not set +# CONFIG_AD5791 is not set +# CONFIG_AD7293 is not set +# CONFIG_AD7303 is not set +# CONFIG_AD8460 is not set +# CONFIG_AD8801 is not set +# CONFIG_BD79703 is not set +# CONFIG_DPOT_DAC is not set +# CONFIG_DS4424 is not set +# CONFIG_LTC1660 is not set +# CONFIG_LTC2632 is not set +# CONFIG_LTC2664 is not set +# CONFIG_M62332 is not set +# CONFIG_MAX517 is not set +# CONFIG_MAX22007 is not set +# CONFIG_MAX5522 is not set +# CONFIG_MAX5821 is not set +# CONFIG_MCP4725 is not set +# CONFIG_MCP4728 is not set +# CONFIG_MCP47FEB02 is not set +# CONFIG_MCP4821 is not set +# CONFIG_MCP4922 is not set +# CONFIG_TI_DAC082S085 is not set +# CONFIG_TI_DAC5571 is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set +# CONFIG_VF610_DAC is not set +# end of Digital to analog converters + +# +# IIO dummy driver +# +# end of IIO dummy driver + +# +# Filters +# +# CONFIG_ADMV8818 is not set +# end of Filters + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +# CONFIG_AD9523 is not set +# end of Clock Generator/Distribution + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +# CONFIG_ADF4350 is not set +# CONFIG_ADF4371 is not set +# CONFIG_ADF4377 is not set +# CONFIG_ADMFM2000 is not set +# CONFIG_ADMV1013 is not set +# CONFIG_ADMV1014 is not set +# CONFIG_ADMV4420 is not set +# CONFIG_ADRF6780 is not set +# end of Phase-Locked Loop (PLL) frequency synthesizers +# end of Frequency Synthesizers DDS/PLL + +# +# Digital gyroscope sensors +# +# CONFIG_ADIS16080 is not set +# CONFIG_ADIS16130 is not set +# CONFIG_ADIS16136 is not set +# CONFIG_ADIS16260 is not set +# CONFIG_ADXRS290 is not set +# CONFIG_ADXRS450 is not set +# CONFIG_BMG160 is not set +# CONFIG_FXAS21002C is not set +# CONFIG_HID_SENSOR_GYRO_3D is not set +# CONFIG_MPU3050_I2C is not set +# CONFIG_IIO_ST_GYRO_3AXIS is not set +# CONFIG_ITG3200 is not set +# end of Digital gyroscope sensors + +# +# Health Sensors +# + +# +# Heart Rate Monitors +# +# CONFIG_AFE4403 is not set +# CONFIG_AFE4404 is not set +# CONFIG_MAX30100 is not set +# CONFIG_MAX30102 is not set +# end of Heart Rate Monitors +# end of Health Sensors + +# +# Humidity sensors +# +# CONFIG_AM2315 is not set +# CONFIG_DHT11 is not set +# CONFIG_ENS210 is not set +# CONFIG_HDC100X is not set +# CONFIG_HDC2010 is not set +# CONFIG_HDC3020 is not set +# CONFIG_HID_SENSOR_HUMIDITY is not set +# CONFIG_HTS221 is not set +# CONFIG_HTU21 is not set +# CONFIG_SI7005 is not set +# CONFIG_SI7020 is not set +# end of Humidity sensors + +# +# Inertial measurement units +# +# CONFIG_ADIS16400 is not set +# CONFIG_ADIS16460 is not set +# CONFIG_ADIS16475 is not set +# CONFIG_ADIS16480 is not set +# CONFIG_ADIS16550 is not set +# CONFIG_BMI160_I2C is not set +# CONFIG_BMI160_SPI is not set +# CONFIG_BMI270_I2C is not set +# CONFIG_BMI270_SPI is not set +# CONFIG_BMI323_I2C is not set +# CONFIG_BMI323_SPI is not set +# CONFIG_BOSCH_BNO055_SERIAL is not set +# CONFIG_BOSCH_BNO055_I2C is not set +# CONFIG_FXOS8700_I2C is not set +# CONFIG_FXOS8700_SPI is not set +# CONFIG_KMX61 is not set +# CONFIG_INV_ICM42600_I2C is not set +# CONFIG_INV_ICM42600_SPI is not set +# CONFIG_INV_ICM45600_I2C is not set +# CONFIG_INV_ICM45600_SPI is not set +# CONFIG_INV_MPU6050_I2C is not set +# CONFIG_INV_MPU6050_SPI is not set +# CONFIG_SMI240 is not set +# CONFIG_SMI330_I2C is not set +# CONFIG_SMI330_SPI is not set +# CONFIG_IIO_ST_LSM6DSX is not set +# CONFIG_IIO_ST_LSM9DS0 is not set +# end of Inertial measurement units + +# +# Light sensors +# +# CONFIG_ADJD_S311 is not set +# CONFIG_ADUX1020 is not set +# CONFIG_AL3000A is not set +# CONFIG_AL3010 is not set +# CONFIG_AL3320A is not set +# CONFIG_APDS9160 is not set +# CONFIG_APDS9300 is not set +# CONFIG_APDS9306 is not set +# CONFIG_APDS9960 is not set +# CONFIG_AS73211 is not set +# CONFIG_BH1745 is not set +# CONFIG_BH1750 is not set +# CONFIG_BH1780 is not set +# CONFIG_CM32181 is not set +# CONFIG_CM3232 is not set +# CONFIG_CM3323 is not set +# CONFIG_CM3605 is not set +# CONFIG_CM36651 is not set +# CONFIG_GP2AP002 is not set +# CONFIG_GP2AP020A00F is not set +# CONFIG_SENSORS_ISL29018 is not set +# CONFIG_SENSORS_ISL29028 is not set +# CONFIG_ISL29125 is not set +# CONFIG_ISL76682 is not set +# CONFIG_HID_SENSOR_ALS is not set +# CONFIG_HID_SENSOR_PROX is not set +# CONFIG_JSA1212 is not set +# CONFIG_ROHM_BU27034 is not set +# CONFIG_RPR0521 is not set +# CONFIG_LTR390 is not set +# CONFIG_LTR501 is not set +# CONFIG_LTRF216A is not set +# CONFIG_LV0104CS is not set +# CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set +# CONFIG_NOA1305 is not set +# CONFIG_OPT3001 is not set +# CONFIG_OPT4001 is not set +# CONFIG_OPT4060 is not set +# CONFIG_PA12203001 is not set +# CONFIG_SI1133 is not set +# CONFIG_SI1145 is not set +# CONFIG_STK3310 is not set +# CONFIG_ST_UVIS25 is not set +# CONFIG_TCS3414 is not set +# CONFIG_TCS3472 is not set +# CONFIG_SENSORS_TSL2563 is not set +# CONFIG_TSL2583 is not set +# CONFIG_TSL2591 is not set +# CONFIG_TSL2772 is not set +# CONFIG_TSL4531 is not set +# CONFIG_US5182D is not set +# CONFIG_VCNL4000 is not set +# CONFIG_VCNL4035 is not set +# CONFIG_VEML3235 is not set +# CONFIG_VEML6030 is not set +# CONFIG_VEML6040 is not set +# CONFIG_VEML6046X00 is not set +# CONFIG_VEML6070 is not set +# CONFIG_VEML6075 is not set +# CONFIG_VL6180 is not set +# CONFIG_ZOPT2201 is not set +# end of Light sensors + +# +# Magnetometer sensors +# +# CONFIG_AF8133J is not set +# CONFIG_AK8974 is not set +# CONFIG_AK8975 is not set +# CONFIG_AK09911 is not set +# CONFIG_ALS31300 is not set +# CONFIG_BMC150_MAGN_I2C is not set +# CONFIG_BMC150_MAGN_SPI is not set +# CONFIG_MAG3110 is not set +# CONFIG_HID_SENSOR_MAGNETOMETER_3D is not set +# CONFIG_MMC35240 is not set +# CONFIG_MMC5633 is not set +# CONFIG_IIO_ST_MAGN_3AXIS is not set +# CONFIG_INFINEON_TLV493D is not set +# CONFIG_SENSORS_HMC5843_I2C is not set +# CONFIG_SENSORS_HMC5843_SPI is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_SI7210 is not set +# CONFIG_TI_TMAG5273 is not set +# CONFIG_YAMAHA_YAS530 is not set +# end of Magnetometer sensors + +# +# Multiplexers +# +# CONFIG_IIO_MUX is not set +# end of Multiplexers + +# +# Inclinometer sensors +# +# CONFIG_HID_SENSOR_INCLINOMETER_3D is not set +# CONFIG_HID_SENSOR_DEVICE_ROTATION is not set +# end of Inclinometer sensors + +# +# Linear and angular position sensors +# +# CONFIG_HID_SENSOR_CUSTOM_INTEL_HINGE is not set +# end of Linear and angular position sensors + +# +# Digital potentiometers +# +# CONFIG_AD5110 is not set +# CONFIG_AD5272 is not set +# CONFIG_DS1803 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MAX5481 is not set +# CONFIG_MAX5487 is not set +# CONFIG_MCP4018 is not set +# CONFIG_MCP4131 is not set +# CONFIG_MCP4531 is not set +# CONFIG_MCP41010 is not set +# CONFIG_TPL0102 is not set +# CONFIG_X9250 is not set +# end of Digital potentiometers + +# +# Digital potentiostats +# +# CONFIG_LMP91000 is not set +# end of Digital potentiostats + +# +# Pressure sensors +# +# CONFIG_ABP060MG is not set +# CONFIG_ABP2030PA_I2C is not set +# CONFIG_ABP2030PA_SPI is not set +# CONFIG_ROHM_BM1390 is not set +# CONFIG_BMP280 is not set +# CONFIG_DLHL60D is not set +# CONFIG_DPS310 is not set +# CONFIG_HID_SENSOR_PRESS is not set +# CONFIG_HP03 is not set +# CONFIG_HSC030PA is not set +# CONFIG_ICP10100 is not set +# CONFIG_MPL115_I2C is not set +# CONFIG_MPL115_SPI is not set +# CONFIG_MPL3115 is not set +# CONFIG_MPRLS0025PA_I2C is not set +# CONFIG_MPRLS0025PA_SPI is not set +# CONFIG_MS5611 is not set +# CONFIG_MS5637 is not set +# CONFIG_SDP500 is not set +# CONFIG_IIO_ST_PRESS is not set +# CONFIG_T5403 is not set +# CONFIG_HP206C is not set +# CONFIG_ZPA2326 is not set +# CONFIG_ADP810 is not set +# end of Pressure sensors + +# +# Lightning sensors +# +# CONFIG_AS3935 is not set +# end of Lightning sensors + +# +# Proximity and distance sensors +# +# CONFIG_D3323AA is not set +# CONFIG_HX9023S is not set +# CONFIG_IRSD200 is not set +# CONFIG_ISL29501 is not set +# CONFIG_LIDAR_LITE_V2 is not set +# CONFIG_MB1232 is not set +# CONFIG_PING is not set +# CONFIG_RFD77402 is not set +# CONFIG_SRF04 is not set +# CONFIG_SX9310 is not set +# CONFIG_SX9324 is not set +# CONFIG_SX9360 is not set +# CONFIG_SX9500 is not set +# CONFIG_SRF08 is not set +# CONFIG_VCNL3020 is not set +# CONFIG_VL53L0X_I2C is not set +# CONFIG_VL53L1X_I2C is not set +# CONFIG_AW96103 is not set +# end of Proximity and distance sensors + +# +# Resolver to digital converters +# +# CONFIG_AD2S90 is not set +# CONFIG_AD2S1200 is not set +# CONFIG_AD2S1210 is not set +# end of Resolver to digital converters + +# +# Temperature sensors +# +# CONFIG_LTC2983 is not set +# CONFIG_MAXIM_THERMOCOUPLE is not set +# CONFIG_HID_SENSOR_TEMP is not set +# CONFIG_MLX90614 is not set +# CONFIG_MLX90632 is not set +# CONFIG_MLX90635 is not set +# CONFIG_TMP006 is not set +# CONFIG_TMP007 is not set +# CONFIG_TMP117 is not set +# CONFIG_TSYS01 is not set +# CONFIG_TSYS02D is not set +# CONFIG_MAX30208 is not set +# CONFIG_MAX31856 is not set +# CONFIG_MAX31865 is not set +# CONFIG_MCP9600 is not set +# end of Temperature sensors + +# CONFIG_NTB is not set +CONFIG_PWM=y +# CONFIG_PWM_DEBUG is not set +# CONFIG_PWM_PROVIDE_GPIO is not set +CONFIG_PWM_APPLE=y +# CONFIG_PWM_ARGON_FAN_HAT is not set +# CONFIG_PWM_ATMEL_TCB is not set +# CONFIG_PWM_CLK is not set +# CONFIG_PWM_DWC is not set +# CONFIG_PWM_FSL_FTM is not set +# CONFIG_PWM_GPIO is not set +# CONFIG_PWM_MC33XS2410 is not set +# CONFIG_PWM_PCA9685 is not set +# CONFIG_PWM_XILINX is not set + +# +# IRQ chip support +# +CONFIG_IRQCHIP=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_MAX_NR=1 +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_ITS_PARENT=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V5=y +CONFIG_IRQ_MSI_LIB=y +# CONFIG_AL_FIC is not set +# CONFIG_XILINX_INTC is not set +CONFIG_APPLE_AIC=y +# end of IRQ chip support + +# CONFIG_IPACK_BUS is not set +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_GPIO is not set +# CONFIG_RESET_SIMPLE is not set +# CONFIG_RESET_TI_SYSCON is not set +# CONFIG_RESET_TI_TPS380X is not set + +# +# PHY Subsystem +# +CONFIG_GENERIC_PHY=y +# CONFIG_PHY_CAN_TRANSCEIVER is not set +# CONFIG_PHY_GOOGLE_USB is not set +# CONFIG_PHY_NXP_PTN3222 is not set +CONFIG_PHY_APPLE_ATC=m +CONFIG_PHY_APPLE_DPTX=m + +# +# PHY drivers for Broadcom platforms +# +# CONFIG_BCM_KONA_USB2_PHY is not set +# end of PHY drivers for Broadcom platforms + +# CONFIG_PHY_CADENCE_TORRENT is not set +# CONFIG_PHY_CADENCE_DPHY is not set +# CONFIG_PHY_CADENCE_DPHY_RX is not set +# CONFIG_PHY_CADENCE_SIERRA is not set +# CONFIG_PHY_CADENCE_SALVO is not set +# CONFIG_PHY_PXA_28NM_HSIC is not set +# CONFIG_PHY_PXA_28NM_USB2 is not set +# CONFIG_PHY_CPCAP_USB is not set +# CONFIG_PHY_MAPPHONE_MDM6600 is not set +# CONFIG_PHY_OCELOT_SERDES is not set +# CONFIG_PHY_QCOM_USB_HS is not set +# CONFIG_PHY_QCOM_USB_HSIC is not set +# CONFIG_PHY_TUSB1210 is not set +# end of PHY Subsystem + +CONFIG_POWERCAP=y +# CONFIG_IDLE_INJECT is not set +# CONFIG_DTPM is not set +# CONFIG_MCB is not set + +# +# Performance monitor support +# +# CONFIG_ARM_CCI_PMU is not set +# CONFIG_ARM_CCN is not set +# CONFIG_ARM_CMN is not set +# CONFIG_ARM_NI is not set +CONFIG_ARM_PMU=y +# CONFIG_ARM_SMMU_V3_PMU is not set +CONFIG_ARM_PMUV3=y +# CONFIG_ARM_DSU_PMU is not set +# CONFIG_ARM_SPE_PMU is not set +CONFIG_ARM64_BRBE=y +CONFIG_APPLE_M1_CPU_PMU=y +# CONFIG_HISI_PCIE_PMU is not set +# CONFIG_HNS3_PMU is not set +# CONFIG_DWC_PCIE_PMU is not set +# CONFIG_ARM_CORESIGHT_PMU_ARCH_SYSTEM_PMU is not set +# end of Performance monitor support + +CONFIG_RAS=y +CONFIG_USB4=m +CONFIG_USB4_NET=m +# CONFIG_USB4_DEBUGFS_WRITE is not set +# CONFIG_USB4_DMA_TEST is not set +CONFIG_USB4_APPLE_SOC=m +CONFIG_RESET_APPLE_CIO=y + +# +# Android +# +# CONFIG_ANDROID_BINDER_IPC is not set +# CONFIG_ANDROID_BINDER_IPC_RUST is not set +# end of Android + +# CONFIG_LIBNVDIMM is not set +# CONFIG_DAX is not set +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y +CONFIG_NVMEM_LAYOUTS=y + +# +# Layout Types +# +# CONFIG_NVMEM_LAYOUT_SL28_VPD is not set +# CONFIG_NVMEM_LAYOUT_ONIE_TLV is not set +# CONFIG_NVMEM_LAYOUT_U_BOOT_ENV is not set +# end of Layout Types + +CONFIG_NVMEM_APPLE_EFUSES=y +CONFIG_NVMEM_APPLE_SPMI=y +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_SPMI_SDAM is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set + +# +# HW tracing support +# +# CONFIG_STM is not set +# CONFIG_INTEL_TH is not set +# CONFIG_HISI_PTT is not set +# end of HW tracing support + +# CONFIG_FPGA is not set +# CONFIG_FSI is not set +# CONFIG_TEE is not set +CONFIG_MULTIPLEXER=y +# CONFIG_MUX_CORE is not set + +# +# Multiplexer drivers +# +# CONFIG_MUX_ADG792A is not set +# CONFIG_MUX_ADGS1408 is not set +CONFIG_MUX_APPLE_DPXBAR=m +# CONFIG_MUX_GPIO is not set +# CONFIG_MUX_MMIO is not set +# end of Multiplexer drivers + +CONFIG_PM_OPP=y +# CONFIG_SIOX is not set +# CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set +# CONFIG_COUNTER is not set +# CONFIG_MOST is not set +# CONFIG_PECI is not set +# CONFIG_HTE is not set +# CONFIG_CDX_BUS is not set +# end of Device Drivers + +# +# File systems +# +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_VALIDATE_FS_PARSER=y +CONFIG_FS_IOMAP=y +CONFIG_FS_STACK=y +CONFIG_BUFFER_HEAD=y +CONFIG_LEGACY_DIRECT_IO=y +# CONFIG_EXT2_FS is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_USE_FOR_EXT2=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +# CONFIG_EXT4_DEBUG is not set +CONFIG_JBD2=y +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=y +CONFIG_JFS_FS=m +CONFIG_JFS_POSIX_ACL=y +CONFIG_JFS_SECURITY=y +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +CONFIG_XFS_FS=m +CONFIG_XFS_SUPPORT_V4=y +CONFIG_XFS_SUPPORT_ASCII_CI=y +CONFIG_XFS_QUOTA=y +CONFIG_XFS_POSIX_ACL=y +# CONFIG_XFS_RT is not set +# CONFIG_XFS_ONLINE_SCRUB is not set +# CONFIG_XFS_WARN is not set +# CONFIG_XFS_DEBUG is not set +CONFIG_GFS2_FS=m +CONFIG_GFS2_FS_LOCKING_DLM=y +CONFIG_OCFS2_FS=m +CONFIG_OCFS2_FS_O2CB=m +CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m +# CONFIG_OCFS2_FS_STATS is not set +# CONFIG_OCFS2_DEBUG_MASKLOG is not set +# CONFIG_OCFS2_DEBUG_FS is not set +CONFIG_BTRFS_FS=m +CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set +# CONFIG_BTRFS_DEBUG is not set +# CONFIG_BTRFS_ASSERT is not set +# CONFIG_BTRFS_EXPERIMENTAL is not set +CONFIG_NILFS2_FS=m +# CONFIG_F2FS_FS is not set +# CONFIG_ZONEFS_FS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_EXPORTFS=y +CONFIG_EXPORTFS_BLOCK_OPS=y +CONFIG_FILE_LOCKING=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FS_ENCRYPTION_ALGS=y +# CONFIG_FS_VERITY is not set +CONFIG_FSNOTIFY=y +CONFIG_DNOTIFY=y +CONFIG_INOTIFY_USER=y +CONFIG_FANOTIFY=y +CONFIG_FANOTIFY_ACCESS_PERMISSIONS=y +CONFIG_QUOTA=y +CONFIG_QUOTA_NETLINK_INTERFACE=y +# CONFIG_QUOTA_DEBUG is not set +CONFIG_QUOTA_TREE=y +# CONFIG_QFMT_V1 is not set +CONFIG_QFMT_V2=y +CONFIG_QUOTACTL=y +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=m +CONFIG_CUSE=m +# CONFIG_VIRTIO_FS is not set +CONFIG_FUSE_PASSTHROUGH=y +CONFIG_FUSE_IO_URING=y +CONFIG_OVERLAY_FS=m +# CONFIG_OVERLAY_FS_REDIRECT_DIR is not set +CONFIG_OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW=y +# CONFIG_OVERLAY_FS_INDEX is not set +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +# CONFIG_OVERLAY_FS_METACOPY is not set +# CONFIG_OVERLAY_FS_DEBUG is not set + +# +# Caches +# +CONFIG_NETFS_SUPPORT=m +CONFIG_NETFS_STATS=y +# CONFIG_NETFS_DEBUG is not set +CONFIG_FSCACHE=y +# CONFIG_FSCACHE_STATS is not set +CONFIG_CACHEFILES=m +# CONFIG_CACHEFILES_DEBUG is not set +# CONFIG_CACHEFILES_ERROR_INJECTION is not set +CONFIG_CACHEFILES_ONDEMAND=y +# end of Caches + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=m +# end of CD-ROM/DVD Filesystems + +# +# DOS/FAT/EXFAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +# CONFIG_FAT_DEFAULT_UTF8 is not set +CONFIG_EXFAT_FS=m +CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +CONFIG_NTFS_FS_POSIX_ACL=y +CONFIG_NTFS3_FS=m +# CONFIG_NTFS3_64BIT_CLUSTER is not set +CONFIG_NTFS3_LZX_XPRESS=y +CONFIG_NTFS3_FS_POSIX_ACL=y +# end of DOS/FAT/EXFAT/NT Filesystems + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_CHILDREN=y +CONFIG_KERNFS=y +CONFIG_SYSFS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_TMPFS_XATTR=y +# CONFIG_TMPFS_INODE64 is not set +# CONFIG_TMPFS_QUOTA is not set +CONFIG_ARCH_SUPPORTS_HUGETLBFS=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_HUGETLB_PMD_PAGE_TABLE_SHARING=y +CONFIG_ARCH_HAS_GIGANTIC_PAGE=y +CONFIG_CONFIGFS_FS=y +CONFIG_EFIVAR_FS=y +# end of Pseudo filesystems + +CONFIG_MISC_FILESYSTEMS=y +# CONFIG_ORANGEFS_FS is not set +# CONFIG_ADFS_FS is not set +CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +# CONFIG_ECRYPT_FS_MESSAGING is not set +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m +CONFIG_BEFS_FS=m +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS2_FS is not set +CONFIG_CRAMFS=m +CONFIG_CRAMFS_BLOCKDEV=y +# CONFIG_CRAMFS_MTD is not set +CONFIG_SQUASHFS=m +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +CONFIG_SQUASHFS_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_CHOICE_DECOMP_BY_MOUNT is not set +CONFIG_SQUASHFS_COMPILE_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI is not set +# CONFIG_SQUASHFS_COMPILE_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_XATTR=y +# CONFIG_SQUASHFS_COMP_CACHE_FULL is not set +CONFIG_SQUASHFS_ZLIB=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 +# CONFIG_VXFS_FS is not set +CONFIG_MINIX_FS=m +# CONFIG_OMFS_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX6FS_FS is not set +CONFIG_ROMFS_FS=m +CONFIG_ROMFS_BACKED_BY_BLOCK=y +# CONFIG_ROMFS_BACKED_BY_MTD is not set +# CONFIG_ROMFS_BACKED_BY_BOTH is not set +CONFIG_ROMFS_ON_BLOCK=y +CONFIG_PSTORE=y +CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240 +CONFIG_PSTORE_COMPRESS=y +# CONFIG_PSTORE_CONSOLE is not set +# CONFIG_PSTORE_PMSG is not set +CONFIG_PSTORE_RAM=m +# CONFIG_PSTORE_BLK is not set +CONFIG_UFS_FS=m +# CONFIG_UFS_FS_WRITE is not set +# CONFIG_UFS_DEBUG is not set +CONFIG_EROFS_FS=m +# CONFIG_EROFS_FS_DEBUG is not set +CONFIG_EROFS_FS_XATTR=y +CONFIG_EROFS_FS_POSIX_ACL=y +CONFIG_EROFS_FS_SECURITY=y +CONFIG_EROFS_FS_BACKED_BY_FILE=y +CONFIG_EROFS_FS_ZIP=y +CONFIG_EROFS_FS_ZIP_LZMA=y +CONFIG_EROFS_FS_ZIP_DEFLATE=y +CONFIG_EROFS_FS_ZIP_ZSTD=y +# CONFIG_EROFS_FS_ZIP_ACCEL is not set +CONFIG_EROFS_FS_ONDEMAND=y +# CONFIG_EROFS_FS_PCPU_KTHREAD is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +# CONFIG_NFS_V2 is not set +CONFIG_NFS_V3=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y +CONFIG_NFS_V4_0=y +CONFIG_NFS_V4_2=y +CONFIG_PNFS_FILE_LAYOUT=y +CONFIG_PNFS_BLOCK=y +CONFIG_PNFS_FLEXFILE_LAYOUT=y +CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" +# CONFIG_NFS_V4_1_MIGRATION is not set +CONFIG_NFS_V4_SECURITY_LABEL=y +# CONFIG_NFS_FSCACHE is not set +# CONFIG_NFS_USE_LEGACY_DNS is not set +CONFIG_NFS_USE_KERNEL_DNS=y +CONFIG_NFS_DEBUG=y +CONFIG_NFS_DISABLE_UDP_SUPPORT=y +# CONFIG_NFS_V4_2_READ_PLUS is not set +CONFIG_NFSD=m +# CONFIG_NFSD_V2 is not set +CONFIG_NFSD_V3_ACL=y +CONFIG_NFSD_V4=y +CONFIG_NFSD_PNFS=y +CONFIG_NFSD_BLOCKLAYOUT=y +CONFIG_NFSD_SCSILAYOUT=y +CONFIG_NFSD_FLEXFILELAYOUT=y +CONFIG_NFSD_V4_2_INTER_SSC=y +CONFIG_NFSD_V4_SECURITY_LABEL=y +# CONFIG_NFSD_LEGACY_CLIENT_TRACKING is not set +CONFIG_NFSD_V4_POSIX_ACLS=y +CONFIG_GRACE_PERIOD=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_NFS_ACL_SUPPORT=y +CONFIG_NFS_COMMON=y +# CONFIG_NFS_LOCALIO is not set +CONFIG_NFS_V4_2_SSC_HELPER=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=m +CONFIG_SUNRPC_BACKCHANNEL=y +CONFIG_SUNRPC_SWAP=y +CONFIG_RPCSEC_GSS_KRB5=m +CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA1=y +# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_CAMELLIA is not set +# CONFIG_RPCSEC_GSS_KRB5_ENCTYPES_AES_SHA2 is not set +CONFIG_SUNRPC_DEBUG=y +# CONFIG_SUNRPC_DEBUG_TRACE is not set +CONFIG_CEPH_FS=m +# CONFIG_CEPH_FSCACHE is not set +CONFIG_CEPH_FS_POSIX_ACL=y +# CONFIG_CEPH_FS_SECURITY_LABEL is not set +CONFIG_CIFS=m +# CONFIG_CIFS_STATS2 is not set +CONFIG_CIFS_ALLOW_INSECURE_LEGACY=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +CONFIG_CIFS_DEBUG=y +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_DEBUG_DUMP_KEYS is not set +CONFIG_CIFS_DFS_UPCALL=y +# CONFIG_CIFS_SWN_UPCALL is not set +# CONFIG_CIFS_FSCACHE is not set +# CONFIG_CIFS_COMPRESSION is not set +# CONFIG_SMB_SERVER is not set +CONFIG_SMBFS=m +CONFIG_CODA_FS=m +# CONFIG_AFS_FS is not set +CONFIG_9P_FS=m +# CONFIG_9P_FSCACHE is not set +CONFIG_9P_FS_POSIX_ACL=y +CONFIG_9P_FS_SECURITY=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="utf8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=m +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_MAC_ROMAN=m +CONFIG_NLS_MAC_CELTIC=m +CONFIG_NLS_MAC_CENTEURO=m +CONFIG_NLS_MAC_CROATIAN=m +CONFIG_NLS_MAC_CYRILLIC=m +CONFIG_NLS_MAC_GAELIC=m +CONFIG_NLS_MAC_GREEK=m +CONFIG_NLS_MAC_ICELAND=m +CONFIG_NLS_MAC_INUIT=m +CONFIG_NLS_MAC_ROMANIAN=m +CONFIG_NLS_MAC_TURKISH=m +CONFIG_NLS_UTF8=y +CONFIG_NLS_UCS2_UTILS=m +CONFIG_DLM=m +CONFIG_DLM_DEBUG=y +CONFIG_UNICODE=m +CONFIG_IO_WQ=y +# end of File systems + +# +# Security options +# +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +CONFIG_PERSISTENT_KEYRINGS=y +# CONFIG_BIG_KEYS is not set +# CONFIG_TRUSTED_KEYS is not set +CONFIG_ENCRYPTED_KEYS=y +# CONFIG_USER_DECRYPTED_DATA is not set +CONFIG_KEY_DH_OPERATIONS=y +# CONFIG_KEY_NOTIFICATIONS is not set +# CONFIG_SECURITY_DMESG_RESTRICT is not set +CONFIG_PROC_MEM_ALWAYS_FORCE=y +# CONFIG_PROC_MEM_FORCE_PTRACE is not set +# CONFIG_PROC_MEM_NO_FORCE is not set +CONFIG_SECURITY=y +CONFIG_HAS_SECURITY_AUDIT=y +CONFIG_SECURITYFS=y +CONFIG_SECURITY_NETWORK=y +CONFIG_SECURITY_NETWORK_XFRM=y +CONFIG_SECURITY_PATH=y +# CONFIG_STATIC_USERMODEHELPER is not set +# CONFIG_SECURITY_SELINUX is not set +# CONFIG_SECURITY_SMACK is not set +# CONFIG_SECURITY_TOMOYO is not set +CONFIG_SECURITY_APPARMOR=y +# CONFIG_SECURITY_APPARMOR_DEBUG is not set +CONFIG_SECURITY_APPARMOR_INTROSPECT_POLICY=y +CONFIG_SECURITY_APPARMOR_HASH=y +CONFIG_SECURITY_APPARMOR_HASH_DEFAULT=y +CONFIG_SECURITY_APPARMOR_EXPORT_BINARY=y +CONFIG_SECURITY_APPARMOR_PARANOID_LOAD=y +# CONFIG_SECURITY_LOADPIN is not set +CONFIG_SECURITY_YAMA=y +# CONFIG_SECURITY_SAFESETID is not set +# CONFIG_SECURITY_LOCKDOWN_LSM is not set +CONFIG_SECURITY_LANDLOCK=y +# CONFIG_SECURITY_IPE is not set +# CONFIG_INTEGRITY is not set +# CONFIG_IMA_SECURE_AND_OR_TRUSTED_BOOT is not set +# CONFIG_DEFAULT_SECURITY_APPARMOR is not set +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_LSM="landlock,yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" + +# +# Kernel hardening options +# + +# +# Memory initialization +# +CONFIG_CC_HAS_AUTO_VAR_INIT_PATTERN=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO_BARE=y +CONFIG_CC_HAS_AUTO_VAR_INIT_ZERO=y +CONFIG_INIT_STACK_NONE=y +# CONFIG_INIT_STACK_ALL_PATTERN is not set +# CONFIG_INIT_STACK_ALL_ZERO is not set +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y +# CONFIG_ZERO_CALL_USED_REGS is not set +# end of Memory initialization + +# +# Bounds checking +# +# CONFIG_FORTIFY_SOURCE is not set +# CONFIG_HARDENED_USERCOPY is not set +# end of Bounds checking + +# +# Hardening of kernel data structures +# +# CONFIG_LIST_HARDENED is not set +# CONFIG_RUST_BITMAP_HARDENED is not set +# CONFIG_BUG_ON_DATA_CORRUPTION is not set +# end of Hardening of kernel data structures + +CONFIG_RANDSTRUCT_NONE=y +# end of Kernel hardening options +# end of Security options + +CONFIG_ASYNC_CORE=m +CONFIG_ASYNC_MEMCPY=m +CONFIG_ASYNC_XOR=m +CONFIG_ASYNC_PQ=m +CONFIG_ASYNC_RAID6_RECOV=m +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_SIG=y +CONFIG_CRYPTO_SIG2=y +CONFIG_CRYPTO_SKCIPHER=y +CONFIG_CRYPTO_SKCIPHER2=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_AKCIPHER2=y +CONFIG_CRYPTO_AKCIPHER=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_KPP=y +CONFIG_CRYPTO_ACOMP2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=m +# CONFIG_CRYPTO_SELFTESTS is not set +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_PCRYPT=m +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_KRB5ENC=m +# CONFIG_CRYPTO_BENCHMARK is not set +CONFIG_CRYPTO_ENGINE=m +# end of Crypto core or helper + +# +# Public-key cryptography +# +CONFIG_CRYPTO_RSA=y +CONFIG_CRYPTO_DH=y +# CONFIG_CRYPTO_DH_RFC7919_GROUPS is not set +CONFIG_CRYPTO_ECC=m +CONFIG_CRYPTO_ECDH=m +# CONFIG_CRYPTO_ECDSA is not set +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_MLDSA is not set +# end of Public-key cryptography + +# +# Block ciphers +# +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARIA=m +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_BLOWFISH_COMMON=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAST_COMMON=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DES=m +CONFIG_CRYPTO_FCRYPT=m +CONFIG_CRYPTO_KHAZAD=m +CONFIG_CRYPTO_SEED=m +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_SM4=y +CONFIG_CRYPTO_SM4_GENERIC=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m +# end of Block ciphers + +# +# Length-preserving ciphers and modes +# +CONFIG_CRYPTO_ADIANTUM=m +CONFIG_CRYPTO_ARC4=m +CONFIG_CRYPTO_CHACHA20=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_ECB=y +# CONFIG_CRYPTO_HCTR2 is not set +CONFIG_CRYPTO_LRW=m +CONFIG_CRYPTO_PCBC=m +CONFIG_CRYPTO_XTS=y +# end of Length-preserving ciphers and modes + +# +# AEAD (authenticated encryption with associated data) ciphers +# +CONFIG_CRYPTO_AEGIS128=m +# CONFIG_CRYPTO_AEGIS128_SIMD is not set +CONFIG_CRYPTO_CHACHA20POLY1305=m +CONFIG_CRYPTO_CCM=m +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_GENIV=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_ECHAINIV=m +CONFIG_CRYPTO_ESSIV=m +# end of AEAD (authenticated encryption with associated data) ciphers + +# +# Hashes, digests, and MACs +# +CONFIG_CRYPTO_BLAKE2B=y +CONFIG_CRYPTO_CMAC=m +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_RMD160=m +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_SHA3=y +CONFIG_CRYPTO_SM3=m +# CONFIG_CRYPTO_STREEBOG is not set +CONFIG_CRYPTO_WP512=m +CONFIG_CRYPTO_XCBC=m +CONFIG_CRYPTO_XXHASH=y +# end of Hashes, digests, and MACs + +# +# CRCs (cyclic redundancy checks) +# +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC32=y +# end of CRCs (cyclic redundancy checks) + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_842=m +CONFIG_CRYPTO_LZ4=m +CONFIG_CRYPTO_LZ4HC=m +CONFIG_CRYPTO_ZSTD=m +# end of Compression + +# +# Random number generation +# +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_HASH=y +CONFIG_CRYPTO_DRBG_CTR=y +CONFIG_CRYPTO_DRBG=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKS=64 +CONFIG_CRYPTO_JITTERENTROPY_MEMORY_BLOCKSIZE=32 +CONFIG_CRYPTO_JITTERENTROPY_OSR=1 +CONFIG_CRYPTO_KDF800108_CTR=y +CONFIG_CRYPTO_DF80090A=y +# end of Random number generation + +# +# Userspace interface +# +CONFIG_CRYPTO_USER_API=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_USER_API_RNG=y +# CONFIG_CRYPTO_USER_API_RNG_CAVP is not set +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y +# end of Userspace interface + +# +# Accelerated Cryptographic Algorithms for CPU (arm64) +# +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_SM4_ARM64_CE=y +CONFIG_CRYPTO_SM4_ARM64_CE_BLK=y +CONFIG_CRYPTO_SM4_ARM64_NEON_BLK=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +# CONFIG_CRYPTO_SM4_ARM64_CE_CCM is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_GCM is not set +# end of Accelerated Cryptographic Algorithms for CPU (arm64) + +CONFIG_CRYPTO_HW=y +# CONFIG_CRYPTO_DEV_ATMEL_ECC is not set +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +# CONFIG_CRYPTO_DEV_CCP is not set +# CONFIG_CRYPTO_DEV_NITROX_CNN55XX is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXX is not set +# CONFIG_CRYPTO_DEV_QAT_C62X is not set +# CONFIG_CRYPTO_DEV_QAT_4XXX is not set +# CONFIG_CRYPTO_DEV_QAT_420XX is not set +# CONFIG_CRYPTO_DEV_QAT_DH895xCCVF is not set +# CONFIG_CRYPTO_DEV_QAT_C3XXXVF is not set +# CONFIG_CRYPTO_DEV_QAT_C62XVF is not set +CONFIG_CRYPTO_DEV_VIRTIO=m +# CONFIG_CRYPTO_DEV_SAFEXCEL is not set +# CONFIG_CRYPTO_DEV_CCREE is not set +# CONFIG_CRYPTO_DEV_HISI_SEC is not set +# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set +CONFIG_ASYMMETRIC_KEY_TYPE=y +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y +CONFIG_X509_CERTIFICATE_PARSER=y +CONFIG_PKCS8_PRIVATE_KEY_PARSER=y +CONFIG_PKCS7_MESSAGE_PARSER=y +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_SIGNED_PE_FILE_VERIFICATION is not set +# CONFIG_FIPS_SIGNATURE_SELFTEST is not set + +# +# Certificates for signature checking +# +CONFIG_SYSTEM_TRUSTED_KEYRING=y +CONFIG_SYSTEM_TRUSTED_KEYS="" +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +# CONFIG_SYSTEM_BLACKLIST_KEYRING is not set +CONFIG_OPENSSL_SUPPORTS_ML_DSA=y +# end of Certificates for signature checking + +CONFIG_CRYPTO_KRB5=m +# CONFIG_CRYPTO_KRB5_SELFTESTS is not set +CONFIG_BINARY_PRINTF=y + +# +# Library routines +# +CONFIG_RAID6_PQ=m +CONFIG_RAID6_PQ_BENCHMARK=y +CONFIG_LINEAR_RANGES=y +# CONFIG_PACKING is not set +CONFIG_BITREVERSE=y +CONFIG_HAVE_ARCH_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_NET_UTILS=y +CONFIG_CORDIC=m +# CONFIG_PRIME_NUMBERS is not set +CONFIG_RATIONAL=y +CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y +CONFIG_ARCH_HAS_FAST_MULTIPLIER=y +CONFIG_ARCH_USE_SYM_ANNOTATIONS=y +# CONFIG_INDIRECT_PIO is not set +# CONFIG_TRACE_MMIO_ACCESS is not set +CONFIG_CRC16=y +CONFIG_CRC_CCITT=y +CONFIG_CRC_ITU_T=m +CONFIG_CRC_T10DIF=y +CONFIG_CRC_T10DIF_ARCH=y +CONFIG_CRC32=y +CONFIG_CRC32_ARCH=y +CONFIG_CRC64=y +CONFIG_CRC64_ARCH=y +CONFIG_CRC_OPTIMIZATIONS=y +CONFIG_CRYPTO_HASH_INFO=y +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_AES_ARCH=y +CONFIG_CRYPTO_LIB_AES_CBC_MACS=y +CONFIG_CRYPTO_LIB_ARC4=m +CONFIG_CRYPTO_LIB_GF128MUL=y +CONFIG_CRYPTO_LIB_BLAKE2B=y +CONFIG_CRYPTO_LIB_CHACHA=y +CONFIG_CRYPTO_LIB_CHACHA_ARCH=y +CONFIG_CRYPTO_LIB_CURVE25519=m +CONFIG_CRYPTO_LIB_CURVE25519_GENERIC=y +CONFIG_CRYPTO_LIB_DES=m +CONFIG_CRYPTO_LIB_GF128HASH=y +CONFIG_CRYPTO_LIB_GF128HASH_ARCH=y +CONFIG_CRYPTO_LIB_MD5=y +CONFIG_CRYPTO_LIB_NH=m +CONFIG_CRYPTO_LIB_NH_ARCH=y +CONFIG_CRYPTO_LIB_POLY1305=m +CONFIG_CRYPTO_LIB_POLY1305_ARCH=y +CONFIG_CRYPTO_LIB_POLY1305_GENERIC=y +CONFIG_CRYPTO_LIB_POLY1305_RSIZE=9 +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m +CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA1_ARCH=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_LIB_SHA256_ARCH=y +CONFIG_CRYPTO_LIB_SHA512=y +CONFIG_CRYPTO_LIB_SHA512_ARCH=y +CONFIG_CRYPTO_LIB_SHA3=y +CONFIG_CRYPTO_LIB_SHA3_ARCH=y +CONFIG_CRYPTO_LIB_SM3=m +CONFIG_CRYPTO_LIB_SM3_ARCH=y +CONFIG_XOR_BLOCKS=m +CONFIG_XOR_BLOCKS_ARCH=y +CONFIG_XXHASH=y +CONFIG_AUDIT_GENERIC=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +# CONFIG_RANDOM32_SELFTEST is not set +CONFIG_842_COMPRESS=m +CONFIG_842_DECOMPRESS=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_LZ4_COMPRESS=m +CONFIG_LZ4HC_COMPRESS=m +CONFIG_LZ4_DECOMPRESS=y +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_XZ_DEC=y +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_XZ_DEC_POWERPC is not set +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_ARM64=y +# CONFIG_XZ_DEC_SPARC is not set +CONFIG_XZ_DEC_RISCV=y +CONFIG_XZ_DEC_MICROLZMA=y +CONFIG_XZ_DEC_BCJ=y +# CONFIG_XZ_DEC_TEST is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DECOMPRESS_BZIP2=y +CONFIG_DECOMPRESS_LZMA=y +CONFIG_DECOMPRESS_XZ=y +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y +CONFIG_DECOMPRESS_ZSTD=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_REED_SOLOMON=m +CONFIG_REED_SOLOMON_ENC8=y +CONFIG_REED_SOLOMON_DEC8=y +CONFIG_TEXTSEARCH=y +CONFIG_TEXTSEARCH_KMP=m +CONFIG_TEXTSEARCH_BM=m +CONFIG_TEXTSEARCH_FSM=m +CONFIG_INTERVAL_TREE=y +CONFIG_XARRAY_MULTI=y +CONFIG_ASSOCIATIVE_ARRAY=y +CONFIG_CLOSURES=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAS_DMA=y +CONFIG_DMA_OPS_HELPERS=y +CONFIG_NEED_SG_DMA_FLAGS=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y +CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y +CONFIG_ARCH_HAS_DMA_PREP_COHERENT=y +CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED=y +CONFIG_ARCH_HAS_BATCHED_DMA_SYNC=y +CONFIG_SWIOTLB=y +# CONFIG_SWIOTLB_DYNAMIC is not set +CONFIG_DMA_BOUNCE_UNALIGNED_KMALLOC=y +CONFIG_DMA_NEED_SYNC=y +# CONFIG_DMA_RESTRICTED_POOL is not set +CONFIG_DMA_NONCOHERENT_MMAP=y +CONFIG_DMA_COHERENT_POOL=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=64 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +# CONFIG_DMA_API_DEBUG is not set +# CONFIG_DMA_MAP_BENCHMARK is not set +CONFIG_SGL_ALLOC=y +CONFIG_CPU_RMAP=y +CONFIG_DQL=y +CONFIG_GLOB=y +CONFIG_NLATTR=y +CONFIG_LRU_CACHE=m +CONFIG_CLZ_TAB=y +CONFIG_IRQ_POLL=y +CONFIG_MPILIB=y +CONFIG_DIMLIB=y +CONFIG_LIBFDT=y +CONFIG_OID_REGISTRY=y +CONFIG_UCS2_STRING=y +CONFIG_HAVE_GENERIC_VDSO=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_VDSO_GETRANDOM=y +CONFIG_FONT_SUPPORT=y +CONFIG_FONTS=y +# CONFIG_FONT_8x8 is not set +CONFIG_FONT_8x16=y +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_6x10 is not set +# CONFIG_FONT_10x18 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_TER10x18 is not set +CONFIG_FONT_TER16x32=y +# CONFIG_FONT_6x8 is not set +CONFIG_SG_POOL=y +CONFIG_ARCH_HAS_CPU_CACHE_INVALIDATE_MEMREGION=y +CONFIG_GENERIC_CPU_CACHE_MAINTENANCE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_SBITMAP=y +# CONFIG_LWQ_TEST is not set +# end of Library routines + +CONFIG_GENERIC_IOREMAP=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_UNION_FIND=y + +# +# Kernel hacking +# + +# +# printk and dmesg options +# +CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set +CONFIG_PRINTK_EXECUTION_CTX=y +# CONFIG_STACKTRACE_BUILD_ID is not set +CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 +CONFIG_CONSOLE_LOGLEVEL_QUIET=4 +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 +CONFIG_BOOT_PRINTK_DELAY=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DYNAMIC_DEBUG_CORE=y +CONFIG_SYMBOLIC_ERRNAME=y +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_BUGVERBOSE_DETAILED is not set +# end of printk and dmesg options + +CONFIG_DEBUG_KERNEL=y +CONFIG_DEBUG_MISC=y + +# +# Compile-time checks and compiler options +# +CONFIG_DEBUG_INFO=y +CONFIG_AS_HAS_NON_CONST_ULEB128=y +# CONFIG_DEBUG_INFO_NONE is not set +# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set +# CONFIG_DEBUG_INFO_DWARF4 is not set +CONFIG_DEBUG_INFO_DWARF5=y +# CONFIG_DEBUG_INFO_REDUCED is not set +CONFIG_DEBUG_INFO_COMPRESSED_NONE=y +# CONFIG_DEBUG_INFO_COMPRESSED_ZLIB is not set +# CONFIG_DEBUG_INFO_COMPRESSED_ZSTD is not set +# CONFIG_DEBUG_INFO_SPLIT is not set +CONFIG_DEBUG_INFO_BTF=y +CONFIG_PAHOLE_HAS_LANG_EXCLUDE=y +CONFIG_DEBUG_INFO_BTF_MODULES=y +# CONFIG_MODULE_ALLOW_BTF_MISMATCH is not set +# CONFIG_GDB_SCRIPTS is not set +CONFIG_FRAME_WARN=2048 +CONFIG_STRIP_ASM_SYMS=y +# CONFIG_READABLE_ASM is not set +# CONFIG_HEADERS_INSTALL is not set +# CONFIG_DEBUG_SECTION_MISMATCH is not set +CONFIG_SECTION_MISMATCH_WARN_ONLY=y +# CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_FRAME_POINTER=y +# CONFIG_VMLINUX_MAP is not set +# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set +# end of Compile-time checks and compiler options + +# +# Generic Kernel Debugging Instruments +# +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0 +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAGIC_SYSRQ_SERIAL_SEQUENCE="" +CONFIG_DEBUG_FS=y +CONFIG_DEBUG_FS_ALLOW_ALL=y +# CONFIG_DEBUG_FS_ALLOW_NONE is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_ARCH_HAS_UBSAN=y +# CONFIG_UBSAN is not set +CONFIG_HAVE_ARCH_KCSAN=y +CONFIG_HAVE_KCSAN_COMPILER=y +# CONFIG_KCSAN is not set +# end of Generic Kernel Debugging Instruments + +# +# Networking Debugging +# +# CONFIG_NET_DEV_REFCNT_TRACKER is not set +# CONFIG_NET_NS_REFCNT_TRACKER is not set +# CONFIG_DEBUG_NET is not set +# CONFIG_DEBUG_NET_SMALL_RTNL is not set +# end of Networking Debugging + +# +# Memory Debugging +# +# CONFIG_PAGE_EXTENSION is not set +# CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_SLUB_DEBUG is not set +# CONFIG_PAGE_OWNER is not set +# CONFIG_PAGE_TABLE_CHECK is not set +# CONFIG_PAGE_POISONING is not set +# CONFIG_DEBUG_PAGE_REF is not set +# CONFIG_DEBUG_RODATA_TEST is not set +CONFIG_ARCH_HAS_DEBUG_WX=y +CONFIG_DEBUG_WX=y +CONFIG_ARCH_HAS_PTDUMP=y +CONFIG_PTDUMP=y +# CONFIG_PTDUMP_DEBUGFS is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set +# CONFIG_PER_VMA_LOCK_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_SHRINKER_DEBUG is not set +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +CONFIG_ARCH_HAS_DEBUG_VM_PGTABLE=y +# CONFIG_DEBUG_VFS is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_VM_PGTABLE is not set +CONFIG_ARCH_HAS_DEBUG_VIRTUAL=y +# CONFIG_DEBUG_VIRTUAL is not set +# CONFIG_DEBUG_MEMORY_INIT is not set +# CONFIG_DEBUG_PER_CPU_MAPS is not set +# CONFIG_MEM_ALLOC_PROFILING is not set +CONFIG_HAVE_ARCH_KASAN=y +CONFIG_HAVE_ARCH_KASAN_SW_TAGS=y +CONFIG_HAVE_ARCH_KASAN_HW_TAGS=y +CONFIG_HAVE_ARCH_KASAN_VMALLOC=y +CONFIG_CC_HAS_KASAN_GENERIC=y +CONFIG_CC_HAS_KASAN_SW_TAGS=y +CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS=y +# CONFIG_KASAN is not set +CONFIG_HAVE_ARCH_KFENCE=y +# CONFIG_KFENCE is not set +# end of Memory Debugging + +# CONFIG_DEBUG_SHIRQ is not set + +# +# Debug Oops, Lockups and Hangs +# +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_TIMEOUT=0 +CONFIG_LOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR=y +CONFIG_SOFTLOCKUP_DETECTOR_INTR_STORM=y +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=0 +CONFIG_HAVE_HARDLOCKUP_DETECTOR_BUDDY=y +# CONFIG_HARDLOCKUP_DETECTOR is not set +CONFIG_DETECT_HUNG_TASK=y +CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120 +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=0 +CONFIG_DETECT_HUNG_TASK_BLOCKER=y +# CONFIG_WQ_WATCHDOG is not set +# CONFIG_WQ_CPU_INTENSIVE_REPORT is not set +# CONFIG_TEST_LOCKUP is not set +# end of Debug Oops, Lockups and Hangs + +# +# Scheduler Debugging +# +CONFIG_SCHED_INFO=y +CONFIG_SCHEDSTATS=y +# end of Scheduler Debugging + +CONFIG_DEBUG_PREEMPT=y +# CONFIG_DEBUG_ATOMIC is not set + +# +# Lock Debugging (spinlocks, mutexes, etc...) +# +CONFIG_LOCK_DEBUGGING_SUPPORT=y +# CONFIG_PROVE_LOCKING is not set +# CONFIG_LOCK_STAT is not set +# CONFIG_DEBUG_RT_MUTEXES is not set +# CONFIG_DEBUG_SPINLOCK is not set +# CONFIG_DEBUG_MUTEXES is not set +# CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set +# CONFIG_DEBUG_RWSEMS is not set +# CONFIG_DEBUG_LOCK_ALLOC is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_LOCK_TORTURE_TEST is not set +# CONFIG_WW_MUTEX_SELFTEST is not set +# CONFIG_SCF_TORTURE_TEST is not set +# CONFIG_CSD_LOCK_WAIT_DEBUG is not set +# end of Lock Debugging (spinlocks, mutexes, etc...) + +# CONFIG_DEBUG_IRQFLAGS is not set +CONFIG_STACKTRACE=y +# CONFIG_DEBUG_KOBJECT is not set + +# +# Debug kernel data structures +# +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_SG is not set +# CONFIG_DEBUG_NOTIFIERS is not set +# CONFIG_DEBUG_CLOSURES is not set +# CONFIG_DEBUG_MAPLE_TREE is not set +# end of Debug kernel data structures + +# +# RCU Debugging +# +CONFIG_TORTURE_TEST=m +# CONFIG_RCU_SCALE_TEST is not set +CONFIG_RCU_TORTURE_TEST=m +# CONFIG_RCU_TORTURE_TEST_CHK_RDR_STATE is not set +# CONFIG_RCU_TORTURE_TEST_LOG_CPU is not set +# CONFIG_RCU_TORTURE_TEST_LOG_GP is not set +# CONFIG_RCU_REF_SCALE_TEST is not set +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0 +# CONFIG_RCU_CPU_STALL_CPUTIME is not set +# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_EQS_DEBUG is not set +# end of RCU Debugging + +# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_DEBUG_CGROUP_REF is not set +CONFIG_USER_STACKTRACE_SUPPORT=y +CONFIG_NOP_TRACER=y +CONFIG_HAVE_FUNCTION_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y +CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y +CONFIG_HAVE_FTRACE_GRAPH_FUNC=y +CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_EXTRA_IPI_TRACEPOINTS=y +CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y +CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y +CONFIG_TRACE_CLOCK=y +CONFIG_RING_BUFFER=y +CONFIG_EVENT_TRACING=y +CONFIG_CONTEXT_SWITCH_TRACER=y +CONFIG_TRACING=y +CONFIG_TRACING_SUPPORT=y +CONFIG_FTRACE=y +CONFIG_TRACEFS_AUTOMOUNT_DEPRECATED=y +# CONFIG_BOOTTIME_TRACING is not set +# CONFIG_FUNCTION_TRACER is not set +CONFIG_FUNCTION_TRACE_ARGS=y +# CONFIG_STACK_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_HWLAT_TRACER is not set +# CONFIG_OSNOISE_TRACER is not set +# CONFIG_TIMERLAT_TRACER is not set +# CONFIG_ENABLE_DEFAULT_TRACERS is not set +# CONFIG_FTRACE_SYSCALLS is not set +# CONFIG_TRACER_SNAPSHOT is not set +CONFIG_BRANCH_PROFILE_NONE=y +# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set +# CONFIG_PROFILE_ALL_BRANCHES is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +CONFIG_PROBE_EVENTS_BTF_ARGS=y +CONFIG_KPROBE_EVENTS=y +CONFIG_UPROBE_EVENTS=y +CONFIG_EPROBE_EVENTS=y +CONFIG_BPF_EVENTS=y +CONFIG_DYNAMIC_EVENTS=y +CONFIG_PROBE_EVENTS=y +# CONFIG_BPF_KPROBE_OVERRIDE is not set +# CONFIG_SYNTH_EVENTS is not set +# CONFIG_USER_EVENTS is not set +# CONFIG_HIST_TRIGGERS is not set +# CONFIG_TRACE_EVENT_INJECT is not set +# CONFIG_TRACEPOINT_BENCHMARK is not set +# CONFIG_RING_BUFFER_BENCHMARK is not set +# CONFIG_TRACE_EVAL_MAP_FILE is not set +# CONFIG_RING_BUFFER_STARTUP_TEST is not set +# CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set +# CONFIG_PREEMPTIRQ_DELAY_TEST is not set +# CONFIG_KPROBE_EVENT_GEN_TEST is not set +# CONFIG_RV is not set +# CONFIG_TRACE_REMOTE_TEST is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y +CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y +CONFIG_STRICT_DEVMEM=y +# CONFIG_IO_STRICT_DEVMEM is not set + +# +# arm64 Debugging +# +# CONFIG_PID_IN_CONTEXTIDR is not set +# CONFIG_DEBUG_EFI is not set +# CONFIG_ARM64_RELOC_TEST is not set +# CONFIG_CORESIGHT is not set +# end of arm64 Debugging + +# +# Kernel Testing and Coverage +# +# CONFIG_KUNIT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set +CONFIG_FUNCTION_ERROR_INJECTION=y +# CONFIG_FAULT_INJECTION is not set +CONFIG_ARCH_HAS_KCOV=y +# CONFIG_KCOV is not set +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_ARCH_USE_MEMTEST=y +# CONFIG_MEMTEST is not set +# end of Kernel Testing and Coverage + +# +# Rust hacking +# +# CONFIG_RUST_DEBUG_ASSERTIONS is not set +CONFIG_RUST_OVERFLOW_CHECKS=y +# CONFIG_RUST_BUILD_ASSERT_ALLOW is not set +# end of Rust hacking +# end of Kernel hacking + +CONFIG_IO_URING_ZCRX=y +CONFIG_IO_URING_BPF=y +CONFIG_IO_URING_BPF_OPS=y diff --git a/pkgbuilds/linux-aurora/rust-toolchain.toml b/pkgbuilds/linux-aurora/rust-toolchain.toml new file mode 100644 index 0000000..6a1cc41 --- /dev/null +++ b/pkgbuilds/linux-aurora/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "1.93.1" +components = ["rustc", "cargo", "rust-src"] +targets = ["aarch64-unknown-linux-gnu"] From 21cb201d8347a616ee47545387421fc9ee25f5b9 Mon Sep 17 00:00:00 2001 From: Tom Ballard Date: Tue, 22 Sep 2026 11:45:31 +0100 Subject: [PATCH 09/55] Update Task Manager to 0.0.4 and enable all channels --- .../.omarchy/package.json | 4 +- pkgbuilds/omarchy-task-manager/PKGBUILD | 19 +--- .../pause-resume-test.patch | 63 ------------- .../worker-shutdown.patch | 90 ------------------- 4 files changed, 6 insertions(+), 170 deletions(-) delete mode 100644 pkgbuilds/omarchy-task-manager/pause-resume-test.patch delete mode 100644 pkgbuilds/omarchy-task-manager/worker-shutdown.patch diff --git a/pkgbuilds/omarchy-task-manager/.omarchy/package.json b/pkgbuilds/omarchy-task-manager/.omarchy/package.json index 8b66e2d..df4a9fb 100644 --- a/pkgbuilds/omarchy-task-manager/.omarchy/package.json +++ b/pkgbuilds/omarchy-task-manager/.omarchy/package.json @@ -1,11 +1,11 @@ { "source": "local", - "channels": ["edge"], "upstream": { "watch": { "github": "tcballard/omarchy-task-manager", "pattern": "v(?P[0-9]+\\.[0-9]+\\.[0-9]+)", "allow_prerelease": true } - } + }, + "release_ring": "fast" } diff --git a/pkgbuilds/omarchy-task-manager/PKGBUILD b/pkgbuilds/omarchy-task-manager/PKGBUILD index 94f01cd..0da9895 100644 --- a/pkgbuilds/omarchy-task-manager/PKGBUILD +++ b/pkgbuilds/omarchy-task-manager/PKGBUILD @@ -1,8 +1,8 @@ # Canonical recipe. scripts/package-source.sh fills the release source checksum. # Maintainer: Tom Ballard (tcballard) pkgname=omarchy-task-manager -pkgver=0.0.3 -pkgrel=3 +pkgver=0.0.4 +pkgrel=1 url='https://github.com/tcballard/omarchy-task-manager' pkgdesc='Floating native task manager for Omarchy (preview)' arch=('x86_64') @@ -11,19 +11,8 @@ depends=('qt6-base' 'qt6-declarative' 'qt6-wayland' 'qt6-svg' 'hicolor-icon-them optdepends=('gdb: live process core dumps' 'nvidia-utils: NVIDIA device telemetry') makedepends=('cmake' 'ninja' 'rust' 'cargo') checkdepends=('python' 'desktop-file-utils') -source=("$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz" - "pause-resume-test.patch" - "worker-shutdown.patch") -sha256sums=('cc3e24a0bb8fad2b7ce0d4fb780aa774d32b53b8de924b488b55674bdb936c85' - 'ce191fc8dc7e4f7018193aa4982d58fd463f66b37e3129b3acce46b7a1c9a89e' - '1142aaedf8739bf2ed1cb823a03ed7e406d7ff59d7dfb72748815cc81cfda96b') - -# Backport upstream PR #11 (sample observation) and PR #12 (worker shutdown). -prepare() { - cd "$srcdir/$pkgname-$pkgver" - patch -Np1 -i "$srcdir/pause-resume-test.patch" - patch -Np1 -i "$srcdir/worker-shutdown.patch" -} +source=("$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz") +sha256sums=('a8be937c6df43a01893c0955dfa53953a9ef06660144b1562445dacf64bbbbfb') build() { cmake -S "$srcdir/$pkgname-$pkgver" -B build -G Ninja \ diff --git a/pkgbuilds/omarchy-task-manager/pause-resume-test.patch b/pkgbuilds/omarchy-task-manager/pause-resume-test.patch deleted file mode 100644 index e256547..0000000 --- a/pkgbuilds/omarchy-task-manager/pause-resume-test.patch +++ /dev/null @@ -1,63 +0,0 @@ -diff --git a/tests/bridge_test.cpp b/tests/bridge_test.cpp -index bab79f2..9bed7be 100644 ---- a/tests/bridge_test.cpp -+++ b/tests/bridge_test.cpp -@@ -79,37 +79,53 @@ private slots: - const auto before = bridge.history().size(); - QTest::qWait(1100); - QCOMPARE(bridge.history().size(), before); -- QSignalSpy samples(&bridge, &Bridge::snapshotChanged); -+ // Capture at emission: QTRY processes events, so another timer sample can -+ // replace bridge.snapshot() before the waiting assertion runs. -+ QVariantList samples; -+ QList historySizes; -+ QObject sampleObserver; // Disconnect before the captured lists are destroyed. -+ connect(&bridge, &Bridge::snapshotChanged, &sampleObserver, [&] { -+ samples.append(bridge.snapshot()); -+ historySizes.append(bridge.history().size()); -+ }); - bridge.setPaused(false); - QTRY_VERIFY_WITH_TIMEOUT(samples.count() > 0, 8000); -- QVERIFY(!bridge.snapshot() -+ QVERIFY(!samples.first().toMap() - .value("system") - .toMap() - .value("continuous") - .toBool()); -- QCOMPARE(bridge.history().size(), 1); -+ QCOMPARE(historySizes.first(), 1); - bridge.active(false); - QTest::qWait(600); - samples.clear(); -+ historySizes.clear(); - bridge.active(true); - QTRY_VERIFY_WITH_TIMEOUT(samples.count() > 0, 8000); -- QVERIFY(!bridge.snapshot() -+ QVERIFY(!samples.first().toMap() - .value("system") - .toMap() - .value("continuous") - .toBool()); - QTRY_VERIFY_WITH_TIMEOUT(!bridge.busy(), 8000); - samples.clear(); -+ historySizes.clear(); - bridge.refresh(); - QVERIFY(bridge.busy()); - bridge.setPaused(true); - bridge.setPaused(false); - QTRY_VERIFY_WITH_TIMEOUT(samples.count() > 0, 8000); -- QVERIFY(!bridge.snapshot() -+ QVERIFY(!samples.first().toMap() - .value("system") - .toMap() - .value("continuous") - .toBool()); -+ QCOMPARE(historySizes.first(), 1); -+ // Keep automatic refresh enabled. The baseline must be followed by a -+ // continuous sample; inspecting only the latest snapshot misses this order. -+ QTRY_VERIFY_WITH_TIMEOUT(samples.count() >= 2, 8000); -+ QVERIFY(samples.at(1).toMap().value("system").toMap() -+ .value("continuous").toBool()); - QTRY_VERIFY_WITH_TIMEOUT(!bridge.busy(), 8000); - QVERIFY(bridge.prepareManagement({{"category", "startup"}}).isEmpty()); - QVERIFY( diff --git a/pkgbuilds/omarchy-task-manager/worker-shutdown.patch b/pkgbuilds/omarchy-task-manager/worker-shutdown.patch deleted file mode 100644 index d71f21b..0000000 --- a/pkgbuilds/omarchy-task-manager/worker-shutdown.patch +++ /dev/null @@ -1,90 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index c940e5e..d1cd40f 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -29,7 +29,8 @@ if(BUILD_TESTING) - target_include_directories(bridge-test PRIVATE ui) - target_link_libraries(bridge-test PRIVATE Qt6::Core Qt6::Gui Qt6::Test) - add_dependencies(bridge-test core) -- add_test(NAME bridge COMMAND bridge-test) -+ add_test(NAME bridge COMMAND bridge-test -nocrashhandler) -+ set_tests_properties(bridge PROPERTIES TIMEOUT 60) - endif() - if(BUILD_TESTING) - qt_add_executable(ui-test tests/ui_test.cpp ui/bridge.cpp ui/bridge.h) -@@ -37,5 +38,6 @@ if(BUILD_TESTING) - qt_add_resources(ui-test test_qml PREFIX "/" FILES ${TASK_MANAGER_QML}) - target_link_libraries(ui-test PRIVATE Qt6::Core Qt6::Gui Qt6::Quick Qt6::Qml Qt6::QuickControls2 Qt6::Test) - add_dependencies(ui-test core) -- add_test(NAME ui COMMAND ui-test) -+ add_test(NAME ui COMMAND ui-test -nocrashhandler) -+ set_tests_properties(ui PROPERTIES TIMEOUT 60) - endif() -diff --git a/tests/bridge_test.cpp b/tests/bridge_test.cpp -index 9bed7be..d6737a4 100644 ---- a/tests/bridge_test.cpp -+++ b/tests/bridge_test.cpp -@@ -3,9 +3,46 @@ - #include - #include - #include -+#include -+#include - class BridgeTest : public QObject { - Q_OBJECT - private slots: -+ void shutdownDoesNotPublish_data() { -+ QTest::addColumn("inFlight"); -+ QTest::addColumn("stopped"); -+ QTest::newRow("idle") << false << false; -+ QTest::newRow("sample-in-flight") << true << false; -+ QTest::newRow("stopped-worker") << true << true; -+ } -+ void shutdownDoesNotPublish() { -+ QFETCH(bool, inFlight); -+ QFETCH(bool, stopped); -+ auto bridge = std::make_unique(); -+ QTRY_VERIFY_WITH_TIMEOUT(!bridge->snapshot().isEmpty(), 8000); -+ bridge->m_timer.stop(); -+ QTRY_VERIFY_WITH_TIMEOUT(!bridge->busy(), 8000); -+ // Stop only the disposable worker owned by this bridge, forcing shutdown -+ // through terminate/kill rather than the normal stdin-EOF exit. -+ if (stopped) { -+ const auto workerPid = bridge->m_worker.processId(); -+ QVERIFY(workerPid > 0); -+ QCOMPARE(::kill(workerPid, SIGSTOP), 0); -+ } -+ if (inFlight) { -+ bridge->refresh(); -+ QVERIFY(bridge->busy()); -+ } -+ QSignalSpy snapshots(bridge.get(), &Bridge::snapshotChanged); -+ QSignalSpy statuses(bridge.get(), &Bridge::statusChanged); -+ QSignalSpy busy(bridge.get(), &Bridge::busyChanged); -+ // Closing the app must not publish late samples or worker-exit errors while -+ // its bridge and UI are being destroyed. Spies outlive the bridge on purpose. -+ bridge.reset(); -+ QCOMPARE(snapshots.count(), 0); -+ QCOMPARE(statuses.count(), 0); -+ QCOMPARE(busy.count(), 0); -+ } - void inspectionErrorsAndDismissal() { - Bridge bridge; - QTRY_VERIFY_WITH_TIMEOUT(!bridge.snapshot().isEmpty(), 8000); -diff --git a/ui/bridge.cpp b/ui/bridge.cpp -index 86b5b47..b1fb303 100644 ---- a/ui/bridge.cpp -+++ b/ui/bridge.cpp -@@ -82,7 +82,12 @@ Bridge::Bridge(QObject *p) : QObject(p), m_rows(this) { - m_clock.start(); - } - Bridge::~Bridge() { -+ // waitForFinished() can emit readyRead/error/finished synchronously. Quiesce -+ // callbacks before waiting, including if QProcess outlives our final wait and -+ // emits from its destructor after the other Bridge members are gone. - m_timer.stop(); -+ m_timeout.stop(); -+ m_worker.disconnect(this); - m_worker.closeWriteChannel(); - if (!m_worker.waitForFinished(600)) { - m_worker.terminate(); From 01b6ac90eb82c39a38fa1192809730ccf1a5de7a Mon Sep 17 00:00:00 2001 From: Tom Ballard Date: Tue, 22 Sep 2026 11:53:13 +0100 Subject: [PATCH 10/55] Pin v0.0.4 source with deterministic PID selection regression --- pkgbuilds/omarchy-task-manager/PKGBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgbuilds/omarchy-task-manager/PKGBUILD b/pkgbuilds/omarchy-task-manager/PKGBUILD index 0da9895..37fae32 100644 --- a/pkgbuilds/omarchy-task-manager/PKGBUILD +++ b/pkgbuilds/omarchy-task-manager/PKGBUILD @@ -12,7 +12,7 @@ optdepends=('gdb: live process core dumps' 'nvidia-utils: NVIDIA device telemetr makedepends=('cmake' 'ninja' 'rust' 'cargo') checkdepends=('python' 'desktop-file-utils') source=("$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz") -sha256sums=('a8be937c6df43a01893c0955dfa53953a9ef06660144b1562445dacf64bbbbfb') +sha256sums=('4759054e2396993886bf2f0abcc74ddf3d5c3499274d69d6fc5f51521a84354a') build() { cmake -S "$srcdir/$pkgname-$pkgver" -B build -G Ninja \ From 1cd0ffcef22b941405d827d784f8eea830c68bfb Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Tue, 22 Sep 2026 20:21:45 -0400 Subject: [PATCH 11/55] Restrict binary .NET packages to aarch64 --- pkgbuilds/dotnet-core-bin/PKGBUILD | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/pkgbuilds/dotnet-core-bin/PKGBUILD b/pkgbuilds/dotnet-core-bin/PKGBUILD index 040344b..216605a 100644 --- a/pkgbuilds/dotnet-core-bin/PKGBUILD +++ b/pkgbuilds/dotnet-core-bin/PKGBUILD @@ -15,19 +15,15 @@ pkgver=10.0.401 _runtimever=10.0.12 _sdkver=$pkgver _short_ver=10.0 -pkgrel=1 -arch=('x86_64' 'armv7h' 'aarch64') +pkgrel=2 +arch=('aarch64') url='https://www.microsoft.com/net/core' license=('MIT') -options=('staticlibs') +options=('staticlibs' '!debug') source=('dotnet.sh') -source_armv7h=("https://builds.dotnet.microsoft.com/dotnet/Sdk/${_sdkver}/dotnet-sdk-${_sdkver}-linux-arm.tar.gz") source_aarch64=("https://builds.dotnet.microsoft.com/dotnet/Sdk/${_sdkver}/dotnet-sdk-${_sdkver}-linux-arm64.tar.gz") -source_x86_64=("https://builds.dotnet.microsoft.com/dotnet/Sdk/${_sdkver}/dotnet-sdk-${_sdkver}-linux-x64.tar.gz") sha512sums=('768151c7179fb6a126b3de9cae01e363e8894f6fab384b1e2c5066c2adca4578638983b1b62aea10dd18045e6d6e8f8ea13280481134de94f004a118919b2c06') -sha512sums_armv7h=('94a8a52862ca9f0de1075a468d6e4e307a1d4463098a9e8266e66939709a812b0126e212cce7e8c6feae6b078d86c8b77e088814a0e32531edb0da0a1ce90c11') sha512sums_aarch64=('58ace73ced6b4360754689a686bdfb8a317f4da6cb8bb416dbc7d0ba9f47e43e3c09f5eb1f1a1cfaacbd10df9558da4882bf2a5e195d6ab56a02c1f9f76102ed') -sha512sums_x86_64=('51c8b999af9e8dd9998c9edc5944e19a90788862068acd38694e098889054ce8c23d4f0c5cccfa16bf187d044562359e5ee69a9f8ad0bbe913ba90311fbce25b') # Keep each split package's notices usable when installed independently. _install_license() { @@ -110,12 +106,8 @@ package_dotnet-targeting-pack-bin() { provides=(dotnet-targeting-pack=${_runtimever} dotnet-targeting-pack-${_short_ver}) conflicts=(dotnet-targeting-pack=${_runtimever} dotnet-targeting-pack-${_short_ver}) - if [ $CARCH = 'x86_64' ]; then msarch=x64; - elif [ $CARCH = 'armv7h' ]; then msarch=arm; - elif [ $CARCH = 'aarch64' ]; then msarch=arm64; fi - install -dm 755 "${pkgdir}"/usr/share/{dotnet,dotnet/packs,licenses} - cp -dr --no-preserve='ownership' packs/Microsoft.NETCore.App.{Host.linux-${msarch},Ref} "${pkgdir}"/usr/share/dotnet/packs/ + cp -dr --no-preserve='ownership' packs/Microsoft.NETCore.App.{Host.linux-arm64,Ref} "${pkgdir}"/usr/share/dotnet/packs/ _install_license } From 947eeea0dd17b39264d6f48a7228f5cad631f3b7 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Tue, 22 Sep 2026 20:21:53 -0400 Subject: [PATCH 12/55] Fix Steam patch detection and preserve desktop overrides --- pkgbuilds/omarchy-steam-fex/PKGBUILD | 6 +-- pkgbuilds/omarchy-steam-fex/README.md | 4 +- .../omarchy-steam-fex/omarchy-launch-steam | 7 +++- pkgbuilds/omarchy-steam-fex/test-launcher.py | 39 +++++++++++++++++++ 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/pkgbuilds/omarchy-steam-fex/PKGBUILD b/pkgbuilds/omarchy-steam-fex/PKGBUILD index c984a57..02d2e9d 100644 --- a/pkgbuilds/omarchy-steam-fex/PKGBUILD +++ b/pkgbuilds/omarchy-steam-fex/PKGBUILD @@ -1,15 +1,15 @@ pkgname=omarchy-steam-fex pkgver=1.0.0 -pkgrel=2 +pkgrel=3 pkgdesc='Steam launcher with login workarounds for Apple Silicon using muvm and FEX' arch=('aarch64') url='https://github.com/omacom/omarchy-pkgs/tree/master/pkgbuilds/omarchy-steam-fex' license=('MIT') checkdepends=('python') source=('omarchy-launch-steam' 'LICENSE' 'test-launcher.py') -sha256sums=('d89559ef88b3589e7d972b44a4a29e418605542f44f2756afd24ed3ce3227609' +sha256sums=('37ad2e8a863e90c2b3248f22d93b548c6070f396f631ad39cefc4745478515b4' '717ba1949502290f8e47688ae2e323acd06c8ca47aec9f7596b15f678c1af4a2' - '1d31b9ed09292b79dc86d9d4b3fff01d19e8210fdc5e3b13e78b846671808ed5') + 'fbab0f88ecdf3238bfb95a1523eef7de2ded2928c91c90e4e06435696dd86cdb') check() { python test-launcher.py diff --git a/pkgbuilds/omarchy-steam-fex/README.md b/pkgbuilds/omarchy-steam-fex/README.md index a4f6513..9760b17 100644 --- a/pkgbuilds/omarchy-steam-fex/README.md +++ b/pkgbuilds/omarchy-steam-fex/README.md @@ -4,7 +4,7 @@ The launcher runs Steam through `muvm` and `FEXBash` with the CEF occlusion workaround. Once Steam's client files are present, it also disables bootstrap verification and repair and patches the Steam UI network initialization block that can leave login waiting indefinitely. Initial bootstrap keeps the normal bootstrap flags. If the FEX launcher is unavailable, it falls back to `steam`. -`omarchy-launch-steam --prepare` writes the current user's desktop override with `Exec=omarchy-launch-steam %U` and applies the same UI patch. Each matching chunk is backed up as `.omarchy-bak` before its first patch; existing backups are preserved, and already-patched and unrecognized chunks are left unchanged. The regex depends on Valve's client code and may need updating when that code changes. +`omarchy-launch-steam --prepare` creates the current user's desktop override with `Exec=omarchy-launch-steam %U` if it is missing, and applies the same UI patch. Existing overrides and symlinks are preserved on preparation and launch. If an existing override uses a different command, edit its `Exec` entry to use `omarchy-launch-steam %U` when you want this launcher. Each matching chunk is backed up as `.omarchy-bak` before its first patch; existing backups are preserved. The regex matches the original network initialization block, so a patched block is not changed again. An unrelated connected-state assignment elsewhere in the chunk does not suppress the fix. The regex depends on Valve's client code and may need updating when that code changes. Only the launcher and license are installed. Steam's system desktop entry and downloaded client files remain outside this package's ownership; preparation runs as the desktop user, never in a package installation hook. A downstream Omarchy package that already owns the launcher must release that path before this package is installed, or in the same upgrade transaction. @@ -14,4 +14,4 @@ Runtime dependencies are declared in `package()` so assembling the scripts does python pkgbuilds/omarchy-steam-fex/test-launcher.py ``` -The launcher was extracted from [omarchy-mx-mac commit 5e8e1188](https://github.com/scottjones/omarchy-mx-mac/commit/5e8e1188e39fae70cf4f7bda1a1d85d66eccae51), credited to Scott Jones, dl-alexandre, and Santeri Hernejärvi. The extraction replaces `omarchy-cmd-present` with `command -v`, removing the dependency on Omarchy itself. The launcher matches the version published in [omarchy-pkgs-aarch64](https://github.com/omarchy-mac/omarchy-pkgs-aarch64/tree/main/pkgbuilds/omarchy-steam-fex). +The launcher was extracted from [omarchy-mx-mac commit 5e8e1188](https://github.com/scottjones/omarchy-mx-mac/commit/5e8e1188e39fae70cf4f7bda1a1d85d66eccae51), credited to Scott Jones, dl-alexandre, and Santeri Hernejärvi. The extraction replaces `omarchy-cmd-present` with `command -v`, removing the dependency on Omarchy itself. Subsequent fixes preserve user desktop overrides and avoid false positives when checking whether the network block needs patching. diff --git a/pkgbuilds/omarchy-steam-fex/omarchy-launch-steam b/pkgbuilds/omarchy-steam-fex/omarchy-launch-steam index f61d0db..c46fdf7 100755 --- a/pkgbuilds/omarchy-steam-fex/omarchy-launch-steam +++ b/pkgbuilds/omarchy-steam-fex/omarchy-launch-steam @@ -10,6 +10,9 @@ steam_root="$HOME/.local/share/Steam" write_steam_desktop() { local app_dir="$HOME/.local/share/applications" + # This is a user-owned override. Create it once without replacing existing + # customizations, including a symlink managed by the user. + [[ -e $app_dir/steam.desktop || -L $app_dir/steam.desktop ]] && return 0 mkdir -p "$app_dir" cat >"$app_dir/steam.desktop" <<'EOF' [Desktop Entry] @@ -63,8 +66,8 @@ replacement = ( for path in sorted(steamui.glob("chunk~*.js")): text = path.read_text(errors="replace") - if "m_bIsConnectedToANetwork=!0" in text and "RegisterForDeviceChanges" in text: - continue + # The exact original block no longer matches after replacement. A generic + # connected-state assignment elsewhere in the chunk is not a patch marker. updated, count = pattern.subn(replacement, text, count=1) if count != 1: continue diff --git a/pkgbuilds/omarchy-steam-fex/test-launcher.py b/pkgbuilds/omarchy-steam-fex/test-launcher.py index cb4fcd9..02e7c65 100644 --- a/pkgbuilds/omarchy-steam-fex/test-launcher.py +++ b/pkgbuilds/omarchy-steam-fex/test-launcher.py @@ -143,6 +143,45 @@ class SteamLauncherTests(unittest.TestCase): self.assertEqual(path.read_text(), content) self.assertFalse(path.with_suffix('.js.omarchy-bak').exists()) + def test_unrelated_connected_state_does_not_skip_original_block(self): + original = 'other.m_bIsConnectedToANetwork=!0;' + ORIGINAL + path = self.chunk(original) + self.run_launcher('--prepare') + self.assertIn('catch(e){}', path.read_text()) + self.assertTrue(path.read_text().startswith('other.m_bIsConnectedToANetwork=!0;')) + self.assertEqual(path.with_suffix('.js.omarchy-bak').read_text(), original) + patched, modified = path.read_bytes(), path.stat().st_mtime_ns + self.run_launcher('--prepare') + self.assertEqual(path.read_bytes(), patched) + self.assertEqual(path.stat().st_mtime_ns, modified) + + def test_existing_desktop_override_is_preserved_during_prepare_and_launch(self): + self.client_ready() + self.chunk() + self.desktop.parent.mkdir(parents=True) + customized = '[Desktop Entry]\nName=My Steam\nExec=my-steam-wrapper %U\nX-User-Setting=keep\n' + self.desktop.write_text(customized) + modified = self.desktop.stat().st_mtime_ns + for args in [('--prepare',), ()]: + self.run_launcher(*args) + self.assertEqual(self.desktop.read_text(), customized) + self.assertEqual(self.desktop.stat().st_mtime_ns, modified) + + def test_existing_desktop_symlink_is_preserved_even_with_missing_target(self): + self.desktop.parent.mkdir(parents=True) + target = self.user_home / 'custom-steam.desktop' + self.desktop.symlink_to(target) + self.run_launcher('--prepare') + self.assertTrue(self.desktop.is_symlink()) + self.assertFalse(target.exists()) + + def test_repeated_prepare_does_not_rewrite_created_desktop_override(self): + self.run_launcher('--prepare') + original, modified = self.desktop.read_bytes(), self.desktop.stat().st_mtime_ns + self.run_launcher('--prepare') + self.assertEqual(self.desktop.read_bytes(), original) + self.assertEqual(self.desktop.stat().st_mtime_ns, modified) + def test_only_first_matching_block_is_patched(self): path = self.chunk(ORIGINAL + ORIGINAL) self.run_launcher('--prepare') From e25f641757177cae283cc8c152b61c0fb5b18cb1 Mon Sep 17 00:00:00 2001 From: Tom Ballard Date: Wed, 23 Sep 2026 16:12:58 +0100 Subject: [PATCH 13/55] Update Task Manager to published v0.0.5 --- pkgbuilds/omarchy-task-manager/PKGBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgbuilds/omarchy-task-manager/PKGBUILD b/pkgbuilds/omarchy-task-manager/PKGBUILD index 37fae32..c84656f 100644 --- a/pkgbuilds/omarchy-task-manager/PKGBUILD +++ b/pkgbuilds/omarchy-task-manager/PKGBUILD @@ -1,7 +1,7 @@ # Canonical recipe. scripts/package-source.sh fills the release source checksum. # Maintainer: Tom Ballard (tcballard) pkgname=omarchy-task-manager -pkgver=0.0.4 +pkgver=0.0.5 pkgrel=1 url='https://github.com/tcballard/omarchy-task-manager' pkgdesc='Floating native task manager for Omarchy (preview)' @@ -12,7 +12,7 @@ optdepends=('gdb: live process core dumps' 'nvidia-utils: NVIDIA device telemetr makedepends=('cmake' 'ninja' 'rust' 'cargo') checkdepends=('python' 'desktop-file-utils') source=("$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz") -sha256sums=('4759054e2396993886bf2f0abcc74ddf3d5c3499274d69d6fc5f51521a84354a') +sha256sums=('f2ae4dd058883fdaa7d159364e2a533761c7acd9cd1380b5f1b39e291815247f') build() { cmake -S "$srcdir/$pkgname-$pkgver" -B build -G Ninja \ From 6fddfa268e2fb9ca155f0056a9d91b14f5bc8014 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Wed, 23 Sep 2026 21:51:55 -0400 Subject: [PATCH 14/55] Add Zed vendor package for aarch64 --- pkgbuilds/zed/.omarchy/package.json | 9 ++++ pkgbuilds/zed/PKGBUILD | 76 +++++++++++++++++++++++++++++ pkgbuilds/zed/README.md | 9 ++++ 3 files changed, 94 insertions(+) create mode 100644 pkgbuilds/zed/.omarchy/package.json create mode 100644 pkgbuilds/zed/PKGBUILD create mode 100644 pkgbuilds/zed/README.md diff --git a/pkgbuilds/zed/.omarchy/package.json b/pkgbuilds/zed/.omarchy/package.json new file mode 100644 index 0000000..d93fa79 --- /dev/null +++ b/pkgbuilds/zed/.omarchy/package.json @@ -0,0 +1,9 @@ +{ + "source": "local", + "upstream": { + "watch": { + "github": "zed-industries/zed", + "pattern": "v(?P[0-9]+(?:\\.[0-9]+)*)" + } + } +} diff --git a/pkgbuilds/zed/PKGBUILD b/pkgbuilds/zed/PKGBUILD new file mode 100644 index 0000000..9cfd717 --- /dev/null +++ b/pkgbuilds/zed/PKGBUILD @@ -0,0 +1,76 @@ +# Maintainer: omarchy-mac +# Contributor: Burgess Leo (AUR zed-bin) +# +# Zed for aarch64, repacked from the official vendor release. +# Keep the canonical name used by Omarchy and Arch's x86_64 package. +# Adapted from omarchy-mac/omarchy-pkgs-aarch64 PR #25. + +pkgname=zed +pkgver=1.20.2 +pkgrel=1 +pkgdesc='A high-performance, multiplayer code editor from the creators of Atom and Tree-sitter' +arch=('aarch64') +url='https://zed.dev' +license=('GPL-3.0-or-later' 'AGPL-3.0-or-later' 'Apache-2.0') +depends=('alsa-lib' + 'glib2' + 'glibc' + 'gcc-libs' + 'libx11' + 'libxcb' + 'libxkbcommon' + 'libxkbcommon-x11' + 'vulkan-driver' + 'vulkan-icd-loader' + 'wayland' + 'zlib') +optdepends=('openbsd-netcat: SSH remote development support' + 'clang: improved C/C++ language support' + 'cmake: building C/C++ projects' + 'gopls: improved Go language support' + 'pyright: improved Python language support' + 'rust-analyzer: improved Rust language support' + 'typescript-language-server: improved TypeScript/JavaScript support' + 'org.freedesktop.secrets: to keep you logged into your Zed account') +conflicts=('zed-bin' 'zed-git' 'zed-preview-bin') +# The vendor binaries are already stripped. +options=('!strip') +source_aarch64=("${pkgname}-${pkgver}-aarch64.tar.gz::https://github.com/zed-industries/zed/releases/download/v${pkgver}/zed-linux-aarch64.tar.gz") +sha256sums_aarch64=('715a5252234522bc9e8e4a8c1f9b462cf7bb2881eed23b7c8ae650b41c24aa6f') + +package() { + cd 'zed.app' + + # CLI as zed.real, wrapped so the editor never self-updates: it reads + # ZED_UPDATE_EXPLANATION at startup and skips its own update polling when + # it is set. Updates arrive through pacman. + install -Dm755 'bin/zed' "${pkgdir}/usr/bin/zed.real" + cat > "${pkgdir}/usr/bin/zed" <<'SH' +#!/bin/sh +export ZED_UPDATE_EXPLANATION='Updates are handled by your package manager' +exec /usr/bin/zed.real "$@" +SH + chmod 755 "${pkgdir}/usr/bin/zed" + # Arch extra names the CLI zeditor; keep that spelling working too. + ln -s zed "${pkgdir}/usr/bin/zeditor" + + # The CLI looks for ../libexec/zed-editor, then ../lib/zed/zed-editor. + install -Dm755 'libexec/zed-editor' "${pkgdir}/usr/lib/zed/zed-editor" + + # Vendor desktop entry verbatim: Exec=zed and Icon=zed resolve through + # PATH and hicolor. gtk-launch dev.zed.Zed needs exactly this file name. + install -Dm644 'share/applications/dev.zed.Zed.desktop' \ + "${pkgdir}/usr/share/applications/dev.zed.Zed.desktop" + + local size + for size in 512x512 1024x1024; do + install -Dm644 "share/icons/hicolor/${size}/apps/zed.png" \ + "${pkgdir}/usr/share/icons/hicolor/${size}/apps/zed.png" + done + + install -Dm644 'licenses.md' "${pkgdir}/usr/share/licenses/${pkgname}/licenses.md" + + # zed.app/lib (bundled libxcb, libstdc++, libxkbcommon, ...) is deliberately + # not shipped; the depends above provide them. Both binaries carry + # RPATH=$ORIGIN/../lib, which is harmless when that directory is absent. +} diff --git a/pkgbuilds/zed/README.md b/pkgbuilds/zed/README.md new file mode 100644 index 0000000..7487c75 --- /dev/null +++ b/pkgbuilds/zed/README.md @@ -0,0 +1,9 @@ +# Zed on ARM + +Adapted from the tested ARM recipe in omarchy-mac/omarchy-pkgs-aarch64 #25, retaining the AUR zed-bin contributor attribution. Uses official ARM64 vendor binaries, system libraries and the canonical `zed` name. No x86_64 package is added; Arch supplies that architecture separately. + +The wrapper sets `ZED_UPDATE_EXPLANATION` so pacman owns updates. The existing GitHub release watch selects stable version tags and checks the ARM asset through the common upstream updater. Upstream's scheduled sync creates or updates its normal review PR; maintainers need GitHub PR notifications enabled and should monitor failed sync runs too. Initial version 1.20.2 preserves the validated downstream baseline; live release discovery already observes the newer 1.21.0, which requires its own artifact qualification. + +This package supplies the dependency needed by omacom/omarchy-pkgs #537 (`omazed`). Publish and validate it before enabling that dependency on ARM. It conflicts with alternate Zed packages; it does not silently remove them. + +Before this draft becomes ready, require upstream's clean ARM build/install checks and editing a disposable file in a disposable GUI session. CLI version output and ELF inspection do not prove GPU rendering or editing behavior. From 94ce4e5a468bd6050ebc3097772641758d797c22 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Wed, 23 Sep 2026 21:52:03 -0400 Subject: [PATCH 15/55] Add canonical Obsidian desktop package for aarch64 --- .github/workflows/test.yml | 1 + pkgbuilds/obsidian/.omarchy/package.json | 3 + pkgbuilds/obsidian/.omarchy/upstream.py | 45 ++++++++++++ pkgbuilds/obsidian/.omarchy/upstream.sh | 3 + pkgbuilds/obsidian/PKGBUILD | 94 ++++++++++++++++++++++++ pkgbuilds/obsidian/README.md | 11 +++ pkgbuilds/obsidian/obsidian.desktop | 10 +++ tests/obsidian-upstream.py | 47 ++++++++++++ 8 files changed, 214 insertions(+) create mode 100644 pkgbuilds/obsidian/.omarchy/package.json create mode 100644 pkgbuilds/obsidian/.omarchy/upstream.py create mode 100644 pkgbuilds/obsidian/.omarchy/upstream.sh create mode 100644 pkgbuilds/obsidian/PKGBUILD create mode 100644 pkgbuilds/obsidian/README.md create mode 100644 pkgbuilds/obsidian/obsidian.desktop create mode 100644 tests/obsidian-upstream.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 29d18b0..8754f27 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,6 +50,7 @@ jobs: pacman -Syu --noconfirm git jq python libarchive python tests/oma-service-removal.py python tests/upstream-watch.py + python tests/obsidian-upstream.py ./bin/sync-upstream self-test ./bin/sync-rebuilds --self-test ./bin/omarchy-pkgs self-test diff --git a/pkgbuilds/obsidian/.omarchy/package.json b/pkgbuilds/obsidian/.omarchy/package.json new file mode 100644 index 0000000..2a9719d --- /dev/null +++ b/pkgbuilds/obsidian/.omarchy/package.json @@ -0,0 +1,3 @@ +{ + "source": "local" +} diff --git a/pkgbuilds/obsidian/.omarchy/upstream.py b/pkgbuilds/obsidian/.omarchy/upstream.py new file mode 100644 index 0000000..3e93edf --- /dev/null +++ b/pkgbuilds/obsidian/.omarchy/upstream.py @@ -0,0 +1,45 @@ +#!/usr/bin/python3 +"""Report the newest stable ARM desktop installer, ignoring mobile-only tags.""" +import json +import re +import subprocess + + +def select(releases): + if not isinstance(releases, list): + raise ValueError('Expected a GitHub release list') + candidates = [] + for release in releases: + if release.get('draft') or release.get('prerelease'): + continue + match = re.fullmatch(r'v([0-9]+(?:\.[0-9]+)*)', release.get('tag_name', '')) + if not match: + continue + version = match[1] + assets = [a for a in release.get('assets', []) + if a.get('name') == f'obsidian-{version}-arm64.tar.gz'] + if not assets: + continue + if len(assets) != 1: + raise ValueError('Duplicate desktop installer') + candidates.append((tuple(map(int, version.split('.'))), version, release, assets[0])) + if not candidates: + raise ValueError('No stable ARM desktop installer found') + _, version, release, asset = max(candidates, key=lambda row: row[0]) + digest = asset.get('digest') or '' + if not re.fullmatch(r'sha256:[0-9a-f]{64}', digest): + raise ValueError('Selected desktop installer lacks its SHA256 digest') + expected = f'https://github.com/obsidianmd/obsidian-releases/releases/download/v{version}/obsidian-{version}-arm64.tar.gz' + if asset.get('browser_download_url') != expected: + raise ValueError('Unexpected desktop installer URL') + return {'pkgver': version, 'published_at': release['published_at'], + 'sha256sums': {'aarch64': [digest[7:]]}} + + +if __name__ == '__main__': + response = subprocess.check_output([ + 'curl', '--proto', '=https', '--proto-redir', '=https', '-fsSL', + '--retry', '3', '--max-time', '60', + 'https://api.github.com/repos/obsidianmd/obsidian-releases/releases?per_page=100' + ], text=True) + print(json.dumps(select(json.loads(response)))) diff --git a/pkgbuilds/obsidian/.omarchy/upstream.sh b/pkgbuilds/obsidian/.omarchy/upstream.sh new file mode 100644 index 0000000..c422cec --- /dev/null +++ b/pkgbuilds/obsidian/.omarchy/upstream.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -euo pipefail +python3 "$(dirname "$0")/upstream.py" diff --git a/pkgbuilds/obsidian/PKGBUILD b/pkgbuilds/obsidian/PKGBUILD new file mode 100644 index 0000000..00e8060 --- /dev/null +++ b/pkgbuilds/obsidian/PKGBUILD @@ -0,0 +1,94 @@ +# Maintainer: Shun Li +# Extracted from omacom/omarchy-pkgs PR #240, revision dcef132b2df11bb762e233ea8c6af3110f079b67. + +pkgname=obsidian +pkgver=1.13.7 +pkgrel=2 +pkgdesc='Knowledge base on top of a local folder of plain-text Markdown files' +arch=('aarch64') +url='https://obsidian.md/' +license=('custom') +depends=( + 'alsa-lib' + 'at-spi2-core' + 'cairo' + 'dbus' + 'expat' + 'fontconfig' + 'gcc-libs' + 'glib2' + 'glibc' + 'gtk3' + 'hicolor-icon-theme' + 'libcups' + 'libnotify' + 'libsecret' + 'libx11' + 'libxcb' + 'libxcomposite' + 'libxdamage' + 'libxext' + 'libxfixes' + 'libxkbcommon' + 'libxrandr' + 'mesa' + 'nspr' + 'nss' + 'pango' + 'systemd-libs' + 'xdg-utils' +) +provides=('obsidian') +conflicts=('obsidian-appimage' 'obsidian-bin') +options=('!debug' '!strip') +source=('obsidian.desktop') +source_aarch64=( + "obsidian-${pkgver}-arm64.tar.gz::https://github.com/obsidianmd/obsidian-releases/releases/download/v${pkgver}/obsidian-${pkgver}-arm64.tar.gz" +) +sha256sums=('42ecb332c900a01b2a6db0a70b4cc8c0553e863aee72894b23ed20a6289b131c') +sha256sums_aarch64=('98aac34d1f132a35cf506fc3fa196d595dcdeefdebd44b0cc5faaa7a1a210de2') + +package() { + local source_dir="$srcdir/obsidian-${pkgver}-arm64" + local install_dir="$pkgdir/opt/obsidian" + + install -d "$install_dir" + cp -a --no-preserve=ownership "$source_dir/." "$install_dir/" + + # The official ARM64 archive currently carries two x86_64-only addons. + # Remove only an unusable x86_64 payload; retain it automatically if the + # vendor starts shipping an AArch64 build in a later release. + local addon machine + for addon in \ + resources/app.asar.unpacked/node_modules/btime/binding.node \ + resources/app.asar.unpacked/node_modules/get-fonts/binding.node; do + [[ -f "$install_dir/$addon" ]] || continue + machine=$(readelf -h "$install_dir/$addon" | + sed -n 's/^[[:space:]]*Machine:[[:space:]]*//p') + case "$machine" in + AArch64) ;; + 'Advanced Micro Devices X86-64') rm -f "$install_dir/$addon" ;; + *) error "Unexpected Obsidian addon architecture: $addon ($machine)"; return 1 ;; + esac + done + + find "$install_dir" -type d -exec chmod 755 {} + + find "$install_dir" -type f -exec chmod 644 {} + + chmod 755 \ + "$install_dir/chrome_crashpad_handler" \ + "$install_dir/obsidian" \ + "$install_dir/obsidian-cli" + chmod 4755 "$install_dir/chrome-sandbox" + + install -d "$pkgdir/usr/bin" + ln -s /opt/obsidian/obsidian "$pkgdir/usr/bin/obsidian" + ln -s /opt/obsidian/obsidian-cli "$pkgdir/usr/bin/obsidian-cli" + install -Dm644 "$srcdir/obsidian.desktop" \ + "$pkgdir/usr/share/applications/obsidian.desktop" + install -Dm644 "$install_dir/resources/icon.png" \ + "$pkgdir/usr/share/icons/hicolor/512x512/apps/obsidian.png" + install -Dm644 "$install_dir/LICENSE.electron.txt" \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSE.electron.txt" + install -Dm644 "$install_dir/LICENSES.chromium.html" \ + "$pkgdir/usr/share/licenses/$pkgname/LICENSES.chromium.html" +} diff --git a/pkgbuilds/obsidian/README.md b/pkgbuilds/obsidian/README.md new file mode 100644 index 0000000..4d12c27 --- /dev/null +++ b/pkgbuilds/obsidian/README.md @@ -0,0 +1,11 @@ +# Obsidian on ARM + +This is the canonical `obsidian` package, extracted from omacom/omarchy-pkgs #240 at `dcef132b2df11bb762e233ea8c6af3110f079b67`. It repackages the official ARM64 desktop tarball and preserves the original contributor attribution and Electron/Chromium license files. + +The package owns the installed application bundle and Electron runtime. Obsidian's user-controlled in-app updater may separately update application code; no updater-disabling patch is applied. See https://obsidian.md/help/updates. + +The package-local upstream hook selects stable desktop releases containing the exact ARM64 tarball, ignoring mobile-only tags. Missing SHA256 metadata on the selected desktop release fails rather than silently selecting an older installer. Run `python tests/obsidian-upstream.py` for offline tests. Upstream's scheduled sync opens or updates its normal review PR; maintainers need GitHub PR notifications enabled and should monitor failed sync runs too. + +This package conflicts with `obsidian-appimage` and `obsidian-bin`. It does not automatically remove them or migrate users. Adoption in Omarchy Mac requires a separate change to the existing ARM preinstall/removal mappings. Do not modify vaults or user configuration as part of the package transaction. + +Before this draft is ready, validate clean ARM installation, desktop/CLI paths, native payload architecture and opening/editing a disposable vault in a disposable GUI session. Existing AppImage operation does not validate this tarball package. The two named vendor x86-only addons are removed; any newly introduced foreign executable requires review. diff --git a/pkgbuilds/obsidian/obsidian.desktop b/pkgbuilds/obsidian/obsidian.desktop new file mode 100644 index 0000000..da3429e --- /dev/null +++ b/pkgbuilds/obsidian/obsidian.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Obsidian +Comment=Knowledge base on top of a local folder of Markdown files +Exec=obsidian %U +Terminal=false +Type=Application +Icon=obsidian +StartupWMClass=obsidian +MimeType=x-scheme-handler/obsidian; +Categories=Office; diff --git a/tests/obsidian-upstream.py b/tests/obsidian-upstream.py new file mode 100644 index 0000000..2638b34 --- /dev/null +++ b/tests/obsidian-upstream.py @@ -0,0 +1,47 @@ +#!/usr/bin/python3 +import importlib.util +from pathlib import Path +import unittest + +path = Path(__file__).resolve().parents[1] / 'pkgbuilds/obsidian/.omarchy/upstream.py' +spec = importlib.util.spec_from_file_location('obsidian_upstream', path) +module = importlib.util.module_from_spec(spec) +spec.loader.exec_module(module) + + +def release(version, **extra): + return dict(tag_name='v' + version, draft=False, prerelease=False, + published_at='2026-09-23T00:00:00Z', assets=[{ + 'name': f'obsidian-{version}-arm64.tar.gz', + 'digest': 'sha256:' + 'a' * 64, + 'browser_download_url': f'https://github.com/obsidianmd/obsidian-releases/releases/download/v{version}/obsidian-{version}-arm64.tar.gz' + }], **extra) + + +class DesktopReleaseTests(unittest.TestCase): + def test_mobile_only_and_preview_ignored(self): + mobile = release('2.0.0'); mobile['assets'] = [{'name': 'Obsidian.apk'}] + preview = release('3.0.0'); preview['prerelease'] = True + draft = release('4.0.0'); draft['draft'] = True + self.assertEqual(module.select([mobile, preview, draft, release('1.13.7')])['pkgver'], '1.13.7') + + def test_numeric_version_order(self): + self.assertEqual(module.select([release('1.9.0'), release('1.13.7')])['pkgver'], '1.13.7') + + def test_bad_newest_digest_fails_without_falling_back(self): + newest = release('2.0.0'); newest['assets'][0]['digest'] = None + with self.assertRaises(ValueError): + module.select([release('1.13.7'), newest]) + + def test_changed_url_rejected(self): + row = release('1.13.7'); row['assets'][0]['browser_download_url'] = 'https://example.org/foreign' + with self.assertRaises(ValueError): module.select([row]) + + def test_missing_or_duplicate_installer_rejected(self): + with self.assertRaises(ValueError): module.select([]) + row = release('1.13.7'); row['assets'] *= 2 + with self.assertRaises(ValueError): module.select([row]) + + +if __name__ == '__main__': + unittest.main() From fe0cf953d7efb9253af6aaa146ccd850bdaa9fd0 Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Wed, 23 Sep 2026 21:53:30 -0400 Subject: [PATCH 16/55] Add static QEMU packages for aarch64 --- .../qemu-user-static/.omarchy/package.json | 4 + pkgbuilds/qemu-user-static/PKGBUILD | 64 +++ pkgbuilds/qemu-user-static/README.md | 13 + .../qemu-user-static/qemu-binfmt-conf.sh | 442 ++++++++++++++++++ 4 files changed, 523 insertions(+) create mode 100644 pkgbuilds/qemu-user-static/.omarchy/package.json create mode 100644 pkgbuilds/qemu-user-static/PKGBUILD create mode 100644 pkgbuilds/qemu-user-static/README.md create mode 100644 pkgbuilds/qemu-user-static/qemu-binfmt-conf.sh diff --git a/pkgbuilds/qemu-user-static/.omarchy/package.json b/pkgbuilds/qemu-user-static/.omarchy/package.json new file mode 100644 index 0000000..283d159 --- /dev/null +++ b/pkgbuilds/qemu-user-static/.omarchy/package.json @@ -0,0 +1,4 @@ +{ + "source": "local", + "sync": false +} diff --git a/pkgbuilds/qemu-user-static/PKGBUILD b/pkgbuilds/qemu-user-static/PKGBUILD new file mode 100644 index 0000000..8a21f11 --- /dev/null +++ b/pkgbuilds/qemu-user-static/PKGBUILD @@ -0,0 +1,64 @@ +# aarch64-only build: Arch Linux ARM builds qemu without the static user-mode +# binaries, so the Omarchy default set (qemu-user-static-binfmt, used for +# foreign-architecture containers) repackages Debian's statically linked +# qemu-user build. On x86_64 both packages come from the Arch extra repository. + +pkgbase=qemu-user-static +pkgname=('qemu-user-static' 'qemu-user-static-binfmt') +pkgver=10.0.11 +_debver="1:10.0.11+ds-0+deb13u1+b1" +pkgrel=1 +pkgdesc="A generic and open source machine emulator and virtualizer - static user-mode emulation" +arch=('aarch64') +url="https://www.qemu.org" +license=('GPL-2.0-only' 'LGPL-2.1-only') +source=("qemu-binfmt-conf.sh") +# Debian removes superseded pool files. Pin the official archive snapshot so +# the same checksum-verified binary remains rebuildable. +source_aarch64=("qemu-user_${pkgver}_arm64.deb::https://snapshot.debian.org/archive/debian/20260713T202617Z/pool/main/q/qemu/qemu-user_${_debver#*:}_arm64.deb") +sha256sums=('5e12ef484b8364e1ba7bae4acda837d2e6320ffbeb7fab341034124553cdb137') +sha256sums_aarch64=('6c9483063bf60f37fe181ead911251deabe40c893ea5829bc34b0b7b88913b6a') +noextract=("qemu-user_${pkgver}_arm64.deb") + +prepare() { + mkdir -p deb + bsdtar -C deb -xf "qemu-user_${pkgver}_arm64.deb" data.tar.xz + bsdtar -C deb -xf deb/data.tar.xz ./usr/bin ./usr/share/doc/qemu-user/copyright +} + +package_qemu-user-static() { + pkgdesc="A generic and open source machine emulator and virtualizer - static user-mode emulation" + depends=('glibc') + optdepends=('qemu-user-static-binfmt: binary format rules for foreign-architecture binaries') + provides=('qemu-user-static') + conflicts=('qemu-user-static-bin') + + install -dm755 "$pkgdir/usr/bin" + local binary + for binary in deb/usr/bin/qemu-*; do + install -Dm755 "$binary" "$pkgdir/usr/bin/$(basename "$binary")-static" + done + install -Dm644 deb/usr/share/doc/qemu-user/copyright "$pkgdir/usr/share/licenses/$pkgname/copyright" +} + +package_qemu-user-static-binfmt() { + pkgdesc="Binary format rules for the static QEMU user-mode emulators" + depends=('qemu-user-static') + provides=('qemu-user-binfmt-provider') + conflicts=('qemu-user-binfmt-provider' 'binfmt-qemu-static') + + install -dm755 "$pkgdir/usr/lib/binfmt.d" + # HOST_ARCH keeps the native architecture out of the rule set regardless + # of the build host, so the package is identical under native and QEMU builds. + HOST_ARCH=aarch64 sh "$srcdir/qemu-binfmt-conf.sh" \ + --systemd ALL \ + --exportdir "$pkgdir/usr/lib/binfmt.d/" \ + --qemu-path /usr/bin \ + --qemu-suffix -static \ + --persistent yes \ + --preserve-argv0 yes + local conf + for conf in "$pkgdir"/usr/lib/binfmt.d/*.conf; do + mv "$conf" "${conf%.conf}-static.conf" + done +} diff --git a/pkgbuilds/qemu-user-static/README.md b/pkgbuilds/qemu-user-static/README.md new file mode 100644 index 0000000..daeb0ea --- /dev/null +++ b/pkgbuilds/qemu-user-static/README.md @@ -0,0 +1,13 @@ +# ARM static QEMU candidate + +This split recipe provides `qemu-user-static` and `qemu-user-static-binfmt` on aarch64, where Arch Linux ARM does not supply the static emulator packages requested by Omarchy's default package set. It repackages Debian's checksum-pinned ARM64 binary; it does not compile QEMU or replace upstream's build-worker emulation setup. + +Imported from Marcelo's `maralcbr/omarchy-pkgs` revision `83973903b7deb9b56ce75f02b432fba0561d6293`, through the validated candidate recipe in `omarchy-mac/omarchy-pkgs-aarch64` (#61). Debian copyright and upstream licenses are retained. The immutable Debian snapshot keeps the pinned binary available when the rolling pool removes old revisions. + +## Draft readiness gates + +Automatic sync is deliberately disabled in this initial draft. This does **not** detect new releases or security updates. Do not mark this PR ready until a package-local, fixture-tested update integration handles Debian's full version (epoch, upstream version, Debian security revision and architecture rebuild), immutable archive location and SHA256 together. A new Debian revision at the same QEMU version must produce a forward package version; repeated checks must be idempotent. Missing or malformed metadata, unavailable snapshots and checksum inconsistencies must leave the recipe unchanged and fail visibly. + +The existing simple custom-hook contract updates pkgver and SHA256 arrays but cannot update `_debver` and the snapshot timestamp together. Do not add a misleading upstream-version-only watch. Review the smallest compatible integration with upstream before removing the hold. Once enabled, updates should join upstream's existing six-hour update PR workflow; GitHub notification settings determine who sees those PRs. Until then, check Debian's package and security updates manually. + +Before readiness, build both outputs using upstream's ARM builder and test installation in a disposable ARM VM. Verify AArch64 static ELF executables, exact interpreter paths and ownership, the absence of native AArch64 binfmt rules, execution of a known foreign-architecture program both directly and through binfmt, and clean package removal. Never register binfmt rules on the developer host or assume a container isolates that kernel state. Recipe generation only writes rules into the package staging directory. diff --git a/pkgbuilds/qemu-user-static/qemu-binfmt-conf.sh b/pkgbuilds/qemu-user-static/qemu-binfmt-conf.sh new file mode 100644 index 0000000..5fd462b --- /dev/null +++ b/pkgbuilds/qemu-user-static/qemu-binfmt-conf.sh @@ -0,0 +1,442 @@ +#!/bin/sh +# Enable automatic program execution by the kernel. + +qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \ +ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \ +sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \ +microblaze microblazeel or1k x86_64 hexagon loongarch64" + +i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' +i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +i386_family=i386 + +i486_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x06\x00' +i486_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +i486_family=i386 + +x86_64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00' +x86_64_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +x86_64_family=i386 + +alpha_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90' +alpha_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +alpha_family=alpha + +arm_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00' +arm_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +arm_family=arm + +armeb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28' +armeb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +armeb_family=armeb + +sparc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02' +sparc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +sparc_family=sparc + +sparc32plus_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x12' +sparc32plus_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +sparc32plus_family=sparc + +sparc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2b' +sparc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +sparc64_family=sparc + +ppc_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14' +ppc_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +ppc_family=ppc + +ppc64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15' +ppc64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +ppc64_family=ppc + +ppc64le_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15\x00' +ppc64le_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\x00' +ppc64le_family=ppcle + +m68k_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04' +m68k_mask='\xff\xff\xff\xff\xff\xff\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +m68k_family=m68k + +# FIXME: We could use the other endianness on a MIPS host. + +mips_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' +mips_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' +mips_family=mips + +mipsel_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' +mipsel_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00' +mipsel_family=mips + +mipsn32_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' +mipsn32_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20' +mipsn32_family=mips + +mipsn32el_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00' +mipsn32el_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00' +mipsn32el_family=mips + +mips64_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08' +mips64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +mips64_family=mips + +mips64el_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00' +mips64el_mask='\xff\xff\xff\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +mips64el_family=mips + +sh4_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00' +sh4_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +sh4_family=sh4 + +sh4eb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a' +sh4eb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +sh4eb_family=sh4 + +s390x_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16' +s390x_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +s390x_family=s390x + +aarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00' +aarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +aarch64_family=arm + +aarch64_be_magic='\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7' +aarch64_be_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +aarch64_be_family=armeb + +hppa_magic='\x7f\x45\x4c\x46\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x0f' +hppa_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +hppa_family=hppa + +riscv32_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00' +riscv32_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +riscv32_family=riscv + +riscv64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00' +riscv64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +riscv64_family=riscv + +xtensa_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x5e\x00' +xtensa_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +xtensa_family=xtensa + +xtensaeb_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x5e' +xtensaeb_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +xtensaeb_family=xtensaeb + +microblaze_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xba\xab' +microblaze_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +microblaze_family=microblaze + +microblazeel_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xab\xba' +microblazeel_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +microblazeel_family=microblazeel + +or1k_magic='\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x5c' +or1k_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff' +or1k_family=or1k + +hexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xa4\x00' +hexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +hexagon_family=hexagon + +loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01' +loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\xfc\x00\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +loongarch64_family=loongarch + +# Converts the name of a host CPU architecture to the corresponding QEMU +# target. +# +# FIXME: This can probably be simplified a lot by dropping most entries. +# Remember that the script is only used on Linux, so we only need to +# handle the strings Linux uses to report the host CPU architecture. +qemu_normalize() { + cpu="$1" + case "$cpu" in + i[3-6]86) + echo "i386" + ;; + amd64) + echo "x86_64" + ;; + powerpc) + echo "ppc" + ;; + ppc64el) + echo "ppc64le" + ;; + armel|armhf|armv[4-9]*l) + echo "arm" + ;; + armv[4-9]*b) + echo "armeb" + ;; + arm64) + echo "aarch64" + ;; + *) + echo "$cpu" + ;; + esac +} + +usage() { + cat <&2 + exit 1 + fi +} + +qemu_check_bintfmt_misc() { + # load the binfmt_misc module + if [ ! -d /proc/sys/fs/binfmt_misc ]; then + if ! /sbin/modprobe binfmt_misc ; then + exit 1 + fi + fi + if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then + if ! mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc ; then + exit 1 + fi + fi + + qemu_check_access /proc/sys/fs/binfmt_misc/register +} + +installed_dpkg() { + dpkg --status "$1" > /dev/null 2>&1 +} + +qemu_check_debian() { + if [ ! -e /etc/debian_version ] ; then + echo "WARNING: your system is not a Debian based distro" 1>&2 + elif ! installed_dpkg binfmt-support ; then + echo "WARNING: package binfmt-support is needed" 1>&2 + fi + qemu_check_access "$EXPORTDIR" +} + +qemu_check_systemd() { + if ! systemctl -q is-enabled systemd-binfmt.service ; then + echo "WARNING: systemd-binfmt.service is missing or disabled" 1>&2 + fi + qemu_check_access "$EXPORTDIR" +} + +qemu_generate_register() { + flags="" + if [ "$CREDENTIAL" = "yes" ] ; then + flags="OC" + fi + if [ "$PERSISTENT" = "yes" ] ; then + flags="${flags}F" + fi + if [ "$PRESERVE_ARG0" = "yes" ] ; then + flags="${flags}P" + fi + + echo ":qemu-$cpu:M::$magic:$mask:$qemu:$flags" +} + +qemu_register_interpreter() { + echo "Setting $qemu as binfmt interpreter for $cpu" + qemu_generate_register > /proc/sys/fs/binfmt_misc/register +} + +qemu_generate_systemd() { + echo "Setting $qemu as binfmt interpreter for $cpu for systemd-binfmt.service" + qemu_generate_register > "$EXPORTDIR/qemu-$cpu.conf" +} + +qemu_generate_debian() { + cat > "$EXPORTDIR/qemu-$cpu" <&2 + exit 1 + fi + + # register the interpreter for each cpu except for the native one + + for cpu in ${qemu_target_list} ; do + magic=$(eval echo \$${cpu}_magic) + mask=$(eval echo \$${cpu}_mask) + family=$(eval echo \$${cpu}_family) + + target="$cpu" + if [ "$cpu" = "i486" ] ; then + target="i386" + fi + + qemu="$QEMU_PATH/qemu-$target$QEMU_SUFFIX" + + if [ "$magic" = "" ] || [ "$mask" = "" ] || [ "$family" = "" ] ; then + echo "INTERNAL ERROR: unknown cpu $cpu" 1>&2 + continue + fi + + if [ "$host_family" = "$family" ] ; then + # When --ignore-family is used, we have to generate rules even + # for targets that are in the same family as the host CPU. The + # only exception is of course when the CPU types exactly match + if [ "$target" = "$host_cpu" ] || [ "$IGNORE_FAMILY" = "no" ] ; then + continue + fi + fi + + $BINFMT_SET + done +} + +CHECK=qemu_check_bintfmt_misc +BINFMT_SET=qemu_register_interpreter + +SYSTEMDDIR="/etc/binfmt.d" +DEBIANDIR="/usr/share/binfmts" + +QEMU_PATH=/usr/local/bin +CREDENTIAL=no +PERSISTENT=no +PRESERVE_ARG0=no +QEMU_SUFFIX="" +IGNORE_FAMILY=no + +_longopts="debian,systemd:,qemu-path:,qemu-suffix:,exportdir:,help,credential:,\ +persistent:,preserve-argv0:,ignore-family:" +options=$(getopt -o ds:Q:S:e:hc:p:g:F:i: -l ${_longopts} -- "$@") +eval set -- "$options" + +while true ; do + case "$1" in + -d|--debian) + CHECK=qemu_check_debian + BINFMT_SET=qemu_generate_debian + EXPORTDIR=${EXPORTDIR:-$DEBIANDIR} + ;; + -s|--systemd) + CHECK=qemu_check_systemd + BINFMT_SET=qemu_generate_systemd + EXPORTDIR=${EXPORTDIR:-$SYSTEMDDIR} + shift + # check given cpu is in the supported CPU list + if [ "$1" != "ALL" ] ; then + for cpu in ${qemu_target_list} ; do + if [ "$cpu" = "$1" ] ; then + break + fi + done + + if [ "$cpu" = "$1" ] ; then + qemu_target_list="$1" + else + echo "ERROR: unknown CPU \"$1\"" 1>&2 + usage + exit 1 + fi + fi + ;; + -Q|--qemu-path) + shift + QEMU_PATH="$1" + ;; + -F|--qemu-suffix) + shift + QEMU_SUFFIX="$1" + ;; + -e|--exportdir) + shift + EXPORTDIR="$1" + ;; + -h|--help) + usage + exit 1 + ;; + -c|--credential) + shift + CREDENTIAL="$1" + ;; + -p|--persistent) + shift + PERSISTENT="$1" + ;; + -g|--preserve-argv0) + shift + PRESERVE_ARG0="$1" + ;; + -i|--ignore-family) + shift + IGNORE_FAMILY="$1" + ;; + *) + break + ;; + esac + shift +done + +$CHECK +qemu_set_binfmts From aa64ec9a4f63e22ad328336317b5aa28d6586e0b Mon Sep 17 00:00:00 2001 From: Scott Jones Date: Wed, 23 Sep 2026 23:26:34 -0400 Subject: [PATCH 17/55] Track Debian QEMU revisions through verified immutable snapshots --- .github/workflows/test.yml | 1 + bin/sync-upstream | 16 ++- .../qemu-user-static/.omarchy/package.json | 3 +- .../qemu-user-static/.omarchy/upstream.py | 120 ++++++++++++++++++ .../qemu-user-static/.omarchy/upstream.sh | 3 + pkgbuilds/qemu-user-static/PKGBUILD | 15 ++- pkgbuilds/qemu-user-static/README.md | 14 +- tests/qemu-upstream.py | 115 +++++++++++++++++ 8 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 pkgbuilds/qemu-user-static/.omarchy/upstream.py create mode 100644 pkgbuilds/qemu-user-static/.omarchy/upstream.sh create mode 100644 tests/qemu-upstream.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 29d18b0..7bcbb22 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,6 +50,7 @@ jobs: pacman -Syu --noconfirm git jq python libarchive python tests/oma-service-removal.py python tests/upstream-watch.py + python tests/qemu-upstream.py ./bin/sync-upstream self-test ./bin/sync-rebuilds --self-test ./bin/omarchy-pkgs self-test diff --git a/bin/sync-upstream b/bin/sync-upstream index 2f84506..360a1b2 100755 --- a/bin/sync-upstream +++ b/bin/sync-upstream @@ -31,7 +31,10 @@ pkgbuilds//.omarchy/upstream.sh, a hook that reports JSON on stdout: } Architecture keys become sha256sums_ in the PKGBUILD; the key "any" means -the unsuffixed sha256sums array. An empty object ({}) reports no update. +the unsuffixed sha256sums array. An empty object ({}) reports no update. Optional "variables" maps existing +underscore-prefixed release scalars to values containing only letters, digits, +periods, underscores, plus, colon and hyphen. They are verified and written in +the same atomic replacement as pkgver and checksums. When the reported version is newer than the checked-in one, pkgver and the listed checksum arrays are rewritten and pkgrel is reset to 1. @@ -209,6 +212,10 @@ validate_release() { and (.sha256sums | to_entries | all( .value | type == "array" and length > 0 and all(test("\\A[0-9a-f]{64}\\z")) )) + and (if has("variables") then (.variables | type == "object" and (to_entries | all( + (.key | test("\\A_[a-z][a-z0-9_]*\\z")) and + (.value | type == "string" and test("\\A[A-Za-z0-9._+:-]+\\z")) + ))) else true end) and (if has("published_at") then (.published_at | type == "string" and length > 0) else true end) ' <<<"$release" >/dev/null } @@ -312,6 +319,13 @@ apply_release() { set_pkgbuild_scalar "$scratch" pkgver "$pkgver" || exit 1 set_pkgbuild_scalar "$scratch" pkgrel 1 || exit 1 + local field value + while IFS=$'\t' read -r field value; do + [[ -n "$field" ]] || continue + set_pkgbuild_scalar "$scratch" "$field" "$value" || exit 1 + [[ $(bash -c 'source "$1"; printf "%s" "${!2}"' _ "$scratch" "$field") == "$value" ]] || exit 1 + done < <(jq -r '(.variables // {}) | to_entries[] | [.key, .value] | @tsv' <<<"$release") + verify_pkgbuild "$scratch" "$release" "$pkgver" "${arrays[@]}" || exit 1 ); then rm -f "$scratch" diff --git a/pkgbuilds/qemu-user-static/.omarchy/package.json b/pkgbuilds/qemu-user-static/.omarchy/package.json index 283d159..2a9719d 100644 --- a/pkgbuilds/qemu-user-static/.omarchy/package.json +++ b/pkgbuilds/qemu-user-static/.omarchy/package.json @@ -1,4 +1,3 @@ { - "source": "local", - "sync": false + "source": "local" } diff --git a/pkgbuilds/qemu-user-static/.omarchy/upstream.py b/pkgbuilds/qemu-user-static/.omarchy/upstream.py new file mode 100644 index 0000000..341d9c1 --- /dev/null +++ b/pkgbuilds/qemu-user-static/.omarchy/upstream.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Track Debian 13 ARM64 QEMU revisions, verifying an immutable snapshot first.""" +import functools +import hashlib +import json +import lzma +from pathlib import Path +import re +import subprocess +import sys +import urllib.parse +import urllib.request + +FEEDS = [ + 'https://deb.debian.org/debian/dists/trixie/main/binary-arm64/Packages.xz', + 'https://deb.debian.org/debian/dists/trixie-updates/main/binary-arm64/Packages.xz', + 'https://security.debian.org/debian-security/dists/trixie-security/main/binary-arm64/Packages.xz', +] + +def fetch(url): + with urllib.request.urlopen(url, timeout=120) as response: + if not response.url.startswith('https://'): + raise ValueError('Insecure redirect') + return response.read() + +def parts(version): + match = re.fullmatch(r'(?:(\d+):)?([0-9][A-Za-z0-9.+~]*?)-([A-Za-z0-9.+~]+)', version) + if not match: + raise ValueError('Unsupported Debian version: ' + version) + return int(match[1] or '0'), match[2], match[3] + +def segment_cmp(a, b): + # Debian policy: tilde precedes everything, then end/digits, letters, + # then other characters; digit runs are compared numerically. + def order(c): + if c == '~': return -1 + if not c or c.isdigit(): return 0 + return ord(c) if c.isalpha() else ord(c) + 256 + while a or b: + while (a and not a[0].isdigit()) or (b and not b[0].isdigit()): + x, y = order(a[:1]), order(b[:1]) + if x != y: return (x > y) - (x < y) + a, b = a[1:], b[1:] + x = re.match(r'\d*', a)[0] + y = re.match(r'\d*', b)[0] + nx, ny = int(x or '0'), int(y or '0') + if nx != ny: return (nx > ny) - (nx < ny) + a, b = a[len(x):], b[len(y):] + return 0 + +def compare(a, b): + ea, ua, ra = parts(a) + eb, ub, rb = parts(b) + return (ea > eb) - (ea < eb) or segment_cmp(ua, ub) or segment_cmp(ra, rb) + +def package_version(version): + epoch, upstream, revision = parts(version) + # Stable releases only. Fail visibly on prerelease/repack conventions that + # need a reviewed Arch ordering rather than silently misordering them. + if '~' in version: + raise ValueError('Debian prerelease needs a reviewed Arch version mapping') + return f'{epoch}.{upstream}.{revision}' + +def records(data): + found = [] + for stanza in re.split(r'\n\s*\n', lzma.decompress(data).decode()): + fields = dict(re.findall(r'^([A-Za-z0-9-]+): (.*)$', stanza, re.M)) + if fields.get('Package') != 'qemu-user': continue + if fields.get('Architecture') != 'arm64': raise ValueError('Wrong architecture') + parts(fields['Version']) + if not re.fullmatch(r'[0-9a-f]{64}', fields.get('SHA256', '')): + raise ValueError('Missing/malformed SHA256') + if not re.fullmatch(r'[1-9][0-9]*', fields.get('Size', '')): + raise ValueError('Missing/malformed package size') + found.append(fields) + return found + +def discover(current, current_pkgver, current_hash, get=fetch): + candidates = [row for url in FEEDS for row in records(get(url))] + if not candidates: raise ValueError('No ARM64 qemu-user package in Debian feeds') + selected = max(candidates, key=functools.cmp_to_key(lambda a,b: compare(a['Version'], b['Version']))) + version, checksum = selected['Version'], selected['SHA256'] + if any(row['SHA256'] != checksum for row in candidates if row['Version'] == version): + raise ValueError('Debian feeds disagree on the selected checksum') + ordering = compare(version, current) + if ordering < 0: raise ValueError('Debian feeds are older than the pinned recipe') + if ordering == 0: + if checksum != current_hash: raise ValueError('Checksum changed for the pinned Debian revision') + return {} + pkgver = package_version(version) + if int(subprocess.check_output(['vercmp', pkgver, current_pkgver], text=True)) <= 0: + raise ValueError('New Debian revision does not advance Arch version; review mapping') + api = 'https://snapshot.debian.org/mr/binary/qemu-user/' + urllib.parse.quote(version, safe='') + '/binfiles' + document = json.loads(get(api)) + if document.get('binary') != 'qemu-user' or document.get('binary_version') != version: + raise ValueError('Snapshot revision differs') + hashes = {row['hash'] for row in document['result'] if row['architecture'] == 'arm64'} + if len(hashes) != 1 or not re.fullmatch(r'[0-9a-f]{40}', next(iter(hashes), '')): + raise ValueError('Missing/ambiguous ARM64 snapshot') + snapshot = hashes.pop() + archive = get('https://snapshot.debian.org/file/' + snapshot) + if len(archive) != int(selected['Size']) or hashlib.sha256(archive).hexdigest() != checksum or hashlib.sha1(archive).hexdigest() != snapshot: + raise ValueError('Snapshot bytes differ from Debian package metadata') + return {'pkgver': pkgver, 'variables': {'_debver': version, '_snapshot': snapshot}, + 'sha256sums': {'aarch64': [checksum]}} + +def main(): + recipe = Path('PKGBUILD').read_text() + def scalar(name): + match = re.search(r'^' + name + r'=[\"\']?([^\"\'\n]+)', recipe, re.M) + if not match: raise ValueError('Missing recipe scalar: ' + name) + return match[1] + checksum = re.search(r"^sha256sums_aarch64=\('([a-f0-9]{64})'\)", recipe, re.M) + if not checksum: raise ValueError('Missing current ARM checksum') + print(json.dumps(discover(scalar('_debver'), scalar('pkgver'), checksum[1]))) + +if __name__ == '__main__': + try: main() + except Exception as error: + sys.exit('QEMU Debian update failed: ' + str(error)) diff --git a/pkgbuilds/qemu-user-static/.omarchy/upstream.sh b/pkgbuilds/qemu-user-static/.omarchy/upstream.sh new file mode 100644 index 0000000..829dbc9 --- /dev/null +++ b/pkgbuilds/qemu-user-static/.omarchy/upstream.sh @@ -0,0 +1,3 @@ +#!/bin/bash +set -euo pipefail +exec python3 .omarchy/upstream.py diff --git a/pkgbuilds/qemu-user-static/PKGBUILD b/pkgbuilds/qemu-user-static/PKGBUILD index 8a21f11..22b64cc 100644 --- a/pkgbuilds/qemu-user-static/PKGBUILD +++ b/pkgbuilds/qemu-user-static/PKGBUILD @@ -5,8 +5,12 @@ pkgbase=qemu-user-static pkgname=('qemu-user-static' 'qemu-user-static-binfmt') -pkgver=10.0.11 -_debver="1:10.0.11+ds-0+deb13u1+b1" +# One-time epoch moves from upstream-only to full Debian revision ordering. +# pkgver records Debian epoch.upstream.revision; updates also verify vercmp. +epoch=1 +pkgver=1.10.0.13+ds.0+deb13u1 +_debver=1:10.0.13+ds-0+deb13u1 +_snapshot=02b553a4532192bc999d15408d1e56d7b254906f pkgrel=1 pkgdesc="A generic and open source machine emulator and virtualizer - static user-mode emulation" arch=('aarch64') @@ -14,10 +18,11 @@ url="https://www.qemu.org" license=('GPL-2.0-only' 'LGPL-2.1-only') source=("qemu-binfmt-conf.sh") # Debian removes superseded pool files. Pin the official archive snapshot so -# the same checksum-verified binary remains rebuildable. -source_aarch64=("qemu-user_${pkgver}_arm64.deb::https://snapshot.debian.org/archive/debian/20260713T202617Z/pool/main/q/qemu/qemu-user_${_debver#*:}_arm64.deb") +# the same checksum-verified binary remains rebuildable. _snapshot is the +# content-addressed snapshot SHA1; SHA256 below remains the integrity check. +source_aarch64=("qemu-user_${pkgver}_arm64.deb::https://snapshot.debian.org/file/$_snapshot") sha256sums=('5e12ef484b8364e1ba7bae4acda837d2e6320ffbeb7fab341034124553cdb137') -sha256sums_aarch64=('6c9483063bf60f37fe181ead911251deabe40c893ea5829bc34b0b7b88913b6a') +sha256sums_aarch64=('c73711af02b97cd5e2667e735d9c06890c57165517110ca4e646c95a7083158d') noextract=("qemu-user_${pkgver}_arm64.deb") prepare() { diff --git a/pkgbuilds/qemu-user-static/README.md b/pkgbuilds/qemu-user-static/README.md index daeb0ea..d30002c 100644 --- a/pkgbuilds/qemu-user-static/README.md +++ b/pkgbuilds/qemu-user-static/README.md @@ -1,13 +1,13 @@ -# ARM static QEMU candidate +# ARM static QEMU -This split recipe provides `qemu-user-static` and `qemu-user-static-binfmt` on aarch64, where Arch Linux ARM does not supply the static emulator packages requested by Omarchy's default package set. It repackages Debian's checksum-pinned ARM64 binary; it does not compile QEMU or replace upstream's build-worker emulation setup. +This aarch64-only split recipe provides qemu-user-static and qemu-user-static-binfmt using Debian’s static ARM64 binaries. It preserves Marcelo’s recipe, imported through omarchy-mac/omarchy-pkgs-aarch64#61, including licensing and binfmt behavior. It does not change x86 packages or the build workers. -Imported from Marcelo's `maralcbr/omarchy-pkgs` revision `83973903b7deb9b56ce75f02b432fba0561d6293`, through the validated candidate recipe in `omarchy-mac/omarchy-pkgs-aarch64` (#61). Debian copyright and upstream licenses are retained. The immutable Debian snapshot keeps the pinned binary available when the rolling pool removes old revisions. +## Updates -## Draft readiness gates +The package-local upstream hook checks Debian 13 (trixie), trixie-updates, and trixie-security ARM64 indexes. It compares full Debian versions, including epochs, security revisions and binary rebuilds, and resolves the selected binary through snapshot.debian.org’s API. The immutable content-addressed archive must match the index’s size and SHA256 as well as the snapshot SHA1 before an update is returned. -Automatic sync is deliberately disabled in this initial draft. This does **not** detect new releases or security updates. Do not mark this PR ready until a package-local, fixture-tested update integration handles Debian's full version (epoch, upstream version, Debian security revision and architecture rebuild), immutable archive location and SHA256 together. A new Debian revision at the same QEMU version must produce a forward package version; repeated checks must be idempotent. Missing or malformed metadata, unavailable snapshots and checksum inconsistencies must leave the recipe unchanged and fail visibly. +A one-time Arch epoch of 1 moves away from the previous upstream-only version. pkgver encodes Debian epoch.upstream.revision. The hook requires both Debian ordering and pacman vercmp to advance; unfamiliar prerelease conventions or ordering discrepancies fail for manual review. Debian distribution upgrades are explicit recipe changes, not automatic jumps to testing/unstable. -The existing simple custom-hook contract updates pkgver and SHA256 arrays but cannot update `_debver` and the snapshot timestamp together. Do not add a misleading upstream-version-only watch. Review the smallest compatible integration with upstream before removing the hold. Once enabled, updates should join upstream's existing six-hour update PR workflow; GitHub notification settings determine who sees those PRs. Until then, check Debian's package and security updates manually. +The existing six-hour upstream update PR workflow discovers the hook. Its pkgver, _debver, _snapshot and ARM checksum are applied atomically through the normal sync interface. Repeated checks are idempotent. Feed failures, malformed metadata, conflicting checksums and unavailable/corrupt snapshots fail visibly before recipe mutation. No update installs packages or registers binfmt rules. -Before readiness, build both outputs using upstream's ARM builder and test installation in a disposable ARM VM. Verify AArch64 static ELF executables, exact interpreter paths and ownership, the absence of native AArch64 binfmt rules, execution of a known foreign-architecture program both directly and through binfmt, and clean package removal. Never register binfmt rules on the developer host or assume a container isolates that kernel state. Recipe generation only writes rules into the package staging directory. +Offline fixtures cover version/epoch/security/binNMU updates, security-feed selection, unchanged versions, metadata and snapshot failures, atomic application, and hostile/missing scalar rejection. Existing GUI-independent VM qualification and packaging evidence are recorded in the PR; new binaries still receive build and runtime checks before publication. diff --git a/tests/qemu-upstream.py b/tests/qemu-upstream.py new file mode 100644 index 0000000..30a54a2 --- /dev/null +++ b/tests/qemu-upstream.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +import hashlib +import importlib.util +import json +import lzma +import re +from pathlib import Path +import subprocess +import tempfile +import unittest +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[1] +PACKAGE = ROOT / 'pkgbuilds/qemu-user-static' +spec = importlib.util.spec_from_file_location('qemu', PACKAGE / '.omarchy/upstream.py') +q = importlib.util.module_from_spec(spec) +spec.loader.exec_module(q) +CURRENT = '1:10.0.11+ds-0+deb13u1+b1' + +class Updates(unittest.TestCase): + def fixtures(self, version): + blob = b'fixture package bytes' + sha = hashlib.sha256(blob).hexdigest() + snap = hashlib.sha1(blob).hexdigest() + row = f'Package: qemu-user\nArchitecture: arm64\nVersion: {version}\nSHA256: {sha}\nSize: {len(blob)}\n' + feeds = {url: lzma.compress(row.encode()) for url in q.FEEDS} + def get(url): + if url in feeds: return feeds[url] + if '/mr/' in url: + return json.dumps({'binary':'qemu-user', 'binary_version':version, + 'result':[{'architecture':'arm64','hash':snap}]}).encode() + return blob + return get, feeds, sha + + def test_versions(self): + for old, new in [(CURRENT,'1:10.0.11+ds-0+deb13u1+b2'), + (CURRENT,'1:10.0.11+ds-0+deb13u2'), + (CURRENT,'1:10.0.12+ds-1'), + (CURRENT,'2:9.0.0+ds-1')]: + with self.subTest(new=new): + get,_,_=self.fixtures(new) + result=q.discover(old,q.package_version(old),'0'*64,get) + self.assertEqual(result['variables']['_debver'],new) + self.assertGreater(q.compare(new,old),0) + self.assertLess(q.compare('1:10.0~rc1-1','1:10.0-1'),0) + self.assertLess(q.compare('1:10.0-2','1:10.0-10'),0) + + def test_security_wins(self): + newer='1:10.0.11+ds-0+deb13u2' + get,feeds,_=self.fixtures(newer) + _,oldfeeds,_=self.fixtures(CURRENT) + feeds[q.FEEDS[0]]=oldfeeds[q.FEEDS[0]] + self.assertEqual(q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get)['variables']['_debver'],newer) + + def test_unchanged(self): + get,_,sha=self.fixtures(CURRENT) + self.assertEqual(q.discover(CURRENT,q.package_version(CURRENT),sha,get),{}) + with self.assertRaisesRegex(ValueError,'Checksum changed'): + q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get) + + def test_bad_metadata(self): + get,feeds,_=self.fixtures('1:10.0.12+ds-1') + feeds[q.FEEDS[0]]=lzma.compress(b'Package: qemu-user\nArchitecture: arm64\nVersion: invalid\n') + with self.assertRaises(ValueError): q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get) + + def test_snapshot_failures(self): + for failure in ['missing','bytes','metadata']: + get,_,_=self.fixtures('1:10.0.12+ds-1') + def bad(url): + if '/file/' in url: + if failure=='missing': raise OSError('unavailable snapshot') + if failure=='bytes': return b'corrupt' + if '/mr/' in url and failure=='metadata': return b'{}' + return get(url) + with self.subTest(failure=failure), self.assertRaises((ValueError,OSError)): + q.discover(CURRENT,q.package_version(CURRENT),'0'*64,bad) + + def sync(self, recipe, release): + with tempfile.TemporaryDirectory() as tmp: + p=Path(tmp)/'fixture'; (p/'.omarchy').mkdir(parents=True) + (p/'PKGBUILD').write_text(recipe) + (p/'.omarchy/package.json').write_text('{"source":"local"}') + (p/'.omarchy/upstream.sh').write_text("#!/bin/bash\ncat <<'JSON'\n"+json.dumps(release)+"\nJSON\n") + # Load production functions, excluding only the command dispatch. + prefix=(ROOT/'bin/sync-upstream').read_text().split('if [[ ${#SPECIFIC_PACKAGES[@]} -gt 0 &&')[0] + prefix=prefix.replace('BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..")', 'BUILD_ROOT='+str(ROOT)) + command=prefix+'\nPKGBUILDS_DIR='+tmp+'\nSPECIFIC_MODE=true\nsync_package fixture\n((FAILED == 0))\n' + result=subprocess.run(['bash','-c',command],capture_output=True,text=True) + return result,(p/'PKGBUILD').read_text() + + def test_atomic_sync_and_idempotence(self): + get,_,_=self.fixtures('1:10.0.11+ds-0+deb13u2') + release=q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get) + before=(PACKAGE/'PKGBUILD').read_text() + before=re.sub(r'^pkgver=.*$', 'pkgver='+q.package_version(CURRENT), before, flags=re.M) + before=re.sub(r'^_debver=.*$', '_debver='+CURRENT, before, flags=re.M) + result,after=self.sync(before,release) + self.assertEqual(result.returncode,0,result.stdout+result.stderr) + self.assertIn('_debver='+release['variables']['_debver'],after) + self.assertIn('_snapshot='+release['variables']['_snapshot'],after) + self.assertIn(release['sha256sums']['aarch64'][0],after) + result,again=self.sync(after,release) + self.assertEqual(result.returncode,0,result.stdout+result.stderr) + self.assertEqual(again,after) + + def test_invalid_variables_leave_recipe_unchanged(self): + before=(PACKAGE/'PKGBUILD').read_text() + for variables in [{'_debver':'$(touch /tmp/qemu-injection)'}, {'pkgver':'2'}, + {'_absent':'1'}, {'_snapshot':'abc\ncommand'}, {'_snapshot':'https://bad'}]: + with self.subTest(variables=variables): + result,after=self.sync(before,{'pkgver':'99','variables':variables,'sha256sums':{'aarch64':['a'*64]}}) + self.assertNotEqual(result.returncode,0) + self.assertEqual(before,after) + +if __name__=='__main__': unittest.main() From 2a47ad775bf9c600bdaae87650326e69bc76a96c Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Thu, 24 Sep 2026 16:05:38 +1000 Subject: [PATCH 18/55] Drop setuid from chrome-sandbox and keep Obsidian's tests in its package Chromium sandboxes through unprivileged user namespaces on Arch-family kernels, so the setuid-root helper is unnecessary. The watcher tests now run from check() as checksummed package sources, leaving tests/ and the shared Tests workflow untouched. --- .github/workflows/test.yml | 1 - pkgbuilds/obsidian/.omarchy/upstream.sh | 2 +- pkgbuilds/obsidian/PKGBUILD | 15 ++++++++++++--- pkgbuilds/obsidian/README.md | 4 ++-- .../obsidian/test-upstream.py | 2 +- pkgbuilds/obsidian/{.omarchy => }/upstream.py | 0 6 files changed, 16 insertions(+), 8 deletions(-) rename tests/obsidian-upstream.py => pkgbuilds/obsidian/test-upstream.py (95%) rename pkgbuilds/obsidian/{.omarchy => }/upstream.py (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8754f27..29d18b0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,6 @@ jobs: pacman -Syu --noconfirm git jq python libarchive python tests/oma-service-removal.py python tests/upstream-watch.py - python tests/obsidian-upstream.py ./bin/sync-upstream self-test ./bin/sync-rebuilds --self-test ./bin/omarchy-pkgs self-test diff --git a/pkgbuilds/obsidian/.omarchy/upstream.sh b/pkgbuilds/obsidian/.omarchy/upstream.sh index c422cec..e2b9028 100644 --- a/pkgbuilds/obsidian/.omarchy/upstream.sh +++ b/pkgbuilds/obsidian/.omarchy/upstream.sh @@ -1,3 +1,3 @@ #!/bin/bash set -euo pipefail -python3 "$(dirname "$0")/upstream.py" +python3 "$(dirname "$0")/../upstream.py" diff --git a/pkgbuilds/obsidian/PKGBUILD b/pkgbuilds/obsidian/PKGBUILD index 00e8060..25a0ea5 100644 --- a/pkgbuilds/obsidian/PKGBUILD +++ b/pkgbuilds/obsidian/PKGBUILD @@ -41,13 +41,20 @@ depends=( provides=('obsidian') conflicts=('obsidian-appimage' 'obsidian-bin') options=('!debug' '!strip') -source=('obsidian.desktop') +checkdepends=('python') +source=('obsidian.desktop' 'upstream.py' 'test-upstream.py') source_aarch64=( "obsidian-${pkgver}-arm64.tar.gz::https://github.com/obsidianmd/obsidian-releases/releases/download/v${pkgver}/obsidian-${pkgver}-arm64.tar.gz" ) -sha256sums=('42ecb332c900a01b2a6db0a70b4cc8c0553e863aee72894b23ed20a6289b131c') +sha256sums=('42ecb332c900a01b2a6db0a70b4cc8c0553e863aee72894b23ed20a6289b131c' + 'd2933bdc97d9ba55986d710114512e0eb105e1cc549cef4aa7416cb333e0a9b8' + '7213e4e691c53e184b0f037478ac6758fe44adad7a984fc1daef7fd17c31d5d8') sha256sums_aarch64=('98aac34d1f132a35cf506fc3fa196d595dcdeefdebd44b0cc5faaa7a1a210de2') +check() { + python test-upstream.py +} + package() { local source_dir="$srcdir/obsidian-${pkgver}-arm64" local install_dir="$pkgdir/opt/obsidian" @@ -78,7 +85,9 @@ package() { "$install_dir/chrome_crashpad_handler" \ "$install_dir/obsidian" \ "$install_dir/obsidian-cli" - chmod 4755 "$install_dir/chrome-sandbox" + # Chromium sandboxes through unprivileged user namespaces, which Arch-family + # kernels allow; a setuid-root helper is not needed. + chmod 755 "$install_dir/chrome-sandbox" install -d "$pkgdir/usr/bin" ln -s /opt/obsidian/obsidian "$pkgdir/usr/bin/obsidian" diff --git a/pkgbuilds/obsidian/README.md b/pkgbuilds/obsidian/README.md index 4d12c27..ca6564e 100644 --- a/pkgbuilds/obsidian/README.md +++ b/pkgbuilds/obsidian/README.md @@ -2,9 +2,9 @@ This is the canonical `obsidian` package, extracted from omacom/omarchy-pkgs #240 at `dcef132b2df11bb762e233ea8c6af3110f079b67`. It repackages the official ARM64 desktop tarball and preserves the original contributor attribution and Electron/Chromium license files. -The package owns the installed application bundle and Electron runtime. Obsidian's user-controlled in-app updater may separately update application code; no updater-disabling patch is applied. See https://obsidian.md/help/updates. +The package owns the installed application bundle and Electron runtime. `chrome-sandbox` is installed without setuid: Chromium's sandbox uses unprivileged user namespaces, which Arch-family kernels allow. A system that disables them must re-enable them rather than launch Obsidian with `--no-sandbox`. Obsidian's user-controlled in-app updater may separately update application code; no updater-disabling patch is applied. See https://obsidian.md/help/updates. -The package-local upstream hook selects stable desktop releases containing the exact ARM64 tarball, ignoring mobile-only tags. Missing SHA256 metadata on the selected desktop release fails rather than silently selecting an older installer. Run `python tests/obsidian-upstream.py` for offline tests. Upstream's scheduled sync opens or updates its normal review PR; maintainers need GitHub PR notifications enabled and should monitor failed sync runs too. +The package-local upstream hook selects stable desktop releases containing the exact ARM64 tarball, ignoring mobile-only tags. Missing SHA256 metadata on the selected desktop release fails rather than silently selecting an older installer. The offline tests in `test-upstream.py` run in the package's `check()`; run them directly with `python pkgbuilds/obsidian/test-upstream.py`. Upstream's scheduled sync opens or updates its normal review PR; maintainers need GitHub PR notifications enabled and should monitor failed sync runs too. This package conflicts with `obsidian-appimage` and `obsidian-bin`. It does not automatically remove them or migrate users. Adoption in Omarchy Mac requires a separate change to the existing ARM preinstall/removal mappings. Do not modify vaults or user configuration as part of the package transaction. diff --git a/tests/obsidian-upstream.py b/pkgbuilds/obsidian/test-upstream.py similarity index 95% rename from tests/obsidian-upstream.py rename to pkgbuilds/obsidian/test-upstream.py index 2638b34..762d68e 100644 --- a/tests/obsidian-upstream.py +++ b/pkgbuilds/obsidian/test-upstream.py @@ -3,7 +3,7 @@ import importlib.util from pathlib import Path import unittest -path = Path(__file__).resolve().parents[1] / 'pkgbuilds/obsidian/.omarchy/upstream.py' +path = Path(__file__).with_name('upstream.py') spec = importlib.util.spec_from_file_location('obsidian_upstream', path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) diff --git a/pkgbuilds/obsidian/.omarchy/upstream.py b/pkgbuilds/obsidian/upstream.py similarity index 100% rename from pkgbuilds/obsidian/.omarchy/upstream.py rename to pkgbuilds/obsidian/upstream.py From 90fee672ce47de5e242804d7be13e2c43d57e9e2 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Thu, 24 Sep 2026 16:05:38 +1000 Subject: [PATCH 19/55] Register 32-bit ARM binfmt rules and keep QEMU changes package-local qemu-binfmt-conf.sh groups arm with aarch64 and skipped it; Apple Silicon has no AArch32 execution, so --ignore-family is needed for ARM32 programs. The bin/sync-upstream extension, its tests and the Tests workflow edit are reverted; QEMU updates become reviewed pins. --- .github/workflows/test.yml | 1 - bin/sync-upstream | 16 +-- .../qemu-user-static/.omarchy/upstream.py | 120 ------------------ .../qemu-user-static/.omarchy/upstream.sh | 3 - pkgbuilds/qemu-user-static/PKGBUILD | 8 +- pkgbuilds/qemu-user-static/README.md | 8 +- tests/qemu-upstream.py | 115 ----------------- 7 files changed, 10 insertions(+), 261 deletions(-) delete mode 100644 pkgbuilds/qemu-user-static/.omarchy/upstream.py delete mode 100644 pkgbuilds/qemu-user-static/.omarchy/upstream.sh delete mode 100644 tests/qemu-upstream.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7bcbb22..29d18b0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -50,7 +50,6 @@ jobs: pacman -Syu --noconfirm git jq python libarchive python tests/oma-service-removal.py python tests/upstream-watch.py - python tests/qemu-upstream.py ./bin/sync-upstream self-test ./bin/sync-rebuilds --self-test ./bin/omarchy-pkgs self-test diff --git a/bin/sync-upstream b/bin/sync-upstream index 360a1b2..2f84506 100755 --- a/bin/sync-upstream +++ b/bin/sync-upstream @@ -31,10 +31,7 @@ pkgbuilds//.omarchy/upstream.sh, a hook that reports JSON on stdout: } Architecture keys become sha256sums_ in the PKGBUILD; the key "any" means -the unsuffixed sha256sums array. An empty object ({}) reports no update. Optional "variables" maps existing -underscore-prefixed release scalars to values containing only letters, digits, -periods, underscores, plus, colon and hyphen. They are verified and written in -the same atomic replacement as pkgver and checksums. +the unsuffixed sha256sums array. An empty object ({}) reports no update. When the reported version is newer than the checked-in one, pkgver and the listed checksum arrays are rewritten and pkgrel is reset to 1. @@ -212,10 +209,6 @@ validate_release() { and (.sha256sums | to_entries | all( .value | type == "array" and length > 0 and all(test("\\A[0-9a-f]{64}\\z")) )) - and (if has("variables") then (.variables | type == "object" and (to_entries | all( - (.key | test("\\A_[a-z][a-z0-9_]*\\z")) and - (.value | type == "string" and test("\\A[A-Za-z0-9._+:-]+\\z")) - ))) else true end) and (if has("published_at") then (.published_at | type == "string" and length > 0) else true end) ' <<<"$release" >/dev/null } @@ -319,13 +312,6 @@ apply_release() { set_pkgbuild_scalar "$scratch" pkgver "$pkgver" || exit 1 set_pkgbuild_scalar "$scratch" pkgrel 1 || exit 1 - local field value - while IFS=$'\t' read -r field value; do - [[ -n "$field" ]] || continue - set_pkgbuild_scalar "$scratch" "$field" "$value" || exit 1 - [[ $(bash -c 'source "$1"; printf "%s" "${!2}"' _ "$scratch" "$field") == "$value" ]] || exit 1 - done < <(jq -r '(.variables // {}) | to_entries[] | [.key, .value] | @tsv' <<<"$release") - verify_pkgbuild "$scratch" "$release" "$pkgver" "${arrays[@]}" || exit 1 ); then rm -f "$scratch" diff --git a/pkgbuilds/qemu-user-static/.omarchy/upstream.py b/pkgbuilds/qemu-user-static/.omarchy/upstream.py deleted file mode 100644 index 341d9c1..0000000 --- a/pkgbuilds/qemu-user-static/.omarchy/upstream.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/env python3 -"""Track Debian 13 ARM64 QEMU revisions, verifying an immutable snapshot first.""" -import functools -import hashlib -import json -import lzma -from pathlib import Path -import re -import subprocess -import sys -import urllib.parse -import urllib.request - -FEEDS = [ - 'https://deb.debian.org/debian/dists/trixie/main/binary-arm64/Packages.xz', - 'https://deb.debian.org/debian/dists/trixie-updates/main/binary-arm64/Packages.xz', - 'https://security.debian.org/debian-security/dists/trixie-security/main/binary-arm64/Packages.xz', -] - -def fetch(url): - with urllib.request.urlopen(url, timeout=120) as response: - if not response.url.startswith('https://'): - raise ValueError('Insecure redirect') - return response.read() - -def parts(version): - match = re.fullmatch(r'(?:(\d+):)?([0-9][A-Za-z0-9.+~]*?)-([A-Za-z0-9.+~]+)', version) - if not match: - raise ValueError('Unsupported Debian version: ' + version) - return int(match[1] or '0'), match[2], match[3] - -def segment_cmp(a, b): - # Debian policy: tilde precedes everything, then end/digits, letters, - # then other characters; digit runs are compared numerically. - def order(c): - if c == '~': return -1 - if not c or c.isdigit(): return 0 - return ord(c) if c.isalpha() else ord(c) + 256 - while a or b: - while (a and not a[0].isdigit()) or (b and not b[0].isdigit()): - x, y = order(a[:1]), order(b[:1]) - if x != y: return (x > y) - (x < y) - a, b = a[1:], b[1:] - x = re.match(r'\d*', a)[0] - y = re.match(r'\d*', b)[0] - nx, ny = int(x or '0'), int(y or '0') - if nx != ny: return (nx > ny) - (nx < ny) - a, b = a[len(x):], b[len(y):] - return 0 - -def compare(a, b): - ea, ua, ra = parts(a) - eb, ub, rb = parts(b) - return (ea > eb) - (ea < eb) or segment_cmp(ua, ub) or segment_cmp(ra, rb) - -def package_version(version): - epoch, upstream, revision = parts(version) - # Stable releases only. Fail visibly on prerelease/repack conventions that - # need a reviewed Arch ordering rather than silently misordering them. - if '~' in version: - raise ValueError('Debian prerelease needs a reviewed Arch version mapping') - return f'{epoch}.{upstream}.{revision}' - -def records(data): - found = [] - for stanza in re.split(r'\n\s*\n', lzma.decompress(data).decode()): - fields = dict(re.findall(r'^([A-Za-z0-9-]+): (.*)$', stanza, re.M)) - if fields.get('Package') != 'qemu-user': continue - if fields.get('Architecture') != 'arm64': raise ValueError('Wrong architecture') - parts(fields['Version']) - if not re.fullmatch(r'[0-9a-f]{64}', fields.get('SHA256', '')): - raise ValueError('Missing/malformed SHA256') - if not re.fullmatch(r'[1-9][0-9]*', fields.get('Size', '')): - raise ValueError('Missing/malformed package size') - found.append(fields) - return found - -def discover(current, current_pkgver, current_hash, get=fetch): - candidates = [row for url in FEEDS for row in records(get(url))] - if not candidates: raise ValueError('No ARM64 qemu-user package in Debian feeds') - selected = max(candidates, key=functools.cmp_to_key(lambda a,b: compare(a['Version'], b['Version']))) - version, checksum = selected['Version'], selected['SHA256'] - if any(row['SHA256'] != checksum for row in candidates if row['Version'] == version): - raise ValueError('Debian feeds disagree on the selected checksum') - ordering = compare(version, current) - if ordering < 0: raise ValueError('Debian feeds are older than the pinned recipe') - if ordering == 0: - if checksum != current_hash: raise ValueError('Checksum changed for the pinned Debian revision') - return {} - pkgver = package_version(version) - if int(subprocess.check_output(['vercmp', pkgver, current_pkgver], text=True)) <= 0: - raise ValueError('New Debian revision does not advance Arch version; review mapping') - api = 'https://snapshot.debian.org/mr/binary/qemu-user/' + urllib.parse.quote(version, safe='') + '/binfiles' - document = json.loads(get(api)) - if document.get('binary') != 'qemu-user' or document.get('binary_version') != version: - raise ValueError('Snapshot revision differs') - hashes = {row['hash'] for row in document['result'] if row['architecture'] == 'arm64'} - if len(hashes) != 1 or not re.fullmatch(r'[0-9a-f]{40}', next(iter(hashes), '')): - raise ValueError('Missing/ambiguous ARM64 snapshot') - snapshot = hashes.pop() - archive = get('https://snapshot.debian.org/file/' + snapshot) - if len(archive) != int(selected['Size']) or hashlib.sha256(archive).hexdigest() != checksum or hashlib.sha1(archive).hexdigest() != snapshot: - raise ValueError('Snapshot bytes differ from Debian package metadata') - return {'pkgver': pkgver, 'variables': {'_debver': version, '_snapshot': snapshot}, - 'sha256sums': {'aarch64': [checksum]}} - -def main(): - recipe = Path('PKGBUILD').read_text() - def scalar(name): - match = re.search(r'^' + name + r'=[\"\']?([^\"\'\n]+)', recipe, re.M) - if not match: raise ValueError('Missing recipe scalar: ' + name) - return match[1] - checksum = re.search(r"^sha256sums_aarch64=\('([a-f0-9]{64})'\)", recipe, re.M) - if not checksum: raise ValueError('Missing current ARM checksum') - print(json.dumps(discover(scalar('_debver'), scalar('pkgver'), checksum[1]))) - -if __name__ == '__main__': - try: main() - except Exception as error: - sys.exit('QEMU Debian update failed: ' + str(error)) diff --git a/pkgbuilds/qemu-user-static/.omarchy/upstream.sh b/pkgbuilds/qemu-user-static/.omarchy/upstream.sh deleted file mode 100644 index 829dbc9..0000000 --- a/pkgbuilds/qemu-user-static/.omarchy/upstream.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -set -euo pipefail -exec python3 .omarchy/upstream.py diff --git a/pkgbuilds/qemu-user-static/PKGBUILD b/pkgbuilds/qemu-user-static/PKGBUILD index 22b64cc..8d983a8 100644 --- a/pkgbuilds/qemu-user-static/PKGBUILD +++ b/pkgbuilds/qemu-user-static/PKGBUILD @@ -6,7 +6,8 @@ pkgbase=qemu-user-static pkgname=('qemu-user-static' 'qemu-user-static-binfmt') # One-time epoch moves from upstream-only to full Debian revision ordering. -# pkgver records Debian epoch.upstream.revision; updates also verify vercmp. +# pkgver records Debian epoch.upstream.revision. Updates are reviewed pins: +# bump _debver, pkgver, _snapshot and the checksum together. epoch=1 pkgver=1.10.0.13+ds.0+deb13u1 _debver=1:10.0.13+ds-0+deb13u1 @@ -55,13 +56,16 @@ package_qemu-user-static-binfmt() { install -dm755 "$pkgdir/usr/lib/binfmt.d" # HOST_ARCH keeps the native architecture out of the rule set regardless # of the build host, so the package is identical under native and QEMU builds. + # --ignore-family keeps 32-bit ARM: the script groups it with aarch64, but + # Apple Silicon cannot execute AArch32 natively. HOST_ARCH=aarch64 sh "$srcdir/qemu-binfmt-conf.sh" \ --systemd ALL \ --exportdir "$pkgdir/usr/lib/binfmt.d/" \ --qemu-path /usr/bin \ --qemu-suffix -static \ --persistent yes \ - --preserve-argv0 yes + --preserve-argv0 yes \ + --ignore-family yes local conf for conf in "$pkgdir"/usr/lib/binfmt.d/*.conf; do mv "$conf" "${conf%.conf}-static.conf" diff --git a/pkgbuilds/qemu-user-static/README.md b/pkgbuilds/qemu-user-static/README.md index d30002c..f487ccd 100644 --- a/pkgbuilds/qemu-user-static/README.md +++ b/pkgbuilds/qemu-user-static/README.md @@ -4,10 +4,8 @@ This aarch64-only split recipe provides qemu-user-static and qemu-user-static-bi ## Updates -The package-local upstream hook checks Debian 13 (trixie), trixie-updates, and trixie-security ARM64 indexes. It compares full Debian versions, including epochs, security revisions and binary rebuilds, and resolves the selected binary through snapshot.debian.org’s API. The immutable content-addressed archive must match the index’s size and SHA256 as well as the snapshot SHA1 before an update is returned. +Updates are reviewed pins, not automatic. To move to a new Debian 13 revision, update `_debver`, `pkgver` (Debian epoch.upstream.revision), `_snapshot` (the snapshot.debian.org SHA1 of the ARM64 `qemu-user` archive) and `sha256sums_aarch64` together, and confirm both Debian ordering and `vercmp` advance. A one-time Arch epoch of 1 moves away from the previous upstream-only version. -A one-time Arch epoch of 1 moves away from the previous upstream-only version. pkgver encodes Debian epoch.upstream.revision. The hook requires both Debian ordering and pacman vercmp to advance; unfamiliar prerelease conventions or ordering discrepancies fail for manual review. Debian distribution upgrades are explicit recipe changes, not automatic jumps to testing/unstable. +## binfmt rules -The existing six-hour upstream update PR workflow discovers the hook. Its pkgver, _debver, _snapshot and ARM checksum are applied atomically through the normal sync interface. Repeated checks are idempotent. Feed failures, malformed metadata, conflicting checksums and unavailable/corrupt snapshots fail visibly before recipe mutation. No update installs packages or registers binfmt rules. - -Offline fixtures cover version/epoch/security/binNMU updates, security-feed selection, unchanged versions, metadata and snapshot failures, atomic application, and hostile/missing scalar rejection. Existing GUI-independent VM qualification and packaging evidence are recorded in the PR; new binaries still receive build and runtime checks before publication. +The rules are generated with `--ignore-family yes`, so 32-bit ARM binaries are registered even though the script groups them with aarch64; Apple Silicon has no AArch32 execution. Native aarch64 stays excluded. Rules use the persistent and preserve-argv0 flags and never the credential flag. diff --git a/tests/qemu-upstream.py b/tests/qemu-upstream.py deleted file mode 100644 index 30a54a2..0000000 --- a/tests/qemu-upstream.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python3 -import hashlib -import importlib.util -import json -import lzma -import re -from pathlib import Path -import subprocess -import tempfile -import unittest -from unittest.mock import patch - -ROOT = Path(__file__).resolve().parents[1] -PACKAGE = ROOT / 'pkgbuilds/qemu-user-static' -spec = importlib.util.spec_from_file_location('qemu', PACKAGE / '.omarchy/upstream.py') -q = importlib.util.module_from_spec(spec) -spec.loader.exec_module(q) -CURRENT = '1:10.0.11+ds-0+deb13u1+b1' - -class Updates(unittest.TestCase): - def fixtures(self, version): - blob = b'fixture package bytes' - sha = hashlib.sha256(blob).hexdigest() - snap = hashlib.sha1(blob).hexdigest() - row = f'Package: qemu-user\nArchitecture: arm64\nVersion: {version}\nSHA256: {sha}\nSize: {len(blob)}\n' - feeds = {url: lzma.compress(row.encode()) for url in q.FEEDS} - def get(url): - if url in feeds: return feeds[url] - if '/mr/' in url: - return json.dumps({'binary':'qemu-user', 'binary_version':version, - 'result':[{'architecture':'arm64','hash':snap}]}).encode() - return blob - return get, feeds, sha - - def test_versions(self): - for old, new in [(CURRENT,'1:10.0.11+ds-0+deb13u1+b2'), - (CURRENT,'1:10.0.11+ds-0+deb13u2'), - (CURRENT,'1:10.0.12+ds-1'), - (CURRENT,'2:9.0.0+ds-1')]: - with self.subTest(new=new): - get,_,_=self.fixtures(new) - result=q.discover(old,q.package_version(old),'0'*64,get) - self.assertEqual(result['variables']['_debver'],new) - self.assertGreater(q.compare(new,old),0) - self.assertLess(q.compare('1:10.0~rc1-1','1:10.0-1'),0) - self.assertLess(q.compare('1:10.0-2','1:10.0-10'),0) - - def test_security_wins(self): - newer='1:10.0.11+ds-0+deb13u2' - get,feeds,_=self.fixtures(newer) - _,oldfeeds,_=self.fixtures(CURRENT) - feeds[q.FEEDS[0]]=oldfeeds[q.FEEDS[0]] - self.assertEqual(q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get)['variables']['_debver'],newer) - - def test_unchanged(self): - get,_,sha=self.fixtures(CURRENT) - self.assertEqual(q.discover(CURRENT,q.package_version(CURRENT),sha,get),{}) - with self.assertRaisesRegex(ValueError,'Checksum changed'): - q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get) - - def test_bad_metadata(self): - get,feeds,_=self.fixtures('1:10.0.12+ds-1') - feeds[q.FEEDS[0]]=lzma.compress(b'Package: qemu-user\nArchitecture: arm64\nVersion: invalid\n') - with self.assertRaises(ValueError): q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get) - - def test_snapshot_failures(self): - for failure in ['missing','bytes','metadata']: - get,_,_=self.fixtures('1:10.0.12+ds-1') - def bad(url): - if '/file/' in url: - if failure=='missing': raise OSError('unavailable snapshot') - if failure=='bytes': return b'corrupt' - if '/mr/' in url and failure=='metadata': return b'{}' - return get(url) - with self.subTest(failure=failure), self.assertRaises((ValueError,OSError)): - q.discover(CURRENT,q.package_version(CURRENT),'0'*64,bad) - - def sync(self, recipe, release): - with tempfile.TemporaryDirectory() as tmp: - p=Path(tmp)/'fixture'; (p/'.omarchy').mkdir(parents=True) - (p/'PKGBUILD').write_text(recipe) - (p/'.omarchy/package.json').write_text('{"source":"local"}') - (p/'.omarchy/upstream.sh').write_text("#!/bin/bash\ncat <<'JSON'\n"+json.dumps(release)+"\nJSON\n") - # Load production functions, excluding only the command dispatch. - prefix=(ROOT/'bin/sync-upstream').read_text().split('if [[ ${#SPECIFIC_PACKAGES[@]} -gt 0 &&')[0] - prefix=prefix.replace('BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..")', 'BUILD_ROOT='+str(ROOT)) - command=prefix+'\nPKGBUILDS_DIR='+tmp+'\nSPECIFIC_MODE=true\nsync_package fixture\n((FAILED == 0))\n' - result=subprocess.run(['bash','-c',command],capture_output=True,text=True) - return result,(p/'PKGBUILD').read_text() - - def test_atomic_sync_and_idempotence(self): - get,_,_=self.fixtures('1:10.0.11+ds-0+deb13u2') - release=q.discover(CURRENT,q.package_version(CURRENT),'0'*64,get) - before=(PACKAGE/'PKGBUILD').read_text() - before=re.sub(r'^pkgver=.*$', 'pkgver='+q.package_version(CURRENT), before, flags=re.M) - before=re.sub(r'^_debver=.*$', '_debver='+CURRENT, before, flags=re.M) - result,after=self.sync(before,release) - self.assertEqual(result.returncode,0,result.stdout+result.stderr) - self.assertIn('_debver='+release['variables']['_debver'],after) - self.assertIn('_snapshot='+release['variables']['_snapshot'],after) - self.assertIn(release['sha256sums']['aarch64'][0],after) - result,again=self.sync(after,release) - self.assertEqual(result.returncode,0,result.stdout+result.stderr) - self.assertEqual(again,after) - - def test_invalid_variables_leave_recipe_unchanged(self): - before=(PACKAGE/'PKGBUILD').read_text() - for variables in [{'_debver':'$(touch /tmp/qemu-injection)'}, {'pkgver':'2'}, - {'_absent':'1'}, {'_snapshot':'abc\ncommand'}, {'_snapshot':'https://bad'}]: - with self.subTest(variables=variables): - result,after=self.sync(before,{'pkgver':'99','variables':variables,'sha256sums':{'aarch64':['a'*64]}}) - self.assertNotEqual(result.returncode,0) - self.assertEqual(before,after) - -if __name__=='__main__': unittest.main() From 619b36b3a62c63a539b73c52dcfd72ce9aa6f592 Mon Sep 17 00:00:00 2001 From: Tom Ballard Date: Thu, 24 Sep 2026 12:06:24 +0100 Subject: [PATCH 20/55] Update Task Manager to first non-preview v0.1.0 --- pkgbuilds/omarchy-task-manager/PKGBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/omarchy-task-manager/PKGBUILD b/pkgbuilds/omarchy-task-manager/PKGBUILD index c84656f..2a860f6 100644 --- a/pkgbuilds/omarchy-task-manager/PKGBUILD +++ b/pkgbuilds/omarchy-task-manager/PKGBUILD @@ -1,10 +1,10 @@ # Canonical recipe. scripts/package-source.sh fills the release source checksum. # Maintainer: Tom Ballard (tcballard) pkgname=omarchy-task-manager -pkgver=0.0.5 +pkgver=0.1.0 pkgrel=1 url='https://github.com/tcballard/omarchy-task-manager' -pkgdesc='Floating native task manager for Omarchy (preview)' +pkgdesc='Floating native task manager for Omarchy' arch=('x86_64') license=('MIT') depends=('qt6-base' 'qt6-declarative' 'qt6-wayland' 'qt6-svg' 'hicolor-icon-theme' 'gcc-libs' 'glibc' 'glib2' 'systemd' 'coreutils') @@ -12,7 +12,7 @@ optdepends=('gdb: live process core dumps' 'nvidia-utils: NVIDIA device telemetr makedepends=('cmake' 'ninja' 'rust' 'cargo') checkdepends=('python' 'desktop-file-utils') source=("$url/releases/download/v$pkgver/$pkgname-$pkgver.tar.gz") -sha256sums=('f2ae4dd058883fdaa7d159364e2a533761c7acd9cd1380b5f1b39e291815247f') +sha256sums=('4a125866f78536c366d021663cc609d1f1ae7c0df95aa7c0b189c330f4041269') build() { cmake -S "$srcdir/$pkgname-$pkgver" -B build -G Ninja \ From 04dd3e8b6862a6c9046bc2da027df0f5fc7b82f8 Mon Sep 17 00:00:00 2001 From: Jankees van Woezik Date: Thu, 24 Sep 2026 20:17:02 +0200 Subject: [PATCH 21/55] Add Meeting Recorder --- .../.omarchy/package.json | 11 +++++++ .../omarchy-meeting-recorder-bin/PKGBUILD | 31 +++++++++++++++++++ .../omarchy-meeting-recorder.install | 22 +++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 pkgbuilds/omarchy-meeting-recorder-bin/.omarchy/package.json create mode 100644 pkgbuilds/omarchy-meeting-recorder-bin/PKGBUILD create mode 100644 pkgbuilds/omarchy-meeting-recorder-bin/omarchy-meeting-recorder.install diff --git a/pkgbuilds/omarchy-meeting-recorder-bin/.omarchy/package.json b/pkgbuilds/omarchy-meeting-recorder-bin/.omarchy/package.json new file mode 100644 index 0000000..743b87f --- /dev/null +++ b/pkgbuilds/omarchy-meeting-recorder-bin/.omarchy/package.json @@ -0,0 +1,11 @@ +{ + "source": "local", + "min_release_age": "24h", + "upstream": { + "github": "jankeesvw/omarchy-meeting-recorder", + "digests": true, + "assets": { + "x86_64": "omarchy-meeting-recorder-{pkgver}-x86_64-linux.tar.gz" + } + } +} diff --git a/pkgbuilds/omarchy-meeting-recorder-bin/PKGBUILD b/pkgbuilds/omarchy-meeting-recorder-bin/PKGBUILD new file mode 100644 index 0000000..d19ecb9 --- /dev/null +++ b/pkgbuilds/omarchy-meeting-recorder-bin/PKGBUILD @@ -0,0 +1,31 @@ +# Maintainer: Jankees van Woezik + +pkgname=omarchy-meeting-recorder-bin +_name=omarchy-meeting-recorder +pkgver=1.0.2 +pkgrel=1 +pkgdesc="Meeting Recorder for Omarchy: record the mic and the computer audio, transcribed on your own machine with speakers, chapters and a player" +arch=('x86_64') +url="https://github.com/jankeesvw/omarchy-meeting-recorder" +license=('MIT') +depends=('gtk4' 'libadwaita' 'glib2' 'pango' 'cairo' 'graphene' 'libgcc' 'libstdc++' 'glibc' 'libpulse' 'ffmpeg') +optdepends=('quickshell: the bar widget, part of every Omarchy install' + 'perl-file-mimeinfo: open .meeting-recorder files with xdg-open, not only from Nautilus') +provides=("$_name") +conflicts=("$_name") +install="$_name.install" +options=('!debug') +source_x86_64=("$url/releases/download/v$pkgver/$_name-$pkgver-x86_64-linux.tar.gz") +sha256sums_x86_64=('78746ecc90366f12f308801637b98fc5e5b844bb28ba413e50ed3efe5c24079f') + +package() { + cd "$_name-$pkgver" + install -Dm755 "$_name" "$pkgdir/usr/bin/$_name" + install -Dm644 "data/$_name.desktop" "$pkgdir/usr/share/applications/$_name.desktop" + install -Dm644 "data/$_name.xml" "$pkgdir/usr/share/mime/packages/$_name.xml" + # The bar widget, to link into ~/.config/omarchy/plugins (see the install message). + install -Dm644 plugin/manifest.json "$pkgdir/usr/share/$_name/plugin/manifest.json" + install -Dm644 plugin/Widget.qml "$pkgdir/usr/share/$_name/plugin/Widget.qml" + install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" + install -Dm644 README.md "$pkgdir/usr/share/doc/$pkgname/README.md" +} diff --git a/pkgbuilds/omarchy-meeting-recorder-bin/omarchy-meeting-recorder.install b/pkgbuilds/omarchy-meeting-recorder-bin/omarchy-meeting-recorder.install new file mode 100644 index 0000000..1121fc4 --- /dev/null +++ b/pkgbuilds/omarchy-meeting-recorder-bin/omarchy-meeting-recorder.install @@ -0,0 +1,22 @@ +post_install() { + cat <<'MSG' +Meeting Recorder is installed; open it from the launcher. + +The first time you open it, it offers to put its widget in the bar +(a live waveform while you record). + +Optional, per user: + + A floating window, in ~/.config/hypr (Omarchy Quattro, Lua): + o.window("^com\\.jankeesvw\\.OmarchyMeetingRecorder$", { float = true }) + o.window("^com\\.jankeesvw\\.OmarchyMeetingRecorder$", { size = { 480, 700 } }) + o.window("^com\\.jankeesvw\\.OmarchyMeetingRecorder$", { center = true }) + +The speech model (about 1.6 GB) is downloaded on first use, or taken from +voxtype when it already has it. +MSG +} + +post_upgrade() { + : +} From 0a16d437cca2df6bfa1818a9f08e4dc2d34e918b Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:15:50 +1000 Subject: [PATCH 22/55] linux-aurora: drop the generic linux provide and ship on edge only The kernel provided linux=, so on any aarch64 root with the omarchy repo listed before core, a dependency on linux resolved to this Apple-only kernel instead of ALARM's linux-aarch64. linux-asahi and WIREGUARD-MODULE stay. Channel membership narrows to edge until M1 and M2 cold-boot qualification; promotion widens it again. pkgrel moves to 10 because 7.1.12.aurora2-9 is already published and a filename is immutable. --- pkgbuilds/linux-aurora/.omarchy/package.json | 3 +-- pkgbuilds/linux-aurora/PKGBUILD | 10 ++++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pkgbuilds/linux-aurora/.omarchy/package.json b/pkgbuilds/linux-aurora/.omarchy/package.json index 7336e72..04e6ea9 100644 --- a/pkgbuilds/linux-aurora/.omarchy/package.json +++ b/pkgbuilds/linux-aurora/.omarchy/package.json @@ -1,6 +1,5 @@ { "source": "local", "skip_build": true, - "release_ring": "fast", - "channels": ["edge", "rc"] + "channels": ["edge"] } diff --git a/pkgbuilds/linux-aurora/PKGBUILD b/pkgbuilds/linux-aurora/PKGBUILD index 129c807..43adff7 100644 --- a/pkgbuilds/linux-aurora/PKGBUILD +++ b/pkgbuilds/linux-aurora/PKGBUILD @@ -5,12 +5,12 @@ # alt-mode and USB4 support for external monitors, variable refresh rate, and # the ISP and AOP drivers. Those changes touch device trees, the type-C stack # and DRM, so they cannot ship as a module: this is a whole alternative kernel -# for Macs on the Omarchy edge and rc channels. The stable channel keeps -# asahi-alarm's linux-asahi. +# for Macs on the Omarchy edge channel. It reaches rc and stable only after +# cold-boot qualification on M1 and M2. _auroraver=7.1.12 _aurorarel=2 -pkgrel=9 +pkgrel=10 # Immutable pin on aurora-silicon/linux (branch aurora-wip). Every bump is a # PR that moves _commit and the archive checksum; the pinned commit is cold-boot @@ -88,7 +88,9 @@ _package_kernel() { depends=(coreutils kmod initramfs $2 "m1n1>=$_m1n1_version") optdepends=('crda: to set the correct wireless channels of your country' 'linux-firmware: firmware images needed for some devices') - provides=(WIREGUARD-MODULE linux=${pkgver} linux-asahi=${pkgver}) + # No generic linux provide: on a shared aarch64 repository it would compete + # with linux-aarch64 for any dependency on linux. + provides=(WIREGUARD-MODULE linux-asahi=${pkgver}) replaces=(wireguard-arch) conflicts=(linux-asahi) From d7906a4b1a8a0405725db0db2710b4cce31b2ebc Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:26:11 +1000 Subject: [PATCH 23/55] Add m1n1-aurora and the silent uboot-asahi for Apple Silicon, aarch64 and edge only Ported from the asahi-quattro lane. Both are pinned by hand like linux-aurora and restricted to aarch64 and the edge channel from their first merge, since merging publishes. pkgrel sits one above the fork lanes' builds so the same filename never carries two sets of bytes. --- pkgbuilds/m1n1-aurora/.omarchy/package.json | 4 + pkgbuilds/m1n1-aurora/PKGBUILD | 54 ++ pkgbuilds/m1n1-aurora/README.md | 13 + .../m1n1-aurora/aurora-cio-aliases.patch | 28 + pkgbuilds/m1n1-aurora/bootlogo_128.bin | Bin 0 -> 65536 bytes pkgbuilds/m1n1-aurora/bootlogo_256.bin | 1 + pkgbuilds/m1n1-aurora/bootlogo_48.bin | Bin 0 -> 9216 bytes pkgbuilds/uboot-asahi/.omarchy/package.json | 4 + ...r-fix-booting-on-a-number-of-devices.patch | 27 + .../Fix-NVMe-not-only-on-Raspberry-Pi-5.patch | 738 +++++++++++++++ ...nTX2-Fix-upstream-device-tree-naming.patch | 50 + pkgbuilds/uboot-asahi/PKGBUILD | 162 ++++ .../USB-PD-TCPM-improvements.patch | 717 +++++++++++++++ .../uboot-asahi/disable-VBE-by-default.patch | 32 + .../enable-bootmenu-by-default.patch | 49 + pkgbuilds/uboot-asahi/openssl-no-engine.patch | 178 ++++ pkgbuilds/uboot-asahi/p3450-fix-board.patch | 25 + ...d-SWIG-Python-2-compatibility-macros.patch | 234 +++++ pkgbuilds/uboot-asahi/quiet-console.patch | 40 + ...rrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch | 32 + ...hip-Enable-preboot-start-for-pci-usb.patch | 860 ++++++++++++++++++ ...nanopi-r5-Drop-duplicated-extra-sdhc.patch | 39 + ...6x-Stop-overriding-sdhci-mmc-aliases.patch | 33 + ...ll-options-for-EFI-System-Partitions.patch | 57 ++ ...DT-from-any-partition-on-boot-device.patch | 87 ++ ...-SetVariableRT-with-volotile-storage.patch | 33 + .../uefi-enable-https-boot-by-default.patch | 82 ++ ..._location-for-finding-the-DT-on-disk.patch | 190 ++++ 28 files changed, 3769 insertions(+) create mode 100644 pkgbuilds/m1n1-aurora/.omarchy/package.json create mode 100644 pkgbuilds/m1n1-aurora/PKGBUILD create mode 100644 pkgbuilds/m1n1-aurora/README.md create mode 100644 pkgbuilds/m1n1-aurora/aurora-cio-aliases.patch create mode 100644 pkgbuilds/m1n1-aurora/bootlogo_128.bin create mode 100644 pkgbuilds/m1n1-aurora/bootlogo_256.bin create mode 100644 pkgbuilds/m1n1-aurora/bootlogo_48.bin create mode 100644 pkgbuilds/uboot-asahi/.omarchy/package.json create mode 100644 pkgbuilds/uboot-asahi/Allwinner-fix-booting-on-a-number-of-devices.patch create mode 100644 pkgbuilds/uboot-asahi/Fix-NVMe-not-only-on-Raspberry-Pi-5.patch create mode 100644 pkgbuilds/uboot-asahi/JetsonTX2-Fix-upstream-device-tree-naming.patch create mode 100644 pkgbuilds/uboot-asahi/PKGBUILD create mode 100644 pkgbuilds/uboot-asahi/USB-PD-TCPM-improvements.patch create mode 100644 pkgbuilds/uboot-asahi/disable-VBE-by-default.patch create mode 100644 pkgbuilds/uboot-asahi/enable-bootmenu-by-default.patch create mode 100644 pkgbuilds/uboot-asahi/openssl-no-engine.patch create mode 100644 pkgbuilds/uboot-asahi/p3450-fix-board.patch create mode 100644 pkgbuilds/uboot-asahi/pylibfdt-Replace-removed-SWIG-Python-2-compatibility-macros.patch create mode 100644 pkgbuilds/uboot-asahi/quiet-console.patch create mode 100644 pkgbuilds/uboot-asahi/raspberrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch create mode 100644 pkgbuilds/uboot-asahi/rockchip-Enable-preboot-start-for-pci-usb.patch create mode 100644 pkgbuilds/uboot-asahi/rockchip-rk3568-nanopi-r5-Drop-duplicated-extra-sdhc.patch create mode 100644 pkgbuilds/uboot-asahi/rockchip-rk356x-Stop-overriding-sdhci-mmc-aliases.patch create mode 100644 pkgbuilds/uboot-asahi/uefi-Add-all-options-for-EFI-System-Partitions.patch create mode 100644 pkgbuilds/uboot-asahi/uefi-distro-load-FDT-from-any-partition-on-boot-device.patch create mode 100644 pkgbuilds/uboot-asahi/uefi-enable-SetVariableRT-with-volotile-storage.patch create mode 100644 pkgbuilds/uboot-asahi/uefi-enable-https-boot-by-default.patch create mode 100644 pkgbuilds/uboot-asahi/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch diff --git a/pkgbuilds/m1n1-aurora/.omarchy/package.json b/pkgbuilds/m1n1-aurora/.omarchy/package.json new file mode 100644 index 0000000..2537ec0 --- /dev/null +++ b/pkgbuilds/m1n1-aurora/.omarchy/package.json @@ -0,0 +1,4 @@ +{ + "source": "local", + "channels": ["edge"] +} diff --git a/pkgbuilds/m1n1-aurora/PKGBUILD b/pkgbuilds/m1n1-aurora/PKGBUILD new file mode 100644 index 0000000..b115039 --- /dev/null +++ b/pkgbuilds/m1n1-aurora/PKGBUILD @@ -0,0 +1,54 @@ +# m1n1 for linux-aurora. Aurora's device trees name the USB4 aliases +# usb4-N-acio, usb4-N-nhi and usb4-N-pcie-adapter; m1n1 v1.6.1 only looks up +# the usb4_N_* names, so without the alias fallback the USB4 tunables are +# never applied. The Asahi m1n1 stays with linux-asahi. +pkgname=m1n1-aurora +pkgver=1.6.1.aurora1 +pkgrel=3 +pkgdesc='Omarchy Aurora m1n1 with compatible USB4 tunable aliases' +arch=('aarch64') +url='https://github.com/aurora-silicon/m1n1' +license=('MIT' 'CC0-1.0' 'OFL-1.1-RFN' 'Zlib' 'BSD-2-Clause OR GPL-2.0-or-later' 'BSD-3-Clause OR GPL-2.0-or-later' 'MIT OR Apache-2.0') +provides=("m1n1=$pkgver") +conflicts=('m1n1') +makedepends=('clang' 'lld' 'llvm' 'rustup' 'make' 'patch') +options=('!strip' '!debug') +_commit=06a4601a351ebfd1abb6abba9a44c34e40d94776 +source=("m1n1-${_commit}.tar.gz::https://github.com/aurora-silicon/m1n1/archive/${_commit}.tar.gz" + aurora-cio-aliases.patch + bootlogo_48.bin + bootlogo_128.bin + bootlogo_256.bin +) +sha256sums=('9d6972d3edaff856e985f2b1feb64fcf9b42fc5eecda7be64a242b49bbbe636d' + '4345a4e431642c4316595bdf023bc67d5c72e0374f3c8d59be81318710138f32' + '6668050653645711ad7523fe2abeb4cbe85a92c875f3eec754b6db23cea2191c' + 'b19cb017645c7a9068ea0be9b6bb394131d7ca11b28093cf6caa1ffca74b0a4e' + '9c659b392aacfa31c62c638003d2257abfdbe17919b5c90cde4c4e62f87addab') + +prepare() { + cd "m1n1-$_commit" + patch -p1 < "$srcdir/aurora-cio-aliases.patch" + for size in 48 128 256; do + cp "$srcdir/bootlogo_$size.bin" "data/bootlogo_$size.bin" + done + rustup toolchain install 1.89.0 --profile minimal --target aarch64-unknown-none-softfloat +} + +build() { + cd "m1n1-$_commit" + RUSTUP_TOOLCHAIN=1.89.0 make RELEASE=1 USE_CLANG=1 ARCH=aarch64-linux-gnu \ + M1N1_VERSION_TAG=v1.6.1-omarchy.aurora1 +} + +package() { + # asahi-scripts (update-m1n1 and its pacman hook) only exists in the + # asahi-alarm repository, which the builder does not configure. Declared + # here so makepkg does not try to install it at build time. + depends=('asahi-scripts>=20260127.1') + + cd "m1n1-$_commit" + install -Dm644 build/m1n1.bin "$pkgdir/usr/lib/asahi-boot/m1n1.bin" + install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE" + install -m644 3rdparty_licenses/* "$pkgdir/usr/share/licenses/$pkgname/" +} diff --git a/pkgbuilds/m1n1-aurora/README.md b/pkgbuilds/m1n1-aurora/README.md new file mode 100644 index 0000000..29fd79d --- /dev/null +++ b/pkgbuilds/m1n1-aurora/README.md @@ -0,0 +1,13 @@ +# m1n1-aurora + +m1n1 v1.6.1 from aurora-silicon/m1n1 (06a4601a351ebfd1abb6abba9a44c34e40d94776) with RC, NHI and PCIe adapter alias fallbacks for the USB4 tunables, plus the Omarchy boot logos. Aurora's device trees name those aliases `usb4-N-acio`, `usb4-N-nhi` and `usb4-N-pcie-adapter`; stock m1n1 only looks up the `usb4_N_*` names. Latest Aurora m1n1 main is not qualified. + +## Pairing with linux-aurora + +- It provides `m1n1=1.6.1.aurora1`, which satisfies linux-aurora's `m1n1>=1.6.1`, and conflicts with asahi-alarm's `m1n1`. pacman prefers a package literally named `m1n1` over a provider, so an Aurora transaction names `m1n1-aurora` explicitly. +- It owns `/usr/lib/asahi-boot/m1n1.bin`. asahi-scripts' `95-m1n1-install.hook` runs `update-m1n1` when that file, `/usr/lib/modules/*/dtbs/*` or U-Boot changes. `update-m1n1` writes m1n1, the device trees and gzipped U-Boot into `m1n1/boot.bin` on the system ESP. asahi-alarm's default takes the device trees from the newest `/lib/modules/*-ARCH/dtbs`, which is where linux-aurora installs its Apple DTBs. `/etc/default/update-m1n1` overrides are left alone. +- Raising linux-aurora's `_m1n1_version` above 1.6.1 needs an m1n1-aurora whose provided version satisfies it, released first. + +## Qualification + +Each bump is cold-boot qualified on the M1 Pro and M2 Max: package installation, the hook rebuilding `boot.bin`, the logo, physical boot and two external displays. A successful build is not hardware acceptance. diff --git a/pkgbuilds/m1n1-aurora/aurora-cio-aliases.patch b/pkgbuilds/m1n1-aurora/aurora-cio-aliases.patch new file mode 100644 index 0000000..13ead3b --- /dev/null +++ b/pkgbuilds/m1n1-aurora/aurora-cio-aliases.patch @@ -0,0 +1,28 @@ +diff --git a/src/kboot.c b/src/kboot.c +index a5bd4f1..1089666 100644 +--- a/src/kboot.c ++++ b/src/kboot.c +@@ -1249,17 +1249,23 @@ static int dt_set_acio_tunables(void) + + memset(fdt_alias, 0, sizeof(fdt_alias)); + snprintf(fdt_alias, sizeof(fdt_alias), "usb4_%d_rc", i); ++ if (!fdt_get_alias(dt, fdt_alias)) ++ snprintf(fdt_alias, sizeof(fdt_alias), "usb4-%d-acio", i); + dt_copy_acio_tunables(adt_path, fdt_alias, usb4_rc_tunables, + sizeof(usb4_rc_tunables) / sizeof(*usb4_rc_tunables)); + + memset(fdt_alias, 0, sizeof(fdt_alias)); + snprintf(fdt_alias, sizeof(fdt_alias), "usb4_%d_pcie_adapter", i); ++ if (!fdt_get_alias(dt, fdt_alias)) ++ snprintf(fdt_alias, sizeof(fdt_alias), "usb4-%d-pcie-adapter", i); + dt_copy_acio_tunables(adt_path, fdt_alias, usb4_pcie_adapter_tunables, + sizeof(usb4_pcie_adapter_tunables) / + sizeof(*usb4_pcie_adapter_tunables)); + + memset(fdt_alias, 0, sizeof(fdt_alias)); + snprintf(fdt_alias, sizeof(fdt_alias), "usb4_%d_nhi", i); ++ if (!fdt_get_alias(dt, fdt_alias)) ++ snprintf(fdt_alias, sizeof(fdt_alias), "usb4-%d-nhi", i); + dt_copy_acio_tunables(adt_path, fdt_alias, usb4_nhi_tunables, + sizeof(usb4_nhi_tunables) / sizeof(*usb4_nhi_tunables)); + dt_copy_usb4_drom(adt_path, fdt_alias); diff --git a/pkgbuilds/m1n1-aurora/bootlogo_128.bin b/pkgbuilds/m1n1-aurora/bootlogo_128.bin new file mode 100644 index 0000000000000000000000000000000000000000..861627294296d8f2ecbf8912af89740af7962bf8 GIT binary patch literal 65536 zcmeI4F^(Kb3>JoOuy0`Bz`lWf1N#Q{4eT4(H?VJD-@xcM@Z-mi-=Fdy{ax3m?D^V*cD4E> zCX;sE`+xtt@4f$QCVT(A|EIhG`{z6PK843?kKOhA@AoqKVlwHi)7{_tBqoz~eczXU z5)=CVU(#vUN-vnuEJepF<5o{K?@12rTInYtLJpi;(OY)(r?UKbi6WX z=c?xkIkan~7rW9dMaL`SR!=qWNe=B==_fP3zol8;zSEz#dQRsozNcL){l=_C$18(& zHa(QF`k()gO~KS;7!Td1$e@mCdco9W7!R>8GN@ykUNAKo#zX9j4CX@b%OihOI5c?v7I;QCb zQHW13ztH5tZ3?28QQn5Gv@O@{Fh`yzunrs)M!lVLo> zzQ~}CX?nrbWEc;zFEXfOnqDw98OB5Giwx?RrWZ_2hVc;lB7-`n=>=1hVLZgX$e@mC zdco9W7!R>8GN@ykUNAKo#zX9j4CX@b%OihOI5c?v7I;QCbQH zW13ztH5tZ3?28QQn5Gv@O@{Fh`yzunrs)M!lVLo>zQ~}CX?nrbWEc;zFEXfOnqDw9 z8OB5Giwx?RrWZ_2hVc;lB7-`n=>=1hVLZgX$e@mCdco9W-11Dj-|4>QF4SQ%Zh2_d z)t~$CzZ7p|@B8O{iHBicWSE}9L$j{_=ld|siJ8f`<)K+u-}~ zb@i{?zgU>N5Hpi;%R{rS{@nZ1ZOj{@jMex4`v$(=K=C_eGK`1rQe;raG`(PIGK`1V z7a7zsO)r?54C5j8MFw?D(+j31!+3~&kwG2P^n$6$FdkxGWKhR6yrY6I9h<%Yk9nrY6I9h<%Yk9n(c~r=6cP>**}CtJP2E zc+&T@^OI&horQL_`so}``kr=v(yXVm(5_ZLo#RR0)6P$t^>h~6b@lIm-(r|Ax9{9O zg~{Ikb8ly()YIi=55X0_WqxH+r9tn+wT4M{`3Z>{rUet Dh(C}F literal 0 HcmV?d00001 diff --git a/pkgbuilds/m1n1-aurora/bootlogo_256.bin b/pkgbuilds/m1n1-aurora/bootlogo_256.bin new file mode 100644 index 0000000..72508c6 --- /dev/null +++ b/pkgbuilds/m1n1-aurora/bootlogo_256.bin @@ -0,0 +1 @@ +žÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿžÎjÿ \ No newline at end of file diff --git a/pkgbuilds/m1n1-aurora/bootlogo_48.bin b/pkgbuilds/m1n1-aurora/bootlogo_48.bin new file mode 100644 index 0000000000000000000000000000000000000000..5051bb912c0c4a16ab77b2a69f9a9daed0afcb0e GIT binary patch literal 9216 zcmeI1L2ko93wX3&d_iInx&H2iVD|i3L{=BENaOe4VS-!vW?RZvqU(LOH#k(E8v-0hDR(D^` zy?e#G9lo>j?RZvqU(LOH#k(E8v+{KwYYAREIt4)2YY9#+=uBo6JCC&lpLE0PUd%vi2~IBPOlB23kF^A! zbi?aj%s^`iPA=$7W)(Y+wFIAZ!|PtmKx+w3F6c~V6ZHKAuiczkwVku?CwT4T%&P62 zeLul#Cude|=j{6lUOPFnYMeWdwFIXV=uBo6JCC&lpLE0PUd%vi2~IBPOlB23kF^A! zbi?aj%s^`iPA=$7W)(Y+wFIAZ!|PtmKx+w3F6c~V6+4f$1fO)n>t4)2YY9#+=uBo6 zJCC&lpLE0PUd%vi2~IBPOlB23kF^A!bi?aj%>D}QbldU#*8AD%w&S_`|Lp(roo8#$ vQC>f%qx*cn?&fUIQO-{A=sw?PXGMFC^5pKCb;a4w +Date: Wed, 27 Aug 2025 00:23:28 +0100 +Subject: [PATCH] Allwinner: fix booting on a number of devices + +Revert "sunxi: enable MMU_PGPROT proper page table protection" + +This reverts commit 16cfccda4dbf0b53473b8212897f5c63bfbeb6e1. +--- + arch/arm/Kconfig | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 40368abc297..b8be270e4d7 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1207,7 +1207,6 @@ config ARCH_SUNXI + select DM_SPI_FLASH if SPI && MTD + select DM_KEYBOARD + select DM_SERIAL +- select MMU_PGPROT if ARM64 + select OF_BOARD_SETUP + select OF_CONTROL + select PINCTRL +-- +2.51.0 + diff --git a/pkgbuilds/uboot-asahi/Fix-NVMe-not-only-on-Raspberry-Pi-5.patch b/pkgbuilds/uboot-asahi/Fix-NVMe-not-only-on-Raspberry-Pi-5.patch new file mode 100644 index 0000000..62f87ed --- /dev/null +++ b/pkgbuilds/uboot-asahi/Fix-NVMe-not-only-on-Raspberry-Pi-5.patch @@ -0,0 +1,738 @@ +From patchwork Mon Jul 6 17:21:47 2026 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Torsten Duwe +X-Patchwork-Id: 2265604 +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=85.214.62.61; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4gvB431Qwzz1xqc + for ; Tue, 07 Jul 2026 03:21:55 +1000 (AEST) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 179C084942; + Mon, 6 Jul 2026 19:21:52 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Received: by phobos.denx.de (Postfix, from userid 109) + id 82ADE8490A; Mon, 6 Jul 2026 19:21:51 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, + RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham + autolearn_force=no version=3.4.2 +Received: from verein.lst.de (verein.lst.de [213.95.11.211]) + (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 9F24C846B4 + for ; Mon, 6 Jul 2026 19:21:49 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=duwe@lst.de +Received: by verein.lst.de (Postfix, from userid 2005) + id C934268B05; Mon, 6 Jul 2026 19:21:47 +0200 (CEST) +In-Reply-To: <20260706172028.C148E68BEB@verein.lst.de> +References: <20260706172028.C148E68BEB@verein.lst.de> +Subject: [PATCH v2 1/4] core: Skip parent device nodes without a DT reference + when looking for dma-ranges +To: Neil Armstrong , + Andrew Goodbody , Bin Meng , + Simon Glass +Cc: Tom Rini , Matthias Brugger , + Peter Robinson , + Mattijs Korpershoek , + Marek Vasut , + Heiko Schocher , Svyatoslav Ryhel , + "Lucien.Jheng" , Rasmus Villemoes , + Martin Schwan , + "Markus Schneider-Pargmann (TI.com)" , + Prashant Kamble , + Denis Mukhin , Sughosh Ganu , + u-boot@lists.denx.de +Message-Id: <20260706172147.C934268B05@verein.lst.de> +Date: Mon, 6 Jul 2026 19:21:47 +0200 (CEST) +From: duwe@lst.de (Torsten Duwe) +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +From: Torsten Duwe + +If a device node got created dynamically, there is no guarantee that the +parent node has an associated device tree node which could specify dma +constraints. Especially PCI(e) enumeration adds intermediate "bus nodes", +also dynamically. + +Try harder to find the correct configuration by walking up the tree until +a DT association is found. + +Suggested-by: Neil Armstrong +Signed-off-by: Torsten Duwe +Reviewed-by: Peter Robinson +Tested-by: Peter Robinson +--- + drivers/core/device.c | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/drivers/core/device.c b/drivers/core/device.c +index d365204ba11..b6d00cf4714 100644 +--- a/drivers/core/device.c ++++ b/drivers/core/device.c +@@ -459,7 +459,19 @@ static int device_get_dma_constraints(struct udevice *dev) + u64 size = 0; + int ret; + +- if (!CONFIG_IS_ENABLED(DM_DMA) || !parent || !dev_has_ofnode(parent)) ++ if (!CONFIG_IS_ENABLED(DM_DMA) || !parent) ++ return 0; ++ ++ /* Look for the first node in the parent chain */ ++ while (parent) { ++ if (dev_has_ofnode(parent)) ++ break; ++ ++ parent = dev_get_parent(parent); ++ } ++ ++ /* No parents have a node, bail out */ ++ if (!parent) + return 0; + + /* + +From patchwork Mon Jul 6 17:21:50 2026 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Torsten Duwe +X-Patchwork-Id: 2265605 +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de + [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange x25519) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4gvB481pfXz1xqc + for ; Tue, 07 Jul 2026 03:22:00 +1000 (AEST) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 9A59684994; + Mon, 6 Jul 2026 19:21:55 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Received: by phobos.denx.de (Postfix, from userid 109) + id EB7D384979; Mon, 6 Jul 2026 19:21:53 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, + RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham + autolearn_force=no version=3.4.2 +Received: from verein.lst.de (verein.lst.de [213.95.11.211]) + (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id EE61C846B4 + for ; Mon, 6 Jul 2026 19:21:51 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=duwe@lst.de +Received: by verein.lst.de (Postfix, from userid 2005) + id 464E868BEB; Mon, 6 Jul 2026 19:21:50 +0200 (CEST) +In-Reply-To: <20260706172028.C148E68BEB@verein.lst.de> +References: <20260706172028.C148E68BEB@verein.lst.de> +Subject: [PATCH v2 2/4] test: Add a unit test in phys_to_bus for dynamically + created device nodes +To: Neil Armstrong , + Andrew Goodbody , Bin Meng , + Simon Glass +Cc: Tom Rini , Matthias Brugger , + Peter Robinson , + Mattijs Korpershoek , + Marek Vasut , + Heiko Schocher , Svyatoslav Ryhel , + "Lucien.Jheng" , Rasmus Villemoes , + Martin Schwan , + "Markus Schneider-Pargmann (TI.com)" , + Prashant Kamble , + Denis Mukhin , Sughosh Ganu , + u-boot@lists.denx.de +Message-Id: <20260706172150.464E868BEB@verein.lst.de> +Date: Mon, 6 Jul 2026 19:21:50 +0200 (CEST) +From: duwe@lst.de (Torsten Duwe) +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +From: Torsten Duwe + +In order to test whether device_get_dma_constraints() is now able to skip +device nodes without a DT association, temporarily remove those on 2 newly- +created nodes. + +Signed-off-by: Torsten Duwe +--- + +This test indeed makes a different whether the previous change is +applied or not, but *only* reliably for the non-flat-tree case (!?). +On the flat tree, it always fails after (reverse) applying it. + +Either the previous patch is incomplete, or, more likely, the test +assumptions here are not all valid. Suggestions welcome (especially +how to create device nodes from a device tree without a reference to +their origin ;-) + +--- + arch/sandbox/dts/test.dts | 9 +++++++++ + test/dm/phys2bus.c | 25 ++++++++++++++++++++++++- + 2 files changed, 33 insertions(+), 1 deletion(-) + +diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts +index 0887de4333b..1d92e85c739 100644 +--- a/arch/sandbox/dts/test.dts ++++ b/arch/sandbox/dts/test.dts +@@ -656,6 +656,15 @@ + subnode@0 { + compatible = "denx,u-boot-fdt-test"; + }; ++ bus@7 { ++ #address-cells = <1>; ++ #size-cells = <1>; ++ compatible = "denx,u-boot-test-bus"; ++ ++ subnode@8 { ++ compatible = "denx,u-boot-fdt-test"; ++ }; ++ }; + }; + + mmio-bus@1 { +diff --git a/test/dm/phys2bus.c b/test/dm/phys2bus.c +index 67f33904943..858ed5410e2 100644 +--- a/test/dm/phys2bus.c ++++ b/test/dm/phys2bus.c +@@ -15,7 +15,8 @@ + + static int dm_test_phys_to_bus(struct unit_test_state *uts) + { +- struct udevice *dev; ++ struct udevice *dev, *pdev; ++ ofnode psave, nsave; + ofnode node; + + node = ofnode_path("/mmio-bus@0"); +@@ -31,6 +32,29 @@ static int dm_test_phys_to_bus(struct unit_test_state *uts) + ut_asserteq_addr((void*)0x1003ffffULL, (void*)dev_phys_to_bus(dev, 0x3ffff)); + ut_asserteq_addr((void*)0x3ffffULL, (void*)(ulong)dev_bus_to_phys(dev, 0x1003ffff)); + ++#if CONFIG_IS_ENABLED(OF_REAL) ++ /* dma-ranges are on the grandparent bus node, ++ * OF nodes neither here nor at parent ++ */ ++ node = ofnode_path("/mmio-bus@0/bus@7"); ++ ut_assert(ofnode_valid(node)); ++ ut_assertok(uclass_get_device_by_ofnode(UCLASS_TEST_BUS, node, &pdev)); ++ ++ /* pretend the devices were discovered dynamically and have no OF node */ ++ psave = pdev->node_; ++ pdev->node_.np = NULL; ++ node = ofnode_path("/mmio-bus@0/bus@7/subnode@8"); ++ ut_assert(ofnode_valid(node)); ++ nsave = dev->node_; ++ dev->node_.np = NULL; ++ ut_assertok(uclass_get_device_by_ofnode(UCLASS_TEST_FDT, node, &dev)); ++ ++ ut_asserteq_addr((void *)0x1003ffffULL, (void *)dev_phys_to_bus(dev, 0x3ffff)); ++ ut_asserteq_addr((void *)0x3ffffULL, (void *)(ulong)dev_bus_to_phys(dev, 0x1003ffff)); ++ ++ pdev->node_ = psave; ++ dev->node_ = nsave; ++#endif + return 0; + } + DM_TEST(dm_test_phys_to_bus, UTF_SCAN_PDATA | UTF_SCAN_FDT); + +From patchwork Mon Jul 6 17:21:52 2026 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Torsten Duwe +X-Patchwork-Id: 2265606 +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de + [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4gvB4H70Bdz1xqc + for ; Tue, 07 Jul 2026 03:22:07 +1000 (AEST) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 00AF0849BA; + Mon, 6 Jul 2026 19:21:57 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Received: by phobos.denx.de (Postfix, from userid 109) + id 25F8F849BA; Mon, 6 Jul 2026 19:21:56 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, + RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham + autolearn_force=no version=3.4.2 +Received: from verein.lst.de (verein.lst.de [213.95.11.211]) + (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 06F20846B4 + for ; Mon, 6 Jul 2026 19:21:54 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=duwe@lst.de +Received: by verein.lst.de (Postfix, from userid 2005) + id 5257168BFE; Mon, 6 Jul 2026 19:21:52 +0200 (CEST) +In-Reply-To: <20260706172028.C148E68BEB@verein.lst.de> +References: <20260706172028.C148E68BEB@verein.lst.de> +Subject: [PATCH v2 3/4] nvme: Fix missing address translation for PCIe inbound + access +To: Neil Armstrong , + Andrew Goodbody , Bin Meng , + Simon Glass +Cc: Tom Rini , Matthias Brugger , + Peter Robinson , + Mattijs Korpershoek , + Marek Vasut , + Heiko Schocher , Svyatoslav Ryhel , + "Lucien.Jheng" , Rasmus Villemoes , + Martin Schwan , + "Markus Schneider-Pargmann (TI.com)" , + Prashant Kamble , + Denis Mukhin , Sughosh Ganu , + u-boot@lists.denx.de +Message-Id: <20260706172152.5257168BFE@verein.lst.de> +Date: Mon, 6 Jul 2026 19:21:52 +0200 (CEST) +From: duwe@lst.de (Torsten Duwe) +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +From: Torsten Duwe + +U-Boot currently does not account for PCIe bridges with a non-zero +inbound access offset when talking NVMe, it only works on platforms +where this offset happens to be zero. + +This patch enhances the NVMe driver with the ability to also handle +these cases. It also removes the unused function nvme_get_features(). + +Signed-off-by: Torsten Duwe +Reviewed-by: Peter Robinson +Tested-by: Peter Robinson +--- +I tried to consistently use uintptr_t when doing arithmetic on pointers +and dma_addr_t to hold, well, DMA addresses ;) + +nvme_get_features mentions it's unused; so far it causes fruitless +maintenance work and causes dead extra bytes in das U-Boot binary. +It hasn't been neccessary for 9 years; one can revive it from git +once needed. + +--- + drivers/nvme/nvme.c | 71 +++++++++++++++++---------------------------- + drivers/nvme/nvme.h | 3 ++ + 2 files changed, 29 insertions(+), 45 deletions(-) + +diff --git a/drivers/nvme/nvme.c b/drivers/nvme/nvme.c +index 147a104149e..54284c0242b 100644 +--- a/drivers/nvme/nvme.c ++++ b/drivers/nvme/nvme.c +@@ -8,10 +8,10 @@ + #include + #include + #include +-#include + #include + #include + #include ++#include + #include + #include + #include +@@ -101,6 +101,8 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2, + printf("Error: malloc prp_pool fail\n"); + return -ENOMEM; + } ++ dev->prp_pool_dma = dev_phys_to_bus(dev->udev, ++ (uintptr_t)dev->prp_pool); + dev->prp_entry_num = num_pages * (prps_per_page - 1) + 1; + } + +@@ -108,8 +110,10 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2, + i = 0; + while (nprps) { + if ((i == (prps_per_page - 1)) && nprps > 1) { +- *(prp_pool + i) = cpu_to_le64((ulong)prp_pool + +- page_size); ++ dma_addr_t prp_pool_dma = ++ dev_phys_to_bus(dev->udev, (uintptr_t)prp_pool); ++ *(prp_pool + i) = cpu_to_le64(prp_pool_dma + ++ page_size); + i = 0; + prp_pool = (u64 *)((uintptr_t)prp_pool + page_size); + } +@@ -117,7 +121,7 @@ static int nvme_setup_prps(struct nvme_dev *dev, u64 *prp2, + dma_addr += page_size; + nprps--; + } +- *prp2 = (ulong)dev->prp_pool; ++ *prp2 = dev->prp_pool_dma; + + flush_dcache_range((ulong)dev->prp_pool, (ulong)dev->prp_pool + + num_pages * page_size); +@@ -258,11 +262,15 @@ static struct nvme_queue *nvme_alloc_queue(struct nvme_dev *dev, + nvmeq->cqes = (void *)memalign(4096, NVME_CQ_ALLOCATION); + if (!nvmeq->cqes) + goto free_nvmeq; ++ nvmeq->cq_dma_addr = dev_phys_to_bus(dev->udev, ++ (uintptr_t)nvmeq->cqes); + memset((void *)nvmeq->cqes, 0, NVME_CQ_SIZE(depth)); + + nvmeq->sq_cmds = (void *)memalign(4096, NVME_SQ_SIZE(depth)); + if (!nvmeq->sq_cmds) + goto free_queue; ++ nvmeq->sq_dma_addr = dev_phys_to_bus(dev->udev, ++ (uintptr_t)nvmeq->sq_cmds); + memset((void *)nvmeq->sq_cmds, 0, NVME_SQ_SIZE(depth)); + + nvmeq->dev = dev; +@@ -410,8 +416,8 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev) + dev->ctrl_config |= NVME_CC_IOSQES | NVME_CC_IOCQES; + + writel(aqa, &dev->bar->aqa); +- nvme_writeq((ulong)nvmeq->sq_cmds, &dev->bar->asq); +- nvme_writeq((ulong)nvmeq->cqes, &dev->bar->acq); ++ nvme_writeq(nvmeq->sq_dma_addr, &dev->bar->asq); ++ nvme_writeq(nvmeq->cq_dma_addr, &dev->bar->acq); + + result = nvme_enable_ctrl(dev); + if (result) +@@ -437,7 +443,7 @@ static int nvme_alloc_cq(struct nvme_dev *dev, u16 qid, + + memset(&c, 0, sizeof(c)); + c.create_cq.opcode = nvme_admin_create_cq; +- c.create_cq.prp1 = cpu_to_le64((ulong)nvmeq->cqes); ++ c.create_cq.prp1 = cpu_to_le64(nvmeq->cq_dma_addr); + c.create_cq.cqid = cpu_to_le16(qid); + c.create_cq.qsize = cpu_to_le16(nvmeq->q_depth - 1); + c.create_cq.cq_flags = cpu_to_le16(flags); +@@ -454,7 +460,7 @@ static int nvme_alloc_sq(struct nvme_dev *dev, u16 qid, + + memset(&c, 0, sizeof(c)); + c.create_sq.opcode = nvme_admin_create_sq; +- c.create_sq.prp1 = cpu_to_le64((ulong)nvmeq->sq_cmds); ++ c.create_sq.prp1 = cpu_to_le64(nvmeq->sq_dma_addr); + c.create_sq.sqid = cpu_to_le16(qid); + c.create_sq.qsize = cpu_to_le16(nvmeq->q_depth - 1); + c.create_sq.sq_flags = cpu_to_le16(flags); +@@ -464,13 +470,13 @@ static int nvme_alloc_sq(struct nvme_dev *dev, u16 qid, + } + + int nvme_identify(struct nvme_dev *dev, unsigned nsid, +- unsigned cns, dma_addr_t dma_addr) ++ unsigned cns, dma_addr_t cpu_addr) + { + struct nvme_command c; + u32 page_size = dev->page_size; ++ dma_addr_t dma_addr = dev_phys_to_bus(dev->udev, cpu_addr); + int offset = dma_addr & (page_size - 1); + int length = sizeof(struct nvme_id_ctrl); +- dma_addr_t orig_dma_addr = dma_addr; + int ret; + + memset(&c, 0, sizeof(c)); +@@ -488,49 +494,22 @@ int nvme_identify(struct nvme_dev *dev, unsigned nsid, + + c.identify.cns = cpu_to_le32(cns); + +- nvme_invalidate_cache_aligned((uintptr_t)orig_dma_addr, ++ nvme_invalidate_cache_aligned((uintptr_t)cpu_addr, + sizeof(struct nvme_id_ctrl)); + + ret = nvme_submit_admin_cmd(dev, &c, NULL); + if (!ret) +- nvme_invalidate_cache_aligned((uintptr_t)orig_dma_addr, ++ nvme_invalidate_cache_aligned((uintptr_t)cpu_addr, + sizeof(struct nvme_id_ctrl)); + + return ret; + } + +-int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid, +- dma_addr_t dma_addr, u32 *result) +-{ +- struct nvme_command c; +- int ret; +- +- memset(&c, 0, sizeof(c)); +- c.features.opcode = nvme_admin_get_features; +- c.features.nsid = cpu_to_le32(nsid); +- c.features.prp1 = cpu_to_le64(dma_addr); +- c.features.fid = cpu_to_le32(fid); +- +- ret = nvme_submit_admin_cmd(dev, &c, result); +- +- /* +- * TODO: Add some cache invalidation when a DMA buffer is involved +- * in the request, here and before the command gets submitted. The +- * buffer size varies by feature, also some features use a different +- * field in the command packet to hold the buffer address. +- * Section 5.21.1 (Set Features command) in the NVMe specification +- * details the buffer requirements for each feature. +- * +- * At the moment there is no user of this function. +- */ +- +- return ret; +-} +- + int nvme_set_features(struct nvme_dev *dev, unsigned fid, unsigned dword11, +- dma_addr_t dma_addr, u32 *result) ++ dma_addr_t cpu_addr, u32 *result) + { + struct nvme_command c; ++ dma_addr_t dma_addr = dev_phys_to_bus(dev->udev, cpu_addr); + + memset(&c, 0, sizeof(c)); + c.features.opcode = nvme_admin_set_features; +@@ -769,7 +748,7 @@ static ulong nvme_blk_rw(struct udevice *udev, lbaint_t blknr, + u64 prp2; + u64 total_len = blkcnt << desc->log2blksz; + u64 temp_len = total_len; +- uintptr_t temp_buffer = (uintptr_t)buffer; ++ uintptr_t dma_addr = dev_phys_to_bus(udev, (uintptr_t)buffer); + + u64 slba = blknr; + u16 lbas = 1 << (dev->max_transfer_shift - ns->lba_shift); +@@ -797,19 +776,19 @@ static ulong nvme_blk_rw(struct udevice *udev, lbaint_t blknr, + } + + if (nvme_setup_prps(dev, &prp2, +- lbas << ns->lba_shift, temp_buffer)) ++ lbas << ns->lba_shift, dma_addr)) + return -EIO; + c.rw.slba = cpu_to_le64(slba); + slba += lbas; + c.rw.length = cpu_to_le16(lbas - 1); +- c.rw.prp1 = cpu_to_le64(temp_buffer); ++ c.rw.prp1 = cpu_to_le64(dma_addr); + c.rw.prp2 = cpu_to_le64(prp2); + status = nvme_submit_sync_cmd(dev->queues[NVME_IO_Q], + &c, NULL, IO_TIMEOUT); + if (status) + break; + temp_len -= (u32)lbas << ns->lba_shift; +- temp_buffer += lbas << ns->lba_shift; ++ dma_addr += lbas << ns->lba_shift; + } + + if (read) +@@ -884,6 +863,8 @@ int nvme_init(struct udevice *udev) + printf("Error: %s: Out of memory!\n", udev->name); + goto free_queue; + } ++ ++ ndev->prp_pool_dma = dev_phys_to_bus(udev, (uintptr_t)ndev->prp_pool); + ndev->prp_entry_num = MAX_PRP_POOL >> 3; + + ret = nvme_setup_io_queues(ndev); +diff --git a/drivers/nvme/nvme.h b/drivers/nvme/nvme.h +index bc1d612dde4..7c6ed4d9b55 100644 +--- a/drivers/nvme/nvme.h ++++ b/drivers/nvme/nvme.h +@@ -619,6 +619,7 @@ struct nvme_dev { + u32 page_size; + u8 vwc; + u64 *prp_pool; ++ uintptr_t prp_pool_dma; + u32 prp_entry_num; + u32 nn; + }; +@@ -637,7 +638,9 @@ enum nvme_queue_id { + struct nvme_queue { + struct nvme_dev *dev; + struct nvme_command *sq_cmds; ++ dma_addr_t sq_dma_addr; + struct nvme_completion *cqes; ++ dma_addr_t cq_dma_addr; + u32 __iomem *q_db; + u16 q_depth; + s16 cq_vector; + +From patchwork Mon Jul 6 17:21:54 2026 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Torsten Duwe +X-Patchwork-Id: 2265607 +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de + [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange x25519) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4gvB4R378Lz1xqc + for ; Tue, 07 Jul 2026 03:22:15 +1000 (AEST) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 3FDAE8490A; + Mon, 6 Jul 2026 19:21:59 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Received: by phobos.denx.de (Postfix, from userid 109) + id 17F418490A; Mon, 6 Jul 2026 19:21:58 +0200 (CEST) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, + RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_PASS autolearn=ham + autolearn_force=no version=3.4.2 +Received: from verein.lst.de (verein.lst.de [213.95.11.211]) + (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 1D593849A4 + for ; Mon, 6 Jul 2026 19:21:56 +0200 (CEST) +Authentication-Results: phobos.denx.de; + dmarc=fail (p=none dis=none) header.from=lst.de +Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=duwe@lst.de +Received: by verein.lst.de (Postfix, from userid 2005) + id B506B68CFE; Mon, 6 Jul 2026 19:21:54 +0200 (CEST) +In-Reply-To: <20260706172028.C148E68BEB@verein.lst.de> +References: <20260706172028.C148E68BEB@verein.lst.de> +Subject: [PATCH v2 4/4] configs: enable NVMe +To: Neil Armstrong , + Andrew Goodbody , Bin Meng , + Simon Glass +Cc: Tom Rini , Matthias Brugger , + Peter Robinson , + Mattijs Korpershoek , + Marek Vasut , + Heiko Schocher , Svyatoslav Ryhel , + "Lucien.Jheng" , Rasmus Villemoes , + Martin Schwan , + "Markus Schneider-Pargmann (TI.com)" , + Prashant Kamble , + Denis Mukhin , Sughosh Ganu , + u-boot@lists.denx.de +Message-Id: <20260706172154.B506B68CFE@verein.lst.de> +Date: Mon, 6 Jul 2026 19:21:54 +0200 (CEST) +From: duwe@lst.de (Torsten Duwe) +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +From: Torsten Duwe + +Enable NVMe in the Raspberry Pi 64-Bit default config and scan for devices. + +Signed-off-by: Torsten Duwe +Reviewed-by: Peter Robinson +Tested-by: Peter Robinson +--- + configs/rpi_arm64_defconfig | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/configs/rpi_arm64_defconfig b/configs/rpi_arm64_defconfig +index cdcf05ea6db..fb0fdce1d7f 100644 +--- a/configs/rpi_arm64_defconfig ++++ b/configs/rpi_arm64_defconfig +@@ -16,7 +16,7 @@ CONFIG_BOOTSTD_DEFAULTS=y + CONFIG_OF_BOARD_SETUP=y + CONFIG_FDT_SIMPLEFB=y + CONFIG_USE_PREBOOT=y +-CONFIG_PREBOOT="pci enum; usb start;" ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_SYS_PBSIZE=1049 + # CONFIG_DISPLAY_CPUINFO is not set + # CONFIG_DISPLAY_BOARDINFO is not set +@@ -44,6 +44,7 @@ CONFIG_MMC_SDHCI_SDMA=y + CONFIG_MMC_SDHCI_BCM2835=y + CONFIG_MMC_SDHCI_BCMSTB=y + CONFIG_BCMGENET=y ++CONFIG_NVME_PCI=y + CONFIG_PCI_BRCMSTB=y + CONFIG_PINCTRL=y + # CONFIG_PINCTRL_GENERIC is not set diff --git a/pkgbuilds/uboot-asahi/JetsonTX2-Fix-upstream-device-tree-naming.patch b/pkgbuilds/uboot-asahi/JetsonTX2-Fix-upstream-device-tree-naming.patch new file mode 100644 index 0000000..14242ce --- /dev/null +++ b/pkgbuilds/uboot-asahi/JetsonTX2-Fix-upstream-device-tree-naming.patch @@ -0,0 +1,50 @@ +From 4ee5ba36570d94ce27e4023f15b8b3a6b8b9daf9 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Mon, 13 Oct 2025 21:41:13 +0100 +Subject: [PATCH] config: JetsonTX2: Fix upstream device tree naming + +The upstream naming for the Jetson TX2 is p2771-0000 so fix +the device tree name so the firmware will find the right +name on disk. + +Signed-off-by: Peter Robinson +--- + arch/arm/dts/Makefile | 2 +- + .../{tegra186-p2771-0000-500.dts => tegra186-p2771-0000.dts} | 0 + configs/p2771-0000-500_defconfig | 2 +- + 3 files changed, 2 insertions(+), 2 deletions(-) + rename arch/arm/dts/{tegra186-p2771-0000-500.dts => tegra186-p2771-0000.dts} (100%) + +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 7c8cf3a5a1d..86a7b4fda35 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -134,7 +134,7 @@ dtb-$(CONFIG_ARCH_TEGRA) += \ + tegra124-venice2.dtb \ + tegra124-xiaomi-mocha.dtb \ + tegra186-p2771-0000-000.dtb \ +- tegra186-p2771-0000-500.dtb \ ++ tegra186-p2771-0000.dtb \ + tegra210-p2371-0000.dtb \ + tegra210-p2371-2180.dtb \ + tegra210-p2571.dtb \ +diff --git a/arch/arm/dts/tegra186-p2771-0000-500.dts b/arch/arm/dts/tegra186-p2771-0000.dts +similarity index 100% +rename from arch/arm/dts/tegra186-p2771-0000-500.dts +rename to arch/arm/dts/tegra186-p2771-0000.dts +diff --git a/configs/p2771-0000-500_defconfig b/configs/p2771-0000-500_defconfig +index 42043277e2d..e1e5c47ddfa 100644 +--- a/configs/p2771-0000-500_defconfig ++++ b/configs/p2771-0000-500_defconfig +@@ -7,7 +7,7 @@ CONFIG_TEXT_BASE=0x80080000 + CONFIG_NR_DRAM_BANKS=1026 + CONFIG_ENV_SIZE=0x2000 + CONFIG_ENV_OFFSET=0xFFFFE000 +-CONFIG_DEFAULT_DEVICE_TREE="tegra186-p2771-0000-500" ++CONFIG_DEFAULT_DEVICE_TREE="tegra186-p2771-0000" + CONFIG_SYS_BOOTM_LEN=0x800000 + CONFIG_SYS_LOAD_ADDR=0x80080000 + CONFIG_TEGRA186=y +-- +2.51.0 + diff --git a/pkgbuilds/uboot-asahi/PKGBUILD b/pkgbuilds/uboot-asahi/PKGBUILD new file mode 100644 index 0000000..37d8925 --- /dev/null +++ b/pkgbuilds/uboot-asahi/PKGBUILD @@ -0,0 +1,162 @@ +# Omarchy's uboot-asahi: asahi-alarm's uboot-asahi (asahi-alarm/PKGBUILDs) +# with a silent console, no banner, no logo and no boot delay, so the Mac +# boots straight to the boot menu and the splash without U-Boot's text. +# +# Same name as asahi-alarm's, and nothing generic depends on it, so it only +# ever replaces their build on a Mac that has [asahi-alarm] configured. Keep +# pkgver and the patch set in step with asahi-alarm's and pkgrel above +# theirs: once installed, pacman keeps this build over theirs at the same +# pkgver whichever repository is listed first, and a newer asahi-alarm pkgver +# wins until this recipe follows it. No epoch, which would outrank every +# future asahi-alarm release. + +pkgname=uboot-asahi +_ver=2026.07 +_asahirel=2 + +pkgver=${_ver}.asahi${_asahirel} +pkgrel=4 +pkgdesc='U-Boot for Apple Silicon Macs (Omarchy build: silent console)' +_commit_id=asahi-v${_ver}-${_asahirel} +_srcname=u-boot-${_commit_id} +arch=('aarch64') +url='http://asahilinux.org' +license=('MIT' 'GPL2') +makedepends=( bc imagemagick ) +source=( + "u-boot-${_commit_id}.tar.gz::https://github.com/AsahiLinux/u-boot/archive/${_commit_id}.tar.gz" + 'disable-VBE-by-default.patch' + 'enable-bootmenu-by-default.patch' + 'uefi-distro-load-FDT-from-any-partition-on-boot-device.patch' + 'uefi-Add-all-options-for-EFI-System-Partitions.patch' + 'uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch' + 'uefi-enable-SetVariableRT-with-volotile-storage.patch' + 'uefi-enable-https-boot-by-default.patch' + 'pylibfdt-Replace-removed-SWIG-Python-2-compatibility-macros.patch' + 'USB-PD-TCPM-improvements.patch' + 'rockchip-Enable-preboot-start-for-pci-usb.patch' + 'rockchip-rk3568-nanopi-r5-Drop-duplicated-extra-sdhc.patch' + 'rockchip-rk356x-Stop-overriding-sdhci-mmc-aliases.patch' + 'p3450-fix-board.patch' + 'JetsonTX2-Fix-upstream-device-tree-naming.patch' + 'Allwinner-fix-booting-on-a-number-of-devices.patch' + 'Fix-NVMe-not-only-on-Raspberry-Pi-5.patch' + 'raspberrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch' + 'openssl-no-engine.patch' + 'quiet-console.patch' +) +sha256sums=('ff36bacdeb91c2bb911ce6fdd198fb1a943c47a6931f986cecd22443b04c1b06' + '501fe48668729525520253228945dc728c9bf2d9f0a41744711ca51a060e9c7b' + '9d1796f8c1492bb50c13f865b4bc6854f825218836e55ce36e348c4dd77caa74' + '0f980cf61fab268a6aa2440408548d3874aee1de6eb6e3be291690b1d2eb6904' + '16904a97fc62bba84bde3a18885156b8c202c366bb6a0e0dd54414c016695876' + '32d966701ebd7675092c1fd991e2444a0a1d08d83a10f34c88e05a3c19b41834' + 'c77853d6c25b11b7ffca8d522e03bf8e1305b8637e27c5074ddeef3a22956bbf' + 'f9106baa633f742f7fff396b5335a9c0ead4fa7416cdfd2fea743c1da433960d' + '1a152c1ddc46316ec94aa19be40b96e1e8bab71a82f1e11ca59c9f5ec86808a5' + '3dd92f1f51fccfbb1ceae701db68a6ae42916ddc2d4645b3a61486b582721a54' + '3ee57dcf7d36351de5905dadf41803cf2994bba40d77f4fe5e3fcd9131ddb54e' + '064e51eabf34d04cfade37115d3fd76c4e8005973faf4dedf410f0b5bbd1ea18' + '4aa93c1c3ae7fe20e844505d521b921b9649dae03b74ad847ebd6318f02f71a2' + '9cf3e7694efd82a0fe6725069b12971a4f32d05e4e9862089cbf1779a7d2df7c' + '77aff72eb2319d3a80e0ccb63bdfb7d1c503c91fb515acc9525d029b25bb1fdc' + '0bb2e47484d67935f1ef6107433f51747211a143f549b4ba60081a143026fb22' + '300ed1bd17136bed9ff2528dcdc029396e6c373c0606653dc7905625bb8511a7' + 'dbc08bd374f299d92fc0e9022e37a1629055675bc874a904c1eefe5fb9699e2f' + '3ede37fd744d60d934a7d5186f0bcd13d67ae9a48d973283356bbe7451d337e4' + '9c3db1a504c5eeac54fadb1dadb45ac5ea36316c39fadb73836102ac4bf125f0') +b2sums=('8041a979068ea00ac8402dcf35b34277907e497b2de060edf43a1960abddcfb5449d963334eb2a8c9f9a869452be55bf4c728dbda7c381892a145de72f3a59aa' + '8fcba2b6c098125fc6ddee33b634af35bc6a8ae93c4f9cf3698f3f4455f97e22c6d8630c60776710770128f73377d2a9364c70dab6705707c1f3223e7493ce14' + '79709278b47f8e21e7376031c3dc472070c5b18b29b48eefc9d3a4d97b69104eae9325ed8fff8e7a509a89727c8335c90345807d72afacee069557e46ff5724c' + '34bebf1fe1126ff03d31abaca5908036268c231a77beebbe683cca3f80a4add12faf0e0ed27975c5fa1ba2a9994395ad0ee8115e9ecb8d3686975602981bf136' + 'b4ede5b7eced7a3459a169f5d49712647cc7cc3aec9935eea6283522245b6c3cc300ed8fb81be0dd942dddefd3bda49530270ec3f9215d2f9a52efa4c3bc5ba9' + 'b1cca3b2f31a1ab50f5fb637122d24593c23f99d773abba5a145d8701471dcb159de2bed937ea4a40b57501efb442c2ac5a2d49ab595f8b111320b11a182e710' + '2a61869cdefd59715d8d860e4860d52a6e3fc33f2b8511c5d6f78c68f7dda00195b29bf9a213668a3eedf445958b923bc7051fc38c6965c3b7803266cae16bb2' + '4bb6155f1db7a9df5e735cf353d5c1cc04525b5a2cd06fba93d3046a216a7210a6d0e1bf3e2deb07bbb58391d47804208e6e12b724000d68df9c5de5d2c52aae' + 'faa1ee756bda5714c31105b40fded40167c31d8458bc2b460dda06ad42fec60b7a71ed32a26fb036f744c8496641e3f271a39fd85f4de3ad86f1b8e9efec2dd1' + '6cf5a8fe4631a60247df626e4fea6efadad4d2ccf62dd30330fa0a98546deee17a394d8b7fef8fa5446311f01c05a303f88818a4ffa6b49810c5ec06fae1aa46' + '06c2d9f2d1b9285faf10245a325bb3937f6c98170f069e9517bf1662c0f3f4ea8499c911169c60e474a97c54b74d96297ccf0268edb0a3e602f7d0302668484d' + '3905954cb92f54a9b1f479515a1f8b949b2692eeabad1955ec2c013bf920e2c79a2008408fc569f246c1184443baea4c96a63226cd32afd1149b681adb5b07d4' + 'ab734d11f811c467bad6e417700c67188dd82593e636172ac75f36aded39eea095b7a432ab7b4d377d4bb5e824a99592fb99017b7437b6f9bfeeb1cf962f35a6' + '828275a8cdda2df5ef0698f12871cb24bcd758373d43907120495eb094fc1ddf6e25414384a52c56f2c5629a2b1702571fd368c02f1ae67ae25a2d59c0a850f3' + '08bd592cc066e2dc9216228384a6c1d650860479ae3fa8fbe4ac0b6cf8596a25e5c11bbb52a19e3c35a4de279b4746e30e376ba4273f0121c2889d7ebc6a938d' + 'b018ec8f631f9ec15bb054f85b526fb4b4bb04b954ef9a038a6c9fd1230bbbb5af8d82b04d30c220820cb5f35c77ad1e3763835244da93486f3261fe12d1f06a' + '338e2cd0b3e36f523ec7bbc59b91418fd5b6ec73588a510f488168a579de83d2b3978bb7ad641ed3a0a931e1e1555b43a2cd59f63da389545afca1579df4f256' + 'd63591d50862f07faf35e0adb52d73c669b4c29d046585878dcd4142faa049dd84088a9f21d34159f7103971b2b443d33f8a28ed77f4265f0e9d976bd66334f8' + '81a2b3b089267d636cc60f23a0f4f82ba36ecb5e210c84c7cbdf2af1b764e0c40ba3b22fec26bc7c8eab052cfa30893aac4b3c76b9a56d763841b8f7821820de' + '451006bb05bf4107347267dfb62b670d25d8991dcdb93c23221eca876bc8a2f9af7dc9e76e2c675aa44a34ef1a86deb00c128bf57f4096301f5a235ebfd69ca7') + +prepare() { + cd "${srcdir}/$_srcname" + + cat ../disable-VBE-by-default.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../enable-bootmenu-by-default.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../uefi-distro-load-FDT-from-any-partition-on-boot-device.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../uefi-Add-all-options-for-EFI-System-Partitions.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../uefi-enable-SetVariableRT-with-volotile-storage.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../uefi-enable-https-boot-by-default.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../pylibfdt-Replace-removed-SWIG-Python-2-compatibility-macros.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../USB-PD-TCPM-improvements.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../rockchip-Enable-preboot-start-for-pci-usb.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../rockchip-rk3568-nanopi-r5-Drop-duplicated-extra-sdhc.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../rockchip-rk356x-Stop-overriding-sdhci-mmc-aliases.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../p3450-fix-board.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../JetsonTX2-Fix-upstream-device-tree-naming.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../Allwinner-fix-booting-on-a-number-of-devices.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../Fix-NVMe-not-only-on-Raspberry-Pi-5.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../raspberrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../openssl-no-engine.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + cat ../quiet-console.patch | patch -p1 -s --fuzz=0 --no-backup-if-mismatch -f + + make apple_m1_defconfig + scripts/config --file .config \ + -e OF_UPSTREAM_BUILD_VENDOR \ + --set-str OF_UPSTREAM_VENDOR apple + # Silent console: nothing on the panel or the serial port from U-Boot + # itself (the banner, the environment load, the bootflow scan). The + # environment's silent=1 applies from relocation on; the console stays + # muted until that environment is read. The kernel's console is not + # touched, and the U-Boot logo is not drawn. No boot delay: with nothing + # shown there is nothing to interrupt. + scripts/config --file .config \ + -e SILENT_CONSOLE \ + -e SILENT_CONSOLE_UPDATE_ON_SET \ + -e SILENT_CONSOLE_UPDATE_ON_RELOC \ + -e SILENT_CONSOLE_UNTIL_ENV \ + -e SILENT_U_BOOT_ONLY \ + -d VIDEO_LOGO \ + --set-val BOOTDELAY 0 + make olddefconfig +} + +build() { + cd "${srcdir}/$_srcname" + make +} + +package() { + cd "${srcdir}" + + tgtdir="$pkgdir/usr/lib/asahi-boot" + dtbdir="$_srcname/dts/upstream/src/arm64/apple" + + install -Dt "$tgtdir" -m644 "$_srcname/u-boot-nodtb.bin" + install -d "$tgtdir/dtb" + + # Exclude known non-Apple-Silicon DT families: + # t7000: A8-based iPhone 6 / 6 Plus + # t7001: A8X-based iPad Air 2 + # t8010: A10-based iPhone 7 / 7 Plus, iPad 6 / 7, iPod touch 7 + # t8011: A10X-based Apple TV 4K (1st gen), iPad Pro 10.5 / 12.9 (2nd gen) + # t8012: T2-based Intel Macs + # t8015: A11-based iPhone 8 / 8 Plus / X + find "$dtbdir" -maxdepth 1 -type f -name 't*.dtb' \ + ! -name 't7000-*.dtb' \ + ! -name 't7001-*.dtb' \ + ! -name 't8010-*.dtb' \ + ! -name 't8011-*.dtb' \ + ! -name 't8012-*.dtb' \ + ! -name 't8015-*.dtb' \ + -exec install -m644 -t "$tgtdir/dtb" {} + +} diff --git a/pkgbuilds/uboot-asahi/USB-PD-TCPM-improvements.patch b/pkgbuilds/uboot-asahi/USB-PD-TCPM-improvements.patch new file mode 100644 index 0000000..f84e6f3 --- /dev/null +++ b/pkgbuilds/uboot-asahi/USB-PD-TCPM-improvements.patch @@ -0,0 +1,717 @@ +From patchwork Wed Feb 26 18:44:44 2025 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Sebastian Reichel +X-Patchwork-Id: 2052544 +X-Patchwork-Delegate: marek.vasut@gmail.com +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.a=rsa-sha256 header.s=mail header.b=IthL1Z+m; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de + [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (secp384r1)) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z33M03Hhjz1yCp + for ; Thu, 27 Feb 2025 05:45:32 +1100 (AEDT) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id BFF7680FF0; + Wed, 26 Feb 2025 19:45:16 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Authentication-Results: phobos.denx.de; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.b="IthL1Z+m"; + dkim-atps=neutral +Received: by phobos.denx.de (Postfix, from userid 109) + id 7614F810F9; Wed, 26 Feb 2025 19:45:13 +0100 (CET) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, + DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, + SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 +Received: from bali.collaboradmins.com (bali.collaboradmins.com + [IPv6:2a01:4f8:201:9162::2]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 2173180FDE + for ; Wed, 26 Feb 2025 19:45:08 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=sebastian.reichel@collabora.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; + s=mail; t=1740595507; + bh=Fnp6a8opSCXiH5NJdu5uivbBBZF3pe1CXyluh8+n8/c=; + h=From:To:Cc:Subject:Date:In-Reply-To:References:From; + b=IthL1Z+mDeIRy9MWEa0lGyJWuHk/Pu+yUpLly7RG6NIpC0lCgla3ssiy2x+8/G+bz + DWjrKUMxgWtqfjfffRiKEJZ6Z2sAXJ1ePvDmMtbGoolWSrzsV2+cWh0byYrEBuVBe9 + Vp0ye7gJ4Wt610s4QHa4xoYcm7h9KGmE3IEjb+XYFv1HMJIOoACl04BwkLctza1KBr + XlIqC+snvRP/yQxa2+6RYGXgQD5JnJxCM1orXVIJxyyJxTzb3XgNir60Gb4HI9724H + LDZy0Hq7NQ1zF0h1yVUOklDotw17isbNoI4K3JCExR+r7GsdESsGY6cwAbZY71iWlf + OsSSrV6TZtAMg== +Received: from jupiter.universe (dyndsl-091-249-076-032.ewe-ip-backbone.de + [91.249.76.32]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature RSA-PSS (4096 bits)) + (No client certificate requested) (Authenticated sender: sre) + by bali.collaboradmins.com (Postfix) with ESMTPSA id A18CC17E0881; + Wed, 26 Feb 2025 19:45:07 +0100 (CET) +Received: by jupiter.universe (Postfix, from userid 1000) + id 32E35480034; Wed, 26 Feb 2025 19:45:07 +0100 (CET) +From: Sebastian Reichel +To: Marek Vasut , u-boot@lists.denx.de, + Jonas Karlman , Soeren Moch +Cc: Tim Harvey , + Philipp Tomsich , + Anand Moon , Maxim Kiselev , + Sebastian Reichel +Subject: [PATCH v2 1/4] usb: tcpm: improve handling of some power-supplies +Date: Wed, 26 Feb 2025 19:44:44 +0100 +Message-ID: <20250226184506.64114-2-sebastian.reichel@collabora.com> +X-Mailer: git-send-email 2.47.2 +In-Reply-To: <20250226184506.64114-1-sebastian.reichel@collabora.com> +References: <20250226184506.64114-1-sebastian.reichel@collabora.com> +MIME-Version: 1.0 +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +When the Rock 5B is booted with the current TCPM with its power supplied +by a "Cambrionix PDSync-C4" port it reaches the power-supply ready state. +Once that has happened the hub starts sending GetSinkCap messages, but +U-Boot already stopped processing PD messages. After retrying a bunch of +times the hub instead sends soft resets. Since U-Boot will also not +react to them, the USB hub will follow-up with a hard reset and that +cuts off the supply voltage. + +Since the state machine is already prepared to handle GetSinkCap +messages, try to avoid this by handling incoming messages for another +50ms after reaching the ready state. + +Fixes: 1db4c0ac77e3 ("usb: tcpm: add core framework") +Signed-off-by: Sebastian Reichel +--- + drivers/usb/tcpm/tcpm.c | 31 ++++++++++++++++++++++++++----- + 1 file changed, 26 insertions(+), 5 deletions(-) + +diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c +index 0aee57cb2f4a..b754b4dcd0b5 100644 +--- a/drivers/usb/tcpm/tcpm.c ++++ b/drivers/usb/tcpm/tcpm.c +@@ -2229,6 +2229,17 @@ static int tcpm_port_init(struct udevice *dev) + return 0; + } + ++static inline void tcpm_poll_one_event(struct udevice *dev) ++{ ++ const struct dm_tcpm_ops *drvops = dev_get_driver_ops(dev); ++ struct tcpm_port *port = dev_get_uclass_plat(dev); ++ ++ drvops->poll_event(dev); ++ port->poll_event_cnt++; ++ udelay(500); ++ tcpm_check_and_run_delayed_work(dev); ++} ++ + static void tcpm_poll_event(struct udevice *dev) + { + const struct dm_tcpm_ops *drvops = dev_get_driver_ops(dev); +@@ -2242,15 +2253,25 @@ static void tcpm_poll_event(struct udevice *dev) + (port->state == SNK_READY || port->state == SRC_READY)) + break; + +- drvops->poll_event(dev); +- port->poll_event_cnt++; +- udelay(500); +- tcpm_check_and_run_delayed_work(dev); ++ tcpm_poll_one_event(dev); + } + +- if (port->state != SNK_READY && port->state != SRC_READY) ++ /* ++ * Some power-supplies send GetSinkCap shortly after they are ready. ++ * If they do not receive a response after a few retries they will issue ++ * a soft-reset followed by a hard reset, which kills the board power. ++ * Let's poll for 50ms after reaching the ready state to check if the ++ * power-supply wants something from us. ++ */ ++ if (port->state == SNK_READY) { ++ port->poll_event_cnt = 0; ++ ++ while (port->poll_event_cnt < 100) ++ tcpm_poll_one_event(dev); ++ } else { + dev_warn(dev, "TCPM: exit in state %s\n", + tcpm_states[port->state]); ++ } + + /* + * At this time, call the callback function of the respective pd chip + +From patchwork Wed Feb 26 18:44:45 2025 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Sebastian Reichel +X-Patchwork-Id: 2052546 +X-Patchwork-Delegate: marek.vasut@gmail.com +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.a=rsa-sha256 header.s=mail header.b=hgX6o5vZ; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de + [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (secp384r1)) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z33MJ5sFGz1yCp + for ; Thu, 27 Feb 2025 05:45:48 +1100 (AEDT) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 69A29811C5; + Wed, 26 Feb 2025 19:45:17 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Authentication-Results: phobos.denx.de; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.b="hgX6o5vZ"; + dkim-atps=neutral +Received: by phobos.denx.de (Postfix, from userid 109) + id 832B180FB9; Wed, 26 Feb 2025 19:45:14 +0100 (CET) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, + DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, + RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED, + SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 +Received: from bali.collaboradmins.com (bali.collaboradmins.com + [148.251.105.195]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 2178380FF0 + for ; Wed, 26 Feb 2025 19:45:08 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=sebastian.reichel@collabora.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; + s=mail; t=1740595507; + bh=H/gQCZCWVmLNRIaBLvWsE35SaDMWvta2+rTkymkHQJE=; + h=From:To:Cc:Subject:Date:In-Reply-To:References:From; + b=hgX6o5vZwM72CR2hgo76tgo2eE00qHM7oNja381ACl8gIUUVioy8RTeqXtum89tBf + aIwKm/oNQNvGxy92pX5/1Jg/MwYZKS8jDukz6ZgsLKu22rJXf58FFoV095AcEkUMB2 + lrO4KJgFW/x1FK8GmSVSXXH+iUYJLkzsfZKgHKoQYHZcVXJRgFjHR5ytGKsA/fq4el + 7Wrx3lmLNjL7fYlDF5AyY+Wl6hqzjDq58nFedXHv8TEHx6fzfB0IBzOL/F8bGqVcyy + lal7bjJvMPoA9zfgIC77R1neWktg5FSro75YciSRSj9lmMNCmESnSPCgsZ4wBW0V6f + ppD77gOtjDfLQ== +Received: from jupiter.universe (dyndsl-091-249-076-032.ewe-ip-backbone.de + [91.249.76.32]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature RSA-PSS (4096 bits)) + (No client certificate requested) (Authenticated sender: sre) + by bali.collaboradmins.com (Postfix) with ESMTPSA id 9725D17E087F; + Wed, 26 Feb 2025 19:45:07 +0100 (CET) +Received: by jupiter.universe (Postfix, from userid 1000) + id 34511480037; Wed, 26 Feb 2025 19:45:07 +0100 (CET) +From: Sebastian Reichel +To: Marek Vasut , u-boot@lists.denx.de, + Jonas Karlman , Soeren Moch +Cc: Tim Harvey , + Philipp Tomsich , + Anand Moon , Maxim Kiselev , + Sebastian Reichel +Subject: [PATCH v2 2/4] usb: tcpm: avoid resets for missing source capability + messages +Date: Wed, 26 Feb 2025 19:44:45 +0100 +Message-ID: <20250226184506.64114-3-sebastian.reichel@collabora.com> +X-Mailer: git-send-email 2.47.2 +In-Reply-To: <20250226184506.64114-1-sebastian.reichel@collabora.com> +References: <20250226184506.64114-1-sebastian.reichel@collabora.com> +MIME-Version: 1.0 +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +The current TCPM code implements source capability message handling +according to the USB-PD specification. Unfortunately some USB PD +sources do not properly follow the specification and do not send +source capability messages after a soft reset when they already +negotiated a specific contract before. The currently implemented way +(and what is described in the specificiation) to resolve this problem +is triggering a hard reset. + +But a hard reset is fatal on batteryless platforms powered via USB-C PD, +since that removes VBUS for some time. Since this is triggered at boot +time, the system may get stuck in a boot loop. + +For example I noticed the following behaviour on a Radxa Rock 5B +combined with an affected power-supply: + +1. The system is booted up with current code +2. A reboot is requested +3. U-Boot TCPM / fusb302 driver sends soft reset and waits for the + source capability message +4. No new source capability message is send by the power-supply + after the soft reset +5. U-Boot sends a hard reset +6. The board resets, but the fusb302 registers are not reset. This + is because of a hardware glitch. The serial pins are high when + no data is exchanged. Apparently the RK3588 has protection diodes, + which leak some voltage into the power-domain. The Rock 5B serial + pins and the fusb302 are using the same 3.3V power domain and the + leaked voltage is enough to keep the fusb302 registers alive. +7. After the hard reset the power-supply sends another source capability + message, which is auto-acked by fusb302 (because the register state + is kept) even though the U-Boot driver has not yet probed. Once the + U-Boot driver probes it sends another soft reset and waits for a new + source capability message, which never arrives. + +Fortunately the affected power-supplies (I have two setups showing this +behaviour) support sending a source capability message when explicitly +being asked. Thus an easy workaround to handle this is deviating from +the USB-PD specification and sending a Get_Source_Cap message and +waiting some time longer before doing the hard reset. + +Note, that I recently added the same workaround to the Linux kernel +with a slightly different rationale (since it needs to take over from +U-Boot). + +Fixes: 1db4c0ac77e3 ("usb: tcpm: add core framework") +Signed-off-by: Sebastian Reichel +--- + drivers/usb/tcpm/tcpm-internal.h | 1 + + drivers/usb/tcpm/tcpm.c | 32 +++++++++++++++++++++++++++++--- + 2 files changed, 30 insertions(+), 3 deletions(-) + +diff --git a/drivers/usb/tcpm/tcpm-internal.h b/drivers/usb/tcpm/tcpm-internal.h +index 561442090027..4861f4d13866 100644 +--- a/drivers/usb/tcpm/tcpm-internal.h ++++ b/drivers/usb/tcpm/tcpm-internal.h +@@ -30,6 +30,7 @@ + S(SNK_DISCOVERY_DEBOUNCE), \ + S(SNK_DISCOVERY_DEBOUNCE_DONE), \ + S(SNK_WAIT_CAPABILITIES), \ ++ S(SNK_WAIT_CAPABILITIES_TIMEOUT), \ + S(SNK_NEGOTIATE_CAPABILITIES), \ + S(SNK_TRANSITION_SINK), \ + S(SNK_TRANSITION_SINK_VBUS), \ +diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c +index b754b4dcd0b5..786d92fa4c6f 100644 +--- a/drivers/usb/tcpm/tcpm.c ++++ b/drivers/usb/tcpm/tcpm.c +@@ -1424,7 +1424,8 @@ static inline enum tcpm_state hard_reset_state(struct tcpm_port *port) + return ERROR_RECOVERY; + if (port->pwr_role == TYPEC_SOURCE) + return SRC_UNATTACHED; +- if (port->state == SNK_WAIT_CAPABILITIES) ++ if (port->state == SNK_WAIT_CAPABILITIES || ++ port->state == SNK_WAIT_CAPABILITIES_TIMEOUT) + return SNK_READY; + return SNK_UNATTACHED; + } +@@ -1650,10 +1651,35 @@ static void run_state_machine(struct udevice *dev) + tcpm_set_state(dev, SOFT_RESET_SEND, + PD_T_SINK_WAIT_CAP); + } else { +- tcpm_set_state(dev, hard_reset_state(port), +- PD_T_SINK_WAIT_CAP); ++ if (!port->self_powered) ++ tcpm_set_state(dev, SNK_WAIT_CAPABILITIES_TIMEOUT, ++ PD_T_SINK_WAIT_CAP); ++ else ++ tcpm_set_state(dev, hard_reset_state(port), ++ PD_T_SINK_WAIT_CAP); + } + break; ++ case SNK_WAIT_CAPABILITIES_TIMEOUT: ++ /* ++ * There are some USB PD sources in the field, which do not ++ * properly implement the specification and fail to start ++ * sending Source Capability messages after a soft reset. The ++ * specification suggests to do a hard reset when no Source ++ * capability message is received within PD_T_SINK_WAIT_CAP, ++ * but that might effectively kil the machine's power source. ++ * ++ * This slightly diverges from the specification and tries to ++ * recover from this by explicitly asking for the capabilities ++ * using the Get_Source_Cap control message before falling back ++ * to a hard reset. The control message should also be supported ++ * and handled by all USB PD source and dual role devices ++ * according to the specification. ++ */ ++ if (tcpm_pd_send_control(dev, PD_CTRL_GET_SOURCE_CAP)) ++ tcpm_set_state_cond(dev, hard_reset_state(port), 0); ++ else ++ tcpm_set_state(dev, hard_reset_state(port), PD_T_SINK_WAIT_CAP); ++ break; + case SNK_NEGOTIATE_CAPABILITIES: + port->pd_capable = true; + port->hard_reset_count = 0; + +From patchwork Wed Feb 26 18:44:46 2025 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Sebastian Reichel +X-Patchwork-Id: 2052545 +X-Patchwork-Delegate: marek.vasut@gmail.com +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.a=rsa-sha256 header.s=mail header.b=BxTv7Lfo; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=85.214.62.61; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z33M971h7z1yCp + for ; Thu, 27 Feb 2025 05:45:41 +1100 (AEDT) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id 1B09C8118B; + Wed, 26 Feb 2025 19:45:17 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Authentication-Results: phobos.denx.de; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.b="BxTv7Lfo"; + dkim-atps=neutral +Received: by phobos.denx.de (Postfix, from userid 109) + id 4399E810F9; Wed, 26 Feb 2025 19:45:14 +0100 (CET) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, + DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, + SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 +Received: from bali.collaboradmins.com (bali.collaboradmins.com + [IPv6:2a01:4f8:201:9162::2]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 2163F80FB9 + for ; Wed, 26 Feb 2025 19:45:08 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=sebastian.reichel@collabora.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; + s=mail; t=1740595507; + bh=7OaDpd2idE5ETWAiOZte0kuOU6ZYitEVWkDgDmqaQU8=; + h=From:To:Cc:Subject:Date:In-Reply-To:References:From; + b=BxTv7LfoAae43YSXPquVPmmwStgQirXCxaSBD0fo554R5O/si/Iif5L+zXXJocATJ + z7+I7ZKbknkTeVyzoRDCXvXIVz2bFdTRWQN4Z2iwJbVI1covAv/Gn4wIE2Q6hbNKbU + qV5AKg7gvrKkbztbo7N9bHNjkrlAbd8B4Ew3SR8FM46DMAOwNzVsoX3rLMcPtlWzHj + 4OBKCx22H/4ASIWjMbYoDE09DyQ+CPOf8JcX8OPwFcH9j6vW6cEWvyjiAyDj6LnwOq + KD+ZYVIkWhkIzAkE2NHB2IpA4xlxW8i18BJzNBD8N1eBx/HCgb0camb4KanY1Hta/d + 4ipLyuFaCkMog== +Received: from jupiter.universe (dyndsl-091-249-076-032.ewe-ip-backbone.de + [91.249.76.32]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest + SHA256) + (No client certificate requested) (Authenticated sender: sre) + by bali.collaboradmins.com (Postfix) with ESMTPSA id 816AA17E0861; + Wed, 26 Feb 2025 19:45:07 +0100 (CET) +Received: by jupiter.universe (Postfix, from userid 1000) + id 361F2480038; Wed, 26 Feb 2025 19:45:07 +0100 (CET) +From: Sebastian Reichel +To: Marek Vasut , u-boot@lists.denx.de, + Jonas Karlman , Soeren Moch +Cc: Tim Harvey , + Philipp Tomsich , + Anand Moon , Maxim Kiselev , + Sebastian Reichel +Subject: [PATCH v2 3/4] usb: tcpm: print error on hard reset +Date: Wed, 26 Feb 2025 19:44:46 +0100 +Message-ID: <20250226184506.64114-4-sebastian.reichel@collabora.com> +X-Mailer: git-send-email 2.47.2 +In-Reply-To: <20250226184506.64114-1-sebastian.reichel@collabora.com> +References: <20250226184506.64114-1-sebastian.reichel@collabora.com> +MIME-Version: 1.0 +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +A USB-PD hard reset involves removing the voltage from VBUS for some +time. So basically it has the same effect as removing the USB-C plug +for a short moment. If the machine is powered from the USB-C port and +does not have a fallback supply (e.g. a battery), this will result in +a full machine reset due to power loss. + +Ideally we want to avoid triggering a hard reset on these boards. A +non-working USB-C port is probably better than unplanned reboots. But +boards with a backup supply should do the hard reset to get everything +working again. + +In theory it would be enough to check the self_powered property, but +it seems the property might not be configured consistently enough in +system firmwares. + +USB-PD hard resets should happen rarely in general, so let's at least +print an error message before the potential board reset happens. This +is also useful, since it immediately gives away which device triggered +the hard reset. + +Fixes: 1db4c0ac77e3 ("usb: tcpm: add core framework") +Signed-off-by: Sebastian Reichel +--- + drivers/usb/tcpm/tcpm.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c +index 786d92fa4c6f..909fe2ef4fcb 100644 +--- a/drivers/usb/tcpm/tcpm.c ++++ b/drivers/usb/tcpm/tcpm.c +@@ -1711,6 +1711,8 @@ static void run_state_machine(struct udevice *dev) + + /* Hard_Reset states */ + case HARD_RESET_SEND: ++ if (!port->self_powered && port->port_type == TYPEC_PORT_SNK) ++ dev_err(dev, "Initiating hard-reset, which might result in machine power-loss.\n"); + tcpm_pd_transmit(dev, TCPC_TX_HARD_RESET, NULL); + tcpm_set_state(dev, HARD_RESET_START, 0); + port->wait_dr_swap_message = false; + +From patchwork Wed Feb 26 18:44:47 2025 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: Sebastian Reichel +X-Patchwork-Id: 2052542 +X-Patchwork-Delegate: marek.vasut@gmail.com +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.a=rsa-sha256 header.s=mail header.b=K4mNmlOy; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de + (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; + envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) +Received: from phobos.denx.de (phobos.denx.de + [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (secp384r1)) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4Z33Lk40FPz1yCp + for ; Thu, 27 Feb 2025 05:45:18 +1100 (AEDT) +Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) + by phobos.denx.de (Postfix) with ESMTP id DAFC780FF2; + Wed, 26 Feb 2025 19:45:12 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de +Authentication-Results: phobos.denx.de; + dkim=pass (2048-bit key; + unprotected) header.d=collabora.com header.i=@collabora.com + header.b="K4mNmlOy"; + dkim-atps=neutral +Received: by phobos.denx.de (Postfix, from userid 109) + id 56A22810F9; Wed, 26 Feb 2025 19:45:11 +0100 (CET) +X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de +X-Spam-Level: +X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, + DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, + SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 +Received: from bali.collaboradmins.com (bali.collaboradmins.com + [IPv6:2a01:4f8:201:9162::2]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id 217E080FF2 + for ; Wed, 26 Feb 2025 19:45:08 +0100 (CET) +Authentication-Results: phobos.denx.de; + dmarc=pass (p=none dis=none) header.from=collabora.com +Authentication-Results: phobos.denx.de; + spf=pass smtp.mailfrom=sebastian.reichel@collabora.com +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; + s=mail; t=1740595507; + bh=FeXZr6pfjIqGXvnsLHDigD702EmgVNH91IWVsD16udQ=; + h=From:To:Cc:Subject:Date:In-Reply-To:References:From; + b=K4mNmlOycXzLuJnNeDxyXLVCeZWNr//ycRqDt3ld9634ThDvJ0+y49X3z2nYW+fei + HCqH2AoFiXj7khjiFpwCA4xOlYaTrF9yb0M9ApRxJ8vGuslNIK2k9osj8IJMoWmY8S + fEez4H6Wso4VamCnXKCze2G5np5mhola5QxSnIJ2CXdFP9TM1x54P+XyeJMX6IZK0X + lpZ0R8mACHGgXnkBASRMbo0CnLfSVrUgA83A0FHT7UgxfW8399wHol/FBakg5WS8nt + 47154TDW4ikoGF4dHBeD0KemJSR7I4F+nnUVQfgg8sXZKVm4yilBT+yx3WWBVCjQDl + 3igqfexnaUKnA== +Received: from jupiter.universe (dyndsl-091-249-076-032.ewe-ip-backbone.de + [91.249.76.32]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest + SHA256) + (No client certificate requested) (Authenticated sender: sre) + by bali.collaboradmins.com (Postfix) with ESMTPSA id 7FBB317E065A; + Wed, 26 Feb 2025 19:45:07 +0100 (CET) +Received: by jupiter.universe (Postfix, from userid 1000) + id 37B6A480039; Wed, 26 Feb 2025 19:45:07 +0100 (CET) +From: Sebastian Reichel +To: Marek Vasut , u-boot@lists.denx.de, + Jonas Karlman , Soeren Moch +Cc: Tim Harvey , + Philipp Tomsich , + Anand Moon , Maxim Kiselev , + Sebastian Reichel +Subject: [PATCH v2 4/4] usb: tcpm: improve data role mismatch error recovery +Date: Wed, 26 Feb 2025 19:44:47 +0100 +Message-ID: <20250226184506.64114-5-sebastian.reichel@collabora.com> +X-Mailer: git-send-email 2.47.2 +In-Reply-To: <20250226184506.64114-1-sebastian.reichel@collabora.com> +References: <20250226184506.64114-1-sebastian.reichel@collabora.com> +MIME-Version: 1.0 +X-BeenThere: u-boot@lists.denx.de +X-Mailman-Version: 2.1.39 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.denx.de +Sender: "U-Boot" +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean + +On Radxa ROCK 5B I managed to get U-Boot into an endless loop of +printing + +fusb302 usb-typec@22: TCPM: data role mismatch, initiating error recovery + +messages by changing the data role in Linux and then rebooting the +system. This is happening because the external device (A cheap USB-C hub +powered through a USB-C PD power-supply) kept its state and the error +recovery path for non self-powered devices is not enough to change it. + +Avoid this by swapping our own data role when the error recovery stage +is reached for a port, which is not self-powered. Right now data support +is limited anyways and once proper support is added we can use the data +role swap request to get the desired data direction after the initial +negotiation completed. + +Fixes: 1db4c0ac77e3 ("usb: tcpm: add core framework") +Signed-off-by: Sebastian Reichel +--- + drivers/usb/tcpm/tcpm.c | 30 +++++++++++++++++++++++++++--- + 1 file changed, 27 insertions(+), 3 deletions(-) + +diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c +index 909fe2ef4fcb..12d66d470f9a 100644 +--- a/drivers/usb/tcpm/tcpm.c ++++ b/drivers/usb/tcpm/tcpm.c +@@ -833,6 +833,28 @@ static void tcpm_pd_ctrl_request(struct udevice *dev, + } + } + ++static void tcpm_recover_data_role_mismatch(struct udevice *dev) ++{ ++ struct tcpm_port *port = dev_get_uclass_plat(dev); ++ ++ dev_err(dev, "TCPM: data role mismatch, initiating error recovery\n"); ++ if (port->self_powered) { ++ tcpm_set_state(dev, ERROR_RECOVERY, 0); ++ return; ++ } ++ ++ /* ++ * The error recovery will not help for devices, which are not ++ * self-powered because the error recovery avoids killing the board ++ * power. Since this can happen early on sending ++ * a DR_SWAP request is not sensible. Instead let's change our own ++ * data role. It can be swapped back once USB-PD reached the ready ++ * state. ++ */ ++ tcpm_set_roles(dev, true, port->pwr_role, ++ port->data_role == TYPEC_HOST ? TYPEC_DEVICE : TYPEC_HOST); ++} ++ + static void tcpm_pd_rx_handler(struct udevice *dev, + const struct pd_message *msg) + { +@@ -867,9 +889,11 @@ static void tcpm_pd_rx_handler(struct udevice *dev, + remote_is_host = !!(le16_to_cpu(msg->header) & PD_HEADER_DATA_ROLE); + local_is_host = port->data_role == TYPEC_HOST; + if (remote_is_host == local_is_host) { +- dev_err(dev, "TCPM: data role mismatch, initiating error recovery\n"); +- tcpm_set_state(dev, ERROR_RECOVERY, 0); +- } else { ++ tcpm_recover_data_role_mismatch(dev); ++ local_is_host = port->data_role == TYPEC_HOST; ++ } ++ ++ if (remote_is_host != local_is_host) { + if (cnt) + tcpm_pd_data_request(dev, msg); + else diff --git a/pkgbuilds/uboot-asahi/disable-VBE-by-default.patch b/pkgbuilds/uboot-asahi/disable-VBE-by-default.patch new file mode 100644 index 0000000..1f1b710 --- /dev/null +++ b/pkgbuilds/uboot-asahi/disable-VBE-by-default.patch @@ -0,0 +1,32 @@ +From d9e3a49bc2a29922da5bddd95772279f6edba802 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Fri, 18 Aug 2023 13:28:05 +0100 +Subject: [PATCH] disable VBE by default + +The VBE protocol needs explicit device support and as +such isn't particularly useful by itself without that, +it also adds size and the potential of an attack vector +so devices that wish to use this protocol should +explicitly opt in to it like all other large features +in U-Boot. + +Signed-off-by: Peter Robinson +--- + boot/Kconfig | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/boot/Kconfig b/boot/Kconfig +index 30eb5b328d7..e8c3fbcb11d 100644 +--- a/boot/Kconfig ++++ b/boot/Kconfig +@@ -635,7 +635,6 @@ config BOOTMETH_QFW + config BOOTMETH_VBE + bool "Bootdev support for Verified Boot for Embedded" + depends on FIT +- default y + select BOOTMETH_GLOBAL + select EVENT + help +-- +2.49.0 + diff --git a/pkgbuilds/uboot-asahi/enable-bootmenu-by-default.patch b/pkgbuilds/uboot-asahi/enable-bootmenu-by-default.patch new file mode 100644 index 0000000..1ecd514 --- /dev/null +++ b/pkgbuilds/uboot-asahi/enable-bootmenu-by-default.patch @@ -0,0 +1,49 @@ +From a956480a6d52ae90ef4a46275c2ee29a4074de36 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Fri, 18 Aug 2023 23:10:42 +0100 +Subject: [PATCH] enable bootmenu by default + +We want the boot menu on all Fedora devices as it makes +it a whole lot more user friendly. + +Signed-off-by: Peter Robinson +--- + boot/Kconfig | 2 ++ + cmd/Kconfig | 1 + + 2 files changed, 3 insertions(+) + +diff --git a/boot/Kconfig b/boot/Kconfig +index 467b09e2350..ad67b1f65a6 100644 +--- a/boot/Kconfig ++++ b/boot/Kconfig +@@ -1281,6 +1281,7 @@ config BOOTDELAY + + config AUTOBOOT_KEYED + bool "Stop autobooting via specific input key / string" ++ default y + help + This option enables stopping (aborting) of the automatic + boot feature only by issuing a specific input key or +@@ -1433,6 +1434,7 @@ config AUTOBOOT_MENUKEY + + config AUTOBOOT_MENU_SHOW + bool "Show a menu on boot" ++ default y + depends on CMD_BOOTMENU + help + This enables the boot menu, controlled by environment variables +diff --git a/cmd/Kconfig b/cmd/Kconfig +index 43ca10f69cc..3d39f2914cc 100644 +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -413,6 +413,7 @@ source lib/efi_selftest/Kconfig + + config CMD_BOOTMENU + bool "bootmenu" ++ default y + select MENU + select CHARSET + help +-- +2.41.0 + diff --git a/pkgbuilds/uboot-asahi/openssl-no-engine.patch b/pkgbuilds/uboot-asahi/openssl-no-engine.patch new file mode 100644 index 0000000..ec771f5 --- /dev/null +++ b/pkgbuilds/uboot-asahi/openssl-no-engine.patch @@ -0,0 +1,178 @@ +From 88a0fe6c1fda46c8bacd861044f39930ce1c9bc0 Mon Sep 17 00:00:00 2001 +From: Davide Cavalca +Date: Sun, 29 Sep 2024 17:20:59 -0700 +Subject: [PATCH] lib: allow building when OpenSSL ENGINE is disabled + +Recent OpenSSL releases deprecate ENGINE, and some distributions have +started to remove it altogether. Gate the logic using it behind a +feature check so that we'll build regardless. + +Signed-off-by: Davide Cavalca +--- + lib/aes/aes-encrypt.c | 2 ++ + lib/rsa/rsa-sign.c | 22 ++++++++++++++++++++++ + 2 files changed, 24 insertions(+) + +diff --git a/lib/aes/aes-encrypt.c b/lib/aes/aes-encrypt.c +index e74e35eaa2..7758438c32 100644 +--- a/lib/aes/aes-encrypt.c ++++ b/lib/aes/aes-encrypt.c +@@ -16,7 +16,9 @@ + #include + #include + #include ++#ifndef OPENSSL_NO_ENGINE + #include ++#endif + #include + + #if OPENSSL_VERSION_NUMBER >= 0x10000000L +diff --git a/lib/rsa/rsa-sign.c b/lib/rsa/rsa-sign.c +index 2304030e32..bb9c93ea65 100644 +--- a/lib/rsa/rsa-sign.c ++++ b/lib/rsa/rsa-sign.c +@@ -19,7 +19,9 @@ + #include + #include + #include ++#ifndef OPENSSL_NO_ENGINE + #include ++#endif + + static int rsa_err(const char *msg) + { +@@ -89,6 +91,7 @@ err_cert: + return ret; + } + ++#ifndef OPENSSL_NO_ENGINE + /** + * rsa_engine_get_pub_key() - read a public key from given engine + * +@@ -157,6 +160,7 @@ static int rsa_engine_get_pub_key(const char *keydir, const char *name, + + return 0; + } ++#endif + + /** + * rsa_get_pub_key() - read a public key +@@ -170,8 +174,10 @@ static int rsa_engine_get_pub_key(const char *keydir, const char *name, + static int rsa_get_pub_key(const char *keydir, const char *name, + ENGINE *engine, EVP_PKEY **evpp) + { ++#ifndef OPENSSL_NO_ENGINE + if (engine) + return rsa_engine_get_pub_key(keydir, name, engine, evpp); ++#endif + return rsa_pem_get_pub_key(keydir, name, evpp); + } + +@@ -217,6 +223,7 @@ static int rsa_pem_get_priv_key(const char *keydir, const char *name, + return 0; + } + ++#ifndef OPENSSL_NO_ENGINE + /** + * rsa_engine_get_priv_key() - read a private key from given engine + * +@@ -293,6 +300,7 @@ static int rsa_engine_get_priv_key(const char *keydir, const char *name, + + return 0; + } ++#endif + + /** + * rsa_get_priv_key() - read a private key +@@ -306,9 +314,11 @@ static int rsa_engine_get_priv_key(const char *keydir, const char *name, + static int rsa_get_priv_key(const char *keydir, const char *name, + const char *keyfile, ENGINE *engine, EVP_PKEY **evpp) + { ++#ifndef OPENSSL_NO_ENGINE + if (engine) + return rsa_engine_get_priv_key(keydir, name, keyfile, engine, + evpp); ++#endif + return rsa_pem_get_priv_key(keydir, name, keyfile, evpp); + } + +@@ -325,6 +335,7 @@ static int rsa_init(void) + return 0; + } + ++#ifndef OPENSSL_NO_ENGINE + static int rsa_engine_init(const char *engine_id, ENGINE **pe) + { + const char *key_pass; +@@ -380,6 +391,7 @@ static void rsa_engine_remove(ENGINE *e) + ENGINE_free(e); + } + } ++#endif + + static int rsa_sign_with_key(EVP_PKEY *pkey, struct padding_algo *padding_algo, + struct checksum_algo *checksum_algo, +@@ -471,11 +483,13 @@ int rsa_sign(struct image_sign_info *info, + if (ret) + return ret; + ++#ifndef OPENSSL_NO_ENGINE + if (info->engine_id) { + ret = rsa_engine_init(info->engine_id, &e); + if (ret) + return ret; + } ++#endif + + ret = rsa_get_priv_key(info->keydir, info->keyname, info->keyfile, + e, &pkey); +@@ -486,17 +500,21 @@ int rsa_sign(struct image_sign_info *info, + if (ret) + goto err_sign; + ++#ifndef OPENSSL_NO_ENGINE + EVP_PKEY_free(pkey); + if (info->engine_id) + rsa_engine_remove(e); + + return ret; ++#endif + + err_sign: + EVP_PKEY_free(pkey); + err_priv: ++#ifndef OPENSSL_NO_ENGINE + if (info->engine_id) + rsa_engine_remove(e); ++#endif + return ret; + } + +@@ -636,11 +654,13 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest) + ENGINE *e = NULL; + + debug("%s: Getting verification data\n", __func__); ++#ifndef OPENSSL_NO_ENGINE + if (info->engine_id) { + ret = rsa_engine_init(info->engine_id, &e); + if (ret) + return ret; + } ++#endif + ret = rsa_get_pub_key(info->keydir, info->keyname, e, &pkey); + if (ret) + goto err_get_pub_key; +@@ -717,8 +737,10 @@ done: + err_get_params: + EVP_PKEY_free(pkey); + err_get_pub_key: ++#ifndef OPENSSL_NO_ENGINE + if (info->engine_id) + rsa_engine_remove(e); ++#endif + + if (ret) + return ret; +-- +2.46.2 + diff --git a/pkgbuilds/uboot-asahi/p3450-fix-board.patch b/pkgbuilds/uboot-asahi/p3450-fix-board.patch new file mode 100644 index 0000000..74475d5 --- /dev/null +++ b/pkgbuilds/uboot-asahi/p3450-fix-board.patch @@ -0,0 +1,25 @@ +From c9b65320d64a60cde74c4c1f9cb4a05198a456c2 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Wed, 10 Sep 2025 13:27:52 +0100 +Subject: [PATCH] further size reductions + +--- + configs/p3450-0000_defconfig | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/configs/p3450-0000_defconfig b/configs/p3450-0000_defconfig +index 2ebcf8b83fc..a5e717a02ed 100644 +--- a/configs/p3450-0000_defconfig ++++ b/configs/p3450-0000_defconfig +@@ -27,6 +27,8 @@ CONFIG_CONSOLE_MUX=y + CONFIG_SYS_STDIO_DEREGISTER=y + CONFIG_SYS_PROMPT="Tegra210 (P3450-0000) # " + # CONFIG_BOOTM_PLAN9 is not set ++# CONFIG_SYS_DTC_PAD_BYTES is not set ++# CONFIG_LEGACY_IMAGE_FORMAT is not set + # CONFIG_BOOTM_RTEMS is not set + # CONFIG_BOOTM_VXWORKS is not set + # CONFIG_CMD_ELF is not set +-- +2.51.0 + diff --git a/pkgbuilds/uboot-asahi/pylibfdt-Replace-removed-SWIG-Python-2-compatibility-macros.patch b/pkgbuilds/uboot-asahi/pylibfdt-Replace-removed-SWIG-Python-2-compatibility-macros.patch new file mode 100644 index 0000000..43f321f --- /dev/null +++ b/pkgbuilds/uboot-asahi/pylibfdt-Replace-removed-SWIG-Python-2-compatibility-macros.patch @@ -0,0 +1,234 @@ +From patchwork Tue Aug 11 13:34:33 2026 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +X-Patchwork-Submitter: Jaipaul Cheernam +X-Patchwork-Id: 2283713 +Return-Path: +X-Original-To: incoming@patchwork.ozlabs.org +Delivered-To: patchwork-incoming@legolas.ozlabs.org +Authentication-Results: legolas.ozlabs.org; + dkim=fail reason="signature verification failed" (2048-bit key; + unprotected) header.d=lists.u-boot-project.org + header.i=@lists.u-boot-project.org header.a=rsa-sha256 header.s=default + header.b=N2mjzMfT; + dkim-atps=neutral +Authentication-Results: legolas.ozlabs.org; + spf=pass (sender SPF authorized) smtp.mailfrom=lists.u-boot-project.org + (client-ip=140.211.166.137; helo=smtp4.osuosl.org; + envelope-from=u-boot-bounces@lists.u-boot-project.org; + receiver=patchwork.ozlabs.org) +Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) + (No client certificate requested) + by legolas.ozlabs.org (Postfix) with ESMTPS id 4hKCMS4PSRz1xtl + for ; Tue, 11 Aug 2026 23:36:36 +1000 (AEST) +Received: from localhost (localhost [127.0.0.1]) + by smtp4.osuosl.org (Postfix) with ESMTP id A0013402ED; + Tue, 11 Aug 2026 13:36:34 +0000 (UTC) +X-Virus-Scanned: amavis at osuosl.org +Received: from smtp4.osuosl.org ([127.0.0.1]) + by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP + id p3bOda34E2S1; Tue, 11 Aug 2026 13:36:34 +0000 (UTC) +X-Comment: SPF check N/A for local connections - client-ip=140.211.166.142; + helo=lists1.osuosl.org; + envelope-from=u-boot-bounces@lists.u-boot-project.org; receiver= +DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org C8D6040520 +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=lists.u-boot-project.org ; s=default; t=1786455393; + bh=cBVuDcRfAz5FmVboiaFLD22qM9rj4tnKRC4LViq6X68=; + h=From:To:Cc:Subject:Date:List-Id:List-Unsubscribe:List-Archive: + List-Post:List-Help:List-Subscribe:From; + b=N2mjzMfTYSqmTzk5FULwaFpMrGP5bVx/I9fHulmwzUjiqqJ9tTuxFgg7YCzUy5gHA + nOaWzLi5SSXsmRZgFXcjHu42Dlk9xTHR2qq/4dS0Jbc0rahx6+PQT1YjAWBHDpsl26 + WZH2MDE/Gv/VVK7wjRp2lYfVtOs39dZAWUSyvYaH8vRwIKUb696ujmQYkGRa4RSkVO + WoL+nEFC1B1XaZWlY7HLMogdXPKXD4VqvBU86Oc/lzjf/NAZAjtkKnBLCG8TC2l2AY + E/TYLlN3XJYwSxHLzMqMCU0/TSwwT1z4kgibHFNq8XUpt1VwMloPxSTvHz9JvZNYOs + wwM5F4y6KhaDw== +Received: from lists1.osuosl.org (lists1.osuosl.org [140.211.166.142]) + by smtp4.osuosl.org (Postfix) with ESMTP id C8D6040520; + Tue, 11 Aug 2026 13:36:33 +0000 (UTC) +X-Original-To: u-boot@lists.u-boot-project.org +Delivered-To: u-boot@lists.u-boot-project.org +Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) + by lists1.osuosl.org (Postfix) with ESMTP id 38B5E259 + for ; Tue, 11 Aug 2026 13:34:51 +0000 (UTC) +Received: from localhost (localhost [127.0.0.1]) + by smtp3.osuosl.org (Postfix) with ESMTP id 2B001607C7 + for ; Tue, 11 Aug 2026 13:34:51 +0000 (UTC) +X-Virus-Scanned: amavis at osuosl.org +Received: from smtp3.osuosl.org ([127.0.0.1]) + by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP + id eGFQZMQurFKG for ; + Tue, 11 Aug 2026 13:34:50 +0000 (UTC) +X-Comment: SPF check N/A for local connections - client-ip=85.214.62.61; + helo=phobos.denx.de; envelope-from=jaipaul.cheernam@est.tech; + receiver= +DMARC-Filter: OpenDMARC Filter v1.4.2 smtp3.osuosl.org DCF5E607BD +DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org DCF5E607BD +Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) + by smtp3.osuosl.org (Postfix) with ESMTPS id DCF5E607BD + for ; Tue, 11 Aug 2026 13:34:49 +0000 (UTC) +Received: by phobos.denx.de (Postfix, from userid 109) + id 1444784A30; Tue, 11 Aug 2026 15:34:47 +0200 (CEST) +Received: from MRWPR03CU001.outbound.protection.outlook.com + (mail-francesouthazlp170110003.outbound.protection.outlook.com + [IPv6:2a01:111:f403:c207::3]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) + (No client certificate requested) + by phobos.denx.de (Postfix) with ESMTPS id D7A5C849A1 + for ; Tue, 11 Aug 2026 15:34:44 +0200 (CEST) +ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; + b=F/iYm8I1iNna6pUS6fgZzFjCemWpknd0tJi480HHtcO6J5oiHNQHuS8TUlSvhc+RIG6xiOAg2WmQnvfUJCgjWzvLxQdJ8wGHLOg/TvimuL/XDMdwtYzqUN6b4PC3SYhJZk3sRSEZj6+3q5TRszIXJDsKEPqWkQE5oOVP9n1FY9ysY6EsjQMakTDpQ/RpkUkYgn50oLOyLLsDl3H0VSmZGfHqX0QOkwYIW/T8k3Fx/sLrlSiTfKiCPwrdnhwz7ABjlA79EvSU6/TvI/nefnSXeyUhYj0S6rPUadLIvlHFLjaFZ93ldV9COTfx96z44ltNtyAmvkIlMc6g22V3Dv8hAg== +ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; + s=arcselector10001; + h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; + bh=cBVuDcRfAz5FmVboiaFLD22qM9rj4tnKRC4LViq6X68=; + b=kO0F3iz0TnoDLl3Fiv7ulw2CObdD+lulFmKuohamR8N6FEc5UzGf7TInNwu6ce7RXGSVuFd7hfaEsq6r/o3PhBgHar8MJtVXKc+dvUPG5YuOV7nTz6qTe9trkJKfQmaFIuzBrRusEp8J4y32eMnjVSFzFXNV2eI9S3+WCoakNjmNFR8JoZWsaeqgxsTl6CGsWOYvktuUErx0GcRg4AgQmZU2EiDiD3VVrXKk+AlQY4GOTcgDJSHsqmrqn/xlr1O+9o2xvoc0RJMvz9upXok7Jo2eNeoty0UCLuSLzfxRnVJJriUkIOxFFdTQjuVzoeQMNSB7k6iXu8tgDwbcBiyzkg== +ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass + smtp.mailfrom=est.tech; dmarc=pass action=none header.from=est.tech; + dkim=pass header.d=est.tech; arc=none +Received: from DU7PPF66507B2D7.EURP189.PROD.OUTLOOK.COM (2603:10a6:18:3::ad4) + by VI1P18901MB0623.EURP189.PROD.OUTLOOK.COM (2603:10a6:800:125::14) + with Microsoft SMTP Server (version=TLS1_2, + cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.315.11; Tue, 11 Aug + 2026 13:34:41 +0000 +Received: from DU7PPF66507B2D7.EURP189.PROD.OUTLOOK.COM + ([fe80::7ab2:c6af:6760:5c85]) by DU7PPF66507B2D7.EURP189.PROD.OUTLOOK.COM + ([fe80::7ab2:c6af:6760:5c85%7]) with mapi id 15.21.0315.008; Tue, 11 Aug 2026 + 13:34:41 +0000 +From: Jaipaul Cheernam +To: u-boot@lists.denx.de +Cc: Jaipaul Cheernam +Subject: [PATCH] pylibfdt: Replace removed SWIG Python 2 compatibility macros +Date: Tue, 11 Aug 2026 15:34:33 +0200 +Message-Id: <20260811133433.18852-1-jaipaul.cheernam@est.tech> +X-Mailer: git-send-email 2.39.5 (Apple Git-154) +X-ClientProxiedBy: LO4P265CA0183.GBRP265.PROD.OUTLOOK.COM + (2603:10a6:600:311::6) To DU7PPF66507B2D7.EURP189.PROD.OUTLOOK.COM + (2603:10a6:18:3::ad4) +MIME-Version: 1.0 +X-MS-PublicTrafficType: Email +X-MS-TrafficTypeDiagnostic: DU7PPF66507B2D7:EE_|VI1P18901MB0623:EE_ +X-MS-Office365-Filtering-Correlation-Id: 8a2304be-1609-4ac3-d596-08def7ad4c24 +X-MS-Exchange-SenderADCheck: 1 +X-MS-Exchange-AntiSpam-Relay: 0 +X-Microsoft-Antispam: BCL:0; + ARA:13230040|366016|23010399003|376014|1800799024|6133799003|10067099003|56012099006|11063799006|18002099003; +X-Microsoft-Antispam-Message-Info: + ADZCK8hJVm6F3wH0lN+1CH3ycpX/oWr0C7rdxob6unX1/P+tCnAEcRYEgIIPZwnHqbQDW5p6JD2T3EG67ZpnAdgv+1d2HZMQepsfe3LElh3IHx0BPlzA3Vty6psoCgoWs4SMcNTrIVV3UqBrl3s/ttqDI2opVebhHDoAf8Z50f5xlclKz2O8gSMv8FOB9NyfaRUwtlAVgkE428WD6Wia/D/e92aD33o3Z4r2Pz7UzkUhLPLrNeVcSYh94xaUrbMlilcRmFygJWWpgeZsh+7a8kFV/eb42A37qzZ5DcE2yO5PZaA4ckohcSQ2QCA+BnKRUKh3rxkKmCeVglTgdpKg9qvpxmE+Ndzo97z6t8EimCMtdnMQxkDIA6yZiqO7xc2qjdfQ7azC4KZ3h0xq4J04c+HxOzwrQ6t/1IZd0XkN9IrgCyVRhOPL593gaeMD9Iapy4fOTZuQTL6PmUjCMNC7KNiyzyg2gtgWYist7MODeGSDNRUBR3X4hOON3nYYRXl/t+WsxRKhD5ykRF0EUEGh140FdrrFz00eXO6LIIbJUyaf1ud/SBpIw15warKR5ojDTyGUIuhg+toVhwib8/OGuFI5VxDdfgfCPVncMzarvbqXd3nx8r/NAjbPGYY9yKoOEoJ4CVfWa5NbVK3z/aCJlrnBCNTiYc8m29cvV3Ch808= +X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; + IPV:NLI; SFV:NSPM; H:DU7PPF66507B2D7.EURP189.PROD.OUTLOOK.COM; PTR:; + CAT:NONE; + SFS:(13230040)(366016)(23010399003)(376014)(1800799024)(6133799003)(10067099003)(56012099006)(11063799006)(18002099003); + DIR:OUT; SFP:1101; +X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 +X-MS-Exchange-AntiSpam-MessageData-0: + v1SJ9iF1FZ4Ddch8PL37hr0CiYoSTtojtB+aom++qNSm/JaqntarQvycHwKOYPL0X3VIS0vCDGJSC3b6gdCPlWLoGPlNDQJYLlTHOfds4mIdrbG5HCQ8X4EoM9uDG/9vWdsUSeRJnh1D8Q1gwPU2JRfArF7684CnJny/jZyepPyTurvWXmjo6skYOwzuRosHH9ZCocSL2xHtHu2N0HirNE+qvbo53SlhzUhQzvvoLlOHVHnSdJDTDRUfPTF3lginIWrs2IzeZkaZIbuV4+/dW5CfSJWX0Y/tHWJZ5Ny7Lbc+uG5kOidZBfaCN8UfKqZ5RTC1dkx0X6BKwkuKC3/unMfJIZAQg8Q5QmhF1uftv3XcyCrH0gNCyyVAl7lLegxBbzWJdGZPbfLh2STTurHhzeJ3hJtClRfwKE03a+TYu+44Ekc0nUdTCdn7Hpf6hnBnTmScp1QWP/toxL70lv4JhkNeZLia+I7vw7Elk6PIK1KWHY2Wlm1sGSiI2jlDnRBpPSDakUhEPWcFI+jz2XzJZ9+sBh/bzsmPqLeH71fS1cDiOyQG5lG0OWoewtDfmk4QE1ViS8UTY6oeE1lL7RNarDf+KoDL75rAwUtJATqdEqfaY1fxnRrVfaawTZIL4jYe56ITk7NiAhZ2aJXJ9WvxvXsu2Q4f+RMBoMuYSuf/B4Eil873iPGk7f9KcFV0F9e7xVcnb6bMZ2xOOxFcuZ/FVblgRYviX75D9uroJan3ZJIBqmgQL1Mq2rfIAMctUIcTYWBg8qFOVymFr22cxfzoD/puCigGWDWKl2bRk8s4WaN7PuznMXOrdvs3d9FMEQfy5oyxE4dpv/527M2l0Lqa5bGEK4y20y7FYfu/js6Ja5t38S1ZgQV3SIEqvAzCHWbYOBgMg/969p32OF20GFx7ZxF+rWXJ5QLbfimyrZ0jw+nuPvaA1BmvtjCgBLM24eIvdJuHhRjEqaCBEGwGutPeikNcxQ2x45eMlXc1OPZymG5DLgq2FMyUyQAoCrZ70YMCO3yNThR+Vfh8qc/qNpl7pLwIqvT7/5x9ZYPBINAjWwOuutEdBTH2D15WAsKB8IcxVMpjpEhaNNAMEEr3qaahViyCwFhx8GZY39yQRdbyb7dweQK/2hPFY/M2TSiGPLbxGIVOxu048L2ePB1ZMCT9v6/7pzft7L9LKOAmj5fj7zMIm9IzfaYRiPbT9KkGvcbOQ85BMLZdw4QJYUpUt9PKf6zxidBmSUfD8WAObbMF8wW9NFRSEeEdh5CMh1lRyEnFsvCFJov8+CJAcK0kYeXjJwcbaDiAKIWGk8MF8lPWIZk/cFpbsetUN6W5LQT+oxa4qttRPpjixTvJFK9i8NUHuPtZzJ0Knv9rt/4VmG7oziwVngajIkj5ByXT21gg1iX8EEqLJznzX5pHeKWV9UAvgm+fmT+zhrgV4LL+ySkPaSSNJz9eBvp3qxU4486MXyw0ISCob64j6LkZ2tYGULV2PF8caUN+J5l1cUu2ySXr7Pt4LyoMKMk/7QEJgUqzxB4T//af1ASXB0//pNSTXgPbo4eCPFtqTkVDD+KxXRJsNyGVmSJGfDE67Y7mF28SQidNW7gguYRcn7DJHFxNm1/Co6kVsDf4Xp9BOQ2HROs67mxZqicBzEqifFMBNigrr4qcA9Qcaqpkewrz9/7zW8TBs/5v6KWQHbMKffzp6PPtnwX/rVrK3VBd8TusgBYky7Q2scVbONq4qDA/ErH5tWob1bBCIPdzl9ngXrCgsknnFHs= +X-OriginatorOrg: est.tech +X-MS-Exchange-CrossTenant-Network-Message-Id: + 8a2304be-1609-4ac3-d596-08def7ad4c24 +X-MS-Exchange-CrossTenant-AuthSource: DU7PPF66507B2D7.EURP189.PROD.OUTLOOK.COM +X-MS-Exchange-CrossTenant-AuthAs: Internal +X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Aug 2026 13:34:41.3741 (UTC) +X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted +X-MS-Exchange-CrossTenant-Id: d2585e63-66b9-44b6-a76e-4f4b217d97fd +X-MS-Exchange-CrossTenant-MailboxType: HOSTED +X-MS-Exchange-CrossTenant-UserPrincipalName: + 9S3MTmbV8NoDKIO+2csvXOXSX+h+vv/3+dsv/aYgYwFK6nBqKPXaQTK18nwZ9STbTS8eocOH32TrCptEz96k1m5bWAyhRvMPyQD1xqNBHC4= +X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1P18901MB0623 +X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de +X-Virus-Status: Clean +X-Mailman-Approved-At: Tue, 11 Aug 2026 13:36:32 +0000 +X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=est.tech; s=selector1; + h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; + bh=cBVuDcRfAz5FmVboiaFLD22qM9rj4tnKRC4LViq6X68=; + b=pqeWauqz6d5LeBvZqnf0Vhya3rUJMPVJBkYn0KjHe11y8MAnCj2YKA4NsHfxYgJwkrtzBngWWBmMuUwulnTUPfh3czsocU/HiR1U+jCVAcvcPj55A0JETJ4yzxa5edLmeRYJuzsnnkbx/PCnabanIJQNikIQiZPSYzLujjk5w+8uDoqw9b5fy+0DrexXTt4ygBBpl5++UWUu/ZM79h7yIW1OIMNbg9SdLZVbjdgFl1jrxU0e8eJEGgOVWAwAHQ4vChd/Fanm6NkU/8YU99cRqrLXjjOZedJF5ZbuxnLqfQev0dTeHnqf7PnTtRKIXcexkdiggESk1fsx72bytELfag== +X-Mailman-Original-Authentication-Results: smtp3.osuosl.org; + dmarc=none (p=none dis=none) + header.from=est.tech +X-Mailman-Original-Authentication-Results: smtp3.osuosl.org; + spf=fail smtp.mailfrom=est.tech +X-Mailman-Original-Authentication-Results: smtp3.osuosl.org; + dkim=pass (2048-bit key, + unprotected) header.d=est.tech header.i=@est.tech header.a=rsa-sha256 + header.s=selector1 header.b=pqeWauqz +X-Mailman-Original-Authentication-Results: phobos.denx.de; + dmarc=none (p=none dis=none) + header.from=est.tech +X-Mailman-Original-Authentication-Results: phobos.denx.de; spf=pass + smtp.mailfrom=jaipaul.cheernam@est.tech +X-Mailman-Original-Authentication-Results: phobos.denx.de; + dkim=pass (2048-bit key; + unprotected) header.d=est.tech header.i=@est.tech header.b="pqeWauqz"; + dkim-atps=neutral +X-Mailman-Original-Authentication-Results: dkim=none (message not signed) + header.d=none;dmarc=none action=none header.from=est.tech; +X-BeenThere: u-boot@lists.u-boot-project.org +X-Mailman-Version: 2.1.30 +Precedence: list +List-Id: U-Boot discussion +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +Errors-To: u-boot-bounces@lists.u-boot-project.org +Sender: "U-Boot" + +SWIG 4.5.0 removed Python 2 compatibility macros (PyInt_*, PyString_*) +from its runtime header pyhead.swg (see commit 79f7a2b7cb7d). Replace +them with their Python 3 C API equivalents: + +- PyString_FromString -> PyUnicode_FromString +- PyString_AsString -> PyBytes_AsString +- PyInt_AsLong -> PyLong_AsLong + +The replacements are safe since the macros were already aliased to +these exact functions in SWIG's Python 3 code path. + +This is a backport of dtc commit 5008d1d6a356 ("pylibfdt: Replace +removed SWIG Python 2 compatibility macros"). + +Signed-off-by: Jaipaul Cheernam +Reviewed-by: Jérémie Dautheribes +Tested-by: Jérémie Dautheribes +Signed-off-by: Peter Robinson +Reviewed-by: Peter Robinson +--- + scripts/dtc/pylibfdt/libfdt.i_shipped | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/scripts/dtc/pylibfdt/libfdt.i_shipped b/scripts/dtc/pylibfdt/libfdt.i_shipped +index e4659489..326a15c7 100644 +--- a/scripts/dtc/pylibfdt/libfdt.i_shipped ++++ b/scripts/dtc/pylibfdt/libfdt.i_shipped +@@ -1033,7 +1033,7 @@ typedef uint32_t fdt32_t; + PyObject *buff; + + if ($1) { +- resultobj = PyString_FromString( ++ resultobj = PyUnicode_FromString( + fdt_string(fdt1, fdt32_to_cpu($1->nameoff))); + buff = PyByteArray_FromStringAndSize( + (const char *)($1 + 1), fdt32_to_cpu($1->len)); +@@ -1064,13 +1064,13 @@ typedef uint32_t fdt32_t; + } + $1 = PyBytes_AsString($input); + %#else +- $1 = PyString_AsString($input); /* char *str */ ++ $1 = PyBytes_AsString($input); /* char *str */ + %#endif + } + + /* typemaps used for fdt_next_node() */ + %typemap(in, numinputs=1) int *depth (int depth) { +- depth = (int) PyInt_AsLong($input); ++ depth = (int) PyLong_AsLong($input); + $1 = &depth; + } + diff --git a/pkgbuilds/uboot-asahi/quiet-console.patch b/pkgbuilds/uboot-asahi/quiet-console.patch new file mode 100644 index 0000000..8c01eb5 --- /dev/null +++ b/pkgbuilds/uboot-asahi/quiet-console.patch @@ -0,0 +1,40 @@ +From: Marcelo Alcantara +Subject: [PATCH] apple: keep the console silent on Macs + +Omarchy boots the Mac to a splash, not a terminal: with CONFIG_SILENT_CONSOLE +the console is muted whenever the 'silent' variable is set, so the default +environment sets it. Only U-Boot is silenced (CONFIG_SILENT_U_BOOT_ONLY); +the kernel command line is untouched. +--- + board/apple/mac/mac.env | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/board/apple/mac/mac.env b/board/apple/mac/mac.env +--- a/board/apple/mac/mac.env ++++ b/board/apple/mac/mac.env +@@ -2,3 +2,4 @@ stdin=serial,usbkbd,spikbd,mtpkbd + stdout=vidconsole,serial + stderr=vidconsole,serial + boot_targets=nvme usb ++silent=1 + +The banner "U-Boot 2026.07 ..." is announced on the video console after +relocation through console_puts_select(), which never looks at the silent +flag; a silent console stays silent for the banner too. +--- + common/console.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/common/console.c b/common/console.c +--- a/common/console.c ++++ b/common/console.c +@@ -1022,6 +1022,9 @@ int console_announce_r(void) + #if !CONFIG_IS_ENABLED(PRE_CONSOLE_BUFFER) + char buf[DISPLAY_OPTIONS_BANNER_LENGTH]; + ++ if (IS_ENABLED(CONFIG_SILENT_CONSOLE) && (gd->flags & GD_FLG_SILENT)) ++ return 0; ++ + display_options_get_banner(false, buf, sizeof(buf)); + + console_puts_select(stdout, false, buf); diff --git a/pkgbuilds/uboot-asahi/raspberrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch b/pkgbuilds/uboot-asahi/raspberrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch new file mode 100644 index 0000000..d6612ee --- /dev/null +++ b/pkgbuilds/uboot-asahi/raspberrypi-Add-quirk-for-RPi5-2Gb-rev-1.0.patch @@ -0,0 +1,32 @@ +From 72fd4fdb54721a31d2b4e9f95fdd3b3e398bb2c0 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Sun, 12 Apr 2026 01:14:12 +0100 +Subject: [PATCH] board/raspberrypi: Add quirk for RPi5 2Gb rev 1.0 + +All 2Gb Raspberry Pi 5s use the BCM2712D0 silicon, but +the early boards were still rev 1.0 so we need a quirk +to ensure the correct device tree is used. + +Signed-off-by: Peter Robinson +--- + board/raspberrypi/rpi/rpi.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c +index b0a1484c0fa..ff9cab6521b 100644 +--- a/board/raspberrypi/rpi/rpi.c ++++ b/board/raspberrypi/rpi/rpi.c +@@ -371,6 +371,10 @@ static void set_fdtfile(void) + const char *fdtfile; + int rev = revision & 0x0f; + ++ /* 2GB Pi 5B board rev 1.0 always has BCM2712D0 silicon */ ++ if (revision == 0xb04170) ++ rev = 1; ++ + if (env_get("fdtfile")) + return; + +-- +2.53.0 + diff --git a/pkgbuilds/uboot-asahi/rockchip-Enable-preboot-start-for-pci-usb.patch b/pkgbuilds/uboot-asahi/rockchip-Enable-preboot-start-for-pci-usb.patch new file mode 100644 index 0000000..30aad4d --- /dev/null +++ b/pkgbuilds/uboot-asahi/rockchip-Enable-preboot-start-for-pci-usb.patch @@ -0,0 +1,860 @@ +From a6909a16b4cc301f1007d9e75d02abb6d06a1ea7 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Thu, 28 May 2026 21:29:29 +0100 +Subject: [PATCH] rockchip: Enable preboot start for pci/usb + +Enable the preboot so nvme works OOTB + +Signed-off-by: Peter Robinson +--- + configs/anbernic-rgxx3-rk3566_defconfig | 2 ++ + configs/bpi-r2-pro-rk3568_defconfig | 2 ++ + configs/cm3588-nas-rk3588_defconfig | 2 ++ + configs/coolpi-4b-rk3588s_defconfig | 2 ++ + configs/coolpi-cm5-evb-rk3588_defconfig | 2 ++ + configs/evb-rk3568_defconfig | 2 ++ + configs/evb-rk3588_defconfig | 2 ++ + configs/firefly-rk3399_defconfig | 2 ++ + configs/generic-rk3568_defconfig | 2 ++ + configs/generic-rk3588_defconfig | 2 ++ + configs/jaguar-rk3588_defconfig | 2 ++ + configs/lubancat-2-rk3568_defconfig | 2 ++ + configs/nanopc-t4-rk3399_defconfig | 2 ++ + configs/nanopc-t6-rk3588_defconfig | 2 ++ + configs/nanopi-r5c-rk3568_defconfig | 2 ++ + configs/nanopi-r5s-rk3568_defconfig | 2 ++ + configs/nanopi-r6c-rk3588s_defconfig | 2 ++ + configs/nanopi-r6s-rk3588s_defconfig | 2 ++ + configs/neu6a-io-rk3588_defconfig | 2 ++ + configs/neu6b-io-rk3588_defconfig | 2 ++ + configs/nova-rk3588s_defconfig | 2 ++ + configs/odroid-m1-rk3568_defconfig | 2 ++ + configs/odroid-m1s-rk3566_defconfig | 2 ++ + configs/odroid-m2-rk3588s_defconfig | 2 ++ + configs/orangepi-3b-rk3566_defconfig | 2 ++ + configs/orangepi-5-max-rk3588_defconfig | 2 ++ + configs/orangepi-5-plus-rk3588_defconfig | 2 ++ + configs/orangepi-5-rk3588s_defconfig | 2 ++ + configs/orangepi-5-ultra-rk3588_defconfig | 2 ++ + configs/pinebook-pro-rk3399_defconfig | 1 + + configs/pinetab2-rk3566_defconfig | 2 ++ + configs/powkiddy-x55-rk3566_defconfig | 2 ++ + configs/quartz64-a-rk3566_defconfig | 2 ++ + configs/quartz64-b-rk3566_defconfig | 4 ++++ + configs/quartzpro64-rk3588_defconfig | 2 ++ + configs/radxa-cm3-io-rk3566_defconfig | 2 ++ + configs/radxa-e25-rk3568_defconfig | 2 ++ + configs/radxa-zero-3-rk3566_defconfig | 2 ++ + configs/roc-pc-mezzanine-rk3399_defconfig | 2 ++ + configs/rock-3a-rk3568_defconfig | 2 ++ + configs/rock-3b-rk3568_defconfig | 2 ++ + configs/rock-3c-rk3566_defconfig | 2 ++ + configs/rock-4c-plus-rk3399_defconfig | 2 ++ + configs/rock-4se-rk3399_defconfig | 2 ++ + configs/rock-5-itx-rk3588_defconfig | 2 ++ + configs/rock-5c-rk3588s_defconfig | 2 ++ + configs/rock-pi-4-rk3399_defconfig | 2 ++ + configs/rock-pi-4c-rk3399_defconfig | 2 ++ + configs/rock-pi-n10-rk3399pro_defconfig | 2 ++ + configs/rock5a-rk3588s_defconfig | 2 ++ + configs/rock5b-rk3588_defconfig | 2 ++ + configs/rock960-rk3399_defconfig | 2 ++ + configs/rockpro64-rk3399_defconfig | 2 ++ + configs/sige7-rk3588_defconfig | 2 ++ + configs/soquartz-blade-rk3566_defconfig | 2 ++ + configs/soquartz-cm4-rk3566_defconfig | 2 ++ + configs/soquartz-model-a-rk3566_defconfig | 2 ++ + configs/tiger-rk3588_defconfig | 2 ++ + configs/toybrick-rk3588_defconfig | 2 ++ + configs/turing-rk1-rk3588_defconfig | 2 ++ + 60 files changed, 121 insertions(+) + +diff --git a/configs/anbernic-rgxx3-rk3566_defconfig b/configs/anbernic-rgxx3-rk3566_defconfig +index 854de8b00a4..cd91f18ba80 100644 +--- a/configs/anbernic-rgxx3-rk3566_defconfig ++++ b/configs/anbernic-rgxx3-rk3566_defconfig +@@ -12,6 +12,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + # CONFIG_EFI_LOADER is not set + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y +diff --git a/configs/bpi-r2-pro-rk3568_defconfig b/configs/bpi-r2-pro-rk3568_defconfig +index c5199a39448..603e07f2456 100644 +--- a/configs/bpi-r2-pro-rk3568_defconfig ++++ b/configs/bpi-r2-pro-rk3568_defconfig +@@ -9,6 +9,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/cm3588-nas-rk3588_defconfig b/configs/cm3588-nas-rk3588_defconfig +index 5b5ef8d5ac1..53147d115dd 100644 +--- a/configs/cm3588-nas-rk3588_defconfig ++++ b/configs/cm3588-nas-rk3588_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/coolpi-4b-rk3588s_defconfig b/configs/coolpi-4b-rk3588s_defconfig +index e6772622403..75e0b373ce9 100644 +--- a/configs/coolpi-4b-rk3588s_defconfig ++++ b/configs/coolpi-4b-rk3588s_defconfig +@@ -17,6 +17,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/coolpi-cm5-evb-rk3588_defconfig b/configs/coolpi-cm5-evb-rk3588_defconfig +index 4326e116849..a005e4441d3 100644 +--- a/configs/coolpi-cm5-evb-rk3588_defconfig ++++ b/configs/coolpi-cm5-evb-rk3588_defconfig +@@ -17,6 +17,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/evb-rk3568_defconfig b/configs/evb-rk3568_defconfig +index 4a5a7454e10..7ec199a08af 100644 +--- a/configs/evb-rk3568_defconfig ++++ b/configs/evb-rk3568_defconfig +@@ -9,6 +9,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/evb-rk3588_defconfig b/configs/evb-rk3588_defconfig +index c7f6256a626..cfa73c660e7 100644 +--- a/configs/evb-rk3588_defconfig ++++ b/configs/evb-rk3588_defconfig +@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/firefly-rk3399_defconfig b/configs/firefly-rk3399_defconfig +index 83b9de5feb9..2ba8f5029c3 100644 +--- a/configs/firefly-rk3399_defconfig ++++ b/configs/firefly-rk3399_defconfig +@@ -14,6 +14,8 @@ CONFIG_DEBUG_UART_BASE=0xFF1A0000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-firefly.dtb" + CONFIG_DISPLAY_BOARDINFO_LATE=y + CONFIG_SPL_MAX_SIZE=0x40000 +diff --git a/configs/generic-rk3568_defconfig b/configs/generic-rk3568_defconfig +index a33c3af9255..20966793568 100644 +--- a/configs/generic-rk3568_defconfig ++++ b/configs/generic-rk3568_defconfig +@@ -14,6 +14,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/generic-rk3588_defconfig b/configs/generic-rk3588_defconfig +index ac450e6d757..b5424ac9f16 100644 +--- a/configs/generic-rk3588_defconfig ++++ b/configs/generic-rk3588_defconfig +@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/jaguar-rk3588_defconfig b/configs/jaguar-rk3588_defconfig +index ed3883b4f9c..47dbd834f30 100644 +--- a/configs/jaguar-rk3588_defconfig ++++ b/configs/jaguar-rk3588_defconfig +@@ -16,6 +16,8 @@ CONFIG_DEBUG_UART_BASE=0xfeb50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/lubancat-2-rk3568_defconfig b/configs/lubancat-2-rk3568_defconfig +index 7548bf60b06..2fb8a432503 100644 +--- a/configs/lubancat-2-rk3568_defconfig ++++ b/configs/lubancat-2-rk3568_defconfig +@@ -9,6 +9,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_EFI_VAR_BUF_SIZE=16384 + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y +diff --git a/configs/nanopc-t4-rk3399_defconfig b/configs/nanopc-t4-rk3399_defconfig +index f8ae436a1ee..7aa8e1a8d42 100644 +--- a/configs/nanopc-t4-rk3399_defconfig ++++ b/configs/nanopc-t4-rk3399_defconfig +@@ -15,6 +15,8 @@ CONFIG_DEBUG_UART_BASE=0xFF1A0000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-nanopc-t4.dtb" + CONFIG_DISPLAY_BOARDINFO_LATE=y + CONFIG_SPL_MAX_SIZE=0x40000 +diff --git a/configs/nanopc-t6-rk3588_defconfig b/configs/nanopc-t6-rk3588_defconfig +index ba9a5adece7..eaf7fa5a0fc 100644 +--- a/configs/nanopc-t6-rk3588_defconfig ++++ b/configs/nanopc-t6-rk3588_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/nanopi-r5c-rk3568_defconfig b/configs/nanopi-r5c-rk3568_defconfig +index e75a24dadc8..159ef033932 100644 +--- a/configs/nanopi-r5c-rk3568_defconfig ++++ b/configs/nanopi-r5c-rk3568_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="usb start;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/nanopi-r5s-rk3568_defconfig b/configs/nanopi-r5s-rk3568_defconfig +index c971f376b38..60b5e8fa014 100644 +--- a/configs/nanopi-r5s-rk3568_defconfig ++++ b/configs/nanopi-r5s-rk3568_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="usb start;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/nanopi-r6c-rk3588s_defconfig b/configs/nanopi-r6c-rk3588s_defconfig +index 861e3234d29..bb6e2082e3b 100644 +--- a/configs/nanopi-r6c-rk3588s_defconfig ++++ b/configs/nanopi-r6c-rk3588s_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/nanopi-r6s-rk3588s_defconfig b/configs/nanopi-r6s-rk3588s_defconfig +index 743dfca441b..903ec56ad6f 100644 +--- a/configs/nanopi-r6s-rk3588s_defconfig ++++ b/configs/nanopi-r6s-rk3588s_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/neu6a-io-rk3588_defconfig b/configs/neu6a-io-rk3588_defconfig +index 19f129e96f0..08ed699b01d 100644 +--- a/configs/neu6a-io-rk3588_defconfig ++++ b/configs/neu6a-io-rk3588_defconfig +@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/neu6b-io-rk3588_defconfig b/configs/neu6b-io-rk3588_defconfig +index 2cf5aeccf51..8cafd779a1c 100644 +--- a/configs/neu6b-io-rk3588_defconfig ++++ b/configs/neu6b-io-rk3588_defconfig +@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/nova-rk3588s_defconfig b/configs/nova-rk3588s_defconfig +index f7d7492ff46..5abb6ebbe18 100644 +--- a/configs/nova-rk3588s_defconfig ++++ b/configs/nova-rk3588s_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/odroid-m1-rk3568_defconfig b/configs/odroid-m1-rk3568_defconfig +index b00985b0405..19d7af53c7f 100644 +--- a/configs/odroid-m1-rk3568_defconfig ++++ b/configs/odroid-m1-rk3568_defconfig +@@ -17,6 +17,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/odroid-m1s-rk3566_defconfig b/configs/odroid-m1s-rk3566_defconfig +index d59882a2a59..20f6dc3c26e 100644 +--- a/configs/odroid-m1s-rk3566_defconfig ++++ b/configs/odroid-m1s-rk3566_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/odroid-m2-rk3588s_defconfig b/configs/odroid-m2-rk3588s_defconfig +index e71e61ddb0b..561c2b28b7a 100644 +--- a/configs/odroid-m2-rk3588s_defconfig ++++ b/configs/odroid-m2-rk3588s_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/orangepi-3b-rk3566_defconfig b/configs/orangepi-3b-rk3566_defconfig +index 1cd78789fa1..dcf182231da 100644 +--- a/configs/orangepi-3b-rk3566_defconfig ++++ b/configs/orangepi-3b-rk3566_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/orangepi-5-max-rk3588_defconfig b/configs/orangepi-5-max-rk3588_defconfig +index 0861df962cf..744aad89c4a 100644 +--- a/configs/orangepi-5-max-rk3588_defconfig ++++ b/configs/orangepi-5-max-rk3588_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/orangepi-5-plus-rk3588_defconfig b/configs/orangepi-5-plus-rk3588_defconfig +index 52523f87aec..e3bb4e43da9 100644 +--- a/configs/orangepi-5-plus-rk3588_defconfig ++++ b/configs/orangepi-5-plus-rk3588_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/orangepi-5-rk3588s_defconfig b/configs/orangepi-5-rk3588s_defconfig +index e0eba389289..33fe68add7b 100644 +--- a/configs/orangepi-5-rk3588s_defconfig ++++ b/configs/orangepi-5-rk3588s_defconfig +@@ -17,6 +17,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/orangepi-5-ultra-rk3588_defconfig b/configs/orangepi-5-ultra-rk3588_defconfig +index fb7f4432983..62419609695 100644 +--- a/configs/orangepi-5-ultra-rk3588_defconfig ++++ b/configs/orangepi-5-ultra-rk3588_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/pinebook-pro-rk3399_defconfig b/configs/pinebook-pro-rk3399_defconfig +index cbf95b4692f..9e4d1b1061d 100644 +--- a/configs/pinebook-pro-rk3399_defconfig ++++ b/configs/pinebook-pro-rk3399_defconfig +@@ -22,6 +22,7 @@ CONFIG_PCI=y + CONFIG_DEBUG_UART=y + CONFIG_BOOTDELAY=3 + CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-pinebook-pro.dtb" + CONFIG_DISPLAY_BOARDINFO_LATE=y + CONFIG_SPL_MAX_SIZE=0x40000 +diff --git a/configs/pinetab2-rk3566_defconfig b/configs/pinetab2-rk3566_defconfig +index f284dadb99d..d87849f0a45 100644 +--- a/configs/pinetab2-rk3566_defconfig ++++ b/configs/pinetab2-rk3566_defconfig +@@ -18,6 +18,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/powkiddy-x55-rk3566_defconfig b/configs/powkiddy-x55-rk3566_defconfig +index 37a359c91a9..70bc5ab6402 100644 +--- a/configs/powkiddy-x55-rk3566_defconfig ++++ b/configs/powkiddy-x55-rk3566_defconfig +@@ -9,6 +9,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/quartz64-a-rk3566_defconfig b/configs/quartz64-a-rk3566_defconfig +index 780fd581f0a..7938b5c0d1b 100644 +--- a/configs/quartz64-a-rk3566_defconfig ++++ b/configs/quartz64-a-rk3566_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/quartz64-b-rk3566_defconfig b/configs/quartz64-b-rk3566_defconfig +index 4d92a67cd73..fe8a168373d 100644 +--- a/configs/quartz64-b-rk3566_defconfig ++++ b/configs/quartz64-b-rk3566_defconfig +@@ -1,4 +1,6 @@ + CONFIG_ARM=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_SKIP_LOWLEVEL_INIT=y + CONFIG_COUNTER_FREQUENCY=24000000 + CONFIG_ARCH_ROCKCHIP=y +@@ -17,6 +19,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/quartzpro64-rk3588_defconfig b/configs/quartzpro64-rk3588_defconfig +index 0ad74e8bbef..b9cbddfae77 100644 +--- a/configs/quartzpro64-rk3588_defconfig ++++ b/configs/quartzpro64-rk3588_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/radxa-cm3-io-rk3566_defconfig b/configs/radxa-cm3-io-rk3566_defconfig +index 875f0b76fa5..2523dccd6a3 100644 +--- a/configs/radxa-cm3-io-rk3566_defconfig ++++ b/configs/radxa-cm3-io-rk3566_defconfig +@@ -9,6 +9,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/radxa-e25-rk3568_defconfig b/configs/radxa-e25-rk3568_defconfig +index 779d540e22d..7e003e74520 100644 +--- a/configs/radxa-e25-rk3568_defconfig ++++ b/configs/radxa-e25-rk3568_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/radxa-zero-3-rk3566_defconfig b/configs/radxa-zero-3-rk3566_defconfig +index f5cf09a5e4a..7db7e3fcd3d 100644 +--- a/configs/radxa-zero-3-rk3566_defconfig ++++ b/configs/radxa-zero-3-rk3566_defconfig +@@ -11,6 +11,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/roc-pc-mezzanine-rk3399_defconfig b/configs/roc-pc-mezzanine-rk3399_defconfig +index 8b4d8c1b0aa..54baa07aeae 100644 +--- a/configs/roc-pc-mezzanine-rk3399_defconfig ++++ b/configs/roc-pc-mezzanine-rk3399_defconfig +@@ -21,6 +21,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + # CONFIG_ANDROID_BOOT_IMAGE is not set + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-roc-pc-mezzanine.dtb" + CONFIG_DISPLAY_BOARDINFO_LATE=y +diff --git a/configs/rock-3a-rk3568_defconfig b/configs/rock-3a-rk3568_defconfig +index e753185610f..19d303e7f70 100644 +--- a/configs/rock-3a-rk3568_defconfig ++++ b/configs/rock-3a-rk3568_defconfig +@@ -16,6 +16,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock-3b-rk3568_defconfig b/configs/rock-3b-rk3568_defconfig +index c3bf48b9e34..0cfa8eba168 100644 +--- a/configs/rock-3b-rk3568_defconfig ++++ b/configs/rock-3b-rk3568_defconfig +@@ -16,6 +16,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock-3c-rk3566_defconfig b/configs/rock-3c-rk3566_defconfig +index 417aa33a663..61d0e1b8c6a 100644 +--- a/configs/rock-3c-rk3566_defconfig ++++ b/configs/rock-3c-rk3566_defconfig +@@ -16,6 +16,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock-4c-plus-rk3399_defconfig b/configs/rock-4c-plus-rk3399_defconfig +index 0f6bdfdfb06..f31cb061a83 100644 +--- a/configs/rock-4c-plus-rk3399_defconfig ++++ b/configs/rock-4c-plus-rk3399_defconfig +@@ -17,6 +17,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_EFI_CAPSULE_ON_DISK=y + CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y + # CONFIG_ANDROID_BOOT_IMAGE is not set +diff --git a/configs/rock-4se-rk3399_defconfig b/configs/rock-4se-rk3399_defconfig +index 7f22aede912..caf8e02bece 100644 +--- a/configs/rock-4se-rk3399_defconfig ++++ b/configs/rock-4se-rk3399_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_EFI_CAPSULE_ON_DISK=y + CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y + # CONFIG_ANDROID_BOOT_IMAGE is not set +diff --git a/configs/rock-5-itx-rk3588_defconfig b/configs/rock-5-itx-rk3588_defconfig +index cb014de4188..e26a126533c 100644 +--- a/configs/rock-5-itx-rk3588_defconfig ++++ b/configs/rock-5-itx-rk3588_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock-5c-rk3588s_defconfig b/configs/rock-5c-rk3588s_defconfig +index 3d044a81498..27234c250d1 100644 +--- a/configs/rock-5c-rk3588s_defconfig ++++ b/configs/rock-5c-rk3588s_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock-pi-4-rk3399_defconfig b/configs/rock-pi-4-rk3399_defconfig +index e5c9072c27f..35852c017da 100644 +--- a/configs/rock-pi-4-rk3399_defconfig ++++ b/configs/rock-pi-4-rk3399_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_EFI_CAPSULE_ON_DISK=y + CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y + # CONFIG_ANDROID_BOOT_IMAGE is not set +diff --git a/configs/rock-pi-4c-rk3399_defconfig b/configs/rock-pi-4c-rk3399_defconfig +index 4be7b0f8130..eeee446a5bd 100644 +--- a/configs/rock-pi-4c-rk3399_defconfig ++++ b/configs/rock-pi-4c-rk3399_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_EFI_CAPSULE_ON_DISK=y + CONFIG_EFI_CAPSULE_FIRMWARE_RAW=y + # CONFIG_ANDROID_BOOT_IMAGE is not set +diff --git a/configs/rock-pi-n10-rk3399pro_defconfig b/configs/rock-pi-n10-rk3399pro_defconfig +index 602a723ea7d..3dcc2932ae3 100644 +--- a/configs/rock-pi-n10-rk3399pro_defconfig ++++ b/configs/rock-pi-n10-rk3399pro_defconfig +@@ -13,6 +13,8 @@ CONFIG_DEBUG_UART_BASE=0xFF1A0000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + # CONFIG_ANDROID_BOOT_IMAGE is not set + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399pro-rock-pi-n10.dtb" + # CONFIG_CONSOLE_MUX is not set +diff --git a/configs/rock5a-rk3588s_defconfig b/configs/rock5a-rk3588s_defconfig +index 24b2eef35f2..c5830054921 100644 +--- a/configs/rock5a-rk3588s_defconfig ++++ b/configs/rock5a-rk3588s_defconfig +@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock5b-rk3588_defconfig b/configs/rock5b-rk3588_defconfig +index da5fb3a2c30..053346fc035 100644 +--- a/configs/rock5b-rk3588_defconfig ++++ b/configs/rock5b-rk3588_defconfig +@@ -18,6 +18,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/rock960-rk3399_defconfig b/configs/rock960-rk3399_defconfig +index db121f03ae6..e55f1b6a034 100644 +--- a/configs/rock960-rk3399_defconfig ++++ b/configs/rock960-rk3399_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFF1A0000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-rock960.dtb" + CONFIG_SYS_PBSIZE=1052 + CONFIG_DISPLAY_BOARDINFO_LATE=y +diff --git a/configs/rockpro64-rk3399_defconfig b/configs/rockpro64-rk3399_defconfig +index 1d2bff35fc0..ea8e90b9f6a 100644 +--- a/configs/rockpro64-rk3399_defconfig ++++ b/configs/rockpro64-rk3399_defconfig +@@ -20,6 +20,8 @@ CONFIG_SPL_SPI_FLASH_SUPPORT=y + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_DEFAULT_FDT_FILE="rockchip/rk3399-rockpro64.dtb" + CONFIG_DISPLAY_BOARDINFO_LATE=y + CONFIG_SPL_MAX_SIZE=0x40000 +diff --git a/configs/sige7-rk3588_defconfig b/configs/sige7-rk3588_defconfig +index 00b9759715b..1b837bd554c 100644 +--- a/configs/sige7-rk3588_defconfig ++++ b/configs/sige7-rk3588_defconfig +@@ -13,6 +13,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_SPL_SPI=y + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/soquartz-blade-rk3566_defconfig b/configs/soquartz-blade-rk3566_defconfig +index 7de159a8881..4137f0459b5 100644 +--- a/configs/soquartz-blade-rk3566_defconfig ++++ b/configs/soquartz-blade-rk3566_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/soquartz-cm4-rk3566_defconfig b/configs/soquartz-cm4-rk3566_defconfig +index 4455ee5b5aa..ad63ba0204f 100644 +--- a/configs/soquartz-cm4-rk3566_defconfig ++++ b/configs/soquartz-cm4-rk3566_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/soquartz-model-a-rk3566_defconfig b/configs/soquartz-model-a-rk3566_defconfig +index abdab514496..9e01345bdaa 100644 +--- a/configs/soquartz-model-a-rk3566_defconfig ++++ b/configs/soquartz-model-a-rk3566_defconfig +@@ -11,6 +11,8 @@ CONFIG_DEBUG_UART_BASE=0xFE660000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/tiger-rk3588_defconfig b/configs/tiger-rk3588_defconfig +index 105e8e10e0b..bcc2ae302a5 100644 +--- a/configs/tiger-rk3588_defconfig ++++ b/configs/tiger-rk3588_defconfig +@@ -17,6 +17,8 @@ CONFIG_DEBUG_UART_CLOCK=24000000 + # CONFIG_DEBUG_UART_BOARD_INIT is not set + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/toybrick-rk3588_defconfig b/configs/toybrick-rk3588_defconfig +index 14b231ae3e2..7af393731cd 100644 +--- a/configs/toybrick-rk3588_defconfig ++++ b/configs/toybrick-rk3588_defconfig +@@ -10,6 +10,8 @@ CONFIG_SYS_LOAD_ADDR=0xc00800 + CONFIG_DEBUG_UART_BASE=0xFEB50000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +diff --git a/configs/turing-rk1-rk3588_defconfig b/configs/turing-rk1-rk3588_defconfig +index 0b3efec23e6..515db2a2b0c 100644 +--- a/configs/turing-rk1-rk3588_defconfig ++++ b/configs/turing-rk1-rk3588_defconfig +@@ -12,6 +12,8 @@ CONFIG_DEBUG_UART_BASE=0xFEBC0000 + CONFIG_DEBUG_UART_CLOCK=24000000 + CONFIG_PCI=y + CONFIG_DEBUG_UART=y ++CONFIG_USE_PREBOOT=y ++CONFIG_PREBOOT="pci enum; usb start; nvme scan;" + CONFIG_FIT=y + CONFIG_FIT_VERBOSE=y + CONFIG_SPL_FIT_SIGNATURE=y +-- +2.54.0 + diff --git a/pkgbuilds/uboot-asahi/rockchip-rk3568-nanopi-r5-Drop-duplicated-extra-sdhc.patch b/pkgbuilds/uboot-asahi/rockchip-rk3568-nanopi-r5-Drop-duplicated-extra-sdhc.patch new file mode 100644 index 0000000..bef5a9e --- /dev/null +++ b/pkgbuilds/uboot-asahi/rockchip-rk3568-nanopi-r5-Drop-duplicated-extra-sdhc.patch @@ -0,0 +1,39 @@ +From aef38432fbc93621b434836b95b10c28aa880e84 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Tue, 9 Dec 2025 20:51:06 +0000 +Subject: [PATCH 1/2] rockchip: rk3568-nanopi-r5: Drop duplicated/extra sdhci + +The pinctrl settings are now upstream, with the upstream +voltage supplies, and the HS200 mode is confirmed to work +fine but the HS400 mode had reported issues so let's just +consume what the upstream DT has now as it's all known good. + +Reported-by: Dusty Mabe +Tested-by: Dusty Mabe +Signed-off-by: Peter Robinson +--- + arch/arm/dts/rk3568-nanopi-r5s-u-boot.dtsi | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/arch/arm/dts/rk3568-nanopi-r5s-u-boot.dtsi b/arch/arm/dts/rk3568-nanopi-r5s-u-boot.dtsi +index 64c43374c04..7e24be1a5e7 100644 +--- a/arch/arm/dts/rk3568-nanopi-r5s-u-boot.dtsi ++++ b/arch/arm/dts/rk3568-nanopi-r5s-u-boot.dtsi +@@ -12,14 +12,6 @@ + /delete-property/ vpcie3v3-supply; + }; + +-&sdhci { +- cap-mmc-highspeed; +- mmc-hs200-1_8v; +- mmc-hs400-1_8v; +- mmc-hs400-enhanced-strobe; +- pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd &emmc_datastrobe>; +-}; +- + &vcc5v0_usb_host { + /delete-property/ regulator-always-on; + /delete-property/ regulator-boot-on; +-- +2.52.0 + diff --git a/pkgbuilds/uboot-asahi/rockchip-rk356x-Stop-overriding-sdhci-mmc-aliases.patch b/pkgbuilds/uboot-asahi/rockchip-rk356x-Stop-overriding-sdhci-mmc-aliases.patch new file mode 100644 index 0000000..c67e4af --- /dev/null +++ b/pkgbuilds/uboot-asahi/rockchip-rk356x-Stop-overriding-sdhci-mmc-aliases.patch @@ -0,0 +1,33 @@ +From 29efc0396809384cf37bfcfb01c62e63216fa998 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Tue, 9 Dec 2025 21:13:46 +0000 +Subject: [PATCH 2/2] rockchip: rk356x: Stop overriding sdhci/mmc aliases + +Upstream device tree has rules where the aliases are board +specific settings, no SoC settings. Looking at upstream +rk356x boards there's a lot of variation in the setting of +mmc0/mmc1 based on the device so we should not be overriding +this here and now we sync to upstream we should just consume +those settings, to do otherwise confuses users. + +Signed-off-by: Peter Robinson +--- + arch/arm/dts/rk356x-u-boot.dtsi | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/arch/arm/dts/rk356x-u-boot.dtsi b/arch/arm/dts/rk356x-u-boot.dtsi +index 738b9673d35..f25c7970208 100644 +--- a/arch/arm/dts/rk356x-u-boot.dtsi ++++ b/arch/arm/dts/rk356x-u-boot.dtsi +@@ -7,8 +7,6 @@ + + / { + aliases { +- mmc0 = &sdhci; +- mmc1 = &sdmmc0; + spi4 = &sfc; + }; + +-- +2.52.0 + diff --git a/pkgbuilds/uboot-asahi/uefi-Add-all-options-for-EFI-System-Partitions.patch b/pkgbuilds/uboot-asahi/uefi-Add-all-options-for-EFI-System-Partitions.patch new file mode 100644 index 0000000..3bf1ec8 --- /dev/null +++ b/pkgbuilds/uboot-asahi/uefi-Add-all-options-for-EFI-System-Partitions.patch @@ -0,0 +1,57 @@ +From 86782e882e9542f5f402e00cd87efb36ad0552d3 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Sat, 2 Mar 2024 11:17:42 +0000 +Subject: [PATCH v4] disk: dos: Add all options for EFI System Partitions + +The EFI spec states that the ESP can be any of FAT12/16/32 but for +compatibility doesn't necssarily require the partition to be the +EFI partition table ID of 0xef. A number of arm devices will not +find their firmware on a FAT partition with an ID of 0xef so also +allow the original FAT12/16/32 partition IDs as they are also +permissable for an ESP. + +Signed-off-by: Peter Robinson +--- + +v2: +- Add 0x0c option +- Make hex constants consistent +- Move from if to switch statement +v3: +- Fix switch brain fart +v4: +- Drop boot_ind out of switch + + disk/part_dos.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/disk/part_dos.c b/disk/part_dos.c +index 567ead7511d..a35181dff4f 100644 +--- a/disk/part_dos.c ++++ b/disk/part_dos.c +@@ -40,10 +40,21 @@ static int get_bootable(dos_partition_t *p) + { + int ret = 0; + +- if (p->sys_ind == 0xef) ++ switch (p->sys_ind) { ++ case 0x01: ++ case 0x06: ++ case 0x0b: ++ case 0x0c: ++ case 0xef: + ret |= PART_EFI_SYSTEM_PARTITION; ++ break; ++ default: ++ break; ++ } ++ + if (p->boot_ind == 0x80) + ret |= PART_BOOTABLE; ++ + return ret; + } + +-- +2.44.0 + diff --git a/pkgbuilds/uboot-asahi/uefi-distro-load-FDT-from-any-partition-on-boot-device.patch b/pkgbuilds/uboot-asahi/uefi-distro-load-FDT-from-any-partition-on-boot-device.patch new file mode 100644 index 0000000..5954848 --- /dev/null +++ b/pkgbuilds/uboot-asahi/uefi-distro-load-FDT-from-any-partition-on-boot-device.patch @@ -0,0 +1,87 @@ +From 4306c538d4a00dd1aa46c55c3c4005c2b0bf7cd5 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Thu, 24 Nov 2022 12:57:55 +0000 +Subject: [PATCH] distro: load FDT from any partition on boot device + +In the EFI_LOADER boot path, we were only checking the FAT partition +containing the EFI payload for dtb files. But this is somewhat of a +fiction. In reality there will be one small (V)FAT partition containing +grub (or whatever the payload may be), and a second boot partition +containing kernel/initrd/fdt (typically ext4). It is this second +partition where we should be looking for a FDT to load. + +So instead scan all the partitions of the disk containing the EFI +payload. This matches where grub looks for kernel/initrd (barring +custom grub.cfg, in which case the user can use grub's 'devicetree' +command to load the correct FDT). + +The other option is somehow passing the ${fdtfile} to grub so that it +can load the FDT based on selected kernel version location (which grub +knows) and SoC/board specific ${fdtfile} (which grub does not know). + +Signed-off-by: Rob Clark +Signed-off-by: Peter Robinson +--- + include/config_distro_bootcmd.h | 37 +++++++++++++++++++++------------ + 1 file changed, 24 insertions(+), 13 deletions(-) + +diff --git a/include/config_distro_bootcmd.h b/include/config_distro_bootcmd.h +index fcb319a20ae..e71004fad9c 100644 +--- a/include/config_distro_bootcmd.h ++++ b/include/config_distro_bootcmd.h +@@ -155,28 +155,39 @@ + "fi\0" \ + \ + "load_efi_dtb=" \ +- "load ${devtype} ${devnum}:${distro_bootpart} " \ +- "${fdt_addr_r} ${prefix}${efi_fdtfile}\0" \ ++ "load ${devtype} ${devnum}:${dtb_devp} " \ ++ "${fdt_addr_r} ${prefix}${efi_fdtfile} && " \ ++ "run boot_efi_binary\0" \ + \ + "efi_dtb_prefixes=/ /dtb/ /dtb/current/\0" \ +- "scan_dev_for_efi=" \ ++ "scan_dev_for_dtb=" \ + "setenv efi_fdtfile ${fdtfile}; " \ + BOOTENV_EFI_SET_FDTFILE_FALLBACK \ + BOOTENV_RUN_EXTENSION_INIT \ +- "for prefix in ${efi_dtb_prefixes}; do " \ +- "if test -e ${devtype} " \ +- "${devnum}:${distro_bootpart} " \ +- "${prefix}${efi_fdtfile}; then " \ +- "run load_efi_dtb; " \ +- BOOTENV_RUN_EXTENSION_APPLY \ +- "fi;" \ +- "done;" \ +- "run boot_efi_bootmgr;" \ ++ "part list ${devtype} ${devnum} dtb_devplist; " \ ++ "env exists dtb_devplist || setenv dtb_devplist " \ ++ "${distro_bootpart}; " \ ++ "for dtb_devp in ${dtb_devplist}; do " \ ++ "for prefix in ${efi_dtb_prefixes}; do " \ ++ "if test -e ${devtype} " \ ++ "${devnum}:${dtb_devp} " \ ++ "${prefix}${efi_fdtfile};"\ ++ " then " \ ++ "echo Found DTB ${devtype} " \ ++ "${devnum}:${dtb_devp} " \ ++ "${prefix}${efi_fdtfile};"\ ++ "run load_efi_dtb; " \ ++ BOOTENV_RUN_EXTENSION_APPLY \ ++ "fi;" \ ++ "done; " \ ++ "done; " \ ++ "run boot_efi_binary\0" \ ++ "scan_dev_for_efi=" \ + "if test -e ${devtype} ${devnum}:${distro_bootpart} " \ + "efi/boot/"BOOTEFI_NAME"; then " \ + "echo Found EFI removable media binary " \ + "efi/boot/"BOOTEFI_NAME"; " \ +- "run boot_efi_binary; " \ ++ "run scan_dev_for_dtb; " \ + "echo EFI LOAD FAILED: continuing...; " \ + "fi; " \ + "setenv efi_fdtfile\0" +-- +2.38.1 + diff --git a/pkgbuilds/uboot-asahi/uefi-enable-SetVariableRT-with-volotile-storage.patch b/pkgbuilds/uboot-asahi/uefi-enable-SetVariableRT-with-volotile-storage.patch new file mode 100644 index 0000000..ee9bcf4 --- /dev/null +++ b/pkgbuilds/uboot-asahi/uefi-enable-SetVariableRT-with-volotile-storage.patch @@ -0,0 +1,33 @@ +From fd736dd720b29fa69a4bb87492f3f94dc6076996 Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Tue, 25 Mar 2025 17:13:44 +0000 +Subject: [PATCH] efi: enable SetVariableRT with volotile storage + +Signed-off-by: Peter Robinson +--- + lib/efi_loader/Kconfig | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig +index d4f6b56afaa..3e522131b01 100644 +--- a/lib/efi_loader/Kconfig ++++ b/lib/efi_loader/Kconfig +@@ -108,6 +108,7 @@ choice + config EFI_VARIABLE_FILE_STORE + bool "Store non-volatile UEFI variables as file" + depends on FAT_WRITE ++ default y + help + Select this option if you want non-volatile UEFI variables to be + stored as file /ubootefi.var on the EFI system partition. +@@ -115,6 +116,7 @@ config EFI_VARIABLE_FILE_STORE + config EFI_RT_VOLATILE_STORE + bool "Allow variable runtime services in volatile storage (e.g RAM)" + depends on EFI_VARIABLE_FILE_STORE ++ default y + help + When EFI variables are stored on file we don't allow SetVariableRT, + since the OS doesn't know how to write that file. At the same time +-- +2.49.0 + diff --git a/pkgbuilds/uboot-asahi/uefi-enable-https-boot-by-default.patch b/pkgbuilds/uboot-asahi/uefi-enable-https-boot-by-default.patch new file mode 100644 index 0000000..dc0a683 --- /dev/null +++ b/pkgbuilds/uboot-asahi/uefi-enable-https-boot-by-default.patch @@ -0,0 +1,82 @@ +From 7eabab2fda12b7a4417e5c7f29a507dfa9e7fffd Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Sun, 3 May 2026 09:24:34 +0100 +Subject: [PATCH] enable https boot by default + +Signed-off-by: Peter Robinson +--- + cmd/Kconfig | 1 + + lib/efi_loader/Kconfig | 1 + + lib/mbedtls/Kconfig | 3 ++- + net/Kconfig | 3 ++- + 4 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/cmd/Kconfig b/cmd/Kconfig +index c71c6824a19..8ff14adffe1 100644 +--- a/cmd/Kconfig ++++ b/cmd/Kconfig +@@ -2289,6 +2289,7 @@ config CMD_WGET + + config WGET_HTTPS + bool "wget https" ++ default y + depends on CMD_WGET + depends on PROT_TCP_LWIP + depends on MBEDTLS_LIB +diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig +index 4cb13ae7c8a..20733429962 100644 +--- a/lib/efi_loader/Kconfig ++++ b/lib/efi_loader/Kconfig +@@ -609,6 +609,7 @@ config EFI_BOOTMGR + + config EFI_HTTP_BOOT + bool "EFI HTTP Boot support" ++ default y + depends on NET + depends on CMDLINE + select CMD_NET +diff --git a/lib/mbedtls/Kconfig b/lib/mbedtls/Kconfig +index 789721ee6cd..7a241c2bc26 100644 +--- a/lib/mbedtls/Kconfig ++++ b/lib/mbedtls/Kconfig +@@ -2,7 +2,7 @@ + + choice + prompt "Crypto libraries (U-Boot Proper)" +- default LEGACY_HASHING_AND_CRYPTO ++ default MBEDTLS_LIB + help + Select crypto libraries. + LEGACY_HASHING_AND_CRYPTO for legacy crypto libraries, +@@ -15,6 +15,7 @@ config LEGACY_HASHING_AND_CRYPTO + + config MBEDTLS_LIB + bool "MbedTLS libraries" ++ default y + select MBEDTLS_LIB_X509 + endchoice + +diff --git a/net/Kconfig b/net/Kconfig +index e712a0dd2ac..3158d37dff7 100644 +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -16,7 +16,7 @@ if NET + + choice + prompt "Networking stack" +- default NET_LEGACY ++ default NET_LWIP + + config NET_LEGACY + bool "Legacy U-Boot networking stack" +@@ -27,6 +27,7 @@ config NET_LEGACY + + config NET_LWIP + bool "Use lwIP for networking stack" ++ default y + select NETDEVICES + help + Include networking support based on the lwIP (lightweight IP) +-- +2.54.0 + diff --git a/pkgbuilds/uboot-asahi/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch b/pkgbuilds/uboot-asahi/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch new file mode 100644 index 0000000..ac58bad --- /dev/null +++ b/pkgbuilds/uboot-asahi/uefi-initial-find_fdt_location-for-finding-the-DT-on-disk.patch @@ -0,0 +1,190 @@ +From 56a985cec8592a8de88e7f254df82f5d444a5ecc Mon Sep 17 00:00:00 2001 +From: Peter Robinson +Date: Thu, 28 May 2026 22:08:07 +0100 +Subject: [PATCH] initial find_fdt_location for finding the DT on disk + +The old distro boot looked for a DT on the first boot partition +in the /dtb or /dtb/current directories, and Fedora extended this +to look not just on the boot partition but all the partitions on +that disk. + +The new ways of booting, both bootstd and bootefi bootmgr processes +don't properly look for those options. This provides a function +to search for the DTB on disk so that if the other DT mechanisms +don't work this will look for one on disk to provide a working DT +so that devices will continue to work as they did previously. + +Signed-off-by: Peter Robinson +--- + cmd/bootmenu.c | 5 ++ + include/efi_loader.h | 2 + + lib/efi_loader/efi_helper.c | 106 +++++++++++++++++++++++++++++++++++- + 3 files changed, 112 insertions(+), 1 deletion(-) + +diff --git a/cmd/bootmenu.c b/cmd/bootmenu.c +index 528afd221d0..a10ea35a687 100644 +--- a/cmd/bootmenu.c ++++ b/cmd/bootmenu.c +@@ -502,6 +502,11 @@ static void handle_uefi_bootnext(void) + u16 bootnext; + efi_status_t ret; + efi_uintn_t size; ++ const char *fdt_opt; ++ ++ /* Find the DTB on disk */ ++ log_debug("We will load the DTB\n"); ++ fdt_opt = find_fdt_location(); + + /* Initialize EFI drivers */ + ret = efi_init_obj_list(); +diff --git a/include/efi_loader.h b/include/efi_loader.h +index 3a4d502631c..b11f8a2cb42 100644 +--- a/include/efi_loader.h ++++ b/include/efi_loader.h +@@ -574,6 +574,8 @@ struct efi_register_notify_event { + struct list_head handles; + }; + ++/* Find the FDT on any partition */ ++char *find_fdt_location(void); + /* called at pre-initialization */ + int efi_init_early(void); + /* Initialize efi execution environment */ +diff --git a/lib/efi_loader/efi_helper.c b/lib/efi_loader/efi_helper.c +index 44b806aadc4..61e982091b9 100644 +--- a/lib/efi_loader/efi_helper.c ++++ b/lib/efi_loader/efi_helper.c +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -98,6 +99,99 @@ int efi_get_pxe_arch(void) + return -EINVAL; + } + ++/* We need to pass a blk device in and return a location, or a loaded DT */ ++char *find_fdt_location(void) ++{ ++ const char *fdt_filename; ++ /* FIXME: dynamic size */ ++ char fdt_fullpath[60]; ++ const char *prefix; ++ struct udevice *blk; ++ /* FIXME: Fedora really only cares about first 2*/ ++ int MAX_PART = 8; ++ int part; ++ struct disk_partition info; ++ int fdtext; ++ int ret; ++ int retfdt; ++ int retload; ++ loff_t fdtsize; ++ ulong pbraddr; ++ loff_t len_read; ++ ++ /* step one logic: we have the DT name we're hunting for */ ++ fdt_filename = env_get("fdtfile"); ++ if (fdt_filename) { ++ log_debug("FFL: We're looking for the DTB now!: %s\n", fdt_filename); ++ ++ /* probe all block disks to search for fdt */ ++ uclass_foreach_dev_probe(UCLASS_BLK, blk) { ++ log_debug("FFL: dev name: %s\n", blk->name); ++ struct blk_desc *desc; ++ desc = dev_get_uclass_plat(blk); ++ /* we should get a partition count here for looping */ ++ /* For loop for each partition */ ++ /* Need to also deal with zero part whole disk - part_get_info_whole_disk */ ++ for (part = 1; part <= MAX_PART; part++) { ++ log_debug("FFL: part num: %d\n", part); ++ ret = part_get_info(desc, part, &info); ++ /* if we have partition check it for DT */ ++ if (ret < 0) { ++ log_debug("FFL: no partition\n"); ++ } else { ++ log_debug("FFL: we have a partition\n"); ++ /* we should have a case/for prefix in =/ /dtb/ /dtb/current/ */ ++ /* but for now we hard code if for Fedora */ ++ prefix = "/dtb"; ++ snprintf(fdt_fullpath, sizeof(fdt_fullpath), "%s/%s", prefix, fdt_filename); ++ log_debug("FFL: full name: %s\n", fdt_fullpath); ++ /* search for DT on partition and either find and exit or continue */ ++ if (fs_set_blk_dev_with_part(desc, part) == 0){ ++ log_debug("FFL: set block part pass\n"); ++ fdtext = fs_exists(fdt_fullpath); ++ if (fdtext) { ++ /* we have a fdt!*/ ++ if (fs_set_blk_dev_with_part(desc, part) == 0){ ++ retfdt = fs_size(fdt_fullpath, &fdtsize); ++ if (retfdt == 0) { ++ log_debug("FFL: we have found a DT on disk, size %lld\n", fdtsize); ++ /* Get the main fdt and map it */ ++ const char *fdt_pbr; ++ fdt_pbr = env_get("fdt_addr_r"); ++ pbraddr = hextoul(fdt_pbr, NULL); ++ log_debug("FFL: fdr addr: %s\n", fdt_pbr); ++ if (fs_set_blk_dev_with_part(desc, part) == 0){ ++ retload = fs_read(fdt_fullpath, pbraddr, 0, fdtsize, &len_read); ++ if (retload == 0) { ++ log_debug("FFL: we have a loaded DT, size %lld we can return\n", fdtsize); ++ log_info("Found DTB: %s\n", fdt_filename); ++ return fdt_pbr; ++ } else { ++ log_debug("FFL: DT load failed\n"); ++ } ++ } ++ } else { ++ log_debug("FFL: we DON'T have a DT with size\n"); ++ } ++ } ++ } else { ++ /* we don't have a fdt!*/ ++ log_debug("FFL: we DON'T have a DT\n"); ++ } ++ } else { ++ log_debug("FFL: set block part FAIL\n"); ++ } ++ } ++ } ++ } ++ } else { ++ log_debug("FFL: fdt_filename not defined!!\n"); ++ } ++ ++ /* We didn't find a FDT */ ++ return NULL; ++} ++ + /** + * efi_create_current_boot_var() - Return Boot#### name were #### is replaced by + * the value of BootCurrent +@@ -558,11 +652,21 @@ efi_status_t efi_install_fdt(void *fdt) + const char *fdt_opt; + uintptr_t fdt_addr; + ++ /* Check if there is device tree loaded from disk */ ++ fdt_opt = find_fdt_location(); ++ if (fdt_opt) ++ log_info("Found DTB on disk\n"); ++ + /* Check if there is a hardware device tree */ +- fdt_opt = env_get("fdt_addr"); ++ if (!fdt_opt) { ++ fdt_opt = env_get("fdt_addr"); ++ if (fdt_opt) ++ log_info("Found DTB: Prior firmware\n"); ++ } + /* Use our own device tree as fallback */ + if (!fdt_opt) { + fdt_opt = env_get("fdtcontroladdr"); ++ log_info("Using DT from U-Boot\n"); + if (!fdt_opt) { + log_err("need device tree\n"); + return EFI_NOT_FOUND; +-- +2.54.0 + From 14609a71a2eb9dbbf2685f0bda8364521903c5b4 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:26:47 +1000 Subject: [PATCH 24/55] linux-aurora: drop the wireguard-arch replaces rule A replaces rule applies to any root with the omarchy repo, so a generic aarch64 system carrying wireguard-arch would be offered this Apple-only kernel on -Syu. ALARM's linux-aarch64 carries no replaces either. --- pkgbuilds/linux-aurora/PKGBUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/pkgbuilds/linux-aurora/PKGBUILD b/pkgbuilds/linux-aurora/PKGBUILD index 43adff7..372885c 100644 --- a/pkgbuilds/linux-aurora/PKGBUILD +++ b/pkgbuilds/linux-aurora/PKGBUILD @@ -91,7 +91,6 @@ _package_kernel() { # No generic linux provide: on a shared aarch64 repository it would compete # with linux-aarch64 for any dependency on linux. provides=(WIREGUARD-MODULE linux-asahi=${pkgver}) - replaces=(wireguard-arch) conflicts=(linux-asahi) local kernver="$(<$O/version)" From 4a2224c68006d1764ae67b0182f7012a327e41f7 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:28:47 +1000 Subject: [PATCH 25/55] Add the omarchy-mac Apple Silicon add-on for aarch64 edge Packages only packages/omarchy-mac from omacom/omarchy-mac at an exact quattro-upstream commit, restricted to aarch64 and the edge channel. Ported from the omarchy-mac/omarchy-pkgs-aarch64 recipe. Co-authored-by: Scott Jones --- pkgbuilds/omarchy-mac/.omarchy/package.json | 1 + pkgbuilds/omarchy-mac/PKGBUILD | 42 +++++++++++++++++++++ pkgbuilds/omarchy-mac/README.md | 23 +++++++++++ 3 files changed, 66 insertions(+) create mode 100644 pkgbuilds/omarchy-mac/.omarchy/package.json create mode 100644 pkgbuilds/omarchy-mac/PKGBUILD create mode 100644 pkgbuilds/omarchy-mac/README.md diff --git a/pkgbuilds/omarchy-mac/.omarchy/package.json b/pkgbuilds/omarchy-mac/.omarchy/package.json new file mode 100644 index 0000000..9adf372 --- /dev/null +++ b/pkgbuilds/omarchy-mac/.omarchy/package.json @@ -0,0 +1 @@ +{ "source": "local", "channels": ["edge"] } diff --git a/pkgbuilds/omarchy-mac/PKGBUILD b/pkgbuilds/omarchy-mac/PKGBUILD new file mode 100644 index 0000000..ec9b5e4 --- /dev/null +++ b/pkgbuilds/omarchy-mac/PKGBUILD @@ -0,0 +1,42 @@ +# Maintainer: Scott Jones +# Ported from omarchy-mac/omarchy-pkgs-aarch64 pkgbuilds/omarchy-mac at 02ed7b250f7edcf7c5f748acaf7b21ef0a764e9d. + +pkgname=omarchy-mac +# pkgver matches packages/omarchy-mac/version at _commit. Bump pkgrel to re-pin +# or rebuild the same add-on version; reset it to 1 when pkgver increases. +pkgver=0.1.0 +pkgrel=5 +pkgdesc='Apple Silicon configuration and support services for Omarchy' +arch=('aarch64') +url='https://github.com/omacom/omarchy-mac' +license=('MIT') +makedepends=('git' 'findutils') +checkdepends=('diffutils' 'python' 'systemd') +# An exact quattro-upstream commit, never a branch. +_commit=b4a79d83d1144c4de90b29a2d8b4090090d7a9d8 +source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") +sha256sums=('93676ce29791a29efe3b098fd8d129fa2248cd32d04253d9520a5b4c0697be6f') + +prepare() { + # Tests and staging must not be able to read the surrounding desktop source. + rm -rf "$srcdir/addon" + cp -a "$srcdir/omarchy-mac/packages/omarchy-mac" "$srcdir/addon" + [[ $(<"$srcdir/addon/version") == "$pkgver" ]] + [[ $(git -C "$srcdir/omarchy-mac" rev-parse HEAD) == "$_commit" ]] +} + +check() { + "$srcdir/addon/test/all" +} + +package() { + # Runtime-only: the builder does not need the Omarchy desktop to stage or + # test the add-on. + depends=('omarchy' 'bash' 'coreutils' 'diffutils' 'grep' 'sed' 'gawk' 'systemd' 'pciutils' 'kmod' + 'networkmanager' 'iwd' 'python' 'pipewire' 'pipewire-pulse' 'libpulse' 'wireplumber') + + "$srcdir/addon/install" "$pkgdir" + install -Dm644 "$srcdir/addon/README.md" "$pkgdir/usr/share/doc/$pkgname/README.md" + install -Dm644 "$srcdir/addon/ORIGINS.md" "$pkgdir/usr/share/doc/$pkgname/ORIGINS.md" + printf '%s\n' "$_commit" >"$pkgdir/usr/share/omarchy-mac/source-revision" +} diff --git a/pkgbuilds/omarchy-mac/README.md b/pkgbuilds/omarchy-mac/README.md new file mode 100644 index 0000000..670a13a --- /dev/null +++ b/pkgbuilds/omarchy-mac/README.md @@ -0,0 +1,23 @@ +# omarchy-mac + +Apple Silicon runtime support for Omarchy: Wi-Fi resume recovery, the headset microphone mapping, the notch modprobe default and the NetworkManager Wi-Fi backend. The source is `packages/omarchy-mac/` in omacom/omarchy-mac, with its own version and tests. The recipe pins an exact `quattro-upstream` commit and packages only that directory; `prepare()` copies it away from the surrounding desktop tree before `check()` runs its tests. + +Ported from Scott Jones's recipe in omarchy-mac/omarchy-pkgs-aarch64 (`pkgbuilds/omarchy-mac` at `02ed7b250f7edcf7c5f748acaf7b21ef0a764e9d`). It supersedes the unpublished `omarchy-settings-asahi` recipe. + +## Scope + +The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It depends on the generic `omarchy` package and has no `provides`, so nothing generic can pull it onto non-Apple aarch64 machines. It ships no kernel, boot, installer or trust configuration; those belong to `omarchy-mac-boot`. + +Installing the package activates nothing. `omarchy-mac-setup-system` and `omarchy-mac-setup-user` enable the Wi-Fi and microphone units, and they exit unless `omarchy-hw-apple-silicon` reports Apple Silicon. Stock Omarchy does not yet ship that detector or call these entrypoints, so on a stock install the package is inert until the platform detector and profile work lands. + +Runtime dependencies are declared in `package()`, so the builder stages and tests the add-on without installing the desktop. + +## Updates + +Updates are reviewed pins, never a branch. To release a change to the add-on: + +1. Set `_commit` to the full `quattro-upstream` SHA and `pkgver` to `packages/omarchy-mac/version` at that commit. +2. Reset `pkgrel` to 1 when `pkgver` increases; bump it to re-pin or rebuild the same version. +3. Refresh `sha256sums` with `makepkg -g`. + +Desktop-only commits on `quattro-upstream` do not need a new pin. `0.1.0-5` sorts above the `0.1.0-4.` candidates the collaboration builder produced for test images. From d61e51af75183c05798e2afd05fe1318392e1517 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:34:34 +1000 Subject: [PATCH 26/55] Record the boot recipes as manual holds and state pacman's repository order A bare uboot-asahi comes from whichever repository is listed first, so the comment now says when this build wins and when asahi-alarm's does. --- docs/upstream-sources.md | 2 ++ pkgbuilds/m1n1-aurora/.omarchy/package.json | 3 ++- pkgbuilds/m1n1-aurora/README.md | 2 +- pkgbuilds/uboot-asahi/.omarchy/package.json | 3 ++- pkgbuilds/uboot-asahi/PKGBUILD | 14 ++++++++------ 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/upstream-sources.md b/docs/upstream-sources.md index e57f546..9ef208f 100644 --- a/docs/upstream-sources.md +++ b/docs/upstream-sources.md @@ -170,6 +170,8 @@ These packages were already excluded from automatic AUR updates. The migration p `linux-firmware-cirrus` is a deliberate hold: a self-retiring shim that ships Arch's linux-firmware-cirrus 20260910-2 payload to stable while stable's Arch snapshot is on 20260810-2 (Dell XPS 13 DX13260 / 1028:0e54 speaker firmware). It is versioned 20260810-3 so the genuine Arch package supersedes it as soon as the snapshot advances; bumping it to the Arch version would defeat that. Delete the recipe once stable's snapshot carries linux-firmware >= 20260910. +`m1n1-aurora` and `uboot-asahi` are deliberate holds: Apple Silicon boot code, pinned by hand like `linux-aurora`, and bumped only after a cold boot on the qualification Macs. `m1n1-aurora` pins an aurora-silicon/m1n1 commit plus a local patch. `uboot-asahi` follows asahi-alarm's recipe and patch set (asahi-alarm/PKGBUILDs), which a tag watch on AsahiLinux/u-boot cannot carry. + ## Package-specific boundaries - NVIDIA watches remain on the 580 driver branch. diff --git a/pkgbuilds/m1n1-aurora/.omarchy/package.json b/pkgbuilds/m1n1-aurora/.omarchy/package.json index 2537ec0..dd11ed8 100644 --- a/pkgbuilds/m1n1-aurora/.omarchy/package.json +++ b/pkgbuilds/m1n1-aurora/.omarchy/package.json @@ -1,4 +1,5 @@ { "source": "local", - "channels": ["edge"] + "channels": ["edge"], + "sync": false } diff --git a/pkgbuilds/m1n1-aurora/README.md b/pkgbuilds/m1n1-aurora/README.md index 29fd79d..58cf613 100644 --- a/pkgbuilds/m1n1-aurora/README.md +++ b/pkgbuilds/m1n1-aurora/README.md @@ -4,7 +4,7 @@ m1n1 v1.6.1 from aurora-silicon/m1n1 (06a4601a351ebfd1abb6abba9a44c34e40d94776) ## Pairing with linux-aurora -- It provides `m1n1=1.6.1.aurora1`, which satisfies linux-aurora's `m1n1>=1.6.1`, and conflicts with asahi-alarm's `m1n1`. pacman prefers a package literally named `m1n1` over a provider, so an Aurora transaction names `m1n1-aurora` explicitly. +- It provides `m1n1=1.6.1.aurora1`, which satisfies linux-aurora's `m1n1>=1.6.1`, and conflicts with asahi-alarm's `m1n1`. pacman prefers a package literally named `m1n1` over a provider, so an Aurora transaction names `m1n1-aurora` explicitly and accepts its conflict with `m1n1` (`--ask 4` under `--noconfirm`). - It owns `/usr/lib/asahi-boot/m1n1.bin`. asahi-scripts' `95-m1n1-install.hook` runs `update-m1n1` when that file, `/usr/lib/modules/*/dtbs/*` or U-Boot changes. `update-m1n1` writes m1n1, the device trees and gzipped U-Boot into `m1n1/boot.bin` on the system ESP. asahi-alarm's default takes the device trees from the newest `/lib/modules/*-ARCH/dtbs`, which is where linux-aurora installs its Apple DTBs. `/etc/default/update-m1n1` overrides are left alone. - Raising linux-aurora's `_m1n1_version` above 1.6.1 needs an m1n1-aurora whose provided version satisfies it, released first. diff --git a/pkgbuilds/uboot-asahi/.omarchy/package.json b/pkgbuilds/uboot-asahi/.omarchy/package.json index 2537ec0..dd11ed8 100644 --- a/pkgbuilds/uboot-asahi/.omarchy/package.json +++ b/pkgbuilds/uboot-asahi/.omarchy/package.json @@ -1,4 +1,5 @@ { "source": "local", - "channels": ["edge"] + "channels": ["edge"], + "sync": false } diff --git a/pkgbuilds/uboot-asahi/PKGBUILD b/pkgbuilds/uboot-asahi/PKGBUILD index 37d8925..64e6d72 100644 --- a/pkgbuilds/uboot-asahi/PKGBUILD +++ b/pkgbuilds/uboot-asahi/PKGBUILD @@ -3,12 +3,14 @@ # boots straight to the boot menu and the splash without U-Boot's text. # # Same name as asahi-alarm's, and nothing generic depends on it, so it only -# ever replaces their build on a Mac that has [asahi-alarm] configured. Keep -# pkgver and the patch set in step with asahi-alarm's and pkgrel above -# theirs: once installed, pacman keeps this build over theirs at the same -# pkgver whichever repository is listed first, and a newer asahi-alarm pkgver -# wins until this recipe follows it. No epoch, which would outrank every -# future asahi-alarm release. +# ever replaces their build on a Mac that has [asahi-alarm] configured. +# pacman takes a package from the first repository that carries its name: +# with [omarchy] ahead of [asahi-alarm] this build is installed and kept even +# after asahi-alarm moves on; with [asahi-alarm] ahead it is installed only as +# omarchy/uboot-asahi, kept over their build at the same pkgver, and replaced +# by a newer one. Keep pkgver and the patch set in step with asahi-alarm's and +# pkgrel above theirs. No epoch, which would outrank every future asahi-alarm +# release. pkgname=uboot-asahi _ver=2026.07 From e4521c1bbdee0b0f88fe8588cbb3e3b08398a38e Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:35:23 +1000 Subject: [PATCH 27/55] Say which omarchy-mac configuration applies before setup runs --- pkgbuilds/omarchy-mac/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgbuilds/omarchy-mac/README.md b/pkgbuilds/omarchy-mac/README.md index 670a13a..49aa1e6 100644 --- a/pkgbuilds/omarchy-mac/README.md +++ b/pkgbuilds/omarchy-mac/README.md @@ -8,7 +8,7 @@ Ported from Scott Jones's recipe in omarchy-mac/omarchy-pkgs-aarch64 (`pkgbuilds The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It depends on the generic `omarchy` package and has no `provides`, so nothing generic can pull it onto non-Apple aarch64 machines. It ships no kernel, boot, installer or trust configuration; those belong to `omarchy-mac-boot`. -Installing the package activates nothing. `omarchy-mac-setup-system` and `omarchy-mac-setup-user` enable the Wi-Fi and microphone units, and they exit unless `omarchy-hw-apple-silicon` reports Apple Silicon. Stock Omarchy does not yet ship that detector or call these entrypoints, so on a stock install the package is inert until the platform detector and profile work lands. +Installing the package enables no services, but its vendor configuration applies on the next service start or module load: the iwd Wi-Fi backend for NetworkManager, the `appledrm` notch option and the WirePlumber headset microphone policy. `omarchy-mac-setup-system` and `omarchy-mac-setup-user` enable the Wi-Fi resume and microphone units, and they exit unless `omarchy-hw-apple-silicon` reports Apple Silicon. Stock Omarchy does not yet ship that detector or call these entrypoints, so on a stock install the units stay disabled until the platform detector and profile work lands. Runtime dependencies are declared in `package()`, so the builder stages and tests the add-on without installing the desktop. From 73d8b1e84e6a32899f914fb85b3707a6e92c3c9b Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:37:04 +1000 Subject: [PATCH 28/55] Say how uboot-asahi gets installed rather than where --- pkgbuilds/uboot-asahi/PKGBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgbuilds/uboot-asahi/PKGBUILD b/pkgbuilds/uboot-asahi/PKGBUILD index 64e6d72..769a083 100644 --- a/pkgbuilds/uboot-asahi/PKGBUILD +++ b/pkgbuilds/uboot-asahi/PKGBUILD @@ -2,8 +2,8 @@ # with a silent console, no banner, no logo and no boot delay, so the Mac # boots straight to the boot menu and the splash without U-Boot's text. # -# Same name as asahi-alarm's, and nothing generic depends on it, so it only -# ever replaces their build on a Mac that has [asahi-alarm] configured. +# Same name as asahi-alarm's, and nothing generic depends on it: it is only +# installed when named, or as an upgrade of an installed uboot-asahi. # pacman takes a package from the first repository that carries its name: # with [omarchy] ahead of [asahi-alarm] this build is installed and kept even # after asahi-alarm moves on; with [asahi-alarm] ahead it is installed only as From a090edeb7fed2f923ce843305bf47943a7daf271 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:42:53 +1000 Subject: [PATCH 29/55] Carry aquamarine 0.15.1 on edge for Apple Silicon and rebuild Hyprland Carry Arch's aquamarine 0.15.1-1 with one patch that re-reads a connector's possible CRTCs on rescan, so a Type-C port the Apple DCP fabric reroutes to another pipeline gets a CRTC without restarting the compositor. aarch64 and edge only; pkgrel 1.1 sits above Arch Linux ARM's 0.15.1-1. Bump Hyprland for aquamarine 0.15.1 and make rebuild detection see aarch64. sync-rebuilds followed PUBLISHED_ARCHES (x86_64 by default), so the scheduled run skipped every aarch64-only package, and it read aarch64 triggers from Arch Linux ARM even when this repository carries them. It now follows the architectures a merge builds, and reads a carried trigger from its recipe once edge publishes that version. --- README.md | 7 +- bin/build-matrix | 2 +- bin/sync-rebuilds | 201 +++++++++++++++--- helpers/paths.sh | 14 ++ pkgbuilds/aquamarine/.omarchy/package.json | 6 + ...ble-CRTCs-when-rescanning-connectors.patch | 36 ++++ pkgbuilds/aquamarine/PKGBUILD | 58 +++++ pkgbuilds/hyprland/.omarchy/package.json | 2 +- pkgbuilds/hyprland/PKGBUILD | 2 +- 9 files changed, 293 insertions(+), 35 deletions(-) create mode 100644 pkgbuilds/aquamarine/.omarchy/package.json create mode 100644 pkgbuilds/aquamarine/0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch create mode 100644 pkgbuilds/aquamarine/PKGBUILD diff --git a/README.md b/README.md index 8823595..6920a14 100644 --- a/README.md +++ b/README.md @@ -520,7 +520,8 @@ A package names those dependencies in `.omarchy/package.json`: ``` `bin/sync-rebuilds` reads each named package's version from the official -repositories for every published architecture the package supports and compares +repositories for every architecture a merge builds (`CI_ARCHES` in +`helpers/paths.sh`, both by default) that the package supports and compares it to `rebuilt_against`. Records are kept per architecture because Arch and Arch Linux ARM can carry different dependency versions. pkgrel is bumped once when any recorded version moves; that one source revision is then rebuilt by @@ -539,6 +540,8 @@ repository database, which is also what the ARM builder uses. Testing and staging repositories do not count. A legacy flat `rebuilt_against` record is read as x86_64 and is migrated naturally the next time a rebuild is needed. +A dependency this repository carries for an architecture (a recipe here that builds for edge on it, such as aquamarine on aarch64) shadows the distribution's, because the builder lists `[omarchy]` first. Its version is the recipe's, and it counts only once edge publishes that version: until then the builder still links against the previous one, so dependents are left alone for that run. + ### Other ```bash @@ -726,7 +729,7 @@ Fields: - `skip_build`: optional boolean; defaults to `false`. Set `true` to exclude a package from scheduled version checks and unscoped builds. The package can still be built explicitly with `bin/repo release --package `. - `pkgrel`: legacy import customization metadata. Maintained recipes keep their complete package release directly in PKGBUILD; rebuilds increment it there. - `rebuild_on`: optional array of package names this package links against closely enough that it must be rebuilt when they change, independent of its own source. Read by `bin/sync-rebuilds`. -- `rebuilt_against`: written by `bin/sync-rebuilds`. Maps each published architecture to the versions of its `rebuild_on` packages that the current pkgrel was bumped for. +- `rebuilt_against`: written by `bin/sync-rebuilds`. Maps each built architecture to the versions of its `rebuild_on` packages that the current pkgrel was bumped for. - `upstream_commit`: legacy AUR metadata, superseded by `origin.commit`. `bin/package-worktree` can use historical provenance to inspect the original recipe. ### Build Matrix diff --git a/bin/build-matrix b/bin/build-matrix index e772349..584a3bd 100755 --- a/bin/build-matrix +++ b/bin/build-matrix @@ -19,7 +19,7 @@ BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..") source "$BUILD_ROOT/helpers/paths.sh" source "$BUILD_ROOT/helpers/package-metadata.sh" -ARCHES=${CI_ARCHES:-x86_64 aarch64} +ARCHES=$CI_ARCHES if [[ "${1:-}" == --arch ]]; then [[ $2 == all ]] || ARCHES=$2; shift 2; fi for a in $ARCHES; do require_valid_arch "$a"; done diff --git a/bin/sync-rebuilds b/bin/sync-rebuilds index 3009b89..d99277f 100755 --- a/bin/sync-rebuilds +++ b/bin/sync-rebuilds @@ -67,8 +67,10 @@ Examples: $0 quickshell-git # Update specific packages x86_64 trigger versions come from the local pacman database; aarch64 versions -come from the live Arch Linux ARM repository database. Only architectures in -PUBLISHED_ARCHES that the package supports are considered. +come from the live Arch Linux ARM repository database. A trigger this +repository carries for an architecture shadows both, so its version is the +checked-in recipe's once edge publishes it. Every architecture in CI_ARCHES +(what a merge builds) that the package supports is considered. EOF } @@ -167,6 +169,8 @@ repo_version() { # repo_version } declare -A PUBLISHED_VERSION=() +declare -A EDGE_VERSION=() +declare -A EDGE_READ=() PUBLISHED_LOADED=false remember_published() { @@ -190,7 +194,7 @@ load_published_versions() { local arch mirror db name base version - for arch in $(published_arches); do + for arch in $(ci_arches); do for mirror in "${PUBLISHED_MIRRORS[@]}"; do db="$TEMP_DIR/published-$mirror-$arch.db.tar.zst" @@ -199,10 +203,19 @@ load_published_versions() { print_warning "Could not read the published $mirror/$arch database; bumps are not checked against it this run" continue fi + if ! tar -tf "$db" >/dev/null 2>&1; then + print_warning "Unreadable published $mirror/$arch database; bumps are not checked against it this run" + continue + fi + [[ "$mirror" == edge ]] && EDGE_READ["$arch"]=1 while IFS=$'\t' read -r name base version; do [[ -n "$name" && -n "$version" ]] && remember_published "$name" "$version" [[ -n "$base" && -n "$version" ]] && remember_published "$base" "$version" + if [[ "$mirror" == edge && -n "$version" ]]; then + [[ -z "$name" ]] || EDGE_VERSION["$arch/$name"]="$version" + [[ -z "$base" ]] || EDGE_VERSION["$arch/$base"]="$version" + fi done < <( tar -xOf "$db" --wildcards '*/desc' 2>/dev/null | awk ' function emit() { @@ -227,6 +240,27 @@ published_version() { echo "${PUBLISHED_VERSION[$package]:-}" } +# A trigger this repository builds for the architecture. The builder lists +# [omarchy] ahead of the distribution repositories, so this recipe, not Arch or +# Arch Linux ARM, decides what a dependent links against. +carried_trigger_dir() { # carried_trigger_dir + local pkgdir + pkgdir=$(package_dir_for_name "$2") || return 1 + package_has_metadata "$pkgdir" || return 1 + package_builds_for_mirror "$pkgdir" edge || return 1 + package_supports_arch "$pkgdir" "$1" || return 1 + echo "$pkgdir" +} + +carried_version() { # carried_version + local epoch pkgver pkgrel + epoch=$(package_pkgbuild_var "$2" epoch "$1") || return 1 + pkgver=$(package_pkgbuild_var "$2" pkgver "$1") || return 1 + pkgrel=$(package_pkgbuild_var "$2" pkgrel "$1") || return 1 + [[ -n "$pkgver" && -n "$pkgrel" ]] || return 1 + echo "${epoch:+$epoch:}$pkgver-$pkgrel" +} + # The pkgver of a full version string, with any epoch and pkgrel removed. version_pkgver() { local version="${1#*:}" @@ -368,13 +402,33 @@ sync_package() { print_info "Checking $package against ${triggers[*]}..." - local current="{}" arch arch_current trigger version considered=0 - for arch in $(published_arches); do + local current="{}" arch arch_current trigger version carried considered=0 + for arch in $(ci_arches); do package_supports_arch "$package_dir" "$arch" || continue considered=$((considered + 1)) arch_current="{}" for trigger in "${triggers[@]}"; do - if ! version=$(repo_version "$arch" "$trigger"); then + if carried=$(carried_trigger_dir "$arch" "$trigger"); then + if ! version=$(carried_version "$arch" "$carried"); then + print_error " Could not read the $arch version of $trigger from its recipe; leaving $package alone" + ((++FAILED)) + return 0 + fi + load_published_versions + if [[ -z "${EDGE_READ[$arch]:-}" ]]; then + print_error " Could not read the published edge/$arch database for $trigger; leaving $package alone" + ((++FAILED)) + return 0 + fi + # Until edge publishes the recipe's version the builder still links + # against the previous one, and recording the new version now would + # certify a build that never saw it. + if [[ "${EDGE_VERSION[$arch/$trigger]:-}" != "$version" ]]; then + print_warning " $trigger $version is not published on edge/$arch yet; leaving $package alone until it is" + ((++SKIPPED)) + return 0 + fi + elif ! version=$(repo_version "$arch" "$trigger"); then print_error " Could not read $arch repository versions; leaving $package alone" ((++FAILED)) return 0 @@ -479,6 +533,7 @@ sync_package() { # checkout that has fallen behind the repository can otherwise be bumped to # something pacman orders below what it would replace. local floor + load_published_versions floor=$(published_version "$package") if [[ -n "$floor" && "$(version_pkgver "$floor")" == "$pkgver" ]]; then if [[ "$(vercmp "$new_version" "$floor")" -le 0 ]]; then @@ -584,26 +639,33 @@ STUB chmod +x "$root/stub/pacman" } -# Serves a repository database assembled by hand from name=version pairs. With -# none given the stub fails, which is how the unreachable-repository path is +# A repository database assembled by hand from name=version pairs. +selftest_db() { + local out="$1" + shift + local staging="$out.d" entry name version + + rm -rf "$staging" + mkdir -p "$staging" + for entry in "$@"; do + name="${entry%=*}" + version="${entry#*=}" + mkdir -p "$staging/$name-$version" + printf '%%FILENAME%%\n%s-%s-x86_64.pkg.tar.zst\n\n%%NAME%%\n%s\n\n%%BASE%%\n%s\n\n%%VERSION%%\n%s\n' \ + "$name" "$version" "$name" "$name" "$version" > "$staging/$name-$version/desc" + done + tar --zstd -cf "$out" -C "$staging" . +} + +# Serves one published database for every channel and architecture. With no +# pairs given the stub fails, which is how the unreachable-repository path is # exercised. selftest_published() { local root="$1" shift - local staging="$root/stub/db" - local entry name version if [[ $# -gt 0 ]]; then - rm -rf "$staging" - mkdir -p "$staging" - for entry in "$@"; do - name="${entry%=*}" - version="${entry#*=}" - mkdir -p "$staging/$name-$version" - printf '%%FILENAME%%\n%s-%s-x86_64.pkg.tar.zst\n\n%%NAME%%\n%s\n\n%%BASE%%\n%s\n\n%%VERSION%%\n%s\n' \ - "$name" "$version" "$name" "$name" "$version" > "$staging/$name-$version/desc" - done - tar --zstd -cf "$root/stub/omarchy.db.tar.zst" -C "$staging" . + selftest_db "$root/stub/omarchy.db.tar.zst" "$@" fi cat > "$root/stub/curl" <<'STUB' @@ -616,19 +678,33 @@ while [[ $# -gt 0 ]]; do *) url="$1"; shift ;; esac done -if [[ "$url" == */aarch64/* ]]; then - repo="${url%/*}" - repo="${repo##*/}" - db="$(dirname "$0")/alarm-$repo.db" -else - db="$(dirname "$0")/omarchy.db.tar.zst" -fi +case "$url" in + */omarchy.db.tar.zst) + channel="${url%/omarchy.db.tar.zst}" + arch="${channel##*/}" + channel="${channel%/*}" + db="$(dirname "$0")/omarchy-${channel##*/}-$arch.db.tar.zst" + [[ -f "$db" ]] || db="$(dirname "$0")/omarchy.db.tar.zst" + ;; + */aarch64/*) + repo="${url%/*}" + db="$(dirname "$0")/alarm-${repo##*/}.db" + ;; + *) db="" ;; +esac [[ -f "$db" && -n "$out" ]] || exit 22 cp "$db" "$out" STUB chmod +x "$root/stub/curl" } +# Serves one channel and architecture its own published database. +selftest_channel() { # selftest_channel [name=version...] + local root="$1" channel="$2" arch="$3" + shift 3 + selftest_db "$root/stub/omarchy-$channel-$arch.db.tar.zst" "$@" +} + selftest_alarm() { local root="$1" shift @@ -668,12 +744,15 @@ cmd_self_test() { fi } + # SELFTEST_ARCHES stands in for CI_ARCHES; "default" leaves it unset, as the + # scheduled workflow does. run_case() { local root="$1" shift - local status=0 - OMARCHY_ARCHES="${SELFTEST_ARCHES:-x86_64}" \ - PATH="$root/stub:$PATH" "$root/bin/sync-rebuilds" "$@" > "$root/output" 2>&1 || status=$? + local status=0 arches=(CI_ARCHES="${SELFTEST_ARCHES:-x86_64}") + [[ "${SELFTEST_ARCHES:-}" != default ]] || arches=(-u CI_ARCHES) + env "${arches[@]}" PATH="$root/stub:$PATH" \ + "$root/bin/sync-rebuilds" "$@" > "$root/output" 2>&1 || status=$? echo "$status" } @@ -781,6 +860,68 @@ cmd_self_test() { unset SELFTEST_ARCHES check "pkgrel untouched" 1 "$(pkgrel_of "$root/pkgbuilds/t-x86")" + echo "An ARM-only package is checked when no architecture list is given:" + root=$(selftest_root arm-default) + selftest_package "$root" t-arm-default 1 '{"source":"local","rebuild_on":["dep-a"],"rebuilt_against":{"aarch64":{"dep-a":"1-1"}}}' 1.0 aarch64 + selftest_pacman "$root" + selftest_published "$root" + selftest_alarm "$root" dep-a=2-1 + SELFTEST_ARCHES=default + check "run succeeds" 0 "$(run_case "$root")" + unset SELFTEST_ARCHES + check "pkgrel bumped" 2 "$(pkgrel_of "$root/pkgbuilds/t-arm-default")" + check "ARM trigger recorded" "2-1" \ + "$(jq -r '.rebuilt_against.aarch64["dep-a"]' "$root/pkgbuilds/t-arm-default/.omarchy/package.json")" + + echo "A dependency carried here for ARM is read from its recipe once edge publishes it:" + root=$(selftest_root carried) + selftest_package "$root" t-carried 1.1 '{"source":"local","channels":["edge"]}' 0.15.1 aarch64 + selftest_package "$root" t-linked 3 '{"source":"local","rebuild_on":["t-carried"],"rebuilt_against":{"x86_64":{"t-carried":"0.15.1-1"},"aarch64":{"t-carried":"0.15.0-2"}}}' 1.0 'x86_64 aarch64' + selftest_pacman "$root" t-carried=0.15.1-1 + selftest_published "$root" + selftest_alarm "$root" t-carried=0.15.1-1 + selftest_channel "$root" edge aarch64 t-carried=0.15.1-1.1 + SELFTEST_ARCHES=default + check "run succeeds" 0 "$(run_case "$root")" + check "pkgrel bumped" 4 "$(pkgrel_of "$root/pkgbuilds/t-linked")" + check "the carried version is recorded, not Arch Linux ARM's" "0.15.1-1.1" \ + "$(jq -r '.rebuilt_against.aarch64["t-carried"]' "$root/pkgbuilds/t-linked/.omarchy/package.json")" + check "x86_64, where nothing is carried, still reads the distribution" "0.15.1-1" \ + "$(jq -r '.rebuilt_against.x86_64["t-carried"]' "$root/pkgbuilds/t-linked/.omarchy/package.json")" + check "a second run succeeds" 0 "$(run_case "$root")" + unset SELFTEST_ARCHES + check "a second run leaves it alone" 4 "$(pkgrel_of "$root/pkgbuilds/t-linked")" + + echo "A carried dependency that edge does not publish yet leaves its dependents alone:" + root=$(selftest_root carried-in-flight) + selftest_package "$root" t-carried 1.2 '{"source":"local","channels":["edge"]}' 0.15.1 aarch64 + selftest_package "$root" t-linked 4 '{"source":"local","rebuild_on":["t-carried"],"rebuilt_against":{"aarch64":{"t-carried":"0.15.1-1.1"}}}' 1.0 aarch64 + selftest_pacman "$root" + selftest_published "$root" + selftest_alarm "$root" t-carried=0.15.1-1 + selftest_channel "$root" edge aarch64 t-carried=0.15.1-1.1 + SELFTEST_ARCHES=aarch64 + check "run succeeds" 0 "$(run_case "$root")" + unset SELFTEST_ARCHES + check "pkgrel untouched" 4 "$(pkgrel_of "$root/pkgbuilds/t-linked")" + check "record untouched" "0.15.1-1.1" \ + "$(jq -r '.rebuilt_against.aarch64["t-carried"]' "$root/pkgbuilds/t-linked/.omarchy/package.json")" + + echo "A carried dependency whose edge database cannot be read fails the run:" + root=$(selftest_root carried-unreadable) + selftest_package "$root" t-carried 1.1 '{"source":"local","channels":["edge"]}' 0.15.1 aarch64 + selftest_package "$root" t-linked 3 '{"source":"local","rebuild_on":["t-carried"],"rebuilt_against":{"aarch64":{"t-carried":"0.15.0-2"}}}' 1.0 aarch64 + selftest_pacman "$root" + selftest_published "$root" + selftest_alarm "$root" t-carried=0.15.1-1 + SELFTEST_ARCHES=aarch64 + check "run fails" 1 "$(run_case "$root")" + check "pkgrel untouched" 3 "$(pkgrel_of "$root/pkgbuilds/t-linked")" + printf 'not a database\n' > "$root/stub/omarchy-edge-aarch64.db.tar.zst" + check "a corrupt download fails the run too" 1 "$(run_case "$root")" + unset SELFTEST_ARCHES + check "pkgrel still untouched" 3 "$(pkgrel_of "$root/pkgbuilds/t-linked")" + echo "A PKGBUILD that branches on CARCH at file scope still reads its version:" root=$(selftest_root carch-branch) mkdir -p "$root/pkgbuilds/t-carch/.omarchy" diff --git a/helpers/paths.sh b/helpers/paths.sh index 5d6191c..1d734a9 100644 --- a/helpers/paths.sh +++ b/helpers/paths.sh @@ -43,6 +43,20 @@ reference_arch() { published_arches | head -1 } +# Architectures a merge to master builds and publishes: bin/build-matrix plans +# a PR build for each one a package supports, and publish.yml ships them. This +# is independent of PUBLISHED_ARCHES, so anything deciding what a merge has to +# rebuild (bin/sync-rebuilds) follows this list. CI_ARCHES overrides it. +CI_ARCHES="${CI_ARCHES:-x86_64 aarch64}" + +ci_arches() { + local arch + for arch in $CI_ARCHES; do + require_valid_arch "$arch" + echo "$arch" + done +} + # Scheduled-pipeline state, one file per channel and architecture, so one # architecture's queue or backoff never gates another's. STATE_DIR="${OMARCHY_STATE_DIR:-/root/.state}" diff --git a/pkgbuilds/aquamarine/.omarchy/package.json b/pkgbuilds/aquamarine/.omarchy/package.json new file mode 100644 index 0000000..7ddd330 --- /dev/null +++ b/pkgbuilds/aquamarine/.omarchy/package.json @@ -0,0 +1,6 @@ +{ + "source": "local", + "channels": [ + "edge" + ] +} diff --git a/pkgbuilds/aquamarine/0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch b/pkgbuilds/aquamarine/0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch new file mode 100644 index 0000000..bbf7043 --- /dev/null +++ b/pkgbuilds/aquamarine/0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch @@ -0,0 +1,36 @@ +From 375e80ec3826b54618fdd5f2db708c0f2bb936ae Mon Sep 17 00:00:00 2001 +From: Marcelo Alcantara +Date: Wed, 16 Sep 2026 00:39:04 +1000 +Subject: [PATCH] drm: re-read possible CRTCs when rescanning connectors + +A driver can change a connector's possible CRTCs at runtime. Apple's DCP +driver narrows a Type-C port's encoder to the display pipeline the fabric +routed it to and relies on the following hotplug for userspace to re-read +it. possibleCrtcs was only read when the connector was first created, so a +rerouted port kept a stale mask and was never assigned its now-free CRTC +until the compositor restarted. +--- + src/backend/drm/DRM.cpp | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/backend/drm/DRM.cpp b/src/backend/drm/DRM.cpp +index 6618a26..b492dac 100644 +--- a/src/backend/drm/DRM.cpp ++++ b/src/backend/drm/DRM.cpp +@@ -1287,6 +1287,13 @@ void Aquamarine::CDRMBackend::scanConnectors() { + } else { + backend->log(AQ_LOG_DEBUG, std::format("drm: Connector id {} already initialized", connectorID)); + conn = *it; ++ ++ // drivers may narrow or widen these on hotplug, e.g. when a Type-C port is rerouted to another pipeline ++ const auto possibleCrtcs = drmModeConnectorGetPossibleCrtcs(gpu->fd, drmConn); ++ if (possibleCrtcs && possibleCrtcs != conn->possibleCrtcs) { ++ backend->log(AQ_LOG_DEBUG, std::format("drm: Connector {} possible CRTCs changed {:#x} -> {:#x}", conn->szName, conn->possibleCrtcs, possibleCrtcs)); ++ conn->possibleCrtcs = possibleCrtcs; ++ } + } + + conn->status = drmConn->connection; +-- +2.50.1 (Apple Git-155) + diff --git a/pkgbuilds/aquamarine/PKGBUILD b/pkgbuilds/aquamarine/PKGBUILD new file mode 100644 index 0000000..2941ebd --- /dev/null +++ b/pkgbuilds/aquamarine/PKGBUILD @@ -0,0 +1,58 @@ +# Maintainer: Caleb Maclennan +# Contributor: Aaron Blasko +# +# Arch's aquamarine 0.15.1-1 plus one patch, carried on edge for Apple Silicon: +# re-read a connector's possible CRTCs when rescanning, so a Type-C port the +# DCP fabric reroutes to another display pipeline gets a CRTC without +# restarting the compositor. Drop the carry once hyprwm releases the fix. +# Hyprland is rebuilt whenever this package changes (its rebuild_on). + +pkgname=aquamarine +pkgver=0.15.1 +pkgrel=1.1 +pkgdesc='a very light linux rendering backend library' +arch=(aarch64) +url="https://github.com/hyprwm/$pkgname" +license=(BSD-3-Clause) +depends=(libgcc + libstdc++ + glibc # libc.so libm.so + hyprutils libhyprutils.so + libdisplay-info libdisplay-info.so + libdrm # libdrm.so + libglvnd libEGL.so + libinput # libinput.so + mesa # libgbm.so + opengl-driver + pixman + seatd libseat.so + systemd-libs libudev.so + wayland libwayland-client.so + wayland-protocols) +makedepends=(cmake + hyprwayland-scanner) +provides=("lib$pkgname.so") +_archive="$pkgname-$pkgver" +source=("$url/archive/v$pkgver/$_archive.tar.gz" + 0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch) +sha256sums=('2f9de98c0bd1b7b1b09c576e390a2fef436449762fb334163c414f0c300296f2' + '50e9e38ff915b18074dc9b5dd1d07d7f24e340e99f254476d6abe578eece7864') + +prepare() { + cd "$_archive" + patch -Np1 -i ../0001-drm-re-read-possible-CRTCs-when-rescanning-connectors.patch +} + +build() { + cd "$_archive" + cmake -B build \ + -D CMAKE_INSTALL_PREFIX=/usr \ + -D CMAKE_BUILD_TYPE=Release + cmake --build build +} + +package() { + cd "$_archive" + DESTDIR="$pkgdir" cmake --install build + install -Dm0644 -t "$pkgdir/usr/share/licenses/$pkgname" LICENSE +} diff --git a/pkgbuilds/hyprland/.omarchy/package.json b/pkgbuilds/hyprland/.omarchy/package.json index 9dd9745..0642ff7 100644 --- a/pkgbuilds/hyprland/.omarchy/package.json +++ b/pkgbuilds/hyprland/.omarchy/package.json @@ -15,7 +15,7 @@ ], "rebuilt_against": { "aarch64": { - "aquamarine": "0.15.0-2" + "aquamarine": "0.15.1-1" } } } diff --git a/pkgbuilds/hyprland/PKGBUILD b/pkgbuilds/hyprland/PKGBUILD index cbb70ed..4a5f41c 100644 --- a/pkgbuilds/hyprland/PKGBUILD +++ b/pkgbuilds/hyprland/PKGBUILD @@ -5,7 +5,7 @@ pkgname=(hyprland hyprpm) pkgver=0.56.2 -pkgrel=3 +pkgrel=4 pkgdesc='a highly customizable dynamic tiling Wayland compositor' arch=(aarch64) url="https://github.com/hyprwm/${pkgname^}" From 584fa5732e5a972206e2c32e8a75892cdbd3c955 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:46:06 +1000 Subject: [PATCH 30/55] Leave Hyprland and rebuild detection to their own changes PR builds link against published edge, so a Hyprland bump in the same merge cannot see the carry, and as a fast-ring package it would reach every aarch64 channel. The rebuild detection fix that bumps it once the carry publishes moves to its own PR, so this change only adds the aquamarine carry. --- README.md | 7 +- bin/build-matrix | 2 +- bin/sync-rebuilds | 201 ++++------------------- helpers/paths.sh | 14 -- pkgbuilds/hyprland/.omarchy/package.json | 2 +- pkgbuilds/hyprland/PKGBUILD | 2 +- 6 files changed, 35 insertions(+), 193 deletions(-) diff --git a/README.md b/README.md index 6920a14..8823595 100644 --- a/README.md +++ b/README.md @@ -520,8 +520,7 @@ A package names those dependencies in `.omarchy/package.json`: ``` `bin/sync-rebuilds` reads each named package's version from the official -repositories for every architecture a merge builds (`CI_ARCHES` in -`helpers/paths.sh`, both by default) that the package supports and compares +repositories for every published architecture the package supports and compares it to `rebuilt_against`. Records are kept per architecture because Arch and Arch Linux ARM can carry different dependency versions. pkgrel is bumped once when any recorded version moves; that one source revision is then rebuilt by @@ -540,8 +539,6 @@ repository database, which is also what the ARM builder uses. Testing and staging repositories do not count. A legacy flat `rebuilt_against` record is read as x86_64 and is migrated naturally the next time a rebuild is needed. -A dependency this repository carries for an architecture (a recipe here that builds for edge on it, such as aquamarine on aarch64) shadows the distribution's, because the builder lists `[omarchy]` first. Its version is the recipe's, and it counts only once edge publishes that version: until then the builder still links against the previous one, so dependents are left alone for that run. - ### Other ```bash @@ -729,7 +726,7 @@ Fields: - `skip_build`: optional boolean; defaults to `false`. Set `true` to exclude a package from scheduled version checks and unscoped builds. The package can still be built explicitly with `bin/repo release --package `. - `pkgrel`: legacy import customization metadata. Maintained recipes keep their complete package release directly in PKGBUILD; rebuilds increment it there. - `rebuild_on`: optional array of package names this package links against closely enough that it must be rebuilt when they change, independent of its own source. Read by `bin/sync-rebuilds`. -- `rebuilt_against`: written by `bin/sync-rebuilds`. Maps each built architecture to the versions of its `rebuild_on` packages that the current pkgrel was bumped for. +- `rebuilt_against`: written by `bin/sync-rebuilds`. Maps each published architecture to the versions of its `rebuild_on` packages that the current pkgrel was bumped for. - `upstream_commit`: legacy AUR metadata, superseded by `origin.commit`. `bin/package-worktree` can use historical provenance to inspect the original recipe. ### Build Matrix diff --git a/bin/build-matrix b/bin/build-matrix index 584a3bd..e772349 100755 --- a/bin/build-matrix +++ b/bin/build-matrix @@ -19,7 +19,7 @@ BUILD_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..") source "$BUILD_ROOT/helpers/paths.sh" source "$BUILD_ROOT/helpers/package-metadata.sh" -ARCHES=$CI_ARCHES +ARCHES=${CI_ARCHES:-x86_64 aarch64} if [[ "${1:-}" == --arch ]]; then [[ $2 == all ]] || ARCHES=$2; shift 2; fi for a in $ARCHES; do require_valid_arch "$a"; done diff --git a/bin/sync-rebuilds b/bin/sync-rebuilds index d99277f..3009b89 100755 --- a/bin/sync-rebuilds +++ b/bin/sync-rebuilds @@ -67,10 +67,8 @@ Examples: $0 quickshell-git # Update specific packages x86_64 trigger versions come from the local pacman database; aarch64 versions -come from the live Arch Linux ARM repository database. A trigger this -repository carries for an architecture shadows both, so its version is the -checked-in recipe's once edge publishes it. Every architecture in CI_ARCHES -(what a merge builds) that the package supports is considered. +come from the live Arch Linux ARM repository database. Only architectures in +PUBLISHED_ARCHES that the package supports are considered. EOF } @@ -169,8 +167,6 @@ repo_version() { # repo_version } declare -A PUBLISHED_VERSION=() -declare -A EDGE_VERSION=() -declare -A EDGE_READ=() PUBLISHED_LOADED=false remember_published() { @@ -194,7 +190,7 @@ load_published_versions() { local arch mirror db name base version - for arch in $(ci_arches); do + for arch in $(published_arches); do for mirror in "${PUBLISHED_MIRRORS[@]}"; do db="$TEMP_DIR/published-$mirror-$arch.db.tar.zst" @@ -203,19 +199,10 @@ load_published_versions() { print_warning "Could not read the published $mirror/$arch database; bumps are not checked against it this run" continue fi - if ! tar -tf "$db" >/dev/null 2>&1; then - print_warning "Unreadable published $mirror/$arch database; bumps are not checked against it this run" - continue - fi - [[ "$mirror" == edge ]] && EDGE_READ["$arch"]=1 while IFS=$'\t' read -r name base version; do [[ -n "$name" && -n "$version" ]] && remember_published "$name" "$version" [[ -n "$base" && -n "$version" ]] && remember_published "$base" "$version" - if [[ "$mirror" == edge && -n "$version" ]]; then - [[ -z "$name" ]] || EDGE_VERSION["$arch/$name"]="$version" - [[ -z "$base" ]] || EDGE_VERSION["$arch/$base"]="$version" - fi done < <( tar -xOf "$db" --wildcards '*/desc' 2>/dev/null | awk ' function emit() { @@ -240,27 +227,6 @@ published_version() { echo "${PUBLISHED_VERSION[$package]:-}" } -# A trigger this repository builds for the architecture. The builder lists -# [omarchy] ahead of the distribution repositories, so this recipe, not Arch or -# Arch Linux ARM, decides what a dependent links against. -carried_trigger_dir() { # carried_trigger_dir - local pkgdir - pkgdir=$(package_dir_for_name "$2") || return 1 - package_has_metadata "$pkgdir" || return 1 - package_builds_for_mirror "$pkgdir" edge || return 1 - package_supports_arch "$pkgdir" "$1" || return 1 - echo "$pkgdir" -} - -carried_version() { # carried_version - local epoch pkgver pkgrel - epoch=$(package_pkgbuild_var "$2" epoch "$1") || return 1 - pkgver=$(package_pkgbuild_var "$2" pkgver "$1") || return 1 - pkgrel=$(package_pkgbuild_var "$2" pkgrel "$1") || return 1 - [[ -n "$pkgver" && -n "$pkgrel" ]] || return 1 - echo "${epoch:+$epoch:}$pkgver-$pkgrel" -} - # The pkgver of a full version string, with any epoch and pkgrel removed. version_pkgver() { local version="${1#*:}" @@ -402,33 +368,13 @@ sync_package() { print_info "Checking $package against ${triggers[*]}..." - local current="{}" arch arch_current trigger version carried considered=0 - for arch in $(ci_arches); do + local current="{}" arch arch_current trigger version considered=0 + for arch in $(published_arches); do package_supports_arch "$package_dir" "$arch" || continue considered=$((considered + 1)) arch_current="{}" for trigger in "${triggers[@]}"; do - if carried=$(carried_trigger_dir "$arch" "$trigger"); then - if ! version=$(carried_version "$arch" "$carried"); then - print_error " Could not read the $arch version of $trigger from its recipe; leaving $package alone" - ((++FAILED)) - return 0 - fi - load_published_versions - if [[ -z "${EDGE_READ[$arch]:-}" ]]; then - print_error " Could not read the published edge/$arch database for $trigger; leaving $package alone" - ((++FAILED)) - return 0 - fi - # Until edge publishes the recipe's version the builder still links - # against the previous one, and recording the new version now would - # certify a build that never saw it. - if [[ "${EDGE_VERSION[$arch/$trigger]:-}" != "$version" ]]; then - print_warning " $trigger $version is not published on edge/$arch yet; leaving $package alone until it is" - ((++SKIPPED)) - return 0 - fi - elif ! version=$(repo_version "$arch" "$trigger"); then + if ! version=$(repo_version "$arch" "$trigger"); then print_error " Could not read $arch repository versions; leaving $package alone" ((++FAILED)) return 0 @@ -533,7 +479,6 @@ sync_package() { # checkout that has fallen behind the repository can otherwise be bumped to # something pacman orders below what it would replace. local floor - load_published_versions floor=$(published_version "$package") if [[ -n "$floor" && "$(version_pkgver "$floor")" == "$pkgver" ]]; then if [[ "$(vercmp "$new_version" "$floor")" -le 0 ]]; then @@ -639,33 +584,26 @@ STUB chmod +x "$root/stub/pacman" } -# A repository database assembled by hand from name=version pairs. -selftest_db() { - local out="$1" - shift - local staging="$out.d" entry name version - - rm -rf "$staging" - mkdir -p "$staging" - for entry in "$@"; do - name="${entry%=*}" - version="${entry#*=}" - mkdir -p "$staging/$name-$version" - printf '%%FILENAME%%\n%s-%s-x86_64.pkg.tar.zst\n\n%%NAME%%\n%s\n\n%%BASE%%\n%s\n\n%%VERSION%%\n%s\n' \ - "$name" "$version" "$name" "$name" "$version" > "$staging/$name-$version/desc" - done - tar --zstd -cf "$out" -C "$staging" . -} - -# Serves one published database for every channel and architecture. With no -# pairs given the stub fails, which is how the unreachable-repository path is +# Serves a repository database assembled by hand from name=version pairs. With +# none given the stub fails, which is how the unreachable-repository path is # exercised. selftest_published() { local root="$1" shift + local staging="$root/stub/db" + local entry name version if [[ $# -gt 0 ]]; then - selftest_db "$root/stub/omarchy.db.tar.zst" "$@" + rm -rf "$staging" + mkdir -p "$staging" + for entry in "$@"; do + name="${entry%=*}" + version="${entry#*=}" + mkdir -p "$staging/$name-$version" + printf '%%FILENAME%%\n%s-%s-x86_64.pkg.tar.zst\n\n%%NAME%%\n%s\n\n%%BASE%%\n%s\n\n%%VERSION%%\n%s\n' \ + "$name" "$version" "$name" "$name" "$version" > "$staging/$name-$version/desc" + done + tar --zstd -cf "$root/stub/omarchy.db.tar.zst" -C "$staging" . fi cat > "$root/stub/curl" <<'STUB' @@ -678,33 +616,19 @@ while [[ $# -gt 0 ]]; do *) url="$1"; shift ;; esac done -case "$url" in - */omarchy.db.tar.zst) - channel="${url%/omarchy.db.tar.zst}" - arch="${channel##*/}" - channel="${channel%/*}" - db="$(dirname "$0")/omarchy-${channel##*/}-$arch.db.tar.zst" - [[ -f "$db" ]] || db="$(dirname "$0")/omarchy.db.tar.zst" - ;; - */aarch64/*) - repo="${url%/*}" - db="$(dirname "$0")/alarm-${repo##*/}.db" - ;; - *) db="" ;; -esac +if [[ "$url" == */aarch64/* ]]; then + repo="${url%/*}" + repo="${repo##*/}" + db="$(dirname "$0")/alarm-$repo.db" +else + db="$(dirname "$0")/omarchy.db.tar.zst" +fi [[ -f "$db" && -n "$out" ]] || exit 22 cp "$db" "$out" STUB chmod +x "$root/stub/curl" } -# Serves one channel and architecture its own published database. -selftest_channel() { # selftest_channel [name=version...] - local root="$1" channel="$2" arch="$3" - shift 3 - selftest_db "$root/stub/omarchy-$channel-$arch.db.tar.zst" "$@" -} - selftest_alarm() { local root="$1" shift @@ -744,15 +668,12 @@ cmd_self_test() { fi } - # SELFTEST_ARCHES stands in for CI_ARCHES; "default" leaves it unset, as the - # scheduled workflow does. run_case() { local root="$1" shift - local status=0 arches=(CI_ARCHES="${SELFTEST_ARCHES:-x86_64}") - [[ "${SELFTEST_ARCHES:-}" != default ]] || arches=(-u CI_ARCHES) - env "${arches[@]}" PATH="$root/stub:$PATH" \ - "$root/bin/sync-rebuilds" "$@" > "$root/output" 2>&1 || status=$? + local status=0 + OMARCHY_ARCHES="${SELFTEST_ARCHES:-x86_64}" \ + PATH="$root/stub:$PATH" "$root/bin/sync-rebuilds" "$@" > "$root/output" 2>&1 || status=$? echo "$status" } @@ -860,68 +781,6 @@ cmd_self_test() { unset SELFTEST_ARCHES check "pkgrel untouched" 1 "$(pkgrel_of "$root/pkgbuilds/t-x86")" - echo "An ARM-only package is checked when no architecture list is given:" - root=$(selftest_root arm-default) - selftest_package "$root" t-arm-default 1 '{"source":"local","rebuild_on":["dep-a"],"rebuilt_against":{"aarch64":{"dep-a":"1-1"}}}' 1.0 aarch64 - selftest_pacman "$root" - selftest_published "$root" - selftest_alarm "$root" dep-a=2-1 - SELFTEST_ARCHES=default - check "run succeeds" 0 "$(run_case "$root")" - unset SELFTEST_ARCHES - check "pkgrel bumped" 2 "$(pkgrel_of "$root/pkgbuilds/t-arm-default")" - check "ARM trigger recorded" "2-1" \ - "$(jq -r '.rebuilt_against.aarch64["dep-a"]' "$root/pkgbuilds/t-arm-default/.omarchy/package.json")" - - echo "A dependency carried here for ARM is read from its recipe once edge publishes it:" - root=$(selftest_root carried) - selftest_package "$root" t-carried 1.1 '{"source":"local","channels":["edge"]}' 0.15.1 aarch64 - selftest_package "$root" t-linked 3 '{"source":"local","rebuild_on":["t-carried"],"rebuilt_against":{"x86_64":{"t-carried":"0.15.1-1"},"aarch64":{"t-carried":"0.15.0-2"}}}' 1.0 'x86_64 aarch64' - selftest_pacman "$root" t-carried=0.15.1-1 - selftest_published "$root" - selftest_alarm "$root" t-carried=0.15.1-1 - selftest_channel "$root" edge aarch64 t-carried=0.15.1-1.1 - SELFTEST_ARCHES=default - check "run succeeds" 0 "$(run_case "$root")" - check "pkgrel bumped" 4 "$(pkgrel_of "$root/pkgbuilds/t-linked")" - check "the carried version is recorded, not Arch Linux ARM's" "0.15.1-1.1" \ - "$(jq -r '.rebuilt_against.aarch64["t-carried"]' "$root/pkgbuilds/t-linked/.omarchy/package.json")" - check "x86_64, where nothing is carried, still reads the distribution" "0.15.1-1" \ - "$(jq -r '.rebuilt_against.x86_64["t-carried"]' "$root/pkgbuilds/t-linked/.omarchy/package.json")" - check "a second run succeeds" 0 "$(run_case "$root")" - unset SELFTEST_ARCHES - check "a second run leaves it alone" 4 "$(pkgrel_of "$root/pkgbuilds/t-linked")" - - echo "A carried dependency that edge does not publish yet leaves its dependents alone:" - root=$(selftest_root carried-in-flight) - selftest_package "$root" t-carried 1.2 '{"source":"local","channels":["edge"]}' 0.15.1 aarch64 - selftest_package "$root" t-linked 4 '{"source":"local","rebuild_on":["t-carried"],"rebuilt_against":{"aarch64":{"t-carried":"0.15.1-1.1"}}}' 1.0 aarch64 - selftest_pacman "$root" - selftest_published "$root" - selftest_alarm "$root" t-carried=0.15.1-1 - selftest_channel "$root" edge aarch64 t-carried=0.15.1-1.1 - SELFTEST_ARCHES=aarch64 - check "run succeeds" 0 "$(run_case "$root")" - unset SELFTEST_ARCHES - check "pkgrel untouched" 4 "$(pkgrel_of "$root/pkgbuilds/t-linked")" - check "record untouched" "0.15.1-1.1" \ - "$(jq -r '.rebuilt_against.aarch64["t-carried"]' "$root/pkgbuilds/t-linked/.omarchy/package.json")" - - echo "A carried dependency whose edge database cannot be read fails the run:" - root=$(selftest_root carried-unreadable) - selftest_package "$root" t-carried 1.1 '{"source":"local","channels":["edge"]}' 0.15.1 aarch64 - selftest_package "$root" t-linked 3 '{"source":"local","rebuild_on":["t-carried"],"rebuilt_against":{"aarch64":{"t-carried":"0.15.0-2"}}}' 1.0 aarch64 - selftest_pacman "$root" - selftest_published "$root" - selftest_alarm "$root" t-carried=0.15.1-1 - SELFTEST_ARCHES=aarch64 - check "run fails" 1 "$(run_case "$root")" - check "pkgrel untouched" 3 "$(pkgrel_of "$root/pkgbuilds/t-linked")" - printf 'not a database\n' > "$root/stub/omarchy-edge-aarch64.db.tar.zst" - check "a corrupt download fails the run too" 1 "$(run_case "$root")" - unset SELFTEST_ARCHES - check "pkgrel still untouched" 3 "$(pkgrel_of "$root/pkgbuilds/t-linked")" - echo "A PKGBUILD that branches on CARCH at file scope still reads its version:" root=$(selftest_root carch-branch) mkdir -p "$root/pkgbuilds/t-carch/.omarchy" diff --git a/helpers/paths.sh b/helpers/paths.sh index 1d734a9..5d6191c 100644 --- a/helpers/paths.sh +++ b/helpers/paths.sh @@ -43,20 +43,6 @@ reference_arch() { published_arches | head -1 } -# Architectures a merge to master builds and publishes: bin/build-matrix plans -# a PR build for each one a package supports, and publish.yml ships them. This -# is independent of PUBLISHED_ARCHES, so anything deciding what a merge has to -# rebuild (bin/sync-rebuilds) follows this list. CI_ARCHES overrides it. -CI_ARCHES="${CI_ARCHES:-x86_64 aarch64}" - -ci_arches() { - local arch - for arch in $CI_ARCHES; do - require_valid_arch "$arch" - echo "$arch" - done -} - # Scheduled-pipeline state, one file per channel and architecture, so one # architecture's queue or backoff never gates another's. STATE_DIR="${OMARCHY_STATE_DIR:-/root/.state}" diff --git a/pkgbuilds/hyprland/.omarchy/package.json b/pkgbuilds/hyprland/.omarchy/package.json index 0642ff7..9dd9745 100644 --- a/pkgbuilds/hyprland/.omarchy/package.json +++ b/pkgbuilds/hyprland/.omarchy/package.json @@ -15,7 +15,7 @@ ], "rebuilt_against": { "aarch64": { - "aquamarine": "0.15.1-1" + "aquamarine": "0.15.0-2" } } } diff --git a/pkgbuilds/hyprland/PKGBUILD b/pkgbuilds/hyprland/PKGBUILD index 4a5f41c..cbb70ed 100644 --- a/pkgbuilds/hyprland/PKGBUILD +++ b/pkgbuilds/hyprland/PKGBUILD @@ -5,7 +5,7 @@ pkgname=(hyprland hyprpm) pkgver=0.56.2 -pkgrel=4 +pkgrel=3 pkgdesc='a highly customizable dynamic tiling Wayland compositor' arch=(aarch64) url="https://github.com/hyprwm/${pkgname^}" From b27a8c609edfd5d79e07a6086ad4d7536a4fc88b Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 17:46:20 +1000 Subject: [PATCH 31/55] Drop the aquamarine comment that depends on rebuild detection --- pkgbuilds/aquamarine/PKGBUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/pkgbuilds/aquamarine/PKGBUILD b/pkgbuilds/aquamarine/PKGBUILD index 2941ebd..a9ed9e0 100644 --- a/pkgbuilds/aquamarine/PKGBUILD +++ b/pkgbuilds/aquamarine/PKGBUILD @@ -5,7 +5,6 @@ # re-read a connector's possible CRTCs when rescanning, so a Type-C port the # DCP fabric reroutes to another display pipeline gets a CRTC without # restarting the compositor. Drop the carry once hyprwm releases the fix. -# Hyprland is rebuilt whenever this package changes (its rebuild_on). pkgname=aquamarine pkgver=0.15.1 From baf6df3e8048037331ee41b6f1931a5dcc1f678c Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 18:20:07 +1000 Subject: [PATCH 32/55] limine-mkinitcpio-hook 1.39.0-2: Apple Silicon activation gate on aarch64 On aarch64 the Limine hooks and the mkinitcpio wrapper run through limine-apple-gate. Only an Apple Silicon Mac (device tree "apple,") behaves differently: Limine's kernel and removal hooks wait until Omarchy activates Limine (/var/lib/omarchy/limine.enabled and /etc/default/limine), mkinitcpio's own kernel hook keeps /boot current before and after activation, Limine's EFI deploy hook is left to omarchy-mac-boot, and the wrapper is plain mkinitcpio. Skipped hooks drain the socket pacman streams targets over. x86_64 packages exactly what 1.39.0-1 did; generic aarch64 and Snapdragon keep upstream behaviour. --- .github/workflows/test.yml | 1 + pkgbuilds/limine-mkinitcpio-hook/PKGBUILD | 64 ++- .../limine-mkinitcpio-hook/limine-apple-gate | 69 +++ .../mkinitcpio-install.hook | 38 ++ tests/limine-mkinitcpio-hook.sh | 532 ++++++++++++++++++ 5 files changed, 701 insertions(+), 3 deletions(-) create mode 100644 pkgbuilds/limine-mkinitcpio-hook/limine-apple-gate create mode 100644 pkgbuilds/limine-mkinitcpio-hook/mkinitcpio-install.hook create mode 100755 tests/limine-mkinitcpio-hook.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 29d18b0..302e693 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -58,6 +58,7 @@ jobs: ./tests/published-build-plan.sh ./tests/controller.sh ./tests/artifact-helpers.sh + ./tests/limine-mkinitcpio-hook.sh pacman -S --noconfirm --quiet rclone >/dev/null ./tests/publish-artifact.sh ' diff --git a/pkgbuilds/limine-mkinitcpio-hook/PKGBUILD b/pkgbuilds/limine-mkinitcpio-hook/PKGBUILD index 76e4d9a..caa9255 100644 --- a/pkgbuilds/limine-mkinitcpio-hook/PKGBUILD +++ b/pkgbuilds/limine-mkinitcpio-hook/PKGBUILD @@ -3,14 +3,16 @@ _pkgname="limine-entry-tool" pkgname="limine-mkinitcpio-hook" _gradle_version=9.7.1 pkgver=1.39.0 -pkgrel=1 +pkgrel=2 pkgdesc="Install kernels for the Limine bootloader." arch=('x86_64' 'aarch64') url="https://gitlab.com/Zesko/limine-entry-tool" source=("${_pkgname}::git+${url}.git#tag=${pkgver}") source_x86_64=("https://github.com/graalvm/graalvm-ce-builds/releases/download/graal-25.2.4/graalvm-community-jdk-25i2-25.0.4_linux-x64_bin.tar.gz") source_aarch64=("https://github.com/graalvm/graalvm-ce-builds/releases/download/graal-25.2.4/graalvm-community-jdk-25i2-25.0.4_linux-aarch64_bin.tar.gz" - "https://services.gradle.org/distributions/gradle-${_gradle_version}-bin.zip") + "https://services.gradle.org/distributions/gradle-${_gradle_version}-bin.zip" + "limine-apple-gate" + "mkinitcpio-install.hook") license=("GPL3") provides=('limine-entry-tool') options=(!debug !strip) @@ -34,7 +36,9 @@ conflicts=('limine-entry-tool') sha256sums=('6c4affb6fb6367a1222f7d0c54957a3142781d7894bbf61b1a274bd153e5d869') sha256sums_x86_64=('3f4a89de8eaa96f2ed677f09957c7e872cd8467aad3537f8b5394c1b8c4b942e') sha256sums_aarch64=('22286f7ecd21b9aedb3226b9bf797469e1bd3eefc491e12ef3dd49b452d230b7' - 'acd53f1edaf02f1a8ff99879f8a34b302661a057d9b063ae9e35b552f804d20a') + 'acd53f1edaf02f1a8ff99879f8a34b302661a057d9b063ae9e35b552f804d20a' + '199fa2122e4a20ed80e6cf5df235b4e50739593803522bfa65700b1ef242b9ce' + '9fc607e81d2f09aa0dfd313805277af92977535bd222f1e86caf5fbb28138cb4') prepare() { [[ -d "${_graalvm_version}" ]] && rm -rf "${_graalvm_version}" @@ -77,4 +81,58 @@ package() { # limine hook symlinks ln -sf /usr/bin/limine-reset-enroll "$pkgdir/etc/boot/hooks/pre.d/10-limine-reset-enroll" ln -sf /usr/bin/limine-enroll-config "$pkgdir/etc/boot/hooks/post.d/90-limine-enroll-config" + + if [[ $CARCH == aarch64 ]]; then + _apple_silicon_hooks + fi +} + +# An Apple Silicon Mac boots GRUB until Omarchy activates Limine, and keeps +# the kernel and initramfs that mkinitcpio's presets install under /boot +# after that too (GRUB, the boot check and the snapshot tools read them). +# The aarch64 hooks and mkinitcpio wrapper run through limine-apple-gate, +# which leaves every other machine as upstream ships it. On a Mac: +# - Limine's kernel and removal hooks wait until Limine is active; +# - mkinitcpio's own kernel hook, which Limine's takes over by name, runs from +# a copy of mkinitcpio 42's (mkinitcpio-install.hook: keep its triggers in +# step with mkinitcpio's), just before Limine's; +# - Limine's EFI deploy hook stays out: omarchy-mac-boot puts Limine in +# U-Boot's EFI/BOOT/BOOTAA64.EFI slot; +# - the wrapper is plain mkinitcpio: it would run limine-mkinitcpio after +# every preset build, mkinitcpio's kernel hook included. +_apple_silicon_hooks() { + local scripts=/usr/share/libalpm/scripts + local gate=$scripts/limine-apple-gate + local hooks="$pkgdir/usr/share/libalpm/hooks" + local kernel_hook="$pkgdir/etc/pacman.d/hooks/90-mkinitcpio-install.hook" + local mac_hook="$hooks/90-mkinitcpio-apple-install.hook" + local wrapper="$pkgdir/usr/local/bin/mkinitcpio" + + install -Dm755 "$srcdir/limine-apple-gate" "$pkgdir$gate" + install -Dm644 "$srcdir/mkinitcpio-install.hook" "$mac_hook" + sed -i -e 's|^Description = .*|Description = Updating linux initcpios under /boot (Apple Silicon)...|' \ + -e "s|^Exec = $scripts/mkinitcpio install\$|Exec = $gate --mac $scripts/mkinitcpio install|" "$mac_hook" + sed -i "s|^Exec = $scripts/limine-mkinitcpio-|Exec = $gate $scripts/limine-mkinitcpio-|" \ + "$kernel_hook" "$hooks/60-limine-mkinitcpio-remove-pre.hook" "$hooks/90-limine-mkinitcpio-remove-post.hook" + sed -i "s|^Exec = /usr/bin/limine-install\$|Exec = $gate --not-mac /usr/bin/limine-install|" "$hooks/80-limine-efi-deploy.hook" + sed -i "1a $gate --mac \\&\\& exec /usr/bin/mkinitcpio \"\$@\"" "$wrapper" + + local expected=( + "$mac_hook|Exec = $gate --mac $scripts/mkinitcpio install" + "$kernel_hook|Exec = $gate $scripts/limine-mkinitcpio-install" + "$hooks/60-limine-mkinitcpio-remove-pre.hook|Exec = $gate $scripts/limine-mkinitcpio-remove pre" + "$hooks/90-limine-mkinitcpio-remove-post.hook|Exec = $gate $scripts/limine-mkinitcpio-remove post" + "$hooks/80-limine-efi-deploy.hook|Exec = $gate --not-mac /usr/bin/limine-install" + ) + local entry + for entry in "${expected[@]}"; do + [[ $(grep '^Exec = ' "${entry%%|*}") == "${entry#*|}" ]] || { + echo "${entry%%|*}: expected '${entry#*|}'" >&2 + return 1 + } + done + [[ $(sed -n 1,2p "$wrapper") == $'#!/usr/bin/env bash\n'"$gate --mac && exec /usr/bin/mkinitcpio \"\$@\"" ]] || { + echo "the mkinitcpio wrapper does not start with the Apple Silicon gate" >&2 + return 1 + } } diff --git a/pkgbuilds/limine-mkinitcpio-hook/limine-apple-gate b/pkgbuilds/limine-mkinitcpio-hook/limine-apple-gate new file mode 100644 index 0000000..380e45e --- /dev/null +++ b/pkgbuilds/limine-mkinitcpio-hook/limine-apple-gate @@ -0,0 +1,69 @@ +#!/bin/bash +# The aarch64 package runs its pacman hooks and its mkinitcpio wrapper through +# this, so that only an Apple Silicon Mac behaves differently from upstream: +# +# limine-apple-gate COMMAND... COMMAND, except on a Mac that has not activated Limine +# limine-apple-gate --mac COMMAND... COMMAND on a Mac only +# limine-apple-gate --not-mac COMMAND... COMMAND everywhere but a Mac +# limine-apple-gate --mac succeeds on a Mac only +# +# A Mac boots GRUB until Omarchy activates Limine: the gate +# /var/lib/omarchy/limine.enabled and the /etc/default/limine the activation +# writes, the same test as omarchy-mac-limine-active. A command that does not +# run reads the targets pacman streams to it and succeeds quietly. + +gate=/var/lib/omarchy/limine.enabled +limine_default=/etc/default/limine +compatible=(/proc/device-tree/compatible /sys/firmware/devicetree/base/compatible) + +# Fixtures fake the machine for an unprivileged caller only; as root, which +# pacman hooks always are, the live system decides. +if ((EUID != 0)); then + gate=${OMARCHY_LIMINE_GATE:-$gate} + limine_default=${OMARCHY_LIMINE_DEFAULT:-$limine_default} + if [[ -n ${OMARCHY_PROC_ROOT:-}${OMARCHY_SYS_ROOT:-} ]]; then + compatible=() + [[ -z ${OMARCHY_PROC_ROOT:-} ]] || compatible+=("$OMARCHY_PROC_ROOT/device-tree/compatible") + [[ -z ${OMARCHY_SYS_ROOT:-} ]] || compatible+=("$OMARCHY_SYS_ROOT/firmware/devicetree/base/compatible") + fi +fi + +# m1n1 names every Apple Silicon Mac "apple," in the root node's +# NUL-separated compatible list, as omarchy-hw-platform reads it. +is_mac() { + local source + for source in "${compatible[@]}"; do + [[ -r $source ]] && tr '\0' '\n' <"$source" | grep -q '^apple,' && return 0 + done + return 1 +} + +# pacman writes NeedsTargets to a socket and fails the write if the hook has +# gone; hooks without NeedsTargets get no stdin at all. +pass() { + if [[ -S /dev/stdin || -p /dev/stdin ]]; then + cat >/dev/null + fi + exit 0 +} + +mode=limine +case ${1:-} in +--mac | --not-mac) + mode=${1#--} + shift + ;; +esac + +if (($# == 0)); then + [[ $mode == mac ]] && { is_mac; exit; } + echo "usage: limine-apple-gate [--mac|--not-mac] COMMAND [ARG]..." >&2 + exit 2 +fi + +case $mode in +mac) is_mac || pass ;; +not-mac) ! is_mac || pass ;; +limine) ! is_mac || [[ -e $gate && -f $limine_default ]] || pass ;; +esac +exec "$@" diff --git a/pkgbuilds/limine-mkinitcpio-hook/mkinitcpio-install.hook b/pkgbuilds/limine-mkinitcpio-hook/mkinitcpio-install.hook new file mode 100644 index 0000000..3607cd5 --- /dev/null +++ b/pkgbuilds/limine-mkinitcpio-hook/mkinitcpio-install.hook @@ -0,0 +1,38 @@ +[Trigger] +Type = Path +Operation = Install +Operation = Upgrade +Operation = Remove +Target = usr/lib/initcpio/* +Target = usr/lib/firmware/* +Target = usr/lib/modules/*/extramodules/ +Target = usr/src/*/dkms.conf +Target = usr/lib/systemd/systemd +Target = usr/lib/systemd/systemd-udevd +Target = usr/bin/cryptsetup +Target = usr/bin/lvm +Target = usr/bin/mdadm +Target = usr/bin/pdata_tools +Target = usr/lib/libcryptsetup.so +Target = usr/lib/libp11-kit.so +Target = usr/lib/libpcsclite.so +Target = usr/lib/modprobe.d/ + +[Trigger] +Type = Path +Operation = Install +Operation = Upgrade +Target = usr/lib/modules/*/vmlinuz + +[Trigger] +Type = Package +Operation = Install +Operation = Upgrade +Target = mkinitcpio +Target = mkinitcpio-git + +[Action] +Description = Updating linux initcpios... +When = PostTransaction +Exec = /usr/share/libalpm/scripts/mkinitcpio install +NeedsTargets diff --git a/tests/limine-mkinitcpio-hook.sh b/tests/limine-mkinitcpio-hook.sh new file mode 100755 index 0000000..f91866b --- /dev/null +++ b/tests/limine-mkinitcpio-hook.sh @@ -0,0 +1,532 @@ +#!/bin/bash +# limine-mkinitcpio-hook: the x86_64 package is upstream's as before. On +# aarch64, limine-apple-gate leaves every machine but an Apple Silicon Mac as +# the x86_64 package behaves; a Mac keeps /boot current through mkinitcpio's +# own kernel hook, and Limine waits until Omarchy activates it. +# +# The package() of the PKGBUILD runs over an upstream-shaped source tree +# (LIMINE_ENTRY_TOOL_SRC may name a real limine-entry-tool checkout instead), +# and pacman transactions replay through the packaged hooks on fixture machines. +set -euo pipefail + +REPO_ROOT=$(realpath "${BASH_SOURCE[0]%/*}/..") +RECIPE=$REPO_ROOT/pkgbuilds/limine-mkinitcpio-hook +GATE=$RECIPE/limine-apple-gate +TEST_ROOT=$(mktemp -d) +trap 'rm -rf "$TEST_ROOT"' EXIT + +fail() { + echo "not ok - $1" >&2 + [[ $# -lt 2 ]] || printf '%s\n' "$2" >&2 + exit 1 +} +pass() { + echo "ok - $1" +} + +# pacman hands NeedsTargets to a hook over a socket, and a hook that stops +# reading early fails the write ("unable to write to pipe"). +SOCKET_FEED=' +import socket, subprocess, sys +parent, child = socket.socketpair() +hook = subprocess.Popen(sys.argv[1:], stdin=child) +child.close() +try: + parent.sendall(sys.stdin.buffer.read()) + parent.shutdown(socket.SHUT_WR) +except OSError as error: + print("unable to write to pipe (%s)" % error.strerror, file=sys.stderr) + hook.wait() + sys.exit(141) +sys.exit(hook.wait()) +' +socket_feed() { python3 -c "$SOCKET_FEED" "$@"; } + +apple_tree() { printf 'apple,j316s\0apple,t6000\0apple,arm-platform\0'; } +live_is_mac() { + local source + for source in /proc/device-tree/compatible /sys/firmware/devicetree/base/compatible; do + [[ -r $source ]] && tr '\0' '\n' <"$source" | grep -q '^apple,' && return 0 + done + return 1 +} + +# The gate trusts fixtures only from an unprivileged caller: as root it reads +# the live machine. Check that, then carry on as nobody. +if ((EUID == 0)); then + if ! live_is_mac; then + mkdir -p "$TEST_ROOT/root-proc/device-tree" + apple_tree >"$TEST_ROOT/root-proc/device-tree/compatible" + out=$(OMARCHY_PROC_ROOT=$TEST_ROOT/root-proc bash "$GATE" echo ran "$upstream/README.md" + echo '# CHANGELOG' >"$upstream/CHANGELOG.md" + echo 'ESP_PATH=""' >"$tool/etc/limine-entry-tool.conf" + echo 'ESP_PATH=""' >"$hook/etc/limine-entry-tool.conf" + for name in limine-install limine-entry-tool limine-reset-enroll limine-enroll-config; do + printf '#!/usr/bin/env bash\n' >"$tool/usr/bin/$name" + done + printf '#!/usr/bin/env bash\n' >"$tool/usr/lib/limine/limine-common-functions" + for name in limine-mkinitcpio limine-update; do + printf '#!/usr/bin/env bash\n' >"$hook/usr/bin/$name" + done + for name in limine-mkinitcpio-install limine-mkinitcpio-remove; do + printf '#!/usr/bin/env bash\n' >"$hook/usr/share/libalpm/scripts/$name" + done + cat >"$tool/usr/share/libalpm/hooks/80-limine-efi-deploy.hook" <<'HOOK' +[Trigger] +Operation = Install +Operation = Upgrade +Type = Package +Target = limine +Target = limine-git +Target = limine-dev + +[Action] +Description = Deploying Limine after upgrade... +When = PostTransaction +Exec = /usr/bin/limine-install --no-efi-register +HOOK + cat >"$hook/usr/share/libalpm/hooks/80-limine-efi-deploy.hook" <<'HOOK' +[Trigger] +Operation = Install +Operation = Upgrade +Type = Package +Target = limine +Target = limine-git +Target = limine-dev +Target = limine-mkinitcpio-hook +Target = limine-mkinitcpio-hook-git + +[Action] +Description = Deploying Limine after upgrade... +When = PostTransaction +Exec = /usr/bin/limine-install +HOOK + cat >"$hook/usr/share/libalpm/hooks/60-limine-mkinitcpio-remove-pre.hook" <<'HOOK' +[Trigger] +Type = Path +Operation = Remove +Target = usr/lib/modules/*/modules.builtin + +[Action] +Description = Record kernels marked for removal in Limine +When = PreTransaction +Exec = /usr/share/libalpm/scripts/limine-mkinitcpio-remove pre +NeedsTargets +HOOK + cat >"$hook/usr/share/libalpm/hooks/90-limine-mkinitcpio-remove-post.hook" <<'HOOK' +[Trigger] +Type = Path +Operation = Remove +Target = usr/lib/modules/*/modules.builtin + +[Action] +Description = Clean Limine boot entries of removed kernels +When = PostTransaction +Exec = /usr/share/libalpm/scripts/limine-mkinitcpio-remove post +HOOK + cat >"$hook/etc/pacman.d/hooks/90-mkinitcpio-install.hook" <<'HOOK' +[Trigger] +Type = Path +Operation = Install +Operation = Upgrade +Operation = Remove +Target = usr/lib/initcpio/* +Target = usr/lib/firmware/* +Target = usr/lib/modules/*/extramodules/ +Target = usr/src/*/dkms.conf +Target = usr/lib/systemd/systemd +Target = usr/bin/cryptsetup +Target = usr/bin/lvm + +[Trigger] +Type = Path +Operation = Install +Operation = Upgrade +Target = usr/lib/modules/*/modules.builtin + +[Trigger] +Type = Package +Operation = Install +Operation = Upgrade +Target = mkinitcpio +Target = mkinitcpio-git + +[Action] +Description = Updating linux initcpios... +When = PostTransaction +Exec = /usr/share/libalpm/scripts/limine-mkinitcpio-install +NeedsTargets +HOOK + cat >"$hook/usr/local/bin/mkinitcpio" <<'WRAPPER' +#!/usr/bin/env bash + +/usr/bin/mkinitcpio "$@" + +_color_reset="" +_color_yellow="" +colors="$(tput colors 2>/dev/null || echo 0)" +if ((colors >= 8)); then + _color_reset="\033[0m" + _color_yellow="\033[1;33m" +fi + +if [[ " $* " == *" -P "* || " $* " == *" --allpresets "* || " $* " == *" -p "* || " $* " == *" --preset "* ]]; then + printf '%b==> WARNING: This does not update Limine boot entries.%b\n' "${_color_yellow}" "${_color_reset}" >&2 + printf "%b Use 'limine-mkinitcpio' or 'limine-update' instead.%b\n" "${_color_yellow}" "${_color_reset}" >&2 + + read -rp "==> Would you like to run 'limine-mkinitcpio' now? [Y/n]: " answer + case "${answer,,}" in + "" | "y" | "yes") + /usr/bin/limine-mkinitcpio + ;; + *) + # nothing + ;; + esac +fi +WRAPPER +fi +printf 'native image\n' >"$upstream/build/native/nativeCompile/limine-entry-tool" +chmod -R u+w,go+rX "$upstream" +find "$upstream/install" -path '*/bin/*' -type f -exec chmod 755 {} + -o -path '*/scripts/*' -type f -exec chmod 755 {} + +ln -s "$RECIPE/limine-apple-gate" "$RECIPE/mkinitcpio-install.hook" "$SRC/" + +# makepkg runs package() with errexit. +build_package() { + local arch=$1 out=$2 + mkdir -p "$out" + CARCH=$arch srcdir=$SRC pkgdir=$out bash -euo pipefail -c 'source "$1"; package' _ "$RECIPE/PKGBUILD" || + fail "package() succeeds for $arch" +} +PKG_X86=$TEST_ROOT/pkg-x86_64 +PKG_ARM=$TEST_ROOT/pkg-aarch64 +build_package x86_64 "$PKG_X86" +build_package aarch64 "$PKG_ARM" + +manifest() { + (cd "$1" && find . \( -type f -o -type l \) -printf '%p %m %l\n' | LC_ALL=C sort) | + while read -r path mode target; do + if [[ -n $target ]]; then + echo "$path $mode -> $target" + else + echo "$path $mode $(sha256sum "$1/$path" | cut -d' ' -f1)" + fi + done +} + +scripts=/usr/share/libalpm/scripts +gate=$scripts/limine-apple-gate +upstream_hook=$upstream/install/arch-linux/limine-mkinitcpio-hook +for file in etc/pacman.d/hooks/90-mkinitcpio-install.hook usr/local/bin/mkinitcpio \ + usr/share/libalpm/hooks/{60-limine-mkinitcpio-remove-pre,80-limine-efi-deploy,90-limine-mkinitcpio-remove-post}.hook; do + cmp -s "$upstream_hook/$file" "$PKG_X86/$file" || fail "x86_64 ships upstream's $file unchanged" +done +[[ ! -e $PKG_X86$gate && ! -e $PKG_X86/usr/share/libalpm/hooks/90-mkinitcpio-apple-install.hook ]] || + fail "x86_64 ships no Apple Silicon file" +pass "x86_64 packages upstream's hooks and wrapper unchanged" + +differences=$(diff <(manifest "$PKG_X86") <(manifest "$PKG_ARM") || true) +changed=$(sed -n 's/^> \(\S*\) .*/\1/p' <<<"$differences") +expected=$(printf '%s\n' ./etc/pacman.d/hooks/90-mkinitcpio-install.hook \ + ./usr/local/bin/mkinitcpio \ + ./usr/share/libalpm/hooks/60-limine-mkinitcpio-remove-pre.hook \ + ./usr/share/libalpm/hooks/80-limine-efi-deploy.hook \ + ./usr/share/libalpm/hooks/90-limine-mkinitcpio-remove-post.hook \ + ./usr/share/libalpm/hooks/90-mkinitcpio-apple-install.hook \ + ./usr/share/libalpm/scripts/limine-apple-gate) +[[ $changed == "$expected" ]] || fail "aarch64 differs from x86_64 only in the gated hooks, the wrapper and the gate" "$changed" +[[ -z $(sed -n 's/^< \(\S*\) .*/\1/p' <<<"$differences" | grep -vxF "$expected") ]] || + fail "aarch64 keeps every x86_64 file" +[[ $(stat -c %a "$PKG_ARM$gate") == 755 ]] || fail "the gate is executable" +diff <(grep -v '^Exec = \|^Description = ' "$RECIPE/mkinitcpio-install.hook") \ + <(grep -v '^Exec = \|^Description = ' "$PKG_ARM/usr/share/libalpm/hooks/90-mkinitcpio-apple-install.hook") >/dev/null || + fail "the Mac's kernel hook keeps mkinitcpio's triggers" +[[ $(sed -n 2p "$PKG_ARM/usr/local/bin/mkinitcpio") == "$gate --mac && exec /usr/bin/mkinitcpio \"\$@\"" ]] || + fail "the aarch64 wrapper is plain mkinitcpio on a Mac" +pass "aarch64 routes Limine's hooks and the wrapper through the gate and adds the Mac's kernel hook" + +# --------------------------------------------------------------------------- +# Fixture machines, read through OMARCHY_PROC_ROOT, OMARCHY_LIMINE_GATE and +# OMARCHY_LIMINE_DEFAULT. +machine() { + local name=$1 compatible=$2 dir=$TEST_ROOT/machines/$1 + mkdir -p "$dir/proc" "$dir/state" + if [[ -n $compatible ]]; then + mkdir -p "$dir/proc/device-tree" + printf "$compatible" >"$dir/proc/device-tree/compatible" + fi +} +machine x86 '' +machine generic-aarch64 'linux,dummy-virt\0' +machine qualcomm 'lenovo,thinkpad-t14s\0qcom,x1e78100\0qcom,x1e80100\0' +machine mac-dormant 'apple,j316s\0apple,t6000\0apple,arm-platform\0' +machine mac-marker-only 'apple,j316s\0apple,t6000\0apple,arm-platform\0' +machine mac-active 'apple,j316s\0apple,t6000\0apple,arm-platform\0' +: >"$TEST_ROOT/machines/mac-marker-only/state/limine.enabled" +: >"$TEST_ROOT/machines/mac-active/state/limine.enabled" +echo 'ESP_PATH="/boot/efi"' >"$TEST_ROOT/machines/mac-active/state/limine" + +on() { + local dir=$TEST_ROOT/machines/$1 + shift + ( + export OMARCHY_PROC_ROOT=$dir/proc OMARCHY_LIMINE_GATE=$dir/state/limine.enabled OMARCHY_LIMINE_DEFAULT=$dir/state/limine + "$@" + ) +} +status() { + local rc=0 + "$@" || rc=$? + echo "$rc" +} + +for m in x86 generic-aarch64 qualcomm; do + [[ $(on "$m" status bash "$GATE" --mac) == 1 ]] || fail "$m is not a Mac" + [[ $(printf 'a\nb\n' | on "$m" bash "$GATE" cat) == $'a\nb' ]] || fail "$m runs Limine's hooks with their targets" + [[ $(on "$m" status bash "$GATE" bash -c 'exit 7' &1) ]] || fail "$m skips the Mac's hooks quietly" + [[ $(on "$m" bash "$GATE" --not-mac echo ran &1) ]] || fail "$m leaves Limine's EFI binary to omarchy-mac-boot" +done +for m in mac-dormant mac-marker-only; do + out=$(printf 'usr/lib/modules/7.1.0/modules.builtin\n' | on "$m" bash "$GATE" bash -c 'echo ran; exit 100' 2>&1) || + fail "$m passes over Limine's hooks successfully" + [[ -z $out ]] || fail "$m passes over Limine's hooks quietly" "$out" + [[ -z $(on "$m" bash "$GATE" echo ran <&- 2>&1) ]] || fail "$m passes over a hook without targets" +done +# A linux-firmware upgrade streams thousands of targets, more than a socket holds. +many_targets() { printf 'usr/lib/firmware/fixture/%s.bin\n' $(seq 60000); } +many_targets | on mac-dormant socket_feed bash "$GATE" true || fail "a dormant Mac reads every target of a hook it passes over" +many_targets | on x86 socket_feed bash "$GATE" --mac true || fail "other machines read every target of the Mac's hooks" +many_targets | on mac-active socket_feed bash "$GATE" --not-mac true || fail "a Mac reads every target of the deploy hook" +many_targets | on mac-dormant bash "$GATE" true || fail "a dormant Mac reads every target piped to a hook it passes over" +[[ $(printf 'a\n' | on mac-active bash "$GATE" bash -c 'echo "ran $1"; cat' _ post) == $'ran post\na' ]] || + fail "an active Mac runs Limine's hooks with their arguments and targets" +[[ $(on mac-active status bash "$GATE" bash -c 'exit 7' /dev/null) == 2 ]] || fail "the gate needs a command" +pass "the gate runs Limine's hooks everywhere but a Mac that has not activated Limine" + +# --------------------------------------------------------------------------- +# pacman: hooks from /usr/share/libalpm/hooks, overridden by name from +# /etc/pacman.d/hooks, run in name order, each with the targets of the +# transaction its triggers match (sorted, over a socket for NeedsTargets, +# else no stdin). +# Transactions are lines of " ". +fake_root() { + local pkg=$1 root=$2 name + cp -a "$pkg" "$root" + cp "$RECIPE/mkinitcpio-install.hook" "$root/usr/share/libalpm/hooks/90-mkinitcpio-install.hook" + for name in usr/share/libalpm/scripts/limine-mkinitcpio-install usr/share/libalpm/scripts/limine-mkinitcpio-remove \ + usr/bin/limine-install usr/share/libalpm/scripts/mkinitcpio usr/bin/mkinitcpio usr/bin/limine-mkinitcpio; do + rm -f "$root/$name" + printf '#!/bin/bash\n{ printf %%s %q; if (($#)); then printf " %%s" "$@"; fi; echo; if [[ -S /dev/stdin || -p /dev/stdin ]]; then sed "s/^/ /"; fi; } >>"$SIM_LOG"\n' \ + "${name##*/}" >"$root/$name" + chmod 755 "$root/$name" + done +} + +run_hook() { + local root=$1 hook=$2 when=$3 transaction=$4 + local line section='' hook_when='' exec_line='' needs=0 type='' ops='' targets='' + local -a triggers=() + while IFS= read -r line || [[ -n $line ]]; do + case $line in + '[Trigger]' | '[Action]') + [[ $section != Trigger ]] || triggers+=("$type|$ops|$targets") + section=${line//[][]/} type='' ops=' ' targets='' + ;; + NeedsTargets) needs=1 ;; + *' = '*) + case $section/${line%% = *} in + Trigger/Type) type=${line#* = } ;; + Trigger/Operation) ops+="${line#* = } " ;; + Trigger/Target) targets+="${line#* = } " ;; + Action/When) hook_when=${line#* = } ;; + Action/Exec) exec_line=${line#* = } ;; + esac + ;; + esac + done <"$hook" + [[ $hook_when == "$when" ]] || return 0 + + local op kind target trigger t_type t_ops t_targets pattern + local -a matched=() patterns=() + while read -r op kind target; do + for trigger in "${triggers[@]}"; do + IFS='|' read -r t_type t_ops t_targets <<<"$trigger" + [[ $t_type == "$kind" && $t_ops == *" $op "* ]] || continue + read -ra patterns <<<"$t_targets" + for pattern in "${patterns[@]}"; do + # shellcheck disable=SC2053 + if [[ $target == $pattern ]]; then + matched+=("$target") + break 2 + fi + done + done + done <"$transaction" + ((${#matched[@]})) || return 0 + + local word + local -a argv=() command=() + read -ra argv <<<"$exec_line" + for word in "${argv[@]}"; do + if [[ $word == /* && -e $root$word ]]; then command+=("$root$word"); else command+=("$word"); fi + done + if ((needs)); then + printf '%s\n' "${matched[@]}" | LC_ALL=C sort -u | socket_feed "${command[@]}" + else + "${command[@]}" <&- + fi +} + +run_transaction() { + local root=$1 transaction=$2 when name + local -A hooks=() + for name in "$root"/usr/share/libalpm/hooks/*.hook "$root"/etc/pacman.d/hooks/*.hook; do + [[ -e $name ]] && hooks[${name##*/}]=$name + done + for when in PreTransaction PostTransaction; do + while read -r name; do + run_hook "$root" "${hooks[$name.hook]}" "$when" "$transaction" + done < <(printf '%s\n' "${!hooks[@]}" | sed 's/\.hook$//' | LC_ALL=C sort) + done +} + +fake_root "$PKG_X86" "$TEST_ROOT/root-x86_64" +fake_root "$PKG_ARM" "$TEST_ROOT/root-aarch64" + +transaction() { + local name=$1 + shift + printf '%s\n' "$@" >"$TEST_ROOT/tx-$name" +} +transaction kernel \ + 'Install Path usr/lib/modules/7.1.0-asahi/vmlinuz' \ + 'Install Path usr/lib/modules/7.1.0-asahi/modules.builtin' \ + 'Install Path usr/lib/modules/7.1.0-asahi/pkgbase' \ + 'Remove Path usr/lib/modules/7.0.0-asahi/vmlinuz' \ + 'Remove Path usr/lib/modules/7.0.0-asahi/modules.builtin' \ + 'Remove Path usr/lib/modules/7.0.0-asahi/pkgbase' \ + 'Upgrade Package linux-asahi' +transaction firmware 'Upgrade Path usr/lib/firmware/brcm/fixture.bin' 'Upgrade Package linux-firmware' +transaction modprobe 'Upgrade Path usr/lib/modprobe.d/' 'Install Path usr/lib/modprobe.d/omarchy-mac.conf' 'Upgrade Package omarchy-mac' +transaction limine 'Upgrade Path usr/share/limine/BOOTAA64.EFI' 'Upgrade Package limine' + +replay() { + local arch=$1 m=$2 name=$3 + export SIM_LOG=$TEST_ROOT/log + : >"$SIM_LOG" + local out + out=$(on "$m" run_transaction "$TEST_ROOT/root-$arch" "$TEST_ROOT/tx-$name" 2>&1) || fail "$name on $arch/$m replays" + [[ -z $out ]] || fail "$name on $arch/$m prints nothing of the gate's" "$out" + cat "$SIM_LOG" +} + +limine_kernel=$'limine-mkinitcpio-remove pre\n usr/lib/modules/7.0.0-asahi/modules.builtin\nlimine-mkinitcpio-remove post\nlimine-mkinitcpio-install\n usr/lib/modules/7.1.0-asahi/modules.builtin' +stock_kernel=$'mkinitcpio install\n usr/lib/modules/7.1.0-asahi/vmlinuz' +limine_firmware=$'limine-mkinitcpio-install\n usr/lib/firmware/brcm/fixture.bin' +stock_firmware=$'mkinitcpio install\n usr/lib/firmware/brcm/fixture.bin' +stock_modprobe=$'mkinitcpio install\n usr/lib/modprobe.d/' + +declare -A want=( + [kernel/other]=$limine_kernel + [firmware/other]=$limine_firmware + [modprobe/other]='' + [limine/other]='limine-install' + [kernel/mac-dormant]=$stock_kernel + [firmware/mac-dormant]=$stock_firmware + [modprobe/mac-dormant]=$stock_modprobe + [limine/mac-dormant]='' + [kernel/mac-active]=$'limine-mkinitcpio-remove pre\n usr/lib/modules/7.0.0-asahi/modules.builtin\nlimine-mkinitcpio-remove post\n'"$stock_kernel"$'\nlimine-mkinitcpio-install\n usr/lib/modules/7.1.0-asahi/modules.builtin' + [firmware/mac-active]=$stock_firmware$'\n'$limine_firmware + [modprobe/mac-active]=$stock_modprobe + [limine/mac-active]='' +) +want[kernel/mac-marker-only]=${want[kernel/mac-dormant]} + +for name in kernel firmware modprobe limine; do + got=$(replay x86_64 x86 "$name") + [[ $got == "${want[$name/other]}" ]] || fail "x86_64: $name transaction runs upstream's hooks" "$got" + for m in generic-aarch64 qualcomm; do + got=$(replay aarch64 "$m" "$name") + [[ $got == "${want[$name/other]}" ]] || fail "aarch64 $m: $name transaction runs as on x86_64" "$got" + done +done +pass "x86_64, generic aarch64 and Snapdragon transactions run Limine's hooks as upstream ships them" + +for m in mac-dormant mac-marker-only mac-active; do + for name in kernel firmware modprobe limine; do + [[ -v want[$name/$m] ]] || continue + got=$(replay aarch64 "$m" "$name") + [[ $got == "${want[$name/$m]}" ]] || fail "$m: $name transaction" "$got" + done +done +pass "a dormant Mac defers to mkinitcpio's own hook; an active Mac also writes Limine's entries after it" + +# --------------------------------------------------------------------------- +# The wrapper, as sudo mkinitcpio -P and mkinitcpio's hook script call it +# (/usr/local/bin first in PATH, stdin at its end). +wrapper() { + local root=$1 m=$2 + sed "s|/usr/|$root/usr/|g" "$root/usr/local/bin/mkinitcpio" >"$TEST_ROOT/wrapper" + export SIM_LOG=$TEST_ROOT/log + : >"$SIM_LOG" + on "$m" bash "$TEST_ROOT/wrapper" -P /dev/null 2>&1 || true + cat "$SIM_LOG" +} +upstream_wrapper=$'mkinitcpio -P\nlimine-mkinitcpio' +[[ $(wrapper "$TEST_ROOT/root-x86_64" x86) == "$upstream_wrapper" ]] || fail "x86_64 keeps upstream's wrapper" +for m in generic-aarch64 qualcomm; do + [[ $(wrapper "$TEST_ROOT/root-aarch64" "$m") == "$upstream_wrapper" ]] || fail "$m keeps upstream's wrapper" +done +for m in mac-dormant mac-active; do + [[ $(wrapper "$TEST_ROOT/root-aarch64" "$m") == 'mkinitcpio -P' ]] || fail "$m runs plain mkinitcpio" +done +pass "the mkinitcpio wrapper is upstream's everywhere but a Mac, where it is plain mkinitcpio" From 00fac82ad342afa0be2cec83ad08b0d8691b2f0c Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 19:23:36 +1000 Subject: [PATCH 33/55] omarchy-settings: ship the pacman platform guard when the source has it The guard hook and the script it runs install together from omarchy-settings, so they are resident before the runtime and hardware packages. Conditional, so builds from sources without them are unchanged. --- pkgbuilds/omarchy-settings-dev/PKGBUILD | 11 +++++++++++ pkgbuilds/omarchy-settings/PKGBUILD | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/pkgbuilds/omarchy-settings-dev/PKGBUILD b/pkgbuilds/omarchy-settings-dev/PKGBUILD index 4023b89..70fb238 100644 --- a/pkgbuilds/omarchy-settings-dev/PKGBUILD +++ b/pkgbuilds/omarchy-settings-dev/PKGBUILD @@ -364,6 +364,17 @@ EOF install -Dm755 default/systemd/system-sleep/unmount-fuse \ "$pkgdir/usr/lib/systemd/system-sleep/unmount-fuse" + # Pacman platform guard: refuses packages tagged for another hardware + # platform. It ships here, not in omarchy, so it is resident before the + # runtime and any hardware package install; the hook and the script it runs + # travel together. Conditional until the pinned source carries them. + if [[ -f default/libalpm/hooks/00-omarchy-platform-guard.hook ]]; then + install -Dm644 default/libalpm/hooks/00-omarchy-platform-guard.hook \ + "$pkgdir/usr/share/libalpm/hooks/00-omarchy-platform-guard.hook" + install -Dm755 default/libalpm/scripts/omarchy-platform-guard \ + "$pkgdir/usr/share/libalpm/scripts/omarchy-platform-guard" + fi + # Branding assets (logos, icons). install -Dm644 logo.txt "$pkgdir/usr/share/omarchy/logo.txt" install -Dm644 logo.svg "$pkgdir/usr/share/omarchy/logo.svg" diff --git a/pkgbuilds/omarchy-settings/PKGBUILD b/pkgbuilds/omarchy-settings/PKGBUILD index 5eb5ca8..093af88 100644 --- a/pkgbuilds/omarchy-settings/PKGBUILD +++ b/pkgbuilds/omarchy-settings/PKGBUILD @@ -362,6 +362,17 @@ EOF install -Dm755 default/systemd/system-sleep/unmount-fuse \ "$pkgdir/usr/lib/systemd/system-sleep/unmount-fuse" + # Pacman platform guard: refuses packages tagged for another hardware + # platform. It ships here, not in omarchy, so it is resident before the + # runtime and any hardware package install; the hook and the script it runs + # travel together. Conditional until the pinned source carries them. + if [[ -f default/libalpm/hooks/00-omarchy-platform-guard.hook ]]; then + install -Dm644 default/libalpm/hooks/00-omarchy-platform-guard.hook \ + "$pkgdir/usr/share/libalpm/hooks/00-omarchy-platform-guard.hook" + install -Dm755 default/libalpm/scripts/omarchy-platform-guard \ + "$pkgdir/usr/share/libalpm/scripts/omarchy-platform-guard" + fi + # Branding assets (logos, icons). install -Dm644 logo.txt "$pkgdir/usr/share/omarchy/logo.txt" install -Dm644 logo.svg "$pkgdir/usr/share/omarchy/logo.svg" From 0a65168b0992416dd141209849d5a9a25562e1dc Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 19:56:22 +1000 Subject: [PATCH 34/55] Move the platform detector to omarchy-settings with the guard The settings package's platform guard runs omarchy-hw-platform before the omarchy runtime is installed. omarchy leaves the detector out of its bin/ loop and settings ships it, with the /usr/share/omarchy/bin link the Apple predicate and the CLI router use, whenever the source has it. --- pkgbuilds/omarchy-dev/PKGBUILD | 5 +++-- pkgbuilds/omarchy-settings-dev/PKGBUILD | 12 ++++++++++-- pkgbuilds/omarchy-settings/PKGBUILD | 12 ++++++++++-- pkgbuilds/omarchy/PKGBUILD | 5 +++-- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/pkgbuilds/omarchy-dev/PKGBUILD b/pkgbuilds/omarchy-dev/PKGBUILD index 58630ed..ce16459 100644 --- a/pkgbuilds/omarchy-dev/PKGBUILD +++ b/pkgbuilds/omarchy-dev/PKGBUILD @@ -110,14 +110,15 @@ package() { # Runtime binaries — ship everything in bin/ except the debug helpers # that ship from omarchy-settings (needed before omarchy is installed, - # e.g. on the ISO live env). + # e.g. on the ISO live env), and the platform detector, which the settings + # package's pacman platform guard runs before omarchy is installed. install -d "$pkgdir/usr/bin" "$pkgdir/usr/share/omarchy/bin" for bin in bin/*; do [[ -f $bin ]] || continue local base base=$(basename "$bin") case "$base" in - omarchy-debug|omarchy-debug-idle|omarchy-upload-log) + omarchy-debug|omarchy-debug-idle|omarchy-upload-log|omarchy-hw-platform) continue ;; esac diff --git a/pkgbuilds/omarchy-settings-dev/PKGBUILD b/pkgbuilds/omarchy-settings-dev/PKGBUILD index 70fb238..d5bd59f 100644 --- a/pkgbuilds/omarchy-settings-dev/PKGBUILD +++ b/pkgbuilds/omarchy-settings-dev/PKGBUILD @@ -366,8 +366,16 @@ EOF # Pacman platform guard: refuses packages tagged for another hardware # platform. It ships here, not in omarchy, so it is resident before the - # runtime and any hardware package install; the hook and the script it runs - # travel together. Conditional until the pinned source carries them. + # runtime and any hardware package install; the hook, the script it runs and + # the platform detector that script asks all travel together. omarchy leaves + # the detector out of its bin/ loop; the share/bin link keeps the Apple + # predicate's "detector beside me" lookup and the CLI router working. + # Conditional until the pinned source carries them. + if [[ -f bin/omarchy-hw-platform ]]; then + install -Dm755 bin/omarchy-hw-platform "$pkgdir/usr/bin/omarchy-hw-platform" + install -d "$pkgdir/usr/share/omarchy/bin" + ln -s /usr/bin/omarchy-hw-platform "$pkgdir/usr/share/omarchy/bin/omarchy-hw-platform" + fi if [[ -f default/libalpm/hooks/00-omarchy-platform-guard.hook ]]; then install -Dm644 default/libalpm/hooks/00-omarchy-platform-guard.hook \ "$pkgdir/usr/share/libalpm/hooks/00-omarchy-platform-guard.hook" diff --git a/pkgbuilds/omarchy-settings/PKGBUILD b/pkgbuilds/omarchy-settings/PKGBUILD index 093af88..d44015a 100644 --- a/pkgbuilds/omarchy-settings/PKGBUILD +++ b/pkgbuilds/omarchy-settings/PKGBUILD @@ -364,8 +364,16 @@ EOF # Pacman platform guard: refuses packages tagged for another hardware # platform. It ships here, not in omarchy, so it is resident before the - # runtime and any hardware package install; the hook and the script it runs - # travel together. Conditional until the pinned source carries them. + # runtime and any hardware package install; the hook, the script it runs and + # the platform detector that script asks all travel together. omarchy leaves + # the detector out of its bin/ loop; the share/bin link keeps the Apple + # predicate's "detector beside me" lookup and the CLI router working. + # Conditional until the pinned source carries them. + if [[ -f bin/omarchy-hw-platform ]]; then + install -Dm755 bin/omarchy-hw-platform "$pkgdir/usr/bin/omarchy-hw-platform" + install -d "$pkgdir/usr/share/omarchy/bin" + ln -s /usr/bin/omarchy-hw-platform "$pkgdir/usr/share/omarchy/bin/omarchy-hw-platform" + fi if [[ -f default/libalpm/hooks/00-omarchy-platform-guard.hook ]]; then install -Dm644 default/libalpm/hooks/00-omarchy-platform-guard.hook \ "$pkgdir/usr/share/libalpm/hooks/00-omarchy-platform-guard.hook" diff --git a/pkgbuilds/omarchy/PKGBUILD b/pkgbuilds/omarchy/PKGBUILD index 41314ea..1ac7d53 100644 --- a/pkgbuilds/omarchy/PKGBUILD +++ b/pkgbuilds/omarchy/PKGBUILD @@ -110,14 +110,15 @@ package() { # Runtime binaries — ship everything in bin/ except the debug helpers # that ship from omarchy-settings (needed before omarchy is installed, - # e.g. on the ISO live env). + # e.g. on the ISO live env), and the platform detector, which the settings + # package's pacman platform guard runs before omarchy is installed. install -d "$pkgdir/usr/bin" "$pkgdir/usr/share/omarchy/bin" for bin in bin/*; do [[ -f $bin ]] || continue local base base=$(basename "$bin") case "$base" in - omarchy-debug|omarchy-debug-idle|omarchy-upload-log) + omarchy-debug|omarchy-debug-idle|omarchy-upload-log|omarchy-hw-platform) continue ;; esac From fb2ade61fc344ff1c898b6727726f6b08d0c0867 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 20:01:13 +1000 Subject: [PATCH 35/55] Give the platform guard its own detector copy instead of moving it Moving omarchy-hw-platform from omarchy to omarchy-settings loses the file when the dev pair installs in separate transactions, since omarchy-dev does not pin omarchy-settings-dev's version. Settings now installs a copy beside the guard script and omarchy keeps its detector, so no file changes owner. --- pkgbuilds/omarchy-dev/PKGBUILD | 5 ++--- pkgbuilds/omarchy-settings-dev/PKGBUILD | 14 +++++--------- pkgbuilds/omarchy-settings/PKGBUILD | 14 +++++--------- pkgbuilds/omarchy/PKGBUILD | 5 ++--- 4 files changed, 14 insertions(+), 24 deletions(-) diff --git a/pkgbuilds/omarchy-dev/PKGBUILD b/pkgbuilds/omarchy-dev/PKGBUILD index ce16459..58630ed 100644 --- a/pkgbuilds/omarchy-dev/PKGBUILD +++ b/pkgbuilds/omarchy-dev/PKGBUILD @@ -110,15 +110,14 @@ package() { # Runtime binaries — ship everything in bin/ except the debug helpers # that ship from omarchy-settings (needed before omarchy is installed, - # e.g. on the ISO live env), and the platform detector, which the settings - # package's pacman platform guard runs before omarchy is installed. + # e.g. on the ISO live env). install -d "$pkgdir/usr/bin" "$pkgdir/usr/share/omarchy/bin" for bin in bin/*; do [[ -f $bin ]] || continue local base base=$(basename "$bin") case "$base" in - omarchy-debug|omarchy-debug-idle|omarchy-upload-log|omarchy-hw-platform) + omarchy-debug|omarchy-debug-idle|omarchy-upload-log) continue ;; esac diff --git a/pkgbuilds/omarchy-settings-dev/PKGBUILD b/pkgbuilds/omarchy-settings-dev/PKGBUILD index d5bd59f..6eb62e1 100644 --- a/pkgbuilds/omarchy-settings-dev/PKGBUILD +++ b/pkgbuilds/omarchy-settings-dev/PKGBUILD @@ -367,20 +367,16 @@ EOF # Pacman platform guard: refuses packages tagged for another hardware # platform. It ships here, not in omarchy, so it is resident before the # runtime and any hardware package install; the hook, the script it runs and - # the platform detector that script asks all travel together. omarchy leaves - # the detector out of its bin/ loop; the share/bin link keeps the Apple - # predicate's "detector beside me" lookup and the CLI router working. - # Conditional until the pinned source carries them. - if [[ -f bin/omarchy-hw-platform ]]; then - install -Dm755 bin/omarchy-hw-platform "$pkgdir/usr/bin/omarchy-hw-platform" - install -d "$pkgdir/usr/share/omarchy/bin" - ln -s /usr/bin/omarchy-hw-platform "$pkgdir/usr/share/omarchy/bin/omarchy-hw-platform" - fi + # the script's own copy of the platform detector travel together (omarchy + # keeps /usr/bin/omarchy-hw-platform). Conditional until the pinned source + # carries them. if [[ -f default/libalpm/hooks/00-omarchy-platform-guard.hook ]]; then install -Dm644 default/libalpm/hooks/00-omarchy-platform-guard.hook \ "$pkgdir/usr/share/libalpm/hooks/00-omarchy-platform-guard.hook" install -Dm755 default/libalpm/scripts/omarchy-platform-guard \ "$pkgdir/usr/share/libalpm/scripts/omarchy-platform-guard" + install -Dm755 bin/omarchy-hw-platform \ + "$pkgdir/usr/share/libalpm/scripts/omarchy-hw-platform" fi # Branding assets (logos, icons). diff --git a/pkgbuilds/omarchy-settings/PKGBUILD b/pkgbuilds/omarchy-settings/PKGBUILD index d44015a..3299e6c 100644 --- a/pkgbuilds/omarchy-settings/PKGBUILD +++ b/pkgbuilds/omarchy-settings/PKGBUILD @@ -365,20 +365,16 @@ EOF # Pacman platform guard: refuses packages tagged for another hardware # platform. It ships here, not in omarchy, so it is resident before the # runtime and any hardware package install; the hook, the script it runs and - # the platform detector that script asks all travel together. omarchy leaves - # the detector out of its bin/ loop; the share/bin link keeps the Apple - # predicate's "detector beside me" lookup and the CLI router working. - # Conditional until the pinned source carries them. - if [[ -f bin/omarchy-hw-platform ]]; then - install -Dm755 bin/omarchy-hw-platform "$pkgdir/usr/bin/omarchy-hw-platform" - install -d "$pkgdir/usr/share/omarchy/bin" - ln -s /usr/bin/omarchy-hw-platform "$pkgdir/usr/share/omarchy/bin/omarchy-hw-platform" - fi + # the script's own copy of the platform detector travel together (omarchy + # keeps /usr/bin/omarchy-hw-platform). Conditional until the pinned source + # carries them. if [[ -f default/libalpm/hooks/00-omarchy-platform-guard.hook ]]; then install -Dm644 default/libalpm/hooks/00-omarchy-platform-guard.hook \ "$pkgdir/usr/share/libalpm/hooks/00-omarchy-platform-guard.hook" install -Dm755 default/libalpm/scripts/omarchy-platform-guard \ "$pkgdir/usr/share/libalpm/scripts/omarchy-platform-guard" + install -Dm755 bin/omarchy-hw-platform \ + "$pkgdir/usr/share/libalpm/scripts/omarchy-hw-platform" fi # Branding assets (logos, icons). diff --git a/pkgbuilds/omarchy/PKGBUILD b/pkgbuilds/omarchy/PKGBUILD index 1ac7d53..41314ea 100644 --- a/pkgbuilds/omarchy/PKGBUILD +++ b/pkgbuilds/omarchy/PKGBUILD @@ -110,15 +110,14 @@ package() { # Runtime binaries — ship everything in bin/ except the debug helpers # that ship from omarchy-settings (needed before omarchy is installed, - # e.g. on the ISO live env), and the platform detector, which the settings - # package's pacman platform guard runs before omarchy is installed. + # e.g. on the ISO live env). install -d "$pkgdir/usr/bin" "$pkgdir/usr/share/omarchy/bin" for bin in bin/*; do [[ -f $bin ]] || continue local base base=$(basename "$bin") case "$base" in - omarchy-debug|omarchy-debug-idle|omarchy-upload-log|omarchy-hw-platform) + omarchy-debug|omarchy-debug-idle|omarchy-upload-log) continue ;; esac From 865aaa3f65e2643b44e8b1428d06bbd4af934327 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 20:00:49 +1000 Subject: [PATCH 36/55] Add omarchy-mac-boot for aarch64 edge The Apple Silicon boot package (Mac initramfs, in-place encryption, first boot and the Limine activation gate) now builds from packages/omarchy-mac/boot in omacom/omarchy-mac at a pinned commit: the recipe runs the source's tests and install staging, and keeps only metadata, backup= and the pacman scriptlet from the fork recipe. aarch64 and edge only; 20260925-1 upgrades the fork's 20260921-10. It needs the Apple-gated limine-mkinitcpio-hook 1.39.0-2. --- .../omarchy-mac-boot/.omarchy/package.json | 1 + pkgbuilds/omarchy-mac-boot/PKGBUILD | 52 +++++++++++++++++++ pkgbuilds/omarchy-mac-boot/README.md | 25 +++++++++ .../omarchy-mac-boot/omarchy-mac-boot.install | 48 +++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 pkgbuilds/omarchy-mac-boot/.omarchy/package.json create mode 100644 pkgbuilds/omarchy-mac-boot/PKGBUILD create mode 100644 pkgbuilds/omarchy-mac-boot/README.md create mode 100644 pkgbuilds/omarchy-mac-boot/omarchy-mac-boot.install diff --git a/pkgbuilds/omarchy-mac-boot/.omarchy/package.json b/pkgbuilds/omarchy-mac-boot/.omarchy/package.json new file mode 100644 index 0000000..9adf372 --- /dev/null +++ b/pkgbuilds/omarchy-mac-boot/.omarchy/package.json @@ -0,0 +1 @@ +{ "source": "local", "channels": ["edge"] } diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD new file mode 100644 index 0000000..00e920f --- /dev/null +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -0,0 +1,52 @@ +# Maintainer: Marcelo Alcantara +# Recipe from maralcbr/omarchy-pkgs asahi-quattro pkgbuilds/omarchy-mac-boot +# (20260921-10 at 0a55baeddecf59687c32b4bd4e1dee743605c183); the payload now +# builds from packages/omarchy-mac/boot in omacom/omarchy-mac. + +pkgname=omarchy-mac-boot +# pkgver is the UTC commit date of _commit, so it sorts above the fork's +# 20260921-N. Reset pkgrel to 1 when pkgver changes; bump it to re-pin or +# rebuild on the same day. +pkgver=20260925 +pkgrel=1 +pkgdesc='Apple Silicon boot support for Omarchy: initramfs, in-place encryption, first boot and Limine activation' +arch=('aarch64') +url='https://github.com/omacom/omarchy-mac' +license=('MIT') +makedepends=('git') +provides=('omarchy-apple-boot' 'omarchy-first-boot') +conflicts=('omarchy-apple-boot' 'omarchy-first-boot') +replaces=('omarchy-apple-boot' 'omarchy-first-boot') +install=omarchy-mac-boot.install +# An exact omarchy-mac commit, never a branch. +_commit=1855e11294c7bb82f5832822a7a1185b23ff8492 +source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") +sha256sums=('e16c9765bf0f8a8f230021850d503e11edd4579857e9239c464f4f50d1104d0a') + +prepare() { + # Tests and staging must not be able to read the surrounding desktop source. + rm -rf "$srcdir/boot" + cp -a "$srcdir/omarchy-mac/packages/omarchy-mac/boot" "$srcdir/boot" + [[ $(git -C "$srcdir/omarchy-mac" rev-parse HEAD) == "$_commit" ]] + [[ $(TZ=UTC0 git -C "$srcdir/omarchy-mac" show -s --format=%cd --date=format-local:%Y%m%d HEAD) == "$pkgver" ]] +} + +check() { + "$srcdir/boot/test/all" +} + +package() { + # Runtime-only, so the builder stages and tests the payload without the + # desktop or a boot chain. 1.39.0-2 is the first limine-mkinitcpio-hook that + # leaves a Mac's /boot to mkinitcpio until Limine is activated. + depends=('omarchy' 'limine' 'limine-mkinitcpio-hook>=1.39.0-2' 'limine-snapper-sync' 'asahi-scripts' + 'bash' 'btrfs-progs' 'coreutils' 'cpio' 'cryptsetup' 'diffutils' 'gawk' 'gnupg' 'grep' 'gum' + 'gzip' 'kbd' 'mkinitcpio' 'sed' 'systemd' 'util-linux') + + "$srcdir/boot/install" "$pkgdir" + printf '%s\n' "$_commit" | install -Dm644 /dev/stdin "$pkgdir/usr/share/omarchy-mac/boot-source-revision" + + # Administrator-editable: every /etc path and the initramfs helpers an image + # may rewrite. + mapfile -t backup < <(cd "$pkgdir" && find etc usr/lib/omarchy/initcpio -type f | sort) +} diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md new file mode 100644 index 0000000..e85c38a --- /dev/null +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -0,0 +1,25 @@ +# omarchy-mac-boot + +Apple Silicon boot support for Omarchy: the Mac mkinitcpio drop-ins and initcpio hooks, in-place LUKS conversion in the initramfs, vendor firmware in early boot, first boot of a Mac image, the Limine activation gate and the boot check. The source is `packages/omarchy-mac/boot/` in omacom/omarchy-mac, with its own tests. The recipe pins an exact omarchy-mac commit, copies that directory away from the surrounding desktop tree in `prepare()`, runs its `test/all` in `check()` and stages the package with its `install` script. The recipe itself holds only metadata, `backup=` and the pacman scriptlet. + +It follows the fork recipe in maralcbr/omarchy-pkgs (`asahi-quattro`, `pkgbuilds/omarchy-mac-boot` at 20260921-10), which carried the payload as files in the recipe. + +## Scope + +The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It depends only on generic packages, and its only provides are the retired Apple-only names, so nothing generic can pull it onto non-Apple aarch64 machines. + +It requires `limine-mkinitcpio-hook` 1.39.0-2 or newer: that is the first build whose hooks leave a Mac's `/boot` to mkinitcpio until Limine is activated. With an older hook, Limine's kernel hook replaces mkinitcpio's by name, and this package's `limine-ready` gate stops it on a Mac that still boots GRUB, so a kernel update would never reach `/boot`. + +## Transition + +- It provides, conflicts with and replaces `omarchy-apple-boot` and `omarchy-first-boot`. The scriptlet moves a pending `omarchy-first-boot` marker to `omarchy-mac-first-boot`, drops the replaced unit's dangling enable link and points at a customised `90-omarchy-asahi.conf.pacsave`. +- `pkgver` is the UTC commit date of the pin, so `20260925-1` upgrades the fork's `20260921-10` on mx-mac Macs. The files the fork shipped that the source no longer does (the image finalize tools, the upstream ARM repository key and the GRUB snapshot-menu hook) are removed by that upgrade. +- `backup=` covers every `/etc` path and `/usr/lib/omarchy/initcpio`. It includes `/etc/default/update-m1n1`, which pins update-m1n1's device-tree order to the C locale. On a Mac that already has its own unowned copy, pacman keeps it and installs the shipped one as `.pacnew`. + +## Updates + +Updates are reviewed pins, never a branch: + +1. Set `_commit` to the full omarchy-mac SHA and `pkgver` to its UTC commit date (`TZ=UTC0 git show -s --format=%cd --date=format-local:%Y%m%d `); `prepare()` checks both. +2. Reset `pkgrel` to 1 when `pkgver` changes; bump it for a second pin on the same date or a rebuild. +3. Refresh `sha256sums` with `makepkg -g`. diff --git a/pkgbuilds/omarchy-mac-boot/omarchy-mac-boot.install b/pkgbuilds/omarchy-mac-boot/omarchy-mac-boot.install new file mode 100644 index 0000000..762cddf --- /dev/null +++ b/pkgbuilds/omarchy-mac-boot/omarchy-mac-boot.install @@ -0,0 +1,48 @@ +_omarchy_mac_boot_asahi_pacsave_notice() { + local pacsave=/etc/mkinitcpio.conf.d/90-omarchy-asahi.conf.pacsave + local shipped=/etc/mkinitcpio.conf.d/90-omarchy-mac.conf + + [[ -f $pacsave && -f $shipped ]] || return 0 + cmp -s "$pacsave" "$shipped" && return 0 + + cat < omarchy-mac-boot: a customized 90-omarchy-asahi.conf was preserved as: + $pacsave + The active mkinitcpio drop-in is now: + $shipped + Merge any remaining local changes into the new file. +EOF +} + +_omarchy_mac_boot_migrate_legacy_first_boot() { + local legacy=/var/lib/omarchy/first-boot/pending + local successor=/var/lib/omarchy/mac-first-boot/pending + + [[ -e $legacy ]] || return 0 + install -Dm644 /dev/null "$successor" + rm -f "$legacy" + systemctl --no-reload enable omarchy-mac-first-boot.service 2>/dev/null || { + install -d /etc/systemd/system/multi-user.target.wants + ln -sfr /usr/lib/systemd/system/omarchy-mac-first-boot.service \ + /etc/systemd/system/multi-user.target.wants/omarchy-mac-first-boot.service + } +} + +post_install() { + _omarchy_mac_boot_asahi_pacsave_notice + _omarchy_mac_boot_migrate_legacy_first_boot + _omarchy_mac_boot_drop_legacy_wants +} + +_omarchy_mac_boot_drop_legacy_wants() { + # The replaced omarchy-first-boot left its preset-enabled link behind. + local link=/etc/systemd/system/multi-user.target.wants/omarchy-first-boot.service + [[ -L $link && ! -e $link ]] && rm -f "$link" + return 0 +} + +post_upgrade() { + _omarchy_mac_boot_asahi_pacsave_notice + _omarchy_mac_boot_migrate_legacy_first_boot + _omarchy_mac_boot_drop_legacy_wants +} From c48f02942affaaf2d3d5ede127b1b485eb96fd23 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 20:20:01 +1000 Subject: [PATCH 37/55] omarchy-mac-boot: pin the first-boot manifest check, and say which dependency is Apple-only Moves the pin to 602266c8, where first boot of a fresh image refuses to finish without the build manifest that defers its hardware setup. asahi-scripts is the one Apple-only dependency; the README no longer calls them all generic. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 4 ++-- pkgbuilds/omarchy-mac-boot/README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index 00e920f..65bbedb 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -19,9 +19,9 @@ conflicts=('omarchy-apple-boot' 'omarchy-first-boot') replaces=('omarchy-apple-boot' 'omarchy-first-boot') install=omarchy-mac-boot.install # An exact omarchy-mac commit, never a branch. -_commit=1855e11294c7bb82f5832822a7a1185b23ff8492 +_commit=602266c8887cbfe7d995be2d56f241d0c955bccb source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") -sha256sums=('e16c9765bf0f8a8f230021850d503e11edd4579857e9239c464f4f50d1104d0a') +sha256sums=('6d7d3fc59de5178b9acd62b81e3a279f75e099527b8210e5a338b3098c525e9e') prepare() { # Tests and staging must not be able to read the surrounding desktop source. diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index e85c38a..cc44c59 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -6,7 +6,7 @@ It follows the fork recipe in maralcbr/omarchy-pkgs (`asahi-quattro`, `pkgbuilds ## Scope -The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It depends only on generic packages, and its only provides are the retired Apple-only names, so nothing generic can pull it onto non-Apple aarch64 machines. +The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. Its only provides are the retired Apple-only names, and nothing generic depends on it or on them, so nothing generic can pull it onto non-Apple aarch64 machines. Its one Apple-only dependency, `asahi-scripts`, comes from the asahi-alarm repository that only the Apple profile configures. It requires `limine-mkinitcpio-hook` 1.39.0-2 or newer: that is the first build whose hooks leave a Mac's `/boot` to mkinitcpio until Limine is activated. With an older hook, Limine's kernel hook replaces mkinitcpio's by name, and this package's `limine-ready` gate stops it on a Mac that still boots GRUB, so a kernel update would never reach `/boot`. From 4e58d1c77fbf89aad99e86504a2ab5555784047c Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 20:45:29 +1000 Subject: [PATCH 38/55] Give cc1plus enough stack for aquamarine under emulation DRM.cpp needs more than 8 MiB of compiler stack. GCC raises its own limit natively, but the aarch64 builder runs under QEMU user-mode emulation, which fixes the guest stack at exec and ignores setrlimit, so cc1plus segfaulted. Unpatched 0.15.1 fails the same way. QEMU_STACK_SIZE sizes it at exec; native builds ignore it and the object code is identical. --- pkgbuilds/aquamarine/PKGBUILD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkgbuilds/aquamarine/PKGBUILD b/pkgbuilds/aquamarine/PKGBUILD index a9ed9e0..2b16e74 100644 --- a/pkgbuilds/aquamarine/PKGBUILD +++ b/pkgbuilds/aquamarine/PKGBUILD @@ -44,6 +44,12 @@ prepare() { build() { cd "$_archive" + # cc1plus needs more than 8 MiB of stack for DRM.cpp. GCC raises its own + # limit natively, but under QEMU user-mode emulation (the aarch64 builder) + # the guest stack is fixed at exec and setrlimit is ignored, so the compiler + # segfaults. QEMU reads this at exec; native builds ignore it. The object + # code is identical either way. + export QEMU_STACK_SIZE=64M cmake -B build \ -D CMAKE_INSTALL_PREFIX=/usr \ -D CMAKE_BUILD_TYPE=Release From 7ed92ad039e0348640a446caad892984ea5537bf Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 20:57:33 +1000 Subject: [PATCH 39/55] omarchy-settings: bump pkgrel for the platform guard lines CI builds a changed recipe and needs a new package; 4.0.4-1 is already published. The pinned upstream source has no guard files, so 4.0.4-2 has the same contents. --- pkgbuilds/omarchy-settings/PKGBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgbuilds/omarchy-settings/PKGBUILD b/pkgbuilds/omarchy-settings/PKGBUILD index 3299e6c..9fce62f 100644 --- a/pkgbuilds/omarchy-settings/PKGBUILD +++ b/pkgbuilds/omarchy-settings/PKGBUILD @@ -13,7 +13,7 @@ pkgname='omarchy-settings' _tag='v4.0.4' _commit='c668141e9c42b13c80c9ca4ea108e11708c5e8a5' pkgver=4.0.4 -pkgrel=1 +pkgrel=2 pkgdesc='Omarchy user defaults, /etc/skel content, fonts, plymouth theme, and support helpers' # Arch-specific because the shipped /etc tree is not the same on every # architecture: the Limine, mkinitcpio, zram and oomd drop-ins belong to the From 134f2facc58278b6c9d4fc65d630a49f60a197d4 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 21:36:39 +1000 Subject: [PATCH 40/55] omarchy-mac-boot: tag it for Apple Silicon and pin #541's current head groups=('omarchy-platform-apple-silicon') is the platform tag the pacman platform guard reads (omacom/omarchy-mac#539); the package is not published yet, so it carries the tag from its first build. The pin moves to 3a58abb5, omacom/omarchy-mac#541 with #527's current head merged in. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 5 +++-- pkgbuilds/omarchy-mac-boot/README.md | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index 65bbedb..0a9e7c3 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -11,6 +11,7 @@ pkgver=20260925 pkgrel=1 pkgdesc='Apple Silicon boot support for Omarchy: initramfs, in-place encryption, first boot and Limine activation' arch=('aarch64') +groups=('omarchy-platform-apple-silicon') url='https://github.com/omacom/omarchy-mac' license=('MIT') makedepends=('git') @@ -19,9 +20,9 @@ conflicts=('omarchy-apple-boot' 'omarchy-first-boot') replaces=('omarchy-apple-boot' 'omarchy-first-boot') install=omarchy-mac-boot.install # An exact omarchy-mac commit, never a branch. -_commit=602266c8887cbfe7d995be2d56f241d0c955bccb +_commit=3a58abb5badf6595567695ad0db1bfe9150093ea source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") -sha256sums=('6d7d3fc59de5178b9acd62b81e3a279f75e099527b8210e5a338b3098c525e9e') +sha256sums=('c81a3ba25a27ee90092179dd48b98292cdfd04adfefcd4de40379f9b37d2de5b') prepare() { # Tests and staging must not be able to read the surrounding desktop source. diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index cc44c59..11eced1 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -6,7 +6,7 @@ It follows the fork recipe in maralcbr/omarchy-pkgs (`asahi-quattro`, `pkgbuilds ## Scope -The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. Its only provides are the retired Apple-only names, and nothing generic depends on it or on them, so nothing generic can pull it onto non-Apple aarch64 machines. Its one Apple-only dependency, `asahi-scripts`, comes from the asahi-alarm repository that only the Apple profile configures. +The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It carries the Apple platform tag, `groups=('omarchy-platform-apple-silicon')`, so omarchy-settings' pacman platform guard keeps it off other machines (omacom/omarchy-mac `docs/platform-guard.md`). Its only provides are the retired Apple-only names, and nothing generic depends on it or on them, so nothing generic can pull it onto non-Apple aarch64 machines. Its one Apple-only dependency, `asahi-scripts`, comes from the asahi-alarm repository that only the Apple profile configures. It requires `limine-mkinitcpio-hook` 1.39.0-2 or newer: that is the first build whose hooks leave a Mac's `/boot` to mkinitcpio until Limine is activated. With an older hook, Limine's kernel hook replaces mkinitcpio's by name, and this package's `limine-ready` gate stops it on a Mac that still boots GRUB, so a kernel update would never reach `/boot`. From 61bc72d00694a6889fd5f3e779bc346e78f03eec Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 22:49:39 +1000 Subject: [PATCH 41/55] omarchy-mac-boot: pin the boot-set integration commit Pin a09ee0ca, the head of omacom/omarchy-mac integ/boot-set-1 (#547): quattro-upstream with #527, #540, #545 and #541 merged. The package then carries the Apple provisioning entrypoints from #545 and can publish before those PRs merge. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index 0a9e7c3..a0fb5b9 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -8,7 +8,7 @@ pkgname=omarchy-mac-boot # 20260921-N. Reset pkgrel to 1 when pkgver changes; bump it to re-pin or # rebuild on the same day. pkgver=20260925 -pkgrel=1 +pkgrel=2 pkgdesc='Apple Silicon boot support for Omarchy: initramfs, in-place encryption, first boot and Limine activation' arch=('aarch64') groups=('omarchy-platform-apple-silicon') @@ -20,9 +20,9 @@ conflicts=('omarchy-apple-boot' 'omarchy-first-boot') replaces=('omarchy-apple-boot' 'omarchy-first-boot') install=omarchy-mac-boot.install # An exact omarchy-mac commit, never a branch. -_commit=3a58abb5badf6595567695ad0db1bfe9150093ea +_commit=a09ee0cadd8a78a774dab06eae2d6faa6a395255 source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") -sha256sums=('c81a3ba25a27ee90092179dd48b98292cdfd04adfefcd4de40379f9b37d2de5b') +sha256sums=('45da7d2039a3196150fc4f7798210c5717dc9a0e9c0526de988759948f6f536f') prepare() { # Tests and staging must not be able to read the surrounding desktop source. From 020b28dd69afaab1559b0e843afb33cc31482d38 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 23:08:14 +1000 Subject: [PATCH 42/55] omarchy-mac-boot: say the platform guard is still to ship, and drop the stale pkgrel from the README --- pkgbuilds/omarchy-mac-boot/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index 11eced1..17f1d7e 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -6,14 +6,14 @@ It follows the fork recipe in maralcbr/omarchy-pkgs (`asahi-quattro`, `pkgbuilds ## Scope -The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It carries the Apple platform tag, `groups=('omarchy-platform-apple-silicon')`, so omarchy-settings' pacman platform guard keeps it off other machines (omacom/omarchy-mac `docs/platform-guard.md`). Its only provides are the retired Apple-only names, and nothing generic depends on it or on them, so nothing generic can pull it onto non-Apple aarch64 machines. Its one Apple-only dependency, `asahi-scripts`, comes from the asahi-alarm repository that only the Apple profile configures. +The package is aarch64-only and published to edge only. It widens to rc and stable only after M1 and M2 cold-boot qualification. It carries the Apple platform tag, `groups=('omarchy-platform-apple-silicon')`, which omarchy-settings' pacman platform guard uses to keep it off other machines once that guard ships (omacom/omarchy-mac#539, `docs/platform-guard.md`). Its only provides are the retired Apple-only names, and nothing generic depends on it or on them, so nothing generic can pull it onto non-Apple aarch64 machines. Its one Apple-only dependency, `asahi-scripts`, comes from the asahi-alarm repository that only the Apple profile configures. It requires `limine-mkinitcpio-hook` 1.39.0-2 or newer: that is the first build whose hooks leave a Mac's `/boot` to mkinitcpio until Limine is activated. With an older hook, Limine's kernel hook replaces mkinitcpio's by name, and this package's `limine-ready` gate stops it on a Mac that still boots GRUB, so a kernel update would never reach `/boot`. ## Transition - It provides, conflicts with and replaces `omarchy-apple-boot` and `omarchy-first-boot`. The scriptlet moves a pending `omarchy-first-boot` marker to `omarchy-mac-first-boot`, drops the replaced unit's dangling enable link and points at a customised `90-omarchy-asahi.conf.pacsave`. -- `pkgver` is the UTC commit date of the pin, so `20260925-1` upgrades the fork's `20260921-10` on mx-mac Macs. The files the fork shipped that the source no longer does (the image finalize tools, the upstream ARM repository key and the GRUB snapshot-menu hook) are removed by that upgrade. +- `pkgver` is the UTC commit date of the pin, so any pin from `20260925` on upgrades the fork's `20260921-10` on mx-mac Macs. The files the fork shipped that the source no longer does (the image finalize tools, the upstream ARM repository key and the GRUB snapshot-menu hook) are removed by that upgrade. - `backup=` covers every `/etc` path and `/usr/lib/omarchy/initcpio`. It includes `/etc/default/update-m1n1`, which pins update-m1n1's device-tree order to the C locale. On a Mac that already has its own unowned copy, pacman keeps it and installs the shipped one as `.pacnew`. ## Updates From 67dd0f7e6b724057867429eae276caae869e0e10 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 23:36:45 +1000 Subject: [PATCH 43/55] omarchy-mac-boot: require the HOOKS baseline once the source relies on it From omacom/omarchy-mac#544 the Apple drop-ins no longer add Plymouth themselves and build on omarchy-settings' 00-omarchy-hooks.conf (#536). A settings version cannot express that (quattro candidates sort below stock releases and omarchy pins its settings exactly), so a build whose payload has no 93-omarchy-mac-plymouth.conf depends on the name omarchy-mkinitcpio-hooks-baseline, which settings packages that ship the baseline must provide. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 9 +++++++++ pkgbuilds/omarchy-mac-boot/README.md | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index a0fb5b9..706fcf3 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -45,6 +45,15 @@ package() { 'gzip' 'kbd' 'mkinitcpio' 'sed' 'systemd' 'util-linux') "$srcdir/boot/install" "$pkgdir" + # Once the source drops its own Plymouth fragment (omacom/omarchy-mac#544), + # the Apple drop-ins build on omarchy-settings' HOOKS baseline + # (/etc/mkinitcpio.conf.d/00-omarchy-hooks.conf, omacom/omarchy-mac#536), and + # an older settings package leaves Plymouth out of the Mac initramfs. A + # settings version cannot say so (quattro candidates sort below stock + # releases, and omarchy pins its settings exactly), so the settings packages + # that ship the baseline provide it by name. + [[ -e $pkgdir/etc/mkinitcpio.conf.d/93-omarchy-mac-plymouth.conf ]] || + depends+=('omarchy-mkinitcpio-hooks-baseline') printf '%s\n' "$_commit" | install -Dm644 /dev/stdin "$pkgdir/usr/share/omarchy-mac/boot-source-revision" # Administrator-editable: every /etc path and the initramfs helpers an image diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index 17f1d7e..d2506e6 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -10,6 +10,10 @@ The package is aarch64-only and published to edge only. It widens to rc and stab It requires `limine-mkinitcpio-hook` 1.39.0-2 or newer: that is the first build whose hooks leave a Mac's `/boot` to mkinitcpio until Limine is activated. With an older hook, Limine's kernel hook replaces mkinitcpio's by name, and this package's `limine-ready` gate stops it on a Mac that still boots GRUB, so a kernel update would never reach `/boot`. +## HOOKS baseline + +From the source that drops the boot package's own Plymouth fragment (omacom/omarchy-mac#544), the Apple drop-ins build on omarchy-settings' HOOKS baseline, `/etc/mkinitcpio.conf.d/00-omarchy-hooks.conf` (omacom/omarchy-mac#536). With an older settings package the Mac initramfs loses Plymouth at the passphrase prompt. A settings version cannot express this: quattro candidate builds sort below stock releases, and `omarchy` pins its settings version exactly. So when the staged payload has no `93-omarchy-mac-plymouth.conf`, `package()` adds a dependency on the name `omarchy-mkinitcpio-hooks-baseline`. Every settings package that ships the baseline on aarch64 (`omarchy-settings`, `omarchy-settings-dev`, candidate builds) must `provide` that name. Until one does, such a build of this package cannot be installed: it fails outright rather than silently booting without Plymouth. + ## Transition - It provides, conflicts with and replaces `omarchy-apple-boot` and `omarchy-first-boot`. The scriptlet moves a pending `omarchy-first-boot` marker to `omarchy-mac-first-boot`, drops the replaced unit's dangling enable link and points at a customised `90-omarchy-asahi.conf.pacsave`. From f3a96c195b1cdc7f3f981bb2f74a88e0d9a9660c Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Fri, 25 Sep 2026 23:37:40 +1000 Subject: [PATCH 44/55] omarchy-mac-boot: document the publish order its pinned source needs A pin with omacom/omarchy-mac#544 needs the settings HOOKS baseline (#542) published first; a pin with #543's update-verify entrypoint must publish before any runtime carrying #543. pkgrel 3 so this rebuild does not reuse the published 20260925-2 filename. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 2 +- pkgbuilds/omarchy-mac-boot/README.md | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index 706fcf3..b4b8f55 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -8,7 +8,7 @@ pkgname=omarchy-mac-boot # 20260921-N. Reset pkgrel to 1 when pkgver changes; bump it to re-pin or # rebuild on the same day. pkgver=20260925 -pkgrel=2 +pkgrel=3 pkgdesc='Apple Silicon boot support for Omarchy: initramfs, in-place encryption, first boot and Limine activation' arch=('aarch64') groups=('omarchy-platform-apple-silicon') diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index d2506e6..83076db 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -14,6 +14,13 @@ It requires `limine-mkinitcpio-hook` 1.39.0-2 or newer: that is the first build From the source that drops the boot package's own Plymouth fragment (omacom/omarchy-mac#544), the Apple drop-ins build on omarchy-settings' HOOKS baseline, `/etc/mkinitcpio.conf.d/00-omarchy-hooks.conf` (omacom/omarchy-mac#536). With an older settings package the Mac initramfs loses Plymouth at the passphrase prompt. A settings version cannot express this: quattro candidate builds sort below stock releases, and `omarchy` pins its settings version exactly. So when the staged payload has no `93-omarchy-mac-plymouth.conf`, `package()` adds a dependency on the name `omarchy-mkinitcpio-hooks-baseline`. Every settings package that ships the baseline on aarch64 (`omarchy-settings`, `omarchy-settings-dev`, candidate builds) must `provide` that name. Until one does, such a build of this package cannot be installed: it fails outright rather than silently booting without Plymouth. +## Publish order + +A new pin publishes on merge, so check what the pinned source needs first: + +- **Settings baseline.** A pin that includes omacom/omarchy-mac#544 (no `93-omarchy-mac-plymouth.conf`) needs omarchy-settings with the HOOKS baseline (omacom/omarchy-mac#542) published on aarch64, and providing `omarchy-mkinitcpio-hooks-baseline`. Publish that first; otherwise this build cannot be installed. +- **Update verification.** A pin that includes omacom/omarchy-mac#543 (`/usr/lib/omarchy/mac-boot/update-verify`) must publish before any runtime that carries #543. Otherwise that runtime blocks every update on Macs whose `omarchy-mac-boot` predates it. + ## Transition - It provides, conflicts with and replaces `omarchy-apple-boot` and `omarchy-first-boot`. The scriptlet moves a pending `omarchy-first-boot` marker to `omarchy-mac-first-boot`, drops the replaced unit's dangling enable link and points at a customised `90-omarchy-asahi.conf.pacsave`. From 8f80d460498b54534a33eb5b0f08766b097a0f66 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Sat, 26 Sep 2026 01:25:33 +1000 Subject: [PATCH 45/55] omarchy-mac-boot 20260925-3: pin quattro-upstream f7ea7ecc Moves the pin from the boot-set integration commit to quattro-upstream, which now has #541 with its review fixes (first boot hands off only for a failed step, and the retry waits for NetworkManager), #543's update-verify entrypoint, #545's provision entrypoints and #549's keyslot-only LUKS check. #544 is not in it, so the Plymouth fragment still ships and no HOOKS baseline dependency applies. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index b4b8f55..184a6b9 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -20,9 +20,9 @@ conflicts=('omarchy-apple-boot' 'omarchy-first-boot') replaces=('omarchy-apple-boot' 'omarchy-first-boot') install=omarchy-mac-boot.install # An exact omarchy-mac commit, never a branch. -_commit=a09ee0cadd8a78a774dab06eae2d6faa6a395255 +_commit=f7ea7ecc804a133e1afe571b708458a6d71db77d source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") -sha256sums=('45da7d2039a3196150fc4f7798210c5717dc9a0e9c0526de988759948f6f536f') +sha256sums=('b14b862e8f22cb7db49afcf7e380bc92d532967cc0edef72adfda54a1eb5605b') prepare() { # Tests and staging must not be able to read the surrounding desktop source. From 23bfb75f07a70c13bb61152e4eef5f024b36a0b9 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Sat, 26 Sep 2026 09:20:37 +1000 Subject: [PATCH 46/55] omarchy-mac-boot 20260925-4: pin quattro-upstream 84352fdb Moves the pin from f7ea7ecc to the head of quattro-upstream, which adds #552's reset-prepare, reset-verify, reset-commit and reset-rollback entrypoints, #553's luks-slots entrypoint and recovery key handling, #556's encrypt unit output to kmsg at notice, and #560's snapshot restore check with its limine-snapper-sync pre and post hooks. The pin's UTC date is still 20260925, so pkgrel goes to 4. #544 is not in it, so the Plymouth fragment still ships and no HOOKS baseline dependency applies. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index 184a6b9..a00798f 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -8,7 +8,7 @@ pkgname=omarchy-mac-boot # 20260921-N. Reset pkgrel to 1 when pkgver changes; bump it to re-pin or # rebuild on the same day. pkgver=20260925 -pkgrel=3 +pkgrel=4 pkgdesc='Apple Silicon boot support for Omarchy: initramfs, in-place encryption, first boot and Limine activation' arch=('aarch64') groups=('omarchy-platform-apple-silicon') @@ -20,9 +20,9 @@ conflicts=('omarchy-apple-boot' 'omarchy-first-boot') replaces=('omarchy-apple-boot' 'omarchy-first-boot') install=omarchy-mac-boot.install # An exact omarchy-mac commit, never a branch. -_commit=f7ea7ecc804a133e1afe571b708458a6d71db77d +_commit=84352fdb8fd03d149682ac54466b1a1add176f84 source=("omarchy-mac::git+https://github.com/omacom/omarchy-mac.git#commit=${_commit}") -sha256sums=('b14b862e8f22cb7db49afcf7e380bc92d532967cc0edef72adfda54a1eb5605b') +sha256sums=('06514d03eef7e8468277ae97c3258bc595f307aa0cf3356d3f71cfb6b0d14fe2') prepare() { # Tests and staging must not be able to read the surrounding desktop source. From cfb8f9a403e31150ece7caa757f5b9d2fa366751 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Sat, 26 Sep 2026 09:20:37 +1000 Subject: [PATCH 47/55] omarchy-mac-boot: depend on binutils for objcopy The boot check and, from #560, the snapshot restore check read the kernel out of the Limine UKI with objcopy. mkinitcpio pulls binutils in today, but the package calls it directly. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index a00798f..d1e6eaa 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -41,8 +41,8 @@ package() { # desktop or a boot chain. 1.39.0-2 is the first limine-mkinitcpio-hook that # leaves a Mac's /boot to mkinitcpio until Limine is activated. depends=('omarchy' 'limine' 'limine-mkinitcpio-hook>=1.39.0-2' 'limine-snapper-sync' 'asahi-scripts' - 'bash' 'btrfs-progs' 'coreutils' 'cpio' 'cryptsetup' 'diffutils' 'gawk' 'gnupg' 'grep' 'gum' - 'gzip' 'kbd' 'mkinitcpio' 'sed' 'systemd' 'util-linux') + 'bash' 'binutils' 'btrfs-progs' 'coreutils' 'cpio' 'cryptsetup' 'diffutils' 'gawk' 'gnupg' 'grep' + 'gum' 'gzip' 'kbd' 'mkinitcpio' 'sed' 'systemd' 'util-linux') "$srcdir/boot/install" "$pkgdir" # Once the source drops its own Plymouth fragment (omacom/omarchy-mac#544), From e70090513c5cdfa6eac1d06837fb261216b3e7e5 Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Sat, 26 Sep 2026 09:20:37 +1000 Subject: [PATCH 48/55] omarchy-mac-boot: document the publish order the reset and key-slot entrypoints need omarchy-lifecycle-dispatch requires reset-* (#552) and luks-slots (#553) on Apple Silicon, so a runtime carrying them before this package blocks factory reset, owner setup and omarchy-drive-password on Macs. --- pkgbuilds/omarchy-mac-boot/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index 83076db..a7f4935 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -20,6 +20,7 @@ A new pin publishes on merge, so check what the pinned source needs first: - **Settings baseline.** A pin that includes omacom/omarchy-mac#544 (no `93-omarchy-mac-plymouth.conf`) needs omarchy-settings with the HOOKS baseline (omacom/omarchy-mac#542) published on aarch64, and providing `omarchy-mkinitcpio-hooks-baseline`. Publish that first; otherwise this build cannot be installed. - **Update verification.** A pin that includes omacom/omarchy-mac#543 (`/usr/lib/omarchy/mac-boot/update-verify`) must publish before any runtime that carries #543. Otherwise that runtime blocks every update on Macs whose `omarchy-mac-boot` predates it. +- **Reset and key-slot entrypoints.** A pin that includes omacom/omarchy-mac#552 (`reset-prepare`, `reset-verify`, `reset-commit`, `reset-rollback`) and #553 (`luks-slots`) must publish before any runtime that carries them. That runtime's `omarchy-lifecycle-dispatch` requires them on Apple Silicon, so otherwise factory reset, owner setup and `omarchy-drive-password` fail on Macs whose `omarchy-mac-boot` predates them. ## Transition From c3fa2ba65d8d17ae35eb21ee306926a989c54eda Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Sat, 26 Sep 2026 09:28:34 +1000 Subject: [PATCH 49/55] omarchy-mac-boot: say backup= covers /etc files, not the hook symlinks The snapshot restore hooks under /etc/boot/hooks are symlinks, which the backup list leaves out. omarchy-drive-password needs luks-slots only for the system disk. --- pkgbuilds/omarchy-mac-boot/PKGBUILD | 2 +- pkgbuilds/omarchy-mac-boot/README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/omarchy-mac-boot/PKGBUILD b/pkgbuilds/omarchy-mac-boot/PKGBUILD index d1e6eaa..65ea8a6 100644 --- a/pkgbuilds/omarchy-mac-boot/PKGBUILD +++ b/pkgbuilds/omarchy-mac-boot/PKGBUILD @@ -56,7 +56,7 @@ package() { depends+=('omarchy-mkinitcpio-hooks-baseline') printf '%s\n' "$_commit" | install -Dm644 /dev/stdin "$pkgdir/usr/share/omarchy-mac/boot-source-revision" - # Administrator-editable: every /etc path and the initramfs helpers an image + # Administrator-editable: every /etc file and the initramfs helpers an image # may rewrite. mapfile -t backup < <(cd "$pkgdir" && find etc usr/lib/omarchy/initcpio -type f | sort) } diff --git a/pkgbuilds/omarchy-mac-boot/README.md b/pkgbuilds/omarchy-mac-boot/README.md index a7f4935..269b37d 100644 --- a/pkgbuilds/omarchy-mac-boot/README.md +++ b/pkgbuilds/omarchy-mac-boot/README.md @@ -20,13 +20,13 @@ A new pin publishes on merge, so check what the pinned source needs first: - **Settings baseline.** A pin that includes omacom/omarchy-mac#544 (no `93-omarchy-mac-plymouth.conf`) needs omarchy-settings with the HOOKS baseline (omacom/omarchy-mac#542) published on aarch64, and providing `omarchy-mkinitcpio-hooks-baseline`. Publish that first; otherwise this build cannot be installed. - **Update verification.** A pin that includes omacom/omarchy-mac#543 (`/usr/lib/omarchy/mac-boot/update-verify`) must publish before any runtime that carries #543. Otherwise that runtime blocks every update on Macs whose `omarchy-mac-boot` predates it. -- **Reset and key-slot entrypoints.** A pin that includes omacom/omarchy-mac#552 (`reset-prepare`, `reset-verify`, `reset-commit`, `reset-rollback`) and #553 (`luks-slots`) must publish before any runtime that carries them. That runtime's `omarchy-lifecycle-dispatch` requires them on Apple Silicon, so otherwise factory reset, owner setup and `omarchy-drive-password` fail on Macs whose `omarchy-mac-boot` predates them. +- **Reset and key-slot entrypoints.** A pin that includes omacom/omarchy-mac#552 (`reset-prepare`, `reset-verify`, `reset-commit`, `reset-rollback`) and #553 (`luks-slots`) must publish before any runtime that carries them. That runtime's `omarchy-lifecycle-dispatch` requires them on Apple Silicon, so otherwise factory reset, owner setup and `omarchy-drive-password` on the system disk fail on Macs whose `omarchy-mac-boot` predates them. ## Transition - It provides, conflicts with and replaces `omarchy-apple-boot` and `omarchy-first-boot`. The scriptlet moves a pending `omarchy-first-boot` marker to `omarchy-mac-first-boot`, drops the replaced unit's dangling enable link and points at a customised `90-omarchy-asahi.conf.pacsave`. - `pkgver` is the UTC commit date of the pin, so any pin from `20260925` on upgrades the fork's `20260921-10` on mx-mac Macs. The files the fork shipped that the source no longer does (the image finalize tools, the upstream ARM repository key and the GRUB snapshot-menu hook) are removed by that upgrade. -- `backup=` covers every `/etc` path and `/usr/lib/omarchy/initcpio`. It includes `/etc/default/update-m1n1`, which pins update-m1n1's device-tree order to the C locale. On a Mac that already has its own unowned copy, pacman keeps it and installs the shipped one as `.pacnew`. +- `backup=` covers every `/etc` file and `/usr/lib/omarchy/initcpio`. It includes `/etc/default/update-m1n1`, which pins update-m1n1's device-tree order to the C locale. On a Mac that already has its own unowned copy, pacman keeps it and installs the shipped one as `.pacnew`. The snapshot restore hooks in `/etc/boot/hooks` are symlinks to `/usr/bin/omarchy-mac-snapshot-check`, not files, so they stay out of it. ## Updates From e841c87036d6ef4b48b046231aeeb4c3bea357ff Mon Sep 17 00:00:00 2001 From: Marcelo Alcantara Date: Sat, 26 Sep 2026 11:18:24 +1000 Subject: [PATCH 50/55] omarchy-settings-dev: rebuild so the dev pair shares one quattro commit --- pkgbuilds/omarchy-settings-dev/PKGBUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgbuilds/omarchy-settings-dev/PKGBUILD b/pkgbuilds/omarchy-settings-dev/PKGBUILD index 6eb62e1..1d4dce0 100644 --- a/pkgbuilds/omarchy-settings-dev/PKGBUILD +++ b/pkgbuilds/omarchy-settings-dev/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: Ryan Hughes pkgname='omarchy-settings-dev' pkgver=4.0.0.r847.g4de185b -pkgrel=1 +pkgrel=2 _pkgver_base=4.0.0 _pkgver_base_tag=v3.8.2 pkgdesc='Omarchy user defaults, /etc/skel content, fonts, plymouth theme, and support helpers (quattro branch tip)' From a692f964677260b8d3b6ae0d8cc916a1f1289b6e Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 26 Sep 2026 13:51:35 +0200 Subject: [PATCH 51/55] Track Hype releases from its git tags and update to 0.4.2 Hype now publishes a GitHub release for every version, so declare its v{pkgver} tags as the upstream feed. The scheduled sync picks up new releases and hashes the tag archive, instead of a hand-written PR each time. This first sync brings Hype to 0.4.2. Co-Authored-By: Claude Opus 5.5 --- pkgbuilds/hype/.omarchy/package.json | 11 ++++++++++- pkgbuilds/hype/PKGBUILD | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/hype/.omarchy/package.json b/pkgbuilds/hype/.omarchy/package.json index 2a9719d..c9c18c0 100644 --- a/pkgbuilds/hype/.omarchy/package.json +++ b/pkgbuilds/hype/.omarchy/package.json @@ -1,3 +1,12 @@ { - "source": "local" + "source": "local", + "upstream": { + "git_tags": "https://github.com/omacom/hype.git", + "tag_pattern": "v{pkgver}", + "sources": { + "any": [ + "https://github.com/omacom/hype/archive/refs/tags/{tag}.tar.gz" + ] + } + } } diff --git a/pkgbuilds/hype/PKGBUILD b/pkgbuilds/hype/PKGBUILD index af2508f..1fb44fb 100644 --- a/pkgbuilds/hype/PKGBUILD +++ b/pkgbuilds/hype/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: David Heinemeier Hansson pkgname=hype -pkgver=0.4.1 +pkgver=0.4.2 pkgrel=1 pkgdesc='Simple Markdown presentations with a visual slide editor' arch=('x86_64' 'aarch64') @@ -24,7 +24,7 @@ depends=( ) makedepends=('gcc' 'make') source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz") -sha256sums=('0724a9d18df7657b50dff21ffe3dec1c107e9191a9e9fd5ad40b56ed9d5d6f51') +sha256sums=('eff1a0d8ff04eca8602aeaf0284d1792c0a881f00ecddafe7578ba5ada33cd64') build() { cd "$srcdir/$pkgname-$pkgver" From 9d3d3740587ba13b08719bc22197b4b4374c792f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 26 Sep 2026 14:38:42 -0400 Subject: [PATCH 52/55] Track ttfx releases from GitHub and build its assembly engine ttfx releases are now published on GitHub only, so sync-upstream picks up new versions through a github watch instead of ttfx's release script editing this recipe. The recipe also points at the repository's current home, and x86_64 builds pull in NASM, which the new assembly engine needs (without it the build silently falls back to the Rust engine). Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01MxJcVYpBxFDam6czK4bGjp --- pkgbuilds/ttfx/.omarchy/package.json | 8 +++++++- pkgbuilds/ttfx/PKGBUILD | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/ttfx/.omarchy/package.json b/pkgbuilds/ttfx/.omarchy/package.json index 2a9719d..94d41cd 100644 --- a/pkgbuilds/ttfx/.omarchy/package.json +++ b/pkgbuilds/ttfx/.omarchy/package.json @@ -1,3 +1,9 @@ { - "source": "local" + "source": "local", + "upstream": { + "watch": { + "github": "omacom/ttfx", + "pattern": "v(?P[0-9]+(?:\\.[0-9]+)*)" + } + } } diff --git a/pkgbuilds/ttfx/PKGBUILD b/pkgbuilds/ttfx/PKGBUILD index 1a386f7..badd739 100644 --- a/pkgbuilds/ttfx/PKGBUILD +++ b/pkgbuilds/ttfx/PKGBUILD @@ -2,13 +2,15 @@ pkgname=ttfx pkgver=0.3.3 -pkgrel=1 +pkgrel=2 pkgdesc="Terminal text effects as a single static binary — Rust port of terminaltexteffects" arch=('x86_64' 'aarch64') -url="https://github.com/omacom-io/ttfx" +url="https://github.com/omacom/ttfx" license=('MIT') depends=('gcc-libs' 'glibc') makedepends=('cargo') +# the x86-64 assembly engine; without NASM the build falls back to pure Rust +makedepends_x86_64=('nasm') options=('!debug') source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz") From bc78d15bcd2b95b66a1074188ec69fa1a19b3448 Mon Sep 17 00:00:00 2001 From: dhh <2741+dhh@users.noreply.github.com> Date: Sat, 26 Sep 2026 19:05:32 +0000 Subject: [PATCH 53/55] chore: sync upstream releases --- pkgbuilds/ttfx/PKGBUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgbuilds/ttfx/PKGBUILD b/pkgbuilds/ttfx/PKGBUILD index badd739..8ef0380 100644 --- a/pkgbuilds/ttfx/PKGBUILD +++ b/pkgbuilds/ttfx/PKGBUILD @@ -1,8 +1,8 @@ # Maintainer: David Heinemeier Hansson pkgname=ttfx -pkgver=0.3.3 -pkgrel=2 +pkgver=0.4.0 +pkgrel=1 pkgdesc="Terminal text effects as a single static binary — Rust port of terminaltexteffects" arch=('x86_64' 'aarch64') url="https://github.com/omacom/ttfx" @@ -14,7 +14,7 @@ makedepends_x86_64=('nasm') options=('!debug') source=("$pkgname-$pkgver.tar.gz::$url/archive/refs/tags/v$pkgver.tar.gz") -sha256sums=('d040da0da2f4a952a367fa3d934ac25999265405f1d2a9f0475625e41211fa7d') +sha256sums=('90a057971973917a45ae1cb2fc795cfaea33afc265180ba4a963172daf9f64ee') prepare() { cd "$pkgname-$pkgver" From 1299a82d796e5355ed3c4c63ed8c5217ea5b278f Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 26 Sep 2026 16:46:01 -0400 Subject: [PATCH 54/55] Package the browsers Omarchy installs from the AUR omarchy-install-browser still reaches for yay to install Chrome, Edge, Brave, Brave Origin and Zen. These were the only packages anywhere in Omarchy's installers and menus that aren't available from core, extra, multilib or OPR. Serving them from OPR means installing any Omarchy browser no longer depends on the AUR being up. Imported once from the AUR with bin/add-package, on the fast ring so browser security releases reach stable promptly, each with a direct vendor watch: - google-chrome: Google's stable apt index - microsoft-edge-stable-bin: Microsoft's stable apt index - brave-bin, brave-origin-bin: Brave's stable apt index. Brave's GitHub releases can't be used because nightlies aren't marked as prereleases there. - zen-browser-bin: GitHub releases (the twilight tag doesn't match) Package names match what Omarchy's scripts already check for, so the existing omarchy-pkg-aur-add calls resolve to the repo package without any change on the Omarchy side. Validation: upstream-watch check reports all five as current. A sync of downgraded copies of zen-browser-bin and brave-origin-bin reproduces the checked-in pkgver and both architectures' checksums. All five build with makepkg on x86_64, and the launchers, desktop IDs and /opt paths match what omarchy-default-browser and omarchy-theme-set-browser use. Co-Authored-By: Claude Opus 5.5 (1M context) --- pkgbuilds/brave-bin/.omarchy/package.json | 15 + pkgbuilds/brave-bin/PKGBUILD | 62 ++ pkgbuilds/brave-bin/brave-bin.sh | 25 + pkgbuilds/brave-bin/brave-browser.desktop | 224 +++++ .../brave-origin-bin/.omarchy/package.json | 15 + pkgbuilds/brave-origin-bin/PKGBUILD | 46 + .../brave-origin-bin/brave-origin-bin.sh | 25 + .../brave-origin-bin/brave-origin.desktop | 222 +++++ pkgbuilds/google-chrome/.nvchecker.toml | 7 + pkgbuilds/google-chrome/.omarchy/package.json | 15 + pkgbuilds/google-chrome/PKGBUILD | 76 ++ pkgbuilds/google-chrome/eula_text.html | 901 ++++++++++++++++++ .../google-chrome/google-chrome-stable.sh | 11 + pkgbuilds/google-chrome/google-chrome.install | 14 + .../microsoft-edge-stable-bin/.nvchecker.toml | 4 + .../.omarchy/package.json | 15 + ...se Terms - Standalone (free) Use Terms.pdf | Bin 0 -> 87033 bytes pkgbuilds/microsoft-edge-stable-bin/PKGBUILD | 69 ++ .../microsoft-edge-stable.install | 22 + .../microsoft-edge-stable.sh | 15 + pkgbuilds/zen-browser-bin/.nvchecker.toml | 3 + .../zen-browser-bin/.omarchy/package.json | 14 + pkgbuilds/zen-browser-bin/PKGBUILD | 74 ++ pkgbuilds/zen-browser-bin/policies.json | 6 + pkgbuilds/zen-browser-bin/zen-browser.sh | 3 + pkgbuilds/zen-browser-bin/zen.desktop | 697 ++++++++++++++ 26 files changed, 2580 insertions(+) create mode 100644 pkgbuilds/brave-bin/.omarchy/package.json create mode 100644 pkgbuilds/brave-bin/PKGBUILD create mode 100644 pkgbuilds/brave-bin/brave-bin.sh create mode 100644 pkgbuilds/brave-bin/brave-browser.desktop create mode 100644 pkgbuilds/brave-origin-bin/.omarchy/package.json create mode 100644 pkgbuilds/brave-origin-bin/PKGBUILD create mode 100755 pkgbuilds/brave-origin-bin/brave-origin-bin.sh create mode 100644 pkgbuilds/brave-origin-bin/brave-origin.desktop create mode 100644 pkgbuilds/google-chrome/.nvchecker.toml create mode 100644 pkgbuilds/google-chrome/.omarchy/package.json create mode 100644 pkgbuilds/google-chrome/PKGBUILD create mode 100644 pkgbuilds/google-chrome/eula_text.html create mode 100644 pkgbuilds/google-chrome/google-chrome-stable.sh create mode 100644 pkgbuilds/google-chrome/google-chrome.install create mode 100644 pkgbuilds/microsoft-edge-stable-bin/.nvchecker.toml create mode 100644 pkgbuilds/microsoft-edge-stable-bin/.omarchy/package.json create mode 100644 pkgbuilds/microsoft-edge-stable-bin/Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf create mode 100644 pkgbuilds/microsoft-edge-stable-bin/PKGBUILD create mode 100644 pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.install create mode 100644 pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.sh create mode 100644 pkgbuilds/zen-browser-bin/.nvchecker.toml create mode 100644 pkgbuilds/zen-browser-bin/.omarchy/package.json create mode 100644 pkgbuilds/zen-browser-bin/PKGBUILD create mode 100644 pkgbuilds/zen-browser-bin/policies.json create mode 100755 pkgbuilds/zen-browser-bin/zen-browser.sh create mode 100644 pkgbuilds/zen-browser-bin/zen.desktop diff --git a/pkgbuilds/brave-bin/.omarchy/package.json b/pkgbuilds/brave-bin/.omarchy/package.json new file mode 100644 index 0000000..5528ad1 --- /dev/null +++ b/pkgbuilds/brave-bin/.omarchy/package.json @@ -0,0 +1,15 @@ +{ + "source": "local", + "release_ring": "fast", + "upstream": { + "watch": { + "debian": "https://brave-browser-apt-release.s3.brave.com/dists/stable/main/binary-amd64/Packages", + "package": "brave-browser", + "pattern": "(?P[0-9]+(?:\\.[0-9]+)*)" + } + }, + "origin": { + "aur": "brave-bin", + "commit": "d86e5479e163dac19d7ace3de472710e6eb06eea" + } +} diff --git a/pkgbuilds/brave-bin/PKGBUILD b/pkgbuilds/brave-bin/PKGBUILD new file mode 100644 index 0000000..bc22fcf --- /dev/null +++ b/pkgbuilds/brave-bin/PKGBUILD @@ -0,0 +1,62 @@ +# Maintainer: brave +# Contributor: Caleb Maclennan +# Contributor: José Miguel Sarasola +# Contributor: Như Bảo Trương <28810481+nhubaotruong@users.noreply.github.com> +# Contributor: Andrés Rodríguez +# Contributor: Jacob Mischka +# Contributor: Manuel Mazzuola +# Contributor: Simón Oroño +# Contributor: now-im +# Contributor: Giusy Digital + +pkgname=brave-bin +pkgver=1.96.59 +pkgrel=1 +epoch=1 +pkgdesc='Web browser that blocks ads and trackers by default (binary release)' +arch=(x86_64 aarch64) +url=https://brave.com +license=(MPL2 BSD custom:chromium) +depends=(alsa-lib + gtk3 + libxss + nss + ttf-font) +optdepends=('cups: Printer support' + 'libgnome-keyring: Enable GNOME keyring support' + 'libnotify: Native notification support') +provides=("${pkgname%-bin}=$pkgver" 'brave-browser') +conflicts=("${pkgname%-bin}") +options=(!strip) +source=($pkgname.sh brave-browser.desktop) +source_x86_64=(${pkgname}-${pkgver}-x86_64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-browser-${pkgver}-linux-amd64.zip) +source_aarch64=(${pkgname}-${pkgver}-aarch64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-browser-${pkgver}-linux-arm64.zip) + +noextract=(${pkgname}-${pkgver}-x86_64.zip ${pkgname}-${pkgver}-aarch64.zip) +sha256sums=('75a87dd17b42fcc6f27adfd16c82bed1c08e9251b07d2012f8d49f7412fa1d00' + 'c07276b69c7304981525ecb022f92daf7ae125a4fb05ac3442157b50826e257a') +sha256sums_x86_64=('ee36d0fb939ebdf1922d47d7b4cb8879507733b2a76605a31bfe9dede3297139') +sha256sums_aarch64=('faa8a26f1e7c0c3b8632633503f82e571a798212d8e6fe9baba77f0c73509867') + +prepare() { + mkdir -p brave + bsdtar -xf "$pkgname-$pkgver-$CARCH.zip" -C brave + chmod +x brave/brave +} + +package() { + install -dm0755 "$pkgdir/opt" + cp -a brave "$pkgdir/opt/$pkgname" + + # allow firejail users to get the suid sandbox working + chmod 4755 "$pkgdir/opt/brave-bin/chrome-sandbox" + + install -Dm0755 "$pkgname.sh" "$pkgdir/usr/bin/brave" + install -Dm0644 -t "$pkgdir/usr/share/applications/" "brave-browser.desktop" + install -Dm0644 -t "$pkgdir/usr/share/licenses/$pkgname/" brave/LICENSE + pushd "$pkgdir/usr/" + for size in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do + install -Dm0644 "$pkgdir/opt/$pkgname/product_logo_${size/x*/}.png" \ + "share/icons/hicolor/$size/apps/brave-desktop.png" + done +} diff --git a/pkgbuilds/brave-bin/brave-bin.sh b/pkgbuilds/brave-bin/brave-bin.sh new file mode 100644 index 0000000..31c435c --- /dev/null +++ b/pkgbuilds/brave-bin/brave-bin.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"${HOME}/.config"}" + +CONF_FILE="${XDG_CONFIG_HOME}/brave-flags.conf" + +if + test -f "${CONF_FILE}" +then + mapfile -t CONF_LIST < "${CONF_FILE}" +fi + +for CONF_LINE in "${CONF_LIST[@]}" +do + if ! [[ + "${CONF_LINE}" =~ ^[[:space:]]*(#|$) + ]] + then + FLAG_LIST+=("${CONF_LINE}") + fi +done + +export CHROME_VERSION_EXTRA='stable' + +exec /opt/brave-bin/brave "${FLAG_LIST[@]}" "${@}" diff --git a/pkgbuilds/brave-bin/brave-browser.desktop b/pkgbuilds/brave-bin/brave-browser.desktop new file mode 100644 index 0000000..7bc7312 --- /dev/null +++ b/pkgbuilds/brave-bin/brave-browser.desktop @@ -0,0 +1,224 @@ +[Desktop Entry] +Version=1.0 +Name=Brave +# Only KDE 4 seems to use GenericName, so we reuse the KDE strings. +# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413. +GenericName=Web Browser +GenericName[ar]=متصÙ�Ø­ الشبكة +GenericName[bg]=Уеб браузър +GenericName[ca]=Navegador web +GenericName[cs]=WWW prohlížeÄ� +GenericName[da]=Browser +GenericName[de]=Web-Browser +GenericName[el]=ΠεÏ�ιηγητής ιστοÏ� +GenericName[en_GB]=Web Browser +GenericName[es]=Navegador web +GenericName[et]=Veebibrauser +GenericName[fi]=WWW-selain +GenericName[fr]=Navigateur Web +GenericName[gu]=વેબ બà«�રાઉàª�ર +GenericName[he]=דפדפן ×�ינטרנט +GenericName[hi]=वेब बà¥�राउज़र +GenericName[hu]=WebböngészÅ‘ +GenericName[it]=Browser Web +GenericName[ja]=ウェブブラウザ +GenericName[kn]=ಜಾಲ ವೀಕà³�ಷಕ +GenericName[ko]=웹 브ë�¼ìš°ì € +GenericName[lt]=Žiniatinklio narÅ¡yklÄ— +GenericName[lv]=TÄ«mekļa pÄ�rlÅ«ks +GenericName[ml]=വെബàµ� à´¬àµ�രൌസരàµ�â€� +GenericName[mr]=वेब बà¥�राऊजर +GenericName[nb]=Nettleser +GenericName[nl]=Webbrowser +GenericName[pl]=PrzeglÄ…darka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador da Internet +GenericName[ro]=Navigator de Internet +GenericName[ru]=Веб-браузер +GenericName[sl]=Spletni brskalnik +GenericName[sv]=Webbläsare +GenericName[ta]=இணைய உலாவி +GenericName[th]=เว็บเบราว์เซอร์ +GenericName[tr]=Web Tarayıcı +GenericName[uk]=Ð�авігатор Тенет +GenericName[zh_CN]=网页æµ�览器 +GenericName[zh_HK]=ç¶²é �ç€�覽器 +GenericName[zh_TW]=ç¶²é �ç€�覽器 +# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1. +GenericName[bn]=ওয়েব বà§�রাউজার +GenericName[fil]=Web Browser +GenericName[hr]=Web preglednik +GenericName[id]=Browser Web +GenericName[or]=ଓà­�ବେବ ବà­�ରାଉଜର +GenericName[sk]=WWW prehliadaÄ� +GenericName[sr]=Интернет прегледник +GenericName[te]=మహాతల à°…à°¨à±�వేషి +GenericName[vi]=Bá»™ duyệt Web +# Gnome and KDE 3 uses Comment. +Comment=Access the Internet +Comment[ar]=الدخول إلى الإنترنت +Comment[bg]=ДоÑ�тъп до интернет +Comment[bn]=ইনà§�টারনেটটি অà§�যাকà§�সেস করà§�ন +Comment[ca]=Accedeix a Internet +Comment[cs]=Přístup k internetu +Comment[da]=FÃ¥ adgang til internettet +Comment[de]=Internetzugriff +Comment[el]=ΠÏ�όσβαση στο Διαδίκτυο +Comment[en_GB]=Access the Internet +Comment[es]=Accede a Internet. +Comment[et]=Pääs Internetti +Comment[fi]=Käytä internetiä +Comment[fil]=I-access ang Internet +Comment[fr]=Accéder à Internet +Comment[gu]=ઇંટરનેટ àª�કà«�સેસ કરો +Comment[he]=גישה ×�ל ×”×�ינטרנט +Comment[hi]=इंटरनेट तक पहà¥�ंच सà¥�थापित करें +Comment[hr]=Pristup Internetu +Comment[hu]=Internetelérés +Comment[id]=Akses Internet +Comment[it]=Accesso a Internet +Comment[ja]=インターãƒ�ットã�«ã‚¢ã‚¯ã‚»ã‚¹ +Comment[kn]=ಇಂಟರà³�ನೆಟà³� ಅನà³�ನà³� ಪà³�ರವೇಶಿಸಿ +Comment[ko]=ì�¸í„°ë„· ì—°ê²° +Comment[lt]=Interneto prieiga +Comment[lv]=Piekļūt internetam +Comment[ml]=ഇനàµ�റരàµ�â€�‌നെറàµ�à´±àµ� ആകàµ�‌സസàµ� ചെയàµ�à´¯àµ�à´• +Comment[mr]=इंटरनेटमधà¥�ये पà¥�रवेश करा +Comment[nb]=GÃ¥ til Internett +Comment[nl]=Verbinding maken met internet +Comment[or]=ଇଣà­�ଟରà­�ନେଟà­� ପà­�ରବେଶ କରନà­�ତà­� +Comment[pl]=Skorzystaj z internetu +Comment[pt]=Aceder à Internet +Comment[pt_BR]=Acessar a internet +Comment[ro]=AccesaÅ£i Internetul +Comment[ru]=ДоÑ�туп в Интернет +Comment[sk]=Prístup do siete Internet +Comment[sl]=Dostop do interneta +Comment[sr]=ПриÑ�тупите Интернету +Comment[sv]=GÃ¥ ut pÃ¥ Internet +Comment[ta]=இணையதà¯�தை அணà¯�கà¯�தலà¯� +Comment[te]=ఇంటరà±�నెటà±�‌నà±� ఆకà±�సెసà±� చెయà±�యండి +Comment[th]=เข้าถึงอินเทอร์เน็ต +Comment[tr]=İnternet'e eriÅŸin +Comment[uk]=ДоÑ�туп до Інтернету +Comment[vi]=Truy cập Internet +Comment[zh_CN]=访问互è�”网 +Comment[zh_HK]=連線到網際網路 +Comment[zh_TW]=連線到網際網路 +StartupNotify=true +StartupWMClass=brave-browser +TryExec=brave +Exec=brave %U +Terminal=false +Icon=brave-desktop +Type=Application +Categories=Network;WebBrowser; +MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ipfs;x-scheme-handler/ipns; +Actions=new-window;new-private-window; + +[Desktop Action new-window] +Name=New Window +Name[am]=አዲስ መስኮት +Name[ar]=ناÙ�ذة جديدة +Name[bg]=Ð�ов прозорец +Name[bn]=নতà§�ন উইনà§�ডো +Name[ca]=Finestra nova +Name[cs]=Nové okno +Name[da]=Nyt vindue +Name[de]=Neues Fenster +Name[el]=Î�έο ΠαÏ�άθυÏ�ο +Name[en_GB]=New Window +Name[es]=Nueva ventana +Name[et]=Uus aken +Name[fa]=پنجره جدید +Name[fi]=Uusi ikkuna +Name[fil]=New Window +Name[fr]=Nouvelle fenêtre +Name[gu]=નવી વિંડો +Name[hi]=नई विंडो +Name[hr]=Novi prozor +Name[hu]=Új ablak +Name[id]=Jendela Baru +Name[it]=Nuova finestra +Name[iw]=חלון חדש +Name[ja]=æ–°è¦�ウインドウ +Name[kn]=ಹೊಸ ವಿಂಡೊ +Name[ko]=새 ì°½ +Name[lt]=Naujas langas +Name[lv]=Jauns logs +Name[ml]=à´ªàµ�തിയ വിനàµ�â€�ഡോ +Name[mr]=नवीन विंडो +Name[nl]=Nieuw venster +Name[no]=Nytt vindu +Name[pl]=Nowe okno +Name[pt]=Nova janela +Name[pt_BR]=Nova janela +Name[ro]=Fereastră nouă +Name[ru]=Ð�овое окно +Name[sk]=Nové okno +Name[sl]=Novo okno +Name[sr]=Ð�ови прозор +Name[sv]=Nytt fönster +Name[sw]=Dirisha Jipya +Name[ta]=பà¯�திய சாளரமà¯� +Name[te]=à°•à±�రొతà±�à°¤ విండో +Name[th]=หน้าต่างใหม่ +Name[tr]=Yeni Pencere +Name[uk]=Ð�ове вікно +Name[vi]=Cá»­a sổ Má»›i +Name[zh_CN]=新建窗å�£ +Name[zh_TW]=開新視窗 +Exec=brave + +[Desktop Action new-private-window] +Name=New Incognito Window +Name[ar]=ناÙ�ذة جديدة للتصÙ�Ø­ المتخÙ�ÙŠ +Name[bg]=Ð�ов прозорец „инкогнито“ +Name[bn]=নতà§�ন ছদà§�মবেশী উইনà§�ডো +Name[ca]=Finestra d'incògnit nova +Name[cs]=Nové anonymní okno +Name[da]=Nyt inkognitovindue +Name[de]=Neues Inkognito-Fenster +Name[el]=Î�έο παÏ�άθυÏ�ο για ανώνυμη πεÏ�ιήγηση +Name[en_GB]=New Incognito window +Name[es]=Nueva ventana de incógnito +Name[et]=Uus inkognito aken +Name[fa]=پنجره جدید حالت ناشناس +Name[fi]=Uusi incognito-ikkuna +Name[fil]=Bagong Incognito window +Name[fr]=Nouvelle fenêtre de navigation privée +Name[gu]=નવી છà«�પી વિંડો +Name[hi]=नई गà¥�पà¥�त विंडो +Name[hr]=Novi anoniman prozor +Name[hu]=Új Inkognitóablak +Name[id]=Jendela Penyamaran baru +Name[it]=Nuova finestra di navigazione in incognito +Name[iw]=חלון חדש לגלישה בסתר +Name[ja]=æ–°ã�—ã�„シークレット ウィンドウ +Name[kn]=ಹೊಸ ಅಜà³�ಞಾತ ವಿಂಡೋ +Name[ko]=새 시í�¬ë¦¿ ì°½ +Name[lt]=Naujas inkognito langas +Name[lv]=Jauns inkognito režīma logs +Name[ml]=à´ªàµ�തിയ വേഷ à´ªàµ�à´°à´šàµ�ഛനàµ�à´¨ വിനàµ�â€�ഡോ +Name[mr]=नवीन गà¥�पà¥�त विंडो +Name[nl]=Nieuw incognitovenster +Name[no]=Nytt inkognitovindu +Name[pl]=Nowe okno incognito +Name[pt]=Nova janela de navegação anónima +Name[pt_BR]=Nova janela anônima +Name[ro]=Fereastră nouă incognito +Name[ru]=Ð�овое окно в режиме инкогнито +Name[sk]=Nové okno inkognito +Name[sl]=Novo okno brez beleženja zgodovine +Name[sr]=Ð�ови прозор за прегледање без архивирања +Name[sv]=Nytt inkognitofönster +Name[ta]=பà¯�திய மறைநிலைசà¯� சாளரமà¯� +Name[te]=à°•à±�రొతà±�à°¤ à°…à°œà±�ఞాత విండో +Name[th]=หน้าต่างใหม่ที่ไม่ระบุตัวตน +Name[tr]=Yeni Gizli pencere +Name[uk]=Ð�ове вікно в режимі анонімного переглÑ�ду +Name[vi]=Cá»­a sổ ẩn danh má»›i +Name[zh_CN]=新建éš�身窗å�£ +Name[zh_TW]=新增無痕å¼�視窗 +Exec=brave --incognito +MimeType=x-scheme-handler/unknown;x-scheme-handler/about;text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https; diff --git a/pkgbuilds/brave-origin-bin/.omarchy/package.json b/pkgbuilds/brave-origin-bin/.omarchy/package.json new file mode 100644 index 0000000..c9d5160 --- /dev/null +++ b/pkgbuilds/brave-origin-bin/.omarchy/package.json @@ -0,0 +1,15 @@ +{ + "source": "local", + "release_ring": "fast", + "upstream": { + "watch": { + "debian": "https://brave-browser-apt-release.s3.brave.com/dists/stable/main/binary-amd64/Packages", + "package": "brave-origin", + "pattern": "(?P[0-9]+(?:\\.[0-9]+)*)" + } + }, + "origin": { + "aur": "brave-origin-bin", + "commit": "f2daecf7b7576cd445094ed09c3c783619ca0eb2" + } +} diff --git a/pkgbuilds/brave-origin-bin/PKGBUILD b/pkgbuilds/brave-origin-bin/PKGBUILD new file mode 100644 index 0000000..8cf617b --- /dev/null +++ b/pkgbuilds/brave-origin-bin/PKGBUILD @@ -0,0 +1,46 @@ +# Maintainer: brave + +pkgname=brave-origin-bin +pkgver=1.96.59 +pkgrel=1 +epoch=1 +pkgdesc='The minimalist browser from the makers of Brave (binary release).' +arch=(x86_64 aarch64) +url=https://brave.com/origin/download +license=('MPL2') +depends=(alsa-lib gtk3 libxss nss ttf-font) +optdepends=('cups: Printer support' + 'libgnome-keyring: Enable GNOME keyring support' + 'libnotify: Native notification support') +provides=("$pkgname" "${pkgname%-bin}") +conflicts=("${pkgname%-bin}") +options=(!strip) +source=($pkgname.sh "${pkgname%-bin}.desktop") +source_x86_64=("${pkgname}-${pkgver}-x86_64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-origin-${pkgver}-linux-amd64.zip") +source_aarch64=("${pkgname}-${pkgver}-aarch64.zip::https://github.com/brave/brave-browser/releases/download/v${pkgver}/brave-origin-${pkgver}-linux-arm64.zip") + +noextract=("${pkgname}-${pkgver}-x86_64.zip" "${pkgname}-${pkgver}-aarch64.zip") +sha256sums=('5ff70ee473f35c2fc7642c422c8abe20aaac0d7cc30a3292744eb9fbeafba1bd' + 'c70bc71c696b6764247070375ae111bd76c8bad9c7bda4d46e03975b95571a8a') +sha256sums_x86_64=('ad71abea5326d15bbe813a1e9592bcf2383f2ecc083a432313ca80b4436d3797') +sha256sums_aarch64=('68d1fb922e0ad25099081a32a7f0611f2657345726590b697eaf6bbb820848ee') + +prepare() { + mkdir -p brave + bsdtar -xf "$pkgname-$pkgver-$CARCH.zip" -C brave + chmod +x brave/brave +} + +package() { + install -dm0755 "$pkgdir/opt" + cp -a brave "$pkgdir/opt/$pkgname" + chmod 4755 "$pkgdir/opt/$pkgname/chrome-sandbox" + install -Dm0755 "$pkgname.sh" "$pkgdir/usr/bin/${pkgname%-bin}" + install -Dm0644 -t "$pkgdir/usr/share/applications/" "${pkgname%-bin}.desktop" + install -Dm0644 -t "$pkgdir/usr/share/licenses/$pkgname/" brave/LICENSE + pushd "$pkgdir/usr/" + for size in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do + install -Dm0644 "$pkgdir/opt/$pkgname/product_logo_${size/x*/}.png" \ + "share/icons/hicolor/$size/apps/brave-origin.png" + done +} diff --git a/pkgbuilds/brave-origin-bin/brave-origin-bin.sh b/pkgbuilds/brave-origin-bin/brave-origin-bin.sh new file mode 100755 index 0000000..67a5e73 --- /dev/null +++ b/pkgbuilds/brave-origin-bin/brave-origin-bin.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-"${HOME}/.config"}" + +CONF_FILE="${XDG_CONFIG_HOME}/brave-origin-flags.conf" + +if + test -f "${CONF_FILE}" +then + mapfile -t CONF_LIST < "${CONF_FILE}" +fi + +for CONF_LINE in "${CONF_LIST[@]}" +do + if ! [[ + "${CONF_LINE}" =~ ^[[:space:]]*(#|$) + ]] + then + FLAG_LIST+=("${CONF_LINE}") + fi +done + +export CHROME_VERSION_EXTRA='stable' + +exec /opt/brave-origin-bin/brave-origin "${FLAG_LIST[@]}" "${@}" diff --git a/pkgbuilds/brave-origin-bin/brave-origin.desktop b/pkgbuilds/brave-origin-bin/brave-origin.desktop new file mode 100644 index 0000000..d16f1fb --- /dev/null +++ b/pkgbuilds/brave-origin-bin/brave-origin.desktop @@ -0,0 +1,222 @@ +[Desktop Entry] +Version=1.0 +Name=Brave Origin +# Only KDE 4 seems to use GenericName, so we reuse the KDE strings. +# From Ubuntu's language-pack-kde-XX-base packages, version 9.04-20090413. +GenericName=Web Browser +GenericName[ar]=متصÙ�Ø­ الشبكة +GenericName[bg]=Уеб браузър +GenericName[ca]=Navegador web +GenericName[cs]=WWW prohlížeÄ� +GenericName[da]=Browser +GenericName[de]=Web-Browser +GenericName[el]=ΠεÏ�ιηγητής ιστοÏ� +GenericName[en_GB]=Web Browser +GenericName[es]=Navegador web +GenericName[et]=Veebibrauser +GenericName[fi]=WWW-selain +GenericName[fr]=Navigateur Web +GenericName[gu]=વેબ બà«�રાઉàª�ર +GenericName[he]=דפדפן ×�ינטרנט +GenericName[hi]=वेब बà¥�राउज़र +GenericName[hu]=WebböngészÅ‘ +GenericName[it]=Browser Web +GenericName[ja]=ウェブブラウザ +GenericName[kn]=ಜಾಲ ವೀಕà³�ಷಕ +GenericName[ko]=웹 브ë�¼ìš°ì € +GenericName[lt]=Žiniatinklio narÅ¡yklÄ— +GenericName[lv]=TÄ«mekļa pÄ�rlÅ«ks +GenericName[ml]=വെബàµ� à´¬àµ�രൌസരàµ�â€� +GenericName[mr]=वेब बà¥�राऊजर +GenericName[nb]=Nettleser +GenericName[nl]=Webbrowser +GenericName[pl]=PrzeglÄ…darka WWW +GenericName[pt]=Navegador Web +GenericName[pt_BR]=Navegador da Internet +GenericName[ro]=Navigator de Internet +GenericName[ru]=Веб-браузер +GenericName[sl]=Spletni brskalnik +GenericName[sv]=Webbläsare +GenericName[ta]=இணைய உலாவி +GenericName[th]=เว็บเบราว์เซอร์ +GenericName[tr]=Web Tarayıcı +GenericName[uk]=Ð�авігатор Тенет +GenericName[zh_CN]=网页æµ�览器 +GenericName[zh_HK]=ç¶²é �ç€�覽器 +GenericName[zh_TW]=ç¶²é �ç€�覽器 +# Not translated in KDE, from Epiphany 2.26.1-0ubuntu1. +GenericName[bn]=ওয়েব বà§�রাউজার +GenericName[fil]=Web Browser +GenericName[hr]=Web preglednik +GenericName[id]=Browser Web +GenericName[or]=ଓà­�ବେବ ବà­�ରାଉଜର +GenericName[sk]=WWW prehliadaÄ� +GenericName[sr]=Интернет прегледник +GenericName[te]=మహాతల à°…à°¨à±�వేషి +GenericName[vi]=Bá»™ duyệt Web +# Gnome and KDE 3 uses Comment. +Comment=Access the Internet +Comment[ar]=الدخول إلى الإنترنت +Comment[bg]=ДоÑ�тъп до интернет +Comment[bn]=ইনà§�টারনেটটি অà§�যাকà§�সেস করà§�ন +Comment[ca]=Accedeix a Internet +Comment[cs]=Přístup k internetu +Comment[da]=FÃ¥ adgang til internettet +Comment[de]=Internetzugriff +Comment[el]=ΠÏ�όσβαση στο Διαδίκτυο +Comment[en_GB]=Access the Internet +Comment[es]=Accede a Internet. +Comment[et]=Pääs Internetti +Comment[fi]=Käytä internetiä +Comment[fil]=I-access ang Internet +Comment[fr]=Accéder à Internet +Comment[gu]=ઇંટરનેટ àª�કà«�સેસ કરો +Comment[he]=גישה ×�ל ×”×�ינטרנט +Comment[hi]=इंटरनेट तक पहà¥�ंच सà¥�थापित करें +Comment[hr]=Pristup Internetu +Comment[hu]=Internetelérés +Comment[id]=Akses Internet +Comment[it]=Accesso a Internet +Comment[ja]=インターãƒ�ットã�«ã‚¢ã‚¯ã‚»ã‚¹ +Comment[kn]=ಇಂಟರà³�ನೆಟà³� ಅನà³�ನà³� ಪà³�ರವೇಶಿಸಿ +Comment[ko]=ì�¸í„°ë„· ì—°ê²° +Comment[lt]=Interneto prieiga +Comment[lv]=Piekļūt internetam +Comment[ml]=ഇനàµ�റരàµ�â€�‌നെറàµ�à´±àµ� ആകàµ�‌സസàµ� ചെയàµ�à´¯àµ�à´• +Comment[mr]=इंटरनेटमधà¥�ये पà¥�रवेश करा +Comment[nb]=GÃ¥ til Internett +Comment[nl]=Verbinding maken met internet +Comment[or]=ଇଣà­�ଟରà­�ନେଟà­� ପà­�ରବେଶ କରନà­�ତà­� +Comment[pl]=Skorzystaj z internetu +Comment[pt]=Aceder à Internet +Comment[pt_BR]=Acessar a internet +Comment[ro]=AccesaÅ£i Internetul +Comment[ru]=ДоÑ�туп в Интернет +Comment[sk]=Prístup do siete Internet +Comment[sl]=Dostop do interneta +Comment[sr]=ПриÑ�тупите Интернету +Comment[sv]=GÃ¥ ut pÃ¥ Internet +Comment[ta]=இணையதà¯�தை அணà¯�கà¯�தலà¯� +Comment[te]=ఇంటరà±�నెటà±�‌నà±� ఆకà±�సెసà±� చెయà±�యండి +Comment[th]=เข้าถึงอินเทอร์เน็ต +Comment[tr]=İnternet'e eriÅŸin +Comment[uk]=ДоÑ�туп до Інтернету +Comment[vi]=Truy cập Internet +Comment[zh_CN]=访问互è�”网 +Comment[zh_HK]=連線到網際網路 +Comment[zh_TW]=連線到網際網路 +StartupNotify=true +StartupWMClass=brave-origin +Exec=brave-origin %U +Terminal=false +Icon=brave-origin +Type=Application +Categories=Network;WebBrowser; +MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/chromium; +Actions=new-window;new-private-window; + +[Desktop Action new-window] +Name=New Window +Name[am]=አዲስ መስኮት +Name[ar]=ناÙ�ذة جديدة +Name[bg]=Ð�ов прозорец +Name[bn]=নতà§�ন উইনà§�ডো +Name[ca]=Finestra nova +Name[cs]=Nové okno +Name[da]=Nyt vindue +Name[de]=Neues Fenster +Name[el]=Î�έο ΠαÏ�άθυÏ�ο +Name[en_GB]=New Window +Name[es]=Nueva ventana +Name[et]=Uus aken +Name[fa]=پنجره جدید +Name[fi]=Uusi ikkuna +Name[fil]=New Window +Name[fr]=Nouvelle fenêtre +Name[gu]=નવી વિંડો +Name[hi]=नई विंडो +Name[hr]=Novi prozor +Name[hu]=Új ablak +Name[id]=Jendela Baru +Name[it]=Nuova finestra +Name[iw]=חלון חדש +Name[ja]=æ–°è¦�ウインドウ +Name[kn]=ಹೊಸ ವಿಂಡೊ +Name[ko]=새 ì°½ +Name[lt]=Naujas langas +Name[lv]=Jauns logs +Name[ml]=à´ªàµ�തിയ വിനàµ�â€�ഡോ +Name[mr]=नवीन विंडो +Name[nl]=Nieuw venster +Name[no]=Nytt vindu +Name[pl]=Nowe okno +Name[pt]=Nova janela +Name[pt_BR]=Nova janela +Name[ro]=Fereastră nouă +Name[ru]=Ð�овое окно +Name[sk]=Nové okno +Name[sl]=Novo okno +Name[sr]=Ð�ови прозор +Name[sv]=Nytt fönster +Name[sw]=Dirisha Jipya +Name[ta]=பà¯�திய சாளரமà¯� +Name[te]=à°•à±�రొతà±�à°¤ విండో +Name[th]=หน้าต่างใหม่ +Name[tr]=Yeni Pencere +Name[uk]=Ð�ове вікно +Name[vi]=Cá»­a sổ Má»›i +Name[zh_CN]=新建窗å�£ +Name[zh_TW]=開新視窗 +Exec=brave-origin + +[Desktop Action new-private-window] +Name=New Incognito Window +Name[ar]=ناÙ�ذة جديدة للتصÙ�Ø­ المتخÙ�ÙŠ +Name[bg]=Ð�ов прозорец „инкогнито“ +Name[bn]=নতà§�ন ছদà§�মবেশী উইনà§�ডো +Name[ca]=Finestra d'incògnit nova +Name[cs]=Nové anonymní okno +Name[da]=Nyt inkognitovindue +Name[de]=Neues Inkognito-Fenster +Name[el]=Î�έο παÏ�άθυÏ�ο για ανώνυμη πεÏ�ιήγηση +Name[en_GB]=New Incognito window +Name[es]=Nueva ventana de incógnito +Name[et]=Uus inkognito aken +Name[fa]=پنجره جدید حالت ناشناس +Name[fi]=Uusi incognito-ikkuna +Name[fil]=Bagong Incognito window +Name[fr]=Nouvelle fenêtre de navigation privée +Name[gu]=નવી છà«�પી વિંડો +Name[hi]=नई गà¥�पà¥�त विंडो +Name[hr]=Novi anoniman prozor +Name[hu]=Új Inkognitóablak +Name[id]=Jendela Penyamaran baru +Name[it]=Nuova finestra di navigazione in incognito +Name[iw]=חלון חדש לגלישה בסתר +Name[ja]=æ–°ã�—ã�„シークレット ウィンドウ +Name[kn]=ಹೊಸ ಅಜà³�ಞಾತ ವಿಂಡೋ +Name[ko]=새 시í�¬ë¦¿ ì°½ +Name[lt]=Naujas inkognito langas +Name[lv]=Jauns inkognito režīma logs +Name[ml]=à´ªàµ�തിയ വേഷ à´ªàµ�à´°à´šàµ�ഛനàµ�à´¨ വിനàµ�â€�ഡോ +Name[mr]=नवीन गà¥�पà¥�त विंडो +Name[nl]=Nieuw incognitovenster +Name[no]=Nytt inkognitovindu +Name[pl]=Nowe okno incognito +Name[pt]=Nova janela de navegação anónima +Name[pt_BR]=Nova janela anônima +Name[ro]=Fereastră nouă incognito +Name[ru]=Ð�овое окно в режиме инкогнито +Name[sk]=Nové okno inkognito +Name[sl]=Novo okno brez beleženja zgodovine +Name[sr]=Ð�ови прозор за прегледање без архивирања +Name[sv]=Nytt inkognitofönster +Name[ta]=பà¯�திய மறைநிலைசà¯� சாளரமà¯� +Name[te]=à°•à±�రొతà±�à°¤ à°…à°œà±�ఞాత విండో +Name[th]=หน้าต่างใหม่ที่ไม่ระบุตัวตน +Name[tr]=Yeni Gizli pencere +Name[uk]=Ð�ове вікно в режимі анонімного переглÑ�ду +Name[vi]=Cá»­a sổ ẩn danh má»›i +Name[zh_CN]=新建éš�身窗å�£ +Name[zh_TW]=新增無痕å¼�視窗 +Exec=brave-origin --incognito diff --git a/pkgbuilds/google-chrome/.nvchecker.toml b/pkgbuilds/google-chrome/.nvchecker.toml new file mode 100644 index 0000000..55dc5e0 --- /dev/null +++ b/pkgbuilds/google-chrome/.nvchecker.toml @@ -0,0 +1,7 @@ +[google-chrome] +source = "apt" +mirror = "https://dl.google.com/linux/chrome/deb/" +pkg = "google-chrome-stable" +suite = "stable" +repo = "main" +strip_release = true diff --git a/pkgbuilds/google-chrome/.omarchy/package.json b/pkgbuilds/google-chrome/.omarchy/package.json new file mode 100644 index 0000000..dbc6199 --- /dev/null +++ b/pkgbuilds/google-chrome/.omarchy/package.json @@ -0,0 +1,15 @@ +{ + "source": "local", + "release_ring": "fast", + "upstream": { + "watch": { + "debian": "https://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages", + "package": "google-chrome-stable", + "pattern": "(?P[0-9]+(?:\\.[0-9]+)*)-1" + } + }, + "origin": { + "aur": "google-chrome", + "commit": "6bd49a411277b3f9bcc9e58ce0c579292db75804" + } +} diff --git a/pkgbuilds/google-chrome/PKGBUILD b/pkgbuilds/google-chrome/PKGBUILD new file mode 100644 index 0000000..cc2f4fc --- /dev/null +++ b/pkgbuilds/google-chrome/PKGBUILD @@ -0,0 +1,76 @@ +# Maintainer: Christian Heusel +# Contributor: Knut Ahlers +# Contributor: Det +# Contributor: t3ddy, Lex Rivera aka x-demon, ruario, Abdullah + +# Check for new Linux releases in: http://googlechromereleases.blogspot.com/search/label/Stable%20updates +# or use: $ curl -sSf https://dl.google.com/linux/chrome/deb/dists/stable/main/binary-amd64/Packages | grep -A1 "Package: google-chrome-stable" | awk '/Version/{print $2}' | cut -d '-' -f1 + +pkgname=google-chrome +pkgver=154.0.8037.57 +pkgrel=1 +pkgdesc="The popular web browser by Google (Stable Channel)" +arch=( + 'x86_64' + 'aarch64' +) +url="https://www.google.com/chrome" +license=('custom:chrome') +depends=( + 'alsa-lib' + 'gtk3' + 'libcups' + 'libxss' + 'libxtst' + 'nss' + 'ttf-liberation' + 'xdg-utils' +) +optdepends=( + 'pipewire: WebRTC desktop sharing under Wayland' + 'kdialog: for file dialogs in KDE' + 'gnome-keyring: for storing passwords in GNOME keyring' + 'kwallet: for storing passwords in KWallet' +) +options=('!emptydirs' '!strip') +install=$pkgname.install +_channel=stable +source=('eula_text.html' + "google-chrome-$_channel.sh") +sha512sums=('a225555c06b7c32f9f2657004558e3f996c981481dbb0d3cd79b1d59fa3f05d591af88399422d3ab29d9446c103e98d567aeafe061d9550817ab6e7eb0498396' + 'de02b498a4b5b93e21622c8dba57befe795d733a04656be911cc38e28bfef0e20470450f44be523bbde8d4de28f79c10434846ca01fc2a2f4e67707b79332f94') +sha512sums_x86_64=('503bfdac8639dddeb44c339b37a295383a5a766e47204b26f4e3e11b550937a1e1c1b0c41d63c3bcbbcf26795d53a2b731385065c9245fb5509f33e59cff6864') +sha512sums_aarch64=('b409cd701801d0e1c204c4eede536d9439a481db5b5ab6e475016f8845cfc3d47ae656412fac6e0988072d05037f3a94a4059ac2b0534b6f283471b8778bf6c3') + +source_x86_64=("https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-${_channel}/google-chrome-${_channel}_${pkgver}-1_amd64.deb") +source_aarch64=("https://dl.google.com/linux/chrome/deb/pool/main/g/google-chrome-${_channel}/google-chrome-${_channel}_${pkgver}-1_arm64.deb") + +package() { + bsdtar -xf data.tar.xz -C "$pkgdir/" + + # Launcher + install -m755 google-chrome-$_channel.sh "$pkgdir"/usr/bin/google-chrome-$_channel + + # Icons + for i in 16x16 24x24 32x32 48x48 64x64 128x128 256x256; do + install -Dm644 "$pkgdir"/opt/google/chrome/product_logo_${i/x*/}.png \ + "$pkgdir"/usr/share/icons/hicolor/$i/apps/google-chrome.png + done + + # License + install -Dm644 eula_text.html "$pkgdir"/usr/share/licenses/google-chrome/eula_text.html + install -Dm644 "$pkgdir"/opt/google/chrome/WidevineCdm/LICENSE \ + "$pkgdir"/usr/share/licenses/google-chrome-$_channel/WidevineCdm-LICENSE.txt + + # Fix the Chrome desktop entry + sed -i \ + -e "/Exec=/i\StartupWMClass=Google-chrome" \ + -e "s/x-scheme-handler\/ftp;\?//g" \ + "$pkgdir"/usr/share/applications/google-chrome.desktop + + # Remove the Debian Cron job, duplicate product logos and menu directory + rm -r \ + "$pkgdir"/etc/cron.daily/ \ + "$pkgdir"/opt/google/chrome/cron/ \ + "$pkgdir"/opt/google/chrome/product_logo_*.png +} diff --git a/pkgbuilds/google-chrome/eula_text.html b/pkgbuilds/google-chrome/eula_text.html new file mode 100644 index 0000000..ca402cb --- /dev/null +++ b/pkgbuilds/google-chrome/eula_text.html @@ -0,0 +1,901 @@ + + + + + + + + + + + Google Chrome Terms of Service + + + + + + + + + +
+
+

+ Google Chrome Terms of Service +

+

+ These Terms of Service apply to the executable code version of Google Chrome. Source code + for Google Chrome is available free of charge under open source software license + agreements at http://code.google.com/chromium/terms.html. +

+

+ 1. Your relationship with Google +

+

+ 1.1 Your use of Google’s products, software, services and web sites (referred to + collectively as the “Services� in this document and excluding any services provided to + you by Google under a separate written agreement) is subject to the terms of a legal + agreement between you and Google. “Google� means Google Inc., whose principal place of + business is at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. This + document explains how the agreement is made up, and sets out some of the terms of that + agreement. +

+

+ 1.2 Unless otherwise agreed in writing with Google, your agreement with Google will + always include, at a minimum, the terms and conditions set out in this document. These + are referred to below as the “Universal Terms�. Open source software licenses for Google + Chrome source code constitute separate written agreements. To the limited extent that the + open source software licenses expressly supersede these Universal Terms, the open source + licenses govern your agreement with Google for the use of Google Chrome or specific + included components of Google Chrome. +

+

+ 1.3 Your agreement with Google will also include the terms set forth below in the Google + Chrome Additional Terms of Service and terms of any Legal Notices applicable to the + Services, in addition to the Universal Terms. All of these are referred to below as the + “Additional Terms�. Where Additional Terms apply to a Service, these will be accessible + for you to read either within, or through your use of, that Service. +

+

+ 1.4 The Universal Terms, together with the Additional Terms, form a legally binding + agreement between you and Google in relation to your use of the Services. It is important + that you take the time to read them carefully. Collectively, this legal agreement is + referred to below as the “Terms�. +

+

+ 1.5 If there is any contradiction between what the Additional Terms say and what the + Universal Terms say, then the Additional Terms shall take precedence in relation to that + Service. +

+

+ 2. Accepting the Terms +

+

+ 2.1 In order to use the Services, you must first agree to the Terms. You may not use the + Services if you do not accept the Terms. +

+

+ 2.2 You can accept the Terms by: +

+

+ (A) clicking to accept or agree to the Terms, where this option is made available to you + by Google in the user interface for any Service; or +

+

+ (B) by actually using the Services. In this case, you understand and agree that Google + will treat your use of the Services as acceptance of the Terms from that point onwards. +

+

+ 3. Language of the Terms +

+

+ 3.1 Where Google has provided you with a translation of the English language version of + the Terms, then you agree that the translation is provided for your convenience only and + that the English language versions of the Terms will govern your relationship with + Google. +

+

+ 3.2 If there is any contradiction between what the English language version of the Terms + says and what a translation says, then the English language version shall take + precedence. +

+

+ 4. Provision of the Services by Google +

+

+ 4.1 Google has subsidiaries and affiliated legal entities around the world (“Subsidiaries + and Affiliates�). Sometimes, these companies will be providing the Services to you on + behalf of Google itself. You acknowledge and agree that Subsidiaries and Affiliates will + be entitled to provide the Services to you. +

+

+ 4.2 Google is constantly innovating in order to provide the best possible experience for + its users. You acknowledge and agree that the form and nature of the Services which + Google provides may change from time to time without prior notice to you. +

+

+ 4.3 As part of this continuing innovation, you acknowledge and agree that Google may stop + (permanently or temporarily) providing the Services (or any features within the Services) + to you or to users generally at Google’s sole discretion, without prior notice to you. + You may stop using the Services at any time. You do not need to specifically inform + Google when you stop using the Services. +

+

+ 4.4 You acknowledge and agree that if Google disables access to your account, you may be + prevented from accessing the Services, your account details or any files or other content + which is contained in your account. +

+

+ 5. Use of the Services by you +

+

+ 5.1 You agree to use the Services only for purposes that are permitted by (a) the Terms + and (b) any applicable law, regulation or generally accepted practices or guidelines in + the relevant jurisdictions (including any laws regarding the export of data or software + to and from the United States or other relevant countries). +

+

+ 5.2 You agree that you will not engage in any activity that interferes with or disrupts + the Services (or the servers and networks which are connected to the Services). +

+

+ 5.3 Unless you have been specifically permitted to do so in a separate agreement with + Google, you agree that you will not reproduce, duplicate, copy, sell, trade or resell the + Services for any purpose. +

+

+ 5.4 You agree that you are solely responsible for (and that Google has no responsibility + to you or to any third party for) any breach of your obligations under the Terms and for + the consequences (including any loss or damage which Google may suffer) of any such + breach. +

+

+ 6. Privacy and your personal information +

+

+ 6.1 For information about Google’s data protection practices, please read Google’s + privacy policy at http://www.google.com/privacy.html and at + http://www.google.com/chrome/intl/en/privacy.html. This policy explains how Google treats + your personal information, and protects your privacy, when you use the Services. +

+

+ 6.2 You agree to the use of your data in accordance with Google’s privacy policies. +

+

+ 7. Content in the Services +

+

+ 7.1 You understand that all information (such as data files, written text, computer + software, music, audio files or other sounds, photographs, videos or other images) which + you may have access to as part of, or through your use of, the Services are the sole + responsibility of the person from which such content originated. All such information is + referred to below as the “Content.� +

+

+ 7.2 You should be aware that Content presented to you as part of the Services, including + but not limited to advertisements in the Services and sponsored Content within the + Services may be protected by intellectual property rights which are owned by the sponsors + or advertisers who provide that Content to Google (or by other persons or companies on + their behalf). You may not modify, rent, lease, loan, sell, distribute or create + derivative works based on this Content (either in whole or in part) unless you have been + specifically told that you may do so by Google or by the owners of that Content, in a + separate agreement. +

+

+ 7.3 Google reserves the right (but shall have no obligation) to pre-screen, review, flag, + filter, modify, refuse or remove any or all Content from any Service. For some of the + Services, Google may provide tools to filter out explicit sexual content. These tools + include the SafeSearch preference settings (see + https://support.google.com/websearch/answer/510?hl=en). In addition, there are + commercially available services and software to limit access to material that you may + find objectionable. +

+

+ 7.4 You understand that by using the Services you may be exposed to Content that you may + find offensive, indecent or objectionable and that, in this respect, you use the Services + at your own risk. +

+

+ 7.5 You agree that you are solely responsible for (and that Google has no responsibility + to you or to any third party for) any Content that you create, transmit or display while + using the Services and for the consequences of your actions (including any loss or damage + which Google may suffer) by doing so. +

+

+ 8. Proprietary rights +

+

+ 8.1 You acknowledge and agree that Google (or Google’s licensors) own all legal right, + title and interest in and to the Services, including any intellectual property rights + which subsist in the Services (whether those rights happen to be registered or not, and + wherever in the world those rights may exist). +

+

+ 8.2 Unless you have agreed otherwise in writing with Google, nothing in the Terms gives + you a right to use any of Google’s trade names, trade marks, service marks, logos, domain + names, and other distinctive brand features. +

+

+ 8.3 If you have been given an explicit right to use any of these brand features in a + separate written agreement with Google, then you agree that your use of such features + shall be in compliance with that agreement, any applicable provisions of the Terms, and + Google's brand feature use guidelines as updated from time to time. These guidelines can + be viewed online at http://www.google.com/permissions/guidelines.html (or such other URL + as Google may provide for this purpose from time to time). +

+

+ 8.4 Google acknowledges and agrees that it obtains no right, title or interest from you + (or your licensors) under these Terms in or to any Content that you submit, post, + transmit or display on, or through, the Services, including any intellectual property + rights which subsist in that Content (whether those rights happen to be registered or + not, and wherever in the world those rights may exist). Unless you have agreed otherwise + in writing with Google, you agree that you are responsible for protecting and enforcing + those rights and that Google has no obligation to do so on your behalf. +

+

+ 8.5 You agree that you shall not remove, obscure, or alter any proprietary rights notices + (including copyright and trade mark notices) which may be affixed to or contained within + the Services. +

+

+ 8.6 Unless you have been expressly authorized to do so in writing by Google, you agree + that in using the Services, you will not use any trade mark, service mark, trade name, + logo of any company or organization in a way that is likely or intended to cause + confusion about the owner or authorized user of such marks, names or logos. +

+

+ 9. License from Google +

+

+ 9.1 Google gives you a personal, worldwide, royalty-free, non-assignable and + non-exclusive license to use the software provided to you by Google as part of the + Services as provided to you by Google (referred to as the “Software� below). This license + is for the sole purpose of enabling you to use and enjoy the benefit of the Services as + provided by Google, in the manner permitted by the Terms. +

+

+ 9.2 Subject to section 1.2, you may not (and you may not permit anyone else to) copy, + modify, create a derivative work of, reverse engineer, decompile or otherwise attempt to + extract the source code of the Software or any part thereof, unless this is expressly + permitted or required by law, or unless you have been specifically told that you may do + so by Google, in writing. +

+

+ 9.3 Subject to section 1.2, unless Google has given you specific written permission to do + so, you may not assign (or grant a sub-license of) your rights to use the Software, grant + a security interest in or over your rights to use the Software, or otherwise transfer any + part of your rights to use the Software. +

+

+ 10. Content license from you +

+

+ 10.1 You retain copyright and any other rights you already hold in Content which you + submit, post or display on or through, the Services. +

+

+ 11. Software updates +

+

+ 11.1 The Software which you use may automatically download and install updates from time + to time from Google. These updates are designed to improve, enhance and further develop + the Services and may take the form of bug fixes, enhanced functions, new software modules + and completely new versions. You agree to receive such updates (and permit Google to + deliver these to you) as part of your use of the Services. +

+

+ 12. Ending your relationship with Google +

+

+ 12.1 The Terms will continue to apply until terminated by either you or Google as set out + below. +

+

+ 12.2 Google may at any time, terminate its legal agreement with you if: +

+

+ (A) you have breached any provision of the Terms (or have acted in manner which clearly + shows that you do not intend to, or are unable to comply with the provisions of the + Terms); or +

+

+ (B) Google is required to do so by law (for example, where the provision of the Services + to you is, or becomes, unlawful); or +

+

+ (C) the partner with whom Google offered the Services to you has terminated its + relationship with Google or ceased to offer the Services to you; or +

+

+ (D) Google is transitioning to no longer providing the Services to users in the country + in which you are resident or from which you use the service; or +

+

+ (E) the provision of the Services to you by Google is, in Google’s opinion, no longer + commercially viable. +

+

+ 12.3 Nothing in this Section shall affect Google’s rights regarding provision of Services + under Section 4 of the Terms. +

+

+ 12.4 When these Terms come to an end, all of the legal rights, obligations and + liabilities that you and Google have benefited from, been subject to (or which have + accrued over time whilst the Terms have been in force) or which are expressed to continue + indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 19.7 + shall continue to apply to such rights, obligations and liabilities indefinitely. +

+

+ 13. EXCLUSION OF WARRANTIES +

+

+ 13.1 NOTHING IN THESE TERMS, INCLUDING SECTIONS 13 AND 14, SHALL EXCLUDE OR LIMIT + GOOGLE’S WARRANTY OR LIABILITY FOR LOSSES WHICH MAY NOT BE LAWFULLY EXCLUDED OR LIMITED + BY APPLICABLE LAW. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR + CONDITIONS OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR LOSS OR DAMAGE CAUSED BY + NEGLIGENCE, BREACH OF CONTRACT OR BREACH OF IMPLIED TERMS, OR INCIDENTAL OR CONSEQUENTIAL + DAMAGES. ACCORDINGLY, ONLY THE LIMITATIONS WHICH ARE LAWFUL IN YOUR JURISDICTION WILL + APPLY TO YOU AND OUR LIABILITY WILL BE LIMITED TO THE MAXIMUM EXTENT PERMITTED BY LAW. +

+

+ 13.2 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SERVICES IS AT YOUR SOLE + RISK AND THAT THE SERVICES ARE PROVIDED "AS IS" AND “AS AVAILABLE.� +

+

+ 13.3 IN PARTICULAR, GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS DO NOT + REPRESENT OR WARRANT TO YOU THAT: +

+

+ (A) YOUR USE OF THE SERVICES WILL MEET YOUR REQUIREMENTS, +

+

+ (B) YOUR USE OF THE SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR FREE FROM ERROR, +

+

+ (C) ANY INFORMATION OBTAINED BY YOU AS A RESULT OF YOUR USE OF THE SERVICES WILL BE + ACCURATE OR RELIABLE, AND +

+

+ (D) THAT DEFECTS IN THE OPERATION OR FUNCTIONALITY OF ANY SOFTWARE PROVIDED TO YOU AS + PART OF THE SERVICES WILL BE CORRECTED. +

+

+ 13.4 ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SERVICES IS + DONE AT YOUR OWN DISCRETION AND RISK AND THAT YOU WILL BE SOLELY RESPONSIBLE FOR ANY + DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM THE + DOWNLOAD OF ANY SUCH MATERIAL. +

+

+ 13.5 NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM GOOGLE OR + THROUGH OR FROM THE SERVICES SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THE TERMS. +

+

+ 13.6 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, + WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND + CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +

+

+ 14. LIMITATION OF LIABILITY +

+

+ 14.1 SUBJECT TO OVERALL PROVISION IN PARAGRAPH 13.1 ABOVE, YOU EXPRESSLY UNDERSTAND AND + AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE + TO YOU FOR: +

+

+ (A) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES WHICH + MAY BE INCURRED BY YOU, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY.. THIS SHALL + INCLUDE, BUT NOT BE LIMITED TO, ANY LOSS OF PROFIT (WHETHER INCURRED DIRECTLY OR + INDIRECTLY), ANY LOSS OF GOODWILL OR BUSINESS REPUTATION, ANY LOSS OF DATA SUFFERED, COST + OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR OTHER INTANGIBLE LOSS; +

+

+ (B) ANY LOSS OR DAMAGE WHICH MAY BE INCURRED BY YOU, INCLUDING BUT NOT LIMITED TO LOSS OR + DAMAGE AS A RESULT OF: +

+

+ (I) ANY RELIANCE PLACED BY YOU ON THE COMPLETENESS, ACCURACY OR EXISTENCE OF ANY + ADVERTISING, OR AS A RESULT OF ANY RELATIONSHIP OR TRANSACTION BETWEEN YOU AND ANY + ADVERTISER OR SPONSOR WHOSE ADVERTISING APPEARS ON THE SERVICES; +

+

+ (II) ANY CHANGES WHICH GOOGLE MAY MAKE TO THE SERVICES, OR FOR ANY PERMANENT OR TEMPORARY + CESSATION IN THE PROVISION OF THE SERVICES (OR ANY FEATURES WITHIN THE SERVICES); +

+

+ (III) THE DELETION OF, CORRUPTION OF, OR FAILURE TO STORE, ANY CONTENT AND OTHER + COMMUNICATIONS DATA MAINTAINED OR TRANSMITTED BY OR THROUGH YOUR USE OF THE SERVICES; +

+

+ (IV) YOUR FAILURE TO PROVIDE GOOGLE WITH ACCURATE ACCOUNT INFORMATION; +

+

+ (V) YOUR FAILURE TO KEEP YOUR PASSWORD OR ACCOUNT DETAILS SECURE AND CONFIDENTIAL; +

+

+ 14.2 THE LIMITATIONS ON GOOGLE’S LIABILITY TO YOU IN PARAGRAPH 14.1 ABOVE SHALL APPLY + WHETHER OR NOT GOOGLE HAS BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF + ANY SUCH LOSSES ARISING. +

+

+ 15. Copyright and trade mark policies +

+

+ 15.1 It is Google’s policy to respond to notices of alleged copyright infringement that + comply with applicable international intellectual property law (including, in the United + States, the Digital Millennium Copyright Act) and to terminating the accounts of repeat + infringers. Details of Google’s policy can be found at http://www.google.com/dmca.html. +

+

+ 15.2 Google operates a trade mark complaints procedure in respect of Google’s advertising + business, details of which can be found at http://www.google.com/tm_complaint.html. +

+

+ 16. Advertisements +

+

+ 16.1 Some of the Services are supported by advertising revenue and may display + advertisements and promotions. These advertisements may be targeted to the content of + information stored on the Services, queries made through the Services or other + information. +

+

+ 16.2 The manner, mode and extent of advertising by Google on the Services are subject to + change without specific notice to you. +

+

+ 16.3 In consideration for Google granting you access to and use of the Services, you + agree that Google may place such advertising on the Services. +

+

+ 17. Other content +

+

+ 17.1 The Services may include hyperlinks to other web sites or content or resources. + Google may have no control over any web sites or resources which are provided by + companies or persons other than Google. +

+

+ 17.2 You acknowledge and agree that Google is not responsible for the availability of any + such external sites or resources, and does not endorse any advertising, products or other + materials on or available from such web sites or resources. +

+

+ 17.3 You acknowledge and agree that Google is not liable for any loss or damage which may + be incurred by you as a result of the availability of those external sites or resources, + or as a result of any reliance placed by you on the completeness, accuracy or existence + of any advertising, products or other materials on, or available from, such web sites or + resources. +

+

+ 18. Changes to the Terms +

+

+ 18.1 Google may make changes to the Universal Terms or Additional Terms from time to + time. When these changes are made, Google will make a new copy of the Universal Terms + available at http://www.google.com/chrome/intl/en/eula_text.html and any new Additional + Terms will be made available to you from within, or through, the affected Services. +

+

+ 18.2 You understand and agree that if you use the Services after the date on which the + Universal Terms or Additional Terms have changed, Google will treat your use as + acceptance of the updated Universal Terms or Additional Terms. +

+

+ 19. General legal terms +

+

+ 19.1 Sometimes when you use the Services, you may (as a result of, or in connection with + your use of the Services) use a service or download a piece of software, or purchase + goods, which are provided by another person or company. Your use of these other services, + software or goods may be subject to separate terms between you and the company or person + concerned. If so, the Terms do not affect your legal relationship with these other + companies or individuals. +

+

+ 19.2 The Terms constitute the whole legal agreement between you and Google and govern + your use of the Services (but excluding any services which Google may provide to you + under a separate written agreement), and completely replace any prior agreements between + you and Google in relation to the Services. +

+

+ 19.3 You agree that Google may provide you with notices, including those regarding + changes to the Terms, by email, regular mail, or postings on the Services. +

+

+ 19.4 You agree that if Google does not exercise or enforce any legal right or remedy + which is contained in the Terms (or which Google has the benefit of under any applicable + law), this will not be taken to be a formal waiver of Google’s rights and that those + rights or remedies will still be available to Google. +

+

+ 19.5 If any court of law, having the jurisdiction to decide on this matter, rules that + any provision of these Terms is invalid, then that provision will be removed from the + Terms without affecting the rest of the Terms. The remaining provisions of the Terms will + continue to be valid and enforceable. +

+

+ 19.6 You acknowledge and agree that each member of the group of companies of which Google + is the parent shall be third party beneficiaries to the Terms and that such other + companies shall be entitled to directly enforce, and rely upon, any provision of the + Terms which confers a benefit on (or rights in favor of) them. Other than this, no other + person or company shall be third party beneficiaries to the Terms. +

+

+ 19.7 The Terms, and your relationship with Google under the Terms, shall be governed by + the laws of the State of California without regard to its conflict of laws provisions. + You and Google agree to submit to the exclusive jurisdiction of the courts located within + the county of Santa Clara, California to resolve any legal matter arising from the Terms. + Notwithstanding this, you agree that Google shall still be allowed to apply for + injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction. +

+

+ 20. Additional Terms for Extensions for Google Chrome +

+

+ 20.1 These terms in this section apply if you install extensions on your copy of Google + Chrome. Extensions are small software programs, developed by Google or third parties, + that can modify and enhance the functionality of Google Chrome. Extensions may have + greater privileges to access your browser or your computer than regular webpages, + including the ability to read and modify your private data. +

+

+ 20.2 From time to time, Google Chrome may check with remote servers (hosted by Google or + by third parties) for available updates to extensions, including but not limited to bug + fixes or enhanced functionality. You agree that such updates will be automatically + requested, downloaded, and installed without further notice to you. +

+

+ 20.3 From time to time, Google may discover an extension that violates Google developer + terms or other legal agreements, laws, regulations or policies. Google Chrome will + periodically download a list of such extensions from Google’s servers. You agree that + Google may remotely disable or remove any such extension from user systems in its sole + discretion. +

+

+ 21. Additional Terms for Enterprise Use +

+

+ 21.1 If you are a business entity, then the individual accepting on behalf of the entity + (for the avoidance of doubt, for business entities, in these Terms, "you" means the + entity) represents and warrants that he or she has the authority to act on your behalf, + that you represent that you are duly authorized to do business in the country or + countries where you operate, and that your employees, officers, representatives, and + other agents accessing the Service are duly authorized to access Google Chrome and to + legally bind you to these Terms. +

+

+ 21.2 Subject to the Terms, and in addition to the license grant in Section 9, Google + grants you a non-exclusive, non-transferable license to reproduce, distribute, install, + and use Google Chrome solely on machines intended for use by your employees, officers, + representatives, and agents in connection with your business entity, and provided that + their use of Google Chrome will be subject to the Terms. +

+

+ August 12, 2010 +


+
+
+

+ Google Chrome Additional Terms of Service +

+

+ MPEGLA +

+

+ THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL AND + NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD + ( “AVC VIDEO�) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A + PERSONAL AND NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PARTNER LICENSED TO + PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. + ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM. +

+

+ Adobe +

+

+ Google Chrome may include one or more components provided by Adobe Systems Incorporated + and Adobe Software Ireland Limited (collectively “Adobe�). Your use of the Adobe software + as provided by Google (“Adobe Software�) is subject to the following additional terms + (the “Adobe Terms�). You, the entity receiving the Adobe Software, will be hereinafter + referred to as “Sublicensee.� +

+

+ 1. License Restrictions. +

+

+ (a) Flash Player, Version 10.x is designed only as a browser plug-in. Sublicensee may not + modify or distribute this Adobe Software for use as anything but a browser plug-in for + playing back content on a web page. For example, Sublicensee will not modify this Adobe + Software in order to allow interoperation with applications that run outside of the + browser (e.g., standalone applications, widgets, device UI). +

+

+ (b) Sublicensee will not expose any APIs of the Flash Player, Version 10.x through a + browser plug-in interface in such a way that allows such extension to be used to playback + content from a web page as a stand-alone application. +

+

+ (c) The Chrome-Reader Software may not be used to render any PDF or EPUB documents that + utilize digital rights management protocols or systems other than Adobe DRM. +

+

+ (d) Adobe DRM must be enabled in the Chrome-Reader Software for all Adobe DRM protected + PDF and EPUB documents. +

+

+ (e) The Chrome-Reader Software may not, other than as explicitly permitted by the + technical specifications, disable any capabilities provided by Adobe in the Adobe + Software, including but not limited to, support for PDF and EPUB formats and Adobe DRM. +

+

+ 2. Electronic Transmission. Sublicensee may allow the download of the Adobe Software from + a web site, the Internet, an intranet, or similar technology (an, “Electronic + Transmissions�) provided that Sublicensee agrees that any distributions of the Adobe + Software by Sublicensee, including those on CD-ROM, DVD-ROM or other storage media and + Electronic Transmissions, if expressly permitted, shall be subject to reasonable security + measures to prevent unauthorized use. With relation to Electronic Transmissions approved + hereunder, Sublicensee agrees to employ any reasonable use restrictions set by Adobe, + including those related to security and/or the restriction of distribution to end users + of the Sublicensee Product. +

+

+ 3. EULA and Distribution Terms. +

+

+ (a) Sublicensee shall ensure that the Adobe Software is distributed to end users under an + enforceable end user license agreement, in favor of Sublicensee and its suppliers + containing at least each of the following minimum terms (the “End-User License�): (i) a + prohibition against distribution and copying, (ii) a prohibition against modifications + and derivative works, (iii) a prohibition against decompiling, reverse engineering, + disassembling, and otherwise reducing the Adobe Software to a human-perceivable form, + (iv) a provision indicating ownership of Sublicensee Product (as defined in Section 8) by + Sublicensee and its licensors, (v) a disclaimer of indirect, special, incidental, + punitive, and consequential damages, and (vi) other industry standard disclaimers and + limitations, including, as applicable: a disclaimer of all applicable statutory + warranties, to the full extent allowed by law. +

+

+ (b) Sublicensee shall ensure that the Adobe Software is distributed to Sublicensee’s + distributors under an enforceable distribution license agreement, in favor of Sublicensee + and its suppliers containing terms as protective of Adobe as the Adobe Terms. +

+

+ 4. Opensource. Sublicensee will not directly or indirectly grant, or purport to grant, to + any third party any rights or immunities under Adobe’s intellectual property or + proprietary rights that will subject such intellectual property to an open source license + or scheme in which there is or could be interpreted to be a requirement that as a + condition of use, modification and/or distribution, the Adobe Software be: (i) disclosed + or distributed in source code form; (ii) licensed for the purpose of making derivative + works; or (iii) redistributable at no charge. For clarification purposes, the foregoing + restriction does not preclude Sublicensee from distributing, and Sublicensee will + distribute the Adobe Software as bundled with the Google Software, without charge. +

+

+ 5. Additional Terms. With respect to any update, upgrade, new versions of the Adobe + Software (collectively “Upgrades�) provided to Sublicenses, Adobe reserves the right to + require additional terms and conditions applicable solely to the Upgrade and future + versions thereof, and solely to the extent that such restrictions are imposed by Adobe on + all licensees of such Upgrade. If Sublicensee does not agree to such additional terms or + conditions, Sublicensee will have no license rights with respect to such Upgrade, and + Sublicensee’s license rights with respect to the Adobe Software will terminate + automatically on the 90th day from the date such additional terms are made available to + Sublicensee. +

+

+ 6. Proprietary Rights Notices. Sublicensee shall not, and shall require its distributors + not to, delete or in any manner alter the copyright notices, trademarks, logos or related + notices, or other proprietary rights notices of Adobe (and its licensors, if any) + appearing on or within the Adobe Software or accompanying materials. +

+

+ 7. Technical Requirements. Sublicensee and its distributors may only distribute Adobe + Software and/or Upgrade on devices that (i) meet the technical specifications posted on + http://www.adobe.com/mobile/licensees, (or a successor web site thereto), and (ii) has + been verified by Adobe as set forth below. +

+

+ 8. Verification and Update. Sublicensee must submit to Adobe each Sublicensee product + (and each version thereof) containing the Adobe Software and/or Upgrade (“Sublicensee + Product�) that do not meet the Device Verification exemption criteria to be communicated + by Google, for Adobe to verify. Sublicensee shall pay for each submission made by + Sublicensee by procuring verification packages at Adobe’s then-current terms set forth at + http://flashmobile.adobe.com/. Sublicensee Product that has not passed verification may + not be distributed. Verification will be accomplished in accordance with Adobe’s + then-current process described at http://flashmobile.adobe.com/ (“Verification�). +

+

+ 9. Profiles and Device Central. Sublicensee will be prompted to enter certain profile + information about the Sublicensee Products either as part of the Verification process or + some other method, and Sublicensee will provide such information, to Adobe. Adobe may (i) + use such profile information as reasonably necessary to verify the Sublicensee Product + (if such product is subject to Verification), and (ii) display such profile information + in “Adobe Device Intelligence system,� located at + https://devices.adobe.com/partnerportal/, and made available through Adobe’s authoring + and development tools and services to enable developers and end users to see how content + or applications are displayed in Sublicensee Products (e.g. how video images appear in + certain phones). +

+

+ 10. Export. Sublicensee acknowledges that the laws and regulations of the United States + restrict the export and re-export of commodities and technical data of United States + origin, which may include the Adobe Software. Sublicensee agrees that it will not export + or re-export the Adobe Software, without the appropriate United States and foreign + governmental clearances, if any. +

+

+ 11. Technology Pass-through Terms. +

+

+ (a) Except pursuant to applicable permissions or agreements therefor, from or with the + applicable parties, Sublicensees shall not use and shall not allow the use of, the Adobe + Software for the encoding or decoding of mp3 audio only (.mp3) data on any non-pc device + (e.g., mobile phone or set-top box), nor may the mp3 encoders or decoders contained in + the Adobe Software be used or accessed by any product other than the Adobe Software. The + Adobe Software may be used for the encoding or decoding of MP3 data contained within a + swf or flv file, which contains video, picture or other data. Sublicensee shall + acknowledge that use of the Adobe Software for non-PC devices, as described in the + prohibitions in this section, may require the payment of licensing royalties or other + amounts to third parties who may hold intellectual property rights related to the MP3 + technology and that Adobe nor Sublicensee has not paid any royalties or other amounts on + account of third party intellectual property rights for such use. If Sublicensee requires + an MP3 encoder or decoder for such use, Sublicensee is responsible for obtaining the + necessary intellectual property license, including any applicable patent rights. +

+

+ (b) Sublicensee will not use, copy, reproduce and modify (i) the On2 source code + (provided hereunder as a component of the Source Code) as necessary to enable the Adobe + Software to decode video in the Flash video file format (.flv or .f4v), and (ii) the + Sorenson Spark source code (provided hereunder as a component of the Source Code) for the + limited purpose of making bug fixes and performance enhancements to the Adobe Software. + All codecs provided with the Adobe Software may only be used and distributed as an + integrated part of the Adobe Software and may not be accessed by any other application, + including other Google applications. +

+

+ (c) The Source Code may be provided with an AAC codec and/or HE-AAC codec (“the AAC + Codec�). Use of the AAC Codec is conditioned on Sublicensee obtaining a proper patent + license covering necessary patents as provided by VIA Licensing, for end products on or + in which the AAC Codec will be used. Sublicensee acknowledges and agrees that Adobe is + not providing a patent license for an AAC Codec under this Agreement to Sublicensee or + its sublicensees. +

+

+ (d) THE SOURCE CODE MAY CONTAIN CODE LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR + THE PERSONAL NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE + AVC STANDARD ("AVC VIDEO") AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER + ENGAGED IN A PERSONAL NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER + LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR WILL BE IMPLIED FOR ANY OTHER + USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. See + http://www.mpegla.com +

+

+ 12. Update. Sublicensee will not circumvent Google’s or Adobe’s efforts to update the + Adobe Software in all Sublicensee’s products incorporating the Adobe Software as bundled + with the Google Software (“Sublicensee Products�). +

+

+ 13. Attribution and Proprietary Notices. Sublicensee will list the Adobe Software in + publicly available Sublicensee Product specifications and include appropriate Adobe + Software branding (specifically excluding the Adobe corporate logo) on the Sublicensee + Product packaging or marketing materials in a manner consistent with branding of other + third party products contained within the Sublicensee Product. +

+

+ 14. No Warranty. THE ADOBE SOFTWARE IS MADE AVAILABLE TO SUBLICENSEE FOR USE AND + REPRODUCTION “AS IS� AND ADOBE MAKES NO WARRANTY AS TO ITS USE OR PERFORMANCE. ADOBE AND + ITS SUPPLIERS DO NOT AND CANNOT WARRANT THE PERFORMANCE OR RESULTS OBTAINED BY USING THE + ADOBE SOFTWARE. EXCEPT FOR ANY WARRANTY, CONDITION, REPRESENTATION OR TERM TO THE EXTENT + TO WHICH THE SAME CANNOT OR MAY NOT BE EXCLUDED OR LIMITED BY LAW APPLICABLE TO + SUBLICENSEEIN SUBLICENSEE’S JURISDICTION, ADOBE AND ITS SUPPLIERS MAKE NO WARRANTIES, + CONDITIONS, REPRESENTATIONS, OR TERMS (EXPRESS OR IMPLIED WHETHER BY STATUTE, COMMON LAW, + CUSTOM, USAGE OR OTHERWISE) AS TO ANY MATTER INCLUDING WITHOUT LIMITATION NONINFRINGEMENT + OF THIRD PARTY RIGHTS, MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, OR FITNESS FOR + ANY PARTICULAR PURPOSE. SUBLICENSEE AGREES THAT SUBLICENSEE SHALL NOT MAKE ANY WARRANTY, + EXPRESS OR IMPLIED, ON BEHALF OF ADOBE. +

+

+ 15. Limitation of Liability. IN NO EVENT WILL ADOBE OR ITS SUPPLIERS BE LIABLE TO + SUBLICENSEE FOR ANY DAMAGES, CLAIMS OR COSTS WHATSOEVER OR ANY CONSEQUENTIAL, INDIRECT, + OR INCIDENTAL DAMAGES, OR ANY LOST PROFITS OR LOST SAVINGS, EVEN IF AN ADOBE + REPRESENTATIVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS + OR FOR ANY CLAIM BY ANY THIRD PARTY. THE FOREGOING LIMITATIONS AND EXCLUSIONS APPLY TO + THE EXTENT PERMITTED BY APPLICABLE LAW IN SUBLICENSEE’S JURISDICTION. ADOBE’S AGGREGATE + LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE + LIMITED TO ONE THOUSAND DOLLARS (US$1,000). Nothing contained in this Agreement limits + Adobe’s liability to Sublicensee in the event of death or personal injury resulting from + Adobe’s negligence or for the tort of deceit (fraud). Adobe is acting on behalf of its + suppliers for the purpose of disclaiming, excluding and/or limiting obligations, + warranties and liability as provided in this Agreement, but in no other respects and for + no other purpose. +

+

+ 16. Content Protection Terms +

+

+ (a) Definitions. +

+

+ “Compliance and Robustness Rules� means the document setting forth compliance and + robustness rules for the Adobe Software located at http://www.adobe.com/mobile/licensees, + or a successor web site thereto. +

+

+ “Content Protection Functions� means those aspects of the Adobe Software that are + designed to ensure compliance with the Compliance and Robustness Rules, and to prevent + playback, copying, modification, redistribution or other actions with respect to digital + content distributed for consumption by users of the Adobe Software when such actions are + not authorized by the owners of such digital content or its licensed distributors. +

+

+ “Content Protection Code� means code within certain designated versions of the Adobe + Software that enables certain Content Protection Functions. +

+

+ “Key� means a cryptographic value contained in the Adobe Software for use in decrypting + digital content. +

+

+ (b) License Restrictions. Sublicensee’s right to exercise the licenses with respect to + the Adobe Software is subject to the following additional restrictions and obligations. + Sublicensee will ensure that Sublicensee’s customers comply with these restrictions and + obligations to the same extent imposed on Sublicensee with respect to the Adobe Software; + any failure by Sublicensee’s customers to comply with these additional restrictions and + obligations shall be treated as a material breach by Sublicensee. +

+

+ b.1. Sublicensee and customers may only distribute the Adobe Software that meets the + Robustness and Compliance Rules as so confirmed by Sublicensee during the verification + process described above in the Adobe Terms. +

+

+ b.2. Sublicensee shall not (i) circumvent the Content Protection Functions of either the + Adobe Software or any related Adobe Software that is used to encrypt or decrypt digital + content for authorized consumption by users of the Adobe Software, or (ii) develop or + distribute products that are designed to circumvent the Content Protection Functions of + either the Adobe Software or any Adobe Software that is used to encrypt or decrypt + digital content for authorized consumption by users of the Adobe Software. +

+

+ (c) The Keys are hereby designated as Adobe’s Confidential Information, and Sublicensee + will, with respect to the Keys, adhere to Adobe’s Source Code Handling Procedure (to be + provided by Adobe upon request). +

+

+ (d) Injunctive Relief. Sublicensee agrees that a breach of this Agreement may compromise + the Content Protection Functions of the Adobe Software and may cause unique and lasting + harm to the interests of Adobe and owners of digital content that rely on such Content + Protection Functions, and that monetary damages may be inadequate to compensate fully for + such harm. Therefore, Sublicensee further agrees that Adobe may be entitled to seek + injunctive relief to prevent or limit the harm caused by any such breach, in addition to + monetary damages. +

+

+ 17. Intended Third-party Beneficiary. Adobe Systems Incorporated and Adobe Software + Ireland Limited are the intended third-party beneficiaries of Google’s agreement with + Sublicensee with respect to the Adobe Software, including but not limited to, the Adobe + Terms. Sublicensee agrees, notwithstanding anything to the contrary in its agreement with + Google, that Google may disclose Sublicensee’s identity to Adobe and certify in writing + that Sublicensee has entered into a license agreement with Google which includes the + Adobe Terms. Sublicensee must have an agreement with each of its licensees, and if such + licensees are allowed to redistribute the Adobe Software, such agreement will include the + Adobe Terms. +

+
+
+ + \ No newline at end of file diff --git a/pkgbuilds/google-chrome/google-chrome-stable.sh b/pkgbuilds/google-chrome/google-chrome-stable.sh new file mode 100644 index 0000000..3bc963e --- /dev/null +++ b/pkgbuilds/google-chrome/google-chrome-stable.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +XDG_CONFIG_HOME=${XDG_CONFIG_HOME:-~/.config} + +# Allow users to override command-line options +if [[ -f $XDG_CONFIG_HOME/chrome-flags.conf ]]; then + CHROME_USER_FLAGS="$(grep -v '^#' $XDG_CONFIG_HOME/chrome-flags.conf)" +fi + +# Launch +exec /opt/google/chrome/google-chrome $CHROME_USER_FLAGS "$@" diff --git a/pkgbuilds/google-chrome/google-chrome.install b/pkgbuilds/google-chrome/google-chrome.install new file mode 100644 index 0000000..3a0cf86 --- /dev/null +++ b/pkgbuilds/google-chrome/google-chrome.install @@ -0,0 +1,14 @@ +# Colored makepkg-like functions +note() { + printf "${_blue}==>${_yellow} NOTE:${_bold} %s${_all_off}\n" "$1" +} + +_all_off="$(tput sgr0)" +_bold="${_all_off}$(tput bold)" +_blue="${_bold}$(tput setaf 4)" +_yellow="${_bold}$(tput setaf 3)" + +post_install() { + note "Custom flags should be put directly in: ~/.config/chrome-flags.conf" + note "The launcher is called: 'google-chrome-stable'" +} diff --git a/pkgbuilds/microsoft-edge-stable-bin/.nvchecker.toml b/pkgbuilds/microsoft-edge-stable-bin/.nvchecker.toml new file mode 100644 index 0000000..82710fb --- /dev/null +++ b/pkgbuilds/microsoft-edge-stable-bin/.nvchecker.toml @@ -0,0 +1,4 @@ +[microsoft-edge-stable-bin] +source = "regex" +url = "https://packages.microsoft.com/repos/edge/dists/stable/main/binary-amd64/Packages" +regex = "(?s)Package: microsoft-edge-stable\\n.*?Version: ([0-9.]+)-" diff --git a/pkgbuilds/microsoft-edge-stable-bin/.omarchy/package.json b/pkgbuilds/microsoft-edge-stable-bin/.omarchy/package.json new file mode 100644 index 0000000..71d7253 --- /dev/null +++ b/pkgbuilds/microsoft-edge-stable-bin/.omarchy/package.json @@ -0,0 +1,15 @@ +{ + "source": "local", + "release_ring": "fast", + "upstream": { + "watch": { + "debian": "https://packages.microsoft.com/repos/edge/dists/stable/main/binary-amd64/Packages", + "package": "microsoft-edge-stable", + "pattern": "(?P[0-9]+(?:\\.[0-9]+)*)-1" + } + }, + "origin": { + "aur": "microsoft-edge-stable-bin", + "commit": "4f6358224df9e58ad9ef84980505d1ead732f8dc" + } +} diff --git a/pkgbuilds/microsoft-edge-stable-bin/Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf b/pkgbuilds/microsoft-edge-stable-bin/Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac3251c09abed9ae8ed5b1d8d94d4d87664bdc0c GIT binary patch literal 87033 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 +# Contributor: Aakash Hemadri +# Contributor: Nicolas Narvaez +# Contributor: Luna Jernberg +# Contributor: EsauPR +# Contributor: nowy + +pkgname=microsoft-edge-stable-bin +_pkgname=microsoft-edge +_pkgshortname=msedge +_channel=stable +pkgver=154.0.4258.37 +pkgrel=1 +pkgdesc="A browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier" +arch=('x86_64') +url="https://www.microsoftedgeinsider.com/en-us/download" +license=('Licenseref-custom') +provides=('microsoft-edge-stable' 'edge-stable') +conflicts=('microsoft-edge-stable' 'edge-stable' 'edge-stable-bin' 'edge') +depends=('gtk3' 'libcups' 'nss' 'alsa-lib' 'libxtst' 'libdrm' 'mesa' 'libxml2') +makedepends=('imagemagick') +optdepends=( + 'libpipewire: WebRTC desktop sharing under Wayland' + 'kdialog: for file dialogs in KDE' + 'gnome-keyring: for storing passwords in GNOME keyring' + 'kwallet: for storing passwords in KWallet' + 'libunity: for download progress on KDE' + 'ttf-liberation: fix fonts for some PDFs - CRBug #369991' + 'xdg-utils' + ) +options=(!strip !zipman) +source=("https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/${_pkgname}-${_channel}_${pkgver}-1_amd64.deb" + "microsoft-edge-stable.sh" + "Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf") +sha256sums=('c6fa2974733991321b46c4064b785cdec5a14d8cddd182bc5fda057e37e7603d' + 'dc3765d2de6520b13f105b8001aa0e40291bc9457ac508160b23eea8811e26af' + 'edf2ed596eb068f168287fc76aa713ad5e0afb59f0a0a47a4f29c0c124ade15e') + +package() { + bsdtar -xf data.tar.xz -C "$pkgdir/" + + # suid sandbox + chmod 4755 "${pkgdir}/opt/microsoft/${_pkgshortname}/msedge-sandbox" + + # 256 and 24 are proper colored icons + for res in 128 64 48 32; do + magick "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_256.png" \ + -resize ${res}x${res} \ + "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_${res}.png" + done + for res in 22 16; do + magick "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_24.png" \ + -resize ${res}x${res} \ + "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_${res}.png" + done + + # install icons + for res in 16 24 32 48 64 128 256; do + install -Dm644 "${pkgdir}/opt/microsoft/${_pkgshortname}/product_logo_${res}.png" \ + "${pkgdir}/usr/share/icons/hicolor/${res}x${res}/apps/${_pkgname}.png" + done + + # User flag aware launcher + install -m755 microsoft-edge-stable.sh "${pkgdir}/usr/bin/microsoft-edge-stable" + # License + install -Dm644 'Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf' "${pkgdir}/usr/share/licenses/${_pkgname}/LICENSE.pdf" + rm "${pkgdir}/opt/microsoft/${_pkgshortname}"/product_logo_*.png +} diff --git a/pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.install b/pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.install new file mode 100644 index 0000000..8e6fecd --- /dev/null +++ b/pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.install @@ -0,0 +1,22 @@ +# Colored makepkg-like functions +msg_blue() { + printf "${blue}==>${bold} $1${all_off}\n" +} + +note() { + printf "${blue}==>${yellow} NOTE:${bold} $1${all_off}\n" +} + +all_off="$(tput sgr0)" +bold="${all_off}$(tput bold)" +blue="${bold}$(tput setaf 4)" +yellow="${bold}$(tput setaf 3)" + +post_install() { + note "Custom flags should be put directly in: ~/.config/microsoft-edge-stable-flags.conf" + note "The launcher is called: 'microsoft-edge-stable'" +} + +post_upgrade() { + post_install +} diff --git a/pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.sh b/pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.sh new file mode 100644 index 0000000..c0ec973 --- /dev/null +++ b/pkgbuilds/microsoft-edge-stable-bin/microsoft-edge-stable.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh +# Launches MS Edge with flags specified in $XDG_CONFIG_HOME/microsoft-edge-beta-flags.conf + +# Make script fail if `cat` fails for some reason +set -e + +# Set default value if variable is unset/null +XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}" + +# Attempt to read a config file if it exists +if [ -r "${XDG_CONFIG_HOME}/microsoft-edge-stable-flags.conf" ]; then + EDGE_USER_FLAGS="$(cat "$XDG_CONFIG_HOME/microsoft-edge-stable-flags.conf")" +fi + +exec /opt/microsoft/msedge/microsoft-edge $EDGE_USER_FLAGS "$@" diff --git a/pkgbuilds/zen-browser-bin/.nvchecker.toml b/pkgbuilds/zen-browser-bin/.nvchecker.toml new file mode 100644 index 0000000..65580c7 --- /dev/null +++ b/pkgbuilds/zen-browser-bin/.nvchecker.toml @@ -0,0 +1,3 @@ +[zen-browser-bin] +source = "git" +git = "https://github.com/zen-browser/desktop.git" diff --git a/pkgbuilds/zen-browser-bin/.omarchy/package.json b/pkgbuilds/zen-browser-bin/.omarchy/package.json new file mode 100644 index 0000000..6cf6a0b --- /dev/null +++ b/pkgbuilds/zen-browser-bin/.omarchy/package.json @@ -0,0 +1,14 @@ +{ + "source": "local", + "release_ring": "fast", + "upstream": { + "watch": { + "github": "zen-browser/desktop", + "pattern": "(?P[0-9]+(?:\\.[0-9]+)*b)" + } + }, + "origin": { + "aur": "zen-browser-bin", + "commit": "f4c4f31acf056e4756596fb958ae7fa824c760bb" + } +} diff --git a/pkgbuilds/zen-browser-bin/PKGBUILD b/pkgbuilds/zen-browser-bin/PKGBUILD new file mode 100644 index 0000000..4ee3367 --- /dev/null +++ b/pkgbuilds/zen-browser-bin/PKGBUILD @@ -0,0 +1,74 @@ +# Maintainer: Luis Vervaet +# Contributor: Peter Jung +# Contributor: NextWorks +# Contributor: Alad Wenter +# Contributor: Luna Jernberg +# Contributor: Hilton Medeiros +# Contributor: Simon Brulhart +# Contributor: Det , Achilleas Pipinellis, speed145a, Schnouki, aus + +pkgname=zen-browser-bin +_pkgname=zen-browser +_desktopname=zen +pkgver=1.22.3b +pkgrel=1 +pkgdesc="Official package for Zen, a privacy-focused, feature packed Firefox-based web browser" +arch=('x86_64' 'aarch64') +url="https://github.com/zen-browser/desktop" +license=(MPL-2.0) +depends=(gtk3 libxt mime-types dbus-glib nss ttf-font systemd ffmpeg) +optdepends=('networkmanager: Location detection via available WiFi networks' + 'libnotify: Notification integration' + 'pulse-native-provider: Audio support' + 'speech-dispatcher: Text-to-Speech' + 'hunspell-en_US: Spell checking, American English') +options=(!strip) +provides=("zen-browser=$pkgver") +conflicts=('zen-browser') + +source_x86_64=("zen-browser-$pkgver-$pkgrel-x86_64.tar.xz::https://github.com/zen-browser/desktop/releases/download/$pkgver/zen.linux-x86_64.tar.xz") +source_aarch64=("zen-browser-$pkgver-$pkgrel-aarch64.tar.xz::https://github.com/zen-browser/desktop/releases/download/$pkgver/zen.linux-aarch64.tar.xz") + +source=("$_pkgname.sh" + "$_desktopname.desktop" + "policies.json") +sha256sums=('642bcde5b15fddb712d10ed53299781108a265432237ab27a96c5c5c489718db' + 'bfb347f0e0f6baccaf3b7b51b19a25e5b745d836734cec38611b32af842897f6' + 'fd9572d178ea1a5edf427ca85bad3fb2d83be2e250e62bad13951d70d977bd0f') +sha256sums_x86_64=('0aaee1b3f67f074aebf7fc6c2fe824441bcafd431e9991336479c16370519dd0') +sha256sums_aarch64=('bffbf418881d46963c5ec00cb0de05e7a06f77b2aefc8710a503bcfb79086c7d') + + +package() { + # Create directories + mkdir -p "$pkgdir"/usr/bin + mkdir -p "$pkgdir"/usr/share/applications + mkdir -p "$pkgdir"/opt + + # Install + cp -r zen/ "$pkgdir"/opt/$pkgname + + # Launchers + install -m755 $_pkgname.sh "$pkgdir"/usr/bin/$_pkgname + + # Desktops + install -m644 *.desktop "$pkgdir"/usr/share/applications/ + + # Icons + for i in 16x16 32x32 48x48 64x64 128x128; do + install -d "$pkgdir"/usr/share/icons/hicolor/$i/apps/ + ln -s /opt/$pkgname/browser/chrome/icons/default/default${i/x*}.png \ + "$pkgdir"/usr/share/icons/hicolor/$i/apps/$_pkgname.png + done + + # Use system-provided dictionaries + ln -Ts /usr/share/hunspell "$pkgdir"/opt/$pkgname/dictionaries + ln -Ts /usr/share/hyphen "$pkgdir"/opt/$pkgname/hyphenation + + # Use system certificates + ln -sf /usr/lib/libnssckbi.so "$pkgdir"/opt/$pkgname/libnssckbi.so + + # Disable update checks (managed by pacman) + mkdir "$pkgdir"/opt/$pkgname/distribution + install -m644 "$srcdir"/policies.json "$pkgdir"/opt/$pkgname/distribution/ +} diff --git a/pkgbuilds/zen-browser-bin/policies.json b/pkgbuilds/zen-browser-bin/policies.json new file mode 100644 index 0000000..8dacd02 --- /dev/null +++ b/pkgbuilds/zen-browser-bin/policies.json @@ -0,0 +1,6 @@ +{ + "policies": { + "DisableAppUpdate": true, + "DefaultSerialGuardSetting": 3 + } +} diff --git a/pkgbuilds/zen-browser-bin/zen-browser.sh b/pkgbuilds/zen-browser-bin/zen-browser.sh new file mode 100755 index 0000000..c60bca6 --- /dev/null +++ b/pkgbuilds/zen-browser-bin/zen-browser.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +exec /opt/zen-browser-bin/zen-bin "$@" diff --git a/pkgbuilds/zen-browser-bin/zen.desktop b/pkgbuilds/zen-browser-bin/zen.desktop new file mode 100644 index 0000000..c8bb147 --- /dev/null +++ b/pkgbuilds/zen-browser-bin/zen.desktop @@ -0,0 +1,697 @@ +[Desktop Entry] +Name=Zen Browser +Comment=A fast, private and secure web browser built to improve your day-to-day experience. +Exec=/opt/zen-browser-bin/zen-bin %u +Icon=zen-browser +Type=Application +MimeType=application/json;application/pdf;application/rdf+xml;application/rss+xml;application/x-xpinstall;application/xhtml+xml;application/xml;audio/flac;audio/ogg;audio/webm;image/avif;image/gif;image/jpeg;image/png;image/svg+xml;image/webp;text/html;text/xml;video/ogg;video/webm;x-scheme-handler/chrome;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/mailto; +StartupWMClass=zen +Categories=Network;WebBrowser; +StartupNotify=true +Terminal=false +X-MultipleArgs=false +GenericName=Web Browser +GenericName[ach]=Web Browser +GenericName[af]=Web Browser +GenericName[an]=Web Browser +GenericName[ar]=متص�ح الو�ب +GenericName[ast]=Web Browser +GenericName[az]=Web Browser +GenericName[be]=В�б-браўзер +GenericName[bg]=Уеб браузър +GenericName[bn]=ওয়েব ব�রাউজার +GenericName[bqi]=گشت گر وب +GenericName[br]=Merdeer Web +GenericName[brx]=Web Browser +GenericName[bs]=Web pretraživa� +GenericName[ca]=Navegador web +GenericName[ca_valencia]=Web Browser +GenericName[cak]=Web Okik'amaya'l +GenericName[ckb]=Web Browser +GenericName[cs]=Webový prohlíže� +GenericName[cy]=Porwr Gwe +GenericName[da]=Webbrowser +GenericName[de]=Internet-Browser +GenericName[dsb]=Webwobglědowak +GenericName[el]=Π�όγ�αμμα πε�ιήγησης +GenericName[en_CA]=Web Browser +GenericName[en_GB]=Web Browser +GenericName[eo]=Retumilo +GenericName[es_AR]=Navegador web +GenericName[es_CL]=Navegador Web +GenericName[es_ES]=Navegador web +GenericName[es_MX]=Navegador Web +GenericName[et]=Web Browser +GenericName[eu]=Web nabigatzailea +GenericName[fa]=مرورگر وب +GenericName[ff]=Web Browser +GenericName[fi]=Verkkoselain +GenericName[fr]=Navigateur web +GenericName[fur]=Navigadôr Web +GenericName[fy_NL]=Webbrowser +GenericName[ga_IE]=Web Browser +GenericName[gd]=Brabhsair-lìn +GenericName[gl]=Navegador web +GenericName[gn]=Ñanduti Kundahára +GenericName[gu_IN]=Web Browser +GenericName[he]=דפדפן �ינטרנט +GenericName[hi_IN]=Web Browser +GenericName[hr]=Web preglednik +GenericName[hsb]=Webwobhladowak +GenericName[hu]=Webböngésző +GenericName[hy_AM]=Վեբ դիտարկիչ +GenericName[hye]=Web Browser +GenericName[ia]=Navigator web +GenericName[id]=Peramban Web +GenericName[is]=Vafri +GenericName[it]=Browser web +GenericName[ja]=ウェブブラウザー +GenericName[ka]=ბრ�უზერი +GenericName[kab]=Iminig web +GenericName[kk]=Веб-браузері +GenericName[km]=Web Browser +GenericName[kn]=Web Browser +GenericName[ko]=웹 브�우저 +GenericName[lij]=Navegatô Web +GenericName[lo]=ຕົວ​ທ່ອງ​ເວັບ​ເວັບ​ໄຊ​ຕ​໌ +GenericName[lt]=Web Browser +GenericName[ltg]=Web Browser +GenericName[lv]=Tīmekļa p�rlūks +GenericName[meh]=Web Browser +GenericName[mk]=Web Browser +GenericName[ml]=ഗോളാന�തരവല അന�വേഷിയന�ത�രം +GenericName[mr]=Web Browser +GenericName[ms]=Web Browser +GenericName[my]=Web Browser +GenericName[nb_NO]=Nettleser +GenericName[ne_NP]=वेब ब�राउजर +GenericName[nl]=Webbrowser +GenericName[nn_NO]=Nettlesar +GenericName[oc]=Navegador Web +GenericName[pa_IN]=ਵੈੱਬ ਬਰਾਊਜ਼ਰ +GenericName[pl]=Przeglądarka internetowa +GenericName[pt_BR]=Navegador web +GenericName[pt_PT]=Navegador Web +GenericName[rm]=Navigatur web +GenericName[ro]=Browser web +GenericName[ru]=Веб-браузер +GenericName[sat]=ᱣᱮᱵᱽ ᱵᱽᱨᱟᱣᱡᱚᱨ +GenericName[sc]=Navigadore web +GenericName[sco]=Web Browser +GenericName[si]=වියමන අතිරික්සුව +GenericName[sk]=Webový prehliada� +GenericName[skr]=ویب براؤزر +GenericName[sl]=Spletni brskalnik +GenericName[son]=Web Browser +GenericName[sq]=Shfletues +GenericName[sr]=Веб прегледач +GenericName[sv_SE]=Webbläsare +GenericName[szl]=Web Browser +GenericName[ta]=Web Browser +GenericName[te]=జాల విహారిణి +GenericName[tg]=Браузери веб +GenericName[th]=เว็บเบราว์เซอร์ +GenericName[tl]=Web Browser +GenericName[tr]=Web Tarayıcısı +GenericName[trs]=Web riña g�chē nu’ +GenericName[uk]=Браузер +GenericName[ur]=Web Browser +GenericName[uz]=Web Browser +GenericName[vi]=Trình duyệt web +GenericName[wo]=Web Browser +GenericName[xh]=Web Browser +GenericName[zh_CN]=Web �览器 +GenericName[zh_TW]=網��覽器 +Keywords=Internet;WWW;Browser;Web;Explorer; +Keywords[ach]=Internet;WWW;Browser;Web;Explorer; +Keywords[af]=Internet;WWW;Browser;Web;Explorer; +Keywords[an]=Internet;WWW;Browser;Web;Explorer; +Keywords[ar]=إنترنت;WWW;متص�ح;ويب;مستكش�; +Keywords[ast]=Internet;WWW;Browser;Web;Explorer; +Keywords[az]=Internet;WWW;Browser;Web;Explorer; +Keywords[be]=Internet;WWW;Browser;Web;Explorer; +Keywords[bg]=Internet;WWW;Browser;Web;Explorer; +Keywords[bn]=ইন�টারনেট;WWW;ব�রাউজার;ওয়েব;�ক�সপ�লোরার; +Keywords[bqi]=Internet;WWW;Browser;Web;Explorer; +Keywords[br]=Internet;WWW;Merdeer;Web;Ergerzhout; +Keywords[brx]=Internet;WWW;Browser;Web;Explorer; +Keywords[bs]=Internet;WWW;Pretraživa�;Web;Istraživa�; +Keywords[ca]=Internet;WWW;Browser;Web;Explorador;Navegador; +Keywords[ca_valencia]=Internet;WWW;Browser;Web;Explorer; +Keywords[cak]=K'amaya'l;WWW;Okik'amaya'l;Kanob'äl; +Keywords[ckb]=Internet;WWW;Browser;Web;Explorer; +Keywords[cs]=internet;WWW;prohlíže�;web; +Keywords[cy]=Rhyngrwyd;WWW;Porwr;Gwe;Archwiliwr; +Keywords[da]=Internet;WWW;Browser;Nettet;Explorer; +Keywords[de]=Internet;WWW;Browser;Web;Explorer; +Keywords[dsb]=Internet;WWW;wobglědowak;Web;Explorer; +Keywords[el]=Internet;WWW;Browser;Web;Explorer;Διαδίκτυο;Ιστός;Ίντε�νετ; +Keywords[en_CA]=Internet;WWW;Browser;Web;Explorer; +Keywords[en_GB]=Internet;WWW;Browser;Web;Explorer; +Keywords[eo]=Interreto;Retumilo;TTT;Teksaĵo;Reto;Internet;WWW;Browser;Web;Explorer; +Keywords[es_AR]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_CL]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_ES]=Internet;WWW;Navegador;Web;Explorador; +Keywords[es_MX]=Internet;WWW;Navegador;Web;Explorador; +Keywords[et]=Internet;WWW;Browser;Web;Explorer; +Keywords[eu]=Internet;WWW;Nabigatzailea;Web;Arakatzailea; +Keywords[fa]=Internet;WWW;Browser;Web;Explorer; +Keywords[ff]=Internet;WWW;Browser;Web;Explorer; +Keywords[fi]=Internet;WWW;Browser;Web;Explorer;netti;webbi;selain; +Keywords[fr]=Internet;WWW;Navigateur;Web;Explorer; +Keywords[fur]=Internet;WWW;Browser;Navigadôr;Web;Esploradôr;Explorer; +Keywords[fy_NL]=Ynternet;WWW;Browser;Web;Ferkenner; +Keywords[ga_IE]=Internet;WWW;Browser;Web;Explorer; +Keywords[gd]=Internet;WWW;Browser;Web;Explorer;eadar-lìon;brabhsair;brobhsair;lìon;taisgealaiche; +Keywords[gl]=Internet;WWW;Navegador;Web;Explorador; +Keywords[gn]=Internet;WWW;Browser;Web;Explorer; +Keywords[gu_IN]=Internet;WWW;Browser;Web;Explorer; +Keywords[he]=�ינטרנט;WWW;דפדפן;רשת;סייר;מרשתת; +Keywords[hi_IN]=Internet;WWW;Browser;Web;Explorer; +Keywords[hr]=Internet;WWW;Preglednik;Web;Istraživa�; +Keywords[hsb]=Internet;WWW;wobhladowak;Web;Explorer; +Keywords[hu]=Internet;WWW;Böngésző;Web;Világháló; +Keywords[hy_AM]=Համա�ան�,WWW,Զննիչ,Վեբ,Ցան�ախույզ: +Keywords[hye]=Internet;WWW;Browser;Web;Explorer; +Keywords[ia]=Internet;WWW;Navigator;Web;Explorator; +Keywords[id]=Internet;WWW;Browser;Web;Explorer; +Keywords[is]=Internet;WWW; Vafri; Vefur; Explorer; +Keywords[it]=Internet;WWW;Browser;Web;Explorer;Navigatore; +Keywords[ja]=Internet;WWW;Browser;Web;Explorer;インター�ット;ブラウザー;ウェブ; +Keywords[ka]=ინტერნეტი;WWW;ბრ�უზერი;ქსელი;ქსელთ�ნ წვდ�მ�; +Keywords[kab]=Internet;WWW;Browser;Web;Explorer; +Keywords[kk]=Internet;WWW;Browser;Web;Explorer;Интернет;Ғаламтор;Браузер;Желі;Шолғыш; +Keywords[km]=Internet;WWW;Browser;Web;Explorer; +Keywords[kn]=Internet;WWW;Browser;Web;Explorer; +Keywords[ko]=�터넷;브�우저;웹;�색기;Internet;WWW;Browser;Web;Explorer; +Keywords[lij]=Internet;WWW;Browser;Web;Explorer;Navegatô; +Keywords[lo]=Internet;WWW;Browser;Web;Explorer; +Keywords[lt]=Internet;WWW;Browser;Web;Explorer; +Keywords[ltg]=Internet;WWW;Browser;Web;Explorer; +Keywords[lv]=Internets;WWW;P�rlūkprogramma;Tīmeklis; +Keywords[meh]=Internet;WWW;Browser;Web;Explorer; +Keywords[mk]=Internet;WWW;Browser;Web;Explorer; +Keywords[ml]=ഗോളാന�തരവല;WWW;അന�വേഷിയന�ത�രം;ഗോളാന�തരവല;ആരായൻ; +Keywords[mr]=Internet;WWW;Browser;Web;Explorer; +Keywords[ms]=Internet;WWW;Browser;Web;Explorer; +Keywords[my]=Internet;WWW;Browser;Web;Explorer; +Keywords[nb_NO]=Internett;WWW;Nettleser;Web;Utforsker; +Keywords[ne_NP]=Internet;WWW;Browser;Web;Explorer; +Keywords[nl]=Internet;WWW;Browser;Web;Verkenner; +Keywords[nn_NO]=Internett;WWW;Nettlesar;Web;Utforskar; +Keywords[oc]=Internet;WWW;Navegador;Navigador;Navegator;Navigator;Web;Explorer; +Keywords[pa_IN]=ਇੰਟਰਨੈੱਟ;WWW;ਬਰਾਊਜ਼ਰ;ਵੈੱਬ;�ਕਸਪਲਰੋਰ;ਵੈਬ;ਇੰਟਰਨੈਟ; +Keywords[pl]=Internet;WWW;Przeglądarka;Browser;Wyszukiwarka;Web;Sieć;Explorer;Eksplorer;Strony;Witryny;internetowe; +Keywords[pt_BR]=Internet;WWW;Browser;Web;Explorer;Navegador; +Keywords[pt_PT]=Internet;WWW;Navegador;Web;Explorador; +Keywords[rm]=Internet;WWW;Browser;Web;Explorer;navigatur; +Keywords[ro]=Internet; WWW; Browser; Web; Explorer; +Keywords[ru]=Сеть;Интернет;Браузер;До�туп в Интернет; +Keywords[sat]=Internet;WWW;Browser;Web;Explorer; +Keywords[sc]=Internet;WWW;Navigadore;Web;Explorer; +Keywords[sco]=Internet;WWW;Browser;Web;Explorer; +Keywords[si]=අන්තර්ජ�ලය;අතිරික්සුව;පිරික්සන්න;ගවේ�කය;Internet;WWW;Browser;Web;Explorer; +Keywords[sk]=Internet;WWW;Prehliada�;Web;Prieskumník; +Keywords[skr]=Internet;WWW;Browser;Web;Explorer; +Keywords[sl]=internet;www;brskalnik;splet; +Keywords[son]=Internet;WWW;Browser;Web;Explorer; +Keywords[sq]=Internet;WWW;Shfletues;Web;Eksplorues; +Keywords[sr]=Internet;WWW;Browser;Web;Explorer;интернет;њњњ;веб;мрежа;прегледач;ек�плорер;internet;pregleda�;veb;mreža;pregleda�;eksplorer; +Keywords[sv_SE]=Internet;WWW;Webbläsare;Webb;Utforskare; +Keywords[szl]=Internet;WWW;Browser;Web;Explorer; +Keywords[ta]=Internet;WWW;Browser;Web;Explorer; +Keywords[te]=Internet;WWW;Browser;Web;Explorer; +Keywords[tg]=Интернет;WWW;Браузер;Сомона;Ҷу�туҷӯгар; +Keywords[th]=อินเทอร์เน็ต;เบราว์เซอร์;เว็บ;Internet;WWW;Browser;Web;Explorer; +Keywords[tl]=Internet;WWW;Browser;Web;Explorer; +Keywords[tr]=Internet;WWW;Browser;Web;Explorer;İnternet;Tarayıcı; +Keywords[trs]=Internet;WWW;Browser;Web;Explorer; +Keywords[uk]=Інтернет;WWW;Браузер;Веб;Перегл�дач; +Keywords[ur]=Internet;WWW;Browser;Web;Explorer; +Keywords[uz]=Internet;WWW;Browser;Web;Explorer; +Keywords[vi]=Internet;WWW;Trình duyệt;Web;Duyệt web; +Keywords[wo]=Internet;WWW;Browser;Web;Explorer; +Keywords[xh]=Internet;WWW;Browser;Web;Explorer; +Keywords[zh_CN]=Internet;WWW;Browser;Web;Explorer; +Keywords[zh_TW]=網際網路;網路;�覽器;網�;上網;Internet;WWW;Browser;Web;Explorer; +Actions=new-window;new-blank-window;new-private-window;profilemanager; + +[Desktop Action new-window] +Exec=/opt/zen-browser-bin/zen-bin %u +Name=New Window +Name[ach]=New Window +Name[af]=New Window +Name[an]=New Window +Name[ar]=نا�ذة جديدة +Name[ast]=New Window +Name[az]=New Window +Name[be]=�овае акно +Name[bg]=�ов прозорец +Name[bn]=নত�ন উইন�ডো +Name[bqi]=نیمدری نۊ +Name[br]=Prenestr nevez +Name[brx]=New Window +Name[bs]=Novi prozor +Name[ca]=Finestra nova +Name[ca_valencia]=New Window +Name[cak]=K'ak'a' Tzuwäch +Name[ckb]=New Window +Name[cs]=Nové okno +Name[cy]=Ffenestr Newydd +Name[da]=Nyt vindue +Name[de]=Neues Fenster +Name[dsb]=Nowe wokno +Name[el]=�έο πα�άθυ�ο +Name[en_CA]=New Window +Name[en_GB]=New Window +Name[eo]=Nova fenestro +Name[es_AR]=Nueva ventana +Name[es_CL]=Nueva ventana +Name[es_ES]=Nueva ventana +Name[es_MX]=Nueva ventana +Name[et]=New Window +Name[eu]=Leiho berria +Name[fa]=پنجره جدید‌ +Name[ff]=New Window +Name[fi]=Uusi ikkuna +Name[fr]=Nouvelle fenêtre +Name[fur]=Gnûf barcon +Name[fy_NL]=Nij finster +Name[ga_IE]=New Window +Name[gd]=Uinneag ùr +Name[gl]=Nova xanela +Name[gn]=Ovetã pyahu +Name[gu_IN]=New Window +Name[he]=חלון חדש +Name[hi_IN]=New Window +Name[hr]=Novi prozor +Name[hsb]=Nowe wokno +Name[hu]=Új ablak +Name[hy_AM]=Նոր պատուհան +Name[hye]=New Window +Name[ia]=Nove fenestra +Name[id]=Jendela Baru +Name[is]=Nýr gluggi +Name[it]=Nuova finestra +Name[ja]=新��ウィンドウ +Name[ka]=�ხ�ლი ფ�ნჯ�რ� +Name[kab]=Asfaylu amaynut +Name[kk]=Жаңа терезе +Name[km]=បង្អួច​​​�្មី +Name[kn]=New Window +Name[ko]=새 창 +Name[lij]=Neuvo Barcon +Name[lo]=ວິນໂດໃ�່ +Name[lt]=New Window +Name[ltg]=New Window +Name[lv]=Jauns logs +Name[meh]=New Window +Name[mk]=New Window +Name[ml]=പ�തിയ ജാലകം +Name[mr]=New Window +Name[ms]=New Window +Name[my]=New Window +Name[nb_NO]=Nytt vindu +Name[ne_NP]=नया� सञ���याल +Name[nl]=Nieuw venster +Name[nn_NO]=Nytt vindauge +Name[oc]=Fenèstra novèla +Name[pa_IN]=ਨਵੀਂ ਵਿੰਡੋ +Name[pl]=Nowe okno +Name[pt_BR]=Nova janela +Name[pt_PT]=Nova janela +Name[rm]=Nova fanestra +Name[ro]=Fereastră nouă +Name[ru]=�овое окно +Name[sat]=ᱱᱟᱶᱟ ᱣᱤᱱᱰᱳ +Name[sc]=Ventana noa +Name[sco]=New Window +Name[si]=නව කවුළුව +Name[sk]=Nové okno +Name[skr]=نویں ونڈو +Name[sl]=Novo okno +Name[son]=New Window +Name[sq]=Dritare e Re +Name[sr]=�ови прозор +Name[sv_SE]=Nytt fönster +Name[szl]=New Window +Name[ta]=New Window +Name[te]=కొత�త కిటికీ +Name[tg]=Равзанаи нав +Name[th]=หน้าต่างใหม่ +Name[tl]=New Window +Name[tr]=Yeni pencere +Name[trs]=Bēntanâ n�kàa +Name[uk]=�ове вікно +Name[ur]=New Window +Name[uz]=New Window +Name[vi]=Cửa sổ mới +Name[wo]=New Window +Name[xh]=New Window +Name[zh_CN]=新建窗� +Name[zh_TW]=開新視窗 + +[Desktop Action new-blank-window] +Exec=/opt/zen-browser-bin/zen-bin --blank-window %u +Name=New Blank Window +Name[ach]=New Blank Window +Name[af]=New Blank Window +Name[an]=New Blank Window +Name[ar]=نا�ذة �ارغة جديدة +Name[ast]=New Blank Window +Name[az]=New Blank Window +Name[be]=�овае пу�тое акно +Name[bg]=�ов празен прозорец +Name[bn]=নত�ন ফা�কা উইন�ডো +Name[bqi]=نیمدری نۊ خالی +Name[br]=Prenestr goulloù nevez +Name[brx]=New Blank Window +Name[bs]=Novi prazni prozor +Name[ca]=Finestra en blanc nova +Name[ca_valencia]=New Blank Window +Name[cak]=K'ak'a' Tzuwäch K'axk'ol +Name[ckb]=New Blank Window +Name[cs]=Nové prázdné okno +Name[cy]=Ffenestr Wag Newydd +Name[da]=Nyt tomt vindue +Name[de]=Neues leeres Fenster +Name[dsb]=Nowe prázdne wokno +Name[el]=�έο κενό πα�άθυ�ο +Name[en_CA]=New Blank Window +Name[en_GB]=New Blank Window +Name[eo]=Nova malplena fenestro +Name[es_AR]=Nueva ventana en blanco +Name[es_CL]=Nueva ventana en blanco +Name[es_ES]=Nueva ventana en blanco +Name[es_MX]=Nueva ventana en blanco +Name[et]=New Blank Window +Name[eu]=Leiho huts berri +Name[fa]=پنجره خالی جدید +Name[ff]=New Blank Window +Name[fi]=Uusi tyhjä ikkuna +Name[fr]=Nouvelle fenêtre vierge +Name[fur]=Gnûf barcon vuot +Name[fy_NL]=Nij leeg finster +Name[ga_IE]=New Blank Window +Name[gd]=Uinneag bhàn ùr +Name[gl]=Nova xanela en branco +Name[gn]=Ovetã ñemi pyahu +Name[gu_IN]=New Blank Window +Name[he]=חלון ריק חדש +Name[hi_IN]=New Blank Window +Name[hr]=Novi prazni prozor +Name[hsb]=Nowe prázdne wokno +Name[hu]=Új üres ablak +Name[hy_AM]=Նոր դատարկ պատուհան +Name[hye]=New Blank Window +Name[ia]=Nove fenestra vacue +Name[id]=Jendela Kosong Baru +Name[is]=Nýr tómur gluggi +Name[it]=Nuova finestra vuota +Name[ja]=新��空白�ウィンドウ +Name[ka]=�ხ�ლი ც�რიელი ფ�ნჯ�რ� +Name[kab]=Asfaylu amaynut n tunigin tusligt +Name[kk]=Жаңа бо� терезе +Name[km]=បង្អួច​�្មី​ឯកជន +Name[kn]=New Blank Window +Name[ko]=새 빈 창 +Name[lij]=Neuvo Barcon Vuot +Name[lo]=ວິນໂດ�ອ່ງໃ�່ +Name[lt]=New Blank Window +Name[ltg]=New Blank Window +Name[lv]=Jauns tukšais logs +Name[meh]=New Blank Window +Name[mk]=New Blank Window +Name[ml]=പ�തിയ ശൂന�യ ജാലകം +Name[mr]=New Blank Window +Name[ms]=New Blank Window +Name[my]=New Blank Window +Name[nb_NO]=Nytt tomt vindu +Name[ne_NP]=नया� खाली सञ���याल +Name[nl]=Nieuw leeg venster +Name[nn_NO]=Nytt tomt vindauge +Name[oc]=Fenèstra en blanc novèla +Name[pa_IN]=ਨਵੀਂ ਖਾਲੀ ਵਿੰਡੋ +Name[pl]=Nowe puste okno +Name[pt_BR]=Nova janela em branco +Name[pt_PT]=Nova janela em branco +Name[rm]=Nova fanestra vacue +Name[ro]=Fereastră nouă și goală +Name[ru]=�овое пу�тое окно +Name[sat]=ᱱᱟᱶᱟ ᱣᱤᱱᱰᱳ ᱵᱽᱨᱟᱣᱡᱚᱨ +Name[sc]=Ventana en blanc noa +Name[sco]=New Blank Window +Name[si]=නව හිස් කවුළුව +Name[sk]=Nové prázdné okno +Name[skr]=نویں خالی ونڈو +Name[sl]=Novo prazno okno +Name[son]=New Blank Window +Name[sq]=Dritare e Re e Pafajshme +Name[sr]=�ови празни прозор +Name[sv_SE]=Nytt tomt fönster +Name[szl]=New Blank Window +Name[ta]=New Blank Window +Name[te]=కొత�త ఖాళీ కిటికీ +Name[tg]=Равзанаи холӣ нав +Name[th]=หน้าต่างว่างเปล่าใหม่ +Name[tl]=New Blank Window +Name[tr]=Yeni boş pencere +Name[trs]=Bēntanâ huì n�kàa +Name[uk]=�ове порожнє вікно +Name[ur]=New Blank Window +Name[uz]=New Blank Window +Name[vi]=Cửa sổ trống mới +Name[wo]=New Blank Window +Name[xh]=New Blank Window +Name[zh_CN]=新建空白窗� +Name[zh_TW]=開新空白視窗 + +[Desktop Action new-private-window] +Exec=/opt/zen-browser-bin/zen-bin --private-window %u +Name=New Private Window +Name[ach]=New Private Window +Name[af]=New Private Window +Name[an]=New Private Window +Name[ar]=نا�ذة خاصة جديدة +Name[ast]=New Private Window +Name[az]=New Private Window +Name[be]=�овае прыватнае акно +Name[bg]=�ов личен прозорец +Name[bn]=নত�ন ব�যক�তিগত উইন�ডো +Name[bqi]=نیمدری سیخومی نۊ +Name[br]=Prenestr prevez nevez +Name[brx]=New Private Window +Name[bs]=Novi privatni prozor +Name[ca]=Finestra privada nova +Name[ca_valencia]=New Private Window +Name[cak]=K'ak'a' Ichinan Tzuwäch +Name[ckb]=New Private Window +Name[cs]=Nové anonymní okno +Name[cy]=Ffenestr Breifat Newydd +Name[da]=Nyt privat vindue +Name[de]=Neues privates Fenster +Name[dsb]=Nowe priwatne wokno +Name[el]=�έο ιδιωτικό πα�άθυ�ο +Name[en_CA]=New Private Window +Name[en_GB]=New Private Window +Name[eo]=Nova privata fenestro +Name[es_AR]=Nueva ventana privada +Name[es_CL]=Nueva ventana privada +Name[es_ES]=Nueva ventana privada +Name[es_MX]=Nueva ventana privada +Name[et]=New Private Window +Name[eu]=Leiho pribatu berria +Name[fa]=پنجره ناشناس جدید +Name[ff]=New Private Window +Name[fi]=Uusi yksityinen ikkuna +Name[fr]=Nouvelle fenêtre privée +Name[fur]=Gnûf barcon privât +Name[fy_NL]=Nij priveefinster +Name[ga_IE]=New Private Window +Name[gd]=Uinneag phrìobhaideach ùr +Name[gl]=Nova xanela privada +Name[gn]=Ovetã ñemi pyahu +Name[gu_IN]=New Private Window +Name[he]=חלון פרטי חדש +Name[hi_IN]=New Private Window +Name[hr]=Novi privatni prozor +Name[hsb]=Nowe priwatne wokno +Name[hu]=Új privát ablak +Name[hy_AM]=Նոր գաղտնի պատուհան +Name[hye]=New Private Window +Name[ia]=Nove fenestra private +Name[id]=Jendela Mode Pribadi Baru +Name[is]=Nýr huliðsgluggi +Name[it]=Nuova finestra anonima +Name[ja]=新��プライベートウィンドウ +Name[ka]=�ხ�ლი პირ�დი ფ�ნჯ�რ� +Name[kab]=Asfaylu amaynut n tunigin tusligt +Name[kk]=Жаңа жекелік терезе +Name[km]=បង្អួច​ឯកជន​�្មី +Name[kn]=New Private Window +Name[ko]=새 사�활 보호 창 +Name[lij]=Neuvo Barcon Privòu +Name[lo]=ວິນໂດສ່ວນຕົວໃ�່ +Name[lt]=New Private Window +Name[ltg]=New Private Window +Name[lv]=Jauns priv�tais logs +Name[meh]=New Private Window +Name[mk]=New Private Window +Name[ml]=പ�തിയ സ�വകാര�യ ജാലകം +Name[mr]=New Private Window +Name[ms]=New Private Window +Name[my]=New Private Window +Name[nb_NO]=Nytt privat vindu +Name[ne_NP]=नया� निजी सञ���याल +Name[nl]=Nieuw privévenster +Name[nn_NO]=Nytt privat vindauge +Name[oc]=Fenèstra privada novèla +Name[pa_IN]=ਨਵੀਂ ਪ�ਰਾਈਵੇਟ ਵਿੰਡੋ +Name[pl]=Nowe okno prywatne +Name[pt_BR]=Nova janela privativa +Name[pt_PT]=Nova janela privada +Name[rm]=Nova fanestra privata +Name[ro]=Fereastră privată nouă +Name[ru]=�овое приватное окно +Name[sat]=ᱱᱟᱶᱟ ᱱᱤᱡᱮᱨᱟᱜ ᱣᱤᱱᱰᱳ +Name[sc]=Ventana privada noa +Name[sco]=New Private Window +Name[si]=නව පෞද්. කවුළුව +Name[sk]=Nové súkromné okno +Name[skr]=نویں نجی ونڈو +Name[sl]=Novo zasebno okno +Name[son]=New Private Window +Name[sq]=Dritare e Re Private +Name[sr]=�ови приватни прозор +Name[sv_SE]=Nytt privat fönster +Name[szl]=New Private Window +Name[ta]=New Private Window +Name[te]=కొత�త ఆంతరంగిక కిటికీ +Name[tg]=Равзанаи ху�у�ии нав +Name[th]=หน้าต่างส่วนตัวใหม่ +Name[tl]=New Private Window +Name[tr]=Yeni gizli pencere +Name[trs]=Bēntanâ huì n�kàa +Name[uk]=Приватне вікно +Name[ur]=New Private Window +Name[uz]=New Private Window +Name[vi]=Cửa sổ riêng tư mới +Name[wo]=New Private Window +Name[xh]=New Private Window +Name[zh_CN]=新建��窗� +Name[zh_TW]=開新隱�視窗 + +[Desktop Action profilemanager] +Exec=/opt/zen-browser-bin/zen-bin --ProfileManager %u +Name=Open Profile Manager +Name[ach]=Open Profile Manager +Name[af]=Open Profile Manager +Name[an]=Open Profile Manager +Name[ar]=ا�تح مدير المل� الشخصي +Name[ast]=Open Profile Manager +Name[az]=Open Profile Manager +Name[be]=�дкрыць менеджар профіл�ў +Name[bg]=Отвар�не на мениджъра на профили +Name[bn]=Open Profile Manager +Name[bqi]=گۊشیڌن دؽوۉداری پورو�ایل +Name[br]=Digeriñ an ardoer aeladoù +Name[brx]=Open Profile Manager +Name[bs]=Otvori Menadžera profila +Name[ca]=Obre el gestor de perfils +Name[ca_valencia]=Open Profile Manager +Name[cak]=Open Profile Manager +Name[ckb]=Open Profile Manager +Name[cs]=Otevřít Správce profilů +Name[cy]=Agorwch y Rheolwr Proffil +Name[da]=Åbn profilhåndtering +Name[de]=Profilverwaltung öffnen +Name[dsb]=Profilowy zastojnik wócyniś +Name[el]=Άνοιγμα Διαχεί�ισης π�οφίλ +Name[en_CA]=Open Profile Manager +Name[en_GB]=Open Profile Manager +Name[eo]=Malfermi administranton de profiloj +Name[es_AR]=Abrir administrador de perfiles +Name[es_CL]=Abrir administrador de perfiles +Name[es_ES]=Abrir administrador de perfiles +Name[es_MX]=Abrir administrador de perfiles +Name[et]=Open Profile Manager +Name[eu]=Ireki profilen kudeatzailea +Name[fa]=گشودن مدیر نمایه +Name[ff]=Open Profile Manager +Name[fi]=Avaa profiilien hallinta +Name[fr]=Ouvrir le gestionnaire de profils +Name[fur]=Vierç gjestôr profîi +Name[fy_NL]=Profylbehearder iepenje +Name[ga_IE]=Open Profile Manager +Name[gd]=Fosgail manaidsear nam pròifilean +Name[gl]=Abrir o xestor de perfís +Name[gn]=Embojuruja mba’ete ñangarekoha +Name[gu_IN]=Open Profile Manager +Name[he]=פתיחת מנהל הפרופילי� +Name[hi_IN]=Open Profile Manager +Name[hr]=Otvori upravlja� profila +Name[hsb]=Zrjadowak profilow wo�inić +Name[hu]=Profilkezelő megnyitása +Name[hy_AM]=Բա�եք պրոֆիլի կառավարիչը +Name[hye]=Open Profile Manager +Name[ia]=Aperir le gestor de profilo +Name[id]=Buka Pengelola Profil +Name[is]=Opna umsýslu notandasniða +Name[it]=Apri gestore profili +Name[ja]=プロファイルマ�ージャーを開� +Name[ka]=პრ�ფილის მმ�რთველის გ�ხსნ� +Name[kab]=Ldi amsefrak n umaɣnu +Name[kk]=Профильдер бақарушы�ын ашу +Name[km]=Open Profile Manager +Name[kn]=Open Profile Manager +Name[ko]=프로필 관리� 열기 +Name[lij]=Open Profile Manager +Name[lo]=ເປີດຕົວຈັດ�ານໂປຣໄຟລ໌ +Name[lt]=Open Profile Manager +Name[ltg]=Open Profile Manager +Name[lv]=Atvērt profilu p�rvaldnieku +Name[meh]=Open Profile Manager +Name[mk]=Open Profile Manager +Name[ml]=രൂപരേഖ മാനേചർ +Name[mr]=Open Profile Manager +Name[ms]=Open Profile Manager +Name[my]=Open Profile Manager +Name[nb_NO]=Åpne profilbehandler +Name[ne_NP]=Open Profile Manager +Name[nl]=Profielbeheerder openen +Name[nn_NO]=Opne profilhandsaming +Name[oc]=Dobrir lo gestionari de perfils +Name[pa_IN]=ਪਰੋਫ਼ਾਈਲ ਮੈਨੇਜਰ ਖੋਲ�ਹੋ +Name[pl]=Menedżer profili +Name[pt_BR]=Abrir gerenciador de perfis +Name[pt_PT]=Abrir o Gestor de Perfis +Name[rm]=Avrir l'administraziun da profils +Name[ro]=Deschide managerul de profiluri +Name[ru]=Открыть менеджер профилей +Name[sat]=ᱢᱮᱫᱦᱟᱸ ᱢᱮᱱᱮᱡᱚᱨ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ +Name[sc]=Aberi su gestore de profilos +Name[sco]=Open Profile Manager +Name[si]=ප�තිකඩ කළමන�කරු අරින්න +Name[sk]=Otvoriť Správcu profilov +Name[skr]=پرو�ائل منیجر کھولو +Name[sl]=Odpri upravitelja profilov +Name[son]=Open Profile Manager +Name[sq]=Hapni Përgjegjës Profilesh +Name[sr]=Отворите управљач профила +Name[sv_SE]=Öppna Profilhanteraren +Name[szl]=Open Profile Manager +Name[ta]=Open Profile Manager +Name[te]=Open Profile Manager +Name[tg]=Кушодани мудири профилҳо +Name[th]=เปิดตัวจัด�ารโปรไฟล์ +Name[tl]=Open Profile Manager +Name[tr]=Profil yöneticisini aç +Name[trs]=Sa nīk�j ñu’ūnj nej perfî hu� nì’nï̀nj ïn +Name[uk]=Відкрити менеджер профілів +Name[ur]=Open Profile Manager +Name[uz]=Open Profile Manager +Name[vi]=Mở trình quản lý hồ sơ +Name[wo]=Open Profile Manager +Name[xh]=Open Profile Manager +Name[zh_CN]=打开�置文件管�器 +Name[zh_TW]=開啟設定檔管�員 From 41e6307d039d35e659409120573b4ce594d54833 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sat, 26 Sep 2026 16:53:24 -0400 Subject: [PATCH 55/55] microsoft-edge-stable-bin: drop the Debian cron job The deb's /etc/cron.daily/microsoft-edge runs a script that writes an apt keyring to /usr/share/keyrings every day. pacman doesn't track that file, so it stays behind after Edge is removed. Remove the cron job and its script the way the Chrome recipe already does, and skip the empty /etc left behind. pkgrel 2 so this build replaces AUR-installed copies. Found in a Codex review. Co-Authored-By: Claude Opus 5.5 (1M context) --- pkgbuilds/microsoft-edge-stable-bin/PKGBUILD | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkgbuilds/microsoft-edge-stable-bin/PKGBUILD b/pkgbuilds/microsoft-edge-stable-bin/PKGBUILD index 5ed7df3..bc68b0f 100644 --- a/pkgbuilds/microsoft-edge-stable-bin/PKGBUILD +++ b/pkgbuilds/microsoft-edge-stable-bin/PKGBUILD @@ -11,7 +11,7 @@ _pkgname=microsoft-edge _pkgshortname=msedge _channel=stable pkgver=154.0.4258.37 -pkgrel=1 +pkgrel=2 pkgdesc="A browser that combines a minimal design with sophisticated technology to make the web faster, safer, and easier" arch=('x86_64') url="https://www.microsoftedgeinsider.com/en-us/download" @@ -29,7 +29,7 @@ optdepends=( 'ttf-liberation: fix fonts for some PDFs - CRBug #369991' 'xdg-utils' ) -options=(!strip !zipman) +options=(!strip !zipman !emptydirs) source=("https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-stable/${_pkgname}-${_channel}_${pkgver}-1_amd64.deb" "microsoft-edge-stable.sh" "Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf") @@ -66,4 +66,9 @@ package() { # License install -Dm644 'Microsoft Standard Application License Terms - Standalone (free) Use Terms.pdf' "${pkgdir}/usr/share/licenses/${_pkgname}/LICENSE.pdf" rm "${pkgdir}/opt/microsoft/${_pkgshortname}"/product_logo_*.png + + # Remove the Debian cron job, which installs an apt keyring pacman doesn't track + rm -r \ + "${pkgdir}/etc/cron.daily/" \ + "${pkgdir}/opt/microsoft/${_pkgshortname}/cron/" }