detached 4e94aa9

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

# Conflicts:
#	Makefile
#	internal/adapters/wayland/xwm/atoms.go
#	internal/adapters/wayland/xwm/events.go
#	internal/adapters/wayland/xwm/testdata/streams/property_unchanged.hex
#	internal/adapters/wayland/xwm/testdata/streams/steady.hex
commit
4e94aa916a18e1bcea7b6cf3bbfdcfa47b233ca7
author
brice · · 2026-10-22 16:28 UTC
merge of
aa3d2dd + bed1119 · diff against the first parent
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
checks
0/1
23 files · +3725 -2970
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|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations|TestSelectionCopyAllocations|TestSelectionCopyAllocationsWaylandToX|TestSelectionINCRChunkAllocations)$$' -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|TestSelectionCopyAllocations|TestSelectionCopyAllocationsWaylandToX|TestSelectionINCRChunkAllocations|TestXSettingsNoChangeAllocations)$$' -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|TestFullscreenConfigureAllocations|TestKeyboardGrabSyncAllocations|TestSelectionCopyAllocations|TestSelectionCopyAllocationsWaylandToX|TestSelectionINCRChunkAllocations)$$' -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|TestSelectionCopyAllocations|TestSelectionCopyAllocationsWaylandToX|TestSelectionINCRChunkAllocations|TestXSettingsNoChangeAllocations)$$' -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 docs/config.md +3 -2
@@ -1,6 +1,6 @@
11 # Configuration
22
3-NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup` and `xwayland`, which apply at the next start.
3+NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup`, `xwayland` and `xwayland.xsettings`, which apply at the next start.
44
55 ```sh
66 neferwl --config <path> # use another file
@@ -28,6 +28,7 @@ See [examples/config](../examples/config) for every key with its default.
2828 | `terminal.auto-open` | `first` | Open a terminal on the first workspace (`first`), on every empty one (`all`), or never (`off`) |
2929 | `startup` | none | Commands run at session start, separated by `;` |
3030 | `xwayland` | `satellite` | `off`, `satellite`, `builtin` or a satellite binary path |
31+| `xwayland.xsettings` | `on` | With `xwayland = builtin`, publish the cursor theme, cursor size and DPI to X11 apps through XSETTINGS (restart required); `off` leaves them to the apps |
3132 | `background` | `#111111` | Background color |
3233 | `border.radius` | `0` | Corner radius in logical pixels, `0` to `64`; floats always, tiles only with gaps |
3334 | `border.width` | `2` | Border width in pixels; `0` hides borders |
@@ -103,7 +104,7 @@ destination output, even if that output has no windows. Same-screen workspace
103104 switches and mouse focus do not trigger a flash.
104105 It runs when `animations = on`.
105106
106-`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.
107+`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. X11 apps get the cursor theme and size from `XCURSOR_THEME` and `XCURSOR_SIZE`, the DPI of the first output (96 times its scale) through XSETTINGS (`xwayland.xsettings = off` turns it off), and the themed arrow on the X background. Clipboard is not supported; use `satellite` if you need it.
107108
108109 ## Automatic terminal
109110
@@ -1,6 +1,6 @@
1 # Configuration1 # Configuration
2 2
3-NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup` and `xwayland`, which apply at the next start.3+NeferWL reads `~/.config/neferwl/config` (or `$XDG_CONFIG_HOME/neferwl/config`). Changes apply when you save, except `startup`, `xwayland` and `xwayland.xsettings`, which apply at the next start.
4 4
5 ```sh5 ```sh
6 neferwl --config <path> # use another file6 neferwl --config <path> # use another file
@@ -28,6 +28,7 @@ See [examples/config](../examples/config) for every key with its default.
28 | `terminal.auto-open` | `first` | Open a terminal on the first workspace (`first`), on every empty one (`all`), or never (`off`) |28 | `terminal.auto-open` | `first` | Open a terminal on the first workspace (`first`), on every empty one (`all`), or never (`off`) |
29 | `startup` | none | Commands run at session start, separated by `;` |29 | `startup` | none | Commands run at session start, separated by `;` |
30 | `xwayland` | `satellite` | `off`, `satellite`, `builtin` or a satellite binary path |30 | `xwayland` | `satellite` | `off`, `satellite`, `builtin` or a satellite binary path |
31+| `xwayland.xsettings` | `on` | With `xwayland = builtin`, publish the cursor theme, cursor size and DPI to X11 apps through XSETTINGS (restart required); `off` leaves them to the apps |
31 | `background` | `#111111` | Background color |32 | `background` | `#111111` | Background color |
32 | `border.radius` | `0` | Corner radius in logical pixels, `0` to `64`; floats always, tiles only with gaps |33 | `border.radius` | `0` | Corner radius in logical pixels, `0` to `64`; floats always, tiles only with gaps |
33 | `border.width` | `2` | Border width in pixels; `0` hides borders |34 | `border.width` | `2` | Border width in pixels; `0` hides borders |
@@ -103,7 +104,7 @@ destination output, even if that output has no windows. Same-screen workspace
103 switches and mouse focus do not trigger a flash.104 switches and mouse focus do not trigger a flash.
104 It runs when `animations = on`.105 It runs when `animations = on`.
105 106
106-`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. Clipboard and XSETTINGS are not supported; use `satellite` if you need them.107+`xwayland = satellite` uses `xwayland-satellite` from `PATH`; a custom path also selects satellite. `off` disables X11. `builtin` (experimental): neferwl starts `Xwayland` itself and manages X11 windows as its window manager: windows tile, take focus, close with `close-window` (`WM_DELETE_WINDOW`) and show their title and class. Menus, popups and tooltips (override-redirect windows) are drawn above their window at the right place and never appear as windows in `neferwl state`. X11 apps get the cursor theme and size from `XCURSOR_THEME` and `XCURSOR_SIZE`, the DPI of the first output (96 times its scale) through XSETTINGS (`xwayland.xsettings = off` turns it off), and the themed arrow on the X background. Clipboard is not supported; use `satellite` if you need it.
107 108
108 ## Automatic terminal109 ## Automatic terminal
109 110
M docs/desktop.md +1 -1
@@ -58,7 +58,7 @@ By default, X11 apps such as Steam run through [xwayland-satellite](https://gith
5858 xwayland = off # no X11 support
5959 ```
6060
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. X11 apps get the cursor theme, cursor size and DPI through XSETTINGS (`xwayland.xsettings = off` to disable). Clipboard is not supported; use `satellite` if you need it.
6262
6363 Games with `builtin`:
6464
@@ -58,7 +58,7 @@ By default, X11 apps such as Steam run through [xwayland-satellite](https://gith
58 xwayland = off # no X11 support58 xwayland = off # no X11 support
59 ```59 ```
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. X11 apps get the cursor theme, cursor size and DPI through XSETTINGS (`xwayland.xsettings = off` to disable). Clipboard is not supported; use `satellite` if you need it.
62 62
63 Games with `builtin`:63 Games with `builtin`:
64 64
M internal/adapters/config/config.go +15 -5
@@ -167,7 +167,7 @@ func Defaults() ports.Config {
167167 // Hint mode is experimental: off unless the config turns it on.
168168 c.Hint.Enable = false
169169 c.Hint.TextClick = ports.ModCtrl | ports.ModShift
170- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}
170+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}
171171 c.Background.Color = "#111111"
172172 c.Floating.Dim = 0.3
173173 c.Stash.Width = 80
@@ -724,17 +724,27 @@ func set(c *ports.Config, key, v string) error {
724724 }
725725 c.Terminal.AutoOpen = v
726726 case "xwayland":
727+ xs := c.Xwayland.XSettings // independent of the backend
727728 switch {
728729 case v == "off":
729- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff}
730+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: xs}
730731 case v == "satellite":
731- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}
732+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: xs}
732733 case v == "builtin":
733- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}
734+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: xs}
734735 case v == "" || strings.ContainsAny(v, " \t"):
735736 return fmt.Errorf("must be off, satellite, builtin or a satellite program")
736737 default:
737- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v}
738+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v, XSettings: xs}
739+ }
740+ case "xwayland.xsettings":
741+ switch v {
742+ case "on":
743+ c.Xwayland.XSettings = true
744+ case "off":
745+ c.Xwayland.XSettings = false
746+ default:
747+ return fmt.Errorf("must be on or off")
738748 }
739749 case "background":
740750 if !color.MatchString(v) {
@@ -167,7 +167,7 @@ func Defaults() ports.Config {
167 // Hint mode is experimental: off unless the config turns it on.167 // Hint mode is experimental: off unless the config turns it on.
168 c.Hint.Enable = false168 c.Hint.Enable = false
169 c.Hint.TextClick = ports.ModCtrl | ports.ModShift169 c.Hint.TextClick = ports.ModCtrl | ports.ModShift
170- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}170+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}
171 c.Background.Color = "#111111"171 c.Background.Color = "#111111"
172 c.Floating.Dim = 0.3172 c.Floating.Dim = 0.3
173 c.Stash.Width = 80173 c.Stash.Width = 80
@@ -724,17 +724,27 @@ func set(c *ports.Config, key, v string) error {
724 }724 }
725 c.Terminal.AutoOpen = v725 c.Terminal.AutoOpen = v
726 case "xwayland":726 case "xwayland":
727+ xs := c.Xwayland.XSettings // independent of the backend
727 switch {728 switch {
728 case v == "off":729 case v == "off":
729- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff}730+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: xs}
730 case v == "satellite":731 case v == "satellite":
731- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}732+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: xs}
732 case v == "builtin":733 case v == "builtin":
733- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}734+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: xs}
734 case v == "" || strings.ContainsAny(v, " \t"):735 case v == "" || strings.ContainsAny(v, " \t"):
735 return fmt.Errorf("must be off, satellite, builtin or a satellite program")736 return fmt.Errorf("must be off, satellite, builtin or a satellite program")
736 default:737 default:
737- c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v}738+ c.Xwayland = ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: v, XSettings: xs}
739+ }
740+ case "xwayland.xsettings":
741+ switch v {
742+ case "on":
743+ c.Xwayland.XSettings = true
744+ case "off":
745+ c.Xwayland.XSettings = false
746+ default:
747+ return fmt.Errorf("must be on or off")
738 }748 }
739 case "background":749 case "background":
740 if !color.MatchString(v) {750 if !color.MatchString(v) {
M internal/adapters/config/config_test.go +27 -5
@@ -340,17 +340,17 @@ func TestWorkspacePrevNextAction(t *testing.T) {
340340 }
341341
342342 func TestXwayland(t *testing.T) {
343- if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}) {
343+ if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}) {
344344 t.Fatal(Defaults().Xwayland)
345345 }
346346 for _, tt := range []struct {
347347 value string
348348 want ports.XwaylandConfig
349349 }{
350- {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff}},
351- {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}},
352- {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}},
353- {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls"}},
350+ {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: true}},
351+ {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}},
352+ {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: true}},
353+ {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls", XSettings: true}},
354354 } {
355355 t.Run(tt.value, func(t *testing.T) {
356356 c, w := parseString(t, "xwayland = "+tt.value)
@@ -361,6 +361,28 @@ func TestXwayland(t *testing.T) {
361361 }
362362 }
363363
364+func TestXwaylandXSettings(t *testing.T) {
365+ for _, tt := range []struct {
366+ src string
367+ want bool
368+ }{
369+ {"", true},
370+ {"xwayland.xsettings = on", true},
371+ {"xwayland.xsettings = off", false},
372+ {"xwayland.xsettings = off\nxwayland = builtin", false},
373+ {"xwayland = builtin\nxwayland.xsettings = off", false},
374+ } {
375+ c, w := parseString(t, tt.src)
376+ if c.Xwayland.XSettings != tt.want || len(w) != 0 {
377+ t.Fatal(tt.src, c.Xwayland, w)
378+ }
379+ }
380+ c, w := parseString(t, "xwayland.xsettings = maybe")
381+ if !c.Xwayland.XSettings || len(w) != 1 || !strings.Contains(w[0].Msg, "must be on or off") {
382+ t.Fatal(c.Xwayland, w)
383+ }
384+}
385+
364386 func TestDuplicateKeyLastWins(t *testing.T) {
365387 c, w := parseString(t, "background = #000000\nbackground = #111111\n")
366388 if c.Background.Color != "#111111" || len(w) != 1 || w[0].Line != 2 {
@@ -340,17 +340,17 @@ func TestWorkspacePrevNextAction(t *testing.T) {
340 }340 }
341 341
342 func TestXwayland(t *testing.T) {342 func TestXwayland(t *testing.T) {
343- if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}) {343+ if Defaults().Xwayland != (ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}) {
344 t.Fatal(Defaults().Xwayland)344 t.Fatal(Defaults().Xwayland)
345 }345 }
346 for _, tt := range []struct {346 for _, tt := range []struct {
347 value string347 value string
348 want ports.XwaylandConfig348 want ports.XwaylandConfig
349 }{349 }{
350- {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff}},350+ {"off", ports.XwaylandConfig{Backend: ports.XwaylandOff, XSettings: true}},
351- {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite"}},351+ {"satellite", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "xwayland-satellite", XSettings: true}},
352- {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland"}},352+ {"builtin", ports.XwaylandConfig{Backend: ports.XwaylandBuiltin, Binary: "Xwayland", XSettings: true}},
353- {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls"}},353+ {"/opt/xwls", ports.XwaylandConfig{Backend: ports.XwaylandSatellite, Binary: "/opt/xwls", XSettings: true}},
354 } {354 } {
355 t.Run(tt.value, func(t *testing.T) {355 t.Run(tt.value, func(t *testing.T) {
356 c, w := parseString(t, "xwayland = "+tt.value)356 c, w := parseString(t, "xwayland = "+tt.value)
@@ -361,6 +361,28 @@ func TestXwayland(t *testing.T) {
361 }361 }
362 }362 }
363 363
364+func TestXwaylandXSettings(t *testing.T) {
365+ for _, tt := range []struct {
366+ src string
367+ want bool
368+ }{
369+ {"", true},
370+ {"xwayland.xsettings = on", true},
371+ {"xwayland.xsettings = off", false},
372+ {"xwayland.xsettings = off\nxwayland = builtin", false},
373+ {"xwayland = builtin\nxwayland.xsettings = off", false},
374+ } {
375+ c, w := parseString(t, tt.src)
376+ if c.Xwayland.XSettings != tt.want || len(w) != 0 {
377+ t.Fatal(tt.src, c.Xwayland, w)
378+ }
379+ }
380+ c, w := parseString(t, "xwayland.xsettings = maybe")
381+ if !c.Xwayland.XSettings || len(w) != 1 || !strings.Contains(w[0].Msg, "must be on or off") {
382+ t.Fatal(c.Xwayland, w)
383+ }
384+}
385+
364 func TestDuplicateKeyLastWins(t *testing.T) {386 func TestDuplicateKeyLastWins(t *testing.T) {
365 c, w := parseString(t, "background = #000000\nbackground = #111111\n")387 c, w := parseString(t, "background = #000000\nbackground = #111111\n")
366 if c.Background.Color != "#111111" || len(w) != 1 || w[0].Line != 2 {388 if c.Background.Color != "#111111" || len(w) != 1 || w[0].Line != 2 {
M internal/adapters/wayland/server.go +5 -0
@@ -52,6 +52,9 @@ type Options struct {
5252 // Casts receives the screencast events and inventory (screencast.go);
5353 // nil serves no casts (Channels.CastCommands is not read).
5454 Casts ports.CastSink
55+ // Xwayland is what the built-in XWM publishes to X11 clients
56+ // (XSETTINGS, root cursor); the zero value publishes nothing.
57+ Xwayland ports.XwaylandSettings
5558 // LogDamage logs the damage of every fresh client commit at debug level
5659 // (--debug=wayland-damage).
5760 LogDamage bool
@@ -295,6 +298,7 @@ type Server struct {
295298 workspaceIDs *workspaceid.IDs
296299 outputHeads ports.OutputHeads
297300 outputPlaces ports.Layout
301+ xsettings ports.XwaylandSettings
298302 xspace xwm.Space // the one layout <-> X mapping, shared with the XWM
299303 managementSerial uint32
300304 nextOutputApply uint64
@@ -381,6 +385,7 @@ func New(opts Options, ch Channels, log zerowrap.Logger) (*Server, error) {
381385 cleanup: cleanup,
382386 log: log,
383387 logDamage: opts.LogDamage,
388+ xsettings: opts.Xwayland,
384389 channels: ch,
385390 surfaces: make(map[*server.Resource]*surface),
386391 surfaceByIdentity: make(map[uint64]*surface),
@@ -52,6 +52,9 @@ type Options struct {
52 // Casts receives the screencast events and inventory (screencast.go);52 // Casts receives the screencast events and inventory (screencast.go);
53 // nil serves no casts (Channels.CastCommands is not read).53 // nil serves no casts (Channels.CastCommands is not read).
54 Casts ports.CastSink54 Casts ports.CastSink
55+ // Xwayland is what the built-in XWM publishes to X11 clients
56+ // (XSETTINGS, root cursor); the zero value publishes nothing.
57+ Xwayland ports.XwaylandSettings
55 // LogDamage logs the damage of every fresh client commit at debug level58 // LogDamage logs the damage of every fresh client commit at debug level
56 // (--debug=wayland-damage).59 // (--debug=wayland-damage).
57 LogDamage bool60 LogDamage bool
@@ -295,6 +298,7 @@ type Server struct {
295 workspaceIDs *workspaceid.IDs298 workspaceIDs *workspaceid.IDs
296 outputHeads ports.OutputHeads299 outputHeads ports.OutputHeads
297 outputPlaces ports.Layout300 outputPlaces ports.Layout
301+ xsettings ports.XwaylandSettings
298 xspace xwm.Space // the one layout <-> X mapping, shared with the XWM302 xspace xwm.Space // the one layout <-> X mapping, shared with the XWM
299 managementSerial uint32303 managementSerial uint32
300 nextOutputApply uint64304 nextOutputApply uint64
@@ -381,6 +385,7 @@ func New(opts Options, ch Channels, log zerowrap.Logger) (*Server, error) {
381 cleanup: cleanup,385 cleanup: cleanup,
382 log: log,386 log: log,
383 logDamage: opts.LogDamage,387 logDamage: opts.LogDamage,
388+ xsettings: opts.Xwayland,
384 channels: ch,389 channels: ch,
385 surfaces: make(map[*server.Resource]*surface),390 surfaces: make(map[*server.Resource]*surface),
386 surfaceByIdentity: make(map[uint64]*surface),391 surfaceByIdentity: make(map[uint64]*surface),
M internal/adapters/wayland/xwayland.go +1 -1
@@ -52,7 +52,7 @@ func (s *Server) forgetXwayland() {
5252 // closes the XWM on the display goroutine and waits for it.
5353 func (s *Server) AttachXWM(ctx context.Context, wmFD int) (stop func()) {
5454 log := logging.For(ctx, "xwm")
55- x, err := xwm.Boot(ctx, wmFD, log)
55+ x, err := xwm.BootSettings(ctx, wmFD, log, s.xsettings)
5656 if err != nil {
5757 if ctx.Err() != nil {
5858 log.Info().Err(err).Msg("X11 window management not started: Xwayland is going away")
@@ -52,7 +52,7 @@ func (s *Server) forgetXwayland() {
52 // closes the XWM on the display goroutine and waits for it.52 // closes the XWM on the display goroutine and waits for it.
53 func (s *Server) AttachXWM(ctx context.Context, wmFD int) (stop func()) {53 func (s *Server) AttachXWM(ctx context.Context, wmFD int) (stop func()) {
54 log := logging.For(ctx, "xwm")54 log := logging.For(ctx, "xwm")
55- x, err := xwm.Boot(ctx, wmFD, log)55+ x, err := xwm.BootSettings(ctx, wmFD, log, s.xsettings)
56 if err != nil {56 if err != nil {
57 if ctx.Err() != nil {57 if ctx.Err() != nil {
58 log.Info().Err(err).Msg("X11 window management not started: Xwayland is going away")58 log.Info().Err(err).Msg("X11 window management not started: Xwayland is going away")
M internal/adapters/wayland/xwm/atoms.go +6 -0
@@ -54,6 +54,9 @@ const (
5454 atomTimestamp
5555 atomNeferwlData
5656 atomNeferwlTargets
57+ atomManager
58+ atomXSettingsS0
59+ atomXSettingsSettings
5760 atomCount
5861 )
5962
@@ -109,4 +112,7 @@ var atomNames = [atomCount]string{
109112 atomTimestamp: "TIMESTAMP",
110113 atomNeferwlData: "_NEFERWL_DATA",
111114 atomNeferwlTargets: "_NEFERWL_TARGETS",
115+ atomManager: "MANAGER",
116+ atomXSettingsS0: "_XSETTINGS_S0",
117+ atomXSettingsSettings: "_XSETTINGS_SETTINGS",
112118 }
@@ -54,6 +54,9 @@ const (
54 atomTimestamp54 atomTimestamp
55 atomNeferwlData55 atomNeferwlData
56 atomNeferwlTargets56 atomNeferwlTargets
57+ atomManager
58+ atomXSettingsS0
59+ atomXSettingsSettings
57 atomCount60 atomCount
58 )61 )
59 62
@@ -109,4 +112,7 @@ var atomNames = [atomCount]string{
109 atomTimestamp: "TIMESTAMP",112 atomTimestamp: "TIMESTAMP",
110 atomNeferwlData: "_NEFERWL_DATA",113 atomNeferwlData: "_NEFERWL_DATA",
111 atomNeferwlTargets: "_NEFERWL_TARGETS",114 atomNeferwlTargets: "_NEFERWL_TARGETS",
115+ atomManager: "MANAGER",
116+ atomXSettingsS0: "_XSETTINGS_S0",
117+ atomXSettingsSettings: "_XSETTINGS_SETTINGS",
112 }118 }
M internal/adapters/wayland/xwm/configure.go +1 -0
@@ -123,6 +123,7 @@ func (x *XWM) LayoutChanged(changed bool) {
123123 x.warnedSpace = true
124124 x.log.Warn().Int("dropped", n).Int("max", maxRegions).Msg("more outputs than the X11 layout holds, extra outputs ignored")
125125 }
126+ x.refreshXSettings()
126127 if !changed {
127128 return
128129 }
@@ -123,6 +123,7 @@ func (x *XWM) LayoutChanged(changed bool) {
123 x.warnedSpace = true123 x.warnedSpace = true
124 x.log.Warn().Int("dropped", n).Int("max", maxRegions).Msg("more outputs than the X11 layout holds, extra outputs ignored")124 x.log.Warn().Int("dropped", n).Int("max", maxRegions).Msg("more outputs than the X11 layout holds, extra outputs ignored")
125 }125 }
126+ x.refreshXSettings()
126 if !changed {127 if !changed {
127 return128 return
128 }129 }
A internal/adapters/wayland/xwm/cursor.go +109 -0
@@ -0,0 +1,109 @@
1+package xwm
2+
3+import (
4+ "bnema.dev/xturbo"
5+ "bnema.dev/xturbo/render"
6+ "bnema.dev/xturbo/xproto"
7+)
8+
9+// Root cursor: a themed arrow on the root window so the X background does not
10+// show Xwayland's cross. One-shot at boot; never fatal.
11+
12+const maxCursorBytes = 1 << 18 // one PutImage request, below the core limit
13+
14+// bootRootCursor sets the cursor of the root window.
15+func (x *XWM) bootRootCursor() error {
16+ if !x.cfg.RootCursor {
17+ return nil
18+ }
19+ img := x.cfg.Cursor
20+ usable := img.W > 0 && img.H > 0 && img.W <= 0xffff && img.H <= 0xffff &&
21+ len(img.Pixels) == img.W*img.H*4 && len(img.Pixels) <= maxCursorBytes
22+ if usable && x.conn.Ext().Info(xturbo.ExtRender).Present {
23+ b := x.conn.Buf()
24+ x.expect(render.QueryPictFormats(b), kindPictFormats, 0, 0)
25+ if err := x.conn.Sync(&x.h); err != nil {
26+ return err
27+ }
28+ if x.bootErr != nil {
29+ return x.bootErr
30+ }
31+ if x.xs.argb != 0 && x.argbCursor(img.W, img.H, img.HotX, img.HotY, img.Pixels) {
32+ return nil
33+ }
34+ }
35+ x.glyphCursor()
36+ return nil
37+}
38+
39+// onPictFormatsReply remembers the ARGB32 picture format (depth 32, direct,
40+// alpha mask 0xff at shift 24).
41+func (x *XWM) onPictFormatsReply(r *xturbo.Reply) {
42+ v, ok := render.ParseQueryPictFormatsReply(r.Raw)
43+ if !ok {
44+ return
45+ }
46+ l := v.Formats()
47+ for i := 0; i < l.Len(); i++ {
48+ f := l.At(i)
49+ if f.Type == render.PictTypeDirect && f.Depth == 32 && f.Direct.AlphaMask == 0xff && f.Direct.AlphaShift == 24 &&
50+ f.Direct.RedMask == 0xff && f.Direct.RedShift == 16 {
51+ x.xs.argb = uint32(f.Id)
52+ return
53+ }
54+ }
55+}
56+
57+func (x *XWM) newIDs(ids []uint32) bool {
58+ for i := range ids {
59+ id, err := x.conn.NewXID()
60+ if err != nil {
61+ return false
62+ }
63+ ids[i] = id
64+ }
65+ return true
66+}
67+
68+// argbCursor uploads the image and installs it on the root.
69+func (x *XWM) argbCursor(w, h, hotX, hotY int, px []byte) bool {
70+ var id [4]uint32 // pixmap, gc, picture, cursor
71+ if !x.newIDs(id[:]) {
72+ return false
73+ }
74+ b := x.conn.Buf()
75+ pm, gc, pic, cur := xproto.Pixmap(id[0]), xproto.Gcontext(id[1]), render.Picture(id[2]), xproto.Cursor(id[3])
76+ xproto.CreatePixmap(b, 32, pm, xproto.Drawable(x.root), uint16(w), uint16(h))
77+ var gv xproto.CreateGCValues
78+ xproto.CreateGC(b, gc, xproto.Drawable(pm), &gv)
79+ xproto.PutImage(b, xproto.ImageFormatZPixmap, xproto.Drawable(pm), gc, uint16(w), uint16(h), 0, 0, 0, 32, px)
80+ var pv render.CreatePictureValues
81+ render.CreatePicture(b, pic, xproto.Drawable(pm), render.Pictformat(x.xs.argb), &pv)
82+ render.CreateCursor(b, cur, pic, uint16(min(max(hotX, 0), w-1)), uint16(min(max(hotY, 0), h-1)))
83+ var wv xproto.ChangeWindowAttributesValues
84+ wv.SetCursor(cur)
85+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
86+ render.FreePicture(b, pic)
87+ xproto.FreeGC(b, gc)
88+ xproto.FreePixmap(b, pm)
89+ xproto.FreeCursor(b, cur)
90+ return true
91+}
92+
93+// glyphCursor installs the "left_ptr" glyph of the X cursor font (glyph 68,
94+// mask 69).
95+func (x *XWM) glyphCursor() {
96+ var id [2]uint32 // font, cursor
97+ if !x.newIDs(id[:]) {
98+ return
99+ }
100+ b := x.conn.Buf()
101+ font, cur := xproto.Font(id[0]), xproto.Cursor(id[1])
102+ xproto.OpenFont(b, font, "cursor")
103+ xproto.CreateGlyphCursor(b, cur, font, font, 68, 69, 0, 0, 0, 0xffff, 0xffff, 0xffff)
104+ var wv xproto.ChangeWindowAttributesValues
105+ wv.SetCursor(cur)
106+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
107+ xproto.CloseFont(b, font)
108+ xproto.FreeCursor(b, cur)
109+}
@@ -0,0 +1,109 @@
1+package xwm
2+
3+import (
4+ "bnema.dev/xturbo"
5+ "bnema.dev/xturbo/render"
6+ "bnema.dev/xturbo/xproto"
7+)
8+
9+// Root cursor: a themed arrow on the root window so the X background does not
10+// show Xwayland's cross. One-shot at boot; never fatal.
11+
12+const maxCursorBytes = 1 << 18 // one PutImage request, below the core limit
13+
14+// bootRootCursor sets the cursor of the root window.
15+func (x *XWM) bootRootCursor() error {
16+ if !x.cfg.RootCursor {
17+ return nil
18+ }
19+ img := x.cfg.Cursor
20+ usable := img.W > 0 && img.H > 0 && img.W <= 0xffff && img.H <= 0xffff &&
21+ len(img.Pixels) == img.W*img.H*4 && len(img.Pixels) <= maxCursorBytes
22+ if usable && x.conn.Ext().Info(xturbo.ExtRender).Present {
23+ b := x.conn.Buf()
24+ x.expect(render.QueryPictFormats(b), kindPictFormats, 0, 0)
25+ if err := x.conn.Sync(&x.h); err != nil {
26+ return err
27+ }
28+ if x.bootErr != nil {
29+ return x.bootErr
30+ }
31+ if x.xs.argb != 0 && x.argbCursor(img.W, img.H, img.HotX, img.HotY, img.Pixels) {
32+ return nil
33+ }
34+ }
35+ x.glyphCursor()
36+ return nil
37+}
38+
39+// onPictFormatsReply remembers the ARGB32 picture format (depth 32, direct,
40+// alpha mask 0xff at shift 24).
41+func (x *XWM) onPictFormatsReply(r *xturbo.Reply) {
42+ v, ok := render.ParseQueryPictFormatsReply(r.Raw)
43+ if !ok {
44+ return
45+ }
46+ l := v.Formats()
47+ for i := 0; i < l.Len(); i++ {
48+ f := l.At(i)
49+ if f.Type == render.PictTypeDirect && f.Depth == 32 && f.Direct.AlphaMask == 0xff && f.Direct.AlphaShift == 24 &&
50+ f.Direct.RedMask == 0xff && f.Direct.RedShift == 16 {
51+ x.xs.argb = uint32(f.Id)
52+ return
53+ }
54+ }
55+}
56+
57+func (x *XWM) newIDs(ids []uint32) bool {
58+ for i := range ids {
59+ id, err := x.conn.NewXID()
60+ if err != nil {
61+ return false
62+ }
63+ ids[i] = id
64+ }
65+ return true
66+}
67+
68+// argbCursor uploads the image and installs it on the root.
69+func (x *XWM) argbCursor(w, h, hotX, hotY int, px []byte) bool {
70+ var id [4]uint32 // pixmap, gc, picture, cursor
71+ if !x.newIDs(id[:]) {
72+ return false
73+ }
74+ b := x.conn.Buf()
75+ pm, gc, pic, cur := xproto.Pixmap(id[0]), xproto.Gcontext(id[1]), render.Picture(id[2]), xproto.Cursor(id[3])
76+ xproto.CreatePixmap(b, 32, pm, xproto.Drawable(x.root), uint16(w), uint16(h))
77+ var gv xproto.CreateGCValues
78+ xproto.CreateGC(b, gc, xproto.Drawable(pm), &gv)
79+ xproto.PutImage(b, xproto.ImageFormatZPixmap, xproto.Drawable(pm), gc, uint16(w), uint16(h), 0, 0, 0, 32, px)
80+ var pv render.CreatePictureValues
81+ render.CreatePicture(b, pic, xproto.Drawable(pm), render.Pictformat(x.xs.argb), &pv)
82+ render.CreateCursor(b, cur, pic, uint16(min(max(hotX, 0), w-1)), uint16(min(max(hotY, 0), h-1)))
83+ var wv xproto.ChangeWindowAttributesValues
84+ wv.SetCursor(cur)
85+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
86+ render.FreePicture(b, pic)
87+ xproto.FreeGC(b, gc)
88+ xproto.FreePixmap(b, pm)
89+ xproto.FreeCursor(b, cur)
90+ return true
91+}
92+
93+// glyphCursor installs the "left_ptr" glyph of the X cursor font (glyph 68,
94+// mask 69).
95+func (x *XWM) glyphCursor() {
96+ var id [2]uint32 // font, cursor
97+ if !x.newIDs(id[:]) {
98+ return
99+ }
100+ b := x.conn.Buf()
101+ font, cur := xproto.Font(id[0]), xproto.Cursor(id[1])
102+ xproto.OpenFont(b, font, "cursor")
103+ xproto.CreateGlyphCursor(b, cur, font, font, 68, 69, 0, 0, 0, 0xffff, 0xffff, 0xffff)
104+ var wv xproto.ChangeWindowAttributesValues
105+ wv.SetCursor(cur)
106+ xproto.ChangeWindowAttributes(b, xproto.Window(x.root), &wv)
107+ xproto.CloseFont(b, font)
108+ xproto.FreeCursor(b, cur)
109+}
A internal/adapters/wayland/xwm/cursor_test.go +86 -0
@@ -0,0 +1,86 @@
1+package xwm
2+
3+import (
4+ "testing"
5+
6+ "github.com/bnema/neferwl/internal/ports"
7+ "github.com/stretchr/testify/require"
8+)
9+
10+func rootCursorExts() map[string]xpeerExt {
11+ e := fullPeerExts()
12+ e["RENDER"] = xpeerExt{139, 0, 0}
13+ return e
14+}
15+
16+func bootCursor(t *testing.T, exts map[string]xpeerExt, mutate func(*xpeer), cfg ports.XwaylandSettings) (*XWM, *xpeer) {
17+ t.Helper()
18+ fd, p := startXPeer(t, exts)
19+ if mutate != nil {
20+ p.set(mutate)
21+ }
22+ x, err := BootSettings(t.Context(), fd, testLog(), cfg)
23+ require.NoError(t, err)
24+ t.Cleanup(x.CloseConn)
25+ return x, p
26+}
27+
28+func cursorCfg() ports.XwaylandSettings {
29+ return ports.XwaylandSettings{RootCursor: true, Cursor: ports.CursorImage{W: 2, H: 2, HotX: 1, HotY: 0, Pixels: make([]byte, 16)}}
30+}
31+
32+func TestRootCursorRequests(t *testing.T) {
33+ _, p := bootCursor(t, rootCursorExts(), nil, cursorCfg())
34+ // QueryPictFormats (render minor 1) comes first; then the core requests.
35+ var got []string
36+ for _, r := range p.requests() {
37+ switch {
38+ case r.major == 139 && r.minor == 1:
39+ got = append(got, "QueryPictFormats")
40+ case r.major == 53:
41+ got = append(got, "CreatePixmap")
42+ case r.major == 72:
43+ got = append(got, "PutImage")
44+ case r.major == 139 && r.minor == 4:
45+ got = append(got, "CreatePicture")
46+ case r.major == 139 && r.minor == 27:
47+ got = append(got, "CreateCursor")
48+ case r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0:
49+ got = append(got, "ChangeWindowAttributes(root)")
50+ case r.major == 54:
51+ got = append(got, "FreePixmap")
52+ }
53+ }
54+ require.Equal(t, []string{"QueryPictFormats", "CreatePixmap", "PutImage", "CreatePicture", "CreateCursor",
55+ "ChangeWindowAttributes(root)", "FreePixmap"}, got)
56+ for _, r := range p.requests() {
57+ if r.major == 72 { // PutImage: ZPixmap, depth 32
58+ require.EqualValues(t, 2, r.raw[1])
59+ require.EqualValues(t, 32, r.raw[21])
60+ }
61+ }
62+}
63+
64+func TestRootCursorFallbackWithoutRender(t *testing.T) {
65+ _, p := bootCursor(t, fullPeerExts(), nil, cursorCfg())
66+ var open, glyph, set bool
67+ for _, r := range p.requests() {
68+ open = open || r.major == 45
69+ glyph = glyph || r.major == 94
70+ set = set || r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0
71+ }
72+ require.True(t, open && glyph && set, "OpenFont, CreateGlyphCursor, root cursor")
73+ require.Zero(t, p.count(53, nil), "no pixmap")
74+}
75+
76+func TestRootCursorFallbackWithoutARGB(t *testing.T) {
77+ _, p := bootCursor(t, rootCursorExts(), func(p *xpeer) { p.noARGB = true }, cursorCfg())
78+ require.NotZero(t, p.count(94, nil))
79+ require.Zero(t, p.count(72, nil))
80+}
81+
82+func TestRootCursorOff(t *testing.T) {
83+ _, p := bootCursor(t, rootCursorExts(), nil, ports.XwaylandSettings{})
84+ require.Zero(t, p.count(94, nil))
85+ require.Zero(t, p.count(53, nil))
86+}
@@ -0,0 +1,86 @@
1+package xwm
2+
3+import (
4+ "testing"
5+
6+ "github.com/bnema/neferwl/internal/ports"
7+ "github.com/stretchr/testify/require"
8+)
9+
10+func rootCursorExts() map[string]xpeerExt {
11+ e := fullPeerExts()
12+ e["RENDER"] = xpeerExt{139, 0, 0}
13+ return e
14+}
15+
16+func bootCursor(t *testing.T, exts map[string]xpeerExt, mutate func(*xpeer), cfg ports.XwaylandSettings) (*XWM, *xpeer) {
17+ t.Helper()
18+ fd, p := startXPeer(t, exts)
19+ if mutate != nil {
20+ p.set(mutate)
21+ }
22+ x, err := BootSettings(t.Context(), fd, testLog(), cfg)
23+ require.NoError(t, err)
24+ t.Cleanup(x.CloseConn)
25+ return x, p
26+}
27+
28+func cursorCfg() ports.XwaylandSettings {
29+ return ports.XwaylandSettings{RootCursor: true, Cursor: ports.CursorImage{W: 2, H: 2, HotX: 1, HotY: 0, Pixels: make([]byte, 16)}}
30+}
31+
32+func TestRootCursorRequests(t *testing.T) {
33+ _, p := bootCursor(t, rootCursorExts(), nil, cursorCfg())
34+ // QueryPictFormats (render minor 1) comes first; then the core requests.
35+ var got []string
36+ for _, r := range p.requests() {
37+ switch {
38+ case r.major == 139 && r.minor == 1:
39+ got = append(got, "QueryPictFormats")
40+ case r.major == 53:
41+ got = append(got, "CreatePixmap")
42+ case r.major == 72:
43+ got = append(got, "PutImage")
44+ case r.major == 139 && r.minor == 4:
45+ got = append(got, "CreatePicture")
46+ case r.major == 139 && r.minor == 27:
47+ got = append(got, "CreateCursor")
48+ case r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0:
49+ got = append(got, "ChangeWindowAttributes(root)")
50+ case r.major == 54:
51+ got = append(got, "FreePixmap")
52+ }
53+ }
54+ require.Equal(t, []string{"QueryPictFormats", "CreatePixmap", "PutImage", "CreatePicture", "CreateCursor",
55+ "ChangeWindowAttributes(root)", "FreePixmap"}, got)
56+ for _, r := range p.requests() {
57+ if r.major == 72 { // PutImage: ZPixmap, depth 32
58+ require.EqualValues(t, 2, r.raw[1])
59+ require.EqualValues(t, 32, r.raw[21])
60+ }
61+ }
62+}
63+
64+func TestRootCursorFallbackWithoutRender(t *testing.T) {
65+ _, p := bootCursor(t, fullPeerExts(), nil, cursorCfg())
66+ var open, glyph, set bool
67+ for _, r := range p.requests() {
68+ open = open || r.major == 45
69+ glyph = glyph || r.major == 94
70+ set = set || r.major == opChangeWindowAttributes && r.u32(4) == peerRoot && r.u32(8)&(1<<14) != 0
71+ }
72+ require.True(t, open && glyph && set, "OpenFont, CreateGlyphCursor, root cursor")
73+ require.Zero(t, p.count(53, nil), "no pixmap")
74+}
75+
76+func TestRootCursorFallbackWithoutARGB(t *testing.T) {
77+ _, p := bootCursor(t, rootCursorExts(), func(p *xpeer) { p.noARGB = true }, cursorCfg())
78+ require.NotZero(t, p.count(94, nil))
79+ require.Zero(t, p.count(72, nil))
80+}
81+
82+func TestRootCursorOff(t *testing.T) {
83+ _, p := bootCursor(t, rootCursorExts(), nil, ports.XwaylandSettings{})
84+ require.Zero(t, p.count(94, nil))
85+ require.Zero(t, p.count(53, nil))
86+}
M internal/adapters/wayland/xwm/events.go +11 -0
@@ -24,6 +24,8 @@ const (
2424 kindSelTargets
2525 kindSelData
2626 kindSelOut
27+ kindSelOwner
28+ kindPictFormats
2729 )
2830
2931 // onEvent dispatches an X event. Before Attach there is no host: only the
@@ -41,6 +43,9 @@ func (x *XWM) onEvent(ev *xturbo.Event) {
4143 case xproto.KindReparentNotify:
4244 x.onReparentNotify(ev)
4345 }
46+ if ev.Kind == xproto.KindSelectionClear {
47+ x.onXSettingsClear(ev)
48+ }
4449 if x.host == nil {
4550 x.onEventDetached(ev)
4651 return
@@ -106,6 +111,12 @@ func (x *XWM) onReply(r *xturbo.Reply) {
106111 case kindSelData:
107112 x.onSelDataReply(r)
108113 return
114+ case kindSelOwner:
115+ x.onSelOwnerReply(r)
116+ return
117+ case kindPictFormats:
118+ x.onPictFormatsReply(r)
119+ return
109120 }
110121 s, rec := x.tab.live(r.Args[0])
111122 if rec == nil {
@@ -24,6 +24,8 @@ const (
24 kindSelTargets24 kindSelTargets
25 kindSelData25 kindSelData
26 kindSelOut26 kindSelOut
27+ kindSelOwner
28+ kindPictFormats
27 )29 )
28 30
29 // onEvent dispatches an X event. Before Attach there is no host: only the31 // onEvent dispatches an X event. Before Attach there is no host: only the
@@ -41,6 +43,9 @@ func (x *XWM) onEvent(ev *xturbo.Event) {
41 case xproto.KindReparentNotify:43 case xproto.KindReparentNotify:
42 x.onReparentNotify(ev)44 x.onReparentNotify(ev)
43 }45 }
46+ if ev.Kind == xproto.KindSelectionClear {
47+ x.onXSettingsClear(ev)
48+ }
44 if x.host == nil {49 if x.host == nil {
45 x.onEventDetached(ev)50 x.onEventDetached(ev)
46 return51 return
@@ -106,6 +111,12 @@ func (x *XWM) onReply(r *xturbo.Reply) {
106 case kindSelData:111 case kindSelData:
107 x.onSelDataReply(r)112 x.onSelDataReply(r)
108 return113 return
114+ case kindSelOwner:
115+ x.onSelOwnerReply(r)
116+ return
117+ case kindPictFormats:
118+ x.onPictFormatsReply(r)
119+ return
109 }120 }
110 s, rec := x.tab.live(r.Args[0])121 s, rec := x.tab.live(r.Args[0])
111 if rec == nil {122 if rec == nil {
A internal/adapters/wayland/xwm/selection_xsettings.go +205 -0
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "encoding/binary"
5+ "math"
6+
7+ "bnema.dev/xturbo"
8+ "bnema.dev/xturbo/xproto"
9+)
10+
11+// XSETTINGS 0.5 manager (selection _XSETTINGS_S0). The window is the XWM's
12+// own, independent of any selection bridge window.
13+
14+const (
15+ xsBufSize = 1024
16+ xsMaxString = 256 // longest theme name published
17+ xsInt = 0
18+ xsString = 1
19+)
20+
21+// xsettings is the manager state. Settings are fixed, sorted by name.
22+type xsettings struct {
23+ win uint32
24+ active bool // we own _XSETTINGS_S0
25+ taken bool // another manager owns it (boot check)
26+ ownerNo uint32
27+ argb uint32 // ARGB32 picture format, 0 unknown
28+
29+ serial uint32
30+ // Last published values and the serial of their last change.
31+ dpi int32
32+ theme string
33+ size int32
34+ dpiSerial uint32
35+ themeSerial uint32
36+ sizeSerial uint32
37+
38+ buf [xsBufSize]byte
39+}
40+
41+// xsettingsDPI is Xft/DPI*1024 for a scale: 96 dpi at scale 1, rounded to an
42+// integer dpi.
43+func xsettingsDPI(scale float64) int32 {
44+ if scale <= 0 {
45+ scale = 1
46+ }
47+ return int32(math.Round(96*scale)) * 1024
48+}
49+
50+func (x *XWM) cursorThemeName() string {
51+ t := x.cfg.CursorTheme
52+ if t == "" {
53+ t = "default"
54+ }
55+ if len(t) > xsMaxString {
56+ t = t[:xsMaxString]
57+ }
58+ return t
59+}
60+
61+func (x *XWM) cursorThemeSize() int32 {
62+ if s := x.cfg.CursorSize; s >= 8 && s <= 256 {
63+ return int32(s)
64+ }
65+ return 24
66+}
67+
68+// bootSettings runs at the end of boot: the XSETTINGS manager and the root
69+// cursor. Failures are never fatal.
70+func (x *XWM) bootSettings() error {
71+ if err := x.bootXSettings(); err != nil {
72+ return err
73+ }
74+ return x.bootRootCursor()
75+}
76+
77+func (x *XWM) bootXSettings() error {
78+ if !x.cfg.XSettings {
79+ return nil
80+ }
81+ conn, b := x.conn, x.conn.Buf()
82+ win, err := conn.NewXID()
83+ if err != nil {
84+ return err
85+ }
86+ x.xs.win = win
87+ var wv xproto.CreateWindowValues
88+ wv.SetEventMask(0)
89+ xproto.CreateWindow(b, 0, xproto.Window(win), xproto.Window(x.root), -1, -1, 1, 1, 0, xproto.WindowClassInputOnly, 0, &wv)
90+ x.expect(xproto.GetSelectionOwner(b, xproto.Atom(x.atoms[atomXSettingsS0])), kindSelOwner, 0, 0)
91+ if err := conn.Sync(&x.h); err != nil {
92+ return err
93+ }
94+ if x.bootErr != nil {
95+ return x.bootErr
96+ }
97+ if x.xs.taken {
98+ x.log.Warn().Uint32("owner", x.xs.ownerNo).Msg("another XSETTINGS manager runs, not taking _XSETTINGS_S0")
99+ xproto.DestroyWindow(b, xproto.Window(win))
100+ x.xs.win = 0
101+ return nil
102+ }
103+ x.publishXSettings(true)
104+ sel := x.atoms[atomXSettingsS0]
105+ xproto.SetSelectionOwner(b, xproto.Window(win), xproto.Atom(sel), 0)
106+ // ICCCM §2.8: announce the new manager to the root.
107+ var ev [32]byte
108+ ev[0], ev[1] = 33, 32 // ClientMessage, format 32
109+ binary.LittleEndian.PutUint32(ev[4:], x.root)
110+ binary.LittleEndian.PutUint32(ev[8:], x.atoms[atomManager])
111+ binary.LittleEndian.PutUint32(ev[16:], sel)
112+ binary.LittleEndian.PutUint32(ev[20:], win)
113+ xproto.SendEvent(b, false, xproto.Window(x.root), xproto.EventMaskStructureNotify, &ev)
114+ x.xs.active = true
115+ return nil
116+}
117+
118+// onSelOwnerReply: the boot GetSelectionOwner of _XSETTINGS_S0.
119+func (x *XWM) onSelOwnerReply(r *xturbo.Reply) {
120+ if v, ok := xproto.ParseGetSelectionOwnerReply(r.Raw); ok && v.Owner() != 0 && uint32(v.Owner()) != x.xs.win {
121+ x.xs.taken, x.xs.ownerNo = true, uint32(v.Owner())
122+ }
123+}
124+
125+// onXSettingsClear: another client took _XSETTINGS_S0.
126+func (x *XWM) onXSettingsClear(ev *xturbo.Event) {
127+ e := xproto.SelectionClearEvent(xproto.SelectionClearOf(ev))
128+ if x.xs.active && uint32(e.Owner()) == x.xs.win && uint32(e.Selection()) == x.atoms[atomXSettingsS0] {
129+ x.xs.active = false
130+ x.log.Warn().Msg("XSETTINGS manager replaced by another client, settings no longer updated")
131+ }
132+}
133+
134+// refreshXSettings re-evaluates the DPI after a layout change.
135+func (x *XWM) refreshXSettings() {
136+ if !x.xs.active {
137+ return
138+ }
139+ if x.publishXSettings(false) {
140+ x.wake()
141+ }
142+}
143+
144+// publishXSettings encodes and writes the property when a value changed
145+// (force: the first time). It reports whether it wrote. Unchanged values cost
146+// no allocation and no request.
147+func (x *XWM) publishXSettings(force bool) bool {
148+ s := &x.xs
149+ dpi := xsettingsDPI(x.space.Scale())
150+ theme, size := x.cursorThemeName(), x.cursorThemeSize()
151+ if !force && s.serial != 0 && dpi == s.dpi && theme == s.theme && size == s.size {
152+ return false
153+ }
154+ next := s.serial + 1 // wraps
155+ if force || s.serial == 0 || dpi != s.dpi {
156+ s.dpiSerial = next
157+ }
158+ if force || s.serial == 0 || theme != s.theme {
159+ s.themeSerial = next
160+ }
161+ if force || s.serial == 0 || size != s.size {
162+ s.sizeSerial = next
163+ }
164+ s.serial, s.dpi, s.theme, s.size = next, dpi, theme, size
165+ n := s.encode()
166+ xproto.ChangeProperty(x.conn.Buf(), xproto.PropModeReplace, xproto.Window(s.win),
167+ xproto.Atom(x.atoms[atomXSettingsSettings]), xproto.Atom(x.atoms[atomXSettingsSettings]), 8, uint32(n), s.buf[:n])
168+ return true
169+}
170+
171+func pad4(n int) int { return (n + 3) &^ 3 }
172+
173+// encode writes the settings, sorted by name, into s.buf.
174+func (s *xsettings) encode() int {
175+ le := binary.LittleEndian
176+ b := s.buf[:]
177+ clear(b[:16])
178+ b[0] = 0 // LSBFirst
179+ le.PutUint32(b[4:], s.serial)
180+ le.PutUint32(b[8:], 3)
181+ n := 12
182+ putName := func(typ byte, name string, serial uint32) {
183+ b[n], b[n+1] = typ, 0
184+ le.PutUint16(b[n+2:], uint16(len(name)))
185+ n += 4
186+ copy(b[n:], name)
187+ clear(b[n+len(name) : n+pad4(len(name))])
188+ n += pad4(len(name))
189+ le.PutUint32(b[n:], serial)
190+ n += 4
191+ }
192+ putName(xsString, "Gtk/CursorThemeName", s.themeSerial)
193+ le.PutUint32(b[n:], uint32(len(s.theme)))
194+ n += 4
195+ copy(b[n:], s.theme)
196+ clear(b[n+len(s.theme) : n+pad4(len(s.theme))])
197+ n += pad4(len(s.theme))
198+ putName(xsInt, "Gtk/CursorThemeSize", s.sizeSerial)
199+ le.PutUint32(b[n:], uint32(s.size))
200+ n += 4
201+ putName(xsInt, "Xft/DPI", s.dpiSerial)
202+ le.PutUint32(b[n:], uint32(s.dpi))
203+ n += 4
204+ return n
205+}
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "encoding/binary"
5+ "math"
6+
7+ "bnema.dev/xturbo"
8+ "bnema.dev/xturbo/xproto"
9+)
10+
11+// XSETTINGS 0.5 manager (selection _XSETTINGS_S0). The window is the XWM's
12+// own, independent of any selection bridge window.
13+
14+const (
15+ xsBufSize = 1024
16+ xsMaxString = 256 // longest theme name published
17+ xsInt = 0
18+ xsString = 1
19+)
20+
21+// xsettings is the manager state. Settings are fixed, sorted by name.
22+type xsettings struct {
23+ win uint32
24+ active bool // we own _XSETTINGS_S0
25+ taken bool // another manager owns it (boot check)
26+ ownerNo uint32
27+ argb uint32 // ARGB32 picture format, 0 unknown
28+
29+ serial uint32
30+ // Last published values and the serial of their last change.
31+ dpi int32
32+ theme string
33+ size int32
34+ dpiSerial uint32
35+ themeSerial uint32
36+ sizeSerial uint32
37+
38+ buf [xsBufSize]byte
39+}
40+
41+// xsettingsDPI is Xft/DPI*1024 for a scale: 96 dpi at scale 1, rounded to an
42+// integer dpi.
43+func xsettingsDPI(scale float64) int32 {
44+ if scale <= 0 {
45+ scale = 1
46+ }
47+ return int32(math.Round(96*scale)) * 1024
48+}
49+
50+func (x *XWM) cursorThemeName() string {
51+ t := x.cfg.CursorTheme
52+ if t == "" {
53+ t = "default"
54+ }
55+ if len(t) > xsMaxString {
56+ t = t[:xsMaxString]
57+ }
58+ return t
59+}
60+
61+func (x *XWM) cursorThemeSize() int32 {
62+ if s := x.cfg.CursorSize; s >= 8 && s <= 256 {
63+ return int32(s)
64+ }
65+ return 24
66+}
67+
68+// bootSettings runs at the end of boot: the XSETTINGS manager and the root
69+// cursor. Failures are never fatal.
70+func (x *XWM) bootSettings() error {
71+ if err := x.bootXSettings(); err != nil {
72+ return err
73+ }
74+ return x.bootRootCursor()
75+}
76+
77+func (x *XWM) bootXSettings() error {
78+ if !x.cfg.XSettings {
79+ return nil
80+ }
81+ conn, b := x.conn, x.conn.Buf()
82+ win, err := conn.NewXID()
83+ if err != nil {
84+ return err
85+ }
86+ x.xs.win = win
87+ var wv xproto.CreateWindowValues
88+ wv.SetEventMask(0)
89+ xproto.CreateWindow(b, 0, xproto.Window(win), xproto.Window(x.root), -1, -1, 1, 1, 0, xproto.WindowClassInputOnly, 0, &wv)
90+ x.expect(xproto.GetSelectionOwner(b, xproto.Atom(x.atoms[atomXSettingsS0])), kindSelOwner, 0, 0)
91+ if err := conn.Sync(&x.h); err != nil {
92+ return err
93+ }
94+ if x.bootErr != nil {
95+ return x.bootErr
96+ }
97+ if x.xs.taken {
98+ x.log.Warn().Uint32("owner", x.xs.ownerNo).Msg("another XSETTINGS manager runs, not taking _XSETTINGS_S0")
99+ xproto.DestroyWindow(b, xproto.Window(win))
100+ x.xs.win = 0
101+ return nil
102+ }
103+ x.publishXSettings(true)
104+ sel := x.atoms[atomXSettingsS0]
105+ xproto.SetSelectionOwner(b, xproto.Window(win), xproto.Atom(sel), 0)
106+ // ICCCM §2.8: announce the new manager to the root.
107+ var ev [32]byte
108+ ev[0], ev[1] = 33, 32 // ClientMessage, format 32
109+ binary.LittleEndian.PutUint32(ev[4:], x.root)
110+ binary.LittleEndian.PutUint32(ev[8:], x.atoms[atomManager])
111+ binary.LittleEndian.PutUint32(ev[16:], sel)
112+ binary.LittleEndian.PutUint32(ev[20:], win)
113+ xproto.SendEvent(b, false, xproto.Window(x.root), xproto.EventMaskStructureNotify, &ev)
114+ x.xs.active = true
115+ return nil
116+}
117+
118+// onSelOwnerReply: the boot GetSelectionOwner of _XSETTINGS_S0.
119+func (x *XWM) onSelOwnerReply(r *xturbo.Reply) {
120+ if v, ok := xproto.ParseGetSelectionOwnerReply(r.Raw); ok && v.Owner() != 0 && uint32(v.Owner()) != x.xs.win {
121+ x.xs.taken, x.xs.ownerNo = true, uint32(v.Owner())
122+ }
123+}
124+
125+// onXSettingsClear: another client took _XSETTINGS_S0.
126+func (x *XWM) onXSettingsClear(ev *xturbo.Event) {
127+ e := xproto.SelectionClearEvent(xproto.SelectionClearOf(ev))
128+ if x.xs.active && uint32(e.Owner()) == x.xs.win && uint32(e.Selection()) == x.atoms[atomXSettingsS0] {
129+ x.xs.active = false
130+ x.log.Warn().Msg("XSETTINGS manager replaced by another client, settings no longer updated")
131+ }
132+}
133+
134+// refreshXSettings re-evaluates the DPI after a layout change.
135+func (x *XWM) refreshXSettings() {
136+ if !x.xs.active {
137+ return
138+ }
139+ if x.publishXSettings(false) {
140+ x.wake()
141+ }
142+}
143+
144+// publishXSettings encodes and writes the property when a value changed
145+// (force: the first time). It reports whether it wrote. Unchanged values cost
146+// no allocation and no request.
147+func (x *XWM) publishXSettings(force bool) bool {
148+ s := &x.xs
149+ dpi := xsettingsDPI(x.space.Scale())
150+ theme, size := x.cursorThemeName(), x.cursorThemeSize()
151+ if !force && s.serial != 0 && dpi == s.dpi && theme == s.theme && size == s.size {
152+ return false
153+ }
154+ next := s.serial + 1 // wraps
155+ if force || s.serial == 0 || dpi != s.dpi {
156+ s.dpiSerial = next
157+ }
158+ if force || s.serial == 0 || theme != s.theme {
159+ s.themeSerial = next
160+ }
161+ if force || s.serial == 0 || size != s.size {
162+ s.sizeSerial = next
163+ }
164+ s.serial, s.dpi, s.theme, s.size = next, dpi, theme, size
165+ n := s.encode()
166+ xproto.ChangeProperty(x.conn.Buf(), xproto.PropModeReplace, xproto.Window(s.win),
167+ xproto.Atom(x.atoms[atomXSettingsSettings]), xproto.Atom(x.atoms[atomXSettingsSettings]), 8, uint32(n), s.buf[:n])
168+ return true
169+}
170+
171+func pad4(n int) int { return (n + 3) &^ 3 }
172+
173+// encode writes the settings, sorted by name, into s.buf.
174+func (s *xsettings) encode() int {
175+ le := binary.LittleEndian
176+ b := s.buf[:]
177+ clear(b[:16])
178+ b[0] = 0 // LSBFirst
179+ le.PutUint32(b[4:], s.serial)
180+ le.PutUint32(b[8:], 3)
181+ n := 12
182+ putName := func(typ byte, name string, serial uint32) {
183+ b[n], b[n+1] = typ, 0
184+ le.PutUint16(b[n+2:], uint16(len(name)))
185+ n += 4
186+ copy(b[n:], name)
187+ clear(b[n+len(name) : n+pad4(len(name))])
188+ n += pad4(len(name))
189+ le.PutUint32(b[n:], serial)
190+ n += 4
191+ }
192+ putName(xsString, "Gtk/CursorThemeName", s.themeSerial)
193+ le.PutUint32(b[n:], uint32(len(s.theme)))
194+ n += 4
195+ copy(b[n:], s.theme)
196+ clear(b[n+len(s.theme) : n+pad4(len(s.theme))])
197+ n += pad4(len(s.theme))
198+ putName(xsInt, "Gtk/CursorThemeSize", s.sizeSerial)
199+ le.PutUint32(b[n:], uint32(s.size))
200+ n += 4
201+ putName(xsInt, "Xft/DPI", s.dpiSerial)
202+ le.PutUint32(b[n:], uint32(s.dpi))
203+ n += 4
204+ return n
205+}
M internal/adapters/wayland/xwm/space.go +16 -4
@@ -15,9 +15,10 @@ type Region struct {
1515 type Space struct {
1616 regions [maxRegions]Region
1717 n int
18- dropped int // outputs beyond maxRegions in the last Set
19- ox, oy int // layout point that is X (0,0)
20- w, h int // X screen size: the extents
18+ dropped int // outputs beyond maxRegions in the last Set
19+ ox, oy int // layout point that is X (0,0)
20+ w, h int // X screen size: the extents
21+ scale float64 // scale of the first output; not part of the change test
2122 }
2223
2324 // Origin is the layout point that is X (0,0): the top-left of the layout
@@ -60,15 +61,26 @@ func (s *Space) Set(l ports.Layout) bool {
6061 }
6162 }
6263 next.w, next.h = maxX-next.ox, maxY-next.oy
64+ if n > 0 {
65+ next.scale = l[0].Scale
66+ }
6367 if next.regions == s.regions && next.n == s.n && next.ox == s.ox && next.oy == s.oy &&
6468 next.w == s.w && next.h == s.h {
65- s.dropped = next.dropped
69+ s.dropped, s.scale = next.dropped, next.scale
6670 return false
6771 }
6872 *s = next
6973 return true
7074 }
7175
76+// Scale is the scale of the first output of the layout, 1 when unset.
77+func (s *Space) Scale() float64 {
78+ if s.scale <= 0 {
79+ return 1
80+ }
81+ return s.scale
82+}
83+
7284 // Size is the X screen size.
7385 func (s *Space) Size() (w, h int) { return s.w, s.h }
7486
@@ -15,9 +15,10 @@ type Region struct {
15 type Space struct {15 type Space struct {
16 regions [maxRegions]Region16 regions [maxRegions]Region
17 n int17 n int
18- dropped int // outputs beyond maxRegions in the last Set18+ dropped int // outputs beyond maxRegions in the last Set
19- ox, oy int // layout point that is X (0,0)19+ ox, oy int // layout point that is X (0,0)
20- w, h int // X screen size: the extents20+ w, h int // X screen size: the extents
21+ scale float64 // scale of the first output; not part of the change test
21 }22 }
22 23
23 // Origin is the layout point that is X (0,0): the top-left of the layout24 // Origin is the layout point that is X (0,0): the top-left of the layout
@@ -60,15 +61,26 @@ func (s *Space) Set(l ports.Layout) bool {
60 }61 }
61 }62 }
62 next.w, next.h = maxX-next.ox, maxY-next.oy63 next.w, next.h = maxX-next.ox, maxY-next.oy
64+ if n > 0 {
65+ next.scale = l[0].Scale
66+ }
63 if next.regions == s.regions && next.n == s.n && next.ox == s.ox && next.oy == s.oy &&67 if next.regions == s.regions && next.n == s.n && next.ox == s.ox && next.oy == s.oy &&
64 next.w == s.w && next.h == s.h {68 next.w == s.w && next.h == s.h {
65- s.dropped = next.dropped69+ s.dropped, s.scale = next.dropped, next.scale
66 return false70 return false
67 }71 }
68 *s = next72 *s = next
69 return true73 return true
70 }74 }
71 75
76+// Scale is the scale of the first output of the layout, 1 when unset.
77+func (s *Space) Scale() float64 {
78+ if s.scale <= 0 {
79+ return 1
80+ }
81+ return s.scale
82+}
83+
72 // Size is the X screen size.84 // Size is the X screen size.
73 func (s *Space) Size() (w, h int) { return s.w, s.h }85 func (s *Space) Size() (w, h int) { return s.w, s.h }
74 86
M internal/adapters/wayland/xwm/testdata/streams/property_unchanged.hex +949 -949
@@ -1,950 +1,950 @@
1-1c00710001005000f30300000000000000000000000000000000000000000000
2-0108720003000000ef0300000000000009000000000000000000000000000000
3-6e6574207469746c650000001c00720001005000f30300000000000000000000
4-0000000000000000000000000108730003000000ef0300000000000009000000
5-0000000000000000000000006e6574207469746c650000001c00730001005000
6-f303000000000000000000000000000000000000000000000108740003000000
7-ef03000000000000090000000000000000000000000000006e6574207469746c
8-650000001c00740001005000f303000000000000000000000000000000000000
9-000000000108750003000000ef03000000000000090000000000000000000000
10-000000006e6574207469746c650000001c00750001005000f303000000000000
11-000000000000000000000000000000000108760003000000ef03000000000000
12-090000000000000000000000000000006e6574207469746c650000001c007600
13-01005000f3030000000000000000000000000000000000000000000001087700
14-03000000ef03000000000000090000000000000000000000000000006e657420
15-7469746c650000001c00770001005000f3030000000000000000000000000000
16-00000000000000000108780003000000ef030000000000000900000000000000
17-00000000000000006e6574207469746c650000001c00780001005000f3030000
18-00000000000000000000000000000000000000000108790003000000ef030000
19-00000000090000000000000000000000000000006e6574207469746c65000000
20-1c00790001005000f30300000000000000000000000000000000000000000000
21-01087a0003000000ef0300000000000009000000000000000000000000000000
22-6e6574207469746c650000001c007a0001005000f30300000000000000000000
23-00000000000000000000000001087b0003000000ef0300000000000009000000
24-0000000000000000000000006e6574207469746c650000001c007b0001005000
25-f3030000000000000000000000000000000000000000000001087c0003000000
26-ef03000000000000090000000000000000000000000000006e6574207469746c
27-650000001c007c0001005000f303000000000000000000000000000000000000
28-0000000001087d0003000000ef03000000000000090000000000000000000000
29-000000006e6574207469746c650000001c007d0001005000f303000000000000
30-0000000000000000000000000000000001087e0003000000ef03000000000000
31-090000000000000000000000000000006e6574207469746c650000001c007e00
32-01005000f3030000000000000000000000000000000000000000000001087f00
33-03000000ef03000000000000090000000000000000000000000000006e657420
34-7469746c650000001c007f0001005000f3030000000000000000000000000000
35-00000000000000000108800003000000ef030000000000000900000000000000
36-00000000000000006e6574207469746c650000001c00800001005000f3030000
37-00000000000000000000000000000000000000000108810003000000ef030000
38-00000000090000000000000000000000000000006e6574207469746c65000000
39-1c00810001005000f30300000000000000000000000000000000000000000000
40-0108820003000000ef0300000000000009000000000000000000000000000000
41-6e6574207469746c650000001c00820001005000f30300000000000000000000
42-0000000000000000000000000108830003000000ef0300000000000009000000
43-0000000000000000000000006e6574207469746c650000001c00830001005000
44-f303000000000000000000000000000000000000000000000108840003000000
45-ef03000000000000090000000000000000000000000000006e6574207469746c
46-650000001c00840001005000f303000000000000000000000000000000000000
47-000000000108850003000000ef03000000000000090000000000000000000000
48-000000006e6574207469746c650000001c00850001005000f303000000000000
49-000000000000000000000000000000000108860003000000ef03000000000000
50-090000000000000000000000000000006e6574207469746c650000001c008600
51-01005000f3030000000000000000000000000000000000000000000001088700
52-03000000ef03000000000000090000000000000000000000000000006e657420
53-7469746c650000001c00870001005000f3030000000000000000000000000000
54-00000000000000000108880003000000ef030000000000000900000000000000
55-00000000000000006e6574207469746c650000001c00880001005000f3030000
56-00000000000000000000000000000000000000000108890003000000ef030000
57-00000000090000000000000000000000000000006e6574207469746c65000000
58-1c00890001005000f30300000000000000000000000000000000000000000000
59-01088a0003000000ef0300000000000009000000000000000000000000000000
60-6e6574207469746c650000001c008a0001005000f30300000000000000000000
61-00000000000000000000000001088b0003000000ef0300000000000009000000
62-0000000000000000000000006e6574207469746c650000001c008b0001005000
63-f3030000000000000000000000000000000000000000000001088c0003000000
64-ef03000000000000090000000000000000000000000000006e6574207469746c
65-650000001c008c0001005000f303000000000000000000000000000000000000
66-0000000001088d0003000000ef03000000000000090000000000000000000000
67-000000006e6574207469746c650000001c008d0001005000f303000000000000
68-0000000000000000000000000000000001088e0003000000ef03000000000000
69-090000000000000000000000000000006e6574207469746c650000001c008e00
70-01005000f3030000000000000000000000000000000000000000000001088f00
71-03000000ef03000000000000090000000000000000000000000000006e657420
72-7469746c650000001c008f0001005000f3030000000000000000000000000000
73-00000000000000000108900003000000ef030000000000000900000000000000
74-00000000000000006e6574207469746c650000001c00900001005000f3030000
75-00000000000000000000000000000000000000000108910003000000ef030000
76-00000000090000000000000000000000000000006e6574207469746c65000000
77-1c00910001005000f30300000000000000000000000000000000000000000000
78-0108920003000000ef0300000000000009000000000000000000000000000000
79-6e6574207469746c650000001c00920001005000f30300000000000000000000
80-0000000000000000000000000108930003000000ef0300000000000009000000
81-0000000000000000000000006e6574207469746c650000001c00930001005000
82-f303000000000000000000000000000000000000000000000108940003000000
83-ef03000000000000090000000000000000000000000000006e6574207469746c
84-650000001c00940001005000f303000000000000000000000000000000000000
85-000000000108950003000000ef03000000000000090000000000000000000000
86-000000006e6574207469746c650000001c00950001005000f303000000000000
87-000000000000000000000000000000000108960003000000ef03000000000000
88-090000000000000000000000000000006e6574207469746c650000001c009600
89-01005000f3030000000000000000000000000000000000000000000001089700
90-03000000ef03000000000000090000000000000000000000000000006e657420
91-7469746c650000001c00970001005000f3030000000000000000000000000000
92-00000000000000000108980003000000ef030000000000000900000000000000
93-00000000000000006e6574207469746c650000001c00980001005000f3030000
94-00000000000000000000000000000000000000000108990003000000ef030000
95-00000000090000000000000000000000000000006e6574207469746c65000000
96-1c00990001005000f30300000000000000000000000000000000000000000000
97-01089a0003000000ef0300000000000009000000000000000000000000000000
98-6e6574207469746c650000001c009a0001005000f30300000000000000000000
99-00000000000000000000000001089b0003000000ef0300000000000009000000
100-0000000000000000000000006e6574207469746c650000001c009b0001005000
101-f3030000000000000000000000000000000000000000000001089c0003000000
102-ef03000000000000090000000000000000000000000000006e6574207469746c
103-650000001c009c0001005000f303000000000000000000000000000000000000
104-0000000001089d0003000000ef03000000000000090000000000000000000000
105-000000006e6574207469746c650000001c009d0001005000f303000000000000
106-0000000000000000000000000000000001089e0003000000ef03000000000000
107-090000000000000000000000000000006e6574207469746c650000001c009e00
108-01005000f3030000000000000000000000000000000000000000000001089f00
109-03000000ef03000000000000090000000000000000000000000000006e657420
110-7469746c650000001c009f0001005000f3030000000000000000000000000000
111-00000000000000000108a00003000000ef030000000000000900000000000000
112-00000000000000006e6574207469746c650000001c00a00001005000f3030000
113-00000000000000000000000000000000000000000108a10003000000ef030000
114-00000000090000000000000000000000000000006e6574207469746c65000000
115-1c00a10001005000f30300000000000000000000000000000000000000000000
116-0108a20003000000ef0300000000000009000000000000000000000000000000
117-6e6574207469746c650000001c00a20001005000f30300000000000000000000
118-0000000000000000000000000108a30003000000ef0300000000000009000000
119-0000000000000000000000006e6574207469746c650000001c00a30001005000
120-f303000000000000000000000000000000000000000000000108a40003000000
121-ef03000000000000090000000000000000000000000000006e6574207469746c
122-650000001c00a40001005000f303000000000000000000000000000000000000
123-000000000108a50003000000ef03000000000000090000000000000000000000
124-000000006e6574207469746c650000001c00a50001005000f303000000000000
125-000000000000000000000000000000000108a60003000000ef03000000000000
126-090000000000000000000000000000006e6574207469746c650000001c00a600
127-01005000f303000000000000000000000000000000000000000000000108a700
128-03000000ef03000000000000090000000000000000000000000000006e657420
129-7469746c650000001c00a70001005000f3030000000000000000000000000000
130-00000000000000000108a80003000000ef030000000000000900000000000000
131-00000000000000006e6574207469746c650000001c00a80001005000f3030000
132-00000000000000000000000000000000000000000108a90003000000ef030000
133-00000000090000000000000000000000000000006e6574207469746c65000000
134-1c00a90001005000f30300000000000000000000000000000000000000000000
135-0108aa0003000000ef0300000000000009000000000000000000000000000000
136-6e6574207469746c650000001c00aa0001005000f30300000000000000000000
137-0000000000000000000000000108ab0003000000ef0300000000000009000000
138-0000000000000000000000006e6574207469746c650000001c00ab0001005000
139-f303000000000000000000000000000000000000000000000108ac0003000000
140-ef03000000000000090000000000000000000000000000006e6574207469746c
141-650000001c00ac0001005000f303000000000000000000000000000000000000
142-000000000108ad0003000000ef03000000000000090000000000000000000000
143-000000006e6574207469746c650000001c00ad0001005000f303000000000000
144-000000000000000000000000000000000108ae0003000000ef03000000000000
145-090000000000000000000000000000006e6574207469746c650000001c00ae00
146-01005000f303000000000000000000000000000000000000000000000108af00
147-03000000ef03000000000000090000000000000000000000000000006e657420
148-7469746c650000001c00af0001005000f3030000000000000000000000000000
149-00000000000000000108b00003000000ef030000000000000900000000000000
150-00000000000000006e6574207469746c650000001c00b00001005000f3030000
151-00000000000000000000000000000000000000000108b10003000000ef030000
152-00000000090000000000000000000000000000006e6574207469746c65000000
153-1c00b10001005000f30300000000000000000000000000000000000000000000
154-0108b20003000000ef0300000000000009000000000000000000000000000000
155-6e6574207469746c650000001c00b20001005000f30300000000000000000000
156-0000000000000000000000000108b30003000000ef0300000000000009000000
157-0000000000000000000000006e6574207469746c650000001c00b30001005000
158-f303000000000000000000000000000000000000000000000108b40003000000
159-ef03000000000000090000000000000000000000000000006e6574207469746c
160-650000001c00b40001005000f303000000000000000000000000000000000000
161-000000000108b50003000000ef03000000000000090000000000000000000000
162-000000006e6574207469746c650000001c00b50001005000f303000000000000
163-000000000000000000000000000000000108b60003000000ef03000000000000
164-090000000000000000000000000000006e6574207469746c650000001c00b600
165-01005000f303000000000000000000000000000000000000000000000108b700
166-03000000ef03000000000000090000000000000000000000000000006e657420
167-7469746c650000001c00b70001005000f3030000000000000000000000000000
168-00000000000000000108b80003000000ef030000000000000900000000000000
169-00000000000000006e6574207469746c650000001c00b80001005000f3030000
170-00000000000000000000000000000000000000000108b90003000000ef030000
171-00000000090000000000000000000000000000006e6574207469746c65000000
172-1c00b90001005000f30300000000000000000000000000000000000000000000
173-0108ba0003000000ef0300000000000009000000000000000000000000000000
174-6e6574207469746c650000001c00ba0001005000f30300000000000000000000
175-0000000000000000000000000108bb0003000000ef0300000000000009000000
176-0000000000000000000000006e6574207469746c650000001c00bb0001005000
177-f303000000000000000000000000000000000000000000000108bc0003000000
178-ef03000000000000090000000000000000000000000000006e6574207469746c
179-650000001c00bc0001005000f303000000000000000000000000000000000000
180-000000000108bd0003000000ef03000000000000090000000000000000000000
181-000000006e6574207469746c650000001c00bd0001005000f303000000000000
182-000000000000000000000000000000000108be0003000000ef03000000000000
183-090000000000000000000000000000006e6574207469746c650000001c00be00
184-01005000f303000000000000000000000000000000000000000000000108bf00
185-03000000ef03000000000000090000000000000000000000000000006e657420
186-7469746c650000001c00bf0001005000f3030000000000000000000000000000
187-00000000000000000108c00003000000ef030000000000000900000000000000
188-00000000000000006e6574207469746c650000001c00c00001005000f3030000
189-00000000000000000000000000000000000000000108c10003000000ef030000
190-00000000090000000000000000000000000000006e6574207469746c65000000
191-1c00c10001005000f30300000000000000000000000000000000000000000000
192-0108c20003000000ef0300000000000009000000000000000000000000000000
193-6e6574207469746c650000001c00c20001005000f30300000000000000000000
194-0000000000000000000000000108c30003000000ef0300000000000009000000
195-0000000000000000000000006e6574207469746c650000001c00c30001005000
196-f303000000000000000000000000000000000000000000000108c40003000000
197-ef03000000000000090000000000000000000000000000006e6574207469746c
198-650000001c00c40001005000f303000000000000000000000000000000000000
199-000000000108c50003000000ef03000000000000090000000000000000000000
200-000000006e6574207469746c650000001c00c50001005000f303000000000000
201-000000000000000000000000000000000108c60003000000ef03000000000000
202-090000000000000000000000000000006e6574207469746c650000001c00c600
203-01005000f303000000000000000000000000000000000000000000000108c700
204-03000000ef03000000000000090000000000000000000000000000006e657420
205-7469746c650000001c00c70001005000f3030000000000000000000000000000
206-00000000000000000108c80003000000ef030000000000000900000000000000
207-00000000000000006e6574207469746c650000001c00c80001005000f3030000
208-00000000000000000000000000000000000000000108c90003000000ef030000
209-00000000090000000000000000000000000000006e6574207469746c65000000
210-1c00c90001005000f30300000000000000000000000000000000000000000000
211-0108ca0003000000ef0300000000000009000000000000000000000000000000
212-6e6574207469746c650000001c00ca0001005000f30300000000000000000000
213-0000000000000000000000000108cb0003000000ef0300000000000009000000
214-0000000000000000000000006e6574207469746c650000001c00cb0001005000
215-f303000000000000000000000000000000000000000000000108cc0003000000
216-ef03000000000000090000000000000000000000000000006e6574207469746c
217-650000001c00cc0001005000f303000000000000000000000000000000000000
218-000000000108cd0003000000ef03000000000000090000000000000000000000
219-000000006e6574207469746c650000001c00cd0001005000f303000000000000
220-000000000000000000000000000000000108ce0003000000ef03000000000000
221-090000000000000000000000000000006e6574207469746c650000001c00ce00
222-01005000f303000000000000000000000000000000000000000000000108cf00
223-03000000ef03000000000000090000000000000000000000000000006e657420
224-7469746c650000001c00cf0001005000f3030000000000000000000000000000
225-00000000000000000108d00003000000ef030000000000000900000000000000
226-00000000000000006e6574207469746c650000001c00d00001005000f3030000
227-00000000000000000000000000000000000000000108d10003000000ef030000
228-00000000090000000000000000000000000000006e6574207469746c65000000
229-1c00d10001005000f30300000000000000000000000000000000000000000000
230-0108d20003000000ef0300000000000009000000000000000000000000000000
231-6e6574207469746c650000001c00d20001005000f30300000000000000000000
232-0000000000000000000000000108d30003000000ef0300000000000009000000
233-0000000000000000000000006e6574207469746c650000001c00d30001005000
234-f303000000000000000000000000000000000000000000000108d40003000000
235-ef03000000000000090000000000000000000000000000006e6574207469746c
236-650000001c00d40001005000f303000000000000000000000000000000000000
237-000000000108d50003000000ef03000000000000090000000000000000000000
238-000000006e6574207469746c650000001c00d50001005000f303000000000000
239-000000000000000000000000000000000108d60003000000ef03000000000000
240-090000000000000000000000000000006e6574207469746c650000001c00d600
241-01005000f303000000000000000000000000000000000000000000000108d700
242-03000000ef03000000000000090000000000000000000000000000006e657420
243-7469746c650000001c00d70001005000f3030000000000000000000000000000
244-00000000000000000108d80003000000ef030000000000000900000000000000
245-00000000000000006e6574207469746c650000001c00d80001005000f3030000
246-00000000000000000000000000000000000000000108d90003000000ef030000
247-00000000090000000000000000000000000000006e6574207469746c65000000
248-1c00d90001005000f30300000000000000000000000000000000000000000000
249-0108da0003000000ef0300000000000009000000000000000000000000000000
250-6e6574207469746c650000001c00da0001005000f30300000000000000000000
251-0000000000000000000000000108db0003000000ef0300000000000009000000
252-0000000000000000000000006e6574207469746c650000001c00db0001005000
253-f303000000000000000000000000000000000000000000000108dc0003000000
254-ef03000000000000090000000000000000000000000000006e6574207469746c
255-650000001c00dc0001005000f303000000000000000000000000000000000000
256-000000000108dd0003000000ef03000000000000090000000000000000000000
257-000000006e6574207469746c650000001c00dd0001005000f303000000000000
258-000000000000000000000000000000000108de0003000000ef03000000000000
259-090000000000000000000000000000006e6574207469746c650000001c00de00
260-01005000f303000000000000000000000000000000000000000000000108df00
261-03000000ef03000000000000090000000000000000000000000000006e657420
262-7469746c650000001c00df0001005000f3030000000000000000000000000000
263-00000000000000000108e00003000000ef030000000000000900000000000000
264-00000000000000006e6574207469746c650000001c00e00001005000f3030000
265-00000000000000000000000000000000000000000108e10003000000ef030000
266-00000000090000000000000000000000000000006e6574207469746c65000000
267-1c00e10001005000f30300000000000000000000000000000000000000000000
268-0108e20003000000ef0300000000000009000000000000000000000000000000
269-6e6574207469746c650000001c00e20001005000f30300000000000000000000
270-0000000000000000000000000108e30003000000ef0300000000000009000000
271-0000000000000000000000006e6574207469746c650000001c00e30001005000
272-f303000000000000000000000000000000000000000000000108e40003000000
273-ef03000000000000090000000000000000000000000000006e6574207469746c
274-650000001c00e40001005000f303000000000000000000000000000000000000
275-000000000108e50003000000ef03000000000000090000000000000000000000
276-000000006e6574207469746c650000001c00e50001005000f303000000000000
277-000000000000000000000000000000000108e60003000000ef03000000000000
278-090000000000000000000000000000006e6574207469746c650000001c00e600
279-01005000f303000000000000000000000000000000000000000000000108e700
280-03000000ef03000000000000090000000000000000000000000000006e657420
281-7469746c650000001c00e70001005000f3030000000000000000000000000000
282-00000000000000000108e80003000000ef030000000000000900000000000000
283-00000000000000006e6574207469746c650000001c00e80001005000f3030000
284-00000000000000000000000000000000000000000108e90003000000ef030000
285-00000000090000000000000000000000000000006e6574207469746c65000000
286-1c00e90001005000f30300000000000000000000000000000000000000000000
287-0108ea0003000000ef0300000000000009000000000000000000000000000000
288-6e6574207469746c650000001c00ea0001005000f30300000000000000000000
289-0000000000000000000000000108eb0003000000ef0300000000000009000000
290-0000000000000000000000006e6574207469746c650000001c00eb0001005000
291-f303000000000000000000000000000000000000000000000108ec0003000000
292-ef03000000000000090000000000000000000000000000006e6574207469746c
293-650000001c00ec0001005000f303000000000000000000000000000000000000
294-000000000108ed0003000000ef03000000000000090000000000000000000000
295-000000006e6574207469746c650000001c00ed0001005000f303000000000000
296-000000000000000000000000000000000108ee0003000000ef03000000000000
297-090000000000000000000000000000006e6574207469746c650000001c00ee00
298-01005000f303000000000000000000000000000000000000000000000108ef00
299-03000000ef03000000000000090000000000000000000000000000006e657420
300-7469746c650000001c00ef0001005000f3030000000000000000000000000000
301-00000000000000000108f00003000000ef030000000000000900000000000000
302-00000000000000006e6574207469746c650000001c00f00001005000f3030000
303-00000000000000000000000000000000000000000108f10003000000ef030000
304-00000000090000000000000000000000000000006e6574207469746c65000000
305-1c00f10001005000f30300000000000000000000000000000000000000000000
306-0108f20003000000ef0300000000000009000000000000000000000000000000
307-6e6574207469746c650000001c00f20001005000f30300000000000000000000
308-0000000000000000000000000108f30003000000ef0300000000000009000000
309-0000000000000000000000006e6574207469746c650000001c00f30001005000
310-f303000000000000000000000000000000000000000000000108f40003000000
311-ef03000000000000090000000000000000000000000000006e6574207469746c
312-650000001c00f40001005000f303000000000000000000000000000000000000
313-000000000108f50003000000ef03000000000000090000000000000000000000
314-000000006e6574207469746c650000001c00f50001005000f303000000000000
315-000000000000000000000000000000000108f60003000000ef03000000000000
316-090000000000000000000000000000006e6574207469746c650000001c00f600
317-01005000f303000000000000000000000000000000000000000000000108f700
318-03000000ef03000000000000090000000000000000000000000000006e657420
319-7469746c650000001c00f70001005000f3030000000000000000000000000000
320-00000000000000000108f80003000000ef030000000000000900000000000000
321-00000000000000006e6574207469746c650000001c00f80001005000f3030000
322-00000000000000000000000000000000000000000108f90003000000ef030000
323-00000000090000000000000000000000000000006e6574207469746c65000000
324-1c00f90001005000f30300000000000000000000000000000000000000000000
325-0108fa0003000000ef0300000000000009000000000000000000000000000000
326-6e6574207469746c650000001c00fa0001005000f30300000000000000000000
327-0000000000000000000000000108fb0003000000ef0300000000000009000000
328-0000000000000000000000006e6574207469746c650000001c00fb0001005000
329-f303000000000000000000000000000000000000000000000108fc0003000000
330-ef03000000000000090000000000000000000000000000006e6574207469746c
331-650000001c00fc0001005000f303000000000000000000000000000000000000
332-000000000108fd0003000000ef03000000000000090000000000000000000000
333-000000006e6574207469746c650000001c00fd0001005000f303000000000000
334-000000000000000000000000000000000108fe0003000000ef03000000000000
335-090000000000000000000000000000006e6574207469746c650000001c00fe00
336-01005000f303000000000000000000000000000000000000000000000108ff00
337-03000000ef03000000000000090000000000000000000000000000006e657420
338-7469746c650000001c00ff0001005000f3030000000000000000000000000000
339-00000000000000000108000103000000ef030000000000000900000000000000
340-00000000000000006e6574207469746c650000001c00000101005000f3030000
341-00000000000000000000000000000000000000000108010103000000ef030000
342-00000000090000000000000000000000000000006e6574207469746c65000000
343-1c00010101005000f30300000000000000000000000000000000000000000000
344-0108020103000000ef0300000000000009000000000000000000000000000000
345-6e6574207469746c650000001c00020101005000f30300000000000000000000
346-0000000000000000000000000108030103000000ef0300000000000009000000
347-0000000000000000000000006e6574207469746c650000001c00030101005000
348-f303000000000000000000000000000000000000000000000108040103000000
349-ef03000000000000090000000000000000000000000000006e6574207469746c
350-650000001c00040101005000f303000000000000000000000000000000000000
351-000000000108050103000000ef03000000000000090000000000000000000000
352-000000006e6574207469746c650000001c00050101005000f303000000000000
353-000000000000000000000000000000000108060103000000ef03000000000000
354-090000000000000000000000000000006e6574207469746c650000001c000601
355-01005000f3030000000000000000000000000000000000000000000001080701
356-03000000ef03000000000000090000000000000000000000000000006e657420
357-7469746c650000001c00070101005000f3030000000000000000000000000000
358-00000000000000000108080103000000ef030000000000000900000000000000
359-00000000000000006e6574207469746c650000001c00080101005000f3030000
360-00000000000000000000000000000000000000000108090103000000ef030000
361-00000000090000000000000000000000000000006e6574207469746c65000000
362-1c00090101005000f30300000000000000000000000000000000000000000000
363-01080a0103000000ef0300000000000009000000000000000000000000000000
364-6e6574207469746c650000001c000a0101005000f30300000000000000000000
365-00000000000000000000000001080b0103000000ef0300000000000009000000
366-0000000000000000000000006e6574207469746c650000001c000b0101005000
367-f3030000000000000000000000000000000000000000000001080c0103000000
368-ef03000000000000090000000000000000000000000000006e6574207469746c
369-650000001c000c0101005000f303000000000000000000000000000000000000
370-0000000001080d0103000000ef03000000000000090000000000000000000000
371-000000006e6574207469746c650000001c000d0101005000f303000000000000
372-0000000000000000000000000000000001080e0103000000ef03000000000000
373-090000000000000000000000000000006e6574207469746c650000001c000e01
374-01005000f3030000000000000000000000000000000000000000000001080f01
375-03000000ef03000000000000090000000000000000000000000000006e657420
376-7469746c650000001c000f0101005000f3030000000000000000000000000000
377-00000000000000000108100103000000ef030000000000000900000000000000
378-00000000000000006e6574207469746c650000001c00100101005000f3030000
379-00000000000000000000000000000000000000000108110103000000ef030000
380-00000000090000000000000000000000000000006e6574207469746c65000000
381-1c00110101005000f30300000000000000000000000000000000000000000000
382-0108120103000000ef0300000000000009000000000000000000000000000000
383-6e6574207469746c650000001c00120101005000f30300000000000000000000
384-0000000000000000000000000108130103000000ef0300000000000009000000
385-0000000000000000000000006e6574207469746c650000001c00130101005000
386-f303000000000000000000000000000000000000000000000108140103000000
387-ef03000000000000090000000000000000000000000000006e6574207469746c
388-650000001c00140101005000f303000000000000000000000000000000000000
389-000000000108150103000000ef03000000000000090000000000000000000000
390-000000006e6574207469746c650000001c00150101005000f303000000000000
391-000000000000000000000000000000000108160103000000ef03000000000000
392-090000000000000000000000000000006e6574207469746c650000001c001601
393-01005000f3030000000000000000000000000000000000000000000001081701
394-03000000ef03000000000000090000000000000000000000000000006e657420
395-7469746c650000001c00170101005000f3030000000000000000000000000000
396-00000000000000000108180103000000ef030000000000000900000000000000
397-00000000000000006e6574207469746c650000001c00180101005000f3030000
398-00000000000000000000000000000000000000000108190103000000ef030000
399-00000000090000000000000000000000000000006e6574207469746c65000000
400-1c00190101005000f30300000000000000000000000000000000000000000000
401-01081a0103000000ef0300000000000009000000000000000000000000000000
402-6e6574207469746c650000001c001a0101005000f30300000000000000000000
403-00000000000000000000000001081b0103000000ef0300000000000009000000
404-0000000000000000000000006e6574207469746c650000001c001b0101005000
405-f3030000000000000000000000000000000000000000000001081c0103000000
406-ef03000000000000090000000000000000000000000000006e6574207469746c
407-650000001c001c0101005000f303000000000000000000000000000000000000
408-0000000001081d0103000000ef03000000000000090000000000000000000000
409-000000006e6574207469746c650000001c001d0101005000f303000000000000
410-0000000000000000000000000000000001081e0103000000ef03000000000000
411-090000000000000000000000000000006e6574207469746c650000001c001e01
412-01005000f3030000000000000000000000000000000000000000000001081f01
413-03000000ef03000000000000090000000000000000000000000000006e657420
414-7469746c650000001c001f0101005000f3030000000000000000000000000000
415-00000000000000000108200103000000ef030000000000000900000000000000
416-00000000000000006e6574207469746c650000001c00200101005000f3030000
417-00000000000000000000000000000000000000000108210103000000ef030000
418-00000000090000000000000000000000000000006e6574207469746c65000000
419-1c00210101005000f30300000000000000000000000000000000000000000000
420-0108220103000000ef0300000000000009000000000000000000000000000000
421-6e6574207469746c650000001c00220101005000f30300000000000000000000
422-0000000000000000000000000108230103000000ef0300000000000009000000
423-0000000000000000000000006e6574207469746c650000001c00230101005000
424-f303000000000000000000000000000000000000000000000108240103000000
425-ef03000000000000090000000000000000000000000000006e6574207469746c
426-650000001c00240101005000f303000000000000000000000000000000000000
427-000000000108250103000000ef03000000000000090000000000000000000000
428-000000006e6574207469746c650000001c00250101005000f303000000000000
429-000000000000000000000000000000000108260103000000ef03000000000000
430-090000000000000000000000000000006e6574207469746c650000001c002601
431-01005000f3030000000000000000000000000000000000000000000001082701
432-03000000ef03000000000000090000000000000000000000000000006e657420
433-7469746c650000001c00270101005000f3030000000000000000000000000000
434-00000000000000000108280103000000ef030000000000000900000000000000
435-00000000000000006e6574207469746c650000001c00280101005000f3030000
436-00000000000000000000000000000000000000000108290103000000ef030000
437-00000000090000000000000000000000000000006e6574207469746c65000000
438-1c00290101005000f30300000000000000000000000000000000000000000000
439-01082a0103000000ef0300000000000009000000000000000000000000000000
440-6e6574207469746c650000001c002a0101005000f30300000000000000000000
441-00000000000000000000000001082b0103000000ef0300000000000009000000
442-0000000000000000000000006e6574207469746c650000001c002b0101005000
443-f3030000000000000000000000000000000000000000000001082c0103000000
444-ef03000000000000090000000000000000000000000000006e6574207469746c
445-650000001c002c0101005000f303000000000000000000000000000000000000
446-0000000001082d0103000000ef03000000000000090000000000000000000000
447-000000006e6574207469746c650000001c002d0101005000f303000000000000
448-0000000000000000000000000000000001082e0103000000ef03000000000000
449-090000000000000000000000000000006e6574207469746c650000001c002e01
450-01005000f3030000000000000000000000000000000000000000000001082f01
451-03000000ef03000000000000090000000000000000000000000000006e657420
452-7469746c650000001c002f0101005000f3030000000000000000000000000000
453-00000000000000000108300103000000ef030000000000000900000000000000
454-00000000000000006e6574207469746c650000001c00300101005000f3030000
455-00000000000000000000000000000000000000000108310103000000ef030000
456-00000000090000000000000000000000000000006e6574207469746c65000000
457-1c00310101005000f30300000000000000000000000000000000000000000000
458-0108320103000000ef0300000000000009000000000000000000000000000000
459-6e6574207469746c650000001c00320101005000f30300000000000000000000
460-0000000000000000000000000108330103000000ef0300000000000009000000
461-0000000000000000000000006e6574207469746c650000001c00330101005000
462-f303000000000000000000000000000000000000000000000108340103000000
463-ef03000000000000090000000000000000000000000000006e6574207469746c
464-650000001c00340101005000f303000000000000000000000000000000000000
465-000000000108350103000000ef03000000000000090000000000000000000000
466-000000006e6574207469746c650000001c00350101005000f303000000000000
467-000000000000000000000000000000000108360103000000ef03000000000000
468-090000000000000000000000000000006e6574207469746c650000001c003601
469-01005000f3030000000000000000000000000000000000000000000001083701
470-03000000ef03000000000000090000000000000000000000000000006e657420
471-7469746c650000001c00370101005000f3030000000000000000000000000000
472-00000000000000000108380103000000ef030000000000000900000000000000
473-00000000000000006e6574207469746c650000001c00380101005000f3030000
474-00000000000000000000000000000000000000000108390103000000ef030000
475-00000000090000000000000000000000000000006e6574207469746c65000000
476-1c00390101005000f30300000000000000000000000000000000000000000000
477-01083a0103000000ef0300000000000009000000000000000000000000000000
478-6e6574207469746c650000001c003a0101005000f30300000000000000000000
479-00000000000000000000000001083b0103000000ef0300000000000009000000
480-0000000000000000000000006e6574207469746c650000001c003b0101005000
481-f3030000000000000000000000000000000000000000000001083c0103000000
482-ef03000000000000090000000000000000000000000000006e6574207469746c
483-650000001c003c0101005000f303000000000000000000000000000000000000
484-0000000001083d0103000000ef03000000000000090000000000000000000000
485-000000006e6574207469746c650000001c003d0101005000f303000000000000
486-0000000000000000000000000000000001083e0103000000ef03000000000000
487-090000000000000000000000000000006e6574207469746c650000001c003e01
488-01005000f3030000000000000000000000000000000000000000000001083f01
489-03000000ef03000000000000090000000000000000000000000000006e657420
490-7469746c650000001c003f0101005000f3030000000000000000000000000000
491-00000000000000000108400103000000ef030000000000000900000000000000
492-00000000000000006e6574207469746c650000001c00400101005000f3030000
493-00000000000000000000000000000000000000000108410103000000ef030000
494-00000000090000000000000000000000000000006e6574207469746c65000000
495-1c00410101005000f30300000000000000000000000000000000000000000000
496-0108420103000000ef0300000000000009000000000000000000000000000000
497-6e6574207469746c650000001c00420101005000f30300000000000000000000
498-0000000000000000000000000108430103000000ef0300000000000009000000
499-0000000000000000000000006e6574207469746c650000001c00430101005000
500-f303000000000000000000000000000000000000000000000108440103000000
501-ef03000000000000090000000000000000000000000000006e6574207469746c
502-650000001c00440101005000f303000000000000000000000000000000000000
503-000000000108450103000000ef03000000000000090000000000000000000000
504-000000006e6574207469746c650000001c00450101005000f303000000000000
505-000000000000000000000000000000000108460103000000ef03000000000000
506-090000000000000000000000000000006e6574207469746c650000001c004601
507-01005000f3030000000000000000000000000000000000000000000001084701
508-03000000ef03000000000000090000000000000000000000000000006e657420
509-7469746c650000001c00470101005000f3030000000000000000000000000000
510-00000000000000000108480103000000ef030000000000000900000000000000
511-00000000000000006e6574207469746c650000001c00480101005000f3030000
512-00000000000000000000000000000000000000000108490103000000ef030000
513-00000000090000000000000000000000000000006e6574207469746c65000000
514-1c00490101005000f30300000000000000000000000000000000000000000000
515-01084a0103000000ef0300000000000009000000000000000000000000000000
516-6e6574207469746c650000001c004a0101005000f30300000000000000000000
517-00000000000000000000000001084b0103000000ef0300000000000009000000
518-0000000000000000000000006e6574207469746c650000001c004b0101005000
519-f3030000000000000000000000000000000000000000000001084c0103000000
520-ef03000000000000090000000000000000000000000000006e6574207469746c
521-650000001c004c0101005000f303000000000000000000000000000000000000
522-0000000001084d0103000000ef03000000000000090000000000000000000000
523-000000006e6574207469746c650000001c004d0101005000f303000000000000
524-0000000000000000000000000000000001084e0103000000ef03000000000000
525-090000000000000000000000000000006e6574207469746c650000001c004e01
526-01005000f3030000000000000000000000000000000000000000000001084f01
527-03000000ef03000000000000090000000000000000000000000000006e657420
528-7469746c650000001c004f0101005000f3030000000000000000000000000000
529-00000000000000000108500103000000ef030000000000000900000000000000
530-00000000000000006e6574207469746c650000001c00500101005000f3030000
531-00000000000000000000000000000000000000000108510103000000ef030000
532-00000000090000000000000000000000000000006e6574207469746c65000000
533-1c00510101005000f30300000000000000000000000000000000000000000000
534-0108520103000000ef0300000000000009000000000000000000000000000000
535-6e6574207469746c650000001c00520101005000f30300000000000000000000
536-0000000000000000000000000108530103000000ef0300000000000009000000
537-0000000000000000000000006e6574207469746c650000001c00530101005000
538-f303000000000000000000000000000000000000000000000108540103000000
539-ef03000000000000090000000000000000000000000000006e6574207469746c
540-650000001c00540101005000f303000000000000000000000000000000000000
541-000000000108550103000000ef03000000000000090000000000000000000000
542-000000006e6574207469746c650000001c00550101005000f303000000000000
543-000000000000000000000000000000000108560103000000ef03000000000000
544-090000000000000000000000000000006e6574207469746c650000001c005601
545-01005000f3030000000000000000000000000000000000000000000001085701
546-03000000ef03000000000000090000000000000000000000000000006e657420
547-7469746c650000001c00570101005000f3030000000000000000000000000000
548-00000000000000000108580103000000ef030000000000000900000000000000
549-00000000000000006e6574207469746c650000001c00580101005000f3030000
550-00000000000000000000000000000000000000000108590103000000ef030000
551-00000000090000000000000000000000000000006e6574207469746c65000000
552-1c00590101005000f30300000000000000000000000000000000000000000000
553-01085a0103000000ef0300000000000009000000000000000000000000000000
554-6e6574207469746c650000001c005a0101005000f30300000000000000000000
555-00000000000000000000000001085b0103000000ef0300000000000009000000
556-0000000000000000000000006e6574207469746c650000001c005b0101005000
557-f3030000000000000000000000000000000000000000000001085c0103000000
558-ef03000000000000090000000000000000000000000000006e6574207469746c
559-650000001c005c0101005000f303000000000000000000000000000000000000
560-0000000001085d0103000000ef03000000000000090000000000000000000000
561-000000006e6574207469746c650000001c005d0101005000f303000000000000
562-0000000000000000000000000000000001085e0103000000ef03000000000000
563-090000000000000000000000000000006e6574207469746c650000001c005e01
564-01005000f3030000000000000000000000000000000000000000000001085f01
565-03000000ef03000000000000090000000000000000000000000000006e657420
566-7469746c650000001c005f0101005000f3030000000000000000000000000000
567-00000000000000000108600103000000ef030000000000000900000000000000
568-00000000000000006e6574207469746c650000001c00600101005000f3030000
569-00000000000000000000000000000000000000000108610103000000ef030000
570-00000000090000000000000000000000000000006e6574207469746c65000000
571-1c00610101005000f30300000000000000000000000000000000000000000000
572-0108620103000000ef0300000000000009000000000000000000000000000000
573-6e6574207469746c650000001c00620101005000f30300000000000000000000
574-0000000000000000000000000108630103000000ef0300000000000009000000
575-0000000000000000000000006e6574207469746c650000001c00630101005000
576-f303000000000000000000000000000000000000000000000108640103000000
577-ef03000000000000090000000000000000000000000000006e6574207469746c
578-650000001c00640101005000f303000000000000000000000000000000000000
579-000000000108650103000000ef03000000000000090000000000000000000000
580-000000006e6574207469746c650000001c00650101005000f303000000000000
581-000000000000000000000000000000000108660103000000ef03000000000000
582-090000000000000000000000000000006e6574207469746c650000001c006601
583-01005000f3030000000000000000000000000000000000000000000001086701
584-03000000ef03000000000000090000000000000000000000000000006e657420
585-7469746c650000001c00670101005000f3030000000000000000000000000000
586-00000000000000000108680103000000ef030000000000000900000000000000
587-00000000000000006e6574207469746c650000001c00680101005000f3030000
588-00000000000000000000000000000000000000000108690103000000ef030000
589-00000000090000000000000000000000000000006e6574207469746c65000000
590-1c00690101005000f30300000000000000000000000000000000000000000000
591-01086a0103000000ef0300000000000009000000000000000000000000000000
592-6e6574207469746c650000001c006a0101005000f30300000000000000000000
593-00000000000000000000000001086b0103000000ef0300000000000009000000
594-0000000000000000000000006e6574207469746c650000001c006b0101005000
595-f3030000000000000000000000000000000000000000000001086c0103000000
596-ef03000000000000090000000000000000000000000000006e6574207469746c
597-650000001c006c0101005000f303000000000000000000000000000000000000
598-0000000001086d0103000000ef03000000000000090000000000000000000000
599-000000006e6574207469746c650000001c006d0101005000f303000000000000
600-0000000000000000000000000000000001086e0103000000ef03000000000000
601-090000000000000000000000000000006e6574207469746c650000001c006e01
602-01005000f3030000000000000000000000000000000000000000000001086f01
603-03000000ef03000000000000090000000000000000000000000000006e657420
604-7469746c650000001c006f0101005000f3030000000000000000000000000000
605-00000000000000000108700103000000ef030000000000000900000000000000
606-00000000000000006e6574207469746c650000001c00700101005000f3030000
607-00000000000000000000000000000000000000000108710103000000ef030000
608-00000000090000000000000000000000000000006e6574207469746c65000000
609-1c00710101005000f30300000000000000000000000000000000000000000000
610-0108720103000000ef0300000000000009000000000000000000000000000000
611-6e6574207469746c650000001c00720101005000f30300000000000000000000
612-0000000000000000000000000108730103000000ef0300000000000009000000
613-0000000000000000000000006e6574207469746c650000001c00730101005000
614-f303000000000000000000000000000000000000000000000108740103000000
615-ef03000000000000090000000000000000000000000000006e6574207469746c
616-650000001c00740101005000f303000000000000000000000000000000000000
617-000000000108750103000000ef03000000000000090000000000000000000000
618-000000006e6574207469746c650000001c00750101005000f303000000000000
619-000000000000000000000000000000000108760103000000ef03000000000000
620-090000000000000000000000000000006e6574207469746c650000001c007601
621-01005000f3030000000000000000000000000000000000000000000001087701
622-03000000ef03000000000000090000000000000000000000000000006e657420
623-7469746c650000001c00770101005000f3030000000000000000000000000000
624-00000000000000000108780103000000ef030000000000000900000000000000
625-00000000000000006e6574207469746c650000001c00780101005000f3030000
626-00000000000000000000000000000000000000000108790103000000ef030000
627-00000000090000000000000000000000000000006e6574207469746c65000000
628-1c00790101005000f30300000000000000000000000000000000000000000000
629-01087a0103000000ef0300000000000009000000000000000000000000000000
630-6e6574207469746c650000001c007a0101005000f30300000000000000000000
631-00000000000000000000000001087b0103000000ef0300000000000009000000
632-0000000000000000000000006e6574207469746c650000001c007b0101005000
633-f3030000000000000000000000000000000000000000000001087c0103000000
634-ef03000000000000090000000000000000000000000000006e6574207469746c
635-650000001c007c0101005000f303000000000000000000000000000000000000
636-0000000001087d0103000000ef03000000000000090000000000000000000000
637-000000006e6574207469746c650000001c007d0101005000f303000000000000
638-0000000000000000000000000000000001087e0103000000ef03000000000000
639-090000000000000000000000000000006e6574207469746c650000001c007e01
640-01005000f3030000000000000000000000000000000000000000000001087f01
641-03000000ef03000000000000090000000000000000000000000000006e657420
642-7469746c650000001c007f0101005000f3030000000000000000000000000000
643-00000000000000000108800103000000ef030000000000000900000000000000
644-00000000000000006e6574207469746c650000001c00800101005000f3030000
645-00000000000000000000000000000000000000000108810103000000ef030000
646-00000000090000000000000000000000000000006e6574207469746c65000000
647-1c00810101005000f30300000000000000000000000000000000000000000000
648-0108820103000000ef0300000000000009000000000000000000000000000000
649-6e6574207469746c650000001c00820101005000f30300000000000000000000
650-0000000000000000000000000108830103000000ef0300000000000009000000
651-0000000000000000000000006e6574207469746c650000001c00830101005000
652-f303000000000000000000000000000000000000000000000108840103000000
653-ef03000000000000090000000000000000000000000000006e6574207469746c
654-650000001c00840101005000f303000000000000000000000000000000000000
655-000000000108850103000000ef03000000000000090000000000000000000000
656-000000006e6574207469746c650000001c00850101005000f303000000000000
657-000000000000000000000000000000000108860103000000ef03000000000000
658-090000000000000000000000000000006e6574207469746c650000001c008601
659-01005000f3030000000000000000000000000000000000000000000001088701
660-03000000ef03000000000000090000000000000000000000000000006e657420
661-7469746c650000001c00870101005000f3030000000000000000000000000000
662-00000000000000000108880103000000ef030000000000000900000000000000
663-00000000000000006e6574207469746c650000001c00880101005000f3030000
664-00000000000000000000000000000000000000000108890103000000ef030000
665-00000000090000000000000000000000000000006e6574207469746c65000000
666-1c00890101005000f30300000000000000000000000000000000000000000000
667-01088a0103000000ef0300000000000009000000000000000000000000000000
668-6e6574207469746c650000001c008a0101005000f30300000000000000000000
669-00000000000000000000000001088b0103000000ef0300000000000009000000
670-0000000000000000000000006e6574207469746c650000001c008b0101005000
671-f3030000000000000000000000000000000000000000000001088c0103000000
672-ef03000000000000090000000000000000000000000000006e6574207469746c
673-650000001c008c0101005000f303000000000000000000000000000000000000
674-0000000001088d0103000000ef03000000000000090000000000000000000000
675-000000006e6574207469746c650000001c008d0101005000f303000000000000
676-0000000000000000000000000000000001088e0103000000ef03000000000000
677-090000000000000000000000000000006e6574207469746c650000001c008e01
678-01005000f3030000000000000000000000000000000000000000000001088f01
679-03000000ef03000000000000090000000000000000000000000000006e657420
680-7469746c650000001c008f0101005000f3030000000000000000000000000000
681-00000000000000000108900103000000ef030000000000000900000000000000
682-00000000000000006e6574207469746c650000001c00900101005000f3030000
683-00000000000000000000000000000000000000000108910103000000ef030000
684-00000000090000000000000000000000000000006e6574207469746c65000000
685-1c00910101005000f30300000000000000000000000000000000000000000000
686-0108920103000000ef0300000000000009000000000000000000000000000000
687-6e6574207469746c650000001c00920101005000f30300000000000000000000
688-0000000000000000000000000108930103000000ef0300000000000009000000
689-0000000000000000000000006e6574207469746c650000001c00930101005000
690-f303000000000000000000000000000000000000000000000108940103000000
691-ef03000000000000090000000000000000000000000000006e6574207469746c
692-650000001c00940101005000f303000000000000000000000000000000000000
693-000000000108950103000000ef03000000000000090000000000000000000000
694-000000006e6574207469746c650000001c00950101005000f303000000000000
695-000000000000000000000000000000000108960103000000ef03000000000000
696-090000000000000000000000000000006e6574207469746c650000001c009601
697-01005000f3030000000000000000000000000000000000000000000001089701
698-03000000ef03000000000000090000000000000000000000000000006e657420
699-7469746c650000001c00970101005000f3030000000000000000000000000000
700-00000000000000000108980103000000ef030000000000000900000000000000
701-00000000000000006e6574207469746c650000001c00980101005000f3030000
702-00000000000000000000000000000000000000000108990103000000ef030000
703-00000000090000000000000000000000000000006e6574207469746c65000000
704-1c00990101005000f30300000000000000000000000000000000000000000000
705-01089a0103000000ef0300000000000009000000000000000000000000000000
706-6e6574207469746c650000001c009a0101005000f30300000000000000000000
707-00000000000000000000000001089b0103000000ef0300000000000009000000
708-0000000000000000000000006e6574207469746c650000001c009b0101005000
709-f3030000000000000000000000000000000000000000000001089c0103000000
710-ef03000000000000090000000000000000000000000000006e6574207469746c
711-650000001c009c0101005000f303000000000000000000000000000000000000
712-0000000001089d0103000000ef03000000000000090000000000000000000000
713-000000006e6574207469746c650000001c009d0101005000f303000000000000
714-0000000000000000000000000000000001089e0103000000ef03000000000000
715-090000000000000000000000000000006e6574207469746c650000001c009e01
716-01005000f3030000000000000000000000000000000000000000000001089f01
717-03000000ef03000000000000090000000000000000000000000000006e657420
718-7469746c650000001c009f0101005000f3030000000000000000000000000000
719-00000000000000000108a00103000000ef030000000000000900000000000000
720-00000000000000006e6574207469746c650000001c00a00101005000f3030000
721-00000000000000000000000000000000000000000108a10103000000ef030000
722-00000000090000000000000000000000000000006e6574207469746c65000000
723-1c00a10101005000f30300000000000000000000000000000000000000000000
724-0108a20103000000ef0300000000000009000000000000000000000000000000
725-6e6574207469746c650000001c00a20101005000f30300000000000000000000
726-0000000000000000000000000108a30103000000ef0300000000000009000000
727-0000000000000000000000006e6574207469746c650000001c00a30101005000
728-f303000000000000000000000000000000000000000000000108a40103000000
729-ef03000000000000090000000000000000000000000000006e6574207469746c
730-650000001c00a40101005000f303000000000000000000000000000000000000
731-000000000108a50103000000ef03000000000000090000000000000000000000
732-000000006e6574207469746c650000001c00a50101005000f303000000000000
733-000000000000000000000000000000000108a60103000000ef03000000000000
734-090000000000000000000000000000006e6574207469746c650000001c00a601
735-01005000f303000000000000000000000000000000000000000000000108a701
736-03000000ef03000000000000090000000000000000000000000000006e657420
737-7469746c650000001c00a70101005000f3030000000000000000000000000000
738-00000000000000000108a80103000000ef030000000000000900000000000000
739-00000000000000006e6574207469746c650000001c00a80101005000f3030000
740-00000000000000000000000000000000000000000108a90103000000ef030000
741-00000000090000000000000000000000000000006e6574207469746c65000000
742-1c00a90101005000f30300000000000000000000000000000000000000000000
743-0108aa0103000000ef0300000000000009000000000000000000000000000000
744-6e6574207469746c650000001c00aa0101005000f30300000000000000000000
745-0000000000000000000000000108ab0103000000ef0300000000000009000000
746-0000000000000000000000006e6574207469746c650000001c00ab0101005000
747-f303000000000000000000000000000000000000000000000108ac0103000000
748-ef03000000000000090000000000000000000000000000006e6574207469746c
749-650000001c00ac0101005000f303000000000000000000000000000000000000
750-000000000108ad0103000000ef03000000000000090000000000000000000000
751-000000006e6574207469746c650000001c00ad0101005000f303000000000000
752-000000000000000000000000000000000108ae0103000000ef03000000000000
753-090000000000000000000000000000006e6574207469746c650000001c00ae01
754-01005000f303000000000000000000000000000000000000000000000108af01
755-03000000ef03000000000000090000000000000000000000000000006e657420
756-7469746c650000001c00af0101005000f3030000000000000000000000000000
757-00000000000000000108b00103000000ef030000000000000900000000000000
758-00000000000000006e6574207469746c650000001c00b00101005000f3030000
759-00000000000000000000000000000000000000000108b10103000000ef030000
760-00000000090000000000000000000000000000006e6574207469746c65000000
761-1c00b10101005000f30300000000000000000000000000000000000000000000
762-0108b20103000000ef0300000000000009000000000000000000000000000000
763-6e6574207469746c650000001c00b20101005000f30300000000000000000000
764-0000000000000000000000000108b30103000000ef0300000000000009000000
765-0000000000000000000000006e6574207469746c650000001c00b30101005000
766-f303000000000000000000000000000000000000000000000108b40103000000
767-ef03000000000000090000000000000000000000000000006e6574207469746c
768-650000001c00b40101005000f303000000000000000000000000000000000000
769-000000000108b50103000000ef03000000000000090000000000000000000000
770-000000006e6574207469746c650000001c00b50101005000f303000000000000
771-000000000000000000000000000000000108b60103000000ef03000000000000
772-090000000000000000000000000000006e6574207469746c650000001c00b601
773-01005000f303000000000000000000000000000000000000000000000108b701
774-03000000ef03000000000000090000000000000000000000000000006e657420
775-7469746c650000001c00b70101005000f3030000000000000000000000000000
776-00000000000000000108b80103000000ef030000000000000900000000000000
777-00000000000000006e6574207469746c650000001c00b80101005000f3030000
778-00000000000000000000000000000000000000000108b90103000000ef030000
779-00000000090000000000000000000000000000006e6574207469746c65000000
780-1c00b90101005000f30300000000000000000000000000000000000000000000
781-0108ba0103000000ef0300000000000009000000000000000000000000000000
782-6e6574207469746c650000001c00ba0101005000f30300000000000000000000
783-0000000000000000000000000108bb0103000000ef0300000000000009000000
784-0000000000000000000000006e6574207469746c650000001c00bb0101005000
785-f303000000000000000000000000000000000000000000000108bc0103000000
786-ef03000000000000090000000000000000000000000000006e6574207469746c
787-650000001c00bc0101005000f303000000000000000000000000000000000000
788-000000000108bd0103000000ef03000000000000090000000000000000000000
789-000000006e6574207469746c650000001c00bd0101005000f303000000000000
790-000000000000000000000000000000000108be0103000000ef03000000000000
791-090000000000000000000000000000006e6574207469746c650000001c00be01
792-01005000f303000000000000000000000000000000000000000000000108bf01
793-03000000ef03000000000000090000000000000000000000000000006e657420
794-7469746c650000001c00bf0101005000f3030000000000000000000000000000
795-00000000000000000108c00103000000ef030000000000000900000000000000
796-00000000000000006e6574207469746c650000001c00c00101005000f3030000
797-00000000000000000000000000000000000000000108c10103000000ef030000
798-00000000090000000000000000000000000000006e6574207469746c65000000
799-1c00c10101005000f30300000000000000000000000000000000000000000000
800-0108c20103000000ef0300000000000009000000000000000000000000000000
801-6e6574207469746c650000001c00c20101005000f30300000000000000000000
802-0000000000000000000000000108c30103000000ef0300000000000009000000
803-0000000000000000000000006e6574207469746c650000001c00c30101005000
804-f303000000000000000000000000000000000000000000000108c40103000000
805-ef03000000000000090000000000000000000000000000006e6574207469746c
806-650000001c00c40101005000f303000000000000000000000000000000000000
807-000000000108c50103000000ef03000000000000090000000000000000000000
808-000000006e6574207469746c650000001c00c50101005000f303000000000000
809-000000000000000000000000000000000108c60103000000ef03000000000000
810-090000000000000000000000000000006e6574207469746c650000001c00c601
811-01005000f303000000000000000000000000000000000000000000000108c701
812-03000000ef03000000000000090000000000000000000000000000006e657420
813-7469746c650000001c00c70101005000f3030000000000000000000000000000
814-00000000000000000108c80103000000ef030000000000000900000000000000
815-00000000000000006e6574207469746c650000001c00c80101005000f3030000
816-00000000000000000000000000000000000000000108c90103000000ef030000
817-00000000090000000000000000000000000000006e6574207469746c65000000
818-1c00c90101005000f30300000000000000000000000000000000000000000000
819-0108ca0103000000ef0300000000000009000000000000000000000000000000
820-6e6574207469746c650000001c00ca0101005000f30300000000000000000000
821-0000000000000000000000000108cb0103000000ef0300000000000009000000
822-0000000000000000000000006e6574207469746c650000001c00cb0101005000
823-f303000000000000000000000000000000000000000000000108cc0103000000
824-ef03000000000000090000000000000000000000000000006e6574207469746c
825-650000001c00cc0101005000f303000000000000000000000000000000000000
826-000000000108cd0103000000ef03000000000000090000000000000000000000
827-000000006e6574207469746c650000001c00cd0101005000f303000000000000
828-000000000000000000000000000000000108ce0103000000ef03000000000000
829-090000000000000000000000000000006e6574207469746c650000001c00ce01
830-01005000f303000000000000000000000000000000000000000000000108cf01
831-03000000ef03000000000000090000000000000000000000000000006e657420
832-7469746c650000001c00cf0101005000f3030000000000000000000000000000
833-00000000000000000108d00103000000ef030000000000000900000000000000
834-00000000000000006e6574207469746c650000001c00d00101005000f3030000
835-00000000000000000000000000000000000000000108d10103000000ef030000
836-00000000090000000000000000000000000000006e6574207469746c65000000
837-1c00d10101005000f30300000000000000000000000000000000000000000000
838-0108d20103000000ef0300000000000009000000000000000000000000000000
839-6e6574207469746c650000001c00d20101005000f30300000000000000000000
840-0000000000000000000000000108d30103000000ef0300000000000009000000
841-0000000000000000000000006e6574207469746c650000001c00d30101005000
842-f303000000000000000000000000000000000000000000000108d40103000000
843-ef03000000000000090000000000000000000000000000006e6574207469746c
844-650000001c00d40101005000f303000000000000000000000000000000000000
845-000000000108d50103000000ef03000000000000090000000000000000000000
846-000000006e6574207469746c650000001c00d50101005000f303000000000000
847-000000000000000000000000000000000108d60103000000ef03000000000000
848-090000000000000000000000000000006e6574207469746c650000001c00d601
849-01005000f303000000000000000000000000000000000000000000000108d701
850-03000000ef03000000000000090000000000000000000000000000006e657420
851-7469746c650000001c00d70101005000f3030000000000000000000000000000
852-00000000000000000108d80103000000ef030000000000000900000000000000
853-00000000000000006e6574207469746c650000001c00d80101005000f3030000
854-00000000000000000000000000000000000000000108d90103000000ef030000
855-00000000090000000000000000000000000000006e6574207469746c65000000
856-1c00d90101005000f30300000000000000000000000000000000000000000000
857-0108da0103000000ef0300000000000009000000000000000000000000000000
858-6e6574207469746c650000001c00da0101005000f30300000000000000000000
859-0000000000000000000000000108db0103000000ef0300000000000009000000
860-0000000000000000000000006e6574207469746c650000001c00db0101005000
861-f303000000000000000000000000000000000000000000000108dc0103000000
862-ef03000000000000090000000000000000000000000000006e6574207469746c
863-650000001c00dc0101005000f303000000000000000000000000000000000000
864-000000000108dd0103000000ef03000000000000090000000000000000000000
865-000000006e6574207469746c650000001c00dd0101005000f303000000000000
866-000000000000000000000000000000000108de0103000000ef03000000000000
867-090000000000000000000000000000006e6574207469746c650000001c00de01
868-01005000f303000000000000000000000000000000000000000000000108df01
869-03000000ef03000000000000090000000000000000000000000000006e657420
870-7469746c650000001c00df0101005000f3030000000000000000000000000000
871-00000000000000000108e00103000000ef030000000000000900000000000000
872-00000000000000006e6574207469746c650000001c00e00101005000f3030000
873-00000000000000000000000000000000000000000108e10103000000ef030000
874-00000000090000000000000000000000000000006e6574207469746c65000000
875-1c00e10101005000f30300000000000000000000000000000000000000000000
876-0108e20103000000ef0300000000000009000000000000000000000000000000
877-6e6574207469746c650000001c00e20101005000f30300000000000000000000
878-0000000000000000000000000108e30103000000ef0300000000000009000000
879-0000000000000000000000006e6574207469746c650000001c00e30101005000
880-f303000000000000000000000000000000000000000000000108e40103000000
881-ef03000000000000090000000000000000000000000000006e6574207469746c
882-650000001c00e40101005000f303000000000000000000000000000000000000
883-000000000108e50103000000ef03000000000000090000000000000000000000
884-000000006e6574207469746c650000001c00e50101005000f303000000000000
885-000000000000000000000000000000000108e60103000000ef03000000000000
886-090000000000000000000000000000006e6574207469746c650000001c00e601
887-01005000f303000000000000000000000000000000000000000000000108e701
888-03000000ef03000000000000090000000000000000000000000000006e657420
889-7469746c650000001c00e70101005000f3030000000000000000000000000000
890-00000000000000000108e80103000000ef030000000000000900000000000000
891-00000000000000006e6574207469746c650000001c00e80101005000f3030000
892-00000000000000000000000000000000000000000108e90103000000ef030000
893-00000000090000000000000000000000000000006e6574207469746c65000000
894-1c00e90101005000f30300000000000000000000000000000000000000000000
895-0108ea0103000000ef0300000000000009000000000000000000000000000000
896-6e6574207469746c650000001c00ea0101005000f30300000000000000000000
897-0000000000000000000000000108eb0103000000ef0300000000000009000000
898-0000000000000000000000006e6574207469746c650000001c00eb0101005000
899-f303000000000000000000000000000000000000000000000108ec0103000000
900-ef03000000000000090000000000000000000000000000006e6574207469746c
901-650000001c00ec0101005000f303000000000000000000000000000000000000
902-000000000108ed0103000000ef03000000000000090000000000000000000000
903-000000006e6574207469746c650000001c00ed0101005000f303000000000000
904-000000000000000000000000000000000108ee0103000000ef03000000000000
905-090000000000000000000000000000006e6574207469746c650000001c00ee01
906-01005000f303000000000000000000000000000000000000000000000108ef01
907-03000000ef03000000000000090000000000000000000000000000006e657420
908-7469746c650000001c00ef0101005000f3030000000000000000000000000000
909-00000000000000000108f00103000000ef030000000000000900000000000000
910-00000000000000006e6574207469746c650000001c00f00101005000f3030000
911-00000000000000000000000000000000000000000108f10103000000ef030000
912-00000000090000000000000000000000000000006e6574207469746c65000000
913-1c00f10101005000f30300000000000000000000000000000000000000000000
914-0108f20103000000ef0300000000000009000000000000000000000000000000
915-6e6574207469746c650000001c00f20101005000f30300000000000000000000
916-0000000000000000000000000108f30103000000ef0300000000000009000000
917-0000000000000000000000006e6574207469746c650000001c00f30101005000
918-f303000000000000000000000000000000000000000000000108f40103000000
919-ef03000000000000090000000000000000000000000000006e6574207469746c
920-650000001c00f40101005000f303000000000000000000000000000000000000
921-000000000108f50103000000ef03000000000000090000000000000000000000
922-000000006e6574207469746c650000001c00f50101005000f303000000000000
923-000000000000000000000000000000000108f60103000000ef03000000000000
924-090000000000000000000000000000006e6574207469746c650000001c00f601
925-01005000f303000000000000000000000000000000000000000000000108f701
926-03000000ef03000000000000090000000000000000000000000000006e657420
927-7469746c650000001c00f70101005000f3030000000000000000000000000000
928-00000000000000000108f80103000000ef030000000000000900000000000000
929-00000000000000006e6574207469746c650000001c00f80101005000f3030000
930-00000000000000000000000000000000000000000108f90103000000ef030000
931-00000000090000000000000000000000000000006e6574207469746c65000000
932-1c00f90101005000f30300000000000000000000000000000000000000000000
933-0108fa0103000000ef0300000000000009000000000000000000000000000000
934-6e6574207469746c650000001c00fa0101005000f30300000000000000000000
935-0000000000000000000000000108fb0103000000ef0300000000000009000000
936-0000000000000000000000006e6574207469746c650000001c00fb0101005000
937-f303000000000000000000000000000000000000000000000108fc0103000000
938-ef03000000000000090000000000000000000000000000006e6574207469746c
939-650000001c00fc0101005000f303000000000000000000000000000000000000
940-000000000108fd0103000000ef03000000000000090000000000000000000000
941-000000006e6574207469746c650000001c00fd0101005000f303000000000000
942-000000000000000000000000000000000108fe0103000000ef03000000000000
943-090000000000000000000000000000006e6574207469746c650000001c00fe01
944-01005000f303000000000000000000000000000000000000000000000108ff01
945-03000000ef03000000000000090000000000000000000000000000006e657420
946-7469746c650000001c00ff0101005000f3030000000000000000000000000000
947-00000000000000000108000203000000ef030000000000000900000000000000
948-00000000000000006e6574207469746c650000001c00000201005000f3030000
949-00000000000000000000000000000000000000000108010203000000ef030000
1+1c00740001005000f30300000000000000000000000000000000000000000000
2+0108750003000000ef0300000000000009000000000000000000000000000000
3+6e6574207469746c650000001c00750001005000f30300000000000000000000
4+0000000000000000000000000108760003000000ef0300000000000009000000
5+0000000000000000000000006e6574207469746c650000001c00760001005000
6+f303000000000000000000000000000000000000000000000108770003000000
7+ef03000000000000090000000000000000000000000000006e6574207469746c
8+650000001c00770001005000f303000000000000000000000000000000000000
9+000000000108780003000000ef03000000000000090000000000000000000000
10+000000006e6574207469746c650000001c00780001005000f303000000000000
11+000000000000000000000000000000000108790003000000ef03000000000000
12+090000000000000000000000000000006e6574207469746c650000001c007900
13+01005000f3030000000000000000000000000000000000000000000001087a00
14+03000000ef03000000000000090000000000000000000000000000006e657420
15+7469746c650000001c007a0001005000f3030000000000000000000000000000
16+000000000000000001087b0003000000ef030000000000000900000000000000
17+00000000000000006e6574207469746c650000001c007b0001005000f3030000
18+000000000000000000000000000000000000000001087c0003000000ef030000
19+00000000090000000000000000000000000000006e6574207469746c65000000
20+1c007c0001005000f30300000000000000000000000000000000000000000000
21+01087d0003000000ef0300000000000009000000000000000000000000000000
22+6e6574207469746c650000001c007d0001005000f30300000000000000000000
23+00000000000000000000000001087e0003000000ef0300000000000009000000
24+0000000000000000000000006e6574207469746c650000001c007e0001005000
25+f3030000000000000000000000000000000000000000000001087f0003000000
26+ef03000000000000090000000000000000000000000000006e6574207469746c
27+650000001c007f0001005000f303000000000000000000000000000000000000
28+000000000108800003000000ef03000000000000090000000000000000000000
29+000000006e6574207469746c650000001c00800001005000f303000000000000
30+000000000000000000000000000000000108810003000000ef03000000000000
31+090000000000000000000000000000006e6574207469746c650000001c008100
32+01005000f3030000000000000000000000000000000000000000000001088200
33+03000000ef03000000000000090000000000000000000000000000006e657420
34+7469746c650000001c00820001005000f3030000000000000000000000000000
35+00000000000000000108830003000000ef030000000000000900000000000000
36+00000000000000006e6574207469746c650000001c00830001005000f3030000
37+00000000000000000000000000000000000000000108840003000000ef030000
38+00000000090000000000000000000000000000006e6574207469746c65000000
39+1c00840001005000f30300000000000000000000000000000000000000000000
40+0108850003000000ef0300000000000009000000000000000000000000000000
41+6e6574207469746c650000001c00850001005000f30300000000000000000000
42+0000000000000000000000000108860003000000ef0300000000000009000000
43+0000000000000000000000006e6574207469746c650000001c00860001005000
44+f303000000000000000000000000000000000000000000000108870003000000
45+ef03000000000000090000000000000000000000000000006e6574207469746c
46+650000001c00870001005000f303000000000000000000000000000000000000
47+000000000108880003000000ef03000000000000090000000000000000000000
48+000000006e6574207469746c650000001c00880001005000f303000000000000
49+000000000000000000000000000000000108890003000000ef03000000000000
50+090000000000000000000000000000006e6574207469746c650000001c008900
51+01005000f3030000000000000000000000000000000000000000000001088a00
52+03000000ef03000000000000090000000000000000000000000000006e657420
53+7469746c650000001c008a0001005000f3030000000000000000000000000000
54+000000000000000001088b0003000000ef030000000000000900000000000000
55+00000000000000006e6574207469746c650000001c008b0001005000f3030000
56+000000000000000000000000000000000000000001088c0003000000ef030000
57+00000000090000000000000000000000000000006e6574207469746c65000000
58+1c008c0001005000f30300000000000000000000000000000000000000000000
59+01088d0003000000ef0300000000000009000000000000000000000000000000
60+6e6574207469746c650000001c008d0001005000f30300000000000000000000
61+00000000000000000000000001088e0003000000ef0300000000000009000000
62+0000000000000000000000006e6574207469746c650000001c008e0001005000
63+f3030000000000000000000000000000000000000000000001088f0003000000
64+ef03000000000000090000000000000000000000000000006e6574207469746c
65+650000001c008f0001005000f303000000000000000000000000000000000000
66+000000000108900003000000ef03000000000000090000000000000000000000
67+000000006e6574207469746c650000001c00900001005000f303000000000000
68+000000000000000000000000000000000108910003000000ef03000000000000
69+090000000000000000000000000000006e6574207469746c650000001c009100
70+01005000f3030000000000000000000000000000000000000000000001089200
71+03000000ef03000000000000090000000000000000000000000000006e657420
72+7469746c650000001c00920001005000f3030000000000000000000000000000
73+00000000000000000108930003000000ef030000000000000900000000000000
74+00000000000000006e6574207469746c650000001c00930001005000f3030000
75+00000000000000000000000000000000000000000108940003000000ef030000
76+00000000090000000000000000000000000000006e6574207469746c65000000
77+1c00940001005000f30300000000000000000000000000000000000000000000
78+0108950003000000ef0300000000000009000000000000000000000000000000
79+6e6574207469746c650000001c00950001005000f30300000000000000000000
80+0000000000000000000000000108960003000000ef0300000000000009000000
81+0000000000000000000000006e6574207469746c650000001c00960001005000
82+f303000000000000000000000000000000000000000000000108970003000000
83+ef03000000000000090000000000000000000000000000006e6574207469746c
84+650000001c00970001005000f303000000000000000000000000000000000000
85+000000000108980003000000ef03000000000000090000000000000000000000
86+000000006e6574207469746c650000001c00980001005000f303000000000000
87+000000000000000000000000000000000108990003000000ef03000000000000
88+090000000000000000000000000000006e6574207469746c650000001c009900
89+01005000f3030000000000000000000000000000000000000000000001089a00
90+03000000ef03000000000000090000000000000000000000000000006e657420
91+7469746c650000001c009a0001005000f3030000000000000000000000000000
92+000000000000000001089b0003000000ef030000000000000900000000000000
93+00000000000000006e6574207469746c650000001c009b0001005000f3030000
94+000000000000000000000000000000000000000001089c0003000000ef030000
95+00000000090000000000000000000000000000006e6574207469746c65000000
96+1c009c0001005000f30300000000000000000000000000000000000000000000
97+01089d0003000000ef0300000000000009000000000000000000000000000000
98+6e6574207469746c650000001c009d0001005000f30300000000000000000000
99+00000000000000000000000001089e0003000000ef0300000000000009000000
100+0000000000000000000000006e6574207469746c650000001c009e0001005000
101+f3030000000000000000000000000000000000000000000001089f0003000000
102+ef03000000000000090000000000000000000000000000006e6574207469746c
103+650000001c009f0001005000f303000000000000000000000000000000000000
104+000000000108a00003000000ef03000000000000090000000000000000000000
105+000000006e6574207469746c650000001c00a00001005000f303000000000000
106+000000000000000000000000000000000108a10003000000ef03000000000000
107+090000000000000000000000000000006e6574207469746c650000001c00a100
108+01005000f303000000000000000000000000000000000000000000000108a200
109+03000000ef03000000000000090000000000000000000000000000006e657420
110+7469746c650000001c00a20001005000f3030000000000000000000000000000
111+00000000000000000108a30003000000ef030000000000000900000000000000
112+00000000000000006e6574207469746c650000001c00a30001005000f3030000
113+00000000000000000000000000000000000000000108a40003000000ef030000
114+00000000090000000000000000000000000000006e6574207469746c65000000
115+1c00a40001005000f30300000000000000000000000000000000000000000000
116+0108a50003000000ef0300000000000009000000000000000000000000000000
117+6e6574207469746c650000001c00a50001005000f30300000000000000000000
118+0000000000000000000000000108a60003000000ef0300000000000009000000
119+0000000000000000000000006e6574207469746c650000001c00a60001005000
120+f303000000000000000000000000000000000000000000000108a70003000000
121+ef03000000000000090000000000000000000000000000006e6574207469746c
122+650000001c00a70001005000f303000000000000000000000000000000000000
123+000000000108a80003000000ef03000000000000090000000000000000000000
124+000000006e6574207469746c650000001c00a80001005000f303000000000000
125+000000000000000000000000000000000108a90003000000ef03000000000000
126+090000000000000000000000000000006e6574207469746c650000001c00a900
127+01005000f303000000000000000000000000000000000000000000000108aa00
128+03000000ef03000000000000090000000000000000000000000000006e657420
129+7469746c650000001c00aa0001005000f3030000000000000000000000000000
130+00000000000000000108ab0003000000ef030000000000000900000000000000
131+00000000000000006e6574207469746c650000001c00ab0001005000f3030000
132+00000000000000000000000000000000000000000108ac0003000000ef030000
133+00000000090000000000000000000000000000006e6574207469746c65000000
134+1c00ac0001005000f30300000000000000000000000000000000000000000000
135+0108ad0003000000ef0300000000000009000000000000000000000000000000
136+6e6574207469746c650000001c00ad0001005000f30300000000000000000000
137+0000000000000000000000000108ae0003000000ef0300000000000009000000
138+0000000000000000000000006e6574207469746c650000001c00ae0001005000
139+f303000000000000000000000000000000000000000000000108af0003000000
140+ef03000000000000090000000000000000000000000000006e6574207469746c
141+650000001c00af0001005000f303000000000000000000000000000000000000
142+000000000108b00003000000ef03000000000000090000000000000000000000
143+000000006e6574207469746c650000001c00b00001005000f303000000000000
144+000000000000000000000000000000000108b10003000000ef03000000000000
145+090000000000000000000000000000006e6574207469746c650000001c00b100
146+01005000f303000000000000000000000000000000000000000000000108b200
147+03000000ef03000000000000090000000000000000000000000000006e657420
148+7469746c650000001c00b20001005000f3030000000000000000000000000000
149+00000000000000000108b30003000000ef030000000000000900000000000000
150+00000000000000006e6574207469746c650000001c00b30001005000f3030000
151+00000000000000000000000000000000000000000108b40003000000ef030000
152+00000000090000000000000000000000000000006e6574207469746c65000000
153+1c00b40001005000f30300000000000000000000000000000000000000000000
154+0108b50003000000ef0300000000000009000000000000000000000000000000
155+6e6574207469746c650000001c00b50001005000f30300000000000000000000
156+0000000000000000000000000108b60003000000ef0300000000000009000000
157+0000000000000000000000006e6574207469746c650000001c00b60001005000
158+f303000000000000000000000000000000000000000000000108b70003000000
159+ef03000000000000090000000000000000000000000000006e6574207469746c
160+650000001c00b70001005000f303000000000000000000000000000000000000
161+000000000108b80003000000ef03000000000000090000000000000000000000
162+000000006e6574207469746c650000001c00b80001005000f303000000000000
163+000000000000000000000000000000000108b90003000000ef03000000000000
164+090000000000000000000000000000006e6574207469746c650000001c00b900
165+01005000f303000000000000000000000000000000000000000000000108ba00
166+03000000ef03000000000000090000000000000000000000000000006e657420
167+7469746c650000001c00ba0001005000f3030000000000000000000000000000
168+00000000000000000108bb0003000000ef030000000000000900000000000000
169+00000000000000006e6574207469746c650000001c00bb0001005000f3030000
170+00000000000000000000000000000000000000000108bc0003000000ef030000
171+00000000090000000000000000000000000000006e6574207469746c65000000
172+1c00bc0001005000f30300000000000000000000000000000000000000000000
173+0108bd0003000000ef0300000000000009000000000000000000000000000000
174+6e6574207469746c650000001c00bd0001005000f30300000000000000000000
175+0000000000000000000000000108be0003000000ef0300000000000009000000
176+0000000000000000000000006e6574207469746c650000001c00be0001005000
177+f303000000000000000000000000000000000000000000000108bf0003000000
178+ef03000000000000090000000000000000000000000000006e6574207469746c
179+650000001c00bf0001005000f303000000000000000000000000000000000000
180+000000000108c00003000000ef03000000000000090000000000000000000000
181+000000006e6574207469746c650000001c00c00001005000f303000000000000
182+000000000000000000000000000000000108c10003000000ef03000000000000
183+090000000000000000000000000000006e6574207469746c650000001c00c100
184+01005000f303000000000000000000000000000000000000000000000108c200
185+03000000ef03000000000000090000000000000000000000000000006e657420
186+7469746c650000001c00c20001005000f3030000000000000000000000000000
187+00000000000000000108c30003000000ef030000000000000900000000000000
188+00000000000000006e6574207469746c650000001c00c30001005000f3030000
189+00000000000000000000000000000000000000000108c40003000000ef030000
190+00000000090000000000000000000000000000006e6574207469746c65000000
191+1c00c40001005000f30300000000000000000000000000000000000000000000
192+0108c50003000000ef0300000000000009000000000000000000000000000000
193+6e6574207469746c650000001c00c50001005000f30300000000000000000000
194+0000000000000000000000000108c60003000000ef0300000000000009000000
195+0000000000000000000000006e6574207469746c650000001c00c60001005000
196+f303000000000000000000000000000000000000000000000108c70003000000
197+ef03000000000000090000000000000000000000000000006e6574207469746c
198+650000001c00c70001005000f303000000000000000000000000000000000000
199+000000000108c80003000000ef03000000000000090000000000000000000000
200+000000006e6574207469746c650000001c00c80001005000f303000000000000
201+000000000000000000000000000000000108c90003000000ef03000000000000
202+090000000000000000000000000000006e6574207469746c650000001c00c900
203+01005000f303000000000000000000000000000000000000000000000108ca00
204+03000000ef03000000000000090000000000000000000000000000006e657420
205+7469746c650000001c00ca0001005000f3030000000000000000000000000000
206+00000000000000000108cb0003000000ef030000000000000900000000000000
207+00000000000000006e6574207469746c650000001c00cb0001005000f3030000
208+00000000000000000000000000000000000000000108cc0003000000ef030000
209+00000000090000000000000000000000000000006e6574207469746c65000000
210+1c00cc0001005000f30300000000000000000000000000000000000000000000
211+0108cd0003000000ef0300000000000009000000000000000000000000000000
212+6e6574207469746c650000001c00cd0001005000f30300000000000000000000
213+0000000000000000000000000108ce0003000000ef0300000000000009000000
214+0000000000000000000000006e6574207469746c650000001c00ce0001005000
215+f303000000000000000000000000000000000000000000000108cf0003000000
216+ef03000000000000090000000000000000000000000000006e6574207469746c
217+650000001c00cf0001005000f303000000000000000000000000000000000000
218+000000000108d00003000000ef03000000000000090000000000000000000000
219+000000006e6574207469746c650000001c00d00001005000f303000000000000
220+000000000000000000000000000000000108d10003000000ef03000000000000
221+090000000000000000000000000000006e6574207469746c650000001c00d100
222+01005000f303000000000000000000000000000000000000000000000108d200
223+03000000ef03000000000000090000000000000000000000000000006e657420
224+7469746c650000001c00d20001005000f3030000000000000000000000000000
225+00000000000000000108d30003000000ef030000000000000900000000000000
226+00000000000000006e6574207469746c650000001c00d30001005000f3030000
227+00000000000000000000000000000000000000000108d40003000000ef030000
228+00000000090000000000000000000000000000006e6574207469746c65000000
229+1c00d40001005000f30300000000000000000000000000000000000000000000
230+0108d50003000000ef0300000000000009000000000000000000000000000000
231+6e6574207469746c650000001c00d50001005000f30300000000000000000000
232+0000000000000000000000000108d60003000000ef0300000000000009000000
233+0000000000000000000000006e6574207469746c650000001c00d60001005000
234+f303000000000000000000000000000000000000000000000108d70003000000
235+ef03000000000000090000000000000000000000000000006e6574207469746c
236+650000001c00d70001005000f303000000000000000000000000000000000000
237+000000000108d80003000000ef03000000000000090000000000000000000000
238+000000006e6574207469746c650000001c00d80001005000f303000000000000
239+000000000000000000000000000000000108d90003000000ef03000000000000
240+090000000000000000000000000000006e6574207469746c650000001c00d900
241+01005000f303000000000000000000000000000000000000000000000108da00
242+03000000ef03000000000000090000000000000000000000000000006e657420
243+7469746c650000001c00da0001005000f3030000000000000000000000000000
244+00000000000000000108db0003000000ef030000000000000900000000000000
245+00000000000000006e6574207469746c650000001c00db0001005000f3030000
246+00000000000000000000000000000000000000000108dc0003000000ef030000
247+00000000090000000000000000000000000000006e6574207469746c65000000
248+1c00dc0001005000f30300000000000000000000000000000000000000000000
249+0108dd0003000000ef0300000000000009000000000000000000000000000000
250+6e6574207469746c650000001c00dd0001005000f30300000000000000000000
251+0000000000000000000000000108de0003000000ef0300000000000009000000
252+0000000000000000000000006e6574207469746c650000001c00de0001005000
253+f303000000000000000000000000000000000000000000000108df0003000000
254+ef03000000000000090000000000000000000000000000006e6574207469746c
255+650000001c00df0001005000f303000000000000000000000000000000000000
256+000000000108e00003000000ef03000000000000090000000000000000000000
257+000000006e6574207469746c650000001c00e00001005000f303000000000000
258+000000000000000000000000000000000108e10003000000ef03000000000000
259+090000000000000000000000000000006e6574207469746c650000001c00e100
260+01005000f303000000000000000000000000000000000000000000000108e200
261+03000000ef03000000000000090000000000000000000000000000006e657420
262+7469746c650000001c00e20001005000f3030000000000000000000000000000
263+00000000000000000108e30003000000ef030000000000000900000000000000
264+00000000000000006e6574207469746c650000001c00e30001005000f3030000
265+00000000000000000000000000000000000000000108e40003000000ef030000
266+00000000090000000000000000000000000000006e6574207469746c65000000
267+1c00e40001005000f30300000000000000000000000000000000000000000000
268+0108e50003000000ef0300000000000009000000000000000000000000000000
269+6e6574207469746c650000001c00e50001005000f30300000000000000000000
270+0000000000000000000000000108e60003000000ef0300000000000009000000
271+0000000000000000000000006e6574207469746c650000001c00e60001005000
272+f303000000000000000000000000000000000000000000000108e70003000000
273+ef03000000000000090000000000000000000000000000006e6574207469746c
274+650000001c00e70001005000f303000000000000000000000000000000000000
275+000000000108e80003000000ef03000000000000090000000000000000000000
276+000000006e6574207469746c650000001c00e80001005000f303000000000000
277+000000000000000000000000000000000108e90003000000ef03000000000000
278+090000000000000000000000000000006e6574207469746c650000001c00e900
279+01005000f303000000000000000000000000000000000000000000000108ea00
280+03000000ef03000000000000090000000000000000000000000000006e657420
281+7469746c650000001c00ea0001005000f3030000000000000000000000000000
282+00000000000000000108eb0003000000ef030000000000000900000000000000
283+00000000000000006e6574207469746c650000001c00eb0001005000f3030000
284+00000000000000000000000000000000000000000108ec0003000000ef030000
285+00000000090000000000000000000000000000006e6574207469746c65000000
286+1c00ec0001005000f30300000000000000000000000000000000000000000000
287+0108ed0003000000ef0300000000000009000000000000000000000000000000
288+6e6574207469746c650000001c00ed0001005000f30300000000000000000000
289+0000000000000000000000000108ee0003000000ef0300000000000009000000
290+0000000000000000000000006e6574207469746c650000001c00ee0001005000
291+f303000000000000000000000000000000000000000000000108ef0003000000
292+ef03000000000000090000000000000000000000000000006e6574207469746c
293+650000001c00ef0001005000f303000000000000000000000000000000000000
294+000000000108f00003000000ef03000000000000090000000000000000000000
295+000000006e6574207469746c650000001c00f00001005000f303000000000000
296+000000000000000000000000000000000108f10003000000ef03000000000000
297+090000000000000000000000000000006e6574207469746c650000001c00f100
298+01005000f303000000000000000000000000000000000000000000000108f200
299+03000000ef03000000000000090000000000000000000000000000006e657420
300+7469746c650000001c00f20001005000f3030000000000000000000000000000
301+00000000000000000108f30003000000ef030000000000000900000000000000
302+00000000000000006e6574207469746c650000001c00f30001005000f3030000
303+00000000000000000000000000000000000000000108f40003000000ef030000
304+00000000090000000000000000000000000000006e6574207469746c65000000
305+1c00f40001005000f30300000000000000000000000000000000000000000000
306+0108f50003000000ef0300000000000009000000000000000000000000000000
307+6e6574207469746c650000001c00f50001005000f30300000000000000000000
308+0000000000000000000000000108f60003000000ef0300000000000009000000
309+0000000000000000000000006e6574207469746c650000001c00f60001005000
310+f303000000000000000000000000000000000000000000000108f70003000000
311+ef03000000000000090000000000000000000000000000006e6574207469746c
312+650000001c00f70001005000f303000000000000000000000000000000000000
313+000000000108f80003000000ef03000000000000090000000000000000000000
314+000000006e6574207469746c650000001c00f80001005000f303000000000000
315+000000000000000000000000000000000108f90003000000ef03000000000000
316+090000000000000000000000000000006e6574207469746c650000001c00f900
317+01005000f303000000000000000000000000000000000000000000000108fa00
318+03000000ef03000000000000090000000000000000000000000000006e657420
319+7469746c650000001c00fa0001005000f3030000000000000000000000000000
320+00000000000000000108fb0003000000ef030000000000000900000000000000
321+00000000000000006e6574207469746c650000001c00fb0001005000f3030000
322+00000000000000000000000000000000000000000108fc0003000000ef030000
323+00000000090000000000000000000000000000006e6574207469746c65000000
324+1c00fc0001005000f30300000000000000000000000000000000000000000000
325+0108fd0003000000ef0300000000000009000000000000000000000000000000
326+6e6574207469746c650000001c00fd0001005000f30300000000000000000000
327+0000000000000000000000000108fe0003000000ef0300000000000009000000
328+0000000000000000000000006e6574207469746c650000001c00fe0001005000
329+f303000000000000000000000000000000000000000000000108ff0003000000
330+ef03000000000000090000000000000000000000000000006e6574207469746c
331+650000001c00ff0001005000f303000000000000000000000000000000000000
332+000000000108000103000000ef03000000000000090000000000000000000000
333+000000006e6574207469746c650000001c00000101005000f303000000000000
334+000000000000000000000000000000000108010103000000ef03000000000000
335+090000000000000000000000000000006e6574207469746c650000001c000101
336+01005000f3030000000000000000000000000000000000000000000001080201
337+03000000ef03000000000000090000000000000000000000000000006e657420
338+7469746c650000001c00020101005000f3030000000000000000000000000000
339+00000000000000000108030103000000ef030000000000000900000000000000
340+00000000000000006e6574207469746c650000001c00030101005000f3030000
341+00000000000000000000000000000000000000000108040103000000ef030000
342+00000000090000000000000000000000000000006e6574207469746c65000000
343+1c00040101005000f30300000000000000000000000000000000000000000000
344+0108050103000000ef0300000000000009000000000000000000000000000000
345+6e6574207469746c650000001c00050101005000f30300000000000000000000
346+0000000000000000000000000108060103000000ef0300000000000009000000
347+0000000000000000000000006e6574207469746c650000001c00060101005000
348+f303000000000000000000000000000000000000000000000108070103000000
349+ef03000000000000090000000000000000000000000000006e6574207469746c
350+650000001c00070101005000f303000000000000000000000000000000000000
351+000000000108080103000000ef03000000000000090000000000000000000000
352+000000006e6574207469746c650000001c00080101005000f303000000000000
353+000000000000000000000000000000000108090103000000ef03000000000000
354+090000000000000000000000000000006e6574207469746c650000001c000901
355+01005000f3030000000000000000000000000000000000000000000001080a01
356+03000000ef03000000000000090000000000000000000000000000006e657420
357+7469746c650000001c000a0101005000f3030000000000000000000000000000
358+000000000000000001080b0103000000ef030000000000000900000000000000
359+00000000000000006e6574207469746c650000001c000b0101005000f3030000
360+000000000000000000000000000000000000000001080c0103000000ef030000
361+00000000090000000000000000000000000000006e6574207469746c65000000
362+1c000c0101005000f30300000000000000000000000000000000000000000000
363+01080d0103000000ef0300000000000009000000000000000000000000000000
364+6e6574207469746c650000001c000d0101005000f30300000000000000000000
365+00000000000000000000000001080e0103000000ef0300000000000009000000
366+0000000000000000000000006e6574207469746c650000001c000e0101005000
367+f3030000000000000000000000000000000000000000000001080f0103000000
368+ef03000000000000090000000000000000000000000000006e6574207469746c
369+650000001c000f0101005000f303000000000000000000000000000000000000
370+000000000108100103000000ef03000000000000090000000000000000000000
371+000000006e6574207469746c650000001c00100101005000f303000000000000
372+000000000000000000000000000000000108110103000000ef03000000000000
373+090000000000000000000000000000006e6574207469746c650000001c001101
374+01005000f3030000000000000000000000000000000000000000000001081201
375+03000000ef03000000000000090000000000000000000000000000006e657420
376+7469746c650000001c00120101005000f3030000000000000000000000000000
377+00000000000000000108130103000000ef030000000000000900000000000000
378+00000000000000006e6574207469746c650000001c00130101005000f3030000
379+00000000000000000000000000000000000000000108140103000000ef030000
380+00000000090000000000000000000000000000006e6574207469746c65000000
381+1c00140101005000f30300000000000000000000000000000000000000000000
382+0108150103000000ef0300000000000009000000000000000000000000000000
383+6e6574207469746c650000001c00150101005000f30300000000000000000000
384+0000000000000000000000000108160103000000ef0300000000000009000000
385+0000000000000000000000006e6574207469746c650000001c00160101005000
386+f303000000000000000000000000000000000000000000000108170103000000
387+ef03000000000000090000000000000000000000000000006e6574207469746c
388+650000001c00170101005000f303000000000000000000000000000000000000
389+000000000108180103000000ef03000000000000090000000000000000000000
390+000000006e6574207469746c650000001c00180101005000f303000000000000
391+000000000000000000000000000000000108190103000000ef03000000000000
392+090000000000000000000000000000006e6574207469746c650000001c001901
393+01005000f3030000000000000000000000000000000000000000000001081a01
394+03000000ef03000000000000090000000000000000000000000000006e657420
395+7469746c650000001c001a0101005000f3030000000000000000000000000000
396+000000000000000001081b0103000000ef030000000000000900000000000000
397+00000000000000006e6574207469746c650000001c001b0101005000f3030000
398+000000000000000000000000000000000000000001081c0103000000ef030000
399+00000000090000000000000000000000000000006e6574207469746c65000000
400+1c001c0101005000f30300000000000000000000000000000000000000000000
401+01081d0103000000ef0300000000000009000000000000000000000000000000
402+6e6574207469746c650000001c001d0101005000f30300000000000000000000
403+00000000000000000000000001081e0103000000ef0300000000000009000000
404+0000000000000000000000006e6574207469746c650000001c001e0101005000
405+f3030000000000000000000000000000000000000000000001081f0103000000
406+ef03000000000000090000000000000000000000000000006e6574207469746c
407+650000001c001f0101005000f303000000000000000000000000000000000000
408+000000000108200103000000ef03000000000000090000000000000000000000
409+000000006e6574207469746c650000001c00200101005000f303000000000000
410+000000000000000000000000000000000108210103000000ef03000000000000
411+090000000000000000000000000000006e6574207469746c650000001c002101
412+01005000f3030000000000000000000000000000000000000000000001082201
413+03000000ef03000000000000090000000000000000000000000000006e657420
414+7469746c650000001c00220101005000f3030000000000000000000000000000
415+00000000000000000108230103000000ef030000000000000900000000000000
416+00000000000000006e6574207469746c650000001c00230101005000f3030000
417+00000000000000000000000000000000000000000108240103000000ef030000
418+00000000090000000000000000000000000000006e6574207469746c65000000
419+1c00240101005000f30300000000000000000000000000000000000000000000
420+0108250103000000ef0300000000000009000000000000000000000000000000
421+6e6574207469746c650000001c00250101005000f30300000000000000000000
422+0000000000000000000000000108260103000000ef0300000000000009000000
423+0000000000000000000000006e6574207469746c650000001c00260101005000
424+f303000000000000000000000000000000000000000000000108270103000000
425+ef03000000000000090000000000000000000000000000006e6574207469746c
426+650000001c00270101005000f303000000000000000000000000000000000000
427+000000000108280103000000ef03000000000000090000000000000000000000
428+000000006e6574207469746c650000001c00280101005000f303000000000000
429+000000000000000000000000000000000108290103000000ef03000000000000
430+090000000000000000000000000000006e6574207469746c650000001c002901
431+01005000f3030000000000000000000000000000000000000000000001082a01
432+03000000ef03000000000000090000000000000000000000000000006e657420
433+7469746c650000001c002a0101005000f3030000000000000000000000000000
434+000000000000000001082b0103000000ef030000000000000900000000000000
435+00000000000000006e6574207469746c650000001c002b0101005000f3030000
436+000000000000000000000000000000000000000001082c0103000000ef030000
437+00000000090000000000000000000000000000006e6574207469746c65000000
438+1c002c0101005000f30300000000000000000000000000000000000000000000
439+01082d0103000000ef0300000000000009000000000000000000000000000000
440+6e6574207469746c650000001c002d0101005000f30300000000000000000000
441+00000000000000000000000001082e0103000000ef0300000000000009000000
442+0000000000000000000000006e6574207469746c650000001c002e0101005000
443+f3030000000000000000000000000000000000000000000001082f0103000000
444+ef03000000000000090000000000000000000000000000006e6574207469746c
445+650000001c002f0101005000f303000000000000000000000000000000000000
446+000000000108300103000000ef03000000000000090000000000000000000000
447+000000006e6574207469746c650000001c00300101005000f303000000000000
448+000000000000000000000000000000000108310103000000ef03000000000000
449+090000000000000000000000000000006e6574207469746c650000001c003101
450+01005000f3030000000000000000000000000000000000000000000001083201
451+03000000ef03000000000000090000000000000000000000000000006e657420
452+7469746c650000001c00320101005000f3030000000000000000000000000000
453+00000000000000000108330103000000ef030000000000000900000000000000
454+00000000000000006e6574207469746c650000001c00330101005000f3030000
455+00000000000000000000000000000000000000000108340103000000ef030000
456+00000000090000000000000000000000000000006e6574207469746c65000000
457+1c00340101005000f30300000000000000000000000000000000000000000000
458+0108350103000000ef0300000000000009000000000000000000000000000000
459+6e6574207469746c650000001c00350101005000f30300000000000000000000
460+0000000000000000000000000108360103000000ef0300000000000009000000
461+0000000000000000000000006e6574207469746c650000001c00360101005000
462+f303000000000000000000000000000000000000000000000108370103000000
463+ef03000000000000090000000000000000000000000000006e6574207469746c
464+650000001c00370101005000f303000000000000000000000000000000000000
465+000000000108380103000000ef03000000000000090000000000000000000000
466+000000006e6574207469746c650000001c00380101005000f303000000000000
467+000000000000000000000000000000000108390103000000ef03000000000000
468+090000000000000000000000000000006e6574207469746c650000001c003901
469+01005000f3030000000000000000000000000000000000000000000001083a01
470+03000000ef03000000000000090000000000000000000000000000006e657420
471+7469746c650000001c003a0101005000f3030000000000000000000000000000
472+000000000000000001083b0103000000ef030000000000000900000000000000
473+00000000000000006e6574207469746c650000001c003b0101005000f3030000
474+000000000000000000000000000000000000000001083c0103000000ef030000
475+00000000090000000000000000000000000000006e6574207469746c65000000
476+1c003c0101005000f30300000000000000000000000000000000000000000000
477+01083d0103000000ef0300000000000009000000000000000000000000000000
478+6e6574207469746c650000001c003d0101005000f30300000000000000000000
479+00000000000000000000000001083e0103000000ef0300000000000009000000
480+0000000000000000000000006e6574207469746c650000001c003e0101005000
481+f3030000000000000000000000000000000000000000000001083f0103000000
482+ef03000000000000090000000000000000000000000000006e6574207469746c
483+650000001c003f0101005000f303000000000000000000000000000000000000
484+000000000108400103000000ef03000000000000090000000000000000000000
485+000000006e6574207469746c650000001c00400101005000f303000000000000
486+000000000000000000000000000000000108410103000000ef03000000000000
487+090000000000000000000000000000006e6574207469746c650000001c004101
488+01005000f3030000000000000000000000000000000000000000000001084201
489+03000000ef03000000000000090000000000000000000000000000006e657420
490+7469746c650000001c00420101005000f3030000000000000000000000000000
491+00000000000000000108430103000000ef030000000000000900000000000000
492+00000000000000006e6574207469746c650000001c00430101005000f3030000
493+00000000000000000000000000000000000000000108440103000000ef030000
494+00000000090000000000000000000000000000006e6574207469746c65000000
495+1c00440101005000f30300000000000000000000000000000000000000000000
496+0108450103000000ef0300000000000009000000000000000000000000000000
497+6e6574207469746c650000001c00450101005000f30300000000000000000000
498+0000000000000000000000000108460103000000ef0300000000000009000000
499+0000000000000000000000006e6574207469746c650000001c00460101005000
500+f303000000000000000000000000000000000000000000000108470103000000
501+ef03000000000000090000000000000000000000000000006e6574207469746c
502+650000001c00470101005000f303000000000000000000000000000000000000
503+000000000108480103000000ef03000000000000090000000000000000000000
504+000000006e6574207469746c650000001c00480101005000f303000000000000
505+000000000000000000000000000000000108490103000000ef03000000000000
506+090000000000000000000000000000006e6574207469746c650000001c004901
507+01005000f3030000000000000000000000000000000000000000000001084a01
508+03000000ef03000000000000090000000000000000000000000000006e657420
509+7469746c650000001c004a0101005000f3030000000000000000000000000000
510+000000000000000001084b0103000000ef030000000000000900000000000000
511+00000000000000006e6574207469746c650000001c004b0101005000f3030000
512+000000000000000000000000000000000000000001084c0103000000ef030000
513+00000000090000000000000000000000000000006e6574207469746c65000000
514+1c004c0101005000f30300000000000000000000000000000000000000000000
515+01084d0103000000ef0300000000000009000000000000000000000000000000
516+6e6574207469746c650000001c004d0101005000f30300000000000000000000
517+00000000000000000000000001084e0103000000ef0300000000000009000000
518+0000000000000000000000006e6574207469746c650000001c004e0101005000
519+f3030000000000000000000000000000000000000000000001084f0103000000
520+ef03000000000000090000000000000000000000000000006e6574207469746c
521+650000001c004f0101005000f303000000000000000000000000000000000000
522+000000000108500103000000ef03000000000000090000000000000000000000
523+000000006e6574207469746c650000001c00500101005000f303000000000000
524+000000000000000000000000000000000108510103000000ef03000000000000
525+090000000000000000000000000000006e6574207469746c650000001c005101
526+01005000f3030000000000000000000000000000000000000000000001085201
527+03000000ef03000000000000090000000000000000000000000000006e657420
528+7469746c650000001c00520101005000f3030000000000000000000000000000
529+00000000000000000108530103000000ef030000000000000900000000000000
530+00000000000000006e6574207469746c650000001c00530101005000f3030000
531+00000000000000000000000000000000000000000108540103000000ef030000
532+00000000090000000000000000000000000000006e6574207469746c65000000
533+1c00540101005000f30300000000000000000000000000000000000000000000
534+0108550103000000ef0300000000000009000000000000000000000000000000
535+6e6574207469746c650000001c00550101005000f30300000000000000000000
536+0000000000000000000000000108560103000000ef0300000000000009000000
537+0000000000000000000000006e6574207469746c650000001c00560101005000
538+f303000000000000000000000000000000000000000000000108570103000000
539+ef03000000000000090000000000000000000000000000006e6574207469746c
540+650000001c00570101005000f303000000000000000000000000000000000000
541+000000000108580103000000ef03000000000000090000000000000000000000
542+000000006e6574207469746c650000001c00580101005000f303000000000000
543+000000000000000000000000000000000108590103000000ef03000000000000
544+090000000000000000000000000000006e6574207469746c650000001c005901
545+01005000f3030000000000000000000000000000000000000000000001085a01
546+03000000ef03000000000000090000000000000000000000000000006e657420
547+7469746c650000001c005a0101005000f3030000000000000000000000000000
548+000000000000000001085b0103000000ef030000000000000900000000000000
549+00000000000000006e6574207469746c650000001c005b0101005000f3030000
550+000000000000000000000000000000000000000001085c0103000000ef030000
551+00000000090000000000000000000000000000006e6574207469746c65000000
552+1c005c0101005000f30300000000000000000000000000000000000000000000
553+01085d0103000000ef0300000000000009000000000000000000000000000000
554+6e6574207469746c650000001c005d0101005000f30300000000000000000000
555+00000000000000000000000001085e0103000000ef0300000000000009000000
556+0000000000000000000000006e6574207469746c650000001c005e0101005000
557+f3030000000000000000000000000000000000000000000001085f0103000000
558+ef03000000000000090000000000000000000000000000006e6574207469746c
559+650000001c005f0101005000f303000000000000000000000000000000000000
560+000000000108600103000000ef03000000000000090000000000000000000000
561+000000006e6574207469746c650000001c00600101005000f303000000000000
562+000000000000000000000000000000000108610103000000ef03000000000000
563+090000000000000000000000000000006e6574207469746c650000001c006101
564+01005000f3030000000000000000000000000000000000000000000001086201
565+03000000ef03000000000000090000000000000000000000000000006e657420
566+7469746c650000001c00620101005000f3030000000000000000000000000000
567+00000000000000000108630103000000ef030000000000000900000000000000
568+00000000000000006e6574207469746c650000001c00630101005000f3030000
569+00000000000000000000000000000000000000000108640103000000ef030000
570+00000000090000000000000000000000000000006e6574207469746c65000000
571+1c00640101005000f30300000000000000000000000000000000000000000000
572+0108650103000000ef0300000000000009000000000000000000000000000000
573+6e6574207469746c650000001c00650101005000f30300000000000000000000
574+0000000000000000000000000108660103000000ef0300000000000009000000
575+0000000000000000000000006e6574207469746c650000001c00660101005000
576+f303000000000000000000000000000000000000000000000108670103000000
577+ef03000000000000090000000000000000000000000000006e6574207469746c
578+650000001c00670101005000f303000000000000000000000000000000000000
579+000000000108680103000000ef03000000000000090000000000000000000000
580+000000006e6574207469746c650000001c00680101005000f303000000000000
581+000000000000000000000000000000000108690103000000ef03000000000000
582+090000000000000000000000000000006e6574207469746c650000001c006901
583+01005000f3030000000000000000000000000000000000000000000001086a01
584+03000000ef03000000000000090000000000000000000000000000006e657420
585+7469746c650000001c006a0101005000f3030000000000000000000000000000
586+000000000000000001086b0103000000ef030000000000000900000000000000
587+00000000000000006e6574207469746c650000001c006b0101005000f3030000
588+000000000000000000000000000000000000000001086c0103000000ef030000
589+00000000090000000000000000000000000000006e6574207469746c65000000
590+1c006c0101005000f30300000000000000000000000000000000000000000000
591+01086d0103000000ef0300000000000009000000000000000000000000000000
592+6e6574207469746c650000001c006d0101005000f30300000000000000000000
593+00000000000000000000000001086e0103000000ef0300000000000009000000
594+0000000000000000000000006e6574207469746c650000001c006e0101005000
595+f3030000000000000000000000000000000000000000000001086f0103000000
596+ef03000000000000090000000000000000000000000000006e6574207469746c
597+650000001c006f0101005000f303000000000000000000000000000000000000
598+000000000108700103000000ef03000000000000090000000000000000000000
599+000000006e6574207469746c650000001c00700101005000f303000000000000
600+000000000000000000000000000000000108710103000000ef03000000000000
601+090000000000000000000000000000006e6574207469746c650000001c007101
602+01005000f3030000000000000000000000000000000000000000000001087201
603+03000000ef03000000000000090000000000000000000000000000006e657420
604+7469746c650000001c00720101005000f3030000000000000000000000000000
605+00000000000000000108730103000000ef030000000000000900000000000000
606+00000000000000006e6574207469746c650000001c00730101005000f3030000
607+00000000000000000000000000000000000000000108740103000000ef030000
608+00000000090000000000000000000000000000006e6574207469746c65000000
609+1c00740101005000f30300000000000000000000000000000000000000000000
610+0108750103000000ef0300000000000009000000000000000000000000000000
611+6e6574207469746c650000001c00750101005000f30300000000000000000000
612+0000000000000000000000000108760103000000ef0300000000000009000000
613+0000000000000000000000006e6574207469746c650000001c00760101005000
614+f303000000000000000000000000000000000000000000000108770103000000
615+ef03000000000000090000000000000000000000000000006e6574207469746c
616+650000001c00770101005000f303000000000000000000000000000000000000
617+000000000108780103000000ef03000000000000090000000000000000000000
618+000000006e6574207469746c650000001c00780101005000f303000000000000
619+000000000000000000000000000000000108790103000000ef03000000000000
620+090000000000000000000000000000006e6574207469746c650000001c007901
621+01005000f3030000000000000000000000000000000000000000000001087a01
622+03000000ef03000000000000090000000000000000000000000000006e657420
623+7469746c650000001c007a0101005000f3030000000000000000000000000000
624+000000000000000001087b0103000000ef030000000000000900000000000000
625+00000000000000006e6574207469746c650000001c007b0101005000f3030000
626+000000000000000000000000000000000000000001087c0103000000ef030000
627+00000000090000000000000000000000000000006e6574207469746c65000000
628+1c007c0101005000f30300000000000000000000000000000000000000000000
629+01087d0103000000ef0300000000000009000000000000000000000000000000
630+6e6574207469746c650000001c007d0101005000f30300000000000000000000
631+00000000000000000000000001087e0103000000ef0300000000000009000000
632+0000000000000000000000006e6574207469746c650000001c007e0101005000
633+f3030000000000000000000000000000000000000000000001087f0103000000
634+ef03000000000000090000000000000000000000000000006e6574207469746c
635+650000001c007f0101005000f303000000000000000000000000000000000000
636+000000000108800103000000ef03000000000000090000000000000000000000
637+000000006e6574207469746c650000001c00800101005000f303000000000000
638+000000000000000000000000000000000108810103000000ef03000000000000
639+090000000000000000000000000000006e6574207469746c650000001c008101
640+01005000f3030000000000000000000000000000000000000000000001088201
641+03000000ef03000000000000090000000000000000000000000000006e657420
642+7469746c650000001c00820101005000f3030000000000000000000000000000
643+00000000000000000108830103000000ef030000000000000900000000000000
644+00000000000000006e6574207469746c650000001c00830101005000f3030000
645+00000000000000000000000000000000000000000108840103000000ef030000
646+00000000090000000000000000000000000000006e6574207469746c65000000
647+1c00840101005000f30300000000000000000000000000000000000000000000
648+0108850103000000ef0300000000000009000000000000000000000000000000
649+6e6574207469746c650000001c00850101005000f30300000000000000000000
650+0000000000000000000000000108860103000000ef0300000000000009000000
651+0000000000000000000000006e6574207469746c650000001c00860101005000
652+f303000000000000000000000000000000000000000000000108870103000000
653+ef03000000000000090000000000000000000000000000006e6574207469746c
654+650000001c00870101005000f303000000000000000000000000000000000000
655+000000000108880103000000ef03000000000000090000000000000000000000
656+000000006e6574207469746c650000001c00880101005000f303000000000000
657+000000000000000000000000000000000108890103000000ef03000000000000
658+090000000000000000000000000000006e6574207469746c650000001c008901
659+01005000f3030000000000000000000000000000000000000000000001088a01
660+03000000ef03000000000000090000000000000000000000000000006e657420
661+7469746c650000001c008a0101005000f3030000000000000000000000000000
662+000000000000000001088b0103000000ef030000000000000900000000000000
663+00000000000000006e6574207469746c650000001c008b0101005000f3030000
664+000000000000000000000000000000000000000001088c0103000000ef030000
665+00000000090000000000000000000000000000006e6574207469746c65000000
666+1c008c0101005000f30300000000000000000000000000000000000000000000
667+01088d0103000000ef0300000000000009000000000000000000000000000000
668+6e6574207469746c650000001c008d0101005000f30300000000000000000000
669+00000000000000000000000001088e0103000000ef0300000000000009000000
670+0000000000000000000000006e6574207469746c650000001c008e0101005000
671+f3030000000000000000000000000000000000000000000001088f0103000000
672+ef03000000000000090000000000000000000000000000006e6574207469746c
673+650000001c008f0101005000f303000000000000000000000000000000000000
674+000000000108900103000000ef03000000000000090000000000000000000000
675+000000006e6574207469746c650000001c00900101005000f303000000000000
676+000000000000000000000000000000000108910103000000ef03000000000000
677+090000000000000000000000000000006e6574207469746c650000001c009101
678+01005000f3030000000000000000000000000000000000000000000001089201
679+03000000ef03000000000000090000000000000000000000000000006e657420
680+7469746c650000001c00920101005000f3030000000000000000000000000000
681+00000000000000000108930103000000ef030000000000000900000000000000
682+00000000000000006e6574207469746c650000001c00930101005000f3030000
683+00000000000000000000000000000000000000000108940103000000ef030000
684+00000000090000000000000000000000000000006e6574207469746c65000000
685+1c00940101005000f30300000000000000000000000000000000000000000000
686+0108950103000000ef0300000000000009000000000000000000000000000000
687+6e6574207469746c650000001c00950101005000f30300000000000000000000
688+0000000000000000000000000108960103000000ef0300000000000009000000
689+0000000000000000000000006e6574207469746c650000001c00960101005000
690+f303000000000000000000000000000000000000000000000108970103000000
691+ef03000000000000090000000000000000000000000000006e6574207469746c
692+650000001c00970101005000f303000000000000000000000000000000000000
693+000000000108980103000000ef03000000000000090000000000000000000000
694+000000006e6574207469746c650000001c00980101005000f303000000000000
695+000000000000000000000000000000000108990103000000ef03000000000000
696+090000000000000000000000000000006e6574207469746c650000001c009901
697+01005000f3030000000000000000000000000000000000000000000001089a01
698+03000000ef03000000000000090000000000000000000000000000006e657420
699+7469746c650000001c009a0101005000f3030000000000000000000000000000
700+000000000000000001089b0103000000ef030000000000000900000000000000
701+00000000000000006e6574207469746c650000001c009b0101005000f3030000
702+000000000000000000000000000000000000000001089c0103000000ef030000
703+00000000090000000000000000000000000000006e6574207469746c65000000
704+1c009c0101005000f30300000000000000000000000000000000000000000000
705+01089d0103000000ef0300000000000009000000000000000000000000000000
706+6e6574207469746c650000001c009d0101005000f30300000000000000000000
707+00000000000000000000000001089e0103000000ef0300000000000009000000
708+0000000000000000000000006e6574207469746c650000001c009e0101005000
709+f3030000000000000000000000000000000000000000000001089f0103000000
710+ef03000000000000090000000000000000000000000000006e6574207469746c
711+650000001c009f0101005000f303000000000000000000000000000000000000
712+000000000108a00103000000ef03000000000000090000000000000000000000
713+000000006e6574207469746c650000001c00a00101005000f303000000000000
714+000000000000000000000000000000000108a10103000000ef03000000000000
715+090000000000000000000000000000006e6574207469746c650000001c00a101
716+01005000f303000000000000000000000000000000000000000000000108a201
717+03000000ef03000000000000090000000000000000000000000000006e657420
718+7469746c650000001c00a20101005000f3030000000000000000000000000000
719+00000000000000000108a30103000000ef030000000000000900000000000000
720+00000000000000006e6574207469746c650000001c00a30101005000f3030000
721+00000000000000000000000000000000000000000108a40103000000ef030000
722+00000000090000000000000000000000000000006e6574207469746c65000000
723+1c00a40101005000f30300000000000000000000000000000000000000000000
724+0108a50103000000ef0300000000000009000000000000000000000000000000
725+6e6574207469746c650000001c00a50101005000f30300000000000000000000
726+0000000000000000000000000108a60103000000ef0300000000000009000000
727+0000000000000000000000006e6574207469746c650000001c00a60101005000
728+f303000000000000000000000000000000000000000000000108a70103000000
729+ef03000000000000090000000000000000000000000000006e6574207469746c
730+650000001c00a70101005000f303000000000000000000000000000000000000
731+000000000108a80103000000ef03000000000000090000000000000000000000
732+000000006e6574207469746c650000001c00a80101005000f303000000000000
733+000000000000000000000000000000000108a90103000000ef03000000000000
734+090000000000000000000000000000006e6574207469746c650000001c00a901
735+01005000f303000000000000000000000000000000000000000000000108aa01
736+03000000ef03000000000000090000000000000000000000000000006e657420
737+7469746c650000001c00aa0101005000f3030000000000000000000000000000
738+00000000000000000108ab0103000000ef030000000000000900000000000000
739+00000000000000006e6574207469746c650000001c00ab0101005000f3030000
740+00000000000000000000000000000000000000000108ac0103000000ef030000
741+00000000090000000000000000000000000000006e6574207469746c65000000
742+1c00ac0101005000f30300000000000000000000000000000000000000000000
743+0108ad0103000000ef0300000000000009000000000000000000000000000000
744+6e6574207469746c650000001c00ad0101005000f30300000000000000000000
745+0000000000000000000000000108ae0103000000ef0300000000000009000000
746+0000000000000000000000006e6574207469746c650000001c00ae0101005000
747+f303000000000000000000000000000000000000000000000108af0103000000
748+ef03000000000000090000000000000000000000000000006e6574207469746c
749+650000001c00af0101005000f303000000000000000000000000000000000000
750+000000000108b00103000000ef03000000000000090000000000000000000000
751+000000006e6574207469746c650000001c00b00101005000f303000000000000
752+000000000000000000000000000000000108b10103000000ef03000000000000
753+090000000000000000000000000000006e6574207469746c650000001c00b101
754+01005000f303000000000000000000000000000000000000000000000108b201
755+03000000ef03000000000000090000000000000000000000000000006e657420
756+7469746c650000001c00b20101005000f3030000000000000000000000000000
757+00000000000000000108b30103000000ef030000000000000900000000000000
758+00000000000000006e6574207469746c650000001c00b30101005000f3030000
759+00000000000000000000000000000000000000000108b40103000000ef030000
760+00000000090000000000000000000000000000006e6574207469746c65000000
761+1c00b40101005000f30300000000000000000000000000000000000000000000
762+0108b50103000000ef0300000000000009000000000000000000000000000000
763+6e6574207469746c650000001c00b50101005000f30300000000000000000000
764+0000000000000000000000000108b60103000000ef0300000000000009000000
765+0000000000000000000000006e6574207469746c650000001c00b60101005000
766+f303000000000000000000000000000000000000000000000108b70103000000
767+ef03000000000000090000000000000000000000000000006e6574207469746c
768+650000001c00b70101005000f303000000000000000000000000000000000000
769+000000000108b80103000000ef03000000000000090000000000000000000000
770+000000006e6574207469746c650000001c00b80101005000f303000000000000
771+000000000000000000000000000000000108b90103000000ef03000000000000
772+090000000000000000000000000000006e6574207469746c650000001c00b901
773+01005000f303000000000000000000000000000000000000000000000108ba01
774+03000000ef03000000000000090000000000000000000000000000006e657420
775+7469746c650000001c00ba0101005000f3030000000000000000000000000000
776+00000000000000000108bb0103000000ef030000000000000900000000000000
777+00000000000000006e6574207469746c650000001c00bb0101005000f3030000
778+00000000000000000000000000000000000000000108bc0103000000ef030000
779+00000000090000000000000000000000000000006e6574207469746c65000000
780+1c00bc0101005000f30300000000000000000000000000000000000000000000
781+0108bd0103000000ef0300000000000009000000000000000000000000000000
782+6e6574207469746c650000001c00bd0101005000f30300000000000000000000
783+0000000000000000000000000108be0103000000ef0300000000000009000000
784+0000000000000000000000006e6574207469746c650000001c00be0101005000
785+f303000000000000000000000000000000000000000000000108bf0103000000
786+ef03000000000000090000000000000000000000000000006e6574207469746c
787+650000001c00bf0101005000f303000000000000000000000000000000000000
788+000000000108c00103000000ef03000000000000090000000000000000000000
789+000000006e6574207469746c650000001c00c00101005000f303000000000000
790+000000000000000000000000000000000108c10103000000ef03000000000000
791+090000000000000000000000000000006e6574207469746c650000001c00c101
792+01005000f303000000000000000000000000000000000000000000000108c201
793+03000000ef03000000000000090000000000000000000000000000006e657420
794+7469746c650000001c00c20101005000f3030000000000000000000000000000
795+00000000000000000108c30103000000ef030000000000000900000000000000
796+00000000000000006e6574207469746c650000001c00c30101005000f3030000
797+00000000000000000000000000000000000000000108c40103000000ef030000
798+00000000090000000000000000000000000000006e6574207469746c65000000
799+1c00c40101005000f30300000000000000000000000000000000000000000000
800+0108c50103000000ef0300000000000009000000000000000000000000000000
801+6e6574207469746c650000001c00c50101005000f30300000000000000000000
802+0000000000000000000000000108c60103000000ef0300000000000009000000
803+0000000000000000000000006e6574207469746c650000001c00c60101005000
804+f303000000000000000000000000000000000000000000000108c70103000000
805+ef03000000000000090000000000000000000000000000006e6574207469746c
806+650000001c00c70101005000f303000000000000000000000000000000000000
807+000000000108c80103000000ef03000000000000090000000000000000000000
808+000000006e6574207469746c650000001c00c80101005000f303000000000000
809+000000000000000000000000000000000108c90103000000ef03000000000000
810+090000000000000000000000000000006e6574207469746c650000001c00c901
811+01005000f303000000000000000000000000000000000000000000000108ca01
812+03000000ef03000000000000090000000000000000000000000000006e657420
813+7469746c650000001c00ca0101005000f3030000000000000000000000000000
814+00000000000000000108cb0103000000ef030000000000000900000000000000
815+00000000000000006e6574207469746c650000001c00cb0101005000f3030000
816+00000000000000000000000000000000000000000108cc0103000000ef030000
817+00000000090000000000000000000000000000006e6574207469746c65000000
818+1c00cc0101005000f30300000000000000000000000000000000000000000000
819+0108cd0103000000ef0300000000000009000000000000000000000000000000
820+6e6574207469746c650000001c00cd0101005000f30300000000000000000000
821+0000000000000000000000000108ce0103000000ef0300000000000009000000
822+0000000000000000000000006e6574207469746c650000001c00ce0101005000
823+f303000000000000000000000000000000000000000000000108cf0103000000
824+ef03000000000000090000000000000000000000000000006e6574207469746c
825+650000001c00cf0101005000f303000000000000000000000000000000000000
826+000000000108d00103000000ef03000000000000090000000000000000000000
827+000000006e6574207469746c650000001c00d00101005000f303000000000000
828+000000000000000000000000000000000108d10103000000ef03000000000000
829+090000000000000000000000000000006e6574207469746c650000001c00d101
830+01005000f303000000000000000000000000000000000000000000000108d201
831+03000000ef03000000000000090000000000000000000000000000006e657420
832+7469746c650000001c00d20101005000f3030000000000000000000000000000
833+00000000000000000108d30103000000ef030000000000000900000000000000
834+00000000000000006e6574207469746c650000001c00d30101005000f3030000
835+00000000000000000000000000000000000000000108d40103000000ef030000
836+00000000090000000000000000000000000000006e6574207469746c65000000
837+1c00d40101005000f30300000000000000000000000000000000000000000000
838+0108d50103000000ef0300000000000009000000000000000000000000000000
839+6e6574207469746c650000001c00d50101005000f30300000000000000000000
840+0000000000000000000000000108d60103000000ef0300000000000009000000
841+0000000000000000000000006e6574207469746c650000001c00d60101005000
842+f303000000000000000000000000000000000000000000000108d70103000000
843+ef03000000000000090000000000000000000000000000006e6574207469746c
844+650000001c00d70101005000f303000000000000000000000000000000000000
845+000000000108d80103000000ef03000000000000090000000000000000000000
846+000000006e6574207469746c650000001c00d80101005000f303000000000000
847+000000000000000000000000000000000108d90103000000ef03000000000000
848+090000000000000000000000000000006e6574207469746c650000001c00d901
849+01005000f303000000000000000000000000000000000000000000000108da01
850+03000000ef03000000000000090000000000000000000000000000006e657420
851+7469746c650000001c00da0101005000f3030000000000000000000000000000
852+00000000000000000108db0103000000ef030000000000000900000000000000
853+00000000000000006e6574207469746c650000001c00db0101005000f3030000
854+00000000000000000000000000000000000000000108dc0103000000ef030000
855+00000000090000000000000000000000000000006e6574207469746c65000000
856+1c00dc0101005000f30300000000000000000000000000000000000000000000
857+0108dd0103000000ef0300000000000009000000000000000000000000000000
858+6e6574207469746c650000001c00dd0101005000f30300000000000000000000
859+0000000000000000000000000108de0103000000ef0300000000000009000000
860+0000000000000000000000006e6574207469746c650000001c00de0101005000
861+f303000000000000000000000000000000000000000000000108df0103000000
862+ef03000000000000090000000000000000000000000000006e6574207469746c
863+650000001c00df0101005000f303000000000000000000000000000000000000
864+000000000108e00103000000ef03000000000000090000000000000000000000
865+000000006e6574207469746c650000001c00e00101005000f303000000000000
866+000000000000000000000000000000000108e10103000000ef03000000000000
867+090000000000000000000000000000006e6574207469746c650000001c00e101
868+01005000f303000000000000000000000000000000000000000000000108e201
869+03000000ef03000000000000090000000000000000000000000000006e657420
870+7469746c650000001c00e20101005000f3030000000000000000000000000000
871+00000000000000000108e30103000000ef030000000000000900000000000000
872+00000000000000006e6574207469746c650000001c00e30101005000f3030000
873+00000000000000000000000000000000000000000108e40103000000ef030000
874+00000000090000000000000000000000000000006e6574207469746c65000000
875+1c00e40101005000f30300000000000000000000000000000000000000000000
876+0108e50103000000ef0300000000000009000000000000000000000000000000
877+6e6574207469746c650000001c00e50101005000f30300000000000000000000
878+0000000000000000000000000108e60103000000ef0300000000000009000000
879+0000000000000000000000006e6574207469746c650000001c00e60101005000
880+f303000000000000000000000000000000000000000000000108e70103000000
881+ef03000000000000090000000000000000000000000000006e6574207469746c
882+650000001c00e70101005000f303000000000000000000000000000000000000
883+000000000108e80103000000ef03000000000000090000000000000000000000
884+000000006e6574207469746c650000001c00e80101005000f303000000000000
885+000000000000000000000000000000000108e90103000000ef03000000000000
886+090000000000000000000000000000006e6574207469746c650000001c00e901
887+01005000f303000000000000000000000000000000000000000000000108ea01
888+03000000ef03000000000000090000000000000000000000000000006e657420
889+7469746c650000001c00ea0101005000f3030000000000000000000000000000
890+00000000000000000108eb0103000000ef030000000000000900000000000000
891+00000000000000006e6574207469746c650000001c00eb0101005000f3030000
892+00000000000000000000000000000000000000000108ec0103000000ef030000
893+00000000090000000000000000000000000000006e6574207469746c65000000
894+1c00ec0101005000f30300000000000000000000000000000000000000000000
895+0108ed0103000000ef0300000000000009000000000000000000000000000000
896+6e6574207469746c650000001c00ed0101005000f30300000000000000000000
897+0000000000000000000000000108ee0103000000ef0300000000000009000000
898+0000000000000000000000006e6574207469746c650000001c00ee0101005000
899+f303000000000000000000000000000000000000000000000108ef0103000000
900+ef03000000000000090000000000000000000000000000006e6574207469746c
901+650000001c00ef0101005000f303000000000000000000000000000000000000
902+000000000108f00103000000ef03000000000000090000000000000000000000
903+000000006e6574207469746c650000001c00f00101005000f303000000000000
904+000000000000000000000000000000000108f10103000000ef03000000000000
905+090000000000000000000000000000006e6574207469746c650000001c00f101
906+01005000f303000000000000000000000000000000000000000000000108f201
907+03000000ef03000000000000090000000000000000000000000000006e657420
908+7469746c650000001c00f20101005000f3030000000000000000000000000000
909+00000000000000000108f30103000000ef030000000000000900000000000000
910+00000000000000006e6574207469746c650000001c00f30101005000f3030000
911+00000000000000000000000000000000000000000108f40103000000ef030000
912+00000000090000000000000000000000000000006e6574207469746c65000000
913+1c00f40101005000f30300000000000000000000000000000000000000000000
914+0108f50103000000ef0300000000000009000000000000000000000000000000
915+6e6574207469746c650000001c00f50101005000f30300000000000000000000
916+0000000000000000000000000108f60103000000ef0300000000000009000000
917+0000000000000000000000006e6574207469746c650000001c00f60101005000
918+f303000000000000000000000000000000000000000000000108f70103000000
919+ef03000000000000090000000000000000000000000000006e6574207469746c
920+650000001c00f70101005000f303000000000000000000000000000000000000
921+000000000108f80103000000ef03000000000000090000000000000000000000
922+000000006e6574207469746c650000001c00f80101005000f303000000000000
923+000000000000000000000000000000000108f90103000000ef03000000000000
924+090000000000000000000000000000006e6574207469746c650000001c00f901
925+01005000f303000000000000000000000000000000000000000000000108fa01
926+03000000ef03000000000000090000000000000000000000000000006e657420
927+7469746c650000001c00fa0101005000f3030000000000000000000000000000
928+00000000000000000108fb0103000000ef030000000000000900000000000000
929+00000000000000006e6574207469746c650000001c00fb0101005000f3030000
930+00000000000000000000000000000000000000000108fc0103000000ef030000
931+00000000090000000000000000000000000000006e6574207469746c65000000
932+1c00fc0101005000f30300000000000000000000000000000000000000000000
933+0108fd0103000000ef0300000000000009000000000000000000000000000000
934+6e6574207469746c650000001c00fd0101005000f30300000000000000000000
935+0000000000000000000000000108fe0103000000ef0300000000000009000000
936+0000000000000000000000006e6574207469746c650000001c00fe0101005000
937+f303000000000000000000000000000000000000000000000108ff0103000000
938+ef03000000000000090000000000000000000000000000006e6574207469746c
939+650000001c00ff0101005000f303000000000000000000000000000000000000
940+000000000108000203000000ef03000000000000090000000000000000000000
941+000000006e6574207469746c650000001c00000201005000f303000000000000
942+000000000000000000000000000000000108010203000000ef03000000000000
943+090000000000000000000000000000006e6574207469746c650000001c000102
944+01005000f3030000000000000000000000000000000000000000000001080202
945+03000000ef03000000000000090000000000000000000000000000006e657420
946+7469746c650000001c00020201005000f3030000000000000000000000000000
947+00000000000000000108030203000000ef030000000000000900000000000000
948+00000000000000006e6574207469746c650000001c00030201005000f3030000
949+00000000000000000000000000000000000000000108040203000000ef030000
950950 00000000090000000000000000000000000000006e6574207469746c65000000
@@ -1,950 +1,950 @@
1-1c00710001005000f303000000000000000000000000000000000000000000001+1c00740001005000f30300000000000000000000000000000000000000000000
2-0108720003000000ef03000000000000090000000000000000000000000000002+0108750003000000ef0300000000000009000000000000000000000000000000
3-6e6574207469746c650000001c00720001005000f303000000000000000000003+6e6574207469746c650000001c00750001005000f30300000000000000000000
4-0000000000000000000000000108730003000000ef03000000000000090000004+0000000000000000000000000108760003000000ef0300000000000009000000
5-0000000000000000000000006e6574207469746c650000001c007300010050005+0000000000000000000000006e6574207469746c650000001c00760001005000
6-f3030000000000000000000000000000000000000000000001087400030000006+f303000000000000000000000000000000000000000000000108770003000000
7-ef03000000000000090000000000000000000000000000006e6574207469746c7+ef03000000000000090000000000000000000000000000006e6574207469746c
8-650000001c00740001005000f3030000000000000000000000000000000000008+650000001c00770001005000f303000000000000000000000000000000000000
9-000000000108750003000000ef030000000000000900000000000000000000009+000000000108780003000000ef03000000000000090000000000000000000000
10-000000006e6574207469746c650000001c00750001005000f30300000000000010+000000006e6574207469746c650000001c00780001005000f303000000000000
11-000000000000000000000000000000000108760003000000ef0300000000000011+000000000000000000000000000000000108790003000000ef03000000000000
12-090000000000000000000000000000006e6574207469746c650000001c00760012+090000000000000000000000000000006e6574207469746c650000001c007900
13-01005000f303000000000000000000000000000000000000000000000108770013+01005000f3030000000000000000000000000000000000000000000001087a00
14-03000000ef03000000000000090000000000000000000000000000006e65742014+03000000ef03000000000000090000000000000000000000000000006e657420
15-7469746c650000001c00770001005000f303000000000000000000000000000015+7469746c650000001c007a0001005000f3030000000000000000000000000000
16-00000000000000000108780003000000ef03000000000000090000000000000016+000000000000000001087b0003000000ef030000000000000900000000000000
17-00000000000000006e6574207469746c650000001c00780001005000f303000017+00000000000000006e6574207469746c650000001c007b0001005000f3030000
18-00000000000000000000000000000000000000000108790003000000ef03000018+000000000000000000000000000000000000000001087c0003000000ef030000
19-00000000090000000000000000000000000000006e6574207469746c6500000019+00000000090000000000000000000000000000006e6574207469746c65000000
20-1c00790001005000f3030000000000000000000000000000000000000000000020+1c007c0001005000f30300000000000000000000000000000000000000000000
21-01087a0003000000ef030000000000000900000000000000000000000000000021+01087d0003000000ef0300000000000009000000000000000000000000000000
22-6e6574207469746c650000001c007a0001005000f3030000000000000000000022+6e6574207469746c650000001c007d0001005000f30300000000000000000000
23-00000000000000000000000001087b0003000000ef030000000000000900000023+00000000000000000000000001087e0003000000ef0300000000000009000000
24-0000000000000000000000006e6574207469746c650000001c007b000100500024+0000000000000000000000006e6574207469746c650000001c007e0001005000
25-f3030000000000000000000000000000000000000000000001087c000300000025+f3030000000000000000000000000000000000000000000001087f0003000000
26-ef03000000000000090000000000000000000000000000006e6574207469746c26+ef03000000000000090000000000000000000000000000006e6574207469746c
27-650000001c007c0001005000f30300000000000000000000000000000000000027+650000001c007f0001005000f303000000000000000000000000000000000000
28-0000000001087d0003000000ef0300000000000009000000000000000000000028+000000000108800003000000ef03000000000000090000000000000000000000
29-000000006e6574207469746c650000001c007d0001005000f30300000000000029+000000006e6574207469746c650000001c00800001005000f303000000000000
30-0000000000000000000000000000000001087e0003000000ef0300000000000030+000000000000000000000000000000000108810003000000ef03000000000000
31-090000000000000000000000000000006e6574207469746c650000001c007e0031+090000000000000000000000000000006e6574207469746c650000001c008100
32-01005000f3030000000000000000000000000000000000000000000001087f0032+01005000f3030000000000000000000000000000000000000000000001088200
33-03000000ef03000000000000090000000000000000000000000000006e65742033+03000000ef03000000000000090000000000000000000000000000006e657420
34-7469746c650000001c007f0001005000f303000000000000000000000000000034+7469746c650000001c00820001005000f3030000000000000000000000000000
35-00000000000000000108800003000000ef03000000000000090000000000000035+00000000000000000108830003000000ef030000000000000900000000000000
36-00000000000000006e6574207469746c650000001c00800001005000f303000036+00000000000000006e6574207469746c650000001c00830001005000f3030000
37-00000000000000000000000000000000000000000108810003000000ef03000037+00000000000000000000000000000000000000000108840003000000ef030000
38-00000000090000000000000000000000000000006e6574207469746c6500000038+00000000090000000000000000000000000000006e6574207469746c65000000
39-1c00810001005000f3030000000000000000000000000000000000000000000039+1c00840001005000f30300000000000000000000000000000000000000000000
40-0108820003000000ef030000000000000900000000000000000000000000000040+0108850003000000ef0300000000000009000000000000000000000000000000
41-6e6574207469746c650000001c00820001005000f3030000000000000000000041+6e6574207469746c650000001c00850001005000f30300000000000000000000
42-0000000000000000000000000108830003000000ef030000000000000900000042+0000000000000000000000000108860003000000ef0300000000000009000000
43-0000000000000000000000006e6574207469746c650000001c0083000100500043+0000000000000000000000006e6574207469746c650000001c00860001005000
44-f30300000000000000000000000000000000000000000000010884000300000044+f303000000000000000000000000000000000000000000000108870003000000
45-ef03000000000000090000000000000000000000000000006e6574207469746c45+ef03000000000000090000000000000000000000000000006e6574207469746c
46-650000001c00840001005000f30300000000000000000000000000000000000046+650000001c00870001005000f303000000000000000000000000000000000000
47-000000000108850003000000ef0300000000000009000000000000000000000047+000000000108880003000000ef03000000000000090000000000000000000000
48-000000006e6574207469746c650000001c00850001005000f30300000000000048+000000006e6574207469746c650000001c00880001005000f303000000000000
49-000000000000000000000000000000000108860003000000ef0300000000000049+000000000000000000000000000000000108890003000000ef03000000000000
50-090000000000000000000000000000006e6574207469746c650000001c00860050+090000000000000000000000000000006e6574207469746c650000001c008900
51-01005000f303000000000000000000000000000000000000000000000108870051+01005000f3030000000000000000000000000000000000000000000001088a00
52-03000000ef03000000000000090000000000000000000000000000006e65742052+03000000ef03000000000000090000000000000000000000000000006e657420
53-7469746c650000001c00870001005000f303000000000000000000000000000053+7469746c650000001c008a0001005000f3030000000000000000000000000000
54-00000000000000000108880003000000ef03000000000000090000000000000054+000000000000000001088b0003000000ef030000000000000900000000000000
55-00000000000000006e6574207469746c650000001c00880001005000f303000055+00000000000000006e6574207469746c650000001c008b0001005000f3030000
56-00000000000000000000000000000000000000000108890003000000ef03000056+000000000000000000000000000000000000000001088c0003000000ef030000
57-00000000090000000000000000000000000000006e6574207469746c6500000057+00000000090000000000000000000000000000006e6574207469746c65000000
58-1c00890001005000f3030000000000000000000000000000000000000000000058+1c008c0001005000f30300000000000000000000000000000000000000000000
59-01088a0003000000ef030000000000000900000000000000000000000000000059+01088d0003000000ef0300000000000009000000000000000000000000000000
60-6e6574207469746c650000001c008a0001005000f3030000000000000000000060+6e6574207469746c650000001c008d0001005000f30300000000000000000000
61-00000000000000000000000001088b0003000000ef030000000000000900000061+00000000000000000000000001088e0003000000ef0300000000000009000000
62-0000000000000000000000006e6574207469746c650000001c008b000100500062+0000000000000000000000006e6574207469746c650000001c008e0001005000
63-f3030000000000000000000000000000000000000000000001088c000300000063+f3030000000000000000000000000000000000000000000001088f0003000000
64-ef03000000000000090000000000000000000000000000006e6574207469746c64+ef03000000000000090000000000000000000000000000006e6574207469746c
65-650000001c008c0001005000f30300000000000000000000000000000000000065+650000001c008f0001005000f303000000000000000000000000000000000000
66-0000000001088d0003000000ef0300000000000009000000000000000000000066+000000000108900003000000ef03000000000000090000000000000000000000
67-000000006e6574207469746c650000001c008d0001005000f30300000000000067+000000006e6574207469746c650000001c00900001005000f303000000000000
68-0000000000000000000000000000000001088e0003000000ef0300000000000068+000000000000000000000000000000000108910003000000ef03000000000000
69-090000000000000000000000000000006e6574207469746c650000001c008e0069+090000000000000000000000000000006e6574207469746c650000001c009100
70-01005000f3030000000000000000000000000000000000000000000001088f0070+01005000f3030000000000000000000000000000000000000000000001089200
71-03000000ef03000000000000090000000000000000000000000000006e65742071+03000000ef03000000000000090000000000000000000000000000006e657420
72-7469746c650000001c008f0001005000f303000000000000000000000000000072+7469746c650000001c00920001005000f3030000000000000000000000000000
73-00000000000000000108900003000000ef03000000000000090000000000000073+00000000000000000108930003000000ef030000000000000900000000000000
74-00000000000000006e6574207469746c650000001c00900001005000f303000074+00000000000000006e6574207469746c650000001c00930001005000f3030000
75-00000000000000000000000000000000000000000108910003000000ef03000075+00000000000000000000000000000000000000000108940003000000ef030000
76-00000000090000000000000000000000000000006e6574207469746c6500000076+00000000090000000000000000000000000000006e6574207469746c65000000
77-1c00910001005000f3030000000000000000000000000000000000000000000077+1c00940001005000f30300000000000000000000000000000000000000000000
78-0108920003000000ef030000000000000900000000000000000000000000000078+0108950003000000ef0300000000000009000000000000000000000000000000
79-6e6574207469746c650000001c00920001005000f3030000000000000000000079+6e6574207469746c650000001c00950001005000f30300000000000000000000
80-0000000000000000000000000108930003000000ef030000000000000900000080+0000000000000000000000000108960003000000ef0300000000000009000000
81-0000000000000000000000006e6574207469746c650000001c0093000100500081+0000000000000000000000006e6574207469746c650000001c00960001005000
82-f30300000000000000000000000000000000000000000000010894000300000082+f303000000000000000000000000000000000000000000000108970003000000
83-ef03000000000000090000000000000000000000000000006e6574207469746c83+ef03000000000000090000000000000000000000000000006e6574207469746c
84-650000001c00940001005000f30300000000000000000000000000000000000084+650000001c00970001005000f303000000000000000000000000000000000000
85-000000000108950003000000ef0300000000000009000000000000000000000085+000000000108980003000000ef03000000000000090000000000000000000000
86-000000006e6574207469746c650000001c00950001005000f30300000000000086+000000006e6574207469746c650000001c00980001005000f303000000000000
87-000000000000000000000000000000000108960003000000ef0300000000000087+000000000000000000000000000000000108990003000000ef03000000000000
88-090000000000000000000000000000006e6574207469746c650000001c00960088+090000000000000000000000000000006e6574207469746c650000001c009900
89-01005000f303000000000000000000000000000000000000000000000108970089+01005000f3030000000000000000000000000000000000000000000001089a00
90-03000000ef03000000000000090000000000000000000000000000006e65742090+03000000ef03000000000000090000000000000000000000000000006e657420
91-7469746c650000001c00970001005000f303000000000000000000000000000091+7469746c650000001c009a0001005000f3030000000000000000000000000000
92-00000000000000000108980003000000ef03000000000000090000000000000092+000000000000000001089b0003000000ef030000000000000900000000000000
93-00000000000000006e6574207469746c650000001c00980001005000f303000093+00000000000000006e6574207469746c650000001c009b0001005000f3030000
94-00000000000000000000000000000000000000000108990003000000ef03000094+000000000000000000000000000000000000000001089c0003000000ef030000
95-00000000090000000000000000000000000000006e6574207469746c6500000095+00000000090000000000000000000000000000006e6574207469746c65000000
96-1c00990001005000f3030000000000000000000000000000000000000000000096+1c009c0001005000f30300000000000000000000000000000000000000000000
97-01089a0003000000ef030000000000000900000000000000000000000000000097+01089d0003000000ef0300000000000009000000000000000000000000000000
98-6e6574207469746c650000001c009a0001005000f3030000000000000000000098+6e6574207469746c650000001c009d0001005000f30300000000000000000000
99-00000000000000000000000001089b0003000000ef030000000000000900000099+00000000000000000000000001089e0003000000ef0300000000000009000000
100-0000000000000000000000006e6574207469746c650000001c009b0001005000100+0000000000000000000000006e6574207469746c650000001c009e0001005000
101-f3030000000000000000000000000000000000000000000001089c0003000000101+f3030000000000000000000000000000000000000000000001089f0003000000
102-ef03000000000000090000000000000000000000000000006e6574207469746c102+ef03000000000000090000000000000000000000000000006e6574207469746c
103-650000001c009c0001005000f303000000000000000000000000000000000000103+650000001c009f0001005000f303000000000000000000000000000000000000
104-0000000001089d0003000000ef03000000000000090000000000000000000000104+000000000108a00003000000ef03000000000000090000000000000000000000
105-000000006e6574207469746c650000001c009d0001005000f303000000000000105+000000006e6574207469746c650000001c00a00001005000f303000000000000
106-0000000000000000000000000000000001089e0003000000ef03000000000000106+000000000000000000000000000000000108a10003000000ef03000000000000
107-090000000000000000000000000000006e6574207469746c650000001c009e00107+090000000000000000000000000000006e6574207469746c650000001c00a100
108-01005000f3030000000000000000000000000000000000000000000001089f00108+01005000f303000000000000000000000000000000000000000000000108a200
109-03000000ef03000000000000090000000000000000000000000000006e657420109+03000000ef03000000000000090000000000000000000000000000006e657420
110-7469746c650000001c009f0001005000f3030000000000000000000000000000110+7469746c650000001c00a20001005000f3030000000000000000000000000000
111-00000000000000000108a00003000000ef030000000000000900000000000000111+00000000000000000108a30003000000ef030000000000000900000000000000
112-00000000000000006e6574207469746c650000001c00a00001005000f3030000112+00000000000000006e6574207469746c650000001c00a30001005000f3030000
113-00000000000000000000000000000000000000000108a10003000000ef030000113+00000000000000000000000000000000000000000108a40003000000ef030000
114-00000000090000000000000000000000000000006e6574207469746c65000000114+00000000090000000000000000000000000000006e6574207469746c65000000
115-1c00a10001005000f30300000000000000000000000000000000000000000000115+1c00a40001005000f30300000000000000000000000000000000000000000000
116-0108a20003000000ef0300000000000009000000000000000000000000000000116+0108a50003000000ef0300000000000009000000000000000000000000000000
117-6e6574207469746c650000001c00a20001005000f30300000000000000000000117+6e6574207469746c650000001c00a50001005000f30300000000000000000000
118-0000000000000000000000000108a30003000000ef0300000000000009000000118+0000000000000000000000000108a60003000000ef0300000000000009000000
119-0000000000000000000000006e6574207469746c650000001c00a30001005000119+0000000000000000000000006e6574207469746c650000001c00a60001005000
120-f303000000000000000000000000000000000000000000000108a40003000000120+f303000000000000000000000000000000000000000000000108a70003000000
121-ef03000000000000090000000000000000000000000000006e6574207469746c121+ef03000000000000090000000000000000000000000000006e6574207469746c
122-650000001c00a40001005000f303000000000000000000000000000000000000122+650000001c00a70001005000f303000000000000000000000000000000000000
123-000000000108a50003000000ef03000000000000090000000000000000000000123+000000000108a80003000000ef03000000000000090000000000000000000000
124-000000006e6574207469746c650000001c00a50001005000f303000000000000124+000000006e6574207469746c650000001c00a80001005000f303000000000000
125-000000000000000000000000000000000108a60003000000ef03000000000000125+000000000000000000000000000000000108a90003000000ef03000000000000
126-090000000000000000000000000000006e6574207469746c650000001c00a600126+090000000000000000000000000000006e6574207469746c650000001c00a900
127-01005000f303000000000000000000000000000000000000000000000108a700127+01005000f303000000000000000000000000000000000000000000000108aa00
128-03000000ef03000000000000090000000000000000000000000000006e657420128+03000000ef03000000000000090000000000000000000000000000006e657420
129-7469746c650000001c00a70001005000f3030000000000000000000000000000129+7469746c650000001c00aa0001005000f3030000000000000000000000000000
130-00000000000000000108a80003000000ef030000000000000900000000000000130+00000000000000000108ab0003000000ef030000000000000900000000000000
131-00000000000000006e6574207469746c650000001c00a80001005000f3030000131+00000000000000006e6574207469746c650000001c00ab0001005000f3030000
132-00000000000000000000000000000000000000000108a90003000000ef030000132+00000000000000000000000000000000000000000108ac0003000000ef030000
133-00000000090000000000000000000000000000006e6574207469746c65000000133+00000000090000000000000000000000000000006e6574207469746c65000000
134-1c00a90001005000f30300000000000000000000000000000000000000000000134+1c00ac0001005000f30300000000000000000000000000000000000000000000
135-0108aa0003000000ef0300000000000009000000000000000000000000000000135+0108ad0003000000ef0300000000000009000000000000000000000000000000
136-6e6574207469746c650000001c00aa0001005000f30300000000000000000000136+6e6574207469746c650000001c00ad0001005000f30300000000000000000000
137-0000000000000000000000000108ab0003000000ef0300000000000009000000137+0000000000000000000000000108ae0003000000ef0300000000000009000000
138-0000000000000000000000006e6574207469746c650000001c00ab0001005000138+0000000000000000000000006e6574207469746c650000001c00ae0001005000
139-f303000000000000000000000000000000000000000000000108ac0003000000139+f303000000000000000000000000000000000000000000000108af0003000000
140-ef03000000000000090000000000000000000000000000006e6574207469746c140+ef03000000000000090000000000000000000000000000006e6574207469746c
141-650000001c00ac0001005000f303000000000000000000000000000000000000141+650000001c00af0001005000f303000000000000000000000000000000000000
142-000000000108ad0003000000ef03000000000000090000000000000000000000142+000000000108b00003000000ef03000000000000090000000000000000000000
143-000000006e6574207469746c650000001c00ad0001005000f303000000000000143+000000006e6574207469746c650000001c00b00001005000f303000000000000
144-000000000000000000000000000000000108ae0003000000ef03000000000000144+000000000000000000000000000000000108b10003000000ef03000000000000
145-090000000000000000000000000000006e6574207469746c650000001c00ae00145+090000000000000000000000000000006e6574207469746c650000001c00b100
146-01005000f303000000000000000000000000000000000000000000000108af00146+01005000f303000000000000000000000000000000000000000000000108b200
147-03000000ef03000000000000090000000000000000000000000000006e657420147+03000000ef03000000000000090000000000000000000000000000006e657420
148-7469746c650000001c00af0001005000f3030000000000000000000000000000148+7469746c650000001c00b20001005000f3030000000000000000000000000000
149-00000000000000000108b00003000000ef030000000000000900000000000000149+00000000000000000108b30003000000ef030000000000000900000000000000
150-00000000000000006e6574207469746c650000001c00b00001005000f3030000150+00000000000000006e6574207469746c650000001c00b30001005000f3030000
151-00000000000000000000000000000000000000000108b10003000000ef030000151+00000000000000000000000000000000000000000108b40003000000ef030000
152-00000000090000000000000000000000000000006e6574207469746c65000000152+00000000090000000000000000000000000000006e6574207469746c65000000
153-1c00b10001005000f30300000000000000000000000000000000000000000000153+1c00b40001005000f30300000000000000000000000000000000000000000000
154-0108b20003000000ef0300000000000009000000000000000000000000000000154+0108b50003000000ef0300000000000009000000000000000000000000000000
155-6e6574207469746c650000001c00b20001005000f30300000000000000000000155+6e6574207469746c650000001c00b50001005000f30300000000000000000000
156-0000000000000000000000000108b30003000000ef0300000000000009000000156+0000000000000000000000000108b60003000000ef0300000000000009000000
157-0000000000000000000000006e6574207469746c650000001c00b30001005000157+0000000000000000000000006e6574207469746c650000001c00b60001005000
158-f303000000000000000000000000000000000000000000000108b40003000000158+f303000000000000000000000000000000000000000000000108b70003000000
159-ef03000000000000090000000000000000000000000000006e6574207469746c159+ef03000000000000090000000000000000000000000000006e6574207469746c
160-650000001c00b40001005000f303000000000000000000000000000000000000160+650000001c00b70001005000f303000000000000000000000000000000000000
161-000000000108b50003000000ef03000000000000090000000000000000000000161+000000000108b80003000000ef03000000000000090000000000000000000000
162-000000006e6574207469746c650000001c00b50001005000f303000000000000162+000000006e6574207469746c650000001c00b80001005000f303000000000000
163-000000000000000000000000000000000108b60003000000ef03000000000000163+000000000000000000000000000000000108b90003000000ef03000000000000
164-090000000000000000000000000000006e6574207469746c650000001c00b600164+090000000000000000000000000000006e6574207469746c650000001c00b900
165-01005000f303000000000000000000000000000000000000000000000108b700165+01005000f303000000000000000000000000000000000000000000000108ba00
166-03000000ef03000000000000090000000000000000000000000000006e657420166+03000000ef03000000000000090000000000000000000000000000006e657420
167-7469746c650000001c00b70001005000f3030000000000000000000000000000167+7469746c650000001c00ba0001005000f3030000000000000000000000000000
168-00000000000000000108b80003000000ef030000000000000900000000000000168+00000000000000000108bb0003000000ef030000000000000900000000000000
169-00000000000000006e6574207469746c650000001c00b80001005000f3030000169+00000000000000006e6574207469746c650000001c00bb0001005000f3030000
170-00000000000000000000000000000000000000000108b90003000000ef030000170+00000000000000000000000000000000000000000108bc0003000000ef030000
171-00000000090000000000000000000000000000006e6574207469746c65000000171+00000000090000000000000000000000000000006e6574207469746c65000000
172-1c00b90001005000f30300000000000000000000000000000000000000000000172+1c00bc0001005000f30300000000000000000000000000000000000000000000
173-0108ba0003000000ef0300000000000009000000000000000000000000000000173+0108bd0003000000ef0300000000000009000000000000000000000000000000
174-6e6574207469746c650000001c00ba0001005000f30300000000000000000000174+6e6574207469746c650000001c00bd0001005000f30300000000000000000000
175-0000000000000000000000000108bb0003000000ef0300000000000009000000175+0000000000000000000000000108be0003000000ef0300000000000009000000
176-0000000000000000000000006e6574207469746c650000001c00bb0001005000176+0000000000000000000000006e6574207469746c650000001c00be0001005000
177-f303000000000000000000000000000000000000000000000108bc0003000000177+f303000000000000000000000000000000000000000000000108bf0003000000
178-ef03000000000000090000000000000000000000000000006e6574207469746c178+ef03000000000000090000000000000000000000000000006e6574207469746c
179-650000001c00bc0001005000f303000000000000000000000000000000000000179+650000001c00bf0001005000f303000000000000000000000000000000000000
180-000000000108bd0003000000ef03000000000000090000000000000000000000180+000000000108c00003000000ef03000000000000090000000000000000000000
181-000000006e6574207469746c650000001c00bd0001005000f303000000000000181+000000006e6574207469746c650000001c00c00001005000f303000000000000
182-000000000000000000000000000000000108be0003000000ef03000000000000182+000000000000000000000000000000000108c10003000000ef03000000000000
183-090000000000000000000000000000006e6574207469746c650000001c00be00183+090000000000000000000000000000006e6574207469746c650000001c00c100
184-01005000f303000000000000000000000000000000000000000000000108bf00184+01005000f303000000000000000000000000000000000000000000000108c200
185-03000000ef03000000000000090000000000000000000000000000006e657420185+03000000ef03000000000000090000000000000000000000000000006e657420
186-7469746c650000001c00bf0001005000f3030000000000000000000000000000186+7469746c650000001c00c20001005000f3030000000000000000000000000000
187-00000000000000000108c00003000000ef030000000000000900000000000000187+00000000000000000108c30003000000ef030000000000000900000000000000
188-00000000000000006e6574207469746c650000001c00c00001005000f3030000188+00000000000000006e6574207469746c650000001c00c30001005000f3030000
189-00000000000000000000000000000000000000000108c10003000000ef030000189+00000000000000000000000000000000000000000108c40003000000ef030000
190-00000000090000000000000000000000000000006e6574207469746c65000000190+00000000090000000000000000000000000000006e6574207469746c65000000
191-1c00c10001005000f30300000000000000000000000000000000000000000000191+1c00c40001005000f30300000000000000000000000000000000000000000000
192-0108c20003000000ef0300000000000009000000000000000000000000000000192+0108c50003000000ef0300000000000009000000000000000000000000000000
193-6e6574207469746c650000001c00c20001005000f30300000000000000000000193+6e6574207469746c650000001c00c50001005000f30300000000000000000000
194-0000000000000000000000000108c30003000000ef0300000000000009000000194+0000000000000000000000000108c60003000000ef0300000000000009000000
195-0000000000000000000000006e6574207469746c650000001c00c30001005000195+0000000000000000000000006e6574207469746c650000001c00c60001005000
196-f303000000000000000000000000000000000000000000000108c40003000000196+f303000000000000000000000000000000000000000000000108c70003000000
197-ef03000000000000090000000000000000000000000000006e6574207469746c197+ef03000000000000090000000000000000000000000000006e6574207469746c
198-650000001c00c40001005000f303000000000000000000000000000000000000198+650000001c00c70001005000f303000000000000000000000000000000000000
199-000000000108c50003000000ef03000000000000090000000000000000000000199+000000000108c80003000000ef03000000000000090000000000000000000000
200-000000006e6574207469746c650000001c00c50001005000f303000000000000200+000000006e6574207469746c650000001c00c80001005000f303000000000000
201-000000000000000000000000000000000108c60003000000ef03000000000000201+000000000000000000000000000000000108c90003000000ef03000000000000
202-090000000000000000000000000000006e6574207469746c650000001c00c600202+090000000000000000000000000000006e6574207469746c650000001c00c900
203-01005000f303000000000000000000000000000000000000000000000108c700203+01005000f303000000000000000000000000000000000000000000000108ca00
204-03000000ef03000000000000090000000000000000000000000000006e657420204+03000000ef03000000000000090000000000000000000000000000006e657420
205-7469746c650000001c00c70001005000f3030000000000000000000000000000205+7469746c650000001c00ca0001005000f3030000000000000000000000000000
206-00000000000000000108c80003000000ef030000000000000900000000000000206+00000000000000000108cb0003000000ef030000000000000900000000000000
207-00000000000000006e6574207469746c650000001c00c80001005000f3030000207+00000000000000006e6574207469746c650000001c00cb0001005000f3030000
208-00000000000000000000000000000000000000000108c90003000000ef030000208+00000000000000000000000000000000000000000108cc0003000000ef030000
209-00000000090000000000000000000000000000006e6574207469746c65000000209+00000000090000000000000000000000000000006e6574207469746c65000000
210-1c00c90001005000f30300000000000000000000000000000000000000000000210+1c00cc0001005000f30300000000000000000000000000000000000000000000
211-0108ca0003000000ef0300000000000009000000000000000000000000000000211+0108cd0003000000ef0300000000000009000000000000000000000000000000
212-6e6574207469746c650000001c00ca0001005000f30300000000000000000000212+6e6574207469746c650000001c00cd0001005000f30300000000000000000000
213-0000000000000000000000000108cb0003000000ef0300000000000009000000213+0000000000000000000000000108ce0003000000ef0300000000000009000000
214-0000000000000000000000006e6574207469746c650000001c00cb0001005000214+0000000000000000000000006e6574207469746c650000001c00ce0001005000
215-f303000000000000000000000000000000000000000000000108cc0003000000215+f303000000000000000000000000000000000000000000000108cf0003000000
216-ef03000000000000090000000000000000000000000000006e6574207469746c216+ef03000000000000090000000000000000000000000000006e6574207469746c
217-650000001c00cc0001005000f303000000000000000000000000000000000000217+650000001c00cf0001005000f303000000000000000000000000000000000000
218-000000000108cd0003000000ef03000000000000090000000000000000000000218+000000000108d00003000000ef03000000000000090000000000000000000000
219-000000006e6574207469746c650000001c00cd0001005000f303000000000000219+000000006e6574207469746c650000001c00d00001005000f303000000000000
220-000000000000000000000000000000000108ce0003000000ef03000000000000220+000000000000000000000000000000000108d10003000000ef03000000000000
221-090000000000000000000000000000006e6574207469746c650000001c00ce00221+090000000000000000000000000000006e6574207469746c650000001c00d100
222-01005000f303000000000000000000000000000000000000000000000108cf00222+01005000f303000000000000000000000000000000000000000000000108d200
223-03000000ef03000000000000090000000000000000000000000000006e657420223+03000000ef03000000000000090000000000000000000000000000006e657420
224-7469746c650000001c00cf0001005000f3030000000000000000000000000000224+7469746c650000001c00d20001005000f3030000000000000000000000000000
225-00000000000000000108d00003000000ef030000000000000900000000000000225+00000000000000000108d30003000000ef030000000000000900000000000000
226-00000000000000006e6574207469746c650000001c00d00001005000f3030000226+00000000000000006e6574207469746c650000001c00d30001005000f3030000
227-00000000000000000000000000000000000000000108d10003000000ef030000227+00000000000000000000000000000000000000000108d40003000000ef030000
228-00000000090000000000000000000000000000006e6574207469746c65000000228+00000000090000000000000000000000000000006e6574207469746c65000000
229-1c00d10001005000f30300000000000000000000000000000000000000000000229+1c00d40001005000f30300000000000000000000000000000000000000000000
230-0108d20003000000ef0300000000000009000000000000000000000000000000230+0108d50003000000ef0300000000000009000000000000000000000000000000
231-6e6574207469746c650000001c00d20001005000f30300000000000000000000231+6e6574207469746c650000001c00d50001005000f30300000000000000000000
232-0000000000000000000000000108d30003000000ef0300000000000009000000232+0000000000000000000000000108d60003000000ef0300000000000009000000
233-0000000000000000000000006e6574207469746c650000001c00d30001005000233+0000000000000000000000006e6574207469746c650000001c00d60001005000
234-f303000000000000000000000000000000000000000000000108d40003000000234+f303000000000000000000000000000000000000000000000108d70003000000
235-ef03000000000000090000000000000000000000000000006e6574207469746c235+ef03000000000000090000000000000000000000000000006e6574207469746c
236-650000001c00d40001005000f303000000000000000000000000000000000000236+650000001c00d70001005000f303000000000000000000000000000000000000
237-000000000108d50003000000ef03000000000000090000000000000000000000237+000000000108d80003000000ef03000000000000090000000000000000000000
238-000000006e6574207469746c650000001c00d50001005000f303000000000000238+000000006e6574207469746c650000001c00d80001005000f303000000000000
239-000000000000000000000000000000000108d60003000000ef03000000000000239+000000000000000000000000000000000108d90003000000ef03000000000000
240-090000000000000000000000000000006e6574207469746c650000001c00d600240+090000000000000000000000000000006e6574207469746c650000001c00d900
241-01005000f303000000000000000000000000000000000000000000000108d700241+01005000f303000000000000000000000000000000000000000000000108da00
242-03000000ef03000000000000090000000000000000000000000000006e657420242+03000000ef03000000000000090000000000000000000000000000006e657420
243-7469746c650000001c00d70001005000f3030000000000000000000000000000243+7469746c650000001c00da0001005000f3030000000000000000000000000000
244-00000000000000000108d80003000000ef030000000000000900000000000000244+00000000000000000108db0003000000ef030000000000000900000000000000
245-00000000000000006e6574207469746c650000001c00d80001005000f3030000245+00000000000000006e6574207469746c650000001c00db0001005000f3030000
246-00000000000000000000000000000000000000000108d90003000000ef030000246+00000000000000000000000000000000000000000108dc0003000000ef030000
247-00000000090000000000000000000000000000006e6574207469746c65000000247+00000000090000000000000000000000000000006e6574207469746c65000000
248-1c00d90001005000f30300000000000000000000000000000000000000000000248+1c00dc0001005000f30300000000000000000000000000000000000000000000
249-0108da0003000000ef0300000000000009000000000000000000000000000000249+0108dd0003000000ef0300000000000009000000000000000000000000000000
250-6e6574207469746c650000001c00da0001005000f30300000000000000000000250+6e6574207469746c650000001c00dd0001005000f30300000000000000000000
251-0000000000000000000000000108db0003000000ef0300000000000009000000251+0000000000000000000000000108de0003000000ef0300000000000009000000
252-0000000000000000000000006e6574207469746c650000001c00db0001005000252+0000000000000000000000006e6574207469746c650000001c00de0001005000
253-f303000000000000000000000000000000000000000000000108dc0003000000253+f303000000000000000000000000000000000000000000000108df0003000000
254-ef03000000000000090000000000000000000000000000006e6574207469746c254+ef03000000000000090000000000000000000000000000006e6574207469746c
255-650000001c00dc0001005000f303000000000000000000000000000000000000255+650000001c00df0001005000f303000000000000000000000000000000000000
256-000000000108dd0003000000ef03000000000000090000000000000000000000256+000000000108e00003000000ef03000000000000090000000000000000000000
257-000000006e6574207469746c650000001c00dd0001005000f303000000000000257+000000006e6574207469746c650000001c00e00001005000f303000000000000
258-000000000000000000000000000000000108de0003000000ef03000000000000258+000000000000000000000000000000000108e10003000000ef03000000000000
259-090000000000000000000000000000006e6574207469746c650000001c00de00259+090000000000000000000000000000006e6574207469746c650000001c00e100
260-01005000f303000000000000000000000000000000000000000000000108df00260+01005000f303000000000000000000000000000000000000000000000108e200
261-03000000ef03000000000000090000000000000000000000000000006e657420261+03000000ef03000000000000090000000000000000000000000000006e657420
262-7469746c650000001c00df0001005000f3030000000000000000000000000000262+7469746c650000001c00e20001005000f3030000000000000000000000000000
263-00000000000000000108e00003000000ef030000000000000900000000000000263+00000000000000000108e30003000000ef030000000000000900000000000000
264-00000000000000006e6574207469746c650000001c00e00001005000f3030000264+00000000000000006e6574207469746c650000001c00e30001005000f3030000
265-00000000000000000000000000000000000000000108e10003000000ef030000265+00000000000000000000000000000000000000000108e40003000000ef030000
266-00000000090000000000000000000000000000006e6574207469746c65000000266+00000000090000000000000000000000000000006e6574207469746c65000000
267-1c00e10001005000f30300000000000000000000000000000000000000000000267+1c00e40001005000f30300000000000000000000000000000000000000000000
268-0108e20003000000ef0300000000000009000000000000000000000000000000268+0108e50003000000ef0300000000000009000000000000000000000000000000
269-6e6574207469746c650000001c00e20001005000f30300000000000000000000269+6e6574207469746c650000001c00e50001005000f30300000000000000000000
270-0000000000000000000000000108e30003000000ef0300000000000009000000270+0000000000000000000000000108e60003000000ef0300000000000009000000
271-0000000000000000000000006e6574207469746c650000001c00e30001005000271+0000000000000000000000006e6574207469746c650000001c00e60001005000
272-f303000000000000000000000000000000000000000000000108e40003000000272+f303000000000000000000000000000000000000000000000108e70003000000
273-ef03000000000000090000000000000000000000000000006e6574207469746c273+ef03000000000000090000000000000000000000000000006e6574207469746c
274-650000001c00e40001005000f303000000000000000000000000000000000000274+650000001c00e70001005000f303000000000000000000000000000000000000
275-000000000108e50003000000ef03000000000000090000000000000000000000275+000000000108e80003000000ef03000000000000090000000000000000000000
276-000000006e6574207469746c650000001c00e50001005000f303000000000000276+000000006e6574207469746c650000001c00e80001005000f303000000000000
277-000000000000000000000000000000000108e60003000000ef03000000000000277+000000000000000000000000000000000108e90003000000ef03000000000000
278-090000000000000000000000000000006e6574207469746c650000001c00e600278+090000000000000000000000000000006e6574207469746c650000001c00e900
279-01005000f303000000000000000000000000000000000000000000000108e700279+01005000f303000000000000000000000000000000000000000000000108ea00
280-03000000ef03000000000000090000000000000000000000000000006e657420280+03000000ef03000000000000090000000000000000000000000000006e657420
281-7469746c650000001c00e70001005000f3030000000000000000000000000000281+7469746c650000001c00ea0001005000f3030000000000000000000000000000
282-00000000000000000108e80003000000ef030000000000000900000000000000282+00000000000000000108eb0003000000ef030000000000000900000000000000
283-00000000000000006e6574207469746c650000001c00e80001005000f3030000283+00000000000000006e6574207469746c650000001c00eb0001005000f3030000
284-00000000000000000000000000000000000000000108e90003000000ef030000284+00000000000000000000000000000000000000000108ec0003000000ef030000
285-00000000090000000000000000000000000000006e6574207469746c65000000285+00000000090000000000000000000000000000006e6574207469746c65000000
286-1c00e90001005000f30300000000000000000000000000000000000000000000286+1c00ec0001005000f30300000000000000000000000000000000000000000000
287-0108ea0003000000ef0300000000000009000000000000000000000000000000287+0108ed0003000000ef0300000000000009000000000000000000000000000000
288-6e6574207469746c650000001c00ea0001005000f30300000000000000000000288+6e6574207469746c650000001c00ed0001005000f30300000000000000000000
289-0000000000000000000000000108eb0003000000ef0300000000000009000000289+0000000000000000000000000108ee0003000000ef0300000000000009000000
290-0000000000000000000000006e6574207469746c650000001c00eb0001005000290+0000000000000000000000006e6574207469746c650000001c00ee0001005000
291-f303000000000000000000000000000000000000000000000108ec0003000000291+f303000000000000000000000000000000000000000000000108ef0003000000
292-ef03000000000000090000000000000000000000000000006e6574207469746c292+ef03000000000000090000000000000000000000000000006e6574207469746c
293-650000001c00ec0001005000f303000000000000000000000000000000000000293+650000001c00ef0001005000f303000000000000000000000000000000000000
294-000000000108ed0003000000ef03000000000000090000000000000000000000294+000000000108f00003000000ef03000000000000090000000000000000000000
295-000000006e6574207469746c650000001c00ed0001005000f303000000000000295+000000006e6574207469746c650000001c00f00001005000f303000000000000
296-000000000000000000000000000000000108ee0003000000ef03000000000000296+000000000000000000000000000000000108f10003000000ef03000000000000
297-090000000000000000000000000000006e6574207469746c650000001c00ee00297+090000000000000000000000000000006e6574207469746c650000001c00f100
298-01005000f303000000000000000000000000000000000000000000000108ef00298+01005000f303000000000000000000000000000000000000000000000108f200
299-03000000ef03000000000000090000000000000000000000000000006e657420299+03000000ef03000000000000090000000000000000000000000000006e657420
300-7469746c650000001c00ef0001005000f3030000000000000000000000000000300+7469746c650000001c00f20001005000f3030000000000000000000000000000
301-00000000000000000108f00003000000ef030000000000000900000000000000301+00000000000000000108f30003000000ef030000000000000900000000000000
302-00000000000000006e6574207469746c650000001c00f00001005000f3030000302+00000000000000006e6574207469746c650000001c00f30001005000f3030000
303-00000000000000000000000000000000000000000108f10003000000ef030000303+00000000000000000000000000000000000000000108f40003000000ef030000
304-00000000090000000000000000000000000000006e6574207469746c65000000304+00000000090000000000000000000000000000006e6574207469746c65000000
305-1c00f10001005000f30300000000000000000000000000000000000000000000305+1c00f40001005000f30300000000000000000000000000000000000000000000
306-0108f20003000000ef0300000000000009000000000000000000000000000000306+0108f50003000000ef0300000000000009000000000000000000000000000000
307-6e6574207469746c650000001c00f20001005000f30300000000000000000000307+6e6574207469746c650000001c00f50001005000f30300000000000000000000
308-0000000000000000000000000108f30003000000ef0300000000000009000000308+0000000000000000000000000108f60003000000ef0300000000000009000000
309-0000000000000000000000006e6574207469746c650000001c00f30001005000309+0000000000000000000000006e6574207469746c650000001c00f60001005000
310-f303000000000000000000000000000000000000000000000108f40003000000310+f303000000000000000000000000000000000000000000000108f70003000000
311-ef03000000000000090000000000000000000000000000006e6574207469746c311+ef03000000000000090000000000000000000000000000006e6574207469746c
312-650000001c00f40001005000f303000000000000000000000000000000000000312+650000001c00f70001005000f303000000000000000000000000000000000000
313-000000000108f50003000000ef03000000000000090000000000000000000000313+000000000108f80003000000ef03000000000000090000000000000000000000
314-000000006e6574207469746c650000001c00f50001005000f303000000000000314+000000006e6574207469746c650000001c00f80001005000f303000000000000
315-000000000000000000000000000000000108f60003000000ef03000000000000315+000000000000000000000000000000000108f90003000000ef03000000000000
316-090000000000000000000000000000006e6574207469746c650000001c00f600316+090000000000000000000000000000006e6574207469746c650000001c00f900
317-01005000f303000000000000000000000000000000000000000000000108f700317+01005000f303000000000000000000000000000000000000000000000108fa00
318-03000000ef03000000000000090000000000000000000000000000006e657420318+03000000ef03000000000000090000000000000000000000000000006e657420
319-7469746c650000001c00f70001005000f3030000000000000000000000000000319+7469746c650000001c00fa0001005000f3030000000000000000000000000000
320-00000000000000000108f80003000000ef030000000000000900000000000000320+00000000000000000108fb0003000000ef030000000000000900000000000000
321-00000000000000006e6574207469746c650000001c00f80001005000f3030000321+00000000000000006e6574207469746c650000001c00fb0001005000f3030000
322-00000000000000000000000000000000000000000108f90003000000ef030000322+00000000000000000000000000000000000000000108fc0003000000ef030000
323-00000000090000000000000000000000000000006e6574207469746c65000000323+00000000090000000000000000000000000000006e6574207469746c65000000
324-1c00f90001005000f30300000000000000000000000000000000000000000000324+1c00fc0001005000f30300000000000000000000000000000000000000000000
325-0108fa0003000000ef0300000000000009000000000000000000000000000000325+0108fd0003000000ef0300000000000009000000000000000000000000000000
326-6e6574207469746c650000001c00fa0001005000f30300000000000000000000326+6e6574207469746c650000001c00fd0001005000f30300000000000000000000
327-0000000000000000000000000108fb0003000000ef0300000000000009000000327+0000000000000000000000000108fe0003000000ef0300000000000009000000
328-0000000000000000000000006e6574207469746c650000001c00fb0001005000328+0000000000000000000000006e6574207469746c650000001c00fe0001005000
329-f303000000000000000000000000000000000000000000000108fc0003000000329+f303000000000000000000000000000000000000000000000108ff0003000000
330-ef03000000000000090000000000000000000000000000006e6574207469746c330+ef03000000000000090000000000000000000000000000006e6574207469746c
331-650000001c00fc0001005000f303000000000000000000000000000000000000331+650000001c00ff0001005000f303000000000000000000000000000000000000
332-000000000108fd0003000000ef03000000000000090000000000000000000000332+000000000108000103000000ef03000000000000090000000000000000000000
333-000000006e6574207469746c650000001c00fd0001005000f303000000000000333+000000006e6574207469746c650000001c00000101005000f303000000000000
334-000000000000000000000000000000000108fe0003000000ef03000000000000334+000000000000000000000000000000000108010103000000ef03000000000000
335-090000000000000000000000000000006e6574207469746c650000001c00fe00335+090000000000000000000000000000006e6574207469746c650000001c000101
336-01005000f303000000000000000000000000000000000000000000000108ff00336+01005000f3030000000000000000000000000000000000000000000001080201
337-03000000ef03000000000000090000000000000000000000000000006e657420337+03000000ef03000000000000090000000000000000000000000000006e657420
338-7469746c650000001c00ff0001005000f3030000000000000000000000000000338+7469746c650000001c00020101005000f3030000000000000000000000000000
339-00000000000000000108000103000000ef030000000000000900000000000000339+00000000000000000108030103000000ef030000000000000900000000000000
340-00000000000000006e6574207469746c650000001c00000101005000f3030000340+00000000000000006e6574207469746c650000001c00030101005000f3030000
341-00000000000000000000000000000000000000000108010103000000ef030000341+00000000000000000000000000000000000000000108040103000000ef030000
342-00000000090000000000000000000000000000006e6574207469746c65000000342+00000000090000000000000000000000000000006e6574207469746c65000000
343-1c00010101005000f30300000000000000000000000000000000000000000000343+1c00040101005000f30300000000000000000000000000000000000000000000
344-0108020103000000ef0300000000000009000000000000000000000000000000344+0108050103000000ef0300000000000009000000000000000000000000000000
345-6e6574207469746c650000001c00020101005000f30300000000000000000000345+6e6574207469746c650000001c00050101005000f30300000000000000000000
346-0000000000000000000000000108030103000000ef0300000000000009000000346+0000000000000000000000000108060103000000ef0300000000000009000000
347-0000000000000000000000006e6574207469746c650000001c00030101005000347+0000000000000000000000006e6574207469746c650000001c00060101005000
348-f303000000000000000000000000000000000000000000000108040103000000348+f303000000000000000000000000000000000000000000000108070103000000
349-ef03000000000000090000000000000000000000000000006e6574207469746c349+ef03000000000000090000000000000000000000000000006e6574207469746c
350-650000001c00040101005000f303000000000000000000000000000000000000350+650000001c00070101005000f303000000000000000000000000000000000000
351-000000000108050103000000ef03000000000000090000000000000000000000351+000000000108080103000000ef03000000000000090000000000000000000000
352-000000006e6574207469746c650000001c00050101005000f303000000000000352+000000006e6574207469746c650000001c00080101005000f303000000000000
353-000000000000000000000000000000000108060103000000ef03000000000000353+000000000000000000000000000000000108090103000000ef03000000000000
354-090000000000000000000000000000006e6574207469746c650000001c000601354+090000000000000000000000000000006e6574207469746c650000001c000901
355-01005000f3030000000000000000000000000000000000000000000001080701355+01005000f3030000000000000000000000000000000000000000000001080a01
356-03000000ef03000000000000090000000000000000000000000000006e657420356+03000000ef03000000000000090000000000000000000000000000006e657420
357-7469746c650000001c00070101005000f3030000000000000000000000000000357+7469746c650000001c000a0101005000f3030000000000000000000000000000
358-00000000000000000108080103000000ef030000000000000900000000000000358+000000000000000001080b0103000000ef030000000000000900000000000000
359-00000000000000006e6574207469746c650000001c00080101005000f3030000359+00000000000000006e6574207469746c650000001c000b0101005000f3030000
360-00000000000000000000000000000000000000000108090103000000ef030000360+000000000000000000000000000000000000000001080c0103000000ef030000
361-00000000090000000000000000000000000000006e6574207469746c65000000361+00000000090000000000000000000000000000006e6574207469746c65000000
362-1c00090101005000f30300000000000000000000000000000000000000000000362+1c000c0101005000f30300000000000000000000000000000000000000000000
363-01080a0103000000ef0300000000000009000000000000000000000000000000363+01080d0103000000ef0300000000000009000000000000000000000000000000
364-6e6574207469746c650000001c000a0101005000f30300000000000000000000364+6e6574207469746c650000001c000d0101005000f30300000000000000000000
365-00000000000000000000000001080b0103000000ef0300000000000009000000365+00000000000000000000000001080e0103000000ef0300000000000009000000
366-0000000000000000000000006e6574207469746c650000001c000b0101005000366+0000000000000000000000006e6574207469746c650000001c000e0101005000
367-f3030000000000000000000000000000000000000000000001080c0103000000367+f3030000000000000000000000000000000000000000000001080f0103000000
368-ef03000000000000090000000000000000000000000000006e6574207469746c368+ef03000000000000090000000000000000000000000000006e6574207469746c
369-650000001c000c0101005000f303000000000000000000000000000000000000369+650000001c000f0101005000f303000000000000000000000000000000000000
370-0000000001080d0103000000ef03000000000000090000000000000000000000370+000000000108100103000000ef03000000000000090000000000000000000000
371-000000006e6574207469746c650000001c000d0101005000f303000000000000371+000000006e6574207469746c650000001c00100101005000f303000000000000
372-0000000000000000000000000000000001080e0103000000ef03000000000000372+000000000000000000000000000000000108110103000000ef03000000000000
373-090000000000000000000000000000006e6574207469746c650000001c000e01373+090000000000000000000000000000006e6574207469746c650000001c001101
374-01005000f3030000000000000000000000000000000000000000000001080f01374+01005000f3030000000000000000000000000000000000000000000001081201
375-03000000ef03000000000000090000000000000000000000000000006e657420375+03000000ef03000000000000090000000000000000000000000000006e657420
376-7469746c650000001c000f0101005000f3030000000000000000000000000000376+7469746c650000001c00120101005000f3030000000000000000000000000000
377-00000000000000000108100103000000ef030000000000000900000000000000377+00000000000000000108130103000000ef030000000000000900000000000000
378-00000000000000006e6574207469746c650000001c00100101005000f3030000378+00000000000000006e6574207469746c650000001c00130101005000f3030000
379-00000000000000000000000000000000000000000108110103000000ef030000379+00000000000000000000000000000000000000000108140103000000ef030000
380-00000000090000000000000000000000000000006e6574207469746c65000000380+00000000090000000000000000000000000000006e6574207469746c65000000
381-1c00110101005000f30300000000000000000000000000000000000000000000381+1c00140101005000f30300000000000000000000000000000000000000000000
382-0108120103000000ef0300000000000009000000000000000000000000000000382+0108150103000000ef0300000000000009000000000000000000000000000000
383-6e6574207469746c650000001c00120101005000f30300000000000000000000383+6e6574207469746c650000001c00150101005000f30300000000000000000000
384-0000000000000000000000000108130103000000ef0300000000000009000000384+0000000000000000000000000108160103000000ef0300000000000009000000
385-0000000000000000000000006e6574207469746c650000001c00130101005000385+0000000000000000000000006e6574207469746c650000001c00160101005000
386-f303000000000000000000000000000000000000000000000108140103000000386+f303000000000000000000000000000000000000000000000108170103000000
387-ef03000000000000090000000000000000000000000000006e6574207469746c387+ef03000000000000090000000000000000000000000000006e6574207469746c
388-650000001c00140101005000f303000000000000000000000000000000000000388+650000001c00170101005000f303000000000000000000000000000000000000
389-000000000108150103000000ef03000000000000090000000000000000000000389+000000000108180103000000ef03000000000000090000000000000000000000
390-000000006e6574207469746c650000001c00150101005000f303000000000000390+000000006e6574207469746c650000001c00180101005000f303000000000000
391-000000000000000000000000000000000108160103000000ef03000000000000391+000000000000000000000000000000000108190103000000ef03000000000000
392-090000000000000000000000000000006e6574207469746c650000001c001601392+090000000000000000000000000000006e6574207469746c650000001c001901
393-01005000f3030000000000000000000000000000000000000000000001081701393+01005000f3030000000000000000000000000000000000000000000001081a01
394-03000000ef03000000000000090000000000000000000000000000006e657420394+03000000ef03000000000000090000000000000000000000000000006e657420
395-7469746c650000001c00170101005000f3030000000000000000000000000000395+7469746c650000001c001a0101005000f3030000000000000000000000000000
396-00000000000000000108180103000000ef030000000000000900000000000000396+000000000000000001081b0103000000ef030000000000000900000000000000
397-00000000000000006e6574207469746c650000001c00180101005000f3030000397+00000000000000006e6574207469746c650000001c001b0101005000f3030000
398-00000000000000000000000000000000000000000108190103000000ef030000398+000000000000000000000000000000000000000001081c0103000000ef030000
399-00000000090000000000000000000000000000006e6574207469746c65000000399+00000000090000000000000000000000000000006e6574207469746c65000000
400-1c00190101005000f30300000000000000000000000000000000000000000000400+1c001c0101005000f30300000000000000000000000000000000000000000000
401-01081a0103000000ef0300000000000009000000000000000000000000000000401+01081d0103000000ef0300000000000009000000000000000000000000000000
402-6e6574207469746c650000001c001a0101005000f30300000000000000000000402+6e6574207469746c650000001c001d0101005000f30300000000000000000000
403-00000000000000000000000001081b0103000000ef0300000000000009000000403+00000000000000000000000001081e0103000000ef0300000000000009000000
404-0000000000000000000000006e6574207469746c650000001c001b0101005000404+0000000000000000000000006e6574207469746c650000001c001e0101005000
405-f3030000000000000000000000000000000000000000000001081c0103000000405+f3030000000000000000000000000000000000000000000001081f0103000000
406-ef03000000000000090000000000000000000000000000006e6574207469746c406+ef03000000000000090000000000000000000000000000006e6574207469746c
407-650000001c001c0101005000f303000000000000000000000000000000000000407+650000001c001f0101005000f303000000000000000000000000000000000000
408-0000000001081d0103000000ef03000000000000090000000000000000000000408+000000000108200103000000ef03000000000000090000000000000000000000
409-000000006e6574207469746c650000001c001d0101005000f303000000000000409+000000006e6574207469746c650000001c00200101005000f303000000000000
410-0000000000000000000000000000000001081e0103000000ef03000000000000410+000000000000000000000000000000000108210103000000ef03000000000000
411-090000000000000000000000000000006e6574207469746c650000001c001e01411+090000000000000000000000000000006e6574207469746c650000001c002101
412-01005000f3030000000000000000000000000000000000000000000001081f01412+01005000f3030000000000000000000000000000000000000000000001082201
413-03000000ef03000000000000090000000000000000000000000000006e657420413+03000000ef03000000000000090000000000000000000000000000006e657420
414-7469746c650000001c001f0101005000f3030000000000000000000000000000414+7469746c650000001c00220101005000f3030000000000000000000000000000
415-00000000000000000108200103000000ef030000000000000900000000000000415+00000000000000000108230103000000ef030000000000000900000000000000
416-00000000000000006e6574207469746c650000001c00200101005000f3030000416+00000000000000006e6574207469746c650000001c00230101005000f3030000
417-00000000000000000000000000000000000000000108210103000000ef030000417+00000000000000000000000000000000000000000108240103000000ef030000
418-00000000090000000000000000000000000000006e6574207469746c65000000418+00000000090000000000000000000000000000006e6574207469746c65000000
419-1c00210101005000f30300000000000000000000000000000000000000000000419+1c00240101005000f30300000000000000000000000000000000000000000000
420-0108220103000000ef0300000000000009000000000000000000000000000000420+0108250103000000ef0300000000000009000000000000000000000000000000
421-6e6574207469746c650000001c00220101005000f30300000000000000000000421+6e6574207469746c650000001c00250101005000f30300000000000000000000
422-0000000000000000000000000108230103000000ef0300000000000009000000422+0000000000000000000000000108260103000000ef0300000000000009000000
423-0000000000000000000000006e6574207469746c650000001c00230101005000423+0000000000000000000000006e6574207469746c650000001c00260101005000
424-f303000000000000000000000000000000000000000000000108240103000000424+f303000000000000000000000000000000000000000000000108270103000000
425-ef03000000000000090000000000000000000000000000006e6574207469746c425+ef03000000000000090000000000000000000000000000006e6574207469746c
426-650000001c00240101005000f303000000000000000000000000000000000000426+650000001c00270101005000f303000000000000000000000000000000000000
427-000000000108250103000000ef03000000000000090000000000000000000000427+000000000108280103000000ef03000000000000090000000000000000000000
428-000000006e6574207469746c650000001c00250101005000f303000000000000428+000000006e6574207469746c650000001c00280101005000f303000000000000
429-000000000000000000000000000000000108260103000000ef03000000000000429+000000000000000000000000000000000108290103000000ef03000000000000
430-090000000000000000000000000000006e6574207469746c650000001c002601430+090000000000000000000000000000006e6574207469746c650000001c002901
431-01005000f3030000000000000000000000000000000000000000000001082701431+01005000f3030000000000000000000000000000000000000000000001082a01
432-03000000ef03000000000000090000000000000000000000000000006e657420432+03000000ef03000000000000090000000000000000000000000000006e657420
433-7469746c650000001c00270101005000f3030000000000000000000000000000433+7469746c650000001c002a0101005000f3030000000000000000000000000000
434-00000000000000000108280103000000ef030000000000000900000000000000434+000000000000000001082b0103000000ef030000000000000900000000000000
435-00000000000000006e6574207469746c650000001c00280101005000f3030000435+00000000000000006e6574207469746c650000001c002b0101005000f3030000
436-00000000000000000000000000000000000000000108290103000000ef030000436+000000000000000000000000000000000000000001082c0103000000ef030000
437-00000000090000000000000000000000000000006e6574207469746c65000000437+00000000090000000000000000000000000000006e6574207469746c65000000
438-1c00290101005000f30300000000000000000000000000000000000000000000438+1c002c0101005000f30300000000000000000000000000000000000000000000
439-01082a0103000000ef0300000000000009000000000000000000000000000000439+01082d0103000000ef0300000000000009000000000000000000000000000000
440-6e6574207469746c650000001c002a0101005000f30300000000000000000000440+6e6574207469746c650000001c002d0101005000f30300000000000000000000
441-00000000000000000000000001082b0103000000ef0300000000000009000000441+00000000000000000000000001082e0103000000ef0300000000000009000000
442-0000000000000000000000006e6574207469746c650000001c002b0101005000442+0000000000000000000000006e6574207469746c650000001c002e0101005000
443-f3030000000000000000000000000000000000000000000001082c0103000000443+f3030000000000000000000000000000000000000000000001082f0103000000
444-ef03000000000000090000000000000000000000000000006e6574207469746c444+ef03000000000000090000000000000000000000000000006e6574207469746c
445-650000001c002c0101005000f303000000000000000000000000000000000000445+650000001c002f0101005000f303000000000000000000000000000000000000
446-0000000001082d0103000000ef03000000000000090000000000000000000000446+000000000108300103000000ef03000000000000090000000000000000000000
447-000000006e6574207469746c650000001c002d0101005000f303000000000000447+000000006e6574207469746c650000001c00300101005000f303000000000000
448-0000000000000000000000000000000001082e0103000000ef03000000000000448+000000000000000000000000000000000108310103000000ef03000000000000
449-090000000000000000000000000000006e6574207469746c650000001c002e01449+090000000000000000000000000000006e6574207469746c650000001c003101
450-01005000f3030000000000000000000000000000000000000000000001082f01450+01005000f3030000000000000000000000000000000000000000000001083201
451-03000000ef03000000000000090000000000000000000000000000006e657420451+03000000ef03000000000000090000000000000000000000000000006e657420
452-7469746c650000001c002f0101005000f3030000000000000000000000000000452+7469746c650000001c00320101005000f3030000000000000000000000000000
453-00000000000000000108300103000000ef030000000000000900000000000000453+00000000000000000108330103000000ef030000000000000900000000000000
454-00000000000000006e6574207469746c650000001c00300101005000f3030000454+00000000000000006e6574207469746c650000001c00330101005000f3030000
455-00000000000000000000000000000000000000000108310103000000ef030000455+00000000000000000000000000000000000000000108340103000000ef030000
456-00000000090000000000000000000000000000006e6574207469746c65000000456+00000000090000000000000000000000000000006e6574207469746c65000000
457-1c00310101005000f30300000000000000000000000000000000000000000000457+1c00340101005000f30300000000000000000000000000000000000000000000
458-0108320103000000ef0300000000000009000000000000000000000000000000458+0108350103000000ef0300000000000009000000000000000000000000000000
459-6e6574207469746c650000001c00320101005000f30300000000000000000000459+6e6574207469746c650000001c00350101005000f30300000000000000000000
460-0000000000000000000000000108330103000000ef0300000000000009000000460+0000000000000000000000000108360103000000ef0300000000000009000000
461-0000000000000000000000006e6574207469746c650000001c00330101005000461+0000000000000000000000006e6574207469746c650000001c00360101005000
462-f303000000000000000000000000000000000000000000000108340103000000462+f303000000000000000000000000000000000000000000000108370103000000
463-ef03000000000000090000000000000000000000000000006e6574207469746c463+ef03000000000000090000000000000000000000000000006e6574207469746c
464-650000001c00340101005000f303000000000000000000000000000000000000464+650000001c00370101005000f303000000000000000000000000000000000000
465-000000000108350103000000ef03000000000000090000000000000000000000465+000000000108380103000000ef03000000000000090000000000000000000000
466-000000006e6574207469746c650000001c00350101005000f303000000000000466+000000006e6574207469746c650000001c00380101005000f303000000000000
467-000000000000000000000000000000000108360103000000ef03000000000000467+000000000000000000000000000000000108390103000000ef03000000000000
468-090000000000000000000000000000006e6574207469746c650000001c003601468+090000000000000000000000000000006e6574207469746c650000001c003901
469-01005000f3030000000000000000000000000000000000000000000001083701469+01005000f3030000000000000000000000000000000000000000000001083a01
470-03000000ef03000000000000090000000000000000000000000000006e657420470+03000000ef03000000000000090000000000000000000000000000006e657420
471-7469746c650000001c00370101005000f3030000000000000000000000000000471+7469746c650000001c003a0101005000f3030000000000000000000000000000
472-00000000000000000108380103000000ef030000000000000900000000000000472+000000000000000001083b0103000000ef030000000000000900000000000000
473-00000000000000006e6574207469746c650000001c00380101005000f3030000473+00000000000000006e6574207469746c650000001c003b0101005000f3030000
474-00000000000000000000000000000000000000000108390103000000ef030000474+000000000000000000000000000000000000000001083c0103000000ef030000
475-00000000090000000000000000000000000000006e6574207469746c65000000475+00000000090000000000000000000000000000006e6574207469746c65000000
476-1c00390101005000f30300000000000000000000000000000000000000000000476+1c003c0101005000f30300000000000000000000000000000000000000000000
477-01083a0103000000ef0300000000000009000000000000000000000000000000477+01083d0103000000ef0300000000000009000000000000000000000000000000
478-6e6574207469746c650000001c003a0101005000f30300000000000000000000478+6e6574207469746c650000001c003d0101005000f30300000000000000000000
479-00000000000000000000000001083b0103000000ef0300000000000009000000479+00000000000000000000000001083e0103000000ef0300000000000009000000
480-0000000000000000000000006e6574207469746c650000001c003b0101005000480+0000000000000000000000006e6574207469746c650000001c003e0101005000
481-f3030000000000000000000000000000000000000000000001083c0103000000481+f3030000000000000000000000000000000000000000000001083f0103000000
482-ef03000000000000090000000000000000000000000000006e6574207469746c482+ef03000000000000090000000000000000000000000000006e6574207469746c
483-650000001c003c0101005000f303000000000000000000000000000000000000483+650000001c003f0101005000f303000000000000000000000000000000000000
484-0000000001083d0103000000ef03000000000000090000000000000000000000484+000000000108400103000000ef03000000000000090000000000000000000000
485-000000006e6574207469746c650000001c003d0101005000f303000000000000485+000000006e6574207469746c650000001c00400101005000f303000000000000
486-0000000000000000000000000000000001083e0103000000ef03000000000000486+000000000000000000000000000000000108410103000000ef03000000000000
487-090000000000000000000000000000006e6574207469746c650000001c003e01487+090000000000000000000000000000006e6574207469746c650000001c004101
488-01005000f3030000000000000000000000000000000000000000000001083f01488+01005000f3030000000000000000000000000000000000000000000001084201
489-03000000ef03000000000000090000000000000000000000000000006e657420489+03000000ef03000000000000090000000000000000000000000000006e657420
490-7469746c650000001c003f0101005000f3030000000000000000000000000000490+7469746c650000001c00420101005000f3030000000000000000000000000000
491-00000000000000000108400103000000ef030000000000000900000000000000491+00000000000000000108430103000000ef030000000000000900000000000000
492-00000000000000006e6574207469746c650000001c00400101005000f3030000492+00000000000000006e6574207469746c650000001c00430101005000f3030000
493-00000000000000000000000000000000000000000108410103000000ef030000493+00000000000000000000000000000000000000000108440103000000ef030000
494-00000000090000000000000000000000000000006e6574207469746c65000000494+00000000090000000000000000000000000000006e6574207469746c65000000
495-1c00410101005000f30300000000000000000000000000000000000000000000495+1c00440101005000f30300000000000000000000000000000000000000000000
496-0108420103000000ef0300000000000009000000000000000000000000000000496+0108450103000000ef0300000000000009000000000000000000000000000000
497-6e6574207469746c650000001c00420101005000f30300000000000000000000497+6e6574207469746c650000001c00450101005000f30300000000000000000000
498-0000000000000000000000000108430103000000ef0300000000000009000000498+0000000000000000000000000108460103000000ef0300000000000009000000
499-0000000000000000000000006e6574207469746c650000001c00430101005000499+0000000000000000000000006e6574207469746c650000001c00460101005000
500-f303000000000000000000000000000000000000000000000108440103000000500+f303000000000000000000000000000000000000000000000108470103000000
501-ef03000000000000090000000000000000000000000000006e6574207469746c501+ef03000000000000090000000000000000000000000000006e6574207469746c
502-650000001c00440101005000f303000000000000000000000000000000000000502+650000001c00470101005000f303000000000000000000000000000000000000
503-000000000108450103000000ef03000000000000090000000000000000000000503+000000000108480103000000ef03000000000000090000000000000000000000
504-000000006e6574207469746c650000001c00450101005000f303000000000000504+000000006e6574207469746c650000001c00480101005000f303000000000000
505-000000000000000000000000000000000108460103000000ef03000000000000505+000000000000000000000000000000000108490103000000ef03000000000000
506-090000000000000000000000000000006e6574207469746c650000001c004601506+090000000000000000000000000000006e6574207469746c650000001c004901
507-01005000f3030000000000000000000000000000000000000000000001084701507+01005000f3030000000000000000000000000000000000000000000001084a01
508-03000000ef03000000000000090000000000000000000000000000006e657420508+03000000ef03000000000000090000000000000000000000000000006e657420
509-7469746c650000001c00470101005000f3030000000000000000000000000000509+7469746c650000001c004a0101005000f3030000000000000000000000000000
510-00000000000000000108480103000000ef030000000000000900000000000000510+000000000000000001084b0103000000ef030000000000000900000000000000
511-00000000000000006e6574207469746c650000001c00480101005000f3030000511+00000000000000006e6574207469746c650000001c004b0101005000f3030000
512-00000000000000000000000000000000000000000108490103000000ef030000512+000000000000000000000000000000000000000001084c0103000000ef030000
513-00000000090000000000000000000000000000006e6574207469746c65000000513+00000000090000000000000000000000000000006e6574207469746c65000000
514-1c00490101005000f30300000000000000000000000000000000000000000000514+1c004c0101005000f30300000000000000000000000000000000000000000000
515-01084a0103000000ef0300000000000009000000000000000000000000000000515+01084d0103000000ef0300000000000009000000000000000000000000000000
516-6e6574207469746c650000001c004a0101005000f30300000000000000000000516+6e6574207469746c650000001c004d0101005000f30300000000000000000000
517-00000000000000000000000001084b0103000000ef0300000000000009000000517+00000000000000000000000001084e0103000000ef0300000000000009000000
518-0000000000000000000000006e6574207469746c650000001c004b0101005000518+0000000000000000000000006e6574207469746c650000001c004e0101005000
519-f3030000000000000000000000000000000000000000000001084c0103000000519+f3030000000000000000000000000000000000000000000001084f0103000000
520-ef03000000000000090000000000000000000000000000006e6574207469746c520+ef03000000000000090000000000000000000000000000006e6574207469746c
521-650000001c004c0101005000f303000000000000000000000000000000000000521+650000001c004f0101005000f303000000000000000000000000000000000000
522-0000000001084d0103000000ef03000000000000090000000000000000000000522+000000000108500103000000ef03000000000000090000000000000000000000
523-000000006e6574207469746c650000001c004d0101005000f303000000000000523+000000006e6574207469746c650000001c00500101005000f303000000000000
524-0000000000000000000000000000000001084e0103000000ef03000000000000524+000000000000000000000000000000000108510103000000ef03000000000000
525-090000000000000000000000000000006e6574207469746c650000001c004e01525+090000000000000000000000000000006e6574207469746c650000001c005101
526-01005000f3030000000000000000000000000000000000000000000001084f01526+01005000f3030000000000000000000000000000000000000000000001085201
527-03000000ef03000000000000090000000000000000000000000000006e657420527+03000000ef03000000000000090000000000000000000000000000006e657420
528-7469746c650000001c004f0101005000f3030000000000000000000000000000528+7469746c650000001c00520101005000f3030000000000000000000000000000
529-00000000000000000108500103000000ef030000000000000900000000000000529+00000000000000000108530103000000ef030000000000000900000000000000
530-00000000000000006e6574207469746c650000001c00500101005000f3030000530+00000000000000006e6574207469746c650000001c00530101005000f3030000
531-00000000000000000000000000000000000000000108510103000000ef030000531+00000000000000000000000000000000000000000108540103000000ef030000
532-00000000090000000000000000000000000000006e6574207469746c65000000532+00000000090000000000000000000000000000006e6574207469746c65000000
533-1c00510101005000f30300000000000000000000000000000000000000000000533+1c00540101005000f30300000000000000000000000000000000000000000000
534-0108520103000000ef0300000000000009000000000000000000000000000000534+0108550103000000ef0300000000000009000000000000000000000000000000
535-6e6574207469746c650000001c00520101005000f30300000000000000000000535+6e6574207469746c650000001c00550101005000f30300000000000000000000
536-0000000000000000000000000108530103000000ef0300000000000009000000536+0000000000000000000000000108560103000000ef0300000000000009000000
537-0000000000000000000000006e6574207469746c650000001c00530101005000537+0000000000000000000000006e6574207469746c650000001c00560101005000
538-f303000000000000000000000000000000000000000000000108540103000000538+f303000000000000000000000000000000000000000000000108570103000000
539-ef03000000000000090000000000000000000000000000006e6574207469746c539+ef03000000000000090000000000000000000000000000006e6574207469746c
540-650000001c00540101005000f303000000000000000000000000000000000000540+650000001c00570101005000f303000000000000000000000000000000000000
541-000000000108550103000000ef03000000000000090000000000000000000000541+000000000108580103000000ef03000000000000090000000000000000000000
542-000000006e6574207469746c650000001c00550101005000f303000000000000542+000000006e6574207469746c650000001c00580101005000f303000000000000
543-000000000000000000000000000000000108560103000000ef03000000000000543+000000000000000000000000000000000108590103000000ef03000000000000
544-090000000000000000000000000000006e6574207469746c650000001c005601544+090000000000000000000000000000006e6574207469746c650000001c005901
545-01005000f3030000000000000000000000000000000000000000000001085701545+01005000f3030000000000000000000000000000000000000000000001085a01
546-03000000ef03000000000000090000000000000000000000000000006e657420546+03000000ef03000000000000090000000000000000000000000000006e657420
547-7469746c650000001c00570101005000f3030000000000000000000000000000547+7469746c650000001c005a0101005000f3030000000000000000000000000000
548-00000000000000000108580103000000ef030000000000000900000000000000548+000000000000000001085b0103000000ef030000000000000900000000000000
549-00000000000000006e6574207469746c650000001c00580101005000f3030000549+00000000000000006e6574207469746c650000001c005b0101005000f3030000
550-00000000000000000000000000000000000000000108590103000000ef030000550+000000000000000000000000000000000000000001085c0103000000ef030000
551-00000000090000000000000000000000000000006e6574207469746c65000000551+00000000090000000000000000000000000000006e6574207469746c65000000
552-1c00590101005000f30300000000000000000000000000000000000000000000552+1c005c0101005000f30300000000000000000000000000000000000000000000
553-01085a0103000000ef0300000000000009000000000000000000000000000000553+01085d0103000000ef0300000000000009000000000000000000000000000000
554-6e6574207469746c650000001c005a0101005000f30300000000000000000000554+6e6574207469746c650000001c005d0101005000f30300000000000000000000
555-00000000000000000000000001085b0103000000ef0300000000000009000000555+00000000000000000000000001085e0103000000ef0300000000000009000000
556-0000000000000000000000006e6574207469746c650000001c005b0101005000556+0000000000000000000000006e6574207469746c650000001c005e0101005000
557-f3030000000000000000000000000000000000000000000001085c0103000000557+f3030000000000000000000000000000000000000000000001085f0103000000
558-ef03000000000000090000000000000000000000000000006e6574207469746c558+ef03000000000000090000000000000000000000000000006e6574207469746c
559-650000001c005c0101005000f303000000000000000000000000000000000000559+650000001c005f0101005000f303000000000000000000000000000000000000
560-0000000001085d0103000000ef03000000000000090000000000000000000000560+000000000108600103000000ef03000000000000090000000000000000000000
561-000000006e6574207469746c650000001c005d0101005000f303000000000000561+000000006e6574207469746c650000001c00600101005000f303000000000000
562-0000000000000000000000000000000001085e0103000000ef03000000000000562+000000000000000000000000000000000108610103000000ef03000000000000
563-090000000000000000000000000000006e6574207469746c650000001c005e01563+090000000000000000000000000000006e6574207469746c650000001c006101
564-01005000f3030000000000000000000000000000000000000000000001085f01564+01005000f3030000000000000000000000000000000000000000000001086201
565-03000000ef03000000000000090000000000000000000000000000006e657420565+03000000ef03000000000000090000000000000000000000000000006e657420
566-7469746c650000001c005f0101005000f3030000000000000000000000000000566+7469746c650000001c00620101005000f3030000000000000000000000000000
567-00000000000000000108600103000000ef030000000000000900000000000000567+00000000000000000108630103000000ef030000000000000900000000000000
568-00000000000000006e6574207469746c650000001c00600101005000f3030000568+00000000000000006e6574207469746c650000001c00630101005000f3030000
569-00000000000000000000000000000000000000000108610103000000ef030000569+00000000000000000000000000000000000000000108640103000000ef030000
570-00000000090000000000000000000000000000006e6574207469746c65000000570+00000000090000000000000000000000000000006e6574207469746c65000000
571-1c00610101005000f30300000000000000000000000000000000000000000000571+1c00640101005000f30300000000000000000000000000000000000000000000
572-0108620103000000ef0300000000000009000000000000000000000000000000572+0108650103000000ef0300000000000009000000000000000000000000000000
573-6e6574207469746c650000001c00620101005000f30300000000000000000000573+6e6574207469746c650000001c00650101005000f30300000000000000000000
574-0000000000000000000000000108630103000000ef0300000000000009000000574+0000000000000000000000000108660103000000ef0300000000000009000000
575-0000000000000000000000006e6574207469746c650000001c00630101005000575+0000000000000000000000006e6574207469746c650000001c00660101005000
576-f303000000000000000000000000000000000000000000000108640103000000576+f303000000000000000000000000000000000000000000000108670103000000
577-ef03000000000000090000000000000000000000000000006e6574207469746c577+ef03000000000000090000000000000000000000000000006e6574207469746c
578-650000001c00640101005000f303000000000000000000000000000000000000578+650000001c00670101005000f303000000000000000000000000000000000000
579-000000000108650103000000ef03000000000000090000000000000000000000579+000000000108680103000000ef03000000000000090000000000000000000000
580-000000006e6574207469746c650000001c00650101005000f303000000000000580+000000006e6574207469746c650000001c00680101005000f303000000000000
581-000000000000000000000000000000000108660103000000ef03000000000000581+000000000000000000000000000000000108690103000000ef03000000000000
582-090000000000000000000000000000006e6574207469746c650000001c006601582+090000000000000000000000000000006e6574207469746c650000001c006901
583-01005000f3030000000000000000000000000000000000000000000001086701583+01005000f3030000000000000000000000000000000000000000000001086a01
584-03000000ef03000000000000090000000000000000000000000000006e657420584+03000000ef03000000000000090000000000000000000000000000006e657420
585-7469746c650000001c00670101005000f3030000000000000000000000000000585+7469746c650000001c006a0101005000f3030000000000000000000000000000
586-00000000000000000108680103000000ef030000000000000900000000000000586+000000000000000001086b0103000000ef030000000000000900000000000000
587-00000000000000006e6574207469746c650000001c00680101005000f3030000587+00000000000000006e6574207469746c650000001c006b0101005000f3030000
588-00000000000000000000000000000000000000000108690103000000ef030000588+000000000000000000000000000000000000000001086c0103000000ef030000
589-00000000090000000000000000000000000000006e6574207469746c65000000589+00000000090000000000000000000000000000006e6574207469746c65000000
590-1c00690101005000f30300000000000000000000000000000000000000000000590+1c006c0101005000f30300000000000000000000000000000000000000000000
591-01086a0103000000ef0300000000000009000000000000000000000000000000591+01086d0103000000ef0300000000000009000000000000000000000000000000
592-6e6574207469746c650000001c006a0101005000f30300000000000000000000592+6e6574207469746c650000001c006d0101005000f30300000000000000000000
593-00000000000000000000000001086b0103000000ef0300000000000009000000593+00000000000000000000000001086e0103000000ef0300000000000009000000
594-0000000000000000000000006e6574207469746c650000001c006b0101005000594+0000000000000000000000006e6574207469746c650000001c006e0101005000
595-f3030000000000000000000000000000000000000000000001086c0103000000595+f3030000000000000000000000000000000000000000000001086f0103000000
596-ef03000000000000090000000000000000000000000000006e6574207469746c596+ef03000000000000090000000000000000000000000000006e6574207469746c
597-650000001c006c0101005000f303000000000000000000000000000000000000597+650000001c006f0101005000f303000000000000000000000000000000000000
598-0000000001086d0103000000ef03000000000000090000000000000000000000598+000000000108700103000000ef03000000000000090000000000000000000000
599-000000006e6574207469746c650000001c006d0101005000f303000000000000599+000000006e6574207469746c650000001c00700101005000f303000000000000
600-0000000000000000000000000000000001086e0103000000ef03000000000000600+000000000000000000000000000000000108710103000000ef03000000000000
601-090000000000000000000000000000006e6574207469746c650000001c006e01601+090000000000000000000000000000006e6574207469746c650000001c007101
602-01005000f3030000000000000000000000000000000000000000000001086f01602+01005000f3030000000000000000000000000000000000000000000001087201
603-03000000ef03000000000000090000000000000000000000000000006e657420603+03000000ef03000000000000090000000000000000000000000000006e657420
604-7469746c650000001c006f0101005000f3030000000000000000000000000000604+7469746c650000001c00720101005000f3030000000000000000000000000000
605-00000000000000000108700103000000ef030000000000000900000000000000605+00000000000000000108730103000000ef030000000000000900000000000000
606-00000000000000006e6574207469746c650000001c00700101005000f3030000606+00000000000000006e6574207469746c650000001c00730101005000f3030000
607-00000000000000000000000000000000000000000108710103000000ef030000607+00000000000000000000000000000000000000000108740103000000ef030000
608-00000000090000000000000000000000000000006e6574207469746c65000000608+00000000090000000000000000000000000000006e6574207469746c65000000
609-1c00710101005000f30300000000000000000000000000000000000000000000609+1c00740101005000f30300000000000000000000000000000000000000000000
610-0108720103000000ef0300000000000009000000000000000000000000000000610+0108750103000000ef0300000000000009000000000000000000000000000000
611-6e6574207469746c650000001c00720101005000f30300000000000000000000611+6e6574207469746c650000001c00750101005000f30300000000000000000000
612-0000000000000000000000000108730103000000ef0300000000000009000000612+0000000000000000000000000108760103000000ef0300000000000009000000
613-0000000000000000000000006e6574207469746c650000001c00730101005000613+0000000000000000000000006e6574207469746c650000001c00760101005000
614-f303000000000000000000000000000000000000000000000108740103000000614+f303000000000000000000000000000000000000000000000108770103000000
615-ef03000000000000090000000000000000000000000000006e6574207469746c615+ef03000000000000090000000000000000000000000000006e6574207469746c
616-650000001c00740101005000f303000000000000000000000000000000000000616+650000001c00770101005000f303000000000000000000000000000000000000
617-000000000108750103000000ef03000000000000090000000000000000000000617+000000000108780103000000ef03000000000000090000000000000000000000
618-000000006e6574207469746c650000001c00750101005000f303000000000000618+000000006e6574207469746c650000001c00780101005000f303000000000000
619-000000000000000000000000000000000108760103000000ef03000000000000619+000000000000000000000000000000000108790103000000ef03000000000000
620-090000000000000000000000000000006e6574207469746c650000001c007601620+090000000000000000000000000000006e6574207469746c650000001c007901
621-01005000f3030000000000000000000000000000000000000000000001087701621+01005000f3030000000000000000000000000000000000000000000001087a01
622-03000000ef03000000000000090000000000000000000000000000006e657420622+03000000ef03000000000000090000000000000000000000000000006e657420
623-7469746c650000001c00770101005000f3030000000000000000000000000000623+7469746c650000001c007a0101005000f3030000000000000000000000000000
624-00000000000000000108780103000000ef030000000000000900000000000000624+000000000000000001087b0103000000ef030000000000000900000000000000
625-00000000000000006e6574207469746c650000001c00780101005000f3030000625+00000000000000006e6574207469746c650000001c007b0101005000f3030000
626-00000000000000000000000000000000000000000108790103000000ef030000626+000000000000000000000000000000000000000001087c0103000000ef030000
627-00000000090000000000000000000000000000006e6574207469746c65000000627+00000000090000000000000000000000000000006e6574207469746c65000000
628-1c00790101005000f30300000000000000000000000000000000000000000000628+1c007c0101005000f30300000000000000000000000000000000000000000000
629-01087a0103000000ef0300000000000009000000000000000000000000000000629+01087d0103000000ef0300000000000009000000000000000000000000000000
630-6e6574207469746c650000001c007a0101005000f30300000000000000000000630+6e6574207469746c650000001c007d0101005000f30300000000000000000000
631-00000000000000000000000001087b0103000000ef0300000000000009000000631+00000000000000000000000001087e0103000000ef0300000000000009000000
632-0000000000000000000000006e6574207469746c650000001c007b0101005000632+0000000000000000000000006e6574207469746c650000001c007e0101005000
633-f3030000000000000000000000000000000000000000000001087c0103000000633+f3030000000000000000000000000000000000000000000001087f0103000000
634-ef03000000000000090000000000000000000000000000006e6574207469746c634+ef03000000000000090000000000000000000000000000006e6574207469746c
635-650000001c007c0101005000f303000000000000000000000000000000000000635+650000001c007f0101005000f303000000000000000000000000000000000000
636-0000000001087d0103000000ef03000000000000090000000000000000000000636+000000000108800103000000ef03000000000000090000000000000000000000
637-000000006e6574207469746c650000001c007d0101005000f303000000000000637+000000006e6574207469746c650000001c00800101005000f303000000000000
638-0000000000000000000000000000000001087e0103000000ef03000000000000638+000000000000000000000000000000000108810103000000ef03000000000000
639-090000000000000000000000000000006e6574207469746c650000001c007e01639+090000000000000000000000000000006e6574207469746c650000001c008101
640-01005000f3030000000000000000000000000000000000000000000001087f01640+01005000f3030000000000000000000000000000000000000000000001088201
641-03000000ef03000000000000090000000000000000000000000000006e657420641+03000000ef03000000000000090000000000000000000000000000006e657420
642-7469746c650000001c007f0101005000f3030000000000000000000000000000642+7469746c650000001c00820101005000f3030000000000000000000000000000
643-00000000000000000108800103000000ef030000000000000900000000000000643+00000000000000000108830103000000ef030000000000000900000000000000
644-00000000000000006e6574207469746c650000001c00800101005000f3030000644+00000000000000006e6574207469746c650000001c00830101005000f3030000
645-00000000000000000000000000000000000000000108810103000000ef030000645+00000000000000000000000000000000000000000108840103000000ef030000
646-00000000090000000000000000000000000000006e6574207469746c65000000646+00000000090000000000000000000000000000006e6574207469746c65000000
647-1c00810101005000f30300000000000000000000000000000000000000000000647+1c00840101005000f30300000000000000000000000000000000000000000000
648-0108820103000000ef0300000000000009000000000000000000000000000000648+0108850103000000ef0300000000000009000000000000000000000000000000
649-6e6574207469746c650000001c00820101005000f30300000000000000000000649+6e6574207469746c650000001c00850101005000f30300000000000000000000
650-0000000000000000000000000108830103000000ef0300000000000009000000650+0000000000000000000000000108860103000000ef0300000000000009000000
651-0000000000000000000000006e6574207469746c650000001c00830101005000651+0000000000000000000000006e6574207469746c650000001c00860101005000
652-f303000000000000000000000000000000000000000000000108840103000000652+f303000000000000000000000000000000000000000000000108870103000000
653-ef03000000000000090000000000000000000000000000006e6574207469746c653+ef03000000000000090000000000000000000000000000006e6574207469746c
654-650000001c00840101005000f303000000000000000000000000000000000000654+650000001c00870101005000f303000000000000000000000000000000000000
655-000000000108850103000000ef03000000000000090000000000000000000000655+000000000108880103000000ef03000000000000090000000000000000000000
656-000000006e6574207469746c650000001c00850101005000f303000000000000656+000000006e6574207469746c650000001c00880101005000f303000000000000
657-000000000000000000000000000000000108860103000000ef03000000000000657+000000000000000000000000000000000108890103000000ef03000000000000
658-090000000000000000000000000000006e6574207469746c650000001c008601658+090000000000000000000000000000006e6574207469746c650000001c008901
659-01005000f3030000000000000000000000000000000000000000000001088701659+01005000f3030000000000000000000000000000000000000000000001088a01
660-03000000ef03000000000000090000000000000000000000000000006e657420660+03000000ef03000000000000090000000000000000000000000000006e657420
661-7469746c650000001c00870101005000f3030000000000000000000000000000661+7469746c650000001c008a0101005000f3030000000000000000000000000000
662-00000000000000000108880103000000ef030000000000000900000000000000662+000000000000000001088b0103000000ef030000000000000900000000000000
663-00000000000000006e6574207469746c650000001c00880101005000f3030000663+00000000000000006e6574207469746c650000001c008b0101005000f3030000
664-00000000000000000000000000000000000000000108890103000000ef030000664+000000000000000000000000000000000000000001088c0103000000ef030000
665-00000000090000000000000000000000000000006e6574207469746c65000000665+00000000090000000000000000000000000000006e6574207469746c65000000
666-1c00890101005000f30300000000000000000000000000000000000000000000666+1c008c0101005000f30300000000000000000000000000000000000000000000
667-01088a0103000000ef0300000000000009000000000000000000000000000000667+01088d0103000000ef0300000000000009000000000000000000000000000000
668-6e6574207469746c650000001c008a0101005000f30300000000000000000000668+6e6574207469746c650000001c008d0101005000f30300000000000000000000
669-00000000000000000000000001088b0103000000ef0300000000000009000000669+00000000000000000000000001088e0103000000ef0300000000000009000000
670-0000000000000000000000006e6574207469746c650000001c008b0101005000670+0000000000000000000000006e6574207469746c650000001c008e0101005000
671-f3030000000000000000000000000000000000000000000001088c0103000000671+f3030000000000000000000000000000000000000000000001088f0103000000
672-ef03000000000000090000000000000000000000000000006e6574207469746c672+ef03000000000000090000000000000000000000000000006e6574207469746c
673-650000001c008c0101005000f303000000000000000000000000000000000000673+650000001c008f0101005000f303000000000000000000000000000000000000
674-0000000001088d0103000000ef03000000000000090000000000000000000000674+000000000108900103000000ef03000000000000090000000000000000000000
675-000000006e6574207469746c650000001c008d0101005000f303000000000000675+000000006e6574207469746c650000001c00900101005000f303000000000000
676-0000000000000000000000000000000001088e0103000000ef03000000000000676+000000000000000000000000000000000108910103000000ef03000000000000
677-090000000000000000000000000000006e6574207469746c650000001c008e01677+090000000000000000000000000000006e6574207469746c650000001c009101
678-01005000f3030000000000000000000000000000000000000000000001088f01678+01005000f3030000000000000000000000000000000000000000000001089201
679-03000000ef03000000000000090000000000000000000000000000006e657420679+03000000ef03000000000000090000000000000000000000000000006e657420
680-7469746c650000001c008f0101005000f3030000000000000000000000000000680+7469746c650000001c00920101005000f3030000000000000000000000000000
681-00000000000000000108900103000000ef030000000000000900000000000000681+00000000000000000108930103000000ef030000000000000900000000000000
682-00000000000000006e6574207469746c650000001c00900101005000f3030000682+00000000000000006e6574207469746c650000001c00930101005000f3030000
683-00000000000000000000000000000000000000000108910103000000ef030000683+00000000000000000000000000000000000000000108940103000000ef030000
684-00000000090000000000000000000000000000006e6574207469746c65000000684+00000000090000000000000000000000000000006e6574207469746c65000000
685-1c00910101005000f30300000000000000000000000000000000000000000000685+1c00940101005000f30300000000000000000000000000000000000000000000
686-0108920103000000ef0300000000000009000000000000000000000000000000686+0108950103000000ef0300000000000009000000000000000000000000000000
687-6e6574207469746c650000001c00920101005000f30300000000000000000000687+6e6574207469746c650000001c00950101005000f30300000000000000000000
688-0000000000000000000000000108930103000000ef0300000000000009000000688+0000000000000000000000000108960103000000ef0300000000000009000000
689-0000000000000000000000006e6574207469746c650000001c00930101005000689+0000000000000000000000006e6574207469746c650000001c00960101005000
690-f303000000000000000000000000000000000000000000000108940103000000690+f303000000000000000000000000000000000000000000000108970103000000
691-ef03000000000000090000000000000000000000000000006e6574207469746c691+ef03000000000000090000000000000000000000000000006e6574207469746c
692-650000001c00940101005000f303000000000000000000000000000000000000692+650000001c00970101005000f303000000000000000000000000000000000000
693-000000000108950103000000ef03000000000000090000000000000000000000693+000000000108980103000000ef03000000000000090000000000000000000000
694-000000006e6574207469746c650000001c00950101005000f303000000000000694+000000006e6574207469746c650000001c00980101005000f303000000000000
695-000000000000000000000000000000000108960103000000ef03000000000000695+000000000000000000000000000000000108990103000000ef03000000000000
696-090000000000000000000000000000006e6574207469746c650000001c009601696+090000000000000000000000000000006e6574207469746c650000001c009901
697-01005000f3030000000000000000000000000000000000000000000001089701697+01005000f3030000000000000000000000000000000000000000000001089a01
698-03000000ef03000000000000090000000000000000000000000000006e657420698+03000000ef03000000000000090000000000000000000000000000006e657420
699-7469746c650000001c00970101005000f3030000000000000000000000000000699+7469746c650000001c009a0101005000f3030000000000000000000000000000
700-00000000000000000108980103000000ef030000000000000900000000000000700+000000000000000001089b0103000000ef030000000000000900000000000000
701-00000000000000006e6574207469746c650000001c00980101005000f3030000701+00000000000000006e6574207469746c650000001c009b0101005000f3030000
702-00000000000000000000000000000000000000000108990103000000ef030000702+000000000000000000000000000000000000000001089c0103000000ef030000
703-00000000090000000000000000000000000000006e6574207469746c65000000703+00000000090000000000000000000000000000006e6574207469746c65000000
704-1c00990101005000f30300000000000000000000000000000000000000000000704+1c009c0101005000f30300000000000000000000000000000000000000000000
705-01089a0103000000ef0300000000000009000000000000000000000000000000705+01089d0103000000ef0300000000000009000000000000000000000000000000
706-6e6574207469746c650000001c009a0101005000f30300000000000000000000706+6e6574207469746c650000001c009d0101005000f30300000000000000000000
707-00000000000000000000000001089b0103000000ef0300000000000009000000707+00000000000000000000000001089e0103000000ef0300000000000009000000
708-0000000000000000000000006e6574207469746c650000001c009b0101005000708+0000000000000000000000006e6574207469746c650000001c009e0101005000
709-f3030000000000000000000000000000000000000000000001089c0103000000709+f3030000000000000000000000000000000000000000000001089f0103000000
710-ef03000000000000090000000000000000000000000000006e6574207469746c710+ef03000000000000090000000000000000000000000000006e6574207469746c
711-650000001c009c0101005000f303000000000000000000000000000000000000711+650000001c009f0101005000f303000000000000000000000000000000000000
712-0000000001089d0103000000ef03000000000000090000000000000000000000712+000000000108a00103000000ef03000000000000090000000000000000000000
713-000000006e6574207469746c650000001c009d0101005000f303000000000000713+000000006e6574207469746c650000001c00a00101005000f303000000000000
714-0000000000000000000000000000000001089e0103000000ef03000000000000714+000000000000000000000000000000000108a10103000000ef03000000000000
715-090000000000000000000000000000006e6574207469746c650000001c009e01715+090000000000000000000000000000006e6574207469746c650000001c00a101
716-01005000f3030000000000000000000000000000000000000000000001089f01716+01005000f303000000000000000000000000000000000000000000000108a201
717-03000000ef03000000000000090000000000000000000000000000006e657420717+03000000ef03000000000000090000000000000000000000000000006e657420
718-7469746c650000001c009f0101005000f3030000000000000000000000000000718+7469746c650000001c00a20101005000f3030000000000000000000000000000
719-00000000000000000108a00103000000ef030000000000000900000000000000719+00000000000000000108a30103000000ef030000000000000900000000000000
720-00000000000000006e6574207469746c650000001c00a00101005000f3030000720+00000000000000006e6574207469746c650000001c00a30101005000f3030000
721-00000000000000000000000000000000000000000108a10103000000ef030000721+00000000000000000000000000000000000000000108a40103000000ef030000
722-00000000090000000000000000000000000000006e6574207469746c65000000722+00000000090000000000000000000000000000006e6574207469746c65000000
723-1c00a10101005000f30300000000000000000000000000000000000000000000723+1c00a40101005000f30300000000000000000000000000000000000000000000
724-0108a20103000000ef0300000000000009000000000000000000000000000000724+0108a50103000000ef0300000000000009000000000000000000000000000000
725-6e6574207469746c650000001c00a20101005000f30300000000000000000000725+6e6574207469746c650000001c00a50101005000f30300000000000000000000
726-0000000000000000000000000108a30103000000ef0300000000000009000000726+0000000000000000000000000108a60103000000ef0300000000000009000000
727-0000000000000000000000006e6574207469746c650000001c00a30101005000727+0000000000000000000000006e6574207469746c650000001c00a60101005000
728-f303000000000000000000000000000000000000000000000108a40103000000728+f303000000000000000000000000000000000000000000000108a70103000000
729-ef03000000000000090000000000000000000000000000006e6574207469746c729+ef03000000000000090000000000000000000000000000006e6574207469746c
730-650000001c00a40101005000f303000000000000000000000000000000000000730+650000001c00a70101005000f303000000000000000000000000000000000000
731-000000000108a50103000000ef03000000000000090000000000000000000000731+000000000108a80103000000ef03000000000000090000000000000000000000
732-000000006e6574207469746c650000001c00a50101005000f303000000000000732+000000006e6574207469746c650000001c00a80101005000f303000000000000
733-000000000000000000000000000000000108a60103000000ef03000000000000733+000000000000000000000000000000000108a90103000000ef03000000000000
734-090000000000000000000000000000006e6574207469746c650000001c00a601734+090000000000000000000000000000006e6574207469746c650000001c00a901
735-01005000f303000000000000000000000000000000000000000000000108a701735+01005000f303000000000000000000000000000000000000000000000108aa01
736-03000000ef03000000000000090000000000000000000000000000006e657420736+03000000ef03000000000000090000000000000000000000000000006e657420
737-7469746c650000001c00a70101005000f3030000000000000000000000000000737+7469746c650000001c00aa0101005000f3030000000000000000000000000000
738-00000000000000000108a80103000000ef030000000000000900000000000000738+00000000000000000108ab0103000000ef030000000000000900000000000000
739-00000000000000006e6574207469746c650000001c00a80101005000f3030000739+00000000000000006e6574207469746c650000001c00ab0101005000f3030000
740-00000000000000000000000000000000000000000108a90103000000ef030000740+00000000000000000000000000000000000000000108ac0103000000ef030000
741-00000000090000000000000000000000000000006e6574207469746c65000000741+00000000090000000000000000000000000000006e6574207469746c65000000
742-1c00a90101005000f30300000000000000000000000000000000000000000000742+1c00ac0101005000f30300000000000000000000000000000000000000000000
743-0108aa0103000000ef0300000000000009000000000000000000000000000000743+0108ad0103000000ef0300000000000009000000000000000000000000000000
744-6e6574207469746c650000001c00aa0101005000f30300000000000000000000744+6e6574207469746c650000001c00ad0101005000f30300000000000000000000
745-0000000000000000000000000108ab0103000000ef0300000000000009000000745+0000000000000000000000000108ae0103000000ef0300000000000009000000
746-0000000000000000000000006e6574207469746c650000001c00ab0101005000746+0000000000000000000000006e6574207469746c650000001c00ae0101005000
747-f303000000000000000000000000000000000000000000000108ac0103000000747+f303000000000000000000000000000000000000000000000108af0103000000
748-ef03000000000000090000000000000000000000000000006e6574207469746c748+ef03000000000000090000000000000000000000000000006e6574207469746c
749-650000001c00ac0101005000f303000000000000000000000000000000000000749+650000001c00af0101005000f303000000000000000000000000000000000000
750-000000000108ad0103000000ef03000000000000090000000000000000000000750+000000000108b00103000000ef03000000000000090000000000000000000000
751-000000006e6574207469746c650000001c00ad0101005000f303000000000000751+000000006e6574207469746c650000001c00b00101005000f303000000000000
752-000000000000000000000000000000000108ae0103000000ef03000000000000752+000000000000000000000000000000000108b10103000000ef03000000000000
753-090000000000000000000000000000006e6574207469746c650000001c00ae01753+090000000000000000000000000000006e6574207469746c650000001c00b101
754-01005000f303000000000000000000000000000000000000000000000108af01754+01005000f303000000000000000000000000000000000000000000000108b201
755-03000000ef03000000000000090000000000000000000000000000006e657420755+03000000ef03000000000000090000000000000000000000000000006e657420
756-7469746c650000001c00af0101005000f3030000000000000000000000000000756+7469746c650000001c00b20101005000f3030000000000000000000000000000
757-00000000000000000108b00103000000ef030000000000000900000000000000757+00000000000000000108b30103000000ef030000000000000900000000000000
758-00000000000000006e6574207469746c650000001c00b00101005000f3030000758+00000000000000006e6574207469746c650000001c00b30101005000f3030000
759-00000000000000000000000000000000000000000108b10103000000ef030000759+00000000000000000000000000000000000000000108b40103000000ef030000
760-00000000090000000000000000000000000000006e6574207469746c65000000760+00000000090000000000000000000000000000006e6574207469746c65000000
761-1c00b10101005000f30300000000000000000000000000000000000000000000761+1c00b40101005000f30300000000000000000000000000000000000000000000
762-0108b20103000000ef0300000000000009000000000000000000000000000000762+0108b50103000000ef0300000000000009000000000000000000000000000000
763-6e6574207469746c650000001c00b20101005000f30300000000000000000000763+6e6574207469746c650000001c00b50101005000f30300000000000000000000
764-0000000000000000000000000108b30103000000ef0300000000000009000000764+0000000000000000000000000108b60103000000ef0300000000000009000000
765-0000000000000000000000006e6574207469746c650000001c00b30101005000765+0000000000000000000000006e6574207469746c650000001c00b60101005000
766-f303000000000000000000000000000000000000000000000108b40103000000766+f303000000000000000000000000000000000000000000000108b70103000000
767-ef03000000000000090000000000000000000000000000006e6574207469746c767+ef03000000000000090000000000000000000000000000006e6574207469746c
768-650000001c00b40101005000f303000000000000000000000000000000000000768+650000001c00b70101005000f303000000000000000000000000000000000000
769-000000000108b50103000000ef03000000000000090000000000000000000000769+000000000108b80103000000ef03000000000000090000000000000000000000
770-000000006e6574207469746c650000001c00b50101005000f303000000000000770+000000006e6574207469746c650000001c00b80101005000f303000000000000
771-000000000000000000000000000000000108b60103000000ef03000000000000771+000000000000000000000000000000000108b90103000000ef03000000000000
772-090000000000000000000000000000006e6574207469746c650000001c00b601772+090000000000000000000000000000006e6574207469746c650000001c00b901
773-01005000f303000000000000000000000000000000000000000000000108b701773+01005000f303000000000000000000000000000000000000000000000108ba01
774-03000000ef03000000000000090000000000000000000000000000006e657420774+03000000ef03000000000000090000000000000000000000000000006e657420
775-7469746c650000001c00b70101005000f3030000000000000000000000000000775+7469746c650000001c00ba0101005000f3030000000000000000000000000000
776-00000000000000000108b80103000000ef030000000000000900000000000000776+00000000000000000108bb0103000000ef030000000000000900000000000000
777-00000000000000006e6574207469746c650000001c00b80101005000f3030000777+00000000000000006e6574207469746c650000001c00bb0101005000f3030000
778-00000000000000000000000000000000000000000108b90103000000ef030000778+00000000000000000000000000000000000000000108bc0103000000ef030000
779-00000000090000000000000000000000000000006e6574207469746c65000000779+00000000090000000000000000000000000000006e6574207469746c65000000
780-1c00b90101005000f30300000000000000000000000000000000000000000000780+1c00bc0101005000f30300000000000000000000000000000000000000000000
781-0108ba0103000000ef0300000000000009000000000000000000000000000000781+0108bd0103000000ef0300000000000009000000000000000000000000000000
782-6e6574207469746c650000001c00ba0101005000f30300000000000000000000782+6e6574207469746c650000001c00bd0101005000f30300000000000000000000
783-0000000000000000000000000108bb0103000000ef0300000000000009000000783+0000000000000000000000000108be0103000000ef0300000000000009000000
784-0000000000000000000000006e6574207469746c650000001c00bb0101005000784+0000000000000000000000006e6574207469746c650000001c00be0101005000
785-f303000000000000000000000000000000000000000000000108bc0103000000785+f303000000000000000000000000000000000000000000000108bf0103000000
786-ef03000000000000090000000000000000000000000000006e6574207469746c786+ef03000000000000090000000000000000000000000000006e6574207469746c
787-650000001c00bc0101005000f303000000000000000000000000000000000000787+650000001c00bf0101005000f303000000000000000000000000000000000000
788-000000000108bd0103000000ef03000000000000090000000000000000000000788+000000000108c00103000000ef03000000000000090000000000000000000000
789-000000006e6574207469746c650000001c00bd0101005000f303000000000000789+000000006e6574207469746c650000001c00c00101005000f303000000000000
790-000000000000000000000000000000000108be0103000000ef03000000000000790+000000000000000000000000000000000108c10103000000ef03000000000000
791-090000000000000000000000000000006e6574207469746c650000001c00be01791+090000000000000000000000000000006e6574207469746c650000001c00c101
792-01005000f303000000000000000000000000000000000000000000000108bf01792+01005000f303000000000000000000000000000000000000000000000108c201
793-03000000ef03000000000000090000000000000000000000000000006e657420793+03000000ef03000000000000090000000000000000000000000000006e657420
794-7469746c650000001c00bf0101005000f3030000000000000000000000000000794+7469746c650000001c00c20101005000f3030000000000000000000000000000
795-00000000000000000108c00103000000ef030000000000000900000000000000795+00000000000000000108c30103000000ef030000000000000900000000000000
796-00000000000000006e6574207469746c650000001c00c00101005000f3030000796+00000000000000006e6574207469746c650000001c00c30101005000f3030000
797-00000000000000000000000000000000000000000108c10103000000ef030000797+00000000000000000000000000000000000000000108c40103000000ef030000
798-00000000090000000000000000000000000000006e6574207469746c65000000798+00000000090000000000000000000000000000006e6574207469746c65000000
799-1c00c10101005000f30300000000000000000000000000000000000000000000799+1c00c40101005000f30300000000000000000000000000000000000000000000
800-0108c20103000000ef0300000000000009000000000000000000000000000000800+0108c50103000000ef0300000000000009000000000000000000000000000000
801-6e6574207469746c650000001c00c20101005000f30300000000000000000000801+6e6574207469746c650000001c00c50101005000f30300000000000000000000
802-0000000000000000000000000108c30103000000ef0300000000000009000000802+0000000000000000000000000108c60103000000ef0300000000000009000000
803-0000000000000000000000006e6574207469746c650000001c00c30101005000803+0000000000000000000000006e6574207469746c650000001c00c60101005000
804-f303000000000000000000000000000000000000000000000108c40103000000804+f303000000000000000000000000000000000000000000000108c70103000000
805-ef03000000000000090000000000000000000000000000006e6574207469746c805+ef03000000000000090000000000000000000000000000006e6574207469746c
806-650000001c00c40101005000f303000000000000000000000000000000000000806+650000001c00c70101005000f303000000000000000000000000000000000000
807-000000000108c50103000000ef03000000000000090000000000000000000000807+000000000108c80103000000ef03000000000000090000000000000000000000
808-000000006e6574207469746c650000001c00c50101005000f303000000000000808+000000006e6574207469746c650000001c00c80101005000f303000000000000
809-000000000000000000000000000000000108c60103000000ef03000000000000809+000000000000000000000000000000000108c90103000000ef03000000000000
810-090000000000000000000000000000006e6574207469746c650000001c00c601810+090000000000000000000000000000006e6574207469746c650000001c00c901
811-01005000f303000000000000000000000000000000000000000000000108c701811+01005000f303000000000000000000000000000000000000000000000108ca01
812-03000000ef03000000000000090000000000000000000000000000006e657420812+03000000ef03000000000000090000000000000000000000000000006e657420
813-7469746c650000001c00c70101005000f3030000000000000000000000000000813+7469746c650000001c00ca0101005000f3030000000000000000000000000000
814-00000000000000000108c80103000000ef030000000000000900000000000000814+00000000000000000108cb0103000000ef030000000000000900000000000000
815-00000000000000006e6574207469746c650000001c00c80101005000f3030000815+00000000000000006e6574207469746c650000001c00cb0101005000f3030000
816-00000000000000000000000000000000000000000108c90103000000ef030000816+00000000000000000000000000000000000000000108cc0103000000ef030000
817-00000000090000000000000000000000000000006e6574207469746c65000000817+00000000090000000000000000000000000000006e6574207469746c65000000
818-1c00c90101005000f30300000000000000000000000000000000000000000000818+1c00cc0101005000f30300000000000000000000000000000000000000000000
819-0108ca0103000000ef0300000000000009000000000000000000000000000000819+0108cd0103000000ef0300000000000009000000000000000000000000000000
820-6e6574207469746c650000001c00ca0101005000f30300000000000000000000820+6e6574207469746c650000001c00cd0101005000f30300000000000000000000
821-0000000000000000000000000108cb0103000000ef0300000000000009000000821+0000000000000000000000000108ce0103000000ef0300000000000009000000
822-0000000000000000000000006e6574207469746c650000001c00cb0101005000822+0000000000000000000000006e6574207469746c650000001c00ce0101005000
823-f303000000000000000000000000000000000000000000000108cc0103000000823+f303000000000000000000000000000000000000000000000108cf0103000000
824-ef03000000000000090000000000000000000000000000006e6574207469746c824+ef03000000000000090000000000000000000000000000006e6574207469746c
825-650000001c00cc0101005000f303000000000000000000000000000000000000825+650000001c00cf0101005000f303000000000000000000000000000000000000
826-000000000108cd0103000000ef03000000000000090000000000000000000000826+000000000108d00103000000ef03000000000000090000000000000000000000
827-000000006e6574207469746c650000001c00cd0101005000f303000000000000827+000000006e6574207469746c650000001c00d00101005000f303000000000000
828-000000000000000000000000000000000108ce0103000000ef03000000000000828+000000000000000000000000000000000108d10103000000ef03000000000000
829-090000000000000000000000000000006e6574207469746c650000001c00ce01829+090000000000000000000000000000006e6574207469746c650000001c00d101
830-01005000f303000000000000000000000000000000000000000000000108cf01830+01005000f303000000000000000000000000000000000000000000000108d201
831-03000000ef03000000000000090000000000000000000000000000006e657420831+03000000ef03000000000000090000000000000000000000000000006e657420
832-7469746c650000001c00cf0101005000f3030000000000000000000000000000832+7469746c650000001c00d20101005000f3030000000000000000000000000000
833-00000000000000000108d00103000000ef030000000000000900000000000000833+00000000000000000108d30103000000ef030000000000000900000000000000
834-00000000000000006e6574207469746c650000001c00d00101005000f3030000834+00000000000000006e6574207469746c650000001c00d30101005000f3030000
835-00000000000000000000000000000000000000000108d10103000000ef030000835+00000000000000000000000000000000000000000108d40103000000ef030000
836-00000000090000000000000000000000000000006e6574207469746c65000000836+00000000090000000000000000000000000000006e6574207469746c65000000
837-1c00d10101005000f30300000000000000000000000000000000000000000000837+1c00d40101005000f30300000000000000000000000000000000000000000000
838-0108d20103000000ef0300000000000009000000000000000000000000000000838+0108d50103000000ef0300000000000009000000000000000000000000000000
839-6e6574207469746c650000001c00d20101005000f30300000000000000000000839+6e6574207469746c650000001c00d50101005000f30300000000000000000000
840-0000000000000000000000000108d30103000000ef0300000000000009000000840+0000000000000000000000000108d60103000000ef0300000000000009000000
841-0000000000000000000000006e6574207469746c650000001c00d30101005000841+0000000000000000000000006e6574207469746c650000001c00d60101005000
842-f303000000000000000000000000000000000000000000000108d40103000000842+f303000000000000000000000000000000000000000000000108d70103000000
843-ef03000000000000090000000000000000000000000000006e6574207469746c843+ef03000000000000090000000000000000000000000000006e6574207469746c
844-650000001c00d40101005000f303000000000000000000000000000000000000844+650000001c00d70101005000f303000000000000000000000000000000000000
845-000000000108d50103000000ef03000000000000090000000000000000000000845+000000000108d80103000000ef03000000000000090000000000000000000000
846-000000006e6574207469746c650000001c00d50101005000f303000000000000846+000000006e6574207469746c650000001c00d80101005000f303000000000000
847-000000000000000000000000000000000108d60103000000ef03000000000000847+000000000000000000000000000000000108d90103000000ef03000000000000
848-090000000000000000000000000000006e6574207469746c650000001c00d601848+090000000000000000000000000000006e6574207469746c650000001c00d901
849-01005000f303000000000000000000000000000000000000000000000108d701849+01005000f303000000000000000000000000000000000000000000000108da01
850-03000000ef03000000000000090000000000000000000000000000006e657420850+03000000ef03000000000000090000000000000000000000000000006e657420
851-7469746c650000001c00d70101005000f3030000000000000000000000000000851+7469746c650000001c00da0101005000f3030000000000000000000000000000
852-00000000000000000108d80103000000ef030000000000000900000000000000852+00000000000000000108db0103000000ef030000000000000900000000000000
853-00000000000000006e6574207469746c650000001c00d80101005000f3030000853+00000000000000006e6574207469746c650000001c00db0101005000f3030000
854-00000000000000000000000000000000000000000108d90103000000ef030000854+00000000000000000000000000000000000000000108dc0103000000ef030000
855-00000000090000000000000000000000000000006e6574207469746c65000000855+00000000090000000000000000000000000000006e6574207469746c65000000
856-1c00d90101005000f30300000000000000000000000000000000000000000000856+1c00dc0101005000f30300000000000000000000000000000000000000000000
857-0108da0103000000ef0300000000000009000000000000000000000000000000857+0108dd0103000000ef0300000000000009000000000000000000000000000000
858-6e6574207469746c650000001c00da0101005000f30300000000000000000000858+6e6574207469746c650000001c00dd0101005000f30300000000000000000000
859-0000000000000000000000000108db0103000000ef0300000000000009000000859+0000000000000000000000000108de0103000000ef0300000000000009000000
860-0000000000000000000000006e6574207469746c650000001c00db0101005000860+0000000000000000000000006e6574207469746c650000001c00de0101005000
861-f303000000000000000000000000000000000000000000000108dc0103000000861+f303000000000000000000000000000000000000000000000108df0103000000
862-ef03000000000000090000000000000000000000000000006e6574207469746c862+ef03000000000000090000000000000000000000000000006e6574207469746c
863-650000001c00dc0101005000f303000000000000000000000000000000000000863+650000001c00df0101005000f303000000000000000000000000000000000000
864-000000000108dd0103000000ef03000000000000090000000000000000000000864+000000000108e00103000000ef03000000000000090000000000000000000000
865-000000006e6574207469746c650000001c00dd0101005000f303000000000000865+000000006e6574207469746c650000001c00e00101005000f303000000000000
866-000000000000000000000000000000000108de0103000000ef03000000000000866+000000000000000000000000000000000108e10103000000ef03000000000000
867-090000000000000000000000000000006e6574207469746c650000001c00de01867+090000000000000000000000000000006e6574207469746c650000001c00e101
868-01005000f303000000000000000000000000000000000000000000000108df01868+01005000f303000000000000000000000000000000000000000000000108e201
869-03000000ef03000000000000090000000000000000000000000000006e657420869+03000000ef03000000000000090000000000000000000000000000006e657420
870-7469746c650000001c00df0101005000f3030000000000000000000000000000870+7469746c650000001c00e20101005000f3030000000000000000000000000000
871-00000000000000000108e00103000000ef030000000000000900000000000000871+00000000000000000108e30103000000ef030000000000000900000000000000
872-00000000000000006e6574207469746c650000001c00e00101005000f3030000872+00000000000000006e6574207469746c650000001c00e30101005000f3030000
873-00000000000000000000000000000000000000000108e10103000000ef030000873+00000000000000000000000000000000000000000108e40103000000ef030000
874-00000000090000000000000000000000000000006e6574207469746c65000000874+00000000090000000000000000000000000000006e6574207469746c65000000
875-1c00e10101005000f30300000000000000000000000000000000000000000000875+1c00e40101005000f30300000000000000000000000000000000000000000000
876-0108e20103000000ef0300000000000009000000000000000000000000000000876+0108e50103000000ef0300000000000009000000000000000000000000000000
877-6e6574207469746c650000001c00e20101005000f30300000000000000000000877+6e6574207469746c650000001c00e50101005000f30300000000000000000000
878-0000000000000000000000000108e30103000000ef0300000000000009000000878+0000000000000000000000000108e60103000000ef0300000000000009000000
879-0000000000000000000000006e6574207469746c650000001c00e30101005000879+0000000000000000000000006e6574207469746c650000001c00e60101005000
880-f303000000000000000000000000000000000000000000000108e40103000000880+f303000000000000000000000000000000000000000000000108e70103000000
881-ef03000000000000090000000000000000000000000000006e6574207469746c881+ef03000000000000090000000000000000000000000000006e6574207469746c
882-650000001c00e40101005000f303000000000000000000000000000000000000882+650000001c00e70101005000f303000000000000000000000000000000000000
883-000000000108e50103000000ef03000000000000090000000000000000000000883+000000000108e80103000000ef03000000000000090000000000000000000000
884-000000006e6574207469746c650000001c00e50101005000f303000000000000884+000000006e6574207469746c650000001c00e80101005000f303000000000000
885-000000000000000000000000000000000108e60103000000ef03000000000000885+000000000000000000000000000000000108e90103000000ef03000000000000
886-090000000000000000000000000000006e6574207469746c650000001c00e601886+090000000000000000000000000000006e6574207469746c650000001c00e901
887-01005000f303000000000000000000000000000000000000000000000108e701887+01005000f303000000000000000000000000000000000000000000000108ea01
888-03000000ef03000000000000090000000000000000000000000000006e657420888+03000000ef03000000000000090000000000000000000000000000006e657420
889-7469746c650000001c00e70101005000f3030000000000000000000000000000889+7469746c650000001c00ea0101005000f3030000000000000000000000000000
890-00000000000000000108e80103000000ef030000000000000900000000000000890+00000000000000000108eb0103000000ef030000000000000900000000000000
891-00000000000000006e6574207469746c650000001c00e80101005000f3030000891+00000000000000006e6574207469746c650000001c00eb0101005000f3030000
892-00000000000000000000000000000000000000000108e90103000000ef030000892+00000000000000000000000000000000000000000108ec0103000000ef030000
893-00000000090000000000000000000000000000006e6574207469746c65000000893+00000000090000000000000000000000000000006e6574207469746c65000000
894-1c00e90101005000f30300000000000000000000000000000000000000000000894+1c00ec0101005000f30300000000000000000000000000000000000000000000
895-0108ea0103000000ef0300000000000009000000000000000000000000000000895+0108ed0103000000ef0300000000000009000000000000000000000000000000
896-6e6574207469746c650000001c00ea0101005000f30300000000000000000000896+6e6574207469746c650000001c00ed0101005000f30300000000000000000000
897-0000000000000000000000000108eb0103000000ef0300000000000009000000897+0000000000000000000000000108ee0103000000ef0300000000000009000000
898-0000000000000000000000006e6574207469746c650000001c00eb0101005000898+0000000000000000000000006e6574207469746c650000001c00ee0101005000
899-f303000000000000000000000000000000000000000000000108ec0103000000899+f303000000000000000000000000000000000000000000000108ef0103000000
900-ef03000000000000090000000000000000000000000000006e6574207469746c900+ef03000000000000090000000000000000000000000000006e6574207469746c
901-650000001c00ec0101005000f303000000000000000000000000000000000000901+650000001c00ef0101005000f303000000000000000000000000000000000000
902-000000000108ed0103000000ef03000000000000090000000000000000000000902+000000000108f00103000000ef03000000000000090000000000000000000000
903-000000006e6574207469746c650000001c00ed0101005000f303000000000000903+000000006e6574207469746c650000001c00f00101005000f303000000000000
904-000000000000000000000000000000000108ee0103000000ef03000000000000904+000000000000000000000000000000000108f10103000000ef03000000000000
905-090000000000000000000000000000006e6574207469746c650000001c00ee01905+090000000000000000000000000000006e6574207469746c650000001c00f101
906-01005000f303000000000000000000000000000000000000000000000108ef01906+01005000f303000000000000000000000000000000000000000000000108f201
907-03000000ef03000000000000090000000000000000000000000000006e657420907+03000000ef03000000000000090000000000000000000000000000006e657420
908-7469746c650000001c00ef0101005000f3030000000000000000000000000000908+7469746c650000001c00f20101005000f3030000000000000000000000000000
909-00000000000000000108f00103000000ef030000000000000900000000000000909+00000000000000000108f30103000000ef030000000000000900000000000000
910-00000000000000006e6574207469746c650000001c00f00101005000f3030000910+00000000000000006e6574207469746c650000001c00f30101005000f3030000
911-00000000000000000000000000000000000000000108f10103000000ef030000911+00000000000000000000000000000000000000000108f40103000000ef030000
912-00000000090000000000000000000000000000006e6574207469746c65000000912+00000000090000000000000000000000000000006e6574207469746c65000000
913-1c00f10101005000f30300000000000000000000000000000000000000000000913+1c00f40101005000f30300000000000000000000000000000000000000000000
914-0108f20103000000ef0300000000000009000000000000000000000000000000914+0108f50103000000ef0300000000000009000000000000000000000000000000
915-6e6574207469746c650000001c00f20101005000f30300000000000000000000915+6e6574207469746c650000001c00f50101005000f30300000000000000000000
916-0000000000000000000000000108f30103000000ef0300000000000009000000916+0000000000000000000000000108f60103000000ef0300000000000009000000
917-0000000000000000000000006e6574207469746c650000001c00f30101005000917+0000000000000000000000006e6574207469746c650000001c00f60101005000
918-f303000000000000000000000000000000000000000000000108f40103000000918+f303000000000000000000000000000000000000000000000108f70103000000
919-ef03000000000000090000000000000000000000000000006e6574207469746c919+ef03000000000000090000000000000000000000000000006e6574207469746c
920-650000001c00f40101005000f303000000000000000000000000000000000000920+650000001c00f70101005000f303000000000000000000000000000000000000
921-000000000108f50103000000ef03000000000000090000000000000000000000921+000000000108f80103000000ef03000000000000090000000000000000000000
922-000000006e6574207469746c650000001c00f50101005000f303000000000000922+000000006e6574207469746c650000001c00f80101005000f303000000000000
923-000000000000000000000000000000000108f60103000000ef03000000000000923+000000000000000000000000000000000108f90103000000ef03000000000000
924-090000000000000000000000000000006e6574207469746c650000001c00f601924+090000000000000000000000000000006e6574207469746c650000001c00f901
925-01005000f303000000000000000000000000000000000000000000000108f701925+01005000f303000000000000000000000000000000000000000000000108fa01
926-03000000ef03000000000000090000000000000000000000000000006e657420926+03000000ef03000000000000090000000000000000000000000000006e657420
927-7469746c650000001c00f70101005000f3030000000000000000000000000000927+7469746c650000001c00fa0101005000f3030000000000000000000000000000
928-00000000000000000108f80103000000ef030000000000000900000000000000928+00000000000000000108fb0103000000ef030000000000000900000000000000
929-00000000000000006e6574207469746c650000001c00f80101005000f3030000929+00000000000000006e6574207469746c650000001c00fb0101005000f3030000
930-00000000000000000000000000000000000000000108f90103000000ef030000930+00000000000000000000000000000000000000000108fc0103000000ef030000
931-00000000090000000000000000000000000000006e6574207469746c65000000931+00000000090000000000000000000000000000006e6574207469746c65000000
932-1c00f90101005000f30300000000000000000000000000000000000000000000932+1c00fc0101005000f30300000000000000000000000000000000000000000000
933-0108fa0103000000ef0300000000000009000000000000000000000000000000933+0108fd0103000000ef0300000000000009000000000000000000000000000000
934-6e6574207469746c650000001c00fa0101005000f30300000000000000000000934+6e6574207469746c650000001c00fd0101005000f30300000000000000000000
935-0000000000000000000000000108fb0103000000ef0300000000000009000000935+0000000000000000000000000108fe0103000000ef0300000000000009000000
936-0000000000000000000000006e6574207469746c650000001c00fb0101005000936+0000000000000000000000006e6574207469746c650000001c00fe0101005000
937-f303000000000000000000000000000000000000000000000108fc0103000000937+f303000000000000000000000000000000000000000000000108ff0103000000
938-ef03000000000000090000000000000000000000000000006e6574207469746c938+ef03000000000000090000000000000000000000000000006e6574207469746c
939-650000001c00fc0101005000f303000000000000000000000000000000000000939+650000001c00ff0101005000f303000000000000000000000000000000000000
940-000000000108fd0103000000ef03000000000000090000000000000000000000940+000000000108000203000000ef03000000000000090000000000000000000000
941-000000006e6574207469746c650000001c00fd0101005000f303000000000000941+000000006e6574207469746c650000001c00000201005000f303000000000000
942-000000000000000000000000000000000108fe0103000000ef03000000000000942+000000000000000000000000000000000108010203000000ef03000000000000
943-090000000000000000000000000000006e6574207469746c650000001c00fe01943+090000000000000000000000000000006e6574207469746c650000001c000102
944-01005000f303000000000000000000000000000000000000000000000108ff01944+01005000f3030000000000000000000000000000000000000000000001080202
945-03000000ef03000000000000090000000000000000000000000000006e657420945+03000000ef03000000000000090000000000000000000000000000006e657420
946-7469746c650000001c00ff0101005000f3030000000000000000000000000000946+7469746c650000001c00020201005000f3030000000000000000000000000000
947-00000000000000000108000203000000ef030000000000000900000000000000947+00000000000000000108030203000000ef030000000000000900000000000000
948-00000000000000006e6574207469746c650000001c00000201005000f3030000948+00000000000000006e6574207469746c650000001c00030201005000f3030000
949-00000000000000000000000000000000000000000108010203000000ef030000949+00000000000000000000000000000000000000000108040203000000ef030000
950 00000000090000000000000000000000000000006e6574207469746c65000000950 00000000090000000000000000000000000000006e6574207469746c65000000
M internal/adapters/wayland/xwm/testdata/streams/steady.hex +2000 -2000 large diff (4000 lines changed): collapsed
M internal/adapters/wayland/xwm/xpeer_test.go +24 -0
@@ -26,6 +26,7 @@ const (
2626 opChangeProperty = 18
2727 opGetProperty = 20
2828 opSetSelectionOwner = 22
29+ opGetSelectionOwner = 23
2930 opSendEvent = 25
3031 opSetInputFocus = 42
3132 opGetInputFocus = 43
@@ -81,6 +82,8 @@ type xpeer struct {
8182 geoms map[uint32]xpeerGeom
8283 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}
8384 children []uint32
85+ selOwner map[uint32]uint32 // GetSelectionOwner answers, by selection atom
86+ noARGB bool // RENDER has no ARGB32 format
8487 denyRoot bool // answer the root event-mask request with BadAccess
8588 pids map[uint32]uint32 // XRes QueryClientIds answers, by window
8689 bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow
@@ -304,6 +307,8 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
304307 p.atoms[name] = a
305308 }
306309 p.reply(0, le32(a))
310+ case r.major == opGetSelectionOwner:
311+ p.reply(0, le32(p.selOwner[binary.LittleEndian.Uint32(body)]))
307312 case r.major == opGetInputFocus:
308313 p.reply(1, le32(0))
309314 case r.major == opQueryTree:
@@ -399,6 +404,25 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
399404 if r.minor == 1 {
400405 p.reply(0, le32(0, 1))
401406 }
407+ case "RENDER":
408+ if r.minor == 1 { // QueryPictFormats: one format (ARGB32), unless noARGB
409+ n := uint32(1)
410+ if p.noARGB {
411+ n = 0
412+ }
413+ b := make([]byte, 24+28*int(n))
414+ binary.LittleEndian.PutUint32(b[0:], n)
415+ if n == 1 {
416+ f := b[24:]
417+ binary.LittleEndian.PutUint32(f[0:], 0x77) // format id
418+ f[4], f[5] = 1, 32 // direct, depth 32
419+ binary.LittleEndian.PutUint16(f[8:], 16) // red shift
420+ binary.LittleEndian.PutUint16(f[10:], 0xff)
421+ binary.LittleEndian.PutUint16(f[20:], 24) // alpha shift
422+ binary.LittleEndian.PutUint16(f[22:], 0xff)
423+ }
424+ p.reply(0, b)
425+ }
402426 case "Composite", "XFIXES":
403427 if r.minor == 0 {
404428 p.reply(0, le32(5, 4))
@@ -26,6 +26,7 @@ const (
26 opChangeProperty = 1826 opChangeProperty = 18
27 opGetProperty = 2027 opGetProperty = 20
28 opSetSelectionOwner = 2228 opSetSelectionOwner = 22
29+ opGetSelectionOwner = 23
29 opSendEvent = 2530 opSendEvent = 25
30 opSetInputFocus = 4231 opSetInputFocus = 42
31 opGetInputFocus = 4332 opGetInputFocus = 43
@@ -81,6 +82,8 @@ type xpeer struct {
81 geoms map[uint32]xpeerGeom82 geoms map[uint32]xpeerGeom
82 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}83 attrs map[uint32][2]byte // window -> {overrideRedirect, mapState}
83 children []uint3284 children []uint32
85+ selOwner map[uint32]uint32 // GetSelectionOwner answers, by selection atom
86+ noARGB bool // RENDER has no ARGB32 format
84 denyRoot bool // answer the root event-mask request with BadAccess87 denyRoot bool // answer the root event-mask request with BadAccess
85 pids map[uint32]uint32 // XRes QueryClientIds answers, by window88 pids map[uint32]uint32 // XRes QueryClientIds answers, by window
86 bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow89 bad map[uint32]bool // windows whose GetProperty/GetGeometry fail with BadWindow
@@ -304,6 +307,8 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
304 p.atoms[name] = a307 p.atoms[name] = a
305 }308 }
306 p.reply(0, le32(a))309 p.reply(0, le32(a))
310+ case r.major == opGetSelectionOwner:
311+ p.reply(0, le32(p.selOwner[binary.LittleEndian.Uint32(body)]))
307 case r.major == opGetInputFocus:312 case r.major == opGetInputFocus:
308 p.reply(1, le32(0))313 p.reply(1, le32(0))
309 case r.major == opQueryTree:314 case r.major == opQueryTree:
@@ -399,6 +404,25 @@ func (p *xpeer) answer(r xpeerReq, body []byte) {
399 if r.minor == 1 {404 if r.minor == 1 {
400 p.reply(0, le32(0, 1))405 p.reply(0, le32(0, 1))
401 }406 }
407+ case "RENDER":
408+ if r.minor == 1 { // QueryPictFormats: one format (ARGB32), unless noARGB
409+ n := uint32(1)
410+ if p.noARGB {
411+ n = 0
412+ }
413+ b := make([]byte, 24+28*int(n))
414+ binary.LittleEndian.PutUint32(b[0:], n)
415+ if n == 1 {
416+ f := b[24:]
417+ binary.LittleEndian.PutUint32(f[0:], 0x77) // format id
418+ f[4], f[5] = 1, 32 // direct, depth 32
419+ binary.LittleEndian.PutUint16(f[8:], 16) // red shift
420+ binary.LittleEndian.PutUint16(f[10:], 0xff)
421+ binary.LittleEndian.PutUint16(f[20:], 24) // alpha shift
422+ binary.LittleEndian.PutUint16(f[22:], 0xff)
423+ }
424+ p.reply(0, b)
425+ }
402 case "Composite", "XFIXES":426 case "Composite", "XFIXES":
403 if r.minor == 0 {427 if r.minor == 0 {
404 p.reply(0, le32(5, 4))428 p.reply(0, le32(5, 4))
A internal/adapters/wayland/xwm/xsettings_test.go +205 -0
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "context"
5+ "encoding/binary"
6+ "testing"
7+
8+ "github.com/bnema/neferwl/internal/ports"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+func bootSettings(t *testing.T, cfg ports.XwaylandSettings, mutate func(p *xpeer)) (*XWM, *xpeer) {
13+ t.Helper()
14+ fd, p := startXPeer(t, fullPeerExts())
15+ if mutate != nil {
16+ p.set(mutate)
17+ }
18+ x, err := BootSettings(context.Background(), fd, testLog(), cfg)
19+ require.NoError(t, err)
20+ t.Cleanup(x.CloseConn)
21+ return x, p
22+}
23+
24+func (p *xpeer) count(major uint8, match func(xpeerReq) bool) (n int) {
25+ for _, r := range p.requests() {
26+ if r.major == major && (match == nil || match(r)) {
27+ n++
28+ }
29+ }
30+ return n
31+}
32+
33+func TestXSettingsEncode(t *testing.T) {
34+ s := &xsettings{serial: 7, theme: "ab", size: 24, dpi: 96 * 1024, themeSerial: 7, sizeSerial: 5, dpiSerial: 3}
35+ n := s.encode()
36+ u32 := binary.LittleEndian.AppendUint32
37+ var want []byte
38+ want = append(want, 0, 0, 0, 0)
39+ want = u32(want, 7)
40+ want = u32(want, 3)
41+ // Gtk/CursorThemeName STRING "ab"
42+ want = append(want, 1, 0, 19, 0)
43+ want = append(want, "Gtk/CursorThemeName"...)
44+ want = append(want, 0) // 19 -> 20
45+ want = u32(want, 7)
46+ want = u32(want, 2)
47+ want = append(want, 'a', 'b', 0, 0)
48+ // Gtk/CursorThemeSize INT 24
49+ want = append(want, 0, 0, 19, 0)
50+ want = append(want, "Gtk/CursorThemeSize"...)
51+ want = append(want, 0)
52+ want = u32(want, 5)
53+ want = u32(want, 24)
54+ // Xft/DPI INT (name length 7 -> pad 1)
55+ want = append(want, 0, 0, 7, 0)
56+ want = append(want, "Xft/DPI"...)
57+ want = append(want, 0)
58+ want = u32(want, 3)
59+ want = u32(want, 96*1024)
60+ require.Equal(t, want, s.buf[:n])
61+ // Name lengths 1..4 mod 4 pad to a multiple of 4.
62+ for l := 1; l <= 8; l++ {
63+ require.Zero(t, pad4(l)%4)
64+ require.GreaterOrEqual(t, pad4(l), l)
65+ require.Less(t, pad4(l)-l, 4)
66+ }
67+}
68+
69+func TestXSettingsOwnership(t *testing.T) {
70+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 32}, nil)
71+ win := x.xs.win
72+ require.NotZero(t, win)
73+ s0, mgr := p.atom("_XSETTINGS_S0"), p.atom("MANAGER")
74+ own := -1
75+ for i, r := range p.requests() {
76+ if r.major == opSetSelectionOwner && r.u32(8) == s0 {
77+ own = i
78+ require.Equal(t, win, r.u32(4))
79+ }
80+ }
81+ require.NotEqual(t, -1, own)
82+ var sent bool
83+ for _, r := range p.requests() {
84+ if r.major == opSendEvent && r.u32(4) == peerRoot && r.u32(20) == mgr {
85+ sent = true
86+ require.Equal(t, s0, r.u32(28))
87+ require.Equal(t, win, r.u32(32))
88+ }
89+ }
90+ require.True(t, sent, "MANAGER client message to the root")
91+ prop, ok := p.prop(win, "_XSETTINGS_SETTINGS")
92+ require.True(t, ok)
93+ require.Equal(t, p.atom("_XSETTINGS_SETTINGS"), prop.typ)
94+ require.EqualValues(t, 8, prop.format)
95+
96+ // SelectionClear stops updates.
97+ require.True(t, x.xs.active)
98+ p.event(29, func(b *[32]byte) {
99+ binary.LittleEndian.PutUint32(b[8:], win)
100+ binary.LittleEndian.PutUint32(b[12:], s0)
101+ })
102+ require.NoError(t, x.conn.Sync(&x.h))
103+ require.False(t, x.xs.active)
104+ before := p.count(opChangeProperty, nil)
105+ var sp Space
106+ sp.Set(ports.Layout{{Width: 10, Height: 10, Scale: 2}})
107+ x.space = &sp
108+ x.refreshXSettings()
109+ require.NoError(t, x.conn.Flush())
110+ require.NoError(t, x.conn.Sync(&x.h))
111+ require.Equal(t, before, p.count(opChangeProperty, nil))
112+}
113+
114+func TestXSettingsExistingOwner(t *testing.T) {
115+ var s0 uint32
116+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true}, func(p *xpeer) {
117+ p.selOwner = map[uint32]uint32{}
118+ // atoms are assigned on intern: pre-assign through a known name.
119+ p.nextAtom++
120+ s0 = p.nextAtom
121+ p.atoms["_XSETTINGS_S0"] = s0
122+ p.selOwner[s0] = 0xabc
123+ })
124+ require.False(t, x.xs.active)
125+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 }))
126+ _, ok := p.prop(x.xs.win, "_XSETTINGS_SETTINGS")
127+ require.False(t, ok)
128+}
129+
130+func TestXSettingsOff(t *testing.T) {
131+ _, p := bootSettings(t, ports.XwaylandSettings{XSettings: false, CursorSize: 24}, nil)
132+ s0 := p.atom("_XSETTINGS_S0")
133+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 && s0 != 0 }))
134+ require.Zero(t, p.count(opGetSelectionOwner, nil))
135+}
136+
137+// decodeSettings returns serial and the per-setting last-change serial by name.
138+func decodeSettings(t *testing.T, b []byte) (uint32, map[string]uint32) {
139+ t.Helper()
140+ le := binary.LittleEndian
141+ out := map[string]uint32{}
142+ n := int(le.Uint32(b[8:]))
143+ off := 12
144+ for i := 0; i < n; i++ {
145+ typ, nl := b[off], int(le.Uint16(b[off+2:]))
146+ off += 4
147+ name := string(b[off : off+nl])
148+ off += pad4(nl)
149+ out[name] = le.Uint32(b[off:])
150+ off += 4
151+ if typ == xsString {
152+ off += 4 + pad4(int(le.Uint32(b[off:])))
153+ } else {
154+ off += 4
155+ }
156+ }
157+ return le.Uint32(b[4:]), out
158+}
159+
160+func TestXSettingsSerial(t *testing.T) {
161+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorSize: 24}, nil)
162+ win := x.xs.win
163+ props := func() int {
164+ return p.count(opChangeProperty, func(r xpeerReq) bool { return r.u32(4) == win })
165+ }
166+ require.Equal(t, 1, props())
167+ layout := func(scale float64) {
168+ var sp Space
169+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: scale}})
170+ x.space = &sp
171+ x.LayoutChanged(true)
172+ require.NoError(t, x.conn.Flush())
173+ require.NoError(t, x.conn.Sync(&x.h))
174+ }
175+ layout(1) // same settings as boot
176+ require.Equal(t, 1, props())
177+ layout(2)
178+ require.Equal(t, 2, props())
179+ prop, _ := p.prop(win, "_XSETTINGS_SETTINGS")
180+ serial, last := decodeSettings(t, prop.data)
181+ require.EqualValues(t, 2, serial)
182+ require.EqualValues(t, 2, last["Xft/DPI"])
183+ require.EqualValues(t, 1, last["Gtk/CursorThemeSize"])
184+ require.EqualValues(t, 1, last["Gtk/CursorThemeName"])
185+ require.EqualValues(t, 192*1024, int32(binary.LittleEndian.Uint32(prop.data[len(prop.data)-4:])))
186+
187+ x.xs.serial = 0xffffffff
188+ x.xs.dpi = 0
189+ x.publishXSettings(false)
190+ require.EqualValues(t, 0, x.xs.serial, "wraps")
191+}
192+
193+func TestXSettingsNoChangeAllocations(t *testing.T) {
194+ x, _ := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 24}, nil)
195+ var sp Space
196+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: 1}})
197+ x.space = &sp
198+ x.LayoutChanged(true)
199+ l := ports.Layout{{Width: 100, Height: 100, Scale: 1}}
200+ n := testing.AllocsPerRun(100, func() {
201+ sp.Set(l)
202+ x.LayoutChanged(false)
203+ })
204+ require.Zero(t, n)
205+}
@@ -0,0 +1,205 @@
1+package xwm
2+
3+import (
4+ "context"
5+ "encoding/binary"
6+ "testing"
7+
8+ "github.com/bnema/neferwl/internal/ports"
9+ "github.com/stretchr/testify/require"
10+)
11+
12+func bootSettings(t *testing.T, cfg ports.XwaylandSettings, mutate func(p *xpeer)) (*XWM, *xpeer) {
13+ t.Helper()
14+ fd, p := startXPeer(t, fullPeerExts())
15+ if mutate != nil {
16+ p.set(mutate)
17+ }
18+ x, err := BootSettings(context.Background(), fd, testLog(), cfg)
19+ require.NoError(t, err)
20+ t.Cleanup(x.CloseConn)
21+ return x, p
22+}
23+
24+func (p *xpeer) count(major uint8, match func(xpeerReq) bool) (n int) {
25+ for _, r := range p.requests() {
26+ if r.major == major && (match == nil || match(r)) {
27+ n++
28+ }
29+ }
30+ return n
31+}
32+
33+func TestXSettingsEncode(t *testing.T) {
34+ s := &xsettings{serial: 7, theme: "ab", size: 24, dpi: 96 * 1024, themeSerial: 7, sizeSerial: 5, dpiSerial: 3}
35+ n := s.encode()
36+ u32 := binary.LittleEndian.AppendUint32
37+ var want []byte
38+ want = append(want, 0, 0, 0, 0)
39+ want = u32(want, 7)
40+ want = u32(want, 3)
41+ // Gtk/CursorThemeName STRING "ab"
42+ want = append(want, 1, 0, 19, 0)
43+ want = append(want, "Gtk/CursorThemeName"...)
44+ want = append(want, 0) // 19 -> 20
45+ want = u32(want, 7)
46+ want = u32(want, 2)
47+ want = append(want, 'a', 'b', 0, 0)
48+ // Gtk/CursorThemeSize INT 24
49+ want = append(want, 0, 0, 19, 0)
50+ want = append(want, "Gtk/CursorThemeSize"...)
51+ want = append(want, 0)
52+ want = u32(want, 5)
53+ want = u32(want, 24)
54+ // Xft/DPI INT (name length 7 -> pad 1)
55+ want = append(want, 0, 0, 7, 0)
56+ want = append(want, "Xft/DPI"...)
57+ want = append(want, 0)
58+ want = u32(want, 3)
59+ want = u32(want, 96*1024)
60+ require.Equal(t, want, s.buf[:n])
61+ // Name lengths 1..4 mod 4 pad to a multiple of 4.
62+ for l := 1; l <= 8; l++ {
63+ require.Zero(t, pad4(l)%4)
64+ require.GreaterOrEqual(t, pad4(l), l)
65+ require.Less(t, pad4(l)-l, 4)
66+ }
67+}
68+
69+func TestXSettingsOwnership(t *testing.T) {
70+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 32}, nil)
71+ win := x.xs.win
72+ require.NotZero(t, win)
73+ s0, mgr := p.atom("_XSETTINGS_S0"), p.atom("MANAGER")
74+ own := -1
75+ for i, r := range p.requests() {
76+ if r.major == opSetSelectionOwner && r.u32(8) == s0 {
77+ own = i
78+ require.Equal(t, win, r.u32(4))
79+ }
80+ }
81+ require.NotEqual(t, -1, own)
82+ var sent bool
83+ for _, r := range p.requests() {
84+ if r.major == opSendEvent && r.u32(4) == peerRoot && r.u32(20) == mgr {
85+ sent = true
86+ require.Equal(t, s0, r.u32(28))
87+ require.Equal(t, win, r.u32(32))
88+ }
89+ }
90+ require.True(t, sent, "MANAGER client message to the root")
91+ prop, ok := p.prop(win, "_XSETTINGS_SETTINGS")
92+ require.True(t, ok)
93+ require.Equal(t, p.atom("_XSETTINGS_SETTINGS"), prop.typ)
94+ require.EqualValues(t, 8, prop.format)
95+
96+ // SelectionClear stops updates.
97+ require.True(t, x.xs.active)
98+ p.event(29, func(b *[32]byte) {
99+ binary.LittleEndian.PutUint32(b[8:], win)
100+ binary.LittleEndian.PutUint32(b[12:], s0)
101+ })
102+ require.NoError(t, x.conn.Sync(&x.h))
103+ require.False(t, x.xs.active)
104+ before := p.count(opChangeProperty, nil)
105+ var sp Space
106+ sp.Set(ports.Layout{{Width: 10, Height: 10, Scale: 2}})
107+ x.space = &sp
108+ x.refreshXSettings()
109+ require.NoError(t, x.conn.Flush())
110+ require.NoError(t, x.conn.Sync(&x.h))
111+ require.Equal(t, before, p.count(opChangeProperty, nil))
112+}
113+
114+func TestXSettingsExistingOwner(t *testing.T) {
115+ var s0 uint32
116+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true}, func(p *xpeer) {
117+ p.selOwner = map[uint32]uint32{}
118+ // atoms are assigned on intern: pre-assign through a known name.
119+ p.nextAtom++
120+ s0 = p.nextAtom
121+ p.atoms["_XSETTINGS_S0"] = s0
122+ p.selOwner[s0] = 0xabc
123+ })
124+ require.False(t, x.xs.active)
125+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 }))
126+ _, ok := p.prop(x.xs.win, "_XSETTINGS_SETTINGS")
127+ require.False(t, ok)
128+}
129+
130+func TestXSettingsOff(t *testing.T) {
131+ _, p := bootSettings(t, ports.XwaylandSettings{XSettings: false, CursorSize: 24}, nil)
132+ s0 := p.atom("_XSETTINGS_S0")
133+ require.Zero(t, p.count(opSetSelectionOwner, func(r xpeerReq) bool { return r.u32(8) == s0 && s0 != 0 }))
134+ require.Zero(t, p.count(opGetSelectionOwner, nil))
135+}
136+
137+// decodeSettings returns serial and the per-setting last-change serial by name.
138+func decodeSettings(t *testing.T, b []byte) (uint32, map[string]uint32) {
139+ t.Helper()
140+ le := binary.LittleEndian
141+ out := map[string]uint32{}
142+ n := int(le.Uint32(b[8:]))
143+ off := 12
144+ for i := 0; i < n; i++ {
145+ typ, nl := b[off], int(le.Uint16(b[off+2:]))
146+ off += 4
147+ name := string(b[off : off+nl])
148+ off += pad4(nl)
149+ out[name] = le.Uint32(b[off:])
150+ off += 4
151+ if typ == xsString {
152+ off += 4 + pad4(int(le.Uint32(b[off:])))
153+ } else {
154+ off += 4
155+ }
156+ }
157+ return le.Uint32(b[4:]), out
158+}
159+
160+func TestXSettingsSerial(t *testing.T) {
161+ x, p := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorSize: 24}, nil)
162+ win := x.xs.win
163+ props := func() int {
164+ return p.count(opChangeProperty, func(r xpeerReq) bool { return r.u32(4) == win })
165+ }
166+ require.Equal(t, 1, props())
167+ layout := func(scale float64) {
168+ var sp Space
169+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: scale}})
170+ x.space = &sp
171+ x.LayoutChanged(true)
172+ require.NoError(t, x.conn.Flush())
173+ require.NoError(t, x.conn.Sync(&x.h))
174+ }
175+ layout(1) // same settings as boot
176+ require.Equal(t, 1, props())
177+ layout(2)
178+ require.Equal(t, 2, props())
179+ prop, _ := p.prop(win, "_XSETTINGS_SETTINGS")
180+ serial, last := decodeSettings(t, prop.data)
181+ require.EqualValues(t, 2, serial)
182+ require.EqualValues(t, 2, last["Xft/DPI"])
183+ require.EqualValues(t, 1, last["Gtk/CursorThemeSize"])
184+ require.EqualValues(t, 1, last["Gtk/CursorThemeName"])
185+ require.EqualValues(t, 192*1024, int32(binary.LittleEndian.Uint32(prop.data[len(prop.data)-4:])))
186+
187+ x.xs.serial = 0xffffffff
188+ x.xs.dpi = 0
189+ x.publishXSettings(false)
190+ require.EqualValues(t, 0, x.xs.serial, "wraps")
191+}
192+
193+func TestXSettingsNoChangeAllocations(t *testing.T) {
194+ x, _ := bootSettings(t, ports.XwaylandSettings{XSettings: true, CursorTheme: "Adw", CursorSize: 24}, nil)
195+ var sp Space
196+ sp.Set(ports.Layout{{Width: 100, Height: 100, Scale: 1}})
197+ x.space = &sp
198+ x.LayoutChanged(true)
199+ l := ports.Layout{{Width: 100, Height: 100, Scale: 1}}
200+ n := testing.AllocsPerRun(100, func() {
201+ sp.Set(l)
202+ x.LayoutChanged(false)
203+ })
204+ require.Zero(t, n)
205+}
M internal/adapters/wayland/xwm/xwm.go +17 -2
@@ -24,6 +24,8 @@ import (
2424 "github.com/bnema/purego-libwayland/server"
2525 "github.com/bnema/zerowrap"
2626 "golang.org/x/sys/unix"
27+
28+ "github.com/bnema/neferwl/internal/ports"
2729 )
2830
2931 var (
@@ -86,6 +88,9 @@ type XWM struct {
8688 unpaired [unpairedCap]struct{ serial, surface uint64 }
8789 unpairedN int
8890
91+ cfg ports.XwaylandSettings
92+ xs xsettings // XSETTINGS manager and root cursor (xsettings.go, cursor.go)
93+
8994 space *Space // layout <-> X coordinates, shared with the host
9095 warnedSpace bool // more outputs than the Space holds, logged once
9196 ovDirty []Slot // mapped unmanaged slots whose geometry changed, capacity == table size
@@ -161,6 +166,11 @@ func (x *XWM) setProp32(win uint32, prop int, typ xproto.Atom, vals []uint32) {
161166 // Boot gives up promptly when ctx ends (the Xwayland process died or the run
162167 // was cancelled). log is scoped by the caller with logging.For(ctx, "xwm").
163168 func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
169+ return BootSettings(ctx, wmFD, log, ports.XwaylandSettings{})
170+}
171+
172+// BootSettings is Boot with the XSETTINGS manager and the root cursor of cfg.
173+func BootSettings(ctx context.Context, wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
164174 // The watcher shuts the socket down when ctx ends, which wakes any blocked
165175 // handshake, Sync or InternAtoms. It holds its own duplicate so a shutdown
166176 // can never reach a descriptor number reused after Boot closed wmFD.
@@ -184,7 +194,7 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
184194 }()
185195 stopWatch = func() { close(quit); <-joined }
186196 }
187- x, err := boot(wmFD, log)
197+ x, err := boot(wmFD, log, cfg)
188198 stopWatch()
189199 if err == nil && ctx.Err() != nil {
190200 x.CloseConn()
@@ -196,12 +206,13 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
196206 return x, err
197207 }
198208
199-func boot(wmFD int, log zerowrap.Logger) (*XWM, error) {
209+func boot(wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
200210 conn, err := xturbo.NewConn(wmFD)
201211 if err != nil {
202212 return nil, fmt.Errorf("xwm: connect: %w", err)
203213 }
204214 x := newXWM(conn, log)
215+ x.cfg = cfg
205216 if err := x.boot(); err != nil {
206217 _ = conn.Close()
207218 return nil, err
@@ -305,6 +316,10 @@ func (x *XWM) boot() error {
305316 return x.bootErr
306317 }
307318
319+ if err := x.bootSettings(); err != nil {
320+ return err
321+ }
322+
308323 // Windows that exist already (Xwayland restarted under a live client set).
309324 x.expect(xproto.QueryTree(b, root), kindTree, 0, 0)
310325 if err := conn.Sync(&x.h); err != nil {
@@ -24,6 +24,8 @@ import (
24 "github.com/bnema/purego-libwayland/server"24 "github.com/bnema/purego-libwayland/server"
25 "github.com/bnema/zerowrap"25 "github.com/bnema/zerowrap"
26 "golang.org/x/sys/unix"26 "golang.org/x/sys/unix"
27+
28+ "github.com/bnema/neferwl/internal/ports"
27 )29 )
28 30
29 var (31 var (
@@ -86,6 +88,9 @@ type XWM struct {
86 unpaired [unpairedCap]struct{ serial, surface uint64 }88 unpaired [unpairedCap]struct{ serial, surface uint64 }
87 unpairedN int89 unpairedN int
88 90
91+ cfg ports.XwaylandSettings
92+ xs xsettings // XSETTINGS manager and root cursor (xsettings.go, cursor.go)
93+
89 space *Space // layout <-> X coordinates, shared with the host94 space *Space // layout <-> X coordinates, shared with the host
90 warnedSpace bool // more outputs than the Space holds, logged once95 warnedSpace bool // more outputs than the Space holds, logged once
91 ovDirty []Slot // mapped unmanaged slots whose geometry changed, capacity == table size96 ovDirty []Slot // mapped unmanaged slots whose geometry changed, capacity == table size
@@ -161,6 +166,11 @@ func (x *XWM) setProp32(win uint32, prop int, typ xproto.Atom, vals []uint32) {
161 // Boot gives up promptly when ctx ends (the Xwayland process died or the run166 // Boot gives up promptly when ctx ends (the Xwayland process died or the run
162 // was cancelled). log is scoped by the caller with logging.For(ctx, "xwm").167 // was cancelled). log is scoped by the caller with logging.For(ctx, "xwm").
163 func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {168 func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
169+ return BootSettings(ctx, wmFD, log, ports.XwaylandSettings{})
170+}
171+
172+// BootSettings is Boot with the XSETTINGS manager and the root cursor of cfg.
173+func BootSettings(ctx context.Context, wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
164 // The watcher shuts the socket down when ctx ends, which wakes any blocked174 // The watcher shuts the socket down when ctx ends, which wakes any blocked
165 // handshake, Sync or InternAtoms. It holds its own duplicate so a shutdown175 // handshake, Sync or InternAtoms. It holds its own duplicate so a shutdown
166 // can never reach a descriptor number reused after Boot closed wmFD.176 // can never reach a descriptor number reused after Boot closed wmFD.
@@ -184,7 +194,7 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
184 }()194 }()
185 stopWatch = func() { close(quit); <-joined }195 stopWatch = func() { close(quit); <-joined }
186 }196 }
187- x, err := boot(wmFD, log)197+ x, err := boot(wmFD, log, cfg)
188 stopWatch()198 stopWatch()
189 if err == nil && ctx.Err() != nil {199 if err == nil && ctx.Err() != nil {
190 x.CloseConn()200 x.CloseConn()
@@ -196,12 +206,13 @@ func Boot(ctx context.Context, wmFD int, log zerowrap.Logger) (*XWM, error) {
196 return x, err206 return x, err
197 }207 }
198 208
199-func boot(wmFD int, log zerowrap.Logger) (*XWM, error) {209+func boot(wmFD int, log zerowrap.Logger, cfg ports.XwaylandSettings) (*XWM, error) {
200 conn, err := xturbo.NewConn(wmFD)210 conn, err := xturbo.NewConn(wmFD)
201 if err != nil {211 if err != nil {
202 return nil, fmt.Errorf("xwm: connect: %w", err)212 return nil, fmt.Errorf("xwm: connect: %w", err)
203 }213 }
204 x := newXWM(conn, log)214 x := newXWM(conn, log)
215+ x.cfg = cfg
205 if err := x.boot(); err != nil {216 if err := x.boot(); err != nil {
206 _ = conn.Close()217 _ = conn.Close()
207 return nil, err218 return nil, err
@@ -305,6 +316,10 @@ func (x *XWM) boot() error {
305 return x.bootErr316 return x.bootErr
306 }317 }
307 318
319+ if err := x.bootSettings(); err != nil {
320+ return err
321+ }
322+
308 // Windows that exist already (Xwayland restarted under a live client set).323 // Windows that exist already (Xwayland restarted under a live client set).
309 x.expect(xproto.QueryTree(b, root), kindTree, 0, 0)324 x.expect(xproto.QueryTree(b, root), kindTree, 0, 0)
310 if err := conn.Sync(&x.h); err != nil {325 if err := conn.Sync(&x.h); err != nil {
M internal/adapters/wayland/xwm/xwm_test.go +6 -0
@@ -341,6 +341,9 @@ func TestFlushWithNothingQueuedSendsNothing(t *testing.T) {
341341 require.Len(t, p.requests(), n, "nothing queued, nothing sent")
342342 }
343343
344+// bootOnlyFiles run only from boot() (XSETTINGS manager, root cursor).
345+var bootOnlyFiles = map[string]bool{"selection_xsettings.go": true, "cursor.go": true}
346+
344347 // The XWM never blocks after Boot: NewXID, Sync and InternAtoms are startup
345348 // only, so they may appear in production code only inside boot().
346349 func TestNoBlockingCallsOutsideBoot(t *testing.T) {
@@ -354,6 +357,9 @@ func TestNoBlockingCallsOutsideBoot(t *testing.T) {
354357 src, err := os.ReadFile(name)
355358 require.NoError(t, err)
356359 text := string(src)
360+ if bootOnlyFiles[name] {
361+ continue
362+ }
357363 lo, hi := 0, 0
358364 if name == "xwm.go" {
359365 lo = strings.Index(text, "func (x *XWM) boot() error")
@@ -341,6 +341,9 @@ func TestFlushWithNothingQueuedSendsNothing(t *testing.T) {
341 require.Len(t, p.requests(), n, "nothing queued, nothing sent")341 require.Len(t, p.requests(), n, "nothing queued, nothing sent")
342 }342 }
343 343
344+// bootOnlyFiles run only from boot() (XSETTINGS manager, root cursor).
345+var bootOnlyFiles = map[string]bool{"selection_xsettings.go": true, "cursor.go": true}
346+
344 // The XWM never blocks after Boot: NewXID, Sync and InternAtoms are startup347 // The XWM never blocks after Boot: NewXID, Sync and InternAtoms are startup
345 // only, so they may appear in production code only inside boot().348 // only, so they may appear in production code only inside boot().
346 func TestNoBlockingCallsOutsideBoot(t *testing.T) {349 func TestNoBlockingCallsOutsideBoot(t *testing.T) {
@@ -354,6 +357,9 @@ func TestNoBlockingCallsOutsideBoot(t *testing.T) {
354 src, err := os.ReadFile(name)357 src, err := os.ReadFile(name)
355 require.NoError(t, err)358 require.NoError(t, err)
356 text := string(src)359 text := string(src)
360+ if bootOnlyFiles[name] {
361+ continue
362+ }
357 lo, hi := 0, 0363 lo, hi := 0, 0
358 if name == "xwm.go" {364 if name == "xwm.go" {
359 lo = strings.Index(text, "func (x *XWM) boot() error")365 lo = strings.Index(text, "func (x *XWM) boot() error")
M internal/app/cursor.go +18 -0
@@ -138,3 +138,21 @@ func loadCursorUpright(c ports.CursorChange, scale float64, limit int) (ports.Cu
138138 themeCursors.m[key] = out
139139 return out, nil
140140 }
141+
142+// xwaylandSettings is what the built-in XWM publishes to X11 clients: the
143+// XSETTINGS cursor theme and size and the root cursor image, all from the
144+// XCURSOR_* environment. The DPI follows the layout inside the XWM.
145+func xwaylandSettings(cfg ports.XwaylandConfig) ports.XwaylandSettings {
146+ if cfg.Backend != ports.XwaylandBuiltin {
147+ return ports.XwaylandSettings{}
148+ }
149+ size, theme := cursorSize(), os.Getenv("XCURSOR_THEME")
150+ st := ports.XwaylandSettings{XSettings: cfg.XSettings, CursorTheme: theme, CursorSize: size, RootCursor: true}
151+ img, err := xcursor.Load(xcursor.SearchPath(), theme, []string{"default", "left_ptr"}, size)
152+ if err != nil {
153+ return st // the XWM falls back to the X cursor font
154+ }
155+ img = img.ForSize(size, 64)
156+ st.Cursor = ports.CursorImage{W: img.W, H: img.H, HotX: img.HotX, HotY: img.HotY, Pixels: img.Pixels}
157+ return st
158+}
@@ -138,3 +138,21 @@ func loadCursorUpright(c ports.CursorChange, scale float64, limit int) (ports.Cu
138 themeCursors.m[key] = out138 themeCursors.m[key] = out
139 return out, nil139 return out, nil
140 }140 }
141+
142+// xwaylandSettings is what the built-in XWM publishes to X11 clients: the
143+// XSETTINGS cursor theme and size and the root cursor image, all from the
144+// XCURSOR_* environment. The DPI follows the layout inside the XWM.
145+func xwaylandSettings(cfg ports.XwaylandConfig) ports.XwaylandSettings {
146+ if cfg.Backend != ports.XwaylandBuiltin {
147+ return ports.XwaylandSettings{}
148+ }
149+ size, theme := cursorSize(), os.Getenv("XCURSOR_THEME")
150+ st := ports.XwaylandSettings{XSettings: cfg.XSettings, CursorTheme: theme, CursorSize: size, RootCursor: true}
151+ img, err := xcursor.Load(xcursor.SearchPath(), theme, []string{"default", "left_ptr"}, size)
152+ if err != nil {
153+ return st // the XWM falls back to the X cursor font
154+ }
155+ img = img.ForSize(size, 64)
156+ st.Cursor = ports.CursorImage{W: img.W, H: img.H, HotX: img.HotX, HotY: img.HotY, Pixels: img.Pixels}
157+ return st
158+}
M internal/app/session.go +1 -0
@@ -140,6 +140,7 @@ func assembleSession(ctx context.Context, opts Options) (s *session, err error)
140140 RepeatRate: opts.Config.Keyboard.RepeatRate,
141141 RepeatDelay: opts.Config.Keyboard.RepeatDelay,
142142 LogDamage: logging.Enabled(ctx, "wayland-damage"),
143+ Xwayland: xwaylandSettings(opts.Config.Xwayland),
143144 }, s.p.wayland(), logging.For(ctx, "wayland")); err != nil {
144145 return s, err
145146 }
@@ -140,6 +140,7 @@ func assembleSession(ctx context.Context, opts Options) (s *session, err error)
140 RepeatRate: opts.Config.Keyboard.RepeatRate,140 RepeatRate: opts.Config.Keyboard.RepeatRate,
141 RepeatDelay: opts.Config.Keyboard.RepeatDelay,141 RepeatDelay: opts.Config.Keyboard.RepeatDelay,
142 LogDamage: logging.Enabled(ctx, "wayland-damage"),142 LogDamage: logging.Enabled(ctx, "wayland-damage"),
143+ Xwayland: xwaylandSettings(opts.Config.Xwayland),
143 }, s.p.wayland(), logging.For(ctx, "wayland")); err != nil {144 }, s.p.wayland(), logging.For(ctx, "wayland")); err != nil {
144 return s, err145 return s, err
145 }146 }
M internal/ports/config.go +18 -0
@@ -311,4 +311,22 @@ const (
311311 type XwaylandConfig struct {
312312 Backend XwaylandBackend
313313 Binary string
314+ // XSettings (xwayland.xsettings) turns the XSETTINGS manager of the
315+ // built-in XWM on.
316+ XSettings bool
317+}
318+
319+// XwaylandSettings is the plain data the built-in XWM publishes to X11
320+// clients; the app fills it from the config and the environment.
321+type XwaylandSettings struct {
322+ // XSettings turns the XSETTINGS manager on.
323+ XSettings bool
324+ // CursorTheme and CursorSize are XCURSOR_THEME and XCURSOR_SIZE
325+ // (published as Gtk/CursorThemeName and Gtk/CursorThemeSize).
326+ CursorTheme string
327+ CursorSize int
328+ // RootCursor sets a cursor on the X root window. Cursor is its image
329+ // (premultiplied ARGB8888, little-endian); empty uses the X "left_ptr" glyph.
330+ RootCursor bool
331+ Cursor CursorImage
314332 }
@@ -311,4 +311,22 @@ const (
311 type XwaylandConfig struct {311 type XwaylandConfig struct {
312 Backend XwaylandBackend312 Backend XwaylandBackend
313 Binary string313 Binary string
314+ // XSettings (xwayland.xsettings) turns the XSETTINGS manager of the
315+ // built-in XWM on.
316+ XSettings bool
317+}
318+
319+// XwaylandSettings is the plain data the built-in XWM publishes to X11
320+// clients; the app fills it from the config and the environment.
321+type XwaylandSettings struct {
322+ // XSettings turns the XSETTINGS manager on.
323+ XSettings bool
324+ // CursorTheme and CursorSize are XCURSOR_THEME and XCURSOR_SIZE
325+ // (published as Gtk/CursorThemeName and Gtk/CursorThemeSize).
326+ CursorTheme string
327+ CursorSize int
328+ // RootCursor sets a cursor on the X root window. Cursor is its image
329+ // (premultiplied ARGB8888, little-endian); empty uses the X "left_ptr" glyph.
330+ RootCursor bool
331+ Cursor CursorImage
314 }332 }

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 25

Tags 10

↑↓ moveenter openesc close