detached 46fd2a1

Merge branch 'feat/x8' into feat/xwayland-builtin

commit
46fd2a1ab98e669e15fe42582f30083891cb61db
author
brice · · 2026-10-22 15:49 UTC
committer
brice · · 2026-10-22 17:55 UTC
merge of
c5b7312 + 3df83c3 · diff against the first parent
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
29 files · +3797 -2972
M Makefile +1 -1
@@ -70,7 +70,7 @@ adapter-imports:
7070 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }
7171 # Fast, mandatory guards for tiled content publications and SHM copies.
7272 perf-check:
73- CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations)$$' -count=1
73+ CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations)$$' -count=1
7474 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=1
7575 check: vet test arch fakes-check log-check perf-check
7676
@@ -70,7 +70,7 @@ adapter-imports:
70 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }70 [ -z "$$bad" ] || { echo "$$bad"; echo 'adapter imports another adapter: use ports or a shared library (Makefile ADAPTER_LIBS)' >&2; exit 1; }
71 # Fast, mandatory guards for tiled content publications and SHM copies.71 # Fast, mandatory guards for tiled content publications and SHM copies.
72 perf-check:72 perf-check:
73- CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations)$$' -count=173+ CGO_ENABLED=0 go test ./internal/core ./internal/app ./internal/adapters/drm ./internal/adapters/headless ./internal/adapters/vulkan ./internal/adapters/wayland ./internal/adapters/outputkit/capture ./internal/adapters/screencast ./internal/adapters/wayland/xwm -run '^(TestAnimateAllocations|TestPublishAllocations|TestPublishSubscribersAllocations|TestPublishStashSlideAllocations|TestPublishOverviewAllocations|TestPublishLeavingAllocations|TestOutputRoutingAllocations|TestReportSeenAllocations|TestFrameLifecycleTransitionsAllocations|TestFullscreenShownAllocations|TestFrameDecisionAllocations|TestCommitFrameAllocations|TestColorPipelineAllocations|TestShownBySnapshotAllocations|TestFlipShowsAllocations|TestMRUNoteFocusDoesNotAllocateWhenSettled|TestDueFramesAllocations|TestRenderSteadyStateAllocations|TestRenderSteadyStateDMABufAllocations|TestSceneOpaqueRegionAllocations|TestSceneDeltaAllocations|TestAccountFlipAllocations|TestFlipDoneAllocations|TestSceneWalkUnchangedTiledSHM|TestTiledCommitPublishAllocations|TestCapturedCommitApplyAllocations|TestCapturedViewportApplyAllocations|TestEffectiveInputEmptyTreeAllocations|TestHeadlessTiledSHMCallbackAndCopyBudget|TestReleaseHeldAllocations|TestCommitDamageAllocations|TestEmitContentAllocations|TestPresentationPushAllocations|TestAnimatingFrameSendAllocations|TestContentBatchCycleAllocations|TestWriteMappedAllocations|TestCapturedForwardAllocations|TestCommandForwardAllocations|TestOutboxQueuedDeliveryAllocations|TestCastFrameAllocations|TestCastProducerAllocations|TestCaptureCycleAllocations|TestLogScenesAllocations|TestOverviewNamedRowsAllocations|TestBufferContentAllocations|TestDueFramesFireScratch|TestRetireSemaphoreAllocatesNothing|TestTableLookupAllocations|TestTableInsertRemoveAllocations|TestPropertyUnchangedAllocations|TestDispatchAllocations|TestConfigureFlushAllocations|TestFocusAllocations|TestSpaceAllocations|TestUnmanagedGeometryAllocations|TestFocusInUnmanagedAllocations|TestUnmanagedPublishAllocations|TestUnmanagedHitAllocations|TestOverrideMovedUnchangedAllocations|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations)$$' -count=1
74 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=174 CGO_ENABLED=0 go test -tags xturbo_poison ./internal/adapters/wayland/xwm -count=1
75 check: vet test arch fakes-check log-check perf-check75 check: vet test arch fakes-check log-check perf-check
76 76
M README.md +1 -1
@@ -149,7 +149,7 @@ See [Configuration](docs/config.md) for all keys, actions, bindings and automati
149149 - Explicit sync carries client fences to the GPU and KMS, enabled by default with no flag. HDR10 on capable displays includes configurable SDR brightness.
150150 - Separate workspaces and fractional scale per output; workspaces move when a monitor is unplugged and return when it reconnects.
151151 - Hidden apps get frame callbacks once per second and the suspended state, whether on another workspace, in a hidden stash, off screen or under fullscreen. Captured windows keep their output's refresh rate.
152-- Steam and other X11 clients run through xwayland-satellite, or through the experimental built-in window manager (`xwayland = builtin`; shows menus, popups and tooltips; no clipboard or XSETTINGS yet). Wine can run natively on Wayland.
152+- Steam and other X11 clients run through xwayland-satellite, or through the experimental built-in window manager (`xwayland = builtin`; menus, popups and tooltips, fullscreen games with keyboard grab; no clipboard or XSETTINGS yet). Wine can run natively on Wayland.
153153
154154 ### Windows and workspaces
155155
@@ -149,7 +149,7 @@ See [Configuration](docs/config.md) for all keys, actions, bindings and automati
149 - Explicit sync carries client fences to the GPU and KMS, enabled by default with no flag. HDR10 on capable displays includes configurable SDR brightness.149 - Explicit sync carries client fences to the GPU and KMS, enabled by default with no flag. HDR10 on capable displays includes configurable SDR brightness.
150 - Separate workspaces and fractional scale per output; workspaces move when a monitor is unplugged and return when it reconnects.150 - Separate workspaces and fractional scale per output; workspaces move when a monitor is unplugged and return when it reconnects.
151 - Hidden apps get frame callbacks once per second and the suspended state, whether on another workspace, in a hidden stash, off screen or under fullscreen. Captured windows keep their output's refresh rate.151 - Hidden apps get frame callbacks once per second and the suspended state, whether on another workspace, in a hidden stash, off screen or under fullscreen. Captured windows keep their output's refresh rate.
152-- Steam and other X11 clients run through xwayland-satellite, or through the experimental built-in window manager (`xwayland = builtin`; shows menus, popups and tooltips; no clipboard or XSETTINGS yet). Wine can run natively on Wayland.152+- Steam and other X11 clients run through xwayland-satellite, or through the experimental built-in window manager (`xwayland = builtin`; menus, popups and tooltips, fullscreen games with keyboard grab; no clipboard or XSETTINGS yet). Wine can run natively on Wayland.
153 153
154 ### Windows and workspaces154 ### Windows and workspaces
155 155
M docs/config.md +4 -1
@@ -146,7 +146,7 @@ Rules place an app's windows when they first open.
146146 | `rule.<name>.width` | Column width in [cells](#column-widths), 1 to 16 |
147147
148148 ```ini
149-rule.games.app-id = steam_app_.*
149+rule.games.app-id = steam_app_\d+
150150 rule.games.workspace = 3
151151 rule.chat.app-id = discord|org\.telegram\..*
152152 rule.chat.workspace = chat
@@ -157,6 +157,9 @@ rule.calc.floating = on
157157
158158 - Every matching rule applies, in file order; later rules win.
159159 - A rule never moves your focus or view.
160+- Proton games (X11) use `steam_app_<id>` as app ID, taken from `WM_CLASS`.
161+- An X11 window that opens exactly on one output's area opens on that output, unless a rule sets `monitor`.
162+- A rule can float a Proton game: `rule.games.app-id = steam_app_\d+` with `rule.games.floating = on`. Without a rule, X11 games tile until they ask for fullscreen.
160163 - To find an app ID: `neferwl state | jq '.windows[].app_id'`.
161164
162165 ## Output placement
@@ -146,7 +146,7 @@ Rules place an app's windows when they first open.
146 | `rule.<name>.width` | Column width in [cells](#column-widths), 1 to 16 |146 | `rule.<name>.width` | Column width in [cells](#column-widths), 1 to 16 |
147 147
148 ```ini148 ```ini
149-rule.games.app-id = steam_app_.*149+rule.games.app-id = steam_app_\d+
150 rule.games.workspace = 3150 rule.games.workspace = 3
151 rule.chat.app-id = discord|org\.telegram\..*151 rule.chat.app-id = discord|org\.telegram\..*
152 rule.chat.workspace = chat152 rule.chat.workspace = chat
@@ -157,6 +157,9 @@ rule.calc.floating = on
157 157
158 - Every matching rule applies, in file order; later rules win.158 - Every matching rule applies, in file order; later rules win.
159 - A rule never moves your focus or view.159 - A rule never moves your focus or view.
160+- Proton games (X11) use `steam_app_<id>` as app ID, taken from `WM_CLASS`.
161+- An X11 window that opens exactly on one output's area opens on that output, unless a rule sets `monitor`.
162+- A rule can float a Proton game: `rule.games.app-id = steam_app_\d+` with `rule.games.floating = on`. Without a rule, X11 games tile until they ask for fullscreen.
160 - To find an app ID: `neferwl state | jq '.windows[].app_id'`.163 - To find an app ID: `neferwl state | jq '.windows[].app_id'`.
161 164
162 ## Output placement165 ## Output placement
M docs/desktop.md +9 -0
@@ -60,6 +60,15 @@ xwayland = off # no X11 support
6060
6161 With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.
6262
63+Games with `builtin`:
64+
65+- **Fullscreen:** an X11 window can ask for fullscreen (`_NET_WM_STATE_FULLSCREEN`) and leave it again; `toggle-fullscreen` works too. A request within 1 second of the window mapping is ignored, so a launcher that remembers a fullscreen size does not cover the windows it opens next. The app can ask again later.
66+- **Output:** a window that opens exactly at one output's area opens on that output, and its fullscreen fills it.
67+- **Keyboard grab:** an X11 app that grabs the keyboard inhibits the compositor binds only while it is focused and fullscreen; a windowed app cannot lock the binds. There is no escape bind, as with Wayland shortcut inhibitors; leave by unfullscreening from the app or switching away with the mouse.
68+- **Pointer:** mouse-look works through relative pointer and pointer constraints.
69+- **App ID:** Proton windows are named `steam_app_<id>`; match them with a [window rule](config.md#window-rules).
70+- **Bypass hint:** `_NET_WM_BYPASS_COMPOSITOR` is read but changes nothing; direct scanout is chosen from the window state.
71+
6372 ## Session locking
6473
6574 NeferWL supports `ext-session-lock-v1` with an external locker such as swaylock or hyprlock. The locker checks the password; NeferWL hides the desktop and blocks input.
@@ -60,6 +60,15 @@ xwayland = off # no X11 support
60 60
61 With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.61 With `xwayland = builtin` (experimental), neferwl starts `Xwayland` itself and manages X11 windows: they tile, take focus and close like Wayland windows. Menus, popups and tooltips of X11 apps are shown above their window and do not take the keyboard focus. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.
62 62
63+Games with `builtin`:
64+
65+- **Fullscreen:** an X11 window can ask for fullscreen (`_NET_WM_STATE_FULLSCREEN`) and leave it again; `toggle-fullscreen` works too. A request within 1 second of the window mapping is ignored, so a launcher that remembers a fullscreen size does not cover the windows it opens next. The app can ask again later.
66+- **Output:** a window that opens exactly at one output's area opens on that output, and its fullscreen fills it.
67+- **Keyboard grab:** an X11 app that grabs the keyboard inhibits the compositor binds only while it is focused and fullscreen; a windowed app cannot lock the binds. There is no escape bind, as with Wayland shortcut inhibitors; leave by unfullscreening from the app or switching away with the mouse.
68+- **Pointer:** mouse-look works through relative pointer and pointer constraints.
69+- **App ID:** Proton windows are named `steam_app_<id>`; match them with a [window rule](config.md#window-rules).
70+- **Bypass hint:** `_NET_WM_BYPASS_COMPOSITOR` is read but changes nothing; direct scanout is chosen from the window state.
71+
63 ## Session locking72 ## Session locking
64 73
65 NeferWL supports `ext-session-lock-v1` with an external locker such as swaylock or hyprlock. The locker checks the password; NeferWL hides the desktop and blocks input.74 NeferWL supports `ext-session-lock-v1` with an external locker such as swaylock or hyprlock. The locker checks the password; NeferWL hides the desktop and blocks input.
M docs/dev/headless.md +8 -2
@@ -66,7 +66,7 @@ WAYLAND_DISPLAY=<name> go run ./examples/testime -preedit nihon -commit 日本
6666
6767 `make e2e-xwayland` runs the end-to-end test of the built-in window manager (`xwayland = builtin`). It is behind the `xwayland` build tag, so `go test ./...` and `make check` only compile it (`go vet -tags xwayland`). It needs `Xwayland` on `PATH` and a GPU, and skips without Xwayland.
6868
69-The test starts a headless NeferWL with a real `Xwayland` on the first free X display (a live session's `:0` stays untouched) and runs `internal/app/testdata/x11probe`, a small X11 client (`-class`, `-title`, `-size`, `-sleep`) that paints its window green, prints `mapped WxH` and `focus`, and exits 0 on `WM_DELETE_WINDOW`. With `-override` it also maps a magenta override-redirect window (`-override-at`, `-override-size`, `-override-type menu|tooltip`, `-override-for`, `-override-shape`, `-override-dismiss-on-focusout`) and prints `override mapped`, `override unmapped` or `dismissed`. It checks:
69+The test starts a headless NeferWL with a real `Xwayland` on the first free X display (a live session's `:0` stays untouched) and runs `internal/app/testdata/x11probe`, a small X11 client (`-class`, `-title`, `-size`, `-sleep`, `-at X,Y`) that paints its window green, prints `mapped WxH` and `focus`, and exits 0 on `WM_DELETE_WINDOW`. With `-override` it also maps a magenta override-redirect window (`-override-at`, `-override-size`, `-override-type menu|tooltip`, `-override-for`, `-override-shape`, `-override-dismiss-on-focusout`) and prints `override mapped`, `override unmapped` or `dismissed`. `-fullscreen` (with `-fullscreen-delay`, `-fullscreen-off`) requests `_NET_WM_STATE_FULLSCREEN` by client message and prints `fullscreen WxH` / `fullscreen off WxH` when the window manager publishes the state; `-keyboard-grab` calls `XGrabKeyboard` and prints `grab`. `-at` also sends a ConfigureRequest with the window rect before the map, like games do. It checks:
7070
7171 - the state lists one visible `X11Probe` window with the probe's pid, and the screenshot is mostly green inside its tile;
7272 - the probe receives focus;
@@ -74,7 +74,13 @@ The test starts a headless NeferWL with a real `Xwayland` on the first free X di
7474 - `key Super+q` closes the focused probe within 2 seconds and the state drops to one window;
7575 - an override-redirect menu is drawn magenta above the green toplevel at its X position, is not listed in the state, leaves focus on the toplevel and disappears from the screenshot once the probe unmaps it;
7676 - a menu is dismissed when its owner gets `FocusOut` because another X11 window took the focus;
77-- a menu with an empty input shape is still drawn and still not a window.
77+- a menu with an empty input shape is still drawn and still not a window;
78+- a fullscreen request 1.5 s after the map fills the output (all green, no gap) and `Super+Shift+f` leaves it; the client can also leave it itself; a request at the map stays tiled (the 1 s grace);
79+- with the keyboard grab, `Super+q` does not close a fullscreen focused client and works again once it leaves fullscreen; on a windowed client it closes it;
80+- on two outputs, a window created at the second output's origin opens on `HEADLESS-2` and fullscreens there;
81+- a window rule `rule.games.app-id = steam_app_\d+` floats an X11 window of class `steam_app_413150`, and not another class.
82+
83+Not covered headless: relative pointer lock (needs a real pointer device) and Xwayland output hotplug (`--size` is fixed); these are unit-tested in the `wayland` adapter.
7884
7985 Run it by hand with `go test -tags xwayland -race ./internal/app -run TestXwayland -count=1 -v`.
8086
@@ -66,7 +66,7 @@ WAYLAND_DISPLAY=<name> go run ./examples/testime -preedit nihon -commit 日本
66 66
67 `make e2e-xwayland` runs the end-to-end test of the built-in window manager (`xwayland = builtin`). It is behind the `xwayland` build tag, so `go test ./...` and `make check` only compile it (`go vet -tags xwayland`). It needs `Xwayland` on `PATH` and a GPU, and skips without Xwayland.67 `make e2e-xwayland` runs the end-to-end test of the built-in window manager (`xwayland = builtin`). It is behind the `xwayland` build tag, so `go test ./...` and `make check` only compile it (`go vet -tags xwayland`). It needs `Xwayland` on `PATH` and a GPU, and skips without Xwayland.
68 68
69-The test starts a headless NeferWL with a real `Xwayland` on the first free X display (a live session's `:0` stays untouched) and runs `internal/app/testdata/x11probe`, a small X11 client (`-class`, `-title`, `-size`, `-sleep`) that paints its window green, prints `mapped WxH` and `focus`, and exits 0 on `WM_DELETE_WINDOW`. With `-override` it also maps a magenta override-redirect window (`-override-at`, `-override-size`, `-override-type menu|tooltip`, `-override-for`, `-override-shape`, `-override-dismiss-on-focusout`) and prints `override mapped`, `override unmapped` or `dismissed`. It checks:69+The test starts a headless NeferWL with a real `Xwayland` on the first free X display (a live session's `:0` stays untouched) and runs `internal/app/testdata/x11probe`, a small X11 client (`-class`, `-title`, `-size`, `-sleep`, `-at X,Y`) that paints its window green, prints `mapped WxH` and `focus`, and exits 0 on `WM_DELETE_WINDOW`. With `-override` it also maps a magenta override-redirect window (`-override-at`, `-override-size`, `-override-type menu|tooltip`, `-override-for`, `-override-shape`, `-override-dismiss-on-focusout`) and prints `override mapped`, `override unmapped` or `dismissed`. `-fullscreen` (with `-fullscreen-delay`, `-fullscreen-off`) requests `_NET_WM_STATE_FULLSCREEN` by client message and prints `fullscreen WxH` / `fullscreen off WxH` when the window manager publishes the state; `-keyboard-grab` calls `XGrabKeyboard` and prints `grab`. `-at` also sends a ConfigureRequest with the window rect before the map, like games do. It checks:
70 70
71 - the state lists one visible `X11Probe` window with the probe's pid, and the screenshot is mostly green inside its tile;71 - the state lists one visible `X11Probe` window with the probe's pid, and the screenshot is mostly green inside its tile;
72 - the probe receives focus;72 - the probe receives focus;
@@ -74,7 +74,13 @@ The test starts a headless NeferWL with a real `Xwayland` on the first free X di
74 - `key Super+q` closes the focused probe within 2 seconds and the state drops to one window;74 - `key Super+q` closes the focused probe within 2 seconds and the state drops to one window;
75 - an override-redirect menu is drawn magenta above the green toplevel at its X position, is not listed in the state, leaves focus on the toplevel and disappears from the screenshot once the probe unmaps it;75 - an override-redirect menu is drawn magenta above the green toplevel at its X position, is not listed in the state, leaves focus on the toplevel and disappears from the screenshot once the probe unmaps it;
76 - a menu is dismissed when its owner gets `FocusOut` because another X11 window took the focus;76 - a menu is dismissed when its owner gets `FocusOut` because another X11 window took the focus;
77-- a menu with an empty input shape is still drawn and still not a window.77+- a menu with an empty input shape is still drawn and still not a window;
78+- a fullscreen request 1.5 s after the map fills the output (all green, no gap) and `Super+Shift+f` leaves it; the client can also leave it itself; a request at the map stays tiled (the 1 s grace);
79+- with the keyboard grab, `Super+q` does not close a fullscreen focused client and works again once it leaves fullscreen; on a windowed client it closes it;
80+- on two outputs, a window created at the second output's origin opens on `HEADLESS-2` and fullscreens there;
81+- a window rule `rule.games.app-id = steam_app_\d+` floats an X11 window of class `steam_app_413150`, and not another class.
82+
83+Not covered headless: relative pointer lock (needs a real pointer device) and Xwayland output hotplug (`--size` is fixed); these are unit-tested in the `wayland` adapter.
78 84
79 Run it by hand with `go test -tags xwayland -race ./internal/app -run TestXwayland -count=1 -v`.85 Run it by hand with `go test -tags xwayland -race ./internal/app -run TestXwayland -count=1 -v`.
80 86
M internal/adapters/wayland/alloc_hotpath_test.go +9 -0
@@ -246,3 +246,12 @@ func TestCommandForwardAllocations(t *testing.T) {
246246 t.Errorf("command push + merge + drain + stats: %.1f allocs, want 0", allocs)
247247 }
248248 }
249+
250+// A settled grab (none, or unchanged) is re-checked at every focus and
251+// configure without allocating.
252+func TestKeyboardGrabSyncAllocations(t *testing.T) {
253+ s := &Server{windows: map[ports.WindowID]*window{}}
254+ if n := testing.AllocsPerRun(100, s.syncKeyboardGrab); n != 0 {
255+ t.Fatalf("%v allocs", n)
256+ }
257+}
@@ -246,3 +246,12 @@ func TestCommandForwardAllocations(t *testing.T) {
246 t.Errorf("command push + merge + drain + stats: %.1f allocs, want 0", allocs)246 t.Errorf("command push + merge + drain + stats: %.1f allocs, want 0", allocs)
247 }247 }
248 }248 }
249+
250+// A settled grab (none, or unchanged) is re-checked at every focus and
251+// configure without allocating.
252+func TestKeyboardGrabSyncAllocations(t *testing.T) {
253+ s := &Server{windows: map[ports.WindowID]*window{}}
254+ if n := testing.AllocsPerRun(100, s.syncKeyboardGrab); n != 0 {
255+ t.Fatalf("%v allocs", n)
256+ }
257+}
M internal/adapters/wayland/globals.go +1 -0
@@ -14,6 +14,7 @@ func registerGlobals(d *server.Display, o Options, s *Server) error {
1414 for _, register := range []func() error{
1515 func() error { return registerXDG(d, s) },
1616 func() error { return registerXwaylandShell(d, s) },
17+ func() error { return registerXwaylandGrab(d, s) },
1718 func() error { return registerLayer(d, s) },
1819 func() error {
1920 // Advertise only with the production owner gate and authoritative
@@ -14,6 +14,7 @@ func registerGlobals(d *server.Display, o Options, s *Server) error {
14 for _, register := range []func() error{14 for _, register := range []func() error{
15 func() error { return registerXDG(d, s) },15 func() error { return registerXDG(d, s) },
16 func() error { return registerXwaylandShell(d, s) },16 func() error { return registerXwaylandShell(d, s) },
17+ func() error { return registerXwaylandGrab(d, s) },
17 func() error { return registerLayer(d, s) },18 func() error { return registerLayer(d, s) },
18 func() error {19 func() error {
19 // Advertise only with the production owner gate and authoritative20 // Advertise only with the production owner gate and authoritative
M internal/adapters/wayland/inhibit.go +5 -0
@@ -121,6 +121,11 @@ func (s *Server) syncInhibitors() {
121121 idle[in.window] = true
122122 }
123123 }
124+ // syncKeyboardGrab compares against xgrabbed: it is only written here.
125+ s.xgrabbed = s.xgrabWindow()
126+ if s.xgrabbed != 0 {
127+ shortcuts[s.xgrabbed] = true
128+ }
124129 for id, on := range diffSets(s.shortcutWindows, shortcuts) {
125130 s.emit(ports.ShortcutsInhibit{Window: id, Active: on})
126131 }
@@ -121,6 +121,11 @@ func (s *Server) syncInhibitors() {
121 idle[in.window] = true121 idle[in.window] = true
122 }122 }
123 }123 }
124+ // syncKeyboardGrab compares against xgrabbed: it is only written here.
125+ s.xgrabbed = s.xgrabWindow()
126+ if s.xgrabbed != 0 {
127+ shortcuts[s.xgrabbed] = true
128+ }
124 for id, on := range diffSets(s.shortcutWindows, shortcuts) {129 for id, on := range diffSets(s.shortcutWindows, shortcuts) {
125 s.emit(ports.ShortcutsInhibit{Window: id, Active: on})130 s.emit(ports.ShortcutsInhibit{Window: id, Active: on})
126 }131 }
M internal/adapters/wayland/seat.go +1 -0
@@ -456,6 +456,7 @@ func (s *Server) changeFocus(id ports.WindowID) {
456456 }
457457 s.textInputFocus()
458458 s.x11Focus()
459+ s.syncKeyboardGrab()
459460 s.log.Debug().Uint64("id", uint64(s.seat.focused)).Msg("keyboard focus")
460461 s.updateConstraint()
461462 }
@@ -456,6 +456,7 @@ func (s *Server) changeFocus(id ports.WindowID) {
456 }456 }
457 s.textInputFocus()457 s.textInputFocus()
458 s.x11Focus()458 s.x11Focus()
459+ s.syncKeyboardGrab()
459 s.log.Debug().Uint64("id", uint64(s.seat.focused)).Msg("keyboard focus")460 s.log.Debug().Uint64("id", uint64(s.seat.focused)).Msg("keyboard focus")
460 s.updateConstraint()461 s.updateConstraint()
461 }462 }
M internal/adapters/wayland/server.go +3 -0
@@ -274,6 +274,8 @@ type Server struct {
274274 // inhibitors are the live inhibitor objects (inhibit.go);
275275 // shortcutWindows and idleWindows what core was told.
276276 inhibitors []*inhibitor
277+ xgrab *xwaylandGrab // Xwayland keyboard grab (xwaylandgrab.go)
278+ xgrabbed ports.WindowID // window the grab inhibits for
277279 shortcutWindows, idleWindows map[ports.WindowID]bool
278280 // busInhibited is the last IdleInhibited value (idle.go).
279281 busInhibited bool
@@ -816,6 +818,7 @@ func (s *Server) apply(cmd ports.ClientCommand) {
816818 s.wakePacer() // reconsider FIFO barriers at the new period
817819 }
818820 w.sendConfigure()
821+ s.syncKeyboardGrab()
819822 s.toplevelChanged(w)
820823 if scanoutChanged && w.surf() != nil {
821824 s.dmabuf.resendSurface(w.surf())
@@ -274,6 +274,8 @@ type Server struct {
274 // inhibitors are the live inhibitor objects (inhibit.go);274 // inhibitors are the live inhibitor objects (inhibit.go);
275 // shortcutWindows and idleWindows what core was told.275 // shortcutWindows and idleWindows what core was told.
276 inhibitors []*inhibitor276 inhibitors []*inhibitor
277+ xgrab *xwaylandGrab // Xwayland keyboard grab (xwaylandgrab.go)
278+ xgrabbed ports.WindowID // window the grab inhibits for
277 shortcutWindows, idleWindows map[ports.WindowID]bool279 shortcutWindows, idleWindows map[ports.WindowID]bool
278 // busInhibited is the last IdleInhibited value (idle.go).280 // busInhibited is the last IdleInhibited value (idle.go).
279 busInhibited bool281 busInhibited bool
@@ -816,6 +818,7 @@ func (s *Server) apply(cmd ports.ClientCommand) {
816 s.wakePacer() // reconsider FIFO barriers at the new period818 s.wakePacer() // reconsider FIFO barriers at the new period
817 }819 }
818 w.sendConfigure()820 w.sendConfigure()
821+ s.syncKeyboardGrab()
819 s.toplevelChanged(w)822 s.toplevelChanged(w)
820 if scanoutChanged && w.surf() != nil {823 if scanoutChanged && w.surf() != nil {
821 s.dmabuf.resendSurface(w.surf())824 s.dmabuf.resendSurface(w.surf())
M internal/adapters/wayland/wire_client_test.go +3 -0
@@ -55,6 +55,7 @@ import (
5555 wire_xdgforeign "github.com/bnema/go-wayland-bindings/server/xdgforeign"
5656 wire_xdgoutput "github.com/bnema/go-wayland-bindings/server/xdgoutput"
5757 wire_xdgshell "github.com/bnema/go-wayland-bindings/server/xdgshell"
58+ wire_xwaylandkeyboardgrab "github.com/bnema/go-wayland-bindings/server/xwaylandkeyboardgrab"
5859 wire_xwaylandshell "github.com/bnema/go-wayland-bindings/server/xwaylandshell"
5960 wire_imagecapture "github.com/bnema/neferwl/internal/adapters/wayland/imagecapture"
6061 "github.com/bnema/purego-libwayland/server"
@@ -254,6 +255,8 @@ var wireSchemas = map[string]wireSchema{
254255 "zwp_text_input_v3": {wire_textinput.ZwpTextInputV3Interface, &client_textinput.TextInputV3{}, map[uint16]bool{0: true}, nil},
255256 "zwp_virtual_keyboard_manager_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardManagerV1Interface, &client_virtualkeyboard.VirtualKeyboardManager{}, nil, nil},
256257 "zwp_virtual_keyboard_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardV1Interface, &client_virtualkeyboard.VirtualKeyboard{}, map[uint16]bool{3: true}, nil},
258+ "zwp_xwayland_keyboard_grab_manager_v1": {wire_xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1Interface, nil, map[uint16]bool{0: true}, nil},
259+ "zwp_xwayland_keyboard_grab_v1": {wire_xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1Interface, nil, map[uint16]bool{0: true}, nil},
257260 "xwayland_shell_v1": {wire_xwaylandshell.XwaylandShellV1Interface, nil, map[uint16]bool{0: true}, nil},
258261 "xwayland_surface_v1": {wire_xwaylandshell.XwaylandSurfaceV1Interface, nil, map[uint16]bool{1: true}, nil},
259262 "zxdg_output_manager_v1": {wire_xdgoutput.ZxdgOutputManagerV1Interface, &client_xdgoutput.ZxdgOutputManager{}, map[uint16]bool{0: true}, nil},
@@ -55,6 +55,7 @@ import (
55 wire_xdgforeign "github.com/bnema/go-wayland-bindings/server/xdgforeign"55 wire_xdgforeign "github.com/bnema/go-wayland-bindings/server/xdgforeign"
56 wire_xdgoutput "github.com/bnema/go-wayland-bindings/server/xdgoutput"56 wire_xdgoutput "github.com/bnema/go-wayland-bindings/server/xdgoutput"
57 wire_xdgshell "github.com/bnema/go-wayland-bindings/server/xdgshell"57 wire_xdgshell "github.com/bnema/go-wayland-bindings/server/xdgshell"
58+ wire_xwaylandkeyboardgrab "github.com/bnema/go-wayland-bindings/server/xwaylandkeyboardgrab"
58 wire_xwaylandshell "github.com/bnema/go-wayland-bindings/server/xwaylandshell"59 wire_xwaylandshell "github.com/bnema/go-wayland-bindings/server/xwaylandshell"
59 wire_imagecapture "github.com/bnema/neferwl/internal/adapters/wayland/imagecapture"60 wire_imagecapture "github.com/bnema/neferwl/internal/adapters/wayland/imagecapture"
60 "github.com/bnema/purego-libwayland/server"61 "github.com/bnema/purego-libwayland/server"
@@ -254,6 +255,8 @@ var wireSchemas = map[string]wireSchema{
254 "zwp_text_input_v3": {wire_textinput.ZwpTextInputV3Interface, &client_textinput.TextInputV3{}, map[uint16]bool{0: true}, nil},255 "zwp_text_input_v3": {wire_textinput.ZwpTextInputV3Interface, &client_textinput.TextInputV3{}, map[uint16]bool{0: true}, nil},
255 "zwp_virtual_keyboard_manager_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardManagerV1Interface, &client_virtualkeyboard.VirtualKeyboardManager{}, nil, nil},256 "zwp_virtual_keyboard_manager_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardManagerV1Interface, &client_virtualkeyboard.VirtualKeyboardManager{}, nil, nil},
256 "zwp_virtual_keyboard_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardV1Interface, &client_virtualkeyboard.VirtualKeyboard{}, map[uint16]bool{3: true}, nil},257 "zwp_virtual_keyboard_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardV1Interface, &client_virtualkeyboard.VirtualKeyboard{}, map[uint16]bool{3: true}, nil},
258+ "zwp_xwayland_keyboard_grab_manager_v1": {wire_xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1Interface, nil, map[uint16]bool{0: true}, nil},
259+ "zwp_xwayland_keyboard_grab_v1": {wire_xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1Interface, nil, map[uint16]bool{0: true}, nil},
257 "xwayland_shell_v1": {wire_xwaylandshell.XwaylandShellV1Interface, nil, map[uint16]bool{0: true}, nil},260 "xwayland_shell_v1": {wire_xwaylandshell.XwaylandShellV1Interface, nil, map[uint16]bool{0: true}, nil},
258 "xwayland_surface_v1": {wire_xwaylandshell.XwaylandSurfaceV1Interface, nil, map[uint16]bool{1: true}, nil},261 "xwayland_surface_v1": {wire_xwaylandshell.XwaylandSurfaceV1Interface, nil, map[uint16]bool{1: true}, nil},
259 "zxdg_output_manager_v1": {wire_xdgoutput.ZxdgOutputManagerV1Interface, &client_xdgoutput.ZxdgOutputManager{}, map[uint16]bool{0: true}, nil},262 "zxdg_output_manager_v1": {wire_xdgoutput.ZxdgOutputManagerV1Interface, &client_xdgoutput.ZxdgOutputManager{}, map[uint16]bool{0: true}, nil},
M internal/adapters/wayland/x11window.go +1 -1
@@ -303,7 +303,7 @@ func (x *x11Window) tryMap() {
303303 if w.parent != nil && w.parent.mapped {
304304 parent = w.parent.id
305305 }
306- s.emit(ports.WindowMapped{ID: w.id, AppID: w.appID, PID: x.info.PID, Floating: w.floating, Width: w.floatW, Height: w.floatH, Parent: parent, Positioned: true, Modal: w.modal, Remap: w.gen > 1})
306+ s.emit(ports.WindowMapped{ID: w.id, AppID: w.appID, PID: x.info.PID, Floating: w.floating, Width: w.floatW, Height: w.floatH, Parent: parent, Positioned: true, Modal: w.modal, Remap: w.gen > 1, HasAt: x.info.HasAt, AtX: x.info.AtX, AtY: x.info.AtY})
307307 if x.info.Fullscreen {
308308 s.emit(ports.WindowFullscreenRequest{ID: w.id, Fullscreen: true})
309309 }
@@ -303,7 +303,7 @@ func (x *x11Window) tryMap() {
303 if w.parent != nil && w.parent.mapped {303 if w.parent != nil && w.parent.mapped {
304 parent = w.parent.id304 parent = w.parent.id
305 }305 }
306- s.emit(ports.WindowMapped{ID: w.id, AppID: w.appID, PID: x.info.PID, Floating: w.floating, Width: w.floatW, Height: w.floatH, Parent: parent, Positioned: true, Modal: w.modal, Remap: w.gen > 1})306+ s.emit(ports.WindowMapped{ID: w.id, AppID: w.appID, PID: x.info.PID, Floating: w.floating, Width: w.floatW, Height: w.floatH, Parent: parent, Positioned: true, Modal: w.modal, Remap: w.gen > 1, HasAt: x.info.HasAt, AtX: x.info.AtX, AtY: x.info.AtY})
307 if x.info.Fullscreen {307 if x.info.Fullscreen {
308 s.emit(ports.WindowFullscreenRequest{ID: w.id, Fullscreen: true})308 s.emit(ports.WindowFullscreenRequest{ID: w.id, Fullscreen: true})
309 }309 }
M internal/adapters/wayland/x11window_test.go +275 -1
@@ -9,8 +9,10 @@ import (
99 "time"
1010
1111 "github.com/bnema/go-wayland-bindings/server/pointerconstraints"
12+ "github.com/bnema/go-wayland-bindings/server/relativepointer"
1213 "github.com/bnema/go-wayland-bindings/server/wayland"
1314 "github.com/bnema/go-wayland-bindings/server/xdgshell"
15+ "github.com/bnema/go-wayland-bindings/server/xwaylandkeyboardgrab"
1416 "github.com/bnema/go-wayland-bindings/server/xwaylandshell"
1517 "github.com/bnema/neferwl/internal/ports"
1618 "github.com/bnema/wlturbo"
@@ -33,6 +35,8 @@ type x11Rig struct {
3335 stop func()
3436 shell uint32
3537 comp uint32
38+ // surfaceProxy, when set, observes the next paired wl_surface.
39+ surfaceProxy func(id uint32) wlturbo.Proxy
3640 }
3741
3842 func newX11Rig(t *testing.T) *x11Rig {
@@ -86,7 +90,11 @@ func (r *x11Rig) pair(win uint32, serial uint64) uint32 {
8690 r.peer.clientMessage(win, "WL_SURFACE_SERIAL", uint32(serial), uint32(serial>>32))
8791 surf, xs := r.xc.AllocateID(), r.xc.AllocateID()
8892 requestProtocol(r.t, r.xc, r.comp, wayland.CompositorRequestCreateSurface, surf)
89- registerProtocol(r.t, r.xc, surf)
93+ if r.surfaceProxy != nil {
94+ registerWireProxy(r.xc, r.surfaceProxy(surf))
95+ } else {
96+ registerProtocol(r.t, r.xc, surf)
97+ }
9098 requestProtocol(r.t, r.xc, r.shell, xwaylandshell.XwaylandShellV1RequestGetXwaylandSurface, xs, surf)
9199 registerProtocol(r.t, r.xc, xs)
92100 requestProtocol(r.t, r.xc, xs, xwaylandshell.XwaylandSurfaceV1RequestSetSerial, uint32(serial), uint32(serial>>32))
@@ -351,3 +359,269 @@ func TestX11WindowPointerLock(t *testing.T) {
351359 t.Fatalf("constrained %+v", got)
352360 }
353361 }
362+
363+// grabRig is an X11 window with an Xwayland keyboard grab on its surface.
364+func grabRig(t *testing.T) (r *x11Rig, w ports.WindowID, surf uint32) {
365+ t.Helper()
366+ r = newX11Rig(t)
367+ r.x11Window(x11Win)
368+ surf = r.pair(x11Win, x11Serial)
369+ w = awaitEvent[ports.WindowMapped](t, r.events).ID
370+ seat := bindProtocol(t, r.xc, "wl_seat")
371+ registerProtocol(t, r.xc, seat)
372+ mgr := bindProtocol(t, r.xc, "zwp_xwayland_keyboard_grab_manager_v1")
373+ grab := r.xc.AllocateID()
374+ requestProtocol(t, r.xc, mgr, xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1RequestGrabKeyboard, grab, surf, seat)
375+ registerProtocol(t, r.xc, grab)
376+ if err := r.xc.Roundtrip(); err != nil {
377+ t.Fatal(err)
378+ }
379+ return r, w, grab
380+}
381+
382+// noInhibit fails when a ShortcutsInhibit event arrives shortly.
383+func noInhibit(t *testing.T, r *x11Rig) {
384+ t.Helper()
385+ if err := r.xc.Roundtrip(); err != nil {
386+ t.Fatal(err)
387+ }
388+ for deadline := time.After(150 * time.Millisecond); ; {
389+ select {
390+ case ev := <-r.events:
391+ if v, ok := ev.(ports.ShortcutsInhibit); ok {
392+ t.Fatalf("unexpected %+v", v)
393+ }
394+ case <-deadline:
395+ return
396+ }
397+ }
398+}
399+
400+func TestXwaylandKeyboardGrabThreeStates(t *testing.T) {
401+ r, w, grab := grabRig(t)
402+ // Windowed and focused: accepted, no effect.
403+ r.commands <- ports.ConfigureWindow{ID: w, Width: 100, Height: 100, Visible: true}
404+ r.commands <- ports.FocusWindow{ID: w}
405+ noInhibit(t, r)
406+ // Focused and fullscreen: inhibits.
407+ r.commands <- ports.ConfigureWindow{ID: w, Width: 100, Height: 100, Visible: true, Fullscreen: true}
408+ if v := awaitEvent[ports.ShortcutsInhibit](t, r.events); v != (ports.ShortcutsInhibit{Window: w, Active: true}) {
409+ t.Fatal(v)
410+ }
411+ // Focus lost: released.
412+ r.commands <- ports.FocusWindow{}
413+ if v := awaitEvent[ports.ShortcutsInhibit](t, r.events); v != (ports.ShortcutsInhibit{Window: w}) {
414+ t.Fatal(v)
415+ }
416+ // Back, then the grab object goes away.
417+ r.commands <- ports.FocusWindow{ID: w}
418+ awaitEvent[ports.ShortcutsInhibit](t, r.events)
419+ requestProtocol(t, r.xc, grab, xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1RequestDestroy)
420+ if v := awaitEvent[ports.ShortcutsInhibit](t, r.events); v != (ports.ShortcutsInhibit{Window: w}) {
421+ t.Fatal(v)
422+ }
423+}
424+
425+// x11Pointer gives the Xwayland client a wl_pointer and a relative pointer,
426+// both with event logs.
427+func (r *x11Rig) x11Pointer() (pointer uint32, ptrEvents, relEvents chan []float64) {
428+ r.t.Helper()
429+ seat := bindProtocol(r.t, r.xc, "wl_seat")
430+ registerProtocol(r.t, r.xc, seat)
431+ pointer = r.xc.AllocateID()
432+ ptrEvents = logProxy(r.t, r.xc, pointer)
433+ requestProtocol(r.t, r.xc, seat, wayland.SeatRequestGetPointer, pointer)
434+ mgr := bindProtocol(r.t, r.xc, "zwp_relative_pointer_manager_v1")
435+ rel := r.xc.AllocateID()
436+ relEvents = logProxy(r.t, r.xc, rel)
437+ requestProtocol(r.t, r.xc, mgr, relativepointer.ZwpRelativePointerManagerV1RequestGetRelativePointer, rel, pointer)
438+ return pointer, ptrEvents, relEvents
439+}
440+
441+// A lock on an X11 surface activates with pointer and keyboard focus, sends
442+// relative motion to the Xwayland client and deactivates when a native
443+// window takes the focus; it comes back with the X11 focus.
444+func TestX11LockFollowsFocusAndRelativeMotion(t *testing.T) {
445+ r := newX11Rig(t)
446+ win := uint32(x11Win)
447+ r.x11Window(win)
448+ surf := r.pair(win, x11Serial)
449+ m := awaitEvent[ports.WindowMapped](t, r.events)
450+ pointer, _, relEvents := r.x11Pointer()
451+ constraints := bindProtocol(t, r.xc, "zwp_pointer_constraints_v1")
452+ lock := r.xc.AllocateID()
453+ lockEvents := logProxy(t, r.xc, lock)
454+ requestProtocol(t, r.xc, constraints, pointerconstraints.ZwpPointerConstraintsV1RequestLockPointer, lock, surf, pointer, uint32(0), uint32(pointerconstraints.ZwpPointerConstraintsV1LifetimePersistent))
455+ if err := r.xc.Roundtrip(); err != nil {
456+ t.Fatal(err)
457+ }
458+ if len(lockEvents) > 0 {
459+ t.Fatal("locked without focus")
460+ }
461+
462+ r.commands <- ports.PointerFocus{ID: m.ID}
463+ r.commands <- ports.FocusWindow{ID: m.ID}
464+ if ev := next(t, r.xc, lockEvents); ev[0] != float64(pointerconstraints.ZwpLockedPointerV1EventLocked) {
465+ t.Fatalf("lock event %v", ev)
466+ }
467+ if got := constrained(t, r.events); got.ID != m.ID || got.Mode != ports.ConstraintLock || got.Rect != (ports.Rect{}) {
468+ t.Fatalf("constrained %+v", got)
469+ }
470+
471+ r.commands <- ports.PointerMotionTo{ID: m.ID, X: 5, Y: 5, DX: 2.5, DY: -1, UnaccelDX: 4, UnaccelDY: -2}
472+ if ev := next(t, r.xc, relEvents); len(ev) != 5 || ev[1] != 2.5 || ev[2] != -1 || ev[3] != 4 || ev[4] != -2 {
473+ t.Fatalf("relative motion %v", ev)
474+ }
475+
476+ // A native window takes the focus: the X11 lock ends and the XWM drops
477+ // the X focus.
478+ nc := protocolClient(t, r.s, r.dir)
479+ nm, _, _ := surfaceMapper(t, nc, r.events)()
480+ skip := len(r.peer.requests())
481+ r.commands <- ports.FocusWindow{ID: nm.ID}
482+ if ev := next(t, r.xc, lockEvents); ev[0] != float64(pointerconstraints.ZwpLockedPointerV1EventUnlocked) {
483+ t.Fatalf("unlock event %v", ev)
484+ }
485+ if got := constrained(t, r.events); got.ID != 0 {
486+ t.Fatalf("constrained %+v after native focus", got)
487+ }
488+ if f, _ := r.peer.waitReq(skip, func(q x11Req) bool { return q.major == x11OpSetInputFocus }); f.u32(4) == win {
489+ t.Fatalf("X focus still on %#x", win)
490+ }
491+
492+ r.commands <- ports.FocusWindow{ID: m.ID}
493+ if ev := next(t, r.xc, lockEvents); ev[0] != float64(pointerconstraints.ZwpLockedPointerV1EventLocked) {
494+ t.Fatalf("relock event %v", ev)
495+ }
496+}
497+
498+// A confine on an X11 surface reaches core with its region as given: an X11
499+// window has no geometry offset.
500+func TestX11ConfineRegionHasNoOffset(t *testing.T) {
501+ r := newX11Rig(t)
502+ win := uint32(x11Win)
503+ r.x11Window(win)
504+ surf := r.pair(win, x11Serial)
505+ m := awaitEvent[ports.WindowMapped](t, r.events)
506+ pointer, _, _ := r.x11Pointer()
507+ region := r.xc.AllocateID()
508+ registerProtocol(t, r.xc, region)
509+ requestProtocol(t, r.xc, r.comp, wayland.CompositorRequestCreateRegion, region)
510+ requestProtocol(t, r.xc, region, wayland.RegionRequestAdd, int32(5), int32(6), int32(20), int32(30))
511+ constraints := bindProtocol(t, r.xc, "zwp_pointer_constraints_v1")
512+ confine := r.xc.AllocateID()
513+ confineEvents := logProxy(t, r.xc, confine)
514+ requestProtocol(t, r.xc, constraints, pointerconstraints.ZwpPointerConstraintsV1RequestConfinePointer, confine, surf, pointer, region, uint32(pointerconstraints.ZwpPointerConstraintsV1LifetimePersistent))
515+ if err := r.xc.Roundtrip(); err != nil {
516+ t.Fatal(err)
517+ }
518+ r.state(func() {
519+ if g := r.s.windows[m.ID].geometry(); g != (ports.Rect{}) {
520+ t.Errorf("X11 geometry %+v, want zero", g)
521+ }
522+ })
523+
524+ r.commands <- ports.PointerFocus{ID: m.ID, X: 10, Y: 10}
525+ r.commands <- ports.FocusWindow{ID: m.ID}
526+ r.commands <- ports.PointerMotionTo{ID: m.ID, X: 10, Y: 10}
527+ if ev := next(t, r.xc, confineEvents); ev[0] != float64(pointerconstraints.ZwpConfinedPointerV1EventConfined) {
528+ t.Fatalf("confine event %v", ev)
529+ }
530+ want := ports.PointerConstrained{ID: m.ID, PointerConstraint: ports.PointerConstraint{Mode: ports.ConstraintConfine, Rect: ports.Rect{X: 5, Y: 6, W: 20, H: 30}}}
531+ if got := constrained(t, r.events); got != want {
532+ t.Fatalf("constrained %+v, want %+v", got, want)
533+ }
534+}
535+
536+// waitOn waits until window id's surface is on output name: commands reach
537+// the display goroutine asynchronously.
538+func (r *x11Rig) waitOn(id ports.WindowID, name string) {
539+ r.t.Helper()
540+ waitTrue(r.t, "surface on "+name, func() bool {
541+ ok := false
542+ r.state(func() {
543+ if w := r.s.windows[id]; w != nil {
544+ on := w.surf().on
545+ ok = on != nil && on.name() == name
546+ }
547+ })
548+ return ok
549+ })
550+}
551+
552+// An X11 window is on one output only, even straddling two: a single
553+// wl_surface.enter, and a leave only when its output changes.
554+func TestX11WindowEntersOneOutput(t *testing.T) {
555+ r := newX11Rig(t)
556+ r.commands <- ports.SetOutputs{Outputs: ports.Layout{
557+ {Info: ports.OutputInfo{Name: "A"}, X: 0, Y: 0, Width: 1920, Height: 1080, Scale: 1},
558+ {Info: ports.OutputInfo{Name: "B"}, X: 1920, Y: 0, Width: 1920, Height: 1080, Scale: 1},
559+ }, Focused: "A"}
560+ r.state(func() {}) // the layout is applied
561+ if err := r.xc.Roundtrip(); err != nil {
562+ t.Fatal(err)
563+ }
564+ outputs := 0
565+ for _, g := range r.xc.Registry().GetGlobals() {
566+ if g.Interface != "wl_output" {
567+ continue
568+ }
569+ id, err := bindWireID(r.xc, g.Name, g.Interface, 1)
570+ if err != nil {
571+ t.Fatal(err)
572+ }
573+ registerProtocol(t, r.xc, id)
574+ outputs++
575+ }
576+ if outputs != 2 {
577+ t.Fatalf("%d wl_output globals, want 2", outputs)
578+ }
579+
580+ win := uint32(x11Win)
581+ r.x11Window(win)
582+ events := make(chan []float64, 64)
583+ r.surfaceProxy = func(id uint32) wlturbo.Proxy {
584+ p := &eventLog{events: events}
585+ p.SetID(id)
586+ return p
587+ }
588+ r.pair(win, x11Serial)
589+ m := awaitEvent[ports.WindowMapped](t, r.events)
590+
591+ // Straddling both outputs, configured on A.
592+ r.commands <- ports.PlaceWindow{ID: m.ID, X: 1900, Y: 0}
593+ r.commands <- ports.ConfigureWindow{ID: m.ID, Width: 200, Height: 100, Visible: true, Output: "A"}
594+ r.waitOn(m.ID, "A")
595+ if err := r.xc.Roundtrip(); err != nil {
596+ t.Fatal(err)
597+ }
598+ count := func() (enters, leaves int) {
599+ for len(events) > 0 {
600+ switch ev := <-events; ev[0] {
601+ case float64(wayland.SurfaceEventEnter):
602+ enters++
603+ case float64(wayland.SurfaceEventLeave):
604+ leaves++
605+ }
606+ }
607+ return
608+ }
609+ if e, l := count(); e != 1 || l != 0 {
610+ t.Fatalf("straddling window: %d enters, %d leaves, want 1, 0", e, l)
611+ }
612+ r.state(func() {
613+ if on := r.s.windows[m.ID].surf().on; on == nil || on.name() != "A" {
614+ t.Errorf("surface on %v, want A", on)
615+ }
616+ })
617+
618+ // Moving to B leaves A and enters B once.
619+ r.commands <- ports.ConfigureWindow{ID: m.ID, Width: 200, Height: 100, Visible: true, Output: "B"}
620+ r.waitOn(m.ID, "B")
621+ if err := r.xc.Roundtrip(); err != nil {
622+ t.Fatal(err)
623+ }
624+ if e, l := count(); e != 1 || l != 1 {
625+ t.Fatalf("move to B: %d enters, %d leaves, want 1, 1", e, l)
626+ }
627+}
@@ -9,8 +9,10 @@ import (
9 "time"9 "time"
10 10
11 "github.com/bnema/go-wayland-bindings/server/pointerconstraints"11 "github.com/bnema/go-wayland-bindings/server/pointerconstraints"
12+ "github.com/bnema/go-wayland-bindings/server/relativepointer"
12 "github.com/bnema/go-wayland-bindings/server/wayland"13 "github.com/bnema/go-wayland-bindings/server/wayland"
13 "github.com/bnema/go-wayland-bindings/server/xdgshell"14 "github.com/bnema/go-wayland-bindings/server/xdgshell"
15+ "github.com/bnema/go-wayland-bindings/server/xwaylandkeyboardgrab"
14 "github.com/bnema/go-wayland-bindings/server/xwaylandshell"16 "github.com/bnema/go-wayland-bindings/server/xwaylandshell"
15 "github.com/bnema/neferwl/internal/ports"17 "github.com/bnema/neferwl/internal/ports"
16 "github.com/bnema/wlturbo"18 "github.com/bnema/wlturbo"
@@ -33,6 +35,8 @@ type x11Rig struct {
33 stop func()35 stop func()
34 shell uint3236 shell uint32
35 comp uint3237 comp uint32
38+ // surfaceProxy, when set, observes the next paired wl_surface.
39+ surfaceProxy func(id uint32) wlturbo.Proxy
36 }40 }
37 41
38 func newX11Rig(t *testing.T) *x11Rig {42 func newX11Rig(t *testing.T) *x11Rig {
@@ -86,7 +90,11 @@ func (r *x11Rig) pair(win uint32, serial uint64) uint32 {
86 r.peer.clientMessage(win, "WL_SURFACE_SERIAL", uint32(serial), uint32(serial>>32))90 r.peer.clientMessage(win, "WL_SURFACE_SERIAL", uint32(serial), uint32(serial>>32))
87 surf, xs := r.xc.AllocateID(), r.xc.AllocateID()91 surf, xs := r.xc.AllocateID(), r.xc.AllocateID()
88 requestProtocol(r.t, r.xc, r.comp, wayland.CompositorRequestCreateSurface, surf)92 requestProtocol(r.t, r.xc, r.comp, wayland.CompositorRequestCreateSurface, surf)
89- registerProtocol(r.t, r.xc, surf)93+ if r.surfaceProxy != nil {
94+ registerWireProxy(r.xc, r.surfaceProxy(surf))
95+ } else {
96+ registerProtocol(r.t, r.xc, surf)
97+ }
90 requestProtocol(r.t, r.xc, r.shell, xwaylandshell.XwaylandShellV1RequestGetXwaylandSurface, xs, surf)98 requestProtocol(r.t, r.xc, r.shell, xwaylandshell.XwaylandShellV1RequestGetXwaylandSurface, xs, surf)
91 registerProtocol(r.t, r.xc, xs)99 registerProtocol(r.t, r.xc, xs)
92 requestProtocol(r.t, r.xc, xs, xwaylandshell.XwaylandSurfaceV1RequestSetSerial, uint32(serial), uint32(serial>>32))100 requestProtocol(r.t, r.xc, xs, xwaylandshell.XwaylandSurfaceV1RequestSetSerial, uint32(serial), uint32(serial>>32))
@@ -351,3 +359,269 @@ func TestX11WindowPointerLock(t *testing.T) {
351 t.Fatalf("constrained %+v", got)359 t.Fatalf("constrained %+v", got)
352 }360 }
353 }361 }
362+
363+// grabRig is an X11 window with an Xwayland keyboard grab on its surface.
364+func grabRig(t *testing.T) (r *x11Rig, w ports.WindowID, surf uint32) {
365+ t.Helper()
366+ r = newX11Rig(t)
367+ r.x11Window(x11Win)
368+ surf = r.pair(x11Win, x11Serial)
369+ w = awaitEvent[ports.WindowMapped](t, r.events).ID
370+ seat := bindProtocol(t, r.xc, "wl_seat")
371+ registerProtocol(t, r.xc, seat)
372+ mgr := bindProtocol(t, r.xc, "zwp_xwayland_keyboard_grab_manager_v1")
373+ grab := r.xc.AllocateID()
374+ requestProtocol(t, r.xc, mgr, xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1RequestGrabKeyboard, grab, surf, seat)
375+ registerProtocol(t, r.xc, grab)
376+ if err := r.xc.Roundtrip(); err != nil {
377+ t.Fatal(err)
378+ }
379+ return r, w, grab
380+}
381+
382+// noInhibit fails when a ShortcutsInhibit event arrives shortly.
383+func noInhibit(t *testing.T, r *x11Rig) {
384+ t.Helper()
385+ if err := r.xc.Roundtrip(); err != nil {
386+ t.Fatal(err)
387+ }
388+ for deadline := time.After(150 * time.Millisecond); ; {
389+ select {
390+ case ev := <-r.events:
391+ if v, ok := ev.(ports.ShortcutsInhibit); ok {
392+ t.Fatalf("unexpected %+v", v)
393+ }
394+ case <-deadline:
395+ return
396+ }
397+ }
398+}
399+
400+func TestXwaylandKeyboardGrabThreeStates(t *testing.T) {
401+ r, w, grab := grabRig(t)
402+ // Windowed and focused: accepted, no effect.
403+ r.commands <- ports.ConfigureWindow{ID: w, Width: 100, Height: 100, Visible: true}
404+ r.commands <- ports.FocusWindow{ID: w}
405+ noInhibit(t, r)
406+ // Focused and fullscreen: inhibits.
407+ r.commands <- ports.ConfigureWindow{ID: w, Width: 100, Height: 100, Visible: true, Fullscreen: true}
408+ if v := awaitEvent[ports.ShortcutsInhibit](t, r.events); v != (ports.ShortcutsInhibit{Window: w, Active: true}) {
409+ t.Fatal(v)
410+ }
411+ // Focus lost: released.
412+ r.commands <- ports.FocusWindow{}
413+ if v := awaitEvent[ports.ShortcutsInhibit](t, r.events); v != (ports.ShortcutsInhibit{Window: w}) {
414+ t.Fatal(v)
415+ }
416+ // Back, then the grab object goes away.
417+ r.commands <- ports.FocusWindow{ID: w}
418+ awaitEvent[ports.ShortcutsInhibit](t, r.events)
419+ requestProtocol(t, r.xc, grab, xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1RequestDestroy)
420+ if v := awaitEvent[ports.ShortcutsInhibit](t, r.events); v != (ports.ShortcutsInhibit{Window: w}) {
421+ t.Fatal(v)
422+ }
423+}
424+
425+// x11Pointer gives the Xwayland client a wl_pointer and a relative pointer,
426+// both with event logs.
427+func (r *x11Rig) x11Pointer() (pointer uint32, ptrEvents, relEvents chan []float64) {
428+ r.t.Helper()
429+ seat := bindProtocol(r.t, r.xc, "wl_seat")
430+ registerProtocol(r.t, r.xc, seat)
431+ pointer = r.xc.AllocateID()
432+ ptrEvents = logProxy(r.t, r.xc, pointer)
433+ requestProtocol(r.t, r.xc, seat, wayland.SeatRequestGetPointer, pointer)
434+ mgr := bindProtocol(r.t, r.xc, "zwp_relative_pointer_manager_v1")
435+ rel := r.xc.AllocateID()
436+ relEvents = logProxy(r.t, r.xc, rel)
437+ requestProtocol(r.t, r.xc, mgr, relativepointer.ZwpRelativePointerManagerV1RequestGetRelativePointer, rel, pointer)
438+ return pointer, ptrEvents, relEvents
439+}
440+
441+// A lock on an X11 surface activates with pointer and keyboard focus, sends
442+// relative motion to the Xwayland client and deactivates when a native
443+// window takes the focus; it comes back with the X11 focus.
444+func TestX11LockFollowsFocusAndRelativeMotion(t *testing.T) {
445+ r := newX11Rig(t)
446+ win := uint32(x11Win)
447+ r.x11Window(win)
448+ surf := r.pair(win, x11Serial)
449+ m := awaitEvent[ports.WindowMapped](t, r.events)
450+ pointer, _, relEvents := r.x11Pointer()
451+ constraints := bindProtocol(t, r.xc, "zwp_pointer_constraints_v1")
452+ lock := r.xc.AllocateID()
453+ lockEvents := logProxy(t, r.xc, lock)
454+ requestProtocol(t, r.xc, constraints, pointerconstraints.ZwpPointerConstraintsV1RequestLockPointer, lock, surf, pointer, uint32(0), uint32(pointerconstraints.ZwpPointerConstraintsV1LifetimePersistent))
455+ if err := r.xc.Roundtrip(); err != nil {
456+ t.Fatal(err)
457+ }
458+ if len(lockEvents) > 0 {
459+ t.Fatal("locked without focus")
460+ }
461+
462+ r.commands <- ports.PointerFocus{ID: m.ID}
463+ r.commands <- ports.FocusWindow{ID: m.ID}
464+ if ev := next(t, r.xc, lockEvents); ev[0] != float64(pointerconstraints.ZwpLockedPointerV1EventLocked) {
465+ t.Fatalf("lock event %v", ev)
466+ }
467+ if got := constrained(t, r.events); got.ID != m.ID || got.Mode != ports.ConstraintLock || got.Rect != (ports.Rect{}) {
468+ t.Fatalf("constrained %+v", got)
469+ }
470+
471+ r.commands <- ports.PointerMotionTo{ID: m.ID, X: 5, Y: 5, DX: 2.5, DY: -1, UnaccelDX: 4, UnaccelDY: -2}
472+ if ev := next(t, r.xc, relEvents); len(ev) != 5 || ev[1] != 2.5 || ev[2] != -1 || ev[3] != 4 || ev[4] != -2 {
473+ t.Fatalf("relative motion %v", ev)
474+ }
475+
476+ // A native window takes the focus: the X11 lock ends and the XWM drops
477+ // the X focus.
478+ nc := protocolClient(t, r.s, r.dir)
479+ nm, _, _ := surfaceMapper(t, nc, r.events)()
480+ skip := len(r.peer.requests())
481+ r.commands <- ports.FocusWindow{ID: nm.ID}
482+ if ev := next(t, r.xc, lockEvents); ev[0] != float64(pointerconstraints.ZwpLockedPointerV1EventUnlocked) {
483+ t.Fatalf("unlock event %v", ev)
484+ }
485+ if got := constrained(t, r.events); got.ID != 0 {
486+ t.Fatalf("constrained %+v after native focus", got)
487+ }
488+ if f, _ := r.peer.waitReq(skip, func(q x11Req) bool { return q.major == x11OpSetInputFocus }); f.u32(4) == win {
489+ t.Fatalf("X focus still on %#x", win)
490+ }
491+
492+ r.commands <- ports.FocusWindow{ID: m.ID}
493+ if ev := next(t, r.xc, lockEvents); ev[0] != float64(pointerconstraints.ZwpLockedPointerV1EventLocked) {
494+ t.Fatalf("relock event %v", ev)
495+ }
496+}
497+
498+// A confine on an X11 surface reaches core with its region as given: an X11
499+// window has no geometry offset.
500+func TestX11ConfineRegionHasNoOffset(t *testing.T) {
501+ r := newX11Rig(t)
502+ win := uint32(x11Win)
503+ r.x11Window(win)
504+ surf := r.pair(win, x11Serial)
505+ m := awaitEvent[ports.WindowMapped](t, r.events)
506+ pointer, _, _ := r.x11Pointer()
507+ region := r.xc.AllocateID()
508+ registerProtocol(t, r.xc, region)
509+ requestProtocol(t, r.xc, r.comp, wayland.CompositorRequestCreateRegion, region)
510+ requestProtocol(t, r.xc, region, wayland.RegionRequestAdd, int32(5), int32(6), int32(20), int32(30))
511+ constraints := bindProtocol(t, r.xc, "zwp_pointer_constraints_v1")
512+ confine := r.xc.AllocateID()
513+ confineEvents := logProxy(t, r.xc, confine)
514+ requestProtocol(t, r.xc, constraints, pointerconstraints.ZwpPointerConstraintsV1RequestConfinePointer, confine, surf, pointer, region, uint32(pointerconstraints.ZwpPointerConstraintsV1LifetimePersistent))
515+ if err := r.xc.Roundtrip(); err != nil {
516+ t.Fatal(err)
517+ }
518+ r.state(func() {
519+ if g := r.s.windows[m.ID].geometry(); g != (ports.Rect{}) {
520+ t.Errorf("X11 geometry %+v, want zero", g)
521+ }
522+ })
523+
524+ r.commands <- ports.PointerFocus{ID: m.ID, X: 10, Y: 10}
525+ r.commands <- ports.FocusWindow{ID: m.ID}
526+ r.commands <- ports.PointerMotionTo{ID: m.ID, X: 10, Y: 10}
527+ if ev := next(t, r.xc, confineEvents); ev[0] != float64(pointerconstraints.ZwpConfinedPointerV1EventConfined) {
528+ t.Fatalf("confine event %v", ev)
529+ }
530+ want := ports.PointerConstrained{ID: m.ID, PointerConstraint: ports.PointerConstraint{Mode: ports.ConstraintConfine, Rect: ports.Rect{X: 5, Y: 6, W: 20, H: 30}}}
531+ if got := constrained(t, r.events); got != want {
532+ t.Fatalf("constrained %+v, want %+v", got, want)
533+ }
534+}
535+
536+// waitOn waits until window id's surface is on output name: commands reach
537+// the display goroutine asynchronously.
538+func (r *x11Rig) waitOn(id ports.WindowID, name string) {
539+ r.t.Helper()
540+ waitTrue(r.t, "surface on "+name, func() bool {
541+ ok := false
542+ r.state(func() {
543+ if w := r.s.windows[id]; w != nil {
544+ on := w.surf().on
545+ ok = on != nil && on.name() == name
546+ }
547+ })
548+ return ok
549+ })
550+}
551+
552+// An X11 window is on one output only, even straddling two: a single
553+// wl_surface.enter, and a leave only when its output changes.
554+func TestX11WindowEntersOneOutput(t *testing.T) {
555+ r := newX11Rig(t)
556+ r.commands <- ports.SetOutputs{Outputs: ports.Layout{
557+ {Info: ports.OutputInfo{Name: "A"}, X: 0, Y: 0, Width: 1920, Height: 1080, Scale: 1},
558+ {Info: ports.OutputInfo{Name: "B"}, X: 1920, Y: 0, Width: 1920, Height: 1080, Scale: 1},
559+ }, Focused: "A"}
560+ r.state(func() {}) // the layout is applied
561+ if err := r.xc.Roundtrip(); err != nil {
562+ t.Fatal(err)
563+ }
564+ outputs := 0
565+ for _, g := range r.xc.Registry().GetGlobals() {
566+ if g.Interface != "wl_output" {
567+ continue
568+ }
569+ id, err := bindWireID(r.xc, g.Name, g.Interface, 1)
570+ if err != nil {
571+ t.Fatal(err)
572+ }
573+ registerProtocol(t, r.xc, id)
574+ outputs++
575+ }
576+ if outputs != 2 {
577+ t.Fatalf("%d wl_output globals, want 2", outputs)
578+ }
579+
580+ win := uint32(x11Win)
581+ r.x11Window(win)
582+ events := make(chan []float64, 64)
583+ r.surfaceProxy = func(id uint32) wlturbo.Proxy {
584+ p := &eventLog{events: events}
585+ p.SetID(id)
586+ return p
587+ }
588+ r.pair(win, x11Serial)
589+ m := awaitEvent[ports.WindowMapped](t, r.events)
590+
591+ // Straddling both outputs, configured on A.
592+ r.commands <- ports.PlaceWindow{ID: m.ID, X: 1900, Y: 0}
593+ r.commands <- ports.ConfigureWindow{ID: m.ID, Width: 200, Height: 100, Visible: true, Output: "A"}
594+ r.waitOn(m.ID, "A")
595+ if err := r.xc.Roundtrip(); err != nil {
596+ t.Fatal(err)
597+ }
598+ count := func() (enters, leaves int) {
599+ for len(events) > 0 {
600+ switch ev := <-events; ev[0] {
601+ case float64(wayland.SurfaceEventEnter):
602+ enters++
603+ case float64(wayland.SurfaceEventLeave):
604+ leaves++
605+ }
606+ }
607+ return
608+ }
609+ if e, l := count(); e != 1 || l != 0 {
610+ t.Fatalf("straddling window: %d enters, %d leaves, want 1, 0", e, l)
611+ }
612+ r.state(func() {
613+ if on := r.s.windows[m.ID].surf().on; on == nil || on.name() != "A" {
614+ t.Errorf("surface on %v, want A", on)
615+ }
616+ })
617+
618+ // Moving to B leaves A and enters B once.
619+ r.commands <- ports.ConfigureWindow{ID: m.ID, Width: 200, Height: 100, Visible: true, Output: "B"}
620+ r.waitOn(m.ID, "B")
621+ if err := r.xc.Roundtrip(); err != nil {
622+ t.Fatal(err)
623+ }
624+ if e, l := count(); e != 1 || l != 1 {
625+ t.Fatalf("move to B: %d enters, %d leaves, want 1, 1", e, l)
626+ }
627+}
A internal/adapters/wayland/xwaylandgrab.go +90 -0
@@ -0,0 +1,90 @@
1+package wayland
2+
3+import (
4+ "github.com/bnema/go-wayland-bindings/server/wayland"
5+ "github.com/bnema/go-wayland-bindings/server/xwaylandkeyboardgrab"
6+ "github.com/bnema/neferwl/internal/ports"
7+ "github.com/bnema/purego-libwayland/server"
8+)
9+
10+// zwp_xwayland_keyboard_grab_v1. Xwayland asks for it when an X client
11+// takes an active keyboard grab. It is a shortcuts inhibitor, but only
12+// while the grabbing surface's window has the keyboard focus and is
13+// fullscreen: a windowed app must not lock the compositor binds out.
14+// Otherwise the request is accepted and has no effect. Never honoured
15+// while the session is protected. The global is visible to Xwayland only
16+// (xwaylandRestricted).
17+
18+// xwaylandGrab is the seat's single grab.
19+type xwaylandGrab struct {
20+ res *xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1
21+ surf *surface
22+}
23+
24+func registerXwaylandGrab(d *server.Display, s *Server) error {
25+ return xwaylandkeyboardgrab.NewZwpXwaylandKeyboardGrabManagerV1Global(d, 1, func(c server.Client, v, id uint32) {
26+ _, _ = xwaylandkeyboardgrab.NewZwpXwaylandKeyboardGrabManagerV1(c, int32(v), id, xwaylandGrabManager{s})
27+ })
28+}
29+
30+type xwaylandGrabManager struct{ s *Server }
31+
32+func (xwaylandGrabManager) Destroy(*xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1) {}
33+
34+// GrabKeyboard replaces the seat's grab with a new one.
35+func (m xwaylandGrabManager) GrabKeyboard(r *xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1, id uint32, surf *wayland.Surface, _ *wayland.Seat) {
36+ state := m.s.surfaceOf(surf)
37+ if state == nil {
38+ return
39+ }
40+ g := &xwaylandGrab{surf: state}
41+ res, err := xwaylandkeyboardgrab.NewZwpXwaylandKeyboardGrabV1(r.Client(), r.Version(), id, xwaylandGrabHandler{})
42+ if err != nil {
43+ return
44+ }
45+ g.res = res
46+ old := m.s.xgrab
47+ m.s.xgrab = g
48+ res.OnDestroy = func() {
49+ if m.s.xgrab == g {
50+ m.s.xgrab = nil
51+ m.s.syncKeyboardGrab()
52+ }
53+ }
54+ if old != nil && old.res != nil && old.res.Resource.Alive() {
55+ old.res.Resource.Destroy()
56+ }
57+ m.s.syncKeyboardGrab()
58+}
59+
60+type xwaylandGrabHandler struct{}
61+
62+func (xwaylandGrabHandler) Destroy(*xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1) {}
63+
64+// xgrabWindow is the window whose grab is in effect (0: none).
65+func (s *Server) xgrabWindow() ports.WindowID {
66+ g := s.xgrab
67+ if g == nil || g.surf == nil || g.surf.destroyed || !g.res.Resource.Alive() {
68+ return 0
69+ }
70+ if s.security != nil && s.security.Snapshot().Protected {
71+ return 0
72+ }
73+ id := g.surf.root().windowID()
74+ if id == 0 || id != s.seat.focused {
75+ return 0
76+ }
77+ if w := s.windows[id]; w == nil || !w.hasLast || !w.last.Fullscreen {
78+ return 0
79+ }
80+ return id
81+}
82+
83+// syncKeyboardGrab re-evaluates the grab after a focus or fullscreen
84+// change, and reports to core only when its effect changed.
85+func (s *Server) syncKeyboardGrab() {
86+ if id := s.xgrabWindow(); id != s.xgrabbed {
87+ s.xgrabbed = id
88+ s.syncInhibitors()
89+ }
90+}
@@ -0,0 +1,90 @@
1+package wayland
2+
3+import (
4+ "github.com/bnema/go-wayland-bindings/server/wayland"
5+ "github.com/bnema/go-wayland-bindings/server/xwaylandkeyboardgrab"
6+ "github.com/bnema/neferwl/internal/ports"
7+ "github.com/bnema/purego-libwayland/server"
8+)
9+
10+// zwp_xwayland_keyboard_grab_v1. Xwayland asks for it when an X client
11+// takes an active keyboard grab. It is a shortcuts inhibitor, but only
12+// while the grabbing surface's window has the keyboard focus and is
13+// fullscreen: a windowed app must not lock the compositor binds out.
14+// Otherwise the request is accepted and has no effect. Never honoured
15+// while the session is protected. The global is visible to Xwayland only
16+// (xwaylandRestricted).
17+
18+// xwaylandGrab is the seat's single grab.
19+type xwaylandGrab struct {
20+ res *xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1
21+ surf *surface
22+}
23+
24+func registerXwaylandGrab(d *server.Display, s *Server) error {
25+ return xwaylandkeyboardgrab.NewZwpXwaylandKeyboardGrabManagerV1Global(d, 1, func(c server.Client, v, id uint32) {
26+ _, _ = xwaylandkeyboardgrab.NewZwpXwaylandKeyboardGrabManagerV1(c, int32(v), id, xwaylandGrabManager{s})
27+ })
28+}
29+
30+type xwaylandGrabManager struct{ s *Server }
31+
32+func (xwaylandGrabManager) Destroy(*xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1) {}
33+
34+// GrabKeyboard replaces the seat's grab with a new one.
35+func (m xwaylandGrabManager) GrabKeyboard(r *xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabManagerV1, id uint32, surf *wayland.Surface, _ *wayland.Seat) {
36+ state := m.s.surfaceOf(surf)
37+ if state == nil {
38+ return
39+ }
40+ g := &xwaylandGrab{surf: state}
41+ res, err := xwaylandkeyboardgrab.NewZwpXwaylandKeyboardGrabV1(r.Client(), r.Version(), id, xwaylandGrabHandler{})
42+ if err != nil {
43+ return
44+ }
45+ g.res = res
46+ old := m.s.xgrab
47+ m.s.xgrab = g
48+ res.OnDestroy = func() {
49+ if m.s.xgrab == g {
50+ m.s.xgrab = nil
51+ m.s.syncKeyboardGrab()
52+ }
53+ }
54+ if old != nil && old.res != nil && old.res.Resource.Alive() {
55+ old.res.Resource.Destroy()
56+ }
57+ m.s.syncKeyboardGrab()
58+}
59+
60+type xwaylandGrabHandler struct{}
61+
62+func (xwaylandGrabHandler) Destroy(*xwaylandkeyboardgrab.ZwpXwaylandKeyboardGrabV1) {}
63+
64+// xgrabWindow is the window whose grab is in effect (0: none).
65+func (s *Server) xgrabWindow() ports.WindowID {
66+ g := s.xgrab
67+ if g == nil || g.surf == nil || g.surf.destroyed || !g.res.Resource.Alive() {
68+ return 0
69+ }
70+ if s.security != nil && s.security.Snapshot().Protected {
71+ return 0
72+ }
73+ id := g.surf.root().windowID()
74+ if id == 0 || id != s.seat.focused {
75+ return 0
76+ }
77+ if w := s.windows[id]; w == nil || !w.hasLast || !w.last.Fullscreen {
78+ return 0
79+ }
80+ return id
81+}
82+
83+// syncKeyboardGrab re-evaluates the grab after a focus or fullscreen
84+// change, and reports to core only when its effect changed.
85+func (s *Server) syncKeyboardGrab() {
86+ if id := s.xgrabWindow(); id != s.xgrabbed {
87+ s.xgrabbed = id
88+ s.syncInhibitors()
89+ }
90+}
M internal/adapters/wayland/xwm/configure_test.go +18 -0
@@ -563,3 +563,21 @@ func TestFocusAllocations(t *testing.T) {
563563 require.Zero(t, allocs)
564564 require.False(t, x.closed)
565565 }
566+
567+// Repeated identical fullscreen configures cost nothing.
568+func TestFullscreenConfigureAllocations(t *testing.T) {
569+ x, p, h, _, _ := attached(t)
570+ s := newWin(t, x, p, h, 0x500001)
571+ sinkPeer(t, x, p)
572+ cfg := ports.ConfigureWindow{Width: 1920, Height: 1080, Fullscreen: true, Activated: true}
573+ x.Configure(s, cfg)
574+ x.posted = false
575+ x.flush()
576+ allocs := testing.AllocsPerRun(300, func() {
577+ x.Configure(s, cfg)
578+ x.Place(s, 0, 0)
579+ x.posted = false
580+ x.flush()
581+ })
582+ require.Zero(t, allocs)
583+}
@@ -563,3 +563,21 @@ func TestFocusAllocations(t *testing.T) {
563 require.Zero(t, allocs)563 require.Zero(t, allocs)
564 require.False(t, x.closed)564 require.False(t, x.closed)
565 }565 }
566+
567+// Repeated identical fullscreen configures cost nothing.
568+func TestFullscreenConfigureAllocations(t *testing.T) {
569+ x, p, h, _, _ := attached(t)
570+ s := newWin(t, x, p, h, 0x500001)
571+ sinkPeer(t, x, p)
572+ cfg := ports.ConfigureWindow{Width: 1920, Height: 1080, Fullscreen: true, Activated: true}
573+ x.Configure(s, cfg)
574+ x.posted = false
575+ x.flush()
576+ allocs := testing.AllocsPerRun(300, func() {
577+ x.Configure(s, cfg)
578+ x.Place(s, 0, 0)
579+ x.posted = false
580+ x.flush()
581+ })
582+ require.Zero(t, allocs)
583+}
M internal/adapters/wayland/xwm/host.go +8 -3
@@ -13,9 +13,14 @@ type WindowInfo struct {
1313 Floating bool // dialog/utility/splash/fixed size
1414 Width, Height int // requested size, logical (scale 1)
1515 Parent Slot
16- Modal bool // _NET_WM_STATE_MODAL
17- Fullscreen bool // _NET_WM_STATE_FULLSCREEN at map
18- Title, AppID string
16+ Modal bool // _NET_WM_STATE_MODAL
17+ Fullscreen bool // _NET_WM_STATE_FULLSCREEN at map
18+ Bypass uint8 // _NET_WM_BYPASS_COMPOSITOR (0 unset, 1 bypass, 2 do not)
19+ // HasAt: the client asked for a rect equal to a whole output; AtX, AtY
20+ // is that output's layout origin.
21+ HasAt bool
22+ AtX, AtY int
23+ Title, AppID string
1924 }
2025
2126 // host is the wayland server as the XWM sees it. Display goroutine only.
@@ -13,9 +13,14 @@ type WindowInfo struct {
13 Floating bool // dialog/utility/splash/fixed size13 Floating bool // dialog/utility/splash/fixed size
14 Width, Height int // requested size, logical (scale 1)14 Width, Height int // requested size, logical (scale 1)
15 Parent Slot15 Parent Slot
16- Modal bool // _NET_WM_STATE_MODAL16+ Modal bool // _NET_WM_STATE_MODAL
17- Fullscreen bool // _NET_WM_STATE_FULLSCREEN at map17+ Fullscreen bool // _NET_WM_STATE_FULLSCREEN at map
18- Title, AppID string18+ Bypass uint8 // _NET_WM_BYPASS_COMPOSITOR (0 unset, 1 bypass, 2 do not)
19+ // HasAt: the client asked for a rect equal to a whole output; AtX, AtY
20+ // is that output's layout origin.
21+ HasAt bool
22+ AtX, AtY int
23+ Title, AppID string
19 }24 }
20 25
21 // host is the wayland server as the XWM sees it. Display goroutine only.26 // host is the wayland server as the XWM sees it. Display goroutine only.
M internal/adapters/wayland/xwm/mapflow.go +4 -0
@@ -142,6 +142,10 @@ func (x *XWM) info(s Slot) WindowInfo {
142142 Fullscreen: rec.fullscreen,
143143 Title: rec.title,
144144 AppID: rec.class,
145+ Bypass: rec.bypass,
146+ }
147+ if rec.sized && !info.Floating {
148+ info.AtX, info.AtY, info.HasAt = x.space.WholeOutput(int(rec.x), int(rec.y), int(rec.w), int(rec.h))
145149 }
146150 if info.Floating || rec.sized {
147151 info.Width, info.Height = int(rec.w), int(rec.h)
@@ -142,6 +142,10 @@ func (x *XWM) info(s Slot) WindowInfo {
142 Fullscreen: rec.fullscreen,142 Fullscreen: rec.fullscreen,
143 Title: rec.title,143 Title: rec.title,
144 AppID: rec.class,144 AppID: rec.class,
145+ Bypass: rec.bypass,
146+ }
147+ if rec.sized && !info.Floating {
148+ info.AtX, info.AtY, info.HasAt = x.space.WholeOutput(int(rec.x), int(rec.y), int(rec.w), int(rec.h))
145 }149 }
146 if info.Floating || rec.sized {150 if info.Floating || rec.sized {
147 info.Width, info.Height = int(rec.w), int(rec.h)151 info.Width, info.Height = int(rec.w), int(rec.h)
M internal/adapters/wayland/xwm/mapflow_test.go +29 -2
@@ -121,7 +121,7 @@ func TestMapFlowBatchesRequestsAndReadyFiresOnce(t *testing.T) {
121121 want := []uint32{
122122 uint32(xproto.AtomWmClass), uint32(xproto.AtomWmName), hs.p.atom("_NET_WM_NAME"), uint32(xproto.AtomWmHints),
123123 uint32(xproto.AtomWmNormalHints), hs.p.atom("WM_PROTOCOLS"), uint32(xproto.AtomWmTransientFor),
124- hs.p.atom("_NET_WM_WINDOW_TYPE"), hs.p.atom("_NET_WM_STATE"), hs.p.atom("_NET_WM_PID"),
124+ hs.p.atom("_NET_WM_WINDOW_TYPE"), hs.p.atom("_NET_WM_STATE"), hs.p.atom("_NET_WM_PID"), hs.p.atom("_NET_WM_BYPASS_COMPOSITOR"),
125125 }
126126 require.GreaterOrEqual(t, len(reqs), len(want)+2)
127127 for i, a := range want {
@@ -180,6 +180,16 @@ func TestMapFlowFloatingAndModal(t *testing.T) {
180180 {"modal", func(hs *harness, w uint32) {
181181 hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_MODAL")
182182 }, func(i WindowInfo) { require.True(t, i.Modal); require.False(t, i.Fullscreen) }},
183+ {"bypass 1", func(hs *harness, w uint32) {
184+ hs.words(w, "_NET_WM_BYPASS_COMPOSITOR", uint32(xproto.AtomCardinal), 1)
185+ }, func(i WindowInfo) { require.EqualValues(t, 1, i.Bypass) }},
186+ {"bypass 2 kept", func(hs *harness, w uint32) {
187+ hs.words(w, "_NET_WM_BYPASS_COMPOSITOR", uint32(xproto.AtomCardinal), 2)
188+ }, func(i WindowInfo) { require.EqualValues(t, 2, i.Bypass) }},
189+ {"bypass absent", func(hs *harness, w uint32) {}, func(i WindowInfo) { require.Zero(t, i.Bypass) }},
190+ {"class steam_app", func(hs *harness, w uint32) {
191+ hs.p.setProp(w, uint32(xproto.AtomWmClass), uint32(xproto.AtomString), 8, []byte("steam_app_892970\x00steam_app_892970\x00"))
192+ }, func(i WindowInfo) { require.Equal(t, "steam_app_892970", i.AppID) }},
183193 {"fullscreen at map", func(hs *harness, w uint32) {
184194 hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN")
185195 }, func(i WindowInfo) { require.True(t, i.Fullscreen) }},
@@ -746,7 +756,7 @@ func TestMapFlowReadyFiresOnLastReplyInAnyOrder(t *testing.T) {
746756 r := hs.x.tab.rec(s)
747757 r.mapping, r.pending = true, propMaskAll&^propClientIDs
748758 hs.expectReady(win)
749- order := []int{propCount, propPID, propClass, propNetName, propName, propHints, propNormalHints, propProtocols, propTransientFor, propWindowType, propState}
759+ order := []int{propCount, propPID, propBypass, propClass, propNetName, propName, propHints, propNormalHints, propProtocols, propTransientFor, propWindowType, propState}
750760 for i, bit := range order {
751761 require.False(t, hs.x.tab.rec(s).ready, i)
752762 if bit == propCount { // the geometry
@@ -777,3 +787,20 @@ func TestMapFlowReadyFiresOnLastReplyInAnyOrder(t *testing.T) {
777787 require.Equal(t, "t", hs.ready[win].Title)
778788 require.Equal(t, 5, hs.ready[win].PID)
779789 }
790+
791+func TestMapFlowWholeOutputRectSetsHint(t *testing.T) {
792+ hs := newHarness(t, nil)
793+ hs.x.space.Set(ports.Layout{out(0, 0, 1920, 1080), out(1920, 0, 1280, 1024)})
794+ const win = 0x500001
795+ hs.classic(win)
796+ s := hs.create(win)
797+ r := hs.x.tab.rec(s)
798+ r.x, r.y, r.w, r.h, r.sized = 1920, 0, 1280, 1024, true
799+ info := hs.x.info(s)
800+ require.True(t, info.HasAt)
801+ require.Equal(t, 1920, info.AtX)
802+ r.h = 1000
803+ require.False(t, hs.x.info(s).HasAt)
804+ r.h, r.sized = 1024, false
805+ require.False(t, hs.x.info(s).HasAt)
806+}
@@ -121,7 +121,7 @@ func TestMapFlowBatchesRequestsAndReadyFiresOnce(t *testing.T) {
121 want := []uint32{121 want := []uint32{
122 uint32(xproto.AtomWmClass), uint32(xproto.AtomWmName), hs.p.atom("_NET_WM_NAME"), uint32(xproto.AtomWmHints),122 uint32(xproto.AtomWmClass), uint32(xproto.AtomWmName), hs.p.atom("_NET_WM_NAME"), uint32(xproto.AtomWmHints),
123 uint32(xproto.AtomWmNormalHints), hs.p.atom("WM_PROTOCOLS"), uint32(xproto.AtomWmTransientFor),123 uint32(xproto.AtomWmNormalHints), hs.p.atom("WM_PROTOCOLS"), uint32(xproto.AtomWmTransientFor),
124- hs.p.atom("_NET_WM_WINDOW_TYPE"), hs.p.atom("_NET_WM_STATE"), hs.p.atom("_NET_WM_PID"),124+ hs.p.atom("_NET_WM_WINDOW_TYPE"), hs.p.atom("_NET_WM_STATE"), hs.p.atom("_NET_WM_PID"), hs.p.atom("_NET_WM_BYPASS_COMPOSITOR"),
125 }125 }
126 require.GreaterOrEqual(t, len(reqs), len(want)+2)126 require.GreaterOrEqual(t, len(reqs), len(want)+2)
127 for i, a := range want {127 for i, a := range want {
@@ -180,6 +180,16 @@ func TestMapFlowFloatingAndModal(t *testing.T) {
180 {"modal", func(hs *harness, w uint32) {180 {"modal", func(hs *harness, w uint32) {
181 hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_MODAL")181 hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_MODAL")
182 }, func(i WindowInfo) { require.True(t, i.Modal); require.False(t, i.Fullscreen) }},182 }, func(i WindowInfo) { require.True(t, i.Modal); require.False(t, i.Fullscreen) }},
183+ {"bypass 1", func(hs *harness, w uint32) {
184+ hs.words(w, "_NET_WM_BYPASS_COMPOSITOR", uint32(xproto.AtomCardinal), 1)
185+ }, func(i WindowInfo) { require.EqualValues(t, 1, i.Bypass) }},
186+ {"bypass 2 kept", func(hs *harness, w uint32) {
187+ hs.words(w, "_NET_WM_BYPASS_COMPOSITOR", uint32(xproto.AtomCardinal), 2)
188+ }, func(i WindowInfo) { require.EqualValues(t, 2, i.Bypass) }},
189+ {"bypass absent", func(hs *harness, w uint32) {}, func(i WindowInfo) { require.Zero(t, i.Bypass) }},
190+ {"class steam_app", func(hs *harness, w uint32) {
191+ hs.p.setProp(w, uint32(xproto.AtomWmClass), uint32(xproto.AtomString), 8, []byte("steam_app_892970\x00steam_app_892970\x00"))
192+ }, func(i WindowInfo) { require.Equal(t, "steam_app_892970", i.AppID) }},
183 {"fullscreen at map", func(hs *harness, w uint32) {193 {"fullscreen at map", func(hs *harness, w uint32) {
184 hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN")194 hs.atoms(w, "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN")
185 }, func(i WindowInfo) { require.True(t, i.Fullscreen) }},195 }, func(i WindowInfo) { require.True(t, i.Fullscreen) }},
@@ -746,7 +756,7 @@ func TestMapFlowReadyFiresOnLastReplyInAnyOrder(t *testing.T) {
746 r := hs.x.tab.rec(s)756 r := hs.x.tab.rec(s)
747 r.mapping, r.pending = true, propMaskAll&^propClientIDs757 r.mapping, r.pending = true, propMaskAll&^propClientIDs
748 hs.expectReady(win)758 hs.expectReady(win)
749- order := []int{propCount, propPID, propClass, propNetName, propName, propHints, propNormalHints, propProtocols, propTransientFor, propWindowType, propState}759+ order := []int{propCount, propPID, propBypass, propClass, propNetName, propName, propHints, propNormalHints, propProtocols, propTransientFor, propWindowType, propState}
750 for i, bit := range order {760 for i, bit := range order {
751 require.False(t, hs.x.tab.rec(s).ready, i)761 require.False(t, hs.x.tab.rec(s).ready, i)
752 if bit == propCount { // the geometry762 if bit == propCount { // the geometry
@@ -777,3 +787,20 @@ func TestMapFlowReadyFiresOnLastReplyInAnyOrder(t *testing.T) {
777 require.Equal(t, "t", hs.ready[win].Title)787 require.Equal(t, "t", hs.ready[win].Title)
778 require.Equal(t, 5, hs.ready[win].PID)788 require.Equal(t, 5, hs.ready[win].PID)
779 }789 }
790+
791+func TestMapFlowWholeOutputRectSetsHint(t *testing.T) {
792+ hs := newHarness(t, nil)
793+ hs.x.space.Set(ports.Layout{out(0, 0, 1920, 1080), out(1920, 0, 1280, 1024)})
794+ const win = 0x500001
795+ hs.classic(win)
796+ s := hs.create(win)
797+ r := hs.x.tab.rec(s)
798+ r.x, r.y, r.w, r.h, r.sized = 1920, 0, 1280, 1024, true
799+ info := hs.x.info(s)
800+ require.True(t, info.HasAt)
801+ require.Equal(t, 1920, info.AtX)
802+ r.h = 1000
803+ require.False(t, hs.x.info(s).HasAt)
804+ r.h, r.sized = 1024, false
805+ require.False(t, hs.x.info(s).HasAt)
806+}
M internal/adapters/wayland/xwm/props.go +13 -0
@@ -24,6 +24,7 @@ const (
2424 propWindowType
2525 propState
2626 propPID
27+ propBypass
2728 propCount
2829 )
2930
@@ -67,6 +68,8 @@ func (x *XWM) propIndex(a uint32) int {
6768 return propState
6869 case x.atoms[atomNetWMPID]:
6970 return propPID
71+ case x.atoms[atomNetWMBypassCompositor]:
72+ return propBypass
7073 }
7174 return -1
7275 }
@@ -91,6 +94,8 @@ func (x *XWM) propAtom(idx int) xproto.Atom {
9194 return xproto.Atom(x.atoms[atomNetWMWindowType])
9295 case propState:
9396 return xproto.Atom(x.atoms[atomNetWMState])
97+ case propBypass:
98+ return xproto.Atom(x.atoms[atomNetWMBypassCompositor])
9499 default:
95100 return xproto.Atom(x.atoms[atomNetWMPID])
96101 }
@@ -260,6 +265,14 @@ func (x *XWM) applyProp(s Slot, idx int, format uint8, val []byte) {
260265 if changed && rec.ready {
261266 x.host.Fullscreen(s, fs)
262267 }
268+ case propBypass:
269+ // Kept for a later VRR/tearing policy; direct scanout and tearing
270+ // do not depend on it. 2 ("do not bypass") is ignored on purpose.
271+ rec.bypass = 0
272+ if len(val) >= 4 {
273+ rec.bypass = uint8(min(word(val, 0), 2))
274+ }
275+ x.log.Debug().Uint32("xid", rec.xid).Uint8("bypass", rec.bypass).Msg("_NET_WM_BYPASS_COMPOSITOR")
263276 case propPID:
264277 if len(val) >= 4 {
265278 rec.pid = int32(word(val, 0))
@@ -24,6 +24,7 @@ const (
24 propWindowType24 propWindowType
25 propState25 propState
26 propPID26 propPID
27+ propBypass
27 propCount28 propCount
28 )29 )
29 30
@@ -67,6 +68,8 @@ func (x *XWM) propIndex(a uint32) int {
67 return propState68 return propState
68 case x.atoms[atomNetWMPID]:69 case x.atoms[atomNetWMPID]:
69 return propPID70 return propPID
71+ case x.atoms[atomNetWMBypassCompositor]:
72+ return propBypass
70 }73 }
71 return -174 return -1
72 }75 }
@@ -91,6 +94,8 @@ func (x *XWM) propAtom(idx int) xproto.Atom {
91 return xproto.Atom(x.atoms[atomNetWMWindowType])94 return xproto.Atom(x.atoms[atomNetWMWindowType])
92 case propState:95 case propState:
93 return xproto.Atom(x.atoms[atomNetWMState])96 return xproto.Atom(x.atoms[atomNetWMState])
97+ case propBypass:
98+ return xproto.Atom(x.atoms[atomNetWMBypassCompositor])
94 default:99 default:
95 return xproto.Atom(x.atoms[atomNetWMPID])100 return xproto.Atom(x.atoms[atomNetWMPID])
96 }101 }
@@ -260,6 +265,14 @@ func (x *XWM) applyProp(s Slot, idx int, format uint8, val []byte) {
260 if changed && rec.ready {265 if changed && rec.ready {
261 x.host.Fullscreen(s, fs)266 x.host.Fullscreen(s, fs)
262 }267 }
268+ case propBypass:
269+ // Kept for a later VRR/tearing policy; direct scanout and tearing
270+ // do not depend on it. 2 ("do not bypass") is ignored on purpose.
271+ rec.bypass = 0
272+ if len(val) >= 4 {
273+ rec.bypass = uint8(min(word(val, 0), 2))
274+ }
275+ x.log.Debug().Uint32("xid", rec.xid).Uint8("bypass", rec.bypass).Msg("_NET_WM_BYPASS_COMPOSITOR")
263 case propPID:276 case propPID:
264 if len(val) >= 4 {277 if len(val) >= 4 {
265 rec.pid = int32(word(val, 0))278 rec.pid = int32(word(val, 0))
M internal/adapters/wayland/xwm/space.go +11 -0
@@ -114,6 +114,17 @@ func axisGap(v, lo, hi int) int {
114114 return 0
115115 }
116116
117+// WholeOutput reports whether the X rect is exactly one output's, and that
118+// output's layout origin.
119+func (s *Space) WholeOutput(x, y, w, h int) (lx, ly int, ok bool) {
120+ for i := 0; i < s.n; i++ {
121+ if r := s.regions[i]; r.X.X == x && r.X.Y == y && r.X.W == w && r.X.H == h {
122+ return r.Layout.X, r.Layout.Y, true
123+ }
124+ }
125+ return 0, 0, false
126+}
127+
117128 // ToX converts a layout point to X, through the nearest region.
118129 func (s *Space) ToX(lx, ly int) (x, y int) {
119130 i := s.nearest(lx, ly)
@@ -114,6 +114,17 @@ func axisGap(v, lo, hi int) int {
114 return 0114 return 0
115 }115 }
116 116
117+// WholeOutput reports whether the X rect is exactly one output's, and that
118+// output's layout origin.
119+func (s *Space) WholeOutput(x, y, w, h int) (lx, ly int, ok bool) {
120+ for i := 0; i < s.n; i++ {
121+ if r := s.regions[i]; r.X.X == x && r.X.Y == y && r.X.W == w && r.X.H == h {
122+ return r.Layout.X, r.Layout.Y, true
123+ }
124+ }
125+ return 0, 0, false
126+}
127+
117 // ToX converts a layout point to X, through the nearest region.128 // ToX converts a layout point to X, through the nearest region.
118 func (s *Space) ToX(lx, ly int) (x, y int) {129 func (s *Space) ToX(lx, ly int) (x, y int) {
119 i := s.nearest(lx, ly)130 i := s.nearest(lx, ly)
M internal/adapters/wayland/xwm/space_test.go +16 -0
@@ -92,3 +92,19 @@ func TestSpaceAllocations(t *testing.T) {
9292 t.Fatalf("allocs = %v", n)
9393 }
9494 }
95+
96+func TestSpaceWholeOutputMatchesPlace(t *testing.T) {
97+ var s Space
98+ s.Set(ports.Layout{out(-640, 0, 640, 480), out(0, 0, 1920, 1080)})
99+ lx, ly, ok := s.WholeOutput(0, 0, 640, 480)
100+ if !ok || lx != -640 || ly != 0 {
101+ t.Fatalf("WholeOutput = %d,%d,%v", lx, ly, ok)
102+ }
103+ // Placing the window at that origin lands on the same X point.
104+ if x, y := s.ToX(lx, ly); x != 0 || y != 0 {
105+ t.Fatalf("ToX = %d,%d", x, y)
106+ }
107+ if _, _, ok := s.WholeOutput(0, 0, 640, 481); ok {
108+ t.Fatal("partial rect matched")
109+ }
110+}
@@ -92,3 +92,19 @@ func TestSpaceAllocations(t *testing.T) {
92 t.Fatalf("allocs = %v", n)92 t.Fatalf("allocs = %v", n)
93 }93 }
94 }94 }
95+
96+func TestSpaceWholeOutputMatchesPlace(t *testing.T) {
97+ var s Space
98+ s.Set(ports.Layout{out(-640, 0, 640, 480), out(0, 0, 1920, 1080)})
99+ lx, ly, ok := s.WholeOutput(0, 0, 640, 480)
100+ if !ok || lx != -640 || ly != 0 {
101+ t.Fatalf("WholeOutput = %d,%d,%v", lx, ly, ok)
102+ }
103+ // Placing the window at that origin lands on the same X point.
104+ if x, y := s.ToX(lx, ly); x != 0 || y != 0 {
105+ t.Fatalf("ToX = %d,%d", x, y)
106+ }
107+ if _, _, ok := s.WholeOutput(0, 0, 640, 481); ok {
108+ t.Fatal("partial rect matched")
109+ }
110+}
M internal/adapters/wayland/xwm/table.go +3 -2
@@ -54,8 +54,9 @@ type record struct {
5454 minW, minH, maxW, maxH int32
5555 title, class string // owned, replaced only on change
5656 hasNetName bool
57- floating bool // dialog-like type; set with the properties
58- sized bool // the client asked for its size before Ready
57+ floating bool // dialog-like type; set with the properties
58+ bypass uint8 // _NET_WM_BYPASS_COMPOSITOR, 0..2
59+ sized bool // the client asked for its size before Ready
5960
6061 // pairing
6162 serial uint64
@@ -54,8 +54,9 @@ type record struct {
54 minW, minH, maxW, maxH int3254 minW, minH, maxW, maxH int32
55 title, class string // owned, replaced only on change55 title, class string // owned, replaced only on change
56 hasNetName bool56 hasNetName bool
57- floating bool // dialog-like type; set with the properties57+ floating bool // dialog-like type; set with the properties
58- sized bool // the client asked for its size before Ready58+ bypass uint8 // _NET_WM_BYPASS_COMPOSITOR, 0..2
59+ sized bool // the client asked for its size before Ready
59 60
60 // pairing61 // pairing
61 serial uint6462 serial uint64
M internal/adapters/wayland/xwm/testdata/streams/property_unchanged.hex +949 -949
@@ -1,950 +1,950 @@
1-1c00650001005000f30300000000000000000000000000000000000000000000
2-0108660003000000ef0300000000000009000000000000000000000000000000
3-6e6574207469746c650000001c00660001005000f30300000000000000000000
4-0000000000000000000000000108670003000000ef0300000000000009000000
5-0000000000000000000000006e6574207469746c650000001c00670001005000
6-f303000000000000000000000000000000000000000000000108680003000000
7-ef03000000000000090000000000000000000000000000006e6574207469746c
8-650000001c00680001005000f303000000000000000000000000000000000000
9-000000000108690003000000ef03000000000000090000000000000000000000
10-000000006e6574207469746c650000001c00690001005000f303000000000000
11-0000000000000000000000000000000001086a0003000000ef03000000000000
12-090000000000000000000000000000006e6574207469746c650000001c006a00
13-01005000f3030000000000000000000000000000000000000000000001086b00
14-03000000ef03000000000000090000000000000000000000000000006e657420
15-7469746c650000001c006b0001005000f3030000000000000000000000000000
16-000000000000000001086c0003000000ef030000000000000900000000000000
17-00000000000000006e6574207469746c650000001c006c0001005000f3030000
18-000000000000000000000000000000000000000001086d0003000000ef030000
19-00000000090000000000000000000000000000006e6574207469746c65000000
20-1c006d0001005000f30300000000000000000000000000000000000000000000
21-01086e0003000000ef0300000000000009000000000000000000000000000000
22-6e6574207469746c650000001c006e0001005000f30300000000000000000000
23-00000000000000000000000001086f0003000000ef0300000000000009000000
24-0000000000000000000000006e6574207469746c650000001c006f0001005000
25-f303000000000000000000000000000000000000000000000108700003000000
26-ef03000000000000090000000000000000000000000000006e6574207469746c
27-650000001c00700001005000f303000000000000000000000000000000000000
28-000000000108710003000000ef03000000000000090000000000000000000000
29-000000006e6574207469746c650000001c00710001005000f303000000000000
30-000000000000000000000000000000000108720003000000ef03000000000000
31-090000000000000000000000000000006e6574207469746c650000001c007200
32-01005000f3030000000000000000000000000000000000000000000001087300
33-03000000ef03000000000000090000000000000000000000000000006e657420
34-7469746c650000001c00730001005000f3030000000000000000000000000000
35-00000000000000000108740003000000ef030000000000000900000000000000
36-00000000000000006e6574207469746c650000001c00740001005000f3030000
37-00000000000000000000000000000000000000000108750003000000ef030000
38-00000000090000000000000000000000000000006e6574207469746c65000000
39-1c00750001005000f30300000000000000000000000000000000000000000000
40-0108760003000000ef0300000000000009000000000000000000000000000000
41-6e6574207469746c650000001c00760001005000f30300000000000000000000
42-0000000000000000000000000108770003000000ef0300000000000009000000
43-0000000000000000000000006e6574207469746c650000001c00770001005000
44-f303000000000000000000000000000000000000000000000108780003000000
45-ef03000000000000090000000000000000000000000000006e6574207469746c
46-650000001c00780001005000f303000000000000000000000000000000000000
47-000000000108790003000000ef03000000000000090000000000000000000000
48-000000006e6574207469746c650000001c00790001005000f303000000000000
49-0000000000000000000000000000000001087a0003000000ef03000000000000
50-090000000000000000000000000000006e6574207469746c650000001c007a00
51-01005000f3030000000000000000000000000000000000000000000001087b00
52-03000000ef03000000000000090000000000000000000000000000006e657420
53-7469746c650000001c007b0001005000f3030000000000000000000000000000
54-000000000000000001087c0003000000ef030000000000000900000000000000
55-00000000000000006e6574207469746c650000001c007c0001005000f3030000
56-000000000000000000000000000000000000000001087d0003000000ef030000
57-00000000090000000000000000000000000000006e6574207469746c65000000
58-1c007d0001005000f30300000000000000000000000000000000000000000000
59-01087e0003000000ef0300000000000009000000000000000000000000000000
60-6e6574207469746c650000001c007e0001005000f30300000000000000000000
61-00000000000000000000000001087f0003000000ef0300000000000009000000
62-0000000000000000000000006e6574207469746c650000001c007f0001005000
63-f303000000000000000000000000000000000000000000000108800003000000
64-ef03000000000000090000000000000000000000000000006e6574207469746c
65-650000001c00800001005000f303000000000000000000000000000000000000
66-000000000108810003000000ef03000000000000090000000000000000000000
67-000000006e6574207469746c650000001c00810001005000f303000000000000
68-000000000000000000000000000000000108820003000000ef03000000000000
69-090000000000000000000000000000006e6574207469746c650000001c008200
70-01005000f3030000000000000000000000000000000000000000000001088300
71-03000000ef03000000000000090000000000000000000000000000006e657420
72-7469746c650000001c00830001005000f3030000000000000000000000000000
73-00000000000000000108840003000000ef030000000000000900000000000000
74-00000000000000006e6574207469746c650000001c00840001005000f3030000
75-00000000000000000000000000000000000000000108850003000000ef030000
76-00000000090000000000000000000000000000006e6574207469746c65000000
77-1c00850001005000f30300000000000000000000000000000000000000000000
78-0108860003000000ef0300000000000009000000000000000000000000000000
79-6e6574207469746c650000001c00860001005000f30300000000000000000000
80-0000000000000000000000000108870003000000ef0300000000000009000000
81-0000000000000000000000006e6574207469746c650000001c00870001005000
82-f303000000000000000000000000000000000000000000000108880003000000
83-ef03000000000000090000000000000000000000000000006e6574207469746c
84-650000001c00880001005000f303000000000000000000000000000000000000
85-000000000108890003000000ef03000000000000090000000000000000000000
86-000000006e6574207469746c650000001c00890001005000f303000000000000
87-0000000000000000000000000000000001088a0003000000ef03000000000000
88-090000000000000000000000000000006e6574207469746c650000001c008a00
89-01005000f3030000000000000000000000000000000000000000000001088b00
90-03000000ef03000000000000090000000000000000000000000000006e657420
91-7469746c650000001c008b0001005000f3030000000000000000000000000000
92-000000000000000001088c0003000000ef030000000000000900000000000000
93-00000000000000006e6574207469746c650000001c008c0001005000f3030000
94-000000000000000000000000000000000000000001088d0003000000ef030000
95-00000000090000000000000000000000000000006e6574207469746c65000000
96-1c008d0001005000f30300000000000000000000000000000000000000000000
97-01088e0003000000ef0300000000000009000000000000000000000000000000
98-6e6574207469746c650000001c008e0001005000f30300000000000000000000
99-00000000000000000000000001088f0003000000ef0300000000000009000000
100-0000000000000000000000006e6574207469746c650000001c008f0001005000
101-f303000000000000000000000000000000000000000000000108900003000000
102-ef03000000000000090000000000000000000000000000006e6574207469746c
103-650000001c00900001005000f303000000000000000000000000000000000000
104-000000000108910003000000ef03000000000000090000000000000000000000
105-000000006e6574207469746c650000001c00910001005000f303000000000000
106-000000000000000000000000000000000108920003000000ef03000000000000
107-090000000000000000000000000000006e6574207469746c650000001c009200
108-01005000f3030000000000000000000000000000000000000000000001089300
109-03000000ef03000000000000090000000000000000000000000000006e657420
110-7469746c650000001c00930001005000f3030000000000000000000000000000
111-00000000000000000108940003000000ef030000000000000900000000000000
112-00000000000000006e6574207469746c650000001c00940001005000f3030000
113-00000000000000000000000000000000000000000108950003000000ef030000
114-00000000090000000000000000000000000000006e6574207469746c65000000
115-1c00950001005000f30300000000000000000000000000000000000000000000
116-0108960003000000ef0300000000000009000000000000000000000000000000
117-6e6574207469746c650000001c00960001005000f30300000000000000000000
118-0000000000000000000000000108970003000000ef0300000000000009000000
119-0000000000000000000000006e6574207469746c650000001c00970001005000
120-f303000000000000000000000000000000000000000000000108980003000000
121-ef03000000000000090000000000000000000000000000006e6574207469746c
122-650000001c00980001005000f303000000000000000000000000000000000000
123-000000000108990003000000ef03000000000000090000000000000000000000
124-000000006e6574207469746c650000001c00990001005000f303000000000000
125-0000000000000000000000000000000001089a0003000000ef03000000000000
126-090000000000000000000000000000006e6574207469746c650000001c009a00
127-01005000f3030000000000000000000000000000000000000000000001089b00
128-03000000ef03000000000000090000000000000000000000000000006e657420
129-7469746c650000001c009b0001005000f3030000000000000000000000000000
130-000000000000000001089c0003000000ef030000000000000900000000000000
131-00000000000000006e6574207469746c650000001c009c0001005000f3030000
132-000000000000000000000000000000000000000001089d0003000000ef030000
133-00000000090000000000000000000000000000006e6574207469746c65000000
134-1c009d0001005000f30300000000000000000000000000000000000000000000
135-01089e0003000000ef0300000000000009000000000000000000000000000000
136-6e6574207469746c650000001c009e0001005000f30300000000000000000000
137-00000000000000000000000001089f0003000000ef0300000000000009000000
138-0000000000000000000000006e6574207469746c650000001c009f0001005000
139-f303000000000000000000000000000000000000000000000108a00003000000
140-ef03000000000000090000000000000000000000000000006e6574207469746c
141-650000001c00a00001005000f303000000000000000000000000000000000000
142-000000000108a10003000000ef03000000000000090000000000000000000000
143-000000006e6574207469746c650000001c00a10001005000f303000000000000
144-000000000000000000000000000000000108a20003000000ef03000000000000
145-090000000000000000000000000000006e6574207469746c650000001c00a200
146-01005000f303000000000000000000000000000000000000000000000108a300
147-03000000ef03000000000000090000000000000000000000000000006e657420
148-7469746c650000001c00a30001005000f3030000000000000000000000000000
149-00000000000000000108a40003000000ef030000000000000900000000000000
150-00000000000000006e6574207469746c650000001c00a40001005000f3030000
151-00000000000000000000000000000000000000000108a50003000000ef030000
152-00000000090000000000000000000000000000006e6574207469746c65000000
153-1c00a50001005000f30300000000000000000000000000000000000000000000
154-0108a60003000000ef0300000000000009000000000000000000000000000000
155-6e6574207469746c650000001c00a60001005000f30300000000000000000000
156-0000000000000000000000000108a70003000000ef0300000000000009000000
157-0000000000000000000000006e6574207469746c650000001c00a70001005000
158-f303000000000000000000000000000000000000000000000108a80003000000
159-ef03000000000000090000000000000000000000000000006e6574207469746c
160-650000001c00a80001005000f303000000000000000000000000000000000000
161-000000000108a90003000000ef03000000000000090000000000000000000000
162-000000006e6574207469746c650000001c00a90001005000f303000000000000
163-000000000000000000000000000000000108aa0003000000ef03000000000000
164-090000000000000000000000000000006e6574207469746c650000001c00aa00
165-01005000f303000000000000000000000000000000000000000000000108ab00
166-03000000ef03000000000000090000000000000000000000000000006e657420
167-7469746c650000001c00ab0001005000f3030000000000000000000000000000
168-00000000000000000108ac0003000000ef030000000000000900000000000000
169-00000000000000006e6574207469746c650000001c00ac0001005000f3030000
170-00000000000000000000000000000000000000000108ad0003000000ef030000
171-00000000090000000000000000000000000000006e6574207469746c65000000
172-1c00ad0001005000f30300000000000000000000000000000000000000000000
173-0108ae0003000000ef0300000000000009000000000000000000000000000000
174-6e6574207469746c650000001c00ae0001005000f30300000000000000000000
175-0000000000000000000000000108af0003000000ef0300000000000009000000
176-0000000000000000000000006e6574207469746c650000001c00af0001005000
177-f303000000000000000000000000000000000000000000000108b00003000000
178-ef03000000000000090000000000000000000000000000006e6574207469746c
179-650000001c00b00001005000f303000000000000000000000000000000000000
180-000000000108b10003000000ef03000000000000090000000000000000000000
181-000000006e6574207469746c650000001c00b10001005000f303000000000000
182-000000000000000000000000000000000108b20003000000ef03000000000000
183-090000000000000000000000000000006e6574207469746c650000001c00b200
184-01005000f303000000000000000000000000000000000000000000000108b300
185-03000000ef03000000000000090000000000000000000000000000006e657420
186-7469746c650000001c00b30001005000f3030000000000000000000000000000
187-00000000000000000108b40003000000ef030000000000000900000000000000
188-00000000000000006e6574207469746c650000001c00b40001005000f3030000
189-00000000000000000000000000000000000000000108b50003000000ef030000
190-00000000090000000000000000000000000000006e6574207469746c65000000
191-1c00b50001005000f30300000000000000000000000000000000000000000000
192-0108b60003000000ef0300000000000009000000000000000000000000000000
193-6e6574207469746c650000001c00b60001005000f30300000000000000000000
194-0000000000000000000000000108b70003000000ef0300000000000009000000
195-0000000000000000000000006e6574207469746c650000001c00b70001005000
196-f303000000000000000000000000000000000000000000000108b80003000000
197-ef03000000000000090000000000000000000000000000006e6574207469746c
198-650000001c00b80001005000f303000000000000000000000000000000000000
199-000000000108b90003000000ef03000000000000090000000000000000000000
200-000000006e6574207469746c650000001c00b90001005000f303000000000000
201-000000000000000000000000000000000108ba0003000000ef03000000000000
202-090000000000000000000000000000006e6574207469746c650000001c00ba00
203-01005000f303000000000000000000000000000000000000000000000108bb00
204-03000000ef03000000000000090000000000000000000000000000006e657420
205-7469746c650000001c00bb0001005000f3030000000000000000000000000000
206-00000000000000000108bc0003000000ef030000000000000900000000000000
207-00000000000000006e6574207469746c650000001c00bc0001005000f3030000
208-00000000000000000000000000000000000000000108bd0003000000ef030000
209-00000000090000000000000000000000000000006e6574207469746c65000000
210-1c00bd0001005000f30300000000000000000000000000000000000000000000
211-0108be0003000000ef0300000000000009000000000000000000000000000000
212-6e6574207469746c650000001c00be0001005000f30300000000000000000000
213-0000000000000000000000000108bf0003000000ef0300000000000009000000
214-0000000000000000000000006e6574207469746c650000001c00bf0001005000
215-f303000000000000000000000000000000000000000000000108c00003000000
216-ef03000000000000090000000000000000000000000000006e6574207469746c
217-650000001c00c00001005000f303000000000000000000000000000000000000
218-000000000108c10003000000ef03000000000000090000000000000000000000
219-000000006e6574207469746c650000001c00c10001005000f303000000000000
220-000000000000000000000000000000000108c20003000000ef03000000000000
221-090000000000000000000000000000006e6574207469746c650000001c00c200
222-01005000f303000000000000000000000000000000000000000000000108c300
223-03000000ef03000000000000090000000000000000000000000000006e657420
224-7469746c650000001c00c30001005000f3030000000000000000000000000000
225-00000000000000000108c40003000000ef030000000000000900000000000000
226-00000000000000006e6574207469746c650000001c00c40001005000f3030000
227-00000000000000000000000000000000000000000108c50003000000ef030000
228-00000000090000000000000000000000000000006e6574207469746c65000000
229-1c00c50001005000f30300000000000000000000000000000000000000000000
230-0108c60003000000ef0300000000000009000000000000000000000000000000
231-6e6574207469746c650000001c00c60001005000f30300000000000000000000
232-0000000000000000000000000108c70003000000ef0300000000000009000000
233-0000000000000000000000006e6574207469746c650000001c00c70001005000
234-f303000000000000000000000000000000000000000000000108c80003000000
235-ef03000000000000090000000000000000000000000000006e6574207469746c
236-650000001c00c80001005000f303000000000000000000000000000000000000
237-000000000108c90003000000ef03000000000000090000000000000000000000
238-000000006e6574207469746c650000001c00c90001005000f303000000000000
239-000000000000000000000000000000000108ca0003000000ef03000000000000
240-090000000000000000000000000000006e6574207469746c650000001c00ca00
241-01005000f303000000000000000000000000000000000000000000000108cb00
242-03000000ef03000000000000090000000000000000000000000000006e657420
243-7469746c650000001c00cb0001005000f3030000000000000000000000000000
244-00000000000000000108cc0003000000ef030000000000000900000000000000
245-00000000000000006e6574207469746c650000001c00cc0001005000f3030000
246-00000000000000000000000000000000000000000108cd0003000000ef030000
247-00000000090000000000000000000000000000006e6574207469746c65000000
248-1c00cd0001005000f30300000000000000000000000000000000000000000000
249-0108ce0003000000ef0300000000000009000000000000000000000000000000
250-6e6574207469746c650000001c00ce0001005000f30300000000000000000000
251-0000000000000000000000000108cf0003000000ef0300000000000009000000
252-0000000000000000000000006e6574207469746c650000001c00cf0001005000
253-f303000000000000000000000000000000000000000000000108d00003000000
254-ef03000000000000090000000000000000000000000000006e6574207469746c
255-650000001c00d00001005000f303000000000000000000000000000000000000
256-000000000108d10003000000ef03000000000000090000000000000000000000
257-000000006e6574207469746c650000001c00d10001005000f303000000000000
258-000000000000000000000000000000000108d20003000000ef03000000000000
259-090000000000000000000000000000006e6574207469746c650000001c00d200
260-01005000f303000000000000000000000000000000000000000000000108d300
261-03000000ef03000000000000090000000000000000000000000000006e657420
262-7469746c650000001c00d30001005000f3030000000000000000000000000000
263-00000000000000000108d40003000000ef030000000000000900000000000000
264-00000000000000006e6574207469746c650000001c00d40001005000f3030000
265-00000000000000000000000000000000000000000108d50003000000ef030000
266-00000000090000000000000000000000000000006e6574207469746c65000000
267-1c00d50001005000f30300000000000000000000000000000000000000000000
268-0108d60003000000ef0300000000000009000000000000000000000000000000
269-6e6574207469746c650000001c00d60001005000f30300000000000000000000
270-0000000000000000000000000108d70003000000ef0300000000000009000000
271-0000000000000000000000006e6574207469746c650000001c00d70001005000
272-f303000000000000000000000000000000000000000000000108d80003000000
273-ef03000000000000090000000000000000000000000000006e6574207469746c
274-650000001c00d80001005000f303000000000000000000000000000000000000
275-000000000108d90003000000ef03000000000000090000000000000000000000
276-000000006e6574207469746c650000001c00d90001005000f303000000000000
277-000000000000000000000000000000000108da0003000000ef03000000000000
278-090000000000000000000000000000006e6574207469746c650000001c00da00
279-01005000f303000000000000000000000000000000000000000000000108db00
280-03000000ef03000000000000090000000000000000000000000000006e657420
281-7469746c650000001c00db0001005000f3030000000000000000000000000000
282-00000000000000000108dc0003000000ef030000000000000900000000000000
283-00000000000000006e6574207469746c650000001c00dc0001005000f3030000
284-00000000000000000000000000000000000000000108dd0003000000ef030000
285-00000000090000000000000000000000000000006e6574207469746c65000000
286-1c00dd0001005000f30300000000000000000000000000000000000000000000
287-0108de0003000000ef0300000000000009000000000000000000000000000000
288-6e6574207469746c650000001c00de0001005000f30300000000000000000000
289-0000000000000000000000000108df0003000000ef0300000000000009000000
290-0000000000000000000000006e6574207469746c650000001c00df0001005000
291-f303000000000000000000000000000000000000000000000108e00003000000
292-ef03000000000000090000000000000000000000000000006e6574207469746c
293-650000001c00e00001005000f303000000000000000000000000000000000000
294-000000000108e10003000000ef03000000000000090000000000000000000000
295-000000006e6574207469746c650000001c00e10001005000f303000000000000
296-000000000000000000000000000000000108e20003000000ef03000000000000
297-090000000000000000000000000000006e6574207469746c650000001c00e200
298-01005000f303000000000000000000000000000000000000000000000108e300
299-03000000ef03000000000000090000000000000000000000000000006e657420
300-7469746c650000001c00e30001005000f3030000000000000000000000000000
301-00000000000000000108e40003000000ef030000000000000900000000000000
302-00000000000000006e6574207469746c650000001c00e40001005000f3030000
303-00000000000000000000000000000000000000000108e50003000000ef030000
304-00000000090000000000000000000000000000006e6574207469746c65000000
305-1c00e50001005000f30300000000000000000000000000000000000000000000
306-0108e60003000000ef0300000000000009000000000000000000000000000000
307-6e6574207469746c650000001c00e60001005000f30300000000000000000000
308-0000000000000000000000000108e70003000000ef0300000000000009000000
309-0000000000000000000000006e6574207469746c650000001c00e70001005000
310-f303000000000000000000000000000000000000000000000108e80003000000
311-ef03000000000000090000000000000000000000000000006e6574207469746c
312-650000001c00e80001005000f303000000000000000000000000000000000000
313-000000000108e90003000000ef03000000000000090000000000000000000000
314-000000006e6574207469746c650000001c00e90001005000f303000000000000
315-000000000000000000000000000000000108ea0003000000ef03000000000000
316-090000000000000000000000000000006e6574207469746c650000001c00ea00
317-01005000f303000000000000000000000000000000000000000000000108eb00
318-03000000ef03000000000000090000000000000000000000000000006e657420
319-7469746c650000001c00eb0001005000f3030000000000000000000000000000
320-00000000000000000108ec0003000000ef030000000000000900000000000000
321-00000000000000006e6574207469746c650000001c00ec0001005000f3030000
322-00000000000000000000000000000000000000000108ed0003000000ef030000
323-00000000090000000000000000000000000000006e6574207469746c65000000
324-1c00ed0001005000f30300000000000000000000000000000000000000000000
325-0108ee0003000000ef0300000000000009000000000000000000000000000000
326-6e6574207469746c650000001c00ee0001005000f30300000000000000000000
327-0000000000000000000000000108ef0003000000ef0300000000000009000000
328-0000000000000000000000006e6574207469746c650000001c00ef0001005000
329-f303000000000000000000000000000000000000000000000108f00003000000
330-ef03000000000000090000000000000000000000000000006e6574207469746c
331-650000001c00f00001005000f303000000000000000000000000000000000000
332-000000000108f10003000000ef03000000000000090000000000000000000000
333-000000006e6574207469746c650000001c00f10001005000f303000000000000
334-000000000000000000000000000000000108f20003000000ef03000000000000
335-090000000000000000000000000000006e6574207469746c650000001c00f200
336-01005000f303000000000000000000000000000000000000000000000108f300
337-03000000ef03000000000000090000000000000000000000000000006e657420
338-7469746c650000001c00f30001005000f3030000000000000000000000000000
339-00000000000000000108f40003000000ef030000000000000900000000000000
340-00000000000000006e6574207469746c650000001c00f40001005000f3030000
341-00000000000000000000000000000000000000000108f50003000000ef030000
342-00000000090000000000000000000000000000006e6574207469746c65000000
343-1c00f50001005000f30300000000000000000000000000000000000000000000
344-0108f60003000000ef0300000000000009000000000000000000000000000000
345-6e6574207469746c650000001c00f60001005000f30300000000000000000000
346-0000000000000000000000000108f70003000000ef0300000000000009000000
347-0000000000000000000000006e6574207469746c650000001c00f70001005000
348-f303000000000000000000000000000000000000000000000108f80003000000
349-ef03000000000000090000000000000000000000000000006e6574207469746c
350-650000001c00f80001005000f303000000000000000000000000000000000000
351-000000000108f90003000000ef03000000000000090000000000000000000000
352-000000006e6574207469746c650000001c00f90001005000f303000000000000
353-000000000000000000000000000000000108fa0003000000ef03000000000000
354-090000000000000000000000000000006e6574207469746c650000001c00fa00
355-01005000f303000000000000000000000000000000000000000000000108fb00
356-03000000ef03000000000000090000000000000000000000000000006e657420
357-7469746c650000001c00fb0001005000f3030000000000000000000000000000
358-00000000000000000108fc0003000000ef030000000000000900000000000000
359-00000000000000006e6574207469746c650000001c00fc0001005000f3030000
360-00000000000000000000000000000000000000000108fd0003000000ef030000
361-00000000090000000000000000000000000000006e6574207469746c65000000
362-1c00fd0001005000f30300000000000000000000000000000000000000000000
363-0108fe0003000000ef0300000000000009000000000000000000000000000000
364-6e6574207469746c650000001c00fe0001005000f30300000000000000000000
365-0000000000000000000000000108ff0003000000ef0300000000000009000000
366-0000000000000000000000006e6574207469746c650000001c00ff0001005000
367-f303000000000000000000000000000000000000000000000108000103000000
368-ef03000000000000090000000000000000000000000000006e6574207469746c
369-650000001c00000101005000f303000000000000000000000000000000000000
370-000000000108010103000000ef03000000000000090000000000000000000000
371-000000006e6574207469746c650000001c00010101005000f303000000000000
372-000000000000000000000000000000000108020103000000ef03000000000000
373-090000000000000000000000000000006e6574207469746c650000001c000201
374-01005000f3030000000000000000000000000000000000000000000001080301
375-03000000ef03000000000000090000000000000000000000000000006e657420
376-7469746c650000001c00030101005000f3030000000000000000000000000000
377-00000000000000000108040103000000ef030000000000000900000000000000
378-00000000000000006e6574207469746c650000001c00040101005000f3030000
379-00000000000000000000000000000000000000000108050103000000ef030000
380-00000000090000000000000000000000000000006e6574207469746c65000000
381-1c00050101005000f30300000000000000000000000000000000000000000000
382-0108060103000000ef0300000000000009000000000000000000000000000000
383-6e6574207469746c650000001c00060101005000f30300000000000000000000
384-0000000000000000000000000108070103000000ef0300000000000009000000
385-0000000000000000000000006e6574207469746c650000001c00070101005000
386-f303000000000000000000000000000000000000000000000108080103000000
387-ef03000000000000090000000000000000000000000000006e6574207469746c
388-650000001c00080101005000f303000000000000000000000000000000000000
389-000000000108090103000000ef03000000000000090000000000000000000000
390-000000006e6574207469746c650000001c00090101005000f303000000000000
391-0000000000000000000000000000000001080a0103000000ef03000000000000
392-090000000000000000000000000000006e6574207469746c650000001c000a01
393-01005000f3030000000000000000000000000000000000000000000001080b01
394-03000000ef03000000000000090000000000000000000000000000006e657420
395-7469746c650000001c000b0101005000f3030000000000000000000000000000
396-000000000000000001080c0103000000ef030000000000000900000000000000
397-00000000000000006e6574207469746c650000001c000c0101005000f3030000
398-000000000000000000000000000000000000000001080d0103000000ef030000
399-00000000090000000000000000000000000000006e6574207469746c65000000
400-1c000d0101005000f30300000000000000000000000000000000000000000000
401-01080e0103000000ef0300000000000009000000000000000000000000000000
402-6e6574207469746c650000001c000e0101005000f30300000000000000000000
403-00000000000000000000000001080f0103000000ef0300000000000009000000
404-0000000000000000000000006e6574207469746c650000001c000f0101005000
405-f303000000000000000000000000000000000000000000000108100103000000
406-ef03000000000000090000000000000000000000000000006e6574207469746c
407-650000001c00100101005000f303000000000000000000000000000000000000
408-000000000108110103000000ef03000000000000090000000000000000000000
409-000000006e6574207469746c650000001c00110101005000f303000000000000
410-000000000000000000000000000000000108120103000000ef03000000000000
411-090000000000000000000000000000006e6574207469746c650000001c001201
412-01005000f3030000000000000000000000000000000000000000000001081301
413-03000000ef03000000000000090000000000000000000000000000006e657420
414-7469746c650000001c00130101005000f3030000000000000000000000000000
415-00000000000000000108140103000000ef030000000000000900000000000000
416-00000000000000006e6574207469746c650000001c00140101005000f3030000
417-00000000000000000000000000000000000000000108150103000000ef030000
418-00000000090000000000000000000000000000006e6574207469746c65000000
419-1c00150101005000f30300000000000000000000000000000000000000000000
420-0108160103000000ef0300000000000009000000000000000000000000000000
421-6e6574207469746c650000001c00160101005000f30300000000000000000000
422-0000000000000000000000000108170103000000ef0300000000000009000000
423-0000000000000000000000006e6574207469746c650000001c00170101005000
424-f303000000000000000000000000000000000000000000000108180103000000
425-ef03000000000000090000000000000000000000000000006e6574207469746c
426-650000001c00180101005000f303000000000000000000000000000000000000
427-000000000108190103000000ef03000000000000090000000000000000000000
428-000000006e6574207469746c650000001c00190101005000f303000000000000
429-0000000000000000000000000000000001081a0103000000ef03000000000000
430-090000000000000000000000000000006e6574207469746c650000001c001a01
431-01005000f3030000000000000000000000000000000000000000000001081b01
432-03000000ef03000000000000090000000000000000000000000000006e657420
433-7469746c650000001c001b0101005000f3030000000000000000000000000000
434-000000000000000001081c0103000000ef030000000000000900000000000000
435-00000000000000006e6574207469746c650000001c001c0101005000f3030000
436-000000000000000000000000000000000000000001081d0103000000ef030000
437-00000000090000000000000000000000000000006e6574207469746c65000000
438-1c001d0101005000f30300000000000000000000000000000000000000000000
439-01081e0103000000ef0300000000000009000000000000000000000000000000
440-6e6574207469746c650000001c001e0101005000f30300000000000000000000
441-00000000000000000000000001081f0103000000ef0300000000000009000000
442-0000000000000000000000006e6574207469746c650000001c001f0101005000
443-f303000000000000000000000000000000000000000000000108200103000000
444-ef03000000000000090000000000000000000000000000006e6574207469746c
445-650000001c00200101005000f303000000000000000000000000000000000000
446-000000000108210103000000ef03000000000000090000000000000000000000
447-000000006e6574207469746c650000001c00210101005000f303000000000000
448-000000000000000000000000000000000108220103000000ef03000000000000
449-090000000000000000000000000000006e6574207469746c650000001c002201
450-01005000f3030000000000000000000000000000000000000000000001082301
451-03000000ef03000000000000090000000000000000000000000000006e657420
452-7469746c650000001c00230101005000f3030000000000000000000000000000
453-00000000000000000108240103000000ef030000000000000900000000000000
454-00000000000000006e6574207469746c650000001c00240101005000f3030000
455-00000000000000000000000000000000000000000108250103000000ef030000
456-00000000090000000000000000000000000000006e6574207469746c65000000
457-1c00250101005000f30300000000000000000000000000000000000000000000
458-0108260103000000ef0300000000000009000000000000000000000000000000
459-6e6574207469746c650000001c00260101005000f30300000000000000000000
460-0000000000000000000000000108270103000000ef0300000000000009000000
461-0000000000000000000000006e6574207469746c650000001c00270101005000
462-f303000000000000000000000000000000000000000000000108280103000000
463-ef03000000000000090000000000000000000000000000006e6574207469746c
464-650000001c00280101005000f303000000000000000000000000000000000000
465-000000000108290103000000ef03000000000000090000000000000000000000
466-000000006e6574207469746c650000001c00290101005000f303000000000000
467-0000000000000000000000000000000001082a0103000000ef03000000000000
468-090000000000000000000000000000006e6574207469746c650000001c002a01
469-01005000f3030000000000000000000000000000000000000000000001082b01
470-03000000ef03000000000000090000000000000000000000000000006e657420
471-7469746c650000001c002b0101005000f3030000000000000000000000000000
472-000000000000000001082c0103000000ef030000000000000900000000000000
473-00000000000000006e6574207469746c650000001c002c0101005000f3030000
474-000000000000000000000000000000000000000001082d0103000000ef030000
475-00000000090000000000000000000000000000006e6574207469746c65000000
476-1c002d0101005000f30300000000000000000000000000000000000000000000
477-01082e0103000000ef0300000000000009000000000000000000000000000000
478-6e6574207469746c650000001c002e0101005000f30300000000000000000000
479-00000000000000000000000001082f0103000000ef0300000000000009000000
480-0000000000000000000000006e6574207469746c650000001c002f0101005000
481-f303000000000000000000000000000000000000000000000108300103000000
482-ef03000000000000090000000000000000000000000000006e6574207469746c
483-650000001c00300101005000f303000000000000000000000000000000000000
484-000000000108310103000000ef03000000000000090000000000000000000000
485-000000006e6574207469746c650000001c00310101005000f303000000000000
486-000000000000000000000000000000000108320103000000ef03000000000000
487-090000000000000000000000000000006e6574207469746c650000001c003201
488-01005000f3030000000000000000000000000000000000000000000001083301
489-03000000ef03000000000000090000000000000000000000000000006e657420
490-7469746c650000001c00330101005000f3030000000000000000000000000000
491-00000000000000000108340103000000ef030000000000000900000000000000
492-00000000000000006e6574207469746c650000001c00340101005000f3030000
493-00000000000000000000000000000000000000000108350103000000ef030000
494-00000000090000000000000000000000000000006e6574207469746c65000000
495-1c00350101005000f30300000000000000000000000000000000000000000000
496-0108360103000000ef0300000000000009000000000000000000000000000000
497-6e6574207469746c650000001c00360101005000f30300000000000000000000
498-0000000000000000000000000108370103000000ef0300000000000009000000
499-0000000000000000000000006e6574207469746c650000001c00370101005000
500-f303000000000000000000000000000000000000000000000108380103000000
501-ef03000000000000090000000000000000000000000000006e6574207469746c
502-650000001c00380101005000f303000000000000000000000000000000000000
503-000000000108390103000000ef03000000000000090000000000000000000000
504-000000006e6574207469746c650000001c00390101005000f303000000000000
505-0000000000000000000000000000000001083a0103000000ef03000000000000
506-090000000000000000000000000000006e6574207469746c650000001c003a01
507-01005000f3030000000000000000000000000000000000000000000001083b01
508-03000000ef03000000000000090000000000000000000000000000006e657420
509-7469746c650000001c003b0101005000f3030000000000000000000000000000
510-000000000000000001083c0103000000ef030000000000000900000000000000
511-00000000000000006e6574207469746c650000001c003c0101005000f3030000
512-000000000000000000000000000000000000000001083d0103000000ef030000
513-00000000090000000000000000000000000000006e6574207469746c65000000
514-1c003d0101005000f30300000000000000000000000000000000000000000000
515-01083e0103000000ef0300000000000009000000000000000000000000000000
516-6e6574207469746c650000001c003e0101005000f30300000000000000000000
517-00000000000000000000000001083f0103000000ef0300000000000009000000
518-0000000000000000000000006e6574207469746c650000001c003f0101005000
519-f303000000000000000000000000000000000000000000000108400103000000
520-ef03000000000000090000000000000000000000000000006e6574207469746c
521-650000001c00400101005000f303000000000000000000000000000000000000
522-000000000108410103000000ef03000000000000090000000000000000000000
523-000000006e6574207469746c650000001c00410101005000f303000000000000
524-000000000000000000000000000000000108420103000000ef03000000000000
525-090000000000000000000000000000006e6574207469746c650000001c004201
526-01005000f3030000000000000000000000000000000000000000000001084301
527-03000000ef03000000000000090000000000000000000000000000006e657420
528-7469746c650000001c00430101005000f3030000000000000000000000000000
529-00000000000000000108440103000000ef030000000000000900000000000000
530-00000000000000006e6574207469746c650000001c00440101005000f3030000
531-00000000000000000000000000000000000000000108450103000000ef030000
532-00000000090000000000000000000000000000006e6574207469746c65000000
533-1c00450101005000f30300000000000000000000000000000000000000000000
534-0108460103000000ef0300000000000009000000000000000000000000000000
535-6e6574207469746c650000001c00460101005000f30300000000000000000000
536-0000000000000000000000000108470103000000ef0300000000000009000000
537-0000000000000000000000006e6574207469746c650000001c00470101005000
538-f303000000000000000000000000000000000000000000000108480103000000
539-ef03000000000000090000000000000000000000000000006e6574207469746c
540-650000001c00480101005000f303000000000000000000000000000000000000
541-000000000108490103000000ef03000000000000090000000000000000000000
542-000000006e6574207469746c650000001c00490101005000f303000000000000
543-0000000000000000000000000000000001084a0103000000ef03000000000000
544-090000000000000000000000000000006e6574207469746c650000001c004a01
545-01005000f3030000000000000000000000000000000000000000000001084b01
546-03000000ef03000000000000090000000000000000000000000000006e657420
547-7469746c650000001c004b0101005000f3030000000000000000000000000000
548-000000000000000001084c0103000000ef030000000000000900000000000000
549-00000000000000006e6574207469746c650000001c004c0101005000f3030000
550-000000000000000000000000000000000000000001084d0103000000ef030000
551-00000000090000000000000000000000000000006e6574207469746c65000000
552-1c004d0101005000f30300000000000000000000000000000000000000000000
553-01084e0103000000ef0300000000000009000000000000000000000000000000
554-6e6574207469746c650000001c004e0101005000f30300000000000000000000
555-00000000000000000000000001084f0103000000ef0300000000000009000000
556-0000000000000000000000006e6574207469746c650000001c004f0101005000
557-f303000000000000000000000000000000000000000000000108500103000000
558-ef03000000000000090000000000000000000000000000006e6574207469746c
559-650000001c00500101005000f303000000000000000000000000000000000000
560-000000000108510103000000ef03000000000000090000000000000000000000
561-000000006e6574207469746c650000001c00510101005000f303000000000000
562-000000000000000000000000000000000108520103000000ef03000000000000
563-090000000000000000000000000000006e6574207469746c650000001c005201
564-01005000f3030000000000000000000000000000000000000000000001085301
565-03000000ef03000000000000090000000000000000000000000000006e657420
566-7469746c650000001c00530101005000f3030000000000000000000000000000
567-00000000000000000108540103000000ef030000000000000900000000000000
568-00000000000000006e6574207469746c650000001c00540101005000f3030000
569-00000000000000000000000000000000000000000108550103000000ef030000
570-00000000090000000000000000000000000000006e6574207469746c65000000
571-1c00550101005000f30300000000000000000000000000000000000000000000
572-0108560103000000ef0300000000000009000000000000000000000000000000
573-6e6574207469746c650000001c00560101005000f30300000000000000000000
574-0000000000000000000000000108570103000000ef0300000000000009000000
575-0000000000000000000000006e6574207469746c650000001c00570101005000
576-f303000000000000000000000000000000000000000000000108580103000000
577-ef03000000000000090000000000000000000000000000006e6574207469746c
578-650000001c00580101005000f303000000000000000000000000000000000000
579-000000000108590103000000ef03000000000000090000000000000000000000
580-000000006e6574207469746c650000001c00590101005000f303000000000000
581-0000000000000000000000000000000001085a0103000000ef03000000000000
582-090000000000000000000000000000006e6574207469746c650000001c005a01
583-01005000f3030000000000000000000000000000000000000000000001085b01
584-03000000ef03000000000000090000000000000000000000000000006e657420
585-7469746c650000001c005b0101005000f3030000000000000000000000000000
586-000000000000000001085c0103000000ef030000000000000900000000000000
587-00000000000000006e6574207469746c650000001c005c0101005000f3030000
588-000000000000000000000000000000000000000001085d0103000000ef030000
589-00000000090000000000000000000000000000006e6574207469746c65000000
590-1c005d0101005000f30300000000000000000000000000000000000000000000
591-01085e0103000000ef0300000000000009000000000000000000000000000000
592-6e6574207469746c650000001c005e0101005000f30300000000000000000000
593-00000000000000000000000001085f0103000000ef0300000000000009000000
594-0000000000000000000000006e6574207469746c650000001c005f0101005000
595-f303000000000000000000000000000000000000000000000108600103000000
596-ef03000000000000090000000000000000000000000000006e6574207469746c
597-650000001c00600101005000f303000000000000000000000000000000000000
598-000000000108610103000000ef03000000000000090000000000000000000000
599-000000006e6574207469746c650000001c00610101005000f303000000000000
600-000000000000000000000000000000000108620103000000ef03000000000000
601-090000000000000000000000000000006e6574207469746c650000001c006201
602-01005000f3030000000000000000000000000000000000000000000001086301
603-03000000ef03000000000000090000000000000000000000000000006e657420
604-7469746c650000001c00630101005000f3030000000000000000000000000000
605-00000000000000000108640103000000ef030000000000000900000000000000
606-00000000000000006e6574207469746c650000001c00640101005000f3030000
607-00000000000000000000000000000000000000000108650103000000ef030000
608-00000000090000000000000000000000000000006e6574207469746c65000000
609-1c00650101005000f30300000000000000000000000000000000000000000000
610-0108660103000000ef0300000000000009000000000000000000000000000000
611-6e6574207469746c650000001c00660101005000f30300000000000000000000
612-0000000000000000000000000108670103000000ef0300000000000009000000
613-0000000000000000000000006e6574207469746c650000001c00670101005000
614-f303000000000000000000000000000000000000000000000108680103000000
615-ef03000000000000090000000000000000000000000000006e6574207469746c
616-650000001c00680101005000f303000000000000000000000000000000000000
617-000000000108690103000000ef03000000000000090000000000000000000000
618-000000006e6574207469746c650000001c00690101005000f303000000000000
619-0000000000000000000000000000000001086a0103000000ef03000000000000
620-090000000000000000000000000000006e6574207469746c650000001c006a01
621-01005000f3030000000000000000000000000000000000000000000001086b01
622-03000000ef03000000000000090000000000000000000000000000006e657420
623-7469746c650000001c006b0101005000f3030000000000000000000000000000
624-000000000000000001086c0103000000ef030000000000000900000000000000
625-00000000000000006e6574207469746c650000001c006c0101005000f3030000
626-000000000000000000000000000000000000000001086d0103000000ef030000
627-00000000090000000000000000000000000000006e6574207469746c65000000
628-1c006d0101005000f30300000000000000000000000000000000000000000000
629-01086e0103000000ef0300000000000009000000000000000000000000000000
630-6e6574207469746c650000001c006e0101005000f30300000000000000000000
631-00000000000000000000000001086f0103000000ef0300000000000009000000
632-0000000000000000000000006e6574207469746c650000001c006f0101005000
633-f303000000000000000000000000000000000000000000000108700103000000
634-ef03000000000000090000000000000000000000000000006e6574207469746c
635-650000001c00700101005000f303000000000000000000000000000000000000
636-000000000108710103000000ef03000000000000090000000000000000000000
637-000000006e6574207469746c650000001c00710101005000f303000000000000
638-000000000000000000000000000000000108720103000000ef03000000000000
639-090000000000000000000000000000006e6574207469746c650000001c007201
640-01005000f3030000000000000000000000000000000000000000000001087301
641-03000000ef03000000000000090000000000000000000000000000006e657420
642-7469746c650000001c00730101005000f3030000000000000000000000000000
643-00000000000000000108740103000000ef030000000000000900000000000000
644-00000000000000006e6574207469746c650000001c00740101005000f3030000
645-00000000000000000000000000000000000000000108750103000000ef030000
646-00000000090000000000000000000000000000006e6574207469746c65000000
647-1c00750101005000f30300000000000000000000000000000000000000000000
648-0108760103000000ef0300000000000009000000000000000000000000000000
649-6e6574207469746c650000001c00760101005000f30300000000000000000000
650-0000000000000000000000000108770103000000ef0300000000000009000000
651-0000000000000000000000006e6574207469746c650000001c00770101005000
652-f303000000000000000000000000000000000000000000000108780103000000
653-ef03000000000000090000000000000000000000000000006e6574207469746c
654-650000001c00780101005000f303000000000000000000000000000000000000
655-000000000108790103000000ef03000000000000090000000000000000000000
656-000000006e6574207469746c650000001c00790101005000f303000000000000
657-0000000000000000000000000000000001087a0103000000ef03000000000000
658-090000000000000000000000000000006e6574207469746c650000001c007a01
659-01005000f3030000000000000000000000000000000000000000000001087b01
660-03000000ef03000000000000090000000000000000000000000000006e657420
661-7469746c650000001c007b0101005000f3030000000000000000000000000000
662-000000000000000001087c0103000000ef030000000000000900000000000000
663-00000000000000006e6574207469746c650000001c007c0101005000f3030000
664-000000000000000000000000000000000000000001087d0103000000ef030000
665-00000000090000000000000000000000000000006e6574207469746c65000000
666-1c007d0101005000f30300000000000000000000000000000000000000000000
667-01087e0103000000ef0300000000000009000000000000000000000000000000
668-6e6574207469746c650000001c007e0101005000f30300000000000000000000
669-00000000000000000000000001087f0103000000ef0300000000000009000000
670-0000000000000000000000006e6574207469746c650000001c007f0101005000
671-f303000000000000000000000000000000000000000000000108800103000000
672-ef03000000000000090000000000000000000000000000006e6574207469746c
673-650000001c00800101005000f303000000000000000000000000000000000000
674-000000000108810103000000ef03000000000000090000000000000000000000
675-000000006e6574207469746c650000001c00810101005000f303000000000000
676-000000000000000000000000000000000108820103000000ef03000000000000
677-090000000000000000000000000000006e6574207469746c650000001c008201
678-01005000f3030000000000000000000000000000000000000000000001088301
679-03000000ef03000000000000090000000000000000000000000000006e657420
680-7469746c650000001c00830101005000f3030000000000000000000000000000
681-00000000000000000108840103000000ef030000000000000900000000000000
682-00000000000000006e6574207469746c650000001c00840101005000f3030000
683-00000000000000000000000000000000000000000108850103000000ef030000
684-00000000090000000000000000000000000000006e6574207469746c65000000
685-1c00850101005000f30300000000000000000000000000000000000000000000
686-0108860103000000ef0300000000000009000000000000000000000000000000
687-6e6574207469746c650000001c00860101005000f30300000000000000000000
688-0000000000000000000000000108870103000000ef0300000000000009000000
689-0000000000000000000000006e6574207469746c650000001c00870101005000
690-f303000000000000000000000000000000000000000000000108880103000000
691-ef03000000000000090000000000000000000000000000006e6574207469746c
692-650000001c00880101005000f303000000000000000000000000000000000000
693-000000000108890103000000ef03000000000000090000000000000000000000
694-000000006e6574207469746c650000001c00890101005000f303000000000000
695-0000000000000000000000000000000001088a0103000000ef03000000000000
696-090000000000000000000000000000006e6574207469746c650000001c008a01
697-01005000f3030000000000000000000000000000000000000000000001088b01
698-03000000ef03000000000000090000000000000000000000000000006e657420
699-7469746c650000001c008b0101005000f3030000000000000000000000000000
700-000000000000000001088c0103000000ef030000000000000900000000000000
701-00000000000000006e6574207469746c650000001c008c0101005000f3030000
702-000000000000000000000000000000000000000001088d0103000000ef030000
703-00000000090000000000000000000000000000006e6574207469746c65000000
704-1c008d0101005000f30300000000000000000000000000000000000000000000
705-01088e0103000000ef0300000000000009000000000000000000000000000000
706-6e6574207469746c650000001c008e0101005000f30300000000000000000000
707-00000000000000000000000001088f0103000000ef0300000000000009000000
708-0000000000000000000000006e6574207469746c650000001c008f0101005000
709-f303000000000000000000000000000000000000000000000108900103000000
710-ef03000000000000090000000000000000000000000000006e6574207469746c
711-650000001c00900101005000f303000000000000000000000000000000000000
712-000000000108910103000000ef03000000000000090000000000000000000000
713-000000006e6574207469746c650000001c00910101005000f303000000000000
714-000000000000000000000000000000000108920103000000ef03000000000000
715-090000000000000000000000000000006e6574207469746c650000001c009201
716-01005000f3030000000000000000000000000000000000000000000001089301
717-03000000ef03000000000000090000000000000000000000000000006e657420
718-7469746c650000001c00930101005000f3030000000000000000000000000000
719-00000000000000000108940103000000ef030000000000000900000000000000
720-00000000000000006e6574207469746c650000001c00940101005000f3030000
721-00000000000000000000000000000000000000000108950103000000ef030000
722-00000000090000000000000000000000000000006e6574207469746c65000000
723-1c00950101005000f30300000000000000000000000000000000000000000000
724-0108960103000000ef0300000000000009000000000000000000000000000000
725-6e6574207469746c650000001c00960101005000f30300000000000000000000
726-0000000000000000000000000108970103000000ef0300000000000009000000
727-0000000000000000000000006e6574207469746c650000001c00970101005000
728-f303000000000000000000000000000000000000000000000108980103000000
729-ef03000000000000090000000000000000000000000000006e6574207469746c
730-650000001c00980101005000f303000000000000000000000000000000000000
731-000000000108990103000000ef03000000000000090000000000000000000000
732-000000006e6574207469746c650000001c00990101005000f303000000000000
733-0000000000000000000000000000000001089a0103000000ef03000000000000
734-090000000000000000000000000000006e6574207469746c650000001c009a01
735-01005000f3030000000000000000000000000000000000000000000001089b01
736-03000000ef03000000000000090000000000000000000000000000006e657420
737-7469746c650000001c009b0101005000f3030000000000000000000000000000
738-000000000000000001089c0103000000ef030000000000000900000000000000
739-00000000000000006e6574207469746c650000001c009c0101005000f3030000
740-000000000000000000000000000000000000000001089d0103000000ef030000
741-00000000090000000000000000000000000000006e6574207469746c65000000
742-1c009d0101005000f30300000000000000000000000000000000000000000000
743-01089e0103000000ef0300000000000009000000000000000000000000000000
744-6e6574207469746c650000001c009e0101005000f30300000000000000000000
745-00000000000000000000000001089f0103000000ef0300000000000009000000
746-0000000000000000000000006e6574207469746c650000001c009f0101005000
747-f303000000000000000000000000000000000000000000000108a00103000000
748-ef03000000000000090000000000000000000000000000006e6574207469746c
749-650000001c00a00101005000f303000000000000000000000000000000000000
750-000000000108a10103000000ef03000000000000090000000000000000000000
751-000000006e6574207469746c650000001c00a10101005000f303000000000000
752-000000000000000000000000000000000108a20103000000ef03000000000000
753-090000000000000000000000000000006e6574207469746c650000001c00a201
754-01005000f303000000000000000000000000000000000000000000000108a301
755-03000000ef03000000000000090000000000000000000000000000006e657420
756-7469746c650000001c00a30101005000f3030000000000000000000000000000
757-00000000000000000108a40103000000ef030000000000000900000000000000
758-00000000000000006e6574207469746c650000001c00a40101005000f3030000
759-00000000000000000000000000000000000000000108a50103000000ef030000
760-00000000090000000000000000000000000000006e6574207469746c65000000
761-1c00a50101005000f30300000000000000000000000000000000000000000000
762-0108a60103000000ef0300000000000009000000000000000000000000000000
763-6e6574207469746c650000001c00a60101005000f30300000000000000000000
764-0000000000000000000000000108a70103000000ef0300000000000009000000
765-0000000000000000000000006e6574207469746c650000001c00a70101005000
766-f303000000000000000000000000000000000000000000000108a80103000000
767-ef03000000000000090000000000000000000000000000006e6574207469746c
768-650000001c00a80101005000f303000000000000000000000000000000000000
769-000000000108a90103000000ef03000000000000090000000000000000000000
770-000000006e6574207469746c650000001c00a90101005000f303000000000000
771-000000000000000000000000000000000108aa0103000000ef03000000000000
772-090000000000000000000000000000006e6574207469746c650000001c00aa01
773-01005000f303000000000000000000000000000000000000000000000108ab01
774-03000000ef03000000000000090000000000000000000000000000006e657420
775-7469746c650000001c00ab0101005000f3030000000000000000000000000000
776-00000000000000000108ac0103000000ef030000000000000900000000000000
777-00000000000000006e6574207469746c650000001c00ac0101005000f3030000
778-00000000000000000000000000000000000000000108ad0103000000ef030000
779-00000000090000000000000000000000000000006e6574207469746c65000000
780-1c00ad0101005000f30300000000000000000000000000000000000000000000
781-0108ae0103000000ef0300000000000009000000000000000000000000000000
782-6e6574207469746c650000001c00ae0101005000f30300000000000000000000
783-0000000000000000000000000108af0103000000ef0300000000000009000000
784-0000000000000000000000006e6574207469746c650000001c00af0101005000
785-f303000000000000000000000000000000000000000000000108b00103000000
786-ef03000000000000090000000000000000000000000000006e6574207469746c
787-650000001c00b00101005000f303000000000000000000000000000000000000
788-000000000108b10103000000ef03000000000000090000000000000000000000
789-000000006e6574207469746c650000001c00b10101005000f303000000000000
790-000000000000000000000000000000000108b20103000000ef03000000000000
791-090000000000000000000000000000006e6574207469746c650000001c00b201
792-01005000f303000000000000000000000000000000000000000000000108b301
793-03000000ef03000000000000090000000000000000000000000000006e657420
794-7469746c650000001c00b30101005000f3030000000000000000000000000000
795-00000000000000000108b40103000000ef030000000000000900000000000000
796-00000000000000006e6574207469746c650000001c00b40101005000f3030000
797-00000000000000000000000000000000000000000108b50103000000ef030000
798-00000000090000000000000000000000000000006e6574207469746c65000000
799-1c00b50101005000f30300000000000000000000000000000000000000000000
800-0108b60103000000ef0300000000000009000000000000000000000000000000
801-6e6574207469746c650000001c00b60101005000f30300000000000000000000
802-0000000000000000000000000108b70103000000ef0300000000000009000000
803-0000000000000000000000006e6574207469746c650000001c00b70101005000
804-f303000000000000000000000000000000000000000000000108b80103000000
805-ef03000000000000090000000000000000000000000000006e6574207469746c
806-650000001c00b80101005000f303000000000000000000000000000000000000
807-000000000108b90103000000ef03000000000000090000000000000000000000
808-000000006e6574207469746c650000001c00b90101005000f303000000000000
809-000000000000000000000000000000000108ba0103000000ef03000000000000
810-090000000000000000000000000000006e6574207469746c650000001c00ba01
811-01005000f303000000000000000000000000000000000000000000000108bb01
812-03000000ef03000000000000090000000000000000000000000000006e657420
813-7469746c650000001c00bb0101005000f3030000000000000000000000000000
814-00000000000000000108bc0103000000ef030000000000000900000000000000
815-00000000000000006e6574207469746c650000001c00bc0101005000f3030000
816-00000000000000000000000000000000000000000108bd0103000000ef030000
817-00000000090000000000000000000000000000006e6574207469746c65000000
818-1c00bd0101005000f30300000000000000000000000000000000000000000000
819-0108be0103000000ef0300000000000009000000000000000000000000000000
820-6e6574207469746c650000001c00be0101005000f30300000000000000000000
821-0000000000000000000000000108bf0103000000ef0300000000000009000000
822-0000000000000000000000006e6574207469746c650000001c00bf0101005000
823-f303000000000000000000000000000000000000000000000108c00103000000
824-ef03000000000000090000000000000000000000000000006e6574207469746c
825-650000001c00c00101005000f303000000000000000000000000000000000000
826-000000000108c10103000000ef03000000000000090000000000000000000000
827-000000006e6574207469746c650000001c00c10101005000f303000000000000
828-000000000000000000000000000000000108c20103000000ef03000000000000
829-090000000000000000000000000000006e6574207469746c650000001c00c201
830-01005000f303000000000000000000000000000000000000000000000108c301
831-03000000ef03000000000000090000000000000000000000000000006e657420
832-7469746c650000001c00c30101005000f3030000000000000000000000000000
833-00000000000000000108c40103000000ef030000000000000900000000000000
834-00000000000000006e6574207469746c650000001c00c40101005000f3030000
835-00000000000000000000000000000000000000000108c50103000000ef030000
836-00000000090000000000000000000000000000006e6574207469746c65000000
837-1c00c50101005000f30300000000000000000000000000000000000000000000
838-0108c60103000000ef0300000000000009000000000000000000000000000000
839-6e6574207469746c650000001c00c60101005000f30300000000000000000000
840-0000000000000000000000000108c70103000000ef0300000000000009000000
841-0000000000000000000000006e6574207469746c650000001c00c70101005000
842-f303000000000000000000000000000000000000000000000108c80103000000
843-ef03000000000000090000000000000000000000000000006e6574207469746c
844-650000001c00c80101005000f303000000000000000000000000000000000000
845-000000000108c90103000000ef03000000000000090000000000000000000000
846-000000006e6574207469746c650000001c00c90101005000f303000000000000
847-000000000000000000000000000000000108ca0103000000ef03000000000000
848-090000000000000000000000000000006e6574207469746c650000001c00ca01
849-01005000f303000000000000000000000000000000000000000000000108cb01
850-03000000ef03000000000000090000000000000000000000000000006e657420
851-7469746c650000001c00cb0101005000f3030000000000000000000000000000
852-00000000000000000108cc0103000000ef030000000000000900000000000000
853-00000000000000006e6574207469746c650000001c00cc0101005000f3030000
854-00000000000000000000000000000000000000000108cd0103000000ef030000
855-00000000090000000000000000000000000000006e6574207469746c65000000
856-1c00cd0101005000f30300000000000000000000000000000000000000000000
857-0108ce0103000000ef0300000000000009000000000000000000000000000000
858-6e6574207469746c650000001c00ce0101005000f30300000000000000000000
859-0000000000000000000000000108cf0103000000ef0300000000000009000000
860-0000000000000000000000006e6574207469746c650000001c00cf0101005000
861-f303000000000000000000000000000000000000000000000108d00103000000
862-ef03000000000000090000000000000000000000000000006e6574207469746c
863-650000001c00d00101005000f303000000000000000000000000000000000000
864-000000000108d10103000000ef03000000000000090000000000000000000000
865-000000006e6574207469746c650000001c00d10101005000f303000000000000
866-000000000000000000000000000000000108d20103000000ef03000000000000
867-090000000000000000000000000000006e6574207469746c650000001c00d201
868-01005000f303000000000000000000000000000000000000000000000108d301
869-03000000ef03000000000000090000000000000000000000000000006e657420
870-7469746c650000001c00d30101005000f3030000000000000000000000000000
871-00000000000000000108d40103000000ef030000000000000900000000000000
872-00000000000000006e6574207469746c650000001c00d40101005000f3030000
873-00000000000000000000000000000000000000000108d50103000000ef030000
874-00000000090000000000000000000000000000006e6574207469746c65000000
875-1c00d50101005000f30300000000000000000000000000000000000000000000
876-0108d60103000000ef0300000000000009000000000000000000000000000000
877-6e6574207469746c650000001c00d60101005000f30300000000000000000000
878-0000000000000000000000000108d70103000000ef0300000000000009000000
879-0000000000000000000000006e6574207469746c650000001c00d70101005000
880-f303000000000000000000000000000000000000000000000108d80103000000
881-ef03000000000000090000000000000000000000000000006e6574207469746c
882-650000001c00d80101005000f303000000000000000000000000000000000000
883-000000000108d90103000000ef03000000000000090000000000000000000000
884-000000006e6574207469746c650000001c00d90101005000f303000000000000
885-000000000000000000000000000000000108da0103000000ef03000000000000
886-090000000000000000000000000000006e6574207469746c650000001c00da01
887-01005000f303000000000000000000000000000000000000000000000108db01
888-03000000ef03000000000000090000000000000000000000000000006e657420
889-7469746c650000001c00db0101005000f3030000000000000000000000000000
890-00000000000000000108dc0103000000ef030000000000000900000000000000
891-00000000000000006e6574207469746c650000001c00dc0101005000f3030000
892-00000000000000000000000000000000000000000108dd0103000000ef030000
893-00000000090000000000000000000000000000006e6574207469746c65000000
894-1c00dd0101005000f30300000000000000000000000000000000000000000000
895-0108de0103000000ef0300000000000009000000000000000000000000000000
896-6e6574207469746c650000001c00de0101005000f30300000000000000000000
897-0000000000000000000000000108df0103000000ef0300000000000009000000
898-0000000000000000000000006e6574207469746c650000001c00df0101005000
899-f303000000000000000000000000000000000000000000000108e00103000000
900-ef03000000000000090000000000000000000000000000006e6574207469746c
901-650000001c00e00101005000f303000000000000000000000000000000000000
902-000000000108e10103000000ef03000000000000090000000000000000000000
903-000000006e6574207469746c650000001c00e10101005000f303000000000000
904-000000000000000000000000000000000108e20103000000ef03000000000000
905-090000000000000000000000000000006e6574207469746c650000001c00e201
906-01005000f303000000000000000000000000000000000000000000000108e301
907-03000000ef03000000000000090000000000000000000000000000006e657420
908-7469746c650000001c00e30101005000f3030000000000000000000000000000
909-00000000000000000108e40103000000ef030000000000000900000000000000
910-00000000000000006e6574207469746c650000001c00e40101005000f3030000
911-00000000000000000000000000000000000000000108e50103000000ef030000
912-00000000090000000000000000000000000000006e6574207469746c65000000
913-1c00e50101005000f30300000000000000000000000000000000000000000000
914-0108e60103000000ef0300000000000009000000000000000000000000000000
915-6e6574207469746c650000001c00e60101005000f30300000000000000000000
916-0000000000000000000000000108e70103000000ef0300000000000009000000
917-0000000000000000000000006e6574207469746c650000001c00e70101005000
918-f303000000000000000000000000000000000000000000000108e80103000000
919-ef03000000000000090000000000000000000000000000006e6574207469746c
920-650000001c00e80101005000f303000000000000000000000000000000000000
921-000000000108e90103000000ef03000000000000090000000000000000000000
922-000000006e6574207469746c650000001c00e90101005000f303000000000000
923-000000000000000000000000000000000108ea0103000000ef03000000000000
924-090000000000000000000000000000006e6574207469746c650000001c00ea01
925-01005000f303000000000000000000000000000000000000000000000108eb01
926-03000000ef03000000000000090000000000000000000000000000006e657420
927-7469746c650000001c00eb0101005000f3030000000000000000000000000000
928-00000000000000000108ec0103000000ef030000000000000900000000000000
929-00000000000000006e6574207469746c650000001c00ec0101005000f3030000
930-00000000000000000000000000000000000000000108ed0103000000ef030000
931-00000000090000000000000000000000000000006e6574207469746c65000000
932-1c00ed0101005000f30300000000000000000000000000000000000000000000
933-0108ee0103000000ef0300000000000009000000000000000000000000000000
934-6e6574207469746c650000001c00ee0101005000f30300000000000000000000
935-0000000000000000000000000108ef0103000000ef0300000000000009000000
936-0000000000000000000000006e6574207469746c650000001c00ef0101005000
937-f303000000000000000000000000000000000000000000000108f00103000000
938-ef03000000000000090000000000000000000000000000006e6574207469746c
939-650000001c00f00101005000f303000000000000000000000000000000000000
940-000000000108f10103000000ef03000000000000090000000000000000000000
941-000000006e6574207469746c650000001c00f10101005000f303000000000000
942-000000000000000000000000000000000108f20103000000ef03000000000000
943-090000000000000000000000000000006e6574207469746c650000001c00f201
944-01005000f303000000000000000000000000000000000000000000000108f301
945-03000000ef03000000000000090000000000000000000000000000006e657420
946-7469746c650000001c00f30101005000f3030000000000000000000000000000
947-00000000000000000108f40103000000ef030000000000000900000000000000
948-00000000000000006e6574207469746c650000001c00f40101005000f3030000
949-00000000000000000000000000000000000000000108f50103000000ef030000
1+1c00660001005000f30300000000000000000000000000000000000000000000
2+0108670003000000ef0300000000000009000000000000000000000000000000
3+6e6574207469746c650000001c00670001005000f30300000000000000000000
4+0000000000000000000000000108680003000000ef0300000000000009000000
5+0000000000000000000000006e6574207469746c650000001c00680001005000
6+f303000000000000000000000000000000000000000000000108690003000000
7+ef03000000000000090000000000000000000000000000006e6574207469746c
8+650000001c00690001005000f303000000000000000000000000000000000000
9+0000000001086a0003000000ef03000000000000090000000000000000000000
10+000000006e6574207469746c650000001c006a0001005000f303000000000000
11+0000000000000000000000000000000001086b0003000000ef03000000000000
12+090000000000000000000000000000006e6574207469746c650000001c006b00
13+01005000f3030000000000000000000000000000000000000000000001086c00
14+03000000ef03000000000000090000000000000000000000000000006e657420
15+7469746c650000001c006c0001005000f3030000000000000000000000000000
16+000000000000000001086d0003000000ef030000000000000900000000000000
17+00000000000000006e6574207469746c650000001c006d0001005000f3030000
18+000000000000000000000000000000000000000001086e0003000000ef030000
19+00000000090000000000000000000000000000006e6574207469746c65000000
20+1c006e0001005000f30300000000000000000000000000000000000000000000
21+01086f0003000000ef0300000000000009000000000000000000000000000000
22+6e6574207469746c650000001c006f0001005000f30300000000000000000000
23+0000000000000000000000000108700003000000ef0300000000000009000000
24+0000000000000000000000006e6574207469746c650000001c00700001005000
25+f303000000000000000000000000000000000000000000000108710003000000
26+ef03000000000000090000000000000000000000000000006e6574207469746c
27+650000001c00710001005000f303000000000000000000000000000000000000
28+000000000108720003000000ef03000000000000090000000000000000000000
29+000000006e6574207469746c650000001c00720001005000f303000000000000
30+000000000000000000000000000000000108730003000000ef03000000000000
31+090000000000000000000000000000006e6574207469746c650000001c007300
32+01005000f3030000000000000000000000000000000000000000000001087400
33+03000000ef03000000000000090000000000000000000000000000006e657420
34+7469746c650000001c00740001005000f3030000000000000000000000000000
35+00000000000000000108750003000000ef030000000000000900000000000000
36+00000000000000006e6574207469746c650000001c00750001005000f3030000
37+00000000000000000000000000000000000000000108760003000000ef030000
38+00000000090000000000000000000000000000006e6574207469746c65000000
39+1c00760001005000f30300000000000000000000000000000000000000000000
40+0108770003000000ef0300000000000009000000000000000000000000000000
41+6e6574207469746c650000001c00770001005000f30300000000000000000000
42+0000000000000000000000000108780003000000ef0300000000000009000000
43+0000000000000000000000006e6574207469746c650000001c00780001005000
44+f303000000000000000000000000000000000000000000000108790003000000
45+ef03000000000000090000000000000000000000000000006e6574207469746c
46+650000001c00790001005000f303000000000000000000000000000000000000
47+0000000001087a0003000000ef03000000000000090000000000000000000000
48+000000006e6574207469746c650000001c007a0001005000f303000000000000
49+0000000000000000000000000000000001087b0003000000ef03000000000000
50+090000000000000000000000000000006e6574207469746c650000001c007b00
51+01005000f3030000000000000000000000000000000000000000000001087c00
52+03000000ef03000000000000090000000000000000000000000000006e657420
53+7469746c650000001c007c0001005000f3030000000000000000000000000000
54+000000000000000001087d0003000000ef030000000000000900000000000000
55+00000000000000006e6574207469746c650000001c007d0001005000f3030000
56+000000000000000000000000000000000000000001087e0003000000ef030000
57+00000000090000000000000000000000000000006e6574207469746c65000000
58+1c007e0001005000f30300000000000000000000000000000000000000000000
59+01087f0003000000ef0300000000000009000000000000000000000000000000
60+6e6574207469746c650000001c007f0001005000f30300000000000000000000
61+0000000000000000000000000108800003000000ef0300000000000009000000
62+0000000000000000000000006e6574207469746c650000001c00800001005000
63+f303000000000000000000000000000000000000000000000108810003000000
64+ef03000000000000090000000000000000000000000000006e6574207469746c
65+650000001c00810001005000f303000000000000000000000000000000000000
66+000000000108820003000000ef03000000000000090000000000000000000000
67+000000006e6574207469746c650000001c00820001005000f303000000000000
68+000000000000000000000000000000000108830003000000ef03000000000000
69+090000000000000000000000000000006e6574207469746c650000001c008300
70+01005000f3030000000000000000000000000000000000000000000001088400
71+03000000ef03000000000000090000000000000000000000000000006e657420
72+7469746c650000001c00840001005000f3030000000000000000000000000000
73+00000000000000000108850003000000ef030000000000000900000000000000
74+00000000000000006e6574207469746c650000001c00850001005000f3030000
75+00000000000000000000000000000000000000000108860003000000ef030000
76+00000000090000000000000000000000000000006e6574207469746c65000000
77+1c00860001005000f30300000000000000000000000000000000000000000000
78+0108870003000000ef0300000000000009000000000000000000000000000000
79+6e6574207469746c650000001c00870001005000f30300000000000000000000
80+0000000000000000000000000108880003000000ef0300000000000009000000
81+0000000000000000000000006e6574207469746c650000001c00880001005000
82+f303000000000000000000000000000000000000000000000108890003000000
83+ef03000000000000090000000000000000000000000000006e6574207469746c
84+650000001c00890001005000f303000000000000000000000000000000000000
85+0000000001088a0003000000ef03000000000000090000000000000000000000
86+000000006e6574207469746c650000001c008a0001005000f303000000000000
87+0000000000000000000000000000000001088b0003000000ef03000000000000
88+090000000000000000000000000000006e6574207469746c650000001c008b00
89+01005000f3030000000000000000000000000000000000000000000001088c00
90+03000000ef03000000000000090000000000000000000000000000006e657420
91+7469746c650000001c008c0001005000f3030000000000000000000000000000
92+000000000000000001088d0003000000ef030000000000000900000000000000
93+00000000000000006e6574207469746c650000001c008d0001005000f3030000
94+000000000000000000000000000000000000000001088e0003000000ef030000
95+00000000090000000000000000000000000000006e6574207469746c65000000
96+1c008e0001005000f30300000000000000000000000000000000000000000000
97+01088f0003000000ef0300000000000009000000000000000000000000000000
98+6e6574207469746c650000001c008f0001005000f30300000000000000000000
99+0000000000000000000000000108900003000000ef0300000000000009000000
100+0000000000000000000000006e6574207469746c650000001c00900001005000
101+f303000000000000000000000000000000000000000000000108910003000000
102+ef03000000000000090000000000000000000000000000006e6574207469746c
103+650000001c00910001005000f303000000000000000000000000000000000000
104+000000000108920003000000ef03000000000000090000000000000000000000
105+000000006e6574207469746c650000001c00920001005000f303000000000000
106+000000000000000000000000000000000108930003000000ef03000000000000
107+090000000000000000000000000000006e6574207469746c650000001c009300
108+01005000f3030000000000000000000000000000000000000000000001089400
109+03000000ef03000000000000090000000000000000000000000000006e657420
110+7469746c650000001c00940001005000f3030000000000000000000000000000
111+00000000000000000108950003000000ef030000000000000900000000000000
112+00000000000000006e6574207469746c650000001c00950001005000f3030000
113+00000000000000000000000000000000000000000108960003000000ef030000
114+00000000090000000000000000000000000000006e6574207469746c65000000
115+1c00960001005000f30300000000000000000000000000000000000000000000
116+0108970003000000ef0300000000000009000000000000000000000000000000
117+6e6574207469746c650000001c00970001005000f30300000000000000000000
118+0000000000000000000000000108980003000000ef0300000000000009000000
119+0000000000000000000000006e6574207469746c650000001c00980001005000
120+f303000000000000000000000000000000000000000000000108990003000000
121+ef03000000000000090000000000000000000000000000006e6574207469746c
122+650000001c00990001005000f303000000000000000000000000000000000000
123+0000000001089a0003000000ef03000000000000090000000000000000000000
124+000000006e6574207469746c650000001c009a0001005000f303000000000000
125+0000000000000000000000000000000001089b0003000000ef03000000000000
126+090000000000000000000000000000006e6574207469746c650000001c009b00
127+01005000f3030000000000000000000000000000000000000000000001089c00
128+03000000ef03000000000000090000000000000000000000000000006e657420
129+7469746c650000001c009c0001005000f3030000000000000000000000000000
130+000000000000000001089d0003000000ef030000000000000900000000000000
131+00000000000000006e6574207469746c650000001c009d0001005000f3030000
132+000000000000000000000000000000000000000001089e0003000000ef030000
133+00000000090000000000000000000000000000006e6574207469746c65000000
134+1c009e0001005000f30300000000000000000000000000000000000000000000
135+01089f0003000000ef0300000000000009000000000000000000000000000000
136+6e6574207469746c650000001c009f0001005000f30300000000000000000000
137+0000000000000000000000000108a00003000000ef0300000000000009000000
138+0000000000000000000000006e6574207469746c650000001c00a00001005000
139+f303000000000000000000000000000000000000000000000108a10003000000
140+ef03000000000000090000000000000000000000000000006e6574207469746c
141+650000001c00a10001005000f303000000000000000000000000000000000000
142+000000000108a20003000000ef03000000000000090000000000000000000000
143+000000006e6574207469746c650000001c00a20001005000f303000000000000
144+000000000000000000000000000000000108a30003000000ef03000000000000
145+090000000000000000000000000000006e6574207469746c650000001c00a300
146+01005000f303000000000000000000000000000000000000000000000108a400
147+03000000ef03000000000000090000000000000000000000000000006e657420
148+7469746c650000001c00a40001005000f3030000000000000000000000000000
149+00000000000000000108a50003000000ef030000000000000900000000000000
150+00000000000000006e6574207469746c650000001c00a50001005000f3030000
151+00000000000000000000000000000000000000000108a60003000000ef030000
152+00000000090000000000000000000000000000006e6574207469746c65000000
153+1c00a60001005000f30300000000000000000000000000000000000000000000
154+0108a70003000000ef0300000000000009000000000000000000000000000000
155+6e6574207469746c650000001c00a70001005000f30300000000000000000000
156+0000000000000000000000000108a80003000000ef0300000000000009000000
157+0000000000000000000000006e6574207469746c650000001c00a80001005000
158+f303000000000000000000000000000000000000000000000108a90003000000
159+ef03000000000000090000000000000000000000000000006e6574207469746c
160+650000001c00a90001005000f303000000000000000000000000000000000000
161+000000000108aa0003000000ef03000000000000090000000000000000000000
162+000000006e6574207469746c650000001c00aa0001005000f303000000000000
163+000000000000000000000000000000000108ab0003000000ef03000000000000
164+090000000000000000000000000000006e6574207469746c650000001c00ab00
165+01005000f303000000000000000000000000000000000000000000000108ac00
166+03000000ef03000000000000090000000000000000000000000000006e657420
167+7469746c650000001c00ac0001005000f3030000000000000000000000000000
168+00000000000000000108ad0003000000ef030000000000000900000000000000
169+00000000000000006e6574207469746c650000001c00ad0001005000f3030000
170+00000000000000000000000000000000000000000108ae0003000000ef030000
171+00000000090000000000000000000000000000006e6574207469746c65000000
172+1c00ae0001005000f30300000000000000000000000000000000000000000000
173+0108af0003000000ef0300000000000009000000000000000000000000000000
174+6e6574207469746c650000001c00af0001005000f30300000000000000000000
175+0000000000000000000000000108b00003000000ef0300000000000009000000
176+0000000000000000000000006e6574207469746c650000001c00b00001005000
177+f303000000000000000000000000000000000000000000000108b10003000000
178+ef03000000000000090000000000000000000000000000006e6574207469746c
179+650000001c00b10001005000f303000000000000000000000000000000000000
180+000000000108b20003000000ef03000000000000090000000000000000000000
181+000000006e6574207469746c650000001c00b20001005000f303000000000000
182+000000000000000000000000000000000108b30003000000ef03000000000000
183+090000000000000000000000000000006e6574207469746c650000001c00b300
184+01005000f303000000000000000000000000000000000000000000000108b400
185+03000000ef03000000000000090000000000000000000000000000006e657420
186+7469746c650000001c00b40001005000f3030000000000000000000000000000
187+00000000000000000108b50003000000ef030000000000000900000000000000
188+00000000000000006e6574207469746c650000001c00b50001005000f3030000
189+00000000000000000000000000000000000000000108b60003000000ef030000
190+00000000090000000000000000000000000000006e6574207469746c65000000
191+1c00b60001005000f30300000000000000000000000000000000000000000000
192+0108b70003000000ef0300000000000009000000000000000000000000000000
193+6e6574207469746c650000001c00b70001005000f30300000000000000000000
194+0000000000000000000000000108b80003000000ef0300000000000009000000
195+0000000000000000000000006e6574207469746c650000001c00b80001005000
196+f303000000000000000000000000000000000000000000000108b90003000000
197+ef03000000000000090000000000000000000000000000006e6574207469746c
198+650000001c00b90001005000f303000000000000000000000000000000000000
199+000000000108ba0003000000ef03000000000000090000000000000000000000
200+000000006e6574207469746c650000001c00ba0001005000f303000000000000
201+000000000000000000000000000000000108bb0003000000ef03000000000000
202+090000000000000000000000000000006e6574207469746c650000001c00bb00
203+01005000f303000000000000000000000000000000000000000000000108bc00
204+03000000ef03000000000000090000000000000000000000000000006e657420
205+7469746c650000001c00bc0001005000f3030000000000000000000000000000
206+00000000000000000108bd0003000000ef030000000000000900000000000000
207+00000000000000006e6574207469746c650000001c00bd0001005000f3030000
208+00000000000000000000000000000000000000000108be0003000000ef030000
209+00000000090000000000000000000000000000006e6574207469746c65000000
210+1c00be0001005000f30300000000000000000000000000000000000000000000
211+0108bf0003000000ef0300000000000009000000000000000000000000000000
212+6e6574207469746c650000001c00bf0001005000f30300000000000000000000
213+0000000000000000000000000108c00003000000ef0300000000000009000000
214+0000000000000000000000006e6574207469746c650000001c00c00001005000
215+f303000000000000000000000000000000000000000000000108c10003000000
216+ef03000000000000090000000000000000000000000000006e6574207469746c
217+650000001c00c10001005000f303000000000000000000000000000000000000
218+000000000108c20003000000ef03000000000000090000000000000000000000
219+000000006e6574207469746c650000001c00c20001005000f303000000000000
220+000000000000000000000000000000000108c30003000000ef03000000000000
221+090000000000000000000000000000006e6574207469746c650000001c00c300
222+01005000f303000000000000000000000000000000000000000000000108c400
223+03000000ef03000000000000090000000000000000000000000000006e657420
224+7469746c650000001c00c40001005000f3030000000000000000000000000000
225+00000000000000000108c50003000000ef030000000000000900000000000000
226+00000000000000006e6574207469746c650000001c00c50001005000f3030000
227+00000000000000000000000000000000000000000108c60003000000ef030000
228+00000000090000000000000000000000000000006e6574207469746c65000000
229+1c00c60001005000f30300000000000000000000000000000000000000000000
230+0108c70003000000ef0300000000000009000000000000000000000000000000
231+6e6574207469746c650000001c00c70001005000f30300000000000000000000
232+0000000000000000000000000108c80003000000ef0300000000000009000000
233+0000000000000000000000006e6574207469746c650000001c00c80001005000
234+f303000000000000000000000000000000000000000000000108c90003000000
235+ef03000000000000090000000000000000000000000000006e6574207469746c
236+650000001c00c90001005000f303000000000000000000000000000000000000
237+000000000108ca0003000000ef03000000000000090000000000000000000000
238+000000006e6574207469746c650000001c00ca0001005000f303000000000000
239+000000000000000000000000000000000108cb0003000000ef03000000000000
240+090000000000000000000000000000006e6574207469746c650000001c00cb00
241+01005000f303000000000000000000000000000000000000000000000108cc00
242+03000000ef03000000000000090000000000000000000000000000006e657420
243+7469746c650000001c00cc0001005000f3030000000000000000000000000000
244+00000000000000000108cd0003000000ef030000000000000900000000000000
245+00000000000000006e6574207469746c650000001c00cd0001005000f3030000
246+00000000000000000000000000000000000000000108ce0003000000ef030000
247+00000000090000000000000000000000000000006e6574207469746c65000000
248+1c00ce0001005000f30300000000000000000000000000000000000000000000
249+0108cf0003000000ef0300000000000009000000000000000000000000000000
250+6e6574207469746c650000001c00cf0001005000f30300000000000000000000
251+0000000000000000000000000108d00003000000ef0300000000000009000000
252+0000000000000000000000006e6574207469746c650000001c00d00001005000
253+f303000000000000000000000000000000000000000000000108d10003000000
254+ef03000000000000090000000000000000000000000000006e6574207469746c
255+650000001c00d10001005000f303000000000000000000000000000000000000
256+000000000108d20003000000ef03000000000000090000000000000000000000
257+000000006e6574207469746c650000001c00d20001005000f303000000000000
258+000000000000000000000000000000000108d30003000000ef03000000000000
259+090000000000000000000000000000006e6574207469746c650000001c00d300
260+01005000f303000000000000000000000000000000000000000000000108d400
261+03000000ef03000000000000090000000000000000000000000000006e657420
262+7469746c650000001c00d40001005000f3030000000000000000000000000000
263+00000000000000000108d50003000000ef030000000000000900000000000000
264+00000000000000006e6574207469746c650000001c00d50001005000f3030000
265+00000000000000000000000000000000000000000108d60003000000ef030000
266+00000000090000000000000000000000000000006e6574207469746c65000000
267+1c00d60001005000f30300000000000000000000000000000000000000000000
268+0108d70003000000ef0300000000000009000000000000000000000000000000
269+6e6574207469746c650000001c00d70001005000f30300000000000000000000
270+0000000000000000000000000108d80003000000ef0300000000000009000000
271+0000000000000000000000006e6574207469746c650000001c00d80001005000
272+f303000000000000000000000000000000000000000000000108d90003000000
273+ef03000000000000090000000000000000000000000000006e6574207469746c
274+650000001c00d90001005000f303000000000000000000000000000000000000
275+000000000108da0003000000ef03000000000000090000000000000000000000
276+000000006e6574207469746c650000001c00da0001005000f303000000000000
277+000000000000000000000000000000000108db0003000000ef03000000000000
278+090000000000000000000000000000006e6574207469746c650000001c00db00
279+01005000f303000000000000000000000000000000000000000000000108dc00
280+03000000ef03000000000000090000000000000000000000000000006e657420
281+7469746c650000001c00dc0001005000f3030000000000000000000000000000
282+00000000000000000108dd0003000000ef030000000000000900000000000000
283+00000000000000006e6574207469746c650000001c00dd0001005000f3030000
284+00000000000000000000000000000000000000000108de0003000000ef030000
285+00000000090000000000000000000000000000006e6574207469746c65000000
286+1c00de0001005000f30300000000000000000000000000000000000000000000
287+0108df0003000000ef0300000000000009000000000000000000000000000000
288+6e6574207469746c650000001c00df0001005000f30300000000000000000000
289+0000000000000000000000000108e00003000000ef0300000000000009000000
290+0000000000000000000000006e6574207469746c650000001c00e00001005000
291+f303000000000000000000000000000000000000000000000108e10003000000
292+ef03000000000000090000000000000000000000000000006e6574207469746c
293+650000001c00e10001005000f303000000000000000000000000000000000000
294+000000000108e20003000000ef03000000000000090000000000000000000000
295+000000006e6574207469746c650000001c00e20001005000f303000000000000
296+000000000000000000000000000000000108e30003000000ef03000000000000
297+090000000000000000000000000000006e6574207469746c650000001c00e300
298+01005000f303000000000000000000000000000000000000000000000108e400
299+03000000ef03000000000000090000000000000000000000000000006e657420
300+7469746c650000001c00e40001005000f3030000000000000000000000000000
301+00000000000000000108e50003000000ef030000000000000900000000000000
302+00000000000000006e6574207469746c650000001c00e50001005000f3030000
303+00000000000000000000000000000000000000000108e60003000000ef030000
304+00000000090000000000000000000000000000006e6574207469746c65000000
305+1c00e60001005000f30300000000000000000000000000000000000000000000
306+0108e70003000000ef0300000000000009000000000000000000000000000000
307+6e6574207469746c650000001c00e70001005000f30300000000000000000000
308+0000000000000000000000000108e80003000000ef0300000000000009000000
309+0000000000000000000000006e6574207469746c650000001c00e80001005000
310+f303000000000000000000000000000000000000000000000108e90003000000
311+ef03000000000000090000000000000000000000000000006e6574207469746c
312+650000001c00e90001005000f303000000000000000000000000000000000000
313+000000000108ea0003000000ef03000000000000090000000000000000000000
314+000000006e6574207469746c650000001c00ea0001005000f303000000000000
315+000000000000000000000000000000000108eb0003000000ef03000000000000
316+090000000000000000000000000000006e6574207469746c650000001c00eb00
317+01005000f303000000000000000000000000000000000000000000000108ec00
318+03000000ef03000000000000090000000000000000000000000000006e657420
319+7469746c650000001c00ec0001005000f3030000000000000000000000000000
320+00000000000000000108ed0003000000ef030000000000000900000000000000
321+00000000000000006e6574207469746c650000001c00ed0001005000f3030000
322+00000000000000000000000000000000000000000108ee0003000000ef030000
323+00000000090000000000000000000000000000006e6574207469746c65000000
324+1c00ee0001005000f30300000000000000000000000000000000000000000000
325+0108ef0003000000ef0300000000000009000000000000000000000000000000
326+6e6574207469746c650000001c00ef0001005000f30300000000000000000000
327+0000000000000000000000000108f00003000000ef0300000000000009000000
328+0000000000000000000000006e6574207469746c650000001c00f00001005000
329+f303000000000000000000000000000000000000000000000108f10003000000
330+ef03000000000000090000000000000000000000000000006e6574207469746c
331+650000001c00f10001005000f303000000000000000000000000000000000000
332+000000000108f20003000000ef03000000000000090000000000000000000000
333+000000006e6574207469746c650000001c00f20001005000f303000000000000
334+000000000000000000000000000000000108f30003000000ef03000000000000
335+090000000000000000000000000000006e6574207469746c650000001c00f300
336+01005000f303000000000000000000000000000000000000000000000108f400
337+03000000ef03000000000000090000000000000000000000000000006e657420
338+7469746c650000001c00f40001005000f3030000000000000000000000000000
339+00000000000000000108f50003000000ef030000000000000900000000000000
340+00000000000000006e6574207469746c650000001c00f50001005000f3030000
341+00000000000000000000000000000000000000000108f60003000000ef030000
342+00000000090000000000000000000000000000006e6574207469746c65000000
343+1c00f60001005000f30300000000000000000000000000000000000000000000
344+0108f70003000000ef0300000000000009000000000000000000000000000000
345+6e6574207469746c650000001c00f70001005000f30300000000000000000000
346+0000000000000000000000000108f80003000000ef0300000000000009000000
347+0000000000000000000000006e6574207469746c650000001c00f80001005000
348+f303000000000000000000000000000000000000000000000108f90003000000
349+ef03000000000000090000000000000000000000000000006e6574207469746c
350+650000001c00f90001005000f303000000000000000000000000000000000000
351+000000000108fa0003000000ef03000000000000090000000000000000000000
352+000000006e6574207469746c650000001c00fa0001005000f303000000000000
353+000000000000000000000000000000000108fb0003000000ef03000000000000
354+090000000000000000000000000000006e6574207469746c650000001c00fb00
355+01005000f303000000000000000000000000000000000000000000000108fc00
356+03000000ef03000000000000090000000000000000000000000000006e657420
357+7469746c650000001c00fc0001005000f3030000000000000000000000000000
358+00000000000000000108fd0003000000ef030000000000000900000000000000
359+00000000000000006e6574207469746c650000001c00fd0001005000f3030000
360+00000000000000000000000000000000000000000108fe0003000000ef030000
361+00000000090000000000000000000000000000006e6574207469746c65000000
362+1c00fe0001005000f30300000000000000000000000000000000000000000000
363+0108ff0003000000ef0300000000000009000000000000000000000000000000
364+6e6574207469746c650000001c00ff0001005000f30300000000000000000000
365+0000000000000000000000000108000103000000ef0300000000000009000000
366+0000000000000000000000006e6574207469746c650000001c00000101005000
367+f303000000000000000000000000000000000000000000000108010103000000
368+ef03000000000000090000000000000000000000000000006e6574207469746c
369+650000001c00010101005000f303000000000000000000000000000000000000
370+000000000108020103000000ef03000000000000090000000000000000000000
371+000000006e6574207469746c650000001c00020101005000f303000000000000
372+000000000000000000000000000000000108030103000000ef03000000000000
373+090000000000000000000000000000006e6574207469746c650000001c000301
374+01005000f3030000000000000000000000000000000000000000000001080401
375+03000000ef03000000000000090000000000000000000000000000006e657420
376+7469746c650000001c00040101005000f3030000000000000000000000000000
377+00000000000000000108050103000000ef030000000000000900000000000000
378+00000000000000006e6574207469746c650000001c00050101005000f3030000
379+00000000000000000000000000000000000000000108060103000000ef030000
380+00000000090000000000000000000000000000006e6574207469746c65000000
381+1c00060101005000f30300000000000000000000000000000000000000000000
382+0108070103000000ef0300000000000009000000000000000000000000000000
383+6e6574207469746c650000001c00070101005000f30300000000000000000000
384+0000000000000000000000000108080103000000ef0300000000000009000000
385+0000000000000000000000006e6574207469746c650000001c00080101005000
386+f303000000000000000000000000000000000000000000000108090103000000
387+ef03000000000000090000000000000000000000000000006e6574207469746c
388+650000001c00090101005000f303000000000000000000000000000000000000
389+0000000001080a0103000000ef03000000000000090000000000000000000000
390+000000006e6574207469746c650000001c000a0101005000f303000000000000
391+0000000000000000000000000000000001080b0103000000ef03000000000000
392+090000000000000000000000000000006e6574207469746c650000001c000b01
393+01005000f3030000000000000000000000000000000000000000000001080c01
394+03000000ef03000000000000090000000000000000000000000000006e657420
395+7469746c650000001c000c0101005000f3030000000000000000000000000000
396+000000000000000001080d0103000000ef030000000000000900000000000000
397+00000000000000006e6574207469746c650000001c000d0101005000f3030000
398+000000000000000000000000000000000000000001080e0103000000ef030000
399+00000000090000000000000000000000000000006e6574207469746c65000000
400+1c000e0101005000f30300000000000000000000000000000000000000000000
401+01080f0103000000ef0300000000000009000000000000000000000000000000
402+6e6574207469746c650000001c000f0101005000f30300000000000000000000
403+0000000000000000000000000108100103000000ef0300000000000009000000
404+0000000000000000000000006e6574207469746c650000001c00100101005000
405+f303000000000000000000000000000000000000000000000108110103000000
406+ef03000000000000090000000000000000000000000000006e6574207469746c
407+650000001c00110101005000f303000000000000000000000000000000000000
408+000000000108120103000000ef03000000000000090000000000000000000000
409+000000006e6574207469746c650000001c00120101005000f303000000000000
410+000000000000000000000000000000000108130103000000ef03000000000000
411+090000000000000000000000000000006e6574207469746c650000001c001301
412+01005000f3030000000000000000000000000000000000000000000001081401
413+03000000ef03000000000000090000000000000000000000000000006e657420
414+7469746c650000001c00140101005000f3030000000000000000000000000000
415+00000000000000000108150103000000ef030000000000000900000000000000
416+00000000000000006e6574207469746c650000001c00150101005000f3030000
417+00000000000000000000000000000000000000000108160103000000ef030000
418+00000000090000000000000000000000000000006e6574207469746c65000000
419+1c00160101005000f30300000000000000000000000000000000000000000000
420+0108170103000000ef0300000000000009000000000000000000000000000000
421+6e6574207469746c650000001c00170101005000f30300000000000000000000
422+0000000000000000000000000108180103000000ef0300000000000009000000
423+0000000000000000000000006e6574207469746c650000001c00180101005000
424+f303000000000000000000000000000000000000000000000108190103000000
425+ef03000000000000090000000000000000000000000000006e6574207469746c
426+650000001c00190101005000f303000000000000000000000000000000000000
427+0000000001081a0103000000ef03000000000000090000000000000000000000
428+000000006e6574207469746c650000001c001a0101005000f303000000000000
429+0000000000000000000000000000000001081b0103000000ef03000000000000
430+090000000000000000000000000000006e6574207469746c650000001c001b01
431+01005000f3030000000000000000000000000000000000000000000001081c01
432+03000000ef03000000000000090000000000000000000000000000006e657420
433+7469746c650000001c001c0101005000f3030000000000000000000000000000
434+000000000000000001081d0103000000ef030000000000000900000000000000
435+00000000000000006e6574207469746c650000001c001d0101005000f3030000
436+000000000000000000000000000000000000000001081e0103000000ef030000
437+00000000090000000000000000000000000000006e6574207469746c65000000
438+1c001e0101005000f30300000000000000000000000000000000000000000000
439+01081f0103000000ef0300000000000009000000000000000000000000000000
440+6e6574207469746c650000001c001f0101005000f30300000000000000000000
441+0000000000000000000000000108200103000000ef0300000000000009000000
442+0000000000000000000000006e6574207469746c650000001c00200101005000
443+f303000000000000000000000000000000000000000000000108210103000000
444+ef03000000000000090000000000000000000000000000006e6574207469746c
445+650000001c00210101005000f303000000000000000000000000000000000000
446+000000000108220103000000ef03000000000000090000000000000000000000
447+000000006e6574207469746c650000001c00220101005000f303000000000000
448+000000000000000000000000000000000108230103000000ef03000000000000
449+090000000000000000000000000000006e6574207469746c650000001c002301
450+01005000f3030000000000000000000000000000000000000000000001082401
451+03000000ef03000000000000090000000000000000000000000000006e657420
452+7469746c650000001c00240101005000f3030000000000000000000000000000
453+00000000000000000108250103000000ef030000000000000900000000000000
454+00000000000000006e6574207469746c650000001c00250101005000f3030000
455+00000000000000000000000000000000000000000108260103000000ef030000
456+00000000090000000000000000000000000000006e6574207469746c65000000
457+1c00260101005000f30300000000000000000000000000000000000000000000
458+0108270103000000ef0300000000000009000000000000000000000000000000
459+6e6574207469746c650000001c00270101005000f30300000000000000000000
460+0000000000000000000000000108280103000000ef0300000000000009000000
461+0000000000000000000000006e6574207469746c650000001c00280101005000
462+f303000000000000000000000000000000000000000000000108290103000000
463+ef03000000000000090000000000000000000000000000006e6574207469746c
464+650000001c00290101005000f303000000000000000000000000000000000000
465+0000000001082a0103000000ef03000000000000090000000000000000000000
466+000000006e6574207469746c650000001c002a0101005000f303000000000000
467+0000000000000000000000000000000001082b0103000000ef03000000000000
468+090000000000000000000000000000006e6574207469746c650000001c002b01
469+01005000f3030000000000000000000000000000000000000000000001082c01
470+03000000ef03000000000000090000000000000000000000000000006e657420
471+7469746c650000001c002c0101005000f3030000000000000000000000000000
472+000000000000000001082d0103000000ef030000000000000900000000000000
473+00000000000000006e6574207469746c650000001c002d0101005000f3030000
474+000000000000000000000000000000000000000001082e0103000000ef030000
475+00000000090000000000000000000000000000006e6574207469746c65000000
476+1c002e0101005000f30300000000000000000000000000000000000000000000
477+01082f0103000000ef0300000000000009000000000000000000000000000000
478+6e6574207469746c650000001c002f0101005000f30300000000000000000000
479+0000000000000000000000000108300103000000ef0300000000000009000000
480+0000000000000000000000006e6574207469746c650000001c00300101005000
481+f303000000000000000000000000000000000000000000000108310103000000
482+ef03000000000000090000000000000000000000000000006e6574207469746c
483+650000001c00310101005000f303000000000000000000000000000000000000
484+000000000108320103000000ef03000000000000090000000000000000000000
485+000000006e6574207469746c650000001c00320101005000f303000000000000
486+000000000000000000000000000000000108330103000000ef03000000000000
487+090000000000000000000000000000006e6574207469746c650000001c003301
488+01005000f3030000000000000000000000000000000000000000000001083401
489+03000000ef03000000000000090000000000000000000000000000006e657420
490+7469746c650000001c00340101005000f3030000000000000000000000000000
491+00000000000000000108350103000000ef030000000000000900000000000000
492+00000000000000006e6574207469746c650000001c00350101005000f3030000
493+00000000000000000000000000000000000000000108360103000000ef030000
494+00000000090000000000000000000000000000006e6574207469746c65000000
495+1c00360101005000f30300000000000000000000000000000000000000000000
496+0108370103000000ef0300000000000009000000000000000000000000000000
497+6e6574207469746c650000001c00370101005000f30300000000000000000000
498+0000000000000000000000000108380103000000ef0300000000000009000000
499+0000000000000000000000006e6574207469746c650000001c00380101005000
500+f303000000000000000000000000000000000000000000000108390103000000
501+ef03000000000000090000000000000000000000000000006e6574207469746c
502+650000001c00390101005000f303000000000000000000000000000000000000
503+0000000001083a0103000000ef03000000000000090000000000000000000000
504+000000006e6574207469746c650000001c003a0101005000f303000000000000
505+0000000000000000000000000000000001083b0103000000ef03000000000000
506+090000000000000000000000000000006e6574207469746c650000001c003b01
507+01005000f3030000000000000000000000000000000000000000000001083c01
508+03000000ef03000000000000090000000000000000000000000000006e657420
509+7469746c650000001c003c0101005000f3030000000000000000000000000000
510+000000000000000001083d0103000000ef030000000000000900000000000000
511+00000000000000006e6574207469746c650000001c003d0101005000f3030000
512+000000000000000000000000000000000000000001083e0103000000ef030000
513+00000000090000000000000000000000000000006e6574207469746c65000000
514+1c003e0101005000f30300000000000000000000000000000000000000000000
515+01083f0103000000ef0300000000000009000000000000000000000000000000
516+6e6574207469746c650000001c003f0101005000f30300000000000000000000
517+0000000000000000000000000108400103000000ef0300000000000009000000
518+0000000000000000000000006e6574207469746c650000001c00400101005000
519+f303000000000000000000000000000000000000000000000108410103000000
520+ef03000000000000090000000000000000000000000000006e6574207469746c
521+650000001c00410101005000f303000000000000000000000000000000000000
522+000000000108420103000000ef03000000000000090000000000000000000000
523+000000006e6574207469746c650000001c00420101005000f303000000000000
524+000000000000000000000000000000000108430103000000ef03000000000000
525+090000000000000000000000000000006e6574207469746c650000001c004301
526+01005000f3030000000000000000000000000000000000000000000001084401
527+03000000ef03000000000000090000000000000000000000000000006e657420
528+7469746c650000001c00440101005000f3030000000000000000000000000000
529+00000000000000000108450103000000ef030000000000000900000000000000
530+00000000000000006e6574207469746c650000001c00450101005000f3030000
531+00000000000000000000000000000000000000000108460103000000ef030000
532+00000000090000000000000000000000000000006e6574207469746c65000000
533+1c00460101005000f30300000000000000000000000000000000000000000000
534+0108470103000000ef0300000000000009000000000000000000000000000000
535+6e6574207469746c650000001c00470101005000f30300000000000000000000
536+0000000000000000000000000108480103000000ef0300000000000009000000
537+0000000000000000000000006e6574207469746c650000001c00480101005000
538+f303000000000000000000000000000000000000000000000108490103000000
539+ef03000000000000090000000000000000000000000000006e6574207469746c
540+650000001c00490101005000f303000000000000000000000000000000000000
541+0000000001084a0103000000ef03000000000000090000000000000000000000
542+000000006e6574207469746c650000001c004a0101005000f303000000000000
543+0000000000000000000000000000000001084b0103000000ef03000000000000
544+090000000000000000000000000000006e6574207469746c650000001c004b01
545+01005000f3030000000000000000000000000000000000000000000001084c01
546+03000000ef03000000000000090000000000000000000000000000006e657420
547+7469746c650000001c004c0101005000f3030000000000000000000000000000
548+000000000000000001084d0103000000ef030000000000000900000000000000
549+00000000000000006e6574207469746c650000001c004d0101005000f3030000
550+000000000000000000000000000000000000000001084e0103000000ef030000
551+00000000090000000000000000000000000000006e6574207469746c65000000
552+1c004e0101005000f30300000000000000000000000000000000000000000000
553+01084f0103000000ef0300000000000009000000000000000000000000000000
554+6e6574207469746c650000001c004f0101005000f30300000000000000000000
555+0000000000000000000000000108500103000000ef0300000000000009000000
556+0000000000000000000000006e6574207469746c650000001c00500101005000
557+f303000000000000000000000000000000000000000000000108510103000000
558+ef03000000000000090000000000000000000000000000006e6574207469746c
559+650000001c00510101005000f303000000000000000000000000000000000000
560+000000000108520103000000ef03000000000000090000000000000000000000
561+000000006e6574207469746c650000001c00520101005000f303000000000000
562+000000000000000000000000000000000108530103000000ef03000000000000
563+090000000000000000000000000000006e6574207469746c650000001c005301
564+01005000f3030000000000000000000000000000000000000000000001085401
565+03000000ef03000000000000090000000000000000000000000000006e657420
566+7469746c650000001c00540101005000f3030000000000000000000000000000
567+00000000000000000108550103000000ef030000000000000900000000000000
568+00000000000000006e6574207469746c650000001c00550101005000f3030000
569+00000000000000000000000000000000000000000108560103000000ef030000
570+00000000090000000000000000000000000000006e6574207469746c65000000
571+1c00560101005000f30300000000000000000000000000000000000000000000
572+0108570103000000ef0300000000000009000000000000000000000000000000
573+6e6574207469746c650000001c00570101005000f30300000000000000000000
574+0000000000000000000000000108580103000000ef0300000000000009000000
575+0000000000000000000000006e6574207469746c650000001c00580101005000
576+f303000000000000000000000000000000000000000000000108590103000000
577+ef03000000000000090000000000000000000000000000006e6574207469746c
578+650000001c00590101005000f303000000000000000000000000000000000000
579+0000000001085a0103000000ef03000000000000090000000000000000000000
580+000000006e6574207469746c650000001c005a0101005000f303000000000000
581+0000000000000000000000000000000001085b0103000000ef03000000000000
582+090000000000000000000000000000006e6574207469746c650000001c005b01
583+01005000f3030000000000000000000000000000000000000000000001085c01
584+03000000ef03000000000000090000000000000000000000000000006e657420
585+7469746c650000001c005c0101005000f3030000000000000000000000000000
586+000000000000000001085d0103000000ef030000000000000900000000000000
587+00000000000000006e6574207469746c650000001c005d0101005000f3030000
588+000000000000000000000000000000000000000001085e0103000000ef030000
589+00000000090000000000000000000000000000006e6574207469746c65000000
590+1c005e0101005000f30300000000000000000000000000000000000000000000
591+01085f0103000000ef0300000000000009000000000000000000000000000000
592+6e6574207469746c650000001c005f0101005000f30300000000000000000000
593+0000000000000000000000000108600103000000ef0300000000000009000000
594+0000000000000000000000006e6574207469746c650000001c00600101005000
595+f303000000000000000000000000000000000000000000000108610103000000
596+ef03000000000000090000000000000000000000000000006e6574207469746c
597+650000001c00610101005000f303000000000000000000000000000000000000
598+000000000108620103000000ef03000000000000090000000000000000000000
599+000000006e6574207469746c650000001c00620101005000f303000000000000
600+000000000000000000000000000000000108630103000000ef03000000000000
601+090000000000000000000000000000006e6574207469746c650000001c006301
602+01005000f3030000000000000000000000000000000000000000000001086401
603+03000000ef03000000000000090000000000000000000000000000006e657420
604+7469746c650000001c00640101005000f3030000000000000000000000000000
605+00000000000000000108650103000000ef030000000000000900000000000000
606+00000000000000006e6574207469746c650000001c00650101005000f3030000
607+00000000000000000000000000000000000000000108660103000000ef030000
608+00000000090000000000000000000000000000006e6574207469746c65000000
609+1c00660101005000f30300000000000000000000000000000000000000000000
610+0108670103000000ef0300000000000009000000000000000000000000000000
611+6e6574207469746c650000001c00670101005000f30300000000000000000000
612+0000000000000000000000000108680103000000ef0300000000000009000000
613+0000000000000000000000006e6574207469746c650000001c00680101005000
614+f303000000000000000000000000000000000000000000000108690103000000
615+ef03000000000000090000000000000000000000000000006e6574207469746c
616+650000001c00690101005000f303000000000000000000000000000000000000
617+0000000001086a0103000000ef03000000000000090000000000000000000000
618+000000006e6574207469746c650000001c006a0101005000f303000000000000
619+0000000000000000000000000000000001086b0103000000ef03000000000000
620+090000000000000000000000000000006e6574207469746c650000001c006b01
621+01005000f3030000000000000000000000000000000000000000000001086c01
622+03000000ef03000000000000090000000000000000000000000000006e657420
623+7469746c650000001c006c0101005000f3030000000000000000000000000000
624+000000000000000001086d0103000000ef030000000000000900000000000000
625+00000000000000006e6574207469746c650000001c006d0101005000f3030000
626+000000000000000000000000000000000000000001086e0103000000ef030000
627+00000000090000000000000000000000000000006e6574207469746c65000000
628+1c006e0101005000f30300000000000000000000000000000000000000000000
629+01086f0103000000ef0300000000000009000000000000000000000000000000
630+6e6574207469746c650000001c006f0101005000f30300000000000000000000
631+0000000000000000000000000108700103000000ef0300000000000009000000
632+0000000000000000000000006e6574207469746c650000001c00700101005000
633+f303000000000000000000000000000000000000000000000108710103000000
634+ef03000000000000090000000000000000000000000000006e6574207469746c
635+650000001c00710101005000f303000000000000000000000000000000000000
636+000000000108720103000000ef03000000000000090000000000000000000000
637+000000006e6574207469746c650000001c00720101005000f303000000000000
638+000000000000000000000000000000000108730103000000ef03000000000000
639+090000000000000000000000000000006e6574207469746c650000001c007301
640+01005000f3030000000000000000000000000000000000000000000001087401
641+03000000ef03000000000000090000000000000000000000000000006e657420
642+7469746c650000001c00740101005000f3030000000000000000000000000000
643+00000000000000000108750103000000ef030000000000000900000000000000
644+00000000000000006e6574207469746c650000001c00750101005000f3030000
645+00000000000000000000000000000000000000000108760103000000ef030000
646+00000000090000000000000000000000000000006e6574207469746c65000000
647+1c00760101005000f30300000000000000000000000000000000000000000000
648+0108770103000000ef0300000000000009000000000000000000000000000000
649+6e6574207469746c650000001c00770101005000f30300000000000000000000
650+0000000000000000000000000108780103000000ef0300000000000009000000
651+0000000000000000000000006e6574207469746c650000001c00780101005000
652+f303000000000000000000000000000000000000000000000108790103000000
653+ef03000000000000090000000000000000000000000000006e6574207469746c
654+650000001c00790101005000f303000000000000000000000000000000000000
655+0000000001087a0103000000ef03000000000000090000000000000000000000
656+000000006e6574207469746c650000001c007a0101005000f303000000000000
657+0000000000000000000000000000000001087b0103000000ef03000000000000
658+090000000000000000000000000000006e6574207469746c650000001c007b01
659+01005000f3030000000000000000000000000000000000000000000001087c01
660+03000000ef03000000000000090000000000000000000000000000006e657420
661+7469746c650000001c007c0101005000f3030000000000000000000000000000
662+000000000000000001087d0103000000ef030000000000000900000000000000
663+00000000000000006e6574207469746c650000001c007d0101005000f3030000
664+000000000000000000000000000000000000000001087e0103000000ef030000
665+00000000090000000000000000000000000000006e6574207469746c65000000
666+1c007e0101005000f30300000000000000000000000000000000000000000000
667+01087f0103000000ef0300000000000009000000000000000000000000000000
668+6e6574207469746c650000001c007f0101005000f30300000000000000000000
669+0000000000000000000000000108800103000000ef0300000000000009000000
670+0000000000000000000000006e6574207469746c650000001c00800101005000
671+f303000000000000000000000000000000000000000000000108810103000000
672+ef03000000000000090000000000000000000000000000006e6574207469746c
673+650000001c00810101005000f303000000000000000000000000000000000000
674+000000000108820103000000ef03000000000000090000000000000000000000
675+000000006e6574207469746c650000001c00820101005000f303000000000000
676+000000000000000000000000000000000108830103000000ef03000000000000
677+090000000000000000000000000000006e6574207469746c650000001c008301
678+01005000f3030000000000000000000000000000000000000000000001088401
679+03000000ef03000000000000090000000000000000000000000000006e657420
680+7469746c650000001c00840101005000f3030000000000000000000000000000
681+00000000000000000108850103000000ef030000000000000900000000000000
682+00000000000000006e6574207469746c650000001c00850101005000f3030000
683+00000000000000000000000000000000000000000108860103000000ef030000
684+00000000090000000000000000000000000000006e6574207469746c65000000
685+1c00860101005000f30300000000000000000000000000000000000000000000
686+0108870103000000ef0300000000000009000000000000000000000000000000
687+6e6574207469746c650000001c00870101005000f30300000000000000000000
688+0000000000000000000000000108880103000000ef0300000000000009000000
689+0000000000000000000000006e6574207469746c650000001c00880101005000
690+f303000000000000000000000000000000000000000000000108890103000000
691+ef03000000000000090000000000000000000000000000006e6574207469746c
692+650000001c00890101005000f303000000000000000000000000000000000000
693+0000000001088a0103000000ef03000000000000090000000000000000000000
694+000000006e6574207469746c650000001c008a0101005000f303000000000000
695+0000000000000000000000000000000001088b0103000000ef03000000000000
696+090000000000000000000000000000006e6574207469746c650000001c008b01
697+01005000f3030000000000000000000000000000000000000000000001088c01
698+03000000ef03000000000000090000000000000000000000000000006e657420
699+7469746c650000001c008c0101005000f3030000000000000000000000000000
700+000000000000000001088d0103000000ef030000000000000900000000000000
701+00000000000000006e6574207469746c650000001c008d0101005000f3030000
702+000000000000000000000000000000000000000001088e0103000000ef030000
703+00000000090000000000000000000000000000006e6574207469746c65000000
704+1c008e0101005000f30300000000000000000000000000000000000000000000
705+01088f0103000000ef0300000000000009000000000000000000000000000000
706+6e6574207469746c650000001c008f0101005000f30300000000000000000000
707+0000000000000000000000000108900103000000ef0300000000000009000000
708+0000000000000000000000006e6574207469746c650000001c00900101005000
709+f303000000000000000000000000000000000000000000000108910103000000
710+ef03000000000000090000000000000000000000000000006e6574207469746c
711+650000001c00910101005000f303000000000000000000000000000000000000
712+000000000108920103000000ef03000000000000090000000000000000000000
713+000000006e6574207469746c650000001c00920101005000f303000000000000
714+000000000000000000000000000000000108930103000000ef03000000000000
715+090000000000000000000000000000006e6574207469746c650000001c009301
716+01005000f3030000000000000000000000000000000000000000000001089401
717+03000000ef03000000000000090000000000000000000000000000006e657420
718+7469746c650000001c00940101005000f3030000000000000000000000000000
719+00000000000000000108950103000000ef030000000000000900000000000000
720+00000000000000006e6574207469746c650000001c00950101005000f3030000
721+00000000000000000000000000000000000000000108960103000000ef030000
722+00000000090000000000000000000000000000006e6574207469746c65000000
723+1c00960101005000f30300000000000000000000000000000000000000000000
724+0108970103000000ef0300000000000009000000000000000000000000000000
725+6e6574207469746c650000001c00970101005000f30300000000000000000000
726+0000000000000000000000000108980103000000ef0300000000000009000000
727+0000000000000000000000006e6574207469746c650000001c00980101005000
728+f303000000000000000000000000000000000000000000000108990103000000
729+ef03000000000000090000000000000000000000000000006e6574207469746c
730+650000001c00990101005000f303000000000000000000000000000000000000
731+0000000001089a0103000000ef03000000000000090000000000000000000000
732+000000006e6574207469746c650000001c009a0101005000f303000000000000
733+0000000000000000000000000000000001089b0103000000ef03000000000000
734+090000000000000000000000000000006e6574207469746c650000001c009b01
735+01005000f3030000000000000000000000000000000000000000000001089c01
736+03000000ef03000000000000090000000000000000000000000000006e657420
737+7469746c650000001c009c0101005000f3030000000000000000000000000000
738+000000000000000001089d0103000000ef030000000000000900000000000000
739+00000000000000006e6574207469746c650000001c009d0101005000f3030000
740+000000000000000000000000000000000000000001089e0103000000ef030000
741+00000000090000000000000000000000000000006e6574207469746c65000000
742+1c009e0101005000f30300000000000000000000000000000000000000000000
743+01089f0103000000ef0300000000000009000000000000000000000000000000
744+6e6574207469746c650000001c009f0101005000f30300000000000000000000
745+0000000000000000000000000108a00103000000ef0300000000000009000000
746+0000000000000000000000006e6574207469746c650000001c00a00101005000
747+f303000000000000000000000000000000000000000000000108a10103000000
748+ef03000000000000090000000000000000000000000000006e6574207469746c
749+650000001c00a10101005000f303000000000000000000000000000000000000
750+000000000108a20103000000ef03000000000000090000000000000000000000
751+000000006e6574207469746c650000001c00a20101005000f303000000000000
752+000000000000000000000000000000000108a30103000000ef03000000000000
753+090000000000000000000000000000006e6574207469746c650000001c00a301
754+01005000f303000000000000000000000000000000000000000000000108a401
755+03000000ef03000000000000090000000000000000000000000000006e657420
756+7469746c650000001c00a40101005000f3030000000000000000000000000000
757+00000000000000000108a50103000000ef030000000000000900000000000000
758+00000000000000006e6574207469746c650000001c00a50101005000f3030000
759+00000000000000000000000000000000000000000108a60103000000ef030000
760+00000000090000000000000000000000000000006e6574207469746c65000000
761+1c00a60101005000f30300000000000000000000000000000000000000000000
762+0108a70103000000ef0300000000000009000000000000000000000000000000
763+6e6574207469746c650000001c00a70101005000f30300000000000000000000
764+0000000000000000000000000108a80103000000ef0300000000000009000000
765+0000000000000000000000006e6574207469746c650000001c00a80101005000
766+f303000000000000000000000000000000000000000000000108a90103000000
767+ef03000000000000090000000000000000000000000000006e6574207469746c
768+650000001c00a90101005000f303000000000000000000000000000000000000
769+000000000108aa0103000000ef03000000000000090000000000000000000000
770+000000006e6574207469746c650000001c00aa0101005000f303000000000000
771+000000000000000000000000000000000108ab0103000000ef03000000000000
772+090000000000000000000000000000006e6574207469746c650000001c00ab01
773+01005000f303000000000000000000000000000000000000000000000108ac01
774+03000000ef03000000000000090000000000000000000000000000006e657420
775+7469746c650000001c00ac0101005000f3030000000000000000000000000000
776+00000000000000000108ad0103000000ef030000000000000900000000000000
777+00000000000000006e6574207469746c650000001c00ad0101005000f3030000
778+00000000000000000000000000000000000000000108ae0103000000ef030000
779+00000000090000000000000000000000000000006e6574207469746c65000000
780+1c00ae0101005000f30300000000000000000000000000000000000000000000
781+0108af0103000000ef0300000000000009000000000000000000000000000000
782+6e6574207469746c650000001c00af0101005000f30300000000000000000000
783+0000000000000000000000000108b00103000000ef0300000000000009000000
784+0000000000000000000000006e6574207469746c650000001c00b00101005000
785+f303000000000000000000000000000000000000000000000108b10103000000
786+ef03000000000000090000000000000000000000000000006e6574207469746c
787+650000001c00b10101005000f303000000000000000000000000000000000000
788+000000000108b20103000000ef03000000000000090000000000000000000000
789+000000006e6574207469746c650000001c00b20101005000f303000000000000
790+000000000000000000000000000000000108b30103000000ef03000000000000
791+090000000000000000000000000000006e6574207469746c650000001c00b301
792+01005000f303000000000000000000000000000000000000000000000108b401
793+03000000ef03000000000000090000000000000000000000000000006e657420
794+7469746c650000001c00b40101005000f3030000000000000000000000000000
795+00000000000000000108b50103000000ef030000000000000900000000000000
796+00000000000000006e6574207469746c650000001c00b50101005000f3030000
797+00000000000000000000000000000000000000000108b60103000000ef030000
798+00000000090000000000000000000000000000006e6574207469746c65000000
799+1c00b60101005000f30300000000000000000000000000000000000000000000
800+0108b70103000000ef0300000000000009000000000000000000000000000000
801+6e6574207469746c650000001c00b70101005000f30300000000000000000000
802+0000000000000000000000000108b80103000000ef0300000000000009000000
803+0000000000000000000000006e6574207469746c650000001c00b80101005000
804+f303000000000000000000000000000000000000000000000108b90103000000
805+ef03000000000000090000000000000000000000000000006e6574207469746c
806+650000001c00b90101005000f303000000000000000000000000000000000000
807+000000000108ba0103000000ef03000000000000090000000000000000000000
808+000000006e6574207469746c650000001c00ba0101005000f303000000000000
809+000000000000000000000000000000000108bb0103000000ef03000000000000
810+090000000000000000000000000000006e6574207469746c650000001c00bb01
811+01005000f303000000000000000000000000000000000000000000000108bc01
812+03000000ef03000000000000090000000000000000000000000000006e657420
813+7469746c650000001c00bc0101005000f3030000000000000000000000000000
814+00000000000000000108bd0103000000ef030000000000000900000000000000
815+00000000000000006e6574207469746c650000001c00bd0101005000f3030000
816+00000000000000000000000000000000000000000108be0103000000ef030000
817+00000000090000000000000000000000000000006e6574207469746c65000000
818+1c00be0101005000f30300000000000000000000000000000000000000000000
819+0108bf0103000000ef0300000000000009000000000000000000000000000000
820+6e6574207469746c650000001c00bf0101005000f30300000000000000000000
821+0000000000000000000000000108c00103000000ef0300000000000009000000
822+0000000000000000000000006e6574207469746c650000001c00c00101005000
823+f303000000000000000000000000000000000000000000000108c10103000000
824+ef03000000000000090000000000000000000000000000006e6574207469746c
825+650000001c00c10101005000f303000000000000000000000000000000000000
826+000000000108c20103000000ef03000000000000090000000000000000000000
827+000000006e6574207469746c650000001c00c20101005000f303000000000000
828+000000000000000000000000000000000108c30103000000ef03000000000000
829+090000000000000000000000000000006e6574207469746c650000001c00c301
830+01005000f303000000000000000000000000000000000000000000000108c401
831+03000000ef03000000000000090000000000000000000000000000006e657420
832+7469746c650000001c00c40101005000f3030000000000000000000000000000
833+00000000000000000108c50103000000ef030000000000000900000000000000
834+00000000000000006e6574207469746c650000001c00c50101005000f3030000
835+00000000000000000000000000000000000000000108c60103000000ef030000
836+00000000090000000000000000000000000000006e6574207469746c65000000
837+1c00c60101005000f30300000000000000000000000000000000000000000000
838+0108c70103000000ef0300000000000009000000000000000000000000000000
839+6e6574207469746c650000001c00c70101005000f30300000000000000000000
840+0000000000000000000000000108c80103000000ef0300000000000009000000
841+0000000000000000000000006e6574207469746c650000001c00c80101005000
842+f303000000000000000000000000000000000000000000000108c90103000000
843+ef03000000000000090000000000000000000000000000006e6574207469746c
844+650000001c00c90101005000f303000000000000000000000000000000000000
845+000000000108ca0103000000ef03000000000000090000000000000000000000
846+000000006e6574207469746c650000001c00ca0101005000f303000000000000
847+000000000000000000000000000000000108cb0103000000ef03000000000000
848+090000000000000000000000000000006e6574207469746c650000001c00cb01
849+01005000f303000000000000000000000000000000000000000000000108cc01
850+03000000ef03000000000000090000000000000000000000000000006e657420
851+7469746c650000001c00cc0101005000f3030000000000000000000000000000
852+00000000000000000108cd0103000000ef030000000000000900000000000000
853+00000000000000006e6574207469746c650000001c00cd0101005000f3030000
854+00000000000000000000000000000000000000000108ce0103000000ef030000
855+00000000090000000000000000000000000000006e6574207469746c65000000
856+1c00ce0101005000f30300000000000000000000000000000000000000000000
857+0108cf0103000000ef0300000000000009000000000000000000000000000000
858+6e6574207469746c650000001c00cf0101005000f30300000000000000000000
859+0000000000000000000000000108d00103000000ef0300000000000009000000
860+0000000000000000000000006e6574207469746c650000001c00d00101005000
861+f303000000000000000000000000000000000000000000000108d10103000000
862+ef03000000000000090000000000000000000000000000006e6574207469746c
863+650000001c00d10101005000f303000000000000000000000000000000000000
864+000000000108d20103000000ef03000000000000090000000000000000000000
865+000000006e6574207469746c650000001c00d20101005000f303000000000000
866+000000000000000000000000000000000108d30103000000ef03000000000000
867+090000000000000000000000000000006e6574207469746c650000001c00d301
868+01005000f303000000000000000000000000000000000000000000000108d401
869+03000000ef03000000000000090000000000000000000000000000006e657420
870+7469746c650000001c00d40101005000f3030000000000000000000000000000
871+00000000000000000108d50103000000ef030000000000000900000000000000
872+00000000000000006e6574207469746c650000001c00d50101005000f3030000
873+00000000000000000000000000000000000000000108d60103000000ef030000
874+00000000090000000000000000000000000000006e6574207469746c65000000
875+1c00d60101005000f30300000000000000000000000000000000000000000000
876+0108d70103000000ef0300000000000009000000000000000000000000000000
877+6e6574207469746c650000001c00d70101005000f30300000000000000000000
878+0000000000000000000000000108d80103000000ef0300000000000009000000
879+0000000000000000000000006e6574207469746c650000001c00d80101005000
880+f303000000000000000000000000000000000000000000000108d90103000000
881+ef03000000000000090000000000000000000000000000006e6574207469746c
882+650000001c00d90101005000f303000000000000000000000000000000000000
883+000000000108da0103000000ef03000000000000090000000000000000000000
884+000000006e6574207469746c650000001c00da0101005000f303000000000000
885+000000000000000000000000000000000108db0103000000ef03000000000000
886+090000000000000000000000000000006e6574207469746c650000001c00db01
887+01005000f303000000000000000000000000000000000000000000000108dc01
888+03000000ef03000000000000090000000000000000000000000000006e657420
889+7469746c650000001c00dc0101005000f3030000000000000000000000000000
890+00000000000000000108dd0103000000ef030000000000000900000000000000
891+00000000000000006e6574207469746c650000001c00dd0101005000f3030000
892+00000000000000000000000000000000000000000108de0103000000ef030000
893+00000000090000000000000000000000000000006e6574207469746c65000000
894+1c00de0101005000f30300000000000000000000000000000000000000000000
895+0108df0103000000ef0300000000000009000000000000000000000000000000
896+6e6574207469746c650000001c00df0101005000f30300000000000000000000
897+0000000000000000000000000108e00103000000ef0300000000000009000000
898+0000000000000000000000006e6574207469746c650000001c00e00101005000
899+f303000000000000000000000000000000000000000000000108e10103000000
900+ef03000000000000090000000000000000000000000000006e6574207469746c
901+650000001c00e10101005000f303000000000000000000000000000000000000
902+000000000108e20103000000ef03000000000000090000000000000000000000
903+000000006e6574207469746c650000001c00e20101005000f303000000000000
904+000000000000000000000000000000000108e30103000000ef03000000000000
905+090000000000000000000000000000006e6574207469746c650000001c00e301
906+01005000f303000000000000000000000000000000000000000000000108e401
907+03000000ef03000000000000090000000000000000000000000000006e657420
908+7469746c650000001c00e40101005000f3030000000000000000000000000000
909+00000000000000000108e50103000000ef030000000000000900000000000000
910+00000000000000006e6574207469746c650000001c00e50101005000f3030000
911+00000000000000000000000000000000000000000108e60103000000ef030000
912+00000000090000000000000000000000000000006e6574207469746c65000000
913+1c00e60101005000f30300000000000000000000000000000000000000000000
914+0108e70103000000ef0300000000000009000000000000000000000000000000
915+6e6574207469746c650000001c00e70101005000f30300000000000000000000
916+0000000000000000000000000108e80103000000ef0300000000000009000000
917+0000000000000000000000006e6574207469746c650000001c00e80101005000
918+f303000000000000000000000000000000000000000000000108e90103000000
919+ef03000000000000090000000000000000000000000000006e6574207469746c
920+650000001c00e90101005000f303000000000000000000000000000000000000
921+000000000108ea0103000000ef03000000000000090000000000000000000000
922+000000006e6574207469746c650000001c00ea0101005000f303000000000000
923+000000000000000000000000000000000108eb0103000000ef03000000000000
924+090000000000000000000000000000006e6574207469746c650000001c00eb01
925+01005000f303000000000000000000000000000000000000000000000108ec01
926+03000000ef03000000000000090000000000000000000000000000006e657420
927+7469746c650000001c00ec0101005000f3030000000000000000000000000000
928+00000000000000000108ed0103000000ef030000000000000900000000000000
929+00000000000000006e6574207469746c650000001c00ed0101005000f3030000
930+00000000000000000000000000000000000000000108ee0103000000ef030000
931+00000000090000000000000000000000000000006e6574207469746c65000000
932+1c00ee0101005000f30300000000000000000000000000000000000000000000
933+0108ef0103000000ef0300000000000009000000000000000000000000000000
934+6e6574207469746c650000001c00ef0101005000f30300000000000000000000
935+0000000000000000000000000108f00103000000ef0300000000000009000000
936+0000000000000000000000006e6574207469746c650000001c00f00101005000
937+f303000000000000000000000000000000000000000000000108f10103000000
938+ef03000000000000090000000000000000000000000000006e6574207469746c
939+650000001c00f10101005000f303000000000000000000000000000000000000
940+000000000108f20103000000ef03000000000000090000000000000000000000
941+000000006e6574207469746c650000001c00f20101005000f303000000000000
942+000000000000000000000000000000000108f30103000000ef03000000000000
943+090000000000000000000000000000006e6574207469746c650000001c00f301
944+01005000f303000000000000000000000000000000000000000000000108f401
945+03000000ef03000000000000090000000000000000000000000000006e657420
946+7469746c650000001c00f40101005000f3030000000000000000000000000000
947+00000000000000000108f50103000000ef030000000000000900000000000000
948+00000000000000006e6574207469746c650000001c00f50101005000f3030000
949+00000000000000000000000000000000000000000108f60103000000ef030000
950950 00000000090000000000000000000000000000006e6574207469746c65000000
@@ -1,950 +1,950 @@
1-1c00650001005000f303000000000000000000000000000000000000000000001+1c00660001005000f30300000000000000000000000000000000000000000000
2-0108660003000000ef03000000000000090000000000000000000000000000002+0108670003000000ef0300000000000009000000000000000000000000000000
3-6e6574207469746c650000001c00660001005000f303000000000000000000003+6e6574207469746c650000001c00670001005000f30300000000000000000000
4-0000000000000000000000000108670003000000ef03000000000000090000004+0000000000000000000000000108680003000000ef0300000000000009000000
5-0000000000000000000000006e6574207469746c650000001c006700010050005+0000000000000000000000006e6574207469746c650000001c00680001005000
6-f3030000000000000000000000000000000000000000000001086800030000006+f303000000000000000000000000000000000000000000000108690003000000
7-ef03000000000000090000000000000000000000000000006e6574207469746c7+ef03000000000000090000000000000000000000000000006e6574207469746c
8-650000001c00680001005000f3030000000000000000000000000000000000008+650000001c00690001005000f303000000000000000000000000000000000000
9-000000000108690003000000ef030000000000000900000000000000000000009+0000000001086a0003000000ef03000000000000090000000000000000000000
10-000000006e6574207469746c650000001c00690001005000f30300000000000010+000000006e6574207469746c650000001c006a0001005000f303000000000000
11-0000000000000000000000000000000001086a0003000000ef0300000000000011+0000000000000000000000000000000001086b0003000000ef03000000000000
12-090000000000000000000000000000006e6574207469746c650000001c006a0012+090000000000000000000000000000006e6574207469746c650000001c006b00
13-01005000f3030000000000000000000000000000000000000000000001086b0013+01005000f3030000000000000000000000000000000000000000000001086c00
14-03000000ef03000000000000090000000000000000000000000000006e65742014+03000000ef03000000000000090000000000000000000000000000006e657420
15-7469746c650000001c006b0001005000f303000000000000000000000000000015+7469746c650000001c006c0001005000f3030000000000000000000000000000
16-000000000000000001086c0003000000ef03000000000000090000000000000016+000000000000000001086d0003000000ef030000000000000900000000000000
17-00000000000000006e6574207469746c650000001c006c0001005000f303000017+00000000000000006e6574207469746c650000001c006d0001005000f3030000
18-000000000000000000000000000000000000000001086d0003000000ef03000018+000000000000000000000000000000000000000001086e0003000000ef030000
19-00000000090000000000000000000000000000006e6574207469746c6500000019+00000000090000000000000000000000000000006e6574207469746c65000000
20-1c006d0001005000f3030000000000000000000000000000000000000000000020+1c006e0001005000f30300000000000000000000000000000000000000000000
21-01086e0003000000ef030000000000000900000000000000000000000000000021+01086f0003000000ef0300000000000009000000000000000000000000000000
22-6e6574207469746c650000001c006e0001005000f3030000000000000000000022+6e6574207469746c650000001c006f0001005000f30300000000000000000000
23-00000000000000000000000001086f0003000000ef030000000000000900000023+0000000000000000000000000108700003000000ef0300000000000009000000
24-0000000000000000000000006e6574207469746c650000001c006f000100500024+0000000000000000000000006e6574207469746c650000001c00700001005000
25-f30300000000000000000000000000000000000000000000010870000300000025+f303000000000000000000000000000000000000000000000108710003000000
26-ef03000000000000090000000000000000000000000000006e6574207469746c26+ef03000000000000090000000000000000000000000000006e6574207469746c
27-650000001c00700001005000f30300000000000000000000000000000000000027+650000001c00710001005000f303000000000000000000000000000000000000
28-000000000108710003000000ef0300000000000009000000000000000000000028+000000000108720003000000ef03000000000000090000000000000000000000
29-000000006e6574207469746c650000001c00710001005000f30300000000000029+000000006e6574207469746c650000001c00720001005000f303000000000000
30-000000000000000000000000000000000108720003000000ef0300000000000030+000000000000000000000000000000000108730003000000ef03000000000000
31-090000000000000000000000000000006e6574207469746c650000001c00720031+090000000000000000000000000000006e6574207469746c650000001c007300
32-01005000f303000000000000000000000000000000000000000000000108730032+01005000f3030000000000000000000000000000000000000000000001087400
33-03000000ef03000000000000090000000000000000000000000000006e65742033+03000000ef03000000000000090000000000000000000000000000006e657420
34-7469746c650000001c00730001005000f303000000000000000000000000000034+7469746c650000001c00740001005000f3030000000000000000000000000000
35-00000000000000000108740003000000ef03000000000000090000000000000035+00000000000000000108750003000000ef030000000000000900000000000000
36-00000000000000006e6574207469746c650000001c00740001005000f303000036+00000000000000006e6574207469746c650000001c00750001005000f3030000
37-00000000000000000000000000000000000000000108750003000000ef03000037+00000000000000000000000000000000000000000108760003000000ef030000
38-00000000090000000000000000000000000000006e6574207469746c6500000038+00000000090000000000000000000000000000006e6574207469746c65000000
39-1c00750001005000f3030000000000000000000000000000000000000000000039+1c00760001005000f30300000000000000000000000000000000000000000000
40-0108760003000000ef030000000000000900000000000000000000000000000040+0108770003000000ef0300000000000009000000000000000000000000000000
41-6e6574207469746c650000001c00760001005000f3030000000000000000000041+6e6574207469746c650000001c00770001005000f30300000000000000000000
42-0000000000000000000000000108770003000000ef030000000000000900000042+0000000000000000000000000108780003000000ef0300000000000009000000
43-0000000000000000000000006e6574207469746c650000001c0077000100500043+0000000000000000000000006e6574207469746c650000001c00780001005000
44-f30300000000000000000000000000000000000000000000010878000300000044+f303000000000000000000000000000000000000000000000108790003000000
45-ef03000000000000090000000000000000000000000000006e6574207469746c45+ef03000000000000090000000000000000000000000000006e6574207469746c
46-650000001c00780001005000f30300000000000000000000000000000000000046+650000001c00790001005000f303000000000000000000000000000000000000
47-000000000108790003000000ef0300000000000009000000000000000000000047+0000000001087a0003000000ef03000000000000090000000000000000000000
48-000000006e6574207469746c650000001c00790001005000f30300000000000048+000000006e6574207469746c650000001c007a0001005000f303000000000000
49-0000000000000000000000000000000001087a0003000000ef0300000000000049+0000000000000000000000000000000001087b0003000000ef03000000000000
50-090000000000000000000000000000006e6574207469746c650000001c007a0050+090000000000000000000000000000006e6574207469746c650000001c007b00
51-01005000f3030000000000000000000000000000000000000000000001087b0051+01005000f3030000000000000000000000000000000000000000000001087c00
52-03000000ef03000000000000090000000000000000000000000000006e65742052+03000000ef03000000000000090000000000000000000000000000006e657420
53-7469746c650000001c007b0001005000f303000000000000000000000000000053+7469746c650000001c007c0001005000f3030000000000000000000000000000
54-000000000000000001087c0003000000ef03000000000000090000000000000054+000000000000000001087d0003000000ef030000000000000900000000000000
55-00000000000000006e6574207469746c650000001c007c0001005000f303000055+00000000000000006e6574207469746c650000001c007d0001005000f3030000
56-000000000000000000000000000000000000000001087d0003000000ef03000056+000000000000000000000000000000000000000001087e0003000000ef030000
57-00000000090000000000000000000000000000006e6574207469746c6500000057+00000000090000000000000000000000000000006e6574207469746c65000000
58-1c007d0001005000f3030000000000000000000000000000000000000000000058+1c007e0001005000f30300000000000000000000000000000000000000000000
59-01087e0003000000ef030000000000000900000000000000000000000000000059+01087f0003000000ef0300000000000009000000000000000000000000000000
60-6e6574207469746c650000001c007e0001005000f3030000000000000000000060+6e6574207469746c650000001c007f0001005000f30300000000000000000000
61-00000000000000000000000001087f0003000000ef030000000000000900000061+0000000000000000000000000108800003000000ef0300000000000009000000
62-0000000000000000000000006e6574207469746c650000001c007f000100500062+0000000000000000000000006e6574207469746c650000001c00800001005000
63-f30300000000000000000000000000000000000000000000010880000300000063+f303000000000000000000000000000000000000000000000108810003000000
64-ef03000000000000090000000000000000000000000000006e6574207469746c64+ef03000000000000090000000000000000000000000000006e6574207469746c
65-650000001c00800001005000f30300000000000000000000000000000000000065+650000001c00810001005000f303000000000000000000000000000000000000
66-000000000108810003000000ef0300000000000009000000000000000000000066+000000000108820003000000ef03000000000000090000000000000000000000
67-000000006e6574207469746c650000001c00810001005000f30300000000000067+000000006e6574207469746c650000001c00820001005000f303000000000000
68-000000000000000000000000000000000108820003000000ef0300000000000068+000000000000000000000000000000000108830003000000ef03000000000000
69-090000000000000000000000000000006e6574207469746c650000001c00820069+090000000000000000000000000000006e6574207469746c650000001c008300
70-01005000f303000000000000000000000000000000000000000000000108830070+01005000f3030000000000000000000000000000000000000000000001088400
71-03000000ef03000000000000090000000000000000000000000000006e65742071+03000000ef03000000000000090000000000000000000000000000006e657420
72-7469746c650000001c00830001005000f303000000000000000000000000000072+7469746c650000001c00840001005000f3030000000000000000000000000000
73-00000000000000000108840003000000ef03000000000000090000000000000073+00000000000000000108850003000000ef030000000000000900000000000000
74-00000000000000006e6574207469746c650000001c00840001005000f303000074+00000000000000006e6574207469746c650000001c00850001005000f3030000
75-00000000000000000000000000000000000000000108850003000000ef03000075+00000000000000000000000000000000000000000108860003000000ef030000
76-00000000090000000000000000000000000000006e6574207469746c6500000076+00000000090000000000000000000000000000006e6574207469746c65000000
77-1c00850001005000f3030000000000000000000000000000000000000000000077+1c00860001005000f30300000000000000000000000000000000000000000000
78-0108860003000000ef030000000000000900000000000000000000000000000078+0108870003000000ef0300000000000009000000000000000000000000000000
79-6e6574207469746c650000001c00860001005000f3030000000000000000000079+6e6574207469746c650000001c00870001005000f30300000000000000000000
80-0000000000000000000000000108870003000000ef030000000000000900000080+0000000000000000000000000108880003000000ef0300000000000009000000
81-0000000000000000000000006e6574207469746c650000001c0087000100500081+0000000000000000000000006e6574207469746c650000001c00880001005000
82-f30300000000000000000000000000000000000000000000010888000300000082+f303000000000000000000000000000000000000000000000108890003000000
83-ef03000000000000090000000000000000000000000000006e6574207469746c83+ef03000000000000090000000000000000000000000000006e6574207469746c
84-650000001c00880001005000f30300000000000000000000000000000000000084+650000001c00890001005000f303000000000000000000000000000000000000
85-000000000108890003000000ef0300000000000009000000000000000000000085+0000000001088a0003000000ef03000000000000090000000000000000000000
86-000000006e6574207469746c650000001c00890001005000f30300000000000086+000000006e6574207469746c650000001c008a0001005000f303000000000000
87-0000000000000000000000000000000001088a0003000000ef0300000000000087+0000000000000000000000000000000001088b0003000000ef03000000000000
88-090000000000000000000000000000006e6574207469746c650000001c008a0088+090000000000000000000000000000006e6574207469746c650000001c008b00
89-01005000f3030000000000000000000000000000000000000000000001088b0089+01005000f3030000000000000000000000000000000000000000000001088c00
90-03000000ef03000000000000090000000000000000000000000000006e65742090+03000000ef03000000000000090000000000000000000000000000006e657420
91-7469746c650000001c008b0001005000f303000000000000000000000000000091+7469746c650000001c008c0001005000f3030000000000000000000000000000
92-000000000000000001088c0003000000ef03000000000000090000000000000092+000000000000000001088d0003000000ef030000000000000900000000000000
93-00000000000000006e6574207469746c650000001c008c0001005000f303000093+00000000000000006e6574207469746c650000001c008d0001005000f3030000
94-000000000000000000000000000000000000000001088d0003000000ef03000094+000000000000000000000000000000000000000001088e0003000000ef030000
95-00000000090000000000000000000000000000006e6574207469746c6500000095+00000000090000000000000000000000000000006e6574207469746c65000000
96-1c008d0001005000f3030000000000000000000000000000000000000000000096+1c008e0001005000f30300000000000000000000000000000000000000000000
97-01088e0003000000ef030000000000000900000000000000000000000000000097+01088f0003000000ef0300000000000009000000000000000000000000000000
98-6e6574207469746c650000001c008e0001005000f3030000000000000000000098+6e6574207469746c650000001c008f0001005000f30300000000000000000000
99-00000000000000000000000001088f0003000000ef030000000000000900000099+0000000000000000000000000108900003000000ef0300000000000009000000
100-0000000000000000000000006e6574207469746c650000001c008f0001005000100+0000000000000000000000006e6574207469746c650000001c00900001005000
101-f303000000000000000000000000000000000000000000000108900003000000101+f303000000000000000000000000000000000000000000000108910003000000
102-ef03000000000000090000000000000000000000000000006e6574207469746c102+ef03000000000000090000000000000000000000000000006e6574207469746c
103-650000001c00900001005000f303000000000000000000000000000000000000103+650000001c00910001005000f303000000000000000000000000000000000000
104-000000000108910003000000ef03000000000000090000000000000000000000104+000000000108920003000000ef03000000000000090000000000000000000000
105-000000006e6574207469746c650000001c00910001005000f303000000000000105+000000006e6574207469746c650000001c00920001005000f303000000000000
106-000000000000000000000000000000000108920003000000ef03000000000000106+000000000000000000000000000000000108930003000000ef03000000000000
107-090000000000000000000000000000006e6574207469746c650000001c009200107+090000000000000000000000000000006e6574207469746c650000001c009300
108-01005000f3030000000000000000000000000000000000000000000001089300108+01005000f3030000000000000000000000000000000000000000000001089400
109-03000000ef03000000000000090000000000000000000000000000006e657420109+03000000ef03000000000000090000000000000000000000000000006e657420
110-7469746c650000001c00930001005000f3030000000000000000000000000000110+7469746c650000001c00940001005000f3030000000000000000000000000000
111-00000000000000000108940003000000ef030000000000000900000000000000111+00000000000000000108950003000000ef030000000000000900000000000000
112-00000000000000006e6574207469746c650000001c00940001005000f3030000112+00000000000000006e6574207469746c650000001c00950001005000f3030000
113-00000000000000000000000000000000000000000108950003000000ef030000113+00000000000000000000000000000000000000000108960003000000ef030000
114-00000000090000000000000000000000000000006e6574207469746c65000000114+00000000090000000000000000000000000000006e6574207469746c65000000
115-1c00950001005000f30300000000000000000000000000000000000000000000115+1c00960001005000f30300000000000000000000000000000000000000000000
116-0108960003000000ef0300000000000009000000000000000000000000000000116+0108970003000000ef0300000000000009000000000000000000000000000000
117-6e6574207469746c650000001c00960001005000f30300000000000000000000117+6e6574207469746c650000001c00970001005000f30300000000000000000000
118-0000000000000000000000000108970003000000ef0300000000000009000000118+0000000000000000000000000108980003000000ef0300000000000009000000
119-0000000000000000000000006e6574207469746c650000001c00970001005000119+0000000000000000000000006e6574207469746c650000001c00980001005000
120-f303000000000000000000000000000000000000000000000108980003000000120+f303000000000000000000000000000000000000000000000108990003000000
121-ef03000000000000090000000000000000000000000000006e6574207469746c121+ef03000000000000090000000000000000000000000000006e6574207469746c
122-650000001c00980001005000f303000000000000000000000000000000000000122+650000001c00990001005000f303000000000000000000000000000000000000
123-000000000108990003000000ef03000000000000090000000000000000000000123+0000000001089a0003000000ef03000000000000090000000000000000000000
124-000000006e6574207469746c650000001c00990001005000f303000000000000124+000000006e6574207469746c650000001c009a0001005000f303000000000000
125-0000000000000000000000000000000001089a0003000000ef03000000000000125+0000000000000000000000000000000001089b0003000000ef03000000000000
126-090000000000000000000000000000006e6574207469746c650000001c009a00126+090000000000000000000000000000006e6574207469746c650000001c009b00
127-01005000f3030000000000000000000000000000000000000000000001089b00127+01005000f3030000000000000000000000000000000000000000000001089c00
128-03000000ef03000000000000090000000000000000000000000000006e657420128+03000000ef03000000000000090000000000000000000000000000006e657420
129-7469746c650000001c009b0001005000f3030000000000000000000000000000129+7469746c650000001c009c0001005000f3030000000000000000000000000000
130-000000000000000001089c0003000000ef030000000000000900000000000000130+000000000000000001089d0003000000ef030000000000000900000000000000
131-00000000000000006e6574207469746c650000001c009c0001005000f3030000131+00000000000000006e6574207469746c650000001c009d0001005000f3030000
132-000000000000000000000000000000000000000001089d0003000000ef030000132+000000000000000000000000000000000000000001089e0003000000ef030000
133-00000000090000000000000000000000000000006e6574207469746c65000000133+00000000090000000000000000000000000000006e6574207469746c65000000
134-1c009d0001005000f30300000000000000000000000000000000000000000000134+1c009e0001005000f30300000000000000000000000000000000000000000000
135-01089e0003000000ef0300000000000009000000000000000000000000000000135+01089f0003000000ef0300000000000009000000000000000000000000000000
136-6e6574207469746c650000001c009e0001005000f30300000000000000000000136+6e6574207469746c650000001c009f0001005000f30300000000000000000000
137-00000000000000000000000001089f0003000000ef0300000000000009000000137+0000000000000000000000000108a00003000000ef0300000000000009000000
138-0000000000000000000000006e6574207469746c650000001c009f0001005000138+0000000000000000000000006e6574207469746c650000001c00a00001005000
139-f303000000000000000000000000000000000000000000000108a00003000000139+f303000000000000000000000000000000000000000000000108a10003000000
140-ef03000000000000090000000000000000000000000000006e6574207469746c140+ef03000000000000090000000000000000000000000000006e6574207469746c
141-650000001c00a00001005000f303000000000000000000000000000000000000141+650000001c00a10001005000f303000000000000000000000000000000000000
142-000000000108a10003000000ef03000000000000090000000000000000000000142+000000000108a20003000000ef03000000000000090000000000000000000000
143-000000006e6574207469746c650000001c00a10001005000f303000000000000143+000000006e6574207469746c650000001c00a20001005000f303000000000000
144-000000000000000000000000000000000108a20003000000ef03000000000000144+000000000000000000000000000000000108a30003000000ef03000000000000
145-090000000000000000000000000000006e6574207469746c650000001c00a200145+090000000000000000000000000000006e6574207469746c650000001c00a300
146-01005000f303000000000000000000000000000000000000000000000108a300146+01005000f303000000000000000000000000000000000000000000000108a400
147-03000000ef03000000000000090000000000000000000000000000006e657420147+03000000ef03000000000000090000000000000000000000000000006e657420
148-7469746c650000001c00a30001005000f3030000000000000000000000000000148+7469746c650000001c00a40001005000f3030000000000000000000000000000
149-00000000000000000108a40003000000ef030000000000000900000000000000149+00000000000000000108a50003000000ef030000000000000900000000000000
150-00000000000000006e6574207469746c650000001c00a40001005000f3030000150+00000000000000006e6574207469746c650000001c00a50001005000f3030000
151-00000000000000000000000000000000000000000108a50003000000ef030000151+00000000000000000000000000000000000000000108a60003000000ef030000
152-00000000090000000000000000000000000000006e6574207469746c65000000152+00000000090000000000000000000000000000006e6574207469746c65000000
153-1c00a50001005000f30300000000000000000000000000000000000000000000153+1c00a60001005000f30300000000000000000000000000000000000000000000
154-0108a60003000000ef0300000000000009000000000000000000000000000000154+0108a70003000000ef0300000000000009000000000000000000000000000000
155-6e6574207469746c650000001c00a60001005000f30300000000000000000000155+6e6574207469746c650000001c00a70001005000f30300000000000000000000
156-0000000000000000000000000108a70003000000ef0300000000000009000000156+0000000000000000000000000108a80003000000ef0300000000000009000000
157-0000000000000000000000006e6574207469746c650000001c00a70001005000157+0000000000000000000000006e6574207469746c650000001c00a80001005000
158-f303000000000000000000000000000000000000000000000108a80003000000158+f303000000000000000000000000000000000000000000000108a90003000000
159-ef03000000000000090000000000000000000000000000006e6574207469746c159+ef03000000000000090000000000000000000000000000006e6574207469746c
160-650000001c00a80001005000f303000000000000000000000000000000000000160+650000001c00a90001005000f303000000000000000000000000000000000000
161-000000000108a90003000000ef03000000000000090000000000000000000000161+000000000108aa0003000000ef03000000000000090000000000000000000000
162-000000006e6574207469746c650000001c00a90001005000f303000000000000162+000000006e6574207469746c650000001c00aa0001005000f303000000000000
163-000000000000000000000000000000000108aa0003000000ef03000000000000163+000000000000000000000000000000000108ab0003000000ef03000000000000
164-090000000000000000000000000000006e6574207469746c650000001c00aa00164+090000000000000000000000000000006e6574207469746c650000001c00ab00
165-01005000f303000000000000000000000000000000000000000000000108ab00165+01005000f303000000000000000000000000000000000000000000000108ac00
166-03000000ef03000000000000090000000000000000000000000000006e657420166+03000000ef03000000000000090000000000000000000000000000006e657420
167-7469746c650000001c00ab0001005000f3030000000000000000000000000000167+7469746c650000001c00ac0001005000f3030000000000000000000000000000
168-00000000000000000108ac0003000000ef030000000000000900000000000000168+00000000000000000108ad0003000000ef030000000000000900000000000000
169-00000000000000006e6574207469746c650000001c00ac0001005000f3030000169+00000000000000006e6574207469746c650000001c00ad0001005000f3030000
170-00000000000000000000000000000000000000000108ad0003000000ef030000170+00000000000000000000000000000000000000000108ae0003000000ef030000
171-00000000090000000000000000000000000000006e6574207469746c65000000171+00000000090000000000000000000000000000006e6574207469746c65000000
172-1c00ad0001005000f30300000000000000000000000000000000000000000000172+1c00ae0001005000f30300000000000000000000000000000000000000000000
173-0108ae0003000000ef0300000000000009000000000000000000000000000000173+0108af0003000000ef0300000000000009000000000000000000000000000000
174-6e6574207469746c650000001c00ae0001005000f30300000000000000000000174+6e6574207469746c650000001c00af0001005000f30300000000000000000000
175-0000000000000000000000000108af0003000000ef0300000000000009000000175+0000000000000000000000000108b00003000000ef0300000000000009000000
176-0000000000000000000000006e6574207469746c650000001c00af0001005000176+0000000000000000000000006e6574207469746c650000001c00b00001005000
177-f303000000000000000000000000000000000000000000000108b00003000000177+f303000000000000000000000000000000000000000000000108b10003000000
178-ef03000000000000090000000000000000000000000000006e6574207469746c178+ef03000000000000090000000000000000000000000000006e6574207469746c
179-650000001c00b00001005000f303000000000000000000000000000000000000179+650000001c00b10001005000f303000000000000000000000000000000000000
180-000000000108b10003000000ef03000000000000090000000000000000000000180+000000000108b20003000000ef03000000000000090000000000000000000000
181-000000006e6574207469746c650000001c00b10001005000f303000000000000181+000000006e6574207469746c650000001c00b20001005000f303000000000000
182-000000000000000000000000000000000108b20003000000ef03000000000000182+000000000000000000000000000000000108b30003000000ef03000000000000
183-090000000000000000000000000000006e6574207469746c650000001c00b200183+090000000000000000000000000000006e6574207469746c650000001c00b300
184-01005000f303000000000000000000000000000000000000000000000108b300184+01005000f303000000000000000000000000000000000000000000000108b400
185-03000000ef03000000000000090000000000000000000000000000006e657420185+03000000ef03000000000000090000000000000000000000000000006e657420
186-7469746c650000001c00b30001005000f3030000000000000000000000000000186+7469746c650000001c00b40001005000f3030000000000000000000000000000
187-00000000000000000108b40003000000ef030000000000000900000000000000187+00000000000000000108b50003000000ef030000000000000900000000000000
188-00000000000000006e6574207469746c650000001c00b40001005000f3030000188+00000000000000006e6574207469746c650000001c00b50001005000f3030000
189-00000000000000000000000000000000000000000108b50003000000ef030000189+00000000000000000000000000000000000000000108b60003000000ef030000
190-00000000090000000000000000000000000000006e6574207469746c65000000190+00000000090000000000000000000000000000006e6574207469746c65000000
191-1c00b50001005000f30300000000000000000000000000000000000000000000191+1c00b60001005000f30300000000000000000000000000000000000000000000
192-0108b60003000000ef0300000000000009000000000000000000000000000000192+0108b70003000000ef0300000000000009000000000000000000000000000000
193-6e6574207469746c650000001c00b60001005000f30300000000000000000000193+6e6574207469746c650000001c00b70001005000f30300000000000000000000
194-0000000000000000000000000108b70003000000ef0300000000000009000000194+0000000000000000000000000108b80003000000ef0300000000000009000000
195-0000000000000000000000006e6574207469746c650000001c00b70001005000195+0000000000000000000000006e6574207469746c650000001c00b80001005000
196-f303000000000000000000000000000000000000000000000108b80003000000196+f303000000000000000000000000000000000000000000000108b90003000000
197-ef03000000000000090000000000000000000000000000006e6574207469746c197+ef03000000000000090000000000000000000000000000006e6574207469746c
198-650000001c00b80001005000f303000000000000000000000000000000000000198+650000001c00b90001005000f303000000000000000000000000000000000000
199-000000000108b90003000000ef03000000000000090000000000000000000000199+000000000108ba0003000000ef03000000000000090000000000000000000000
200-000000006e6574207469746c650000001c00b90001005000f303000000000000200+000000006e6574207469746c650000001c00ba0001005000f303000000000000
201-000000000000000000000000000000000108ba0003000000ef03000000000000201+000000000000000000000000000000000108bb0003000000ef03000000000000
202-090000000000000000000000000000006e6574207469746c650000001c00ba00202+090000000000000000000000000000006e6574207469746c650000001c00bb00
203-01005000f303000000000000000000000000000000000000000000000108bb00203+01005000f303000000000000000000000000000000000000000000000108bc00
204-03000000ef03000000000000090000000000000000000000000000006e657420204+03000000ef03000000000000090000000000000000000000000000006e657420
205-7469746c650000001c00bb0001005000f3030000000000000000000000000000205+7469746c650000001c00bc0001005000f3030000000000000000000000000000
206-00000000000000000108bc0003000000ef030000000000000900000000000000206+00000000000000000108bd0003000000ef030000000000000900000000000000
207-00000000000000006e6574207469746c650000001c00bc0001005000f3030000207+00000000000000006e6574207469746c650000001c00bd0001005000f3030000
208-00000000000000000000000000000000000000000108bd0003000000ef030000208+00000000000000000000000000000000000000000108be0003000000ef030000
209-00000000090000000000000000000000000000006e6574207469746c65000000209+00000000090000000000000000000000000000006e6574207469746c65000000
210-1c00bd0001005000f30300000000000000000000000000000000000000000000210+1c00be0001005000f30300000000000000000000000000000000000000000000
211-0108be0003000000ef0300000000000009000000000000000000000000000000211+0108bf0003000000ef0300000000000009000000000000000000000000000000
212-6e6574207469746c650000001c00be0001005000f30300000000000000000000212+6e6574207469746c650000001c00bf0001005000f30300000000000000000000
213-0000000000000000000000000108bf0003000000ef0300000000000009000000213+0000000000000000000000000108c00003000000ef0300000000000009000000
214-0000000000000000000000006e6574207469746c650000001c00bf0001005000214+0000000000000000000000006e6574207469746c650000001c00c00001005000
215-f303000000000000000000000000000000000000000000000108c00003000000215+f303000000000000000000000000000000000000000000000108c10003000000
216-ef03000000000000090000000000000000000000000000006e6574207469746c216+ef03000000000000090000000000000000000000000000006e6574207469746c
217-650000001c00c00001005000f303000000000000000000000000000000000000217+650000001c00c10001005000f303000000000000000000000000000000000000
218-000000000108c10003000000ef03000000000000090000000000000000000000218+000000000108c20003000000ef03000000000000090000000000000000000000
219-000000006e6574207469746c650000001c00c10001005000f303000000000000219+000000006e6574207469746c650000001c00c20001005000f303000000000000
220-000000000000000000000000000000000108c20003000000ef03000000000000220+000000000000000000000000000000000108c30003000000ef03000000000000
221-090000000000000000000000000000006e6574207469746c650000001c00c200221+090000000000000000000000000000006e6574207469746c650000001c00c300
222-01005000f303000000000000000000000000000000000000000000000108c300222+01005000f303000000000000000000000000000000000000000000000108c400
223-03000000ef03000000000000090000000000000000000000000000006e657420223+03000000ef03000000000000090000000000000000000000000000006e657420
224-7469746c650000001c00c30001005000f3030000000000000000000000000000224+7469746c650000001c00c40001005000f3030000000000000000000000000000
225-00000000000000000108c40003000000ef030000000000000900000000000000225+00000000000000000108c50003000000ef030000000000000900000000000000
226-00000000000000006e6574207469746c650000001c00c40001005000f3030000226+00000000000000006e6574207469746c650000001c00c50001005000f3030000
227-00000000000000000000000000000000000000000108c50003000000ef030000227+00000000000000000000000000000000000000000108c60003000000ef030000
228-00000000090000000000000000000000000000006e6574207469746c65000000228+00000000090000000000000000000000000000006e6574207469746c65000000
229-1c00c50001005000f30300000000000000000000000000000000000000000000229+1c00c60001005000f30300000000000000000000000000000000000000000000
230-0108c60003000000ef0300000000000009000000000000000000000000000000230+0108c70003000000ef0300000000000009000000000000000000000000000000
231-6e6574207469746c650000001c00c60001005000f30300000000000000000000231+6e6574207469746c650000001c00c70001005000f30300000000000000000000
232-0000000000000000000000000108c70003000000ef0300000000000009000000232+0000000000000000000000000108c80003000000ef0300000000000009000000
233-0000000000000000000000006e6574207469746c650000001c00c70001005000233+0000000000000000000000006e6574207469746c650000001c00c80001005000
234-f303000000000000000000000000000000000000000000000108c80003000000234+f303000000000000000000000000000000000000000000000108c90003000000
235-ef03000000000000090000000000000000000000000000006e6574207469746c235+ef03000000000000090000000000000000000000000000006e6574207469746c
236-650000001c00c80001005000f303000000000000000000000000000000000000236+650000001c00c90001005000f303000000000000000000000000000000000000
237-000000000108c90003000000ef03000000000000090000000000000000000000237+000000000108ca0003000000ef03000000000000090000000000000000000000
238-000000006e6574207469746c650000001c00c90001005000f303000000000000238+000000006e6574207469746c650000001c00ca0001005000f303000000000000
239-000000000000000000000000000000000108ca0003000000ef03000000000000239+000000000000000000000000000000000108cb0003000000ef03000000000000
240-090000000000000000000000000000006e6574207469746c650000001c00ca00240+090000000000000000000000000000006e6574207469746c650000001c00cb00
241-01005000f303000000000000000000000000000000000000000000000108cb00241+01005000f303000000000000000000000000000000000000000000000108cc00
242-03000000ef03000000000000090000000000000000000000000000006e657420242+03000000ef03000000000000090000000000000000000000000000006e657420
243-7469746c650000001c00cb0001005000f3030000000000000000000000000000243+7469746c650000001c00cc0001005000f3030000000000000000000000000000
244-00000000000000000108cc0003000000ef030000000000000900000000000000244+00000000000000000108cd0003000000ef030000000000000900000000000000
245-00000000000000006e6574207469746c650000001c00cc0001005000f3030000245+00000000000000006e6574207469746c650000001c00cd0001005000f3030000
246-00000000000000000000000000000000000000000108cd0003000000ef030000246+00000000000000000000000000000000000000000108ce0003000000ef030000
247-00000000090000000000000000000000000000006e6574207469746c65000000247+00000000090000000000000000000000000000006e6574207469746c65000000
248-1c00cd0001005000f30300000000000000000000000000000000000000000000248+1c00ce0001005000f30300000000000000000000000000000000000000000000
249-0108ce0003000000ef0300000000000009000000000000000000000000000000249+0108cf0003000000ef0300000000000009000000000000000000000000000000
250-6e6574207469746c650000001c00ce0001005000f30300000000000000000000250+6e6574207469746c650000001c00cf0001005000f30300000000000000000000
251-0000000000000000000000000108cf0003000000ef0300000000000009000000251+0000000000000000000000000108d00003000000ef0300000000000009000000
252-0000000000000000000000006e6574207469746c650000001c00cf0001005000252+0000000000000000000000006e6574207469746c650000001c00d00001005000
253-f303000000000000000000000000000000000000000000000108d00003000000253+f303000000000000000000000000000000000000000000000108d10003000000
254-ef03000000000000090000000000000000000000000000006e6574207469746c254+ef03000000000000090000000000000000000000000000006e6574207469746c
255-650000001c00d00001005000f303000000000000000000000000000000000000255+650000001c00d10001005000f303000000000000000000000000000000000000
256-000000000108d10003000000ef03000000000000090000000000000000000000256+000000000108d20003000000ef03000000000000090000000000000000000000
257-000000006e6574207469746c650000001c00d10001005000f303000000000000257+000000006e6574207469746c650000001c00d20001005000f303000000000000
258-000000000000000000000000000000000108d20003000000ef03000000000000258+000000000000000000000000000000000108d30003000000ef03000000000000
259-090000000000000000000000000000006e6574207469746c650000001c00d200259+090000000000000000000000000000006e6574207469746c650000001c00d300
260-01005000f303000000000000000000000000000000000000000000000108d300260+01005000f303000000000000000000000000000000000000000000000108d400
261-03000000ef03000000000000090000000000000000000000000000006e657420261+03000000ef03000000000000090000000000000000000000000000006e657420
262-7469746c650000001c00d30001005000f3030000000000000000000000000000262+7469746c650000001c00d40001005000f3030000000000000000000000000000
263-00000000000000000108d40003000000ef030000000000000900000000000000263+00000000000000000108d50003000000ef030000000000000900000000000000
264-00000000000000006e6574207469746c650000001c00d40001005000f3030000264+00000000000000006e6574207469746c650000001c00d50001005000f3030000
265-00000000000000000000000000000000000000000108d50003000000ef030000265+00000000000000000000000000000000000000000108d60003000000ef030000
266-00000000090000000000000000000000000000006e6574207469746c65000000266+00000000090000000000000000000000000000006e6574207469746c65000000
267-1c00d50001005000f30300000000000000000000000000000000000000000000267+1c00d60001005000f30300000000000000000000000000000000000000000000
268-0108d60003000000ef0300000000000009000000000000000000000000000000268+0108d70003000000ef0300000000000009000000000000000000000000000000
269-6e6574207469746c650000001c00d60001005000f30300000000000000000000269+6e6574207469746c650000001c00d70001005000f30300000000000000000000
270-0000000000000000000000000108d70003000000ef0300000000000009000000270+0000000000000000000000000108d80003000000ef0300000000000009000000
271-0000000000000000000000006e6574207469746c650000001c00d70001005000271+0000000000000000000000006e6574207469746c650000001c00d80001005000
272-f303000000000000000000000000000000000000000000000108d80003000000272+f303000000000000000000000000000000000000000000000108d90003000000
273-ef03000000000000090000000000000000000000000000006e6574207469746c273+ef03000000000000090000000000000000000000000000006e6574207469746c
274-650000001c00d80001005000f303000000000000000000000000000000000000274+650000001c00d90001005000f303000000000000000000000000000000000000
275-000000000108d90003000000ef03000000000000090000000000000000000000275+000000000108da0003000000ef03000000000000090000000000000000000000
276-000000006e6574207469746c650000001c00d90001005000f303000000000000276+000000006e6574207469746c650000001c00da0001005000f303000000000000
277-000000000000000000000000000000000108da0003000000ef03000000000000277+000000000000000000000000000000000108db0003000000ef03000000000000
278-090000000000000000000000000000006e6574207469746c650000001c00da00278+090000000000000000000000000000006e6574207469746c650000001c00db00
279-01005000f303000000000000000000000000000000000000000000000108db00279+01005000f303000000000000000000000000000000000000000000000108dc00
280-03000000ef03000000000000090000000000000000000000000000006e657420280+03000000ef03000000000000090000000000000000000000000000006e657420
281-7469746c650000001c00db0001005000f3030000000000000000000000000000281+7469746c650000001c00dc0001005000f3030000000000000000000000000000
282-00000000000000000108dc0003000000ef030000000000000900000000000000282+00000000000000000108dd0003000000ef030000000000000900000000000000
283-00000000000000006e6574207469746c650000001c00dc0001005000f3030000283+00000000000000006e6574207469746c650000001c00dd0001005000f3030000
284-00000000000000000000000000000000000000000108dd0003000000ef030000284+00000000000000000000000000000000000000000108de0003000000ef030000
285-00000000090000000000000000000000000000006e6574207469746c65000000285+00000000090000000000000000000000000000006e6574207469746c65000000
286-1c00dd0001005000f30300000000000000000000000000000000000000000000286+1c00de0001005000f30300000000000000000000000000000000000000000000
287-0108de0003000000ef0300000000000009000000000000000000000000000000287+0108df0003000000ef0300000000000009000000000000000000000000000000
288-6e6574207469746c650000001c00de0001005000f30300000000000000000000288+6e6574207469746c650000001c00df0001005000f30300000000000000000000
289-0000000000000000000000000108df0003000000ef0300000000000009000000289+0000000000000000000000000108e00003000000ef0300000000000009000000
290-0000000000000000000000006e6574207469746c650000001c00df0001005000290+0000000000000000000000006e6574207469746c650000001c00e00001005000
291-f303000000000000000000000000000000000000000000000108e00003000000291+f303000000000000000000000000000000000000000000000108e10003000000
292-ef03000000000000090000000000000000000000000000006e6574207469746c292+ef03000000000000090000000000000000000000000000006e6574207469746c
293-650000001c00e00001005000f303000000000000000000000000000000000000293+650000001c00e10001005000f303000000000000000000000000000000000000
294-000000000108e10003000000ef03000000000000090000000000000000000000294+000000000108e20003000000ef03000000000000090000000000000000000000
295-000000006e6574207469746c650000001c00e10001005000f303000000000000295+000000006e6574207469746c650000001c00e20001005000f303000000000000
296-000000000000000000000000000000000108e20003000000ef03000000000000296+000000000000000000000000000000000108e30003000000ef03000000000000
297-090000000000000000000000000000006e6574207469746c650000001c00e200297+090000000000000000000000000000006e6574207469746c650000001c00e300
298-01005000f303000000000000000000000000000000000000000000000108e300298+01005000f303000000000000000000000000000000000000000000000108e400
299-03000000ef03000000000000090000000000000000000000000000006e657420299+03000000ef03000000000000090000000000000000000000000000006e657420
300-7469746c650000001c00e30001005000f3030000000000000000000000000000300+7469746c650000001c00e40001005000f3030000000000000000000000000000
301-00000000000000000108e40003000000ef030000000000000900000000000000301+00000000000000000108e50003000000ef030000000000000900000000000000
302-00000000000000006e6574207469746c650000001c00e40001005000f3030000302+00000000000000006e6574207469746c650000001c00e50001005000f3030000
303-00000000000000000000000000000000000000000108e50003000000ef030000303+00000000000000000000000000000000000000000108e60003000000ef030000
304-00000000090000000000000000000000000000006e6574207469746c65000000304+00000000090000000000000000000000000000006e6574207469746c65000000
305-1c00e50001005000f30300000000000000000000000000000000000000000000305+1c00e60001005000f30300000000000000000000000000000000000000000000
306-0108e60003000000ef0300000000000009000000000000000000000000000000306+0108e70003000000ef0300000000000009000000000000000000000000000000
307-6e6574207469746c650000001c00e60001005000f30300000000000000000000307+6e6574207469746c650000001c00e70001005000f30300000000000000000000
308-0000000000000000000000000108e70003000000ef0300000000000009000000308+0000000000000000000000000108e80003000000ef0300000000000009000000
309-0000000000000000000000006e6574207469746c650000001c00e70001005000309+0000000000000000000000006e6574207469746c650000001c00e80001005000
310-f303000000000000000000000000000000000000000000000108e80003000000310+f303000000000000000000000000000000000000000000000108e90003000000
311-ef03000000000000090000000000000000000000000000006e6574207469746c311+ef03000000000000090000000000000000000000000000006e6574207469746c
312-650000001c00e80001005000f303000000000000000000000000000000000000312+650000001c00e90001005000f303000000000000000000000000000000000000
313-000000000108e90003000000ef03000000000000090000000000000000000000313+000000000108ea0003000000ef03000000000000090000000000000000000000
314-000000006e6574207469746c650000001c00e90001005000f303000000000000314+000000006e6574207469746c650000001c00ea0001005000f303000000000000
315-000000000000000000000000000000000108ea0003000000ef03000000000000315+000000000000000000000000000000000108eb0003000000ef03000000000000
316-090000000000000000000000000000006e6574207469746c650000001c00ea00316+090000000000000000000000000000006e6574207469746c650000001c00eb00
317-01005000f303000000000000000000000000000000000000000000000108eb00317+01005000f303000000000000000000000000000000000000000000000108ec00
318-03000000ef03000000000000090000000000000000000000000000006e657420318+03000000ef03000000000000090000000000000000000000000000006e657420
319-7469746c650000001c00eb0001005000f3030000000000000000000000000000319+7469746c650000001c00ec0001005000f3030000000000000000000000000000
320-00000000000000000108ec0003000000ef030000000000000900000000000000320+00000000000000000108ed0003000000ef030000000000000900000000000000
321-00000000000000006e6574207469746c650000001c00ec0001005000f3030000321+00000000000000006e6574207469746c650000001c00ed0001005000f3030000
322-00000000000000000000000000000000000000000108ed0003000000ef030000322+00000000000000000000000000000000000000000108ee0003000000ef030000
323-00000000090000000000000000000000000000006e6574207469746c65000000323+00000000090000000000000000000000000000006e6574207469746c65000000
324-1c00ed0001005000f30300000000000000000000000000000000000000000000324+1c00ee0001005000f30300000000000000000000000000000000000000000000
325-0108ee0003000000ef0300000000000009000000000000000000000000000000325+0108ef0003000000ef0300000000000009000000000000000000000000000000
326-6e6574207469746c650000001c00ee0001005000f30300000000000000000000326+6e6574207469746c650000001c00ef0001005000f30300000000000000000000
327-0000000000000000000000000108ef0003000000ef0300000000000009000000327+0000000000000000000000000108f00003000000ef0300000000000009000000
328-0000000000000000000000006e6574207469746c650000001c00ef0001005000328+0000000000000000000000006e6574207469746c650000001c00f00001005000
329-f303000000000000000000000000000000000000000000000108f00003000000329+f303000000000000000000000000000000000000000000000108f10003000000
330-ef03000000000000090000000000000000000000000000006e6574207469746c330+ef03000000000000090000000000000000000000000000006e6574207469746c
331-650000001c00f00001005000f303000000000000000000000000000000000000331+650000001c00f10001005000f303000000000000000000000000000000000000
332-000000000108f10003000000ef03000000000000090000000000000000000000332+000000000108f20003000000ef03000000000000090000000000000000000000
333-000000006e6574207469746c650000001c00f10001005000f303000000000000333+000000006e6574207469746c650000001c00f20001005000f303000000000000
334-000000000000000000000000000000000108f20003000000ef03000000000000334+000000000000000000000000000000000108f30003000000ef03000000000000
335-090000000000000000000000000000006e6574207469746c650000001c00f200335+090000000000000000000000000000006e6574207469746c650000001c00f300
336-01005000f303000000000000000000000000000000000000000000000108f300336+01005000f303000000000000000000000000000000000000000000000108f400
337-03000000ef03000000000000090000000000000000000000000000006e657420337+03000000ef03000000000000090000000000000000000000000000006e657420
338-7469746c650000001c00f30001005000f3030000000000000000000000000000338+7469746c650000001c00f40001005000f3030000000000000000000000000000
339-00000000000000000108f40003000000ef030000000000000900000000000000339+00000000000000000108f50003000000ef030000000000000900000000000000
340-00000000000000006e6574207469746c650000001c00f40001005000f3030000340+00000000000000006e6574207469746c650000001c00f50001005000f3030000
341-00000000000000000000000000000000000000000108f50003000000ef030000341+00000000000000000000000000000000000000000108f60003000000ef030000
342-00000000090000000000000000000000000000006e6574207469746c65000000342+00000000090000000000000000000000000000006e6574207469746c65000000
343-1c00f50001005000f30300000000000000000000000000000000000000000000343+1c00f60001005000f30300000000000000000000000000000000000000000000
344-0108f60003000000ef0300000000000009000000000000000000000000000000344+0108f70003000000ef0300000000000009000000000000000000000000000000
345-6e6574207469746c650000001c00f60001005000f30300000000000000000000345+6e6574207469746c650000001c00f70001005000f30300000000000000000000
346-0000000000000000000000000108f70003000000ef0300000000000009000000346+0000000000000000000000000108f80003000000ef0300000000000009000000
347-0000000000000000000000006e6574207469746c650000001c00f70001005000347+0000000000000000000000006e6574207469746c650000001c00f80001005000
348-f303000000000000000000000000000000000000000000000108f80003000000348+f303000000000000000000000000000000000000000000000108f90003000000
349-ef03000000000000090000000000000000000000000000006e6574207469746c349+ef03000000000000090000000000000000000000000000006e6574207469746c
350-650000001c00f80001005000f303000000000000000000000000000000000000350+650000001c00f90001005000f303000000000000000000000000000000000000
351-000000000108f90003000000ef03000000000000090000000000000000000000351+000000000108fa0003000000ef03000000000000090000000000000000000000
352-000000006e6574207469746c650000001c00f90001005000f303000000000000352+000000006e6574207469746c650000001c00fa0001005000f303000000000000
353-000000000000000000000000000000000108fa0003000000ef03000000000000353+000000000000000000000000000000000108fb0003000000ef03000000000000
354-090000000000000000000000000000006e6574207469746c650000001c00fa00354+090000000000000000000000000000006e6574207469746c650000001c00fb00
355-01005000f303000000000000000000000000000000000000000000000108fb00355+01005000f303000000000000000000000000000000000000000000000108fc00
356-03000000ef03000000000000090000000000000000000000000000006e657420356+03000000ef03000000000000090000000000000000000000000000006e657420
357-7469746c650000001c00fb0001005000f3030000000000000000000000000000357+7469746c650000001c00fc0001005000f3030000000000000000000000000000
358-00000000000000000108fc0003000000ef030000000000000900000000000000358+00000000000000000108fd0003000000ef030000000000000900000000000000
359-00000000000000006e6574207469746c650000001c00fc0001005000f3030000359+00000000000000006e6574207469746c650000001c00fd0001005000f3030000
360-00000000000000000000000000000000000000000108fd0003000000ef030000360+00000000000000000000000000000000000000000108fe0003000000ef030000
361-00000000090000000000000000000000000000006e6574207469746c65000000361+00000000090000000000000000000000000000006e6574207469746c65000000
362-1c00fd0001005000f30300000000000000000000000000000000000000000000362+1c00fe0001005000f30300000000000000000000000000000000000000000000
363-0108fe0003000000ef0300000000000009000000000000000000000000000000363+0108ff0003000000ef0300000000000009000000000000000000000000000000
364-6e6574207469746c650000001c00fe0001005000f30300000000000000000000364+6e6574207469746c650000001c00ff0001005000f30300000000000000000000
365-0000000000000000000000000108ff0003000000ef0300000000000009000000365+0000000000000000000000000108000103000000ef0300000000000009000000
366-0000000000000000000000006e6574207469746c650000001c00ff0001005000366+0000000000000000000000006e6574207469746c650000001c00000101005000
367-f303000000000000000000000000000000000000000000000108000103000000367+f303000000000000000000000000000000000000000000000108010103000000
368-ef03000000000000090000000000000000000000000000006e6574207469746c368+ef03000000000000090000000000000000000000000000006e6574207469746c
369-650000001c00000101005000f303000000000000000000000000000000000000369+650000001c00010101005000f303000000000000000000000000000000000000
370-000000000108010103000000ef03000000000000090000000000000000000000370+000000000108020103000000ef03000000000000090000000000000000000000
371-000000006e6574207469746c650000001c00010101005000f303000000000000371+000000006e6574207469746c650000001c00020101005000f303000000000000
372-000000000000000000000000000000000108020103000000ef03000000000000372+000000000000000000000000000000000108030103000000ef03000000000000
373-090000000000000000000000000000006e6574207469746c650000001c000201373+090000000000000000000000000000006e6574207469746c650000001c000301
374-01005000f3030000000000000000000000000000000000000000000001080301374+01005000f3030000000000000000000000000000000000000000000001080401
375-03000000ef03000000000000090000000000000000000000000000006e657420375+03000000ef03000000000000090000000000000000000000000000006e657420
376-7469746c650000001c00030101005000f3030000000000000000000000000000376+7469746c650000001c00040101005000f3030000000000000000000000000000
377-00000000000000000108040103000000ef030000000000000900000000000000377+00000000000000000108050103000000ef030000000000000900000000000000
378-00000000000000006e6574207469746c650000001c00040101005000f3030000378+00000000000000006e6574207469746c650000001c00050101005000f3030000
379-00000000000000000000000000000000000000000108050103000000ef030000379+00000000000000000000000000000000000000000108060103000000ef030000
380-00000000090000000000000000000000000000006e6574207469746c65000000380+00000000090000000000000000000000000000006e6574207469746c65000000
381-1c00050101005000f30300000000000000000000000000000000000000000000381+1c00060101005000f30300000000000000000000000000000000000000000000
382-0108060103000000ef0300000000000009000000000000000000000000000000382+0108070103000000ef0300000000000009000000000000000000000000000000
383-6e6574207469746c650000001c00060101005000f30300000000000000000000383+6e6574207469746c650000001c00070101005000f30300000000000000000000
384-0000000000000000000000000108070103000000ef0300000000000009000000384+0000000000000000000000000108080103000000ef0300000000000009000000
385-0000000000000000000000006e6574207469746c650000001c00070101005000385+0000000000000000000000006e6574207469746c650000001c00080101005000
386-f303000000000000000000000000000000000000000000000108080103000000386+f303000000000000000000000000000000000000000000000108090103000000
387-ef03000000000000090000000000000000000000000000006e6574207469746c387+ef03000000000000090000000000000000000000000000006e6574207469746c
388-650000001c00080101005000f303000000000000000000000000000000000000388+650000001c00090101005000f303000000000000000000000000000000000000
389-000000000108090103000000ef03000000000000090000000000000000000000389+0000000001080a0103000000ef03000000000000090000000000000000000000
390-000000006e6574207469746c650000001c00090101005000f303000000000000390+000000006e6574207469746c650000001c000a0101005000f303000000000000
391-0000000000000000000000000000000001080a0103000000ef03000000000000391+0000000000000000000000000000000001080b0103000000ef03000000000000
392-090000000000000000000000000000006e6574207469746c650000001c000a01392+090000000000000000000000000000006e6574207469746c650000001c000b01
393-01005000f3030000000000000000000000000000000000000000000001080b01393+01005000f3030000000000000000000000000000000000000000000001080c01
394-03000000ef03000000000000090000000000000000000000000000006e657420394+03000000ef03000000000000090000000000000000000000000000006e657420
395-7469746c650000001c000b0101005000f3030000000000000000000000000000395+7469746c650000001c000c0101005000f3030000000000000000000000000000
396-000000000000000001080c0103000000ef030000000000000900000000000000396+000000000000000001080d0103000000ef030000000000000900000000000000
397-00000000000000006e6574207469746c650000001c000c0101005000f3030000397+00000000000000006e6574207469746c650000001c000d0101005000f3030000
398-000000000000000000000000000000000000000001080d0103000000ef030000398+000000000000000000000000000000000000000001080e0103000000ef030000
399-00000000090000000000000000000000000000006e6574207469746c65000000399+00000000090000000000000000000000000000006e6574207469746c65000000
400-1c000d0101005000f30300000000000000000000000000000000000000000000400+1c000e0101005000f30300000000000000000000000000000000000000000000
401-01080e0103000000ef0300000000000009000000000000000000000000000000401+01080f0103000000ef0300000000000009000000000000000000000000000000
402-6e6574207469746c650000001c000e0101005000f30300000000000000000000402+6e6574207469746c650000001c000f0101005000f30300000000000000000000
403-00000000000000000000000001080f0103000000ef0300000000000009000000403+0000000000000000000000000108100103000000ef0300000000000009000000
404-0000000000000000000000006e6574207469746c650000001c000f0101005000404+0000000000000000000000006e6574207469746c650000001c00100101005000
405-f303000000000000000000000000000000000000000000000108100103000000405+f303000000000000000000000000000000000000000000000108110103000000
406-ef03000000000000090000000000000000000000000000006e6574207469746c406+ef03000000000000090000000000000000000000000000006e6574207469746c
407-650000001c00100101005000f303000000000000000000000000000000000000407+650000001c00110101005000f303000000000000000000000000000000000000
408-000000000108110103000000ef03000000000000090000000000000000000000408+000000000108120103000000ef03000000000000090000000000000000000000
409-000000006e6574207469746c650000001c00110101005000f303000000000000409+000000006e6574207469746c650000001c00120101005000f303000000000000
410-000000000000000000000000000000000108120103000000ef03000000000000410+000000000000000000000000000000000108130103000000ef03000000000000
411-090000000000000000000000000000006e6574207469746c650000001c001201411+090000000000000000000000000000006e6574207469746c650000001c001301
412-01005000f3030000000000000000000000000000000000000000000001081301412+01005000f3030000000000000000000000000000000000000000000001081401
413-03000000ef03000000000000090000000000000000000000000000006e657420413+03000000ef03000000000000090000000000000000000000000000006e657420
414-7469746c650000001c00130101005000f3030000000000000000000000000000414+7469746c650000001c00140101005000f3030000000000000000000000000000
415-00000000000000000108140103000000ef030000000000000900000000000000415+00000000000000000108150103000000ef030000000000000900000000000000
416-00000000000000006e6574207469746c650000001c00140101005000f3030000416+00000000000000006e6574207469746c650000001c00150101005000f3030000
417-00000000000000000000000000000000000000000108150103000000ef030000417+00000000000000000000000000000000000000000108160103000000ef030000
418-00000000090000000000000000000000000000006e6574207469746c65000000418+00000000090000000000000000000000000000006e6574207469746c65000000
419-1c00150101005000f30300000000000000000000000000000000000000000000419+1c00160101005000f30300000000000000000000000000000000000000000000
420-0108160103000000ef0300000000000009000000000000000000000000000000420+0108170103000000ef0300000000000009000000000000000000000000000000
421-6e6574207469746c650000001c00160101005000f30300000000000000000000421+6e6574207469746c650000001c00170101005000f30300000000000000000000
422-0000000000000000000000000108170103000000ef0300000000000009000000422+0000000000000000000000000108180103000000ef0300000000000009000000
423-0000000000000000000000006e6574207469746c650000001c00170101005000423+0000000000000000000000006e6574207469746c650000001c00180101005000
424-f303000000000000000000000000000000000000000000000108180103000000424+f303000000000000000000000000000000000000000000000108190103000000
425-ef03000000000000090000000000000000000000000000006e6574207469746c425+ef03000000000000090000000000000000000000000000006e6574207469746c
426-650000001c00180101005000f303000000000000000000000000000000000000426+650000001c00190101005000f303000000000000000000000000000000000000
427-000000000108190103000000ef03000000000000090000000000000000000000427+0000000001081a0103000000ef03000000000000090000000000000000000000
428-000000006e6574207469746c650000001c00190101005000f303000000000000428+000000006e6574207469746c650000001c001a0101005000f303000000000000
429-0000000000000000000000000000000001081a0103000000ef03000000000000429+0000000000000000000000000000000001081b0103000000ef03000000000000
430-090000000000000000000000000000006e6574207469746c650000001c001a01430+090000000000000000000000000000006e6574207469746c650000001c001b01
431-01005000f3030000000000000000000000000000000000000000000001081b01431+01005000f3030000000000000000000000000000000000000000000001081c01
432-03000000ef03000000000000090000000000000000000000000000006e657420432+03000000ef03000000000000090000000000000000000000000000006e657420
433-7469746c650000001c001b0101005000f3030000000000000000000000000000433+7469746c650000001c001c0101005000f3030000000000000000000000000000
434-000000000000000001081c0103000000ef030000000000000900000000000000434+000000000000000001081d0103000000ef030000000000000900000000000000
435-00000000000000006e6574207469746c650000001c001c0101005000f3030000435+00000000000000006e6574207469746c650000001c001d0101005000f3030000
436-000000000000000000000000000000000000000001081d0103000000ef030000436+000000000000000000000000000000000000000001081e0103000000ef030000
437-00000000090000000000000000000000000000006e6574207469746c65000000437+00000000090000000000000000000000000000006e6574207469746c65000000
438-1c001d0101005000f30300000000000000000000000000000000000000000000438+1c001e0101005000f30300000000000000000000000000000000000000000000
439-01081e0103000000ef0300000000000009000000000000000000000000000000439+01081f0103000000ef0300000000000009000000000000000000000000000000
440-6e6574207469746c650000001c001e0101005000f30300000000000000000000440+6e6574207469746c650000001c001f0101005000f30300000000000000000000
441-00000000000000000000000001081f0103000000ef0300000000000009000000441+0000000000000000000000000108200103000000ef0300000000000009000000
442-0000000000000000000000006e6574207469746c650000001c001f0101005000442+0000000000000000000000006e6574207469746c650000001c00200101005000
443-f303000000000000000000000000000000000000000000000108200103000000443+f303000000000000000000000000000000000000000000000108210103000000
444-ef03000000000000090000000000000000000000000000006e6574207469746c444+ef03000000000000090000000000000000000000000000006e6574207469746c
445-650000001c00200101005000f303000000000000000000000000000000000000445+650000001c00210101005000f303000000000000000000000000000000000000
446-000000000108210103000000ef03000000000000090000000000000000000000446+000000000108220103000000ef03000000000000090000000000000000000000
447-000000006e6574207469746c650000001c00210101005000f303000000000000447+000000006e6574207469746c650000001c00220101005000f303000000000000
448-000000000000000000000000000000000108220103000000ef03000000000000448+000000000000000000000000000000000108230103000000ef03000000000000
449-090000000000000000000000000000006e6574207469746c650000001c002201449+090000000000000000000000000000006e6574207469746c650000001c002301
450-01005000f3030000000000000000000000000000000000000000000001082301450+01005000f3030000000000000000000000000000000000000000000001082401
451-03000000ef03000000000000090000000000000000000000000000006e657420451+03000000ef03000000000000090000000000000000000000000000006e657420
452-7469746c650000001c00230101005000f3030000000000000000000000000000452+7469746c650000001c00240101005000f3030000000000000000000000000000
453-00000000000000000108240103000000ef030000000000000900000000000000453+00000000000000000108250103000000ef030000000000000900000000000000
454-00000000000000006e6574207469746c650000001c00240101005000f3030000454+00000000000000006e6574207469746c650000001c00250101005000f3030000
455-00000000000000000000000000000000000000000108250103000000ef030000455+00000000000000000000000000000000000000000108260103000000ef030000
456-00000000090000000000000000000000000000006e6574207469746c65000000456+00000000090000000000000000000000000000006e6574207469746c65000000
457-1c00250101005000f30300000000000000000000000000000000000000000000457+1c00260101005000f30300000000000000000000000000000000000000000000
458-0108260103000000ef0300000000000009000000000000000000000000000000458+0108270103000000ef0300000000000009000000000000000000000000000000
459-6e6574207469746c650000001c00260101005000f30300000000000000000000459+6e6574207469746c650000001c00270101005000f30300000000000000000000
460-0000000000000000000000000108270103000000ef0300000000000009000000460+0000000000000000000000000108280103000000ef0300000000000009000000
461-0000000000000000000000006e6574207469746c650000001c00270101005000461+0000000000000000000000006e6574207469746c650000001c00280101005000
462-f303000000000000000000000000000000000000000000000108280103000000462+f303000000000000000000000000000000000000000000000108290103000000
463-ef03000000000000090000000000000000000000000000006e6574207469746c463+ef03000000000000090000000000000000000000000000006e6574207469746c
464-650000001c00280101005000f303000000000000000000000000000000000000464+650000001c00290101005000f303000000000000000000000000000000000000
465-000000000108290103000000ef03000000000000090000000000000000000000465+0000000001082a0103000000ef03000000000000090000000000000000000000
466-000000006e6574207469746c650000001c00290101005000f303000000000000466+000000006e6574207469746c650000001c002a0101005000f303000000000000
467-0000000000000000000000000000000001082a0103000000ef03000000000000467+0000000000000000000000000000000001082b0103000000ef03000000000000
468-090000000000000000000000000000006e6574207469746c650000001c002a01468+090000000000000000000000000000006e6574207469746c650000001c002b01
469-01005000f3030000000000000000000000000000000000000000000001082b01469+01005000f3030000000000000000000000000000000000000000000001082c01
470-03000000ef03000000000000090000000000000000000000000000006e657420470+03000000ef03000000000000090000000000000000000000000000006e657420
471-7469746c650000001c002b0101005000f3030000000000000000000000000000471+7469746c650000001c002c0101005000f3030000000000000000000000000000
472-000000000000000001082c0103000000ef030000000000000900000000000000472+000000000000000001082d0103000000ef030000000000000900000000000000
473-00000000000000006e6574207469746c650000001c002c0101005000f3030000473+00000000000000006e6574207469746c650000001c002d0101005000f3030000
474-000000000000000000000000000000000000000001082d0103000000ef030000474+000000000000000000000000000000000000000001082e0103000000ef030000
475-00000000090000000000000000000000000000006e6574207469746c65000000475+00000000090000000000000000000000000000006e6574207469746c65000000
476-1c002d0101005000f30300000000000000000000000000000000000000000000476+1c002e0101005000f30300000000000000000000000000000000000000000000
477-01082e0103000000ef0300000000000009000000000000000000000000000000477+01082f0103000000ef0300000000000009000000000000000000000000000000
478-6e6574207469746c650000001c002e0101005000f30300000000000000000000478+6e6574207469746c650000001c002f0101005000f30300000000000000000000
479-00000000000000000000000001082f0103000000ef0300000000000009000000479+0000000000000000000000000108300103000000ef0300000000000009000000
480-0000000000000000000000006e6574207469746c650000001c002f0101005000480+0000000000000000000000006e6574207469746c650000001c00300101005000
481-f303000000000000000000000000000000000000000000000108300103000000481+f303000000000000000000000000000000000000000000000108310103000000
482-ef03000000000000090000000000000000000000000000006e6574207469746c482+ef03000000000000090000000000000000000000000000006e6574207469746c
483-650000001c00300101005000f303000000000000000000000000000000000000483+650000001c00310101005000f303000000000000000000000000000000000000
484-000000000108310103000000ef03000000000000090000000000000000000000484+000000000108320103000000ef03000000000000090000000000000000000000
485-000000006e6574207469746c650000001c00310101005000f303000000000000485+000000006e6574207469746c650000001c00320101005000f303000000000000
486-000000000000000000000000000000000108320103000000ef03000000000000486+000000000000000000000000000000000108330103000000ef03000000000000
487-090000000000000000000000000000006e6574207469746c650000001c003201487+090000000000000000000000000000006e6574207469746c650000001c003301
488-01005000f3030000000000000000000000000000000000000000000001083301488+01005000f3030000000000000000000000000000000000000000000001083401
489-03000000ef03000000000000090000000000000000000000000000006e657420489+03000000ef03000000000000090000000000000000000000000000006e657420
490-7469746c650000001c00330101005000f3030000000000000000000000000000490+7469746c650000001c00340101005000f3030000000000000000000000000000
491-00000000000000000108340103000000ef030000000000000900000000000000491+00000000000000000108350103000000ef030000000000000900000000000000
492-00000000000000006e6574207469746c650000001c00340101005000f3030000492+00000000000000006e6574207469746c650000001c00350101005000f3030000
493-00000000000000000000000000000000000000000108350103000000ef030000493+00000000000000000000000000000000000000000108360103000000ef030000
494-00000000090000000000000000000000000000006e6574207469746c65000000494+00000000090000000000000000000000000000006e6574207469746c65000000
495-1c00350101005000f30300000000000000000000000000000000000000000000495+1c00360101005000f30300000000000000000000000000000000000000000000
496-0108360103000000ef0300000000000009000000000000000000000000000000496+0108370103000000ef0300000000000009000000000000000000000000000000
497-6e6574207469746c650000001c00360101005000f30300000000000000000000497+6e6574207469746c650000001c00370101005000f30300000000000000000000
498-0000000000000000000000000108370103000000ef0300000000000009000000498+0000000000000000000000000108380103000000ef0300000000000009000000
499-0000000000000000000000006e6574207469746c650000001c00370101005000499+0000000000000000000000006e6574207469746c650000001c00380101005000
500-f303000000000000000000000000000000000000000000000108380103000000500+f303000000000000000000000000000000000000000000000108390103000000
501-ef03000000000000090000000000000000000000000000006e6574207469746c501+ef03000000000000090000000000000000000000000000006e6574207469746c
502-650000001c00380101005000f303000000000000000000000000000000000000502+650000001c00390101005000f303000000000000000000000000000000000000
503-000000000108390103000000ef03000000000000090000000000000000000000503+0000000001083a0103000000ef03000000000000090000000000000000000000
504-000000006e6574207469746c650000001c00390101005000f303000000000000504+000000006e6574207469746c650000001c003a0101005000f303000000000000
505-0000000000000000000000000000000001083a0103000000ef03000000000000505+0000000000000000000000000000000001083b0103000000ef03000000000000
506-090000000000000000000000000000006e6574207469746c650000001c003a01506+090000000000000000000000000000006e6574207469746c650000001c003b01
507-01005000f3030000000000000000000000000000000000000000000001083b01507+01005000f3030000000000000000000000000000000000000000000001083c01
508-03000000ef03000000000000090000000000000000000000000000006e657420508+03000000ef03000000000000090000000000000000000000000000006e657420
509-7469746c650000001c003b0101005000f3030000000000000000000000000000509+7469746c650000001c003c0101005000f3030000000000000000000000000000
510-000000000000000001083c0103000000ef030000000000000900000000000000510+000000000000000001083d0103000000ef030000000000000900000000000000
511-00000000000000006e6574207469746c650000001c003c0101005000f3030000511+00000000000000006e6574207469746c650000001c003d0101005000f3030000
512-000000000000000000000000000000000000000001083d0103000000ef030000512+000000000000000000000000000000000000000001083e0103000000ef030000
513-00000000090000000000000000000000000000006e6574207469746c65000000513+00000000090000000000000000000000000000006e6574207469746c65000000
514-1c003d0101005000f30300000000000000000000000000000000000000000000514+1c003e0101005000f30300000000000000000000000000000000000000000000
515-01083e0103000000ef0300000000000009000000000000000000000000000000515+01083f0103000000ef0300000000000009000000000000000000000000000000
516-6e6574207469746c650000001c003e0101005000f30300000000000000000000516+6e6574207469746c650000001c003f0101005000f30300000000000000000000
517-00000000000000000000000001083f0103000000ef0300000000000009000000517+0000000000000000000000000108400103000000ef0300000000000009000000
518-0000000000000000000000006e6574207469746c650000001c003f0101005000518+0000000000000000000000006e6574207469746c650000001c00400101005000
519-f303000000000000000000000000000000000000000000000108400103000000519+f303000000000000000000000000000000000000000000000108410103000000
520-ef03000000000000090000000000000000000000000000006e6574207469746c520+ef03000000000000090000000000000000000000000000006e6574207469746c
521-650000001c00400101005000f303000000000000000000000000000000000000521+650000001c00410101005000f303000000000000000000000000000000000000
522-000000000108410103000000ef03000000000000090000000000000000000000522+000000000108420103000000ef03000000000000090000000000000000000000
523-000000006e6574207469746c650000001c00410101005000f303000000000000523+000000006e6574207469746c650000001c00420101005000f303000000000000
524-000000000000000000000000000000000108420103000000ef03000000000000524+000000000000000000000000000000000108430103000000ef03000000000000
525-090000000000000000000000000000006e6574207469746c650000001c004201525+090000000000000000000000000000006e6574207469746c650000001c004301
526-01005000f3030000000000000000000000000000000000000000000001084301526+01005000f3030000000000000000000000000000000000000000000001084401
527-03000000ef03000000000000090000000000000000000000000000006e657420527+03000000ef03000000000000090000000000000000000000000000006e657420
528-7469746c650000001c00430101005000f3030000000000000000000000000000528+7469746c650000001c00440101005000f3030000000000000000000000000000
529-00000000000000000108440103000000ef030000000000000900000000000000529+00000000000000000108450103000000ef030000000000000900000000000000
530-00000000000000006e6574207469746c650000001c00440101005000f3030000530+00000000000000006e6574207469746c650000001c00450101005000f3030000
531-00000000000000000000000000000000000000000108450103000000ef030000531+00000000000000000000000000000000000000000108460103000000ef030000
532-00000000090000000000000000000000000000006e6574207469746c65000000532+00000000090000000000000000000000000000006e6574207469746c65000000
533-1c00450101005000f30300000000000000000000000000000000000000000000533+1c00460101005000f30300000000000000000000000000000000000000000000
534-0108460103000000ef0300000000000009000000000000000000000000000000534+0108470103000000ef0300000000000009000000000000000000000000000000
535-6e6574207469746c650000001c00460101005000f30300000000000000000000535+6e6574207469746c650000001c00470101005000f30300000000000000000000
536-0000000000000000000000000108470103000000ef0300000000000009000000536+0000000000000000000000000108480103000000ef0300000000000009000000
537-0000000000000000000000006e6574207469746c650000001c00470101005000537+0000000000000000000000006e6574207469746c650000001c00480101005000
538-f303000000000000000000000000000000000000000000000108480103000000538+f303000000000000000000000000000000000000000000000108490103000000
539-ef03000000000000090000000000000000000000000000006e6574207469746c539+ef03000000000000090000000000000000000000000000006e6574207469746c
540-650000001c00480101005000f303000000000000000000000000000000000000540+650000001c00490101005000f303000000000000000000000000000000000000
541-000000000108490103000000ef03000000000000090000000000000000000000541+0000000001084a0103000000ef03000000000000090000000000000000000000
542-000000006e6574207469746c650000001c00490101005000f303000000000000542+000000006e6574207469746c650000001c004a0101005000f303000000000000
543-0000000000000000000000000000000001084a0103000000ef03000000000000543+0000000000000000000000000000000001084b0103000000ef03000000000000
544-090000000000000000000000000000006e6574207469746c650000001c004a01544+090000000000000000000000000000006e6574207469746c650000001c004b01
545-01005000f3030000000000000000000000000000000000000000000001084b01545+01005000f3030000000000000000000000000000000000000000000001084c01
546-03000000ef03000000000000090000000000000000000000000000006e657420546+03000000ef03000000000000090000000000000000000000000000006e657420
547-7469746c650000001c004b0101005000f3030000000000000000000000000000547+7469746c650000001c004c0101005000f3030000000000000000000000000000
548-000000000000000001084c0103000000ef030000000000000900000000000000548+000000000000000001084d0103000000ef030000000000000900000000000000
549-00000000000000006e6574207469746c650000001c004c0101005000f3030000549+00000000000000006e6574207469746c650000001c004d0101005000f3030000
550-000000000000000000000000000000000000000001084d0103000000ef030000550+000000000000000000000000000000000000000001084e0103000000ef030000
551-00000000090000000000000000000000000000006e6574207469746c65000000551+00000000090000000000000000000000000000006e6574207469746c65000000
552-1c004d0101005000f30300000000000000000000000000000000000000000000552+1c004e0101005000f30300000000000000000000000000000000000000000000
553-01084e0103000000ef0300000000000009000000000000000000000000000000553+01084f0103000000ef0300000000000009000000000000000000000000000000
554-6e6574207469746c650000001c004e0101005000f30300000000000000000000554+6e6574207469746c650000001c004f0101005000f30300000000000000000000
555-00000000000000000000000001084f0103000000ef0300000000000009000000555+0000000000000000000000000108500103000000ef0300000000000009000000
556-0000000000000000000000006e6574207469746c650000001c004f0101005000556+0000000000000000000000006e6574207469746c650000001c00500101005000
557-f303000000000000000000000000000000000000000000000108500103000000557+f303000000000000000000000000000000000000000000000108510103000000
558-ef03000000000000090000000000000000000000000000006e6574207469746c558+ef03000000000000090000000000000000000000000000006e6574207469746c
559-650000001c00500101005000f303000000000000000000000000000000000000559+650000001c00510101005000f303000000000000000000000000000000000000
560-000000000108510103000000ef03000000000000090000000000000000000000560+000000000108520103000000ef03000000000000090000000000000000000000
561-000000006e6574207469746c650000001c00510101005000f303000000000000561+000000006e6574207469746c650000001c00520101005000f303000000000000
562-000000000000000000000000000000000108520103000000ef03000000000000562+000000000000000000000000000000000108530103000000ef03000000000000
563-090000000000000000000000000000006e6574207469746c650000001c005201563+090000000000000000000000000000006e6574207469746c650000001c005301
564-01005000f3030000000000000000000000000000000000000000000001085301564+01005000f3030000000000000000000000000000000000000000000001085401
565-03000000ef03000000000000090000000000000000000000000000006e657420565+03000000ef03000000000000090000000000000000000000000000006e657420
566-7469746c650000001c00530101005000f3030000000000000000000000000000566+7469746c650000001c00540101005000f3030000000000000000000000000000
567-00000000000000000108540103000000ef030000000000000900000000000000567+00000000000000000108550103000000ef030000000000000900000000000000
568-00000000000000006e6574207469746c650000001c00540101005000f3030000568+00000000000000006e6574207469746c650000001c00550101005000f3030000
569-00000000000000000000000000000000000000000108550103000000ef030000569+00000000000000000000000000000000000000000108560103000000ef030000
570-00000000090000000000000000000000000000006e6574207469746c65000000570+00000000090000000000000000000000000000006e6574207469746c65000000
571-1c00550101005000f30300000000000000000000000000000000000000000000571+1c00560101005000f30300000000000000000000000000000000000000000000
572-0108560103000000ef0300000000000009000000000000000000000000000000572+0108570103000000ef0300000000000009000000000000000000000000000000
573-6e6574207469746c650000001c00560101005000f30300000000000000000000573+6e6574207469746c650000001c00570101005000f30300000000000000000000
574-0000000000000000000000000108570103000000ef0300000000000009000000574+0000000000000000000000000108580103000000ef0300000000000009000000
575-0000000000000000000000006e6574207469746c650000001c00570101005000575+0000000000000000000000006e6574207469746c650000001c00580101005000
576-f303000000000000000000000000000000000000000000000108580103000000576+f303000000000000000000000000000000000000000000000108590103000000
577-ef03000000000000090000000000000000000000000000006e6574207469746c577+ef03000000000000090000000000000000000000000000006e6574207469746c
578-650000001c00580101005000f303000000000000000000000000000000000000578+650000001c00590101005000f303000000000000000000000000000000000000
579-000000000108590103000000ef03000000000000090000000000000000000000579+0000000001085a0103000000ef03000000000000090000000000000000000000
580-000000006e6574207469746c650000001c00590101005000f303000000000000580+000000006e6574207469746c650000001c005a0101005000f303000000000000
581-0000000000000000000000000000000001085a0103000000ef03000000000000581+0000000000000000000000000000000001085b0103000000ef03000000000000
582-090000000000000000000000000000006e6574207469746c650000001c005a01582+090000000000000000000000000000006e6574207469746c650000001c005b01
583-01005000f3030000000000000000000000000000000000000000000001085b01583+01005000f3030000000000000000000000000000000000000000000001085c01
584-03000000ef03000000000000090000000000000000000000000000006e657420584+03000000ef03000000000000090000000000000000000000000000006e657420
585-7469746c650000001c005b0101005000f3030000000000000000000000000000585+7469746c650000001c005c0101005000f3030000000000000000000000000000
586-000000000000000001085c0103000000ef030000000000000900000000000000586+000000000000000001085d0103000000ef030000000000000900000000000000
587-00000000000000006e6574207469746c650000001c005c0101005000f3030000587+00000000000000006e6574207469746c650000001c005d0101005000f3030000
588-000000000000000000000000000000000000000001085d0103000000ef030000588+000000000000000000000000000000000000000001085e0103000000ef030000
589-00000000090000000000000000000000000000006e6574207469746c65000000589+00000000090000000000000000000000000000006e6574207469746c65000000
590-1c005d0101005000f30300000000000000000000000000000000000000000000590+1c005e0101005000f30300000000000000000000000000000000000000000000
591-01085e0103000000ef0300000000000009000000000000000000000000000000591+01085f0103000000ef0300000000000009000000000000000000000000000000
592-6e6574207469746c650000001c005e0101005000f30300000000000000000000592+6e6574207469746c650000001c005f0101005000f30300000000000000000000
593-00000000000000000000000001085f0103000000ef0300000000000009000000593+0000000000000000000000000108600103000000ef0300000000000009000000
594-0000000000000000000000006e6574207469746c650000001c005f0101005000594+0000000000000000000000006e6574207469746c650000001c00600101005000
595-f303000000000000000000000000000000000000000000000108600103000000595+f303000000000000000000000000000000000000000000000108610103000000
596-ef03000000000000090000000000000000000000000000006e6574207469746c596+ef03000000000000090000000000000000000000000000006e6574207469746c
597-650000001c00600101005000f303000000000000000000000000000000000000597+650000001c00610101005000f303000000000000000000000000000000000000
598-000000000108610103000000ef03000000000000090000000000000000000000598+000000000108620103000000ef03000000000000090000000000000000000000
599-000000006e6574207469746c650000001c00610101005000f303000000000000599+000000006e6574207469746c650000001c00620101005000f303000000000000
600-000000000000000000000000000000000108620103000000ef03000000000000600+000000000000000000000000000000000108630103000000ef03000000000000
601-090000000000000000000000000000006e6574207469746c650000001c006201601+090000000000000000000000000000006e6574207469746c650000001c006301
602-01005000f3030000000000000000000000000000000000000000000001086301602+01005000f3030000000000000000000000000000000000000000000001086401
603-03000000ef03000000000000090000000000000000000000000000006e657420603+03000000ef03000000000000090000000000000000000000000000006e657420
604-7469746c650000001c00630101005000f3030000000000000000000000000000604+7469746c650000001c00640101005000f3030000000000000000000000000000
605-00000000000000000108640103000000ef030000000000000900000000000000605+00000000000000000108650103000000ef030000000000000900000000000000
606-00000000000000006e6574207469746c650000001c00640101005000f3030000606+00000000000000006e6574207469746c650000001c00650101005000f3030000
607-00000000000000000000000000000000000000000108650103000000ef030000607+00000000000000000000000000000000000000000108660103000000ef030000
608-00000000090000000000000000000000000000006e6574207469746c65000000608+00000000090000000000000000000000000000006e6574207469746c65000000
609-1c00650101005000f30300000000000000000000000000000000000000000000609+1c00660101005000f30300000000000000000000000000000000000000000000
610-0108660103000000ef0300000000000009000000000000000000000000000000610+0108670103000000ef0300000000000009000000000000000000000000000000
611-6e6574207469746c650000001c00660101005000f30300000000000000000000611+6e6574207469746c650000001c00670101005000f30300000000000000000000
612-0000000000000000000000000108670103000000ef0300000000000009000000612+0000000000000000000000000108680103000000ef0300000000000009000000
613-0000000000000000000000006e6574207469746c650000001c00670101005000613+0000000000000000000000006e6574207469746c650000001c00680101005000
614-f303000000000000000000000000000000000000000000000108680103000000614+f303000000000000000000000000000000000000000000000108690103000000
615-ef03000000000000090000000000000000000000000000006e6574207469746c615+ef03000000000000090000000000000000000000000000006e6574207469746c
616-650000001c00680101005000f303000000000000000000000000000000000000616+650000001c00690101005000f303000000000000000000000000000000000000
617-000000000108690103000000ef03000000000000090000000000000000000000617+0000000001086a0103000000ef03000000000000090000000000000000000000
618-000000006e6574207469746c650000001c00690101005000f303000000000000618+000000006e6574207469746c650000001c006a0101005000f303000000000000
619-0000000000000000000000000000000001086a0103000000ef03000000000000619+0000000000000000000000000000000001086b0103000000ef03000000000000
620-090000000000000000000000000000006e6574207469746c650000001c006a01620+090000000000000000000000000000006e6574207469746c650000001c006b01
621-01005000f3030000000000000000000000000000000000000000000001086b01621+01005000f3030000000000000000000000000000000000000000000001086c01
622-03000000ef03000000000000090000000000000000000000000000006e657420622+03000000ef03000000000000090000000000000000000000000000006e657420
623-7469746c650000001c006b0101005000f3030000000000000000000000000000623+7469746c650000001c006c0101005000f3030000000000000000000000000000
624-000000000000000001086c0103000000ef030000000000000900000000000000624+000000000000000001086d0103000000ef030000000000000900000000000000
625-00000000000000006e6574207469746c650000001c006c0101005000f3030000625+00000000000000006e6574207469746c650000001c006d0101005000f3030000
626-000000000000000000000000000000000000000001086d0103000000ef030000626+000000000000000000000000000000000000000001086e0103000000ef030000
627-00000000090000000000000000000000000000006e6574207469746c65000000627+00000000090000000000000000000000000000006e6574207469746c65000000
628-1c006d0101005000f30300000000000000000000000000000000000000000000628+1c006e0101005000f30300000000000000000000000000000000000000000000
629-01086e0103000000ef0300000000000009000000000000000000000000000000629+01086f0103000000ef0300000000000009000000000000000000000000000000
630-6e6574207469746c650000001c006e0101005000f30300000000000000000000630+6e6574207469746c650000001c006f0101005000f30300000000000000000000
631-00000000000000000000000001086f0103000000ef0300000000000009000000631+0000000000000000000000000108700103000000ef0300000000000009000000
632-0000000000000000000000006e6574207469746c650000001c006f0101005000632+0000000000000000000000006e6574207469746c650000001c00700101005000
633-f303000000000000000000000000000000000000000000000108700103000000633+f303000000000000000000000000000000000000000000000108710103000000
634-ef03000000000000090000000000000000000000000000006e6574207469746c634+ef03000000000000090000000000000000000000000000006e6574207469746c
635-650000001c00700101005000f303000000000000000000000000000000000000635+650000001c00710101005000f303000000000000000000000000000000000000
636-000000000108710103000000ef03000000000000090000000000000000000000636+000000000108720103000000ef03000000000000090000000000000000000000
637-000000006e6574207469746c650000001c00710101005000f303000000000000637+000000006e6574207469746c650000001c00720101005000f303000000000000
638-000000000000000000000000000000000108720103000000ef03000000000000638+000000000000000000000000000000000108730103000000ef03000000000000
639-090000000000000000000000000000006e6574207469746c650000001c007201639+090000000000000000000000000000006e6574207469746c650000001c007301
640-01005000f3030000000000000000000000000000000000000000000001087301640+01005000f3030000000000000000000000000000000000000000000001087401
641-03000000ef03000000000000090000000000000000000000000000006e657420641+03000000ef03000000000000090000000000000000000000000000006e657420
642-7469746c650000001c00730101005000f3030000000000000000000000000000642+7469746c650000001c00740101005000f3030000000000000000000000000000
643-00000000000000000108740103000000ef030000000000000900000000000000643+00000000000000000108750103000000ef030000000000000900000000000000
644-00000000000000006e6574207469746c650000001c00740101005000f3030000644+00000000000000006e6574207469746c650000001c00750101005000f3030000
645-00000000000000000000000000000000000000000108750103000000ef030000645+00000000000000000000000000000000000000000108760103000000ef030000
646-00000000090000000000000000000000000000006e6574207469746c65000000646+00000000090000000000000000000000000000006e6574207469746c65000000
647-1c00750101005000f30300000000000000000000000000000000000000000000647+1c00760101005000f30300000000000000000000000000000000000000000000
648-0108760103000000ef0300000000000009000000000000000000000000000000648+0108770103000000ef0300000000000009000000000000000000000000000000
649-6e6574207469746c650000001c00760101005000f30300000000000000000000649+6e6574207469746c650000001c00770101005000f30300000000000000000000
650-0000000000000000000000000108770103000000ef0300000000000009000000650+0000000000000000000000000108780103000000ef0300000000000009000000
651-0000000000000000000000006e6574207469746c650000001c00770101005000651+0000000000000000000000006e6574207469746c650000001c00780101005000
652-f303000000000000000000000000000000000000000000000108780103000000652+f303000000000000000000000000000000000000000000000108790103000000
653-ef03000000000000090000000000000000000000000000006e6574207469746c653+ef03000000000000090000000000000000000000000000006e6574207469746c
654-650000001c00780101005000f303000000000000000000000000000000000000654+650000001c00790101005000f303000000000000000000000000000000000000
655-000000000108790103000000ef03000000000000090000000000000000000000655+0000000001087a0103000000ef03000000000000090000000000000000000000
656-000000006e6574207469746c650000001c00790101005000f303000000000000656+000000006e6574207469746c650000001c007a0101005000f303000000000000
657-0000000000000000000000000000000001087a0103000000ef03000000000000657+0000000000000000000000000000000001087b0103000000ef03000000000000
658-090000000000000000000000000000006e6574207469746c650000001c007a01658+090000000000000000000000000000006e6574207469746c650000001c007b01
659-01005000f3030000000000000000000000000000000000000000000001087b01659+01005000f3030000000000000000000000000000000000000000000001087c01
660-03000000ef03000000000000090000000000000000000000000000006e657420660+03000000ef03000000000000090000000000000000000000000000006e657420
661-7469746c650000001c007b0101005000f3030000000000000000000000000000661+7469746c650000001c007c0101005000f3030000000000000000000000000000
662-000000000000000001087c0103000000ef030000000000000900000000000000662+000000000000000001087d0103000000ef030000000000000900000000000000
663-00000000000000006e6574207469746c650000001c007c0101005000f3030000663+00000000000000006e6574207469746c650000001c007d0101005000f3030000
664-000000000000000000000000000000000000000001087d0103000000ef030000664+000000000000000000000000000000000000000001087e0103000000ef030000
665-00000000090000000000000000000000000000006e6574207469746c65000000665+00000000090000000000000000000000000000006e6574207469746c65000000
666-1c007d0101005000f30300000000000000000000000000000000000000000000666+1c007e0101005000f30300000000000000000000000000000000000000000000
667-01087e0103000000ef0300000000000009000000000000000000000000000000667+01087f0103000000ef0300000000000009000000000000000000000000000000
668-6e6574207469746c650000001c007e0101005000f30300000000000000000000668+6e6574207469746c650000001c007f0101005000f30300000000000000000000
669-00000000000000000000000001087f0103000000ef0300000000000009000000669+0000000000000000000000000108800103000000ef0300000000000009000000
670-0000000000000000000000006e6574207469746c650000001c007f0101005000670+0000000000000000000000006e6574207469746c650000001c00800101005000
671-f303000000000000000000000000000000000000000000000108800103000000671+f303000000000000000000000000000000000000000000000108810103000000
672-ef03000000000000090000000000000000000000000000006e6574207469746c672+ef03000000000000090000000000000000000000000000006e6574207469746c
673-650000001c00800101005000f303000000000000000000000000000000000000673+650000001c00810101005000f303000000000000000000000000000000000000
674-000000000108810103000000ef03000000000000090000000000000000000000674+000000000108820103000000ef03000000000000090000000000000000000000
675-000000006e6574207469746c650000001c00810101005000f303000000000000675+000000006e6574207469746c650000001c00820101005000f303000000000000
676-000000000000000000000000000000000108820103000000ef03000000000000676+000000000000000000000000000000000108830103000000ef03000000000000
677-090000000000000000000000000000006e6574207469746c650000001c008201677+090000000000000000000000000000006e6574207469746c650000001c008301
678-01005000f3030000000000000000000000000000000000000000000001088301678+01005000f3030000000000000000000000000000000000000000000001088401
679-03000000ef03000000000000090000000000000000000000000000006e657420679+03000000ef03000000000000090000000000000000000000000000006e657420
680-7469746c650000001c00830101005000f3030000000000000000000000000000680+7469746c650000001c00840101005000f3030000000000000000000000000000
681-00000000000000000108840103000000ef030000000000000900000000000000681+00000000000000000108850103000000ef030000000000000900000000000000
682-00000000000000006e6574207469746c650000001c00840101005000f3030000682+00000000000000006e6574207469746c650000001c00850101005000f3030000
683-00000000000000000000000000000000000000000108850103000000ef030000683+00000000000000000000000000000000000000000108860103000000ef030000
684-00000000090000000000000000000000000000006e6574207469746c65000000684+00000000090000000000000000000000000000006e6574207469746c65000000
685-1c00850101005000f30300000000000000000000000000000000000000000000685+1c00860101005000f30300000000000000000000000000000000000000000000
686-0108860103000000ef0300000000000009000000000000000000000000000000686+0108870103000000ef0300000000000009000000000000000000000000000000
687-6e6574207469746c650000001c00860101005000f30300000000000000000000687+6e6574207469746c650000001c00870101005000f30300000000000000000000
688-0000000000000000000000000108870103000000ef0300000000000009000000688+0000000000000000000000000108880103000000ef0300000000000009000000
689-0000000000000000000000006e6574207469746c650000001c00870101005000689+0000000000000000000000006e6574207469746c650000001c00880101005000
690-f303000000000000000000000000000000000000000000000108880103000000690+f303000000000000000000000000000000000000000000000108890103000000
691-ef03000000000000090000000000000000000000000000006e6574207469746c691+ef03000000000000090000000000000000000000000000006e6574207469746c
692-650000001c00880101005000f303000000000000000000000000000000000000692+650000001c00890101005000f303000000000000000000000000000000000000
693-000000000108890103000000ef03000000000000090000000000000000000000693+0000000001088a0103000000ef03000000000000090000000000000000000000
694-000000006e6574207469746c650000001c00890101005000f303000000000000694+000000006e6574207469746c650000001c008a0101005000f303000000000000
695-0000000000000000000000000000000001088a0103000000ef03000000000000695+0000000000000000000000000000000001088b0103000000ef03000000000000
696-090000000000000000000000000000006e6574207469746c650000001c008a01696+090000000000000000000000000000006e6574207469746c650000001c008b01
697-01005000f3030000000000000000000000000000000000000000000001088b01697+01005000f3030000000000000000000000000000000000000000000001088c01
698-03000000ef03000000000000090000000000000000000000000000006e657420698+03000000ef03000000000000090000000000000000000000000000006e657420
699-7469746c650000001c008b0101005000f3030000000000000000000000000000699+7469746c650000001c008c0101005000f3030000000000000000000000000000
700-000000000000000001088c0103000000ef030000000000000900000000000000700+000000000000000001088d0103000000ef030000000000000900000000000000
701-00000000000000006e6574207469746c650000001c008c0101005000f3030000701+00000000000000006e6574207469746c650000001c008d0101005000f3030000
702-000000000000000000000000000000000000000001088d0103000000ef030000702+000000000000000000000000000000000000000001088e0103000000ef030000
703-00000000090000000000000000000000000000006e6574207469746c65000000703+00000000090000000000000000000000000000006e6574207469746c65000000
704-1c008d0101005000f30300000000000000000000000000000000000000000000704+1c008e0101005000f30300000000000000000000000000000000000000000000
705-01088e0103000000ef0300000000000009000000000000000000000000000000705+01088f0103000000ef0300000000000009000000000000000000000000000000
706-6e6574207469746c650000001c008e0101005000f30300000000000000000000706+6e6574207469746c650000001c008f0101005000f30300000000000000000000
707-00000000000000000000000001088f0103000000ef0300000000000009000000707+0000000000000000000000000108900103000000ef0300000000000009000000
708-0000000000000000000000006e6574207469746c650000001c008f0101005000708+0000000000000000000000006e6574207469746c650000001c00900101005000
709-f303000000000000000000000000000000000000000000000108900103000000709+f303000000000000000000000000000000000000000000000108910103000000
710-ef03000000000000090000000000000000000000000000006e6574207469746c710+ef03000000000000090000000000000000000000000000006e6574207469746c
711-650000001c00900101005000f303000000000000000000000000000000000000711+650000001c00910101005000f303000000000000000000000000000000000000
712-000000000108910103000000ef03000000000000090000000000000000000000712+000000000108920103000000ef03000000000000090000000000000000000000
713-000000006e6574207469746c650000001c00910101005000f303000000000000713+000000006e6574207469746c650000001c00920101005000f303000000000000
714-000000000000000000000000000000000108920103000000ef03000000000000714+000000000000000000000000000000000108930103000000ef03000000000000
715-090000000000000000000000000000006e6574207469746c650000001c009201715+090000000000000000000000000000006e6574207469746c650000001c009301
716-01005000f3030000000000000000000000000000000000000000000001089301716+01005000f3030000000000000000000000000000000000000000000001089401
717-03000000ef03000000000000090000000000000000000000000000006e657420717+03000000ef03000000000000090000000000000000000000000000006e657420
718-7469746c650000001c00930101005000f3030000000000000000000000000000718+7469746c650000001c00940101005000f3030000000000000000000000000000
719-00000000000000000108940103000000ef030000000000000900000000000000719+00000000000000000108950103000000ef030000000000000900000000000000
720-00000000000000006e6574207469746c650000001c00940101005000f3030000720+00000000000000006e6574207469746c650000001c00950101005000f3030000
721-00000000000000000000000000000000000000000108950103000000ef030000721+00000000000000000000000000000000000000000108960103000000ef030000
722-00000000090000000000000000000000000000006e6574207469746c65000000722+00000000090000000000000000000000000000006e6574207469746c65000000
723-1c00950101005000f30300000000000000000000000000000000000000000000723+1c00960101005000f30300000000000000000000000000000000000000000000
724-0108960103000000ef0300000000000009000000000000000000000000000000724+0108970103000000ef0300000000000009000000000000000000000000000000
725-6e6574207469746c650000001c00960101005000f30300000000000000000000725+6e6574207469746c650000001c00970101005000f30300000000000000000000
726-0000000000000000000000000108970103000000ef0300000000000009000000726+0000000000000000000000000108980103000000ef0300000000000009000000
727-0000000000000000000000006e6574207469746c650000001c00970101005000727+0000000000000000000000006e6574207469746c650000001c00980101005000
728-f303000000000000000000000000000000000000000000000108980103000000728+f303000000000000000000000000000000000000000000000108990103000000
729-ef03000000000000090000000000000000000000000000006e6574207469746c729+ef03000000000000090000000000000000000000000000006e6574207469746c
730-650000001c00980101005000f303000000000000000000000000000000000000730+650000001c00990101005000f303000000000000000000000000000000000000
731-000000000108990103000000ef03000000000000090000000000000000000000731+0000000001089a0103000000ef03000000000000090000000000000000000000
732-000000006e6574207469746c650000001c00990101005000f303000000000000732+000000006e6574207469746c650000001c009a0101005000f303000000000000
733-0000000000000000000000000000000001089a0103000000ef03000000000000733+0000000000000000000000000000000001089b0103000000ef03000000000000
734-090000000000000000000000000000006e6574207469746c650000001c009a01734+090000000000000000000000000000006e6574207469746c650000001c009b01
735-01005000f3030000000000000000000000000000000000000000000001089b01735+01005000f3030000000000000000000000000000000000000000000001089c01
736-03000000ef03000000000000090000000000000000000000000000006e657420736+03000000ef03000000000000090000000000000000000000000000006e657420
737-7469746c650000001c009b0101005000f3030000000000000000000000000000737+7469746c650000001c009c0101005000f3030000000000000000000000000000
738-000000000000000001089c0103000000ef030000000000000900000000000000738+000000000000000001089d0103000000ef030000000000000900000000000000
739-00000000000000006e6574207469746c650000001c009c0101005000f3030000739+00000000000000006e6574207469746c650000001c009d0101005000f3030000
740-000000000000000000000000000000000000000001089d0103000000ef030000740+000000000000000000000000000000000000000001089e0103000000ef030000
741-00000000090000000000000000000000000000006e6574207469746c65000000741+00000000090000000000000000000000000000006e6574207469746c65000000
742-1c009d0101005000f30300000000000000000000000000000000000000000000742+1c009e0101005000f30300000000000000000000000000000000000000000000
743-01089e0103000000ef0300000000000009000000000000000000000000000000743+01089f0103000000ef0300000000000009000000000000000000000000000000
744-6e6574207469746c650000001c009e0101005000f30300000000000000000000744+6e6574207469746c650000001c009f0101005000f30300000000000000000000
745-00000000000000000000000001089f0103000000ef0300000000000009000000745+0000000000000000000000000108a00103000000ef0300000000000009000000
746-0000000000000000000000006e6574207469746c650000001c009f0101005000746+0000000000000000000000006e6574207469746c650000001c00a00101005000
747-f303000000000000000000000000000000000000000000000108a00103000000747+f303000000000000000000000000000000000000000000000108a10103000000
748-ef03000000000000090000000000000000000000000000006e6574207469746c748+ef03000000000000090000000000000000000000000000006e6574207469746c
749-650000001c00a00101005000f303000000000000000000000000000000000000749+650000001c00a10101005000f303000000000000000000000000000000000000
750-000000000108a10103000000ef03000000000000090000000000000000000000750+000000000108a20103000000ef03000000000000090000000000000000000000
751-000000006e6574207469746c650000001c00a10101005000f303000000000000751+000000006e6574207469746c650000001c00a20101005000f303000000000000
752-000000000000000000000000000000000108a20103000000ef03000000000000752+000000000000000000000000000000000108a30103000000ef03000000000000
753-090000000000000000000000000000006e6574207469746c650000001c00a201753+090000000000000000000000000000006e6574207469746c650000001c00a301
754-01005000f303000000000000000000000000000000000000000000000108a301754+01005000f303000000000000000000000000000000000000000000000108a401
755-03000000ef03000000000000090000000000000000000000000000006e657420755+03000000ef03000000000000090000000000000000000000000000006e657420
756-7469746c650000001c00a30101005000f3030000000000000000000000000000756+7469746c650000001c00a40101005000f3030000000000000000000000000000
757-00000000000000000108a40103000000ef030000000000000900000000000000757+00000000000000000108a50103000000ef030000000000000900000000000000
758-00000000000000006e6574207469746c650000001c00a40101005000f3030000758+00000000000000006e6574207469746c650000001c00a50101005000f3030000
759-00000000000000000000000000000000000000000108a50103000000ef030000759+00000000000000000000000000000000000000000108a60103000000ef030000
760-00000000090000000000000000000000000000006e6574207469746c65000000760+00000000090000000000000000000000000000006e6574207469746c65000000
761-1c00a50101005000f30300000000000000000000000000000000000000000000761+1c00a60101005000f30300000000000000000000000000000000000000000000
762-0108a60103000000ef0300000000000009000000000000000000000000000000762+0108a70103000000ef0300000000000009000000000000000000000000000000
763-6e6574207469746c650000001c00a60101005000f30300000000000000000000763+6e6574207469746c650000001c00a70101005000f30300000000000000000000
764-0000000000000000000000000108a70103000000ef0300000000000009000000764+0000000000000000000000000108a80103000000ef0300000000000009000000
765-0000000000000000000000006e6574207469746c650000001c00a70101005000765+0000000000000000000000006e6574207469746c650000001c00a80101005000
766-f303000000000000000000000000000000000000000000000108a80103000000766+f303000000000000000000000000000000000000000000000108a90103000000
767-ef03000000000000090000000000000000000000000000006e6574207469746c767+ef03000000000000090000000000000000000000000000006e6574207469746c
768-650000001c00a80101005000f303000000000000000000000000000000000000768+650000001c00a90101005000f303000000000000000000000000000000000000
769-000000000108a90103000000ef03000000000000090000000000000000000000769+000000000108aa0103000000ef03000000000000090000000000000000000000
770-000000006e6574207469746c650000001c00a90101005000f303000000000000770+000000006e6574207469746c650000001c00aa0101005000f303000000000000
771-000000000000000000000000000000000108aa0103000000ef03000000000000771+000000000000000000000000000000000108ab0103000000ef03000000000000
772-090000000000000000000000000000006e6574207469746c650000001c00aa01772+090000000000000000000000000000006e6574207469746c650000001c00ab01
773-01005000f303000000000000000000000000000000000000000000000108ab01773+01005000f303000000000000000000000000000000000000000000000108ac01
774-03000000ef03000000000000090000000000000000000000000000006e657420774+03000000ef03000000000000090000000000000000000000000000006e657420
775-7469746c650000001c00ab0101005000f3030000000000000000000000000000775+7469746c650000001c00ac0101005000f3030000000000000000000000000000
776-00000000000000000108ac0103000000ef030000000000000900000000000000776+00000000000000000108ad0103000000ef030000000000000900000000000000
777-00000000000000006e6574207469746c650000001c00ac0101005000f3030000777+00000000000000006e6574207469746c650000001c00ad0101005000f3030000
778-00000000000000000000000000000000000000000108ad0103000000ef030000778+00000000000000000000000000000000000000000108ae0103000000ef030000
779-00000000090000000000000000000000000000006e6574207469746c65000000779+00000000090000000000000000000000000000006e6574207469746c65000000
780-1c00ad0101005000f30300000000000000000000000000000000000000000000780+1c00ae0101005000f30300000000000000000000000000000000000000000000
781-0108ae0103000000ef0300000000000009000000000000000000000000000000781+0108af0103000000ef0300000000000009000000000000000000000000000000
782-6e6574207469746c650000001c00ae0101005000f30300000000000000000000782+6e6574207469746c650000001c00af0101005000f30300000000000000000000
783-0000000000000000000000000108af0103000000ef0300000000000009000000783+0000000000000000000000000108b00103000000ef0300000000000009000000
784-0000000000000000000000006e6574207469746c650000001c00af0101005000784+0000000000000000000000006e6574207469746c650000001c00b00101005000
785-f303000000000000000000000000000000000000000000000108b00103000000785+f303000000000000000000000000000000000000000000000108b10103000000
786-ef03000000000000090000000000000000000000000000006e6574207469746c786+ef03000000000000090000000000000000000000000000006e6574207469746c
787-650000001c00b00101005000f303000000000000000000000000000000000000787+650000001c00b10101005000f303000000000000000000000000000000000000
788-000000000108b10103000000ef03000000000000090000000000000000000000788+000000000108b20103000000ef03000000000000090000000000000000000000
789-000000006e6574207469746c650000001c00b10101005000f303000000000000789+000000006e6574207469746c650000001c00b20101005000f303000000000000
790-000000000000000000000000000000000108b20103000000ef03000000000000790+000000000000000000000000000000000108b30103000000ef03000000000000
791-090000000000000000000000000000006e6574207469746c650000001c00b201791+090000000000000000000000000000006e6574207469746c650000001c00b301
792-01005000f303000000000000000000000000000000000000000000000108b301792+01005000f303000000000000000000000000000000000000000000000108b401
793-03000000ef03000000000000090000000000000000000000000000006e657420793+03000000ef03000000000000090000000000000000000000000000006e657420
794-7469746c650000001c00b30101005000f3030000000000000000000000000000794+7469746c650000001c00b40101005000f3030000000000000000000000000000
795-00000000000000000108b40103000000ef030000000000000900000000000000795+00000000000000000108b50103000000ef030000000000000900000000000000
796-00000000000000006e6574207469746c650000001c00b40101005000f3030000796+00000000000000006e6574207469746c650000001c00b50101005000f3030000
797-00000000000000000000000000000000000000000108b50103000000ef030000797+00000000000000000000000000000000000000000108b60103000000ef030000
798-00000000090000000000000000000000000000006e6574207469746c65000000798+00000000090000000000000000000000000000006e6574207469746c65000000
799-1c00b50101005000f30300000000000000000000000000000000000000000000799+1c00b60101005000f30300000000000000000000000000000000000000000000
800-0108b60103000000ef0300000000000009000000000000000000000000000000800+0108b70103000000ef0300000000000009000000000000000000000000000000
801-6e6574207469746c650000001c00b60101005000f30300000000000000000000801+6e6574207469746c650000001c00b70101005000f30300000000000000000000
802-0000000000000000000000000108b70103000000ef0300000000000009000000802+0000000000000000000000000108b80103000000ef0300000000000009000000
803-0000000000000000000000006e6574207469746c650000001c00b70101005000803+0000000000000000000000006e6574207469746c650000001c00b80101005000
804-f303000000000000000000000000000000000000000000000108b80103000000804+f303000000000000000000000000000000000000000000000108b90103000000
805-ef03000000000000090000000000000000000000000000006e6574207469746c805+ef03000000000000090000000000000000000000000000006e6574207469746c
806-650000001c00b80101005000f303000000000000000000000000000000000000806+650000001c00b90101005000f303000000000000000000000000000000000000
807-000000000108b90103000000ef03000000000000090000000000000000000000807+000000000108ba0103000000ef03000000000000090000000000000000000000
808-000000006e6574207469746c650000001c00b90101005000f303000000000000808+000000006e6574207469746c650000001c00ba0101005000f303000000000000
809-000000000000000000000000000000000108ba0103000000ef03000000000000809+000000000000000000000000000000000108bb0103000000ef03000000000000
810-090000000000000000000000000000006e6574207469746c650000001c00ba01810+090000000000000000000000000000006e6574207469746c650000001c00bb01
811-01005000f303000000000000000000000000000000000000000000000108bb01811+01005000f303000000000000000000000000000000000000000000000108bc01
812-03000000ef03000000000000090000000000000000000000000000006e657420812+03000000ef03000000000000090000000000000000000000000000006e657420
813-7469746c650000001c00bb0101005000f3030000000000000000000000000000813+7469746c650000001c00bc0101005000f3030000000000000000000000000000
814-00000000000000000108bc0103000000ef030000000000000900000000000000814+00000000000000000108bd0103000000ef030000000000000900000000000000
815-00000000000000006e6574207469746c650000001c00bc0101005000f3030000815+00000000000000006e6574207469746c650000001c00bd0101005000f3030000
816-00000000000000000000000000000000000000000108bd0103000000ef030000816+00000000000000000000000000000000000000000108be0103000000ef030000
817-00000000090000000000000000000000000000006e6574207469746c65000000817+00000000090000000000000000000000000000006e6574207469746c65000000
818-1c00bd0101005000f30300000000000000000000000000000000000000000000818+1c00be0101005000f30300000000000000000000000000000000000000000000
819-0108be0103000000ef0300000000000009000000000000000000000000000000819+0108bf0103000000ef0300000000000009000000000000000000000000000000
820-6e6574207469746c650000001c00be0101005000f30300000000000000000000820+6e6574207469746c650000001c00bf0101005000f30300000000000000000000
821-0000000000000000000000000108bf0103000000ef0300000000000009000000821+0000000000000000000000000108c00103000000ef0300000000000009000000
822-0000000000000000000000006e6574207469746c650000001c00bf0101005000822+0000000000000000000000006e6574207469746c650000001c00c00101005000
823-f303000000000000000000000000000000000000000000000108c00103000000823+f303000000000000000000000000000000000000000000000108c10103000000
824-ef03000000000000090000000000000000000000000000006e6574207469746c824+ef03000000000000090000000000000000000000000000006e6574207469746c
825-650000001c00c00101005000f303000000000000000000000000000000000000825+650000001c00c10101005000f303000000000000000000000000000000000000
826-000000000108c10103000000ef03000000000000090000000000000000000000826+000000000108c20103000000ef03000000000000090000000000000000000000
827-000000006e6574207469746c650000001c00c10101005000f303000000000000827+000000006e6574207469746c650000001c00c20101005000f303000000000000
828-000000000000000000000000000000000108c20103000000ef03000000000000828+000000000000000000000000000000000108c30103000000ef03000000000000
829-090000000000000000000000000000006e6574207469746c650000001c00c201829+090000000000000000000000000000006e6574207469746c650000001c00c301
830-01005000f303000000000000000000000000000000000000000000000108c301830+01005000f303000000000000000000000000000000000000000000000108c401
831-03000000ef03000000000000090000000000000000000000000000006e657420831+03000000ef03000000000000090000000000000000000000000000006e657420
832-7469746c650000001c00c30101005000f3030000000000000000000000000000832+7469746c650000001c00c40101005000f3030000000000000000000000000000
833-00000000000000000108c40103000000ef030000000000000900000000000000833+00000000000000000108c50103000000ef030000000000000900000000000000
834-00000000000000006e6574207469746c650000001c00c40101005000f3030000834+00000000000000006e6574207469746c650000001c00c50101005000f3030000
835-00000000000000000000000000000000000000000108c50103000000ef030000835+00000000000000000000000000000000000000000108c60103000000ef030000
836-00000000090000000000000000000000000000006e6574207469746c65000000836+00000000090000000000000000000000000000006e6574207469746c65000000
837-1c00c50101005000f30300000000000000000000000000000000000000000000837+1c00c60101005000f30300000000000000000000000000000000000000000000
838-0108c60103000000ef0300000000000009000000000000000000000000000000838+0108c70103000000ef0300000000000009000000000000000000000000000000
839-6e6574207469746c650000001c00c60101005000f30300000000000000000000839+6e6574207469746c650000001c00c70101005000f30300000000000000000000
840-0000000000000000000000000108c70103000000ef0300000000000009000000840+0000000000000000000000000108c80103000000ef0300000000000009000000
841-0000000000000000000000006e6574207469746c650000001c00c70101005000841+0000000000000000000000006e6574207469746c650000001c00c80101005000
842-f303000000000000000000000000000000000000000000000108c80103000000842+f303000000000000000000000000000000000000000000000108c90103000000
843-ef03000000000000090000000000000000000000000000006e6574207469746c843+ef03000000000000090000000000000000000000000000006e6574207469746c
844-650000001c00c80101005000f303000000000000000000000000000000000000844+650000001c00c90101005000f303000000000000000000000000000000000000
845-000000000108c90103000000ef03000000000000090000000000000000000000845+000000000108ca0103000000ef03000000000000090000000000000000000000
846-000000006e6574207469746c650000001c00c90101005000f303000000000000846+000000006e6574207469746c650000001c00ca0101005000f303000000000000
847-000000000000000000000000000000000108ca0103000000ef03000000000000847+000000000000000000000000000000000108cb0103000000ef03000000000000
848-090000000000000000000000000000006e6574207469746c650000001c00ca01848+090000000000000000000000000000006e6574207469746c650000001c00cb01
849-01005000f303000000000000000000000000000000000000000000000108cb01849+01005000f303000000000000000000000000000000000000000000000108cc01
850-03000000ef03000000000000090000000000000000000000000000006e657420850+03000000ef03000000000000090000000000000000000000000000006e657420
851-7469746c650000001c00cb0101005000f3030000000000000000000000000000851+7469746c650000001c00cc0101005000f3030000000000000000000000000000
852-00000000000000000108cc0103000000ef030000000000000900000000000000852+00000000000000000108cd0103000000ef030000000000000900000000000000
853-00000000000000006e6574207469746c650000001c00cc0101005000f3030000853+00000000000000006e6574207469746c650000001c00cd0101005000f3030000
854-00000000000000000000000000000000000000000108cd0103000000ef030000854+00000000000000000000000000000000000000000108ce0103000000ef030000
855-00000000090000000000000000000000000000006e6574207469746c65000000855+00000000090000000000000000000000000000006e6574207469746c65000000
856-1c00cd0101005000f30300000000000000000000000000000000000000000000856+1c00ce0101005000f30300000000000000000000000000000000000000000000
857-0108ce0103000000ef0300000000000009000000000000000000000000000000857+0108cf0103000000ef0300000000000009000000000000000000000000000000
858-6e6574207469746c650000001c00ce0101005000f30300000000000000000000858+6e6574207469746c650000001c00cf0101005000f30300000000000000000000
859-0000000000000000000000000108cf0103000000ef0300000000000009000000859+0000000000000000000000000108d00103000000ef0300000000000009000000
860-0000000000000000000000006e6574207469746c650000001c00cf0101005000860+0000000000000000000000006e6574207469746c650000001c00d00101005000
861-f303000000000000000000000000000000000000000000000108d00103000000861+f303000000000000000000000000000000000000000000000108d10103000000
862-ef03000000000000090000000000000000000000000000006e6574207469746c862+ef03000000000000090000000000000000000000000000006e6574207469746c
863-650000001c00d00101005000f303000000000000000000000000000000000000863+650000001c00d10101005000f303000000000000000000000000000000000000
864-000000000108d10103000000ef03000000000000090000000000000000000000864+000000000108d20103000000ef03000000000000090000000000000000000000
865-000000006e6574207469746c650000001c00d10101005000f303000000000000865+000000006e6574207469746c650000001c00d20101005000f303000000000000
866-000000000000000000000000000000000108d20103000000ef03000000000000866+000000000000000000000000000000000108d30103000000ef03000000000000
867-090000000000000000000000000000006e6574207469746c650000001c00d201867+090000000000000000000000000000006e6574207469746c650000001c00d301
868-01005000f303000000000000000000000000000000000000000000000108d301868+01005000f303000000000000000000000000000000000000000000000108d401
869-03000000ef03000000000000090000000000000000000000000000006e657420869+03000000ef03000000000000090000000000000000000000000000006e657420
870-7469746c650000001c00d30101005000f3030000000000000000000000000000870+7469746c650000001c00d40101005000f3030000000000000000000000000000
871-00000000000000000108d40103000000ef030000000000000900000000000000871+00000000000000000108d50103000000ef030000000000000900000000000000
872-00000000000000006e6574207469746c650000001c00d40101005000f3030000872+00000000000000006e6574207469746c650000001c00d50101005000f3030000
873-00000000000000000000000000000000000000000108d50103000000ef030000873+00000000000000000000000000000000000000000108d60103000000ef030000
874-00000000090000000000000000000000000000006e6574207469746c65000000874+00000000090000000000000000000000000000006e6574207469746c65000000
875-1c00d50101005000f30300000000000000000000000000000000000000000000875+1c00d60101005000f30300000000000000000000000000000000000000000000
876-0108d60103000000ef0300000000000009000000000000000000000000000000876+0108d70103000000ef0300000000000009000000000000000000000000000000
877-6e6574207469746c650000001c00d60101005000f30300000000000000000000877+6e6574207469746c650000001c00d70101005000f30300000000000000000000
878-0000000000000000000000000108d70103000000ef0300000000000009000000878+0000000000000000000000000108d80103000000ef0300000000000009000000
879-0000000000000000000000006e6574207469746c650000001c00d70101005000879+0000000000000000000000006e6574207469746c650000001c00d80101005000
880-f303000000000000000000000000000000000000000000000108d80103000000880+f303000000000000000000000000000000000000000000000108d90103000000
881-ef03000000000000090000000000000000000000000000006e6574207469746c881+ef03000000000000090000000000000000000000000000006e6574207469746c
882-650000001c00d80101005000f303000000000000000000000000000000000000882+650000001c00d90101005000f303000000000000000000000000000000000000
883-000000000108d90103000000ef03000000000000090000000000000000000000883+000000000108da0103000000ef03000000000000090000000000000000000000
884-000000006e6574207469746c650000001c00d90101005000f303000000000000884+000000006e6574207469746c650000001c00da0101005000f303000000000000
885-000000000000000000000000000000000108da0103000000ef03000000000000885+000000000000000000000000000000000108db0103000000ef03000000000000
886-090000000000000000000000000000006e6574207469746c650000001c00da01886+090000000000000000000000000000006e6574207469746c650000001c00db01
887-01005000f303000000000000000000000000000000000000000000000108db01887+01005000f303000000000000000000000000000000000000000000000108dc01
888-03000000ef03000000000000090000000000000000000000000000006e657420888+03000000ef03000000000000090000000000000000000000000000006e657420
889-7469746c650000001c00db0101005000f3030000000000000000000000000000889+7469746c650000001c00dc0101005000f3030000000000000000000000000000
890-00000000000000000108dc0103000000ef030000000000000900000000000000890+00000000000000000108dd0103000000ef030000000000000900000000000000
891-00000000000000006e6574207469746c650000001c00dc0101005000f3030000891+00000000000000006e6574207469746c650000001c00dd0101005000f3030000
892-00000000000000000000000000000000000000000108dd0103000000ef030000892+00000000000000000000000000000000000000000108de0103000000ef030000
893-00000000090000000000000000000000000000006e6574207469746c65000000893+00000000090000000000000000000000000000006e6574207469746c65000000
894-1c00dd0101005000f30300000000000000000000000000000000000000000000894+1c00de0101005000f30300000000000000000000000000000000000000000000
895-0108de0103000000ef0300000000000009000000000000000000000000000000895+0108df0103000000ef0300000000000009000000000000000000000000000000
896-6e6574207469746c650000001c00de0101005000f30300000000000000000000896+6e6574207469746c650000001c00df0101005000f30300000000000000000000
897-0000000000000000000000000108df0103000000ef0300000000000009000000897+0000000000000000000000000108e00103000000ef0300000000000009000000
898-0000000000000000000000006e6574207469746c650000001c00df0101005000898+0000000000000000000000006e6574207469746c650000001c00e00101005000
899-f303000000000000000000000000000000000000000000000108e00103000000899+f303000000000000000000000000000000000000000000000108e10103000000
900-ef03000000000000090000000000000000000000000000006e6574207469746c900+ef03000000000000090000000000000000000000000000006e6574207469746c
901-650000001c00e00101005000f303000000000000000000000000000000000000901+650000001c00e10101005000f303000000000000000000000000000000000000
902-000000000108e10103000000ef03000000000000090000000000000000000000902+000000000108e20103000000ef03000000000000090000000000000000000000
903-000000006e6574207469746c650000001c00e10101005000f303000000000000903+000000006e6574207469746c650000001c00e20101005000f303000000000000
904-000000000000000000000000000000000108e20103000000ef03000000000000904+000000000000000000000000000000000108e30103000000ef03000000000000
905-090000000000000000000000000000006e6574207469746c650000001c00e201905+090000000000000000000000000000006e6574207469746c650000001c00e301
906-01005000f303000000000000000000000000000000000000000000000108e301906+01005000f303000000000000000000000000000000000000000000000108e401
907-03000000ef03000000000000090000000000000000000000000000006e657420907+03000000ef03000000000000090000000000000000000000000000006e657420
908-7469746c650000001c00e30101005000f3030000000000000000000000000000908+7469746c650000001c00e40101005000f3030000000000000000000000000000
909-00000000000000000108e40103000000ef030000000000000900000000000000909+00000000000000000108e50103000000ef030000000000000900000000000000
910-00000000000000006e6574207469746c650000001c00e40101005000f3030000910+00000000000000006e6574207469746c650000001c00e50101005000f3030000
911-00000000000000000000000000000000000000000108e50103000000ef030000911+00000000000000000000000000000000000000000108e60103000000ef030000
912-00000000090000000000000000000000000000006e6574207469746c65000000912+00000000090000000000000000000000000000006e6574207469746c65000000
913-1c00e50101005000f30300000000000000000000000000000000000000000000913+1c00e60101005000f30300000000000000000000000000000000000000000000
914-0108e60103000000ef0300000000000009000000000000000000000000000000914+0108e70103000000ef0300000000000009000000000000000000000000000000
915-6e6574207469746c650000001c00e60101005000f30300000000000000000000915+6e6574207469746c650000001c00e70101005000f30300000000000000000000
916-0000000000000000000000000108e70103000000ef0300000000000009000000916+0000000000000000000000000108e80103000000ef0300000000000009000000
917-0000000000000000000000006e6574207469746c650000001c00e70101005000917+0000000000000000000000006e6574207469746c650000001c00e80101005000
918-f303000000000000000000000000000000000000000000000108e80103000000918+f303000000000000000000000000000000000000000000000108e90103000000
919-ef03000000000000090000000000000000000000000000006e6574207469746c919+ef03000000000000090000000000000000000000000000006e6574207469746c
920-650000001c00e80101005000f303000000000000000000000000000000000000920+650000001c00e90101005000f303000000000000000000000000000000000000
921-000000000108e90103000000ef03000000000000090000000000000000000000921+000000000108ea0103000000ef03000000000000090000000000000000000000
922-000000006e6574207469746c650000001c00e90101005000f303000000000000922+000000006e6574207469746c650000001c00ea0101005000f303000000000000
923-000000000000000000000000000000000108ea0103000000ef03000000000000923+000000000000000000000000000000000108eb0103000000ef03000000000000
924-090000000000000000000000000000006e6574207469746c650000001c00ea01924+090000000000000000000000000000006e6574207469746c650000001c00eb01
925-01005000f303000000000000000000000000000000000000000000000108eb01925+01005000f303000000000000000000000000000000000000000000000108ec01
926-03000000ef03000000000000090000000000000000000000000000006e657420926+03000000ef03000000000000090000000000000000000000000000006e657420
927-7469746c650000001c00eb0101005000f3030000000000000000000000000000927+7469746c650000001c00ec0101005000f3030000000000000000000000000000
928-00000000000000000108ec0103000000ef030000000000000900000000000000928+00000000000000000108ed0103000000ef030000000000000900000000000000
929-00000000000000006e6574207469746c650000001c00ec0101005000f3030000929+00000000000000006e6574207469746c650000001c00ed0101005000f3030000
930-00000000000000000000000000000000000000000108ed0103000000ef030000930+00000000000000000000000000000000000000000108ee0103000000ef030000
931-00000000090000000000000000000000000000006e6574207469746c65000000931+00000000090000000000000000000000000000006e6574207469746c65000000
932-1c00ed0101005000f30300000000000000000000000000000000000000000000932+1c00ee0101005000f30300000000000000000000000000000000000000000000
933-0108ee0103000000ef0300000000000009000000000000000000000000000000933+0108ef0103000000ef0300000000000009000000000000000000000000000000
934-6e6574207469746c650000001c00ee0101005000f30300000000000000000000934+6e6574207469746c650000001c00ef0101005000f30300000000000000000000
935-0000000000000000000000000108ef0103000000ef0300000000000009000000935+0000000000000000000000000108f00103000000ef0300000000000009000000
936-0000000000000000000000006e6574207469746c650000001c00ef0101005000936+0000000000000000000000006e6574207469746c650000001c00f00101005000
937-f303000000000000000000000000000000000000000000000108f00103000000937+f303000000000000000000000000000000000000000000000108f10103000000
938-ef03000000000000090000000000000000000000000000006e6574207469746c938+ef03000000000000090000000000000000000000000000006e6574207469746c
939-650000001c00f00101005000f303000000000000000000000000000000000000939+650000001c00f10101005000f303000000000000000000000000000000000000
940-000000000108f10103000000ef03000000000000090000000000000000000000940+000000000108f20103000000ef03000000000000090000000000000000000000
941-000000006e6574207469746c650000001c00f10101005000f303000000000000941+000000006e6574207469746c650000001c00f20101005000f303000000000000
942-000000000000000000000000000000000108f20103000000ef03000000000000942+000000000000000000000000000000000108f30103000000ef03000000000000
943-090000000000000000000000000000006e6574207469746c650000001c00f201943+090000000000000000000000000000006e6574207469746c650000001c00f301
944-01005000f303000000000000000000000000000000000000000000000108f301944+01005000f303000000000000000000000000000000000000000000000108f401
945-03000000ef03000000000000090000000000000000000000000000006e657420945+03000000ef03000000000000090000000000000000000000000000006e657420
946-7469746c650000001c00f30101005000f3030000000000000000000000000000946+7469746c650000001c00f40101005000f3030000000000000000000000000000
947-00000000000000000108f40103000000ef030000000000000900000000000000947+00000000000000000108f50103000000ef030000000000000900000000000000
948-00000000000000006e6574207469746c650000001c00f40101005000f3030000948+00000000000000006e6574207469746c650000001c00f50101005000f3030000
949-00000000000000000000000000000000000000000108f50103000000ef030000949+00000000000000000000000000000000000000000108f60103000000ef030000
950 00000000090000000000000000000000000000006e6574207469746c65000000950 00000000090000000000000000000000000000006e6574207469746c65000000
M internal/adapters/wayland/xwm/testdata/streams/steady.hex +2000 -2000 large diff (4000 lines changed): collapsed
M internal/app/testdata/x11probe/main.go +93 -7
@@ -8,6 +8,13 @@
88 // main one is mapped (prints "override mapped") and unmaps it after
99 // -override-for (prints "override unmapped"). With -override-dismiss-on-focusout
1010 // it unmaps it instead when the main window loses focus (prints "dismissed").
11+//
12+// With -fullscreen it asks the window manager for _NET_WM_STATE_FULLSCREEN
13+// -fullscreen-delay after the window is mapped (0: right at the map) and
14+// prints "fullscreen WxH" when the window is resized; -fullscreen-off asks to
15+// leave it that long after (prints "fullscreen off WxH"). -keyboard-grab
16+// calls XGrabKeyboard on the window once it is mapped (prints "grab").
17+// -at X,Y creates the window at that root position.
1118 package main
1219
1320 import (
@@ -50,7 +57,16 @@ func run() error {
5057 overrideType := flag.String("override-type", "menu", "override window type: menu or tooltip")
5158 overrideShape := flag.Bool("override-shape", false, "give the override window an empty input shape")
5259 dismiss := flag.Bool("override-dismiss-on-focusout", false, "unmap the override window when the main window loses focus")
60+ fullscreen := flag.Bool("fullscreen", false, "request _NET_WM_STATE_FULLSCREEN after the window is mapped")
61+ fullscreenDelay := flag.Duration("fullscreen-delay", 0, "delay between the map and the fullscreen request")
62+ fullscreenOff := flag.Duration("fullscreen-off", 0, "leave fullscreen this long after the request (0: never)")
63+ keyboardGrab := flag.Bool("keyboard-grab", false, "XGrabKeyboard on the window once it is mapped")
64+ at := flag.String("at", "0,0", "window position X,Y in root coordinates")
5365 flag.Parse()
66+ atX, atY, okAt := strings.Cut(*at, ",")
67+ if !okAt {
68+ return fmt.Errorf("bad -at %q", *at)
69+ }
5470 w, h, ok := parseSize(*size)
5571 if !ok {
5672 return fmt.Errorf("bad -size %q", *size)
@@ -62,13 +78,14 @@ func run() error {
6278 }
6379 defer c.Close()
6480
65- var atoms [7]uint32
81+ var atoms [9]uint32
6682 if err := c.InternAtoms([]string{"WM_PROTOCOLS", "WM_DELETE_WINDOW", "_NET_WM_NAME", "UTF8_STRING",
67- "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", "_NET_WM_WINDOW_TYPE_TOOLTIP"}, false, atoms[:]); err != nil {
83+ "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", "_NET_WM_WINDOW_TYPE_TOOLTIP", "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN"}, false, atoms[:]); err != nil {
6884 return err
6985 }
7086 protocols, deleteWin, netWMName, utf8 := xproto.Atom(atoms[0]), xproto.Atom(atoms[1]), xproto.Atom(atoms[2]), xproto.Atom(atoms[3])
7187 typeAtom, typeMenu, typeTooltip := xproto.Atom(atoms[4]), atoms[5], atoms[6]
88+ netWMState, netWMFullscreen := atoms[7], atoms[8]
7289
7390 b := c.Buf()
7491 xwin, err := c.NewXID()
@@ -82,8 +99,8 @@ func run() error {
8299 win, gc := xproto.Window(xwin), xproto.Gcontext(xgc)
83100
84101 var v xproto.CreateWindowValues
85- v.SetEventMask(xproto.EventMaskExposure | xproto.EventMaskStructureNotify | xproto.EventMaskFocusChange)
86- xproto.CreateWindow(b, 0, win, xproto.Window(c.Root()), 0, 0, uint16(w), uint16(h), 0, xproto.WindowClassInputOutput, 0, &v)
102+ v.SetEventMask(xproto.EventMaskExposure | xproto.EventMaskStructureNotify | xproto.EventMaskFocusChange | xproto.EventMaskPropertyChange)
103+ xproto.CreateWindow(b, 0, win, xproto.Window(c.Root()), int16(atoi(atX)), int16(atoi(atY)), uint16(w), uint16(h), 0, xproto.WindowClassInputOutput, 0, &v)
87104
88105 wmClass := []byte("x11probe\x00" + *class + "\x00")
89106 xproto.ChangeProperty(b, xproto.PropModeReplace, win, xproto.AtomWmClass, xproto.AtomString, 8, uint32(len(wmClass)), wmClass)
@@ -100,6 +117,13 @@ func run() error {
100117 return err
101118 }
102119 time.Sleep(*sleep)
120+ if *at != "0,0" {
121+ // Like games, ask for the rect before the map (a ConfigureRequest the
122+ // window manager sees as the output hint).
123+ var cv xproto.ConfigureWindowValues
124+ cv.SetX(int32(atoi(atX))).SetY(int32(atoi(atY))).SetWidth(uint32(w)).SetHeight(uint32(h))
125+ xproto.ConfigureWindow(b, win, &cv)
126+ }
103127 xproto.MapWindow(b, win)
104128
105129 // The override-redirect window is created once the main window is mapped.
@@ -153,7 +177,21 @@ func run() error {
153177 }
154178 var ovErr error
155179
156- mapped, done := false, false
180+ // Fullscreen requests go to the root window as a client message, as ICCCM
181+ // and EWMH say for a mapped window.
182+ fsMsg := func(action uint32) {
183+ var ev [32]byte
184+ ev[0] = byte(xproto.KindClientMessage)
185+ ev[1] = 32
186+ binary.LittleEndian.PutUint32(ev[4:], uint32(win))
187+ binary.LittleEndian.PutUint32(ev[8:], netWMState)
188+ binary.LittleEndian.PutUint32(ev[12:], action)
189+ binary.LittleEndian.PutUint32(ev[16:], netWMFullscreen)
190+ xproto.SendEvent(b, false, xproto.Window(c.Root()), xproto.EventMaskSubstructureRedirect|xproto.EventMaskSubstructureNotify, &ev)
191+ }
192+ var fsAt, fsOffAt time.Time // zero: nothing pending
193+
194+ mapped, done, isFS := false, false, false
157195 cw, ch := uint16(w), uint16(h) // current size, tracked from ConfigureNotify
158196 hd := &xturbo.Handler{
159197 OnEvent: func(ev *xturbo.Event) {
@@ -172,6 +210,20 @@ func run() error {
172210 if *override {
173211 ovErr = mapOverride()
174212 }
213+ if *fullscreen {
214+ fsAt = time.Now().Add(*fullscreenDelay)
215+ }
216+ if *keyboardGrab {
217+ xproto.GrabKeyboard(b, true, win, 0, xproto.GrabModeAsync, xproto.GrabModeAsync)
218+ fmt.Println("grab")
219+ }
220+ }
221+ case xproto.KindPropertyNotify:
222+ if e := xproto.PropertyNotifyOf(ev); e.Window() == win && xproto.Atom(e.Atom()) == xproto.Atom(netWMState) {
223+ seq := xproto.GetProperty(b, false, win, xproto.Atom(netWMState), xproto.AtomAtom, 0, 64)
224+ if err := c.Expect(seq, 16, 0, 0, 0, 0); err != nil {
225+ ovErr = err
226+ }
175227 }
176228 case xproto.KindFocusIn:
177229 fmt.Println("focus")
@@ -186,6 +238,24 @@ func run() error {
186238 }
187239 }
188240 },
241+ OnReply: func(r *xturbo.Reply) {
242+ rep, ok := xproto.ParseGetPropertyReply(r.Raw)
243+ if !ok {
244+ return
245+ }
246+ on := false
247+ for v := rep.Value(); len(v) >= 4; v = v[4:] {
248+ on = on || binary.LittleEndian.Uint32(v) == netWMFullscreen
249+ }
250+ // Report the state the window manager published, once per change.
251+ switch {
252+ case on && !isFS:
253+ fmt.Printf("fullscreen %dx%d\n", cw, ch)
254+ case !on && isFS:
255+ fmt.Printf("fullscreen off %dx%d\n", cw, ch)
256+ }
257+ isFS = on
258+ },
189259 OnError: func(e *xturbo.XError) { fmt.Fprintln(os.Stderr, "x11probe:", e) },
190260 }
191261 for !done {
@@ -196,8 +266,13 @@ func run() error {
196266 return err
197267 }
198268 timeout := -1
199- if !ovDeadline.IsZero() {
200- timeout = max(int(time.Until(ovDeadline).Milliseconds()), 0)
269+ for _, d := range []time.Time{ovDeadline, fsAt, fsOffAt} {
270+ if !d.IsZero() {
271+ ms := max(int(time.Until(d).Milliseconds())+1, 0)
272+ if timeout < 0 || ms < timeout {
273+ timeout = ms
274+ }
275+ }
201276 }
202277 fds := []unix.PollFd{{Fd: int32(c.Fd()), Events: events}}
203278 if _, err := unix.Poll(fds, timeout); err != nil && err != unix.EINTR {
@@ -206,6 +281,17 @@ func run() error {
206281 if !ovDeadline.IsZero() && !time.Now().Before(ovDeadline) {
207282 unmapOverride("override unmapped")
208283 }
284+ if !fsAt.IsZero() && !time.Now().Before(fsAt) {
285+ fsAt = time.Time{}
286+ fsMsg(1)
287+ if *fullscreenOff > 0 {
288+ fsOffAt = time.Now().Add(*fullscreenOff)
289+ }
290+ }
291+ if !fsOffAt.IsZero() && !time.Now().Before(fsOffAt) {
292+ fsOffAt = time.Time{}
293+ fsMsg(0)
294+ }
209295 if err := c.Dispatch(hd); err != nil {
210296 return err
211297 }
@@ -8,6 +8,13 @@
8 // main one is mapped (prints "override mapped") and unmaps it after8 // main one is mapped (prints "override mapped") and unmaps it after
9 // -override-for (prints "override unmapped"). With -override-dismiss-on-focusout9 // -override-for (prints "override unmapped"). With -override-dismiss-on-focusout
10 // it unmaps it instead when the main window loses focus (prints "dismissed").10 // it unmaps it instead when the main window loses focus (prints "dismissed").
11+//
12+// With -fullscreen it asks the window manager for _NET_WM_STATE_FULLSCREEN
13+// -fullscreen-delay after the window is mapped (0: right at the map) and
14+// prints "fullscreen WxH" when the window is resized; -fullscreen-off asks to
15+// leave it that long after (prints "fullscreen off WxH"). -keyboard-grab
16+// calls XGrabKeyboard on the window once it is mapped (prints "grab").
17+// -at X,Y creates the window at that root position.
11 package main18 package main
12 19
13 import (20 import (
@@ -50,7 +57,16 @@ func run() error {
50 overrideType := flag.String("override-type", "menu", "override window type: menu or tooltip")57 overrideType := flag.String("override-type", "menu", "override window type: menu or tooltip")
51 overrideShape := flag.Bool("override-shape", false, "give the override window an empty input shape")58 overrideShape := flag.Bool("override-shape", false, "give the override window an empty input shape")
52 dismiss := flag.Bool("override-dismiss-on-focusout", false, "unmap the override window when the main window loses focus")59 dismiss := flag.Bool("override-dismiss-on-focusout", false, "unmap the override window when the main window loses focus")
60+ fullscreen := flag.Bool("fullscreen", false, "request _NET_WM_STATE_FULLSCREEN after the window is mapped")
61+ fullscreenDelay := flag.Duration("fullscreen-delay", 0, "delay between the map and the fullscreen request")
62+ fullscreenOff := flag.Duration("fullscreen-off", 0, "leave fullscreen this long after the request (0: never)")
63+ keyboardGrab := flag.Bool("keyboard-grab", false, "XGrabKeyboard on the window once it is mapped")
64+ at := flag.String("at", "0,0", "window position X,Y in root coordinates")
53 flag.Parse()65 flag.Parse()
66+ atX, atY, okAt := strings.Cut(*at, ",")
67+ if !okAt {
68+ return fmt.Errorf("bad -at %q", *at)
69+ }
54 w, h, ok := parseSize(*size)70 w, h, ok := parseSize(*size)
55 if !ok {71 if !ok {
56 return fmt.Errorf("bad -size %q", *size)72 return fmt.Errorf("bad -size %q", *size)
@@ -62,13 +78,14 @@ func run() error {
62 }78 }
63 defer c.Close()79 defer c.Close()
64 80
65- var atoms [7]uint3281+ var atoms [9]uint32
66 if err := c.InternAtoms([]string{"WM_PROTOCOLS", "WM_DELETE_WINDOW", "_NET_WM_NAME", "UTF8_STRING",82 if err := c.InternAtoms([]string{"WM_PROTOCOLS", "WM_DELETE_WINDOW", "_NET_WM_NAME", "UTF8_STRING",
67- "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", "_NET_WM_WINDOW_TYPE_TOOLTIP"}, false, atoms[:]); err != nil {83+ "_NET_WM_WINDOW_TYPE", "_NET_WM_WINDOW_TYPE_DROPDOWN_MENU", "_NET_WM_WINDOW_TYPE_TOOLTIP", "_NET_WM_STATE", "_NET_WM_STATE_FULLSCREEN"}, false, atoms[:]); err != nil {
68 return err84 return err
69 }85 }
70 protocols, deleteWin, netWMName, utf8 := xproto.Atom(atoms[0]), xproto.Atom(atoms[1]), xproto.Atom(atoms[2]), xproto.Atom(atoms[3])86 protocols, deleteWin, netWMName, utf8 := xproto.Atom(atoms[0]), xproto.Atom(atoms[1]), xproto.Atom(atoms[2]), xproto.Atom(atoms[3])
71 typeAtom, typeMenu, typeTooltip := xproto.Atom(atoms[4]), atoms[5], atoms[6]87 typeAtom, typeMenu, typeTooltip := xproto.Atom(atoms[4]), atoms[5], atoms[6]
88+ netWMState, netWMFullscreen := atoms[7], atoms[8]
72 89
73 b := c.Buf()90 b := c.Buf()
74 xwin, err := c.NewXID()91 xwin, err := c.NewXID()
@@ -82,8 +99,8 @@ func run() error {
82 win, gc := xproto.Window(xwin), xproto.Gcontext(xgc)99 win, gc := xproto.Window(xwin), xproto.Gcontext(xgc)
83 100
84 var v xproto.CreateWindowValues101 var v xproto.CreateWindowValues
85- v.SetEventMask(xproto.EventMaskExposure | xproto.EventMaskStructureNotify | xproto.EventMaskFocusChange)102+ v.SetEventMask(xproto.EventMaskExposure | xproto.EventMaskStructureNotify | xproto.EventMaskFocusChange | xproto.EventMaskPropertyChange)
86- xproto.CreateWindow(b, 0, win, xproto.Window(c.Root()), 0, 0, uint16(w), uint16(h), 0, xproto.WindowClassInputOutput, 0, &v)103+ xproto.CreateWindow(b, 0, win, xproto.Window(c.Root()), int16(atoi(atX)), int16(atoi(atY)), uint16(w), uint16(h), 0, xproto.WindowClassInputOutput, 0, &v)
87 104
88 wmClass := []byte("x11probe\x00" + *class + "\x00")105 wmClass := []byte("x11probe\x00" + *class + "\x00")
89 xproto.ChangeProperty(b, xproto.PropModeReplace, win, xproto.AtomWmClass, xproto.AtomString, 8, uint32(len(wmClass)), wmClass)106 xproto.ChangeProperty(b, xproto.PropModeReplace, win, xproto.AtomWmClass, xproto.AtomString, 8, uint32(len(wmClass)), wmClass)
@@ -100,6 +117,13 @@ func run() error {
100 return err117 return err
101 }118 }
102 time.Sleep(*sleep)119 time.Sleep(*sleep)
120+ if *at != "0,0" {
121+ // Like games, ask for the rect before the map (a ConfigureRequest the
122+ // window manager sees as the output hint).
123+ var cv xproto.ConfigureWindowValues
124+ cv.SetX(int32(atoi(atX))).SetY(int32(atoi(atY))).SetWidth(uint32(w)).SetHeight(uint32(h))
125+ xproto.ConfigureWindow(b, win, &cv)
126+ }
103 xproto.MapWindow(b, win)127 xproto.MapWindow(b, win)
104 128
105 // The override-redirect window is created once the main window is mapped.129 // The override-redirect window is created once the main window is mapped.
@@ -153,7 +177,21 @@ func run() error {
153 }177 }
154 var ovErr error178 var ovErr error
155 179
156- mapped, done := false, false180+ // Fullscreen requests go to the root window as a client message, as ICCCM
181+ // and EWMH say for a mapped window.
182+ fsMsg := func(action uint32) {
183+ var ev [32]byte
184+ ev[0] = byte(xproto.KindClientMessage)
185+ ev[1] = 32
186+ binary.LittleEndian.PutUint32(ev[4:], uint32(win))
187+ binary.LittleEndian.PutUint32(ev[8:], netWMState)
188+ binary.LittleEndian.PutUint32(ev[12:], action)
189+ binary.LittleEndian.PutUint32(ev[16:], netWMFullscreen)
190+ xproto.SendEvent(b, false, xproto.Window(c.Root()), xproto.EventMaskSubstructureRedirect|xproto.EventMaskSubstructureNotify, &ev)
191+ }
192+ var fsAt, fsOffAt time.Time // zero: nothing pending
193+
194+ mapped, done, isFS := false, false, false
157 cw, ch := uint16(w), uint16(h) // current size, tracked from ConfigureNotify195 cw, ch := uint16(w), uint16(h) // current size, tracked from ConfigureNotify
158 hd := &xturbo.Handler{196 hd := &xturbo.Handler{
159 OnEvent: func(ev *xturbo.Event) {197 OnEvent: func(ev *xturbo.Event) {
@@ -172,6 +210,20 @@ func run() error {
172 if *override {210 if *override {
173 ovErr = mapOverride()211 ovErr = mapOverride()
174 }212 }
213+ if *fullscreen {
214+ fsAt = time.Now().Add(*fullscreenDelay)
215+ }
216+ if *keyboardGrab {
217+ xproto.GrabKeyboard(b, true, win, 0, xproto.GrabModeAsync, xproto.GrabModeAsync)
218+ fmt.Println("grab")
219+ }
220+ }
221+ case xproto.KindPropertyNotify:
222+ if e := xproto.PropertyNotifyOf(ev); e.Window() == win && xproto.Atom(e.Atom()) == xproto.Atom(netWMState) {
223+ seq := xproto.GetProperty(b, false, win, xproto.Atom(netWMState), xproto.AtomAtom, 0, 64)
224+ if err := c.Expect(seq, 16, 0, 0, 0, 0); err != nil {
225+ ovErr = err
226+ }
175 }227 }
176 case xproto.KindFocusIn:228 case xproto.KindFocusIn:
177 fmt.Println("focus")229 fmt.Println("focus")
@@ -186,6 +238,24 @@ func run() error {
186 }238 }
187 }239 }
188 },240 },
241+ OnReply: func(r *xturbo.Reply) {
242+ rep, ok := xproto.ParseGetPropertyReply(r.Raw)
243+ if !ok {
244+ return
245+ }
246+ on := false
247+ for v := rep.Value(); len(v) >= 4; v = v[4:] {
248+ on = on || binary.LittleEndian.Uint32(v) == netWMFullscreen
249+ }
250+ // Report the state the window manager published, once per change.
251+ switch {
252+ case on && !isFS:
253+ fmt.Printf("fullscreen %dx%d\n", cw, ch)
254+ case !on && isFS:
255+ fmt.Printf("fullscreen off %dx%d\n", cw, ch)
256+ }
257+ isFS = on
258+ },
189 OnError: func(e *xturbo.XError) { fmt.Fprintln(os.Stderr, "x11probe:", e) },259 OnError: func(e *xturbo.XError) { fmt.Fprintln(os.Stderr, "x11probe:", e) },
190 }260 }
191 for !done {261 for !done {
@@ -196,8 +266,13 @@ func run() error {
196 return err266 return err
197 }267 }
198 timeout := -1268 timeout := -1
199- if !ovDeadline.IsZero() {269+ for _, d := range []time.Time{ovDeadline, fsAt, fsOffAt} {
200- timeout = max(int(time.Until(ovDeadline).Milliseconds()), 0)270+ if !d.IsZero() {
271+ ms := max(int(time.Until(d).Milliseconds())+1, 0)
272+ if timeout < 0 || ms < timeout {
273+ timeout = ms
274+ }
275+ }
201 }276 }
202 fds := []unix.PollFd{{Fd: int32(c.Fd()), Events: events}}277 fds := []unix.PollFd{{Fd: int32(c.Fd()), Events: events}}
203 if _, err := unix.Poll(fds, timeout); err != nil && err != unix.EINTR {278 if _, err := unix.Poll(fds, timeout); err != nil && err != unix.EINTR {
@@ -206,6 +281,17 @@ func run() error {
206 if !ovDeadline.IsZero() && !time.Now().Before(ovDeadline) {281 if !ovDeadline.IsZero() && !time.Now().Before(ovDeadline) {
207 unmapOverride("override unmapped")282 unmapOverride("override unmapped")
208 }283 }
284+ if !fsAt.IsZero() && !time.Now().Before(fsAt) {
285+ fsAt = time.Time{}
286+ fsMsg(1)
287+ if *fullscreenOff > 0 {
288+ fsOffAt = time.Now().Add(*fullscreenOff)
289+ }
290+ }
291+ if !fsOffAt.IsZero() && !time.Now().Before(fsOffAt) {
292+ fsOffAt = time.Time{}
293+ fsMsg(0)
294+ }
209 if err := c.Dispatch(hd); err != nil {295 if err := c.Dispatch(hd); err != nil {
210 return err296 return err
211 }297 }
M internal/app/xwayland_test.go +184 -1
@@ -51,6 +51,13 @@ type xwaylandEnv struct {
5151 // X11 display. It skips the test without Xwayland and stops everything when
5252 // the test ends.
5353 func startXwayland(t *testing.T) *xwaylandEnv {
54+ t.Helper()
55+ return startXwaylandWith(t, [][2]int{{xwaylandW, xwaylandH}}, nil)
56+}
57+
58+// startXwaylandWith is startXwayland with the given headless outputs, left to
59+// right, and an optional change to the default config.
60+func startXwaylandWith(t *testing.T, sizes [][2]int, mutate func(*ports.Config)) *xwaylandEnv {
5461 t.Helper()
5562 if _, err := exec.LookPath("Xwayland"); err != nil {
5663 t.Skip("Xwayland not on PATH")
@@ -73,11 +80,14 @@ func startXwayland(t *testing.T) *xwaylandEnv {
7380 ctx, cancel := context.WithCancel(zerowrap.WithCtx(context.Background(), zerowrap.New(zerowrap.Config{Level: "info", Format: "json", Output: logs})))
7481 cfg := config.Defaults()
7582 cfg.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}
83+ if mutate != nil {
84+ mutate(&cfg)
85+ }
7686 done := make(chan error, 1)
7787 go func() {
7888 done <- Run(ctx, Options{
7989 Backend: "headless", NoTerminal: true, Config: cfg, Script: script,
80- ScreenshotDir: shots, Sizes: [][2]int{{xwaylandW, xwaylandH}},
90+ ScreenshotDir: shots, Sizes: sizes,
8191 })
8292 }()
8393 t.Cleanup(func() {
@@ -392,3 +402,176 @@ func TestXwaylandOverrideShape(t *testing.T) {
392402 })
393403 until(t, "only the toplevel in state", func() bool { return len(readState(e.statePath).Windows) == 1 })
394404 }
405+
406+// fullOutput is the share of the output screenshot at path that is green.
407+func fullOutput(path string) float64 {
408+ return greenShare(path, image.Rect(0, 0, xwaylandW, xwaylandH))
409+}
410+
411+// windowOf returns the state window with the given pid.
412+func windowOf(st statefile.State, pid int) (statefile.Window, bool) {
413+ for _, w := range st.Windows {
414+ if w.PID == pid {
415+ return w, true
416+ }
417+ }
418+ return statefile.Window{}, false
419+}
420+
421+// TestXwaylandFullscreen: a fullscreen request after the 1 s grace fills the
422+// output, the toggle bind leaves it, and a request made right at the map is
423+// ignored (the grace, current policy).
424+func TestXwaylandFullscreen(t *testing.T) {
425+ // Gaps make a tile visibly smaller than the output.
426+ e := startXwaylandWith(t, [][2]int{{xwaylandW, xwaylandH}}, func(c *ports.Config) { c.Layout.Gaps = 20 })
427+ shot := filepath.Join(e.shots, "latest.png")
428+ corner := image.Rect(0, 0, 4, 4)
429+ p := startProbe(t, e.bin, e.display, "-fullscreen", "-fullscreen-delay", "2s")
430+ until(t, "tiled with a gap", func() bool {
431+ return strings.Contains(p.out.String(), "mapped ") && fullOutput(shot) > 0.3 && greenShare(shot, corner) == 0
432+ })
433+ until(t, "probe fullscreen at output size", func() bool {
434+ return strings.Contains(p.out.String(), "fullscreen 640x360")
435+ })
436+ until(t, "output all green", func() bool { return fullOutput(shot) >= 0.99 })
437+
438+ // The toggle bind (cmd+shift+f) leaves fullscreen.
439+ if _, err := io.WriteString(e.script, "key Super+Shift+f\n"); err != nil {
440+ t.Fatal(err)
441+ }
442+ until(t, "probe left fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen off ") })
443+ until(t, "gap back", func() bool { return greenShare(shot, corner) == 0 && fullOutput(shot) < 0.99 })
444+}
445+
446+// TestXwaylandFullscreenOff: the client leaves fullscreen itself.
447+func TestXwaylandFullscreenOff(t *testing.T) {
448+ e := startXwayland(t)
449+ p := startProbe(t, e.bin, e.display, "-fullscreen", "-fullscreen-delay", "1500ms", "-fullscreen-off", "1s")
450+ until(t, "fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen 640x360") })
451+ until(t, "fullscreen off", func() bool { return strings.Contains(p.out.String(), "fullscreen off ") })
452+ until(t, "tiled", func() bool {
453+ st := readState(e.statePath)
454+ return len(st.Windows) == 1 && func() bool { _, ok := tileRect(st, st.Windows[0].ID); return ok }()
455+ })
456+}
457+
458+// TestXwaylandFullscreenGrace: a request made at once after the map stays
459+// tiled (fullscreenGrace in core).
460+func TestXwaylandFullscreenGrace(t *testing.T) {
461+ e := startXwayland(t)
462+ p := startProbe(t, e.bin, e.display, "-fullscreen")
463+ until(t, "mapped", func() bool { return strings.Contains(p.out.String(), "mapped ") })
464+ until(t, "tiled window", func() bool {
465+ st := readState(e.statePath)
466+ return len(st.Windows) == 1 && func() bool { _, ok := tileRect(st, st.Windows[0].ID); return ok }()
467+ })
468+ // Stay inside the grace, then check it is still not fullscreen.
469+ time.Sleep(500 * time.Millisecond)
470+ st := readState(e.statePath)
471+ if _, ok := tileRect(st, st.Windows[0].ID); !ok {
472+ t.Error("window went fullscreen inside the grace")
473+ }
474+ if strings.Contains(p.out.String(), "fullscreen ") {
475+ t.Errorf("probe saw a fullscreen resize inside the grace: %q", p.out.String())
476+ }
477+}
478+
479+// TestXwaylandKeyboardGrab: while a fullscreen, focused X11 client holds the
480+// keyboard grab the close bind does not fire; after it leaves fullscreen the
481+// binds work again.
482+func TestXwaylandKeyboardGrab(t *testing.T) {
483+ e := startXwayland(t)
484+ p := startProbe(t, e.bin, e.display, "-fullscreen", "-fullscreen-delay", "1500ms", "-fullscreen-off", "2500ms", "-keyboard-grab")
485+ until(t, "fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen 640x360") })
486+ until(t, "grab", func() bool { return strings.Contains(p.out.String(), "grab") })
487+ until(t, "probe focus", func() bool { return strings.Contains(p.out.String(), "focus") })
488+ if _, err := io.WriteString(e.script, "key Super+q\n"); err != nil {
489+ t.Fatal(err)
490+ }
491+ select {
492+ case err := <-p.waited:
493+ t.Fatalf("probe closed (%v) by Super+q despite the keyboard grab", err)
494+ case <-time.After(2 * time.Second):
495+ }
496+
497+ // The probe leaves fullscreen itself; its grab stays, but the binds work again.
498+ until(t, "fullscreen off", func() bool { return strings.Contains(p.out.String(), "fullscreen off ") })
499+ if _, err := io.WriteString(e.script, "key Super+q\n"); err != nil {
500+ t.Fatal(err)
501+ }
502+ select {
503+ case err := <-p.waited:
504+ if err != nil {
505+ t.Errorf("probe exited with %v, want 0", err)
506+ }
507+ case <-time.After(2 * time.Second):
508+ t.Fatal("Super+q did not close the client after it left fullscreen")
509+ }
510+}
511+
512+// TestXwaylandKeyboardGrabWindowed: a grab on a windowed client does not lock
513+// the binds.
514+func TestXwaylandKeyboardGrabWindowed(t *testing.T) {
515+ e := startXwayland(t)
516+ p := startProbe(t, e.bin, e.display, "-keyboard-grab")
517+ until(t, "grab", func() bool { return strings.Contains(p.out.String(), "grab") })
518+ until(t, "probe focus", func() bool { return strings.Contains(p.out.String(), "focus") })
519+ if _, err := io.WriteString(e.script, "key Super+q\n"); err != nil {
520+ t.Fatal(err)
521+ }
522+ select {
523+ case err := <-p.waited:
524+ if err != nil {
525+ t.Errorf("probe exited with %v, want 0", err)
526+ }
527+ case <-time.After(2 * time.Second):
528+ t.Fatal("Super+q did not close a windowed client that holds a keyboard grab")
529+ }
530+}
531+
532+// TestXwaylandOutputHint: with two outputs a window created at the origin of
533+// the second one opens on it, and a fullscreen request fills that output.
534+func TestXwaylandOutputHint(t *testing.T) {
535+ sizes := [][2]int{{xwaylandW, xwaylandH}, {xwaylandW, xwaylandH}}
536+ e := startXwaylandWith(t, sizes, nil)
537+ p := startProbe(t, e.bin, e.display, "-size", "640x360", "-at", "640,0", "-fullscreen", "-fullscreen-delay", "1500ms")
538+ var w statefile.Window
539+ until(t, "window on HEADLESS-2", func() bool {
540+ var ok bool
541+ w, ok = windowOf(readState(e.statePath), p.cmd.Process.Pid)
542+ if ok && w.Output != "HEADLESS-2" {
543+ t.Logf("window output = %s", w.Output)
544+ }
545+ return ok && w.Output == "HEADLESS-2"
546+ })
547+ until(t, "probe fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen 640x360") })
548+ until(t, "HEADLESS-2 all green", func() bool {
549+ return fullOutput(filepath.Join(e.shots, "HEADLESS-2", "latest.png")) >= 0.99
550+ })
551+ if g := fullOutput(filepath.Join(e.shots, "HEADLESS-1", "latest.png")); g > 0.1 {
552+ t.Errorf("HEADLESS-1 green share = %.2f, want empty", g)
553+ }
554+}
555+
556+// TestXwaylandClassRule: [window-rule] matches the WM_CLASS of an X11 window
557+// the way it matches a Wayland app ID (steam_app_<id> from Proton).
558+func TestXwaylandClassRule(t *testing.T) {
559+ yes := true
560+ e := startXwaylandWith(t, [][2]int{{xwaylandW, xwaylandH}}, func(c *ports.Config) {
561+ c.Rules = append(c.Rules, ports.WindowRule{Name: "games", AppID: regexp.MustCompile(`^steam_app_\d+$`), Floating: &yes})
562+ })
563+ startProbe(t, e.bin, e.display, "-class", "steam_app_413150")
564+ until(t, "floating steam_app window", func() bool {
565+ st := readState(e.statePath)
566+ return len(st.Windows) == 1 && st.Windows[0].AppID == "steam_app_413150" && st.Windows[0].Floating
567+ })
568+ startProbe(t, e.bin, e.display, "-class", "Other")
569+ until(t, "other class tiled", func() bool {
570+ for _, w := range readState(e.statePath).Windows {
571+ if w.AppID == "Other" {
572+ return !w.Floating
573+ }
574+ }
575+ return false
576+ })
577+}
@@ -51,6 +51,13 @@ type xwaylandEnv struct {
51 // X11 display. It skips the test without Xwayland and stops everything when51 // X11 display. It skips the test without Xwayland and stops everything when
52 // the test ends.52 // the test ends.
53 func startXwayland(t *testing.T) *xwaylandEnv {53 func startXwayland(t *testing.T) *xwaylandEnv {
54+ t.Helper()
55+ return startXwaylandWith(t, [][2]int{{xwaylandW, xwaylandH}}, nil)
56+}
57+
58+// startXwaylandWith is startXwayland with the given headless outputs, left to
59+// right, and an optional change to the default config.
60+func startXwaylandWith(t *testing.T, sizes [][2]int, mutate func(*ports.Config)) *xwaylandEnv {
54 t.Helper()61 t.Helper()
55 if _, err := exec.LookPath("Xwayland"); err != nil {62 if _, err := exec.LookPath("Xwayland"); err != nil {
56 t.Skip("Xwayland not on PATH")63 t.Skip("Xwayland not on PATH")
@@ -73,11 +80,14 @@ func startXwayland(t *testing.T) *xwaylandEnv {
73 ctx, cancel := context.WithCancel(zerowrap.WithCtx(context.Background(), zerowrap.New(zerowrap.Config{Level: "info", Format: "json", Output: logs})))80 ctx, cancel := context.WithCancel(zerowrap.WithCtx(context.Background(), zerowrap.New(zerowrap.Config{Level: "info", Format: "json", Output: logs})))
74 cfg := config.Defaults()81 cfg := config.Defaults()
75 cfg.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}82 cfg.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}
83+ if mutate != nil {
84+ mutate(&cfg)
85+ }
76 done := make(chan error, 1)86 done := make(chan error, 1)
77 go func() {87 go func() {
78 done <- Run(ctx, Options{88 done <- Run(ctx, Options{
79 Backend: "headless", NoTerminal: true, Config: cfg, Script: script,89 Backend: "headless", NoTerminal: true, Config: cfg, Script: script,
80- ScreenshotDir: shots, Sizes: [][2]int{{xwaylandW, xwaylandH}},90+ ScreenshotDir: shots, Sizes: sizes,
81 })91 })
82 }()92 }()
83 t.Cleanup(func() {93 t.Cleanup(func() {
@@ -392,3 +402,176 @@ func TestXwaylandOverrideShape(t *testing.T) {
392 })402 })
393 until(t, "only the toplevel in state", func() bool { return len(readState(e.statePath).Windows) == 1 })403 until(t, "only the toplevel in state", func() bool { return len(readState(e.statePath).Windows) == 1 })
394 }404 }
405+
406+// fullOutput is the share of the output screenshot at path that is green.
407+func fullOutput(path string) float64 {
408+ return greenShare(path, image.Rect(0, 0, xwaylandW, xwaylandH))
409+}
410+
411+// windowOf returns the state window with the given pid.
412+func windowOf(st statefile.State, pid int) (statefile.Window, bool) {
413+ for _, w := range st.Windows {
414+ if w.PID == pid {
415+ return w, true
416+ }
417+ }
418+ return statefile.Window{}, false
419+}
420+
421+// TestXwaylandFullscreen: a fullscreen request after the 1 s grace fills the
422+// output, the toggle bind leaves it, and a request made right at the map is
423+// ignored (the grace, current policy).
424+func TestXwaylandFullscreen(t *testing.T) {
425+ // Gaps make a tile visibly smaller than the output.
426+ e := startXwaylandWith(t, [][2]int{{xwaylandW, xwaylandH}}, func(c *ports.Config) { c.Layout.Gaps = 20 })
427+ shot := filepath.Join(e.shots, "latest.png")
428+ corner := image.Rect(0, 0, 4, 4)
429+ p := startProbe(t, e.bin, e.display, "-fullscreen", "-fullscreen-delay", "2s")
430+ until(t, "tiled with a gap", func() bool {
431+ return strings.Contains(p.out.String(), "mapped ") && fullOutput(shot) > 0.3 && greenShare(shot, corner) == 0
432+ })
433+ until(t, "probe fullscreen at output size", func() bool {
434+ return strings.Contains(p.out.String(), "fullscreen 640x360")
435+ })
436+ until(t, "output all green", func() bool { return fullOutput(shot) >= 0.99 })
437+
438+ // The toggle bind (cmd+shift+f) leaves fullscreen.
439+ if _, err := io.WriteString(e.script, "key Super+Shift+f\n"); err != nil {
440+ t.Fatal(err)
441+ }
442+ until(t, "probe left fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen off ") })
443+ until(t, "gap back", func() bool { return greenShare(shot, corner) == 0 && fullOutput(shot) < 0.99 })
444+}
445+
446+// TestXwaylandFullscreenOff: the client leaves fullscreen itself.
447+func TestXwaylandFullscreenOff(t *testing.T) {
448+ e := startXwayland(t)
449+ p := startProbe(t, e.bin, e.display, "-fullscreen", "-fullscreen-delay", "1500ms", "-fullscreen-off", "1s")
450+ until(t, "fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen 640x360") })
451+ until(t, "fullscreen off", func() bool { return strings.Contains(p.out.String(), "fullscreen off ") })
452+ until(t, "tiled", func() bool {
453+ st := readState(e.statePath)
454+ return len(st.Windows) == 1 && func() bool { _, ok := tileRect(st, st.Windows[0].ID); return ok }()
455+ })
456+}
457+
458+// TestXwaylandFullscreenGrace: a request made at once after the map stays
459+// tiled (fullscreenGrace in core).
460+func TestXwaylandFullscreenGrace(t *testing.T) {
461+ e := startXwayland(t)
462+ p := startProbe(t, e.bin, e.display, "-fullscreen")
463+ until(t, "mapped", func() bool { return strings.Contains(p.out.String(), "mapped ") })
464+ until(t, "tiled window", func() bool {
465+ st := readState(e.statePath)
466+ return len(st.Windows) == 1 && func() bool { _, ok := tileRect(st, st.Windows[0].ID); return ok }()
467+ })
468+ // Stay inside the grace, then check it is still not fullscreen.
469+ time.Sleep(500 * time.Millisecond)
470+ st := readState(e.statePath)
471+ if _, ok := tileRect(st, st.Windows[0].ID); !ok {
472+ t.Error("window went fullscreen inside the grace")
473+ }
474+ if strings.Contains(p.out.String(), "fullscreen ") {
475+ t.Errorf("probe saw a fullscreen resize inside the grace: %q", p.out.String())
476+ }
477+}
478+
479+// TestXwaylandKeyboardGrab: while a fullscreen, focused X11 client holds the
480+// keyboard grab the close bind does not fire; after it leaves fullscreen the
481+// binds work again.
482+func TestXwaylandKeyboardGrab(t *testing.T) {
483+ e := startXwayland(t)
484+ p := startProbe(t, e.bin, e.display, "-fullscreen", "-fullscreen-delay", "1500ms", "-fullscreen-off", "2500ms", "-keyboard-grab")
485+ until(t, "fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen 640x360") })
486+ until(t, "grab", func() bool { return strings.Contains(p.out.String(), "grab") })
487+ until(t, "probe focus", func() bool { return strings.Contains(p.out.String(), "focus") })
488+ if _, err := io.WriteString(e.script, "key Super+q\n"); err != nil {
489+ t.Fatal(err)
490+ }
491+ select {
492+ case err := <-p.waited:
493+ t.Fatalf("probe closed (%v) by Super+q despite the keyboard grab", err)
494+ case <-time.After(2 * time.Second):
495+ }
496+
497+ // The probe leaves fullscreen itself; its grab stays, but the binds work again.
498+ until(t, "fullscreen off", func() bool { return strings.Contains(p.out.String(), "fullscreen off ") })
499+ if _, err := io.WriteString(e.script, "key Super+q\n"); err != nil {
500+ t.Fatal(err)
501+ }
502+ select {
503+ case err := <-p.waited:
504+ if err != nil {
505+ t.Errorf("probe exited with %v, want 0", err)
506+ }
507+ case <-time.After(2 * time.Second):
508+ t.Fatal("Super+q did not close the client after it left fullscreen")
509+ }
510+}
511+
512+// TestXwaylandKeyboardGrabWindowed: a grab on a windowed client does not lock
513+// the binds.
514+func TestXwaylandKeyboardGrabWindowed(t *testing.T) {
515+ e := startXwayland(t)
516+ p := startProbe(t, e.bin, e.display, "-keyboard-grab")
517+ until(t, "grab", func() bool { return strings.Contains(p.out.String(), "grab") })
518+ until(t, "probe focus", func() bool { return strings.Contains(p.out.String(), "focus") })
519+ if _, err := io.WriteString(e.script, "key Super+q\n"); err != nil {
520+ t.Fatal(err)
521+ }
522+ select {
523+ case err := <-p.waited:
524+ if err != nil {
525+ t.Errorf("probe exited with %v, want 0", err)
526+ }
527+ case <-time.After(2 * time.Second):
528+ t.Fatal("Super+q did not close a windowed client that holds a keyboard grab")
529+ }
530+}
531+
532+// TestXwaylandOutputHint: with two outputs a window created at the origin of
533+// the second one opens on it, and a fullscreen request fills that output.
534+func TestXwaylandOutputHint(t *testing.T) {
535+ sizes := [][2]int{{xwaylandW, xwaylandH}, {xwaylandW, xwaylandH}}
536+ e := startXwaylandWith(t, sizes, nil)
537+ p := startProbe(t, e.bin, e.display, "-size", "640x360", "-at", "640,0", "-fullscreen", "-fullscreen-delay", "1500ms")
538+ var w statefile.Window
539+ until(t, "window on HEADLESS-2", func() bool {
540+ var ok bool
541+ w, ok = windowOf(readState(e.statePath), p.cmd.Process.Pid)
542+ if ok && w.Output != "HEADLESS-2" {
543+ t.Logf("window output = %s", w.Output)
544+ }
545+ return ok && w.Output == "HEADLESS-2"
546+ })
547+ until(t, "probe fullscreen", func() bool { return strings.Contains(p.out.String(), "fullscreen 640x360") })
548+ until(t, "HEADLESS-2 all green", func() bool {
549+ return fullOutput(filepath.Join(e.shots, "HEADLESS-2", "latest.png")) >= 0.99
550+ })
551+ if g := fullOutput(filepath.Join(e.shots, "HEADLESS-1", "latest.png")); g > 0.1 {
552+ t.Errorf("HEADLESS-1 green share = %.2f, want empty", g)
553+ }
554+}
555+
556+// TestXwaylandClassRule: [window-rule] matches the WM_CLASS of an X11 window
557+// the way it matches a Wayland app ID (steam_app_<id> from Proton).
558+func TestXwaylandClassRule(t *testing.T) {
559+ yes := true
560+ e := startXwaylandWith(t, [][2]int{{xwaylandW, xwaylandH}}, func(c *ports.Config) {
561+ c.Rules = append(c.Rules, ports.WindowRule{Name: "games", AppID: regexp.MustCompile(`^steam_app_\d+$`), Floating: &yes})
562+ })
563+ startProbe(t, e.bin, e.display, "-class", "steam_app_413150")
564+ until(t, "floating steam_app window", func() bool {
565+ st := readState(e.statePath)
566+ return len(st.Windows) == 1 && st.Windows[0].AppID == "steam_app_413150" && st.Windows[0].Floating
567+ })
568+ startProbe(t, e.bin, e.display, "-class", "Other")
569+ until(t, "other class tiled", func() bool {
570+ for _, w := range readState(e.statePath).Windows {
571+ if w.AppID == "Other" {
572+ return !w.Floating
573+ }
574+ }
575+ return false
576+ })
577+}
M internal/core/rules_test.go +44 -0
@@ -411,3 +411,47 @@ func TestRuleWidthWithFixedOverflow(t *testing.T) {
411411 t.Fatalf("%+v", s.Windows)
412412 }
413413 }
414+
415+func TestMapAtOutputPlacesOnThatOutput(t *testing.T) {
416+ r := startMulti(t, nil, left, right)
417+ r.mapApp(t, 1, "term")
418+ // DP-2 starts at layout x=200: a game mapping at its rect goes there.
419+ r.client <- ports.WindowMapped{ID: 2, AppID: "game", HasAt: true, AtX: 200, AtY: 0}
420+ if w := stWindow(r.stateWith(t, 2), 2); w.Output != "DP-2" {
421+ t.Fatalf("not on DP-2: %+v", w)
422+ }
423+}
424+
425+func TestMapAtOutputKeepsRuleMonitor(t *testing.T) {
426+ r := startMulti(t, func(c *ports.Config) {
427+ c.Rules = []ports.WindowRule{winRule("g", "game", func(r *ports.WindowRule) { r.Monitor = "DP-1" })}
428+ }, left, right)
429+ r.client <- ports.WindowMapped{ID: 2, AppID: "game", HasAt: true, AtX: 200, AtY: 0}
430+ if w := stWindow(r.stateWith(t, 2), 2); w.Output != "DP-1" {
431+ t.Fatalf("rule monitor lost to the hint: %+v", w)
432+ }
433+}
434+
435+func TestMapAtOutputKeepsRuleWorkspace(t *testing.T) {
436+ r := startMulti(t, func(c *ports.Config) {
437+ c.Rules = []ports.WindowRule{winRule("g", "game", func(r *ports.WindowRule) { r.Workspace = "1" })}
438+ }, left, right)
439+ r.client <- ports.WindowMapped{ID: 2, AppID: "game", HasAt: true, AtX: 200, AtY: 0}
440+ if w := stWindow(r.stateWith(t, 2), 2); w.Output != "DP-1" {
441+ t.Fatalf("rule workspace lost to the hint: %+v", w)
442+ }
443+}
444+
445+func TestRuleMatchesSteamAppClass(t *testing.T) {
446+ r := startMulti(t, func(c *ports.Config) {
447+ c.Rules = []ports.WindowRule{winRule("steam", `steam_app_\d+`, func(r *ports.WindowRule) { r.Floating = ruleOn() })}
448+ }, left)
449+ r.client <- ports.WindowMapped{ID: 1, AppID: "steam_app_892970", Positioned: true}
450+ if w := stWindow(r.stateWith(t, 1), 1); !w.Floating {
451+ t.Fatalf("steam_app rule did not match: %+v", w)
452+ }
453+ r.client <- ports.WindowMapped{ID: 2, AppID: "steam_app_x", Positioned: true}
454+ if w := stWindow(r.stateWith(t, 2), 2); w.Floating {
455+ t.Fatalf("non-numeric id matched: %+v", w)
456+ }
457+}
@@ -411,3 +411,47 @@ func TestRuleWidthWithFixedOverflow(t *testing.T) {
411 t.Fatalf("%+v", s.Windows)411 t.Fatalf("%+v", s.Windows)
412 }412 }
413 }413 }
414+
415+func TestMapAtOutputPlacesOnThatOutput(t *testing.T) {
416+ r := startMulti(t, nil, left, right)
417+ r.mapApp(t, 1, "term")
418+ // DP-2 starts at layout x=200: a game mapping at its rect goes there.
419+ r.client <- ports.WindowMapped{ID: 2, AppID: "game", HasAt: true, AtX: 200, AtY: 0}
420+ if w := stWindow(r.stateWith(t, 2), 2); w.Output != "DP-2" {
421+ t.Fatalf("not on DP-2: %+v", w)
422+ }
423+}
424+
425+func TestMapAtOutputKeepsRuleMonitor(t *testing.T) {
426+ r := startMulti(t, func(c *ports.Config) {
427+ c.Rules = []ports.WindowRule{winRule("g", "game", func(r *ports.WindowRule) { r.Monitor = "DP-1" })}
428+ }, left, right)
429+ r.client <- ports.WindowMapped{ID: 2, AppID: "game", HasAt: true, AtX: 200, AtY: 0}
430+ if w := stWindow(r.stateWith(t, 2), 2); w.Output != "DP-1" {
431+ t.Fatalf("rule monitor lost to the hint: %+v", w)
432+ }
433+}
434+
435+func TestMapAtOutputKeepsRuleWorkspace(t *testing.T) {
436+ r := startMulti(t, func(c *ports.Config) {
437+ c.Rules = []ports.WindowRule{winRule("g", "game", func(r *ports.WindowRule) { r.Workspace = "1" })}
438+ }, left, right)
439+ r.client <- ports.WindowMapped{ID: 2, AppID: "game", HasAt: true, AtX: 200, AtY: 0}
440+ if w := stWindow(r.stateWith(t, 2), 2); w.Output != "DP-1" {
441+ t.Fatalf("rule workspace lost to the hint: %+v", w)
442+ }
443+}
444+
445+func TestRuleMatchesSteamAppClass(t *testing.T) {
446+ r := startMulti(t, func(c *ports.Config) {
447+ c.Rules = []ports.WindowRule{winRule("steam", `steam_app_\d+`, func(r *ports.WindowRule) { r.Floating = ruleOn() })}
448+ }, left)
449+ r.client <- ports.WindowMapped{ID: 1, AppID: "steam_app_892970", Positioned: true}
450+ if w := stWindow(r.stateWith(t, 1), 1); !w.Floating {
451+ t.Fatalf("steam_app rule did not match: %+v", w)
452+ }
453+ r.client <- ports.WindowMapped{ID: 2, AppID: "steam_app_x", Positioned: true}
454+ if w := stWindow(r.stateWith(t, 2), 2); w.Floating {
455+ t.Fatalf("non-numeric id matched: %+v", w)
456+ }
457+}
M internal/core/spawn_placement.go +9 -1
@@ -139,7 +139,15 @@ func (p *spawnPlacement) place(c *Core, v ports.WindowMapped) {
139139 }
140140 }
141141 if s, _ := c.screenOf(v.ID); s == nil {
142- if eff, ok := c.ruleFor(v); ok {
142+ eff, ok := c.ruleFor(v)
143+ // A window mapping at an output's rect goes to that output unless a
144+ // rule names a monitor or workspace.
145+ if v.HasAt && !v.Remap && eff.monitor == "" && eff.workspace == "" && eff.number == 0 {
146+ if i := c.screenAt(float64(v.AtX), float64(v.AtY)); i >= 0 && i != c.focusScreen {
147+ eff.monitor, ok = c.screens[i].name(), true
148+ }
149+ }
150+ if ok {
143151 c.placeByRule(v, eff)
144152 return
145153 }
@@ -139,7 +139,15 @@ func (p *spawnPlacement) place(c *Core, v ports.WindowMapped) {
139 }139 }
140 }140 }
141 if s, _ := c.screenOf(v.ID); s == nil {141 if s, _ := c.screenOf(v.ID); s == nil {
142- if eff, ok := c.ruleFor(v); ok {142+ eff, ok := c.ruleFor(v)
143+ // A window mapping at an output's rect goes to that output unless a
144+ // rule names a monitor or workspace.
145+ if v.HasAt && !v.Remap && eff.monitor == "" && eff.workspace == "" && eff.number == 0 {
146+ if i := c.screenAt(float64(v.AtX), float64(v.AtY)); i >= 0 && i != c.focusScreen {
147+ eff.monitor, ok = c.screens[i].name(), true
148+ }
149+ }
150+ if ok {
143 c.placeByRule(v, eff)151 c.placeByRule(v, eff)
144 return152 return
145 }153 }
M internal/ports/client_events.go +5 -0
@@ -29,6 +29,11 @@ type WindowMapped struct {
2929 // Modal is set for a dialog that blocks its parent (xdg_dialog_v1):
3030 // focusing the parent focuses the dialog.
3131 Modal bool
32+ // HasAt asks for the screen containing the layout point (AtX, AtY) when
33+ // no rule sets a monitor: the X11 host sets it for a window that maps at
34+ // exactly one output's rect.
35+ HasAt bool
36+ AtX, AtY int
3237 }
3338
3439 // SlotEnv is the environment variable neferwl sets on processes it spawns
@@ -29,6 +29,11 @@ type WindowMapped struct {
29 // Modal is set for a dialog that blocks its parent (xdg_dialog_v1):29 // Modal is set for a dialog that blocks its parent (xdg_dialog_v1):
30 // focusing the parent focuses the dialog.30 // focusing the parent focuses the dialog.
31 Modal bool31 Modal bool
32+ // HasAt asks for the screen containing the layout point (AtX, AtY) when
33+ // no rule sets a monitor: the X11 host sets it for a window that maps at
34+ // exactly one output's rect.
35+ HasAt bool
36+ AtX, AtY int
32 }37 }
33 38
34 // SlotEnv is the environment variable neferwl sets on processes it spawns39 // SlotEnv is the environment variable neferwl sets on processes it spawns

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 23

Tags 10

↑↓ moveenter openesc close