From 0e514183a7492b80604218c6ee80652b5380333b Mon Sep 17 00:00:00 2001 From: kermieisinthehouse Date: Wed, 2 Feb 2022 16:20:34 -0800 Subject: [PATCH] Desktop integration (#2073) * Open stash in system tray on Windows/MacOS * Add desktop notifications * MacOS Bundling * Add binary icon Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com> --- .github/workflows/build.yml | 21 +- .github/workflows/golangci-lint.yml | 2 +- Makefile | 77 +- README.md | 8 +- docker/compiler/Dockerfile | 2 +- docker/compiler/Makefile | 2 +- docker/compiler/README.md | 4 +- go.mod | 14 +- go.sum | 24 +- graphql/documents/data/config.graphql | 1 + graphql/schema/types/config.graphql | 6 +- main.go | 16 +- pkg/api/authentication.go | 5 - pkg/api/favicon.go | 28 + pkg/api/resolver_mutation_configure.go | 2 + pkg/api/resolver_query_configuration.go | 2 + pkg/api/server.go | 45 +- pkg/desktop/desktop.go | 170 + pkg/desktop/desktop_platform_darwin.go | 40 + pkg/desktop/desktop_platform_linux.go | 43 + pkg/desktop/desktop_platform_windows.go | 56 + pkg/desktop/icon_windows.syso | Bin 0 -> 42710 bytes pkg/desktop/systray_linux.go | 10 + pkg/desktop/systray_nonlinux.go | 94 + pkg/ffmpeg/downloader.go | 5 +- pkg/ffmpeg/encoder.go | 3 + pkg/ffmpeg/ffprobe.go | 5 +- pkg/ffmpeg/stream.go | 2 + pkg/image/vips.go | 2 + pkg/job/manager.go | 11 +- pkg/logger/logger.go | 1 + pkg/manager/config/config.go | 46 +- pkg/manager/config/init.go | 1 + pkg/manager/generator.go | 2 + pkg/manager/manager.go | 42 +- pkg/plugin/raw.go | 2 + pkg/scraper/script.go | 2 + scripts/cross-compile.sh | 7 +- scripts/generate_icons.sh | 50 + scripts/macos-bundle/Contents/Info.plist | 18 + .../macos-bundle/Contents/Resources/icon.icns | Bin 0 -> 154872 bytes scripts/stash-logo.png | Bin 0 -> 227830 bytes ui/v2.5/public/favicon.ico | Bin 3134 -> 42220 bytes ui/v2.5/public/favicon.png | Bin 0 -> 11361 bytes ui/v2.5/public/manifest.json | 3 +- .../components/Changelog/versions/v0130.md | 2 + .../SettingsInterfacePanel.tsx | 7 + ui/v2.5/src/locales/en-GB.json | 4 +- .../github.com/apenwarr/fixconsole/.gitignore | 1 + vendor/github.com/apenwarr/fixconsole/LICENSE | 202 + .../apenwarr/fixconsole/fixconsole_default.go | 14 + .../apenwarr/fixconsole/fixconsole_windows.go | 132 + vendor/github.com/apenwarr/w32/AUTHORS | 19 + vendor/github.com/apenwarr/w32/LICENSE | 23 + vendor/github.com/apenwarr/w32/README.md | 33 + vendor/github.com/apenwarr/w32/advapi32.go | 389 ++ .../apenwarr/w32/advapi32_constants.go | 300 ++ .../apenwarr/w32/advapi32_typedef.go | 122 + vendor/github.com/apenwarr/w32/alpc.go | 304 ++ .../github.com/apenwarr/w32/alpc_constants.go | 64 + .../github.com/apenwarr/w32/alpc_typedef.go | 181 + vendor/github.com/apenwarr/w32/comctl32.go | 109 + vendor/github.com/apenwarr/w32/comdlg32.go | 38 + vendor/github.com/apenwarr/w32/constants.go | 2628 +++++++++++++ .../github.com/apenwarr/w32/create_process.go | 152 + .../apenwarr/w32/create_process_constants.go | 9 + .../apenwarr/w32/create_process_typedef.go | 68 + vendor/github.com/apenwarr/w32/dwmapi.go | 254 ++ vendor/github.com/apenwarr/w32/fork.go | 174 + .../github.com/apenwarr/w32/fork_constants.go | 26 + .../github.com/apenwarr/w32/fork_typedef.go | 89 + vendor/github.com/apenwarr/w32/gdi32.go | 543 +++ vendor/github.com/apenwarr/w32/gdiplus.go | 175 + vendor/github.com/apenwarr/w32/idispatch.go | 43 + vendor/github.com/apenwarr/w32/istream.go | 31 + vendor/github.com/apenwarr/w32/iunknown.go | 27 + vendor/github.com/apenwarr/w32/kernel32.go | 388 ++ vendor/github.com/apenwarr/w32/ole32.go | 63 + vendor/github.com/apenwarr/w32/oleaut32.go | 48 + vendor/github.com/apenwarr/w32/opengl32.go | 72 + vendor/github.com/apenwarr/w32/psapi.go | 25 + vendor/github.com/apenwarr/w32/shell32.go | 153 + vendor/github.com/apenwarr/w32/typedef.go | 891 +++++ vendor/github.com/apenwarr/w32/user32.go | 1046 +++++ vendor/github.com/apenwarr/w32/utils.go | 201 + vendor/github.com/apenwarr/w32/vars.go | 13 + vendor/github.com/go-chi/chi/v5/.gitignore | 3 + vendor/github.com/go-chi/chi/v5/CHANGELOG.md | 279 ++ .../github.com/go-chi/chi/v5/CONTRIBUTING.md | 31 + vendor/github.com/go-chi/chi/v5/LICENSE | 20 + vendor/github.com/go-chi/chi/v5/Makefile | 14 + vendor/github.com/go-chi/chi/v5/README.md | 511 +++ vendor/github.com/go-chi/chi/v5/chain.go | 49 + vendor/github.com/go-chi/chi/v5/chi.go | 134 + vendor/github.com/go-chi/chi/v5/context.go | 157 + .../go-chi/chi/v5/middleware/basic_auth.go | 33 + .../go-chi/chi/v5/middleware/clean_path.go | 28 + .../go-chi/chi/v5/middleware/compress.go | 399 ++ .../chi/v5/middleware/content_charset.go | 51 + .../chi/v5/middleware/content_encoding.go | 34 + .../go-chi/chi/v5/middleware/content_type.go | 49 + .../go-chi/chi/v5/middleware/get_head.go | 39 + .../go-chi/chi/v5/middleware/heartbeat.go | 26 + .../go-chi/chi/v5/middleware/logger.go | 174 + .../go-chi/chi/v5/middleware/middleware.go | 23 + .../go-chi/chi/v5/middleware/nocache.go | 58 + .../go-chi/chi/v5/middleware/profiler.go | 55 + .../go-chi/chi/v5/middleware/realip.go | 54 + .../go-chi/chi/v5/middleware/recoverer.go | 192 + .../go-chi/chi/v5/middleware/request_id.go | 96 + .../go-chi/chi/v5/middleware/route_headers.go | 160 + .../go-chi/chi/v5/middleware/strip.go | 62 + .../go-chi/chi/v5/middleware/terminal.go | 63 + .../go-chi/chi/v5/middleware/throttle.go | 132 + .../go-chi/chi/v5/middleware/timeout.go | 49 + .../go-chi/chi/v5/middleware/url_format.go | 72 + .../go-chi/chi/v5/middleware/value.go | 17 + .../go-chi/chi/v5/middleware/wrap_writer.go | 165 + vendor/github.com/go-chi/chi/v5/mux.go | 479 +++ vendor/github.com/go-chi/chi/v5/tree.go | 866 +++++ vendor/github.com/go-chi/httplog/LICENSE | 20 + vendor/github.com/go-chi/httplog/README.md | 67 + vendor/github.com/go-chi/httplog/config.go | 86 + vendor/github.com/go-chi/httplog/httplog.go | 248 ++ vendor/github.com/go-chi/httplog/util.go | 37 + vendor/github.com/go-toast/toast/.gitignore | 3 + vendor/github.com/go-toast/toast/LICENSE | 7 + vendor/github.com/go-toast/toast/readme.md | 61 + .../toast/screenshot-action-centre.png | Bin 0 -> 85126 bytes .../go-toast/toast/screenshot-cli.png | Bin 0 -> 62466 bytes .../go-toast/toast/screenshot-toast.png | Bin 0 -> 62644 bytes vendor/github.com/go-toast/toast/toast.go | 359 ++ .../gosx-notifier/LICENSE-MIT | 22 + .../gosx-notifier/README.md | 179 + .../gosx-notifier/example.png | Bin 0 -> 61767 bytes .../gosx-notifier/gopher.png | Bin 0 -> 2237 bytes .../gosx-notifier/gosx-notifier.go | 137 + .../gosx-notifier/terminal-app-binary.go | 3428 +++++++++++++++++ .../gosx-notifier/terminal-app-zip.go | 116 + .../kermieisinthehouse/systray/.gitignore | 12 + .../kermieisinthehouse/systray/CHANGELOG.md | 125 + .../kermieisinthehouse/systray/LICENSE | 202 + .../kermieisinthehouse/systray/Makefile | 18 + .../kermieisinthehouse/systray/README.md | 122 + .../kermieisinthehouse/systray/systray.go | 244 ++ .../kermieisinthehouse/systray/systray.h | 17 + .../systray/systray_darwin.go | 38 + .../systray/systray_darwin.m | 294 ++ .../systray/systray_linux.c | 269 ++ .../systray/systray_linux.go | 29 + .../systray/systray_nonwindows.go | 107 + .../systray/systray_windows.go | 946 +++++ vendor/github.com/nu7hatch/gouuid/.gitignore | 11 + vendor/github.com/nu7hatch/gouuid/COPYING | 19 + vendor/github.com/nu7hatch/gouuid/README.md | 21 + vendor/github.com/nu7hatch/gouuid/uuid.go | 173 + vendor/github.com/rs/zerolog/README.md | 18 +- vendor/github.com/rs/zerolog/event.go | 2 +- .../rs/zerolog/internal/cbor/types_test_64.go | 35 + .../rs/zerolog/internal/json/base.go | 7 +- .../rs/zerolog/internal/json/types.go | 7 +- vendor/github.com/rs/zerolog/log.go | 6 +- vendor/github.com/rs/zerolog/writer.go | 2 +- vendor/golang.org/x/sys/cpu/cpu_gc_x86.go | 4 - vendor/golang.org/x/sys/cpu/cpu_x86.go | 7 +- vendor/golang.org/x/sys/cpu/cpu_x86.s | 24 - .../golang.org/x/sys/plan9/pwd_go15_plan9.go | 1 + vendor/golang.org/x/sys/plan9/pwd_plan9.go | 1 + vendor/golang.org/x/sys/plan9/race.go | 1 + vendor/golang.org/x/sys/plan9/race0.go | 1 + vendor/golang.org/x/sys/plan9/str.go | 1 + vendor/golang.org/x/sys/plan9/syscall.go | 1 + .../golang.org/x/sys/plan9/syscall_plan9.go | 6 +- .../x/sys/plan9/zsyscall_plan9_386.go | 1 + .../x/sys/plan9/zsyscall_plan9_amd64.go | 1 + .../x/sys/plan9/zsyscall_plan9_arm.go | 1 + vendor/golang.org/x/sys/unix/README.md | 2 +- vendor/golang.org/x/sys/unix/mkall.sh | 2 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 14 +- .../golang.org/x/sys/unix/sockcmsg_linux.go | 49 + vendor/golang.org/x/sys/unix/syscall_aix.go | 28 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 24 +- .../golang.org/x/sys/unix/syscall_darwin.go | 67 +- .../x/sys/unix/syscall_dragonfly.go | 10 +- .../golang.org/x/sys/unix/syscall_freebsd.go | 6 +- .../golang.org/x/sys/unix/syscall_illumos.go | 8 + vendor/golang.org/x/sys/unix/syscall_linux.go | 136 +- .../x/sys/unix/syscall_linux_386.go | 38 - .../x/sys/unix/syscall_linux_amd64.go | 48 - .../x/sys/unix/syscall_linux_arm.go | 42 - .../x/sys/unix/syscall_linux_arm64.go | 51 - .../x/sys/unix/syscall_linux_mips64x.go | 39 - .../x/sys/unix/syscall_linux_mipsx.go | 35 - .../x/sys/unix/syscall_linux_ppc.go | 38 - .../x/sys/unix/syscall_linux_ppc64x.go | 38 - .../x/sys/unix/syscall_linux_riscv64.go | 51 - .../x/sys/unix/syscall_linux_s390x.go | 36 - .../x/sys/unix/syscall_linux_sparc64.go | 37 - .../golang.org/x/sys/unix/syscall_netbsd.go | 14 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 6 +- .../golang.org/x/sys/unix/syscall_solaris.go | 28 +- .../x/sys/unix/syscall_zos_s390x.go | 22 +- vendor/golang.org/x/sys/unix/sysvshm_linux.go | 21 + vendor/golang.org/x/sys/unix/sysvshm_unix.go | 61 + .../x/sys/unix/sysvshm_unix_other.go | 14 + .../x/sys/unix/zerrors_darwin_amd64.go | 3126 +++++++-------- .../x/sys/unix/zerrors_darwin_arm64.go | 3126 +++++++-------- vendor/golang.org/x/sys/unix/zerrors_linux.go | 75 +- .../x/sys/unix/zerrors_linux_386.go | 4 +- .../x/sys/unix/zerrors_linux_amd64.go | 4 +- .../x/sys/unix/zerrors_linux_arm.go | 4 +- .../x/sys/unix/zerrors_linux_arm64.go | 4 +- .../x/sys/unix/zerrors_linux_mips.go | 4 +- .../x/sys/unix/zerrors_linux_mips64.go | 4 +- .../x/sys/unix/zerrors_linux_mips64le.go | 4 +- .../x/sys/unix/zerrors_linux_mipsle.go | 4 +- .../x/sys/unix/zerrors_linux_ppc.go | 4 +- .../x/sys/unix/zerrors_linux_ppc64.go | 4 +- .../x/sys/unix/zerrors_linux_ppc64le.go | 4 +- .../x/sys/unix/zerrors_linux_riscv64.go | 4 +- .../x/sys/unix/zerrors_linux_s390x.go | 4 +- .../x/sys/unix/zerrors_linux_sparc64.go | 4 +- .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 22 +- .../x/sys/unix/zsyscall_aix_ppc64.go | 20 +- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 20 +- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 18 +- .../x/sys/unix/zsyscall_darwin_amd64.go | 59 + .../x/sys/unix/zsyscall_darwin_amd64.s | 24 + .../x/sys/unix/zsyscall_darwin_arm64.go | 59 + .../x/sys/unix/zsyscall_darwin_arm64.s | 24 + .../golang.org/x/sys/unix/zsyscall_linux.go | 86 +- .../x/sys/unix/zsyscall_linux_386.go | 53 - .../x/sys/unix/zsyscall_linux_amd64.go | 53 - .../x/sys/unix/zsyscall_linux_arm.go | 53 - .../x/sys/unix/zsyscall_linux_mips.go | 55 - .../x/sys/unix/zsyscall_linux_mips64.go | 32 - .../x/sys/unix/zsyscall_linux_mips64le.go | 32 - .../x/sys/unix/zsyscall_linux_mipsle.go | 55 - .../x/sys/unix/zsyscall_linux_ppc.go | 53 - .../x/sys/unix/zsyscall_linux_ppc64.go | 53 - .../x/sys/unix/zsyscall_linux_ppc64le.go | 53 - .../x/sys/unix/zsyscall_linux_s390x.go | 43 - .../x/sys/unix/zsyscall_linux_sparc64.go | 42 - .../x/sys/unix/zsyscall_netbsd_386.go | 12 - .../x/sys/unix/zsyscall_netbsd_amd64.go | 12 - .../x/sys/unix/zsyscall_netbsd_arm.go | 12 - .../x/sys/unix/zsyscall_netbsd_arm64.go | 12 - .../x/sys/unix/zsysnum_linux_386.go | 3 + .../x/sys/unix/zsysnum_linux_amd64.go | 3 + .../x/sys/unix/zsysnum_linux_arm.go | 3 + .../x/sys/unix/zsysnum_linux_arm64.go | 3 + .../x/sys/unix/zsysnum_linux_mips.go | 2 + .../x/sys/unix/zsysnum_linux_mips64.go | 2 + .../x/sys/unix/zsysnum_linux_mips64le.go | 2 + .../x/sys/unix/zsysnum_linux_mipsle.go | 2 + .../x/sys/unix/zsysnum_linux_ppc.go | 2 + .../x/sys/unix/zsysnum_linux_ppc64.go | 2 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 2 + .../x/sys/unix/zsysnum_linux_riscv64.go | 2 + .../x/sys/unix/zsysnum_linux_s390x.go | 2 + .../x/sys/unix/zsysnum_linux_sparc64.go | 2 + .../x/sys/unix/ztypes_darwin_amd64.go | 133 +- .../x/sys/unix/ztypes_darwin_arm64.go | 133 +- .../x/sys/unix/ztypes_freebsd_386.go | 2 + .../x/sys/unix/ztypes_freebsd_amd64.go | 2 + .../x/sys/unix/ztypes_freebsd_arm.go | 2 + .../x/sys/unix/ztypes_freebsd_arm64.go | 2 + .../x/sys/unix/ztypes_illumos_amd64.go | 2 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 138 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 35 +- .../x/sys/unix/ztypes_linux_amd64.go | 32 +- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 35 +- .../x/sys/unix/ztypes_linux_arm64.go | 32 +- .../x/sys/unix/ztypes_linux_mips.go | 34 +- .../x/sys/unix/ztypes_linux_mips64.go | 32 +- .../x/sys/unix/ztypes_linux_mips64le.go | 32 +- .../x/sys/unix/ztypes_linux_mipsle.go | 34 +- .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 36 +- .../x/sys/unix/ztypes_linux_ppc64.go | 31 +- .../x/sys/unix/ztypes_linux_ppc64le.go | 31 +- .../x/sys/unix/ztypes_linux_riscv64.go | 32 +- .../x/sys/unix/ztypes_linux_s390x.go | 31 +- .../x/sys/unix/ztypes_linux_sparc64.go | 31 +- .../x/sys/unix/ztypes_openbsd_386.go | 11 +- .../x/sys/unix/ztypes_openbsd_amd64.go | 11 +- .../x/sys/unix/ztypes_openbsd_arm.go | 11 +- .../x/sys/unix/ztypes_openbsd_arm64.go | 11 +- .../x/sys/unix/ztypes_openbsd_mips64.go | 11 +- vendor/golang.org/x/sys/windows/aliases.go | 4 +- vendor/golang.org/x/sys/windows/eventlog.go | 1 + .../golang.org/x/sys/windows/exec_windows.go | 37 +- .../x/sys/windows/memory_windows.go | 11 + vendor/golang.org/x/sys/windows/mksyscall.go | 3 +- vendor/golang.org/x/sys/windows/race.go | 1 + vendor/golang.org/x/sys/windows/race0.go | 1 + vendor/golang.org/x/sys/windows/service.go | 14 +- .../x/sys/windows/setupapi_windows.go | 1425 +++++++ .../x/sys/windows/setupapierrors_windows.go | 100 - vendor/golang.org/x/sys/windows/str.go | 1 + .../golang.org/x/sys/windows/svc/security.go | 101 + .../golang.org/x/sys/windows/svc/service.go | 314 ++ vendor/golang.org/x/sys/windows/syscall.go | 1 + .../x/sys/windows/syscall_windows.go | 39 +- .../golang.org/x/sys/windows/types_windows.go | 409 +- .../x/sys/windows/zsyscall_windows.go | 523 +++ vendor/modules.txt | 30 +- 306 files changed, 29542 insertions(+), 4792 deletions(-) create mode 100644 pkg/api/favicon.go create mode 100644 pkg/desktop/desktop.go create mode 100644 pkg/desktop/desktop_platform_darwin.go create mode 100644 pkg/desktop/desktop_platform_linux.go create mode 100644 pkg/desktop/desktop_platform_windows.go create mode 100644 pkg/desktop/icon_windows.syso create mode 100644 pkg/desktop/systray_linux.go create mode 100644 pkg/desktop/systray_nonlinux.go create mode 100755 scripts/generate_icons.sh create mode 100644 scripts/macos-bundle/Contents/Info.plist create mode 100644 scripts/macos-bundle/Contents/Resources/icon.icns create mode 100644 scripts/stash-logo.png create mode 100644 ui/v2.5/public/favicon.png create mode 100644 vendor/github.com/apenwarr/fixconsole/.gitignore create mode 100644 vendor/github.com/apenwarr/fixconsole/LICENSE create mode 100644 vendor/github.com/apenwarr/fixconsole/fixconsole_default.go create mode 100644 vendor/github.com/apenwarr/fixconsole/fixconsole_windows.go create mode 100644 vendor/github.com/apenwarr/w32/AUTHORS create mode 100644 vendor/github.com/apenwarr/w32/LICENSE create mode 100644 vendor/github.com/apenwarr/w32/README.md create mode 100644 vendor/github.com/apenwarr/w32/advapi32.go create mode 100644 vendor/github.com/apenwarr/w32/advapi32_constants.go create mode 100644 vendor/github.com/apenwarr/w32/advapi32_typedef.go create mode 100644 vendor/github.com/apenwarr/w32/alpc.go create mode 100644 vendor/github.com/apenwarr/w32/alpc_constants.go create mode 100644 vendor/github.com/apenwarr/w32/alpc_typedef.go create mode 100644 vendor/github.com/apenwarr/w32/comctl32.go create mode 100644 vendor/github.com/apenwarr/w32/comdlg32.go create mode 100644 vendor/github.com/apenwarr/w32/constants.go create mode 100644 vendor/github.com/apenwarr/w32/create_process.go create mode 100644 vendor/github.com/apenwarr/w32/create_process_constants.go create mode 100644 vendor/github.com/apenwarr/w32/create_process_typedef.go create mode 100644 vendor/github.com/apenwarr/w32/dwmapi.go create mode 100644 vendor/github.com/apenwarr/w32/fork.go create mode 100644 vendor/github.com/apenwarr/w32/fork_constants.go create mode 100644 vendor/github.com/apenwarr/w32/fork_typedef.go create mode 100644 vendor/github.com/apenwarr/w32/gdi32.go create mode 100644 vendor/github.com/apenwarr/w32/gdiplus.go create mode 100644 vendor/github.com/apenwarr/w32/idispatch.go create mode 100644 vendor/github.com/apenwarr/w32/istream.go create mode 100644 vendor/github.com/apenwarr/w32/iunknown.go create mode 100644 vendor/github.com/apenwarr/w32/kernel32.go create mode 100644 vendor/github.com/apenwarr/w32/ole32.go create mode 100644 vendor/github.com/apenwarr/w32/oleaut32.go create mode 100644 vendor/github.com/apenwarr/w32/opengl32.go create mode 100644 vendor/github.com/apenwarr/w32/psapi.go create mode 100644 vendor/github.com/apenwarr/w32/shell32.go create mode 100644 vendor/github.com/apenwarr/w32/typedef.go create mode 100644 vendor/github.com/apenwarr/w32/user32.go create mode 100644 vendor/github.com/apenwarr/w32/utils.go create mode 100644 vendor/github.com/apenwarr/w32/vars.go create mode 100644 vendor/github.com/go-chi/chi/v5/.gitignore create mode 100644 vendor/github.com/go-chi/chi/v5/CHANGELOG.md create mode 100644 vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md create mode 100644 vendor/github.com/go-chi/chi/v5/LICENSE create mode 100644 vendor/github.com/go-chi/chi/v5/Makefile create mode 100644 vendor/github.com/go-chi/chi/v5/README.md create mode 100644 vendor/github.com/go-chi/chi/v5/chain.go create mode 100644 vendor/github.com/go-chi/chi/v5/chi.go create mode 100644 vendor/github.com/go-chi/chi/v5/context.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/clean_path.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/compress.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/content_charset.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/content_type.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/get_head.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/logger.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/middleware.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/nocache.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/profiler.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/realip.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/recoverer.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/request_id.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/route_headers.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/strip.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/terminal.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/throttle.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/timeout.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/url_format.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/value.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go create mode 100644 vendor/github.com/go-chi/chi/v5/mux.go create mode 100644 vendor/github.com/go-chi/chi/v5/tree.go create mode 100644 vendor/github.com/go-chi/httplog/LICENSE create mode 100644 vendor/github.com/go-chi/httplog/README.md create mode 100644 vendor/github.com/go-chi/httplog/config.go create mode 100644 vendor/github.com/go-chi/httplog/httplog.go create mode 100644 vendor/github.com/go-chi/httplog/util.go create mode 100644 vendor/github.com/go-toast/toast/.gitignore create mode 100644 vendor/github.com/go-toast/toast/LICENSE create mode 100644 vendor/github.com/go-toast/toast/readme.md create mode 100644 vendor/github.com/go-toast/toast/screenshot-action-centre.png create mode 100644 vendor/github.com/go-toast/toast/screenshot-cli.png create mode 100644 vendor/github.com/go-toast/toast/screenshot-toast.png create mode 100644 vendor/github.com/go-toast/toast/toast.go create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/LICENSE-MIT create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/README.md create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/example.png create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/gopher.png create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/gosx-notifier.go create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-binary.go create mode 100644 vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-zip.go create mode 100644 vendor/github.com/kermieisinthehouse/systray/.gitignore create mode 100644 vendor/github.com/kermieisinthehouse/systray/CHANGELOG.md create mode 100644 vendor/github.com/kermieisinthehouse/systray/LICENSE create mode 100644 vendor/github.com/kermieisinthehouse/systray/Makefile create mode 100644 vendor/github.com/kermieisinthehouse/systray/README.md create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray.go create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray.h create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray_darwin.go create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray_darwin.m create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray_linux.c create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray_linux.go create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray_nonwindows.go create mode 100644 vendor/github.com/kermieisinthehouse/systray/systray_windows.go create mode 100644 vendor/github.com/nu7hatch/gouuid/.gitignore create mode 100644 vendor/github.com/nu7hatch/gouuid/COPYING create mode 100644 vendor/github.com/nu7hatch/gouuid/README.md create mode 100644 vendor/github.com/nu7hatch/gouuid/uuid.go create mode 100644 vendor/github.com/rs/zerolog/internal/cbor/types_test_64.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_linux.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix.go create mode 100644 vendor/golang.org/x/sys/unix/sysvshm_unix_other.go create mode 100644 vendor/golang.org/x/sys/windows/setupapi_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/setupapierrors_windows.go create mode 100644 vendor/golang.org/x/sys/windows/svc/security.go create mode 100644 vendor/golang.org/x/sys/windows/svc/service.go diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d7e3ac4fb..61feb833f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ concurrency: cancel-in-progress: true env: - COMPILER_IMAGE: stashapp/compiler:5 + COMPILER_IMAGE: stashapp/compiler:6 jobs: build: @@ -91,12 +91,11 @@ jobs: - name: Compile for all supported platforms run: | docker exec -t build /bin/bash -c "make cross-compile-windows" - docker exec -t build /bin/bash -c "make cross-compile-osx-intel" - docker exec -t build /bin/bash -c "make cross-compile-osx-applesilicon" + docker exec -t build /bin/bash -c "make cross-compile-macos" docker exec -t build /bin/bash -c "make cross-compile-linux" docker exec -t build /bin/bash -c "make cross-compile-linux-arm64v8" docker exec -t build /bin/bash -c "make cross-compile-linux-arm32v7" - docker exec -t build /bin/bash -c "make cross-compile-pi" + docker exec -t build /bin/bash -c "make cross-compile-linux-arm32v6" - name: Cleanup build container run: docker rm -f -v build @@ -121,8 +120,8 @@ jobs: if: ${{ github.event_name == 'pull_request' && github.base_ref != 'refs/heads/develop' && github.base_ref != 'refs/heads/master'}} uses: actions/upload-artifact@v2 with: - name: stash-osx - path: dist/stash-osx + name: Stash-macos.zip + path: dist/Stash-macos.zip - name: Upload Linux binary # only upload binaries for pull requests @@ -145,13 +144,12 @@ jobs: automatic_release_tag: latest_develop title: "${{ env.STASH_VERSION }}: Latest development build" files: | - dist/stash-osx - dist/stash-osx-applesilicon + dist/Stash-macos.zip dist/stash-win.exe dist/stash-linux dist/stash-linux-arm64v8 dist/stash-linux-arm32v7 - dist/stash-pi + dist/stash-linux-arm32v6 CHECKSUMS_SHA1 - name: Master release @@ -161,13 +159,12 @@ jobs: token: "${{ secrets.GITHUB_TOKEN }}" allow_override: true files: | - dist/stash-osx - dist/stash-osx-applesilicon + dist/Stash-macos.zip dist/stash-win.exe dist/stash-linux dist/stash-linux-arm64v8 dist/stash-linux-arm32v7 - dist/stash-pi + dist/stash-linux-arm32v6 CHECKSUMS_SHA1 gzip: false diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index ab5c50010..592b6cf68 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -9,7 +9,7 @@ on: pull_request: env: - COMPILER_IMAGE: stashapp/compiler:5 + COMPILER_IMAGE: stashapp/compiler:6 jobs: golangci: diff --git a/Makefile b/Makefile index 4e9dea55c..f369b490f 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,12 @@ -IS_WIN = +IS_WIN_SHELL = ifeq (${SHELL}, sh.exe) - IS_WIN = true + IS_WIN_SHELL = true endif ifeq (${SHELL}, cmd) - IS_WIN = true + IS_WIN_SHELL = true endif -ifdef IS_WIN +ifdef IS_WIN_SHELL SEPARATOR := && SET := set else @@ -14,6 +14,11 @@ else SET := export endif +IS_WIN_OS = +ifeq ($(OS),Windows_NT) + IS_WIN_OS = true +endif + # set LDFLAGS environment variable to any extra ldflags required # set OUTPUT to generate a specific binary name @@ -46,9 +51,13 @@ ifndef OFFICIAL_BUILD endif build: pre-build +ifdef IS_WIN_OS +PLATFORM_SPECIFIC_LDFLAGS := -H windowsgui +endif +build: $(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash/pkg/api.version=$(STASH_VERSION)' -X 'github.com/stashapp/stash/pkg/api.buildstamp=$(BUILD_DATE)' -X 'github.com/stashapp/stash/pkg/api.githash=$(GITHASH)') - $(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash/pkg/api.officialBuild=$(OFFICIAL_BUILD)') - go build $(OUTPUT) -mod=vendor -v -tags "sqlite_omit_load_extension osusergo netgo" $(GO_BUILD_FLAGS) -ldflags "$(LDFLAGS) $(EXTRA_LDFLAGS)" + $(eval LDFLAGS := $(LDFLAGS) -X 'github.com/stashapp/stash/pkg/manager/config.officialBuild=$(OFFICIAL_BUILD)') + go build $(OUTPUT) -mod=vendor -v -tags "sqlite_omit_load_extension osusergo netgo" $(GO_BUILD_FLAGS) -ldflags "$(LDFLAGS) $(EXTRA_LDFLAGS) $(PLATFORM_SPECIFIC_LDFLAGS)" # strips debug symbols from the release build build-release: EXTRA_LDFLAGS := -s -w @@ -65,23 +74,38 @@ cross-compile-windows: export GOARCH := amd64 cross-compile-windows: export CC := x86_64-w64-mingw32-gcc cross-compile-windows: export CXX := x86_64-w64-mingw32-g++ cross-compile-windows: OUTPUT := -o dist/stash-win.exe +cross-compile-windows: PLATFORM_SPECIFIC_LDFLAGS := -H windowsgui cross-compile-windows: build-release-static -cross-compile-osx-intel: export GOOS := darwin -cross-compile-osx-intel: export GOARCH := amd64 -cross-compile-osx-intel: export CC := o64-clang -cross-compile-osx-intel: export CXX := o64-clang++ -cross-compile-osx-intel: OUTPUT := -o dist/stash-osx +cross-compile-macos-intel: export GOOS := darwin +cross-compile-macos-intel: export GOARCH := amd64 +cross-compile-macos-intel: export CC := o64-clang +cross-compile-macos-intel: export CXX := o64-clang++ +cross-compile-macos-intel: OUTPUT := -o dist/stash-macos-intel # can't use static build for OSX -cross-compile-osx-intel: build-release +cross-compile-macos-intel: build-release -cross-compile-osx-applesilicon: export GOOS := darwin -cross-compile-osx-applesilicon: export GOARCH := arm64 -cross-compile-osx-applesilicon: export CC := oa64e-clang -cross-compile-osx-applesilicon: export CXX := oa64e-clang++ -cross-compile-osx-applesilicon: OUTPUT := -o dist/stash-osx-applesilicon +cross-compile-macos-applesilicon: export GOOS := darwin +cross-compile-macos-applesilicon: export GOARCH := arm64 +cross-compile-macos-applesilicon: export CC := oa64e-clang +cross-compile-macos-applesilicon: export CXX := oa64e-clang++ +cross-compile-macos-applesilicon: OUTPUT := -o dist/stash-macos-applesilicon # can't use static build for OSX -cross-compile-osx-applesilicon: build-release +cross-compile-macos-applesilicon: build-release + +cross-compile-macos: + rm -rf dist/Stash.app dist/Stash-macos.zip + make cross-compile-macos-applesilicon + make cross-compile-macos-intel + # Combine into one universal binary + lipo -create -output dist/stash-macos-universal dist/stash-macos-intel dist/stash-macos-applesilicon + rm dist/stash-macos-intel dist/stash-macos-applesilicon + # Place into bundle and zip up + cp -R scripts/macos-bundle dist/Stash.app + mkdir dist/Stash.app/Contents/MacOS + mv dist/stash-macos-universal dist/Stash.app/Contents/MacOS/stash + cd dist && zip -r Stash-macos.zip Stash.app && cd .. + rm -rf dist/Stash.app cross-compile-linux: export GOOS := linux cross-compile-linux: export GOARCH := amd64 @@ -101,21 +125,20 @@ cross-compile-linux-arm32v7: export CC := arm-linux-gnueabihf-gcc cross-compile-linux-arm32v7: OUTPUT := -o dist/stash-linux-arm32v7 cross-compile-linux-arm32v7: build-release-static -cross-compile-pi: export GOOS := linux -cross-compile-pi: export GOARCH := arm -cross-compile-pi: export GOARM := 6 -cross-compile-pi: export CC := arm-linux-gnueabi-gcc -cross-compile-pi: OUTPUT := -o dist/stash-pi -cross-compile-pi: build-release-static +cross-compile-linux-arm32v6: export GOOS := linux +cross-compile-linux-arm32v6: export GOARCH := arm +cross-compile-linux-arm32v6: export GOARM := 6 +cross-compile-linux-arm32v6: export CC := arm-linux-gnueabi-gcc +cross-compile-linux-arm32v6: OUTPUT := -o dist/stash-linux-arm32v6 +cross-compile-linux-arm32v6: build-release-static cross-compile-all: make cross-compile-windows - make cross-compile-osx-intel - make cross-compile-osx-applesilicon + make cross-compile-macos make cross-compile-linux make cross-compile-linux-arm64v8 make cross-compile-linux-arm32v7 - make cross-compile-pi + make cross-compile-linux-arm32v6 # Regenerates GraphQL files generate: generate-backend generate-frontend diff --git a/README.md b/README.md index 810ba0a18..168c1c582 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,14 @@ For further information you can [read the in-app manual](ui/v2.5/src/docs/en). Windows | MacOS| Linux | Docker :---:|:---:|:---:|:---: -[Latest Release](https://github.com/stashapp/stash/releases/latest/download/stash-win.exe)
[Development Preview](https://github.com/stashapp/stash/releases/download/latest_develop/stash-win.exe) | [Latest Release (Apple Silicon)](https://github.com/stashapp/stash/releases/latest/download/stash-osx-applesilicon)
[Development Preview (Apple Silicon)](https://github.com/stashapp/stash/releases/download/latest_develop/stash-osx-applesilicon)
[Latest Release (Intel)](https://github.com/stashapp/stash/releases/latest/download/stash-osx)
[Development Preview (Intel)](https://github.com/stashapp/stash/releases/download/latest_develop/stash-osx) | [Latest Release (amd64)](https://github.com/stashapp/stash/releases/latest/download/stash-linux)
[Development Preview (amd64)](https://github.com/stashapp/stash/releases/download/latest_develop/stash-linux)
[More Architectures...](https://github.com/stashapp/stash/releases/latest) | [Instructions](docker/production/README.md)
[Sample docker-compose.yml](docker/production/docker-compose.yml) +[Latest Release](https://github.com/stashapp/stash/releases/latest/download/stash-win.exe)
[Development Preview](https://github.com/stashapp/stash/releases/download/latest_develop/stash-win.exe) | [Latest Release](https://github.com/stashapp/stash/releases/latest/download/Stash-macos.app.zip)
[Development Preview](https://github.com/stashapp/stash/releases/download/latest_develop/Stash-macos.app.zip) | [Latest Release (amd64)](https://github.com/stashapp/stash/releases/latest/download/stash-linux)
[Development Preview (amd64)](https://github.com/stashapp/stash/releases/download/latest_develop/stash-linux)
[More Architectures...](https://github.com/stashapp/stash/releases/latest) | [Instructions](docker/production/README.md)
[Sample docker-compose.yml](docker/production/docker-compose.yml) ## Getting Started -Run the executable (double click the exe on windows or run `./stash-osx` / `./stash-linux` from the terminal on macOS / Linux) to get started. +Run the executable by double-clicking it. -*Note for Windows users:* Running the app might present a security prompt since the binary isn't yet signed. Bypass this by clicking "more info" and then the "run anyway" button. +*Note for Mac users:* Running the app will present a security prompt since the binary isn't yet signed. Bypass this by right (ctrl) clicking on the app and hitting "Open", then "Open" in the next popup. + +*Note for Windows users:* Running the app might present a security prompt since the binary isn't yet signed. Bypass this by clicking "more info" and then the "run anyway" button. #### FFMPEG Stash requires ffmpeg. If you don't have it installed, Stash will download a copy for you. It is recommended that Linux users install `ffmpeg` from their distro's package manager. diff --git a/docker/compiler/Dockerfile b/docker/compiler/Dockerfile index c7f5e789c..d6d54f0cc 100644 --- a/docker/compiler/Dockerfile +++ b/docker/compiler/Dockerfile @@ -20,7 +20,7 @@ RUN apt-get update && \ gcc-arm-linux-gnueabi libc-dev-armel-cross linux-libc-dev-armel-cross \ gcc-arm-linux-gnueabihf libc-dev-armhf-cross \ gcc-aarch64-linux-gnu libc-dev-arm64-cross \ - nodejs yarn --no-install-recommends || exit 1; \ + nodejs yarn zip --no-install-recommends || exit 1; \ rm -rf /var/lib/apt/lists/*; # Cross compile setup diff --git a/docker/compiler/Makefile b/docker/compiler/Makefile index 5c4ed71ba..978059b94 100644 --- a/docker/compiler/Makefile +++ b/docker/compiler/Makefile @@ -1,6 +1,6 @@ user=stashapp repo=compiler -version=5 +version=6 latest: docker build -t ${user}/${repo}:latest . diff --git a/docker/compiler/README.md b/docker/compiler/README.md index d25b4a6cd..6172d5bd9 100644 --- a/docker/compiler/README.md +++ b/docker/compiler/README.md @@ -1,5 +1,3 @@ Modified from https://github.com/bep/dockerfiles/tree/master/ci-goreleaser -When the dockerfile is changed, the version number should be incremented in the Makefile and the new version tag should be pushed to docker hub. The `scripts/cross-compile.sh` script should also be updated to use the new version number tag, and `.travis.yml` needs to be updated to pull the correct image tag. - -A MacOS univeral binary can be created using `lipo -create -output stash-osx-universal stash-osx stash-osx-applesilicon`, available in the image. \ No newline at end of file +When the dockerfile is changed, the version number should be incremented in the Makefile and the new version tag should be pushed to docker hub. The `scripts/cross-compile.sh` script should also be updated to use the new version number tag, and the github workflow files need to be updated to pull the correct image tag. diff --git a/go.mod b/go.mod index 2a690b116..7d0f109c7 100644 --- a/go.mod +++ b/go.mod @@ -38,8 +38,8 @@ require ( golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9 - golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf - golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect + golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e + golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b golang.org/x/text v0.3.7 golang.org/x/tools v0.1.5 // indirect gopkg.in/sourcemap.v1 v1.0.5 // indirect @@ -47,6 +47,11 @@ require ( ) require ( + github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29 + github.com/go-chi/httplog v0.2.1 + github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 + github.com/kermieisinthehouse/gosx-notifier v0.1.1 + github.com/kermieisinthehouse/systray v1.2.3 github.com/lucasb-eyer/go-colorful v1.2.0 github.com/vearutop/statigz v1.1.6 github.com/vektah/gqlparser/v2 v2.0.1 @@ -55,10 +60,12 @@ require ( require ( github.com/agnivade/levenshtein v1.1.0 // indirect github.com/antchfx/xpath v1.2.0 // indirect + github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab // indirect github.com/chromedp/sysutil v1.0.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/go-chi/chi/v5 v5.0.0 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect github.com/gobwas/ws v1.1.0-rc.5 // indirect @@ -77,10 +84,11 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect + github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rs/zerolog v1.18.0 // indirect + github.com/rs/zerolog v1.18.1-0.20200514152719-663cbb4c8469 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/spf13/cast v1.4.1 // indirect diff --git a/go.sum b/go.sum index ec2784346..c799108fc 100644 --- a/go.sum +++ b/go.sum @@ -88,6 +88,10 @@ github.com/antchfx/xpath v1.2.0/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwq github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/arrow/go/arrow v0.0.0-20200601151325-b2287a20f230/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0= github.com/apache/arrow/go/arrow v0.0.0-20210521153258-78c88a9f517b/go.mod h1:R4hW3Ug0s+n4CUsWHKOj00Pu01ZqU4x/hSF5kXUcXKQ= +github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29 h1:muXWUcay7DDy1/hEQWrYlBy+g0EuwT70sBHg65SeUc4= +github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29/go.mod h1:JYWahgHer+Z2xbsgHPtaDYVWzeHDminu+YIBWkxpCAY= +github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab h1:CMGzRRCjnD50RjUFSArBLuCxiDvdp7b8YPAcikBEQ+k= +github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab/go.mod h1:nfFtvHn2Hgs9G1u0/J6LHQv//EksNC+7G8vXmd1VTJ8= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -214,6 +218,10 @@ github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1T github.com/go-chi/chi v3.3.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-chi/chi/v5 v5.0.0 h1:DBPx88FjZJH3FsICfDAfIfnb7XxKIYVGG6lOPlhENAg= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= +github.com/go-chi/httplog v0.2.1 h1:KgCtIUkYNlfIsUPzE3utxd1KDKOvCrnAKaqdo0rmrh0= +github.com/go-chi/httplog v0.2.1/go.mod h1:JyHOFO9twSfGoTin/RoP25Lx2a9Btq10ug+sgxe0+bo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -224,6 +232,8 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 h1:qZNfIGkIANxGv/OqtnntR4DfOY2+BgwR60cAcu/i3SE= +github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4/go.mod h1:kW3HQ4UdaAyrUCSSDR4xUzBKW6O2iA4uHhk7AtyYp10= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= @@ -484,6 +494,10 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kermieisinthehouse/gosx-notifier v0.1.1 h1:lVXyKsa1c1RUkckp3KayloNLoI//fUwVYye3RPSPtEw= +github.com/kermieisinthehouse/gosx-notifier v0.1.1/go.mod h1:xyWT07azFtUOcHl96qMVvKhvKzsMcS7rKTHQyv8WTho= +github.com/kermieisinthehouse/systray v1.2.3 h1:tawLahcam/Ccs/F2n6EOQo8qJnSTD2hLzOYqTGsUsbA= +github.com/kermieisinthehouse/systray v1.2.3/go.mod h1:axh6C/jNuSyC0QGtidZJURc9h+h41HNoMySoLVrhVR4= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -576,6 +590,8 @@ github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= @@ -633,8 +649,9 @@ github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.18.0 h1:CbAm3kP2Tptby1i9sYy2MGRg0uxIN9cyDb59Ys7W8z8= github.com/rs/zerolog v1.18.0/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/rs/zerolog v1.18.1-0.20200514152719-663cbb4c8469 h1:DuXsEWHUTO5lsxxzKM4KUKGDIOi7nawNDs6d+AiulEA= +github.com/rs/zerolog v1.18.1-0.20200514152719-663cbb4c8469/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -661,6 +678,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= @@ -917,6 +935,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190415145633-3fd5a3612ccd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -984,8 +1003,9 @@ golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/graphql/documents/data/config.graphql b/graphql/documents/data/config.graphql index d801a216b..2003e4650 100644 --- a/graphql/documents/data/config.graphql +++ b/graphql/documents/data/config.graphql @@ -53,6 +53,7 @@ fragment ConfigInterfaceData on ConfigInterfaceResult { wallPlayback maximumLoopDuration noBrowser + notificationsEnabled autostartVideo autostartVideoOnPlaySelected continuePlaylistDefault diff --git a/graphql/schema/types/config.graphql b/graphql/schema/types/config.graphql index ee40fd95d..04450462e 100644 --- a/graphql/schema/types/config.graphql +++ b/graphql/schema/types/config.graphql @@ -239,6 +239,8 @@ input ConfigInterfaceInput { funscriptOffset: Int """True if we should not auto-open a browser window on startup""" noBrowser: Boolean + """True if we should send notifications to the desktop""" + notificationsEnabled: Boolean } type ConfigDisableDropdownCreate { @@ -261,8 +263,10 @@ type ConfigInterfaceResult { """Maximum duration (in seconds) in which a scene video will loop in the scene player""" maximumLoopDuration: Int - """"True if we should not auto-open a browser window on startup""" + """True if we should not auto-open a browser window on startup""" noBrowser: Boolean + """True if we should send desktop notifications""" + notificationsEnabled: Boolean """If true, video will autostart on load in the scene player""" autostartVideo: Boolean """If true, video will autostart when loading from play random or play selected""" diff --git a/main.go b/main.go index 6d59d8085..393a4f3e3 100644 --- a/main.go +++ b/main.go @@ -3,13 +3,14 @@ package main import ( "embed" + "fmt" "os" "os/signal" "runtime/pprof" "syscall" + "github.com/apenwarr/fixconsole" "github.com/stashapp/stash/pkg/api" - "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/manager" _ "github.com/golang-migrate/migrate/v4/database/sqlite3" @@ -22,6 +23,14 @@ var uiBox embed.FS //go:embed ui/login var loginUIBox embed.FS +func init() { + // On Windows, attach to parent shell + err := fixconsole.FixConsoleIfNeeded() + if err != nil { + fmt.Printf("FixConsoleOutput: %v\n", err) + } +} + func main() { manager.Initialize() api.Start(uiBox, loginUIBox) @@ -30,10 +39,7 @@ func main() { defer pprof.StopCPUProfile() blockForever() - err := manager.GetInstance().Shutdown() - if err != nil { - logger.Errorf("Error when closing: %s", err) - } + manager.GetInstance().Shutdown(0) } func blockForever() { diff --git a/pkg/api/authentication.go b/pkg/api/authentication.go index fd638d697..e5358affe 100644 --- a/pkg/api/authentication.go +++ b/pkg/api/authentication.go @@ -130,9 +130,4 @@ func securityActivateTripwireAccessedFromInternetWithoutAuth(c *config.Instance, if err != nil { logger.Error(err) } - - err = manager.GetInstance().Shutdown() - if err != nil { - logger.Error(err) - } } diff --git a/pkg/api/favicon.go b/pkg/api/favicon.go new file mode 100644 index 000000000..1a760bd3b --- /dev/null +++ b/pkg/api/favicon.go @@ -0,0 +1,28 @@ +package api + +import ( + "embed" + "runtime" +) + +const faviconDir = "ui/v2.5/build/" + +type FaviconProvider struct { + uiBox embed.FS +} + +func (p *FaviconProvider) GetFavicon() []byte { + if runtime.GOOS == "windows" { + faviconPath := faviconDir + "favicon.ico" + ret, _ := p.uiBox.ReadFile(faviconPath) + return ret + } + + return p.GetFaviconPng() +} + +func (p *FaviconProvider) GetFaviconPng() []byte { + faviconPath := faviconDir + "favicon.png" + ret, _ := p.uiBox.ReadFile(faviconPath) + return ret +} diff --git a/pkg/api/resolver_mutation_configure.go b/pkg/api/resolver_mutation_configure.go index d9fa32225..3c8f58788 100644 --- a/pkg/api/resolver_mutation_configure.go +++ b/pkg/api/resolver_mutation_configure.go @@ -294,6 +294,8 @@ func (r *mutationResolver) ConfigureInterface(ctx context.Context, input models. setBool(config.NoBrowser, input.NoBrowser) + setBool(config.NotificationsEnabled, input.NotificationsEnabled) + if input.WallPlayback != nil { c.Set(config.WallPlayback, *input.WallPlayback) } diff --git a/pkg/api/resolver_query_configuration.go b/pkg/api/resolver_query_configuration.go index e79eccc87..7a9d71d94 100644 --- a/pkg/api/resolver_query_configuration.go +++ b/pkg/api/resolver_query_configuration.go @@ -111,6 +111,7 @@ func makeConfigInterfaceResult() *models.ConfigInterfaceResult { wallShowTitle := config.GetWallShowTitle() wallPlayback := config.GetWallPlayback() noBrowser := config.GetNoBrowser() + notificationsEnabled := config.GetNotificationsEnabled() maximumLoopDuration := config.GetMaximumLoopDuration() autostartVideo := config.GetAutostartVideo() autostartVideoOnPlaySelected := config.GetAutostartVideoOnPlaySelected() @@ -133,6 +134,7 @@ func makeConfigInterfaceResult() *models.ConfigInterfaceResult { WallPlayback: &wallPlayback, MaximumLoopDuration: &maximumLoopDuration, NoBrowser: &noBrowser, + NotificationsEnabled: ¬ificationsEnabled, AutostartVideo: &autostartVideo, ShowStudioAsText: &showStudioAsText, AutostartVideoOnPlaySelected: &autostartVideoOnPlaySelected, diff --git a/pkg/api/server.go b/pkg/api/server.go index 625392ff4..cf5f4041a 100644 --- a/pkg/api/server.go +++ b/pkg/api/server.go @@ -23,8 +23,10 @@ import ( "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" "github.com/gorilla/websocket" - "github.com/pkg/browser" + + "github.com/go-chi/httplog" "github.com/rs/cors" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/manager" "github.com/stashapp/stash/pkg/manager/config" @@ -36,7 +38,6 @@ import ( var version string var buildstamp string var githash string -var officialBuild string func Start(uiBox embed.FS, loginUIBox embed.FS) { initialiseImages() @@ -52,7 +53,10 @@ func Start(uiBox embed.FS, loginUIBox embed.FS) { c := config.GetInstance() if c.GetLogAccess() { - r.Use(middleware.Logger) + httpLogger := httplog.NewLogger("Stash", httplog.Options{ + Concise: true, + }) + r.Use(httplog.RequestLogger(httpLogger)) } r.Use(SecurityHeadersMiddleware) r.Use(middleware.DefaultCompress) @@ -246,25 +250,16 @@ func Start(uiBox embed.FS, loginUIBox embed.FS) { TLSConfig: tlsConfig, } + printVersion() + go printLatestVersion(context.TODO()) + logger.Infof("stash is listening on " + address) + if tlsConfig != nil { + displayAddress = "https://" + displayAddress + "/" + } else { + displayAddress = "http://" + displayAddress + "/" + } + go func() { - printVersion() - printLatestVersion(context.TODO()) - logger.Infof("stash is listening on " + address) - if tlsConfig != nil { - displayAddress = "https://" + displayAddress + "/" - } else { - displayAddress = "http://" + displayAddress + "/" - } - - // This can be done before actually starting the server, as modern browsers will - // automatically reload the page if a local port is closed at page load and then opened. - if !c.GetNoBrowser() && manager.GetInstance().IsDesktop() { - err = browser.OpenURL(displayAddress) - if err != nil { - logger.Error("Could not open browser: " + err.Error()) - } - } - if tlsConfig != nil { logger.Infof("stash is running at " + displayAddress) logger.Error(server.ListenAndServeTLS("", "")) @@ -272,12 +267,14 @@ func Start(uiBox embed.FS, loginUIBox embed.FS) { logger.Infof("stash is running at " + displayAddress) logger.Error(server.ListenAndServe()) } + manager.GetInstance().Shutdown(0) }() + desktop.Start(manager.GetInstance(), &FaviconProvider{uiBox: uiBox}) } func printVersion() { versionString := githash - if IsOfficialBuild() { + if config.IsOfficialBuild() { versionString += " - Official Build" } else { versionString += " - Unofficial Build" @@ -288,10 +285,6 @@ func printVersion() { fmt.Printf("stash version: %s - %s\n", versionString, buildstamp) } -func IsOfficialBuild() bool { - return officialBuild == "true" -} - func GetVersion() (string, string, string) { return version, githash, buildstamp } diff --git a/pkg/desktop/desktop.go b/pkg/desktop/desktop.go new file mode 100644 index 000000000..cad8ade3c --- /dev/null +++ b/pkg/desktop/desktop.go @@ -0,0 +1,170 @@ +package desktop + +import ( + "io/ioutil" + "os" + "os/exec" + "path" + "path/filepath" + "runtime" + "strconv" + "strings" + + "github.com/pkg/browser" + "github.com/stashapp/stash/pkg/logger" + "github.com/stashapp/stash/pkg/manager/config" + "github.com/stashapp/stash/pkg/utils" + "golang.org/x/term" +) + +type ShutdownHandler interface { + Shutdown(code int) +} + +type FaviconProvider interface { + GetFavicon() []byte + GetFaviconPng() []byte +} + +func Start(shutdownHandler ShutdownHandler, faviconProvider FaviconProvider) { + if IsDesktop() { + c := config.GetInstance() + if !c.GetNoBrowser() { + openURLInBrowser("") + } + writeStashIcon(faviconProvider) + startSystray(shutdownHandler, faviconProvider) + } +} + +// openURLInBrowser opens a browser to the Stash UI. Path can be an empty string for main page. +func openURLInBrowser(path string) { + // This can be done before actually starting the server, as modern browsers will + // automatically reload the page if a local port is closed at page load and then opened. + serverAddress := getServerURL(path) + + err := browser.OpenURL(serverAddress) + if err != nil { + logger.Error("Could not open browser: " + err.Error()) + } +} + +func SendNotification(title string, text string) { + if IsDesktop() { + c := config.GetInstance() + if c.GetNotificationsEnabled() { + sendNotification(title, text) + } + } +} + +func IsDesktop() bool { + // Check if running under root + if os.Getuid() == 0 { + return false + } + // Check if stdin is a terminal + if term.IsTerminal(int(os.Stdin.Fd())) { + return false + } + if isService() { + return false + } + if IsServerDockerized() { + return false + } + + return true +} + +func IsServerDockerized() bool { + return isServerDockerized() +} + +// Set a command to execute in the background, instead of spawning a shell window +func HideExecShell(cmd *exec.Cmd) { + hideExecShell(cmd) +} + +// writeStashIcon writes the current stash logo to config/icon.png +func writeStashIcon(faviconProvider FaviconProvider) { + c := config.GetInstance() + if !c.IsNewSystem() { + iconPath := path.Join(c.GetConfigPath(), "icon.png") + err := ioutil.WriteFile(iconPath, faviconProvider.GetFaviconPng(), 0644) + if err != nil { + logger.Errorf("Couldn't write icon file: %s", err.Error()) + } + } +} + +// IsAllowedAutoUpdate tries to determine if the stash binary was installed from a +// package manager or if touching the executable is otherwise a bad idea +func IsAllowedAutoUpdate() bool { + + // Only try to update if downloaded from official sources + if !config.IsOfficialBuild() { + return false + } + + // Avoid updating if installed from package manager + if runtime.GOOS == "linux" { + executablePath, err := os.Executable() + if err != nil { + logger.Errorf("Cannot get executable path: %s", err) + return false + } + executablePath, err = filepath.EvalSymlinks(executablePath) + if err != nil { + logger.Errorf("Cannot get executable path: %s", err) + return false + } + if utils.IsPathInDir("/usr", executablePath) || utils.IsPathInDir("/opt", executablePath) { + return false + } + + if isServerDockerized() { + return false + } + } + + return true +} + +func getIconPath() string { + return path.Join(config.GetInstance().GetConfigPath(), "icon.png") +} + +func RevealInFileManager(path string) { + exists, err := utils.FileExists(path) + if err != nil { + logger.Errorf("Error checking file: %s", err) + return + } + if exists && IsDesktop() { + revealInFileManager(path) + } +} + +func getServerURL(path string) string { + c := config.GetInstance() + serverAddress := c.GetHost() + if serverAddress == "0.0.0.0" { + serverAddress = "localhost" + } + serverAddress = serverAddress + ":" + strconv.Itoa(c.GetPort()) + + proto := "" + if c.HasTLSConfig() { + proto = "https://" + } else { + proto = "http://" + } + serverAddress = proto + serverAddress + "/" + + if path != "" { + serverAddress += strings.TrimPrefix(path, "/") + } + + return serverAddress +} diff --git a/pkg/desktop/desktop_platform_darwin.go b/pkg/desktop/desktop_platform_darwin.go new file mode 100644 index 000000000..53c9776f2 --- /dev/null +++ b/pkg/desktop/desktop_platform_darwin.go @@ -0,0 +1,40 @@ +//go:build darwin +// +build darwin + +package desktop + +import ( + "os/exec" + + "github.com/kermieisinthehouse/gosx-notifier" + "github.com/stashapp/stash/pkg/logger" +) + +func isService() bool { + // MacOS /does/ support services, using launchd, but there is no straightforward way to check if it was used. + return false +} + +func isServerDockerized() bool { + return false +} + +func hideExecShell(cmd *exec.Cmd) { + +} + +func sendNotification(notificationTitle string, notificationText string) { + notification := gosxnotifier.NewNotification(notificationText) + notification.Title = notificationTitle + notification.AppIcon = getIconPath() + notification.Link = getServerURL("") + err := notification.Push() + + if err != nil { + logger.Errorf("Could not send MacOS notification: %s", err.Error()) + } +} + +func revealInFileManager(path string) { + exec.Command(`open`, `-R`, path) +} diff --git a/pkg/desktop/desktop_platform_linux.go b/pkg/desktop/desktop_platform_linux.go new file mode 100644 index 000000000..b1893c0e7 --- /dev/null +++ b/pkg/desktop/desktop_platform_linux.go @@ -0,0 +1,43 @@ +//go:build linux +// +build linux + +package desktop + +import ( + "io/ioutil" + "os" + "os/exec" + "strings" + + "github.com/stashapp/stash/pkg/logger" +) + +// isService checks if started by init, e.g. stash is a *nix systemd service +func isService() bool { + return os.Getppid() == 1 +} + +func isServerDockerized() bool { + _, dockerEnvErr := os.Stat("/.dockerenv") + cgroups, _ := ioutil.ReadFile("/proc/self/cgroup") + if !os.IsNotExist(dockerEnvErr) || strings.Contains(string(cgroups), "docker") { + return true + } + + return false +} + +func hideExecShell(cmd *exec.Cmd) { + +} + +func sendNotification(notificationTitle string, notificationText string) { + err := exec.Command("notify-send", "-i", getIconPath(), notificationTitle, notificationText, "-a", "Stash").Run() + if err != nil { + logger.Errorf("Error sending notification on Linux: %s", err.Error()) + } +} + +func revealInFileManager(path string) { + +} diff --git a/pkg/desktop/desktop_platform_windows.go b/pkg/desktop/desktop_platform_windows.go new file mode 100644 index 000000000..7a887d508 --- /dev/null +++ b/pkg/desktop/desktop_platform_windows.go @@ -0,0 +1,56 @@ +//go:build windows +// +build windows + +package desktop + +import ( + "os/exec" + "syscall" + + "golang.org/x/sys/windows" + + "github.com/go-toast/toast" + "github.com/stashapp/stash/pkg/logger" + "golang.org/x/sys/windows/svc" +) + +func isService() bool { + result, err := svc.IsWindowsService() + if err != nil { + logger.Errorf("Encountered error checking if running as Windows service: %s", err.Error()) + return false + } + return result +} + +func isServerDockerized() bool { + return false +} + +// On Windows, calling exec.Cmd.Start() will create a cmd window, even if we live in the taskbar. +// We don't want every ffmpeg / plugin to pop up a window. +func hideExecShell(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: windows.DETACHED_PROCESS} +} + +func sendNotification(notificationTitle string, notificationText string) { + notification := toast.Notification{ + AppID: "Stash", + Title: notificationTitle, + Message: notificationText, + Icon: getIconPath(), + Actions: []toast.Action{{ + Type: "protocol", + Label: "Open Stash", + Arguments: getServerURL(""), + }}, + } + err := notification.Push() + if err != nil { + logger.Errorf("Error creating Windows notification: %s", err.Error()) + } +} + +func revealInFileManager(path string) { + exec.Command(`explorer`, `\select`, path) +} diff --git a/pkg/desktop/icon_windows.syso b/pkg/desktop/icon_windows.syso new file mode 100644 index 0000000000000000000000000000000000000000..ac347dda478486b2da8bcea7b7d7c636ef5645cc GIT binary patch literal 42710 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.\nError JSON:\n%s\nError: %s", videoPath, string(out), err.Error()) diff --git a/pkg/ffmpeg/stream.go b/pkg/ffmpeg/stream.go index 1f4d4960e..41832fc89 100644 --- a/pkg/ffmpeg/stream.go +++ b/pkg/ffmpeg/stream.go @@ -8,6 +8,7 @@ import ( "strconv" "strings" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/models" ) @@ -220,6 +221,7 @@ func (e *Encoder) stream(probeResult VideoFile, options TranscodeStreamOptions) return nil, err } + desktop.HideExecShell(cmd) if err = cmd.Start(); err != nil { return nil, err } diff --git a/pkg/image/vips.go b/pkg/image/vips.go index 061afa5f8..951406848 100644 --- a/pkg/image/vips.go +++ b/pkg/image/vips.go @@ -6,6 +6,7 @@ import ( "os/exec" "strings" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/logger" ) @@ -32,6 +33,7 @@ func (e *vipsEncoder) run(args []string, stdin *bytes.Buffer) (string, error) { cmd.Stderr = &stderr cmd.Stdin = stdin + desktop.HideExecShell(cmd) if err := cmd.Start(); err != nil { return "", err } diff --git a/pkg/job/manager.go b/pkg/job/manager.go index ed4dda133..95837ca2a 100644 --- a/pkg/job/manager.go +++ b/pkg/job/manager.go @@ -2,9 +2,13 @@ package job import ( "context" + "fmt" + "strconv" + "strings" "sync" "time" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/utils" ) @@ -204,9 +208,14 @@ func (m *Manager) onJobFinish(job *Job) { } else { job.Status = StatusFinished } - t := time.Now() job.EndTime = &t + cleanDesc := strings.TrimRight(job.Description, ".") + timeElapsed := job.EndTime.Sub(*job.StartTime) + hours := fmt.Sprintf("%+02s", strconv.FormatFloat(timeElapsed.Hours(), 'f', 0, 64)) + minutes := fmt.Sprintf("%+02s", strconv.FormatFloat(timeElapsed.Minutes(), 'f', 0, 64)) + seconds := fmt.Sprintf("%+02s", strconv.FormatFloat(timeElapsed.Seconds(), 'f', 0, 64)) + desktop.SendNotification("Task Finished", "Task \""+cleanDesc+"\" is finished in "+hours+":"+minutes+":"+seconds+".") } func (m *Manager) removeJob(job *Job) { diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 0b4a4225b..1a4c0d180 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -32,6 +32,7 @@ func Init(logFile string, logOut bool, logLevel string) { customFormatter.TimestampFormat = "2006-01-02 15:04:05" customFormatter.ForceColors = true customFormatter.FullTimestamp = true + logger.SetOutput(os.Stderr) logger.SetFormatter(customFormatter) // #1837 - trigger the console to use color-mode since it won't be diff --git a/pkg/manager/config/config.go b/pkg/manager/config/config.go index c95628930..6e02dad4a 100644 --- a/pkg/manager/config/config.go +++ b/pkg/manager/config/config.go @@ -21,6 +21,8 @@ import ( "github.com/stashapp/stash/pkg/utils" ) +var officialBuild string + const ( Stash = "stash" Cache = "cache" @@ -178,8 +180,12 @@ const ( deleteGeneratedDefaultDefault = true // Desktop Integration Options - NoBrowser = "noBrowser" - NoBrowserDefault = false + NoBrowser = "noBrowser" + NoBrowserDefault = false + NotificationsEnabled = "notifications_enabled" + NotificationsEnabledDefault = true + ShowOneTimeMovedNotification = "show_one_time_moved_notification" + ShowOneTimeMovedNotificationDefault = false // File upload options MaxUploadSize = "max_upload_size" @@ -211,6 +217,10 @@ func (s *StashBoxError) Error() string { return "Stash-box: " + s.msg } +func IsOfficialBuild() bool { + return officialBuild == "true" +} + type Instance struct { // main instance - backed by config file main *viper.Viper @@ -221,8 +231,9 @@ type Instance struct { cpuProfilePath string isNewSystem bool - certFile string - keyFile string + // configUpdates chan int + certFile string + keyFile string sync.RWMutex // deadlock.RWMutex // for deadlock testing/issues } @@ -270,7 +281,25 @@ func (i *Instance) GetNoBrowser() bool { return i.getBool(NoBrowser) } +func (i *Instance) GetNotificationsEnabled() bool { + return i.getBool(NotificationsEnabled) +} + +// func (i *Instance) GetConfigUpdatesChannel() chan int { +// return i.configUpdates +// } + +// GetShowOneTimeMovedNotification shows whether a small notification to inform the user that Stash +// will no longer show a terminal window, and instead will be available in the tray, should be shown. +// It is true when an existing system is started after upgrading, and set to false forever after it is shown. +func (i *Instance) GetShowOneTimeMovedNotification() bool { + return i.getBool(ShowOneTimeMovedNotification) +} + func (i *Instance) Set(key string, value interface{}) { + // if key == MenuItems { + // i.configUpdates <- 0 + // } i.Lock() defer i.Unlock() i.main.Set(key, value) @@ -1184,6 +1213,8 @@ func (i *Instance) setDefaultValues(write bool) error { i.main.SetDefault(Generated, i.main.GetString(Metadata)) i.main.SetDefault(NoBrowser, NoBrowserDefault) + i.main.SetDefault(NotificationsEnabled, NotificationsEnabledDefault) + i.main.SetDefault(ShowOneTimeMovedNotification, ShowOneTimeMovedNotificationDefault) // Set default scrapers and plugins paths i.main.SetDefault(ScrapersPath, defaultScrapersPath) @@ -1210,6 +1241,12 @@ func (i *Instance) setExistingSystemDefaults() error { i.main.Set(NoBrowser, true) } + // Existing systems as of the introduction of the taskbar should inform users. + if !i.main.InConfig(ShowOneTimeMovedNotification) { + configDirtied = true + i.main.Set(ShowOneTimeMovedNotification, true) + } + if configDirtied { return i.main.WriteConfig() } @@ -1247,4 +1284,5 @@ func (i *Instance) setInitialConfig(write bool) error { func (i *Instance) FinalizeSetup() { i.isNewSystem = false + // i.configUpdates <- 0 } diff --git a/pkg/manager/config/init.go b/pkg/manager/config/init.go index 0b2ddb6b8..02322ec62 100644 --- a/pkg/manager/config/init.go +++ b/pkg/manager/config/init.go @@ -45,6 +45,7 @@ func Initialize() (*Instance, error) { _ = GetInstance() instance.overrides = overrides instance.cpuProfilePath = flags.cpuProfilePath + // instance.configUpdates = make(chan int) if err = initConfig(instance, flags); err != nil { return diff --git a/pkg/manager/generator.go b/pkg/manager/generator.go index c7aed9716..68a186fa0 100644 --- a/pkg/manager/generator.go +++ b/pkg/manager/generator.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/ffmpeg" "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/utils" @@ -72,6 +73,7 @@ func (g *GeneratorInfo) calculateFrameRate(videoStream *ffmpeg.FFProbeStream) er } command := exec.Command(string(instance.FFMPEG), args...) + desktop.HideExecShell(command) var stdErrBuffer bytes.Buffer command.Stderr = &stdErrBuffer // Frames go to stderr rather than stdout if err := command.Run(); err == nil { diff --git a/pkg/manager/manager.go b/pkg/manager/manager.go index f49711808..b313909b0 100644 --- a/pkg/manager/manager.go +++ b/pkg/manager/manager.go @@ -4,12 +4,9 @@ import ( "context" "errors" "fmt" - "io/ioutil" "os" "path/filepath" - "runtime" "runtime/pprof" - "strings" "sync" "time" @@ -407,34 +404,6 @@ func (s *singleton) Migrate(ctx context.Context, input models.MigrateInput) erro return nil } -func (s *singleton) IsDesktop() bool { - // check if running under root - if os.Getuid() == 0 { - return false - } - // check if started by init, e.g. stash is a *nix systemd service / MacOS launchd service - if os.Getppid() == 1 { - return false - } - if IsServerDockerized() { - return false - } - - return true -} - -func IsServerDockerized() bool { - if runtime.GOOS == "linux" { - _, dockerEnvErr := os.Stat("/.dockerenv") - cgroups, _ := ioutil.ReadFile("/proc/self/cgroup") - if os.IsExist(dockerEnvErr) || strings.Contains(string(cgroups), "docker") { - return true - } - } - - return false -} - func (s *singleton) GetSystemStatus() *models.SystemStatus { status := models.SystemStatusEnumOk dbSchema := int(database.Version()) @@ -458,8 +427,15 @@ func (s *singleton) GetSystemStatus() *models.SystemStatus { } // Shutdown gracefully stops the manager -func (s *singleton) Shutdown() error { +func (s *singleton) Shutdown(code int) { // TODO: Each part of the manager needs to gracefully stop at some point // for now, we just close the database. - return database.Close() + err := database.Close() + if err != nil { + logger.Errorf("Error closing database: %s", err) + if code == 0 { + os.Exit(1) + } + } + os.Exit(code) } diff --git a/pkg/plugin/raw.go b/pkg/plugin/raw.go index 1fcc6ad87..6456cab4c 100644 --- a/pkg/plugin/raw.go +++ b/pkg/plugin/raw.go @@ -8,6 +8,7 @@ import ( "os/exec" "sync" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/plugin/common" ) @@ -87,6 +88,7 @@ func (t *rawPluginTask) Start() error { t.waitGroup.Add(1) t.done = make(chan bool, 1) + desktop.HideExecShell(cmd) if err = cmd.Start(); err != nil { return fmt.Errorf("error running plugin: %v", err) } diff --git a/pkg/scraper/script.go b/pkg/scraper/script.go index cb6900ace..8212c3deb 100644 --- a/pkg/scraper/script.go +++ b/pkg/scraper/script.go @@ -10,6 +10,7 @@ import ( "path/filepath" "strings" + "github.com/stashapp/stash/pkg/desktop" "github.com/stashapp/stash/pkg/logger" "github.com/stashapp/stash/pkg/models" ) @@ -66,6 +67,7 @@ func (s *scriptScraper) runScraperScript(inString string, out interface{}) error logger.Error("Scraper stdout not available: " + err.Error()) } + desktop.HideExecShell(cmd) if err = cmd.Start(); err != nil { logger.Error("Error running scraper script: " + err.Error()) return errors.New("error running scraper script") diff --git a/scripts/cross-compile.sh b/scripts/cross-compile.sh index 2012d9b6b..3640551ae 100755 --- a/scripts/cross-compile.sh +++ b/scripts/cross-compile.sh @@ -1,7 +1,6 @@ #!/bin/bash -# "stashapp/compiler:develop" "stashapp/compiler:4" -COMPILER_CONTAINER="stashapp/compiler:5" +COMPILER_CONTAINER="stashapp/compiler:6" BUILD_DATE=`go run -mod=vendor scripts/getDate.go` GITHASH=`git rev-parse --short HEAD` @@ -10,8 +9,8 @@ STASH_VERSION=`git describe --tags --exclude latest_develop` SETENV="BUILD_DATE=\"$BUILD_DATE\" GITHASH=$GITHASH STASH_VERSION=\"$STASH_VERSION\"" SETUP="export CGO_ENABLED=1;" WINDOWS="echo '=== Building Windows binary ==='; $SETENV make cross-compile-windows;" -DARWIN="echo '=== Building OSX binary ==='; $SETENV make cross-compile-osx-intel;" -DARWIN_ARM64="echo '=== Building OSX (arm64) binary ==='; $SETENV make cross-compile-osx-applesilicon;" +DARWIN="echo '=== Building OSX binary ==='; $SETENV make cross-compile-macos-intel;" +DARWIN_ARM64="echo '=== Building OSX (arm64) binary ==='; $SETENV make cross-compile-macos-applesilicon;" LINUX_AMD64="echo '=== Building Linux (amd64) binary ==='; $SETENV make cross-compile-linux;" LINUX_ARM64v8="echo '=== Building Linux (armv8/arm64) binary ==='; $SETENV make cross-compile-linux-arm64v8;" LINUX_ARM32v7="echo '=== Building Linux (armv7/armhf) binary ==='; $SETENV make cross-compile-linux-arm32v7;" diff --git a/scripts/generate_icons.sh b/scripts/generate_icons.sh new file mode 100755 index 000000000..0fbd12100 --- /dev/null +++ b/scripts/generate_icons.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Update the Stash icon throughout the project from a master stash-logo.png + +# Imagemagick, and go packages icns and rsrc are required. +# Copy a high-resolution stash-logo.png to this stash/scripts folder +# and run this script from said folder, commit the result. + +if [ ! -f "stash-logo.png" ]; then + echo "stash-logo.png not found." + exit +fi + +if [ -z "$GOPATH" ]; then + echo "GOPATH environment variable not set" + exit +fi + +if [ ! -e "$GOPATH/bin/rsrc" ]; then + echo "Missing Dependency:" + echo "Please run the following /outside/ of the stash folder:" + echo "go install github.com/akavel/rsrc@latest" + exit +fi + +if [ ! -e "$GOPATH/bin/icnsify" ]; then + echo "Missing Dependency:" + echo "Please run the following /outside/ of the stash folder:" + echo "go install github.com/jackmordaunt/icns/v2/cmd/icnsify@latest" + exit +fi + +# Favicon, used for web favicon, windows systray icon, windows executable icon +convert stash-logo.png -define icon:auto-resize=256,64,48,32,16 favicon.ico +cp favicon.ico ../ui/v2.5/public/ + +# Build .syso for Windows icon, consumed by linker while building stash-win.exe +"$GOPATH"/bin/rsrc -ico favicon.ico -o icon_windows.syso +mv icon_windows.syso ../pkg/desktop/ + +# *nixes systray icon +convert stash-logo.png -resize x256 favicon.png +cp favicon.png ../ui/v2.5/public/ + +# MacOS, used for bundle icon +# https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html +"$GOPATH"/bin/icnsify -i stash-logo.png -o icon.icns +mv icon.icns macos-bundle/Contents/Resources/icon.icns + +# cleanup +rm favicon.png favicon.ico \ No newline at end of file diff --git a/scripts/macos-bundle/Contents/Info.plist b/scripts/macos-bundle/Contents/Info.plist new file mode 100644 index 000000000..9a02e9cc2 --- /dev/null +++ b/scripts/macos-bundle/Contents/Info.plist @@ -0,0 +1,18 @@ + + + + + CFBundleExecutable + stash + CFBundleIconFile + icon.icns + CFBundleTypeIconFile + icon.icns + CFBundleIdentifier + org.stashapp.stash + NSHighResolutionCapable + True + LSUIElement + 1 + + \ No newline at end of file diff --git a/scripts/macos-bundle/Contents/Resources/icon.icns b/scripts/macos-bundle/Contents/Resources/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..d60ac9a2bcac002f2a1ebd2dcbe7e615216b8cf6 GIT binary patch literal 154872 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

kEsM+`C)+K+ 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 WHW2=^m9c*_IFw$4m;0Yv+5Z74z=41O literal 0 HcmV?d00001 diff --git a/scripts/stash-logo.png b/scripts/stash-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d64ef699fc3b097aa9e069f14d31ade6d57a801b GIT binary patch literal 227830 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 S-pLuJ0ajc8RMsz6xBeHaEF@6? literal 0 HcmV?d00001 diff --git a/ui/v2.5/public/favicon.ico b/ui/v2.5/public/favicon.ico index 6ff0465ca7c341d7b47feea0afeefe1ef90dcc08..028c3ba3bb66cca0c486642cd00cbeefa6a34245 100644 GIT binary patch literal 42220 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 literal 3134 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 Jj}UIx{sZ4llMw&_ diff --git a/ui/v2.5/public/favicon.png b/ui/v2.5/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..ea145b18152040a0119a242e7ecfc513a05f7ffd GIT binary patch literal 11361 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 E0i^W{t^fc4 literal 0 HcmV?d00001 diff --git a/ui/v2.5/public/manifest.json b/ui/v2.5/public/manifest.json index f9321c89e..e3d9e7c3b 100755 --- a/ui/v2.5/public/manifest.json +++ b/ui/v2.5/public/manifest.json @@ -8,7 +8,8 @@ "type": "image/x-icon" } ], - "start_url": ".", + "start_url": "/", + "scope": ".", "display": "standalone", "theme_color": "#000000", "background_color": "#ffffff" diff --git a/ui/v2.5/src/components/Changelog/versions/v0130.md b/ui/v2.5/src/components/Changelog/versions/v0130.md index 9a9c42a56..e2a369c95 100644 --- a/ui/v2.5/src/components/Changelog/versions/v0130.md +++ b/ui/v2.5/src/components/Changelog/versions/v0130.md @@ -1,4 +1,6 @@ ### ✨ New Features +* Open stash in system tray on Windows/MacOS when not running via terminal. ([#2073](https://github.com/stashapp/stash/pull/2073)) +* Optionally send desktop notifications when a task completes. ([#2073](https://github.com/stashapp/stash/pull/2073)) * Added button to image card to view image in Lightbox. ([#2275](https://github.com/stashapp/stash/pull/2275)) * Added support for submitting performer/scene drafts to stash-box. ([#2234](https://github.com/stashapp/stash/pull/2234)) diff --git a/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx b/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx index 6df6059e7..5d8b23cde 100644 --- a/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx +++ b/ui/v2.5/src/components/Settings/SettingsInterfacePanel/SettingsInterfacePanel.tsx @@ -93,6 +93,13 @@ export const SettingsInterfacePanel: React.FC = () => { checked={iface.noBrowser ?? undefined} onChange={(v) => saveInterface({ noBrowser: v })} /> + saveInterface({ notificationsEnabled: v })} + /> diff --git a/ui/v2.5/src/locales/en-GB.json b/ui/v2.5/src/locales/en-GB.json index 0f0486425..ad327313d 100644 --- a/ui/v2.5/src/locales/en-GB.json +++ b/ui/v2.5/src/locales/en-GB.json @@ -414,7 +414,9 @@ "desktop_integration": { "desktop_integration": "Desktop Integration", "skip_opening_browser": "Skip Opening Browser", - "skip_opening_browser_on_startup": "Skip auto-opening browser during startup" + "skip_opening_browser_on_startup": "Skip auto-opening browser during startup", + "notifications_enabled": "Enable Notifications", + "send_desktop_notifications_for_events": "Send desktop notifications for events" }, "editing": { "disable_dropdown_create": { diff --git a/vendor/github.com/apenwarr/fixconsole/.gitignore b/vendor/github.com/apenwarr/fixconsole/.gitignore new file mode 100644 index 000000000..b25c15b81 --- /dev/null +++ b/vendor/github.com/apenwarr/fixconsole/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/vendor/github.com/apenwarr/fixconsole/LICENSE b/vendor/github.com/apenwarr/fixconsole/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/vendor/github.com/apenwarr/fixconsole/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/apenwarr/fixconsole/fixconsole_default.go b/vendor/github.com/apenwarr/fixconsole/fixconsole_default.go new file mode 100644 index 000000000..882bd1be8 --- /dev/null +++ b/vendor/github.com/apenwarr/fixconsole/fixconsole_default.go @@ -0,0 +1,14 @@ +// +build !windows + +package fixconsole + +// On non-windows platforms, we don't need to do anything. The console +// starts off attached already, if it exists. + +func AttachConsole() error { + return nil +} + +func FixConsoleIfNeeded() error { + return nil +} diff --git a/vendor/github.com/apenwarr/fixconsole/fixconsole_windows.go b/vendor/github.com/apenwarr/fixconsole/fixconsole_windows.go new file mode 100644 index 000000000..9abde1a1b --- /dev/null +++ b/vendor/github.com/apenwarr/fixconsole/fixconsole_windows.go @@ -0,0 +1,132 @@ +package fixconsole + +import ( + "fmt" + "github.com/apenwarr/w32" + "golang.org/x/sys/windows" + "os" + "syscall" +) + +func AttachConsole() error { + const ATTACH_PARENT_PROCESS = ^uintptr(0) + proc := syscall.MustLoadDLL("kernel32.dll").MustFindProc("AttachConsole") + r1, _, err := proc.Call(ATTACH_PARENT_PROCESS) + if r1 == 0 { + errno, ok := err.(syscall.Errno) + if ok && errno == w32.ERROR_INVALID_HANDLE { + // console handle doesn't exist; not a real + // error, but the console handle will be + // invalid. + return nil + } + return err + } else { + return nil + } +} + +var oldStdin, oldStdout, oldStderr *os.File + +// Windows console output is a mess. +// +// If you compile as "-H windows", then if you launch your program without +// a console, Windows forcibly creates one to use as your stdin/stdout, which +// is silly for a GUI app, so we can't do that. +// +// If you compile as "-H windowsgui", then it doesn't create a console for +// your app... but also doesn't provide a working stdin/stdout/stderr even if +// you *did* launch from the console. However, you can use AttachConsole() +// to get a handle to your parent process's console, if any, and then +// os.NewFile() to turn that handle into a fd usable as stdout/stderr. +// +// However, then you have the problem that if you redirect stdout or stderr +// from the shell, you end up ignoring the redirection by forcing it to the +// console. +// +// To fix *that*, we have to detect whether there was a pre-existing stdout +// or not. We can check GetStdHandle(), which returns 0 for "should be +// console" and nonzero for "already pointing at a file." +// +// Be careful though! As soon as you run AttachConsole(), it resets *all* +// the GetStdHandle() handles to point them at the console instead, thus +// throwing away the original file redirects. So we have to GetStdHandle() +// *before* AttachConsole(). +// +// For some reason, powershell redirections provide a valid file handle, but +// writing to that handle doesn't write to the file. I haven't found a way +// to work around that. (Windows 10.0.17763.379) +// +// Net result is as follows. +// Before: +// SHELL NON-REDIRECTED REDIRECTED +// explorer.exe no console n/a +// cmd.exe broken works +// powershell broken broken +// WSL bash broken works +// After +// SHELL NON-REDIRECTED REDIRECTED +// explorer.exe no console n/a +// cmd.exe works works +// powershell works broken +// WSL bash works works +// +// We don't seem to make anything worse, at least. +func FixConsoleIfNeeded() error { + // Retain the original console objects, to prevent Go from automatically + // closing their file descriptors when they get garbage collected. + // You never want to close file descriptors 0, 1, and 2. + oldStdin, oldStdout, oldStderr = os.Stdin, os.Stdout, os.Stderr + + stdin, _ := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE) + stdout, _ := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE) + stderr, _ := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE) + + var invalid syscall.Handle + con := invalid + + if stdin == invalid || stdout == invalid || stderr == invalid { + err := AttachConsole() + if err != nil { + return fmt.Errorf("attachconsole: %v", err) + } + + if stdin == invalid { + stdin, _ = syscall.GetStdHandle(syscall.STD_INPUT_HANDLE) + } + if stdout == invalid { + stdout, _ = syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE) + con = stdout + } + if stderr == invalid { + stderr, _ = syscall.GetStdHandle(syscall.STD_ERROR_HANDLE) + con = stderr + } + } + + if con != invalid { + // Make sure the console is configured to convert + // \n to \r\n, like Go programs expect. + h := windows.Handle(con) + var st uint32 + err := windows.GetConsoleMode(h, &st) + if err != nil { + return fmt.Errorf("GetConsoleMode: %v", err) + } + err = windows.SetConsoleMode(h, st&^windows.DISABLE_NEWLINE_AUTO_RETURN) + if err != nil { + return fmt.Errorf("SetConsoleMode: %v", err) + } + } + + if stdin != invalid { + os.Stdin = os.NewFile(uintptr(stdin), "stdin") + } + if stdout != invalid { + os.Stdout = os.NewFile(uintptr(stdout), "stdout") + } + if stderr != invalid { + os.Stderr = os.NewFile(uintptr(stderr), "stderr") + } + return nil +} diff --git a/vendor/github.com/apenwarr/w32/AUTHORS b/vendor/github.com/apenwarr/w32/AUTHORS new file mode 100644 index 000000000..93ec5dba5 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/AUTHORS @@ -0,0 +1,19 @@ +# This is the official list of 'w32' authors for copyright purposes. + +# Names should be added to this file as +# Name or Organization +# The email address is not required for organizations. + +# Please keep the list sorted. + +# Contributors +# ============ + +Allen Dang +Benny Siegert +Bruno Bigras +Daniel Joos +Gerald Rosenberg +Liam Bowen +Michael Henke +Paul Maddox \ No newline at end of file diff --git a/vendor/github.com/apenwarr/w32/LICENSE b/vendor/github.com/apenwarr/w32/LICENSE new file mode 100644 index 000000000..9f36608c8 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2010-2012 The w32 Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/apenwarr/w32/README.md b/vendor/github.com/apenwarr/w32/README.md new file mode 100644 index 000000000..ed196e766 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/README.md @@ -0,0 +1,33 @@ +About w32 +========== + +w32 is a wrapper of windows apis for the Go Programming Language. + +It wraps win32 apis to "Go style" to make them easier to use. + +Setup +===== + +1. Make sure you have a working Go installation and build environment, + see this go-nuts post for details: + http://groups.google.com/group/golang-nuts/msg/5c87630a84f4fd0c + + Updated versions of the Windows Go build are available here: + http://code.google.com/p/gomingw/downloads/list + +2. Create a "gopath" directory if you do not have one yet and set the + GOPATH variable accordingly. For example: + mkdir -p go-externals/src + export GOPATH=${PWD}/go-externals + +3. go get github.com/AllenDang/w32 + +4. go install github.com/AllenDang/w32... + +Contribute +========== + +Contributions in form of design, code, documentation, bug reporting or other +ways you see fit are very welcome. + +Thank You! diff --git a/vendor/github.com/apenwarr/w32/advapi32.go b/vendor/github.com/apenwarr/w32/advapi32.go new file mode 100644 index 000000000..10e1416ca --- /dev/null +++ b/vendor/github.com/apenwarr/w32/advapi32.go @@ -0,0 +1,389 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "errors" + "fmt" + "syscall" + "unsafe" +) + +var ( + modadvapi32 = syscall.NewLazyDLL("advapi32.dll") + + // procRegSetKeyValue = modadvapi32.NewProc("RegSetKeyValueW") + procCloseEventLog = modadvapi32.NewProc("CloseEventLog") + procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle") + procControlService = modadvapi32.NewProc("ControlService") + procControlTrace = modadvapi32.NewProc("ControlTraceW") + procInitializeSecurityDescriptor = modadvapi32.NewProc("InitializeSecurityDescriptor") + procOpenEventLog = modadvapi32.NewProc("OpenEventLogW") + procOpenSCManager = modadvapi32.NewProc("OpenSCManagerW") + procOpenService = modadvapi32.NewProc("OpenServiceW") + procReadEventLog = modadvapi32.NewProc("ReadEventLogW") + procRegCloseKey = modadvapi32.NewProc("RegCloseKey") + procRegCreateKeyEx = modadvapi32.NewProc("RegCreateKeyExW") + procRegEnumKeyEx = modadvapi32.NewProc("RegEnumKeyExW") + procRegGetValue = modadvapi32.NewProc("RegGetValueW") + procRegOpenKeyEx = modadvapi32.NewProc("RegOpenKeyExW") + procRegSetValueEx = modadvapi32.NewProc("RegSetValueExW") + procSetSecurityDescriptorDacl = modadvapi32.NewProc("SetSecurityDescriptorDacl") + procStartService = modadvapi32.NewProc("StartServiceW") + procStartTrace = modadvapi32.NewProc("StartTraceW") +) + +var ( + SystemTraceControlGuid = GUID{ + 0x9e814aad, + 0x3204, + 0x11d2, + [8]byte{0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39}, + } +) + +func RegCreateKey(hKey HKEY, subKey string) HKEY { + var result HKEY + ret, _, _ := procRegCreateKeyEx.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(0), + uintptr(0), + uintptr(0), + uintptr(KEY_ALL_ACCESS), + uintptr(0), + uintptr(unsafe.Pointer(&result)), + uintptr(0)) + _ = ret + return result +} + +func RegOpenKeyEx(hKey HKEY, subKey string, samDesired uint32) HKEY { + var result HKEY + ret, _, _ := procRegOpenKeyEx.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(0), + uintptr(samDesired), + uintptr(unsafe.Pointer(&result))) + + if ret != ERROR_SUCCESS { + panic(fmt.Sprintf("RegOpenKeyEx(%d, %s, %d) failed", hKey, subKey, samDesired)) + } + return result +} + +func RegCloseKey(hKey HKEY) error { + var err error + ret, _, _ := procRegCloseKey.Call( + uintptr(hKey)) + + if ret != ERROR_SUCCESS { + err = errors.New("RegCloseKey failed") + } + return err +} + +func RegGetRaw(hKey HKEY, subKey string, value string) []byte { + var bufLen uint32 + var valptr unsafe.Pointer + if len(value) > 0 { + valptr = unsafe.Pointer(syscall.StringToUTF16Ptr(value)) + } + procRegGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(valptr), + uintptr(RRF_RT_ANY), + 0, + 0, + uintptr(unsafe.Pointer(&bufLen))) + + if bufLen == 0 { + return nil + } + + buf := make([]byte, bufLen) + ret, _, _ := procRegGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(valptr), + uintptr(RRF_RT_ANY), + 0, + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufLen))) + + if ret != ERROR_SUCCESS { + return nil + } + + return buf +} + +func RegSetBinary(hKey HKEY, subKey string, value []byte) (errno int) { + var lptr, vptr unsafe.Pointer + if len(subKey) > 0 { + lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey)) + } + if len(value) > 0 { + vptr = unsafe.Pointer(&value[0]) + } + ret, _, _ := procRegSetValueEx.Call( + uintptr(hKey), + uintptr(lptr), + uintptr(0), + uintptr(REG_BINARY), + uintptr(vptr), + uintptr(len(value))) + + return int(ret) +} + +func RegGetString(hKey HKEY, subKey string, value string) string { + var bufLen uint32 + procRegGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))), + uintptr(RRF_RT_REG_SZ), + 0, + 0, + uintptr(unsafe.Pointer(&bufLen))) + + if bufLen == 0 { + return "" + } + + buf := make([]uint16, bufLen) + ret, _, _ := procRegGetValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))), + uintptr(RRF_RT_REG_SZ), + 0, + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufLen))) + + if ret != ERROR_SUCCESS { + return "" + } + + return syscall.UTF16ToString(buf) +} + +/* +func RegSetKeyValue(hKey HKEY, subKey string, valueName string, dwType uint32, data uintptr, cbData uint16) (errno int) { + ret, _, _ := procRegSetKeyValue.Call( + uintptr(hKey), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))), + uintptr(dwType), + data, + uintptr(cbData)) + + return int(ret) +} +*/ + +func RegEnumKeyEx(hKey HKEY, index uint32) string { + var bufLen uint32 = 255 + buf := make([]uint16, bufLen) + procRegEnumKeyEx.Call( + uintptr(hKey), + uintptr(index), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bufLen)), + 0, + 0, + 0, + 0) + return syscall.UTF16ToString(buf) +} + +func OpenEventLog(servername string, sourcename string) HANDLE { + ret, _, _ := procOpenEventLog.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(servername))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(sourcename)))) + + return HANDLE(ret) +} + +func ReadEventLog(eventlog HANDLE, readflags, recordoffset uint32, buffer []byte, numberofbytestoread uint32, bytesread, minnumberofbytesneeded *uint32) bool { + ret, _, _ := procReadEventLog.Call( + uintptr(eventlog), + uintptr(readflags), + uintptr(recordoffset), + uintptr(unsafe.Pointer(&buffer[0])), + uintptr(numberofbytestoread), + uintptr(unsafe.Pointer(bytesread)), + uintptr(unsafe.Pointer(minnumberofbytesneeded))) + + return ret != 0 +} + +func CloseEventLog(eventlog HANDLE) bool { + ret, _, _ := procCloseEventLog.Call( + uintptr(eventlog)) + + return ret != 0 +} + +func OpenSCManager(lpMachineName, lpDatabaseName string, dwDesiredAccess uint32) (HANDLE, error) { + var p1, p2 uintptr + if len(lpMachineName) > 0 { + p1 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpMachineName))) + } + if len(lpDatabaseName) > 0 { + p2 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDatabaseName))) + } + ret, _, _ := procOpenSCManager.Call( + p1, + p2, + uintptr(dwDesiredAccess)) + + if ret == 0 { + return 0, syscall.GetLastError() + } + + return HANDLE(ret), nil +} + +func CloseServiceHandle(hSCObject HANDLE) error { + ret, _, _ := procCloseServiceHandle.Call(uintptr(hSCObject)) + if ret == 0 { + return syscall.GetLastError() + } + return nil +} + +func OpenService(hSCManager HANDLE, lpServiceName string, dwDesiredAccess uint32) (HANDLE, error) { + ret, _, _ := procOpenService.Call( + uintptr(hSCManager), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceName))), + uintptr(dwDesiredAccess)) + + if ret == 0 { + return 0, syscall.GetLastError() + } + + return HANDLE(ret), nil +} + +func StartService(hService HANDLE, lpServiceArgVectors []string) error { + l := len(lpServiceArgVectors) + var ret uintptr + if l == 0 { + ret, _, _ = procStartService.Call( + uintptr(hService), + 0, + 0) + } else { + lpArgs := make([]uintptr, l) + for i := 0; i < l; i++ { + lpArgs[i] = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceArgVectors[i]))) + } + + ret, _, _ = procStartService.Call( + uintptr(hService), + uintptr(l), + uintptr(unsafe.Pointer(&lpArgs[0]))) + } + + if ret == 0 { + return syscall.GetLastError() + } + + return nil +} + +func ControlService(hService HANDLE, dwControl uint32, lpServiceStatus *SERVICE_STATUS) bool { + if lpServiceStatus == nil { + panic("ControlService:lpServiceStatus cannot be nil") + } + + ret, _, _ := procControlService.Call( + uintptr(hService), + uintptr(dwControl), + uintptr(unsafe.Pointer(lpServiceStatus))) + + return ret != 0 +} + +func ControlTrace(hTrace TRACEHANDLE, lpSessionName string, props *EVENT_TRACE_PROPERTIES, dwControl uint32) (success bool, e error) { + + ret, _, _ := procControlTrace.Call( + uintptr(unsafe.Pointer(hTrace)), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))), + uintptr(unsafe.Pointer(props)), + uintptr(dwControl)) + + if ret == ERROR_SUCCESS { + return true, nil + } + e = errors.New(fmt.Sprintf("error: 0x%x", ret)) + return +} + +func StartTrace(lpSessionName string, props *EVENT_TRACE_PROPERTIES) (hTrace TRACEHANDLE, e error) { + + ret, _, _ := procStartTrace.Call( + uintptr(unsafe.Pointer(&hTrace)), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))), + uintptr(unsafe.Pointer(props))) + + if ret == ERROR_SUCCESS { + return + } + e = errors.New(fmt.Sprintf("error: 0x%x", ret)) + return +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa378863(v=vs.85).aspx +func InitializeSecurityDescriptor(rev uint16) (pSecurityDescriptor *SECURITY_DESCRIPTOR, e error) { + + pSecurityDescriptor = &SECURITY_DESCRIPTOR{} + + ret, _, _ := procInitializeSecurityDescriptor.Call( + uintptr(unsafe.Pointer(pSecurityDescriptor)), + uintptr(rev), + ) + + if ret != 0 { + return + } + e = syscall.GetLastError() + return +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379583(v=vs.85).aspx +func SetSecurityDescriptorDacl(pSecurityDescriptor *SECURITY_DESCRIPTOR, pDacl *ACL) (e error) { + + if pSecurityDescriptor == nil { + return errors.New("null descriptor") + } + + var ret uintptr + if pDacl == nil { + ret, _, _ = procSetSecurityDescriptorDacl.Call( + uintptr(unsafe.Pointer(pSecurityDescriptor)), + uintptr(1), // DaclPresent + uintptr(0), // pDacl + uintptr(0), // DaclDefaulted + ) + } else { + ret, _, _ = procSetSecurityDescriptorDacl.Call( + uintptr(unsafe.Pointer(pSecurityDescriptor)), + uintptr(1), // DaclPresent + uintptr(unsafe.Pointer(pDacl)), + uintptr(0), //DaclDefaulted + ) + } + + if ret != 0 { + return + } + e = syscall.GetLastError() + return +} diff --git a/vendor/github.com/apenwarr/w32/advapi32_constants.go b/vendor/github.com/apenwarr/w32/advapi32_constants.go new file mode 100644 index 000000000..fa3c7674a --- /dev/null +++ b/vendor/github.com/apenwarr/w32/advapi32_constants.go @@ -0,0 +1,300 @@ +package w32 + +// Registry predefined keys +const ( + HKEY_CLASSES_ROOT HKEY = 0x80000000 + HKEY_CURRENT_USER HKEY = 0x80000001 + HKEY_LOCAL_MACHINE HKEY = 0x80000002 + HKEY_USERS HKEY = 0x80000003 + HKEY_PERFORMANCE_DATA HKEY = 0x80000004 + HKEY_CURRENT_CONFIG HKEY = 0x80000005 + HKEY_DYN_DATA HKEY = 0x80000006 +) + +// Registry Key Security and Access Rights +const ( + KEY_ALL_ACCESS = 0xF003F + KEY_CREATE_SUB_KEY = 0x0004 + KEY_ENUMERATE_SUB_KEYS = 0x0008 + KEY_NOTIFY = 0x0010 + KEY_QUERY_VALUE = 0x0001 + KEY_SET_VALUE = 0x0002 + KEY_READ = 0x20019 + KEY_WRITE = 0x20006 +) + +const ( + NFR_ANSI = 1 + NFR_UNICODE = 2 + NF_QUERY = 3 + NF_REQUERY = 4 +) + +// Registry value types +const ( + RRF_RT_REG_NONE = 0x00000001 + RRF_RT_REG_SZ = 0x00000002 + RRF_RT_REG_EXPAND_SZ = 0x00000004 + RRF_RT_REG_BINARY = 0x00000008 + RRF_RT_REG_DWORD = 0x00000010 + RRF_RT_REG_MULTI_SZ = 0x00000020 + RRF_RT_REG_QWORD = 0x00000040 + RRF_RT_DWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD) + RRF_RT_QWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD) + RRF_RT_ANY = 0x0000ffff + RRF_NOEXPAND = 0x10000000 + RRF_ZEROONFAILURE = 0x20000000 + REG_PROCESS_APPKEY = 0x00000001 + REG_MUI_STRING_TRUNCATE = 0x00000001 +) + +// Service Control Manager object specific access types +const ( + SC_MANAGER_CONNECT = 0x0001 + SC_MANAGER_CREATE_SERVICE = 0x0002 + SC_MANAGER_ENUMERATE_SERVICE = 0x0004 + SC_MANAGER_LOCK = 0x0008 + SC_MANAGER_QUERY_LOCK_STATUS = 0x0010 + SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020 + SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG +) + +// Service Types (Bit Mask) +const ( + SERVICE_KERNEL_DRIVER = 0x00000001 + SERVICE_FILE_SYSTEM_DRIVER = 0x00000002 + SERVICE_ADAPTER = 0x00000004 + SERVICE_RECOGNIZER_DRIVER = 0x00000008 + SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER + SERVICE_WIN32_OWN_PROCESS = 0x00000010 + SERVICE_WIN32_SHARE_PROCESS = 0x00000020 + SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS + SERVICE_INTERACTIVE_PROCESS = 0x00000100 + SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS +) + +// Service State -- for CurrentState +const ( + SERVICE_STOPPED = 0x00000001 + SERVICE_START_PENDING = 0x00000002 + SERVICE_STOP_PENDING = 0x00000003 + SERVICE_RUNNING = 0x00000004 + SERVICE_CONTINUE_PENDING = 0x00000005 + SERVICE_PAUSE_PENDING = 0x00000006 + SERVICE_PAUSED = 0x00000007 +) + +// Controls Accepted (Bit Mask) +const ( + SERVICE_ACCEPT_STOP = 0x00000001 + SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002 + SERVICE_ACCEPT_SHUTDOWN = 0x00000004 + SERVICE_ACCEPT_PARAMCHANGE = 0x00000008 + SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010 + SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020 + SERVICE_ACCEPT_POWEREVENT = 0x00000040 + SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080 + SERVICE_ACCEPT_PRESHUTDOWN = 0x00000100 + SERVICE_ACCEPT_TIMECHANGE = 0x00000200 + SERVICE_ACCEPT_TRIGGEREVENT = 0x00000400 +) + +// Service object specific access type +const ( + SERVICE_QUERY_CONFIG = 0x0001 + SERVICE_CHANGE_CONFIG = 0x0002 + SERVICE_QUERY_STATUS = 0x0004 + SERVICE_ENUMERATE_DEPENDENTS = 0x0008 + SERVICE_START = 0x0010 + SERVICE_STOP = 0x0020 + SERVICE_PAUSE_CONTINUE = 0x0040 + SERVICE_INTERROGATE = 0x0080 + SERVICE_USER_DEFINED_CONTROL = 0x0100 + + SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | + SERVICE_QUERY_CONFIG | + SERVICE_CHANGE_CONFIG | + SERVICE_QUERY_STATUS | + SERVICE_ENUMERATE_DEPENDENTS | + SERVICE_START | + SERVICE_STOP | + SERVICE_PAUSE_CONTINUE | + SERVICE_INTERROGATE | + SERVICE_USER_DEFINED_CONTROL +) + +const ( + KERNEL_LOGGER_NAME = "NT Kernel Logger" +) + +// WNODE flags, for ETW (Event Tracing for Windows) / WMI +const ( + WNODE_FLAG_ALL_DATA = 0x00000001 + WNODE_FLAG_SINGLE_INSTANCE = 0x00000002 + WNODE_FLAG_SINGLE_ITEM = 0x00000004 + WNODE_FLAG_EVENT_ITEM = 0x00000008 + WNODE_FLAG_FIXED_INSTANCE_SIZE = 0x00000010 + WNODE_FLAG_TOO_SMALL = 0x00000020 + WNODE_FLAG_INSTANCES_SAME = 0x00000040 + WNODE_FLAG_STATIC_INSTANCE_NAMES = 0x00000080 + WNODE_FLAG_INTERNAL = 0x00000100 + WNODE_FLAG_USE_TIMESTAMP = 0x00000200 + WNODE_FLAG_PERSIST_EVENT = 0x00000400 + WNODE_FLAG_EVENT_REFERENCE = 0x00002000 + WNODE_FLAG_ANSI_INSTANCENAMES = 0x00004000 + WNODE_FLAG_METHOD_ITEM = 0x00008000 + WNODE_FLAG_PDO_INSTANCE_NAMES = 0x00010000 + WNODE_FLAG_TRACED_GUID = 0x00020000 + WNODE_FLAG_LOG_WNODE = 0x00040000 + WNODE_FLAG_USE_GUID_PTR = 0x00080000 + WNODE_FLAG_USE_MOF_PTR = 0x00100000 + WNODE_FLAG_NO_HEADER = 0x00200000 + WNODE_FLAG_SEVERITY_MASK = 0xff000000 +) + +// ETW flags and types etc +const ( + EVENT_TRACE_TYPE_INFO = 0x00 + EVENT_TRACE_TYPE_START = 0x01 + EVENT_TRACE_TYPE_END = 0x02 + EVENT_TRACE_TYPE_STOP = 0x02 + EVENT_TRACE_TYPE_DC_START = 0x03 + EVENT_TRACE_TYPE_DC_END = 0x04 + EVENT_TRACE_TYPE_EXTENSION = 0x05 + EVENT_TRACE_TYPE_REPLY = 0x06 + EVENT_TRACE_TYPE_DEQUEUE = 0x07 + EVENT_TRACE_TYPE_RESUME = 0x07 + EVENT_TRACE_TYPE_CHECKPOINT = 0x08 + EVENT_TRACE_TYPE_SUSPEND = 0x08 + EVENT_TRACE_TYPE_WINEVT_SEND = 0x09 + EVENT_TRACE_TYPE_WINEVT_RECEIVE = 0XF0 + TRACE_LEVEL_NONE = 0 + TRACE_LEVEL_CRITICAL = 1 + TRACE_LEVEL_FATAL = 1 + TRACE_LEVEL_ERROR = 2 + TRACE_LEVEL_WARNING = 3 + TRACE_LEVEL_INFORMATION = 4 + TRACE_LEVEL_VERBOSE = 5 + TRACE_LEVEL_RESERVED6 = 6 + TRACE_LEVEL_RESERVED7 = 7 + TRACE_LEVEL_RESERVED8 = 8 + TRACE_LEVEL_RESERVED9 = 9 + EVENT_TRACE_TYPE_LOAD = 0x0A + EVENT_TRACE_TYPE_IO_READ = 0x0A + EVENT_TRACE_TYPE_IO_WRITE = 0x0B + EVENT_TRACE_TYPE_IO_READ_INIT = 0x0C + EVENT_TRACE_TYPE_IO_WRITE_INIT = 0x0D + EVENT_TRACE_TYPE_IO_FLUSH = 0x0E + EVENT_TRACE_TYPE_IO_FLUSH_INIT = 0x0F + EVENT_TRACE_TYPE_MM_TF = 0x0A + EVENT_TRACE_TYPE_MM_DZF = 0x0B + EVENT_TRACE_TYPE_MM_COW = 0x0C + EVENT_TRACE_TYPE_MM_GPF = 0x0D + EVENT_TRACE_TYPE_MM_HPF = 0x0E + EVENT_TRACE_TYPE_MM_AV = 0x0F + EVENT_TRACE_TYPE_SEND = 0x0A + EVENT_TRACE_TYPE_RECEIVE = 0x0B + EVENT_TRACE_TYPE_CONNECT = 0x0C + EVENT_TRACE_TYPE_DISCONNECT = 0x0D + EVENT_TRACE_TYPE_RETRANSMIT = 0x0E + EVENT_TRACE_TYPE_ACCEPT = 0x0F + EVENT_TRACE_TYPE_RECONNECT = 0x10 + EVENT_TRACE_TYPE_CONNFAIL = 0x11 + EVENT_TRACE_TYPE_COPY_TCP = 0x12 + EVENT_TRACE_TYPE_COPY_ARP = 0x13 + EVENT_TRACE_TYPE_ACKFULL = 0x14 + EVENT_TRACE_TYPE_ACKPART = 0x15 + EVENT_TRACE_TYPE_ACKDUP = 0x16 + EVENT_TRACE_TYPE_GUIDMAP = 0x0A + EVENT_TRACE_TYPE_CONFIG = 0x0B + EVENT_TRACE_TYPE_SIDINFO = 0x0C + EVENT_TRACE_TYPE_SECURITY = 0x0D + EVENT_TRACE_TYPE_REGCREATE = 0x0A + EVENT_TRACE_TYPE_REGOPEN = 0x0B + EVENT_TRACE_TYPE_REGDELETE = 0x0C + EVENT_TRACE_TYPE_REGQUERY = 0x0D + EVENT_TRACE_TYPE_REGSETVALUE = 0x0E + EVENT_TRACE_TYPE_REGDELETEVALUE = 0x0F + EVENT_TRACE_TYPE_REGQUERYVALUE = 0x10 + EVENT_TRACE_TYPE_REGENUMERATEKEY = 0x11 + EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY = 0x12 + EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE = 0x13 + EVENT_TRACE_TYPE_REGSETINFORMATION = 0x14 + EVENT_TRACE_TYPE_REGFLUSH = 0x15 + EVENT_TRACE_TYPE_REGKCBCREATE = 0x16 + EVENT_TRACE_TYPE_REGKCBDELETE = 0x17 + EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN = 0x18 + EVENT_TRACE_TYPE_REGKCBRUNDOWNEND = 0x19 + EVENT_TRACE_TYPE_REGVIRTUALIZE = 0x1A + EVENT_TRACE_TYPE_REGCLOSE = 0x1B + EVENT_TRACE_TYPE_REGSETSECURITY = 0x1C + EVENT_TRACE_TYPE_REGQUERYSECURITY = 0x1D + EVENT_TRACE_TYPE_REGCOMMIT = 0x1E + EVENT_TRACE_TYPE_REGPREPARE = 0x1F + EVENT_TRACE_TYPE_REGROLLBACK = 0x20 + EVENT_TRACE_TYPE_REGMOUNTHIVE = 0x21 + EVENT_TRACE_TYPE_CONFIG_CPU = 0x0A + EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK = 0x0B + EVENT_TRACE_TYPE_CONFIG_LOGICALDISK = 0x0C + EVENT_TRACE_TYPE_CONFIG_NIC = 0x0D + EVENT_TRACE_TYPE_CONFIG_VIDEO = 0x0E + EVENT_TRACE_TYPE_CONFIG_SERVICES = 0x0F + EVENT_TRACE_TYPE_CONFIG_POWER = 0x10 + EVENT_TRACE_TYPE_CONFIG_NETINFO = 0x11 + EVENT_TRACE_TYPE_CONFIG_IRQ = 0x15 + EVENT_TRACE_TYPE_CONFIG_PNP = 0x16 + EVENT_TRACE_TYPE_CONFIG_IDECHANNEL = 0x17 + EVENT_TRACE_TYPE_CONFIG_PLATFORM = 0x19 + EVENT_TRACE_FLAG_PROCESS = 0x00000001 + EVENT_TRACE_FLAG_THREAD = 0x00000002 + EVENT_TRACE_FLAG_IMAGE_LOAD = 0x00000004 + EVENT_TRACE_FLAG_DISK_IO = 0x00000100 + EVENT_TRACE_FLAG_DISK_FILE_IO = 0x00000200 + EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS = 0x00001000 + EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS = 0x00002000 + EVENT_TRACE_FLAG_NETWORK_TCPIP = 0x00010000 + EVENT_TRACE_FLAG_REGISTRY = 0x00020000 + EVENT_TRACE_FLAG_DBGPRINT = 0x00040000 + EVENT_TRACE_FLAG_PROCESS_COUNTERS = 0x00000008 + EVENT_TRACE_FLAG_CSWITCH = 0x00000010 + EVENT_TRACE_FLAG_DPC = 0x00000020 + EVENT_TRACE_FLAG_INTERRUPT = 0x00000040 + EVENT_TRACE_FLAG_SYSTEMCALL = 0x00000080 + EVENT_TRACE_FLAG_DISK_IO_INIT = 0x00000400 + EVENT_TRACE_FLAG_ALPC = 0x00100000 + EVENT_TRACE_FLAG_SPLIT_IO = 0x00200000 + EVENT_TRACE_FLAG_DRIVER = 0x00800000 + EVENT_TRACE_FLAG_PROFILE = 0x01000000 + EVENT_TRACE_FLAG_FILE_IO = 0x02000000 + EVENT_TRACE_FLAG_FILE_IO_INIT = 0x04000000 + EVENT_TRACE_FLAG_DISPATCHER = 0x00000800 + EVENT_TRACE_FLAG_VIRTUAL_ALLOC = 0x00004000 + EVENT_TRACE_FLAG_EXTENSION = 0x80000000 + EVENT_TRACE_FLAG_FORWARD_WMI = 0x40000000 + EVENT_TRACE_FLAG_ENABLE_RESERVE = 0x20000000 + EVENT_TRACE_FILE_MODE_NONE = 0x00000000 + EVENT_TRACE_FILE_MODE_SEQUENTIAL = 0x00000001 + EVENT_TRACE_FILE_MODE_CIRCULAR = 0x00000002 + EVENT_TRACE_FILE_MODE_APPEND = 0x00000004 + EVENT_TRACE_REAL_TIME_MODE = 0x00000100 + EVENT_TRACE_DELAY_OPEN_FILE_MODE = 0x00000200 + EVENT_TRACE_BUFFERING_MODE = 0x00000400 + EVENT_TRACE_PRIVATE_LOGGER_MODE = 0x00000800 + EVENT_TRACE_ADD_HEADER_MODE = 0x00001000 + EVENT_TRACE_USE_GLOBAL_SEQUENCE = 0x00004000 + EVENT_TRACE_USE_LOCAL_SEQUENCE = 0x00008000 + EVENT_TRACE_RELOG_MODE = 0x00010000 + EVENT_TRACE_USE_PAGED_MEMORY = 0x01000000 + EVENT_TRACE_FILE_MODE_NEWFILE = 0x00000008 + EVENT_TRACE_FILE_MODE_PREALLOCATE = 0x00000020 + EVENT_TRACE_NONSTOPPABLE_MODE = 0x00000040 + EVENT_TRACE_SECURE_MODE = 0x00000080 + EVENT_TRACE_USE_KBYTES_FOR_SIZE = 0x00002000 + EVENT_TRACE_PRIVATE_IN_PROC = 0x00020000 + EVENT_TRACE_MODE_RESERVED = 0x00100000 + EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING = 0x10000000 + EVENT_TRACE_CONTROL_QUERY = 0 + EVENT_TRACE_CONTROL_STOP = 1 + EVENT_TRACE_CONTROL_UPDATE = 2 + EVENT_TRACE_CONTROL_FLUSH = 3 +) diff --git a/vendor/github.com/apenwarr/w32/advapi32_typedef.go b/vendor/github.com/apenwarr/w32/advapi32_typedef.go new file mode 100644 index 000000000..3a4308c4d --- /dev/null +++ b/vendor/github.com/apenwarr/w32/advapi32_typedef.go @@ -0,0 +1,122 @@ +package w32 + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa374931(v=vs.85).aspx +type ACL struct { + AclRevision byte + Sbz1 byte + AclSize uint16 + AceCount uint16 + Sbz2 uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379561(v=vs.85).aspx + +type SECURITY_DESCRIPTOR_CONTROL uint16 + +type SECURITY_DESCRIPTOR struct { + Revision byte + Sbz1 byte + Control SECURITY_DESCRIPTOR_CONTROL + Owner uintptr + Group uintptr + Sacl *ACL + Dacl *ACL +} + +type SID_IDENTIFIER_AUTHORITY struct { + Value [6]byte +} + +// typedef struct _SID // 4 elements, 0xC bytes (sizeof) +// { +// /*0x000*/ UINT8 Revision; +// /*0x001*/ UINT8 SubAuthorityCount; +// /*0x002*/ struct _SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // 1 elements, 0x6 bytes (sizeof) +// /*0x008*/ ULONG32 SubAuthority[1]; +// }SID, *PSID; +type SID struct { + Revision byte + SubAuthorityCount byte + IdentifierAuthority SID_IDENTIFIER_AUTHORITY + SubAuthority uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363646.aspx +type EVENTLOGRECORD struct { + Length uint32 + Reserved uint32 + RecordNumber uint32 + TimeGenerated uint32 + TimeWritten uint32 + EventID uint32 + EventType uint16 + NumStrings uint16 + EventCategory uint16 + ReservedFlags uint16 + ClosingRecordNumber uint32 + StringOffset uint32 + UserSidLength uint32 + UserSidOffset uint32 + DataLength uint32 + DataOffset uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996.aspx +type SERVICE_STATUS struct { + DwServiceType uint32 + DwCurrentState uint32 + DwControlsAccepted uint32 + DwWin32ExitCode uint32 + DwServiceSpecificExitCode uint32 + DwCheckPoint uint32 + DwWaitHint uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa364160(v=vs.85).aspx +type WNODE_HEADER struct { + BufferSize uint32 + ProviderId uint32 + HistoricalContext uint64 + KernelHandle HANDLE + Guid GUID + ClientContext uint32 + Flags uint32 +} + +// These partially compensate for the anonymous unions we removed, but there +// are no setters. +func (w WNODE_HEADER) TimeStamp() uint64 { + // TODO: Cast to the stupid LARGE_INTEGER struct which is, itself, nasty + // and union-y + return uint64(w.KernelHandle) +} + +func (w WNODE_HEADER) Version() uint32 { + return uint32(w.HistoricalContext >> 32) +} + +func (w WNODE_HEADER) Linkage() uint32 { + return uint32(w.HistoricalContext) +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363784(v=vs.85).aspx +type EVENT_TRACE_PROPERTIES struct { + Wnode WNODE_HEADER + BufferSize uint32 + MinimumBuffers uint32 + MaximumBuffers uint32 + MaximumFileSize uint32 + LogFileMode uint32 + FlushTimer uint32 + EnableFlags uint32 + AgeLimit int32 + NumberOfBuffers uint32 + FreeBuffers uint32 + EventsLost uint32 + BuffersWritten uint32 + LogBuffersLost uint32 + RealTimeBuffersLost uint32 + LoggerThreadId HANDLE + LogFileNameOffset uint32 + LoggerNameOffset uint32 +} diff --git a/vendor/github.com/apenwarr/w32/alpc.go b/vendor/github.com/apenwarr/w32/alpc.go new file mode 100644 index 000000000..408d47ed8 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/alpc.go @@ -0,0 +1,304 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "fmt" + // "github.com/davecgh/go-spew/spew" + "syscall" + "unsafe" +) + +var ( + modntdll = syscall.NewLazyDLL("ntdll.dll") + + procAlpcGetMessageAttribute = modntdll.NewProc("AlpcGetMessageAttribute") + procNtAlpcAcceptConnectPort = modntdll.NewProc("NtAlpcAcceptConnectPort") + procNtAlpcCancelMessage = modntdll.NewProc("NtAlpcCancelMessage") + procNtAlpcConnectPort = modntdll.NewProc("NtAlpcConnectPort") + procNtAlpcCreatePort = modntdll.NewProc("NtAlpcCreatePort") + procNtAlpcDisconnectPort = modntdll.NewProc("NtAlpcDisconnectPort") + procNtAlpcSendWaitReceivePort = modntdll.NewProc("NtAlpcSendWaitReceivePort") + procRtlCreateUnicodeStringFromAsciiz = modntdll.NewProc("RtlCreateUnicodeStringFromAsciiz") +) + +//func RtlCreateUnicodeStringFromAsciiz(s string) (us UNICODE_STRING, e error) { +// +// cs := C.CString(s) +// defer C.free(unsafe.Pointer(cs)) +// +// ret, _, lastErr := procRtlCreateUnicodeStringFromAsciiz.Call( +// uintptr(unsafe.Pointer(&us)), +// uintptr(unsafe.Pointer(cs)), +// ) +// +// if ret != 1 { // ret is a BOOL ( I think ) +// e = lastErr +// } +// +// return +//} + +//func newUnicodeString(s string) (us UNICODE_STRING, e error) { +// // TODO probably not the most efficient way to do this, but I couldn't +// // work out how to manually initialize the UNICODE_STRING struct in a way +// // that the ALPC subsystem liked. +// us, e = RtlCreateUnicodeStringFromAsciiz(s) +// return +//} + +// (this is a macro) +// VOID InitializeObjectAttributes( +// [out] POBJECT_ATTRIBUTES InitializedAttributes, +// [in] PUNICODE_STRING ObjectName, +// [in] ULONG Attributes, +// [in] HANDLE RootDirectory, +// [in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor +// ) +//func InitializeObjectAttributes( +// name string, +// attributes uint32, +// rootDir HANDLE, +// pSecurityDescriptor *SECURITY_DESCRIPTOR, +//) (oa OBJECT_ATTRIBUTES, e error) { +// +// oa = OBJECT_ATTRIBUTES{ +// RootDirectory: rootDir, +// Attributes: attributes, +// SecurityDescriptor: pSecurityDescriptor, +// } +// oa.Length = uint32(unsafe.Sizeof(oa)) +// +// if len(name) > 0 { +// us, err := newUnicodeString(name) +// if err != nil { +// e = err +// return +// } +// oa.ObjectName = &us +// } +// +// return +//} + +// NTSTATUS +// NtAlpcCreatePort( +// __out PHANDLE PortHandle, +// __in POBJECT_ATTRIBUTES ObjectAttributes, +// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes +// ); +func NtAlpcCreatePort(pObjectAttributes *OBJECT_ATTRIBUTES, pPortAttributes *ALPC_PORT_ATTRIBUTES) (hPort HANDLE, e error) { + + ret, _, _ := procNtAlpcCreatePort.Call( + uintptr(unsafe.Pointer(&hPort)), + uintptr(unsafe.Pointer(pObjectAttributes)), + uintptr(unsafe.Pointer(pPortAttributes)), + ) + + if ret != ERROR_SUCCESS { + return hPort, fmt.Errorf("0x%x", ret) + } + + return +} + +// NTSTATUS +// NtAlpcConnectPort( +// __out PHANDLE PortHandle, +// __in PUNICODE_STRING PortName, +// __in POBJECT_ATTRIBUTES ObjectAttributes, +// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes, +// __in ULONG Flags, +// __in_opt PSID RequiredServerSid, +// __inout PPORT_MESSAGE ConnectionMessage, +// __inout_opt PULONG BufferLength, +// __inout_opt PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes, +// __inout_opt PALPC_MESSAGE_ATTRIBUTES InMessageAttributes, +// __in_opt PLARGE_INTEGER Timeout +// ); +//func NtAlpcConnectPort( +// destPort string, +// pClientObjAttrs *OBJECT_ATTRIBUTES, +// pClientAlpcPortAttrs *ALPC_PORT_ATTRIBUTES, +// flags uint32, +// pRequiredServerSid *SID, +// pConnMsg *AlpcShortMessage, +// pBufLen *uint32, +// pOutMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, +// pInMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, +// timeout *int64, +//) (hPort HANDLE, e error) { +// +// destPortU, e := newUnicodeString(destPort) +// if e != nil { +// return +// } +// +// ret, _, _ := procNtAlpcConnectPort.Call( +// uintptr(unsafe.Pointer(&hPort)), +// uintptr(unsafe.Pointer(&destPortU)), +// uintptr(unsafe.Pointer(pClientObjAttrs)), +// uintptr(unsafe.Pointer(pClientAlpcPortAttrs)), +// uintptr(flags), +// uintptr(unsafe.Pointer(pRequiredServerSid)), +// uintptr(unsafe.Pointer(pConnMsg)), +// uintptr(unsafe.Pointer(pBufLen)), +// uintptr(unsafe.Pointer(pOutMsgAttrs)), +// uintptr(unsafe.Pointer(pInMsgAttrs)), +// uintptr(unsafe.Pointer(timeout)), +// ) +// +// if ret != ERROR_SUCCESS { +// e = fmt.Errorf("0x%x", ret) +// } +// return +//} + +// NTSTATUS +// NtAlpcAcceptConnectPort( +// __out PHANDLE PortHandle, +// __in HANDLE ConnectionPortHandle, +// __in ULONG Flags, +// __in POBJECT_ATTRIBUTES ObjectAttributes, +// __in PALPC_PORT_ATTRIBUTES PortAttributes, +// __in_opt PVOID PortContext, +// __in PPORT_MESSAGE ConnectionRequest, +// __inout_opt PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes, +// __in BOOLEAN AcceptConnection +// ); +func NtAlpcAcceptConnectPort( + hSrvConnPort HANDLE, + flags uint32, + pObjAttr *OBJECT_ATTRIBUTES, + pPortAttr *ALPC_PORT_ATTRIBUTES, + pContext *AlpcPortContext, + pConnReq *AlpcShortMessage, + pConnMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, + accept uintptr, +) (hPort HANDLE, e error) { + + ret, _, _ := procNtAlpcAcceptConnectPort.Call( + uintptr(unsafe.Pointer(&hPort)), + uintptr(hSrvConnPort), + uintptr(flags), + uintptr(unsafe.Pointer(pObjAttr)), + uintptr(unsafe.Pointer(pPortAttr)), + uintptr(unsafe.Pointer(pContext)), + uintptr(unsafe.Pointer(pConnReq)), + uintptr(unsafe.Pointer(pConnMsgAttrs)), + accept, + ) + + if ret != ERROR_SUCCESS { + e = fmt.Errorf("0x%x", ret) + } + return +} + +// NTSTATUS +// NtAlpcSendWaitReceivePort( +// __in HANDLE PortHandle, +// __in ULONG Flags, +// __in_opt PPORT_MESSAGE SendMessage, +// __in_opt PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes, +// __inout_opt PPORT_MESSAGE ReceiveMessage, +// __inout_opt PULONG BufferLength, +// __inout_opt PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes, +// __in_opt PLARGE_INTEGER Timeout +// ); +func NtAlpcSendWaitReceivePort( + hPort HANDLE, + flags uint32, + sendMsg *AlpcShortMessage, // Should actually point to PORT_MESSAGE + payload + sendMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, + recvMsg *AlpcShortMessage, + recvBufLen *uint32, + recvMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, + timeout *int64, // use native int64 +) (e error) { + + ret, _, _ := procNtAlpcSendWaitReceivePort.Call( + uintptr(hPort), + uintptr(flags), + uintptr(unsafe.Pointer(sendMsg)), + uintptr(unsafe.Pointer(sendMsgAttrs)), + uintptr(unsafe.Pointer(recvMsg)), + uintptr(unsafe.Pointer(recvBufLen)), + uintptr(unsafe.Pointer(recvMsgAttrs)), + uintptr(unsafe.Pointer(timeout)), + ) + + if ret != ERROR_SUCCESS { + e = fmt.Errorf("0x%x", ret) + } + return +} + +// NTSYSAPI +// PVOID +// NTAPI +// AlpcGetMessageAttribute( +// __in PALPC_MESSAGE_ATTRIBUTES Buffer, +// __in ULONG AttributeFlag +// ); + +// This basically returns a pointer to the correct struct for whichever +// message attribute you asked for. In Go terms, it returns unsafe.Pointer +// which you should then cast. Example: + +// ptr := AlpcGetMessageAttribute(&recvMsgAttrs, ALPC_MESSAGE_CONTEXT_ATTRIBUTE) +// if ptr != nil { +// context := (*ALPC_CONTEXT_ATTR)(ptr) +// } +func AlpcGetMessageAttribute(buf *ALPC_MESSAGE_ATTRIBUTES, attr uint32) unsafe.Pointer { + + ret, _, _ := procAlpcGetMessageAttribute.Call( + uintptr(unsafe.Pointer(buf)), + uintptr(attr), + ) + return unsafe.Pointer(ret) +} + +// NTSYSCALLAPI +// NTSTATUS +// NTAPI +// NtAlpcCancelMessage( +// __in HANDLE PortHandle, +// __in ULONG Flags, +// __in PALPC_CONTEXT_ATTR MessageContext +// ); +func NtAlpcCancelMessage(hPort HANDLE, flags uint32, pMsgContext *ALPC_CONTEXT_ATTR) (e error) { + + ret, _, _ := procNtAlpcCancelMessage.Call( + uintptr(hPort), + uintptr(flags), + uintptr(unsafe.Pointer(pMsgContext)), + ) + + if ret != ERROR_SUCCESS { + e = fmt.Errorf("0x%x", ret) + } + return +} + +// NTSYSCALLAPI +// NTSTATUS +// NTAPI +// NtAlpcDisconnectPort( +// __in HANDLE PortHandle, +// __in ULONG Flags +// ); +func NtAlpcDisconnectPort(hPort HANDLE, flags uint32) (e error) { + + ret, _, _ := procNtAlpcDisconnectPort.Call( + uintptr(hPort), + uintptr(flags), + ) + + if ret != ERROR_SUCCESS { + e = fmt.Errorf("0x%x", ret) + } + return +} diff --git a/vendor/github.com/apenwarr/w32/alpc_constants.go b/vendor/github.com/apenwarr/w32/alpc_constants.go new file mode 100644 index 000000000..82d9d2ed4 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/alpc_constants.go @@ -0,0 +1,64 @@ +package w32 + +const ( + ALPC_PORFLG_ALLOW_LPC_REQUESTS = 0x20000 + ALPC_PORFLG_SYSTEM_PROCESS = 0x100000 + ALPC_PORFLG_WAITABLE_PORT = 0x40000 +) + +const ( + ALPC_MSGFLG_REPLY_MESSAGE = 0x1 + ALPC_MSGFLG_LPC_MODE = 0x2 // ? + ALPC_MSGFLG_RELEASE_MESSAGE = 0x10000 // dbg + ALPC_MSGFLG_SYNC_REQUEST = 0x20000 // dbg + ALPC_MSGFLG_WAIT_USER_MODE = 0x100000 + ALPC_MSGFLG_WAIT_ALERTABLE = 0x200000 + ALPC_MSGFLG_WOW64_CALL = 0x80000000 // dbg +) +const ( + ALPC_MESSAGE_SECURITY_ATTRIBUTE = 0x80000000 + ALPC_MESSAGE_VIEW_ATTRIBUTE = 0x40000000 + ALPC_MESSAGE_CONTEXT_ATTRIBUTE = 0x20000000 + ALPC_MESSAGE_HANDLE_ATTRIBUTE = 0x10000000 +) + +const ( + OBJ_INHERIT = 0x00000002 + OBJ_PERMANENT = 0x00000010 + OBJ_EXCLUSIVE = 0x00000020 + OBJ_CASE_INSENSITIVE = 0x00000040 + OBJ_OPENIF = 0x00000080 + OBJ_OPENLINK = 0x00000100 + OBJ_KERNEL_HANDLE = 0x00000200 +) + +const ( + LPC_REQUEST = 1 + LPC_REPLY = 2 + LPC_DATAGRAM = 3 + LPC_LOST_REPLY = 4 + LPC_PORT_CLOSED = 5 + LPC_CLIENT_DIED = 6 + LPC_EXCEPTION = 7 + LPC_DEBUG_EVENT = 8 + LPC_ERROR_EVENT = 9 + LPC_CONNECTION_REQUEST = 10 + LPC_CONTINUATION_REQUIRED = 0x2000 +) + +const ( + SecurityAnonymous uint32 = 1 + SecurityIdentification uint32 = 2 + SecurityImpersonation uint32 = 3 + SecurityDelegation uint32 = 4 +) + +const ( + SECURITY_DYNAMIC_TRACKING byte = 1 + SECURITY_STATIC_TRACKING byte = 0 +) + +const ( + ALPC_SYNC_OBJECT_TYPE uint32 = 2 + ALPC_THREAD_OBJECT_TYPE uint32 = 4 +) diff --git a/vendor/github.com/apenwarr/w32/alpc_typedef.go b/vendor/github.com/apenwarr/w32/alpc_typedef.go new file mode 100644 index 000000000..52b35c97d --- /dev/null +++ b/vendor/github.com/apenwarr/w32/alpc_typedef.go @@ -0,0 +1,181 @@ +package w32 + +import ( + "errors" +) + +// nt!_ALPC_MESSAGE_ATTRIBUTES +// +0x000 AllocatedAttributes : Uint4B +// +0x004 ValidAttributes : Uint4B +type ALPC_MESSAGE_ATTRIBUTES struct { + AllocatedAttributes uint32 + ValidAttributes uint32 +} + +type ALPC_CONTEXT_ATTR struct { + PortContext *AlpcPortContext + MessageContext uintptr + Sequence uint32 + MessageId uint32 + CallbackId uint32 +} + +type ALPC_HANDLE_ATTR struct { + Flags uint32 + Handle HANDLE + ObjectType uint32 + DesiredAccess uint32 +} + +// nt!_CLIENT_ID +// +0x000 UniqueProcess : Ptr64 Void +// +0x008 UniqueThread : Ptr64 Void +type CLIENT_ID struct { + UniqueProcess uintptr + UniqueThread uintptr +} + +// nt!_UNICODE_STRING +// +0x000 Length : Uint2B +// +0x002 MaximumLength : Uint2B +// +0x008 Buffer : Ptr64 Uint2B +type UNICODE_STRING struct { + Length uint16 + MaximumLength uint16 + _ [4]byte // align to 0x08 + Buffer *uint16 +} + +// nt!_OBJECT_ATTRIBUTES +// +0x000 Length : Uint4B +// +0x008 RootDirectory : Ptr64 Void +// +0x010 ObjectName : Ptr64 _UNICODE_STRING +// +0x018 Attributes : Uint4B +// +0x020 SecurityDescriptor : Ptr64 Void +// +0x028 SecurityQualityOfService : Ptr64 Void +type OBJECT_ATTRIBUTES struct { + Length uint32 + _ [4]byte // align to 0x08 + RootDirectory HANDLE + ObjectName *UNICODE_STRING + Attributes uint32 + _ [4]byte // align to 0x20 + SecurityDescriptor *SECURITY_DESCRIPTOR + SecurityQualityOfService *SECURITY_QUALITY_OF_SERVICE +} + +// cf: http://j00ru.vexillium.org/?p=502 for legacy RPC +// nt!_PORT_MESSAGE +// +0x000 u1 : +// +0x004 u2 : +// +0x008 ClientId : _CLIENT_ID +// +0x008 DoNotUseThisField : Float +// +0x018 MessageId : Uint4B +// +0x020 ClientViewSize : Uint8B +// +0x020 CallbackId : Uint4B +type PORT_MESSAGE struct { + DataLength uint16 // These are the two unnamed unions + TotalLength uint16 // without Length and ZeroInit + Type uint16 + DataInfoOffset uint16 + ClientId CLIENT_ID + MessageId uint32 + _ [4]byte // align up to 0x20 + ClientViewSize uint64 +} + +func (pm PORT_MESSAGE) CallbackId() uint32 { + return uint32(pm.ClientViewSize >> 32) +} + +func (pm PORT_MESSAGE) DoNotUseThisField() float64 { + panic("WE TOLD YOU NOT TO USE THIS FIELD") +} + +const PORT_MESSAGE_SIZE = 0x28 + +// http://www.nirsoft.net/kernel_struct/vista/SECURITY_QUALITY_OF_SERVICE.html +type SECURITY_QUALITY_OF_SERVICE struct { + Length uint32 + ImpersonationLevel uint32 + ContextTrackingMode byte + EffectiveOnly byte + _ [2]byte // align to 12 bytes +} + +const SECURITY_QOS_SIZE = 12 + +// nt!_ALPC_PORT_ATTRIBUTES +// +0x000 Flags : Uint4B +// +0x004 SecurityQos : _SECURITY_QUALITY_OF_SERVICE +// +0x010 MaxMessageLength : Uint8B +// +0x018 MemoryBandwidth : Uint8B +// +0x020 MaxPoolUsage : Uint8B +// +0x028 MaxSectionSize : Uint8B +// +0x030 MaxViewSize : Uint8B +// +0x038 MaxTotalSectionSize : Uint8B +// +0x040 DupObjectTypes : Uint4B +// +0x044 Reserved : Uint4B +type ALPC_PORT_ATTRIBUTES struct { + Flags uint32 + SecurityQos SECURITY_QUALITY_OF_SERVICE + MaxMessageLength uint64 // must be filled out + MemoryBandwidth uint64 + MaxPoolUsage uint64 + MaxSectionSize uint64 + MaxViewSize uint64 + MaxTotalSectionSize uint64 + DupObjectTypes uint32 + Reserved uint32 +} + +const SHORT_MESSAGE_MAX_SIZE uint16 = 65535 // MAX_USHORT +const SHORT_MESSAGE_MAX_PAYLOAD uint16 = SHORT_MESSAGE_MAX_SIZE - PORT_MESSAGE_SIZE + +// LPC uses the first 4 bytes of the payload as an LPC Command, but this is +// NOT represented here, to allow the use of raw ALPC. For legacy LPC, callers +// must include the command as part of their payload. +type AlpcShortMessage struct { + PORT_MESSAGE + Data [SHORT_MESSAGE_MAX_PAYLOAD]byte +} + +func NewAlpcShortMessage() AlpcShortMessage { + sm := AlpcShortMessage{} + sm.TotalLength = SHORT_MESSAGE_MAX_SIZE + return sm +} + +func (sm *AlpcShortMessage) SetData(d []byte) (e error) { + + copy(sm.Data[:], d) + if len(d) > int(SHORT_MESSAGE_MAX_PAYLOAD) { + e = errors.New("data too big - truncated") + sm.DataLength = SHORT_MESSAGE_MAX_PAYLOAD + sm.TotalLength = SHORT_MESSAGE_MAX_SIZE + return + } + sm.TotalLength = uint16(PORT_MESSAGE_SIZE + len(d)) + sm.DataLength = uint16(len(d)) + return + +} + +// TODO - is this still useful? +func (sm *AlpcShortMessage) GetData() []byte { + if int(sm.DataLength) > int(SHORT_MESSAGE_MAX_PAYLOAD) { + return sm.Data[:] // truncate + } + return sm.Data[:sm.DataLength] +} + +func (sm *AlpcShortMessage) Reset() { + // zero the PORT_MESSAGE header + sm.PORT_MESSAGE = PORT_MESSAGE{} + sm.TotalLength = SHORT_MESSAGE_MAX_SIZE + sm.DataLength = 0 +} + +type AlpcPortContext struct { + Handle HANDLE +} diff --git a/vendor/github.com/apenwarr/w32/comctl32.go b/vendor/github.com/apenwarr/w32/comctl32.go new file mode 100644 index 000000000..4f4e6b53a --- /dev/null +++ b/vendor/github.com/apenwarr/w32/comctl32.go @@ -0,0 +1,109 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modcomctl32 = syscall.NewLazyDLL("comctl32.dll") + + procInitCommonControlsEx = modcomctl32.NewProc("InitCommonControlsEx") + procImageList_Create = modcomctl32.NewProc("ImageList_Create") + procImageList_Destroy = modcomctl32.NewProc("ImageList_Destroy") + procImageList_GetImageCount = modcomctl32.NewProc("ImageList_GetImageCount") + procImageList_SetImageCount = modcomctl32.NewProc("ImageList_SetImageCount") + procImageList_Add = modcomctl32.NewProc("ImageList_Add") + procImageList_ReplaceIcon = modcomctl32.NewProc("ImageList_ReplaceIcon") + procImageList_Remove = modcomctl32.NewProc("ImageList_Remove") + procTrackMouseEvent = modcomctl32.NewProc("_TrackMouseEvent") +) + +func InitCommonControlsEx(lpInitCtrls *INITCOMMONCONTROLSEX) bool { + ret, _, _ := procInitCommonControlsEx.Call( + uintptr(unsafe.Pointer(lpInitCtrls))) + + return ret != 0 +} + +func ImageList_Create(cx, cy int, flags uint, cInitial, cGrow int) HIMAGELIST { + ret, _, _ := procImageList_Create.Call( + uintptr(cx), + uintptr(cy), + uintptr(flags), + uintptr(cInitial), + uintptr(cGrow)) + + if ret == 0 { + panic("Create image list failed") + } + + return HIMAGELIST(ret) +} + +func ImageList_Destroy(himl HIMAGELIST) bool { + ret, _, _ := procImageList_Destroy.Call( + uintptr(himl)) + + return ret != 0 +} + +func ImageList_GetImageCount(himl HIMAGELIST) int { + ret, _, _ := procImageList_GetImageCount.Call( + uintptr(himl)) + + return int(ret) +} + +func ImageList_SetImageCount(himl HIMAGELIST, uNewCount uint) bool { + ret, _, _ := procImageList_SetImageCount.Call( + uintptr(himl), + uintptr(uNewCount)) + + return ret != 0 +} + +func ImageList_Add(himl HIMAGELIST, hbmImage, hbmMask HBITMAP) int { + ret, _, _ := procImageList_Add.Call( + uintptr(himl), + uintptr(hbmImage), + uintptr(hbmMask)) + + return int(ret) +} + +func ImageList_ReplaceIcon(himl HIMAGELIST, i int, hicon HICON) int { + ret, _, _ := procImageList_ReplaceIcon.Call( + uintptr(himl), + uintptr(i), + uintptr(hicon)) + + return int(ret) +} + +func ImageList_AddIcon(himl HIMAGELIST, hicon HICON) int { + return ImageList_ReplaceIcon(himl, -1, hicon) +} + +func ImageList_Remove(himl HIMAGELIST, i int) bool { + ret, _, _ := procImageList_Remove.Call( + uintptr(himl), + uintptr(i)) + + return ret != 0 +} + +func ImageList_RemoveAll(himl HIMAGELIST) bool { + return ImageList_Remove(himl, -1) +} + +func TrackMouseEvent(tme *TRACKMOUSEEVENT) bool { + ret, _, _ := procTrackMouseEvent.Call( + uintptr(unsafe.Pointer(tme))) + + return ret != 0 +} diff --git a/vendor/github.com/apenwarr/w32/comdlg32.go b/vendor/github.com/apenwarr/w32/comdlg32.go new file mode 100644 index 000000000..37bc98581 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/comdlg32.go @@ -0,0 +1,38 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modcomdlg32 = syscall.NewLazyDLL("comdlg32.dll") + + procGetSaveFileName = modcomdlg32.NewProc("GetSaveFileNameW") + procGetOpenFileName = modcomdlg32.NewProc("GetOpenFileNameW") + procCommDlgExtendedError = modcomdlg32.NewProc("CommDlgExtendedError") +) + +func GetOpenFileName(ofn *OPENFILENAME) bool { + ret, _, _ := procGetOpenFileName.Call( + uintptr(unsafe.Pointer(ofn))) + + return ret != 0 +} + +func GetSaveFileName(ofn *OPENFILENAME) bool { + ret, _, _ := procGetSaveFileName.Call( + uintptr(unsafe.Pointer(ofn))) + + return ret != 0 +} + +func CommDlgExtendedError() uint { + ret, _, _ := procCommDlgExtendedError.Call() + + return uint(ret) +} diff --git a/vendor/github.com/apenwarr/w32/constants.go b/vendor/github.com/apenwarr/w32/constants.go new file mode 100644 index 000000000..1775ca83f --- /dev/null +++ b/vendor/github.com/apenwarr/w32/constants.go @@ -0,0 +1,2628 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +const ( + FALSE = 0 + TRUE = 1 +) + +const ( + NO_ERROR = 0 + ERROR_SUCCESS = 0 + ERROR_FILE_NOT_FOUND = 2 + ERROR_PATH_NOT_FOUND = 3 + ERROR_ACCESS_DENIED = 5 + ERROR_INVALID_HANDLE = 6 + ERROR_BAD_FORMAT = 11 + ERROR_INVALID_NAME = 123 + ERROR_MORE_DATA = 234 + ERROR_NO_MORE_ITEMS = 259 + ERROR_INVALID_SERVICE_CONTROL = 1052 + ERROR_SERVICE_REQUEST_TIMEOUT = 1053 + ERROR_SERVICE_NO_THREAD = 1054 + ERROR_SERVICE_DATABASE_LOCKED = 1055 + ERROR_SERVICE_ALREADY_RUNNING = 1056 + ERROR_SERVICE_DISABLED = 1058 + ERROR_SERVICE_DOES_NOT_EXIST = 1060 + ERROR_SERVICE_CANNOT_ACCEPT_CTRL = 1061 + ERROR_SERVICE_NOT_ACTIVE = 1062 + ERROR_DATABASE_DOES_NOT_EXIST = 1065 + ERROR_SERVICE_DEPENDENCY_FAIL = 1068 + ERROR_SERVICE_LOGON_FAILED = 1069 + ERROR_SERVICE_MARKED_FOR_DELETE = 1072 + ERROR_SERVICE_DEPENDENCY_DELETED = 1075 +) + +const ( + SE_ERR_FNF = 2 + SE_ERR_PNF = 3 + SE_ERR_ACCESSDENIED = 5 + SE_ERR_OOM = 8 + SE_ERR_DLLNOTFOUND = 32 + SE_ERR_SHARE = 26 + SE_ERR_ASSOCINCOMPLETE = 27 + SE_ERR_DDETIMEOUT = 28 + SE_ERR_DDEFAIL = 29 + SE_ERR_DDEBUSY = 30 + SE_ERR_NOASSOC = 31 +) + +const ( + CW_USEDEFAULT = ^0x7fffffff +) + +// ShowWindow constants +const ( + SW_HIDE = 0 + SW_NORMAL = 1 + SW_SHOWNORMAL = 1 + SW_SHOWMINIMIZED = 2 + SW_MAXIMIZE = 3 + SW_SHOWMAXIMIZED = 3 + SW_SHOWNOACTIVATE = 4 + SW_SHOW = 5 + SW_MINIMIZE = 6 + SW_SHOWMINNOACTIVE = 7 + SW_SHOWNA = 8 + SW_RESTORE = 9 + SW_SHOWDEFAULT = 10 + SW_FORCEMINIMIZE = 11 +) + +// Window class styles +const ( + CS_VREDRAW = 0x00000001 + CS_HREDRAW = 0x00000002 + CS_KEYCVTWINDOW = 0x00000004 + CS_DBLCLKS = 0x00000008 + CS_OWNDC = 0x00000020 + CS_CLASSDC = 0x00000040 + CS_PARENTDC = 0x00000080 + CS_NOKEYCVT = 0x00000100 + CS_NOCLOSE = 0x00000200 + CS_SAVEBITS = 0x00000800 + CS_BYTEALIGNCLIENT = 0x00001000 + CS_BYTEALIGNWINDOW = 0x00002000 + CS_GLOBALCLASS = 0x00004000 + CS_IME = 0x00010000 + CS_DROPSHADOW = 0x00020000 +) + +// Predefined cursor constants +const ( + IDC_ARROW = 32512 + IDC_IBEAM = 32513 + IDC_WAIT = 32514 + IDC_CROSS = 32515 + IDC_UPARROW = 32516 + IDC_SIZENWSE = 32642 + IDC_SIZENESW = 32643 + IDC_SIZEWE = 32644 + IDC_SIZENS = 32645 + IDC_SIZEALL = 32646 + IDC_NO = 32648 + IDC_HAND = 32649 + IDC_APPSTARTING = 32650 + IDC_HELP = 32651 + IDC_ICON = 32641 + IDC_SIZE = 32640 +) + +// Predefined icon constants +const ( + IDI_APPLICATION = 32512 + IDI_HAND = 32513 + IDI_QUESTION = 32514 + IDI_EXCLAMATION = 32515 + IDI_ASTERISK = 32516 + IDI_WINLOGO = 32517 + IDI_WARNING = IDI_EXCLAMATION + IDI_ERROR = IDI_HAND + IDI_INFORMATION = IDI_ASTERISK +) + +// Button style constants +const ( + BS_3STATE = 5 + BS_AUTO3STATE = 6 + BS_AUTOCHECKBOX = 3 + BS_AUTORADIOBUTTON = 9 + BS_BITMAP = 128 + BS_BOTTOM = 0X800 + BS_CENTER = 0X300 + BS_CHECKBOX = 2 + BS_DEFPUSHBUTTON = 1 + BS_GROUPBOX = 7 + BS_ICON = 64 + BS_LEFT = 256 + BS_LEFTTEXT = 32 + BS_MULTILINE = 0X2000 + BS_NOTIFY = 0X4000 + BS_OWNERDRAW = 0XB + BS_PUSHBUTTON = 0 + BS_PUSHLIKE = 4096 + BS_RADIOBUTTON = 4 + BS_RIGHT = 512 + BS_RIGHTBUTTON = 32 + BS_TEXT = 0 + BS_TOP = 0X400 + BS_USERBUTTON = 8 + BS_VCENTER = 0XC00 + BS_FLAT = 0X8000 +) + +// Button state constants +const ( + BST_CHECKED = 1 + BST_INDETERMINATE = 2 + BST_UNCHECKED = 0 + BST_FOCUS = 8 + BST_PUSHED = 4 +) + +// Predefined brushes constants +const ( + COLOR_3DDKSHADOW = 21 + COLOR_3DFACE = 15 + COLOR_3DHILIGHT = 20 + COLOR_3DHIGHLIGHT = 20 + COLOR_3DLIGHT = 22 + COLOR_BTNHILIGHT = 20 + COLOR_3DSHADOW = 16 + COLOR_ACTIVEBORDER = 10 + COLOR_ACTIVECAPTION = 2 + COLOR_APPWORKSPACE = 12 + COLOR_BACKGROUND = 1 + COLOR_DESKTOP = 1 + COLOR_BTNFACE = 15 + COLOR_BTNHIGHLIGHT = 20 + COLOR_BTNSHADOW = 16 + COLOR_BTNTEXT = 18 + COLOR_CAPTIONTEXT = 9 + COLOR_GRAYTEXT = 17 + COLOR_HIGHLIGHT = 13 + COLOR_HIGHLIGHTTEXT = 14 + COLOR_INACTIVEBORDER = 11 + COLOR_INACTIVECAPTION = 3 + COLOR_INACTIVECAPTIONTEXT = 19 + COLOR_INFOBK = 24 + COLOR_INFOTEXT = 23 + COLOR_MENU = 4 + COLOR_MENUTEXT = 7 + COLOR_SCROLLBAR = 0 + COLOR_WINDOW = 5 + COLOR_WINDOWFRAME = 6 + COLOR_WINDOWTEXT = 8 + COLOR_HOTLIGHT = 26 + COLOR_GRADIENTACTIVECAPTION = 27 + COLOR_GRADIENTINACTIVECAPTION = 28 +) + +// Button message constants +const ( + BM_CLICK = 245 + BM_GETCHECK = 240 + BM_GETIMAGE = 246 + BM_GETSTATE = 242 + BM_SETCHECK = 241 + BM_SETIMAGE = 247 + BM_SETSTATE = 243 + BM_SETSTYLE = 244 +) + +// Button notifications +const ( + BN_CLICKED = 0 + BN_PAINT = 1 + BN_HILITE = 2 + BN_PUSHED = BN_HILITE + BN_UNHILITE = 3 + BN_UNPUSHED = BN_UNHILITE + BN_DISABLE = 4 + BN_DOUBLECLICKED = 5 + BN_DBLCLK = BN_DOUBLECLICKED + BN_SETFOCUS = 6 + BN_KILLFOCUS = 7 +) + +// GetWindowLong and GetWindowLongPtr constants +const ( + GWL_EXSTYLE = -20 + GWL_STYLE = -16 + GWL_WNDPROC = -4 + GWLP_WNDPROC = -4 + GWL_HINSTANCE = -6 + GWLP_HINSTANCE = -6 + GWL_HWNDPARENT = -8 + GWLP_HWNDPARENT = -8 + GWL_ID = -12 + GWLP_ID = -12 + GWL_USERDATA = -21 + GWLP_USERDATA = -21 +) + +// Window style constants +const ( + WS_OVERLAPPED = 0X00000000 + WS_POPUP = 0X80000000 + WS_CHILD = 0X40000000 + WS_MINIMIZE = 0X20000000 + WS_VISIBLE = 0X10000000 + WS_DISABLED = 0X08000000 + WS_CLIPSIBLINGS = 0X04000000 + WS_CLIPCHILDREN = 0X02000000 + WS_MAXIMIZE = 0X01000000 + WS_CAPTION = 0X00C00000 + WS_BORDER = 0X00800000 + WS_DLGFRAME = 0X00400000 + WS_VSCROLL = 0X00200000 + WS_HSCROLL = 0X00100000 + WS_SYSMENU = 0X00080000 + WS_THICKFRAME = 0X00040000 + WS_GROUP = 0X00020000 + WS_TABSTOP = 0X00010000 + WS_MINIMIZEBOX = 0X00020000 + WS_MAXIMIZEBOX = 0X00010000 + WS_TILED = 0X00000000 + WS_ICONIC = 0X20000000 + WS_SIZEBOX = 0X00040000 + WS_OVERLAPPEDWINDOW = 0X00000000 | 0X00C00000 | 0X00080000 | 0X00040000 | 0X00020000 | 0X00010000 + WS_POPUPWINDOW = 0X80000000 | 0X00800000 | 0X00080000 + WS_CHILDWINDOW = 0X40000000 +) + +// Extended window style constants +const ( + WS_EX_DLGMODALFRAME = 0X00000001 + WS_EX_NOPARENTNOTIFY = 0X00000004 + WS_EX_TOPMOST = 0X00000008 + WS_EX_ACCEPTFILES = 0X00000010 + WS_EX_TRANSPARENT = 0X00000020 + WS_EX_MDICHILD = 0X00000040 + WS_EX_TOOLWINDOW = 0X00000080 + WS_EX_WINDOWEDGE = 0X00000100 + WS_EX_CLIENTEDGE = 0X00000200 + WS_EX_CONTEXTHELP = 0X00000400 + WS_EX_RIGHT = 0X00001000 + WS_EX_LEFT = 0X00000000 + WS_EX_RTLREADING = 0X00002000 + WS_EX_LTRREADING = 0X00000000 + WS_EX_LEFTSCROLLBAR = 0X00004000 + WS_EX_RIGHTSCROLLBAR = 0X00000000 + WS_EX_CONTROLPARENT = 0X00010000 + WS_EX_STATICEDGE = 0X00020000 + WS_EX_APPWINDOW = 0X00040000 + WS_EX_OVERLAPPEDWINDOW = 0X00000100 | 0X00000200 + WS_EX_PALETTEWINDOW = 0X00000100 | 0X00000080 | 0X00000008 + WS_EX_LAYERED = 0X00080000 + WS_EX_NOINHERITLAYOUT = 0X00100000 + WS_EX_LAYOUTRTL = 0X00400000 + WS_EX_NOACTIVATE = 0X08000000 +) + +// Window message constants +const ( + WM_APP = 32768 + WM_ACTIVATE = 6 + WM_ACTIVATEAPP = 28 + WM_AFXFIRST = 864 + WM_AFXLAST = 895 + WM_ASKCBFORMATNAME = 780 + WM_CANCELJOURNAL = 75 + WM_CANCELMODE = 31 + WM_CAPTURECHANGED = 533 + WM_CHANGECBCHAIN = 781 + WM_CHAR = 258 + WM_CHARTOITEM = 47 + WM_CHILDACTIVATE = 34 + WM_CLEAR = 771 + WM_CLOSE = 16 + WM_COMMAND = 273 + WM_COMMNOTIFY = 68 /* OBSOLETE */ + WM_COMPACTING = 65 + WM_COMPAREITEM = 57 + WM_CONTEXTMENU = 123 + WM_COPY = 769 + WM_COPYDATA = 74 + WM_CREATE = 1 + WM_CTLCOLORBTN = 309 + WM_CTLCOLORDLG = 310 + WM_CTLCOLOREDIT = 307 + WM_CTLCOLORLISTBOX = 308 + WM_CTLCOLORMSGBOX = 306 + WM_CTLCOLORSCROLLBAR = 311 + WM_CTLCOLORSTATIC = 312 + WM_CUT = 768 + WM_DEADCHAR = 259 + WM_DELETEITEM = 45 + WM_DESTROY = 2 + WM_DESTROYCLIPBOARD = 775 + WM_DEVICECHANGE = 537 + WM_DEVMODECHANGE = 27 + WM_DISPLAYCHANGE = 126 + WM_DRAWCLIPBOARD = 776 + WM_DRAWITEM = 43 + WM_DROPFILES = 563 + WM_ENABLE = 10 + WM_ENDSESSION = 22 + WM_ENTERIDLE = 289 + WM_ENTERMENULOOP = 529 + WM_ENTERSIZEMOVE = 561 + WM_ERASEBKGND = 20 + WM_EXITMENULOOP = 530 + WM_EXITSIZEMOVE = 562 + WM_FONTCHANGE = 29 + WM_GETDLGCODE = 135 + WM_GETFONT = 49 + WM_GETHOTKEY = 51 + WM_GETICON = 127 + WM_GETMINMAXINFO = 36 + WM_GETTEXT = 13 + WM_GETTEXTLENGTH = 14 + WM_HANDHELDFIRST = 856 + WM_HANDHELDLAST = 863 + WM_HELP = 83 + WM_HOTKEY = 786 + WM_HSCROLL = 276 + WM_HSCROLLCLIPBOARD = 782 + WM_ICONERASEBKGND = 39 + WM_INITDIALOG = 272 + WM_INITMENU = 278 + WM_INITMENUPOPUP = 279 + WM_INPUT = 0X00FF + WM_INPUTLANGCHANGE = 81 + WM_INPUTLANGCHANGEREQUEST = 80 + WM_KEYDOWN = 256 + WM_KEYUP = 257 + WM_KILLFOCUS = 8 + WM_MDIACTIVATE = 546 + WM_MDICASCADE = 551 + WM_MDICREATE = 544 + WM_MDIDESTROY = 545 + WM_MDIGETACTIVE = 553 + WM_MDIICONARRANGE = 552 + WM_MDIMAXIMIZE = 549 + WM_MDINEXT = 548 + WM_MDIREFRESHMENU = 564 + WM_MDIRESTORE = 547 + WM_MDISETMENU = 560 + WM_MDITILE = 550 + WM_MEASUREITEM = 44 + WM_GETOBJECT = 0X003D + WM_CHANGEUISTATE = 0X0127 + WM_UPDATEUISTATE = 0X0128 + WM_QUERYUISTATE = 0X0129 + WM_UNINITMENUPOPUP = 0X0125 + WM_MENURBUTTONUP = 290 + WM_MENUCOMMAND = 0X0126 + WM_MENUGETOBJECT = 0X0124 + WM_MENUDRAG = 0X0123 + WM_APPCOMMAND = 0X0319 + WM_MENUCHAR = 288 + WM_MENUSELECT = 287 + WM_MOVE = 3 + WM_MOVING = 534 + WM_NCACTIVATE = 134 + WM_NCCALCSIZE = 131 + WM_NCCREATE = 129 + WM_NCDESTROY = 130 + WM_NCHITTEST = 132 + WM_NCLBUTTONDBLCLK = 163 + WM_NCLBUTTONDOWN = 161 + WM_NCLBUTTONUP = 162 + WM_NCMBUTTONDBLCLK = 169 + WM_NCMBUTTONDOWN = 167 + WM_NCMBUTTONUP = 168 + WM_NCXBUTTONDOWN = 171 + WM_NCXBUTTONUP = 172 + WM_NCXBUTTONDBLCLK = 173 + WM_NCMOUSEHOVER = 0X02A0 + WM_NCMOUSELEAVE = 0X02A2 + WM_NCMOUSEMOVE = 160 + WM_NCPAINT = 133 + WM_NCRBUTTONDBLCLK = 166 + WM_NCRBUTTONDOWN = 164 + WM_NCRBUTTONUP = 165 + WM_NEXTDLGCTL = 40 + WM_NEXTMENU = 531 + WM_NOTIFY = 78 + WM_NOTIFYFORMAT = 85 + WM_NULL = 0 + WM_PAINT = 15 + WM_PAINTCLIPBOARD = 777 + WM_PAINTICON = 38 + WM_PALETTECHANGED = 785 + WM_PALETTEISCHANGING = 784 + WM_PARENTNOTIFY = 528 + WM_PASTE = 770 + WM_PENWINFIRST = 896 + WM_PENWINLAST = 911 + WM_POWER = 72 + WM_POWERBROADCAST = 536 + WM_PRINT = 791 + WM_PRINTCLIENT = 792 + WM_QUERYDRAGICON = 55 + WM_QUERYENDSESSION = 17 + WM_QUERYNEWPALETTE = 783 + WM_QUERYOPEN = 19 + WM_QUEUESYNC = 35 + WM_QUIT = 18 + WM_RENDERALLFORMATS = 774 + WM_RENDERFORMAT = 773 + WM_SETCURSOR = 32 + WM_SETFOCUS = 7 + WM_SETFONT = 48 + WM_SETHOTKEY = 50 + WM_SETICON = 128 + WM_SETREDRAW = 11 + WM_SETTEXT = 12 + WM_SETTINGCHANGE = 26 + WM_SHOWWINDOW = 24 + WM_SIZE = 5 + WM_SIZECLIPBOARD = 779 + WM_SIZING = 532 + WM_SPOOLERSTATUS = 42 + WM_STYLECHANGED = 125 + WM_STYLECHANGING = 124 + WM_SYSCHAR = 262 + WM_SYSCOLORCHANGE = 21 + WM_SYSCOMMAND = 274 + WM_SYSDEADCHAR = 263 + WM_SYSKEYDOWN = 260 + WM_SYSKEYUP = 261 + WM_TCARD = 82 + WM_THEMECHANGED = 794 + WM_TIMECHANGE = 30 + WM_TIMER = 275 + WM_UNDO = 772 + WM_USER = 1024 + WM_USERCHANGED = 84 + WM_VKEYTOITEM = 46 + WM_VSCROLL = 277 + WM_VSCROLLCLIPBOARD = 778 + WM_WINDOWPOSCHANGED = 71 + WM_WINDOWPOSCHANGING = 70 + WM_WININICHANGE = 26 + WM_KEYFIRST = 256 + WM_KEYLAST = 264 + WM_SYNCPAINT = 136 + WM_MOUSEACTIVATE = 33 + WM_MOUSEMOVE = 512 + WM_LBUTTONDOWN = 513 + WM_LBUTTONUP = 514 + WM_LBUTTONDBLCLK = 515 + WM_RBUTTONDOWN = 516 + WM_RBUTTONUP = 517 + WM_RBUTTONDBLCLK = 518 + WM_MBUTTONDOWN = 519 + WM_MBUTTONUP = 520 + WM_MBUTTONDBLCLK = 521 + WM_MOUSEWHEEL = 522 + WM_XBUTTONDOWN = 523 + WM_XBUTTONUP = 524 + WM_XBUTTONDBLCLK = 525 + WM_MOUSEHWHEEL = 526 + WM_MOUSEFIRST = 512 + WM_MOUSELAST = 526 + WM_MOUSEHOVER = 0X2A1 + WM_MOUSELEAVE = 0X2A3 + WM_CLIPBOARDUPDATE = 0x031D +) + +// WM_ACTIVATE +const ( + WA_INACTIVE = 0 + WA_ACTIVE = 1 + WA_CLICKACTIVE = 2 +) + +const LF_FACESIZE = 32 + +// Font weight constants +const ( + FW_DONTCARE = 0 + FW_THIN = 100 + FW_EXTRALIGHT = 200 + FW_ULTRALIGHT = FW_EXTRALIGHT + FW_LIGHT = 300 + FW_NORMAL = 400 + FW_REGULAR = 400 + FW_MEDIUM = 500 + FW_SEMIBOLD = 600 + FW_DEMIBOLD = FW_SEMIBOLD + FW_BOLD = 700 + FW_EXTRABOLD = 800 + FW_ULTRABOLD = FW_EXTRABOLD + FW_HEAVY = 900 + FW_BLACK = FW_HEAVY +) + +// Charset constants +const ( + ANSI_CHARSET = 0 + DEFAULT_CHARSET = 1 + SYMBOL_CHARSET = 2 + SHIFTJIS_CHARSET = 128 + HANGEUL_CHARSET = 129 + HANGUL_CHARSET = 129 + GB2312_CHARSET = 134 + CHINESEBIG5_CHARSET = 136 + GREEK_CHARSET = 161 + TURKISH_CHARSET = 162 + HEBREW_CHARSET = 177 + ARABIC_CHARSET = 178 + BALTIC_CHARSET = 186 + RUSSIAN_CHARSET = 204 + THAI_CHARSET = 222 + EASTEUROPE_CHARSET = 238 + OEM_CHARSET = 255 + JOHAB_CHARSET = 130 + VIETNAMESE_CHARSET = 163 + MAC_CHARSET = 77 +) + +// Font output precision constants +const ( + OUT_DEFAULT_PRECIS = 0 + OUT_STRING_PRECIS = 1 + OUT_CHARACTER_PRECIS = 2 + OUT_STROKE_PRECIS = 3 + OUT_TT_PRECIS = 4 + OUT_DEVICE_PRECIS = 5 + OUT_RASTER_PRECIS = 6 + OUT_TT_ONLY_PRECIS = 7 + OUT_OUTLINE_PRECIS = 8 + OUT_PS_ONLY_PRECIS = 10 +) + +// Font clipping precision constants +const ( + CLIP_DEFAULT_PRECIS = 0 + CLIP_CHARACTER_PRECIS = 1 + CLIP_STROKE_PRECIS = 2 + CLIP_MASK = 15 + CLIP_LH_ANGLES = 16 + CLIP_TT_ALWAYS = 32 + CLIP_EMBEDDED = 128 +) + +// Font output quality constants +const ( + DEFAULT_QUALITY = 0 + DRAFT_QUALITY = 1 + PROOF_QUALITY = 2 + NONANTIALIASED_QUALITY = 3 + ANTIALIASED_QUALITY = 4 + CLEARTYPE_QUALITY = 5 +) + +// Font pitch constants +const ( + DEFAULT_PITCH = 0 + FIXED_PITCH = 1 + VARIABLE_PITCH = 2 +) + +// Font family constants +const ( + FF_DECORATIVE = 80 + FF_DONTCARE = 0 + FF_MODERN = 48 + FF_ROMAN = 16 + FF_SCRIPT = 64 + FF_SWISS = 32 +) + +// DeviceCapabilities capabilities +const ( + DC_FIELDS = 1 + DC_PAPERS = 2 + DC_PAPERSIZE = 3 + DC_MINEXTENT = 4 + DC_MAXEXTENT = 5 + DC_BINS = 6 + DC_DUPLEX = 7 + DC_SIZE = 8 + DC_EXTRA = 9 + DC_VERSION = 10 + DC_DRIVER = 11 + DC_BINNAMES = 12 + DC_ENUMRESOLUTIONS = 13 + DC_FILEDEPENDENCIES = 14 + DC_TRUETYPE = 15 + DC_PAPERNAMES = 16 + DC_ORIENTATION = 17 + DC_COPIES = 18 + DC_BINADJUST = 19 + DC_EMF_COMPLIANT = 20 + DC_DATATYPE_PRODUCED = 21 + DC_COLLATE = 22 + DC_MANUFACTURER = 23 + DC_MODEL = 24 + DC_PERSONALITY = 25 + DC_PRINTRATE = 26 + DC_PRINTRATEUNIT = 27 + DC_PRINTERMEM = 28 + DC_MEDIAREADY = 29 + DC_STAPLE = 30 + DC_PRINTRATEPPM = 31 + DC_COLORDEVICE = 32 + DC_NUP = 33 + DC_MEDIATYPENAMES = 34 + DC_MEDIATYPES = 35 +) + +// GetDeviceCaps index constants +const ( + DRIVERVERSION = 0 + TECHNOLOGY = 2 + HORZSIZE = 4 + VERTSIZE = 6 + HORZRES = 8 + VERTRES = 10 + LOGPIXELSX = 88 + LOGPIXELSY = 90 + BITSPIXEL = 12 + PLANES = 14 + NUMBRUSHES = 16 + NUMPENS = 18 + NUMFONTS = 22 + NUMCOLORS = 24 + NUMMARKERS = 20 + ASPECTX = 40 + ASPECTY = 42 + ASPECTXY = 44 + PDEVICESIZE = 26 + CLIPCAPS = 36 + SIZEPALETTE = 104 + NUMRESERVED = 106 + COLORRES = 108 + PHYSICALWIDTH = 110 + PHYSICALHEIGHT = 111 + PHYSICALOFFSETX = 112 + PHYSICALOFFSETY = 113 + SCALINGFACTORX = 114 + SCALINGFACTORY = 115 + VREFRESH = 116 + DESKTOPHORZRES = 118 + DESKTOPVERTRES = 117 + BLTALIGNMENT = 119 + SHADEBLENDCAPS = 120 + COLORMGMTCAPS = 121 + RASTERCAPS = 38 + CURVECAPS = 28 + LINECAPS = 30 + POLYGONALCAPS = 32 + TEXTCAPS = 34 +) + +// GetDeviceCaps TECHNOLOGY constants +const ( + DT_PLOTTER = 0 + DT_RASDISPLAY = 1 + DT_RASPRINTER = 2 + DT_RASCAMERA = 3 + DT_CHARSTREAM = 4 + DT_METAFILE = 5 + DT_DISPFILE = 6 +) + +// GetDeviceCaps SHADEBLENDCAPS constants +const ( + SB_NONE = 0x00 + SB_CONST_ALPHA = 0x01 + SB_PIXEL_ALPHA = 0x02 + SB_PREMULT_ALPHA = 0x04 + SB_GRAD_RECT = 0x10 + SB_GRAD_TRI = 0x20 +) + +// GetDeviceCaps COLORMGMTCAPS constants +const ( + CM_NONE = 0x00 + CM_DEVICE_ICM = 0x01 + CM_GAMMA_RAMP = 0x02 + CM_CMYK_COLOR = 0x04 +) + +// GetDeviceCaps RASTERCAPS constants +const ( + RC_BANDING = 2 + RC_BITBLT = 1 + RC_BITMAP64 = 8 + RC_DI_BITMAP = 128 + RC_DIBTODEV = 512 + RC_FLOODFILL = 4096 + RC_GDI20_OUTPUT = 16 + RC_PALETTE = 256 + RC_SCALING = 4 + RC_STRETCHBLT = 2048 + RC_STRETCHDIB = 8192 + RC_DEVBITS = 0x8000 + RC_OP_DX_OUTPUT = 0x4000 +) + +// GetDeviceCaps CURVECAPS constants +const ( + CC_NONE = 0 + CC_CIRCLES = 1 + CC_PIE = 2 + CC_CHORD = 4 + CC_ELLIPSES = 8 + CC_WIDE = 16 + CC_STYLED = 32 + CC_WIDESTYLED = 64 + CC_INTERIORS = 128 + CC_ROUNDRECT = 256 +) + +// GetDeviceCaps LINECAPS constants +const ( + LC_NONE = 0 + LC_POLYLINE = 2 + LC_MARKER = 4 + LC_POLYMARKER = 8 + LC_WIDE = 16 + LC_STYLED = 32 + LC_WIDESTYLED = 64 + LC_INTERIORS = 128 +) + +// GetDeviceCaps POLYGONALCAPS constants +const ( + PC_NONE = 0 + PC_POLYGON = 1 + PC_POLYPOLYGON = 256 + PC_PATHS = 512 + PC_RECTANGLE = 2 + PC_WINDPOLYGON = 4 + PC_SCANLINE = 8 + PC_TRAPEZOID = 4 + PC_WIDE = 16 + PC_STYLED = 32 + PC_WIDESTYLED = 64 + PC_INTERIORS = 128 +) + +// GetDeviceCaps TEXTCAPS constants +const ( + TC_OP_CHARACTER = 1 + TC_OP_STROKE = 2 + TC_CP_STROKE = 4 + TC_CR_90 = 8 + TC_CR_ANY = 16 + TC_SF_X_YINDEP = 32 + TC_SA_DOUBLE = 64 + TC_SA_INTEGER = 128 + TC_SA_CONTIN = 256 + TC_EA_DOUBLE = 512 + TC_IA_ABLE = 1024 + TC_UA_ABLE = 2048 + TC_SO_ABLE = 4096 + TC_RA_ABLE = 8192 + TC_VA_ABLE = 16384 + TC_RESERVED = 32768 + TC_SCROLLBLT = 65536 +) + +// Static control styles +const ( + SS_BITMAP = 14 + SS_BLACKFRAME = 7 + SS_BLACKRECT = 4 + SS_CENTER = 1 + SS_CENTERIMAGE = 512 + SS_EDITCONTROL = 0x2000 + SS_ENHMETAFILE = 15 + SS_ETCHEDFRAME = 18 + SS_ETCHEDHORZ = 16 + SS_ETCHEDVERT = 17 + SS_GRAYFRAME = 8 + SS_GRAYRECT = 5 + SS_ICON = 3 + SS_LEFT = 0 + SS_LEFTNOWORDWRAP = 0xc + SS_NOPREFIX = 128 + SS_NOTIFY = 256 + SS_OWNERDRAW = 0xd + SS_REALSIZECONTROL = 0x040 + SS_REALSIZEIMAGE = 0x800 + SS_RIGHT = 2 + SS_RIGHTJUST = 0x400 + SS_SIMPLE = 11 + SS_SUNKEN = 4096 + SS_WHITEFRAME = 9 + SS_WHITERECT = 6 + SS_USERITEM = 10 + SS_TYPEMASK = 0x0000001F + SS_ENDELLIPSIS = 0x00004000 + SS_PATHELLIPSIS = 0x00008000 + SS_WORDELLIPSIS = 0x0000C000 + SS_ELLIPSISMASK = 0x0000C000 +) + +// Edit styles +const ( + ES_LEFT = 0x0000 + ES_CENTER = 0x0001 + ES_RIGHT = 0x0002 + ES_MULTILINE = 0x0004 + ES_UPPERCASE = 0x0008 + ES_LOWERCASE = 0x0010 + ES_PASSWORD = 0x0020 + ES_AUTOVSCROLL = 0x0040 + ES_AUTOHSCROLL = 0x0080 + ES_NOHIDESEL = 0x0100 + ES_OEMCONVERT = 0x0400 + ES_READONLY = 0x0800 + ES_WANTRETURN = 0x1000 + ES_NUMBER = 0x2000 +) + +// Edit notifications +const ( + EN_SETFOCUS = 0x0100 + EN_KILLFOCUS = 0x0200 + EN_CHANGE = 0x0300 + EN_UPDATE = 0x0400 + EN_ERRSPACE = 0x0500 + EN_MAXTEXT = 0x0501 + EN_HSCROLL = 0x0601 + EN_VSCROLL = 0x0602 + EN_ALIGN_LTR_EC = 0x0700 + EN_ALIGN_RTL_EC = 0x0701 +) + +// Edit messages +const ( + EM_GETSEL = 0x00B0 + EM_SETSEL = 0x00B1 + EM_GETRECT = 0x00B2 + EM_SETRECT = 0x00B3 + EM_SETRECTNP = 0x00B4 + EM_SCROLL = 0x00B5 + EM_LINESCROLL = 0x00B6 + EM_SCROLLCARET = 0x00B7 + EM_GETMODIFY = 0x00B8 + EM_SETMODIFY = 0x00B9 + EM_GETLINECOUNT = 0x00BA + EM_LINEINDEX = 0x00BB + EM_SETHANDLE = 0x00BC + EM_GETHANDLE = 0x00BD + EM_GETTHUMB = 0x00BE + EM_LINELENGTH = 0x00C1 + EM_REPLACESEL = 0x00C2 + EM_GETLINE = 0x00C4 + EM_LIMITTEXT = 0x00C5 + EM_CANUNDO = 0x00C6 + EM_UNDO = 0x00C7 + EM_FMTLINES = 0x00C8 + EM_LINEFROMCHAR = 0x00C9 + EM_SETTABSTOPS = 0x00CB + EM_SETPASSWORDCHAR = 0x00CC + EM_EMPTYUNDOBUFFER = 0x00CD + EM_GETFIRSTVISIBLELINE = 0x00CE + EM_SETREADONLY = 0x00CF + EM_SETWORDBREAKPROC = 0x00D0 + EM_GETWORDBREAKPROC = 0x00D1 + EM_GETPASSWORDCHAR = 0x00D2 + EM_SETMARGINS = 0x00D3 + EM_GETMARGINS = 0x00D4 + EM_SETLIMITTEXT = EM_LIMITTEXT + EM_GETLIMITTEXT = 0x00D5 + EM_POSFROMCHAR = 0x00D6 + EM_CHARFROMPOS = 0x00D7 + EM_SETIMESTATUS = 0x00D8 + EM_GETIMESTATUS = 0x00D9 + EM_SETCUEBANNER = 0x1501 + EM_GETCUEBANNER = 0x1502 +) + +const ( + CCM_FIRST = 0x2000 + CCM_LAST = CCM_FIRST + 0x200 + CCM_SETBKCOLOR = 8193 + CCM_SETCOLORSCHEME = 8194 + CCM_GETCOLORSCHEME = 8195 + CCM_GETDROPTARGET = 8196 + CCM_SETUNICODEFORMAT = 8197 + CCM_GETUNICODEFORMAT = 8198 + CCM_SETVERSION = 0x2007 + CCM_GETVERSION = 0x2008 + CCM_SETNOTIFYWINDOW = 0x2009 + CCM_SETWINDOWTHEME = 0x200b + CCM_DPISCALE = 0x200c +) + +// Common controls styles +const ( + CCS_TOP = 1 + CCS_NOMOVEY = 2 + CCS_BOTTOM = 3 + CCS_NORESIZE = 4 + CCS_NOPARENTALIGN = 8 + CCS_ADJUSTABLE = 32 + CCS_NODIVIDER = 64 + CCS_VERT = 128 + CCS_LEFT = 129 + CCS_NOMOVEX = 130 + CCS_RIGHT = 131 +) + +// ProgressBar messages +const ( + PROGRESS_CLASS = "msctls_progress32" + PBM_SETPOS = WM_USER + 2 + PBM_DELTAPOS = WM_USER + 3 + PBM_SETSTEP = WM_USER + 4 + PBM_STEPIT = WM_USER + 5 + PBM_SETRANGE32 = 1030 + PBM_GETRANGE = 1031 + PBM_GETPOS = 1032 + PBM_SETBARCOLOR = 1033 + PBM_SETBKCOLOR = CCM_SETBKCOLOR + PBS_SMOOTH = 1 + PBS_VERTICAL = 4 +) + +// GetOpenFileName and GetSaveFileName extended flags +const ( + OFN_EX_NOPLACESBAR = 0x00000001 +) + +// GetOpenFileName and GetSaveFileName flags +const ( + OFN_ALLOWMULTISELECT = 0x00000200 + OFN_CREATEPROMPT = 0x00002000 + OFN_DONTADDTORECENT = 0x02000000 + OFN_ENABLEHOOK = 0x00000020 + OFN_ENABLEINCLUDENOTIFY = 0x00400000 + OFN_ENABLESIZING = 0x00800000 + OFN_ENABLETEMPLATE = 0x00000040 + OFN_ENABLETEMPLATEHANDLE = 0x00000080 + OFN_EXPLORER = 0x00080000 + OFN_EXTENSIONDIFFERENT = 0x00000400 + OFN_FILEMUSTEXIST = 0x00001000 + OFN_FORCESHOWHIDDEN = 0x10000000 + OFN_HIDEREADONLY = 0x00000004 + OFN_LONGNAMES = 0x00200000 + OFN_NOCHANGEDIR = 0x00000008 + OFN_NODEREFERENCELINKS = 0x00100000 + OFN_NOLONGNAMES = 0x00040000 + OFN_NONETWORKBUTTON = 0x00020000 + OFN_NOREADONLYRETURN = 0x00008000 + OFN_NOTESTFILECREATE = 0x00010000 + OFN_NOVALIDATE = 0x00000100 + OFN_OVERWRITEPROMPT = 0x00000002 + OFN_PATHMUSTEXIST = 0x00000800 + OFN_READONLY = 0x00000001 + OFN_SHAREAWARE = 0x00004000 + OFN_SHOWHELP = 0x00000010 +) + +//SHBrowseForFolder flags +const ( + BIF_RETURNONLYFSDIRS = 0x00000001 + BIF_DONTGOBELOWDOMAIN = 0x00000002 + BIF_STATUSTEXT = 0x00000004 + BIF_RETURNFSANCESTORS = 0x00000008 + BIF_EDITBOX = 0x00000010 + BIF_VALIDATE = 0x00000020 + BIF_NEWDIALOGSTYLE = 0x00000040 + BIF_BROWSEINCLUDEURLS = 0x00000080 + BIF_USENEWUI = BIF_EDITBOX | BIF_NEWDIALOGSTYLE + BIF_UAHINT = 0x00000100 + BIF_NONEWFOLDERBUTTON = 0x00000200 + BIF_NOTRANSLATETARGETS = 0x00000400 + BIF_BROWSEFORCOMPUTER = 0x00001000 + BIF_BROWSEFORPRINTER = 0x00002000 + BIF_BROWSEINCLUDEFILES = 0x00004000 + BIF_SHAREABLE = 0x00008000 + BIF_BROWSEFILEJUNCTIONS = 0x00010000 +) + +//MessageBox flags +const ( + MB_OK = 0x00000000 + MB_OKCANCEL = 0x00000001 + MB_ABORTRETRYIGNORE = 0x00000002 + MB_YESNOCANCEL = 0x00000003 + MB_YESNO = 0x00000004 + MB_RETRYCANCEL = 0x00000005 + MB_CANCELTRYCONTINUE = 0x00000006 + MB_ICONHAND = 0x00000010 + MB_ICONQUESTION = 0x00000020 + MB_ICONEXCLAMATION = 0x00000030 + MB_ICONASTERISK = 0x00000040 + MB_USERICON = 0x00000080 + MB_ICONWARNING = MB_ICONEXCLAMATION + MB_ICONERROR = MB_ICONHAND + MB_ICONINFORMATION = MB_ICONASTERISK + MB_ICONSTOP = MB_ICONHAND + MB_DEFBUTTON1 = 0x00000000 + MB_DEFBUTTON2 = 0x00000100 + MB_DEFBUTTON3 = 0x00000200 + MB_DEFBUTTON4 = 0x00000300 +) + +//COM +const ( + E_INVALIDARG = 0x80070057 + E_OUTOFMEMORY = 0x8007000E + E_UNEXPECTED = 0x8000FFFF +) + +const ( + S_OK = 0 + S_FALSE = 0x0001 + RPC_E_CHANGED_MODE = 0x80010106 +) + +// GetSystemMetrics constants +const ( + SM_CXSCREEN = 0 + SM_CYSCREEN = 1 + SM_CXVSCROLL = 2 + SM_CYHSCROLL = 3 + SM_CYCAPTION = 4 + SM_CXBORDER = 5 + SM_CYBORDER = 6 + SM_CXDLGFRAME = 7 + SM_CYDLGFRAME = 8 + SM_CYVTHUMB = 9 + SM_CXHTHUMB = 10 + SM_CXICON = 11 + SM_CYICON = 12 + SM_CXCURSOR = 13 + SM_CYCURSOR = 14 + SM_CYMENU = 15 + SM_CXFULLSCREEN = 16 + SM_CYFULLSCREEN = 17 + SM_CYKANJIWINDOW = 18 + SM_MOUSEPRESENT = 19 + SM_CYVSCROLL = 20 + SM_CXHSCROLL = 21 + SM_DEBUG = 22 + SM_SWAPBUTTON = 23 + SM_RESERVED1 = 24 + SM_RESERVED2 = 25 + SM_RESERVED3 = 26 + SM_RESERVED4 = 27 + SM_CXMIN = 28 + SM_CYMIN = 29 + SM_CXSIZE = 30 + SM_CYSIZE = 31 + SM_CXFRAME = 32 + SM_CYFRAME = 33 + SM_CXMINTRACK = 34 + SM_CYMINTRACK = 35 + SM_CXDOUBLECLK = 36 + SM_CYDOUBLECLK = 37 + SM_CXICONSPACING = 38 + SM_CYICONSPACING = 39 + SM_MENUDROPALIGNMENT = 40 + SM_PENWINDOWS = 41 + SM_DBCSENABLED = 42 + SM_CMOUSEBUTTONS = 43 + SM_CXFIXEDFRAME = SM_CXDLGFRAME + SM_CYFIXEDFRAME = SM_CYDLGFRAME + SM_CXSIZEFRAME = SM_CXFRAME + SM_CYSIZEFRAME = SM_CYFRAME + SM_SECURE = 44 + SM_CXEDGE = 45 + SM_CYEDGE = 46 + SM_CXMINSPACING = 47 + SM_CYMINSPACING = 48 + SM_CXSMICON = 49 + SM_CYSMICON = 50 + SM_CYSMCAPTION = 51 + SM_CXSMSIZE = 52 + SM_CYSMSIZE = 53 + SM_CXMENUSIZE = 54 + SM_CYMENUSIZE = 55 + SM_ARRANGE = 56 + SM_CXMINIMIZED = 57 + SM_CYMINIMIZED = 58 + SM_CXMAXTRACK = 59 + SM_CYMAXTRACK = 60 + SM_CXMAXIMIZED = 61 + SM_CYMAXIMIZED = 62 + SM_NETWORK = 63 + SM_CLEANBOOT = 67 + SM_CXDRAG = 68 + SM_CYDRAG = 69 + SM_SHOWSOUNDS = 70 + SM_CXMENUCHECK = 71 + SM_CYMENUCHECK = 72 + SM_SLOWMACHINE = 73 + SM_MIDEASTENABLED = 74 + SM_MOUSEWHEELPRESENT = 75 + SM_XVIRTUALSCREEN = 76 + SM_YVIRTUALSCREEN = 77 + SM_CXVIRTUALSCREEN = 78 + SM_CYVIRTUALSCREEN = 79 + SM_CMONITORS = 80 + SM_SAMEDISPLAYFORMAT = 81 + SM_IMMENABLED = 82 + SM_CXFOCUSBORDER = 83 + SM_CYFOCUSBORDER = 84 + SM_TABLETPC = 86 + SM_MEDIACENTER = 87 + SM_STARTER = 88 + SM_SERVERR2 = 89 + SM_CMETRICS = 91 + SM_REMOTESESSION = 0x1000 + SM_SHUTTINGDOWN = 0x2000 + SM_REMOTECONTROL = 0x2001 + SM_CARETBLINKINGENABLED = 0x2002 +) + +const ( + CLSCTX_INPROC_SERVER = 1 + CLSCTX_INPROC_HANDLER = 2 + CLSCTX_LOCAL_SERVER = 4 + CLSCTX_INPROC_SERVER16 = 8 + CLSCTX_REMOTE_SERVER = 16 + CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER + CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER + CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER +) + +const ( + COINIT_APARTMENTTHREADED = 0x2 + COINIT_MULTITHREADED = 0x0 + COINIT_DISABLE_OLE1DDE = 0x4 + COINIT_SPEED_OVER_MEMORY = 0x8 +) + +const ( + DISPATCH_METHOD = 1 + DISPATCH_PROPERTYGET = 2 + DISPATCH_PROPERTYPUT = 4 + DISPATCH_PROPERTYPUTREF = 8 +) + +const ( + CC_FASTCALL = iota + CC_CDECL + CC_MSCPASCAL + CC_PASCAL = CC_MSCPASCAL + CC_MACPASCAL + CC_STDCALL + CC_FPFASTCALL + CC_SYSCALL + CC_MPWCDECL + CC_MPWPASCAL + CC_MAX = CC_MPWPASCAL +) + +const ( + VT_EMPTY = 0x0 + VT_NULL = 0x1 + VT_I2 = 0x2 + VT_I4 = 0x3 + VT_R4 = 0x4 + VT_R8 = 0x5 + VT_CY = 0x6 + VT_DATE = 0x7 + VT_BSTR = 0x8 + VT_DISPATCH = 0x9 + VT_ERROR = 0xa + VT_BOOL = 0xb + VT_VARIANT = 0xc + VT_UNKNOWN = 0xd + VT_DECIMAL = 0xe + VT_I1 = 0x10 + VT_UI1 = 0x11 + VT_UI2 = 0x12 + VT_UI4 = 0x13 + VT_I8 = 0x14 + VT_UI8 = 0x15 + VT_INT = 0x16 + VT_UINT = 0x17 + VT_VOID = 0x18 + VT_HRESULT = 0x19 + VT_PTR = 0x1a + VT_SAFEARRAY = 0x1b + VT_CARRAY = 0x1c + VT_USERDEFINED = 0x1d + VT_LPSTR = 0x1e + VT_LPWSTR = 0x1f + VT_RECORD = 0x24 + VT_INT_PTR = 0x25 + VT_UINT_PTR = 0x26 + VT_FILETIME = 0x40 + VT_BLOB = 0x41 + VT_STREAM = 0x42 + VT_STORAGE = 0x43 + VT_STREAMED_OBJECT = 0x44 + VT_STORED_OBJECT = 0x45 + VT_BLOB_OBJECT = 0x46 + VT_CF = 0x47 + VT_CLSID = 0x48 + VT_BSTR_BLOB = 0xfff + VT_VECTOR = 0x1000 + VT_ARRAY = 0x2000 + VT_BYREF = 0x4000 + VT_RESERVED = 0x8000 + VT_ILLEGAL = 0xffff + VT_ILLEGALMASKED = 0xfff + VT_TYPEMASK = 0xfff +) + +const ( + DISPID_UNKNOWN = -1 + DISPID_VALUE = 0 + DISPID_PROPERTYPUT = -3 + DISPID_NEWENUM = -4 + DISPID_EVALUATE = -5 + DISPID_CONSTRUCTOR = -6 + DISPID_DESTRUCTOR = -7 + DISPID_COLLECT = -8 +) + +const ( + MONITOR_DEFAULTTONULL = 0x00000000 + MONITOR_DEFAULTTOPRIMARY = 0x00000001 + MONITOR_DEFAULTTONEAREST = 0x00000002 + + MONITORINFOF_PRIMARY = 0x00000001 +) + +const ( + CCHDEVICENAME = 32 + CCHFORMNAME = 32 +) + +const ( + IDOK = 1 + IDCANCEL = 2 + IDABORT = 3 + IDRETRY = 4 + IDIGNORE = 5 + IDYES = 6 + IDNO = 7 + IDCLOSE = 8 + IDHELP = 9 + IDTRYAGAIN = 10 + IDCONTINUE = 11 + IDTIMEOUT = 32000 +) + +// Generic WM_NOTIFY notification codes +const ( + NM_FIRST = 0 + NM_OUTOFMEMORY = NM_FIRST - 1 + NM_CLICK = NM_FIRST - 2 + NM_DBLCLK = NM_FIRST - 3 + NM_RETURN = NM_FIRST - 4 + NM_RCLICK = NM_FIRST - 5 + NM_RDBLCLK = NM_FIRST - 6 + NM_SETFOCUS = NM_FIRST - 7 + NM_KILLFOCUS = NM_FIRST - 8 + NM_CUSTOMDRAW = NM_FIRST - 12 + NM_HOVER = NM_FIRST - 13 + NM_NCHITTEST = NM_FIRST - 14 + NM_KEYDOWN = NM_FIRST - 15 + NM_RELEASEDCAPTURE = NM_FIRST - 16 + NM_SETCURSOR = NM_FIRST - 17 + NM_CHAR = NM_FIRST - 18 + NM_TOOLTIPSCREATED = NM_FIRST - 19 + NM_LAST = NM_FIRST - 99 +) + +// ListView messages +const ( + LVM_FIRST = 0x1000 + LVM_GETITEMCOUNT = LVM_FIRST + 4 + LVM_SETIMAGELIST = LVM_FIRST + 3 + LVM_GETIMAGELIST = LVM_FIRST + 2 + LVM_GETITEM = LVM_FIRST + 75 + LVM_SETITEM = LVM_FIRST + 76 + LVM_INSERTITEM = LVM_FIRST + 77 + LVM_DELETEITEM = LVM_FIRST + 8 + LVM_DELETEALLITEMS = LVM_FIRST + 9 + LVM_GETCALLBACKMASK = LVM_FIRST + 10 + LVM_SETCALLBACKMASK = LVM_FIRST + 11 + LVM_SETUNICODEFORMAT = CCM_SETUNICODEFORMAT + LVM_GETNEXTITEM = LVM_FIRST + 12 + LVM_FINDITEM = LVM_FIRST + 83 + LVM_GETITEMRECT = LVM_FIRST + 14 + LVM_GETSTRINGWIDTH = LVM_FIRST + 87 + LVM_HITTEST = LVM_FIRST + 18 + LVM_ENSUREVISIBLE = LVM_FIRST + 19 + LVM_SCROLL = LVM_FIRST + 20 + LVM_REDRAWITEMS = LVM_FIRST + 21 + LVM_ARRANGE = LVM_FIRST + 22 + LVM_EDITLABEL = LVM_FIRST + 118 + LVM_GETEDITCONTROL = LVM_FIRST + 24 + LVM_GETCOLUMN = LVM_FIRST + 95 + LVM_SETCOLUMN = LVM_FIRST + 96 + LVM_INSERTCOLUMN = LVM_FIRST + 97 + LVM_DELETECOLUMN = LVM_FIRST + 28 + LVM_GETCOLUMNWIDTH = LVM_FIRST + 29 + LVM_SETCOLUMNWIDTH = LVM_FIRST + 30 + LVM_GETHEADER = LVM_FIRST + 31 + LVM_CREATEDRAGIMAGE = LVM_FIRST + 33 + LVM_GETVIEWRECT = LVM_FIRST + 34 + LVM_GETTEXTCOLOR = LVM_FIRST + 35 + LVM_SETTEXTCOLOR = LVM_FIRST + 36 + LVM_GETTEXTBKCOLOR = LVM_FIRST + 37 + LVM_SETTEXTBKCOLOR = LVM_FIRST + 38 + LVM_GETTOPINDEX = LVM_FIRST + 39 + LVM_GETCOUNTPERPAGE = LVM_FIRST + 40 + LVM_GETORIGIN = LVM_FIRST + 41 + LVM_UPDATE = LVM_FIRST + 42 + LVM_SETITEMSTATE = LVM_FIRST + 43 + LVM_GETITEMSTATE = LVM_FIRST + 44 + LVM_GETITEMTEXT = LVM_FIRST + 115 + LVM_SETITEMTEXT = LVM_FIRST + 116 + LVM_SETITEMCOUNT = LVM_FIRST + 47 + LVM_SORTITEMS = LVM_FIRST + 48 + LVM_SETITEMPOSITION32 = LVM_FIRST + 49 + LVM_GETSELECTEDCOUNT = LVM_FIRST + 50 + LVM_GETITEMSPACING = LVM_FIRST + 51 + LVM_GETISEARCHSTRING = LVM_FIRST + 117 + LVM_SETICONSPACING = LVM_FIRST + 53 + LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54 + LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55 + LVM_GETSUBITEMRECT = LVM_FIRST + 56 + LVM_SUBITEMHITTEST = LVM_FIRST + 57 + LVM_SETCOLUMNORDERARRAY = LVM_FIRST + 58 + LVM_GETCOLUMNORDERARRAY = LVM_FIRST + 59 + LVM_SETHOTITEM = LVM_FIRST + 60 + LVM_GETHOTITEM = LVM_FIRST + 61 + LVM_SETHOTCURSOR = LVM_FIRST + 62 + LVM_GETHOTCURSOR = LVM_FIRST + 63 + LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 64 + LVM_SETWORKAREAS = LVM_FIRST + 65 + LVM_GETWORKAREAS = LVM_FIRST + 70 + LVM_GETNUMBEROFWORKAREAS = LVM_FIRST + 73 + LVM_GETSELECTIONMARK = LVM_FIRST + 66 + LVM_SETSELECTIONMARK = LVM_FIRST + 67 + LVM_SETHOVERTIME = LVM_FIRST + 71 + LVM_GETHOVERTIME = LVM_FIRST + 72 + LVM_SETTOOLTIPS = LVM_FIRST + 74 + LVM_GETTOOLTIPS = LVM_FIRST + 78 + LVM_SORTITEMSEX = LVM_FIRST + 81 + LVM_SETBKIMAGE = LVM_FIRST + 138 + LVM_GETBKIMAGE = LVM_FIRST + 139 + LVM_SETSELECTEDCOLUMN = LVM_FIRST + 140 + LVM_SETVIEW = LVM_FIRST + 142 + LVM_GETVIEW = LVM_FIRST + 143 + LVM_INSERTGROUP = LVM_FIRST + 145 + LVM_SETGROUPINFO = LVM_FIRST + 147 + LVM_GETGROUPINFO = LVM_FIRST + 149 + LVM_REMOVEGROUP = LVM_FIRST + 150 + LVM_MOVEGROUP = LVM_FIRST + 151 + LVM_GETGROUPCOUNT = LVM_FIRST + 152 + LVM_GETGROUPINFOBYINDEX = LVM_FIRST + 153 + LVM_MOVEITEMTOGROUP = LVM_FIRST + 154 + LVM_GETGROUPRECT = LVM_FIRST + 98 + LVM_SETGROUPMETRICS = LVM_FIRST + 155 + LVM_GETGROUPMETRICS = LVM_FIRST + 156 + LVM_ENABLEGROUPVIEW = LVM_FIRST + 157 + LVM_SORTGROUPS = LVM_FIRST + 158 + LVM_INSERTGROUPSORTED = LVM_FIRST + 159 + LVM_REMOVEALLGROUPS = LVM_FIRST + 160 + LVM_HASGROUP = LVM_FIRST + 161 + LVM_GETGROUPSTATE = LVM_FIRST + 92 + LVM_GETFOCUSEDGROUP = LVM_FIRST + 93 + LVM_SETTILEVIEWINFO = LVM_FIRST + 162 + LVM_GETTILEVIEWINFO = LVM_FIRST + 163 + LVM_SETTILEINFO = LVM_FIRST + 164 + LVM_GETTILEINFO = LVM_FIRST + 165 + LVM_SETINSERTMARK = LVM_FIRST + 166 + LVM_GETINSERTMARK = LVM_FIRST + 167 + LVM_INSERTMARKHITTEST = LVM_FIRST + 168 + LVM_GETINSERTMARKRECT = LVM_FIRST + 169 + LVM_SETINSERTMARKCOLOR = LVM_FIRST + 170 + LVM_GETINSERTMARKCOLOR = LVM_FIRST + 171 + LVM_SETINFOTIP = LVM_FIRST + 173 + LVM_GETSELECTEDCOLUMN = LVM_FIRST + 174 + LVM_ISGROUPVIEWENABLED = LVM_FIRST + 175 + LVM_GETOUTLINECOLOR = LVM_FIRST + 176 + LVM_SETOUTLINECOLOR = LVM_FIRST + 177 + LVM_CANCELEDITLABEL = LVM_FIRST + 179 + LVM_MAPINDEXTOID = LVM_FIRST + 180 + LVM_MAPIDTOINDEX = LVM_FIRST + 181 + LVM_ISITEMVISIBLE = LVM_FIRST + 182 + LVM_GETNEXTITEMINDEX = LVM_FIRST + 211 +) + +// ListView notifications +const ( + LVN_FIRST = -100 + + LVN_ITEMCHANGING = LVN_FIRST - 0 + LVN_ITEMCHANGED = LVN_FIRST - 1 + LVN_INSERTITEM = LVN_FIRST - 2 + LVN_DELETEITEM = LVN_FIRST - 3 + LVN_DELETEALLITEMS = LVN_FIRST - 4 + LVN_BEGINLABELEDITA = LVN_FIRST - 5 + LVN_BEGINLABELEDITW = LVN_FIRST - 75 + LVN_ENDLABELEDITA = LVN_FIRST - 6 + LVN_ENDLABELEDITW = LVN_FIRST - 76 + LVN_COLUMNCLICK = LVN_FIRST - 8 + LVN_BEGINDRAG = LVN_FIRST - 9 + LVN_BEGINRDRAG = LVN_FIRST - 11 + LVN_ODCACHEHINT = LVN_FIRST - 13 + LVN_ODFINDITEMA = LVN_FIRST - 52 + LVN_ODFINDITEMW = LVN_FIRST - 79 + LVN_ITEMACTIVATE = LVN_FIRST - 14 + LVN_ODSTATECHANGED = LVN_FIRST - 15 + LVN_HOTTRACK = LVN_FIRST - 21 + LVN_GETDISPINFO = LVN_FIRST - 77 + LVN_SETDISPINFO = LVN_FIRST - 78 + LVN_KEYDOWN = LVN_FIRST - 55 + LVN_MARQUEEBEGIN = LVN_FIRST - 56 + LVN_GETINFOTIP = LVN_FIRST - 58 + LVN_INCREMENTALSEARCH = LVN_FIRST - 63 + LVN_BEGINSCROLL = LVN_FIRST - 80 + LVN_ENDSCROLL = LVN_FIRST - 81 +) + +// ListView LVNI constants +const ( + LVNI_ALL = 0 + LVNI_FOCUSED = 1 + LVNI_SELECTED = 2 + LVNI_CUT = 4 + LVNI_DROPHILITED = 8 + LVNI_ABOVE = 256 + LVNI_BELOW = 512 + LVNI_TOLEFT = 1024 + LVNI_TORIGHT = 2048 +) + +// ListView styles +const ( + LVS_ICON = 0x0000 + LVS_REPORT = 0x0001 + LVS_SMALLICON = 0x0002 + LVS_LIST = 0x0003 + LVS_TYPEMASK = 0x0003 + LVS_SINGLESEL = 0x0004 + LVS_SHOWSELALWAYS = 0x0008 + LVS_SORTASCENDING = 0x0010 + LVS_SORTDESCENDING = 0x0020 + LVS_SHAREIMAGELISTS = 0x0040 + LVS_NOLABELWRAP = 0x0080 + LVS_AUTOARRANGE = 0x0100 + LVS_EDITLABELS = 0x0200 + LVS_OWNERDATA = 0x1000 + LVS_NOSCROLL = 0x2000 + LVS_TYPESTYLEMASK = 0xfc00 + LVS_ALIGNTOP = 0x0000 + LVS_ALIGNLEFT = 0x0800 + LVS_ALIGNMASK = 0x0c00 + LVS_OWNERDRAWFIXED = 0x0400 + LVS_NOCOLUMNHEADER = 0x4000 + LVS_NOSORTHEADER = 0x8000 +) + +// ListView extended styles +const ( + LVS_EX_GRIDLINES = 0x00000001 + LVS_EX_SUBITEMIMAGES = 0x00000002 + LVS_EX_CHECKBOXES = 0x00000004 + LVS_EX_TRACKSELECT = 0x00000008 + LVS_EX_HEADERDRAGDROP = 0x00000010 + LVS_EX_FULLROWSELECT = 0x00000020 + LVS_EX_ONECLICKACTIVATE = 0x00000040 + LVS_EX_TWOCLICKACTIVATE = 0x00000080 + LVS_EX_FLATSB = 0x00000100 + LVS_EX_REGIONAL = 0x00000200 + LVS_EX_INFOTIP = 0x00000400 + LVS_EX_UNDERLINEHOT = 0x00000800 + LVS_EX_UNDERLINECOLD = 0x00001000 + LVS_EX_MULTIWORKAREAS = 0x00002000 + LVS_EX_LABELTIP = 0x00004000 + LVS_EX_BORDERSELECT = 0x00008000 + LVS_EX_DOUBLEBUFFER = 0x00010000 + LVS_EX_HIDELABELS = 0x00020000 + LVS_EX_SINGLEROW = 0x00040000 + LVS_EX_SNAPTOGRID = 0x00080000 + LVS_EX_SIMPLESELECT = 0x00100000 +) + +// ListView column flags +const ( + LVCF_FMT = 0x0001 + LVCF_WIDTH = 0x0002 + LVCF_TEXT = 0x0004 + LVCF_SUBITEM = 0x0008 + LVCF_IMAGE = 0x0010 + LVCF_ORDER = 0x0020 +) + +// ListView column format constants +const ( + LVCFMT_LEFT = 0x0000 + LVCFMT_RIGHT = 0x0001 + LVCFMT_CENTER = 0x0002 + LVCFMT_JUSTIFYMASK = 0x0003 + LVCFMT_IMAGE = 0x0800 + LVCFMT_BITMAP_ON_RIGHT = 0x1000 + LVCFMT_COL_HAS_IMAGES = 0x8000 +) + +// ListView item flags +const ( + LVIF_TEXT = 0x00000001 + LVIF_IMAGE = 0x00000002 + LVIF_PARAM = 0x00000004 + LVIF_STATE = 0x00000008 + LVIF_INDENT = 0x00000010 + LVIF_NORECOMPUTE = 0x00000800 + LVIF_GROUPID = 0x00000100 + LVIF_COLUMNS = 0x00000200 +) + +// ListView item states +const ( + LVIS_FOCUSED = 1 + LVIS_SELECTED = 2 + LVIS_CUT = 4 + LVIS_DROPHILITED = 8 + LVIS_OVERLAYMASK = 0xF00 + LVIS_STATEIMAGEMASK = 0xF000 +) + +// ListView hit test constants +const ( + LVHT_NOWHERE = 0x00000001 + LVHT_ONITEMICON = 0x00000002 + LVHT_ONITEMLABEL = 0x00000004 + LVHT_ONITEMSTATEICON = 0x00000008 + LVHT_ONITEM = LVHT_ONITEMICON | LVHT_ONITEMLABEL | LVHT_ONITEMSTATEICON + + LVHT_ABOVE = 0x00000008 + LVHT_BELOW = 0x00000010 + LVHT_TORIGHT = 0x00000020 + LVHT_TOLEFT = 0x00000040 +) + +// ListView image list types +const ( + LVSIL_NORMAL = 0 + LVSIL_SMALL = 1 + LVSIL_STATE = 2 + LVSIL_GROUPHEADER = 3 +) + +// InitCommonControlsEx flags +const ( + ICC_LISTVIEW_CLASSES = 1 + ICC_TREEVIEW_CLASSES = 2 + ICC_BAR_CLASSES = 4 + ICC_TAB_CLASSES = 8 + ICC_UPDOWN_CLASS = 16 + ICC_PROGRESS_CLASS = 32 + ICC_HOTKEY_CLASS = 64 + ICC_ANIMATE_CLASS = 128 + ICC_WIN95_CLASSES = 255 + ICC_DATE_CLASSES = 256 + ICC_USEREX_CLASSES = 512 + ICC_COOL_CLASSES = 1024 + ICC_INTERNET_CLASSES = 2048 + ICC_PAGESCROLLER_CLASS = 4096 + ICC_NATIVEFNTCTL_CLASS = 8192 + INFOTIPSIZE = 1024 + ICC_STANDARD_CLASSES = 0x00004000 + ICC_LINK_CLASS = 0x00008000 +) + +// Dialog Codes +const ( + DLGC_WANTARROWS = 0x0001 + DLGC_WANTTAB = 0x0002 + DLGC_WANTALLKEYS = 0x0004 + DLGC_WANTMESSAGE = 0x0004 + DLGC_HASSETSEL = 0x0008 + DLGC_DEFPUSHBUTTON = 0x0010 + DLGC_UNDEFPUSHBUTTON = 0x0020 + DLGC_RADIOBUTTON = 0x0040 + DLGC_WANTCHARS = 0x0080 + DLGC_STATIC = 0x0100 + DLGC_BUTTON = 0x2000 +) + +// Get/SetWindowWord/Long offsets for use with WC_DIALOG windows +const ( + DWL_MSGRESULT = 0 + DWL_DLGPROC = 4 + DWL_USER = 8 +) + +// PeekMessage wRemoveMsg value +const ( + PM_NOREMOVE = 0x000 + PM_REMOVE = 0x001 + PM_NOYIELD = 0x002 +) + +// ImageList flags +const ( + ILC_MASK = 0x00000001 + ILC_COLOR = 0x00000000 + ILC_COLORDDB = 0x000000FE + ILC_COLOR4 = 0x00000004 + ILC_COLOR8 = 0x00000008 + ILC_COLOR16 = 0x00000010 + ILC_COLOR24 = 0x00000018 + ILC_COLOR32 = 0x00000020 + ILC_PALETTE = 0x00000800 + ILC_MIRROR = 0x00002000 + ILC_PERITEMMIRROR = 0x00008000 + ILC_ORIGINALSIZE = 0x00010000 + ILC_HIGHQUALITYSCALE = 0x00020000 +) + +// Keystroke Message Flags +const ( + KF_EXTENDED = 0x0100 + KF_DLGMODE = 0x0800 + KF_MENUMODE = 0x1000 + KF_ALTDOWN = 0x2000 + KF_REPEAT = 0x4000 + KF_UP = 0x8000 +) + +// Virtual-Key Codes +const ( + VK_LBUTTON = 0x01 + VK_RBUTTON = 0x02 + VK_CANCEL = 0x03 + VK_MBUTTON = 0x04 + VK_XBUTTON1 = 0x05 + VK_XBUTTON2 = 0x06 + VK_BACK = 0x08 + VK_TAB = 0x09 + VK_CLEAR = 0x0C + VK_RETURN = 0x0D + VK_SHIFT = 0x10 + VK_CONTROL = 0x11 + VK_MENU = 0x12 + VK_PAUSE = 0x13 + VK_CAPITAL = 0x14 + VK_KANA = 0x15 + VK_HANGEUL = 0x15 + VK_HANGUL = 0x15 + VK_JUNJA = 0x17 + VK_FINAL = 0x18 + VK_HANJA = 0x19 + VK_KANJI = 0x19 + VK_ESCAPE = 0x1B + VK_CONVERT = 0x1C + VK_NONCONVERT = 0x1D + VK_ACCEPT = 0x1E + VK_MODECHANGE = 0x1F + VK_SPACE = 0x20 + VK_PRIOR = 0x21 + VK_NEXT = 0x22 + VK_END = 0x23 + VK_HOME = 0x24 + VK_LEFT = 0x25 + VK_UP = 0x26 + VK_RIGHT = 0x27 + VK_DOWN = 0x28 + VK_SELECT = 0x29 + VK_PRINT = 0x2A + VK_EXECUTE = 0x2B + VK_SNAPSHOT = 0x2C + VK_INSERT = 0x2D + VK_DELETE = 0x2E + VK_HELP = 0x2F + VK_LWIN = 0x5B + VK_RWIN = 0x5C + VK_APPS = 0x5D + VK_SLEEP = 0x5F + VK_NUMPAD0 = 0x60 + VK_NUMPAD1 = 0x61 + VK_NUMPAD2 = 0x62 + VK_NUMPAD3 = 0x63 + VK_NUMPAD4 = 0x64 + VK_NUMPAD5 = 0x65 + VK_NUMPAD6 = 0x66 + VK_NUMPAD7 = 0x67 + VK_NUMPAD8 = 0x68 + VK_NUMPAD9 = 0x69 + VK_MULTIPLY = 0x6A + VK_ADD = 0x6B + VK_SEPARATOR = 0x6C + VK_SUBTRACT = 0x6D + VK_DECIMAL = 0x6E + VK_DIVIDE = 0x6F + VK_F1 = 0x70 + VK_F2 = 0x71 + VK_F3 = 0x72 + VK_F4 = 0x73 + VK_F5 = 0x74 + VK_F6 = 0x75 + VK_F7 = 0x76 + VK_F8 = 0x77 + VK_F9 = 0x78 + VK_F10 = 0x79 + VK_F11 = 0x7A + VK_F12 = 0x7B + VK_F13 = 0x7C + VK_F14 = 0x7D + VK_F15 = 0x7E + VK_F16 = 0x7F + VK_F17 = 0x80 + VK_F18 = 0x81 + VK_F19 = 0x82 + VK_F20 = 0x83 + VK_F21 = 0x84 + VK_F22 = 0x85 + VK_F23 = 0x86 + VK_F24 = 0x87 + VK_NUMLOCK = 0x90 + VK_SCROLL = 0x91 + VK_OEM_NEC_EQUAL = 0x92 + VK_OEM_FJ_JISHO = 0x92 + VK_OEM_FJ_MASSHOU = 0x93 + VK_OEM_FJ_TOUROKU = 0x94 + VK_OEM_FJ_LOYA = 0x95 + VK_OEM_FJ_ROYA = 0x96 + VK_LSHIFT = 0xA0 + VK_RSHIFT = 0xA1 + VK_LCONTROL = 0xA2 + VK_RCONTROL = 0xA3 + VK_LMENU = 0xA4 + VK_RMENU = 0xA5 + VK_BROWSER_BACK = 0xA6 + VK_BROWSER_FORWARD = 0xA7 + VK_BROWSER_REFRESH = 0xA8 + VK_BROWSER_STOP = 0xA9 + VK_BROWSER_SEARCH = 0xAA + VK_BROWSER_FAVORITES = 0xAB + VK_BROWSER_HOME = 0xAC + VK_VOLUME_MUTE = 0xAD + VK_VOLUME_DOWN = 0xAE + VK_VOLUME_UP = 0xAF + VK_MEDIA_NEXT_TRACK = 0xB0 + VK_MEDIA_PREV_TRACK = 0xB1 + VK_MEDIA_STOP = 0xB2 + VK_MEDIA_PLAY_PAUSE = 0xB3 + VK_LAUNCH_MAIL = 0xB4 + VK_LAUNCH_MEDIA_SELECT = 0xB5 + VK_LAUNCH_APP1 = 0xB6 + VK_LAUNCH_APP2 = 0xB7 + VK_OEM_1 = 0xBA + VK_OEM_PLUS = 0xBB + VK_OEM_COMMA = 0xBC + VK_OEM_MINUS = 0xBD + VK_OEM_PERIOD = 0xBE + VK_OEM_2 = 0xBF + VK_OEM_3 = 0xC0 + VK_OEM_4 = 0xDB + VK_OEM_5 = 0xDC + VK_OEM_6 = 0xDD + VK_OEM_7 = 0xDE + VK_OEM_8 = 0xDF + VK_OEM_AX = 0xE1 + VK_OEM_102 = 0xE2 + VK_ICO_HELP = 0xE3 + VK_ICO_00 = 0xE4 + VK_PROCESSKEY = 0xE5 + VK_ICO_CLEAR = 0xE6 + VK_PACKET = 0xE7 + VK_OEM_RESET = 0xE9 + VK_OEM_JUMP = 0xEA + VK_OEM_PA1 = 0xEB + VK_OEM_PA2 = 0xEC + VK_OEM_PA3 = 0xED + VK_OEM_WSCTRL = 0xEE + VK_OEM_CUSEL = 0xEF + VK_OEM_ATTN = 0xF0 + VK_OEM_FINISH = 0xF1 + VK_OEM_COPY = 0xF2 + VK_OEM_AUTO = 0xF3 + VK_OEM_ENLW = 0xF4 + VK_OEM_BACKTAB = 0xF5 + VK_ATTN = 0xF6 + VK_CRSEL = 0xF7 + VK_EXSEL = 0xF8 + VK_EREOF = 0xF9 + VK_PLAY = 0xFA + VK_ZOOM = 0xFB + VK_NONAME = 0xFC + VK_PA1 = 0xFD + VK_OEM_CLEAR = 0xFE +) + +// Registry Value Types +const ( + REG_NONE = 0 + REG_SZ = 1 + REG_EXPAND_SZ = 2 + REG_BINARY = 3 + REG_DWORD = 4 + REG_DWORD_LITTLE_ENDIAN = 4 + REG_DWORD_BIG_ENDIAN = 5 + REG_LINK = 6 + REG_MULTI_SZ = 7 + REG_RESOURCE_LIST = 8 + REG_FULL_RESOURCE_DESCRIPTOR = 9 + REG_RESOURCE_REQUIREMENTS_LIST = 10 + REG_QWORD = 11 + REG_QWORD_LITTLE_ENDIAN = 11 +) + +// Tooltip styles +const ( + TTS_ALWAYSTIP = 0x01 + TTS_NOPREFIX = 0x02 + TTS_NOANIMATE = 0x10 + TTS_NOFADE = 0x20 + TTS_BALLOON = 0x40 + TTS_CLOSE = 0x80 + TTS_USEVISUALSTYLE = 0x100 +) + +// Tooltip messages +const ( + TTM_ACTIVATE = (WM_USER + 1) + TTM_SETDELAYTIME = (WM_USER + 3) + TTM_ADDTOOL = (WM_USER + 50) + TTM_DELTOOL = (WM_USER + 51) + TTM_NEWTOOLRECT = (WM_USER + 52) + TTM_RELAYEVENT = (WM_USER + 7) + TTM_GETTOOLINFO = (WM_USER + 53) + TTM_SETTOOLINFO = (WM_USER + 54) + TTM_HITTEST = (WM_USER + 55) + TTM_GETTEXT = (WM_USER + 56) + TTM_UPDATETIPTEXT = (WM_USER + 57) + TTM_GETTOOLCOUNT = (WM_USER + 13) + TTM_ENUMTOOLS = (WM_USER + 58) + TTM_GETCURRENTTOOL = (WM_USER + 59) + TTM_WINDOWFROMPOINT = (WM_USER + 16) + TTM_TRACKACTIVATE = (WM_USER + 17) + TTM_TRACKPOSITION = (WM_USER + 18) + TTM_SETTIPBKCOLOR = (WM_USER + 19) + TTM_SETTIPTEXTCOLOR = (WM_USER + 20) + TTM_GETDELAYTIME = (WM_USER + 21) + TTM_GETTIPBKCOLOR = (WM_USER + 22) + TTM_GETTIPTEXTCOLOR = (WM_USER + 23) + TTM_SETMAXTIPWIDTH = (WM_USER + 24) + TTM_GETMAXTIPWIDTH = (WM_USER + 25) + TTM_SETMARGIN = (WM_USER + 26) + TTM_GETMARGIN = (WM_USER + 27) + TTM_POP = (WM_USER + 28) + TTM_UPDATE = (WM_USER + 29) + TTM_GETBUBBLESIZE = (WM_USER + 30) + TTM_ADJUSTRECT = (WM_USER + 31) + TTM_SETTITLE = (WM_USER + 33) + TTM_POPUP = (WM_USER + 34) + TTM_GETTITLE = (WM_USER + 35) +) + +// Tooltip icons +const ( + TTI_NONE = 0 + TTI_INFO = 1 + TTI_WARNING = 2 + TTI_ERROR = 3 + TTI_INFO_LARGE = 4 + TTI_WARNING_LARGE = 5 + TTI_ERROR_LARGE = 6 +) + +// Tooltip notifications +const ( + TTN_FIRST = -520 + TTN_LAST = -549 + TTN_GETDISPINFO = (TTN_FIRST - 10) + TTN_SHOW = (TTN_FIRST - 1) + TTN_POP = (TTN_FIRST - 2) + TTN_LINKCLICK = (TTN_FIRST - 3) + TTN_NEEDTEXT = TTN_GETDISPINFO +) + +const ( + TTF_IDISHWND = 0x0001 + TTF_CENTERTIP = 0x0002 + TTF_RTLREADING = 0x0004 + TTF_SUBCLASS = 0x0010 + TTF_TRACK = 0x0020 + TTF_ABSOLUTE = 0x0080 + TTF_TRANSPARENT = 0x0100 + TTF_PARSELINKS = 0x1000 + TTF_DI_SETITEM = 0x8000 +) + +const ( + SWP_NOSIZE = 0x0001 + SWP_NOMOVE = 0x0002 + SWP_NOZORDER = 0x0004 + SWP_NOREDRAW = 0x0008 + SWP_NOACTIVATE = 0x0010 + SWP_FRAMECHANGED = 0x0020 + SWP_SHOWWINDOW = 0x0040 + SWP_HIDEWINDOW = 0x0080 + SWP_NOCOPYBITS = 0x0100 + SWP_NOOWNERZORDER = 0x0200 + SWP_NOSENDCHANGING = 0x0400 + SWP_DRAWFRAME = SWP_FRAMECHANGED + SWP_NOREPOSITION = SWP_NOOWNERZORDER + SWP_DEFERERASE = 0x2000 + SWP_ASYNCWINDOWPOS = 0x4000 +) + +// Predefined window handles +const ( + HWND_BROADCAST = HWND(0xFFFF) + HWND_BOTTOM = HWND(1) + HWND_NOTOPMOST = ^HWND(1) // -2 + HWND_TOP = HWND(0) + HWND_TOPMOST = ^HWND(0) // -1 + HWND_DESKTOP = HWND(0) + HWND_MESSAGE = ^HWND(2) // -3 +) + +// Pen types +const ( + PS_COSMETIC = 0x00000000 + PS_GEOMETRIC = 0x00010000 + PS_TYPE_MASK = 0x000F0000 +) + +// Pen styles +const ( + PS_SOLID = 0 + PS_DASH = 1 + PS_DOT = 2 + PS_DASHDOT = 3 + PS_DASHDOTDOT = 4 + PS_NULL = 5 + PS_INSIDEFRAME = 6 + PS_USERSTYLE = 7 + PS_ALTERNATE = 8 + PS_STYLE_MASK = 0x0000000F +) + +// Pen cap types +const ( + PS_ENDCAP_ROUND = 0x00000000 + PS_ENDCAP_SQUARE = 0x00000100 + PS_ENDCAP_FLAT = 0x00000200 + PS_ENDCAP_MASK = 0x00000F00 +) + +// Pen join types +const ( + PS_JOIN_ROUND = 0x00000000 + PS_JOIN_BEVEL = 0x00001000 + PS_JOIN_MITER = 0x00002000 + PS_JOIN_MASK = 0x0000F000 +) + +// Hatch styles +const ( + HS_HORIZONTAL = 0 + HS_VERTICAL = 1 + HS_FDIAGONAL = 2 + HS_BDIAGONAL = 3 + HS_CROSS = 4 + HS_DIAGCROSS = 5 +) + +// Stock Logical Objects +const ( + WHITE_BRUSH = 0 + LTGRAY_BRUSH = 1 + GRAY_BRUSH = 2 + DKGRAY_BRUSH = 3 + BLACK_BRUSH = 4 + NULL_BRUSH = 5 + HOLLOW_BRUSH = NULL_BRUSH + WHITE_PEN = 6 + BLACK_PEN = 7 + NULL_PEN = 8 + OEM_FIXED_FONT = 10 + ANSI_FIXED_FONT = 11 + ANSI_VAR_FONT = 12 + SYSTEM_FONT = 13 + DEVICE_DEFAULT_FONT = 14 + DEFAULT_PALETTE = 15 + SYSTEM_FIXED_FONT = 16 + DEFAULT_GUI_FONT = 17 + DC_BRUSH = 18 + DC_PEN = 19 +) + +// Brush styles +const ( + BS_SOLID = 0 + BS_NULL = 1 + BS_HOLLOW = BS_NULL + BS_HATCHED = 2 + BS_PATTERN = 3 + BS_INDEXED = 4 + BS_DIBPATTERN = 5 + BS_DIBPATTERNPT = 6 + BS_PATTERN8X8 = 7 + BS_DIBPATTERN8X8 = 8 + BS_MONOPATTERN = 9 +) + +// TRACKMOUSEEVENT flags +const ( + TME_HOVER = 0x00000001 + TME_LEAVE = 0x00000002 + TME_NONCLIENT = 0x00000010 + TME_QUERY = 0x40000000 + TME_CANCEL = 0x80000000 + + HOVER_DEFAULT = 0xFFFFFFFF +) + +// WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes +const ( + HTERROR = (-2) + HTTRANSPARENT = (-1) + HTNOWHERE = 0 + HTCLIENT = 1 + HTCAPTION = 2 + HTSYSMENU = 3 + HTGROWBOX = 4 + HTSIZE = HTGROWBOX + HTMENU = 5 + HTHSCROLL = 6 + HTVSCROLL = 7 + HTMINBUTTON = 8 + HTMAXBUTTON = 9 + HTLEFT = 10 + HTRIGHT = 11 + HTTOP = 12 + HTTOPLEFT = 13 + HTTOPRIGHT = 14 + HTBOTTOM = 15 + HTBOTTOMLEFT = 16 + HTBOTTOMRIGHT = 17 + HTBORDER = 18 + HTREDUCE = HTMINBUTTON + HTZOOM = HTMAXBUTTON + HTSIZEFIRST = HTLEFT + HTSIZELAST = HTBOTTOMRIGHT + HTOBJECT = 19 + HTCLOSE = 20 + HTHELP = 21 +) + +// DrawText[Ex] format flags +const ( + DT_TOP = 0x00000000 + DT_LEFT = 0x00000000 + DT_CENTER = 0x00000001 + DT_RIGHT = 0x00000002 + DT_VCENTER = 0x00000004 + DT_BOTTOM = 0x00000008 + DT_WORDBREAK = 0x00000010 + DT_SINGLELINE = 0x00000020 + DT_EXPANDTABS = 0x00000040 + DT_TABSTOP = 0x00000080 + DT_NOCLIP = 0x00000100 + DT_EXTERNALLEADING = 0x00000200 + DT_CALCRECT = 0x00000400 + DT_NOPREFIX = 0x00000800 + DT_INTERNAL = 0x00001000 + DT_EDITCONTROL = 0x00002000 + DT_PATH_ELLIPSIS = 0x00004000 + DT_END_ELLIPSIS = 0x00008000 + DT_MODIFYSTRING = 0x00010000 + DT_RTLREADING = 0x00020000 + DT_WORD_ELLIPSIS = 0x00040000 + DT_NOFULLWIDTHCHARBREAK = 0x00080000 + DT_HIDEPREFIX = 0x00100000 + DT_PREFIXONLY = 0x00200000 +) + +const CLR_INVALID = 0xFFFFFFFF + +// Background Modes +const ( + TRANSPARENT = 1 + OPAQUE = 2 + BKMODE_LAST = 2 +) + +// Global Memory Flags +const ( + GMEM_FIXED = 0x0000 + GMEM_MOVEABLE = 0x0002 + GMEM_NOCOMPACT = 0x0010 + GMEM_NODISCARD = 0x0020 + GMEM_ZEROINIT = 0x0040 + GMEM_MODIFY = 0x0080 + GMEM_DISCARDABLE = 0x0100 + GMEM_NOT_BANKED = 0x1000 + GMEM_SHARE = 0x2000 + GMEM_DDESHARE = 0x2000 + GMEM_NOTIFY = 0x4000 + GMEM_LOWER = GMEM_NOT_BANKED + GMEM_VALID_FLAGS = 0x7F72 + GMEM_INVALID_HANDLE = 0x8000 + GHND = (GMEM_MOVEABLE | GMEM_ZEROINIT) + GPTR = (GMEM_FIXED | GMEM_ZEROINIT) +) + +// Ternary raster operations +const ( + SRCCOPY = 0x00CC0020 + SRCPAINT = 0x00EE0086 + SRCAND = 0x008800C6 + SRCINVERT = 0x00660046 + SRCERASE = 0x00440328 + NOTSRCCOPY = 0x00330008 + NOTSRCERASE = 0x001100A6 + MERGECOPY = 0x00C000CA + MERGEPAINT = 0x00BB0226 + PATCOPY = 0x00F00021 + PATPAINT = 0x00FB0A09 + PATINVERT = 0x005A0049 + DSTINVERT = 0x00550009 + BLACKNESS = 0x00000042 + WHITENESS = 0x00FF0062 + NOMIRRORBITMAP = 0x80000000 + CAPTUREBLT = 0x40000000 +) + +// Clipboard formats +const ( + CF_TEXT = 1 + CF_BITMAP = 2 + CF_METAFILEPICT = 3 + CF_SYLK = 4 + CF_DIF = 5 + CF_TIFF = 6 + CF_OEMTEXT = 7 + CF_DIB = 8 + CF_PALETTE = 9 + CF_PENDATA = 10 + CF_RIFF = 11 + CF_WAVE = 12 + CF_UNICODETEXT = 13 + CF_ENHMETAFILE = 14 + CF_HDROP = 15 + CF_LOCALE = 16 + CF_DIBV5 = 17 + CF_MAX = 18 + CF_OWNERDISPLAY = 0x0080 + CF_DSPTEXT = 0x0081 + CF_DSPBITMAP = 0x0082 + CF_DSPMETAFILEPICT = 0x0083 + CF_DSPENHMETAFILE = 0x008E + CF_PRIVATEFIRST = 0x0200 + CF_PRIVATELAST = 0x02FF + CF_GDIOBJFIRST = 0x0300 + CF_GDIOBJLAST = 0x03FF +) + +// Bitmap compression formats +const ( + BI_RGB = 0 + BI_RLE8 = 1 + BI_RLE4 = 2 + BI_BITFIELDS = 3 + BI_JPEG = 4 + BI_PNG = 5 +) + +// SetDIBitsToDevice fuColorUse +const ( + DIB_PAL_COLORS = 1 + DIB_RGB_COLORS = 0 +) + +const ( + STANDARD_RIGHTS_REQUIRED = 0x000F +) + +// MapVirtualKey maptypes +const ( + MAPVK_VK_TO_CHAR = 2 + MAPVK_VK_TO_VSC = 0 + MAPVK_VSC_TO_VK = 1 + MAPVK_VSC_TO_VK_EX = 3 +) + +// ReadEventLog Flags +const ( + EVENTLOG_SEEK_READ = 0x0002 + EVENTLOG_SEQUENTIAL_READ = 0x0001 + EVENTLOG_FORWARDS_READ = 0x0004 + EVENTLOG_BACKWARDS_READ = 0x0008 +) + +// CreateToolhelp32Snapshot flags +const ( + TH32CS_SNAPHEAPLIST = 0x00000001 + TH32CS_SNAPPROCESS = 0x00000002 + TH32CS_SNAPTHREAD = 0x00000004 + TH32CS_SNAPMODULE = 0x00000008 + TH32CS_SNAPMODULE32 = 0x00000010 + TH32CS_INHERIT = 0x80000000 + TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD +) + +const ( + MAX_MODULE_NAME32 = 255 + MAX_PATH = 260 +) + +const ( + FOREGROUND_BLUE = 0x0001 + FOREGROUND_GREEN = 0x0002 + FOREGROUND_RED = 0x0004 + FOREGROUND_INTENSITY = 0x0008 + BACKGROUND_BLUE = 0x0010 + BACKGROUND_GREEN = 0x0020 + BACKGROUND_RED = 0x0040 + BACKGROUND_INTENSITY = 0x0080 + COMMON_LVB_LEADING_BYTE = 0x0100 + COMMON_LVB_TRAILING_BYTE = 0x0200 + COMMON_LVB_GRID_HORIZONTAL = 0x0400 + COMMON_LVB_GRID_LVERTICAL = 0x0800 + COMMON_LVB_GRID_RVERTICAL = 0x1000 + COMMON_LVB_REVERSE_VIDEO = 0x4000 + COMMON_LVB_UNDERSCORE = 0x8000 +) + +// Flags used by the DWM_BLURBEHIND structure to indicate +// which of its members contain valid information. +const ( + DWM_BB_ENABLE = 0x00000001 // A value for the fEnable member has been specified. + DWM_BB_BLURREGION = 0x00000002 // A value for the hRgnBlur member has been specified. + DWM_BB_TRANSITIONONMAXIMIZED = 0x00000004 // A value for the fTransitionOnMaximized member has been specified. +) + +// Flags used by the DwmEnableComposition function +// to change the state of Desktop Window Manager (DWM) composition. +const ( + DWM_EC_DISABLECOMPOSITION = 0 // Disable composition + DWM_EC_ENABLECOMPOSITION = 1 // Enable composition +) + +// enum-lite implementation for the following constant structure +type DWM_SHOWCONTACT int32 + +const ( + DWMSC_DOWN = 0x00000001 + DWMSC_UP = 0x00000002 + DWMSC_DRAG = 0x00000004 + DWMSC_HOLD = 0x00000008 + DWMSC_PENBARREL = 0x00000010 + DWMSC_NONE = 0x00000000 + DWMSC_ALL = 0xFFFFFFFF +) + +// enum-lite implementation for the following constant structure +type DWM_SOURCE_FRAME_SAMPLING int32 + +// TODO: need to verify this construction +// Flags used by the DwmSetPresentParameters function +// to specify the frame sampling type +const ( + DWM_SOURCE_FRAME_SAMPLING_POINT = iota + 1 + DWM_SOURCE_FRAME_SAMPLING_COVERAGE + DWM_SOURCE_FRAME_SAMPLING_LAST +) + +// Flags used by the DWM_THUMBNAIL_PROPERTIES structure to +// indicate which of its members contain valid information. +const ( + DWM_TNP_RECTDESTINATION = 0x00000001 // A value for the rcDestination member has been specified + DWM_TNP_RECTSOURCE = 0x00000002 // A value for the rcSource member has been specified + DWM_TNP_OPACITY = 0x00000004 // A value for the opacity member has been specified + DWM_TNP_VISIBLE = 0x00000008 // A value for the fVisible member has been specified + DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010 // A value for the fSourceClientAreaOnly member has been specified +) + +// enum-lite implementation for the following constant structure +type DWMFLIP3DWINDOWPOLICY int32 + +// TODO: need to verify this construction +// Flags used by the DwmSetWindowAttribute function +// to specify the Flip3D window policy +const ( + DWMFLIP3D_DEFAULT = iota + 1 + DWMFLIP3D_EXCLUDEBELOW + DWMFLIP3D_EXCLUDEABOVE + DWMFLIP3D_LAST +) + +// enum-lite implementation for the following constant structure +type DWMNCRENDERINGPOLICY int32 + +// TODO: need to verify this construction +// Flags used by the DwmSetWindowAttribute function +// to specify the non-client area rendering policy +const ( + DWMNCRP_USEWINDOWSTYLE = iota + 1 + DWMNCRP_DISABLED + DWMNCRP_ENABLED + DWMNCRP_LAST +) + +// enum-lite implementation for the following constant structure +type DWMTRANSITION_OWNEDWINDOW_TARGET int32 + +const ( + DWMTRANSITION_OWNEDWINDOW_NULL = -1 + DWMTRANSITION_OWNEDWINDOW_REPOSITION = 0 +) + +// enum-lite implementation for the following constant structure +type DWMWINDOWATTRIBUTE int32 + +// TODO: need to verify this construction +// Flags used by the DwmGetWindowAttribute and DwmSetWindowAttribute functions +// to specify window attributes for non-client rendering +const ( + DWMWA_NCRENDERING_ENABLED = iota + 1 + DWMWA_NCRENDERING_POLICY + DWMWA_TRANSITIONS_FORCEDISABLED + DWMWA_ALLOW_NCPAINT + DWMWA_CAPTION_BUTTON_BOUNDS + DWMWA_NONCLIENT_RTL_LAYOUT + DWMWA_FORCE_ICONIC_REPRESENTATION + DWMWA_FLIP3D_POLICY + DWMWA_EXTENDED_FRAME_BOUNDS + DWMWA_HAS_ICONIC_BITMAP + DWMWA_DISALLOW_PEEK + DWMWA_EXCLUDED_FROM_PEEK + DWMWA_CLOAK + DWMWA_CLOAKED + DWMWA_FREEZE_REPRESENTATION + DWMWA_LAST +) + +// enum-lite implementation for the following constant structure +type GESTURE_TYPE int32 + +// TODO: use iota? +// Identifies the gesture type +const ( + GT_PEN_TAP = 0 + GT_PEN_DOUBLETAP = 1 + GT_PEN_RIGHTTAP = 2 + GT_PEN_PRESSANDHOLD = 3 + GT_PEN_PRESSANDHOLDABORT = 4 + GT_TOUCH_TAP = 5 + GT_TOUCH_DOUBLETAP = 6 + GT_TOUCH_RIGHTTAP = 7 + GT_TOUCH_PRESSANDHOLD = 8 + GT_TOUCH_PRESSANDHOLDABORT = 9 + GT_TOUCH_PRESSANDTAP = 10 +) + +// Icons +const ( + ICON_SMALL = 0 + ICON_BIG = 1 + ICON_SMALL2 = 2 +) + +const ( + SIZE_RESTORED = 0 + SIZE_MINIMIZED = 1 + SIZE_MAXIMIZED = 2 + SIZE_MAXSHOW = 3 + SIZE_MAXHIDE = 4 +) + +// XButton values +const ( + XBUTTON1 = 1 + XBUTTON2 = 2 +) + +// Devmode +const ( + DM_SPECVERSION = 0x0401 + + DM_ORIENTATION = 0x00000001 + DM_PAPERSIZE = 0x00000002 + DM_PAPERLENGTH = 0x00000004 + DM_PAPERWIDTH = 0x00000008 + DM_SCALE = 0x00000010 + DM_POSITION = 0x00000020 + DM_NUP = 0x00000040 + DM_DISPLAYORIENTATION = 0x00000080 + DM_COPIES = 0x00000100 + DM_DEFAULTSOURCE = 0x00000200 + DM_PRINTQUALITY = 0x00000400 + DM_COLOR = 0x00000800 + DM_DUPLEX = 0x00001000 + DM_YRESOLUTION = 0x00002000 + DM_TTOPTION = 0x00004000 + DM_COLLATE = 0x00008000 + DM_FORMNAME = 0x00010000 + DM_LOGPIXELS = 0x00020000 + DM_BITSPERPEL = 0x00040000 + DM_PELSWIDTH = 0x00080000 + DM_PELSHEIGHT = 0x00100000 + DM_DISPLAYFLAGS = 0x00200000 + DM_DISPLAYFREQUENCY = 0x00400000 + DM_ICMMETHOD = 0x00800000 + DM_ICMINTENT = 0x01000000 + DM_MEDIATYPE = 0x02000000 + DM_DITHERTYPE = 0x04000000 + DM_PANNINGWIDTH = 0x08000000 + DM_PANNINGHEIGHT = 0x10000000 + DM_DISPLAYFIXEDOUTPUT = 0x20000000 +) + +// ChangeDisplaySettings +const ( + CDS_UPDATEREGISTRY = 0x00000001 + CDS_TEST = 0x00000002 + CDS_FULLSCREEN = 0x00000004 + CDS_GLOBAL = 0x00000008 + CDS_SET_PRIMARY = 0x00000010 + CDS_VIDEOPARAMETERS = 0x00000020 + CDS_RESET = 0x40000000 + CDS_NORESET = 0x10000000 + + DISP_CHANGE_SUCCESSFUL = 0 + DISP_CHANGE_RESTART = 1 + DISP_CHANGE_FAILED = -1 + DISP_CHANGE_BADMODE = -2 + DISP_CHANGE_NOTUPDATED = -3 + DISP_CHANGE_BADFLAGS = -4 + DISP_CHANGE_BADPARAM = -5 + DISP_CHANGE_BADDUALVIEW = -6 +) + +const ( + ENUM_CURRENT_SETTINGS = 0xFFFFFFFF + ENUM_REGISTRY_SETTINGS = 0xFFFFFFFE +) + +// PIXELFORMATDESCRIPTOR +const ( + PFD_TYPE_RGBA = 0 + PFD_TYPE_COLORINDEX = 1 + + PFD_MAIN_PLANE = 0 + PFD_OVERLAY_PLANE = 1 + PFD_UNDERLAY_PLANE = -1 + + PFD_DOUBLEBUFFER = 0x00000001 + PFD_STEREO = 0x00000002 + PFD_DRAW_TO_WINDOW = 0x00000004 + PFD_DRAW_TO_BITMAP = 0x00000008 + PFD_SUPPORT_GDI = 0x00000010 + PFD_SUPPORT_OPENGL = 0x00000020 + PFD_GENERIC_FORMAT = 0x00000040 + PFD_NEED_PALETTE = 0x00000080 + PFD_NEED_SYSTEM_PALETTE = 0x00000100 + PFD_SWAP_EXCHANGE = 0x00000200 + PFD_SWAP_COPY = 0x00000400 + PFD_SWAP_LAYER_BUFFERS = 0x00000800 + PFD_GENERIC_ACCELERATED = 0x00001000 + PFD_SUPPORT_DIRECTDRAW = 0x00002000 + PFD_DIRECT3D_ACCELERATED = 0x00004000 + PFD_SUPPORT_COMPOSITION = 0x00008000 + + PFD_DEPTH_DONTCARE = 0x20000000 + PFD_DOUBLEBUFFER_DONTCARE = 0x40000000 + PFD_STEREO_DONTCARE = 0x80000000 +) + +const ( + INPUT_MOUSE = 0 + INPUT_KEYBOARD = 1 + INPUT_HARDWARE = 2 +) + +const ( + MOUSEEVENTF_ABSOLUTE = 0x8000 + MOUSEEVENTF_HWHEEL = 0x01000 + MOUSEEVENTF_MOVE = 0x0001 + MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000 + MOUSEEVENTF_LEFTDOWN = 0x0002 + MOUSEEVENTF_LEFTUP = 0x0004 + MOUSEEVENTF_RIGHTDOWN = 0x0008 + MOUSEEVENTF_RIGHTUP = 0x0010 + MOUSEEVENTF_MIDDLEDOWN = 0x0020 + MOUSEEVENTF_MIDDLEUP = 0x0040 + MOUSEEVENTF_VIRTUALDESK = 0x4000 + MOUSEEVENTF_WHEEL = 0x0800 + MOUSEEVENTF_XDOWN = 0x0080 + MOUSEEVENTF_XUP = 0x0100 +) + +// Windows Hooks (WH_*) +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx +const ( + WH_CALLWNDPROC = 4 + WH_CALLWNDPROCRET = 12 + WH_CBT = 5 + WH_DEBUG = 9 + WH_FOREGROUNDIDLE = 11 + WH_GETMESSAGE = 3 + WH_JOURNALPLAYBACK = 1 + WH_JOURNALRECORD = 0 + WH_KEYBOARD = 2 + WH_KEYBOARD_LL = 13 + WH_MOUSE = 7 + WH_MOUSE_LL = 14 + WH_MSGFILTER = -1 + WH_SHELL = 10 + WH_SYSMSGFILTER = 6 +) + +const ( + MEM_COMMIT = 0x00001000 + MEM_RESERVE = 0x00002000 + MEM_RESET = 0x00080000 + MEM_RESET_UNDO = 0x1000000 + + MEM_LARGE_PAGES = 0x20000000 + MEM_PHYSICAL = 0x00400000 + MEM_TOP_DOWN = 0x00100000 + + MEM_DECOMMIT = 0x4000 + MEM_RELEASE = 0x8000 +) + +const ( + PROCESS_CREATE_PROCESS = 0x0080 + PROCESS_CREATE_THREAD = 0x0002 + PROCESS_DUP_HANDLE = 0x0040 + PROCESS_QUERY_INFORMATION = 0x0400 + PROCESS_QUERY_LIMITED_INFORMATION = 0x1000 + PROCESS_SET_INFORMATION = 0x0200 + PROCESS_SET_QUOTA = 0x0100 + PROCESS_SUSPEND_RESUME = 0x0800 + PROCESS_TERMINATE = 0x0001 + PROCESS_VM_OPERATION = 0x0008 + PROCESS_VM_READ = 0x0010 + PROCESS_VM_WRITE = 0x0020 + SYNCHRONIZE = 0x00100000 +) + +const ( + PAGE_EXECUTE = 0x10 + PAGE_EXECUTE_READ = 0x20 + PAGE_EXECUTE_READWRITE = 0x40 + PAGE_EXECUTE_WRITECOPY = 0x80 + PAGE_NOACCESS = 0x01 + PAGE_READWRITE = 0x04 + PAGE_WRITECOPY = 0x08 + PAGE_TARGETS_INVALID = 0x40000000 + PAGE_TARGETS_NO_UPDATE = 0x40000000 +) + +// SendMessageTimeout Flags +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(v=vs.85).aspx +const ( + SMTO_ABORTIFHUNG = 0x0002 + SMTO_BLOCK = 0x0001 + SMTO_NORMAL = 0x0000 + SMTO_NOTIMEOUTIFNOTHUNG = 0x0008 + SMTO_ERRORONEXIT = 0x0020 +) + +// RedrawWindow Flags +const ( + RDW_ERASE = 4 + RDW_ALLCHILDREN = 0x80 + RDW_ERASENOW = 0x200 + RDW_FRAME = 0x400 + RDW_INTERNALPAINT = 2 + RDW_INVALIDATE = 1 + RDW_NOCHILDREN = 0x40 + RDW_NOERASE = 0x20 + RDW_NOFRAME = 0x800 + RDW_NOINTERNALPAINT = 0x10 + RDW_UPDATENOW = 0x100 + RDW_VALIDATE = 8 +) diff --git a/vendor/github.com/apenwarr/w32/create_process.go b/vendor/github.com/apenwarr/w32/create_process.go new file mode 100644 index 000000000..9caf9ffc0 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/create_process.go @@ -0,0 +1,152 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + + procCreateProcessW = kernel32.NewProc("CreateProcessW") + procTerminateProcess = kernel32.NewProc("TerminateProcess") + procGetExitCodeProcess = kernel32.NewProc("GetExitCodeProcess") + procWaitForSingleObject = kernel32.NewProc("WaitForSingleObject") +) + +// WINBASEAPI WINBOOL WINAPI +// CreateProcessW ( +// LPCWSTR lpApplicationName, +// LPWSTR lpCommandLine, +// LPSECURITY_ATTRIBUTES lpProcessAttributes, +// LPSECURITY_ATTRIBUTES lpThreadAttributes +// WINBOOL bInheritHandles +// DWORD dwCreationFlags +// LPVOID lpEnvironment +// LPCWSTR lpCurrentDirectory +// LPSTARTUPINFOW lpStartupInfo +// LPPROCESS_INFORMATION lpProcessInformation +//); +func CreateProcessW( + lpApplicationName, lpCommandLine string, + lpProcessAttributes, lpThreadAttributes *SECURITY_ATTRIBUTES, + bInheritHandles BOOL, + dwCreationFlags uint32, + lpEnvironment unsafe.Pointer, + lpCurrentDirectory string, + lpStartupInfo *STARTUPINFOW, + lpProcessInformation *PROCESS_INFORMATION, +) (e error) { + + var lpAN, lpCL, lpCD *uint16 + if len(lpApplicationName) > 0 { + lpAN, e = syscall.UTF16PtrFromString(lpApplicationName) + if e != nil { + return + } + } + if len(lpCommandLine) > 0 { + lpCL, e = syscall.UTF16PtrFromString(lpCommandLine) + if e != nil { + return + } + } + if len(lpCurrentDirectory) > 0 { + lpCD, e = syscall.UTF16PtrFromString(lpCurrentDirectory) + if e != nil { + return + } + } + + ret, _, lastErr := procCreateProcessW.Call( + uintptr(unsafe.Pointer(lpAN)), + uintptr(unsafe.Pointer(lpCL)), + uintptr(unsafe.Pointer(lpProcessAttributes)), + uintptr(unsafe.Pointer(lpProcessInformation)), + uintptr(bInheritHandles), + uintptr(dwCreationFlags), + uintptr(lpEnvironment), + uintptr(unsafe.Pointer(lpCD)), + uintptr(unsafe.Pointer(lpStartupInfo)), + uintptr(unsafe.Pointer(lpProcessInformation)), + ) + + if ret == 0 { + e = lastErr + } + + return +} + +func CreateProcessQuick(cmd string) (pi PROCESS_INFORMATION, e error) { + si := &STARTUPINFOW{} + e = CreateProcessW( + "", + cmd, + nil, + nil, + 0, + 0, + unsafe.Pointer(nil), + "", + si, + &pi, + ) + return +} + +func TerminateProcess(hProcess HANDLE, exitCode uint32) (e error) { + ret, _, lastErr := procTerminateProcess.Call( + uintptr(hProcess), + uintptr(exitCode), + ) + + if ret == 0 { + e = lastErr + } + + return +} + +func GetExitCodeProcess(hProcess HANDLE) (code uintptr, e error) { + ret, _, lastErr := procGetExitCodeProcess.Call( + uintptr(hProcess), + uintptr(unsafe.Pointer(&code)), + ) + + if ret == 0 { + e = lastErr + } + + return +} + +// DWORD WINAPI WaitForSingleObject( +// _In_ HANDLE hHandle, +// _In_ DWORD dwMilliseconds +// ); + +func WaitForSingleObject(hHandle HANDLE, msecs uint32) (ok bool, e error) { + + ret, _, lastErr := procWaitForSingleObject.Call( + uintptr(hHandle), + uintptr(msecs), + ) + + if ret == WAIT_OBJECT_0 { + ok = true + return + } + + // don't set e for timeouts, or it will be ERROR_SUCCESS which is + // confusing + if ret != WAIT_TIMEOUT { + e = lastErr + } + return + +} diff --git a/vendor/github.com/apenwarr/w32/create_process_constants.go b/vendor/github.com/apenwarr/w32/create_process_constants.go new file mode 100644 index 000000000..c37d7e5f3 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/create_process_constants.go @@ -0,0 +1,9 @@ +package w32 + +const ( + WAIT_ABANDONED = 0x00000080 + WAIT_OBJECT_0 = 0x00000000 + WAIT_TIMEOUT = 0x00000102 + WAIT_FAILED = 0xFFFFFFFF + INFINITE = 0xFFFFFFFF +) diff --git a/vendor/github.com/apenwarr/w32/create_process_typedef.go b/vendor/github.com/apenwarr/w32/create_process_typedef.go new file mode 100644 index 000000000..df059729f --- /dev/null +++ b/vendor/github.com/apenwarr/w32/create_process_typedef.go @@ -0,0 +1,68 @@ +package w32 + +// typedef struct _PROCESS_INFORMATION { +// HANDLE hProcess; +// HANDLE hThread; +// DWORD dwProcessId; +// DWORD dwThreadId; +// } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION; + +type PROCESS_INFORMATION struct { + Process HANDLE + Thread HANDLE + ProcessId uint32 + ThreadId uint32 +} + +// typedef struct _STARTUPINFOW { +// DWORD cb; +// LPWSTR lpReserved; +// LPWSTR lpDesktop; +// LPWSTR lpTitle; +// DWORD dwX; +// DWORD dwY; +// DWORD dwXSize; +// DWORD dwYSize; +// DWORD dwXCountChars; +// DWORD dwYCountChars; +// DWORD dwFillAttribute; +// DWORD dwFlags; +// WORD wShowWindow; +// WORD cbReserved2; +// LPBYTE lpReserved2; +// HANDLE hStdInput; +// HANDLE hStdOutput; +// HANDLE hStdError; +// } STARTUPINFOW, *LPSTARTUPINFOW; + +type STARTUPINFOW struct { + cb uint32 + _ *uint16 + Desktop *uint16 + Title *uint16 + X uint32 + Y uint32 + XSize uint32 + YSize uint32 + XCountChars uint32 + YCountChars uint32 + FillAttribute uint32 + Flags uint32 + ShowWindow uint16 + _ uint16 + _ *uint8 + StdInput HANDLE + StdOutput HANDLE + StdError HANDLE +} + +// combase!_SECURITY_ATTRIBUTES +// +0x000 nLength : Uint4B +// +0x008 lpSecurityDescriptor : Ptr64 Void +// +0x010 bInheritHandle : Int4B + +type SECURITY_ATTRIBUTES struct { + Length uint32 + SecurityDescriptor uintptr + InheritHandle BOOL +} diff --git a/vendor/github.com/apenwarr/w32/dwmapi.go b/vendor/github.com/apenwarr/w32/dwmapi.go new file mode 100644 index 000000000..eb656d187 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/dwmapi.go @@ -0,0 +1,254 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "fmt" + "syscall" + "unsafe" +) + +// DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS: +// DwmAttachMilContent +// DwmDetachMilContent +// DwmEnableComposition +// DwmGetGraphicsStreamClient +// DwmGetGraphicsStreamTransformHint + +var ( + moddwmapi = syscall.NewLazyDLL("dwmapi.dll") + + procDwmDefWindowProc = moddwmapi.NewProc("DwmDefWindowProc") + procDwmEnableBlurBehindWindow = moddwmapi.NewProc("DwmEnableBlurBehindWindow") + procDwmEnableMMCSS = moddwmapi.NewProc("DwmEnableMMCSS") + procDwmExtendFrameIntoClientArea = moddwmapi.NewProc("DwmExtendFrameIntoClientArea") + procDwmFlush = moddwmapi.NewProc("DwmFlush") + procDwmGetColorizationColor = moddwmapi.NewProc("DwmGetColorizationColor") + procDwmGetCompositionTimingInfo = moddwmapi.NewProc("DwmGetCompositionTimingInfo") + procDwmGetTransportAttributes = moddwmapi.NewProc("DwmGetTransportAttributes") + procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute") + procDwmInvalidateIconicBitmaps = moddwmapi.NewProc("DwmInvalidateIconicBitmaps") + procDwmIsCompositionEnabled = moddwmapi.NewProc("DwmIsCompositionEnabled") + procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration") + procDwmQueryThumbnailSourceSize = moddwmapi.NewProc("DwmQueryThumbnailSourceSize") + procDwmRegisterThumbnail = moddwmapi.NewProc("DwmRegisterThumbnail") + procDwmRenderGesture = moddwmapi.NewProc("DwmRenderGesture") + procDwmSetDxFrameDuration = moddwmapi.NewProc("DwmSetDxFrameDuration") + procDwmSetIconicLivePreviewBitmap = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap") + procDwmSetIconicThumbnail = moddwmapi.NewProc("DwmSetIconicThumbnail") + procDwmSetPresentParameters = moddwmapi.NewProc("DwmSetPresentParameters") + procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute") + procDwmShowContact = moddwmapi.NewProc("DwmShowContact") + procDwmTetherContact = moddwmapi.NewProc("DwmTetherContact") + procDwmTransitionOwnedWindow = moddwmapi.NewProc("DwmTransitionOwnedWindow") + procDwmUnregisterThumbnail = moddwmapi.NewProc("DwmUnregisterThumbnail") + procDwmUpdateThumbnailProperties = moddwmapi.NewProc("DwmUpdateThumbnailProperties") +) + +func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) { + var result uint + ret, _, _ := procDwmDefWindowProc.Call( + uintptr(hWnd), + uintptr(msg), + wParam, + lParam, + uintptr(unsafe.Pointer(&result))) + return ret != 0, result +} + +func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT { + ret, _, _ := procDwmEnableBlurBehindWindow.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pBlurBehind))) + return HRESULT(ret) +} + +func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT { + ret, _, _ := procDwmEnableMMCSS.Call( + uintptr(BoolToBOOL(fEnableMMCSS))) + return HRESULT(ret) +} + +func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT { + ret, _, _ := procDwmExtendFrameIntoClientArea.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pMarInset))) + return HRESULT(ret) +} + +func DwmFlush() HRESULT { + ret, _, _ := procDwmFlush.Call() + return HRESULT(ret) +} + +func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT { + ret, _, _ := procDwmGetColorizationColor.Call( + uintptr(unsafe.Pointer(pcrColorization)), + uintptr(unsafe.Pointer(pfOpaqueBlend))) + return HRESULT(ret) +} + +func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT { + ret, _, _ := procDwmGetCompositionTimingInfo.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pTimingInfo))) + return HRESULT(ret) +} + +func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT { + ret, _, _ := procDwmGetTransportAttributes.Call( + uintptr(unsafe.Pointer(pfIsRemoting)), + uintptr(unsafe.Pointer(pfIsConnected)), + uintptr(unsafe.Pointer(pDwGeneration))) + return HRESULT(ret) +} + +// TODO: verify handling of variable arguments +func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) { + var pvAttribute, pvAttrSize uintptr + switch dwAttribute { + case DWMWA_NCRENDERING_ENABLED: + v := new(BOOL) + pAttribute = v + pvAttribute = uintptr(unsafe.Pointer(v)) + pvAttrSize = unsafe.Sizeof(*v) + case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS: + v := new(RECT) + pAttribute = v + pvAttribute = uintptr(unsafe.Pointer(v)) + pvAttrSize = unsafe.Sizeof(*v) + case DWMWA_CLOAKED: + panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute)) + default: + panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute)) + } + + ret, _, _ := procDwmGetWindowAttribute.Call( + uintptr(hWnd), + uintptr(dwAttribute), + pvAttribute, + pvAttrSize) + result = HRESULT(ret) + return +} + +func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT { + ret, _, _ := procDwmInvalidateIconicBitmaps.Call( + uintptr(hWnd)) + return HRESULT(ret) +} + +func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT { + ret, _, _ := procDwmIsCompositionEnabled.Call( + uintptr(unsafe.Pointer(pfEnabled))) + return HRESULT(ret) +} + +func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT { + ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call( + uintptr(hWnd), + uintptr(cRefreshes), + uintptr(BoolToBOOL(fRelative))) + return HRESULT(ret) +} + +func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT { + ret, _, _ := procDwmQueryThumbnailSourceSize.Call( + uintptr(hThumbnail), + uintptr(unsafe.Pointer(pSize))) + return HRESULT(ret) +} + +func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT { + ret, _, _ := procDwmRegisterThumbnail.Call( + uintptr(hWndDestination), + uintptr(hWndSource), + uintptr(unsafe.Pointer(phThumbnailId))) + return HRESULT(ret) +} + +func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) { + procDwmRenderGesture.Call( + uintptr(gt), + uintptr(cContacts), + uintptr(unsafe.Pointer(pdwPointerID)), + uintptr(unsafe.Pointer(pPoints))) + return +} + +func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT { + ret, _, _ := procDwmSetDxFrameDuration.Call( + uintptr(hWnd), + uintptr(cRefreshes)) + return HRESULT(ret) +} + +func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT { + ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call( + uintptr(hWnd), + uintptr(hbmp), + uintptr(unsafe.Pointer(pptClient)), + uintptr(dwSITFlags)) + return HRESULT(ret) +} + +func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT { + ret, _, _ := procDwmSetIconicThumbnail.Call( + uintptr(hWnd), + uintptr(hbmp), + uintptr(dwSITFlags)) + return HRESULT(ret) +} + +func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT { + ret, _, _ := procDwmSetPresentParameters.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(pPresentParams))) + return HRESULT(ret) +} + +func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT { + ret, _, _ := procDwmSetWindowAttribute.Call( + uintptr(hWnd), + uintptr(dwAttribute), + uintptr(pvAttribute), + uintptr(cbAttribute)) + return HRESULT(ret) +} + +func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) { + procDwmShowContact.Call( + uintptr(dwPointerID), + uintptr(eShowContact)) + return +} + +func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) { + procDwmTetherContact.Call( + uintptr(dwPointerID), + uintptr(BoolToBOOL(fEnable)), + uintptr(unsafe.Pointer(&ptTether))) + return +} + +func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) { + procDwmTransitionOwnedWindow.Call( + uintptr(hWnd), + uintptr(target)) + return +} + +func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT { + ret, _, _ := procDwmUnregisterThumbnail.Call( + uintptr(hThumbnailId)) + return HRESULT(ret) +} + +func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT { + ret, _, _ := procDwmUpdateThumbnailProperties.Call( + uintptr(hThumbnailId), + uintptr(unsafe.Pointer(ptnProperties))) + return HRESULT(ret) +} diff --git a/vendor/github.com/apenwarr/w32/fork.go b/vendor/github.com/apenwarr/w32/fork.go new file mode 100644 index 000000000..b5543b952 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/fork.go @@ -0,0 +1,174 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +// #include +//import ( +// "C" +//) + +// Based on C code found here https://gist.github.com/juntalis/4366916 +// Original code license: +/* + * fork.c + * Experimental fork() on Windows. Requires NT 6 subsystem or + * newer. + * + * Copyright (c) 2012 William Pitcock + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * This software is provided 'as is' and without any warranty, express or + * implied. In no event shall the authors be liable for any damages arising + * from the use of this software. + */ + +import ( + "fmt" + "syscall" + "unsafe" +) + +var ( + ntdll = syscall.NewLazyDLL("ntdll.dll") + + procRtlCloneUserProcess = ntdll.NewProc("RtlCloneUserProcess") + procAllocConsole = modkernel32.NewProc("AllocConsole") + procOpenProcess = modkernel32.NewProc("OpenProcess") + procOpenThread = modkernel32.NewProc("OpenThread") + procResumeThread = modkernel32.NewProc("ResumeThread") +) + +func OpenProcess(desiredAccess int, inheritHandle bool, processId uintptr) (h HANDLE, e error) { + inherit := uintptr(0) + if inheritHandle { + inherit = 1 + } + + ret, _, lastErr := procOpenProcess.Call( + uintptr(desiredAccess), + inherit, + uintptr(processId), + ) + + if ret == 0 { + e = lastErr + } + + h = HANDLE(ret) + return +} + +func OpenThread(desiredAccess int, inheritHandle bool, threadId uintptr) (h HANDLE, e error) { + inherit := uintptr(0) + if inheritHandle { + inherit = 1 + } + + ret, _, lastErr := procOpenThread.Call( + uintptr(desiredAccess), + inherit, + uintptr(threadId), + ) + + if ret == 0 { + e = lastErr + } + + h = HANDLE(ret) + return +} + +// DWORD WINAPI ResumeThread( +// _In_ HANDLE hThread +// ); +func ResumeThread(ht HANDLE) (e error) { + + ret, _, lastErr := procResumeThread.Call( + uintptr(ht), + ) + if ret == ^uintptr(0) { // -1 + e = lastErr + } + return +} + +// BOOL WINAPI AllocConsole(void); +func AllocConsole() (e error) { + ret, _, lastErr := procAllocConsole.Call() + if ret != ERROR_SUCCESS { + e = lastErr + } + return +} + +// NTSYSAPI +// NTSTATUS +// NTAPI RtlCloneUserProcess ( +// _In_ ULONG ProcessFlags, +// _In_opt_ PSECURITY_DESCRIPTOR ProcessSecurityDescriptor, +// _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor, +// _In_opt_ HANDLE DebugPort, +// _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation +// ) + +func RtlCloneUserProcess( + ProcessFlags uint32, + ProcessSecurityDescriptor, ThreadSecurityDescriptor *SECURITY_DESCRIPTOR, // in advapi32_typedef.go + DebugPort HANDLE, + ProcessInformation *RTL_USER_PROCESS_INFORMATION, +) (status uintptr) { + + status, _, _ = procRtlCloneUserProcess.Call( + uintptr(ProcessFlags), + uintptr(unsafe.Pointer(ProcessSecurityDescriptor)), + uintptr(unsafe.Pointer(ThreadSecurityDescriptor)), + uintptr(DebugPort), + uintptr(unsafe.Pointer(ProcessInformation)), + ) + + return +} + +// Fork creates a clone of the current process using the undocumented +// RtlCloneUserProcess call in ntdll, similar to unix fork(). The +// return value in the parent is the child PID. In the child it is 0. +func Fork() (pid uintptr, e error) { + + pi := &RTL_USER_PROCESS_INFORMATION{} + + ret := RtlCloneUserProcess( + RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED|RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES, + nil, + nil, + HANDLE(0), + pi, + ) + + switch ret { + case RTL_CLONE_PARENT: + pid = pi.ClientId.UniqueProcess + ht, err := OpenThread(THREAD_ALL_ACCESS, false, pi.ClientId.UniqueThread) + if err != nil { + e = fmt.Errorf("OpenThread: %s", err) + } + err = ResumeThread(ht) + if err != nil { + e = fmt.Errorf("ResumeThread: %s", err) + } + CloseHandle(ht) + case RTL_CLONE_CHILD: + pid = 0 + err := AllocConsole() + if err != nil { + e = fmt.Errorf("AllocConsole: %s", err) + } + default: + e = fmt.Errorf("0x%x", ret) + } + return +} diff --git a/vendor/github.com/apenwarr/w32/fork_constants.go b/vendor/github.com/apenwarr/w32/fork_constants.go new file mode 100644 index 000000000..3e9b217ca --- /dev/null +++ b/vendor/github.com/apenwarr/w32/fork_constants.go @@ -0,0 +1,26 @@ +package w32 + +const ( + RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED = 0x00000001 + RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES = 0x00000002 + RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE = 0x00000004 + + RTL_CLONE_PARENT = 0 + RTL_CLONE_CHILD = 297 + + THREAD_TERMINATE = 0x0001 + THREAD_SUSPEND_RESUME = 0x0002 + THREAD_GET_CONTEXT = 0x0008 + THREAD_SET_CONTEXT = 0x0010 + THREAD_SET_INFORMATION = 0x0020 + THREAD_QUERY_INFORMATION = 0x0040 + THREAD_SET_THREAD_TOKEN = 0x0080 + THREAD_IMPERSONATE = 0x0100 + THREAD_DIRECT_IMPERSONATION = 0x0200 + THREAD_SET_LIMITED_INFORMATION = 0x0400 + THREAD_QUERY_LIMITED_INFORMATION = 0x0800 + THREAD_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff + + PROCESS_SET_SESSIONID = 0x0004 + PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff +) diff --git a/vendor/github.com/apenwarr/w32/fork_typedef.go b/vendor/github.com/apenwarr/w32/fork_typedef.go new file mode 100644 index 000000000..fcb90497d --- /dev/null +++ b/vendor/github.com/apenwarr/w32/fork_typedef.go @@ -0,0 +1,89 @@ +package w32 + +// combase!_SECTION_IMAGE_INFORMATION +// +0x000 TransferAddress : Ptr64 Void +// +0x008 ZeroBits : Uint4B +// +0x010 MaximumStackSize : Uint8B +// +0x018 CommittedStackSize : Uint8B +// +0x020 SubSystemType : Uint4B +// +0x024 SubSystemMinorVersion : Uint2B +// +0x026 SubSystemMajorVersion : Uint2B +// +0x024 SubSystemVersion : Uint4B +// +0x028 MajorOperatingSystemVersion : Uint2B +// +0x02a MinorOperatingSystemVersion : Uint2B +// +0x028 OperatingSystemVersion : Uint4B +// +0x02c ImageCharacteristics : Uint2B +// +0x02e DllCharacteristics : Uint2B +// +0x030 Machine : Uint2B +// +0x032 ImageContainsCode : UChar +// +0x033 ImageFlags : UChar +// +0x033 ComPlusNativeReady : Pos 0, 1 Bit +// +0x033 ComPlusILOnly : Pos 1, 1 Bit +// +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit +// +0x033 ImageMappedFlat : Pos 3, 1 Bit +// +0x033 BaseBelow4gb : Pos 4, 1 Bit +// +0x033 ComPlusPrefer32bit : Pos 5, 1 Bit +// +0x033 Reserved : Pos 6, 2 Bits +// +0x034 LoaderFlags : Uint4B +// +0x038 ImageFileSize : Uint4B +// +0x03c CheckSum : Uint4B +type SECTION_IMAGE_INFORMATION struct { + TransferAddress uintptr + ZeroBits uint32 + MaximumStackSize uint64 + CommittedStackSize uint64 + SubSystemType uint32 + SubSystemMinorVersion uint16 + SubSystemMajorVersion uint16 + SubSystemVersion uint32 + MajorOperatingSystemVersion uint16 + MinorOperatingSystemVersion uint16 + OperatingSystemVersion uint32 + ImageCharacteristics uint16 + DllCharacteristics uint16 + Machine uint16 + ImageContainsCode uint8 + ImageFlags uint8 + ComPlusFlags uint8 + LoaderFlags uint32 + ImageFileSize uint32 + CheckSum uint32 +} + +func (si *SECTION_IMAGE_INFORMATION) ComPlusNativeReady() bool { + return (si.ComPlusFlags & (1 << 0)) == 1 +} + +func (si *SECTION_IMAGE_INFORMATION) ComPlusILOnly() bool { + return (si.ComPlusFlags & (1 << 1)) == 1 +} + +func (si *SECTION_IMAGE_INFORMATION) ImageDynamicallyRelocated() bool { + return (si.ComPlusFlags & (1 << 2)) == 1 +} + +func (si *SECTION_IMAGE_INFORMATION) ImageMappedFlat() bool { + return (si.ComPlusFlags & (1 << 3)) == 1 +} + +func (si *SECTION_IMAGE_INFORMATION) BaseBelow4gb() bool { + return (si.ComPlusFlags & (1 << 4)) == 1 +} + +func (si *SECTION_IMAGE_INFORMATION) ComPlusPrefer32bit() bool { + return (si.ComPlusFlags & (1 << 5)) == 1 +} + +// combase!_RTL_USER_PROCESS_INFORMATION +// +0x000 Length : Uint4B +// +0x008 Process : Ptr64 Void +// +0x010 Thread : Ptr64 Void +// +0x018 ClientId : _CLIENT_ID +// +0x028 ImageInformation : _SECTION_IMAGE_INFORMATION +type RTL_USER_PROCESS_INFORMATION struct { + Length uint32 + Process HANDLE + Thread HANDLE + ClientId CLIENT_ID + ImageInformation SECTION_IMAGE_INFORMATION +} diff --git a/vendor/github.com/apenwarr/w32/gdi32.go b/vendor/github.com/apenwarr/w32/gdi32.go new file mode 100644 index 000000000..39a81d6b8 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/gdi32.go @@ -0,0 +1,543 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modgdi32 = syscall.NewLazyDLL("gdi32.dll") + + procGetDeviceCaps = modgdi32.NewProc("GetDeviceCaps") + procGetCurrentObject = modgdi32.NewProc("GetCurrentObject") + procDeleteObject = modgdi32.NewProc("DeleteObject") + procCreateFontIndirect = modgdi32.NewProc("CreateFontIndirectW") + procAbortDoc = modgdi32.NewProc("AbortDoc") + procBitBlt = modgdi32.NewProc("BitBlt") + procPatBlt = modgdi32.NewProc("PatBlt") + procCloseEnhMetaFile = modgdi32.NewProc("CloseEnhMetaFile") + procCopyEnhMetaFile = modgdi32.NewProc("CopyEnhMetaFileW") + procCreateBrushIndirect = modgdi32.NewProc("CreateBrushIndirect") + procCreateCompatibleDC = modgdi32.NewProc("CreateCompatibleDC") + procCreateDC = modgdi32.NewProc("CreateDCW") + procCreateCompatibleBitmap = modgdi32.NewProc("CreateCompatibleBitmap") + procCreateDIBSection = modgdi32.NewProc("CreateDIBSection") + procCreateEnhMetaFile = modgdi32.NewProc("CreateEnhMetaFileW") + procCreateIC = modgdi32.NewProc("CreateICW") + procDeleteDC = modgdi32.NewProc("DeleteDC") + procDeleteEnhMetaFile = modgdi32.NewProc("DeleteEnhMetaFile") + procEllipse = modgdi32.NewProc("Ellipse") + procEndDoc = modgdi32.NewProc("EndDoc") + procEndPage = modgdi32.NewProc("EndPage") + procExtCreatePen = modgdi32.NewProc("ExtCreatePen") + procGetEnhMetaFile = modgdi32.NewProc("GetEnhMetaFileW") + procGetEnhMetaFileHeader = modgdi32.NewProc("GetEnhMetaFileHeader") + procGetObject = modgdi32.NewProc("GetObjectW") + procGetStockObject = modgdi32.NewProc("GetStockObject") + procGetTextExtentExPoint = modgdi32.NewProc("GetTextExtentExPointW") + procGetTextExtentPoint32 = modgdi32.NewProc("GetTextExtentPoint32W") + procGetTextMetrics = modgdi32.NewProc("GetTextMetricsW") + procLineTo = modgdi32.NewProc("LineTo") + procMoveToEx = modgdi32.NewProc("MoveToEx") + procPlayEnhMetaFile = modgdi32.NewProc("PlayEnhMetaFile") + procRectangle = modgdi32.NewProc("Rectangle") + procResetDC = modgdi32.NewProc("ResetDCW") + procSelectObject = modgdi32.NewProc("SelectObject") + procSetBkMode = modgdi32.NewProc("SetBkMode") + procSetBrushOrgEx = modgdi32.NewProc("SetBrushOrgEx") + procSetStretchBltMode = modgdi32.NewProc("SetStretchBltMode") + procSetTextColor = modgdi32.NewProc("SetTextColor") + procSetBkColor = modgdi32.NewProc("SetBkColor") + procStartDoc = modgdi32.NewProc("StartDocW") + procStartPage = modgdi32.NewProc("StartPage") + procStretchBlt = modgdi32.NewProc("StretchBlt") + procSetDIBitsToDevice = modgdi32.NewProc("SetDIBitsToDevice") + procChoosePixelFormat = modgdi32.NewProc("ChoosePixelFormat") + procDescribePixelFormat = modgdi32.NewProc("DescribePixelFormat") + procGetEnhMetaFilePixelFormat = modgdi32.NewProc("GetEnhMetaFilePixelFormat") + procGetPixelFormat = modgdi32.NewProc("GetPixelFormat") + procSetPixelFormat = modgdi32.NewProc("SetPixelFormat") + procSwapBuffers = modgdi32.NewProc("SwapBuffers") +) + +func GetDeviceCaps(hdc HDC, index int) int { + ret, _, _ := procGetDeviceCaps.Call( + uintptr(hdc), + uintptr(index)) + + return int(ret) +} + +func GetCurrentObject(hdc HDC, uObjectType uint32) HGDIOBJ { + ret, _, _ := procGetCurrentObject.Call( + uintptr(hdc), + uintptr(uObjectType)) + + return HGDIOBJ(ret) +} + +func DeleteObject(hObject HGDIOBJ) bool { + ret, _, _ := procDeleteObject.Call( + uintptr(hObject)) + + return ret != 0 +} + +func CreateFontIndirect(logFont *LOGFONT) HFONT { + ret, _, _ := procCreateFontIndirect.Call( + uintptr(unsafe.Pointer(logFont))) + + return HFONT(ret) +} + +func AbortDoc(hdc HDC) int { + ret, _, _ := procAbortDoc.Call( + uintptr(hdc)) + + return int(ret) +} + +func BitBlt(hdcDest HDC, nXDest, nYDest, nWidth, nHeight int, hdcSrc HDC, nXSrc, nYSrc int, dwRop uint) { + ret, _, _ := procBitBlt.Call( + uintptr(hdcDest), + uintptr(nXDest), + uintptr(nYDest), + uintptr(nWidth), + uintptr(nHeight), + uintptr(hdcSrc), + uintptr(nXSrc), + uintptr(nYSrc), + uintptr(dwRop)) + + if ret == 0 { + panic("BitBlt failed") + } +} + +func PatBlt(hdc HDC, nXLeft, nYLeft, nWidth, nHeight int, dwRop uint) { + ret, _, _ := procPatBlt.Call( + uintptr(hdc), + uintptr(nXLeft), + uintptr(nYLeft), + uintptr(nWidth), + uintptr(nHeight), + uintptr(dwRop)) + + if ret == 0 { + panic("PatBlt failed") + } +} + +func CloseEnhMetaFile(hdc HDC) HENHMETAFILE { + ret, _, _ := procCloseEnhMetaFile.Call( + uintptr(hdc)) + + return HENHMETAFILE(ret) +} + +func CopyEnhMetaFile(hemfSrc HENHMETAFILE, lpszFile *uint16) HENHMETAFILE { + ret, _, _ := procCopyEnhMetaFile.Call( + uintptr(hemfSrc), + uintptr(unsafe.Pointer(lpszFile))) + + return HENHMETAFILE(ret) +} + +func CreateBrushIndirect(lplb *LOGBRUSH) HBRUSH { + ret, _, _ := procCreateBrushIndirect.Call( + uintptr(unsafe.Pointer(lplb))) + + return HBRUSH(ret) +} + +func CreateCompatibleDC(hdc HDC) HDC { + ret, _, _ := procCreateCompatibleDC.Call( + uintptr(hdc)) + + if ret == 0 { + panic("Create compatible DC failed") + } + + return HDC(ret) +} + +func CreateDC(lpszDriver, lpszDevice, lpszOutput *uint16, lpInitData *DEVMODE) HDC { + ret, _, _ := procCreateDC.Call( + uintptr(unsafe.Pointer(lpszDriver)), + uintptr(unsafe.Pointer(lpszDevice)), + uintptr(unsafe.Pointer(lpszOutput)), + uintptr(unsafe.Pointer(lpInitData))) + + return HDC(ret) +} + +func CreateCompatibleBitmap(hdc HDC, width, height uint) HBITMAP { + ret, _, _ := procCreateCompatibleBitmap.Call( + uintptr(hdc), + uintptr(width), + uintptr(height)) + + return HBITMAP(ret) +} + +func CreateDIBSection(hdc HDC, pbmi *BITMAPINFO, iUsage uint, ppvBits *unsafe.Pointer, hSection HANDLE, dwOffset uint) HBITMAP { + ret, _, _ := procCreateDIBSection.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(pbmi)), + uintptr(iUsage), + uintptr(unsafe.Pointer(ppvBits)), + uintptr(hSection), + uintptr(dwOffset)) + + return HBITMAP(ret) +} + +func CreateEnhMetaFile(hdcRef HDC, lpFilename *uint16, lpRect *RECT, lpDescription *uint16) HDC { + ret, _, _ := procCreateEnhMetaFile.Call( + uintptr(hdcRef), + uintptr(unsafe.Pointer(lpFilename)), + uintptr(unsafe.Pointer(lpRect)), + uintptr(unsafe.Pointer(lpDescription))) + + return HDC(ret) +} + +func CreateIC(lpszDriver, lpszDevice, lpszOutput *uint16, lpdvmInit *DEVMODE) HDC { + ret, _, _ := procCreateIC.Call( + uintptr(unsafe.Pointer(lpszDriver)), + uintptr(unsafe.Pointer(lpszDevice)), + uintptr(unsafe.Pointer(lpszOutput)), + uintptr(unsafe.Pointer(lpdvmInit))) + + return HDC(ret) +} + +func DeleteDC(hdc HDC) bool { + ret, _, _ := procDeleteDC.Call( + uintptr(hdc)) + + return ret != 0 +} + +func DeleteEnhMetaFile(hemf HENHMETAFILE) bool { + ret, _, _ := procDeleteEnhMetaFile.Call( + uintptr(hemf)) + + return ret != 0 +} + +func Ellipse(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool { + ret, _, _ := procEllipse.Call( + uintptr(hdc), + uintptr(nLeftRect), + uintptr(nTopRect), + uintptr(nRightRect), + uintptr(nBottomRect)) + + return ret != 0 +} + +func EndDoc(hdc HDC) int { + ret, _, _ := procEndDoc.Call( + uintptr(hdc)) + + return int(ret) +} + +func EndPage(hdc HDC) int { + ret, _, _ := procEndPage.Call( + uintptr(hdc)) + + return int(ret) +} + +func ExtCreatePen(dwPenStyle, dwWidth uint, lplb *LOGBRUSH, dwStyleCount uint, lpStyle *uint) HPEN { + ret, _, _ := procExtCreatePen.Call( + uintptr(dwPenStyle), + uintptr(dwWidth), + uintptr(unsafe.Pointer(lplb)), + uintptr(dwStyleCount), + uintptr(unsafe.Pointer(lpStyle))) + + return HPEN(ret) +} + +func GetEnhMetaFile(lpszMetaFile *uint16) HENHMETAFILE { + ret, _, _ := procGetEnhMetaFile.Call( + uintptr(unsafe.Pointer(lpszMetaFile))) + + return HENHMETAFILE(ret) +} + +func GetEnhMetaFileHeader(hemf HENHMETAFILE, cbBuffer uint, lpemh *ENHMETAHEADER) uint { + ret, _, _ := procGetEnhMetaFileHeader.Call( + uintptr(hemf), + uintptr(cbBuffer), + uintptr(unsafe.Pointer(lpemh))) + + return uint(ret) +} + +func GetObject(hgdiobj HGDIOBJ, cbBuffer uintptr, lpvObject unsafe.Pointer) int { + ret, _, _ := procGetObject.Call( + uintptr(hgdiobj), + uintptr(cbBuffer), + uintptr(lpvObject)) + + return int(ret) +} + +func GetStockObject(fnObject int) HGDIOBJ { + ret, _, _ := procGetStockObject.Call( + uintptr(fnObject)) + + return HGDIOBJ(ret) +} + +func GetTextExtentExPoint(hdc HDC, lpszStr *uint16, cchString, nMaxExtent int, lpnFit, alpDx *int, lpSize *SIZE) bool { + ret, _, _ := procGetTextExtentExPoint.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpszStr)), + uintptr(cchString), + uintptr(nMaxExtent), + uintptr(unsafe.Pointer(lpnFit)), + uintptr(unsafe.Pointer(alpDx)), + uintptr(unsafe.Pointer(lpSize))) + + return ret != 0 +} + +func GetTextExtentPoint32(hdc HDC, lpString *uint16, c int, lpSize *SIZE) bool { + ret, _, _ := procGetTextExtentPoint32.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpString)), + uintptr(c), + uintptr(unsafe.Pointer(lpSize))) + + return ret != 0 +} + +func GetTextMetrics(hdc HDC, lptm *TEXTMETRIC) bool { + ret, _, _ := procGetTextMetrics.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lptm))) + + return ret != 0 +} + +func LineTo(hdc HDC, nXEnd, nYEnd int) bool { + ret, _, _ := procLineTo.Call( + uintptr(hdc), + uintptr(nXEnd), + uintptr(nYEnd)) + + return ret != 0 +} + +func MoveToEx(hdc HDC, x, y int, lpPoint *POINT) bool { + ret, _, _ := procMoveToEx.Call( + uintptr(hdc), + uintptr(x), + uintptr(y), + uintptr(unsafe.Pointer(lpPoint))) + + return ret != 0 +} + +func PlayEnhMetaFile(hdc HDC, hemf HENHMETAFILE, lpRect *RECT) bool { + ret, _, _ := procPlayEnhMetaFile.Call( + uintptr(hdc), + uintptr(hemf), + uintptr(unsafe.Pointer(lpRect))) + + return ret != 0 +} + +func Rectangle(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool { + ret, _, _ := procRectangle.Call( + uintptr(hdc), + uintptr(nLeftRect), + uintptr(nTopRect), + uintptr(nRightRect), + uintptr(nBottomRect)) + + return ret != 0 +} + +func ResetDC(hdc HDC, lpInitData *DEVMODE) HDC { + ret, _, _ := procResetDC.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpInitData))) + + return HDC(ret) +} + +func SelectObject(hdc HDC, hgdiobj HGDIOBJ) HGDIOBJ { + ret, _, _ := procSelectObject.Call( + uintptr(hdc), + uintptr(hgdiobj)) + + if ret == 0 { + panic("SelectObject failed") + } + + return HGDIOBJ(ret) +} + +func SetBkMode(hdc HDC, iBkMode int) int { + ret, _, _ := procSetBkMode.Call( + uintptr(hdc), + uintptr(iBkMode)) + + if ret == 0 { + panic("SetBkMode failed") + } + + return int(ret) +} + +func SetBrushOrgEx(hdc HDC, nXOrg, nYOrg int, lppt *POINT) bool { + ret, _, _ := procSetBrushOrgEx.Call( + uintptr(hdc), + uintptr(nXOrg), + uintptr(nYOrg), + uintptr(unsafe.Pointer(lppt))) + + return ret != 0 +} + +func SetStretchBltMode(hdc HDC, iStretchMode int) int { + ret, _, _ := procSetStretchBltMode.Call( + uintptr(hdc), + uintptr(iStretchMode)) + + return int(ret) +} + +func SetTextColor(hdc HDC, crColor COLORREF) COLORREF { + ret, _, _ := procSetTextColor.Call( + uintptr(hdc), + uintptr(crColor)) + + if ret == CLR_INVALID { + panic("SetTextColor failed") + } + + return COLORREF(ret) +} + +func SetBkColor(hdc HDC, crColor COLORREF) COLORREF { + ret, _, _ := procSetBkColor.Call( + uintptr(hdc), + uintptr(crColor)) + + if ret == CLR_INVALID { + panic("SetBkColor failed") + } + + return COLORREF(ret) +} + +func StartDoc(hdc HDC, lpdi *DOCINFO) int { + ret, _, _ := procStartDoc.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(lpdi))) + + return int(ret) +} + +func StartPage(hdc HDC) int { + ret, _, _ := procStartPage.Call( + uintptr(hdc)) + + return int(ret) +} + +func StretchBlt(hdcDest HDC, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest int, hdcSrc HDC, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc int, dwRop uint) { + ret, _, _ := procStretchBlt.Call( + uintptr(hdcDest), + uintptr(nXOriginDest), + uintptr(nYOriginDest), + uintptr(nWidthDest), + uintptr(nHeightDest), + uintptr(hdcSrc), + uintptr(nXOriginSrc), + uintptr(nYOriginSrc), + uintptr(nWidthSrc), + uintptr(nHeightSrc), + uintptr(dwRop)) + + if ret == 0 { + panic("StretchBlt failed") + } +} + +func SetDIBitsToDevice(hdc HDC, xDest, yDest, dwWidth, dwHeight, xSrc, ySrc int, uStartScan, cScanLines uint, lpvBits []byte, lpbmi *BITMAPINFO, fuColorUse uint) int { + ret, _, _ := procSetDIBitsToDevice.Call( + uintptr(hdc), + uintptr(xDest), + uintptr(yDest), + uintptr(dwWidth), + uintptr(dwHeight), + uintptr(xSrc), + uintptr(ySrc), + uintptr(uStartScan), + uintptr(cScanLines), + uintptr(unsafe.Pointer(&lpvBits[0])), + uintptr(unsafe.Pointer(lpbmi)), + uintptr(fuColorUse)) + + return int(ret) +} + +func ChoosePixelFormat(hdc HDC, pfd *PIXELFORMATDESCRIPTOR) int { + ret, _, _ := procChoosePixelFormat.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(pfd)), + ) + return int(ret) +} + +func DescribePixelFormat(hdc HDC, iPixelFormat int, nBytes uint, pfd *PIXELFORMATDESCRIPTOR) int { + ret, _, _ := procDescribePixelFormat.Call( + uintptr(hdc), + uintptr(iPixelFormat), + uintptr(nBytes), + uintptr(unsafe.Pointer(pfd)), + ) + return int(ret) +} + +func GetEnhMetaFilePixelFormat(hemf HENHMETAFILE, cbBuffer uint32, pfd *PIXELFORMATDESCRIPTOR) uint { + ret, _, _ := procGetEnhMetaFilePixelFormat.Call( + uintptr(hemf), + uintptr(cbBuffer), + uintptr(unsafe.Pointer(pfd)), + ) + return uint(ret) +} + +func GetPixelFormat(hdc HDC) int { + ret, _, _ := procGetPixelFormat.Call( + uintptr(hdc), + ) + return int(ret) +} + +func SetPixelFormat(hdc HDC, iPixelFormat int, pfd *PIXELFORMATDESCRIPTOR) bool { + ret, _, _ := procSetPixelFormat.Call( + uintptr(hdc), + uintptr(iPixelFormat), + uintptr(unsafe.Pointer(pfd)), + ) + return ret == TRUE +} + +func SwapBuffers(hdc HDC) bool { + ret, _, _ := procSwapBuffers.Call(uintptr(hdc)) + return ret == TRUE +} diff --git a/vendor/github.com/apenwarr/w32/gdiplus.go b/vendor/github.com/apenwarr/w32/gdiplus.go new file mode 100644 index 000000000..f3a8fca4d --- /dev/null +++ b/vendor/github.com/apenwarr/w32/gdiplus.go @@ -0,0 +1,175 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "errors" + "fmt" + "syscall" + "unsafe" +) + +const ( + Ok = 0 + GenericError = 1 + InvalidParameter = 2 + OutOfMemory = 3 + ObjectBusy = 4 + InsufficientBuffer = 5 + NotImplemented = 6 + Win32Error = 7 + WrongState = 8 + Aborted = 9 + FileNotFound = 10 + ValueOverflow = 11 + AccessDenied = 12 + UnknownImageFormat = 13 + FontFamilyNotFound = 14 + FontStyleNotFound = 15 + NotTrueTypeFont = 16 + UnsupportedGdiplusVersion = 17 + GdiplusNotInitialized = 18 + PropertyNotFound = 19 + PropertyNotSupported = 20 + ProfileNotFound = 21 +) + +func GetGpStatus(s int32) string { + switch s { + case Ok: + return "Ok" + case GenericError: + return "GenericError" + case InvalidParameter: + return "InvalidParameter" + case OutOfMemory: + return "OutOfMemory" + case ObjectBusy: + return "ObjectBusy" + case InsufficientBuffer: + return "InsufficientBuffer" + case NotImplemented: + return "NotImplemented" + case Win32Error: + return "Win32Error" + case WrongState: + return "WrongState" + case Aborted: + return "Aborted" + case FileNotFound: + return "FileNotFound" + case ValueOverflow: + return "ValueOverflow" + case AccessDenied: + return "AccessDenied" + case UnknownImageFormat: + return "UnknownImageFormat" + case FontFamilyNotFound: + return "FontFamilyNotFound" + case FontStyleNotFound: + return "FontStyleNotFound" + case NotTrueTypeFont: + return "NotTrueTypeFont" + case UnsupportedGdiplusVersion: + return "UnsupportedGdiplusVersion" + case GdiplusNotInitialized: + return "GdiplusNotInitialized" + case PropertyNotFound: + return "PropertyNotFound" + case PropertyNotSupported: + return "PropertyNotSupported" + case ProfileNotFound: + return "ProfileNotFound" + } + return "Unknown Status Value" +} + +var ( + token uintptr + + modgdiplus = syscall.NewLazyDLL("gdiplus.dll") + + procGdipCreateBitmapFromFile = modgdiplus.NewProc("GdipCreateBitmapFromFile") + procGdipCreateBitmapFromHBITMAP = modgdiplus.NewProc("GdipCreateBitmapFromHBITMAP") + procGdipCreateHBITMAPFromBitmap = modgdiplus.NewProc("GdipCreateHBITMAPFromBitmap") + procGdipCreateBitmapFromResource = modgdiplus.NewProc("GdipCreateBitmapFromResource") + procGdipCreateBitmapFromStream = modgdiplus.NewProc("GdipCreateBitmapFromStream") + procGdipDisposeImage = modgdiplus.NewProc("GdipDisposeImage") + procGdiplusShutdown = modgdiplus.NewProc("GdiplusShutdown") + procGdiplusStartup = modgdiplus.NewProc("GdiplusStartup") +) + +func GdipCreateBitmapFromFile(filename string) (*uintptr, error) { + var bitmap *uintptr + ret, _, _ := procGdipCreateBitmapFromFile.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))), + uintptr(unsafe.Pointer(&bitmap))) + + if ret != Ok { + return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromFile failed with status '%s' for file '%s'", GetGpStatus(int32(ret)), filename)) + } + + return bitmap, nil +} + +func GdipCreateBitmapFromResource(instance HINSTANCE, resId *uint16) (*uintptr, error) { + var bitmap *uintptr + ret, _, _ := procGdipCreateBitmapFromResource.Call( + uintptr(instance), + uintptr(unsafe.Pointer(resId)), + uintptr(unsafe.Pointer(&bitmap))) + + if ret != Ok { + return nil, errors.New(fmt.Sprintf("GdiCreateBitmapFromResource failed with status '%s'", GetGpStatus(int32(ret)))) + } + + return bitmap, nil +} + +func GdipCreateBitmapFromStream(stream *IStream) (*uintptr, error) { + var bitmap *uintptr + ret, _, _ := procGdipCreateBitmapFromStream.Call( + uintptr(unsafe.Pointer(stream)), + uintptr(unsafe.Pointer(&bitmap))) + + if ret != Ok { + return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromStream failed with status '%s'", GetGpStatus(int32(ret)))) + } + + return bitmap, nil +} + +func GdipCreateHBITMAPFromBitmap(bitmap *uintptr, background uint32) (HBITMAP, error) { + var hbitmap HBITMAP + ret, _, _ := procGdipCreateHBITMAPFromBitmap.Call( + uintptr(unsafe.Pointer(bitmap)), + uintptr(unsafe.Pointer(&hbitmap)), + uintptr(background)) + + if ret != Ok { + return 0, errors.New(fmt.Sprintf("GdipCreateHBITMAPFromBitmap failed with status '%s'", GetGpStatus(int32(ret)))) + } + + return hbitmap, nil +} + +func GdipDisposeImage(image *uintptr) { + procGdipDisposeImage.Call(uintptr(unsafe.Pointer(image))) +} + +func GdiplusShutdown() { + procGdiplusShutdown.Call(token) +} + +func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) { + ret, _, _ := procGdiplusStartup.Call( + uintptr(unsafe.Pointer(&token)), + uintptr(unsafe.Pointer(input)), + uintptr(unsafe.Pointer(output))) + + if ret != Ok { + panic("GdiplusStartup failed with status " + GetGpStatus(int32(ret))) + } +} diff --git a/vendor/github.com/apenwarr/w32/idispatch.go b/vendor/github.com/apenwarr/w32/idispatch.go new file mode 100644 index 000000000..41634a648 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/idispatch.go @@ -0,0 +1,43 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "unsafe" +) + +type pIDispatchVtbl struct { + pQueryInterface uintptr + pAddRef uintptr + pRelease uintptr + pGetTypeInfoCount uintptr + pGetTypeInfo uintptr + pGetIDsOfNames uintptr + pInvoke uintptr +} + +type IDispatch struct { + lpVtbl *pIDispatchVtbl +} + +func (this *IDispatch) QueryInterface(id *GUID) *IDispatch { + return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id) +} + +func (this *IDispatch) AddRef() int32 { + return ComAddRef((*IUnknown)(unsafe.Pointer(this))) +} + +func (this *IDispatch) Release() int32 { + return ComRelease((*IUnknown)(unsafe.Pointer(this))) +} + +func (this *IDispatch) GetIDsOfName(names []string) []int32 { + return ComGetIDsOfName(this, names) +} + +func (this *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) *VARIANT { + return ComInvoke(this, dispid, dispatch, params...) +} diff --git a/vendor/github.com/apenwarr/w32/istream.go b/vendor/github.com/apenwarr/w32/istream.go new file mode 100644 index 000000000..2b840c3b0 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/istream.go @@ -0,0 +1,31 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "unsafe" +) + +type pIStreamVtbl struct { + pQueryInterface uintptr + pAddRef uintptr + pRelease uintptr +} + +type IStream struct { + lpVtbl *pIStreamVtbl +} + +func (this *IStream) QueryInterface(id *GUID) *IDispatch { + return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id) +} + +func (this *IStream) AddRef() int32 { + return ComAddRef((*IUnknown)(unsafe.Pointer(this))) +} + +func (this *IStream) Release() int32 { + return ComRelease((*IUnknown)(unsafe.Pointer(this))) +} diff --git a/vendor/github.com/apenwarr/w32/iunknown.go b/vendor/github.com/apenwarr/w32/iunknown.go new file mode 100644 index 000000000..d63ff1bbc --- /dev/null +++ b/vendor/github.com/apenwarr/w32/iunknown.go @@ -0,0 +1,27 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +type pIUnknownVtbl struct { + pQueryInterface uintptr + pAddRef uintptr + pRelease uintptr +} + +type IUnknown struct { + lpVtbl *pIUnknownVtbl +} + +func (this *IUnknown) QueryInterface(id *GUID) *IDispatch { + return ComQueryInterface(this, id) +} + +func (this *IUnknown) AddRef() int32 { + return ComAddRef(this) +} + +func (this *IUnknown) Release() int32 { + return ComRelease(this) +} diff --git a/vendor/github.com/apenwarr/w32/kernel32.go b/vendor/github.com/apenwarr/w32/kernel32.go new file mode 100644 index 000000000..28febbeca --- /dev/null +++ b/vendor/github.com/apenwarr/w32/kernel32.go @@ -0,0 +1,388 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modkernel32 = syscall.NewLazyDLL("kernel32.dll") + + procGetModuleHandle = modkernel32.NewProc("GetModuleHandleW") + procMulDiv = modkernel32.NewProc("MulDiv") + procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow") + procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") + procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives") + procGetUserDefaultLCID = modkernel32.NewProc("GetUserDefaultLCID") + procLstrlen = modkernel32.NewProc("lstrlenW") + procLstrcpy = modkernel32.NewProc("lstrcpyW") + procGlobalAlloc = modkernel32.NewProc("GlobalAlloc") + procGlobalFree = modkernel32.NewProc("GlobalFree") + procGlobalLock = modkernel32.NewProc("GlobalLock") + procGlobalUnlock = modkernel32.NewProc("GlobalUnlock") + procMoveMemory = modkernel32.NewProc("RtlMoveMemory") + procFindResource = modkernel32.NewProc("FindResourceW") + procSizeofResource = modkernel32.NewProc("SizeofResource") + procLockResource = modkernel32.NewProc("LockResource") + procLoadResource = modkernel32.NewProc("LoadResource") + procGetLastError = modkernel32.NewProc("GetLastError") + // procOpenProcess = modkernel32.NewProc("OpenProcess") + // procTerminateProcess = modkernel32.NewProc("TerminateProcess") + procCloseHandle = modkernel32.NewProc("CloseHandle") + procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") + procModule32First = modkernel32.NewProc("Module32FirstW") + procModule32Next = modkernel32.NewProc("Module32NextW") + procGetSystemTimes = modkernel32.NewProc("GetSystemTimes") + procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") + procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute") + procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW") + procGetProcessTimes = modkernel32.NewProc("GetProcessTimes") + procSetSystemTime = modkernel32.NewProc("SetSystemTime") + procGetSystemTime = modkernel32.NewProc("GetSystemTime") + procVirtualAllocEx = modkernel32.NewProc("VirtualAllocEx") + procVirtualFreeEx = modkernel32.NewProc("VirtualFreeEx") + procWriteProcessMemory = modkernel32.NewProc("WriteProcessMemory") + procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory") + procQueryPerformanceCounter = modkernel32.NewProc("QueryPerformanceCounter") + procQueryPerformanceFrequency = modkernel32.NewProc("QueryPerformanceFrequency") +) + +func GetModuleHandle(modulename string) HINSTANCE { + var mn uintptr + if modulename == "" { + mn = 0 + } else { + mn = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(modulename))) + } + ret, _, _ := procGetModuleHandle.Call(mn) + return HINSTANCE(ret) +} + +func MulDiv(number, numerator, denominator int) int { + ret, _, _ := procMulDiv.Call( + uintptr(number), + uintptr(numerator), + uintptr(denominator)) + + return int(ret) +} + +func GetConsoleWindow() HWND { + ret, _, _ := procGetConsoleWindow.Call() + + return HWND(ret) +} + +func GetCurrentThread() HANDLE { + ret, _, _ := procGetCurrentThread.Call() + + return HANDLE(ret) +} + +func GetLogicalDrives() uint32 { + ret, _, _ := procGetLogicalDrives.Call() + + return uint32(ret) +} + +func GetUserDefaultLCID() uint32 { + ret, _, _ := procGetUserDefaultLCID.Call() + + return uint32(ret) +} + +func Lstrlen(lpString *uint16) int { + ret, _, _ := procLstrlen.Call(uintptr(unsafe.Pointer(lpString))) + + return int(ret) +} + +func Lstrcpy(buf []uint16, lpString *uint16) { + procLstrcpy.Call( + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(lpString))) +} + +func GlobalAlloc(uFlags uint, dwBytes uint32) HGLOBAL { + ret, _, _ := procGlobalAlloc.Call( + uintptr(uFlags), + uintptr(dwBytes)) + + if ret == 0 { + panic("GlobalAlloc failed") + } + + return HGLOBAL(ret) +} + +func GlobalFree(hMem HGLOBAL) { + ret, _, _ := procGlobalFree.Call(uintptr(hMem)) + + if ret != 0 { + panic("GlobalFree failed") + } +} + +func GlobalLock(hMem HGLOBAL) unsafe.Pointer { + ret, _, _ := procGlobalLock.Call(uintptr(hMem)) + + if ret == 0 { + panic("GlobalLock failed") + } + + return unsafe.Pointer(ret) +} + +func GlobalUnlock(hMem HGLOBAL) bool { + ret, _, _ := procGlobalUnlock.Call(uintptr(hMem)) + + return ret != 0 +} + +func MoveMemory(destination, source unsafe.Pointer, length uint32) { + procMoveMemory.Call( + uintptr(unsafe.Pointer(destination)), + uintptr(source), + uintptr(length)) +} + +func FindResource(hModule HMODULE, lpName, lpType *uint16) (HRSRC, error) { + ret, _, _ := procFindResource.Call( + uintptr(hModule), + uintptr(unsafe.Pointer(lpName)), + uintptr(unsafe.Pointer(lpType))) + + if ret == 0 { + return 0, syscall.GetLastError() + } + + return HRSRC(ret), nil +} + +func SizeofResource(hModule HMODULE, hResInfo HRSRC) uint32 { + ret, _, _ := procSizeofResource.Call( + uintptr(hModule), + uintptr(hResInfo)) + + if ret == 0 { + panic("SizeofResource failed") + } + + return uint32(ret) +} + +func LockResource(hResData HGLOBAL) unsafe.Pointer { + ret, _, _ := procLockResource.Call(uintptr(hResData)) + + if ret == 0 { + panic("LockResource failed") + } + + return unsafe.Pointer(ret) +} + +func LoadResource(hModule HMODULE, hResInfo HRSRC) HGLOBAL { + ret, _, _ := procLoadResource.Call( + uintptr(hModule), + uintptr(hResInfo)) + + if ret == 0 { + panic("LoadResource failed") + } + + return HGLOBAL(ret) +} + +func GetLastError() uint32 { + ret, _, _ := procGetLastError.Call() + return uint32(ret) +} + +// func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) HANDLE { +// inherit := 0 +// if inheritHandle { +// inherit = 1 +// } + +// ret, _, _ := procOpenProcess.Call( +// uintptr(desiredAccess), +// uintptr(inherit), +// uintptr(processId)) +// return HANDLE(ret) +// } + +// func TerminateProcess(hProcess HANDLE, uExitCode uint) bool { +// ret, _, _ := procTerminateProcess.Call( +// uintptr(hProcess), +// uintptr(uExitCode)) +// return ret != 0 +// } + +func CloseHandle(object HANDLE) bool { + ret, _, _ := procCloseHandle.Call( + uintptr(object)) + return ret != 0 +} + +func CreateToolhelp32Snapshot(flags, processId uint32) HANDLE { + ret, _, _ := procCreateToolhelp32Snapshot.Call( + uintptr(flags), + uintptr(processId)) + + if ret <= 0 { + return HANDLE(0) + } + + return HANDLE(ret) +} + +func Module32First(snapshot HANDLE, me *MODULEENTRY32) bool { + ret, _, _ := procModule32First.Call( + uintptr(snapshot), + uintptr(unsafe.Pointer(me))) + + return ret != 0 +} + +func Module32Next(snapshot HANDLE, me *MODULEENTRY32) bool { + ret, _, _ := procModule32Next.Call( + uintptr(snapshot), + uintptr(unsafe.Pointer(me))) + + return ret != 0 +} + +func GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime *FILETIME) bool { + ret, _, _ := procGetSystemTimes.Call( + uintptr(unsafe.Pointer(lpIdleTime)), + uintptr(unsafe.Pointer(lpKernelTime)), + uintptr(unsafe.Pointer(lpUserTime))) + + return ret != 0 +} + +func GetProcessTimes(hProcess HANDLE, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime *FILETIME) bool { + ret, _, _ := procGetProcessTimes.Call( + uintptr(hProcess), + uintptr(unsafe.Pointer(lpCreationTime)), + uintptr(unsafe.Pointer(lpExitTime)), + uintptr(unsafe.Pointer(lpKernelTime)), + uintptr(unsafe.Pointer(lpUserTime))) + + return ret != 0 +} + +func GetConsoleScreenBufferInfo(hConsoleOutput HANDLE) *CONSOLE_SCREEN_BUFFER_INFO { + var csbi CONSOLE_SCREEN_BUFFER_INFO + ret, _, _ := procGetConsoleScreenBufferInfo.Call( + uintptr(hConsoleOutput), + uintptr(unsafe.Pointer(&csbi))) + if ret == 0 { + return nil + } + return &csbi +} + +func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes uint16) bool { + ret, _, _ := procSetConsoleTextAttribute.Call( + uintptr(hConsoleOutput), + uintptr(wAttributes)) + return ret != 0 +} + +func GetDiskFreeSpaceEx(dirName string) (r bool, + freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64) { + ret, _, _ := procGetDiskFreeSpaceEx.Call( + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(dirName))), + uintptr(unsafe.Pointer(&freeBytesAvailable)), + uintptr(unsafe.Pointer(&totalNumberOfBytes)), + uintptr(unsafe.Pointer(&totalNumberOfFreeBytes))) + return ret != 0, + freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes +} + +func GetSystemTime() *SYSTEMTIME { + var time SYSTEMTIME + procGetSystemTime.Call( + uintptr(unsafe.Pointer(&time))) + return &time +} + +func SetSystemTime(time *SYSTEMTIME) bool { + ret, _, _ := procSetSystemTime.Call( + uintptr(unsafe.Pointer(time))) + return ret != 0 +} + +func VirtualAllocEx(hProcess HANDLE, lpAddress, dwSize uintptr, flAllocationType, flProtect uint32) uintptr { + ret, _, _ := procVirtualAllocEx.Call( + uintptr(hProcess), + lpAddress, + dwSize, + uintptr(flAllocationType), + uintptr(flProtect), + ) + + return ret +} + +func VirtualFreeEx(hProcess HANDLE, lpAddress, dwSize uintptr, dwFreeType uint32) bool { + ret, _, _ := procVirtualFreeEx.Call( + uintptr(hProcess), + lpAddress, + dwSize, + uintptr(dwFreeType), + ) + + return ret != 0 +} + +func WriteProcessMemory(hProcess HANDLE, lpBaseAddress, lpBuffer, nSize uintptr) (int, bool) { + var nBytesWritten int + ret, _, _ := procWriteProcessMemory.Call( + uintptr(hProcess), + lpBaseAddress, + lpBuffer, + nSize, + uintptr(unsafe.Pointer(&nBytesWritten)), + ) + + return nBytesWritten, ret != 0 +} + +func ReadProcessMemory(hProcess HANDLE, lpBaseAddress, nSize uintptr) (lpBuffer []uint16, lpNumberOfBytesRead int, ok bool) { + + var nBytesRead int + buf := make([]uint16, nSize) + ret, _, _ := procReadProcessMemory.Call( + uintptr(hProcess), + lpBaseAddress, + uintptr(unsafe.Pointer(&buf[0])), + nSize, + uintptr(unsafe.Pointer(&nBytesRead)), + ) + + return buf, nBytesRead, ret != 0 +} + +func QueryPerformanceCounter() uint64 { + result := uint64(0) + procQueryPerformanceCounter.Call( + uintptr(unsafe.Pointer(&result)), + ) + + return result +} + +func QueryPerformanceFrequency() uint64 { + result := uint64(0) + procQueryPerformanceFrequency.Call( + uintptr(unsafe.Pointer(&result)), + ) + + return result +} diff --git a/vendor/github.com/apenwarr/w32/ole32.go b/vendor/github.com/apenwarr/w32/ole32.go new file mode 100644 index 000000000..a7f79b550 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/ole32.go @@ -0,0 +1,63 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modole32 = syscall.NewLazyDLL("ole32.dll") + + procCoInitializeEx = modole32.NewProc("CoInitializeEx") + procCoInitialize = modole32.NewProc("CoInitialize") + procCoUninitialize = modole32.NewProc("CoUninitialize") + procCreateStreamOnHGlobal = modole32.NewProc("CreateStreamOnHGlobal") +) + +func CoInitializeEx(coInit uintptr) HRESULT { + ret, _, _ := procCoInitializeEx.Call( + 0, + coInit) + + switch uint32(ret) { + case E_INVALIDARG: + panic("CoInitializeEx failed with E_INVALIDARG") + case E_OUTOFMEMORY: + panic("CoInitializeEx failed with E_OUTOFMEMORY") + case E_UNEXPECTED: + panic("CoInitializeEx failed with E_UNEXPECTED") + } + + return HRESULT(ret) +} + +func CoInitialize() { + procCoInitialize.Call(0) +} + +func CoUninitialize() { + procCoUninitialize.Call() +} + +func CreateStreamOnHGlobal(hGlobal HGLOBAL, fDeleteOnRelease bool) *IStream { + stream := new(IStream) + ret, _, _ := procCreateStreamOnHGlobal.Call( + uintptr(hGlobal), + uintptr(BoolToBOOL(fDeleteOnRelease)), + uintptr(unsafe.Pointer(&stream))) + + switch uint32(ret) { + case E_INVALIDARG: + panic("CreateStreamOnHGlobal failed with E_INVALIDARG") + case E_OUTOFMEMORY: + panic("CreateStreamOnHGlobal failed with E_OUTOFMEMORY") + case E_UNEXPECTED: + panic("CreateStreamOnHGlobal failed with E_UNEXPECTED") + } + + return stream +} diff --git a/vendor/github.com/apenwarr/w32/oleaut32.go b/vendor/github.com/apenwarr/w32/oleaut32.go new file mode 100644 index 000000000..0eeeab724 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/oleaut32.go @@ -0,0 +1,48 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modoleaut32 = syscall.NewLazyDLL("oleaut32") + + procVariantInit = modoleaut32.NewProc("VariantInit") + procSysAllocString = modoleaut32.NewProc("SysAllocString") + procSysFreeString = modoleaut32.NewProc("SysFreeString") + procSysStringLen = modoleaut32.NewProc("SysStringLen") + procCreateDispTypeInfo = modoleaut32.NewProc("CreateDispTypeInfo") + procCreateStdDispatch = modoleaut32.NewProc("CreateStdDispatch") +) + +func VariantInit(v *VARIANT) { + hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + panic("Invoke VariantInit error.") + } + return +} + +func SysAllocString(v string) (ss *int16) { + pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v)))) + ss = (*int16)(unsafe.Pointer(pss)) + return +} + +func SysFreeString(v *int16) { + hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v))) + if hr != 0 { + panic("Invoke SysFreeString error.") + } + return +} + +func SysStringLen(v *int16) uint { + l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v))) + return uint(l) +} diff --git a/vendor/github.com/apenwarr/w32/opengl32.go b/vendor/github.com/apenwarr/w32/opengl32.go new file mode 100644 index 000000000..7363bb10a --- /dev/null +++ b/vendor/github.com/apenwarr/w32/opengl32.go @@ -0,0 +1,72 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modopengl32 = syscall.NewLazyDLL("opengl32.dll") + + procwglCreateContext = modopengl32.NewProc("wglCreateContext") + procwglCreateLayerContext = modopengl32.NewProc("wglCreateLayerContext") + procwglDeleteContext = modopengl32.NewProc("wglDeleteContext") + procwglGetProcAddress = modopengl32.NewProc("wglGetProcAddress") + procwglMakeCurrent = modopengl32.NewProc("wglMakeCurrent") + procwglShareLists = modopengl32.NewProc("wglShareLists") +) + +func WglCreateContext(hdc HDC) HGLRC { + ret, _, _ := procwglCreateContext.Call( + uintptr(hdc), + ) + + return HGLRC(ret) +} + +func WglCreateLayerContext(hdc HDC, iLayerPlane int) HGLRC { + ret, _, _ := procwglCreateLayerContext.Call( + uintptr(hdc), + uintptr(iLayerPlane), + ) + + return HGLRC(ret) +} + +func WglDeleteContext(hglrc HGLRC) bool { + ret, _, _ := procwglDeleteContext.Call( + uintptr(hglrc), + ) + + return ret == TRUE +} + +func WglGetProcAddress(szProc string) uintptr { + ret, _, _ := procwglGetProcAddress.Call( + uintptr(unsafe.Pointer(syscall.StringBytePtr(szProc))), + ) + + return ret +} + +func WglMakeCurrent(hdc HDC, hglrc HGLRC) bool { + ret, _, _ := procwglMakeCurrent.Call( + uintptr(hdc), + uintptr(hglrc), + ) + + return ret == TRUE +} + +func WglShareLists(hglrc1, hglrc2 HGLRC) bool { + ret, _, _ := procwglShareLists.Call( + uintptr(hglrc1), + uintptr(hglrc2), + ) + + return ret == TRUE +} diff --git a/vendor/github.com/apenwarr/w32/psapi.go b/vendor/github.com/apenwarr/w32/psapi.go new file mode 100644 index 000000000..bd1e12627 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/psapi.go @@ -0,0 +1,25 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unsafe" +) + +var ( + modpsapi = syscall.NewLazyDLL("psapi.dll") + + procEnumProcesses = modpsapi.NewProc("EnumProcesses") +) + +func EnumProcesses(processIds []uint32, cb uint32, bytesReturned *uint32) bool { + ret, _, _ := procEnumProcesses.Call( + uintptr(unsafe.Pointer(&processIds[0])), + uintptr(cb), + uintptr(unsafe.Pointer(bytesReturned))) + + return ret != 0 +} diff --git a/vendor/github.com/apenwarr/w32/shell32.go b/vendor/github.com/apenwarr/w32/shell32.go new file mode 100644 index 000000000..0923b8b61 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/shell32.go @@ -0,0 +1,153 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "errors" + "fmt" + "syscall" + "unsafe" +) + +var ( + modshell32 = syscall.NewLazyDLL("shell32.dll") + + procSHBrowseForFolder = modshell32.NewProc("SHBrowseForFolderW") + procSHGetPathFromIDList = modshell32.NewProc("SHGetPathFromIDListW") + procDragAcceptFiles = modshell32.NewProc("DragAcceptFiles") + procDragQueryFile = modshell32.NewProc("DragQueryFileW") + procDragQueryPoint = modshell32.NewProc("DragQueryPoint") + procDragFinish = modshell32.NewProc("DragFinish") + procShellExecute = modshell32.NewProc("ShellExecuteW") + procExtractIcon = modshell32.NewProc("ExtractIconW") +) + +func SHBrowseForFolder(bi *BROWSEINFO) uintptr { + ret, _, _ := procSHBrowseForFolder.Call(uintptr(unsafe.Pointer(bi))) + + return ret +} + +func SHGetPathFromIDList(idl uintptr) string { + buf := make([]uint16, 1024) + procSHGetPathFromIDList.Call( + idl, + uintptr(unsafe.Pointer(&buf[0]))) + + return syscall.UTF16ToString(buf) +} + +func DragAcceptFiles(hwnd HWND, accept bool) { + procDragAcceptFiles.Call( + uintptr(hwnd), + uintptr(BoolToBOOL(accept))) +} + +func DragQueryFile(hDrop HDROP, iFile uint) (fileName string, fileCount uint) { + ret, _, _ := procDragQueryFile.Call( + uintptr(hDrop), + uintptr(iFile), + 0, + 0) + + fileCount = uint(ret) + + if iFile != 0xFFFFFFFF { + buf := make([]uint16, fileCount+1) + + ret, _, _ := procDragQueryFile.Call( + uintptr(hDrop), + uintptr(iFile), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(fileCount+1)) + + if ret == 0 { + panic("Invoke DragQueryFile error.") + } + + fileName = syscall.UTF16ToString(buf) + } + + return +} + +func DragQueryPoint(hDrop HDROP) (x, y int, isClientArea bool) { + var pt POINT + ret, _, _ := procDragQueryPoint.Call( + uintptr(hDrop), + uintptr(unsafe.Pointer(&pt))) + + return int(pt.X), int(pt.Y), (ret == 1) +} + +func DragFinish(hDrop HDROP) { + procDragFinish.Call(uintptr(hDrop)) +} + +func ShellExecute(hwnd HWND, lpOperation, lpFile, lpParameters, lpDirectory string, nShowCmd int) error { + var op, param, directory uintptr + if len(lpOperation) != 0 { + op = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpOperation))) + } + if len(lpParameters) != 0 { + param = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpParameters))) + } + if len(lpDirectory) != 0 { + directory = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDirectory))) + } + + ret, _, _ := procShellExecute.Call( + uintptr(hwnd), + op, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpFile))), + param, + directory, + uintptr(nShowCmd)) + + errorMsg := "" + if ret != 0 && ret <= 32 { + switch int(ret) { + case ERROR_FILE_NOT_FOUND: + errorMsg = "The specified file was not found." + case ERROR_PATH_NOT_FOUND: + errorMsg = "The specified path was not found." + case ERROR_BAD_FORMAT: + errorMsg = "The .exe file is invalid (non-Win32 .exe or error in .exe image)." + case SE_ERR_ACCESSDENIED: + errorMsg = "The operating system denied access to the specified file." + case SE_ERR_ASSOCINCOMPLETE: + errorMsg = "The file name association is incomplete or invalid." + case SE_ERR_DDEBUSY: + errorMsg = "The DDE transaction could not be completed because other DDE transactions were being processed." + case SE_ERR_DDEFAIL: + errorMsg = "The DDE transaction failed." + case SE_ERR_DDETIMEOUT: + errorMsg = "The DDE transaction could not be completed because the request timed out." + case SE_ERR_DLLNOTFOUND: + errorMsg = "The specified DLL was not found." + case SE_ERR_NOASSOC: + errorMsg = "There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable." + case SE_ERR_OOM: + errorMsg = "There was not enough memory to complete the operation." + case SE_ERR_SHARE: + errorMsg = "A sharing violation occurred." + default: + errorMsg = fmt.Sprintf("Unknown error occurred with error code %v", ret) + } + } else { + return nil + } + + return errors.New(errorMsg) +} + +func ExtractIcon(lpszExeFileName string, nIconIndex int) HICON { + ret, _, _ := procExtractIcon.Call( + 0, + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszExeFileName))), + uintptr(nIconIndex)) + + return HICON(ret) +} diff --git a/vendor/github.com/apenwarr/w32/typedef.go b/vendor/github.com/apenwarr/w32/typedef.go new file mode 100644 index 000000000..118f76c63 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/typedef.go @@ -0,0 +1,891 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "unsafe" +) + +// From MSDN: Windows Data Types +// http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx +// ATOM WORD +// BOOL int32 +// BOOLEAN byte +// BYTE byte +// CCHAR int8 +// CHAR int8 +// COLORREF DWORD +// DWORD uint32 +// DWORDLONG ULONGLONG +// DWORD_PTR ULONG_PTR +// DWORD32 uint32 +// DWORD64 uint64 +// FLOAT float32 +// HACCEL HANDLE +// HALF_PTR struct{} // ??? +// HANDLE PVOID +// HBITMAP HANDLE +// HBRUSH HANDLE +// HCOLORSPACE HANDLE +// HCONV HANDLE +// HCONVLIST HANDLE +// HCURSOR HANDLE +// HDC HANDLE +// HDDEDATA HANDLE +// HDESK HANDLE +// HDROP HANDLE +// HDWP HANDLE +// HENHMETAFILE HANDLE +// HFILE HANDLE +// HFONT HANDLE +// HGDIOBJ HANDLE +// HGLOBAL HANDLE +// HHOOK HANDLE +// HICON HANDLE +// HINSTANCE HANDLE +// HKEY HANDLE +// HKL HANDLE +// HLOCAL HANDLE +// HMENU HANDLE +// HMETAFILE HANDLE +// HMODULE HANDLE +// HPALETTE HANDLE +// HPEN HANDLE +// HRESULT int32 +// HRGN HANDLE +// HSZ HANDLE +// HWINSTA HANDLE +// HWND HANDLE +// INT int32 +// INT_PTR uintptr +// INT8 int8 +// INT16 int16 +// INT32 int32 +// INT64 int64 +// LANGID WORD +// LCID DWORD +// LCTYPE DWORD +// LGRPID DWORD +// LONG int32 +// LONGLONG int64 +// LONG_PTR uintptr +// LONG32 int32 +// LONG64 int64 +// LPARAM LONG_PTR +// LPBOOL *BOOL +// LPBYTE *BYTE +// LPCOLORREF *COLORREF +// LPCSTR *int8 +// LPCTSTR LPCWSTR +// LPCVOID unsafe.Pointer +// LPCWSTR *WCHAR +// LPDWORD *DWORD +// LPHANDLE *HANDLE +// LPINT *INT +// LPLONG *LONG +// LPSTR *CHAR +// LPTSTR LPWSTR +// LPVOID unsafe.Pointer +// LPWORD *WORD +// LPWSTR *WCHAR +// LRESULT LONG_PTR +// PBOOL *BOOL +// PBOOLEAN *BOOLEAN +// PBYTE *BYTE +// PCHAR *CHAR +// PCSTR *CHAR +// PCTSTR PCWSTR +// PCWSTR *WCHAR +// PDWORD *DWORD +// PDWORDLONG *DWORDLONG +// PDWORD_PTR *DWORD_PTR +// PDWORD32 *DWORD32 +// PDWORD64 *DWORD64 +// PFLOAT *FLOAT +// PHALF_PTR *HALF_PTR +// PHANDLE *HANDLE +// PHKEY *HKEY +// PINT_PTR *INT_PTR +// PINT8 *INT8 +// PINT16 *INT16 +// PINT32 *INT32 +// PINT64 *INT64 +// PLCID *LCID +// PLONG *LONG +// PLONGLONG *LONGLONG +// PLONG_PTR *LONG_PTR +// PLONG32 *LONG32 +// PLONG64 *LONG64 +// POINTER_32 struct{} // ??? +// POINTER_64 struct{} // ??? +// POINTER_SIGNED uintptr +// POINTER_UNSIGNED uintptr +// PSHORT *SHORT +// PSIZE_T *SIZE_T +// PSSIZE_T *SSIZE_T +// PSTR *CHAR +// PTBYTE *TBYTE +// PTCHAR *TCHAR +// PTSTR PWSTR +// PUCHAR *UCHAR +// PUHALF_PTR *UHALF_PTR +// PUINT *UINT +// PUINT_PTR *UINT_PTR +// PUINT8 *UINT8 +// PUINT16 *UINT16 +// PUINT32 *UINT32 +// PUINT64 *UINT64 +// PULONG *ULONG +// PULONGLONG *ULONGLONG +// PULONG_PTR *ULONG_PTR +// PULONG32 *ULONG32 +// PULONG64 *ULONG64 +// PUSHORT *USHORT +// PVOID unsafe.Pointer +// PWCHAR *WCHAR +// PWORD *WORD +// PWSTR *WCHAR +// QWORD uint64 +// SC_HANDLE HANDLE +// SC_LOCK LPVOID +// SERVICE_STATUS_HANDLE HANDLE +// SHORT int16 +// SIZE_T ULONG_PTR +// SSIZE_T LONG_PTR +// TBYTE WCHAR +// TCHAR WCHAR +// UCHAR uint8 +// UHALF_PTR struct{} // ??? +// UINT uint32 +// UINT_PTR uintptr +// UINT8 uint8 +// UINT16 uint16 +// UINT32 uint32 +// UINT64 uint64 +// ULONG uint32 +// ULONGLONG uint64 +// ULONG_PTR uintptr +// ULONG32 uint32 +// ULONG64 uint64 +// USHORT uint16 +// USN LONGLONG +// WCHAR uint16 +// WORD uint16 +// WPARAM UINT_PTR +type ( + ATOM uint16 + BOOL int32 + COLORREF uint32 + DWM_FRAME_COUNT uint64 + DWORD uint32 + HACCEL HANDLE + HANDLE uintptr + HBITMAP HANDLE + HBRUSH HANDLE + HCURSOR HANDLE + HDC HANDLE + HDROP HANDLE + HDWP HANDLE + HENHMETAFILE HANDLE + HFONT HANDLE + HGDIOBJ HANDLE + HGLOBAL HANDLE + HGLRC HANDLE + HHOOK HANDLE + HICON HANDLE + HIMAGELIST HANDLE + HINSTANCE HANDLE + HKEY HANDLE + HKL HANDLE + HMENU HANDLE + HMODULE HANDLE + HMONITOR HANDLE + HPEN HANDLE + HRESULT int32 + HRGN HANDLE + HRSRC HANDLE + HTHUMBNAIL HANDLE + HWND HANDLE + LPARAM uintptr + LPCVOID unsafe.Pointer + LRESULT uintptr + PVOID unsafe.Pointer + QPC_TIME uint64 + ULONG_PTR uintptr + WPARAM uintptr + TRACEHANDLE uintptr +) + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx +type POINT struct { + X, Y int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162897.aspx +type RECT struct { + Left, Top, Right, Bottom int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577.aspx +type WNDCLASSEX struct { + Size uint32 + Style uint32 + WndProc uintptr + ClsExtra int32 + WndExtra int32 + Instance HINSTANCE + Icon HICON + Cursor HCURSOR + Background HBRUSH + MenuName *uint16 + ClassName *uint16 + IconSm HICON +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx +type MSG struct { + Hwnd HWND + Message uint32 + WParam uintptr + LParam uintptr + Time uint32 + Pt POINT +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037.aspx +type LOGFONT struct { + Height int32 + Width int32 + Escapement int32 + Orientation int32 + Weight int32 + Italic byte + Underline byte + StrikeOut byte + CharSet byte + OutPrecision byte + ClipPrecision byte + Quality byte + PitchAndFamily byte + FaceName [LF_FACESIZE]uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx +type OPENFILENAME struct { + StructSize uint32 + Owner HWND + Instance HINSTANCE + Filter *uint16 + CustomFilter *uint16 + MaxCustomFilter uint32 + FilterIndex uint32 + File *uint16 + MaxFile uint32 + FileTitle *uint16 + MaxFileTitle uint32 + InitialDir *uint16 + Title *uint16 + Flags uint32 + FileOffset uint16 + FileExtension uint16 + DefExt *uint16 + CustData uintptr + FnHook uintptr + TemplateName *uint16 + PvReserved unsafe.Pointer + DwReserved uint32 + FlagsEx uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205.aspx +type BROWSEINFO struct { + Owner HWND + Root *uint16 + DisplayName *uint16 + Title *uint16 + Flags uint32 + CallbackFunc uintptr + LParam uintptr + Image int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx +type GUID struct { + Data1 uint32 + Data2 uint16 + Data3 uint16 + Data4 [8]byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627.aspx +type VARIANT struct { + VT uint16 // 2 + WReserved1 uint16 // 4 + WReserved2 uint16 // 6 + WReserved3 uint16 // 8 + Val int64 // 16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221416.aspx +type DISPPARAMS struct { + Rgvarg uintptr + RgdispidNamedArgs uintptr + CArgs uint32 + CNamedArgs uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221133.aspx +type EXCEPINFO struct { + WCode uint16 + WReserved uint16 + BstrSource *uint16 + BstrDescription *uint16 + BstrHelpFile *uint16 + DwHelpContext uint32 + PvReserved uintptr + PfnDeferredFillIn uintptr + Scode int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145035.aspx +type LOGBRUSH struct { + LbStyle uint32 + LbColor COLORREF + LbHatch uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx +type DEVMODE struct { + DmDeviceName [CCHDEVICENAME]uint16 + DmSpecVersion uint16 + DmDriverVersion uint16 + DmSize uint16 + DmDriverExtra uint16 + DmFields uint32 + DmOrientation int16 + DmPaperSize int16 + DmPaperLength int16 + DmPaperWidth int16 + DmScale int16 + DmCopies int16 + DmDefaultSource int16 + DmPrintQuality int16 + DmColor int16 + DmDuplex int16 + DmYResolution int16 + DmTTOption int16 + DmCollate int16 + DmFormName [CCHFORMNAME]uint16 + DmLogPixels uint16 + DmBitsPerPel uint32 + DmPelsWidth uint32 + DmPelsHeight uint32 + DmDisplayFlags uint32 + DmDisplayFrequency uint32 + DmICMMethod uint32 + DmICMIntent uint32 + DmMediaType uint32 + DmDitherType uint32 + DmReserved1 uint32 + DmReserved2 uint32 + DmPanningWidth uint32 + DmPanningHeight uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx +type BITMAPINFOHEADER struct { + BiSize uint32 + BiWidth int32 + BiHeight int32 + BiPlanes uint16 + BiBitCount uint16 + BiCompression uint32 + BiSizeImage uint32 + BiXPelsPerMeter int32 + BiYPelsPerMeter int32 + BiClrUsed uint32 + BiClrImportant uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162938.aspx +type RGBQUAD struct { + RgbBlue byte + RgbGreen byte + RgbRed byte + RgbReserved byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183375.aspx +type BITMAPINFO struct { + BmiHeader BITMAPINFOHEADER + BmiColors *RGBQUAD +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183371.aspx +type BITMAP struct { + BmType int32 + BmWidth int32 + BmHeight int32 + BmWidthBytes int32 + BmPlanes uint16 + BmBitsPixel uint16 + BmBits unsafe.Pointer +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183567.aspx +type DIBSECTION struct { + DsBm BITMAP + DsBmih BITMAPINFOHEADER + DsBitfields [3]uint32 + DshSection HANDLE + DsOffset uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162607.aspx +type ENHMETAHEADER struct { + IType uint32 + NSize uint32 + RclBounds RECT + RclFrame RECT + DSignature uint32 + NVersion uint32 + NBytes uint32 + NRecords uint32 + NHandles uint16 + SReserved uint16 + NDescription uint32 + OffDescription uint32 + NPalEntries uint32 + SzlDevice SIZE + SzlMillimeters SIZE + CbPixelFormat uint32 + OffPixelFormat uint32 + BOpenGL uint32 + SzlMicrometers SIZE +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145106.aspx +type SIZE struct { + CX, CY int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145132.aspx +type TEXTMETRIC struct { + TmHeight int32 + TmAscent int32 + TmDescent int32 + TmInternalLeading int32 + TmExternalLeading int32 + TmAveCharWidth int32 + TmMaxCharWidth int32 + TmWeight int32 + TmOverhang int32 + TmDigitizedAspectX int32 + TmDigitizedAspectY int32 + TmFirstChar uint16 + TmLastChar uint16 + TmDefaultChar uint16 + TmBreakChar uint16 + TmItalic byte + TmUnderlined byte + TmStruckOut byte + TmPitchAndFamily byte + TmCharSet byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183574.aspx +type DOCINFO struct { + CbSize int32 + LpszDocName *uint16 + LpszOutput *uint16 + LpszDatatype *uint16 + FwType uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775514.aspx +type NMHDR struct { + HwndFrom HWND + IdFrom uintptr + Code uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774743.aspx +type LVCOLUMN struct { + Mask uint32 + Fmt int32 + Cx int32 + PszText *uint16 + CchTextMax int32 + ISubItem int32 + IImage int32 + IOrder int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760.aspx +type LVITEM struct { + Mask uint32 + IItem int32 + ISubItem int32 + State uint32 + StateMask uint32 + PszText *uint16 + CchTextMax int32 + IImage int32 + LParam uintptr + IIndent int32 + IGroupId int32 + CColumns uint32 + PuColumns uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774754.aspx +type LVHITTESTINFO struct { + Pt POINT + Flags uint32 + IItem int32 + ISubItem int32 + IGroup int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774771.aspx +type NMITEMACTIVATE struct { + Hdr NMHDR + IItem int32 + ISubItem int32 + UNewState uint32 + UOldState uint32 + UChanged uint32 + PtAction POINT + LParam uintptr + UKeyFlags uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774773.aspx +type NMLISTVIEW struct { + Hdr NMHDR + IItem int32 + ISubItem int32 + UNewState uint32 + UOldState uint32 + UChanged uint32 + PtAction POINT + LParam uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774780.aspx +type NMLVDISPINFO struct { + Hdr NMHDR + Item LVITEM +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775507.aspx +type INITCOMMONCONTROLSEX struct { + DwSize uint32 + DwICC uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb760256.aspx +type TOOLINFO struct { + CbSize uint32 + UFlags uint32 + Hwnd HWND + UId uintptr + Rect RECT + Hinst HINSTANCE + LpszText *uint16 + LParam uintptr + LpReserved unsafe.Pointer +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645604.aspx +type TRACKMOUSEEVENT struct { + CbSize uint32 + DwFlags uint32 + HwndTrack HWND + DwHoverTime uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534067.aspx +type GdiplusStartupInput struct { + GdiplusVersion uint32 + DebugEventCallback uintptr + SuppressBackgroundThread BOOL + SuppressExternalCodecs BOOL +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534068.aspx +type GdiplusStartupOutput struct { + NotificationHook uintptr + NotificationUnhook uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162768.aspx +type PAINTSTRUCT struct { + Hdc HDC + FErase BOOL + RcPaint RECT + FRestore BOOL + FIncUpdate BOOL + RgbReserved [32]byte +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225.aspx +type MODULEENTRY32 struct { + Size uint32 + ModuleID uint32 + ProcessID uint32 + GlblcntUsage uint32 + ProccntUsage uint32 + ModBaseAddr *uint8 + ModBaseSize uint32 + HModule HMODULE + SzModule [MAX_MODULE_NAME32 + 1]uint16 + SzExePath [MAX_PATH]uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx +type FILETIME struct { + DwLowDateTime uint32 + DwHighDateTime uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119.aspx +type COORD struct { + X, Y int16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686311.aspx +type SMALL_RECT struct { + Left, Top, Right, Bottom int16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093.aspx +type CONSOLE_SCREEN_BUFFER_INFO struct { + DwSize COORD + DwCursorPosition COORD + WAttributes uint16 + SrWindow SMALL_RECT + DwMaximumWindowSize COORD +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773244.aspx +type MARGINS struct { + CxLeftWidth, CxRightWidth, CyTopHeight, CyBottomHeight int32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969500.aspx +type DWM_BLURBEHIND struct { + DwFlags uint32 + fEnable BOOL + hRgnBlur HRGN + fTransitionOnMaximized BOOL +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969501.aspx +type DWM_PRESENT_PARAMETERS struct { + cbSize uint32 + fQueue BOOL + cRefreshStart DWM_FRAME_COUNT + cBuffer uint32 + fUseSourceRate BOOL + rateSource UNSIGNED_RATIO + cRefreshesPerFrame uint32 + eSampling DWM_SOURCE_FRAME_SAMPLING +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969502.aspx +type DWM_THUMBNAIL_PROPERTIES struct { + dwFlags uint32 + rcDestination RECT + rcSource RECT + opacity byte + fVisible BOOL + fSourceClientAreaOnly BOOL +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969503.aspx +type DWM_TIMING_INFO struct { + cbSize uint32 + rateRefresh UNSIGNED_RATIO + qpcRefreshPeriod QPC_TIME + rateCompose UNSIGNED_RATIO + qpcVBlank QPC_TIME + cRefresh DWM_FRAME_COUNT + cDXRefresh uint32 + qpcCompose QPC_TIME + cFrame DWM_FRAME_COUNT + cDXPresent uint32 + cRefreshFrame DWM_FRAME_COUNT + cFrameSubmitted DWM_FRAME_COUNT + cDXPresentSubmitted uint32 + cFrameConfirmed DWM_FRAME_COUNT + cDXPresentConfirmed uint32 + cRefreshConfirmed DWM_FRAME_COUNT + cDXRefreshConfirmed uint32 + cFramesLate DWM_FRAME_COUNT + cFramesOutstanding uint32 + cFrameDisplayed DWM_FRAME_COUNT + qpcFrameDisplayed QPC_TIME + cRefreshFrameDisplayed DWM_FRAME_COUNT + cFrameComplete DWM_FRAME_COUNT + qpcFrameComplete QPC_TIME + cFramePending DWM_FRAME_COUNT + qpcFramePending QPC_TIME + cFramesDisplayed DWM_FRAME_COUNT + cFramesComplete DWM_FRAME_COUNT + cFramesPending DWM_FRAME_COUNT + cFramesAvailable DWM_FRAME_COUNT + cFramesDropped DWM_FRAME_COUNT + cFramesMissed DWM_FRAME_COUNT + cRefreshNextDisplayed DWM_FRAME_COUNT + cRefreshNextPresented DWM_FRAME_COUNT + cRefreshesDisplayed DWM_FRAME_COUNT + cRefreshesPresented DWM_FRAME_COUNT + cRefreshStarted DWM_FRAME_COUNT + cPixelsReceived uint64 + cPixelsDrawn uint64 + cBuffersEmpty DWM_FRAME_COUNT +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd389402.aspx +type MilMatrix3x2D struct { + S_11, S_12, S_21, S_22 float64 + DX, DY float64 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969505.aspx +type UNSIGNED_RATIO struct { + uiNumerator uint32 + uiDenominator uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632603.aspx +type CREATESTRUCT struct { + CreateParams uintptr + Instance HINSTANCE + Menu HMENU + Parent HWND + Cy, Cx int32 + Y, X int32 + Style int32 + Name *uint16 + Class *uint16 + dwExStyle uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145065.aspx +type MONITORINFO struct { + CbSize uint32 + RcMonitor RECT + RcWork RECT + DwFlags uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066.aspx +type MONITORINFOEX struct { + MONITORINFO + SzDevice [CCHDEVICENAME]uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826.aspx +type PIXELFORMATDESCRIPTOR struct { + Size uint16 + Version uint16 + DwFlags uint32 + IPixelType byte + ColorBits byte + RedBits, RedShift byte + GreenBits, GreenShift byte + BlueBits, BlueShift byte + AlphaBits, AlphaShift byte + AccumBits byte + AccumRedBits byte + AccumGreenBits byte + AccumBlueBits byte + AccumAlphaBits byte + DepthBits, StencilBits byte + AuxBuffers byte + ILayerType byte + Reserved byte + DwLayerMask uint32 + DwVisibleMask uint32 + DwDamageMask uint32 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx +type INPUT struct { + Type uint32 + Mi MOUSEINPUT + Ki KEYBDINPUT + Hi HARDWAREINPUT +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx +type MOUSEINPUT struct { + Dx int32 + Dy int32 + MouseData uint32 + DwFlags uint32 + Time uint32 + DwExtraInfo uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271(v=vs.85).aspx +type KEYBDINPUT struct { + WVk uint16 + WScan uint16 + DwFlags uint32 + Time uint32 + DwExtraInfo uintptr +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646269(v=vs.85).aspx +type HARDWAREINPUT struct { + UMsg uint32 + WParamL uint16 + WParamH uint16 +} + +type KbdInput struct { + typ uint32 + ki KEYBDINPUT +} + +type MouseInput struct { + typ uint32 + mi MOUSEINPUT +} + +type HardwareInput struct { + typ uint32 + hi HARDWAREINPUT +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx +type SYSTEMTIME struct { + Year uint16 + Month uint16 + DayOfWeek uint16 + Day uint16 + Hour uint16 + Minute uint16 + Second uint16 + Milliseconds uint16 +} + +// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx +type KBDLLHOOKSTRUCT struct { + VkCode DWORD + ScanCode DWORD + Flags DWORD + Time DWORD + DwExtraInfo ULONG_PTR +} + +type HOOKPROC func(int, WPARAM, LPARAM) LRESULT + +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633498(v=vs.85).aspx +type WNDENUMPROC func(HWND, LPARAM) LRESULT diff --git a/vendor/github.com/apenwarr/w32/user32.go b/vendor/github.com/apenwarr/w32/user32.go new file mode 100644 index 000000000..8286e8944 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/user32.go @@ -0,0 +1,1046 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "fmt" + "syscall" + "unsafe" +) + +var ( + moduser32 = syscall.NewLazyDLL("user32.dll") + + procRegisterClassEx = moduser32.NewProc("RegisterClassExW") + procLoadIcon = moduser32.NewProc("LoadIconW") + procLoadCursor = moduser32.NewProc("LoadCursorW") + procShowWindow = moduser32.NewProc("ShowWindow") + procUpdateWindow = moduser32.NewProc("UpdateWindow") + procCreateWindowEx = moduser32.NewProc("CreateWindowExW") + procAdjustWindowRect = moduser32.NewProc("AdjustWindowRect") + procAdjustWindowRectEx = moduser32.NewProc("AdjustWindowRectEx") + procDestroyWindow = moduser32.NewProc("DestroyWindow") + procDefWindowProc = moduser32.NewProc("DefWindowProcW") + procDefDlgProc = moduser32.NewProc("DefDlgProcW") + procPostQuitMessage = moduser32.NewProc("PostQuitMessage") + procGetMessage = moduser32.NewProc("GetMessageW") + procTranslateMessage = moduser32.NewProc("TranslateMessage") + procDispatchMessage = moduser32.NewProc("DispatchMessageW") + procSendMessage = moduser32.NewProc("SendMessageW") + procSendMessageTimeout = moduser32.NewProc("SendMessageTimeout") + procPostMessage = moduser32.NewProc("PostMessageW") + procWaitMessage = moduser32.NewProc("WaitMessage") + procSetWindowText = moduser32.NewProc("SetWindowTextW") + procGetWindowTextLength = moduser32.NewProc("GetWindowTextLengthW") + procGetWindowText = moduser32.NewProc("GetWindowTextW") + procGetWindowRect = moduser32.NewProc("GetWindowRect") + procMoveWindow = moduser32.NewProc("MoveWindow") + procScreenToClient = moduser32.NewProc("ScreenToClient") + procCallWindowProc = moduser32.NewProc("CallWindowProcW") + procSetWindowLong = moduser32.NewProc("SetWindowLongW") + procSetWindowLongPtr = moduser32.NewProc("SetWindowLongW") + procGetWindowLong = moduser32.NewProc("GetWindowLongW") + procGetWindowLongPtr = moduser32.NewProc("GetWindowLongW") + procEnableWindow = moduser32.NewProc("EnableWindow") + procIsWindowEnabled = moduser32.NewProc("IsWindowEnabled") + procIsWindowVisible = moduser32.NewProc("IsWindowVisible") + procSetFocus = moduser32.NewProc("SetFocus") + procInvalidateRect = moduser32.NewProc("InvalidateRect") + procGetClientRect = moduser32.NewProc("GetClientRect") + procGetDC = moduser32.NewProc("GetDC") + procReleaseDC = moduser32.NewProc("ReleaseDC") + procSetCapture = moduser32.NewProc("SetCapture") + procReleaseCapture = moduser32.NewProc("ReleaseCapture") + procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId") + procMessageBox = moduser32.NewProc("MessageBoxW") + procGetSystemMetrics = moduser32.NewProc("GetSystemMetrics") + procCopyRect = moduser32.NewProc("CopyRect") + procEqualRect = moduser32.NewProc("EqualRect") + procInflateRect = moduser32.NewProc("InflateRect") + procIntersectRect = moduser32.NewProc("IntersectRect") + procIsRectEmpty = moduser32.NewProc("IsRectEmpty") + procOffsetRect = moduser32.NewProc("OffsetRect") + procPtInRect = moduser32.NewProc("PtInRect") + procSetRect = moduser32.NewProc("SetRect") + procSetRectEmpty = moduser32.NewProc("SetRectEmpty") + procSubtractRect = moduser32.NewProc("SubtractRect") + procUnionRect = moduser32.NewProc("UnionRect") + procCreateDialogParam = moduser32.NewProc("CreateDialogParamW") + procDialogBoxParam = moduser32.NewProc("DialogBoxParamW") + procGetDlgItem = moduser32.NewProc("GetDlgItem") + procDrawIcon = moduser32.NewProc("DrawIcon") + procClientToScreen = moduser32.NewProc("ClientToScreen") + procIsDialogMessage = moduser32.NewProc("IsDialogMessageW") + procIsWindow = moduser32.NewProc("IsWindow") + procEndDialog = moduser32.NewProc("EndDialog") + procPeekMessage = moduser32.NewProc("PeekMessageW") + procTranslateAccelerator = moduser32.NewProc("TranslateAcceleratorW") + procSetWindowPos = moduser32.NewProc("SetWindowPos") + procFillRect = moduser32.NewProc("FillRect") + procDrawText = moduser32.NewProc("DrawTextW") + procAddClipboardFormatListener = moduser32.NewProc("AddClipboardFormatListener") + procRemoveClipboardFormatListener = moduser32.NewProc("RemoveClipboardFormatListener") + procOpenClipboard = moduser32.NewProc("OpenClipboard") + procCloseClipboard = moduser32.NewProc("CloseClipboard") + procEnumClipboardFormats = moduser32.NewProc("EnumClipboardFormats") + procGetClipboardData = moduser32.NewProc("GetClipboardData") + procSetClipboardData = moduser32.NewProc("SetClipboardData") + procEmptyClipboard = moduser32.NewProc("EmptyClipboard") + procGetClipboardFormatName = moduser32.NewProc("GetClipboardFormatNameW") + procIsClipboardFormatAvailable = moduser32.NewProc("IsClipboardFormatAvailable") + procBeginPaint = moduser32.NewProc("BeginPaint") + procEndPaint = moduser32.NewProc("EndPaint") + procGetKeyboardState = moduser32.NewProc("GetKeyboardState") + procMapVirtualKey = moduser32.NewProc("MapVirtualKeyExW") + procGetAsyncKeyState = moduser32.NewProc("GetAsyncKeyState") + procToAscii = moduser32.NewProc("ToAscii") + procSwapMouseButton = moduser32.NewProc("SwapMouseButton") + procGetCursorPos = moduser32.NewProc("GetCursorPos") + procSetCursorPos = moduser32.NewProc("SetCursorPos") + procSetCursor = moduser32.NewProc("SetCursor") + procCreateIcon = moduser32.NewProc("CreateIcon") + procDestroyIcon = moduser32.NewProc("DestroyIcon") + procMonitorFromPoint = moduser32.NewProc("MonitorFromPoint") + procMonitorFromRect = moduser32.NewProc("MonitorFromRect") + procMonitorFromWindow = moduser32.NewProc("MonitorFromWindow") + procGetMonitorInfo = moduser32.NewProc("GetMonitorInfoW") + procEnumDisplayMonitors = moduser32.NewProc("EnumDisplayMonitors") + procEnumDisplaySettingsEx = moduser32.NewProc("EnumDisplaySettingsExW") + procChangeDisplaySettingsEx = moduser32.NewProc("ChangeDisplaySettingsExW") + procSendInput = moduser32.NewProc("SendInput") + procSetWindowsHookEx = moduser32.NewProc("SetWindowsHookExW") + procUnhookWindowsHookEx = moduser32.NewProc("UnhookWindowsHookEx") + procCallNextHookEx = moduser32.NewProc("CallNextHookEx") + procSetForegroundWindow = moduser32.NewProc("SetForegroundWindow") + procFindWindowW = moduser32.NewProc("FindWindowW") + procFindWindowExW = moduser32.NewProc("FindWindowExW") + procGetClassName = moduser32.NewProc("GetClassNameW") + procEnumChildWindows = moduser32.NewProc("EnumChildWindows") + procSetTimer = moduser32.NewProc("SetTimer") + procKillTimer = moduser32.NewProc("KillTimer") + procRedrawWindow = moduser32.NewProc("RedrawWindow") +) + +func RegisterClassEx(wndClassEx *WNDCLASSEX) ATOM { + ret, _, _ := procRegisterClassEx.Call(uintptr(unsafe.Pointer(wndClassEx))) + return ATOM(ret) +} + +func LoadIcon(instance HINSTANCE, iconName *uint16) HICON { + ret, _, _ := procLoadIcon.Call( + uintptr(instance), + uintptr(unsafe.Pointer(iconName))) + + return HICON(ret) + +} + +func LoadCursor(instance HINSTANCE, cursorName *uint16) HCURSOR { + ret, _, _ := procLoadCursor.Call( + uintptr(instance), + uintptr(unsafe.Pointer(cursorName))) + + return HCURSOR(ret) + +} + +func GetClassNameW(hwnd HWND) string { + buf := make([]uint16, 255) + procGetClassName.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(255)) + + return syscall.UTF16ToString(buf) +} + +func SetForegroundWindow(hwnd HWND) bool { + ret, _, _ := procSetForegroundWindow.Call( + uintptr(hwnd)) + + return ret != 0 +} + +func ShowWindow(hwnd HWND, cmdshow int) bool { + ret, _, _ := procShowWindow.Call( + uintptr(hwnd), + uintptr(cmdshow)) + + return ret != 0 + +} + +func UpdateWindow(hwnd HWND) bool { + ret, _, _ := procUpdateWindow.Call( + uintptr(hwnd)) + return ret != 0 +} + +func CreateWindowEx(exStyle uint, className, windowName *uint16, + style uint, x, y, width, height int, parent HWND, menu HMENU, + instance HINSTANCE, param unsafe.Pointer) HWND { + ret, _, _ := procCreateWindowEx.Call( + uintptr(exStyle), + uintptr(unsafe.Pointer(className)), + uintptr(unsafe.Pointer(windowName)), + uintptr(style), + uintptr(x), + uintptr(y), + uintptr(width), + uintptr(height), + uintptr(parent), + uintptr(menu), + uintptr(instance), + uintptr(param)) + + return HWND(ret) +} + +func FindWindowExW(hwndParent, hwndChildAfter HWND, className, windowName *uint16) HWND { + ret, _, _ := procFindWindowExW.Call( + uintptr(hwndParent), + uintptr(hwndChildAfter), + uintptr(unsafe.Pointer(className)), + uintptr(unsafe.Pointer(windowName))) + + return HWND(ret) +} + +func FindWindowW(className, windowName *uint16) HWND { + ret, _, _ := procFindWindowW.Call( + uintptr(unsafe.Pointer(className)), + uintptr(unsafe.Pointer(windowName))) + + return HWND(ret) +} + +func EnumChildWindows(hWndParent HWND, lpEnumFunc WNDENUMPROC, lParam LPARAM) bool { + ret, _, _ := procEnumChildWindows.Call( + uintptr(hWndParent), + uintptr(syscall.NewCallback(lpEnumFunc)), + uintptr(lParam), + ) + + return ret != 0 +} + +func AdjustWindowRectEx(rect *RECT, style uint, menu bool, exStyle uint) bool { + ret, _, _ := procAdjustWindowRectEx.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(style), + uintptr(BoolToBOOL(menu)), + uintptr(exStyle)) + + return ret != 0 +} + +func AdjustWindowRect(rect *RECT, style uint, menu bool) bool { + ret, _, _ := procAdjustWindowRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(style), + uintptr(BoolToBOOL(menu))) + + return ret != 0 +} + +func DestroyWindow(hwnd HWND) bool { + ret, _, _ := procDestroyWindow.Call( + uintptr(hwnd)) + + return ret != 0 +} + +func DefWindowProc(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := procDefWindowProc.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam) + + return ret +} + +func DefDlgProc(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := procDefDlgProc.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam) + + return ret +} + +func PostQuitMessage(exitCode int) { + procPostQuitMessage.Call( + uintptr(exitCode)) +} + +func GetMessage(msg *MSG, hwnd HWND, msgFilterMin, msgFilterMax uint32) int { + ret, _, _ := procGetMessage.Call( + uintptr(unsafe.Pointer(msg)), + uintptr(hwnd), + uintptr(msgFilterMin), + uintptr(msgFilterMax)) + + return int(ret) +} + +func TranslateMessage(msg *MSG) bool { + ret, _, _ := procTranslateMessage.Call( + uintptr(unsafe.Pointer(msg))) + + return ret != 0 + +} + +func DispatchMessage(msg *MSG) uintptr { + ret, _, _ := procDispatchMessage.Call( + uintptr(unsafe.Pointer(msg))) + + return ret + +} + +func SendMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := procSendMessage.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam) + + return ret +} + +func SendMessageTimeout(hwnd HWND, msg uint32, wParam, lParam uintptr, fuFlags, uTimeout uint32) uintptr { + ret, _, _ := procSendMessageTimeout.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam, + uintptr(fuFlags), + uintptr(uTimeout)) + + return ret +} + +func PostMessage(hwnd HWND, msg uint32, wParam, lParam uintptr) bool { + ret, _, _ := procPostMessage.Call( + uintptr(hwnd), + uintptr(msg), + wParam, + lParam) + + return ret != 0 +} + +func WaitMessage() bool { + ret, _, _ := procWaitMessage.Call() + return ret != 0 +} + +func SetWindowText(hwnd HWND, text string) { + procSetWindowText.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text)))) +} + +func GetWindowTextLength(hwnd HWND) int { + ret, _, _ := procGetWindowTextLength.Call( + uintptr(hwnd)) + + return int(ret) +} + +func GetWindowText(hwnd HWND) string { + textLen := GetWindowTextLength(hwnd) + 1 + + buf := make([]uint16, textLen) + procGetWindowText.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(textLen)) + + return syscall.UTF16ToString(buf) +} + +func GetWindowRect(hwnd HWND) *RECT { + var rect RECT + procGetWindowRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&rect))) + + return &rect +} + +func MoveWindow(hwnd HWND, x, y, width, height int, repaint bool) bool { + ret, _, _ := procMoveWindow.Call( + uintptr(hwnd), + uintptr(x), + uintptr(y), + uintptr(width), + uintptr(height), + uintptr(BoolToBOOL(repaint))) + + return ret != 0 + +} + +func ScreenToClient(hwnd HWND, x, y int) (X, Y int, ok bool) { + pt := POINT{X: int32(x), Y: int32(y)} + ret, _, _ := procScreenToClient.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&pt))) + + return int(pt.X), int(pt.Y), ret != 0 +} + +func CallWindowProc(preWndProc uintptr, hwnd HWND, msg uint32, wParam, lParam uintptr) uintptr { + ret, _, _ := procCallWindowProc.Call( + preWndProc, + uintptr(hwnd), + uintptr(msg), + wParam, + lParam) + + return ret +} + +func SetWindowLong(hwnd HWND, index int, value uint32) uint32 { + ret, _, _ := procSetWindowLong.Call( + uintptr(hwnd), + uintptr(index), + uintptr(value)) + + return uint32(ret) +} + +func SetWindowLongPtr(hwnd HWND, index int, value uintptr) uintptr { + ret, _, _ := procSetWindowLongPtr.Call( + uintptr(hwnd), + uintptr(index), + value) + + return ret +} + +func GetWindowLong(hwnd HWND, index int) int32 { + ret, _, _ := procGetWindowLong.Call( + uintptr(hwnd), + uintptr(index)) + + return int32(ret) +} + +func GetWindowLongPtr(hwnd HWND, index int) uintptr { + ret, _, _ := procGetWindowLongPtr.Call( + uintptr(hwnd), + uintptr(index)) + + return ret +} + +func EnableWindow(hwnd HWND, b bool) bool { + ret, _, _ := procEnableWindow.Call( + uintptr(hwnd), + uintptr(BoolToBOOL(b))) + return ret != 0 +} + +func IsWindowEnabled(hwnd HWND) bool { + ret, _, _ := procIsWindowEnabled.Call( + uintptr(hwnd)) + + return ret != 0 +} + +func IsWindowVisible(hwnd HWND) bool { + ret, _, _ := procIsWindowVisible.Call( + uintptr(hwnd)) + + return ret != 0 +} + +func SetFocus(hwnd HWND) HWND { + ret, _, _ := procSetFocus.Call( + uintptr(hwnd)) + + return HWND(ret) +} + +func InvalidateRect(hwnd HWND, rect *RECT, erase bool) bool { + ret, _, _ := procInvalidateRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(rect)), + uintptr(BoolToBOOL(erase))) + + return ret != 0 +} + +func GetClientRect(hwnd HWND) *RECT { + var rect RECT + ret, _, _ := procGetClientRect.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&rect))) + + if ret == 0 { + panic(fmt.Sprintf("GetClientRect(%d) failed", hwnd)) + } + + return &rect +} + +func GetDC(hwnd HWND) HDC { + ret, _, _ := procGetDC.Call( + uintptr(hwnd)) + + return HDC(ret) +} + +func ReleaseDC(hwnd HWND, hDC HDC) bool { + ret, _, _ := procReleaseDC.Call( + uintptr(hwnd), + uintptr(hDC)) + + return ret != 0 +} + +func SetCapture(hwnd HWND) HWND { + ret, _, _ := procSetCapture.Call( + uintptr(hwnd)) + + return HWND(ret) +} + +func ReleaseCapture() bool { + ret, _, _ := procReleaseCapture.Call() + + return ret != 0 +} + +func GetWindowThreadProcessId(hwnd HWND) (HANDLE, int) { + var processId int + ret, _, _ := procGetWindowThreadProcessId.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&processId))) + + return HANDLE(ret), processId +} + +func MessageBox(hwnd HWND, title, caption string, flags uint) int { + ret, _, _ := procMessageBox.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(title))), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(caption))), + uintptr(flags)) + + return int(ret) +} + +func GetSystemMetrics(index int) int { + ret, _, _ := procGetSystemMetrics.Call( + uintptr(index)) + + return int(ret) +} + +func CopyRect(dst, src *RECT) bool { + ret, _, _ := procCopyRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src))) + + return ret != 0 +} + +func EqualRect(rect1, rect2 *RECT) bool { + ret, _, _ := procEqualRect.Call( + uintptr(unsafe.Pointer(rect1)), + uintptr(unsafe.Pointer(rect2))) + + return ret != 0 +} + +func InflateRect(rect *RECT, dx, dy int) bool { + ret, _, _ := procInflateRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(dx), + uintptr(dy)) + + return ret != 0 +} + +func IntersectRect(dst, src1, src2 *RECT) bool { + ret, _, _ := procIntersectRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src1)), + uintptr(unsafe.Pointer(src2))) + + return ret != 0 +} + +func IsRectEmpty(rect *RECT) bool { + ret, _, _ := procIsRectEmpty.Call( + uintptr(unsafe.Pointer(rect))) + + return ret != 0 +} + +func OffsetRect(rect *RECT, dx, dy int) bool { + ret, _, _ := procOffsetRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(dx), + uintptr(dy)) + + return ret != 0 +} + +func PtInRect(rect *RECT, x, y int) bool { + pt := POINT{X: int32(x), Y: int32(y)} + ret, _, _ := procPtInRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(unsafe.Pointer(&pt))) + + return ret != 0 +} + +func SetRect(rect *RECT, left, top, right, bottom int) bool { + ret, _, _ := procSetRect.Call( + uintptr(unsafe.Pointer(rect)), + uintptr(left), + uintptr(top), + uintptr(right), + uintptr(bottom)) + + return ret != 0 +} + +func SetRectEmpty(rect *RECT) bool { + ret, _, _ := procSetRectEmpty.Call( + uintptr(unsafe.Pointer(rect))) + + return ret != 0 +} + +func SubtractRect(dst, src1, src2 *RECT) bool { + ret, _, _ := procSubtractRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src1)), + uintptr(unsafe.Pointer(src2))) + + return ret != 0 +} + +func UnionRect(dst, src1, src2 *RECT) bool { + ret, _, _ := procUnionRect.Call( + uintptr(unsafe.Pointer(dst)), + uintptr(unsafe.Pointer(src1)), + uintptr(unsafe.Pointer(src2))) + + return ret != 0 +} + +func CreateDialog(hInstance HINSTANCE, lpTemplate *uint16, hWndParent HWND, lpDialogProc uintptr) HWND { + ret, _, _ := procCreateDialogParam.Call( + uintptr(hInstance), + uintptr(unsafe.Pointer(lpTemplate)), + uintptr(hWndParent), + lpDialogProc, + 0) + + return HWND(ret) +} + +func DialogBox(hInstance HINSTANCE, lpTemplateName *uint16, hWndParent HWND, lpDialogProc uintptr) int { + ret, _, _ := procDialogBoxParam.Call( + uintptr(hInstance), + uintptr(unsafe.Pointer(lpTemplateName)), + uintptr(hWndParent), + lpDialogProc, + 0) + + return int(ret) +} + +func GetDlgItem(hDlg HWND, nIDDlgItem int) HWND { + ret, _, _ := procGetDlgItem.Call( + uintptr(unsafe.Pointer(hDlg)), + uintptr(nIDDlgItem)) + + return HWND(ret) +} + +func DrawIcon(hDC HDC, x, y int, hIcon HICON) bool { + ret, _, _ := procDrawIcon.Call( + uintptr(unsafe.Pointer(hDC)), + uintptr(x), + uintptr(y), + uintptr(unsafe.Pointer(hIcon))) + + return ret != 0 +} + +func ClientToScreen(hwnd HWND, x, y int) (int, int) { + pt := POINT{X: int32(x), Y: int32(y)} + + procClientToScreen.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(&pt))) + + return int(pt.X), int(pt.Y) +} + +func IsDialogMessage(hwnd HWND, msg *MSG) bool { + ret, _, _ := procIsDialogMessage.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(msg))) + + return ret != 0 +} + +func IsWindow(hwnd HWND) bool { + ret, _, _ := procIsWindow.Call( + uintptr(hwnd)) + + return ret != 0 +} + +func EndDialog(hwnd HWND, nResult uintptr) bool { + ret, _, _ := procEndDialog.Call( + uintptr(hwnd), + nResult) + + return ret != 0 +} + +func PeekMessage(lpMsg *MSG, hwnd HWND, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) bool { + ret, _, _ := procPeekMessage.Call( + uintptr(unsafe.Pointer(lpMsg)), + uintptr(hwnd), + uintptr(wMsgFilterMin), + uintptr(wMsgFilterMax), + uintptr(wRemoveMsg)) + + return ret != 0 +} + +func TranslateAccelerator(hwnd HWND, hAccTable HACCEL, lpMsg *MSG) bool { + ret, _, _ := procTranslateAccelerator.Call( + uintptr(hwnd), + uintptr(hAccTable), + uintptr(unsafe.Pointer(lpMsg))) + + return ret != 0 +} + +func SetWindowPos(hwnd, hWndInsertAfter HWND, x, y, cx, cy int, uFlags uint) bool { + ret, _, _ := procSetWindowPos.Call( + uintptr(hwnd), + uintptr(hWndInsertAfter), + uintptr(x), + uintptr(y), + uintptr(cx), + uintptr(cy), + uintptr(uFlags)) + + return ret != 0 +} + +func FillRect(hDC HDC, lprc *RECT, hbr HBRUSH) bool { + ret, _, _ := procFillRect.Call( + uintptr(hDC), + uintptr(unsafe.Pointer(lprc)), + uintptr(hbr)) + + return ret != 0 +} + +func DrawText(hDC HDC, text string, uCount int, lpRect *RECT, uFormat uint) int { + ret, _, _ := procDrawText.Call( + uintptr(hDC), + uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(text))), + uintptr(uCount), + uintptr(unsafe.Pointer(lpRect)), + uintptr(uFormat)) + + return int(ret) +} + +func AddClipboardFormatListener(hwnd HWND) bool { + ret, _, _ := procAddClipboardFormatListener.Call( + uintptr(hwnd)) + return ret != 0 +} + +func RemoveClipboardFormatListener(hwnd HWND) bool { + ret, _, _ := procRemoveClipboardFormatListener.Call( + uintptr(hwnd)) + return ret != 0 +} + +func OpenClipboard(hWndNewOwner HWND) bool { + ret, _, _ := procOpenClipboard.Call( + uintptr(hWndNewOwner)) + return ret != 0 +} + +func CloseClipboard() bool { + ret, _, _ := procCloseClipboard.Call() + return ret != 0 +} + +func EnumClipboardFormats(format uint) uint { + ret, _, _ := procEnumClipboardFormats.Call( + uintptr(format)) + return uint(ret) +} + +func GetClipboardData(uFormat uint) HANDLE { + ret, _, _ := procGetClipboardData.Call( + uintptr(uFormat)) + return HANDLE(ret) +} + +func SetClipboardData(uFormat uint, hMem HANDLE) HANDLE { + ret, _, _ := procSetClipboardData.Call( + uintptr(uFormat), + uintptr(hMem)) + return HANDLE(ret) +} + +func EmptyClipboard() bool { + ret, _, _ := procEmptyClipboard.Call() + return ret != 0 +} + +func GetClipboardFormatName(format uint) (string, bool) { + cchMaxCount := 255 + buf := make([]uint16, cchMaxCount) + ret, _, _ := procGetClipboardFormatName.Call( + uintptr(format), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(cchMaxCount)) + + if ret > 0 { + return syscall.UTF16ToString(buf), true + } + + return "Requested format does not exist or is predefined", false +} + +func IsClipboardFormatAvailable(format uint) bool { + ret, _, _ := procIsClipboardFormatAvailable.Call(uintptr(format)) + return ret != 0 +} + +func BeginPaint(hwnd HWND, paint *PAINTSTRUCT) HDC { + ret, _, _ := procBeginPaint.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(paint))) + return HDC(ret) +} + +func EndPaint(hwnd HWND, paint *PAINTSTRUCT) { + procEndPaint.Call( + uintptr(hwnd), + uintptr(unsafe.Pointer(paint))) +} + +func GetKeyboardState(lpKeyState *[]byte) bool { + ret, _, _ := procGetKeyboardState.Call( + uintptr(unsafe.Pointer(&(*lpKeyState)[0]))) + return ret != 0 +} + +func MapVirtualKeyEx(uCode, uMapType uint, dwhkl HKL) uint { + ret, _, _ := procMapVirtualKey.Call( + uintptr(uCode), + uintptr(uMapType), + uintptr(dwhkl)) + return uint(ret) +} + +func GetAsyncKeyState(vKey int) uint16 { + ret, _, _ := procGetAsyncKeyState.Call(uintptr(vKey)) + return uint16(ret) +} + +func ToAscii(uVirtKey, uScanCode uint, lpKeyState *byte, lpChar *uint16, uFlags uint) int { + ret, _, _ := procToAscii.Call( + uintptr(uVirtKey), + uintptr(uScanCode), + uintptr(unsafe.Pointer(lpKeyState)), + uintptr(unsafe.Pointer(lpChar)), + uintptr(uFlags)) + return int(ret) +} + +func SwapMouseButton(fSwap bool) bool { + ret, _, _ := procSwapMouseButton.Call( + uintptr(BoolToBOOL(fSwap))) + return ret != 0 +} + +func GetCursorPos() (x, y int, ok bool) { + pt := POINT{} + ret, _, _ := procGetCursorPos.Call(uintptr(unsafe.Pointer(&pt))) + return int(pt.X), int(pt.Y), ret != 0 +} + +func SetCursorPos(x, y int) bool { + ret, _, _ := procSetCursorPos.Call( + uintptr(x), + uintptr(y), + ) + return ret != 0 +} + +func SetCursor(cursor HCURSOR) HCURSOR { + ret, _, _ := procSetCursor.Call( + uintptr(cursor), + ) + return HCURSOR(ret) +} + +func CreateIcon(instance HINSTANCE, nWidth, nHeight int, cPlanes, cBitsPerPixel byte, ANDbits, XORbits *byte) HICON { + ret, _, _ := procCreateIcon.Call( + uintptr(instance), + uintptr(nWidth), + uintptr(nHeight), + uintptr(cPlanes), + uintptr(cBitsPerPixel), + uintptr(unsafe.Pointer(ANDbits)), + uintptr(unsafe.Pointer(XORbits)), + ) + return HICON(ret) +} + +func DestroyIcon(icon HICON) bool { + ret, _, _ := procDestroyIcon.Call( + uintptr(icon), + ) + return ret != 0 +} + +func MonitorFromPoint(x, y int, dwFlags uint32) HMONITOR { + ret, _, _ := procMonitorFromPoint.Call( + uintptr(x), + uintptr(y), + uintptr(dwFlags), + ) + return HMONITOR(ret) +} + +func MonitorFromRect(rc *RECT, dwFlags uint32) HMONITOR { + ret, _, _ := procMonitorFromRect.Call( + uintptr(unsafe.Pointer(rc)), + uintptr(dwFlags), + ) + return HMONITOR(ret) +} + +func MonitorFromWindow(hwnd HWND, dwFlags uint32) HMONITOR { + ret, _, _ := procMonitorFromWindow.Call( + uintptr(hwnd), + uintptr(dwFlags), + ) + return HMONITOR(ret) +} + +func GetMonitorInfo(hMonitor HMONITOR, lmpi *MONITORINFO) bool { + ret, _, _ := procGetMonitorInfo.Call( + uintptr(hMonitor), + uintptr(unsafe.Pointer(lmpi)), + ) + return ret != 0 +} + +func EnumDisplayMonitors(hdc HDC, clip *RECT, fnEnum, dwData uintptr) bool { + ret, _, _ := procEnumDisplayMonitors.Call( + uintptr(hdc), + uintptr(unsafe.Pointer(clip)), + fnEnum, + dwData, + ) + return ret != 0 +} + +func EnumDisplaySettingsEx(szDeviceName *uint16, iModeNum uint32, devMode *DEVMODE, dwFlags uint32) bool { + ret, _, _ := procEnumDisplaySettingsEx.Call( + uintptr(unsafe.Pointer(szDeviceName)), + uintptr(iModeNum), + uintptr(unsafe.Pointer(devMode)), + uintptr(dwFlags), + ) + return ret != 0 +} + +func ChangeDisplaySettingsEx(szDeviceName *uint16, devMode *DEVMODE, hwnd HWND, dwFlags uint32, lParam uintptr) int32 { + ret, _, _ := procChangeDisplaySettingsEx.Call( + uintptr(unsafe.Pointer(szDeviceName)), + uintptr(unsafe.Pointer(devMode)), + uintptr(hwnd), + uintptr(dwFlags), + lParam, + ) + return int32(ret) +} + +func SetWindowsHookEx(idHook int, lpfn HOOKPROC, hMod HINSTANCE, dwThreadId DWORD) HHOOK { + ret, _, _ := procSetWindowsHookEx.Call( + uintptr(idHook), + uintptr(syscall.NewCallback(lpfn)), + uintptr(hMod), + uintptr(dwThreadId), + ) + return HHOOK(ret) +} + +func UnhookWindowsHookEx(hhk HHOOK) bool { + ret, _, _ := procUnhookWindowsHookEx.Call( + uintptr(hhk), + ) + return ret != 0 +} + +func CallNextHookEx(hhk HHOOK, nCode int, wParam WPARAM, lParam LPARAM) LRESULT { + ret, _, _ := procCallNextHookEx.Call( + uintptr(hhk), + uintptr(nCode), + uintptr(wParam), + uintptr(lParam), + ) + return LRESULT(ret) +} + +func SetTimer(hwnd HWND, nIDEvent uint32, uElapse uint32, lpTimerProc uintptr) uintptr { + ret, _, _ := procSetTimer.Call( + uintptr(hwnd), + uintptr(nIDEvent), + uintptr(uElapse), + lpTimerProc, + ) + return ret +} + +func KillTimer(hwnd HWND, nIDEvent uint32) bool { + ret, _, _ := procKillTimer.Call( + uintptr(hwnd), + uintptr(nIDEvent), + ) + return ret != 0 +} + +// it will panic when the function fails +func RedrawWindow(hWnd HWND, lpRect *RECT, hrgnUpdate HRGN, flag uint32) { + ret, _, _ := procRedrawWindow.Call( + uintptr(hWnd), + uintptr(unsafe.Pointer(lpRect)), + uintptr(hrgnUpdate), + uintptr(flag), + ) + if ret!=0{ + panic("RedrawWindow fail") + } + return +} \ No newline at end of file diff --git a/vendor/github.com/apenwarr/w32/utils.go b/vendor/github.com/apenwarr/w32/utils.go new file mode 100644 index 000000000..4fb5b6c2c --- /dev/null +++ b/vendor/github.com/apenwarr/w32/utils.go @@ -0,0 +1,201 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +import ( + "syscall" + "unicode/utf16" + "unsafe" +) + +func MakeIntResource(id uint16) *uint16 { + return (*uint16)(unsafe.Pointer(uintptr(id))) +} + +func LOWORD(dw uint32) uint16 { + return uint16(dw) +} + +func HIWORD(dw uint32) uint16 { + return uint16(dw >> 16 & 0xffff) +} + +func BoolToBOOL(value bool) BOOL { + if value { + return 1 + } + + return 0 +} + +func UTF16PtrToString(cstr *uint16) string { + if cstr != nil { + us := make([]uint16, 0, 256) + for p := uintptr(unsafe.Pointer(cstr)); ; p += 2 { + u := *(*uint16)(unsafe.Pointer(p)) + if u == 0 { + return string(utf16.Decode(us)) + } + us = append(us, u) + } + } + + return "" +} + +func ComAddRef(unknown *IUnknown) int32 { + ret, _, _ := syscall.Syscall(unknown.lpVtbl.pAddRef, 1, + uintptr(unsafe.Pointer(unknown)), + 0, + 0) + return int32(ret) +} + +func ComRelease(unknown *IUnknown) int32 { + ret, _, _ := syscall.Syscall(unknown.lpVtbl.pRelease, 1, + uintptr(unsafe.Pointer(unknown)), + 0, + 0) + return int32(ret) +} + +func ComQueryInterface(unknown *IUnknown, id *GUID) *IDispatch { + var disp *IDispatch + hr, _, _ := syscall.Syscall(unknown.lpVtbl.pQueryInterface, 3, + uintptr(unsafe.Pointer(unknown)), + uintptr(unsafe.Pointer(id)), + uintptr(unsafe.Pointer(&disp))) + if hr != 0 { + panic("Invoke QieryInterface error.") + } + return disp +} + +func ComGetIDsOfName(disp *IDispatch, names []string) []int32 { + wnames := make([]*uint16, len(names)) + dispid := make([]int32, len(names)) + for i := 0; i < len(names); i++ { + wnames[i] = syscall.StringToUTF16Ptr(names[i]) + } + hr, _, _ := syscall.Syscall6(disp.lpVtbl.pGetIDsOfNames, 6, + uintptr(unsafe.Pointer(disp)), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(unsafe.Pointer(&wnames[0])), + uintptr(len(names)), + uintptr(GetUserDefaultLCID()), + uintptr(unsafe.Pointer(&dispid[0]))) + if hr != 0 { + panic("Invoke GetIDsOfName error.") + } + return dispid +} + +func ComInvoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT) { + var dispparams DISPPARAMS + + if dispatch&DISPATCH_PROPERTYPUT != 0 { + dispnames := [1]int32{DISPID_PROPERTYPUT} + dispparams.RgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) + dispparams.CNamedArgs = 1 + } + var vargs []VARIANT + if len(params) > 0 { + vargs = make([]VARIANT, len(params)) + for i, v := range params { + //n := len(params)-i-1 + n := len(params) - i - 1 + VariantInit(&vargs[n]) + switch v.(type) { + case bool: + if v.(bool) { + vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0xffff} + } else { + vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0} + } + case *bool: + vargs[n] = VARIANT{VT_BOOL | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*bool))))} + case byte: + vargs[n] = VARIANT{VT_I1, 0, 0, 0, int64(v.(byte))} + case *byte: + vargs[n] = VARIANT{VT_I1 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*byte))))} + case int16: + vargs[n] = VARIANT{VT_I2, 0, 0, 0, int64(v.(int16))} + case *int16: + vargs[n] = VARIANT{VT_I2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int16))))} + case uint16: + vargs[n] = VARIANT{VT_UI2, 0, 0, 0, int64(v.(int16))} + case *uint16: + vargs[n] = VARIANT{VT_UI2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint16))))} + case int, int32: + vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(int))} + case *int, *int32: + vargs[n] = VARIANT{VT_I4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int))))} + case uint, uint32: + vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(uint))} + case *uint, *uint32: + vargs[n] = VARIANT{VT_UI4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint))))} + case int64: + vargs[n] = VARIANT{VT_I8, 0, 0, 0, v.(int64)} + case *int64: + vargs[n] = VARIANT{VT_I8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int64))))} + case uint64: + vargs[n] = VARIANT{VT_UI8, 0, 0, 0, int64(v.(uint64))} + case *uint64: + vargs[n] = VARIANT{VT_UI8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint64))))} + case float32: + vargs[n] = VARIANT{VT_R4, 0, 0, 0, int64(v.(float32))} + case *float32: + vargs[n] = VARIANT{VT_R4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float32))))} + case float64: + vargs[n] = VARIANT{VT_R8, 0, 0, 0, int64(v.(float64))} + case *float64: + vargs[n] = VARIANT{VT_R8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float64))))} + case string: + vargs[n] = VARIANT{VT_BSTR, 0, 0, 0, int64(uintptr(unsafe.Pointer(SysAllocString(v.(string)))))} + case *string: + vargs[n] = VARIANT{VT_BSTR | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*string))))} + case *IDispatch: + vargs[n] = VARIANT{VT_DISPATCH, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))} + case **IDispatch: + vargs[n] = VARIANT{VT_DISPATCH | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))} + case nil: + vargs[n] = VARIANT{VT_NULL, 0, 0, 0, 0} + case *VARIANT: + vargs[n] = VARIANT{VT_VARIANT | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))} + default: + panic("unknown type") + } + } + dispparams.Rgvarg = uintptr(unsafe.Pointer(&vargs[0])) + dispparams.CArgs = uint32(len(params)) + } + + var ret VARIANT + var excepInfo EXCEPINFO + VariantInit(&ret) + hr, _, _ := syscall.Syscall9(disp.lpVtbl.pInvoke, 8, + uintptr(unsafe.Pointer(disp)), + uintptr(dispid), + uintptr(unsafe.Pointer(IID_NULL)), + uintptr(GetUserDefaultLCID()), + uintptr(dispatch), + uintptr(unsafe.Pointer(&dispparams)), + uintptr(unsafe.Pointer(&ret)), + uintptr(unsafe.Pointer(&excepInfo)), + 0) + if hr != 0 { + if excepInfo.BstrDescription != nil { + bs := UTF16PtrToString(excepInfo.BstrDescription) + panic(bs) + } + } + for _, varg := range vargs { + if varg.VT == VT_BSTR && varg.Val != 0 { + SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val))))) + } + } + result = &ret + return +} diff --git a/vendor/github.com/apenwarr/w32/vars.go b/vendor/github.com/apenwarr/w32/vars.go new file mode 100644 index 000000000..2dab2e396 --- /dev/null +++ b/vendor/github.com/apenwarr/w32/vars.go @@ -0,0 +1,13 @@ +// Copyright 2010-2012 The W32 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package w32 + +var ( + IID_NULL = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}} + IID_IUnknown = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}} + IID_IDispatch = &GUID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}} + IID_IConnectionPointContainer = &GUID{0xB196B284, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}} + IID_IConnectionPoint = &GUID{0xB196B286, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}} +) diff --git a/vendor/github.com/go-chi/chi/v5/.gitignore b/vendor/github.com/go-chi/chi/v5/.gitignore new file mode 100644 index 000000000..ba22c99a9 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/.gitignore @@ -0,0 +1,3 @@ +.idea +*.sw? +.vscode diff --git a/vendor/github.com/go-chi/chi/v5/CHANGELOG.md b/vendor/github.com/go-chi/chi/v5/CHANGELOG.md new file mode 100644 index 000000000..ed54ae9d6 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/CHANGELOG.md @@ -0,0 +1,279 @@ +# Changelog + +## v5.0.0 (2021-02-27) + +- chi v5, `github.com/go-chi/chi/v5` introduces the adoption of Go's SIV to adhere to the current state-of-the-tools in Go. +- chi v1.5.x did not work out as planned, as the Go tooling is too powerful and chi's adoption is too wide. + The most responsible thing to do for everyone's benefit is to just release v5 with SIV, so I present to you all, + chi v5 at `github.com/go-chi/chi/v5`. I hope someday the developer experience and ergonomics I've been seeking + will still come to fruition in some form, see https://github.com/golang/go/issues/44550 +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.4...v5.0.0 + + +## v1.5.4 (2021-02-27) + +- Undo prior retraction in v1.5.3 as we prepare for v5.0.0 release +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.3...v1.5.4 + + +## v1.5.3 (2021-02-21) + +- Update go.mod to go 1.16 with new retract directive marking all versions without prior go.mod support +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.2...v1.5.3 + + +## v1.5.2 (2021-02-10) + +- Reverting allocation optimization as a precaution as go test -race fails. +- Minor improvements, see history below +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.1...v1.5.2 + + +## v1.5.1 (2020-12-06) + +- Performance improvement: removing 1 allocation by foregoing context.WithValue, thank you @bouk for + your contribution (https://github.com/go-chi/chi/pull/555). Note: new benchmarks posted in README. +- `middleware.CleanPath`: new middleware that clean's request path of double slashes +- deprecate & remove `chi.ServerBaseContext` in favour of stdlib `http.Server#BaseContext` +- plus other tiny improvements, see full commit history below +- History of changes: see https://github.com/go-chi/chi/compare/v4.1.2...v1.5.1 + + +## v1.5.0 (2020-11-12) - now with go.mod support + +`chi` dates back to 2016 with it's original implementation as one of the first routers to adopt the newly introduced +context.Context api to the stdlib -- set out to design a router that is faster, more modular and simpler than anything +else out there -- while not introducing any custom handler types or dependencies. Today, `chi` still has zero dependencies, +and in many ways is future proofed from changes, given it's minimal nature. Between versions, chi's iterations have been very +incremental, with the architecture and api being the same today as it was originally designed in 2016. For this reason it +makes chi a pretty easy project to maintain, as well thanks to the many amazing community contributions over the years +to who all help make chi better (total of 86 contributors to date -- thanks all!). + +Chi has been an labour of love, art and engineering, with the goals to offer beautiful ergonomics, flexibility, performance +and simplicity when building HTTP services with Go. I've strived to keep the router very minimal in surface area / code size, +and always improving the code wherever possible -- and as of today the `chi` package is just 1082 lines of code (not counting +middlewares, which are all optional). As well, I don't have the exact metrics, but from my analysis and email exchanges from +companies and developers, chi is used by thousands of projects around the world -- thank you all as there is no better form of +joy for me than to have art I had started be helpful and enjoyed by others. And of course I use chi in all of my own projects too :) + +For me, the asthetics of chi's code and usage are very important. With the introduction of Go's module support +(which I'm a big fan of), chi's past versioning scheme choice to v2, v3 and v4 would mean I'd require the import path +of "github.com/go-chi/chi/v4", leading to the lengthy discussion at https://github.com/go-chi/chi/issues/462. +Haha, to some, you may be scratching your head why I've spent > 1 year stalling to adopt "/vXX" convention in the import +path -- which isn't horrible in general -- but for chi, I'm unable to accept it as I strive for perfection in it's API design, +aesthetics and simplicity. It just doesn't feel good to me given chi's simple nature -- I do not foresee a "v5" or "v6", +and upgrading between versions in the future will also be just incremental. + +I do understand versioning is a part of the API design as well, which is why the solution for a while has been to "do nothing", +as Go supports both old and new import paths with/out go.mod. However, now that Go module support has had time to iron out kinks and +is adopted everywhere, it's time for chi to get with the times. Luckily, I've discovered a path forward that will make me happy, +while also not breaking anyone's app who adopted a prior versioning from tags in v2/v3/v4. I've made an experimental release of +v1.5.0 with go.mod silently, and tested it with new and old projects, to ensure the developer experience is preserved, and it's +largely unnoticed. Fortunately, Go's toolchain will check the tags of a repo and consider the "latest" tag the one with go.mod. +However, you can still request a specific older tag such as v4.1.2, and everything will "just work". But new users can just +`go get github.com/go-chi/chi` or `go get github.com/go-chi/chi@latest` and they will get the latest version which contains +go.mod support, which is v1.5.0+. `chi` will not change very much over the years, just like it hasn't changed much from 4 years ago. +Therefore, we will stay on v1.x from here on, starting from v1.5.0. Any breaking changes will bump a "minor" release and +backwards-compatible improvements/fixes will bump a "tiny" release. + +For existing projects who want to upgrade to the latest go.mod version, run: `go get -u github.com/go-chi/chi@v1.5.0`, +which will get you on the go.mod version line (as Go's mod cache may still remember v4.x). Brand new systems can run +`go get -u github.com/go-chi/chi` or `go get -u github.com/go-chi/chi@latest` to install chi, which will install v1.5.0+ +built with go.mod support. + +My apologies to the developers who will disagree with the decisions above, but, hope you'll try it and see it's a very +minor request which is backwards compatible and won't break your existing installations. + +Cheers all, happy coding! + + +--- + + +## v4.1.2 (2020-06-02) + +- fix that handles MethodNotAllowed with path variables, thank you @caseyhadden for your contribution +- fix to replace nested wildcards correctly in RoutePattern, thank you @@unmultimedio for your contribution +- History of changes: see https://github.com/go-chi/chi/compare/v4.1.1...v4.1.2 + + +## v4.1.1 (2020-04-16) + +- fix for issue https://github.com/go-chi/chi/issues/411 which allows for overlapping regexp + route to the correct handler through a recursive tree search, thanks to @Jahaja for the PR/fix! +- new middleware.RouteHeaders as a simple router for request headers with wildcard support +- History of changes: see https://github.com/go-chi/chi/compare/v4.1.0...v4.1.1 + + +## v4.1.0 (2020-04-1) + +- middleware.LogEntry: Write method on interface now passes the response header + and an extra interface type useful for custom logger implementations. +- middleware.WrapResponseWriter: minor fix +- middleware.Recoverer: a bit prettier +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.4...v4.1.0 + +## v4.0.4 (2020-03-24) + +- middleware.Recoverer: new pretty stack trace printing (https://github.com/go-chi/chi/pull/496) +- a few minor improvements and fixes +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.3...v4.0.4 + + +## v4.0.3 (2020-01-09) + +- core: fix regexp routing to include default value when param is not matched +- middleware: rewrite of middleware.Compress +- middleware: suppress http.ErrAbortHandler in middleware.Recoverer +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.2...v4.0.3 + + +## v4.0.2 (2019-02-26) + +- Minor fixes +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.1...v4.0.2 + + +## v4.0.1 (2019-01-21) + +- Fixes issue with compress middleware: #382 #385 +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.0...v4.0.1 + + +## v4.0.0 (2019-01-10) + +- chi v4 requires Go 1.10.3+ (or Go 1.9.7+) - we have deprecated support for Go 1.7 and 1.8 +- router: respond with 404 on router with no routes (#362) +- router: additional check to ensure wildcard is at the end of a url pattern (#333) +- middleware: deprecate use of http.CloseNotifier (#347) +- middleware: fix RedirectSlashes to include query params on redirect (#334) +- History of changes: see https://github.com/go-chi/chi/compare/v3.3.4...v4.0.0 + + +## v3.3.4 (2019-01-07) + +- Minor middleware improvements. No changes to core library/router. Moving v3 into its +- own branch as a version of chi for Go 1.7, 1.8, 1.9, 1.10, 1.11 +- History of changes: see https://github.com/go-chi/chi/compare/v3.3.3...v3.3.4 + + +## v3.3.3 (2018-08-27) + +- Minor release +- See https://github.com/go-chi/chi/compare/v3.3.2...v3.3.3 + + +## v3.3.2 (2017-12-22) + +- Support to route trailing slashes on mounted sub-routers (#281) +- middleware: new `ContentCharset` to check matching charsets. Thank you + @csucu for your community contribution! + + +## v3.3.1 (2017-11-20) + +- middleware: new `AllowContentType` handler for explicit whitelist of accepted request Content-Types +- middleware: new `SetHeader` handler for short-hand middleware to set a response header key/value +- Minor bug fixes + + +## v3.3.0 (2017-10-10) + +- New chi.RegisterMethod(method) to add support for custom HTTP methods, see _examples/custom-method for usage +- Deprecated LINK and UNLINK methods from the default list, please use `chi.RegisterMethod("LINK")` and `chi.RegisterMethod("UNLINK")` in an `init()` function + + +## v3.2.1 (2017-08-31) + +- Add new `Match(rctx *Context, method, path string) bool` method to `Routes` interface + and `Mux`. Match searches the mux's routing tree for a handler that matches the method/path +- Add new `RouteMethod` to `*Context` +- Add new `Routes` pointer to `*Context` +- Add new `middleware.GetHead` to route missing HEAD requests to GET handler +- Updated benchmarks (see README) + + +## v3.1.5 (2017-08-02) + +- Setup golint and go vet for the project +- As per golint, we've redefined `func ServerBaseContext(h http.Handler, baseCtx context.Context) http.Handler` + to `func ServerBaseContext(baseCtx context.Context, h http.Handler) http.Handler` + + +## v3.1.0 (2017-07-10) + +- Fix a few minor issues after v3 release +- Move `docgen` sub-pkg to https://github.com/go-chi/docgen +- Move `render` sub-pkg to https://github.com/go-chi/render +- Add new `URLFormat` handler to chi/middleware sub-pkg to make working with url mime + suffixes easier, ie. parsing `/articles/1.json` and `/articles/1.xml`. See comments in + https://github.com/go-chi/chi/blob/master/middleware/url_format.go for example usage. + + +## v3.0.0 (2017-06-21) + +- Major update to chi library with many exciting updates, but also some *breaking changes* +- URL parameter syntax changed from `/:id` to `/{id}` for even more flexible routing, such as + `/articles/{month}-{day}-{year}-{slug}`, `/articles/{id}`, and `/articles/{id}.{ext}` on the + same router +- Support for regexp for routing patterns, in the form of `/{paramKey:regExp}` for example: + `r.Get("/articles/{name:[a-z]+}", h)` and `chi.URLParam(r, "name")` +- Add `Method` and `MethodFunc` to `chi.Router` to allow routing definitions such as + `r.Method("GET", "/", h)` which provides a cleaner interface for custom handlers like + in `_examples/custom-handler` +- Deprecating `mux#FileServer` helper function. Instead, we encourage users to create their + own using file handler with the stdlib, see `_examples/fileserver` for an example +- Add support for LINK/UNLINK http methods via `r.Method()` and `r.MethodFunc()` +- Moved the chi project to its own organization, to allow chi-related community packages to + be easily discovered and supported, at: https://github.com/go-chi +- *NOTE:* please update your import paths to `"github.com/go-chi/chi"` +- *NOTE:* chi v2 is still available at https://github.com/go-chi/chi/tree/v2 + + +## v2.1.0 (2017-03-30) + +- Minor improvements and update to the chi core library +- Introduced a brand new `chi/render` sub-package to complete the story of building + APIs to offer a pattern for managing well-defined request / response payloads. Please + check out the updated `_examples/rest` example for how it works. +- Added `MethodNotAllowed(h http.HandlerFunc)` to chi.Router interface + + +## v2.0.0 (2017-01-06) + +- After many months of v2 being in an RC state with many companies and users running it in + production, the inclusion of some improvements to the middlewares, we are very pleased to + announce v2.0.0 of chi. + + +## v2.0.0-rc1 (2016-07-26) + +- Huge update! chi v2 is a large refactor targetting Go 1.7+. As of Go 1.7, the popular + community `"net/context"` package has been included in the standard library as `"context"` and + utilized by `"net/http"` and `http.Request` to managing deadlines, cancelation signals and other + request-scoped values. We're very excited about the new context addition and are proud to + introduce chi v2, a minimal and powerful routing package for building large HTTP services, + with zero external dependencies. Chi focuses on idiomatic design and encourages the use of + stdlib HTTP handlers and middlwares. +- chi v2 deprecates its `chi.Handler` interface and requires `http.Handler` or `http.HandlerFunc` +- chi v2 stores URL routing parameters and patterns in the standard request context: `r.Context()` +- chi v2 lower-level routing context is accessible by `chi.RouteContext(r.Context()) *chi.Context`, + which provides direct access to URL routing parameters, the routing path and the matching + routing patterns. +- Users upgrading from chi v1 to v2, need to: + 1. Update the old chi.Handler signature, `func(ctx context.Context, w http.ResponseWriter, r *http.Request)` to + the standard http.Handler: `func(w http.ResponseWriter, r *http.Request)` + 2. Use `chi.URLParam(r *http.Request, paramKey string) string` + or `URLParamFromCtx(ctx context.Context, paramKey string) string` to access a url parameter value + + +## v1.0.0 (2016-07-01) + +- Released chi v1 stable https://github.com/go-chi/chi/tree/v1.0.0 for Go 1.6 and older. + + +## v0.9.0 (2016-03-31) + +- Reuse context objects via sync.Pool for zero-allocation routing [#33](https://github.com/go-chi/chi/pull/33) +- BREAKING NOTE: due to subtle API changes, previously `chi.URLParams(ctx)["id"]` used to access url parameters + has changed to: `chi.URLParam(ctx, "id")` diff --git a/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md b/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md new file mode 100644 index 000000000..c0ac2dfe8 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing + +## Prerequisites + +1. [Install Go][go-install]. +2. Download the sources and switch the working directory: + + ```bash + go get -u -d github.com/go-chi/chi + cd $GOPATH/src/github.com/go-chi/chi + ``` + +## Submitting a Pull Request + +A typical workflow is: + +1. [Fork the repository.][fork] [This tip maybe also helpful.][go-fork-tip] +2. [Create a topic branch.][branch] +3. Add tests for your change. +4. Run `go test`. If your tests pass, return to the step 3. +5. Implement the change and ensure the steps from the previous step pass. +6. Run `goimports -w .`, to ensure the new code conforms to Go formatting guideline. +7. [Add, commit and push your changes.][git-help] +8. [Submit a pull request.][pull-req] + +[go-install]: https://golang.org/doc/install +[go-fork-tip]: http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html +[fork]: https://help.github.com/articles/fork-a-repo +[branch]: http://learn.github.com/p/branching.html +[git-help]: https://guides.github.com +[pull-req]: https://help.github.com/articles/using-pull-requests diff --git a/vendor/github.com/go-chi/chi/v5/LICENSE b/vendor/github.com/go-chi/chi/v5/LICENSE new file mode 100644 index 000000000..d99f02ffa --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/go-chi/chi/v5/Makefile b/vendor/github.com/go-chi/chi/v5/Makefile new file mode 100644 index 000000000..b96c92dd2 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/Makefile @@ -0,0 +1,14 @@ +all: + @echo "**********************************************************" + @echo "** chi build tool **" + @echo "**********************************************************" + + +test: + go clean -testcache && $(MAKE) test-router && $(MAKE) test-middleware + +test-router: + go test -race -v . + +test-middleware: + go test -race -v ./middleware diff --git a/vendor/github.com/go-chi/chi/v5/README.md b/vendor/github.com/go-chi/chi/v5/README.md new file mode 100644 index 000000000..55416e15e --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/README.md @@ -0,0 +1,511 @@ +# chi + + +[![GoDoc Widget]][GoDoc] [![Travis Widget]][Travis] + +`chi` is a lightweight, idiomatic and composable router for building Go HTTP services. It's +especially good at helping you write large REST API services that are kept maintainable as your +project grows and changes. `chi` is built on the new `context` package introduced in Go 1.7 to +handle signaling, cancelation and request-scoped values across a handler chain. + +The focus of the project has been to seek out an elegant and comfortable design for writing +REST API servers, written during the development of the Pressly API service that powers our +public API service, which in turn powers all of our client-side applications. + +The key considerations of chi's design are: project structure, maintainability, standard http +handlers (stdlib-only), developer productivity, and deconstructing a large system into many small +parts. The core router `github.com/go-chi/chi` is quite small (less than 1000 LOC), but we've also +included some useful/optional subpackages: [middleware](/middleware), [render](https://github.com/go-chi/render) +and [docgen](https://github.com/go-chi/docgen). We hope you enjoy it too! + +## Install + +`go get -u github.com/go-chi/chi/v5` + + +## Features + +* **Lightweight** - cloc'd in ~1000 LOC for the chi router +* **Fast** - yes, see [benchmarks](#benchmarks) +* **100% compatible with net/http** - use any http or middleware pkg in the ecosystem that is also compatible with `net/http` +* **Designed for modular/composable APIs** - middlewares, inline middlewares, route groups and sub-router mounting +* **Context control** - built on new `context` package, providing value chaining, cancellations and timeouts +* **Robust** - in production at Pressly, CloudFlare, Heroku, 99Designs, and many others (see [discussion](https://github.com/go-chi/chi/issues/91)) +* **Doc generation** - `docgen` auto-generates routing documentation from your source to JSON or Markdown +* **Go.mod support** - v1.x of chi (starting from v1.5.0), now has go.mod support (see [CHANGELOG](https://github.com/go-chi/chi/blob/master/CHANGELOG.md#v150-2020-11-12---now-with-gomod-support)) +* **No external dependencies** - plain ol' Go stdlib + net/http + + +## Examples + +See [_examples/](https://github.com/go-chi/chi/blob/master/_examples/) for a variety of examples. + + +**As easy as:** + +```go +package main + +import ( + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + r := chi.NewRouter() + r.Use(middleware.Logger) + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("welcome")) + }) + http.ListenAndServe(":3000", r) +} +``` + +**REST Preview:** + +Here is a little preview of how routing looks like with chi. Also take a look at the generated routing docs +in JSON ([routes.json](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.json)) and in +Markdown ([routes.md](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.md)). + +I highly recommend reading the source of the [examples](https://github.com/go-chi/chi/blob/master/_examples/) listed +above, they will show you all the features of chi and serve as a good form of documentation. + +```go +import ( + //... + "context" + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + r := chi.NewRouter() + + // A good base middleware stack + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + + // Set a timeout value on the request context (ctx), that will signal + // through ctx.Done() that the request has timed out and further + // processing should be stopped. + r.Use(middleware.Timeout(60 * time.Second)) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("hi")) + }) + + // RESTy routes for "articles" resource + r.Route("/articles", func(r chi.Router) { + r.With(paginate).Get("/", listArticles) // GET /articles + r.With(paginate).Get("/{month}-{day}-{year}", listArticlesByDate) // GET /articles/01-16-2017 + + r.Post("/", createArticle) // POST /articles + r.Get("/search", searchArticles) // GET /articles/search + + // Regexp url parameters: + r.Get("/{articleSlug:[a-z-]+}", getArticleBySlug) // GET /articles/home-is-toronto + + // Subrouters: + r.Route("/{articleID}", func(r chi.Router) { + r.Use(ArticleCtx) + r.Get("/", getArticle) // GET /articles/123 + r.Put("/", updateArticle) // PUT /articles/123 + r.Delete("/", deleteArticle) // DELETE /articles/123 + }) + }) + + // Mount the admin sub-router + r.Mount("/admin", adminRouter()) + + http.ListenAndServe(":3333", r) +} + +func ArticleCtx(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + articleID := chi.URLParam(r, "articleID") + article, err := dbGetArticle(articleID) + if err != nil { + http.Error(w, http.StatusText(404), 404) + return + } + ctx := context.WithValue(r.Context(), "article", article) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} + +func getArticle(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + article, ok := ctx.Value("article").(*Article) + if !ok { + http.Error(w, http.StatusText(422), 422) + return + } + w.Write([]byte(fmt.Sprintf("title:%s", article.Title))) +} + +// A completely separate router for administrator routes +func adminRouter() http.Handler { + r := chi.NewRouter() + r.Use(AdminOnly) + r.Get("/", adminIndex) + r.Get("/accounts", adminListAccounts) + return r +} + +func AdminOnly(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + perm, ok := ctx.Value("acl.permission").(YourPermissionType) + if !ok || !perm.IsAdmin() { + http.Error(w, http.StatusText(403), 403) + return + } + next.ServeHTTP(w, r) + }) +} +``` + + +## Router interface + +chi's router is based on a kind of [Patricia Radix trie](https://en.wikipedia.org/wiki/Radix_tree). +The router is fully compatible with `net/http`. + +Built on top of the tree is the `Router` interface: + +```go +// Router consisting of the core routing methods used by chi's Mux, +// using only the standard net/http. +type Router interface { + http.Handler + Routes + + // Use appends one or more middlewares onto the Router stack. + Use(middlewares ...func(http.Handler) http.Handler) + + // With adds inline middlewares for an endpoint handler. + With(middlewares ...func(http.Handler) http.Handler) Router + + // Group adds a new inline-Router along the current routing + // path, with a fresh middleware stack for the inline-Router. + Group(fn func(r Router)) Router + + // Route mounts a sub-Router along a `pattern`` string. + Route(pattern string, fn func(r Router)) Router + + // Mount attaches another http.Handler along ./pattern/* + Mount(pattern string, h http.Handler) + + // Handle and HandleFunc adds routes for `pattern` that matches + // all HTTP methods. + Handle(pattern string, h http.Handler) + HandleFunc(pattern string, h http.HandlerFunc) + + // Method and MethodFunc adds routes for `pattern` that matches + // the `method` HTTP method. + Method(method, pattern string, h http.Handler) + MethodFunc(method, pattern string, h http.HandlerFunc) + + // HTTP-method routing along `pattern` + Connect(pattern string, h http.HandlerFunc) + Delete(pattern string, h http.HandlerFunc) + Get(pattern string, h http.HandlerFunc) + Head(pattern string, h http.HandlerFunc) + Options(pattern string, h http.HandlerFunc) + Patch(pattern string, h http.HandlerFunc) + Post(pattern string, h http.HandlerFunc) + Put(pattern string, h http.HandlerFunc) + Trace(pattern string, h http.HandlerFunc) + + // NotFound defines a handler to respond whenever a route could + // not be found. + NotFound(h http.HandlerFunc) + + // MethodNotAllowed defines a handler to respond whenever a method is + // not allowed. + MethodNotAllowed(h http.HandlerFunc) +} + +// Routes interface adds two methods for router traversal, which is also +// used by the github.com/go-chi/docgen package to generate documentation for Routers. +type Routes interface { + // Routes returns the routing tree in an easily traversable structure. + Routes() []Route + + // Middlewares returns the list of middlewares in use by the router. + Middlewares() Middlewares + + // Match searches the routing tree for a handler that matches + // the method/path - similar to routing a http request, but without + // executing the handler thereafter. + Match(rctx *Context, method, path string) bool +} +``` + +Each routing method accepts a URL `pattern` and chain of `handlers`. The URL pattern +supports named params (ie. `/users/{userID}`) and wildcards (ie. `/admin/*`). URL parameters +can be fetched at runtime by calling `chi.URLParam(r, "userID")` for named parameters +and `chi.URLParam(r, "*")` for a wildcard parameter. + + +### Middleware handlers + +chi's middlewares are just stdlib net/http middleware handlers. There is nothing special +about them, which means the router and all the tooling is designed to be compatible and +friendly with any middleware in the community. This offers much better extensibility and reuse +of packages and is at the heart of chi's purpose. + +Here is an example of a standard net/http middleware where we assign a context key `"user"` +the value of `"123"`. This middleware sets a hypothetical user identifier on the request +context and calls the next handler in the chain. + +```go +// HTTP middleware setting a value on the request context +func MyMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // create new context from `r` request context, and assign key `"user"` + // to value of `"123"` + ctx := context.WithValue(r.Context(), "user", "123") + + // call the next handler in the chain, passing the response writer and + // the updated request object with the new context value. + // + // note: context.Context values are nested, so any previously set + // values will be accessible as well, and the new `"user"` key + // will be accessible from this point forward. + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} +``` + + +### Request handlers + +chi uses standard net/http request handlers. This little snippet is an example of a http.Handler +func that reads a user identifier from the request context - hypothetically, identifying +the user sending an authenticated request, validated+set by a previous middleware handler. + +```go +// HTTP handler accessing data from the request context. +func MyRequestHandler(w http.ResponseWriter, r *http.Request) { + // here we read from the request context and fetch out `"user"` key set in + // the MyMiddleware example above. + user := r.Context().Value("user").(string) + + // respond to the client + w.Write([]byte(fmt.Sprintf("hi %s", user))) +} +``` + + +### URL parameters + +chi's router parses and stores URL parameters right onto the request context. Here is +an example of how to access URL params in your net/http handlers. And of course, middlewares +are able to access the same information. + +```go +// HTTP handler accessing the url routing parameters. +func MyRequestHandler(w http.ResponseWriter, r *http.Request) { + // fetch the url parameter `"userID"` from the request of a matching + // routing pattern. An example routing pattern could be: /users/{userID} + userID := chi.URLParam(r, "userID") + + // fetch `"key"` from the request context + ctx := r.Context() + key := ctx.Value("key").(string) + + // respond to the client + w.Write([]byte(fmt.Sprintf("hi %v, %v", userID, key))) +} +``` + + +## Middlewares + +chi comes equipped with an optional `middleware` package, providing a suite of standard +`net/http` middlewares. Please note, any middleware in the ecosystem that is also compatible +with `net/http` can be used with chi's mux. + +### Core middlewares + +---------------------------------------------------------------------------------------------------- +| chi/middleware Handler | description | +| :--------------------- | :---------------------------------------------------------------------- | +| [AllowContentEncoding] | Enforces a whitelist of request Content-Encoding headers | +| [AllowContentType] | Explicit whitelist of accepted request Content-Types | +| [BasicAuth] | Basic HTTP authentication | +| [Compress] | Gzip compression for clients that accept compressed responses | +| [ContentCharset] | Ensure charset for Content-Type request headers | +| [CleanPath] | Clean double slashes from request path | +| [GetHead] | Automatically route undefined HEAD requests to GET handlers | +| [Heartbeat] | Monitoring endpoint to check the servers pulse | +| [Logger] | Logs the start and end of each request with the elapsed processing time | +| [NoCache] | Sets response headers to prevent clients from caching | +| [Profiler] | Easily attach net/http/pprof to your routers | +| [RealIP] | Sets a http.Request's RemoteAddr to either X-Forwarded-For or X-Real-IP | +| [Recoverer] | Gracefully absorb panics and prints the stack trace | +| [RequestID] | Injects a request ID into the context of each request | +| [RedirectSlashes] | Redirect slashes on routing paths | +| [RouteHeaders] | Route handling for request headers | +| [SetHeader] | Short-hand middleware to set a response header key/value | +| [StripSlashes] | Strip slashes on routing paths | +| [Throttle] | Puts a ceiling on the number of concurrent requests | +| [Timeout] | Signals to the request context when the timeout deadline is reached | +| [URLFormat] | Parse extension from url and put it on request context | +| [WithValue] | Short-hand middleware to set a key/value on the request context | +---------------------------------------------------------------------------------------------------- + +[AllowContentEncoding]: https://pkg.go.dev/github.com/go-chi/chi/middleware#AllowContentEncoding +[AllowContentType]: https://pkg.go.dev/github.com/go-chi/chi/middleware#AllowContentType +[BasicAuth]: https://pkg.go.dev/github.com/go-chi/chi/middleware#BasicAuth +[Compress]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Compress +[ContentCharset]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ContentCharset +[CleanPath]: https://pkg.go.dev/github.com/go-chi/chi/middleware#CleanPath +[GetHead]: https://pkg.go.dev/github.com/go-chi/chi/middleware#GetHead +[GetReqID]: https://pkg.go.dev/github.com/go-chi/chi/middleware#GetReqID +[Heartbeat]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Heartbeat +[Logger]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Logger +[NoCache]: https://pkg.go.dev/github.com/go-chi/chi/middleware#NoCache +[Profiler]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Profiler +[RealIP]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RealIP +[Recoverer]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Recoverer +[RedirectSlashes]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RedirectSlashes +[RequestLogger]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RequestLogger +[RequestID]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RequestID +[RouteHeaders]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RouteHeaders +[SetHeader]: https://pkg.go.dev/github.com/go-chi/chi/middleware#SetHeader +[StripSlashes]: https://pkg.go.dev/github.com/go-chi/chi/middleware#StripSlashes +[Throttle]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Throttle +[ThrottleBacklog]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleBacklog +[ThrottleWithOpts]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleWithOpts +[Timeout]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Timeout +[URLFormat]: https://pkg.go.dev/github.com/go-chi/chi/middleware#URLFormat +[WithLogEntry]: https://pkg.go.dev/github.com/go-chi/chi/middleware#WithLogEntry +[WithValue]: https://pkg.go.dev/github.com/go-chi/chi/middleware#WithValue +[Compressor]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Compressor +[DefaultLogFormatter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#DefaultLogFormatter +[EncoderFunc]: https://pkg.go.dev/github.com/go-chi/chi/middleware#EncoderFunc +[HeaderRoute]: https://pkg.go.dev/github.com/go-chi/chi/middleware#HeaderRoute +[HeaderRouter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#HeaderRouter +[LogEntry]: https://pkg.go.dev/github.com/go-chi/chi/middleware#LogEntry +[LogFormatter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#LogFormatter +[LoggerInterface]: https://pkg.go.dev/github.com/go-chi/chi/middleware#LoggerInterface +[ThrottleOpts]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleOpts +[WrapResponseWriter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#WrapResponseWriter + +### Extra middlewares & packages + +Please see https://github.com/go-chi for additional packages. + +-------------------------------------------------------------------------------------------------------------------- +| package | description | +|:---------------------------------------------------|:------------------------------------------------------------- +| [cors](https://github.com/go-chi/cors) | Cross-origin resource sharing (CORS) | +| [docgen](https://github.com/go-chi/docgen) | Print chi.Router routes at runtime | +| [jwtauth](https://github.com/go-chi/jwtauth) | JWT authentication | +| [hostrouter](https://github.com/go-chi/hostrouter) | Domain/host based request routing | +| [httplog](https://github.com/go-chi/httplog) | Small but powerful structured HTTP request logging | +| [httprate](https://github.com/go-chi/httprate) | HTTP request rate limiter | +| [httptracer](https://github.com/go-chi/httptracer) | HTTP request performance tracing library | +| [httpvcr](https://github.com/go-chi/httpvcr) | Write deterministic tests for external sources | +| [stampede](https://github.com/go-chi/stampede) | HTTP request coalescer | +-------------------------------------------------------------------------------------------------------------------- + + +## context? + +`context` is a tiny pkg that provides simple interface to signal context across call stacks +and goroutines. It was originally written by [Sameer Ajmani](https://github.com/Sajmani) +and is available in stdlib since go1.7. + +Learn more at https://blog.golang.org/context + +and.. +* Docs: https://golang.org/pkg/context +* Source: https://github.com/golang/go/tree/master/src/context + + +## Benchmarks + +The benchmark suite: https://github.com/pkieltyka/go-http-routing-benchmark + +Results as of Nov 29, 2020 with Go 1.15.5 on Linux AMD 3950x + +```shell +BenchmarkChi_Param 3075895 384 ns/op 400 B/op 2 allocs/op +BenchmarkChi_Param5 2116603 566 ns/op 400 B/op 2 allocs/op +BenchmarkChi_Param20 964117 1227 ns/op 400 B/op 2 allocs/op +BenchmarkChi_ParamWrite 2863413 420 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GithubStatic 3045488 395 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GithubParam 2204115 540 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GithubAll 10000 113811 ns/op 81203 B/op 406 allocs/op +BenchmarkChi_GPlusStatic 3337485 359 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GPlusParam 2825853 423 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GPlus2Params 2471697 483 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GPlusAll 194220 5950 ns/op 5200 B/op 26 allocs/op +BenchmarkChi_ParseStatic 3365324 356 ns/op 400 B/op 2 allocs/op +BenchmarkChi_ParseParam 2976614 404 ns/op 400 B/op 2 allocs/op +BenchmarkChi_Parse2Params 2638084 439 ns/op 400 B/op 2 allocs/op +BenchmarkChi_ParseAll 109567 11295 ns/op 10400 B/op 52 allocs/op +BenchmarkChi_StaticAll 16846 71308 ns/op 62802 B/op 314 allocs/op +``` + +Comparison with other routers: https://gist.github.com/pkieltyka/123032f12052520aaccab752bd3e78cc + +NOTE: the allocs in the benchmark above are from the calls to http.Request's +`WithContext(context.Context)` method that clones the http.Request, sets the `Context()` +on the duplicated (alloc'd) request and returns it the new request object. This is just +how setting context on a request in Go works. + + +## Go module support & note on chi's versioning + +* Go.mod support means we reset our versioning starting from v1.5 (see [CHANGELOG](https://github.com/go-chi/chi/blob/master/CHANGELOG.md#v150-2020-11-12---now-with-gomod-support)) +* All older tags are preserved, are backwards-compatible and will "just work" as they +* Brand new systems can run `go get -u github.com/go-chi/chi` as normal, or `go get -u github.com/go-chi/chi@latest` +to install chi, which will install v1.x+ built with go.mod support, starting from v1.5.0. +* For existing projects who want to upgrade to the latest go.mod version, run: `go get -u github.com/go-chi/chi@v1.5.0`, +which will get you on the go.mod version line (as Go's mod cache may still remember v4.x). +* Any breaking changes will bump a "minor" release and backwards-compatible improvements/fixes will bump a "tiny" release. + + +## Credits + +* Carl Jackson for https://github.com/zenazn/goji + * Parts of chi's thinking comes from goji, and chi's middleware package + sources from goji. +* Armon Dadgar for https://github.com/armon/go-radix +* Contributions: [@VojtechVitek](https://github.com/VojtechVitek) + +We'll be more than happy to see [your contributions](./CONTRIBUTING.md)! + + +## Beyond REST + +chi is just a http router that lets you decompose request handling into many smaller layers. +Many companies use chi to write REST services for their public APIs. But, REST is just a convention +for managing state via HTTP, and there's a lot of other pieces required to write a complete client-server +system or network of microservices. + +Looking beyond REST, I also recommend some newer works in the field: +* [webrpc](https://github.com/webrpc/webrpc) - Web-focused RPC client+server framework with code-gen +* [gRPC](https://github.com/grpc/grpc-go) - Google's RPC framework via protobufs +* [graphql](https://github.com/99designs/gqlgen) - Declarative query language +* [NATS](https://nats.io) - lightweight pub-sub + + +## License + +Copyright (c) 2015-present [Peter Kieltyka](https://github.com/pkieltyka) + +Licensed under [MIT License](./LICENSE) + +[GoDoc]: https://pkg.go.dev/github.com/go-chi/chi?tab=versions +[GoDoc Widget]: https://godoc.org/github.com/go-chi/chi?status.svg +[Travis]: https://travis-ci.org/go-chi/chi +[Travis Widget]: https://travis-ci.org/go-chi/chi.svg?branch=master diff --git a/vendor/github.com/go-chi/chi/v5/chain.go b/vendor/github.com/go-chi/chi/v5/chain.go new file mode 100644 index 000000000..88e684613 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/chain.go @@ -0,0 +1,49 @@ +package chi + +import "net/http" + +// Chain returns a Middlewares type from a slice of middleware handlers. +func Chain(middlewares ...func(http.Handler) http.Handler) Middlewares { + return Middlewares(middlewares) +} + +// Handler builds and returns a http.Handler from the chain of middlewares, +// with `h http.Handler` as the final handler. +func (mws Middlewares) Handler(h http.Handler) http.Handler { + return &ChainHandler{mws, h, chain(mws, h)} +} + +// HandlerFunc builds and returns a http.Handler from the chain of middlewares, +// with `h http.Handler` as the final handler. +func (mws Middlewares) HandlerFunc(h http.HandlerFunc) http.Handler { + return &ChainHandler{mws, h, chain(mws, h)} +} + +// ChainHandler is a http.Handler with support for handler composition and +// execution. +type ChainHandler struct { + Middlewares Middlewares + Endpoint http.Handler + chain http.Handler +} + +func (c *ChainHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + c.chain.ServeHTTP(w, r) +} + +// chain builds a http.Handler composed of an inline middleware stack and endpoint +// handler in the order they are passed. +func chain(middlewares []func(http.Handler) http.Handler, endpoint http.Handler) http.Handler { + // Return ahead of time if there aren't any middlewares for the chain + if len(middlewares) == 0 { + return endpoint + } + + // Wrap the end handler with the middleware chain + h := middlewares[len(middlewares)-1](endpoint) + for i := len(middlewares) - 2; i >= 0; i-- { + h = middlewares[i](h) + } + + return h +} diff --git a/vendor/github.com/go-chi/chi/v5/chi.go b/vendor/github.com/go-chi/chi/v5/chi.go new file mode 100644 index 000000000..d2e5354dc --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/chi.go @@ -0,0 +1,134 @@ +// +// Package chi is a small, idiomatic and composable router for building HTTP services. +// +// chi requires Go 1.10 or newer. +// +// Example: +// package main +// +// import ( +// "net/http" +// +// "github.com/go-chi/chi/v5" +// "github.com/go-chi/chi/v5/middleware" +// ) +// +// func main() { +// r := chi.NewRouter() +// r.Use(middleware.Logger) +// r.Use(middleware.Recoverer) +// +// r.Get("/", func(w http.ResponseWriter, r *http.Request) { +// w.Write([]byte("root.")) +// }) +// +// http.ListenAndServe(":3333", r) +// } +// +// See github.com/go-chi/chi/_examples/ for more in-depth examples. +// +// URL patterns allow for easy matching of path components in HTTP +// requests. The matching components can then be accessed using +// chi.URLParam(). All patterns must begin with a slash. +// +// A simple named placeholder {name} matches any sequence of characters +// up to the next / or the end of the URL. Trailing slashes on paths must +// be handled explicitly. +// +// A placeholder with a name followed by a colon allows a regular +// expression match, for example {number:\\d+}. The regular expression +// syntax is Go's normal regexp RE2 syntax, except that regular expressions +// including { or } are not supported, and / will never be +// matched. An anonymous regexp pattern is allowed, using an empty string +// before the colon in the placeholder, such as {:\\d+} +// +// The special placeholder of asterisk matches the rest of the requested +// URL. Any trailing characters in the pattern are ignored. This is the only +// placeholder which will match / characters. +// +// Examples: +// "/user/{name}" matches "/user/jsmith" but not "/user/jsmith/info" or "/user/jsmith/" +// "/user/{name}/info" matches "/user/jsmith/info" +// "/page/*" matches "/page/intro/latest" +// "/page/*/index" also matches "/page/intro/latest" +// "/date/{yyyy:\\d\\d\\d\\d}/{mm:\\d\\d}/{dd:\\d\\d}" matches "/date/2017/04/01" +// +package chi + +import "net/http" + +// NewRouter returns a new Mux object that implements the Router interface. +func NewRouter() *Mux { + return NewMux() +} + +// Router consisting of the core routing methods used by chi's Mux, +// using only the standard net/http. +type Router interface { + http.Handler + Routes + + // Use appends one or more middlewares onto the Router stack. + Use(middlewares ...func(http.Handler) http.Handler) + + // With adds inline middlewares for an endpoint handler. + With(middlewares ...func(http.Handler) http.Handler) Router + + // Group adds a new inline-Router along the current routing + // path, with a fresh middleware stack for the inline-Router. + Group(fn func(r Router)) Router + + // Route mounts a sub-Router along a `pattern`` string. + Route(pattern string, fn func(r Router)) Router + + // Mount attaches another http.Handler along ./pattern/* + Mount(pattern string, h http.Handler) + + // Handle and HandleFunc adds routes for `pattern` that matches + // all HTTP methods. + Handle(pattern string, h http.Handler) + HandleFunc(pattern string, h http.HandlerFunc) + + // Method and MethodFunc adds routes for `pattern` that matches + // the `method` HTTP method. + Method(method, pattern string, h http.Handler) + MethodFunc(method, pattern string, h http.HandlerFunc) + + // HTTP-method routing along `pattern` + Connect(pattern string, h http.HandlerFunc) + Delete(pattern string, h http.HandlerFunc) + Get(pattern string, h http.HandlerFunc) + Head(pattern string, h http.HandlerFunc) + Options(pattern string, h http.HandlerFunc) + Patch(pattern string, h http.HandlerFunc) + Post(pattern string, h http.HandlerFunc) + Put(pattern string, h http.HandlerFunc) + Trace(pattern string, h http.HandlerFunc) + + // NotFound defines a handler to respond whenever a route could + // not be found. + NotFound(h http.HandlerFunc) + + // MethodNotAllowed defines a handler to respond whenever a method is + // not allowed. + MethodNotAllowed(h http.HandlerFunc) +} + +// Routes interface adds two methods for router traversal, which is also +// used by the `docgen` subpackage to generation documentation for Routers. +type Routes interface { + // Routes returns the routing tree in an easily traversable structure. + Routes() []Route + + // Middlewares returns the list of middlewares in use by the router. + Middlewares() Middlewares + + // Match searches the routing tree for a handler that matches + // the method/path - similar to routing a http request, but without + // executing the handler thereafter. + Match(rctx *Context, method, path string) bool +} + +// Middlewares type is a slice of standard middleware handlers with methods +// to compose middleware chains and http.Handler's. +type Middlewares []func(http.Handler) http.Handler diff --git a/vendor/github.com/go-chi/chi/v5/context.go b/vendor/github.com/go-chi/chi/v5/context.go new file mode 100644 index 000000000..8c97f214a --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/context.go @@ -0,0 +1,157 @@ +package chi + +import ( + "context" + "net/http" + "strings" +) + +// URLParam returns the url parameter from a http.Request object. +func URLParam(r *http.Request, key string) string { + if rctx := RouteContext(r.Context()); rctx != nil { + return rctx.URLParam(key) + } + return "" +} + +// URLParamFromCtx returns the url parameter from a http.Request Context. +func URLParamFromCtx(ctx context.Context, key string) string { + if rctx := RouteContext(ctx); rctx != nil { + return rctx.URLParam(key) + } + return "" +} + +// RouteContext returns chi's routing Context object from a +// http.Request Context. +func RouteContext(ctx context.Context) *Context { + val, _ := ctx.Value(RouteCtxKey).(*Context) + return val +} + +// NewRouteContext returns a new routing Context object. +func NewRouteContext() *Context { + return &Context{} +} + +var ( + // RouteCtxKey is the context.Context key to store the request context. + RouteCtxKey = &contextKey{"RouteContext"} +) + +// Context is the default routing context set on the root node of a +// request context to track route patterns, URL parameters and +// an optional routing path. +type Context struct { + Routes Routes + + // Routing path/method override used during the route search. + // See Mux#routeHTTP method. + RoutePath string + RouteMethod string + + // Routing pattern stack throughout the lifecycle of the request, + // across all connected routers. It is a record of all matching + // patterns across a stack of sub-routers. + RoutePatterns []string + + // URLParams are the stack of routeParams captured during the + // routing lifecycle across a stack of sub-routers. + URLParams RouteParams + + // The endpoint routing pattern that matched the request URI path + // or `RoutePath` of the current sub-router. This value will update + // during the lifecycle of a request passing through a stack of + // sub-routers. + routePattern string + + // Route parameters matched for the current sub-router. It is + // intentionally unexported so it cant be tampered. + routeParams RouteParams + + // methodNotAllowed hint + methodNotAllowed bool + + // parentCtx is the parent of this one, for using Context as a + // context.Context directly. This is an optimization that saves + // 1 allocation. + parentCtx context.Context +} + +// Reset a routing context to its initial state. +func (x *Context) Reset() { + x.Routes = nil + x.RoutePath = "" + x.RouteMethod = "" + x.RoutePatterns = x.RoutePatterns[:0] + x.URLParams.Keys = x.URLParams.Keys[:0] + x.URLParams.Values = x.URLParams.Values[:0] + + x.routePattern = "" + x.routeParams.Keys = x.routeParams.Keys[:0] + x.routeParams.Values = x.routeParams.Values[:0] + x.methodNotAllowed = false + x.parentCtx = nil +} + +// URLParam returns the corresponding URL parameter value from the request +// routing context. +func (x *Context) URLParam(key string) string { + for k := len(x.URLParams.Keys) - 1; k >= 0; k-- { + if x.URLParams.Keys[k] == key { + return x.URLParams.Values[k] + } + } + return "" +} + +// RoutePattern builds the routing pattern string for the particular +// request, at the particular point during routing. This means, the value +// will change throughout the execution of a request in a router. That is +// why its advised to only use this value after calling the next handler. +// +// For example, +// +// func Instrument(next http.Handler) http.Handler { +// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +// next.ServeHTTP(w, r) +// routePattern := chi.RouteContext(r.Context()).RoutePattern() +// measure(w, r, routePattern) +// }) +// } +func (x *Context) RoutePattern() string { + routePattern := strings.Join(x.RoutePatterns, "") + return replaceWildcards(routePattern) +} + +// replaceWildcards takes a route pattern and recursively replaces all +// occurrences of "/*/" to "/". +func replaceWildcards(p string) string { + if strings.Contains(p, "/*/") { + return replaceWildcards(strings.Replace(p, "/*/", "/", -1)) + } + + return p +} + +// RouteParams is a structure to track URL routing parameters efficiently. +type RouteParams struct { + Keys, Values []string +} + +// Add will append a URL parameter to the end of the route param +func (s *RouteParams) Add(key, value string) { + s.Keys = append(s.Keys, key) + s.Values = append(s.Values, value) +} + +// contextKey is a value for use with context.WithValue. It's used as +// a pointer so it fits in an interface{} without allocation. This technique +// for defining context keys was copied from Go 1.7's new use of context in net/http. +type contextKey struct { + name string +} + +func (k *contextKey) String() string { + return "chi context value " + k.name +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go b/vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go new file mode 100644 index 000000000..a546c9e9e --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go @@ -0,0 +1,33 @@ +package middleware + +import ( + "crypto/subtle" + "fmt" + "net/http" +) + +// BasicAuth implements a simple middleware handler for adding basic http auth to a route. +func BasicAuth(realm string, creds map[string]string) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + user, pass, ok := r.BasicAuth() + if !ok { + basicAuthFailed(w, realm) + return + } + + credPass, credUserOk := creds[user] + if !credUserOk || subtle.ConstantTimeCompare([]byte(pass), []byte(credPass)) != 1 { + basicAuthFailed(w, realm) + return + } + + next.ServeHTTP(w, r) + }) + } +} + +func basicAuthFailed(w http.ResponseWriter, realm string) { + w.Header().Add("WWW-Authenticate", fmt.Sprintf(`Basic realm="%s"`, realm)) + w.WriteHeader(http.StatusUnauthorized) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/clean_path.go b/vendor/github.com/go-chi/chi/v5/middleware/clean_path.go new file mode 100644 index 000000000..adeba4295 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/clean_path.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "net/http" + "path" + + "github.com/go-chi/chi/v5" +) + +// CleanPath middleware will clean out double slash mistakes from a user's request path. +// For example, if a user requests /users//1 or //users////1 will both be treated as: /users/1 +func CleanPath(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rctx := chi.RouteContext(r.Context()) + + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + rctx.RoutePath = path.Clean(routePath) + } + + next.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/compress.go b/vendor/github.com/go-chi/chi/v5/middleware/compress.go new file mode 100644 index 000000000..2f40cc15a --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/compress.go @@ -0,0 +1,399 @@ +package middleware + +import ( + "bufio" + "compress/flate" + "compress/gzip" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "strings" + "sync" +) + +var defaultCompressibleContentTypes = []string{ + "text/html", + "text/css", + "text/plain", + "text/javascript", + "application/javascript", + "application/x-javascript", + "application/json", + "application/atom+xml", + "application/rss+xml", + "image/svg+xml", +} + +// Compress is a middleware that compresses response +// body of a given content types to a data format based +// on Accept-Encoding request header. It uses a given +// compression level. +// +// NOTE: make sure to set the Content-Type header on your response +// otherwise this middleware will not compress the response body. For ex, in +// your handler you should set w.Header().Set("Content-Type", http.DetectContentType(yourBody)) +// or set it manually. +// +// Passing a compression level of 5 is sensible value +func Compress(level int, types ...string) func(next http.Handler) http.Handler { + compressor := NewCompressor(level, types...) + return compressor.Handler +} + +// Compressor represents a set of encoding configurations. +type Compressor struct { + level int // The compression level. + // The mapping of encoder names to encoder functions. + encoders map[string]EncoderFunc + // The mapping of pooled encoders to pools. + pooledEncoders map[string]*sync.Pool + // The set of content types allowed to be compressed. + allowedTypes map[string]struct{} + allowedWildcards map[string]struct{} + // The list of encoders in order of decreasing precedence. + encodingPrecedence []string +} + +// NewCompressor creates a new Compressor that will handle encoding responses. +// +// The level should be one of the ones defined in the flate package. +// The types are the content types that are allowed to be compressed. +func NewCompressor(level int, types ...string) *Compressor { + // If types are provided, set those as the allowed types. If none are + // provided, use the default list. + allowedTypes := make(map[string]struct{}) + allowedWildcards := make(map[string]struct{}) + if len(types) > 0 { + for _, t := range types { + if strings.Contains(strings.TrimSuffix(t, "/*"), "*") { + panic(fmt.Sprintf("middleware/compress: Unsupported content-type wildcard pattern '%s'. Only '/*' supported", t)) + } + if strings.HasSuffix(t, "/*") { + allowedWildcards[strings.TrimSuffix(t, "/*")] = struct{}{} + } else { + allowedTypes[t] = struct{}{} + } + } + } else { + for _, t := range defaultCompressibleContentTypes { + allowedTypes[t] = struct{}{} + } + } + + c := &Compressor{ + level: level, + encoders: make(map[string]EncoderFunc), + pooledEncoders: make(map[string]*sync.Pool), + allowedTypes: allowedTypes, + allowedWildcards: allowedWildcards, + } + + // Set the default encoders. The precedence order uses the reverse + // ordering that the encoders were added. This means adding new encoders + // will move them to the front of the order. + // + // TODO: + // lzma: Opera. + // sdch: Chrome, Android. Gzip output + dictionary header. + // br: Brotli, see https://github.com/go-chi/chi/pull/326 + + // HTTP 1.1 "deflate" (RFC 2616) stands for DEFLATE data (RFC 1951) + // wrapped with zlib (RFC 1950). The zlib wrapper uses Adler-32 + // checksum compared to CRC-32 used in "gzip" and thus is faster. + // + // But.. some old browsers (MSIE, Safari 5.1) incorrectly expect + // raw DEFLATE data only, without the mentioned zlib wrapper. + // Because of this major confusion, most modern browsers try it + // both ways, first looking for zlib headers. + // Quote by Mark Adler: http://stackoverflow.com/a/9186091/385548 + // + // The list of browsers having problems is quite big, see: + // http://zoompf.com/blog/2012/02/lose-the-wait-http-compression + // https://web.archive.org/web/20120321182910/http://www.vervestudios.co/projects/compression-tests/results + // + // That's why we prefer gzip over deflate. It's just more reliable + // and not significantly slower than gzip. + c.SetEncoder("deflate", encoderDeflate) + + // TODO: Exception for old MSIE browsers that can't handle non-HTML? + // https://zoompf.com/blog/2012/02/lose-the-wait-http-compression + c.SetEncoder("gzip", encoderGzip) + + // NOTE: Not implemented, intentionally: + // case "compress": // LZW. Deprecated. + // case "bzip2": // Too slow on-the-fly. + // case "zopfli": // Too slow on-the-fly. + // case "xz": // Too slow on-the-fly. + return c +} + +// SetEncoder can be used to set the implementation of a compression algorithm. +// +// The encoding should be a standardised identifier. See: +// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding +// +// For example, add the Brotli algortithm: +// +// import brotli_enc "gopkg.in/kothar/brotli-go.v0/enc" +// +// compressor := middleware.NewCompressor(5, "text/html") +// compressor.SetEncoder("br", func(w http.ResponseWriter, level int) io.Writer { +// params := brotli_enc.NewBrotliParams() +// params.SetQuality(level) +// return brotli_enc.NewBrotliWriter(params, w) +// }) +func (c *Compressor) SetEncoder(encoding string, fn EncoderFunc) { + encoding = strings.ToLower(encoding) + if encoding == "" { + panic("the encoding can not be empty") + } + if fn == nil { + panic("attempted to set a nil encoder function") + } + + // If we are adding a new encoder that is already registered, we have to + // clear that one out first. + if _, ok := c.pooledEncoders[encoding]; ok { + delete(c.pooledEncoders, encoding) + } + if _, ok := c.encoders[encoding]; ok { + delete(c.encoders, encoding) + } + + // If the encoder supports Resetting (IoReseterWriter), then it can be pooled. + encoder := fn(ioutil.Discard, c.level) + if encoder != nil { + if _, ok := encoder.(ioResetterWriter); ok { + pool := &sync.Pool{ + New: func() interface{} { + return fn(ioutil.Discard, c.level) + }, + } + c.pooledEncoders[encoding] = pool + } + } + // If the encoder is not in the pooledEncoders, add it to the normal encoders. + if _, ok := c.pooledEncoders[encoding]; !ok { + c.encoders[encoding] = fn + } + + for i, v := range c.encodingPrecedence { + if v == encoding { + c.encodingPrecedence = append(c.encodingPrecedence[:i], c.encodingPrecedence[i+1:]...) + } + } + + c.encodingPrecedence = append([]string{encoding}, c.encodingPrecedence...) +} + +// Handler returns a new middleware that will compress the response based on the +// current Compressor. +func (c *Compressor) Handler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + encoder, encoding, cleanup := c.selectEncoder(r.Header, w) + + cw := &compressResponseWriter{ + ResponseWriter: w, + w: w, + contentTypes: c.allowedTypes, + contentWildcards: c.allowedWildcards, + encoding: encoding, + compressable: false, // determined in post-handler + } + if encoder != nil { + cw.w = encoder + } + // Re-add the encoder to the pool if applicable. + defer cleanup() + defer cw.Close() + + next.ServeHTTP(cw, r) + }) +} + +// selectEncoder returns the encoder, the name of the encoder, and a closer function. +func (c *Compressor) selectEncoder(h http.Header, w io.Writer) (io.Writer, string, func()) { + header := h.Get("Accept-Encoding") + + // Parse the names of all accepted algorithms from the header. + accepted := strings.Split(strings.ToLower(header), ",") + + // Find supported encoder by accepted list by precedence + for _, name := range c.encodingPrecedence { + if matchAcceptEncoding(accepted, name) { + if pool, ok := c.pooledEncoders[name]; ok { + encoder := pool.Get().(ioResetterWriter) + cleanup := func() { + pool.Put(encoder) + } + encoder.Reset(w) + return encoder, name, cleanup + + } + if fn, ok := c.encoders[name]; ok { + return fn(w, c.level), name, func() {} + } + } + + } + + // No encoder found to match the accepted encoding + return nil, "", func() {} +} + +func matchAcceptEncoding(accepted []string, encoding string) bool { + for _, v := range accepted { + if strings.Contains(v, encoding) { + return true + } + } + return false +} + +// An EncoderFunc is a function that wraps the provided io.Writer with a +// streaming compression algorithm and returns it. +// +// In case of failure, the function should return nil. +type EncoderFunc func(w io.Writer, level int) io.Writer + +// Interface for types that allow resetting io.Writers. +type ioResetterWriter interface { + io.Writer + Reset(w io.Writer) +} + +type compressResponseWriter struct { + http.ResponseWriter + + // The streaming encoder writer to be used if there is one. Otherwise, + // this is just the normal writer. + w io.Writer + encoding string + contentTypes map[string]struct{} + contentWildcards map[string]struct{} + wroteHeader bool + compressable bool +} + +func (cw *compressResponseWriter) isCompressable() bool { + // Parse the first part of the Content-Type response header. + contentType := cw.Header().Get("Content-Type") + if idx := strings.Index(contentType, ";"); idx >= 0 { + contentType = contentType[0:idx] + } + + // Is the content type compressable? + if _, ok := cw.contentTypes[contentType]; ok { + return true + } + if idx := strings.Index(contentType, "/"); idx > 0 { + contentType = contentType[0:idx] + _, ok := cw.contentWildcards[contentType] + return ok + } + return false +} + +func (cw *compressResponseWriter) WriteHeader(code int) { + if cw.wroteHeader { + cw.ResponseWriter.WriteHeader(code) // Allow multiple calls to propagate. + return + } + cw.wroteHeader = true + defer cw.ResponseWriter.WriteHeader(code) + + // Already compressed data? + if cw.Header().Get("Content-Encoding") != "" { + return + } + + if !cw.isCompressable() { + cw.compressable = false + return + } + + if cw.encoding != "" { + cw.compressable = true + cw.Header().Set("Content-Encoding", cw.encoding) + cw.Header().Set("Vary", "Accept-Encoding") + + // The content-length after compression is unknown + cw.Header().Del("Content-Length") + } +} + +func (cw *compressResponseWriter) Write(p []byte) (int, error) { + if !cw.wroteHeader { + cw.WriteHeader(http.StatusOK) + } + + return cw.writer().Write(p) +} + +func (cw *compressResponseWriter) writer() io.Writer { + if cw.compressable { + return cw.w + } else { + return cw.ResponseWriter + } +} + +type compressFlusher interface { + Flush() error +} + +func (cw *compressResponseWriter) Flush() { + if f, ok := cw.writer().(http.Flusher); ok { + f.Flush() + } + // If the underlying writer has a compression flush signature, + // call this Flush() method instead + if f, ok := cw.writer().(compressFlusher); ok { + f.Flush() + + // Also flush the underlying response writer + if f, ok := cw.ResponseWriter.(http.Flusher); ok { + f.Flush() + } + } +} + +func (cw *compressResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if hj, ok := cw.writer().(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, errors.New("chi/middleware: http.Hijacker is unavailable on the writer") +} + +func (cw *compressResponseWriter) Push(target string, opts *http.PushOptions) error { + if ps, ok := cw.writer().(http.Pusher); ok { + return ps.Push(target, opts) + } + return errors.New("chi/middleware: http.Pusher is unavailable on the writer") +} + +func (cw *compressResponseWriter) Close() error { + if c, ok := cw.writer().(io.WriteCloser); ok { + return c.Close() + } + return errors.New("chi/middleware: io.WriteCloser is unavailable on the writer") +} + +func encoderGzip(w io.Writer, level int) io.Writer { + gw, err := gzip.NewWriterLevel(w, level) + if err != nil { + return nil + } + return gw +} + +func encoderDeflate(w io.Writer, level int) io.Writer { + dw, err := flate.NewWriter(w, level) + if err != nil { + return nil + } + return dw +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/content_charset.go b/vendor/github.com/go-chi/chi/v5/middleware/content_charset.go new file mode 100644 index 000000000..07b5ce6f6 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/content_charset.go @@ -0,0 +1,51 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// ContentCharset generates a handler that writes a 415 Unsupported Media Type response if none of the charsets match. +// An empty charset will allow requests with no Content-Type header or no specified charset. +func ContentCharset(charsets ...string) func(next http.Handler) http.Handler { + for i, c := range charsets { + charsets[i] = strings.ToLower(c) + } + + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !contentEncoding(r.Header.Get("Content-Type"), charsets...) { + w.WriteHeader(http.StatusUnsupportedMediaType) + return + } + + next.ServeHTTP(w, r) + }) + } +} + +// Check the content encoding against a list of acceptable values. +func contentEncoding(ce string, charsets ...string) bool { + _, ce = split(strings.ToLower(ce), ";") + _, ce = split(ce, "charset=") + ce, _ = split(ce, ";") + for _, c := range charsets { + if ce == c { + return true + } + } + + return false +} + +// Split a string in two parts, cleaning any whitespace. +func split(str, sep string) (string, string) { + var a, b string + var parts = strings.SplitN(str, sep, 2) + a = strings.TrimSpace(parts[0]) + if len(parts) == 2 { + b = strings.TrimSpace(parts[1]) + } + + return a, b +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go b/vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go new file mode 100644 index 000000000..e0b9ccc08 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go @@ -0,0 +1,34 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// AllowContentEncoding enforces a whitelist of request Content-Encoding otherwise responds +// with a 415 Unsupported Media Type status. +func AllowContentEncoding(contentEncoding ...string) func(next http.Handler) http.Handler { + allowedEncodings := make(map[string]struct{}, len(contentEncoding)) + for _, encoding := range contentEncoding { + allowedEncodings[strings.TrimSpace(strings.ToLower(encoding))] = struct{}{} + } + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + requestEncodings := r.Header["Content-Encoding"] + // skip check for empty content body or no Content-Encoding + if r.ContentLength == 0 { + next.ServeHTTP(w, r) + return + } + // All encodings in the request must be allowed + for _, encoding := range requestEncodings { + if _, ok := allowedEncodings[strings.TrimSpace(strings.ToLower(encoding))]; !ok { + w.WriteHeader(http.StatusUnsupportedMediaType) + return + } + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/content_type.go b/vendor/github.com/go-chi/chi/v5/middleware/content_type.go new file mode 100644 index 000000000..023978fac --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/content_type.go @@ -0,0 +1,49 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// SetHeader is a convenience handler to set a response header key/value +func SetHeader(key, value string) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set(key, value) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} + +// AllowContentType enforces a whitelist of request Content-Types otherwise responds +// with a 415 Unsupported Media Type status. +func AllowContentType(contentTypes ...string) func(next http.Handler) http.Handler { + allowedContentTypes := make(map[string]struct{}, len(contentTypes)) + for _, ctype := range contentTypes { + allowedContentTypes[strings.TrimSpace(strings.ToLower(ctype))] = struct{}{} + } + + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if r.ContentLength == 0 { + // skip check for empty content body + next.ServeHTTP(w, r) + return + } + + s := strings.ToLower(strings.TrimSpace(r.Header.Get("Content-Type"))) + if i := strings.Index(s, ";"); i > -1 { + s = s[0:i] + } + + if _, ok := allowedContentTypes[s]; ok { + next.ServeHTTP(w, r) + return + } + + w.WriteHeader(http.StatusUnsupportedMediaType) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/get_head.go b/vendor/github.com/go-chi/chi/v5/middleware/get_head.go new file mode 100644 index 000000000..d4606d8be --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/get_head.go @@ -0,0 +1,39 @@ +package middleware + +import ( + "net/http" + + "github.com/go-chi/chi/v5" +) + +// GetHead automatically route undefined HEAD requests to GET handlers. +func GetHead(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "HEAD" { + rctx := chi.RouteContext(r.Context()) + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + } + + // Temporary routing context to look-ahead before routing the request + tctx := chi.NewRouteContext() + + // Attempt to find a HEAD handler for the routing path, if not found, traverse + // the router as through its a GET route, but proceed with the request + // with the HEAD method. + if !rctx.Routes.Match(tctx, "HEAD", routePath) { + rctx.RouteMethod = "GET" + rctx.RoutePath = routePath + next.ServeHTTP(w, r) + return + } + } + + next.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go b/vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go new file mode 100644 index 000000000..fe822fb53 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go @@ -0,0 +1,26 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// Heartbeat endpoint middleware useful to setting up a path like +// `/ping` that load balancers or uptime testing external services +// can make a request before hitting any routes. It's also convenient +// to place this above ACL middlewares as well. +func Heartbeat(endpoint string) func(http.Handler) http.Handler { + f := func(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" && strings.EqualFold(r.URL.Path, endpoint) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + w.Write([]byte(".")) + return + } + h.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } + return f +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/logger.go b/vendor/github.com/go-chi/chi/v5/middleware/logger.go new file mode 100644 index 000000000..66edc3dda --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/logger.go @@ -0,0 +1,174 @@ +package middleware + +import ( + "bytes" + "context" + "log" + "net/http" + "os" + "runtime" + "time" +) + +var ( + // LogEntryCtxKey is the context.Context key to store the request log entry. + LogEntryCtxKey = &contextKey{"LogEntry"} + + // DefaultLogger is called by the Logger middleware handler to log each request. + // Its made a package-level variable so that it can be reconfigured for custom + // logging configurations. + DefaultLogger func(next http.Handler) http.Handler +) + +// Logger is a middleware that logs the start and end of each request, along +// with some useful data about what was requested, what the response status was, +// and how long it took to return. When standard output is a TTY, Logger will +// print in color, otherwise it will print in black and white. Logger prints a +// request ID if one is provided. +// +// Alternatively, look at https://github.com/goware/httplog for a more in-depth +// http logger with structured logging support. +// +// IMPORTANT NOTE: Logger should go before any other middleware that may change +// the response, such as `middleware.Recoverer`. Example: +// +// ```go +// r := chi.NewRouter() +// r.Use(middleware.Logger) // <--<< Logger should come before Recoverer +// r.Use(middleware.Recoverer) +// r.Get("/", handler) +// ``` +func Logger(next http.Handler) http.Handler { + return DefaultLogger(next) +} + +// RequestLogger returns a logger handler using a custom LogFormatter. +func RequestLogger(f LogFormatter) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + entry := f.NewLogEntry(r) + ww := NewWrapResponseWriter(w, r.ProtoMajor) + + t1 := time.Now() + defer func() { + entry.Write(ww.Status(), ww.BytesWritten(), ww.Header(), time.Since(t1), nil) + }() + + next.ServeHTTP(ww, WithLogEntry(r, entry)) + } + return http.HandlerFunc(fn) + } +} + +// LogFormatter initiates the beginning of a new LogEntry per request. +// See DefaultLogFormatter for an example implementation. +type LogFormatter interface { + NewLogEntry(r *http.Request) LogEntry +} + +// LogEntry records the final log when a request completes. +// See defaultLogEntry for an example implementation. +type LogEntry interface { + Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) + Panic(v interface{}, stack []byte) +} + +// GetLogEntry returns the in-context LogEntry for a request. +func GetLogEntry(r *http.Request) LogEntry { + entry, _ := r.Context().Value(LogEntryCtxKey).(LogEntry) + return entry +} + +// WithLogEntry sets the in-context LogEntry for a request. +func WithLogEntry(r *http.Request, entry LogEntry) *http.Request { + r = r.WithContext(context.WithValue(r.Context(), LogEntryCtxKey, entry)) + return r +} + +// LoggerInterface accepts printing to stdlib logger or compatible logger. +type LoggerInterface interface { + Print(v ...interface{}) +} + +// DefaultLogFormatter is a simple logger that implements a LogFormatter. +type DefaultLogFormatter struct { + Logger LoggerInterface + NoColor bool +} + +// NewLogEntry creates a new LogEntry for the request. +func (l *DefaultLogFormatter) NewLogEntry(r *http.Request) LogEntry { + useColor := !l.NoColor + entry := &defaultLogEntry{ + DefaultLogFormatter: l, + request: r, + buf: &bytes.Buffer{}, + useColor: useColor, + } + + reqID := GetReqID(r.Context()) + if reqID != "" { + cW(entry.buf, useColor, nYellow, "[%s] ", reqID) + } + cW(entry.buf, useColor, nCyan, "\"") + cW(entry.buf, useColor, bMagenta, "%s ", r.Method) + + scheme := "http" + if r.TLS != nil { + scheme = "https" + } + cW(entry.buf, useColor, nCyan, "%s://%s%s %s\" ", scheme, r.Host, r.RequestURI, r.Proto) + + entry.buf.WriteString("from ") + entry.buf.WriteString(r.RemoteAddr) + entry.buf.WriteString(" - ") + + return entry +} + +type defaultLogEntry struct { + *DefaultLogFormatter + request *http.Request + buf *bytes.Buffer + useColor bool +} + +func (l *defaultLogEntry) Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) { + switch { + case status < 200: + cW(l.buf, l.useColor, bBlue, "%03d", status) + case status < 300: + cW(l.buf, l.useColor, bGreen, "%03d", status) + case status < 400: + cW(l.buf, l.useColor, bCyan, "%03d", status) + case status < 500: + cW(l.buf, l.useColor, bYellow, "%03d", status) + default: + cW(l.buf, l.useColor, bRed, "%03d", status) + } + + cW(l.buf, l.useColor, bBlue, " %dB", bytes) + + l.buf.WriteString(" in ") + if elapsed < 500*time.Millisecond { + cW(l.buf, l.useColor, nGreen, "%s", elapsed) + } else if elapsed < 5*time.Second { + cW(l.buf, l.useColor, nYellow, "%s", elapsed) + } else { + cW(l.buf, l.useColor, nRed, "%s", elapsed) + } + + l.Logger.Print(l.buf.String()) +} + +func (l *defaultLogEntry) Panic(v interface{}, stack []byte) { + PrintPrettyStack(v) +} + +func init() { + color := true + if runtime.GOOS == "windows" { + color = false + } + DefaultLogger = RequestLogger(&DefaultLogFormatter{Logger: log.New(os.Stdout, "", log.LstdFlags), NoColor: !color}) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/middleware.go b/vendor/github.com/go-chi/chi/v5/middleware/middleware.go new file mode 100644 index 000000000..cc371e00a --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/middleware.go @@ -0,0 +1,23 @@ +package middleware + +import "net/http" + +// New will create a new middleware handler from a http.Handler. +func New(h http.Handler) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + }) + } +} + +// contextKey is a value for use with context.WithValue. It's used as +// a pointer so it fits in an interface{} without allocation. This technique +// for defining context keys was copied from Go 1.7's new use of context in net/http. +type contextKey struct { + name string +} + +func (k *contextKey) String() string { + return "chi/middleware context value " + k.name +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/nocache.go b/vendor/github.com/go-chi/chi/v5/middleware/nocache.go new file mode 100644 index 000000000..2412829e1 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/nocache.go @@ -0,0 +1,58 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "net/http" + "time" +) + +// Unix epoch time +var epoch = time.Unix(0, 0).Format(time.RFC1123) + +// Taken from https://github.com/mytrile/nocache +var noCacheHeaders = map[string]string{ + "Expires": epoch, + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "Pragma": "no-cache", + "X-Accel-Expires": "0", +} + +var etagHeaders = []string{ + "ETag", + "If-Modified-Since", + "If-Match", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", +} + +// NoCache is a simple piece of middleware that sets a number of HTTP headers to prevent +// a router (or subrouter) from being cached by an upstream proxy and/or client. +// +// As per http://wiki.nginx.org/HttpProxyModule - NoCache sets: +// Expires: Thu, 01 Jan 1970 00:00:00 UTC +// Cache-Control: no-cache, private, max-age=0 +// X-Accel-Expires: 0 +// Pragma: no-cache (for HTTP/1.0 proxies/clients) +func NoCache(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + + // Delete any ETag headers that may have been set + for _, v := range etagHeaders { + if r.Header.Get(v) != "" { + r.Header.Del(v) + } + } + + // Set our NoCache headers + for k, v := range noCacheHeaders { + w.Header().Set(k, v) + } + + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/profiler.go b/vendor/github.com/go-chi/chi/v5/middleware/profiler.go new file mode 100644 index 000000000..18158e56d --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/profiler.go @@ -0,0 +1,55 @@ +package middleware + +import ( + "expvar" + "fmt" + "net/http" + "net/http/pprof" + + "github.com/go-chi/chi/v5" +) + +// Profiler is a convenient subrouter used for mounting net/http/pprof. ie. +// +// func MyService() http.Handler { +// r := chi.NewRouter() +// // ..middlewares +// r.Mount("/debug", middleware.Profiler()) +// // ..routes +// return r +// } +func Profiler() http.Handler { + r := chi.NewRouter() + r.Use(NoCache) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, r.RequestURI+"/pprof/", http.StatusMovedPermanently) + }) + r.HandleFunc("/pprof", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, r.RequestURI+"/", http.StatusMovedPermanently) + }) + + r.HandleFunc("/pprof/*", pprof.Index) + r.HandleFunc("/pprof/cmdline", pprof.Cmdline) + r.HandleFunc("/pprof/profile", pprof.Profile) + r.HandleFunc("/pprof/symbol", pprof.Symbol) + r.HandleFunc("/pprof/trace", pprof.Trace) + r.HandleFunc("/vars", expVars) + + return r +} + +// Replicated from expvar.go as not public. +func expVars(w http.ResponseWriter, r *http.Request) { + first := true + w.Header().Set("Content-Type", "application/json") + fmt.Fprintf(w, "{\n") + expvar.Do(func(kv expvar.KeyValue) { + if !first { + fmt.Fprintf(w, ",\n") + } + first = false + fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value) + }) + fmt.Fprintf(w, "\n}\n") +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/realip.go b/vendor/github.com/go-chi/chi/v5/middleware/realip.go new file mode 100644 index 000000000..72db6ca9f --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/realip.go @@ -0,0 +1,54 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "net/http" + "strings" +) + +var xForwardedFor = http.CanonicalHeaderKey("X-Forwarded-For") +var xRealIP = http.CanonicalHeaderKey("X-Real-IP") + +// RealIP is a middleware that sets a http.Request's RemoteAddr to the results +// of parsing either the X-Forwarded-For header or the X-Real-IP header (in that +// order). +// +// This middleware should be inserted fairly early in the middleware stack to +// ensure that subsequent layers (e.g., request loggers) which examine the +// RemoteAddr will see the intended value. +// +// You should only use this middleware if you can trust the headers passed to +// you (in particular, the two headers this middleware uses), for example +// because you have placed a reverse proxy like HAProxy or nginx in front of +// chi. If your reverse proxies are configured to pass along arbitrary header +// values from the client, or if you use this middleware without a reverse +// proxy, malicious clients will be able to make you very sad (or, depending on +// how you're using RemoteAddr, vulnerable to an attack of some sort). +func RealIP(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if rip := realIP(r); rip != "" { + r.RemoteAddr = rip + } + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} + +func realIP(r *http.Request) string { + var ip string + + if xrip := r.Header.Get(xRealIP); xrip != "" { + ip = xrip + } else if xff := r.Header.Get(xForwardedFor); xff != "" { + i := strings.Index(xff, ", ") + if i == -1 { + i = len(xff) + } + ip = xff[:i] + } + + return ip +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/recoverer.go b/vendor/github.com/go-chi/chi/v5/middleware/recoverer.go new file mode 100644 index 000000000..785b18c52 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/recoverer.go @@ -0,0 +1,192 @@ +package middleware + +// The original work was derived from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "bytes" + "errors" + "fmt" + "net/http" + "os" + "runtime/debug" + "strings" +) + +// Recoverer is a middleware that recovers from panics, logs the panic (and a +// backtrace), and returns a HTTP 500 (Internal Server Error) status if +// possible. Recoverer prints a request ID if one is provided. +// +// Alternatively, look at https://github.com/pressly/lg middleware pkgs. +func Recoverer(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + defer func() { + if rvr := recover(); rvr != nil && rvr != http.ErrAbortHandler { + + logEntry := GetLogEntry(r) + if logEntry != nil { + logEntry.Panic(rvr, debug.Stack()) + } else { + PrintPrettyStack(rvr) + } + + w.WriteHeader(http.StatusInternalServerError) + } + }() + + next.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} + +func PrintPrettyStack(rvr interface{}) { + debugStack := debug.Stack() + s := prettyStack{} + out, err := s.parse(debugStack, rvr) + if err == nil { + os.Stderr.Write(out) + } else { + // print stdlib output as a fallback + os.Stderr.Write(debugStack) + } +} + +type prettyStack struct { +} + +func (s prettyStack) parse(debugStack []byte, rvr interface{}) ([]byte, error) { + var err error + useColor := true + buf := &bytes.Buffer{} + + cW(buf, false, bRed, "\n") + cW(buf, useColor, bCyan, " panic: ") + cW(buf, useColor, bBlue, "%v", rvr) + cW(buf, false, bWhite, "\n \n") + + // process debug stack info + stack := strings.Split(string(debugStack), "\n") + lines := []string{} + + // locate panic line, as we may have nested panics + for i := len(stack) - 1; i > 0; i-- { + lines = append(lines, stack[i]) + if strings.HasPrefix(stack[i], "panic(0x") { + lines = lines[0 : len(lines)-2] // remove boilerplate + break + } + } + + // reverse + for i := len(lines)/2 - 1; i >= 0; i-- { + opp := len(lines) - 1 - i + lines[i], lines[opp] = lines[opp], lines[i] + } + + // decorate + for i, line := range lines { + lines[i], err = s.decorateLine(line, useColor, i) + if err != nil { + return nil, err + } + } + + for _, l := range lines { + fmt.Fprintf(buf, "%s", l) + } + return buf.Bytes(), nil +} + +func (s prettyStack) decorateLine(line string, useColor bool, num int) (string, error) { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "\t") || strings.Contains(line, ".go:") { + return s.decorateSourceLine(line, useColor, num) + } else if strings.HasSuffix(line, ")") { + return s.decorateFuncCallLine(line, useColor, num) + } else { + if strings.HasPrefix(line, "\t") { + return strings.Replace(line, "\t", " ", 1), nil + } else { + return fmt.Sprintf(" %s\n", line), nil + } + } +} + +func (s prettyStack) decorateFuncCallLine(line string, useColor bool, num int) (string, error) { + idx := strings.LastIndex(line, "(") + if idx < 0 { + return "", errors.New("not a func call line") + } + + buf := &bytes.Buffer{} + pkg := line[0:idx] + // addr := line[idx:] + method := "" + + idx = strings.LastIndex(pkg, string(os.PathSeparator)) + if idx < 0 { + idx = strings.Index(pkg, ".") + method = pkg[idx:] + pkg = pkg[0:idx] + } else { + method = pkg[idx+1:] + pkg = pkg[0 : idx+1] + idx = strings.Index(method, ".") + pkg += method[0:idx] + method = method[idx:] + } + pkgColor := nYellow + methodColor := bGreen + + if num == 0 { + cW(buf, useColor, bRed, " -> ") + pkgColor = bMagenta + methodColor = bRed + } else { + cW(buf, useColor, bWhite, " ") + } + cW(buf, useColor, pkgColor, "%s", pkg) + cW(buf, useColor, methodColor, "%s\n", method) + // cW(buf, useColor, nBlack, "%s", addr) + return buf.String(), nil +} + +func (s prettyStack) decorateSourceLine(line string, useColor bool, num int) (string, error) { + idx := strings.LastIndex(line, ".go:") + if idx < 0 { + return "", errors.New("not a source line") + } + + buf := &bytes.Buffer{} + path := line[0 : idx+3] + lineno := line[idx+3:] + + idx = strings.LastIndex(path, string(os.PathSeparator)) + dir := path[0 : idx+1] + file := path[idx+1:] + + idx = strings.Index(lineno, " ") + if idx > 0 { + lineno = lineno[0:idx] + } + fileColor := bCyan + lineColor := bGreen + + if num == 1 { + cW(buf, useColor, bRed, " -> ") + fileColor = bRed + lineColor = bMagenta + } else { + cW(buf, false, bWhite, " ") + } + cW(buf, useColor, bWhite, "%s", dir) + cW(buf, useColor, fileColor, "%s", file) + cW(buf, useColor, lineColor, "%s", lineno) + if num == 1 { + cW(buf, false, bWhite, "\n") + } + cW(buf, false, bWhite, "\n") + + return buf.String(), nil +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/request_id.go b/vendor/github.com/go-chi/chi/v5/middleware/request_id.go new file mode 100644 index 000000000..4903ecc21 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/request_id.go @@ -0,0 +1,96 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "context" + "crypto/rand" + "encoding/base64" + "fmt" + "net/http" + "os" + "strings" + "sync/atomic" +) + +// Key to use when setting the request ID. +type ctxKeyRequestID int + +// RequestIDKey is the key that holds the unique request ID in a request context. +const RequestIDKey ctxKeyRequestID = 0 + +// RequestIDHeader is the name of the HTTP Header which contains the request id. +// Exported so that it can be changed by developers +var RequestIDHeader = "X-Request-Id" + +var prefix string +var reqid uint64 + +// A quick note on the statistics here: we're trying to calculate the chance that +// two randomly generated base62 prefixes will collide. We use the formula from +// http://en.wikipedia.org/wiki/Birthday_problem +// +// P[m, n] \approx 1 - e^{-m^2/2n} +// +// We ballpark an upper bound for $m$ by imagining (for whatever reason) a server +// that restarts every second over 10 years, for $m = 86400 * 365 * 10 = 315360000$ +// +// For a $k$ character base-62 identifier, we have $n(k) = 62^k$ +// +// Plugging this in, we find $P[m, n(10)] \approx 5.75%$, which is good enough for +// our purposes, and is surely more than anyone would ever need in practice -- a +// process that is rebooted a handful of times a day for a hundred years has less +// than a millionth of a percent chance of generating two colliding IDs. + +func init() { + hostname, err := os.Hostname() + if hostname == "" || err != nil { + hostname = "localhost" + } + var buf [12]byte + var b64 string + for len(b64) < 10 { + rand.Read(buf[:]) + b64 = base64.StdEncoding.EncodeToString(buf[:]) + b64 = strings.NewReplacer("+", "", "/", "").Replace(b64) + } + + prefix = fmt.Sprintf("%s/%s", hostname, b64[0:10]) +} + +// RequestID is a middleware that injects a request ID into the context of each +// request. A request ID is a string of the form "host.example.com/random-0001", +// where "random" is a base62 random string that uniquely identifies this go +// process, and where the last number is an atomically incremented request +// counter. +func RequestID(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + requestID := r.Header.Get(RequestIDHeader) + if requestID == "" { + myid := atomic.AddUint64(&reqid, 1) + requestID = fmt.Sprintf("%s-%06d", prefix, myid) + } + ctx = context.WithValue(ctx, RequestIDKey, requestID) + next.ServeHTTP(w, r.WithContext(ctx)) + } + return http.HandlerFunc(fn) +} + +// GetReqID returns a request ID from the given context if one is present. +// Returns the empty string if a request ID cannot be found. +func GetReqID(ctx context.Context) string { + if ctx == nil { + return "" + } + if reqID, ok := ctx.Value(RequestIDKey).(string); ok { + return reqID + } + return "" +} + +// NextRequestID generates the next request ID in the sequence. +func NextRequestID() uint64 { + return atomic.AddUint64(&reqid, 1) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/route_headers.go b/vendor/github.com/go-chi/chi/v5/middleware/route_headers.go new file mode 100644 index 000000000..0e67b5f76 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/route_headers.go @@ -0,0 +1,160 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// RouteHeaders is a neat little header-based router that allows you to direct +// the flow of a request through a middleware stack based on a request header. +// +// For example, lets say you'd like to setup multiple routers depending on the +// request Host header, you could then do something as so: +// +// r := chi.NewRouter() +// rSubdomain := chi.NewRouter() +// +// r.Use(middleware.RouteHeaders(). +// Route("Host", "example.com", middleware.New(r)). +// Route("Host", "*.example.com", middleware.New(rSubdomain)). +// Handler) +// +// r.Get("/", h) +// rSubdomain.Get("/", h2) +// +// +// Another example, imagine you want to setup multiple CORS handlers, where for +// your origin servers you allow authorized requests, but for third-party public +// requests, authorization is disabled. +// +// r := chi.NewRouter() +// +// r.Use(middleware.RouteHeaders(). +// Route("Origin", "https://app.skyweaver.net", cors.Handler(cors.Options{ +// AllowedOrigins: []string{"https://api.skyweaver.net"}, +// AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, +// AllowedHeaders: []string{"Accept", "Authorization", "Content-Type"}, +// AllowCredentials: true, // <----------<<< allow credentials +// })). +// Route("Origin", "*", cors.Handler(cors.Options{ +// AllowedOrigins: []string{"*"}, +// AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, +// AllowedHeaders: []string{"Accept", "Content-Type"}, +// AllowCredentials: false, // <----------<<< do not allow credentials +// })). +// Handler) +// +func RouteHeaders() HeaderRouter { + return HeaderRouter{} +} + +type HeaderRouter map[string][]HeaderRoute + +func (hr HeaderRouter) Route(header, match string, middlewareHandler func(next http.Handler) http.Handler) HeaderRouter { + header = strings.ToLower(header) + k := hr[header] + if k == nil { + hr[header] = []HeaderRoute{} + } + hr[header] = append(hr[header], HeaderRoute{MatchOne: NewPattern(match), Middleware: middlewareHandler}) + return hr +} + +func (hr HeaderRouter) RouteAny(header string, match []string, middlewareHandler func(next http.Handler) http.Handler) HeaderRouter { + header = strings.ToLower(header) + k := hr[header] + if k == nil { + hr[header] = []HeaderRoute{} + } + patterns := []Pattern{} + for _, m := range match { + patterns = append(patterns, NewPattern(m)) + } + hr[header] = append(hr[header], HeaderRoute{MatchAny: patterns, Middleware: middlewareHandler}) + return hr +} + +func (hr HeaderRouter) RouteDefault(handler func(next http.Handler) http.Handler) HeaderRouter { + hr["*"] = []HeaderRoute{{Middleware: handler}} + return hr +} + +func (hr HeaderRouter) Handler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if len(hr) == 0 { + // skip if no routes set + next.ServeHTTP(w, r) + } + + // find first matching header route, and continue + for header, matchers := range hr { + headerValue := r.Header.Get(header) + if headerValue == "" { + continue + } + headerValue = strings.ToLower(headerValue) + for _, matcher := range matchers { + if matcher.IsMatch(headerValue) { + matcher.Middleware(next).ServeHTTP(w, r) + return + } + } + } + + // if no match, check for "*" default route + matcher, ok := hr["*"] + if !ok || matcher[0].Middleware == nil { + next.ServeHTTP(w, r) + return + } + matcher[0].Middleware(next).ServeHTTP(w, r) + }) +} + +type HeaderRoute struct { + MatchAny []Pattern + MatchOne Pattern + Middleware func(next http.Handler) http.Handler +} + +func (r HeaderRoute) IsMatch(value string) bool { + if len(r.MatchAny) > 0 { + for _, m := range r.MatchAny { + if m.Match(value) { + return true + } + } + } else if r.MatchOne.Match(value) { + return true + } + return false +} + +type Pattern struct { + prefix string + suffix string + wildcard bool +} + +func NewPattern(value string) Pattern { + p := Pattern{} + if i := strings.IndexByte(value, '*'); i >= 0 { + p.wildcard = true + p.prefix = value[0:i] + p.suffix = value[i+1:] + } else { + p.prefix = value + } + return p +} + +func (p Pattern) Match(v string) bool { + if !p.wildcard { + if p.prefix == v { + return true + } else { + return false + } + } + return len(v) >= len(p.prefix+p.suffix) && strings.HasPrefix(v, p.prefix) && strings.HasSuffix(v, p.suffix) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/strip.go b/vendor/github.com/go-chi/chi/v5/middleware/strip.go new file mode 100644 index 000000000..ce8ebfcce --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/strip.go @@ -0,0 +1,62 @@ +package middleware + +import ( + "fmt" + "net/http" + + "github.com/go-chi/chi/v5" +) + +// StripSlashes is a middleware that will match request paths with a trailing +// slash, strip it from the path and continue routing through the mux, if a route +// matches, then it will serve the handler. +func StripSlashes(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + var path string + rctx := chi.RouteContext(r.Context()) + if rctx != nil && rctx.RoutePath != "" { + path = rctx.RoutePath + } else { + path = r.URL.Path + } + if len(path) > 1 && path[len(path)-1] == '/' { + newPath := path[:len(path)-1] + if rctx == nil { + r.URL.Path = newPath + } else { + rctx.RoutePath = newPath + } + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} + +// RedirectSlashes is a middleware that will match request paths with a trailing +// slash and redirect to the same path, less the trailing slash. +// +// NOTE: RedirectSlashes middleware is *incompatible* with http.FileServer, +// see https://github.com/go-chi/chi/issues/343 +func RedirectSlashes(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + var path string + rctx := chi.RouteContext(r.Context()) + if rctx != nil && rctx.RoutePath != "" { + path = rctx.RoutePath + } else { + path = r.URL.Path + } + if len(path) > 1 && path[len(path)-1] == '/' { + if r.URL.RawQuery != "" { + path = fmt.Sprintf("%s?%s", path[:len(path)-1], r.URL.RawQuery) + } else { + path = path[:len(path)-1] + } + redirectURL := fmt.Sprintf("//%s%s", r.Host, path) + http.Redirect(w, r, redirectURL, 301) + return + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/terminal.go b/vendor/github.com/go-chi/chi/v5/middleware/terminal.go new file mode 100644 index 000000000..5ead7b924 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/terminal.go @@ -0,0 +1,63 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "fmt" + "io" + "os" +) + +var ( + // Normal colors + nBlack = []byte{'\033', '[', '3', '0', 'm'} + nRed = []byte{'\033', '[', '3', '1', 'm'} + nGreen = []byte{'\033', '[', '3', '2', 'm'} + nYellow = []byte{'\033', '[', '3', '3', 'm'} + nBlue = []byte{'\033', '[', '3', '4', 'm'} + nMagenta = []byte{'\033', '[', '3', '5', 'm'} + nCyan = []byte{'\033', '[', '3', '6', 'm'} + nWhite = []byte{'\033', '[', '3', '7', 'm'} + // Bright colors + bBlack = []byte{'\033', '[', '3', '0', ';', '1', 'm'} + bRed = []byte{'\033', '[', '3', '1', ';', '1', 'm'} + bGreen = []byte{'\033', '[', '3', '2', ';', '1', 'm'} + bYellow = []byte{'\033', '[', '3', '3', ';', '1', 'm'} + bBlue = []byte{'\033', '[', '3', '4', ';', '1', 'm'} + bMagenta = []byte{'\033', '[', '3', '5', ';', '1', 'm'} + bCyan = []byte{'\033', '[', '3', '6', ';', '1', 'm'} + bWhite = []byte{'\033', '[', '3', '7', ';', '1', 'm'} + + reset = []byte{'\033', '[', '0', 'm'} +) + +var IsTTY bool + +func init() { + // This is sort of cheating: if stdout is a character device, we assume + // that means it's a TTY. Unfortunately, there are many non-TTY + // character devices, but fortunately stdout is rarely set to any of + // them. + // + // We could solve this properly by pulling in a dependency on + // code.google.com/p/go.crypto/ssh/terminal, for instance, but as a + // heuristic for whether to print in color or in black-and-white, I'd + // really rather not. + fi, err := os.Stdout.Stat() + if err == nil { + m := os.ModeDevice | os.ModeCharDevice + IsTTY = fi.Mode()&m == m + } +} + +// colorWrite +func cW(w io.Writer, useColor bool, color []byte, s string, args ...interface{}) { + if IsTTY && useColor { + w.Write(color) + } + fmt.Fprintf(w, s, args...) + if IsTTY && useColor { + w.Write(reset) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/throttle.go b/vendor/github.com/go-chi/chi/v5/middleware/throttle.go new file mode 100644 index 000000000..7bb2e804f --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/throttle.go @@ -0,0 +1,132 @@ +package middleware + +import ( + "net/http" + "strconv" + "time" +) + +const ( + errCapacityExceeded = "Server capacity exceeded." + errTimedOut = "Timed out while waiting for a pending request to complete." + errContextCanceled = "Context was canceled." +) + +var ( + defaultBacklogTimeout = time.Second * 60 +) + +// ThrottleOpts represents a set of throttling options. +type ThrottleOpts struct { + Limit int + BacklogLimit int + BacklogTimeout time.Duration + RetryAfterFn func(ctxDone bool) time.Duration +} + +// Throttle is a middleware that limits number of currently processed requests +// at a time across all users. Note: Throttle is not a rate-limiter per user, +// instead it just puts a ceiling on the number of currentl in-flight requests +// being processed from the point from where the Throttle middleware is mounted. +func Throttle(limit int) func(http.Handler) http.Handler { + return ThrottleWithOpts(ThrottleOpts{Limit: limit, BacklogTimeout: defaultBacklogTimeout}) +} + +// ThrottleBacklog is a middleware that limits number of currently processed +// requests at a time and provides a backlog for holding a finite number of +// pending requests. +func ThrottleBacklog(limit, backlogLimit int, backlogTimeout time.Duration) func(http.Handler) http.Handler { + return ThrottleWithOpts(ThrottleOpts{Limit: limit, BacklogLimit: backlogLimit, BacklogTimeout: backlogTimeout}) +} + +// ThrottleWithOpts is a middleware that limits number of currently processed requests using passed ThrottleOpts. +func ThrottleWithOpts(opts ThrottleOpts) func(http.Handler) http.Handler { + if opts.Limit < 1 { + panic("chi/middleware: Throttle expects limit > 0") + } + + if opts.BacklogLimit < 0 { + panic("chi/middleware: Throttle expects backlogLimit to be positive") + } + + t := throttler{ + tokens: make(chan token, opts.Limit), + backlogTokens: make(chan token, opts.Limit+opts.BacklogLimit), + backlogTimeout: opts.BacklogTimeout, + retryAfterFn: opts.RetryAfterFn, + } + + // Filling tokens. + for i := 0; i < opts.Limit+opts.BacklogLimit; i++ { + if i < opts.Limit { + t.tokens <- token{} + } + t.backlogTokens <- token{} + } + + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + select { + + case <-ctx.Done(): + t.setRetryAfterHeaderIfNeeded(w, true) + http.Error(w, errContextCanceled, http.StatusTooManyRequests) + return + + case btok := <-t.backlogTokens: + timer := time.NewTimer(t.backlogTimeout) + + defer func() { + t.backlogTokens <- btok + }() + + select { + case <-timer.C: + t.setRetryAfterHeaderIfNeeded(w, false) + http.Error(w, errTimedOut, http.StatusTooManyRequests) + return + case <-ctx.Done(): + timer.Stop() + t.setRetryAfterHeaderIfNeeded(w, true) + http.Error(w, errContextCanceled, http.StatusTooManyRequests) + return + case tok := <-t.tokens: + defer func() { + timer.Stop() + t.tokens <- tok + }() + next.ServeHTTP(w, r) + } + return + + default: + t.setRetryAfterHeaderIfNeeded(w, false) + http.Error(w, errCapacityExceeded, http.StatusTooManyRequests) + return + } + } + + return http.HandlerFunc(fn) + } +} + +// token represents a request that is being processed. +type token struct{} + +// throttler limits number of currently processed requests at a time. +type throttler struct { + tokens chan token + backlogTokens chan token + backlogTimeout time.Duration + retryAfterFn func(ctxDone bool) time.Duration +} + +// setRetryAfterHeaderIfNeeded sets Retry-After HTTP header if corresponding retryAfterFn option of throttler is initialized. +func (t throttler) setRetryAfterHeaderIfNeeded(w http.ResponseWriter, ctxDone bool) { + if t.retryAfterFn == nil { + return + } + w.Header().Set("Retry-After", strconv.Itoa(int(t.retryAfterFn(ctxDone).Seconds()))) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/timeout.go b/vendor/github.com/go-chi/chi/v5/middleware/timeout.go new file mode 100644 index 000000000..8e373536c --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/timeout.go @@ -0,0 +1,49 @@ +package middleware + +import ( + "context" + "net/http" + "time" +) + +// Timeout is a middleware that cancels ctx after a given timeout and return +// a 504 Gateway Timeout error to the client. +// +// It's required that you select the ctx.Done() channel to check for the signal +// if the context has reached its deadline and return, otherwise the timeout +// signal will be just ignored. +// +// ie. a route/handler may look like: +// +// r.Get("/long", func(w http.ResponseWriter, r *http.Request) { +// ctx := r.Context() +// processTime := time.Duration(rand.Intn(4)+1) * time.Second +// +// select { +// case <-ctx.Done(): +// return +// +// case <-time.After(processTime): +// // The above channel simulates some hard work. +// } +// +// w.Write([]byte("done")) +// }) +// +func Timeout(timeout time.Duration) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx, cancel := context.WithTimeout(r.Context(), timeout) + defer func() { + cancel() + if ctx.Err() == context.DeadlineExceeded { + w.WriteHeader(http.StatusGatewayTimeout) + } + }() + + r = r.WithContext(ctx) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/url_format.go b/vendor/github.com/go-chi/chi/v5/middleware/url_format.go new file mode 100644 index 000000000..10d7134dc --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/url_format.go @@ -0,0 +1,72 @@ +package middleware + +import ( + "context" + "net/http" + "strings" + + "github.com/go-chi/chi/v5" +) + +var ( + // URLFormatCtxKey is the context.Context key to store the URL format data + // for a request. + URLFormatCtxKey = &contextKey{"URLFormat"} +) + +// URLFormat is a middleware that parses the url extension from a request path and stores it +// on the context as a string under the key `middleware.URLFormatCtxKey`. The middleware will +// trim the suffix from the routing path and continue routing. +// +// Routers should not include a url parameter for the suffix when using this middleware. +// +// Sample usage.. for url paths: `/articles/1`, `/articles/1.json` and `/articles/1.xml` +// +// func routes() http.Handler { +// r := chi.NewRouter() +// r.Use(middleware.URLFormat) +// +// r.Get("/articles/{id}", ListArticles) +// +// return r +// } +// +// func ListArticles(w http.ResponseWriter, r *http.Request) { +// urlFormat, _ := r.Context().Value(middleware.URLFormatCtxKey).(string) +// +// switch urlFormat { +// case "json": +// render.JSON(w, r, articles) +// case "xml:" +// render.XML(w, r, articles) +// default: +// render.JSON(w, r, articles) +// } +// } +// +func URLFormat(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var format string + path := r.URL.Path + + if strings.Index(path, ".") > 0 { + base := strings.LastIndex(path, "/") + idx := strings.LastIndex(path[base:], ".") + + if idx > 0 { + idx += base + format = path[idx+1:] + + rctx := chi.RouteContext(r.Context()) + rctx.RoutePath = path[:idx] + } + } + + r = r.WithContext(context.WithValue(ctx, URLFormatCtxKey, format)) + + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/value.go b/vendor/github.com/go-chi/chi/v5/middleware/value.go new file mode 100644 index 000000000..a9dfd4345 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/value.go @@ -0,0 +1,17 @@ +package middleware + +import ( + "context" + "net/http" +) + +// WithValue is a middleware that sets a given key/value in a context chain. +func WithValue(key, val interface{}) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), key, val)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go b/vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go new file mode 100644 index 000000000..6438c7a65 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go @@ -0,0 +1,165 @@ +package middleware + +// The original work was derived from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "bufio" + "io" + "net" + "net/http" +) + +// NewWrapResponseWriter wraps an http.ResponseWriter, returning a proxy that allows you to +// hook into various parts of the response process. +func NewWrapResponseWriter(w http.ResponseWriter, protoMajor int) WrapResponseWriter { + _, fl := w.(http.Flusher) + + bw := basicWriter{ResponseWriter: w} + + if protoMajor == 2 { + _, ps := w.(http.Pusher) + if fl || ps { + return &http2FancyWriter{bw} + } + } else { + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + if fl || hj || rf { + return &httpFancyWriter{bw} + } + } + + return &bw +} + +// WrapResponseWriter is a proxy around an http.ResponseWriter that allows you to hook +// into various parts of the response process. +type WrapResponseWriter interface { + http.ResponseWriter + // Status returns the HTTP status of the request, or 0 if one has not + // yet been sent. + Status() int + // BytesWritten returns the total number of bytes sent to the client. + BytesWritten() int + // Tee causes the response body to be written to the given io.Writer in + // addition to proxying the writes through. Only one io.Writer can be + // tee'd to at once: setting a second one will overwrite the first. + // Writes will be sent to the proxy before being written to this + // io.Writer. It is illegal for the tee'd writer to be modified + // concurrently with writes. + Tee(io.Writer) + // Unwrap returns the original proxied target. + Unwrap() http.ResponseWriter +} + +// basicWriter wraps a http.ResponseWriter that implements the minimal +// http.ResponseWriter interface. +type basicWriter struct { + http.ResponseWriter + wroteHeader bool + code int + bytes int + tee io.Writer +} + +func (b *basicWriter) WriteHeader(code int) { + if !b.wroteHeader { + b.code = code + b.wroteHeader = true + b.ResponseWriter.WriteHeader(code) + } +} + +func (b *basicWriter) Write(buf []byte) (int, error) { + b.maybeWriteHeader() + n, err := b.ResponseWriter.Write(buf) + if b.tee != nil { + _, err2 := b.tee.Write(buf[:n]) + // Prefer errors generated by the proxied writer. + if err == nil { + err = err2 + } + } + b.bytes += n + return n, err +} + +func (b *basicWriter) maybeWriteHeader() { + if !b.wroteHeader { + b.WriteHeader(http.StatusOK) + } +} + +func (b *basicWriter) Status() int { + return b.code +} + +func (b *basicWriter) BytesWritten() int { + return b.bytes +} + +func (b *basicWriter) Tee(w io.Writer) { + b.tee = w +} + +func (b *basicWriter) Unwrap() http.ResponseWriter { + return b.ResponseWriter +} + +// httpFancyWriter is a HTTP writer that additionally satisfies +// http.Flusher, http.Hijacker, and io.ReaderFrom. It exists for the common case +// of wrapping the http.ResponseWriter that package http gives you, in order to +// make the proxied object support the full method set of the proxied object. +type httpFancyWriter struct { + basicWriter +} + +func (f *httpFancyWriter) Flush() { + f.wroteHeader = true + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +func (f *httpFancyWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj := f.basicWriter.ResponseWriter.(http.Hijacker) + return hj.Hijack() +} + +func (f *httpFancyWriter) ReadFrom(r io.Reader) (int64, error) { + if f.basicWriter.tee != nil { + n, err := io.Copy(&f.basicWriter, r) + f.basicWriter.bytes += int(n) + return n, err + } + rf := f.basicWriter.ResponseWriter.(io.ReaderFrom) + f.basicWriter.maybeWriteHeader() + n, err := rf.ReadFrom(r) + f.basicWriter.bytes += int(n) + return n, err +} + +var _ http.Flusher = &httpFancyWriter{} +var _ http.Hijacker = &httpFancyWriter{} +var _ io.ReaderFrom = &httpFancyWriter{} + +// http2FancyWriter is a HTTP2 writer that additionally satisfies +// http.Flusher, and io.ReaderFrom. It exists for the common case +// of wrapping the http.ResponseWriter that package http gives you, in order to +// make the proxied object support the full method set of the proxied object. +type http2FancyWriter struct { + basicWriter +} + +func (f *http2FancyWriter) Flush() { + f.wroteHeader = true + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +func (f *http2FancyWriter) Push(target string, opts *http.PushOptions) error { + return f.basicWriter.ResponseWriter.(http.Pusher).Push(target, opts) +} + +var _ http.Flusher = &http2FancyWriter{} +var _ http.Pusher = &http2FancyWriter{} diff --git a/vendor/github.com/go-chi/chi/v5/mux.go b/vendor/github.com/go-chi/chi/v5/mux.go new file mode 100644 index 000000000..146643b04 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/mux.go @@ -0,0 +1,479 @@ +package chi + +import ( + "context" + "fmt" + "net/http" + "strings" + "sync" +) + +var _ Router = &Mux{} + +// Mux is a simple HTTP route multiplexer that parses a request path, +// records any URL params, and executes an end handler. It implements +// the http.Handler interface and is friendly with the standard library. +// +// Mux is designed to be fast, minimal and offer a powerful API for building +// modular and composable HTTP services with a large set of handlers. It's +// particularly useful for writing large REST API services that break a handler +// into many smaller parts composed of middlewares and end handlers. +type Mux struct { + // The radix trie router + tree *node + + // The middleware stack + middlewares []func(http.Handler) http.Handler + + // Controls the behaviour of middleware chain generation when a mux + // is registered as an inline group inside another mux. + inline bool + parent *Mux + + // The computed mux handler made of the chained middleware stack and + // the tree router + handler http.Handler + + // Routing context pool + pool *sync.Pool + + // Custom route not found handler + notFoundHandler http.HandlerFunc + + // Custom method not allowed handler + methodNotAllowedHandler http.HandlerFunc +} + +// NewMux returns a newly initialized Mux object that implements the Router +// interface. +func NewMux() *Mux { + mux := &Mux{tree: &node{}, pool: &sync.Pool{}} + mux.pool.New = func() interface{} { + return NewRouteContext() + } + return mux +} + +// ServeHTTP is the single method of the http.Handler interface that makes +// Mux interoperable with the standard library. It uses a sync.Pool to get and +// reuse routing contexts for each request. +func (mx *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Ensure the mux has some routes defined on the mux + if mx.handler == nil { + mx.NotFoundHandler().ServeHTTP(w, r) + return + } + + // Check if a routing context already exists from a parent router. + rctx, _ := r.Context().Value(RouteCtxKey).(*Context) + if rctx != nil { + mx.handler.ServeHTTP(w, r) + return + } + + // Fetch a RouteContext object from the sync pool, and call the computed + // mx.handler that is comprised of mx.middlewares + mx.routeHTTP. + // Once the request is finished, reset the routing context and put it back + // into the pool for reuse from another request. + rctx = mx.pool.Get().(*Context) + rctx.Reset() + rctx.Routes = mx + rctx.parentCtx = r.Context() + + // NOTE: r.WithContext() causes 2 allocations and context.WithValue() causes 1 allocation + r = r.WithContext(context.WithValue(r.Context(), RouteCtxKey, rctx)) + + // Serve the request and once its done, put the request context back in the sync pool + mx.handler.ServeHTTP(w, r) + mx.pool.Put(rctx) +} + +// Use appends a middleware handler to the Mux middleware stack. +// +// The middleware stack for any Mux will execute before searching for a matching +// route to a specific handler, which provides opportunity to respond early, +// change the course of the request execution, or set request-scoped values for +// the next http.Handler. +func (mx *Mux) Use(middlewares ...func(http.Handler) http.Handler) { + if mx.handler != nil { + panic("chi: all middlewares must be defined before routes on a mux") + } + mx.middlewares = append(mx.middlewares, middlewares...) +} + +// Handle adds the route `pattern` that matches any http method to +// execute the `handler` http.Handler. +func (mx *Mux) Handle(pattern string, handler http.Handler) { + mx.handle(mALL, pattern, handler) +} + +// HandleFunc adds the route `pattern` that matches any http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) HandleFunc(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mALL, pattern, handlerFn) +} + +// Method adds the route `pattern` that matches `method` http method to +// execute the `handler` http.Handler. +func (mx *Mux) Method(method, pattern string, handler http.Handler) { + m, ok := methodMap[strings.ToUpper(method)] + if !ok { + panic(fmt.Sprintf("chi: '%s' http method is not supported.", method)) + } + mx.handle(m, pattern, handler) +} + +// MethodFunc adds the route `pattern` that matches `method` http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) MethodFunc(method, pattern string, handlerFn http.HandlerFunc) { + mx.Method(method, pattern, handlerFn) +} + +// Connect adds the route `pattern` that matches a CONNECT http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Connect(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mCONNECT, pattern, handlerFn) +} + +// Delete adds the route `pattern` that matches a DELETE http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Delete(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mDELETE, pattern, handlerFn) +} + +// Get adds the route `pattern` that matches a GET http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Get(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mGET, pattern, handlerFn) +} + +// Head adds the route `pattern` that matches a HEAD http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Head(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mHEAD, pattern, handlerFn) +} + +// Options adds the route `pattern` that matches a OPTIONS http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Options(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mOPTIONS, pattern, handlerFn) +} + +// Patch adds the route `pattern` that matches a PATCH http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Patch(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPATCH, pattern, handlerFn) +} + +// Post adds the route `pattern` that matches a POST http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Post(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPOST, pattern, handlerFn) +} + +// Put adds the route `pattern` that matches a PUT http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Put(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPUT, pattern, handlerFn) +} + +// Trace adds the route `pattern` that matches a TRACE http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Trace(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mTRACE, pattern, handlerFn) +} + +// NotFound sets a custom http.HandlerFunc for routing paths that could +// not be found. The default 404 handler is `http.NotFound`. +func (mx *Mux) NotFound(handlerFn http.HandlerFunc) { + // Build NotFound handler chain + m := mx + h := Chain(mx.middlewares...).HandlerFunc(handlerFn).ServeHTTP + if mx.inline && mx.parent != nil { + m = mx.parent + } + + // Update the notFoundHandler from this point forward + m.notFoundHandler = h + m.updateSubRoutes(func(subMux *Mux) { + if subMux.notFoundHandler == nil { + subMux.NotFound(h) + } + }) +} + +// MethodNotAllowed sets a custom http.HandlerFunc for routing paths where the +// method is unresolved. The default handler returns a 405 with an empty body. +func (mx *Mux) MethodNotAllowed(handlerFn http.HandlerFunc) { + // Build MethodNotAllowed handler chain + m := mx + h := Chain(mx.middlewares...).HandlerFunc(handlerFn).ServeHTTP + if mx.inline && mx.parent != nil { + m = mx.parent + } + + // Update the methodNotAllowedHandler from this point forward + m.methodNotAllowedHandler = h + m.updateSubRoutes(func(subMux *Mux) { + if subMux.methodNotAllowedHandler == nil { + subMux.MethodNotAllowed(h) + } + }) +} + +// With adds inline middlewares for an endpoint handler. +func (mx *Mux) With(middlewares ...func(http.Handler) http.Handler) Router { + // Similarly as in handle(), we must build the mux handler once additional + // middleware registration isn't allowed for this stack, like now. + if !mx.inline && mx.handler == nil { + mx.updateRouteHandler() + } + + // Copy middlewares from parent inline muxs + var mws Middlewares + if mx.inline { + mws = make(Middlewares, len(mx.middlewares)) + copy(mws, mx.middlewares) + } + mws = append(mws, middlewares...) + + im := &Mux{ + pool: mx.pool, inline: true, parent: mx, tree: mx.tree, middlewares: mws, + notFoundHandler: mx.notFoundHandler, methodNotAllowedHandler: mx.methodNotAllowedHandler, + } + + return im +} + +// Group creates a new inline-Mux with a fresh middleware stack. It's useful +// for a group of handlers along the same routing path that use an additional +// set of middlewares. See _examples/. +func (mx *Mux) Group(fn func(r Router)) Router { + im := mx.With().(*Mux) + if fn != nil { + fn(im) + } + return im +} + +// Route creates a new Mux with a fresh middleware stack and mounts it +// along the `pattern` as a subrouter. Effectively, this is a short-hand +// call to Mount. See _examples/. +func (mx *Mux) Route(pattern string, fn func(r Router)) Router { + if fn == nil { + panic(fmt.Sprintf("chi: attempting to Route() a nil subrouter on '%s'", pattern)) + } + subRouter := NewRouter() + fn(subRouter) + mx.Mount(pattern, subRouter) + return subRouter +} + +// Mount attaches another http.Handler or chi Router as a subrouter along a routing +// path. It's very useful to split up a large API as many independent routers and +// compose them as a single service using Mount. See _examples/. +// +// Note that Mount() simply sets a wildcard along the `pattern` that will continue +// routing at the `handler`, which in most cases is another chi.Router. As a result, +// if you define two Mount() routes on the exact same pattern the mount will panic. +func (mx *Mux) Mount(pattern string, handler http.Handler) { + if handler == nil { + panic(fmt.Sprintf("chi: attempting to Mount() a nil handler on '%s'", pattern)) + } + + // Provide runtime safety for ensuring a pattern isn't mounted on an existing + // routing pattern. + if mx.tree.findPattern(pattern+"*") || mx.tree.findPattern(pattern+"/*") { + panic(fmt.Sprintf("chi: attempting to Mount() a handler on an existing path, '%s'", pattern)) + } + + // Assign sub-Router's with the parent not found & method not allowed handler if not specified. + subr, ok := handler.(*Mux) + if ok && subr.notFoundHandler == nil && mx.notFoundHandler != nil { + subr.NotFound(mx.notFoundHandler) + } + if ok && subr.methodNotAllowedHandler == nil && mx.methodNotAllowedHandler != nil { + subr.MethodNotAllowed(mx.methodNotAllowedHandler) + } + + mountHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rctx := RouteContext(r.Context()) + + // shift the url path past the previous subrouter + rctx.RoutePath = mx.nextRoutePath(rctx) + + // reset the wildcard URLParam which connects the subrouter + n := len(rctx.URLParams.Keys) - 1 + if n >= 0 && rctx.URLParams.Keys[n] == "*" && len(rctx.URLParams.Values) > n { + rctx.URLParams.Values[n] = "" + } + + handler.ServeHTTP(w, r) + }) + + if pattern == "" || pattern[len(pattern)-1] != '/' { + mx.handle(mALL|mSTUB, pattern, mountHandler) + mx.handle(mALL|mSTUB, pattern+"/", mountHandler) + pattern += "/" + } + + method := mALL + subroutes, _ := handler.(Routes) + if subroutes != nil { + method |= mSTUB + } + n := mx.handle(method, pattern+"*", mountHandler) + + if subroutes != nil { + n.subroutes = subroutes + } +} + +// Routes returns a slice of routing information from the tree, +// useful for traversing available routes of a router. +func (mx *Mux) Routes() []Route { + return mx.tree.routes() +} + +// Middlewares returns a slice of middleware handler functions. +func (mx *Mux) Middlewares() Middlewares { + return mx.middlewares +} + +// Match searches the routing tree for a handler that matches the method/path. +// It's similar to routing a http request, but without executing the handler +// thereafter. +// +// Note: the *Context state is updated during execution, so manage +// the state carefully or make a NewRouteContext(). +func (mx *Mux) Match(rctx *Context, method, path string) bool { + m, ok := methodMap[method] + if !ok { + return false + } + + node, _, h := mx.tree.FindRoute(rctx, m, path) + + if node != nil && node.subroutes != nil { + rctx.RoutePath = mx.nextRoutePath(rctx) + return node.subroutes.Match(rctx, method, rctx.RoutePath) + } + + return h != nil +} + +// NotFoundHandler returns the default Mux 404 responder whenever a route +// cannot be found. +func (mx *Mux) NotFoundHandler() http.HandlerFunc { + if mx.notFoundHandler != nil { + return mx.notFoundHandler + } + return http.NotFound +} + +// MethodNotAllowedHandler returns the default Mux 405 responder whenever +// a method cannot be resolved for a route. +func (mx *Mux) MethodNotAllowedHandler() http.HandlerFunc { + if mx.methodNotAllowedHandler != nil { + return mx.methodNotAllowedHandler + } + return methodNotAllowedHandler +} + +// handle registers a http.Handler in the routing tree for a particular http method +// and routing pattern. +func (mx *Mux) handle(method methodTyp, pattern string, handler http.Handler) *node { + if len(pattern) == 0 || pattern[0] != '/' { + panic(fmt.Sprintf("chi: routing pattern must begin with '/' in '%s'", pattern)) + } + + // Build the computed routing handler for this routing pattern. + if !mx.inline && mx.handler == nil { + mx.updateRouteHandler() + } + + // Build endpoint handler with inline middlewares for the route + var h http.Handler + if mx.inline { + mx.handler = http.HandlerFunc(mx.routeHTTP) + h = Chain(mx.middlewares...).Handler(handler) + } else { + h = handler + } + + // Add the endpoint to the tree and return the node + return mx.tree.InsertRoute(method, pattern, h) +} + +// routeHTTP routes a http.Request through the Mux routing tree to serve +// the matching handler for a particular http method. +func (mx *Mux) routeHTTP(w http.ResponseWriter, r *http.Request) { + // Grab the route context object + rctx := r.Context().Value(RouteCtxKey).(*Context) + + // The request routing path + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + } + + // Check if method is supported by chi + if rctx.RouteMethod == "" { + rctx.RouteMethod = r.Method + } + method, ok := methodMap[rctx.RouteMethod] + if !ok { + mx.MethodNotAllowedHandler().ServeHTTP(w, r) + return + } + + // Find the route + if _, _, h := mx.tree.FindRoute(rctx, method, routePath); h != nil { + h.ServeHTTP(w, r) + return + } + if rctx.methodNotAllowed { + mx.MethodNotAllowedHandler().ServeHTTP(w, r) + } else { + mx.NotFoundHandler().ServeHTTP(w, r) + } +} + +func (mx *Mux) nextRoutePath(rctx *Context) string { + routePath := "/" + nx := len(rctx.routeParams.Keys) - 1 // index of last param in list + if nx >= 0 && rctx.routeParams.Keys[nx] == "*" && len(rctx.routeParams.Values) > nx { + routePath = "/" + rctx.routeParams.Values[nx] + } + return routePath +} + +// Recursively update data on child routers. +func (mx *Mux) updateSubRoutes(fn func(subMux *Mux)) { + for _, r := range mx.tree.routes() { + subMux, ok := r.SubRoutes.(*Mux) + if !ok { + continue + } + fn(subMux) + } +} + +// updateRouteHandler builds the single mux handler that is a chain of the middleware +// stack, as defined by calls to Use(), and the tree router (Mux) itself. After this +// point, no other middlewares can be registered on this Mux's stack. But you can still +// compose additional middlewares via Group()'s or using a chained middleware handler. +func (mx *Mux) updateRouteHandler() { + mx.handler = chain(mx.middlewares, http.HandlerFunc(mx.routeHTTP)) +} + +// methodNotAllowedHandler is a helper function to respond with a 405, +// method not allowed. +func methodNotAllowedHandler(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(405) + w.Write(nil) +} diff --git a/vendor/github.com/go-chi/chi/v5/tree.go b/vendor/github.com/go-chi/chi/v5/tree.go new file mode 100644 index 000000000..8057c5281 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/tree.go @@ -0,0 +1,866 @@ +package chi + +// Radix tree implementation below is a based on the original work by +// Armon Dadgar in https://github.com/armon/go-radix/blob/master/radix.go +// (MIT licensed). It's been heavily modified for use as a HTTP routing tree. + +import ( + "fmt" + "net/http" + "regexp" + "sort" + "strconv" + "strings" +) + +type methodTyp int + +const ( + mSTUB methodTyp = 1 << iota + mCONNECT + mDELETE + mGET + mHEAD + mOPTIONS + mPATCH + mPOST + mPUT + mTRACE +) + +var mALL = mCONNECT | mDELETE | mGET | mHEAD | + mOPTIONS | mPATCH | mPOST | mPUT | mTRACE + +var methodMap = map[string]methodTyp{ + http.MethodConnect: mCONNECT, + http.MethodDelete: mDELETE, + http.MethodGet: mGET, + http.MethodHead: mHEAD, + http.MethodOptions: mOPTIONS, + http.MethodPatch: mPATCH, + http.MethodPost: mPOST, + http.MethodPut: mPUT, + http.MethodTrace: mTRACE, +} + +// RegisterMethod adds support for custom HTTP method handlers, available +// via Router#Method and Router#MethodFunc +func RegisterMethod(method string) { + if method == "" { + return + } + method = strings.ToUpper(method) + if _, ok := methodMap[method]; ok { + return + } + n := len(methodMap) + if n > strconv.IntSize-2 { + panic(fmt.Sprintf("chi: max number of methods reached (%d)", strconv.IntSize)) + } + mt := methodTyp(2 << n) + methodMap[method] = mt + mALL |= mt +} + +type nodeTyp uint8 + +const ( + ntStatic nodeTyp = iota // /home + ntRegexp // /{id:[0-9]+} + ntParam // /{user} + ntCatchAll // /api/v1/* +) + +type node struct { + // node type: static, regexp, param, catchAll + typ nodeTyp + + // first byte of the prefix + label byte + + // first byte of the child prefix + tail byte + + // prefix is the common prefix we ignore + prefix string + + // regexp matcher for regexp nodes + rex *regexp.Regexp + + // HTTP handler endpoints on the leaf node + endpoints endpoints + + // subroutes on the leaf node + subroutes Routes + + // child nodes should be stored in-order for iteration, + // in groups of the node type. + children [ntCatchAll + 1]nodes +} + +// endpoints is a mapping of http method constants to handlers +// for a given route. +type endpoints map[methodTyp]*endpoint + +type endpoint struct { + // endpoint handler + handler http.Handler + + // pattern is the routing pattern for handler nodes + pattern string + + // parameter keys recorded on handler nodes + paramKeys []string +} + +func (s endpoints) Value(method methodTyp) *endpoint { + mh, ok := s[method] + if !ok { + mh = &endpoint{} + s[method] = mh + } + return mh +} + +func (n *node) InsertRoute(method methodTyp, pattern string, handler http.Handler) *node { + var parent *node + search := pattern + + for { + // Handle key exhaustion + if len(search) == 0 { + // Insert or update the node's leaf handler + n.setEndpoint(method, handler, pattern) + return n + } + + // We're going to be searching for a wild node next, + // in this case, we need to get the tail + var label = search[0] + var segTail byte + var segEndIdx int + var segTyp nodeTyp + var segRexpat string + if label == '{' || label == '*' { + segTyp, _, segRexpat, segTail, _, segEndIdx = patNextSegment(search) + } + + var prefix string + if segTyp == ntRegexp { + prefix = segRexpat + } + + // Look for the edge to attach to + parent = n + n = n.getEdge(segTyp, label, segTail, prefix) + + // No edge, create one + if n == nil { + child := &node{label: label, tail: segTail, prefix: search} + hn := parent.addChild(child, search) + hn.setEndpoint(method, handler, pattern) + + return hn + } + + // Found an edge to match the pattern + + if n.typ > ntStatic { + // We found a param node, trim the param from the search path and continue. + // This param/wild pattern segment would already be on the tree from a previous + // call to addChild when creating a new node. + search = search[segEndIdx:] + continue + } + + // Static nodes fall below here. + // Determine longest prefix of the search key on match. + commonPrefix := longestPrefix(search, n.prefix) + if commonPrefix == len(n.prefix) { + // the common prefix is as long as the current node's prefix we're attempting to insert. + // keep the search going. + search = search[commonPrefix:] + continue + } + + // Split the node + child := &node{ + typ: ntStatic, + prefix: search[:commonPrefix], + } + parent.replaceChild(search[0], segTail, child) + + // Restore the existing node + n.label = n.prefix[commonPrefix] + n.prefix = n.prefix[commonPrefix:] + child.addChild(n, n.prefix) + + // If the new key is a subset, set the method/handler on this node and finish. + search = search[commonPrefix:] + if len(search) == 0 { + child.setEndpoint(method, handler, pattern) + return child + } + + // Create a new edge for the node + subchild := &node{ + typ: ntStatic, + label: search[0], + prefix: search, + } + hn := child.addChild(subchild, search) + hn.setEndpoint(method, handler, pattern) + return hn + } +} + +// addChild appends the new `child` node to the tree using the `pattern` as the trie key. +// For a URL router like chi's, we split the static, param, regexp and wildcard segments +// into different nodes. In addition, addChild will recursively call itself until every +// pattern segment is added to the url pattern tree as individual nodes, depending on type. +func (n *node) addChild(child *node, prefix string) *node { + search := prefix + + // handler leaf node added to the tree is the child. + // this may be overridden later down the flow + hn := child + + // Parse next segment + segTyp, _, segRexpat, segTail, segStartIdx, segEndIdx := patNextSegment(search) + + // Add child depending on next up segment + switch segTyp { + + case ntStatic: + // Search prefix is all static (that is, has no params in path) + // noop + + default: + // Search prefix contains a param, regexp or wildcard + + if segTyp == ntRegexp { + rex, err := regexp.Compile(segRexpat) + if err != nil { + panic(fmt.Sprintf("chi: invalid regexp pattern '%s' in route param", segRexpat)) + } + child.prefix = segRexpat + child.rex = rex + } + + if segStartIdx == 0 { + // Route starts with a param + child.typ = segTyp + + if segTyp == ntCatchAll { + segStartIdx = -1 + } else { + segStartIdx = segEndIdx + } + if segStartIdx < 0 { + segStartIdx = len(search) + } + child.tail = segTail // for params, we set the tail + + if segStartIdx != len(search) { + // add static edge for the remaining part, split the end. + // its not possible to have adjacent param nodes, so its certainly + // going to be a static node next. + + search = search[segStartIdx:] // advance search position + + nn := &node{ + typ: ntStatic, + label: search[0], + prefix: search, + } + hn = child.addChild(nn, search) + } + + } else if segStartIdx > 0 { + // Route has some param + + // starts with a static segment + child.typ = ntStatic + child.prefix = search[:segStartIdx] + child.rex = nil + + // add the param edge node + search = search[segStartIdx:] + + nn := &node{ + typ: segTyp, + label: search[0], + tail: segTail, + } + hn = child.addChild(nn, search) + + } + } + + n.children[child.typ] = append(n.children[child.typ], child) + n.children[child.typ].Sort() + return hn +} + +func (n *node) replaceChild(label, tail byte, child *node) { + for i := 0; i < len(n.children[child.typ]); i++ { + if n.children[child.typ][i].label == label && n.children[child.typ][i].tail == tail { + n.children[child.typ][i] = child + n.children[child.typ][i].label = label + n.children[child.typ][i].tail = tail + return + } + } + panic("chi: replacing missing child") +} + +func (n *node) getEdge(ntyp nodeTyp, label, tail byte, prefix string) *node { + nds := n.children[ntyp] + for i := 0; i < len(nds); i++ { + if nds[i].label == label && nds[i].tail == tail { + if ntyp == ntRegexp && nds[i].prefix != prefix { + continue + } + return nds[i] + } + } + return nil +} + +func (n *node) setEndpoint(method methodTyp, handler http.Handler, pattern string) { + // Set the handler for the method type on the node + if n.endpoints == nil { + n.endpoints = make(endpoints) + } + + paramKeys := patParamKeys(pattern) + + if method&mSTUB == mSTUB { + n.endpoints.Value(mSTUB).handler = handler + } + if method&mALL == mALL { + h := n.endpoints.Value(mALL) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + for _, m := range methodMap { + h := n.endpoints.Value(m) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + } + } else { + h := n.endpoints.Value(method) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + } +} + +func (n *node) FindRoute(rctx *Context, method methodTyp, path string) (*node, endpoints, http.Handler) { + // Reset the context routing pattern and params + rctx.routePattern = "" + rctx.routeParams.Keys = rctx.routeParams.Keys[:0] + rctx.routeParams.Values = rctx.routeParams.Values[:0] + + // Find the routing handlers for the path + rn := n.findRoute(rctx, method, path) + if rn == nil { + return nil, nil, nil + } + + // Record the routing params in the request lifecycle + rctx.URLParams.Keys = append(rctx.URLParams.Keys, rctx.routeParams.Keys...) + rctx.URLParams.Values = append(rctx.URLParams.Values, rctx.routeParams.Values...) + + // Record the routing pattern in the request lifecycle + if rn.endpoints[method].pattern != "" { + rctx.routePattern = rn.endpoints[method].pattern + rctx.RoutePatterns = append(rctx.RoutePatterns, rctx.routePattern) + } + + return rn, rn.endpoints, rn.endpoints[method].handler +} + +// Recursive edge traversal by checking all nodeTyp groups along the way. +// It's like searching through a multi-dimensional radix trie. +func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { + nn := n + search := path + + for t, nds := range nn.children { + ntyp := nodeTyp(t) + if len(nds) == 0 { + continue + } + + var xn *node + xsearch := search + + var label byte + if search != "" { + label = search[0] + } + + switch ntyp { + case ntStatic: + xn = nds.findEdge(label) + if xn == nil || !strings.HasPrefix(xsearch, xn.prefix) { + continue + } + xsearch = xsearch[len(xn.prefix):] + + case ntParam, ntRegexp: + // short-circuit and return no matching route for empty param values + if xsearch == "" { + continue + } + + // serially loop through each node grouped by the tail delimiter + for idx := 0; idx < len(nds); idx++ { + xn = nds[idx] + + // label for param nodes is the delimiter byte + p := strings.IndexByte(xsearch, xn.tail) + + if p < 0 { + if xn.tail == '/' { + p = len(xsearch) + } else { + continue + } + } else if ntyp == ntRegexp && p == 0 { + continue + } + + if ntyp == ntRegexp && xn.rex != nil { + if !xn.rex.MatchString(xsearch[:p]) { + continue + } + } else if strings.IndexByte(xsearch[:p], '/') != -1 { + // avoid a match across path segments + continue + } + + prevlen := len(rctx.routeParams.Values) + rctx.routeParams.Values = append(rctx.routeParams.Values, xsearch[:p]) + xsearch = xsearch[p:] + + if len(xsearch) == 0 { + if xn.isLeaf() { + h := xn.endpoints[method] + if h != nil && h.handler != nil { + rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) + return xn + } + + // flag that the routing context found a route, but not a corresponding + // supported method + rctx.methodNotAllowed = true + } + } + + // recursively find the next node on this branch + fin := xn.findRoute(rctx, method, xsearch) + if fin != nil { + return fin + } + + // not found on this branch, reset vars + rctx.routeParams.Values = rctx.routeParams.Values[:prevlen] + xsearch = search + } + + rctx.routeParams.Values = append(rctx.routeParams.Values, "") + + default: + // catch-all nodes + rctx.routeParams.Values = append(rctx.routeParams.Values, search) + xn = nds[0] + xsearch = "" + } + + if xn == nil { + continue + } + + // did we find it yet? + if len(xsearch) == 0 { + if xn.isLeaf() { + h := xn.endpoints[method] + if h != nil && h.handler != nil { + rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) + return xn + } + + // flag that the routing context found a route, but not a corresponding + // supported method + rctx.methodNotAllowed = true + } + } + + // recursively find the next node.. + fin := xn.findRoute(rctx, method, xsearch) + if fin != nil { + return fin + } + + // Did not find final handler, let's remove the param here if it was set + if xn.typ > ntStatic { + if len(rctx.routeParams.Values) > 0 { + rctx.routeParams.Values = rctx.routeParams.Values[:len(rctx.routeParams.Values)-1] + } + } + + } + + return nil +} + +func (n *node) findEdge(ntyp nodeTyp, label byte) *node { + nds := n.children[ntyp] + num := len(nds) + idx := 0 + + switch ntyp { + case ntStatic, ntParam, ntRegexp: + i, j := 0, num-1 + for i <= j { + idx = i + (j-i)/2 + if label > nds[idx].label { + i = idx + 1 + } else if label < nds[idx].label { + j = idx - 1 + } else { + i = num // breaks cond + } + } + if nds[idx].label != label { + return nil + } + return nds[idx] + + default: // catch all + return nds[idx] + } +} + +func (n *node) isLeaf() bool { + return n.endpoints != nil +} + +func (n *node) findPattern(pattern string) bool { + nn := n + for _, nds := range nn.children { + if len(nds) == 0 { + continue + } + + n = nn.findEdge(nds[0].typ, pattern[0]) + if n == nil { + continue + } + + var idx int + var xpattern string + + switch n.typ { + case ntStatic: + idx = longestPrefix(pattern, n.prefix) + if idx < len(n.prefix) { + continue + } + + case ntParam, ntRegexp: + idx = strings.IndexByte(pattern, '}') + 1 + + case ntCatchAll: + idx = longestPrefix(pattern, "*") + + default: + panic("chi: unknown node type") + } + + xpattern = pattern[idx:] + if len(xpattern) == 0 { + return true + } + + return n.findPattern(xpattern) + } + return false +} + +func (n *node) routes() []Route { + rts := []Route{} + + n.walk(func(eps endpoints, subroutes Routes) bool { + if eps[mSTUB] != nil && eps[mSTUB].handler != nil && subroutes == nil { + return false + } + + // Group methodHandlers by unique patterns + pats := make(map[string]endpoints) + + for mt, h := range eps { + if h.pattern == "" { + continue + } + p, ok := pats[h.pattern] + if !ok { + p = endpoints{} + pats[h.pattern] = p + } + p[mt] = h + } + + for p, mh := range pats { + hs := make(map[string]http.Handler) + if mh[mALL] != nil && mh[mALL].handler != nil { + hs["*"] = mh[mALL].handler + } + + for mt, h := range mh { + if h.handler == nil { + continue + } + m := methodTypString(mt) + if m == "" { + continue + } + hs[m] = h.handler + } + + rt := Route{p, hs, subroutes} + rts = append(rts, rt) + } + + return false + }) + + return rts +} + +func (n *node) walk(fn func(eps endpoints, subroutes Routes) bool) bool { + // Visit the leaf values if any + if (n.endpoints != nil || n.subroutes != nil) && fn(n.endpoints, n.subroutes) { + return true + } + + // Recurse on the children + for _, ns := range n.children { + for _, cn := range ns { + if cn.walk(fn) { + return true + } + } + } + return false +} + +// patNextSegment returns the next segment details from a pattern: +// node type, param key, regexp string, param tail byte, param starting index, param ending index +func patNextSegment(pattern string) (nodeTyp, string, string, byte, int, int) { + ps := strings.Index(pattern, "{") + ws := strings.Index(pattern, "*") + + if ps < 0 && ws < 0 { + return ntStatic, "", "", 0, 0, len(pattern) // we return the entire thing + } + + // Sanity check + if ps >= 0 && ws >= 0 && ws < ps { + panic("chi: wildcard '*' must be the last pattern in a route, otherwise use a '{param}'") + } + + var tail byte = '/' // Default endpoint tail to / byte + + if ps >= 0 { + // Param/Regexp pattern is next + nt := ntParam + + // Read to closing } taking into account opens and closes in curl count (cc) + cc := 0 + pe := ps + for i, c := range pattern[ps:] { + if c == '{' { + cc++ + } else if c == '}' { + cc-- + if cc == 0 { + pe = ps + i + break + } + } + } + if pe == ps { + panic("chi: route param closing delimiter '}' is missing") + } + + key := pattern[ps+1 : pe] + pe++ // set end to next position + + if pe < len(pattern) { + tail = pattern[pe] + } + + var rexpat string + if idx := strings.Index(key, ":"); idx >= 0 { + nt = ntRegexp + rexpat = key[idx+1:] + key = key[:idx] + } + + if len(rexpat) > 0 { + if rexpat[0] != '^' { + rexpat = "^" + rexpat + } + if rexpat[len(rexpat)-1] != '$' { + rexpat += "$" + } + } + + return nt, key, rexpat, tail, ps, pe + } + + // Wildcard pattern as finale + if ws < len(pattern)-1 { + panic("chi: wildcard '*' must be the last value in a route. trim trailing text or use a '{param}' instead") + } + return ntCatchAll, "*", "", 0, ws, len(pattern) +} + +func patParamKeys(pattern string) []string { + pat := pattern + paramKeys := []string{} + for { + ptyp, paramKey, _, _, _, e := patNextSegment(pat) + if ptyp == ntStatic { + return paramKeys + } + for i := 0; i < len(paramKeys); i++ { + if paramKeys[i] == paramKey { + panic(fmt.Sprintf("chi: routing pattern '%s' contains duplicate param key, '%s'", pattern, paramKey)) + } + } + paramKeys = append(paramKeys, paramKey) + pat = pat[e:] + } +} + +// longestPrefix finds the length of the shared prefix +// of two strings +func longestPrefix(k1, k2 string) int { + max := len(k1) + if l := len(k2); l < max { + max = l + } + var i int + for i = 0; i < max; i++ { + if k1[i] != k2[i] { + break + } + } + return i +} + +func methodTypString(method methodTyp) string { + for s, t := range methodMap { + if method == t { + return s + } + } + return "" +} + +type nodes []*node + +// Sort the list of nodes by label +func (ns nodes) Sort() { sort.Sort(ns); ns.tailSort() } +func (ns nodes) Len() int { return len(ns) } +func (ns nodes) Swap(i, j int) { ns[i], ns[j] = ns[j], ns[i] } +func (ns nodes) Less(i, j int) bool { return ns[i].label < ns[j].label } + +// tailSort pushes nodes with '/' as the tail to the end of the list for param nodes. +// The list order determines the traversal order. +func (ns nodes) tailSort() { + for i := len(ns) - 1; i >= 0; i-- { + if ns[i].typ > ntStatic && ns[i].tail == '/' { + ns.Swap(i, len(ns)-1) + return + } + } +} + +func (ns nodes) findEdge(label byte) *node { + num := len(ns) + idx := 0 + i, j := 0, num-1 + for i <= j { + idx = i + (j-i)/2 + if label > ns[idx].label { + i = idx + 1 + } else if label < ns[idx].label { + j = idx - 1 + } else { + i = num // breaks cond + } + } + if ns[idx].label != label { + return nil + } + return ns[idx] +} + +// Route describes the details of a routing handler. +// Handlers map key is an HTTP method +type Route struct { + Pattern string + Handlers map[string]http.Handler + SubRoutes Routes +} + +// WalkFunc is the type of the function called for each method and route visited by Walk. +type WalkFunc func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error + +// Walk walks any router tree that implements Routes interface. +func Walk(r Routes, walkFn WalkFunc) error { + return walk(r, walkFn, "") +} + +func walk(r Routes, walkFn WalkFunc, parentRoute string, parentMw ...func(http.Handler) http.Handler) error { + for _, route := range r.Routes() { + mws := make([]func(http.Handler) http.Handler, len(parentMw)) + copy(mws, parentMw) + mws = append(mws, r.Middlewares()...) + + if route.SubRoutes != nil { + if err := walk(route.SubRoutes, walkFn, parentRoute+route.Pattern, mws...); err != nil { + return err + } + continue + } + + for method, handler := range route.Handlers { + if method == "*" { + // Ignore a "catchAll" method, since we pass down all the specific methods for each route. + continue + } + + fullRoute := parentRoute + route.Pattern + fullRoute = strings.Replace(fullRoute, "/*/", "/", -1) + + if chain, ok := handler.(*ChainHandler); ok { + if err := walkFn(method, fullRoute, chain.Endpoint, append(mws, chain.Middlewares...)...); err != nil { + return err + } + } else { + if err := walkFn(method, fullRoute, handler, mws...); err != nil { + return err + } + } + } + } + + return nil +} diff --git a/vendor/github.com/go-chi/httplog/LICENSE b/vendor/github.com/go-chi/httplog/LICENSE new file mode 100644 index 000000000..0bb58ba51 --- /dev/null +++ b/vendor/github.com/go-chi/httplog/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka). + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/go-chi/httplog/README.md b/vendor/github.com/go-chi/httplog/README.md new file mode 100644 index 000000000..ac0dc9cf2 --- /dev/null +++ b/vendor/github.com/go-chi/httplog/README.md @@ -0,0 +1,67 @@ +httplog +======= + +Small but powerful structured logging package for HTTP request logging in Go. + +## Example + +(see [_example/](./_example/main.go)) + +```go +package main + +import ( + "net/http" + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" + "github.com/go-chi/httplog" +) + +func main() { + // Logger + logger := httplog.NewLogger("httplog-example", httplog.Options{ + JSON: true, + }) + + // Service + r := chi.NewRouter() + r.Use(httplog.RequestLogger(logger)) + r.Use(middleware.Heartbeat("/ping")) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("hello world")) + }) + + r.Get("/panic", func(w http.ResponseWriter, r *http.Request) { + panic("oh no") + }) + + r.Get("/info", func(w http.ResponseWriter, r *http.Request) { + oplog := httplog.LogEntry(r.Context()) + w.Header().Add("Content-Type", "text/plain") + oplog.Info().Msg("info here") + w.Write([]byte("info here")) + }) + + r.Get("/warn", func(w http.ResponseWriter, r *http.Request) { + oplog := httplog.LogEntry(r.Context()) + oplog.Warn().Msg("warn here") + w.WriteHeader(400) + w.Write([]byte("warn here")) + }) + + r.Get("/err", func(w http.ResponseWriter, r *http.Request) { + oplog := httplog.LogEntry(r.Context()) + oplog.Error().Msg("err here") + w.WriteHeader(500) + w.Write([]byte("err here")) + }) + + http.ListenAndServe(":5555", r) +} + +``` + +## License + +MIT diff --git a/vendor/github.com/go-chi/httplog/config.go b/vendor/github.com/go-chi/httplog/config.go new file mode 100644 index 000000000..6538813a3 --- /dev/null +++ b/vendor/github.com/go-chi/httplog/config.go @@ -0,0 +1,86 @@ +package httplog + +import ( + "fmt" + "os" + "strings" + "time" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" +) + +var DefaultOptions = Options{ + LogLevel: "info", + LevelFieldName: "level", + JSON: false, + Concise: false, + Tags: nil, + SkipHeaders: nil, +} + +type Options struct { + // LogLevel defines the minimum level of severity that app should log. + // + // Must be one of: ["trace", "debug", "info", "warn", "error", "critical"] + LogLevel string + + // LevelFieldName sets the field name for the log level or severity. + // Some providers parse and search for different field names. + LevelFieldName string + + // JSON enables structured logging output in json. Make sure to enable this + // in production mode so log aggregators can receive data in parsable format. + // + // In local development mode, its appropriate to set this value to false to + // receive pretty output and stacktraces to stdout. + JSON bool + + // Concise mode includes fewer log details during the request flow. For example + // exluding details like request content length, user-agent and other details. + // This is useful if during development your console is too noisy. + Concise bool + + // Tags are additional fields included at the root level of all logs. + // These can be useful for example the commit hash of a build, or an environment + // name like prod/stg/dev + Tags map[string]string + + // SkipHeaders are additional headers which are redacted from the logs + SkipHeaders []string +} + +// Configure will set new global/default options for the httplog and behaviour +// of underlying zerolog pkg and its global logger. +func Configure(opts Options) { + if opts.LogLevel == "" { + opts.LogLevel = "info" + } + + if opts.LevelFieldName == "" { + opts.LevelFieldName = "level" + } + + // Pre-downcase all SkipHeaders + for i, header := range opts.SkipHeaders { + opts.SkipHeaders[i] = strings.ToLower(header) + } + + DefaultOptions = opts + + // Config the zerolog global logger + logLevel, err := zerolog.ParseLevel(strings.ToLower(opts.LogLevel)) + if err != nil { + fmt.Printf("httplog: error! %v\n", err) + os.Exit(1) + } + zerolog.SetGlobalLevel(logLevel) + + zerolog.LevelFieldName = strings.ToLower(opts.LevelFieldName) + zerolog.TimestampFieldName = "timestamp" + zerolog.TimeFieldFormat = time.RFC3339Nano + + if !opts.JSON { + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: time.RFC3339}) + } +} diff --git a/vendor/github.com/go-chi/httplog/httplog.go b/vendor/github.com/go-chi/httplog/httplog.go new file mode 100644 index 000000000..ea90e63c7 --- /dev/null +++ b/vendor/github.com/go-chi/httplog/httplog.go @@ -0,0 +1,248 @@ +package httplog + +import ( + "context" + "fmt" + "io/ioutil" + "net/http" + "strings" + "time" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" +) + +func NewLogger(serviceName string, opts ...Options) zerolog.Logger { + if len(opts) > 0 { + Configure(opts[0]) + } else { + Configure(DefaultOptions) + } + logger := log.With().Str("service", strings.ToLower(serviceName)) + if !DefaultOptions.Concise && len(DefaultOptions.Tags) > 0 { + logger = logger.Fields(map[string]interface{}{ + "tags": DefaultOptions.Tags, + }) + } + return logger.Logger() +} + +// RequestLogger is an http middleware to log http requests and responses. +// +// NOTE: for simplicty, RequestLogger automatically makes use of the chi RequestID and +// Recoverer middleware. +func RequestLogger(logger zerolog.Logger) func(next http.Handler) http.Handler { + return chi.Chain( + middleware.RequestID, + Handler(logger), + middleware.Recoverer, + ).Handler +} + +func Handler(logger zerolog.Logger) func(next http.Handler) http.Handler { + var f middleware.LogFormatter = &requestLogger{logger} + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + entry := f.NewLogEntry(r) + ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) + + buf := newLimitBuffer(512) + ww.Tee(buf) + + t1 := time.Now() + defer func() { + var respBody []byte + if ww.Status() >= 400 { + respBody, _ = ioutil.ReadAll(buf) + } + entry.Write(ww.Status(), ww.BytesWritten(), ww.Header(), time.Since(t1), respBody) + }() + + next.ServeHTTP(ww, middleware.WithLogEntry(r, entry)) + } + return http.HandlerFunc(fn) + } +} + +type requestLogger struct { + Logger zerolog.Logger +} + +func (l *requestLogger) NewLogEntry(r *http.Request) middleware.LogEntry { + entry := &RequestLoggerEntry{} + msg := fmt.Sprintf("Request: %s %s", r.Method, r.URL.Path) + entry.Logger = l.Logger.With().Fields(requestLogFields(r, true)).Logger() + if !DefaultOptions.Concise { + entry.Logger.Info().Fields(requestLogFields(r, DefaultOptions.Concise)).Msgf(msg) + } + return entry +} + +type RequestLoggerEntry struct { + Logger zerolog.Logger + msg string +} + +func (l *RequestLoggerEntry) Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) { + msg := fmt.Sprintf("Response: %d %s", status, statusLabel(status)) + if l.msg != "" { + msg = fmt.Sprintf("%s - %s", msg, l.msg) + } + + responseLog := map[string]interface{}{ + "status": status, + "bytes": bytes, + "elapsed": float64(elapsed.Nanoseconds()) / 1000000.0, // in milliseconds + } + + if !DefaultOptions.Concise { + // Include response header, as well for error status codes (>400) we include + // the response body so we may inspect the log message sent back to the client. + if status >= 400 { + body, _ := extra.([]byte) + responseLog["body"] = string(body) + } + if len(header) > 0 { + responseLog["header"] = headerLogField(header) + } + } + + l.Logger.WithLevel(statusLevel(status)).Fields(map[string]interface{}{ + "httpResponse": responseLog, + }).Msgf(msg) +} + +func (l *RequestLoggerEntry) Panic(v interface{}, stack []byte) { + stacktrace := "#" + if DefaultOptions.JSON { + stacktrace = string(stack) + } + + l.Logger = l.Logger.With(). + Str("stacktrace", stacktrace). + Str("panic", fmt.Sprintf("%+v", v)). + Logger() + + l.msg = fmt.Sprintf("%+v", v) + + if !DefaultOptions.JSON { + middleware.PrintPrettyStack(v) + } +} + +func requestLogFields(r *http.Request, concise bool) map[string]interface{} { + scheme := "http" + if r.TLS != nil { + scheme = "https" + } + requestURL := fmt.Sprintf("%s://%s%s", scheme, r.Host, r.RequestURI) + + requestFields := map[string]interface{}{ + "requestURL": requestURL, + "requestMethod": r.Method, + "requestPath": r.URL.Path, + "remoteIP": r.RemoteAddr, + "proto": r.Proto, + } + if reqID := middleware.GetReqID(r.Context()); reqID != "" { + requestFields["requestID"] = reqID + } + + if concise { + return map[string]interface{}{ + "httpRequest": requestFields, + } + } + + requestFields["scheme"] = scheme + + if len(r.Header) > 0 { + requestFields["header"] = headerLogField(r.Header) + } + + return map[string]interface{}{ + "httpRequest": requestFields, + } +} + +func headerLogField(header http.Header) map[string]string { + headerField := map[string]string{} + for k, v := range header { + k = strings.ToLower(k) + switch { + case len(v) == 0: + continue + case len(v) == 1: + headerField[k] = v[0] + default: + headerField[k] = fmt.Sprintf("[%s]", strings.Join(v, "], [")) + } + if k == "authorization" || k == "cookie" || k == "set-cookie" { + headerField[k] = "***" + } + + for _, skip := range DefaultOptions.SkipHeaders { + if k == skip { + headerField[k] = "***" + break + } + } + } + return headerField +} + +func statusLevel(status int) zerolog.Level { + switch { + case status <= 0: + return zerolog.WarnLevel + case status < 400: // for codes in 100s, 200s, 300s + return zerolog.InfoLevel + case status >= 400 && status < 500: + return zerolog.WarnLevel + case status >= 500: + return zerolog.ErrorLevel + default: + return zerolog.InfoLevel + } +} + +func statusLabel(status int) string { + switch { + case status >= 100 && status < 300: + return "OK" + case status >= 300 && status < 400: + return "Redirect" + case status >= 400 && status < 500: + return "Client Error" + case status >= 500: + return "Server Error" + default: + return "Unknown" + } +} + +// Helper methods used by the application to get the request-scoped +// logger entry and set additional fields between handlers. +// +// This is a useful pattern to use to set state on the entry as it +// passes through the handler chain, which at any point can be logged +// with a call to .Print(), .Info(), etc. + +func LogEntry(ctx context.Context) zerolog.Logger { + entry := ctx.Value(middleware.LogEntryCtxKey).(*RequestLoggerEntry) + return entry.Logger +} + +func LogEntrySetField(ctx context.Context, key, value string) { + if entry, ok := ctx.Value(middleware.LogEntryCtxKey).(*RequestLoggerEntry); ok { + entry.Logger = entry.Logger.With().Str(key, value).Logger() + } +} + +func LogEntrySetFields(ctx context.Context, fields map[string]interface{}) { + if entry, ok := ctx.Value(middleware.LogEntryCtxKey).(*RequestLoggerEntry); ok { + entry.Logger = entry.Logger.With().Fields(fields).Logger() + } +} diff --git a/vendor/github.com/go-chi/httplog/util.go b/vendor/github.com/go-chi/httplog/util.go new file mode 100644 index 000000000..dcb785161 --- /dev/null +++ b/vendor/github.com/go-chi/httplog/util.go @@ -0,0 +1,37 @@ +package httplog + +import ( + "bytes" + "io" +) + +// limitBuffer is used to pipe response body information from the +// response writer to a certain limit amount. The idea is to read +// a portion of the response body such as an error response so we +// may log it. +type limitBuffer struct { + *bytes.Buffer + limit int +} + +func newLimitBuffer(size int) io.ReadWriter { + return limitBuffer{ + Buffer: bytes.NewBuffer(make([]byte, 0, size)), + limit: size, + } +} + +func (b limitBuffer) Write(p []byte) (n int, err error) { + if b.Buffer.Len() >= b.limit { + return len(p), nil + } + limit := b.limit + if len(p) < limit { + limit = len(p) + } + return b.Buffer.Write(p[:limit]) +} + +func (b limitBuffer) Read(p []byte) (n int, err error) { + return b.Buffer.Read(p) +} diff --git a/vendor/github.com/go-toast/toast/.gitignore b/vendor/github.com/go-toast/toast/.gitignore new file mode 100644 index 000000000..ecdc9e248 --- /dev/null +++ b/vendor/github.com/go-toast/toast/.gitignore @@ -0,0 +1,3 @@ +.idea/ +vendor/* +!vendor/vendor.json diff --git a/vendor/github.com/go-toast/toast/LICENSE b/vendor/github.com/go-toast/toast/LICENSE new file mode 100644 index 000000000..68b7294f9 --- /dev/null +++ b/vendor/github.com/go-toast/toast/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2016 Jacob Marshall + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/go-toast/toast/readme.md b/vendor/github.com/go-toast/toast/readme.md new file mode 100644 index 000000000..4dbc20741 --- /dev/null +++ b/vendor/github.com/go-toast/toast/readme.md @@ -0,0 +1,61 @@ +# Toast + +A go package for Windows 10 toast notifications. + +As seen in [jacobmarshall/pokevision-cli](https://github.com/jacobmarshall/pokevision-cli). + +## CLI + +As well as using go-toast within your Go projects, you can also utilise the CLI - for any of your projects. + +Download [64bit](https://go-toast-downloads.s3.amazonaws.com/v1/toast64.exe) or [32bit](https://go-toast-downloads.s3.amazonaws.com/v1/toast32.exe) + +```cmd +C:\Users\Example\Downloads\toast64.exe \ + --app-id "Example App" \ + --title "Hello World" \ + --message "Lorem ipsum dolor sit amet, consectetur adipiscing elit." \ + --icon "C:\Users\Example\Pictures\icon.png" \ + --audio "default" --loop \ + --duration "long" \ + --activation-arg "https://google.com" \ + --action "Open maps" --action-arg "bingmaps:?q=sushi" \ + --action "Open browser" --action-arg "http://..." +``` + +![CLI](./screenshot-cli.png) + +## Example + +```go +package main + +import ( + "log" + + "gopkg.in/toast.v1" +) + +func main() { + notification := toast.Notification{ + AppID: "Example App", + Title: "My notification", + Message: "Some message about how important something is...", + Icon: "go.png", // This file must exist (remove this line if it doesn't) + Actions: []toast.Action{ + {"protocol", "I'm a button", ""}, + {"protocol", "Me too!", ""}, + }, + } + err := notification.Push() + if err != nil { + log.Fatalln(err) + } +} +``` + +## Screenshots + +![Toast](./screenshot-toast.png) + +![Action centre](./screenshot-action-centre.png) diff --git a/vendor/github.com/go-toast/toast/screenshot-action-centre.png b/vendor/github.com/go-toast/toast/screenshot-action-centre.png new file mode 100644 index 0000000000000000000000000000000000000000..e63917b2dc0a978e6a3c8380c8a8b31b6ddb3cf5 GIT binary patch literal 85126 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�Nxq13v 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%0Az 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⁢H}%iq$x6| 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/go-toast/toast/screenshot-cli.png b/vendor/github.com/go-toast/toast/screenshot-cli.png new file mode 100644 index 0000000000000000000000000000000000000000..fc03c37e8d4140be388bbe25b7ba6927114750fc GIT binary patch literal 62466 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 b7hgw}*f-xtHrVOh!Thw;pQtrsoV@%Ge1y;A literal 0 HcmV?d00001 diff --git a/vendor/github.com/go-toast/toast/screenshot-toast.png b/vendor/github.com/go-toast/toast/screenshot-toast.png new file mode 100644 index 0000000000000000000000000000000000000000..93904061dd523d839f73d24a3adcf659a20ece41 GIT binary patch literal 62644 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

emo6q~pKmMA?PnLp2 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/go-toast/toast/toast.go b/vendor/github.com/go-toast/toast/toast.go new file mode 100644 index 000000000..1bcba4bf9 --- /dev/null +++ b/vendor/github.com/go-toast/toast/toast.go @@ -0,0 +1,359 @@ +package toast + +import ( + "bytes" + "errors" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "text/template" + + "github.com/nu7hatch/gouuid" + "syscall" +) + +var toastTemplate *template.Template + +var ( + ErrorInvalidAudio error = errors.New("toast: invalid audio") + ErrorInvalidDuration = errors.New("toast: invalid duration") +) + +type toastAudio string + +const ( + Default toastAudio = "ms-winsoundevent:Notification.Default" + IM = "ms-winsoundevent:Notification.IM" + Mail = "ms-winsoundevent:Notification.Mail" + Reminder = "ms-winsoundevent:Notification.Reminder" + SMS = "ms-winsoundevent:Notification.SMS" + LoopingAlarm = "ms-winsoundevent:Notification.Looping.Alarm" + LoopingAlarm2 = "ms-winsoundevent:Notification.Looping.Alarm2" + LoopingAlarm3 = "ms-winsoundevent:Notification.Looping.Alarm3" + LoopingAlarm4 = "ms-winsoundevent:Notification.Looping.Alarm4" + LoopingAlarm5 = "ms-winsoundevent:Notification.Looping.Alarm5" + LoopingAlarm6 = "ms-winsoundevent:Notification.Looping.Alarm6" + LoopingAlarm7 = "ms-winsoundevent:Notification.Looping.Alarm7" + LoopingAlarm8 = "ms-winsoundevent:Notification.Looping.Alarm8" + LoopingAlarm9 = "ms-winsoundevent:Notification.Looping.Alarm9" + LoopingAlarm10 = "ms-winsoundevent:Notification.Looping.Alarm10" + LoopingCall = "ms-winsoundevent:Notification.Looping.Call" + LoopingCall2 = "ms-winsoundevent:Notification.Looping.Call2" + LoopingCall3 = "ms-winsoundevent:Notification.Looping.Call3" + LoopingCall4 = "ms-winsoundevent:Notification.Looping.Call4" + LoopingCall5 = "ms-winsoundevent:Notification.Looping.Call5" + LoopingCall6 = "ms-winsoundevent:Notification.Looping.Call6" + LoopingCall7 = "ms-winsoundevent:Notification.Looping.Call7" + LoopingCall8 = "ms-winsoundevent:Notification.Looping.Call8" + LoopingCall9 = "ms-winsoundevent:Notification.Looping.Call9" + LoopingCall10 = "ms-winsoundevent:Notification.Looping.Call10" + Silent = "silent" +) + +type toastDuration string + +const ( + Short toastDuration = "short" + Long = "long" +) + +func init() { + toastTemplate = template.New("toast") + toastTemplate.Parse(` +[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null +[Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null +[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null + +$APP_ID = '{{if .AppID}}{{.AppID}}{{else}}Windows App{{end}}' + +$template = @" + + + + {{if .Icon}} + + {{end}} + {{if .Title}} + + {{end}} + {{if .Message}} + + {{end}} + + + {{if ne .Audio "silent"}} + +"@ + +$xml = New-Object Windows.Data.Xml.Dom.XmlDocument +$xml.LoadXml($template) +$toast = New-Object Windows.UI.Notifications.ToastNotification $xml +[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($APP_ID).Show($toast) + `) +} + +// Notification +// +// The toast notification data. The following fields are strongly recommended; +// - AppID +// - Title +// +// If no toastAudio is provided, then the toast notification will be silent. +// You can set the toast to have a default audio by setting "Audio" to "toast.Default", or if your go app takes +// user-provided input for audio, call the "toast.Audio(name)" func. +// +// The AppID is shown beneath the toast message (in certain cases), and above the notification within the Action +// Center - and is used to group your notifications together. It is recommended that you provide a "pretty" +// name for your app, and not something like "com.example.MyApp". +// +// If no Title is provided, but a Message is, the message will display as the toast notification's title - +// which is a slightly different font style (heavier). +// +// The Icon should be an absolute path to the icon (as the toast is invoked from a temporary path on the user's +// system, not the working directory). +// +// If you would like the toast to call an external process/open a webpage, then you can set ActivationArguments +// to the uri you would like to trigger when the toast is clicked. For example: "https://google.com" would open +// the Google homepage when the user clicks the toast notification. +// By default, clicking the toast just hides/dismisses it. +// +// The following would show a notification to the user letting them know they received an email, and opens +// gmail.com when they click the notification. It also makes the Windows 10 "mail" sound effect. +// +// toast := toast.Notification{ +// AppID: "Google Mail", +// Title: email.Subject, +// Message: email.Preview, +// Icon: "C:/Program Files/Google Mail/icons/logo.png", +// ActivationArguments: "https://gmail.com", +// Audio: toast.Mail, +// } +// +// err := toast.Push() +type Notification struct { + // The name of your app. This value shows up in Windows 10's Action Centre, so make it + // something readable for your users. It can contain spaces, however special characters + // (eg. é) are not supported. + AppID string + + // The main title/heading for the toast notification. + Title string + + // The single/multi line message to display for the toast notification. + Message string + + // An optional path to an image on the OS to display to the left of the title & message. + Icon string + + // The type of notification level action (like toast.Action) + ActivationType string + + // The activation/action arguments (invoked when the user clicks the notification) + ActivationArguments string + + // Optional action buttons to display below the notification title & message. + Actions []Action + + // The audio to play when displaying the toast + Audio toastAudio + + // Whether to loop the audio (default false) + Loop bool + + // How long the toast should show up for (short/long) + Duration toastDuration +} + +// Action +// +// Defines an actionable button. +// See https://msdn.microsoft.com/en-us/windows/uwp/controls-and-patterns/tiles-and-notifications-adaptive-interactive-toasts for more info. +// +// Only protocol type action buttons are actually useful, as there's no way of receiving feedback from the +// user's choice. Examples of protocol type action buttons include: "bingmaps:?q=sushi" to open up Windows 10's +// maps app with a pre-populated search field set to "sushi". +// +// toast.Action{"protocol", "Open Maps", "bingmaps:?q=sushi"} +type Action struct { + Type string + Label string + Arguments string +} + +func (n *Notification) applyDefaults() { + if n.ActivationType == "" { + n.ActivationType = "protocol" + } + if n.Duration == "" { + n.Duration = Short + } + if n.Audio == "" { + n.Audio = Default + } +} + +func (n *Notification) buildXML() (string, error) { + var out bytes.Buffer + err := toastTemplate.Execute(&out, n) + if err != nil { + return "", err + } + return out.String(), nil +} + +// Builds the Windows PowerShell script & invokes it, causing the toast to display. +// +// Note: Running the PowerShell script is by far the slowest process here, and can take a few +// seconds in some cases. +// +// notification := toast.Notification{ +// AppID: "Example App", +// Title: "My notification", +// Message: "Some message about how important something is...", +// Icon: "go.png", +// Actions: []toast.Action{ +// {"protocol", "I'm a button", ""}, +// {"protocol", "Me too!", ""}, +// }, +// } +// err := notification.Push() +// if err != nil { +// log.Fatalln(err) +// } +func (n *Notification) Push() error { + n.applyDefaults() + xml, err := n.buildXML() + if err != nil { + return err + } + return invokeTemporaryScript(xml) +} + +// Returns a toastAudio given a user-provided input (useful for cli apps). +// +// If the "name" doesn't match, then the default toastAudio is returned, along with ErrorInvalidAudio. +// +// The following names are valid; +// - default +// - im +// - mail +// - reminder +// - sms +// - loopingalarm +// - loopimgalarm[2-10] +// - loopingcall +// - loopingcall[2-10] +// - silent +// +// Handle the error appropriately according to how your app should work. +func Audio(name string) (toastAudio, error) { + switch strings.ToLower(name) { + case "default": + return Default, nil + case "im": + return IM, nil + case "mail": + return Mail, nil + case "reminder": + return Reminder, nil + case "sms": + return SMS, nil + case "loopingalarm": + return LoopingAlarm, nil + case "loopingalarm2": + return LoopingAlarm2, nil + case "loopingalarm3": + return LoopingAlarm3, nil + case "loopingalarm4": + return LoopingAlarm4, nil + case "loopingalarm5": + return LoopingAlarm5, nil + case "loopingalarm6": + return LoopingAlarm6, nil + case "loopingalarm7": + return LoopingAlarm7, nil + case "loopingalarm8": + return LoopingAlarm8, nil + case "loopingalarm9": + return LoopingAlarm9, nil + case "loopingalarm10": + return LoopingAlarm10, nil + case "loopingcall": + return LoopingCall, nil + case "loopingcall2": + return LoopingCall2, nil + case "loopingcall3": + return LoopingCall3, nil + case "loopingcall4": + return LoopingCall4, nil + case "loopingcall5": + return LoopingCall5, nil + case "loopingcall6": + return LoopingCall6, nil + case "loopingcall7": + return LoopingCall7, nil + case "loopingcall8": + return LoopingCall8, nil + case "loopingcall9": + return LoopingCall9, nil + case "loopingcall10": + return LoopingCall10, nil + case "silent": + return Silent, nil + default: + return Default, ErrorInvalidAudio + } +} + +// Returns a toastDuration given a user-provided input (useful for cli apps). +// +// The default duration is short. If the "name" doesn't match, then the default toastDuration is returned, +// along with ErrorInvalidDuration. Most of the time "short" is the most appropriate for a toast notification, +// and Microsoft recommend not using "long", but it can be useful for important dialogs or looping sound toasts. +// +// The following names are valid; +// - short +// - long +// +// Handle the error appropriately according to how your app should work. +func Duration(name string) (toastDuration, error) { + switch strings.ToLower(name) { + case "short": + return Short, nil + case "long": + return Long, nil + default: + return Short, ErrorInvalidDuration + } +} + +func invokeTemporaryScript(content string) error { + id, _ := uuid.NewV4() + file := filepath.Join(os.TempDir(), id.String()+".ps1") + defer os.Remove(file) + bomUtf8 := []byte{0xEF, 0xBB, 0xBF} + out := append(bomUtf8, []byte(content)...) + err := ioutil.WriteFile(file, out, 0600) + if err != nil { + return err + } + cmd := exec.Command("PowerShell", "-ExecutionPolicy", "Bypass", "-File", file) + cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + if err = cmd.Run(); err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/LICENSE-MIT b/vendor/github.com/kermieisinthehouse/gosx-notifier/LICENSE-MIT new file mode 100644 index 000000000..7302a7721 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/gosx-notifier/LICENSE-MIT @@ -0,0 +1,22 @@ +Copyright (c) 2012 Ralph Caraveo + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/README.md b/vendor/github.com/kermieisinthehouse/gosx-notifier/README.md new file mode 100644 index 000000000..55c6f8ccd --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/gosx-notifier/README.md @@ -0,0 +1,179 @@ +gosx-notifier +=========================== +A [Go](http://golang.org) lib for sending desktop notifications to OSX Mountain Lion's (10.8 or higher REQUIRED) +[Notification Center](http://www.macworld.com/article/1165411/mountain_lion_hands_on_with_notification_center.html). + +[![GoDoc](http://godoc.org/github.com/deckarep/gosx-notifier?status.png)](http://godoc.org/github.com/deckarep/gosx-notifier) + +Update 4/3/2014 +------ +On OSX 10.9 and above gosx-notifier now supports images and icons. +![Now with custom icon support](../master/example.png?raw=true) + +Synopsis +-------- +OSX Mountain Lion comes packaged with a built-in notification center. For whatever reason, [Apple sandboxed the +notification center API](http://forums.macrumors.com/showthread.php?t=1403807) to apps hosted in its App Store. The end +result? A potentially useful API shackled to Apple's ecosystem. + +Thankfully, [Eloy Durán](https://github.com/alloy) put together [an osx app](https://github.com/alloy/terminal-notifier) that allows terminal access to the sandboxed API. **gosx-notifier** embeds this app with a simple interface to the closed API. + +It's not perfect, and the implementor will quickly notice its limitations. However, it's a start and any pull requests are accepted and encouraged! + +Dependencies: +------------- +There are none! If you utilize this package and create a binary executable it will auto-magically install the terminal-notifier component into a temp directory of the server. This is possible because in this latest version the terminal-notifier binary is now statically embedded into the Go source files. + + +Installation and Requirements +----------------------------- +The following command will install the notification api for Go along with the binaries. Also, utilizing this lib requires OSX 10.8 or higher. It will simply not work on lower versions of OSX. + +```sh +go get github.com/deckarep/gosx-notifier +``` + +Using the Command Line +------------- +```Go +notify "Wow! A notification!!!" +``` + +useful for knowing when long running commands finish + +```Go +longRunningCommand && notify done! +``` + +Using the Code +------------------ +It's a pretty straightforward API: + +```Go +package main + +import ( + "github.com/deckarep/gosx-notifier" + "log" +) + +func main() { + //At a minimum specifiy a message to display to end-user. + note := gosxnotifier.NewNotification("Check your Apple Stock!") + + //Optionally, set a title + note.Title = "It's money making time 💰" + + //Optionally, set a subtitle + note.Subtitle = "My subtitle" + + //Optionally, set a sound from a predefined set. + note.Sound = gosxnotifier.Basso + + //Optionally, set a group which ensures only one notification is ever shown replacing previous notification of same group id. + note.Group = "com.unique.yourapp.identifier" + + //Optionally, set a sender (Notification will now use the Safari icon) + note.Sender = "com.apple.Safari" + + //Optionally, specifiy a url or bundleid to open should the notification be + //clicked. + note.Link = "http://www.yahoo.com" //or BundleID like: com.apple.Terminal + + //Optionally, an app icon (10.9+ ONLY) + note.AppIcon = "gopher.png" + + //Optionally, a content image (10.9+ ONLY) + note.ContentImage = "gopher.png" + + //Then, push the notification + err := note.Push() + + //If necessary, check error + if err != nil { + log.Println("Uh oh!") + } +} +``` + +Sample App: Desktop Pinger Notification - monitors your websites and will notifiy you when a website is down. +```Go +package main + +import ( + "github.com/deckarep/gosx-notifier" + "net/http" + "strings" + "time" +) + +//a slice of string sites that you are interested in watching +var sites []string = []string{ + "http://www.yahoo.com", + "http://www.google.com", + "http://www.bing.com"} + +func main() { + ch := make(chan string) + + for _, s := range sites { + go pinger(ch, s) + } + + for { + select { + case result := <-ch: + if strings.HasPrefix(result, "-") { + s := strings.Trim(result, "-") + showNotification("Urgent, can't ping website: " + s) + } + } + } +} + +func showNotification(message string) { + + note := gosxnotifier.NewNotification(message) + note.Title = "Site Down" + note.Sound = gosxnotifier.Default + + note.Push() +} + +//Prefixing a site with a + means it's up, while - means it's down +func pinger(ch chan string, site string) { + for { + res, err := http.Get(site) + + if err != nil { + ch <- "-" + site + } else { + if res.StatusCode != 200 { + ch <- "-" + site + } else { + ch <- "+" + site + } + res.Body.Close() + } + time.Sleep(30 * time.Second) + } +} +``` + +Usage Ideas +----------- +* Monitor your awesome server cluster and push notifications when something goes haywire (we've all been there) +* Scrape Hacker News looking for articles of certain keywords and push a notification +* Monitor your stock performance, push a notification, before you lose all your money +* Hook it up to ifttt.com and push a notification when your motion-sensor at home goes off + +Coming Soon +----------- +* Remove ID + +Licence +------- +This project is dual licensed under [any licensing defined by the underlying apps](https://github.com/alloy/terminal-notifier) and MIT licensed for this version written in Go. + + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/deckarep/gosx-notifier/trend.png)](https://bitdeli.com/free "Bitdeli Badge") diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/example.png b/vendor/github.com/kermieisinthehouse/gosx-notifier/example.png new file mode 100644 index 0000000000000000000000000000000000000000..194e257415ac1b372b416924527ba9ad8450ee5e GIT binary patch literal 61767 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

^QkYG%Q_hxW@+}WXzFOEp# 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 LNkvXXu0mjfjgm-^ literal 0 HcmV?d00001 diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/gosx-notifier.go b/vendor/github.com/kermieisinthehouse/gosx-notifier/gosx-notifier.go new file mode 100644 index 000000000..69ab22443 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/gosx-notifier/gosx-notifier.go @@ -0,0 +1,137 @@ +package gosxnotifier + +import ( + "errors" + "net/url" + "os/exec" + "path/filepath" + "strings" +) + +type Sound string + +const ( + Default Sound = "'default'" + Basso Sound = "Basso" + Blow Sound = "Blow" + Bottle Sound = "Bottle" + Frog Sound = "Frog" + Funk Sound = "Funk" + Glass Sound = "Glass" + Hero Sound = "Hero" + Morse Sound = "Morse" + Ping Sound = "Ping" + Pop Sound = "Pop" + Purr Sound = "Purr" + Sosumi Sound = "Sosumi" + Submarine Sound = "Submarine" + Tink Sound = "Tink" +) + +type Notification struct { + Message string //required + Title string //optional + Subtitle string //optional + Sound Sound //optional + Link string //optional + Sender string //optional + Group string //optional + AppIcon string //optional + ContentImage string //optional +} + +func NewNotification(message string) *Notification { + n := &Notification{Message: message} + return n +} + +func (n *Notification) Push() error { + if supportedOS() { + commandTuples := make([]string, 0) + + //check required commands + if n.Message == "" { + return errors.New("Please specifiy a proper message argument.") + } else { + commandTuples = append(commandTuples, []string{"-message", n.Message}...) + } + + //add title if found + if n.Title != "" { + commandTuples = append(commandTuples, []string{"-title", n.Title}...) + } + + //add subtitle if found + if n.Subtitle != "" { + commandTuples = append(commandTuples, []string{"-subtitle", n.Subtitle}...) + } + + //add sound if specified + if n.Sound != "" { + commandTuples = append(commandTuples, []string{"-sound", string(n.Sound)}...) + } + + //add group if specified + if n.Group != "" { + commandTuples = append(commandTuples, []string{"-group", n.Group}...) + } + + //add appIcon if specified + if n.AppIcon != "" { + img, err := normalizeImagePath(n.AppIcon) + + if err != nil { + return err + } + + commandTuples = append(commandTuples, []string{"-appIcon", img}...) + } + + //add contentImage if specified + if n.ContentImage != "" { + img, err := normalizeImagePath(n.ContentImage) + + if err != nil { + return err + } + commandTuples = append(commandTuples, []string{"-contentImage", img}...) + } + + //add url if specified + url, err := url.Parse(n.Link) + if err != nil { + n.Link = "" + } + if url != nil && n.Link != "" { + commandTuples = append(commandTuples, []string{"-open", n.Link}...) + } + + //add bundle id if specified + if strings.HasPrefix(strings.ToLower(n.Link), "com.") { + commandTuples = append(commandTuples, []string{"-activate", n.Link}...) + } + + //add sender if specified + if strings.HasPrefix(strings.ToLower(n.Sender), "com.") { + commandTuples = append(commandTuples, []string{"-sender", n.Sender}...) + } + + if len(commandTuples) == 0 { + return errors.New("Please provide a Message and Type at a minimum.") + } + + _, err = exec.Command(FinalPath, commandTuples...).Output() + if err != nil { + return err + } + } + return nil +} + +func normalizeImagePath(image string) (string, error) { + if imagePath, err := filepath.Abs(image); err != nil { + return "", errors.New("Could not resolve image path of image: " + image) + } else { + return imagePath, nil + } +} diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-binary.go b/vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-binary.go new file mode 100644 index 000000000..e59059003 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-binary.go @@ -0,0 +1,3428 @@ +package gosxnotifier + +// terminalnotifier returns raw, uncompressed file data. +func terminalnotifier() []byte { + zipFile := []byte{ + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, + 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x16, 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x59, 0xc1, 0xb1, + 0x61, 0xc1, 0xc1, 0xb1, 0x61, 0x59, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, + 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x09, + 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x3c, 0xc8, 0xb1, 0x61, 0x43, 0xc8, + 0xb1, 0x61, 0x3c, 0xc8, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, + 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x6c, 0x09, 0x89, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x06, 0x00, 0x00, 0x29, + 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x54, 0x0d, 0x00, + 0x07, 0x3c, 0xc8, 0xb1, 0x61, 0x3c, 0xc8, 0xb1, 0x61, 0x3c, 0xc8, 0xb1, + 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, + 0xe8, 0x03, 0x00, 0x00, 0x9d, 0x55, 0xc1, 0x72, 0xda, 0x30, 0x14, 0x3c, + 0x37, 0x5f, 0xa1, 0xfa, 0x5c, 0x2c, 0x3b, 0x69, 0x93, 0xa6, 0x43, 0xc8, + 0x00, 0x26, 0x2d, 0xad, 0x71, 0x3c, 0x91, 0xe9, 0xa4, 0xa7, 0x8e, 0xb0, + 0x05, 0xa8, 0x91, 0x25, 0x8f, 0x24, 0x03, 0xfe, 0x9c, 0x1e, 0xfb, 0x1b, + 0xed, 0x8f, 0x55, 0x76, 0xc0, 0x25, 0x76, 0x3c, 0xd3, 0x96, 0x03, 0x83, + 0xd0, 0xee, 0x6a, 0xdf, 0xf3, 0xd3, 0xba, 0x7f, 0xbd, 0x4b, 0x19, 0xd8, + 0x10, 0xa9, 0xa8, 0xe0, 0x57, 0x96, 0x6b, 0x3b, 0x16, 0x20, 0x3c, 0x16, + 0x09, 0xe5, 0xab, 0x2b, 0x6b, 0x1e, 0xdd, 0xf4, 0xde, 0x5a, 0xd7, 0x83, + 0x93, 0xfe, 0x4b, 0xef, 0x76, 0x1c, 0x7d, 0x09, 0x27, 0x20, 0x63, 0x54, + 0x69, 0x10, 0xce, 0x47, 0xfe, 0x74, 0x0c, 0xac, 0x1e, 0x84, 0xc3, 0x2c, + 0x63, 0x04, 0x42, 0x2f, 0xf2, 0x40, 0xe8, 0x4f, 0x51, 0x04, 0x8c, 0x06, + 0x84, 0x93, 0xc0, 0x02, 0xd6, 0x5a, 0xeb, 0xec, 0x1d, 0x84, 0xdb, 0xed, + 0xd6, 0xc6, 0x25, 0xca, 0x8e, 0x45, 0x5a, 0x02, 0x15, 0x0c, 0xa5, 0xc8, + 0x88, 0xd4, 0x85, 0x6f, 0xc4, 0x7a, 0x86, 0x60, 0x27, 0x3a, 0xb1, 0xcc, + 0x31, 0x8f, 0xea, 0x4f, 0xec, 0x98, 0x7f, 0x13, 0x1a, 0xeb, 0xc1, 0xc9, + 0x8b, 0xfe, 0x03, 0x29, 0x06, 0xa3, 0x9c, 0xb2, 0x64, 0x86, 0xe3, 0x35, + 0xe5, 0xe4, 0x16, 0x55, 0xab, 0x3e, 0x2c, 0x37, 0xcc, 0xbe, 0xd2, 0xd2, + 0xd8, 0x1e, 0xb8, 0x17, 0xc3, 0xd7, 0xce, 0x9b, 0x3e, 0xdc, 0x2f, 0xf7, + 0xc4, 0xf1, 0xcd, 0x28, 0xe7, 0x09, 0x23, 0x1e, 0xd9, 0x10, 0x26, 0xb2, + 0x94, 0x70, 0x7d, 0x47, 0x56, 0xe6, 0x98, 0x26, 0x9d, 0xf0, 0x2e, 0xea, + 0x64, 0x47, 0xe2, 0x5c, 0xe3, 0x05, 0x23, 0x4d, 0x8e, 0x26, 0x32, 0xa5, + 0x1c, 0xb3, 0x1e, 0x17, 0x9a, 0x2e, 0x29, 0x91, 0x5d, 0x12, 0xd3, 0xc4, + 0x9c, 0xbb, 0x47, 0x3c, 0x95, 0x58, 0x4a, 0xfb, 0x5b, 0xce, 0x28, 0xe1, + 0xbb, 0x9d, 0x2d, 0x94, 0xb2, 0xff, 0x5e, 0x92, 0x2f, 0x85, 0x67, 0x3a, + 0x64, 0x4a, 0xc1, 0xb2, 0xf8, 0xfc, 0xd8, 0xbb, 0xa6, 0xfa, 0xb9, 0xed, + 0x74, 0xf1, 0x03, 0x9c, 0xfe, 0x7f, 0x3d, 0x21, 0x8e, 0x1f, 0xf0, 0x8a, + 0x44, 0x45, 0xd6, 0xd2, 0x18, 0x86, 0xa1, 0xdf, 0x45, 0x43, 0x6b, 0x21, + 0xf5, 0xde, 0x2a, 0xaa, 0x10, 0x4d, 0xf6, 0xa9, 0x19, 0x8a, 0x4e, 0xcb, + 0x88, 0xae, 0x38, 0xd6, 0xb9, 0x6c, 0x9d, 0x79, 0x6d, 0x3e, 0x9d, 0xa4, + 0x3c, 0xcb, 0xcc, 0xa9, 0x24, 0x09, 0x19, 0xd6, 0x4b, 0x21, 0x53, 0x55, + 0xb3, 0xb1, 0x94, 0xb8, 0xfc, 0x51, 0xeb, 0x98, 0x01, 0xbb, 0x45, 0xf7, + 0xc7, 0x4a, 0xf0, 0x80, 0x79, 0xa2, 0xd9, 0xd1, 0x6d, 0xb7, 0x35, 0x7d, + 0x5e, 0x34, 0x16, 0x69, 0x46, 0x59, 0xfb, 0xb9, 0x9b, 0x3b, 0xf1, 0xe7, + 0x76, 0x54, 0x08, 0x65, 0x33, 0xb6, 0x49, 0xed, 0x98, 0x61, 0xbe, 0xb2, + 0xdd, 0xaf, 0xad, 0x2e, 0x78, 0xd1, 0xa1, 0x82, 0x67, 0xc7, 0xff, 0x72, + 0xe8, 0x3a, 0xce, 0xeb, 0x6e, 0x52, 0x87, 0xe7, 0xf7, 0xb3, 0x36, 0x05, + 0x79, 0x9f, 0xba, 0x6e, 0xd8, 0xd9, 0xf9, 0x33, 0xbe, 0x0c, 0xfe, 0xb9, + 0x69, 0x4a, 0x71, 0x2c, 0xd4, 0xce, 0x75, 0x6c, 0xf7, 0xac, 0xcd, 0xb9, + 0x37, 0x61, 0xd3, 0x62, 0x38, 0x97, 0x8e, 0xdb, 0x01, 0xfd, 0x87, 0x9a, + 0x7d, 0x34, 0xa3, 0x9c, 0xa6, 0x79, 0x8a, 0x0a, 0xa5, 0x49, 0x57, 0xe1, + 0xa5, 0xaf, 0x56, 0x2d, 0x3e, 0x9a, 0x4f, 0x27, 0x8c, 0x94, 0x29, 0x51, + 0xe3, 0xb5, 0xcc, 0x09, 0x3c, 0x00, 0x02, 0x64, 0x82, 0x2f, 0x92, 0x98, + 0xab, 0x72, 0xa8, 0x90, 0x09, 0x06, 0x49, 0x75, 0x51, 0x63, 0xf7, 0x91, + 0x55, 0x63, 0x19, 0x13, 0x5b, 0x35, 0x94, 0x0b, 0xaa, 0xa5, 0xb9, 0xa4, + 0xbe, 0xc0, 0x49, 0x3d, 0x7d, 0x47, 0xc2, 0xf0, 0x38, 0xe9, 0x02, 0xf4, + 0x21, 0x4f, 0x31, 0xbf, 0x23, 0x38, 0x29, 0x23, 0x67, 0x2c, 0xb2, 0x42, + 0xd2, 0xd5, 0x5a, 0x37, 0xfd, 0xd7, 0x1b, 0xe0, 0xe7, 0x0f, 0x70, 0xea, + 0xb8, 0xa7, 0x3d, 0xf3, 0x75, 0x01, 0x26, 0x4c, 0x14, 0xc0, 0xcb, 0xe5, + 0xaf, 0xef, 0xfc, 0x15, 0xf8, 0x58, 0x25, 0x0b, 0x18, 0x99, 0x91, 0x8a, + 0xd7, 0x58, 0x26, 0x36, 0x30, 0x8e, 0x40, 0xc5, 0x52, 0x40, 0x12, 0x45, + 0xe4, 0x86, 0x24, 0x76, 0xb3, 0x09, 0x01, 0x9a, 0x61, 0xca, 0x03, 0xba, + 0xb8, 0xa1, 0xed, 0xc8, 0x2b, 0xb7, 0x66, 0x84, 0xe7, 0x6d, 0x52, 0x68, + 0x96, 0x31, 0xcd, 0x30, 0x1b, 0x33, 0xac, 0x54, 0x93, 0x57, 0x35, 0x8e, + 0xd1, 0x18, 0xeb, 0xea, 0x59, 0x34, 0xc9, 0x73, 0xe3, 0x25, 0xa8, 0x42, + 0xe7, 0x11, 0x31, 0x34, 0x17, 0x42, 0x23, 0x5d, 0xb4, 0x0d, 0x2c, 0x30, + 0xe7, 0xc7, 0xc1, 0x74, 0xe8, 0x5e, 0x1f, 0x56, 0x6f, 0x91, 0xc1, 0xc9, + 0x6f, 0x50, 0x4b, 0x07, 0x08, 0x33, 0xf2, 0xe4, 0x12, 0x9d, 0x02, 0x00, + 0x00, 0xdc, 0x06, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0x37, 0x4b, 0x61, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x26, 0x00, 0x20, 0x00, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x50, 0x6b, 0x67, 0x49, 0x6e, 0x66, + 0x6f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x8a, 0xf5, 0xf9, 0x59, 0x42, 0xc2, + 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, + 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x73, 0x0c, 0x08, + 0xf0, 0xb1, 0x07, 0x02, 0x00, 0x50, 0x4b, 0x07, 0x08, 0x49, 0x04, 0x8a, + 0x5b, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x05, 0x89, 0x53, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, + 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x4d, 0x61, + 0x63, 0x4f, 0x53, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0xd3, 0xc1, 0xb1, + 0x61, 0xd6, 0xc1, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, + 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, + 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x37, 0x4b, + 0x61, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0a, + 0x01, 0x00, 0x36, 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x55, 0x54, 0x0d, 0x00, 0x07, 0x8a, 0xf5, 0xf9, 0x59, 0xd7, 0xc2, 0xb1, + 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, + 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0xed, 0xbd, 0x0b, 0x7c, + 0x54, 0xd5, 0xb5, 0x30, 0x7e, 0x26, 0x0f, 0x08, 0x28, 0x84, 0x57, 0x10, + 0x54, 0x74, 0x40, 0x90, 0xf0, 0xca, 0x03, 0x08, 0x24, 0x81, 0x48, 0x86, + 0x24, 0x38, 0x91, 0x04, 0x42, 0x1e, 0x12, 0x5e, 0x0e, 0x93, 0x99, 0x49, + 0x32, 0x32, 0x99, 0x09, 0xf3, 0x80, 0x80, 0xa2, 0xd1, 0x90, 0x96, 0x71, + 0x9a, 0x96, 0x5a, 0xb5, 0x68, 0x6b, 0x4b, 0xab, 0xed, 0xf5, 0xb6, 0xb4, + 0xc5, 0x5b, 0x51, 0xb4, 0x6a, 0x83, 0xa8, 0xc4, 0x47, 0x15, 0x15, 0x95, + 0xaa, 0x55, 0x54, 0xaa, 0x83, 0x50, 0xc4, 0x47, 0x11, 0x1f, 0x30, 0xdf, + 0x5a, 0x7b, 0xaf, 0x7d, 0xe6, 0x9c, 0x3d, 0x33, 0x21, 0xdc, 0xff, 0xf7, + 0xfb, 0x7f, 0xdf, 0xfd, 0x7d, 0x04, 0xce, 0xd9, 0x7b, 0xed, 0xf5, 0xd8, + 0xaf, 0xb5, 0xd7, 0x5e, 0x7b, 0x9f, 0x7d, 0xe6, 0xbc, 0xfc, 0xcd, 0xbf, + 0xce, 0xf4, 0x57, 0x14, 0x43, 0xb2, 0xa2, 0xb4, 0x27, 0x29, 0x8a, 0x92, + 0x01, 0x57, 0xda, 0x20, 0x45, 0xe9, 0x54, 0x8c, 0x0a, 0xfe, 0x8d, 0x86, + 0xcb, 0x0c, 0x97, 0xc5, 0x52, 0x65, 0xba, 0xba, 0x6c, 0x79, 0x59, 0xf5, + 0x62, 0x25, 0xe6, 0xcf, 0x10, 0x9b, 0x14, 0xf3, 0x87, 0x72, 0x46, 0x25, + 0xa3, 0x9c, 0xda, 0xb2, 0xfa, 0xda, 0x38, 0xfc, 0xed, 0x12, 0x03, 0xc1, + 0x50, 0x36, 0x25, 0x15, 0xae, 0x01, 0x94, 0x6c, 0xb1, 0xf8, 0x1d, 0x6d, + 0xfe, 0x28, 0x99, 0x2c, 0xef, 0xf8, 0x08, 0x2e, 0x6f, 0xbf, 0x29, 0x0a, + 0xeb, 0xfe, 0x52, 0xf4, 0x39, 0x59, 0x2c, 0x3e, 0x7f, 0xa0, 0xc1, 0x97, + 0x50, 0xde, 0x93, 0xd7, 0x72, 0x79, 0x6e, 0x83, 0x1e, 0x16, 0x7f, 0x69, + 0x24, 0xaf, 0x9f, 0x4e, 0x9e, 0xa5, 0xd9, 0xe1, 0x6a, 0x75, 0x78, 0xe3, + 0xc8, 0x9b, 0x5a, 0xcf, 0xf9, 0xbd, 0x49, 0x51, 0x38, 0xa9, 0xd7, 0xf2, + 0xd9, 0x7c, 0x7e, 0xaf, 0xd3, 0xdd, 0x94, 0xa0, 0x7c, 0xdb, 0x97, 0x73, + 0x79, 0x73, 0x87, 0x44, 0xe1, 0x14, 0x0d, 0xbf, 0x4e, 0x36, 0xe3, 0xf7, + 0x34, 0x5c, 0x6f, 0xb3, 0xb4, 0x38, 0xfc, 0xcd, 0x6e, 0x6b, 0x8b, 0x23, + 0x46, 0xde, 0x3b, 0xd7, 0x73, 0x79, 0x77, 0x0c, 0x8e, 0xc2, 0xda, 0xbf, + 0x04, 0xf2, 0x6c, 0x2e, 0xab, 0xcf, 0x87, 0x02, 0x65, 0x79, 0xad, 0x1b, + 0xb8, 0xbc, 0x27, 0x35, 0x70, 0x1f, 0xe4, 0x61, 0xf9, 0xfc, 0x1b, 0x5a, + 0x63, 0xcb, 0x97, 0xb5, 0x91, 0xcb, 0x7b, 0x24, 0x25, 0x0a, 0xf7, 0x2e, + 0xcf, 0xe6, 0x71, 0xfb, 0xfc, 0x1a, 0x58, 0x2f, 0x2f, 0x7c, 0x13, 0x97, + 0x97, 0xa6, 0x81, 0x93, 0x95, 0xc4, 0x7f, 0x16, 0x4b, 0xc0, 0xbd, 0xde, + 0xe9, 0xb6, 0x5b, 0x9c, 0xee, 0x46, 0x4f, 0x1c, 0x79, 0x27, 0x84, 0x3c, + 0x43, 0x14, 0x96, 0xcb, 0xa4, 0xfd, 0xc3, 0x71, 0x11, 0x4e, 0x45, 0x39, + 0xa5, 0xa6, 0x5a, 0x93, 0x06, 0xd1, 0x4e, 0x7a, 0x66, 0x8c, 0xc2, 0x8a, + 0x06, 0xc6, 0x71, 0x81, 0xe5, 0x1c, 0xa6, 0x96, 0xcb, 0xed, 0xb2, 0xf8, + 0x36, 0xb4, 0x34, 0x78, 0x5c, 0x96, 0x56, 0xbf, 0x37, 0xa1, 0xbc, 0x21, + 0x1a, 0x58, 0x5b, 0x4f, 0xd4, 0xdf, 0x22, 0x5d, 0x3d, 0x9b, 0x3c, 0x7e, + 0x1d, 0xac, 0x97, 0x37, 0x84, 0xe4, 0x6d, 0xd7, 0xc0, 0xb2, 0xbc, 0x79, + 0x3a, 0x7e, 0x97, 0xb5, 0xb7, 0xf2, 0xed, 0x24, 0x79, 0x61, 0x43, 0x14, + 0xd6, 0xca, 0xc3, 0xfa, 0xd6, 0xe8, 0xe4, 0xc9, 0xfd, 0xaa, 0x97, 0xb7, + 0xed, 0x56, 0x7d, 0x7d, 0x11, 0xee, 0xbd, 0x5f, 0x6d, 0x8d, 0xda, 0x81, + 0x26, 0xcb, 0x7b, 0x80, 0xe4, 0x15, 0xf7, 0x8b, 0xc2, 0xbd, 0xcb, 0x8b, + 0x8e, 0x0b, 0x97, 0xd3, 0xe7, 0x97, 0xe5, 0x85, 0xb7, 0x48, 0x7a, 0xb7, + 0x25, 0x46, 0xde, 0x10, 0x2d, 0x40, 0xf2, 0xdc, 0x2e, 0x9b, 0x2b, 0xae, + 0xbc, 0x13, 0x92, 0xbc, 0x13, 0x7d, 0x93, 0x67, 0xb3, 0xfa, 0x51, 0x5a, + 0x6c, 0x7d, 0x4f, 0x6d, 0xd1, 0xb7, 0xdf, 0xa9, 0xbe, 0xc9, 0x6b, 0xf5, + 0x7a, 0xfc, 0x9e, 0x78, 0xe5, 0x4b, 0x0b, 0x72, 0x79, 0x99, 0x1a, 0xb8, + 0x0f, 0xed, 0xe7, 0x6c, 0xb1, 0x36, 0x39, 0x70, 0xa8, 0xc9, 0xf2, 0x72, + 0x82, 0xfa, 0xfa, 0x22, 0xdc, 0xdb, 0x38, 0x13, 0xf5, 0x15, 0x4a, 0x23, + 0xcb, 0xcb, 0x27, 0x79, 0x3b, 0x2f, 0x8c, 0xc2, 0x7d, 0x28, 0x9f, 0xcf, + 0xe1, 0xf2, 0x3a, 0x1a, 0x7d, 0xb1, 0xf2, 0xc2, 0x77, 0x72, 0x79, 0x5b, + 0x92, 0xa3, 0xb0, 0x56, 0x5e, 0x6a, 0x2f, 0xed, 0x87, 0x12, 0x65, 0x79, + 0xad, 0x77, 0xeb, 0xfb, 0x03, 0xe1, 0xbe, 0xea, 0x5f, 0x3c, 0x79, 0xed, + 0x77, 0xeb, 0xc7, 0x6f, 0x7b, 0xac, 0xbc, 0x78, 0xe5, 0xb3, 0x5b, 0xfd, + 0x56, 0x82, 0xf5, 0xf2, 0x8c, 0xf7, 0xe8, 0xe5, 0x21, 0xdc, 0x7b, 0xf9, + 0x54, 0x51, 0x71, 0xe5, 0x75, 0x93, 0x3c, 0x63, 0x52, 0x14, 0x3e, 0xcb, + 0xf8, 0xf5, 0xb4, 0xb4, 0x78, 0xdc, 0x89, 0xe4, 0x1d, 0xfa, 0xb9, 0x5e, + 0x5f, 0xf0, 0x4f, 0x2b, 0x4f, 0xf6, 0x61, 0x2c, 0x96, 0x06, 0x9f, 0x4f, + 0x07, 0x4b, 0xe3, 0x8d, 0xe4, 0xb5, 0x6b, 0x94, 0x4e, 0x3b, 0xef, 0xca, + 0xf2, 0xa2, 0x7e, 0x54, 0x45, 0xf9, 0xa2, 0x85, 0x65, 0xa5, 0xe5, 0x62, + 0xce, 0xd8, 0x4e, 0xb4, 0xad, 0x51, 0x18, 0xff, 0xba, 0x69, 0xde, 0xed, + 0x2f, 0xc9, 0x1a, 0x07, 0x59, 0xe6, 0x10, 0x5d, 0x18, 0x82, 0x30, 0x84, + 0x5b, 0x53, 0xa3, 0xf8, 0xb6, 0xdf, 0x42, 0xd9, 0x00, 0x6e, 0xde, 0xc1, + 0xa7, 0x0a, 0x2c, 0xde, 0x28, 0x2c, 0x2f, 0xc0, 0x25, 0x00, 0xac, 0x7e, + 0x0d, 0xae, 0xd9, 0x8a, 0x72, 0x01, 0xa4, 0x55, 0x11, 0xcf, 0x3f, 0x0c, + 0xfc, 0xc2, 0x7c, 0xde, 0x85, 0x9b, 0x43, 0x49, 0xfc, 0x67, 0x7c, 0x05, + 0xf2, 0x8b, 0x93, 0x8e, 0xee, 0x02, 0xe6, 0x87, 0xc3, 0x27, 0x3b, 0xe0, + 0xf3, 0x66, 0xbb, 0x9c, 0x0d, 0xd9, 0xf6, 0x0d, 0x2e, 0x3b, 0xe1, 0x2f, + 0xa1, 0x72, 0xfc, 0xec, 0x70, 0x68, 0xde, 0x3b, 0xc5, 0x05, 0x2f, 0x3f, + 0x64, 0x2f, 0x7d, 0x7c, 0xfd, 0xc2, 0xbd, 0x29, 0xe3, 0x15, 0x52, 0xb4, + 0x81, 0x03, 0x15, 0x65, 0xd0, 0x40, 0x65, 0xb2, 0xa2, 0x57, 0x3c, 0xb0, + 0x17, 0xed, 0xc8, 0x27, 0xfb, 0x71, 0x98, 0x4f, 0x33, 0xc9, 0xe4, 0x5d, + 0x60, 0x60, 0x57, 0x76, 0xcd, 0x06, 0x9f, 0xdf, 0xd1, 0x92, 0x5d, 0xe1, + 0x6c, 0xf0, 0x5a, 0xbd, 0x1b, 0xb2, 0x17, 0x78, 0xc1, 0x29, 0x59, 0xef, + 0xf1, 0xae, 0xf1, 0x65, 0xd7, 0xd8, 0xbc, 0xce, 0x56, 0x3f, 0x58, 0xf8, + 0xf9, 0x5e, 0xa7, 0xbd, 0xc9, 0x91, 0xd5, 0x28, 0x50, 0xd9, 0xd7, 0x3a, + 0xbc, 0x3e, 0x27, 0x58, 0x86, 0x6c, 0x93, 0x4c, 0xc4, 0xf2, 0xa9, 0xd7, + 0xe5, 0x33, 0xf2, 0x6c, 0xf9, 0x94, 0x78, 0x6c, 0x1e, 0x6b, 0x7c, 0xe9, + 0x0c, 0xa5, 0x96, 0x7f, 0xb5, 0x56, 0xee, 0xe0, 0xfb, 0xa0, 0xd7, 0xa6, + 0x1a, 0x7a, 0x91, 0xbb, 0xc0, 0x13, 0x70, 0xc3, 0xa0, 0x01, 0x51, 0xf1, + 0x84, 0x97, 0x68, 0xf0, 0x24, 0x3f, 0x5f, 0x57, 0xee, 0xc3, 0xbc, 0xdc, + 0xa2, 0x6f, 0xe0, 0xc2, 0x11, 0x9d, 0x65, 0xca, 0x82, 0x5e, 0x72, 0x36, + 0x68, 0xdb, 0x55, 0xe2, 0x4b, 0x91, 0xf9, 0x78, 0x11, 0xb3, 0xe6, 0x6b, + 0x39, 0x63, 0xdb, 0x69, 0x34, 0xcc, 0x94, 0xd3, 0x7a, 0x6b, 0x27, 0x53, + 0x6b, 0xeb, 0x42, 0xa7, 0x3f, 0x7e, 0x5d, 0x38, 0x2e, 0x5e, 0x3f, 0x0f, + 0xc2, 0x76, 0xba, 0xab, 0xf7, 0xf6, 0xf7, 0x3a, 0x7a, 0x6f, 0x2b, 0x93, + 0x44, 0x03, 0x62, 0xaf, 0x24, 0xbd, 0xdb, 0xb2, 0x83, 0xe7, 0x37, 0x89, + 0x60, 0x1c, 0x37, 0xe7, 0xff, 0xce, 0xff, 0x9d, 0xff, 0x3b, 0xff, 0x77, + 0xfe, 0xef, 0xfc, 0xdf, 0xf9, 0xbf, 0xff, 0xc9, 0x7f, 0x75, 0xe6, 0xe0, + 0x3f, 0x57, 0x1d, 0x79, 0xd1, 0xc4, 0x63, 0xa6, 0x6b, 0x6b, 0xca, 0x83, + 0x67, 0xcc, 0xa1, 0xa2, 0xf5, 0x9b, 0xc1, 0x39, 0x0f, 0xe5, 0x1d, 0x6c, + 0x57, 0x94, 0x48, 0xc6, 0xf5, 0x6b, 0x00, 0x08, 0xee, 0x0b, 0x3f, 0x36, + 0x1f, 0xc3, 0xbd, 0xe6, 0xe0, 0x7b, 0x91, 0x8c, 0x46, 0x48, 0xab, 0x28, + 0xf8, 0xc2, 0x7f, 0x31, 0x50, 0x3d, 0x06, 0x54, 0x15, 0xc1, 0xaf, 0x22, + 0x19, 0x26, 0x22, 0xfc, 0x31, 0x10, 0x1e, 0xbd, 0xc4, 0x1c, 0x4a, 0xdd, + 0xfa, 0x7d, 0x48, 0xe8, 0xec, 0x36, 0x77, 0x15, 0x2d, 0x6a, 0x81, 0x58, + 0x7a, 0xd9, 0xa9, 0x48, 0xc6, 0x4c, 0x4e, 0xb4, 0xc2, 0x74, 0xdd, 0xaa, + 0x23, 0x57, 0xce, 0x57, 0xf3, 0x05, 0x39, 0x1b, 0x51, 0x4e, 0x28, 0xef, + 0x5b, 0x70, 0xf4, 0x4d, 0x91, 0x37, 0x50, 0x90, 0x99, 0x72, 0x0c, 0x15, + 0x1d, 0xef, 0x60, 0x05, 0xb2, 0xb4, 0x73, 0x5c, 0x28, 0x6f, 0x55, 0x3b, + 0xa2, 0xde, 0x33, 0x07, 0x9f, 0x02, 0x78, 0x73, 0xb7, 0xff, 0x6a, 0x48, + 0x5b, 0x82, 0x69, 0x5d, 0x19, 0xe3, 0x5a, 0x18, 0x2a, 0x92, 0xf1, 0x20, + 0x48, 0x02, 0xd4, 0x54, 0x40, 0x5d, 0x05, 0xa8, 0xc7, 0xd0, 0x21, 0x66, + 0x88, 0x6d, 0xd7, 0xf3, 0x82, 0x86, 0xa1, 0xde, 0xe5, 0xc1, 0x67, 0x59, + 0xda, 0x1d, 0xd7, 0x63, 0x2d, 0xbe, 0x80, 0x38, 0x2b, 0x5a, 0x48, 0x34, + 0xc9, 0x52, 0x2c, 0x5c, 0xc7, 0xb1, 0x51, 0x50, 0x9d, 0x01, 0xc8, 0x16, + 0x02, 0xce, 0xb2, 0x43, 0x50, 0x24, 0x1b, 0x2f, 0xd2, 0xb1, 0x9b, 0xb1, + 0xd4, 0x45, 0x65, 0xac, 0xd4, 0x6f, 0xa2, 0xd4, 0xdb, 0x49, 0x6a, 0x57, + 0xea, 0x6e, 0x17, 0x16, 0xa8, 0x72, 0xbf, 0x39, 0x68, 0x00, 0xe8, 0x79, + 0x06, 0xd5, 0x1d, 0x34, 0x07, 0x93, 0x80, 0x7d, 0x2a, 0x67, 0xdf, 0x05, + 0xec, 0xa6, 0xdd, 0x58, 0x32, 0xe2, 0xc6, 0x35, 0x15, 0xab, 0x73, 0xde, + 0xaf, 0x6f, 0x66, 0xed, 0x6a, 0x0e, 0xbe, 0x05, 0x28, 0xc8, 0xe2, 0x73, + 0x27, 0x2b, 0x3e, 0x02, 0xc1, 0xaf, 0x90, 0x3a, 0x94, 0xba, 0xde, 0xc9, + 0x4b, 0x34, 0xa7, 0xec, 0x50, 0xe0, 0x02, 0x73, 0xc7, 0xd3, 0xa3, 0xa0, + 0xec, 0x26, 0xcb, 0xaa, 0xbd, 0xe1, 0x61, 0xc5, 0xd1, 0xe2, 0x9b, 0xea, + 0x4c, 0xb5, 0x35, 0x55, 0x90, 0xe5, 0xaf, 0x6e, 0x65, 0x59, 0x26, 0xf1, + 0x12, 0xff, 0xc4, 0xa9, 0xe6, 0x79, 0xa8, 0x58, 0xe4, 0x39, 0xeb, 0x66, + 0xd6, 0x84, 0xf3, 0x5c, 0x22, 0x2b, 0x44, 0xef, 0x29, 0xe6, 0xcd, 0xf5, + 0xe7, 0x62, 0x5e, 0xb1, 0x50, 0xde, 0x45, 0xbc, 0x68, 0x80, 0x2f, 0x0f, + 0x3e, 0x53, 0x11, 0x9a, 0xb0, 0xd4, 0x49, 0xf0, 0x01, 0xc6, 0x75, 0x00, + 0x32, 0x9b, 0xc9, 0x33, 0xbb, 0xf3, 0x26, 0x35, 0x97, 0x8d, 0xc4, 0xde, + 0x95, 0xa1, 0xb8, 0x78, 0xcd, 0x42, 0x79, 0xcf, 0x46, 0xd1, 0x2b, 0x28, + 0x97, 0xca, 0x62, 0xa1, 0x66, 0x80, 0xff, 0x23, 0xc7, 0x97, 0x07, 0xf7, + 0x71, 0xc1, 0x94, 0x49, 0x57, 0x51, 0x7b, 0x89, 0xa2, 0xe4, 0x76, 0x57, + 0x04, 0x8f, 0x57, 0x04, 0xbf, 0xa9, 0x08, 0x1e, 0x81, 0xba, 0xa7, 0xad, + 0x30, 0xad, 0x34, 0xad, 0x62, 0xf5, 0x3f, 0x32, 0x31, 0x5e, 0xf5, 0x7f, + 0x7d, 0x0b, 0x2b, 0x51, 0xf2, 0x4d, 0xac, 0xfa, 0x77, 0x34, 0xab, 0x39, + 0xbf, 0x3f, 0x4f, 0x54, 0x7f, 0xf6, 0x4d, 0xac, 0xfa, 0xc5, 0x6b, 0xb4, + 0xd5, 0x7f, 0x6a, 0x1e, 0x2f, 0xd8, 0x43, 0xf3, 0x44, 0xf5, 0x47, 0xdd, + 0xa4, 0xaf, 0x7e, 0x7d, 0x73, 0x4c, 0xf5, 0xf3, 0x78, 0x66, 0x77, 0x6d, + 0x52, 0x73, 0xb9, 0x61, 0x9e, 0xa8, 0xbe, 0x61, 0x8d, 0xa8, 0xfe, 0xbe, + 0x28, 0x7a, 0x25, 0xe5, 0xb2, 0x68, 0x9e, 0xa6, 0xfa, 0x7f, 0xda, 0x94, + 0xa0, 0xfa, 0xc1, 0x85, 0xd1, 0xea, 0x4b, 0x75, 0x9f, 0x32, 0x4f, 0xaa, + 0x3b, 0x68, 0x6f, 0x7d, 0x79, 0xf0, 0xb4, 0x39, 0xf8, 0x66, 0x24, 0xe3, + 0xe1, 0x26, 0x2c, 0xc4, 0x3e, 0x10, 0xbd, 0x72, 0x13, 0x1b, 0x6d, 0x5d, + 0x4d, 0x58, 0x96, 0x08, 0x0d, 0xb8, 0x37, 0xaf, 0x42, 0xf4, 0xd3, 0xa0, + 0x59, 0xa9, 0x4d, 0x58, 0xfe, 0x21, 0x40, 0x38, 0x07, 0x09, 0x83, 0x1f, + 0x13, 0xc5, 0xae, 0xab, 0x58, 0xf1, 0x20, 0x21, 0x92, 0x61, 0x45, 0x9a, + 0xce, 0xb7, 0xfd, 0x30, 0x36, 0xf2, 0xc6, 0x30, 0xaa, 0x4f, 0x41, 0x59, + 0x23, 0x19, 0x05, 0x90, 0x7e, 0xe4, 0x54, 0x1a, 0x26, 0xb4, 0xf4, 0x98, + 0x83, 0xab, 0xb6, 0x56, 0x04, 0x37, 0x6d, 0x81, 0x36, 0x31, 0xb5, 0xb3, + 0x36, 0xf9, 0xe6, 0x46, 0x75, 0x80, 0x37, 0x5d, 0x25, 0x8a, 0xf3, 0xaf, + 0x1b, 0xb5, 0xe5, 0x58, 0x7c, 0x95, 0xe8, 0x91, 0x7f, 0xdc, 0xc8, 0x7a, + 0xe4, 0xb8, 0xd0, 0xfd, 0x37, 0x78, 0x8b, 0x7f, 0xd4, 0x48, 0xf0, 0x01, + 0xc6, 0x74, 0xc0, 0xbc, 0x3b, 0xc2, 0xff, 0x6e, 0x2e, 0x2f, 0x78, 0x26, + 0xbd, 0xf3, 0x17, 0x69, 0x98, 0x53, 0xd1, 0xfe, 0x9b, 0x59, 0x86, 0xc1, + 0x68, 0x86, 0x27, 0x8b, 0x58, 0x86, 0xc0, 0x04, 0xe9, 0x1b, 0xa2, 0xe9, + 0xef, 0x16, 0xf1, 0x0c, 0xbb, 0x32, 0xee, 0xe7, 0x39, 0x01, 0xba, 0x81, + 0xa3, 0x21, 0xc3, 0x5e, 0x72, 0x2a, 0xe2, 0x39, 0xb9, 0x79, 0x4e, 0x57, + 0x47, 0x25, 0xfe, 0xa0, 0x48, 0x54, 0xad, 0x50, 0x57, 0x35, 0x3f, 0x4b, + 0x7f, 0x06, 0xd2, 0x27, 0xf3, 0xaa, 0xd5, 0xb0, 0xb1, 0xf3, 0x29, 0xa1, + 0xeb, 0x8a, 0xa8, 0x7d, 0x3f, 0x8d, 0xe6, 0xd8, 0x95, 0x91, 0xdd, 0x8c, + 0xa9, 0xab, 0xb6, 0xf1, 0x82, 0x3d, 0x77, 0x03, 0xcf, 0xe5, 0x51, 0x51, + 0x12, 0x73, 0x41, 0x4f, 0xfa, 0xe6, 0x67, 0xfb, 0xb3, 0x92, 0xbc, 0x78, + 0x13, 0x2b, 0x49, 0xdd, 0x0d, 0x6a, 0x49, 0x92, 0x28, 0xc7, 0xae, 0x8c, + 0x4c, 0x9e, 0x15, 0xb4, 0x5f, 0xe3, 0x0d, 0x18, 0xfb, 0x88, 0x28, 0x0e, + 0xcd, 0x45, 0xf1, 0x65, 0x0f, 0x00, 0xc9, 0x04, 0x22, 0x51, 0x71, 0x4f, + 0xcf, 0x15, 0x2d, 0x33, 0x59, 0x46, 0xfd, 0x27, 0x67, 0xdb, 0x0d, 0xb8, + 0x2c, 0x19, 0xd7, 0x35, 0x17, 0x13, 0x3e, 0xe3, 0x0a, 0x9f, 0xa3, 0x62, + 0x23, 0xaf, 0x20, 0xb2, 0x95, 0x33, 0xee, 0x04, 0xe5, 0x49, 0xef, 0xec, + 0x06, 0xdb, 0x97, 0x1b, 0x09, 0xbf, 0x3b, 0x47, 0x51, 0x3a, 0xbb, 0xd3, + 0x3b, 0x1f, 0x54, 0xd8, 0xf0, 0x9c, 0xc0, 0xaa, 0x51, 0x74, 0x25, 0xaf, + 0x4d, 0xff, 0x1b, 0x30, 0x18, 0x73, 0xc8, 0x0e, 0xf3, 0xd1, 0x6b, 0x28, + 0x21, 0x8b, 0x4b, 0xd8, 0x0f, 0xb8, 0x2f, 0x36, 0xb2, 0x81, 0xc3, 0xd3, + 0x47, 0xce, 0x25, 0x05, 0xce, 0x3b, 0xbc, 0x91, 0xb5, 0x7a, 0x45, 0xf0, + 0x03, 0x8e, 0xf9, 0x6e, 0x8e, 0x50, 0x5c, 0xa8, 0x7e, 0xd3, 0x46, 0x96, + 0xc9, 0x76, 0x3b, 0x1f, 0x7e, 0xa1, 0x4d, 0xfb, 0x59, 0x50, 0xf4, 0xfd, + 0x4d, 0x2c, 0xbb, 0x9d, 0x1b, 0x71, 0xde, 0xf3, 0xda, 0x19, 0xf0, 0x7b, + 0x00, 0x1e, 0x4d, 0x61, 0x53, 0xc7, 0xbe, 0xf2, 0xe0, 0x7b, 0x30, 0xe0, + 0x22, 0x19, 0x4b, 0xed, 0x24, 0x2c, 0x12, 0xc9, 0x58, 0x01, 0xf1, 0xca, + 0xce, 0x93, 0x81, 0x21, 0xe6, 0x8e, 0x4d, 0xbb, 0x95, 0xc0, 0x00, 0xac, + 0xd4, 0xe6, 0xea, 0x7e, 0xac, 0xc3, 0xba, 0x01, 0x91, 0xde, 0xb9, 0xba, + 0x1f, 0xeb, 0xe8, 0xdf, 0x35, 0xaa, 0xad, 0x90, 0x31, 0xd2, 0xce, 0x47, + 0x7b, 0xe3, 0x9c, 0xe8, 0x9c, 0x3a, 0xcc, 0xce, 0x86, 0x53, 0xfa, 0xe6, + 0xdb, 0x20, 0xb3, 0x70, 0xca, 0x1c, 0x5e, 0x93, 0xae, 0xa2, 0xdf, 0x5c, + 0x03, 0xe0, 0x20, 0x22, 0x84, 0xe1, 0x66, 0x81, 0x42, 0x9d, 0xb9, 0x81, + 0x69, 0x69, 0x78, 0x75, 0xa1, 0xd0, 0xb2, 0x99, 0x1b, 0x78, 0xca, 0xa2, + 0x42, 0x56, 0x6f, 0x73, 0xf0, 0xd9, 0xf0, 0x9f, 0x0a, 0x59, 0xbe, 0xd3, + 0x79, 0xbe, 0x40, 0x83, 0xcf, 0x9a, 0x22, 0x19, 0xf7, 0xd8, 0x78, 0xde, + 0x9f, 0x14, 0xb2, 0x26, 0x3e, 0x8a, 0xaa, 0x1b, 0x4c, 0x3d, 0x7c, 0x33, + 0xe2, 0x7e, 0x68, 0x63, 0x83, 0x3d, 0xdc, 0x8e, 0x52, 0x42, 0x13, 0xe6, + 0xa1, 0xd0, 0x50, 0xdd, 0x6e, 0x73, 0xe7, 0xab, 0xfe, 0x3c, 0xb4, 0x47, + 0x0c, 0xde, 0xd4, 0x13, 0xc9, 0xa8, 0xb3, 0xb1, 0x58, 0xb7, 0xb9, 0x33, + 0x92, 0xbe, 0xf9, 0x27, 0xa9, 0xac, 0xa5, 0xee, 0x66, 0xe2, 0xe7, 0xd8, + 0xd8, 0xa4, 0x1f, 0x18, 0x7d, 0xe4, 0xc6, 0x54, 0x14, 0x12, 0xc0, 0x46, + 0x80, 0xce, 0x9b, 0x01, 0xe9, 0xe9, 0x9b, 0xf1, 0x31, 0x15, 0x64, 0x7a, + 0xed, 0x8d, 0x8c, 0xc3, 0xb3, 0x81, 0x19, 0xa1, 0x34, 0x9b, 0xaa, 0xac, + 0x75, 0x54, 0xa1, 0xae, 0x8c, 0x4b, 0x9a, 0x24, 0x95, 0x2a, 0x2c, 0x8c, + 0xb6, 0xd5, 0x47, 0x0d, 0xdc, 0xf4, 0xcc, 0x01, 0xc2, 0xcf, 0x1b, 0x25, + 0xc2, 0xa1, 0x85, 0xc2, 0x7a, 0x5c, 0x84, 0xe5, 0xed, 0x1a, 0x74, 0xa2, + 0x91, 0xda, 0xe4, 0x2d, 0x46, 0x01, 0xfc, 0xbf, 0x6d, 0xc0, 0x94, 0x4d, + 0xfb, 0x81, 0xfd, 0x0b, 0x4d, 0xb7, 0xdc, 0xdc, 0xc0, 0x9b, 0xe6, 0xe5, + 0x82, 0x68, 0x56, 0x37, 0x50, 0x56, 0x73, 0x81, 0x76, 0x9f, 0x9c, 0xd5, + 0x6f, 0x0b, 0x44, 0x56, 0x3b, 0xda, 0x58, 0x56, 0xcf, 0x34, 0xb2, 0x76, + 0xd9, 0xaf, 0xc9, 0xab, 0xb0, 0x81, 0x75, 0xc3, 0x0b, 0x9a, 0x7c, 0x2e, + 0xa2, 0x7c, 0x9a, 0x34, 0xf9, 0x0c, 0xe7, 0xf9, 0x80, 0x5a, 0xfe, 0x7d, + 0xbd, 0xa2, 0xb0, 0xec, 0xb6, 0xc9, 0xd9, 0xcd, 0x56, 0xb3, 0x2b, 0xe2, + 0xd9, 0xdd, 0x15, 0x9b, 0xdd, 0x0b, 0x56, 0x96, 0xdd, 0xcf, 0x35, 0xd9, + 0x3d, 0x60, 0xe5, 0xd9, 0x9d, 0xca, 0x8f, 0x66, 0x77, 0xbf, 0x95, 0x57, + 0x6b, 0x7e, 0x45, 0x57, 0x51, 0xab, 0x4a, 0x0b, 0xda, 0x4d, 0x59, 0xbd, + 0x98, 0x2f, 0xb2, 0x7a, 0x75, 0xbd, 0x9a, 0x47, 0x45, 0xf0, 0x6b, 0x28, + 0x5f, 0xc1, 0x7a, 0xea, 0x2e, 0x10, 0xb3, 0x8a, 0xe7, 0xb6, 0x48, 0x93, + 0x5b, 0x21, 0xe5, 0x76, 0x9b, 0x26, 0xb7, 0x59, 0x9a, 0xdc, 0xc6, 0xc5, + 0xc9, 0xed, 0x3a, 0x35, 0x37, 0xbb, 0x9c, 0xdb, 0x0b, 0xeb, 0xa2, 0xb9, + 0x7d, 0xba, 0x9a, 0xe5, 0xa6, 0x68, 0x72, 0x7b, 0x71, 0x35, 0xcf, 0xed, + 0x52, 0x4d, 0x6e, 0x3d, 0xab, 0x69, 0x24, 0xcd, 0x33, 0x30, 0xbb, 0x71, + 0x82, 0xa9, 0x41, 0xc6, 0x73, 0x0e, 0xa9, 0x39, 0xc3, 0xb3, 0x85, 0xb5, + 0x38, 0xb9, 0x8e, 0x8d, 0x1e, 0xb0, 0x16, 0x84, 0xfa, 0xdb, 0x6c, 0x9a, + 0x28, 0x60, 0x9e, 0xdb, 0xb0, 0x1a, 0x47, 0x78, 0xc4, 0xbf, 0x00, 0x08, + 0x5f, 0x5f, 0xc7, 0x54, 0x29, 0x92, 0x51, 0x4b, 0xf9, 0xde, 0x3f, 0x5b, + 0x1d, 0x98, 0xb9, 0x80, 0x7f, 0x42, 0xe0, 0x67, 0x12, 0x7e, 0xf3, 0x6c, + 0xee, 0x03, 0x07, 0x57, 0x6d, 0xf7, 0x67, 0x9a, 0x1e, 0x32, 0x1c, 0x9d, + 0x03, 0x54, 0xbf, 0x5c, 0x87, 0x36, 0xef, 0xe8, 0x40, 0x88, 0xde, 0x21, + 0x18, 0x92, 0x57, 0xa3, 0xb7, 0x6a, 0x4a, 0xbf, 0xf3, 0xe9, 0xa3, 0x93, + 0x21, 0xfd, 0x46, 0x91, 0x7e, 0xd4, 0x22, 0xd2, 0x73, 0x41, 0x0a, 0x0c, + 0xf5, 0x31, 0x47, 0x2c, 0xcc, 0x0c, 0x86, 0x36, 0x6d, 0x87, 0x3b, 0xe8, + 0xbf, 0x5d, 0x8c, 0xef, 0xad, 0x01, 0x1c, 0x80, 0x8f, 0x59, 0x78, 0xce, + 0x03, 0x79, 0xc9, 0xca, 0x36, 0x1f, 0x4e, 0xdf, 0x7c, 0xca, 0xc0, 0xed, + 0xe8, 0x3a, 0xa6, 0x35, 0xdd, 0x76, 0xb5, 0x8d, 0x23, 0x19, 0x21, 0x0b, + 0x4d, 0x78, 0xa9, 0x3f, 0x66, 0xb1, 0xbd, 0x91, 0xd7, 0x30, 0xdf, 0xd7, + 0xa0, 0xe9, 0xab, 0x02, 0x6c, 0xb0, 0x06, 0xdb, 0x30, 0x83, 0x33, 0xd4, + 0x32, 0x7f, 0x9e, 0xa5, 0x99, 0x42, 0x67, 0x05, 0xd4, 0x91, 0xfb, 0xb3, + 0x59, 0xa2, 0x0b, 0x9f, 0x0b, 0xb0, 0xe6, 0xbe, 0xc7, 0x2e, 0xe6, 0x6c, + 0x13, 0xb4, 0x31, 0xcb, 0x21, 0x5b, 0x97, 0x83, 0xa9, 0xfd, 0x3b, 0x43, + 0x05, 0x14, 0x23, 0x60, 0x82, 0x4c, 0x6a, 0xdb, 0xb8, 0xbf, 0x18, 0x20, + 0x47, 0x9d, 0xa4, 0x96, 0xa9, 0x52, 0x17, 0x32, 0xa9, 0x83, 0xec, 0x76, + 0x79, 0x2c, 0xbf, 0x75, 0x1d, 0xcb, 0x6e, 0x8d, 0xda, 0x0c, 0x41, 0xbf, + 0xca, 0xde, 0x6f, 0x96, 0xe8, 0x1d, 0xa0, 0x70, 0x62, 0x81, 0xd2, 0xcb, + 0x5e, 0xa3, 0x72, 0x9b, 0x43, 0x30, 0x03, 0x05, 0x53, 0xc6, 0xa3, 0x41, + 0x33, 0x87, 0x2a, 0x1f, 0xa8, 0x08, 0x9e, 0x60, 0xd6, 0x2a, 0x78, 0xa2, + 0x32, 0xf8, 0x75, 0x64, 0x3f, 0x2b, 0xf1, 0x98, 0x4d, 0xd7, 0x61, 0x5b, + 0xb3, 0xe2, 0x02, 0xdd, 0x4e, 0x76, 0xdf, 0x8d, 0x09, 0x5f, 0xb1, 0xe8, + 0x03, 0x18, 0xfd, 0x94, 0x45, 0xb7, 0x61, 0x93, 0xa1, 0x9f, 0x03, 0xfe, + 0x4e, 0x28, 0xaf, 0xec, 0x3a, 0x51, 0x79, 0x36, 0x09, 0x9d, 0x00, 0x27, + 0xad, 0x3e, 0xea, 0xa4, 0x45, 0x60, 0x01, 0x91, 0x37, 0x10, 0x8a, 0x79, + 0xb4, 0x3f, 0x44, 0x06, 0xf8, 0x85, 0x55, 0x8d, 0xac, 0x82, 0x24, 0x73, + 0xd8, 0x3c, 0x93, 0xf7, 0xa0, 0x39, 0x8f, 0xe6, 0xde, 0xa2, 0x45, 0x30, + 0x7e, 0x8e, 0x16, 0xa1, 0xfe, 0xf9, 0x04, 0xed, 0x6b, 0x40, 0xfb, 0x57, + 0xf6, 0x84, 0x38, 0x34, 0x93, 0x35, 0xdd, 0x40, 0x12, 0x53, 0x11, 0xfc, + 0x3c, 0x92, 0xb1, 0x6b, 0x15, 0x9b, 0x55, 0x5b, 0x11, 0xd5, 0x55, 0xf4, + 0x69, 0x03, 0xba, 0x8b, 0xe6, 0xe0, 0xbb, 0xe1, 0x8f, 0x67, 0x28, 0x7c, + 0x0d, 0x74, 0xbf, 0xca, 0x5e, 0x31, 0x33, 0xc6, 0x59, 0x46, 0x57, 0x31, + 0xb4, 0x8a, 0xdc, 0xdd, 0xa2, 0x07, 0xd7, 0x31, 0xf9, 0xaf, 0xfa, 0xd0, + 0x58, 0x4f, 0x5b, 0xb1, 0x0a, 0xdb, 0xf9, 0x73, 0x53, 0xe4, 0x75, 0x2c, + 0xe2, 0x6f, 0x66, 0x8a, 0x09, 0xe8, 0x2f, 0x3e, 0x72, 0x73, 0x58, 0x7a, + 0xd7, 0x4c, 0xd1, 0x6f, 0x1d, 0x3e, 0x6a, 0x89, 0xd7, 0xcb, 0x99, 0x1a, + 0x44, 0x32, 0x26, 0xad, 0xc2, 0xf1, 0x74, 0x38, 0x90, 0x05, 0xb2, 0xeb, + 0xb8, 0xec, 0x3f, 0x32, 0x66, 0x28, 0xf7, 0xe9, 0x95, 0xbc, 0xea, 0x95, + 0x33, 0xa3, 0x33, 0xec, 0xd7, 0x2b, 0x31, 0x0f, 0xe8, 0x8d, 0xa2, 0xd9, + 0x9c, 0x7a, 0x88, 0x0f, 0x3b, 0xf8, 0x75, 0x88, 0xdd, 0xc4, 0x84, 0xef, + 0x63, 0x86, 0xe4, 0x75, 0xa4, 0x0f, 0x4d, 0x78, 0x61, 0x25, 0x95, 0xe3, + 0x80, 0xea, 0x92, 0x4b, 0x1e, 0xf2, 0x9f, 0x66, 0xc4, 0x56, 0xf8, 0x85, + 0xf2, 0x20, 0xac, 0xb1, 0xf2, 0xee, 0x12, 0xcc, 0x6f, 0xa0, 0x77, 0x01, + 0xd2, 0x26, 0x88, 0xd2, 0xbf, 0xc1, 0x3b, 0xa2, 0xac, 0x81, 0xcd, 0x58, + 0xd7, 0x32, 0xba, 0x8f, 0x84, 0x16, 0xee, 0x0b, 0xdf, 0x3b, 0x83, 0x9c, + 0xac, 0xa2, 0x92, 0x06, 0x0d, 0x0a, 0xaa, 0x0c, 0xd4, 0xf9, 0x2b, 0xa3, + 0xca, 0xf0, 0x71, 0xd8, 0x3b, 0x43, 0x34, 0xcd, 0x7e, 0x2f, 0xf9, 0x28, + 0x9f, 0x98, 0x83, 0x7f, 0x8f, 0x64, 0x18, 0x56, 0x52, 0x5b, 0xa2, 0x3b, + 0xf2, 0x46, 0x65, 0xf0, 0x4b, 0xc0, 0x85, 0x4b, 0x67, 0x88, 0x35, 0x2a, + 0xab, 0x11, 0x77, 0x0b, 0xbf, 0x92, 0x6a, 0xf4, 0x8f, 0xe9, 0xb1, 0x3e, + 0x7f, 0x66, 0x65, 0xf0, 0xc5, 0x4a, 0x64, 0x7c, 0xc1, 0x0c, 0x13, 0x1d, + 0xa8, 0xe6, 0x10, 0xe8, 0xbc, 0x87, 0x57, 0x60, 0xde, 0x6f, 0xb2, 0xc6, + 0x02, 0xc7, 0x8d, 0x75, 0x0b, 0x7a, 0x62, 0xac, 0xa9, 0x30, 0xd6, 0xc3, + 0x5c, 0x7d, 0xe8, 0xaa, 0x67, 0x45, 0x5f, 0x96, 0x75, 0x43, 0x33, 0xcc, + 0x5a, 0xcb, 0xc6, 0xd8, 0xc7, 0x16, 0xb6, 0x72, 0x61, 0x86, 0xb7, 0x66, + 0x05, 0xef, 0xa9, 0xfb, 0xa6, 0x47, 0x0d, 0xef, 0xe2, 0x15, 0xd1, 0xb9, + 0xf2, 0x2f, 0x16, 0xe6, 0x63, 0x4d, 0x5d, 0x21, 0x58, 0x68, 0xa1, 0xe3, + 0x9b, 0x2e, 0xaa, 0x6f, 0x5d, 0xab, 0x99, 0xbc, 0xde, 0x64, 0x02, 0x06, + 0xaf, 0x60, 0x16, 0x67, 0x29, 0x53, 0xe5, 0xbc, 0xdd, 0x6b, 0x99, 0x17, + 0x72, 0x64, 0x39, 0x76, 0xf7, 0x01, 0xae, 0x66, 0x3b, 0xd6, 0xf2, 0xf1, + 0x1f, 0x5a, 0xb5, 0x9b, 0xf1, 0x1d, 0x80, 0x5a, 0x1d, 0x5c, 0x2e, 0x54, + 0x0c, 0x08, 0x7e, 0xa2, 0x12, 0xec, 0xe4, 0x04, 0x2a, 0xe6, 0x16, 0x15, + 0xd3, 0x23, 0x61, 0x3c, 0x6b, 0xa9, 0x23, 0x3e, 0xe7, 0xfe, 0xb6, 0xc5, + 0x22, 0x56, 0x68, 0x45, 0xad, 0x2c, 0x6f, 0xb6, 0xff, 0x91, 0x2b, 0x2a, + 0x8a, 0x4c, 0x38, 0xbd, 0xe0, 0xa3, 0x10, 0xa0, 0xce, 0x55, 0xa9, 0xd3, + 0xa3, 0xd4, 0x3f, 0xc8, 0xc5, 0xc4, 0x40, 0x0f, 0xf7, 0xf5, 0x47, 0x52, + 0x55, 0xa1, 0xab, 0x09, 0xef, 0xca, 0x15, 0xcd, 0x90, 0xc4, 0xda, 0x76, + 0xd0, 0x94, 0xd5, 0x51, 0xc3, 0x76, 0x80, 0x9b, 0x4b, 0x65, 0xb9, 0x6a, + 0x2e, 0xc1, 0x69, 0x0f, 0xf4, 0x44, 0x5e, 0x2b, 0x0f, 0xfe, 0x03, 0x9a, + 0x27, 0x93, 0x19, 0x81, 0xbc, 0x57, 0x20, 0xb7, 0xdc, 0x57, 0x49, 0xde, + 0xa5, 0x24, 0xaf, 0x6b, 0x50, 0x12, 0x09, 0x0a, 0xe5, 0x3d, 0xd0, 0x8a, + 0x69, 0x9a, 0x9a, 0x76, 0x65, 0xfc, 0xe6, 0x3a, 0x51, 0x56, 0x9b, 0x07, + 0x27, 0x8b, 0xae, 0x65, 0xbc, 0x17, 0xff, 0x91, 0x13, 0xed, 0xc5, 0xe0, + 0x32, 0xde, 0x8b, 0x0e, 0xa0, 0x0f, 0xa8, 0xf4, 0x33, 0x3c, 0x6a, 0xdd, + 0x76, 0x02, 0x71, 0x65, 0xf0, 0xdf, 0x7c, 0x31, 0x3c, 0xa7, 0x55, 0x54, + 0xed, 0x73, 0x42, 0xff, 0x38, 0x47, 0x54, 0x6d, 0x76, 0x6b, 0x4c, 0x9d, + 0xa6, 0x2e, 0x53, 0xeb, 0xf4, 0x55, 0x65, 0xf0, 0x38, 0x1a, 0xcd, 0x69, + 0x07, 0xdd, 0x90, 0xd6, 0xb1, 0xa9, 0x5b, 0x61, 0x4e, 0xe6, 0xc0, 0x56, + 0xd6, 0xaa, 0x2b, 0x70, 0xae, 0x08, 0xad, 0xea, 0xe6, 0x9a, 0xbf, 0xb9, + 0x1b, 0x78, 0xdb, 0xea, 0x99, 0x01, 0xc7, 0xf5, 0xe6, 0xbf, 0x3c, 0x5a, + 0xc9, 0x5d, 0x19, 0x95, 0xd7, 0x91, 0x9a, 0x1d, 0x8f, 0x64, 0x3c, 0x5a, + 0xcf, 0xeb, 0x34, 0x40, 0x53, 0xa7, 0x5d, 0xf5, 0xbc, 0x4e, 0x38, 0xd5, + 0x1c, 0x61, 0x9d, 0x91, 0x37, 0xd9, 0xa3, 0x4e, 0x35, 0xac, 0xd8, 0x6f, + 0x65, 0x8b, 0x62, 0xb7, 0x7a, 0x58, 0x8f, 0x7c, 0x7d, 0x9d, 0xbe, 0xf4, + 0x91, 0x0c, 0x4f, 0x3d, 0x53, 0xcf, 0x6e, 0x2e, 0x60, 0x6d, 0xb4, 0x45, + 0x7e, 0xa1, 0xf2, 0xda, 0x3d, 0x34, 0x9d, 0xd6, 0xed, 0x67, 0x3b, 0x01, + 0x79, 0x2b, 0x3c, 0xe4, 0x5a, 0x7c, 0xa3, 0xb6, 0x41, 0x66, 0xbd, 0x76, + 0x1a, 0x44, 0x37, 0x9a, 0x35, 0x87, 0x39, 0x78, 0x10, 0xc6, 0x75, 0xa6, + 0x76, 0x9a, 0xd0, 0x0f, 0xea, 0x5b, 0x8e, 0xe5, 0xb3, 0x79, 0x3c, 0xf5, + 0xe6, 0xa5, 0x0a, 0xed, 0x44, 0xed, 0x67, 0xb6, 0xfa, 0x3d, 0x84, 0x83, + 0x9d, 0xf9, 0xb0, 0x18, 0x84, 0xe2, 0x8d, 0xe5, 0xc5, 0x7b, 0xd5, 0xcd, + 0xec, 0xf5, 0xef, 0x97, 0x72, 0x63, 0x89, 0xfe, 0x5f, 0x16, 0xb8, 0xe0, + 0x4b, 0xbb, 0xcd, 0x5d, 0xf7, 0x6e, 0x3f, 0x13, 0x89, 0xa4, 0x4f, 0x2a, + 0xc9, 0x81, 0xcb, 0x08, 0xd7, 0x90, 0xf4, 0x49, 0xc9, 0x38, 0xde, 0xdc, + 0x4c, 0x4c, 0x0e, 0x8a, 0x09, 0xee, 0x23, 0xa6, 0xbd, 0x59, 0x4c, 0xda, + 0xfd, 0x88, 0xeb, 0xea, 0xaa, 0x02, 0x9c, 0x69, 0xf7, 0x10, 0xb6, 0x1c, + 0xea, 0x2c, 0xe6, 0x84, 0xac, 0x81, 0x80, 0xb6, 0x33, 0x13, 0x61, 0x58, + 0xc4, 0x6d, 0x4e, 0x49, 0x42, 0xe2, 0x4e, 0xcc, 0xc5, 0x1c, 0x2a, 0x1e, + 0xc2, 0x8a, 0xda, 0x19, 0x66, 0x50, 0xea, 0x14, 0x9e, 0x89, 0x91, 0x95, + 0x35, 0xf5, 0x75, 0xb6, 0xd3, 0xd4, 0x39, 0x84, 0x43, 0x2f, 0x73, 0x68, + 0x14, 0x87, 0x0a, 0x38, 0xe5, 0x09, 0xce, 0x37, 0x83, 0x43, 0xa7, 0x38, + 0x74, 0x27, 0xa7, 0x54, 0x38, 0xe5, 0xe5, 0x1c, 0x97, 0x06, 0x50, 0x59, + 0x2e, 0x24, 0x74, 0xee, 0x64, 0x54, 0x5d, 0x2c, 0xcb, 0x82, 0x34, 0xff, + 0x85, 0xe6, 0xd0, 0x13, 0x58, 0xd8, 0x70, 0xf7, 0x34, 0xac, 0x4c, 0xe7, + 0x03, 0x90, 0xbe, 0x28, 0x34, 0xf3, 0x14, 0x98, 0xeb, 0x99, 0xab, 0x30, + 0x65, 0x17, 0x2f, 0xce, 0x9d, 0xd8, 0x82, 0x50, 0x97, 0xcd, 0xdd, 0x81, + 0x8d, 0x4c, 0xeb, 0x77, 0x0d, 0xe1, 0x09, 0x6c, 0xfc, 0x4f, 0x13, 0xea, + 0x04, 0xe9, 0xac, 0x88, 0x5d, 0x19, 0x6f, 0x2c, 0x57, 0x1b, 0xf7, 0x67, + 0xd3, 0x70, 0x50, 0x1c, 0xc3, 0xfd, 0x09, 0xf4, 0x42, 0xf4, 0x12, 0x0f, + 0x6c, 0xe9, 0x5c, 0x0c, 0x11, 0xc0, 0x54, 0x06, 0xff, 0x09, 0x05, 0xbe, + 0xf2, 0x5a, 0xe6, 0x79, 0xaa, 0x3b, 0x46, 0xed, 0x4f, 0x20, 0x1a, 0xd6, + 0x47, 0x9d, 0x0a, 0x8d, 0xb7, 0x5d, 0x58, 0x6d, 0x12, 0x5d, 0xac, 0xcd, + 0xf9, 0x54, 0x34, 0x3d, 0x73, 0x1a, 0xf7, 0x5f, 0x99, 0x52, 0xbd, 0x56, + 0x07, 0xe3, 0x79, 0x3f, 0x4e, 0x30, 0x17, 0x68, 0xc9, 0x15, 0x51, 0x81, + 0x3d, 0xb9, 0xb8, 0x11, 0xfb, 0x1e, 0x5b, 0x1b, 0xbd, 0x14, 0x4e, 0x65, + 0x0d, 0xf1, 0x04, 0xeb, 0xea, 0xd0, 0xae, 0x34, 0x56, 0x36, 0x3e, 0xa7, + 0x83, 0x9a, 0x6f, 0x01, 0x51, 0xe5, 0x91, 0x7d, 0x15, 0x73, 0x9e, 0xc0, + 0x1e, 0x4d, 0xbf, 0xf5, 0xf7, 0x67, 0xd4, 0x4e, 0xe7, 0xed, 0x88, 0x7e, + 0x2b, 0xdb, 0xcd, 0xbc, 0x93, 0x75, 0x31, 0xa9, 0x85, 0x4e, 0x07, 0x3a, + 0x87, 0xb2, 0x2e, 0x18, 0x33, 0xb7, 0x4e, 0xe5, 0x42, 0x55, 0x67, 0x39, + 0xb2, 0x48, 0x3e, 0x45, 0x52, 0xff, 0xab, 0x56, 0xa1, 0x4d, 0xcc, 0xfd, + 0x81, 0x61, 0xe6, 0x5b, 0x9e, 0x46, 0x1d, 0x8f, 0x8e, 0x81, 0xbd, 0xe1, + 0x05, 0x53, 0xe4, 0xc9, 0xed, 0x96, 0x63, 0x99, 0x49, 0x6c, 0x1c, 0xac, + 0xaf, 0xd5, 0x8f, 0x83, 0x37, 0x6b, 0x99, 0x1e, 0xec, 0x66, 0x59, 0x17, + 0x8d, 0x76, 0x33, 0xcd, 0x7d, 0x7e, 0x0d, 0x9b, 0x88, 0xee, 0xab, 0x55, + 0xf7, 0xda, 0x4e, 0x4c, 0xa1, 0xd1, 0x5a, 0x74, 0xa6, 0x85, 0x91, 0x7c, + 0xbc, 0x46, 0xc5, 0x1d, 0x60, 0xb8, 0xce, 0x6e, 0x1c, 0x20, 0x4b, 0xbb, + 0x2b, 0xba, 0x76, 0xed, 0x3c, 0x0d, 0x55, 0x4b, 0x9f, 0xb4, 0x20, 0x07, + 0x6f, 0x46, 0xbc, 0x0d, 0x81, 0x5b, 0x3f, 0xf4, 0x33, 0xd9, 0x36, 0xe1, + 0xbd, 0xed, 0x98, 0x9b, 0xba, 0x5b, 0x78, 0xc7, 0x14, 0x26, 0x31, 0xb0, + 0x26, 0x76, 0xb8, 0xf4, 0x30, 0xc2, 0x7d, 0xac, 0xa1, 0x81, 0x96, 0x69, + 0x21, 0x1b, 0x2e, 0x8f, 0xf3, 0xe1, 0x82, 0x39, 0x45, 0x87, 0x4b, 0x33, + 0x57, 0xf4, 0x87, 0x9c, 0x7c, 0x4c, 0x72, 0xe8, 0x8f, 0x1c, 0xca, 0xe7, + 0x50, 0xfe, 0x1a, 0x3e, 0x0c, 0x39, 0x34, 0x9d, 0x43, 0x66, 0x0e, 0x4d, + 0xe5, 0x50, 0x15, 0x87, 0x8e, 0xb3, 0x1d, 0xef, 0xce, 0x7a, 0x0e, 0x85, + 0x39, 0xb4, 0x9a, 0x43, 0xf7, 0x70, 0x88, 0x0f, 0xd6, 0xd4, 0xef, 0x38, + 0xd4, 0xca, 0xa1, 0x93, 0x1c, 0x6a, 0x3b, 0x83, 0x03, 0x0b, 0x56, 0xf1, + 0x9d, 0xdd, 0xac, 0x8c, 0x5d, 0xcd, 0x9a, 0x81, 0x85, 0xd5, 0x0a, 0x37, + 0x4d, 0x66, 0x03, 0x6b, 0xf7, 0x69, 0x1c, 0x58, 0x73, 0x4f, 0xb0, 0xf9, + 0x67, 0x17, 0x16, 0x1a, 0xe6, 0xef, 0x49, 0x35, 0xaa, 0x9d, 0x5c, 0x37, + 0x59, 0xa3, 0x9a, 0xac, 0x16, 0x5d, 0x19, 0xb7, 0x2f, 0x55, 0xd1, 0x4b, + 0x19, 0x9a, 0x8f, 0x5e, 0x30, 0x99, 0xa1, 0x69, 0x67, 0xaa, 0xd9, 0xf8, + 0xe2, 0xe2, 0x8a, 0x99, 0xe6, 0x33, 0xc2, 0x2c, 0x4e, 0xb8, 0x05, 0x33, + 0x60, 0x38, 0x73, 0x14, 0x37, 0x8c, 0xe3, 0xb6, 0xaa, 0xb8, 0xaa, 0x28, + 0xee, 0xe4, 0x24, 0x86, 0xdb, 0xa6, 0xe2, 0xea, 0xa3, 0xb8, 0xb7, 0x26, + 0x69, 0xca, 0xb6, 0x3a, 0x9a, 0xfe, 0xd4, 0x24, 0xee, 0x96, 0xd1, 0x14, + 0x5a, 0x94, 0xb4, 0x8c, 0x59, 0x0c, 0xde, 0x5e, 0x77, 0xee, 0xe6, 0x84, + 0x60, 0x31, 0x2e, 0x85, 0xb6, 0xe0, 0x76, 0x27, 0x06, 0xe7, 0x6f, 0x02, + 0x5d, 0x9b, 0xbc, 0x86, 0x39, 0xe1, 0xa1, 0x5d, 0xad, 0xbc, 0xde, 0x6f, + 0xb1, 0xc9, 0xa4, 0x6b, 0x27, 0x6b, 0x24, 0x5e, 0x95, 0x50, 0x17, 0x96, + 0xda, 0xb4, 0x34, 0xb2, 0x6b, 0x1b, 0xe5, 0xdf, 0xf1, 0xf4, 0x10, 0x2c, + 0xc3, 0x55, 0x54, 0xb6, 0xd0, 0x13, 0xdd, 0x3c, 0x87, 0x36, 0xd6, 0x44, + 0x34, 0x31, 0x41, 0x43, 0xbd, 0xbe, 0x44, 0x34, 0x14, 0xf3, 0x68, 0x9e, + 0xd8, 0x46, 0x56, 0x22, 0xf4, 0xc4, 0x56, 0x35, 0xb6, 0x45, 0x8d, 0xed, + 0xe4, 0xb1, 0xf2, 0xc8, 0xb3, 0x15, 0x73, 0x76, 0xa1, 0x1a, 0xa6, 0xdf, + 0x6a, 0xd4, 0x8e, 0x71, 0xa6, 0xa9, 0xa1, 0xbc, 0x9d, 0xcd, 0x6c, 0x8c, + 0x33, 0xbd, 0xe4, 0xba, 0x1c, 0xc9, 0x58, 0xb9, 0x84, 0xb5, 0xa0, 0xd0, + 0xdd, 0xce, 0x65, 0x4c, 0x21, 0x18, 0x07, 0xf8, 0x7f, 0x4b, 0x98, 0xf2, + 0xf7, 0x20, 0x5f, 0xe8, 0xde, 0x6e, 0xde, 0x8d, 0x91, 0x8c, 0x4c, 0x4c, + 0x46, 0x45, 0xff, 0x37, 0x73, 0x98, 0x8a, 0x70, 0xdd, 0x1d, 0xfe, 0x55, + 0x26, 0x9b, 0x8c, 0x60, 0x84, 0x9d, 0x48, 0x30, 0xc2, 0x90, 0x35, 0x75, + 0x09, 0xed, 0x07, 0x75, 0xed, 0x57, 0x0b, 0xc8, 0x9d, 0x9b, 0xe1, 0xcd, + 0xb4, 0x64, 0x78, 0xbe, 0x8a, 0xb9, 0xde, 0x95, 0x9d, 0xff, 0x4a, 0xdf, + 0xbc, 0x99, 0x65, 0xd0, 0x79, 0x82, 0x46, 0x52, 0x45, 0x28, 0x07, 0x4c, + 0x90, 0xb3, 0x51, 0x51, 0xca, 0x72, 0x0f, 0x83, 0x7a, 0x2a, 0xd8, 0xc8, + 0x05, 0x39, 0xfe, 0x34, 0xf4, 0xac, 0x1f, 0x9a, 0xc8, 0x54, 0xf6, 0x14, + 0xd0, 0x5e, 0x13, 0x9a, 0x7b, 0x28, 0x7c, 0x60, 0x22, 0x73, 0x1b, 0x60, + 0x95, 0x14, 0xc9, 0x58, 0x57, 0xc5, 0x5d, 0x88, 0xef, 0x26, 0xa2, 0x25, + 0x7c, 0xba, 0xb2, 0xe0, 0x98, 0xb7, 0x5b, 0x9b, 0xf9, 0x5d, 0x4d, 0xac, + 0x65, 0x4e, 0xf0, 0x96, 0xd9, 0xcf, 0x2a, 0x3f, 0x5f, 0x2d, 0x47, 0xe0, + 0x36, 0xb6, 0x6e, 0x31, 0x55, 0xa9, 0xcd, 0x00, 0x8b, 0x80, 0x19, 0x55, + 0xea, 0x4a, 0x22, 0xf4, 0x44, 0x3b, 0xeb, 0x00, 0x8c, 0xed, 0x16, 0xb1, + 0xd4, 0xdf, 0x2d, 0xd6, 0xdb, 0x41, 0xb4, 0x71, 0x5a, 0x3b, 0x78, 0xd5, + 0x95, 0x71, 0x9c, 0x7c, 0xf4, 0xed, 0x99, 0xe9, 0x7b, 0x67, 0x31, 0x2d, + 0x1e, 0x8a, 0xc6, 0xb1, 0x87, 0x42, 0x79, 0xaf, 0x35, 0x32, 0xe7, 0x79, + 0xc7, 0x62, 0x75, 0x74, 0x7d, 0x7d, 0xa5, 0x70, 0x52, 0x3e, 0x6d, 0xd4, + 0xf8, 0x24, 0xa0, 0x3d, 0x3f, 0x5d, 0xac, 0x71, 0xa0, 0xe7, 0x3b, 0xc4, + 0x02, 0x8a, 0xed, 0xff, 0x72, 0x26, 0xa8, 0xc0, 0x74, 0x07, 0xf3, 0xcb, + 0x3e, 0xac, 0x21, 0xde, 0x93, 0x44, 0xf1, 0x6b, 0x46, 0x51, 0xd6, 0xc3, + 0x05, 0xf0, 0xf6, 0x39, 0x63, 0x57, 0x73, 0xed, 0xa0, 0x5c, 0x61, 0xfd, + 0x2d, 0x73, 0x36, 0x73, 0xce, 0xdd, 0x5a, 0xce, 0xa7, 0xa3, 0x9c, 0xe5, + 0x2a, 0xe7, 0x9f, 0x64, 0xce, 0x2c, 0xce, 0xd9, 0xad, 0xe5, 0xbc, 0x2d, + 0xca, 0x99, 0xae, 0x72, 0xbe, 0x2e, 0x73, 0x7e, 0x39, 0x21, 0xba, 0x9e, + 0xc2, 0xd1, 0xec, 0xaf, 0xc3, 0x51, 0x19, 0x7e, 0x79, 0x3c, 0xd3, 0xcc, + 0xef, 0xd5, 0xf1, 0x31, 0x1a, 0xe8, 0x09, 0x3f, 0x31, 0x9e, 0x35, 0xe3, + 0x01, 0x5d, 0x6b, 0x3c, 0x3c, 0x81, 0x04, 0x17, 0xdd, 0x58, 0x27, 0x96, + 0xd4, 0x77, 0x8c, 0xd7, 0x34, 0xde, 0x1f, 0x74, 0xe4, 0xdf, 0x57, 0xc9, + 0x5b, 0x54, 0x72, 0x87, 0x96, 0xfc, 0x7b, 0x9c, 0xbc, 0x12, 0x17, 0x5d, + 0x8c, 0xa3, 0x4e, 0xe5, 0x58, 0xa1, 0x72, 0xcc, 0x50, 0x39, 0xc0, 0xe9, + 0xc6, 0x2d, 0x0a, 0xc0, 0xae, 0xa2, 0x82, 0xe2, 0x2a, 0xe8, 0xdd, 0xf0, + 0x50, 0x5e, 0xfa, 0xe6, 0x3a, 0xfe, 0x54, 0xe8, 0x64, 0x58, 0xe1, 0x09, + 0xeb, 0x29, 0xe1, 0x78, 0xf8, 0xd3, 0x2b, 0xd8, 0x52, 0xe0, 0xcf, 0x06, + 0xdc, 0xca, 0x1d, 0x09, 0x39, 0x4f, 0x75, 0x70, 0xb7, 0x3d, 0x92, 0x71, + 0x5b, 0xa5, 0xa2, 0x04, 0xf7, 0xb6, 0x7f, 0x68, 0xa8, 0xec, 0x3c, 0xc9, + 0x50, 0xa3, 0x1d, 0xaa, 0x47, 0x1f, 0xc9, 0x70, 0x01, 0xd6, 0xb8, 0x17, + 0x94, 0xda, 0xdf, 0x08, 0xba, 0xf5, 0x3d, 0xb6, 0xdf, 0x98, 0x67, 0xb1, + 0xa1, 0xaf, 0xf3, 0x1d, 0x95, 0xf9, 0x57, 0xe3, 0xc5, 0x4e, 0xc1, 0xf7, + 0x39, 0xfa, 0x01, 0xb6, 0x8b, 0x2c, 0x56, 0x3a, 0xb7, 0x8e, 0x17, 0x5b, + 0x04, 0x3d, 0x76, 0x72, 0xd2, 0x51, 0xed, 0x8c, 0x7b, 0x59, 0xb7, 0xa5, + 0x5e, 0x52, 0xc9, 0xd0, 0xea, 0x63, 0xcd, 0xdc, 0xc8, 0xe6, 0xb7, 0x8b, + 0xd3, 0xef, 0xd8, 0x17, 0x7e, 0xe8, 0x0a, 0xcd, 0xd3, 0xe1, 0xa2, 0x95, + 0x5c, 0x74, 0x17, 0x3e, 0x02, 0xc8, 0x78, 0xb3, 0x82, 0x0f, 0xcf, 0x89, + 0xe3, 0x15, 0xb1, 0xf9, 0x96, 0x01, 0xc8, 0x36, 0xbe, 0xe3, 0x14, 0xc9, + 0x78, 0x04, 0xf0, 0xa6, 0x87, 0x0d, 0x47, 0x87, 0x42, 0x1b, 0xfc, 0xa4, + 0x16, 0x47, 0xff, 0x49, 0xe8, 0xe3, 0xa3, 0xe3, 0x08, 0xfd, 0x00, 0xa2, + 0xd3, 0x1f, 0x7e, 0x16, 0x9f, 0xf4, 0xee, 0x95, 0x87, 0x94, 0x19, 0xfd, + 0xc9, 0x0a, 0xbd, 0x5f, 0x71, 0x73, 0x85, 0x70, 0x18, 0xfe, 0xc1, 0xda, + 0x26, 0x0f, 0xf7, 0xef, 0xc1, 0xa7, 0x58, 0x5c, 0xa1, 0xfa, 0x0d, 0x3f, + 0xbf, 0x42, 0x3c, 0x1d, 0x4c, 0xb2, 0x8b, 0xa7, 0x83, 0x6c, 0xff, 0xef, + 0x0a, 0xda, 0x63, 0x2c, 0xfa, 0x1d, 0x67, 0xfd, 0xb0, 0x81, 0x9e, 0xe9, + 0xe1, 0xba, 0xf0, 0x5d, 0x1b, 0x1b, 0x53, 0xe9, 0xb5, 0xf4, 0x0c, 0xe8, + 0x4d, 0x73, 0x57, 0xea, 0x38, 0x74, 0x62, 0xba, 0xea, 0xba, 0xf1, 0x39, + 0x31, 0x7b, 0xe6, 0xb3, 0x3c, 0x0d, 0xb8, 0xfd, 0x9c, 0x7b, 0x17, 0x30, + 0x3c, 0x9a, 0x14, 0x7d, 0x5c, 0x3c, 0xe1, 0x0a, 0x31, 0xa6, 0xef, 0xb3, + 0x89, 0x27, 0x70, 0x62, 0x31, 0xbd, 0x67, 0x21, 0x63, 0xb9, 0xdd, 0x46, + 0xdb, 0x9e, 0xcc, 0xed, 0x80, 0x71, 0x22, 0xe0, 0xc0, 0x76, 0x35, 0xed, + 0x26, 0x96, 0xd6, 0xf2, 0x00, 0x15, 0x22, 0x54, 0x34, 0x88, 0x67, 0xe7, + 0xb6, 0xa9, 0x39, 0xfd, 0x65, 0x1c, 0x0d, 0xd6, 0x50, 0xde, 0x6a, 0x46, + 0xed, 0xd8, 0x09, 0xce, 0x26, 0xd3, 0x02, 0x86, 0xff, 0xd9, 0x38, 0xd6, + 0x00, 0xa8, 0x44, 0xd7, 0x41, 0xd3, 0xfc, 0xc0, 0xca, 0x3c, 0xb4, 0x22, + 0xf6, 0xb0, 0xa1, 0x6c, 0x2b, 0x18, 0x99, 0xc9, 0x8c, 0xeb, 0x0b, 0xa6, + 0x00, 0x67, 0x50, 0x37, 0x3a, 0xbb, 0xfd, 0x33, 0x71, 0x3b, 0x0d, 0x86, + 0xdb, 0x56, 0x9a, 0xcb, 0x42, 0x9b, 0x40, 0xe8, 0x71, 0x31, 0xfe, 0xc7, + 0x45, 0x1f, 0xcf, 0xff, 0xfb, 0x1a, 0xf6, 0x94, 0x05, 0xf8, 0x03, 0x4f, + 0x42, 0x09, 0x8e, 0xb3, 0x6d, 0x18, 0x2a, 0x2f, 0x3e, 0x6f, 0xfd, 0x1b, + 0x7b, 0x1e, 0x91, 0x77, 0x72, 0x35, 0xb7, 0x01, 0xa1, 0xbc, 0x2f, 0x57, + 0x47, 0x1f, 0xdb, 0xe0, 0x23, 0x0c, 0x26, 0x13, 0xc7, 0xd5, 0x87, 0xd5, + 0x62, 0x5c, 0xbd, 0x6d, 0x64, 0x9d, 0x78, 0xcf, 0x35, 0x34, 0xbc, 0xb0, + 0x21, 0xee, 0x6d, 0xa0, 0x9e, 0x38, 0x90, 0xfb, 0x76, 0x67, 0xb7, 0x29, + 0xfd, 0x8e, 0xa7, 0xb1, 0x84, 0xaa, 0x72, 0x8a, 0xf6, 0xd9, 0xb4, 0x93, + 0x07, 0xdb, 0x79, 0xb0, 0x8d, 0x3f, 0x8e, 0x0f, 0x97, 0x47, 0x2d, 0xf8, + 0x88, 0xd2, 0x2d, 0x1f, 0xb2, 0xf5, 0x9c, 0x59, 0x6b, 0xc3, 0x37, 0x1a, + 0xb9, 0x4e, 0xb3, 0x27, 0xfe, 0xa4, 0x7b, 0xa0, 0xde, 0xc1, 0x17, 0xc0, + 0xbe, 0x5e, 0xcc, 0xca, 0xf1, 0x26, 0xdf, 0xd6, 0x84, 0x7b, 0x6e, 0x24, + 0xfc, 0xa0, 0x51, 0x63, 0xf2, 0x51, 0x3b, 0x8b, 0xee, 0x87, 0x2c, 0x94, + 0xc0, 0x85, 0x50, 0x8f, 0x33, 0xc9, 0x30, 0x89, 0xe6, 0x18, 0xd9, 0x38, + 0xbf, 0x18, 0x16, 0xff, 0xe1, 0x4f, 0x8c, 0xc2, 0x52, 0x9f, 0xb0, 0x0a, + 0xa3, 0x17, 0x76, 0x1a, 0x71, 0xf7, 0x98, 0x6d, 0xb5, 0xdd, 0xde, 0x40, + 0xeb, 0xdd, 0x47, 0x0d, 0x6c, 0x1e, 0x3b, 0x19, 0xbe, 0x70, 0x2c, 0xd2, + 0xbd, 0x02, 0x0a, 0x78, 0x88, 0x3d, 0xaf, 0x7a, 0x0f, 0x9f, 0x1a, 0x7d, + 0x7b, 0x39, 0x13, 0xf9, 0x32, 0x2c, 0x9e, 0xc3, 0x3f, 0x15, 0x22, 0x8b, + 0x7e, 0x23, 0x44, 0x9e, 0x09, 0x8f, 0x8c, 0x8a, 0x9c, 0x27, 0x89, 0x3c, + 0x13, 0x7e, 0xd4, 0x28, 0x44, 0xfe, 0x32, 0x2a, 0xf2, 0x01, 0x2e, 0x32, + 0x84, 0x22, 0x4b, 0x85, 0xc8, 0x09, 0x1f, 0x5c, 0x47, 0x22, 0x3f, 0x0a, + 0xef, 0xbd, 0x5c, 0x15, 0xf9, 0xa5, 0x55, 0x2f, 0xf2, 0xa3, 0x70, 0xa3, + 0x2a, 0xf2, 0x8f, 0x51, 0x91, 0x75, 0x5c, 0x64, 0x19, 0x8a, 0xfc, 0xec, + 0x72, 0xe1, 0xb8, 0x61, 0xa5, 0xd6, 0x47, 0x65, 0x6d, 0xb7, 0xca, 0x35, + 0xbe, 0x58, 0x95, 0xe5, 0x8f, 0xca, 0x1a, 0xc0, 0x65, 0xf5, 0x43, 0x59, + 0xbf, 0xd1, 0xc8, 0x3a, 0x13, 0x9e, 0x12, 0x95, 0x55, 0x6b, 0x95, 0xab, + 0xfa, 0xd2, 0xe5, 0x42, 0x56, 0x61, 0x54, 0xd6, 0x13, 0x97, 0x31, 0xb5, + 0x3f, 0x7e, 0xb5, 0xa2, 0x7c, 0x9e, 0x3e, 0x24, 0xf5, 0xae, 0x05, 0x8a, + 0xd2, 0x98, 0x9e, 0xa5, 0xac, 0x33, 0x41, 0x06, 0x8f, 0x66, 0x63, 0xfd, + 0x2f, 0x17, 0x03, 0x76, 0x23, 0xd6, 0x3f, 0x54, 0x94, 0xac, 0x13, 0x1c, + 0x6e, 0x53, 0xa5, 0x9e, 0x4c, 0x55, 0xa5, 0xde, 0x8b, 0x52, 0x3b, 0x8a, + 0xbe, 0xba, 0x5a, 0x74, 0x7e, 0x12, 0xe4, 0x18, 0x9e, 0xc1, 0x53, 0x5f, + 0xc1, 0xd4, 0xf4, 0xce, 0x7f, 0x1a, 0x58, 0x2d, 0x82, 0x17, 0x00, 0x66, + 0xf4, 0x65, 0x2c, 0xde, 0x80, 0x35, 0x7a, 0xed, 0x32, 0xd5, 0x46, 0xe6, + 0x9b, 0xbb, 0xf2, 0xac, 0x6c, 0x53, 0xe4, 0xbd, 0xf0, 0x74, 0x96, 0x9c, + 0x9a, 0xea, 0x60, 0xae, 0x99, 0x7f, 0x0c, 0xee, 0x43, 0xaf, 0x62, 0xc6, + 0x68, 0xfa, 0x20, 0x0c, 0x06, 0x95, 0x11, 0xe1, 0xd1, 0x31, 0x4c, 0x56, + 0x21, 0xca, 0xfa, 0x7e, 0x54, 0x56, 0x03, 0xe2, 0xfe, 0x70, 0x99, 0x30, + 0x7a, 0x7f, 0xb3, 0x30, 0xde, 0x06, 0xce, 0xfb, 0x08, 0x37, 0xc4, 0x61, + 0xe3, 0x20, 0x36, 0x2a, 0x77, 0x73, 0x64, 0x3d, 0x47, 0xfe, 0x9a, 0xdb, + 0xc7, 0x70, 0x32, 0x47, 0xde, 0xc7, 0x91, 0x8b, 0x38, 0xb2, 0x8b, 0x90, + 0x1f, 0x5d, 0xc8, 0xe7, 0xe3, 0x2c, 0xc8, 0x75, 0x28, 0x2f, 0xea, 0x46, + 0x3b, 0x4b, 0xda, 0x83, 0xad, 0x78, 0x66, 0x0c, 0x4b, 0xf2, 0xf0, 0xa4, + 0xbf, 0x62, 0xd2, 0x51, 0x9e, 0x64, 0xe7, 0x49, 0xbb, 0x30, 0xe9, 0xe0, + 0x18, 0xb5, 0xb8, 0x85, 0x90, 0x93, 0x89, 0xe7, 0x34, 0x96, 0xe7, 0x54, + 0x42, 0x65, 0xbc, 0xf1, 0x42, 0x56, 0x8c, 0xa9, 0x1c, 0x79, 0x2d, 0x47, + 0x66, 0x11, 0xd2, 0xc2, 0x8b, 0xd1, 0x81, 0xd2, 0x6e, 0x8b, 0x4a, 0xbb, + 0x11, 0x18, 0x5e, 0x58, 0xc1, 0x18, 0xd6, 0x73, 0x86, 0x54, 0x62, 0xc8, + 0xe2, 0xd2, 0x7e, 0xc1, 0x9f, 0x49, 0xec, 0xe0, 0xc8, 0x13, 0x36, 0x8e, + 0x1c, 0xca, 0x91, 0x1b, 0x38, 0xf2, 0x43, 0x8e, 0x7c, 0x9b, 0x90, 0x5f, + 0x5e, 0xc0, 0x90, 0x3b, 0x38, 0x32, 0x7b, 0x30, 0x43, 0x3e, 0xcb, 0x91, + 0x68, 0x42, 0xd8, 0x46, 0xef, 0xcb, 0x17, 0x70, 0x9f, 0x90, 0x59, 0x13, + 0xb4, 0x0c, 0xb8, 0x77, 0xfd, 0x2d, 0x28, 0xc1, 0x4c, 0x3c, 0x76, 0x1e, + 0x18, 0x0e, 0x65, 0x7d, 0x64, 0x2a, 0x94, 0xf5, 0xdd, 0x4b, 0x59, 0x63, + 0x5c, 0x0e, 0xa9, 0xb7, 0xa5, 0x96, 0x37, 0x30, 0x2d, 0x9e, 0x07, 0x73, + 0xcb, 0x8e, 0xa9, 0x2c, 0x9d, 0x3d, 0x7f, 0xec, 0x4a, 0x2d, 0x65, 0xe6, + 0x31, 0x75, 0x28, 0x87, 0x7e, 0xc7, 0x71, 0x17, 0x70, 0xc8, 0xc4, 0x71, + 0xa9, 0x00, 0x3d, 0x9b, 0xda, 0x0f, 0xee, 0x06, 0x50, 0x9e, 0xf7, 0x50, + 0x57, 0x93, 0xf8, 0x31, 0x2a, 0xb6, 0x05, 0xbd, 0xea, 0xc8, 0x14, 0x3a, + 0x45, 0x86, 0xcf, 0x09, 0x98, 0xc9, 0xcf, 0x4b, 0x5a, 0x09, 0xa6, 0x2d, + 0x32, 0x61, 0x46, 0x99, 0x40, 0xe4, 0xd5, 0xaf, 0x62, 0x29, 0x63, 0xcb, + 0x62, 0x1d, 0xd8, 0x66, 0x73, 0xb0, 0x6e, 0x8b, 0x39, 0x18, 0xd8, 0x5a, + 0x1a, 0x6a, 0x1a, 0x52, 0xd6, 0x79, 0x38, 0x7d, 0xf3, 0x02, 0x5c, 0x0c, + 0x07, 0x37, 0x3d, 0x50, 0xd1, 0xe5, 0x31, 0xa2, 0x9d, 0x2e, 0xdb, 0x5f, + 0x16, 0xfc, 0xb8, 0x22, 0x78, 0x94, 0xc5, 0x77, 0x76, 0xcc, 0x19, 0x1d, + 0x30, 0x57, 0x74, 0xf9, 0xd2, 0x70, 0x93, 0xa4, 0x2b, 0x2f, 0x1d, 0x2b, + 0x6b, 0xbb, 0x14, 0x8f, 0x0e, 0xf8, 0x27, 0xf0, 0xa4, 0x64, 0x4c, 0xaa, + 0x62, 0x49, 0x81, 0xcb, 0xcc, 0xa1, 0x92, 0x51, 0xe6, 0xe4, 0xb2, 0x9d, + 0xe6, 0x29, 0x25, 0x99, 0x28, 0xea, 0x28, 0x2c, 0x58, 0xcb, 0x1e, 0x00, + 0x68, 0x14, 0x0a, 0x0b, 0x95, 0xa4, 0x98, 0x0d, 0x7b, 0x4d, 0x91, 0x97, + 0x03, 0x0f, 0xb0, 0x7d, 0x68, 0x7c, 0x96, 0xbd, 0xcf, 0x80, 0xd3, 0x03, + 0x94, 0xc4, 0xbf, 0x08, 0x1d, 0xcc, 0xd2, 0xe0, 0xa1, 0x8a, 0xe0, 0x91, + 0xdc, 0x57, 0xa1, 0x98, 0x3d, 0xec, 0xbe, 0x3b, 0x34, 0xb4, 0xe3, 0x9b, + 0x0b, 0xfc, 0x97, 0x74, 0x7c, 0x93, 0x14, 0x30, 0x86, 0x96, 0xa4, 0x85, + 0xd6, 0x0e, 0x31, 0x1b, 0xce, 0x40, 0x0d, 0x7a, 0xcc, 0x86, 0x6f, 0x00, + 0xdf, 0x7d, 0x74, 0x60, 0x68, 0x49, 0x3e, 0x8f, 0xef, 0x0e, 0x2d, 0x81, + 0x0c, 0x5e, 0x89, 0xf4, 0x04, 0x9e, 0x3f, 0x3a, 0x04, 0xe7, 0x4e, 0x56, + 0x87, 0x1e, 0x76, 0xef, 0x66, 0x1b, 0x9e, 0xe9, 0x77, 0x62, 0xd8, 0x03, + 0xe1, 0x1e, 0x76, 0x7c, 0x20, 0xfd, 0xce, 0xa7, 0x58, 0x23, 0x98, 0xa0, + 0x14, 0xc6, 0x3d, 0xc6, 0xe7, 0xd3, 0x37, 0xcf, 0x66, 0xe5, 0x29, 0x0d, + 0x3a, 0xee, 0x07, 0xa6, 0x76, 0x98, 0xa3, 0xb7, 0x99, 0x3a, 0x36, 0x29, + 0xa3, 0xd3, 0x3b, 0x15, 0xb6, 0x15, 0x58, 0xb9, 0xcd, 0xdc, 0xb5, 0xc4, + 0x1c, 0x32, 0x15, 0x9b, 0xbb, 0x52, 0xda, 0xcd, 0x7b, 0x0e, 0xa5, 0x98, + 0xbb, 0x4a, 0x0d, 0x66, 0x5c, 0xb2, 0xe3, 0x3e, 0x4c, 0xc1, 0x53, 0xe9, + 0x1d, 0x07, 0x59, 0x77, 0xd5, 0xed, 0x6f, 0xdf, 0x58, 0xdc, 0x3f, 0xbd, + 0x73, 0x17, 0x5b, 0xe0, 0xe1, 0xa3, 0x8d, 0xd5, 0x99, 0xe5, 0x7b, 0x8e, + 0x25, 0xa7, 0x6f, 0xbe, 0x8f, 0x52, 0xcc, 0x21, 0xb3, 0xd1, 0x9c, 0x5c, + 0xb9, 0xd3, 0x1c, 0xec, 0x6a, 0x05, 0xde, 0x50, 0x71, 0x29, 0x1e, 0x09, + 0x61, 0xab, 0xfe, 0xb2, 0x07, 0x4c, 0x5d, 0x29, 0xfd, 0x20, 0xb3, 0xdd, + 0xa1, 0x94, 0x5b, 0x1e, 0x05, 0xfa, 0x76, 0x73, 0x41, 0x8f, 0x7f, 0x35, + 0xbe, 0x1e, 0x59, 0xec, 0x5f, 0x06, 0x05, 0xdf, 0xa2, 0xf8, 0xab, 0x59, + 0xe6, 0xa1, 0xca, 0xee, 0xd0, 0xa5, 0x06, 0x73, 0xf2, 0xaa, 0x1e, 0xd3, + 0x13, 0x68, 0xce, 0xca, 0x72, 0x23, 0xe5, 0x7b, 0x3e, 0x86, 0xf4, 0xb2, + 0xad, 0xb0, 0xc6, 0xca, 0xc7, 0x59, 0x77, 0xd7, 0xc5, 0xac, 0xb7, 0x06, + 0x97, 0xe1, 0x54, 0xfa, 0x4c, 0xc5, 0x9c, 0x4d, 0x5b, 0xbc, 0xef, 0x1c, + 0x1d, 0xc1, 0x29, 0x4a, 0xf3, 0xc1, 0xd5, 0x61, 0xd9, 0x5f, 0x13, 0x4c, + 0xf9, 0xac, 0xac, 0x6b, 0x9d, 0xa1, 0xb2, 0xe0, 0xa3, 0xf4, 0x5b, 0x37, + 0xb2, 0x2d, 0xa7, 0xba, 0xfd, 0xe6, 0x8e, 0xa7, 0xaa, 0xcc, 0x73, 0xee, + 0x6c, 0x63, 0x9b, 0x52, 0xb8, 0xd1, 0x04, 0x2e, 0xc0, 0x36, 0x53, 0xa8, + 0x2c, 0xa5, 0xdc, 0x00, 0xce, 0x54, 0x59, 0x7b, 0xa4, 0xbb, 0x34, 0xe4, + 0xb8, 0xbf, 0xb4, 0xe0, 0x50, 0x7a, 0xe7, 0xcb, 0xb8, 0xf6, 0xec, 0x78, + 0xba, 0x59, 0x33, 0xf9, 0x92, 0x32, 0x7e, 0xb8, 0x9c, 0x29, 0xe3, 0x1d, + 0xf3, 0x35, 0x07, 0xfc, 0xaa, 0xca, 0x83, 0x2f, 0x97, 0x07, 0xdf, 0xc0, + 0xa1, 0x14, 0xca, 0x1b, 0xb8, 0x1c, 0x5d, 0x4c, 0xff, 0x7c, 0x3c, 0xe1, + 0x78, 0x2a, 0x80, 0x86, 0xf1, 0xc4, 0x32, 0x9a, 0xa9, 0x3e, 0xe7, 0xcf, + 0x5d, 0xd8, 0xde, 0xec, 0x84, 0xea, 0xf9, 0x4c, 0xdd, 0x7f, 0xb6, 0x9c, + 0x90, 0xdf, 0x54, 0x04, 0x3f, 0xd3, 0xe2, 0xa7, 0xcf, 0x57, 0x07, 0xc0, + 0x2f, 0x97, 0xb2, 0x3c, 0x8d, 0xd1, 0x94, 0x55, 0xbc, 0x14, 0x83, 0xa3, + 0x29, 0x2b, 0x78, 0xca, 0x77, 0x74, 0xf0, 0x10, 0xfd, 0xf4, 0xc1, 0x90, + 0x5c, 0xc1, 0x93, 0xff, 0x69, 0x62, 0x99, 0x2d, 0x60, 0x99, 0x3d, 0x0f, + 0x09, 0x07, 0x88, 0xee, 0xb6, 0xd4, 0x42, 0xf6, 0x80, 0x38, 0xbd, 0x73, + 0x29, 0x9b, 0x00, 0x52, 0x9b, 0x26, 0x71, 0x3b, 0xc8, 0xec, 0x48, 0x6a, + 0xad, 0x81, 0x41, 0xd7, 0x5d, 0xa7, 0xc5, 0xd5, 0x73, 0xe8, 0xc7, 0x1c, + 0x57, 0xcd, 0xa1, 0x15, 0x1c, 0x57, 0xc1, 0xa1, 0x5f, 0xb1, 0x51, 0x98, + 0xba, 0x80, 0x43, 0x15, 0x1c, 0x57, 0xcc, 0xa1, 0x4b, 0x53, 0x18, 0x54, + 0xc8, 0xa1, 0x22, 0x8e, 0x9b, 0xc9, 0xa1, 0x61, 0x1c, 0x97, 0xc5, 0xa1, + 0x19, 0x1c, 0x97, 0xc9, 0x21, 0x85, 0xe3, 0xc6, 0x71, 0x68, 0x02, 0xc7, + 0x5d, 0xca, 0xa1, 0x93, 0xc9, 0x0c, 0x1a, 0xc9, 0xa1, 0x4b, 0x38, 0x6e, + 0x08, 0x87, 0x8e, 0x71, 0xdc, 0x40, 0x0e, 0x5d, 0xc4, 0x71, 0x29, 0x1c, + 0xfa, 0x96, 0xe3, 0xce, 0xb0, 0xa9, 0x2b, 0x75, 0x14, 0xc7, 0x9d, 0xe2, + 0xd0, 0x67, 0x1c, 0xf7, 0x39, 0x87, 0x2e, 0xe7, 0xb8, 0x63, 0xab, 0xb4, + 0x65, 0xf9, 0x88, 0x43, 0x13, 0x39, 0xee, 0xd0, 0x2a, 0x6d, 0x59, 0xde, + 0x5a, 0x85, 0xa6, 0xef, 0xed, 0x55, 0xdc, 0xf4, 0x8d, 0x80, 0xf0, 0x31, + 0x7c, 0xf9, 0x66, 0xd5, 0x91, 0xfc, 0x6f, 0x23, 0x11, 0x8d, 0x57, 0x06, + 0x8a, 0x53, 0x1e, 0xfc, 0xb2, 0x3c, 0x18, 0xc9, 0x7d, 0x1b, 0x4f, 0x09, + 0x4c, 0xaf, 0x04, 0xdb, 0x31, 0x0d, 0x37, 0x18, 0x7e, 0x74, 0x11, 0xca, + 0xd9, 0x87, 0x3e, 0xcc, 0xd3, 0x23, 0xd5, 0xb9, 0x63, 0x08, 0x7b, 0xa4, + 0xf0, 0x2e, 0x28, 0x53, 0x78, 0x23, 0x10, 0x1c, 0x4d, 0xca, 0x7d, 0xdb, + 0x1c, 0x3c, 0xa8, 0x33, 0xea, 0xd1, 0x07, 0x93, 0x4c, 0xf6, 0x57, 0xe5, + 0xc1, 0xef, 0x50, 0xa8, 0x03, 0xc5, 0xaf, 0xc6, 0x1d, 0xde, 0x3c, 0x26, + 0x19, 0x17, 0x50, 0xe1, 0x1d, 0x23, 0xd9, 0xae, 0xc3, 0xd1, 0x4b, 0x98, + 0x0e, 0x1e, 0x0f, 0x2f, 0x1f, 0xc9, 0xf4, 0xd6, 0x3f, 0x0c, 0xe7, 0x94, + 0x65, 0x6a, 0xb6, 0x81, 0x43, 0xb9, 0x6f, 0x23, 0x79, 0xc7, 0x48, 0xbe, + 0x18, 0xdb, 0x7d, 0x8a, 0x9d, 0x1c, 0x03, 0xf4, 0x15, 0x25, 0x46, 0x73, + 0xa8, 0x38, 0xad, 0x3d, 0x5f, 0x69, 0x1b, 0xbe, 0x38, 0x38, 0x73, 0xae, + 0xfe, 0xd1, 0xe2, 0xde, 0xd2, 0x50, 0x73, 0x0a, 0x8a, 0x4a, 0x1b, 0xc9, + 0x1d, 0x85, 0x77, 0x6e, 0x1b, 0xb5, 0xf9, 0x6d, 0xff, 0x1b, 0xa6, 0x8e, + 0x67, 0xfa, 0x9b, 0x3a, 0xfe, 0x79, 0x0a, 0xcf, 0x68, 0x4c, 0x3a, 0x62, + 0xde, 0x73, 0x24, 0x19, 0xad, 0xe3, 0x9b, 0xe9, 0x0f, 0x7f, 0x61, 0x86, + 0x51, 0xb2, 0xe7, 0x13, 0xb0, 0x7b, 0xdf, 0x74, 0x7c, 0x94, 0xee, 0x1f, + 0xfe, 0xd5, 0xbb, 0xe6, 0x82, 0x57, 0xfc, 0x17, 0x99, 0x0b, 0x9e, 0xbf, + 0xf9, 0x57, 0xe6, 0xc8, 0x53, 0x91, 0x67, 0x03, 0x9f, 0x9a, 0x23, 0xdd, + 0x28, 0x24, 0xf0, 0xf2, 0xd1, 0x1f, 0x2d, 0x0c, 0x5d, 0x3a, 0x17, 0xcf, + 0x11, 0xdf, 0x06, 0xba, 0xed, 0x5d, 0xca, 0x9e, 0x57, 0x7c, 0x7b, 0x15, + 0x2d, 0x9f, 0x5e, 0x67, 0xa5, 0x09, 0xe5, 0x35, 0x2c, 0xa5, 0x01, 0x16, + 0xd6, 0x17, 0x4d, 0x7e, 0x3a, 0xd2, 0x71, 0x2c, 0xb3, 0x3c, 0x78, 0x12, + 0xfa, 0x01, 0x9b, 0xa9, 0x05, 0x2b, 0x3b, 0x98, 0xaa, 0x0f, 0xc5, 0x2f, + 0xca, 0x60, 0xcb, 0xb0, 0x4a, 0xc3, 0x97, 0x7f, 0x15, 0x7e, 0xe5, 0x85, + 0x19, 0xea, 0x82, 0x65, 0x1e, 0x5f, 0x94, 0x54, 0x04, 0x3f, 0x08, 0xfb, + 0x33, 0x14, 0xf6, 0xa0, 0x28, 0xbb, 0xfc, 0x71, 0xb5, 0x89, 0x42, 0x25, + 0xc6, 0x8a, 0xb1, 0x87, 0x44, 0x2b, 0x4d, 0x44, 0x79, 0x91, 0x11, 0xd1, + 0x96, 0x3d, 0x9a, 0x0c, 0x56, 0x92, 0x3f, 0xe3, 0xd7, 0x3c, 0xbc, 0x61, + 0xbd, 0xf3, 0x83, 0x0c, 0xde, 0x6a, 0xef, 0xe3, 0xa3, 0xc0, 0x23, 0xbf, + 0x63, 0xa6, 0x76, 0xd3, 0xfe, 0xf0, 0x5f, 0x46, 0x28, 0x7c, 0x43, 0x6c, + 0x27, 0xa4, 0x60, 0x5b, 0xa4, 0x6f, 0xfe, 0x2d, 0xc3, 0x55, 0x82, 0x19, + 0x2e, 0x37, 0x9a, 0x1f, 0x53, 0xb3, 0x1e, 0xfb, 0x0a, 0x24, 0xa4, 0x95, + 0x86, 0x36, 0xa4, 0x98, 0x3a, 0xf6, 0x41, 0x8b, 0x7f, 0x7c, 0xaa, 0x22, + 0x79, 0x53, 0x0f, 0xb4, 0x60, 0x69, 0xfa, 0xc3, 0x1f, 0x56, 0x06, 0x3f, + 0x2a, 0xdf, 0x73, 0x1c, 0x30, 0x87, 0xd3, 0x17, 0x77, 0x4d, 0xfd, 0xca, + 0x3f, 0x9f, 0xaf, 0xcf, 0xc6, 0x64, 0x5e, 0x0b, 0xab, 0xa0, 0xae, 0xd2, + 0xf1, 0x11, 0x9c, 0x67, 0x4c, 0x5f, 0xbd, 0x53, 0x1e, 0xda, 0x04, 0xd9, + 0x45, 0xfc, 0x03, 0xd8, 0xde, 0xd6, 0x3d, 0x78, 0x1e, 0xb0, 0xe3, 0x99, + 0x34, 0x53, 0xe4, 0xe9, 0x00, 0x18, 0x9e, 0xb2, 0xee, 0x0a, 0xc3, 0x89, + 0xca, 0x2e, 0xd7, 0x3e, 0x30, 0xbd, 0x65, 0xbb, 0xb1, 0x30, 0x95, 0xc1, + 0x4f, 0x03, 0xf7, 0x1e, 0x1d, 0xc5, 0xcf, 0xd7, 0x15, 0x6b, 0xaa, 0x9e, + 0xbe, 0xe5, 0x2a, 0x66, 0x89, 0xa1, 0x06, 0x91, 0xe1, 0xac, 0x06, 0xd1, + 0x46, 0x0a, 0xec, 0xc7, 0x27, 0x94, 0x47, 0xfe, 0x7d, 0x86, 0x8f, 0x0d, + 0xe8, 0xb7, 0x5f, 0xd7, 0x31, 0xcb, 0x35, 0xa5, 0x48, 0x1c, 0x33, 0x5f, + 0x3f, 0x5c, 0x35, 0x76, 0x3f, 0xe4, 0xb8, 0xf4, 0x22, 0x35, 0x65, 0x33, + 0x4f, 0x39, 0x3d, 0x97, 0xa7, 0xe0, 0x89, 0xdd, 0xbc, 0xd5, 0xec, 0xd9, + 0xc1, 0x98, 0x23, 0x73, 0xf9, 0x79, 0x17, 0x0e, 0xe3, 0x0e, 0xdd, 0x41, + 0xee, 0x7c, 0x70, 0x0d, 0x00, 0xc4, 0xd5, 0x9c, 0xb9, 0x5b, 0xcb, 0x7c, + 0x05, 0x67, 0xde, 0x21, 0x98, 0xaf, 0x48, 0xc4, 0xfc, 0x4d, 0x2d, 0x63, + 0xee, 0x98, 0xab, 0x5f, 0x6b, 0x05, 0xbf, 0x40, 0x55, 0x0a, 0xcd, 0x2e, + 0x2f, 0x78, 0xd7, 0x9f, 0x85, 0xfb, 0x69, 0xb5, 0x6c, 0x3f, 0x6d, 0x25, + 0x3b, 0x79, 0xf8, 0x1e, 0x7b, 0x1e, 0x7d, 0x39, 0xee, 0x57, 0xd5, 0xd2, + 0x9e, 0xc6, 0x21, 0x31, 0x84, 0x23, 0x87, 0x74, 0x83, 0xf9, 0xb6, 0xd4, + 0x47, 0x97, 0x73, 0x03, 0xbd, 0x8f, 0x1b, 0xe8, 0x4a, 0xb6, 0xc5, 0x93, + 0xfa, 0xc5, 0x32, 0x06, 0x79, 0x98, 0x97, 0x9f, 0xfa, 0x2f, 0x0e, 0x95, + 0x71, 0xdc, 0xc7, 0x1c, 0xfa, 0x43, 0x1a, 0x83, 0xde, 0x67, 0x1b, 0xce, + 0xa9, 0xbf, 0x66, 0x47, 0x00, 0x53, 0x7d, 0xcb, 0xb9, 0x69, 0xe5, 0x94, + 0x7f, 0xe3, 0x94, 0xe3, 0x06, 0x30, 0x68, 0x1f, 0xa7, 0x3c, 0xc8, 0x29, + 0x97, 0x70, 0xca, 0xb1, 0x9c, 0xf2, 0xcf, 0x9c, 0xb2, 0x82, 0x53, 0xfe, + 0x81, 0x53, 0xf2, 0xf3, 0x87, 0xa9, 0xd9, 0x9c, 0xb2, 0x1f, 0xa7, 0xbc, + 0x9b, 0x53, 0xae, 0xe7, 0x94, 0x3f, 0xe1, 0x94, 0xa5, 0x9c, 0x72, 0x10, + 0xa7, 0xfc, 0x94, 0x6d, 0xbc, 0xa4, 0xde, 0xcc, 0x29, 0x7f, 0xcd, 0x29, + 0x37, 0x70, 0xca, 0xc9, 0x9c, 0xf2, 0x28, 0xc7, 0xbd, 0xc3, 0x29, 0x1d, + 0x1c, 0xfa, 0x1b, 0xa7, 0xb4, 0x70, 0xca, 0x34, 0x4e, 0xf9, 0x1c, 0xc7, + 0x3d, 0xcd, 0x29, 0x17, 0x72, 0xe8, 0x14, 0xa7, 0x2c, 0xe3, 0x94, 0x2f, + 0xb1, 0xc7, 0x56, 0xa9, 0xff, 0xc1, 0x71, 0x3b, 0x38, 0x65, 0x2e, 0x87, + 0xae, 0x1c, 0xc8, 0xa0, 0x29, 0x9c, 0xd2, 0xc5, 0x29, 0x3b, 0x39, 0xee, + 0xc7, 0x9c, 0xf2, 0x22, 0x0e, 0x0d, 0xe5, 0x94, 0x43, 0x39, 0xe5, 0x63, + 0x9c, 0xd2, 0xc6, 0x71, 0x1b, 0x38, 0xe5, 0xe9, 0x7a, 0x06, 0x45, 0x78, + 0xee, 0x5f, 0xb1, 0x2d, 0xfa, 0xd4, 0x7c, 0x4e, 0x69, 0x5a, 0x86, 0x13, + 0xc2, 0x27, 0xf5, 0x7c, 0x42, 0x98, 0x01, 0xe1, 0x63, 0x17, 0xb0, 0x09, + 0x61, 0xe2, 0xbf, 0xb9, 0xd2, 0xa3, 0x33, 0x8e, 0xaa, 0xb6, 0x73, 0x29, + 0xae, 0x9d, 0x87, 0x82, 0x71, 0x1f, 0x64, 0x2e, 0x38, 0xe8, 0x1f, 0x8a, + 0x9b, 0x19, 0x2f, 0x0d, 0x61, 0x03, 0x26, 0x70, 0x3c, 0xb7, 0xfb, 0x68, + 0xd2, 0x4e, 0x43, 0xfa, 0xc3, 0xdd, 0x5c, 0x0d, 0xc5, 0x1e, 0x40, 0x79, + 0xf0, 0x25, 0x60, 0x0e, 0xff, 0x88, 0x93, 0xf9, 0x07, 0xf1, 0x9d, 0xe8, + 0xf0, 0x67, 0x43, 0xd8, 0x21, 0x21, 0x98, 0x58, 0xd3, 0xd1, 0x5a, 0xf5, + 0x53, 0xb7, 0xac, 0x22, 0x19, 0xd5, 0xcc, 0x2e, 0xee, 0x5b, 0x75, 0xe4, + 0xf4, 0x60, 0xae, 0xb9, 0x91, 0x8c, 0xab, 0x45, 0xd2, 0x27, 0x83, 0xf5, + 0xde, 0xcd, 0x9b, 0x91, 0x8c, 0x19, 0xf8, 0x98, 0x25, 0xf8, 0x6c, 0x19, + 0x98, 0xbb, 0x11, 0xa5, 0xa0, 0xdc, 0xa1, 0x79, 0xe1, 0xa7, 0x07, 0xa3, + 0x25, 0x80, 0x81, 0x1f, 0x79, 0x21, 0xf0, 0x69, 0x29, 0x33, 0x60, 0xe4, + 0xbd, 0xec, 0xd5, 0xcd, 0x6f, 0x6f, 0x32, 0xbb, 0xfa, 0x1d, 0x1a, 0xb4, + 0x3d, 0x83, 0x69, 0xe6, 0x01, 0x97, 0xfc, 0x24, 0x3b, 0x3f, 0xf6, 0x2d, + 0x7b, 0x94, 0xf9, 0x6c, 0x45, 0xc1, 0xb7, 0x7e, 0x3c, 0x2e, 0xfe, 0x10, + 0x7b, 0x3e, 0xf0, 0x1e, 0xe4, 0x57, 0x80, 0x03, 0xe3, 0x44, 0xec, 0xc4, + 0x26, 0x49, 0xf4, 0xc4, 0x48, 0x7c, 0x50, 0x2f, 0xb1, 0x41, 0x48, 0x7c, + 0x3f, 0xbf, 0x6f, 0x12, 0xc7, 0xc4, 0x48, 0x6c, 0xd2, 0x4b, 0x1c, 0x22, + 0x24, 0xfe, 0xa8, 0x37, 0x89, 0x34, 0xf3, 0xe2, 0x6a, 0xf4, 0x85, 0x41, + 0x51, 0x89, 0x67, 0x98, 0xc4, 0x31, 0xd7, 0x2a, 0xec, 0x05, 0x18, 0x3c, + 0x8b, 0xb0, 0x87, 0xef, 0xec, 0xab, 0xe3, 0x7f, 0x42, 0x7e, 0xbe, 0xb4, + 0x4a, 0xd3, 0x4e, 0xe8, 0x2f, 0xb1, 0xb2, 0x82, 0xbf, 0x70, 0x1a, 0x25, + 0xaf, 0x15, 0x92, 0xe9, 0x3c, 0x24, 0x3b, 0x08, 0xd4, 0x53, 0xc7, 0x85, + 0x5f, 0x86, 0xe7, 0x09, 0xb8, 0x70, 0x69, 0xea, 0x9b, 0xf0, 0x3a, 0x1e, + 0xee, 0xd3, 0xcf, 0xd4, 0xf2, 0x6c, 0x08, 0xde, 0xf6, 0x6b, 0xbc, 0x51, + 0x60, 0x6d, 0x56, 0xc4, 0xac, 0x61, 0xde, 0x1b, 0x95, 0x6c, 0xcb, 0xeb, + 0xa7, 0xb3, 0xe9, 0xe0, 0x73, 0x5e, 0x06, 0x7f, 0xd0, 0xc1, 0xf6, 0xf0, + 0xca, 0x7a, 0x20, 0x61, 0x25, 0x4b, 0x58, 0xb5, 0x5d, 0xdd, 0x11, 0xab, + 0x61, 0x09, 0xb0, 0x68, 0x62, 0x54, 0xda, 0x07, 0x2d, 0x15, 0x41, 0x47, + 0x37, 0xcc, 0x6b, 0x30, 0xe3, 0xa4, 0x3e, 0xc9, 0x36, 0x48, 0xcb, 0x76, + 0x56, 0x80, 0x3f, 0xcc, 0x1e, 0x63, 0xa4, 0xee, 0x60, 0x8f, 0x14, 0xd8, + 0x19, 0xaa, 0xa1, 0x55, 0x6c, 0x4f, 0x2d, 0xdc, 0x79, 0x21, 0x9f, 0x33, + 0x43, 0x9b, 0xb6, 0x9b, 0x43, 0x81, 0x9d, 0x6c, 0x87, 0xf8, 0x4d, 0x7e, + 0x62, 0x0d, 0xba, 0xe9, 0x29, 0xa8, 0x3a, 0xee, 0xb0, 0x15, 0x1c, 0xf5, + 0x0f, 0x64, 0xcf, 0xe0, 0x02, 0xfc, 0x50, 0x36, 0xac, 0x04, 0xd9, 0xd9, + 0x21, 0x7a, 0xb4, 0xf2, 0x30, 0x4c, 0x33, 0xbb, 0x2b, 0x42, 0x90, 0x33, + 0x4c, 0x43, 0x47, 0xfb, 0x43, 0x65, 0xe6, 0x2f, 0x66, 0x67, 0x96, 0x51, + 0x08, 0x3f, 0xd9, 0x03, 0xfd, 0x5a, 0x4b, 0x2e, 0xc3, 0x19, 0x68, 0xa3, + 0x7c, 0x6d, 0xbb, 0xdd, 0x3b, 0x2b, 0xf6, 0x61, 0xf2, 0x16, 0xb6, 0x42, + 0x02, 0xd7, 0x3f, 0x75, 0x22, 0x1e, 0x17, 0xa4, 0x7d, 0xdf, 0x47, 0xc5, + 0xcc, 0x56, 0x11, 0xba, 0xc2, 0x1c, 0xaa, 0x31, 0x96, 0x07, 0x5f, 0x2f, + 0x1f, 0xfb, 0x37, 0x5c, 0x7c, 0x29, 0x1b, 0x52, 0x2a, 0x43, 0x2d, 0x69, + 0x95, 0x21, 0xff, 0x78, 0x23, 0x4e, 0xfb, 0x63, 0x7b, 0x3a, 0xf2, 0x21, + 0x0d, 0x27, 0x49, 0x73, 0xe8, 0x86, 0x34, 0x98, 0x69, 0x03, 0x17, 0x98, + 0x4e, 0x96, 0x29, 0x49, 0xe9, 0x9b, 0x15, 0xe6, 0x46, 0xdf, 0xd9, 0xcc, + 0x0e, 0x4a, 0x74, 0xd6, 0xb3, 0xd9, 0x13, 0xfc, 0x2d, 0x5c, 0xfe, 0x85, + 0xd8, 0x1a, 0x14, 0x1a, 0xaf, 0x64, 0x08, 0x3b, 0x0b, 0x1f, 0x4a, 0x36, + 0x87, 0x16, 0xa6, 0x99, 0x83, 0x95, 0xd0, 0xd2, 0x65, 0xdb, 0xcb, 0x43, + 0xa5, 0xe3, 0x91, 0x6e, 0x2b, 0x46, 0x90, 0x70, 0x0b, 0x46, 0x90, 0xb2, + 0xbd, 0x3c, 0x94, 0x32, 0xbe, 0x3c, 0x54, 0x31, 0x1e, 0x68, 0xbb, 0xda, + 0xb8, 0xe0, 0x56, 0xfe, 0x4c, 0xbe, 0x6d, 0x11, 0x3b, 0xff, 0x99, 0xc7, + 0x5c, 0xbc, 0x27, 0x33, 0xf9, 0x3a, 0x3d, 0x7c, 0x19, 0x34, 0x3b, 0x03, + 0xd0, 0x73, 0xc4, 0x2d, 0x88, 0xf2, 0x50, 0x60, 0x14, 0x3f, 0xd7, 0x52, + 0x11, 0x7c, 0x3f, 0xfc, 0xc2, 0x85, 0xe4, 0x8b, 0x7c, 0xcb, 0x48, 0xfe, + 0xb0, 0x1a, 0x65, 0x3d, 0x8a, 0x3f, 0xb3, 0xa0, 0xb4, 0x47, 0x22, 0xec, + 0x75, 0x8b, 0x27, 0xb0, 0xfc, 0xe5, 0x63, 0x5f, 0x2e, 0x1f, 0xfb, 0x12, + 0xf6, 0xe3, 0x23, 0xc0, 0x51, 0x31, 0xe0, 0x06, 0x23, 0xf8, 0x09, 0x95, + 0x03, 0xa0, 0x0d, 0x70, 0x7b, 0xfb, 0x49, 0xd1, 0x5a, 0xe5, 0x57, 0xac, + 0x37, 0x76, 0x5c, 0xc5, 0x9a, 0x63, 0x5d, 0x5a, 0x45, 0x88, 0x89, 0x2b, + 0x0f, 0x95, 0xe5, 0xb0, 0x2c, 0x8a, 0x60, 0x06, 0x2c, 0x0d, 0x2d, 0x4a, + 0x29, 0x83, 0x35, 0x5b, 0x69, 0xa8, 0x3e, 0xa5, 0x12, 0x4f, 0x51, 0x1d, + 0x66, 0xe5, 0xdc, 0x85, 0x79, 0x84, 0xf2, 0x4d, 0x4f, 0xa2, 0x7b, 0x96, + 0xfb, 0xb6, 0xe9, 0xb1, 0x34, 0x56, 0x9c, 0x77, 0x83, 0x6f, 0x9b, 0x3b, + 0x6e, 0x1c, 0x95, 0xa6, 0xf8, 0x47, 0x87, 0x2a, 0x46, 0x19, 0xd9, 0x46, + 0xd9, 0x6b, 0x1f, 0x74, 0x7c, 0x1d, 0x31, 0xa5, 0x97, 0xbe, 0x6a, 0x2a, + 0x78, 0xa3, 0x34, 0x7d, 0xfe, 0xe7, 0x86, 0x6f, 0xcd, 0x91, 0x97, 0x02, + 0x6f, 0x98, 0x22, 0xcf, 0x95, 0x4d, 0xda, 0x53, 0x1a, 0x7c, 0xae, 0xd4, + 0xf0, 0x99, 0xe9, 0xab, 0x77, 0xcb, 0x82, 0x9f, 0x99, 0xc6, 0x3e, 0x97, + 0xfb, 0x9c, 0x39, 0xc4, 0x44, 0x1f, 0x4d, 0x0a, 0xe5, 0xa7, 0xff, 0xe9, + 0x6b, 0x73, 0xa8, 0x16, 0xd6, 0x98, 0xb0, 0xb6, 0xea, 0x5f, 0x6a, 0x18, + 0x88, 0x45, 0x88, 0xec, 0x29, 0x2d, 0xf8, 0xbb, 0xf7, 0xc3, 0xa3, 0x76, + 0xf4, 0x84, 0xcc, 0x41, 0x74, 0x86, 0xf1, 0x81, 0x14, 0x74, 0x0e, 0x3b, + 0x1e, 0x0a, 0x9d, 0x13, 0x2a, 0xdb, 0x8e, 0xc7, 0x43, 0xcd, 0x41, 0xec, + 0x9d, 0x64, 0x5c, 0xa8, 0x96, 0x07, 0xb1, 0x73, 0x42, 0xd0, 0x27, 0x41, + 0xec, 0x1c, 0x58, 0x79, 0x62, 0x04, 0x28, 0xa9, 0x23, 0x58, 0xb7, 0x94, + 0x07, 0xa1, 0x8b, 0xca, 0x83, 0x29, 0xe3, 0x61, 0x0d, 0x7c, 0x04, 0x17, + 0xcd, 0x50, 0x38, 0x53, 0x3b, 0x68, 0x4f, 0xdb, 0x50, 0x73, 0xd7, 0xa0, + 0x7f, 0x5c, 0x8c, 0x95, 0x5e, 0x04, 0x1d, 0xba, 0x28, 0xff, 0xe8, 0xf0, + 0xf2, 0x50, 0x25, 0xc6, 0x86, 0x40, 0x98, 0x8f, 0x29, 0xed, 0x83, 0xdb, + 0xcd, 0xc1, 0x05, 0x39, 0xb8, 0xb4, 0x2d, 0x35, 0xf4, 0x04, 0x17, 0xa4, + 0x94, 0x25, 0x57, 0xa6, 0x95, 0x06, 0x17, 0xa5, 0xb1, 0x43, 0x6a, 0xc7, + 0xc3, 0x7b, 0x93, 0x59, 0x6f, 0x9a, 0x43, 0xf7, 0x32, 0x95, 0x82, 0x79, + 0xe2, 0xc1, 0x64, 0x3a, 0xc1, 0x76, 0x3c, 0x3c, 0x39, 0x85, 0x23, 0x21, + 0xf5, 0xf2, 0x14, 0x35, 0xd5, 0x12, 0x4d, 0xad, 0x85, 0x28, 0xd3, 0x4f, + 0xb6, 0xeb, 0xb7, 0x10, 0x87, 0x6e, 0x57, 0xc6, 0x5f, 0x70, 0x41, 0xd4, + 0x35, 0xe8, 0x47, 0x63, 0xb8, 0x9e, 0xfc, 0x7b, 0x00, 0xe3, 0x0c, 0x3f, + 0x3a, 0x90, 0x8d, 0xe6, 0xc1, 0x33, 0x14, 0x75, 0x67, 0x3b, 0xa3, 0x22, + 0x78, 0xca, 0x7c, 0xcb, 0xd3, 0x38, 0x6a, 0xb4, 0x5b, 0xdb, 0xbf, 0x1c, + 0x20, 0x9f, 0xaa, 0x2c, 0x0f, 0x82, 0x8f, 0xf4, 0x15, 0x8c, 0xac, 0x70, + 0xe7, 0x40, 0x66, 0x7f, 0x4f, 0x96, 0x18, 0x0d, 0x81, 0x89, 0xa6, 0x93, + 0x0b, 0x20, 0x80, 0xf6, 0x4b, 0x7d, 0x60, 0x89, 0x18, 0xa6, 0xe0, 0x79, + 0xcb, 0xce, 0x3d, 0x6d, 0x0d, 0x4f, 0x4a, 0x61, 0xeb, 0x1b, 0x7e, 0x84, + 0x30, 0x7c, 0x49, 0x8a, 0x38, 0xf1, 0xc2, 0x98, 0x3e, 0x41, 0x05, 0x1e, + 0xc8, 0x8a, 0xb8, 0xd0, 0xd8, 0xf1, 0xbe, 0xa1, 0x7c, 0x40, 0xa5, 0xb1, + 0x3c, 0xb4, 0x88, 0x47, 0x2b, 0xa0, 0x8f, 0x62, 0x2d, 0x24, 0xdf, 0x30, + 0x03, 0x07, 0x7f, 0x12, 0x8e, 0x8d, 0x63, 0x6c, 0x9e, 0xdf, 0x17, 0x9e, + 0x35, 0x80, 0xbd, 0x2a, 0xd8, 0x8f, 0x95, 0x70, 0xb8, 0xba, 0xbb, 0x15, + 0x99, 0x30, 0x68, 0x09, 0x6e, 0xbf, 0x1c, 0x1d, 0x16, 0x2a, 0xc9, 0x0f, + 0x2d, 0x9c, 0x6b, 0x9e, 0xf4, 0x42, 0x47, 0x77, 0xff, 0x8e, 0x43, 0xa7, + 0xcc, 0x86, 0x83, 0xda, 0xe9, 0x9b, 0x66, 0xd9, 0x33, 0xb9, 0x27, 0xc3, + 0x03, 0x52, 0xd4, 0x95, 0xde, 0x95, 0x98, 0x43, 0xed, 0x00, 0x71, 0x7a, + 0x20, 0x7c, 0x24, 0x8d, 0x9f, 0x23, 0x1f, 0x8c, 0x0d, 0x18, 0x9d, 0x6a, + 0xd5, 0xe3, 0x9c, 0xdc, 0x42, 0xdd, 0x57, 0xa5, 0x9f, 0xba, 0x51, 0xe8, + 0x43, 0xc9, 0x7a, 0xa1, 0xa9, 0x51, 0xa1, 0x77, 0xf4, 0x49, 0xe8, 0xb5, + 0x71, 0x84, 0x5a, 0x24, 0xa1, 0x8f, 0xa7, 0xa9, 0x42, 0xe7, 0xf5, 0x49, + 0xe8, 0x80, 0x38, 0x42, 0x07, 0x4a, 0x42, 0x7d, 0x51, 0xa1, 0x9f, 0xf4, + 0xef, 0x8b, 0xd0, 0xc7, 0x17, 0x4b, 0x42, 0x99, 0x41, 0x08, 0xff, 0x57, + 0x92, 0x5e, 0xee, 0x80, 0xa8, 0xdc, 0xdb, 0xfb, 0x24, 0xd7, 0xb5, 0x58, + 0x38, 0x49, 0xd7, 0x43, 0x2c, 0xf7, 0x24, 0x73, 0x93, 0x7e, 0x9c, 0x2c, + 0x12, 0x57, 0x41, 0xe2, 0x93, 0xfc, 0x05, 0x51, 0x48, 0xdf, 0x90, 0x2c, + 0x3d, 0x77, 0x39, 0x36, 0x04, 0x66, 0xd2, 0x8a, 0xae, 0x4d, 0xef, 0x80, + 0xda, 0x45, 0x32, 0xf2, 0x17, 0xf3, 0xc5, 0x64, 0xe7, 0x61, 0x53, 0xa8, + 0xbf, 0x7f, 0x2c, 0x6e, 0x9f, 0x83, 0xc5, 0x0a, 0xbe, 0xb7, 0x30, 0x34, + 0xf7, 0x3b, 0x68, 0x83, 0x39, 0xc0, 0xbd, 0x30, 0x98, 0xf2, 0x5d, 0x64, + 0x6f, 0xa8, 0xec, 0x9d, 0x82, 0xbd, 0xde, 0x7f, 0xe2, 0x12, 0x33, 0xd9, + 0x14, 0xec, 0x07, 0x8b, 0x04, 0x3c, 0xd0, 0x91, 0xd0, 0x35, 0x00, 0x77, + 0xe3, 0x4c, 0x65, 0xc8, 0x63, 0xc4, 0xa7, 0xad, 0xf5, 0x30, 0xd3, 0xa4, + 0x28, 0xfe, 0xd9, 0x65, 0xb9, 0x90, 0xc9, 0x2a, 0xc5, 0x94, 0xfe, 0x27, + 0x58, 0xc6, 0xdd, 0x38, 0x26, 0x2d, 0xec, 0xe9, 0x8f, 0x16, 0xbc, 0x62, + 0x0c, 0x18, 0x8b, 0xda, 0x31, 0xa3, 0xd8, 0xb1, 0xc1, 0x67, 0xc3, 0x0b, + 0xfa, 0xe1, 0x84, 0xfe, 0x34, 0x32, 0x97, 0xcd, 0x71, 0xa4, 0x78, 0x5f, + 0x34, 0x9d, 0xec, 0x9f, 0xe2, 0x1f, 0x11, 0x5d, 0xe6, 0x97, 0x5f, 0xb1, + 0xc0, 0x78, 0x4b, 0x1a, 0xfe, 0x6c, 0x48, 0x02, 0xaf, 0x41, 0xe4, 0x5f, + 0x1e, 0xba, 0x3a, 0x13, 0x1d, 0xd0, 0x89, 0x66, 0x98, 0xd4, 0xfc, 0x63, + 0xff, 0xc2, 0xcc, 0x31, 0x18, 0x51, 0x7f, 0x0f, 0x6e, 0xb9, 0x86, 0x8f, + 0xc0, 0x72, 0x25, 0xf8, 0x77, 0x24, 0x8a, 0xec, 0x35, 0xcf, 0x49, 0xf3, + 0x7e, 0x14, 0xcf, 0x67, 0xa4, 0xea, 0x7c, 0xc9, 0xc4, 0x95, 0x8e, 0x2f, + 0x46, 0x79, 0x8b, 0x3b, 0xda, 0xa0, 0x3a, 0xe5, 0x60, 0x0c, 0x43, 0x69, + 0x50, 0x99, 0x97, 0xcd, 0x5d, 0x2b, 0xd3, 0xd2, 0x70, 0xa0, 0x75, 0x05, + 0x0e, 0x84, 0x37, 0xf5, 0xa3, 0x97, 0xe2, 0x66, 0x84, 0x2a, 0x0f, 0xb0, + 0xa1, 0xfe, 0x49, 0x78, 0x43, 0x2a, 0x76, 0xeb, 0xbf, 0xf0, 0xac, 0xc6, + 0xa7, 0xe1, 0x3f, 0xa6, 0x62, 0xfd, 0xf6, 0x31, 0x69, 0xa5, 0x73, 0xda, + 0x52, 0xbc, 0x8f, 0xc5, 0xa9, 0x86, 0xce, 0x7f, 0x33, 0xc3, 0xc4, 0x1c, + 0xfc, 0x96, 0x8d, 0xe7, 0xd1, 0xe6, 0x8e, 0xee, 0x4c, 0xd1, 0xb9, 0xea, + 0x56, 0xfa, 0xa0, 0x54, 0x9c, 0x8b, 0x7c, 0xf9, 0xa5, 0x21, 0xdb, 0xdc, + 0x8a, 0x49, 0x1f, 0x96, 0x77, 0x2d, 0xea, 0x6f, 0xfe, 0x2b, 0x36, 0x17, + 0x23, 0x1c, 0xfb, 0xb2, 0xd9, 0xb0, 0x8f, 0xab, 0xde, 0xe1, 0x14, 0xf5, + 0x85, 0x07, 0xbe, 0x6d, 0xb3, 0x04, 0x38, 0x17, 0x76, 0x5d, 0x3a, 0x51, + 0x9d, 0x61, 0x1f, 0x07, 0x8a, 0x85, 0xfb, 0x4a, 0xf1, 0xad, 0x53, 0x4c, + 0x48, 0xb4, 0x99, 0x63, 0x62, 0x2d, 0x82, 0xaf, 0x84, 0x6d, 0x7e, 0x8c, + 0xb5, 0x6a, 0x45, 0xf0, 0x8b, 0xa3, 0x17, 0x9a, 0x23, 0x7b, 0xca, 0x83, + 0xef, 0x55, 0x4e, 0xfa, 0xca, 0x1c, 0xd9, 0x7b, 0x5b, 0xf2, 0xdc, 0x2c, + 0xff, 0xf1, 0xcd, 0xdd, 0x81, 0x2f, 0x72, 0xbb, 0x2b, 0x71, 0x37, 0xfa, + 0x7d, 0x14, 0xd8, 0xf1, 0xb5, 0x21, 0xbd, 0xf3, 0x4d, 0x9c, 0x0e, 0x27, + 0x7d, 0x61, 0xee, 0x5a, 0x18, 0x29, 0x2f, 0x78, 0x39, 0xbd, 0x63, 0x1f, + 0xc0, 0x8b, 0xbb, 0x5c, 0x57, 0x19, 0x50, 0xeb, 0xbf, 0xda, 0x6f, 0x36, + 0xec, 0x2d, 0xef, 0x88, 0xa4, 0x06, 0x46, 0xc1, 0xca, 0xe4, 0xe5, 0x8b, + 0x60, 0x65, 0x92, 0xca, 0x0f, 0x12, 0x86, 0x7f, 0x91, 0xc2, 0xb6, 0x5b, + 0xab, 0xca, 0x36, 0x1f, 0xde, 0x8d, 0xbf, 0x6f, 0xf4, 0x58, 0x09, 0x3e, + 0x2d, 0x02, 0xff, 0xa6, 0x2b, 0xf5, 0x49, 0xa0, 0xab, 0xe8, 0xca, 0xa8, + 0x1e, 0x01, 0x01, 0x4b, 0xc9, 0xfb, 0x23, 0xee, 0x2b, 0x75, 0x6d, 0xda, + 0xbf, 0x1b, 0x2b, 0x52, 0x16, 0xc4, 0xdd, 0x9d, 0x4a, 0x98, 0x46, 0xab, + 0x4d, 0x75, 0x35, 0x35, 0xe1, 0xfd, 0xc9, 0xcc, 0xe5, 0x34, 0x1e, 0x5d, + 0x08, 0x06, 0x71, 0x61, 0x1c, 0x79, 0x6e, 0x2e, 0x2f, 0x49, 0xc8, 0xeb, + 0x38, 0x96, 0x06, 0x32, 0xaf, 0x26, 0x99, 0xb9, 0xdd, 0x26, 0x58, 0x7a, + 0x07, 0xff, 0x5e, 0x19, 0x3c, 0x62, 0xaa, 0x0e, 0x77, 0x70, 0x61, 0x43, + 0xd8, 0xce, 0x73, 0x02, 0x3f, 0x96, 0x0d, 0xbc, 0x1c, 0x93, 0xd8, 0xd3, + 0x49, 0xdf, 0xfc, 0x20, 0x3b, 0xdd, 0x93, 0x7a, 0x19, 0x93, 0x38, 0xe6, + 0x52, 0x08, 0xca, 0x36, 0x9f, 0x34, 0xa7, 0x97, 0x1d, 0x7c, 0x2c, 0x85, + 0x4e, 0xe6, 0xc0, 0xec, 0x66, 0x4d, 0xe1, 0x2f, 0x12, 0x7e, 0x9f, 0x9f, + 0x35, 0x7a, 0xd1, 0x0c, 0x5d, 0x38, 0x89, 0xbf, 0x75, 0xb6, 0x05, 0x1f, + 0x88, 0x83, 0x77, 0x36, 0x34, 0x37, 0x12, 0x6e, 0x48, 0xa6, 0xed, 0x80, + 0x22, 0x2f, 0xbe, 0x4b, 0xfb, 0x2a, 0xf6, 0xc6, 0x99, 0x70, 0x75, 0xb2, + 0x18, 0xd9, 0x81, 0x59, 0x15, 0xc1, 0x4d, 0x3a, 0xc1, 0x69, 0xbc, 0x25, + 0xe7, 0xc3, 0x88, 0x04, 0x7c, 0x65, 0x7a, 0xe9, 0xc7, 0xf8, 0x9e, 0xef, + 0x42, 0xde, 0x91, 0x6c, 0xef, 0x68, 0x44, 0x32, 0xcb, 0x72, 0x19, 0x66, + 0xf9, 0x78, 0x32, 0x1e, 0x91, 0xf8, 0x18, 0xf7, 0x86, 0x22, 0xdc, 0x30, + 0xe5, 0xa8, 0x6a, 0x51, 0xde, 0x65, 0x49, 0x01, 0x1f, 0xfb, 0x20, 0xea, + 0xce, 0x0e, 0xa4, 0xeb, 0xb2, 0xf7, 0x4f, 0x81, 0xa6, 0x5a, 0x3c, 0x32, + 0xfa, 0x78, 0x25, 0x7c, 0x77, 0x32, 0xcb, 0xee, 0x32, 0x68, 0xbb, 0x83, + 0xe6, 0xae, 0xba, 0x1e, 0x73, 0x17, 0x0e, 0x8d, 0x8f, 0xc2, 0x77, 0x28, + 0x6c, 0x37, 0x61, 0x73, 0x00, 0x9d, 0x9a, 0x8b, 0xa1, 0x39, 0x0e, 0x65, + 0x30, 0x4f, 0xbb, 0x67, 0x5f, 0xd9, 0x01, 0xec, 0xf4, 0xf2, 0xae, 0xab, + 0xfb, 0x01, 0x78, 0x90, 0xf8, 0xba, 0xf1, 0x05, 0x74, 0xe4, 0x5b, 0x49, + 0x7c, 0x45, 0x7c, 0x0b, 0xe7, 0x20, 0x34, 0x9d, 0x7f, 0x24, 0x64, 0xba, + 0x1b, 0xd8, 0xc3, 0xc6, 0x64, 0xde, 0x68, 0x78, 0x68, 0xf5, 0xe8, 0x80, + 0x8a, 0x82, 0x8f, 0xd3, 0x3b, 0x33, 0xd0, 0x1f, 0xab, 0x3b, 0x00, 0xae, + 0x4f, 0x4f, 0x29, 0x7b, 0x60, 0x50, 0x09, 0xa2, 0xf2, 0xfe, 0x84, 0x99, + 0x75, 0xad, 0x62, 0x4f, 0x32, 0xde, 0x0b, 0xe3, 0x1e, 0x3f, 0xb8, 0xc7, + 0x47, 0x8e, 0xd1, 0xae, 0x4f, 0x45, 0xa8, 0x3f, 0x74, 0x73, 0x7b, 0x7e, + 0x8e, 0xdf, 0xbe, 0x8f, 0xfd, 0x48, 0x57, 0x45, 0x30, 0xa9, 0xbc, 0xe0, + 0x84, 0xaf, 0x28, 0x17, 0xdc, 0xf5, 0x41, 0x7b, 0x26, 0x43, 0x87, 0xa5, + 0x3f, 0x39, 0xa4, 0xac, 0xf3, 0xd5, 0xb6, 0x29, 0x95, 0xb6, 0xb7, 0x4a, + 0x4e, 0x96, 0xde, 0x5d, 0x94, 0xe2, 0x37, 0x96, 0x47, 0x60, 0x19, 0x91, + 0xb4, 0xa6, 0x7b, 0x60, 0xd0, 0xd0, 0x3a, 0xd9, 0xd4, 0xf1, 0xd4, 0xfe, + 0x52, 0xc3, 0x7e, 0x88, 0x5e, 0x5e, 0x11, 0x42, 0x66, 0xef, 0x8b, 0xe6, + 0x6d, 0xe5, 0x06, 0xa0, 0xe8, 0x0f, 0x05, 0xfc, 0xe5, 0x1e, 0x48, 0x49, + 0xbf, 0xab, 0xdb, 0xd8, 0x73, 0x34, 0x29, 0xb7, 0x9b, 0xeb, 0x4a, 0xfa, + 0x05, 0xba, 0x79, 0x7d, 0x34, 0x16, 0x6c, 0x44, 0x12, 0xf5, 0xee, 0xbb, + 0xf4, 0x98, 0x6a, 0x0f, 0x7b, 0x8c, 0x22, 0xcd, 0xd9, 0xe2, 0xe5, 0x8f, + 0x6f, 0xc3, 0x87, 0x0d, 0xe4, 0x04, 0xdf, 0x8f, 0xad, 0x3f, 0x27, 0x75, + 0xa4, 0x19, 0x5f, 0x56, 0xfc, 0xa9, 0x82, 0xbf, 0xd3, 0xc9, 0x1f, 0xee, + 0x86, 0x7f, 0xa5, 0x70, 0x92, 0xce, 0x5b, 0xd8, 0x4e, 0x5d, 0xde, 0x25, + 0xa0, 0xf8, 0x8f, 0xf1, 0x03, 0x06, 0xb0, 0x92, 0x2c, 0x9b, 0xcc, 0x37, + 0x13, 0xbb, 0x1a, 0x0d, 0xe8, 0x3e, 0x8d, 0x33, 0x30, 0x9b, 0x81, 0xd3, + 0x52, 0x13, 0xd0, 0x7e, 0x35, 0x9f, 0x6d, 0x6d, 0x1a, 0x27, 0xe3, 0xcb, + 0xfe, 0xc4, 0xc3, 0x1e, 0x18, 0xbc, 0xcf, 0x8e, 0x01, 0x15, 0xfd, 0xe9, + 0x6a, 0x26, 0x32, 0xbf, 0x58, 0xbc, 0xd7, 0xf2, 0xd2, 0xfc, 0x28, 0xe5, + 0x3e, 0xfe, 0x68, 0x81, 0x5e, 0x70, 0x01, 0x9f, 0xec, 0x57, 0xdc, 0xca, + 0x48, 0xc3, 0x26, 0x8c, 0xbf, 0x14, 0x16, 0x99, 0x70, 0x6c, 0x12, 0xde, + 0x8f, 0xb3, 0xfb, 0x09, 0x76, 0xff, 0x9c, 0xdd, 0xbf, 0x64, 0xf7, 0x93, + 0xec, 0x7e, 0x8a, 0xdd, 0xbf, 0x61, 0xf7, 0xef, 0xd8, 0xfd, 0x0c, 0xbb, + 0xe3, 0x8f, 0x8d, 0x45, 0x26, 0x24, 0xb1, 0x7b, 0x0a, 0xbb, 0xf7, 0x63, + 0xf7, 0x34, 0x76, 0x1f, 0xc8, 0xee, 0x17, 0xb2, 0xfb, 0x60, 0x76, 0x1f, + 0xc2, 0xee, 0xc3, 0xd8, 0x7d, 0x04, 0xbb, 0x8f, 0x64, 0xf7, 0x51, 0xec, + 0x7e, 0x31, 0xbb, 0x5f, 0xca, 0xee, 0x97, 0xb1, 0xbb, 0x91, 0xdd, 0xc7, + 0xb1, 0xfb, 0x78, 0x76, 0xbf, 0x92, 0xdd, 0x33, 0xd9, 0x7d, 0x32, 0xbb, + 0x4f, 0x65, 0xf7, 0x2c, 0x76, 0xcf, 0x61, 0xf7, 0xe9, 0xec, 0x3e, 0x93, + 0xdd, 0x67, 0xb1, 0x7b, 0x3e, 0xbb, 0x17, 0xb2, 0xfb, 0x5c, 0x76, 0xbf, + 0x8a, 0xdd, 0x8b, 0xd9, 0x7d, 0x3e, 0xbb, 0x97, 0xb2, 0xfb, 0x02, 0x76, + 0x37, 0xb3, 0xfb, 0x35, 0xec, 0x5e, 0xc1, 0xee, 0x8b, 0xd8, 0xbd, 0x8a, + 0xdd, 0xab, 0xd9, 0xbd, 0x96, 0xdd, 0xaf, 0x65, 0xf7, 0x7a, 0x76, 0x5f, + 0xce, 0xee, 0x2b, 0xd9, 0xfd, 0x3a, 0x76, 0x5f, 0xcd, 0xee, 0x0d, 0xec, + 0x6e, 0x9f, 0x8c, 0xc6, 0x6e, 0xcc, 0xeb, 0x13, 0xa1, 0xa3, 0x6a, 0x22, + 0x13, 0x9e, 0x81, 0x70, 0x6b, 0x33, 0xfe, 0x50, 0xd8, 0x91, 0x8f, 0x60, + 0xe0, 0x34, 0x2f, 0xc0, 0xd8, 0x3b, 0x18, 0x3b, 0x86, 0xb1, 0x57, 0x31, + 0x96, 0x02, 0x4a, 0x71, 0xa4, 0x07, 0x63, 0x97, 0x61, 0xec, 0x49, 0x8c, + 0xe1, 0x61, 0xe7, 0x23, 0x0f, 0x61, 0xac, 0x1e, 0x63, 0xbf, 0xc3, 0xd8, + 0x3a, 0x8c, 0x6d, 0xc7, 0xd8, 0x36, 0x8c, 0xdd, 0x85, 0xb1, 0x87, 0x30, + 0xf6, 0x03, 0x8c, 0xed, 0xc7, 0xd8, 0xad, 0x18, 0xfb, 0x04, 0x63, 0xb8, + 0xd4, 0x68, 0xee, 0x07, 0xea, 0x7e, 0xc4, 0x8d, 0xb1, 0x36, 0x8c, 0xd9, + 0x31, 0xd6, 0x85, 0xb1, 0xe5, 0x18, 0x7b, 0x05, 0x63, 0x78, 0x7a, 0xb3, + 0xf9, 0x14, 0xc6, 0x16, 0x60, 0x6c, 0x34, 0x0c, 0xf8, 0x23, 0x73, 0x31, + 0x56, 0x80, 0xb1, 0xe9, 0x18, 0x5b, 0x8e, 0x31, 0x7c, 0xac, 0xd6, 0x7c, + 0x13, 0xc6, 0x2e, 0xc3, 0xd8, 0xbd, 0x18, 0x1b, 0x81, 0xb1, 0x27, 0x31, + 0x36, 0x10, 0x63, 0x07, 0x30, 0x86, 0xe7, 0xca, 0x9b, 0x8f, 0x63, 0xec, + 0x24, 0x0c, 0xfe, 0xe6, 0xfe, 0xa0, 0xab, 0xcc, 0x0c, 0x34, 0x4f, 0xc0, + 0xd8, 0x07, 0x18, 0x5b, 0x80, 0xb1, 0x83, 0x18, 0xc3, 0xc5, 0xc7, 0x91, + 0x97, 0x30, 0x76, 0x13, 0xc6, 0x9e, 0xc6, 0xd8, 0xbd, 0x18, 0x7b, 0x0c, + 0x63, 0x3d, 0x18, 0xc3, 0x23, 0xa9, 0xcd, 0x87, 0x30, 0xf6, 0x5b, 0x8c, + 0x7d, 0x85, 0xb1, 0x9f, 0x63, 0x6c, 0x0c, 0x18, 0xb5, 0x23, 0xb7, 0x63, + 0xac, 0x18, 0x63, 0x78, 0x88, 0xb5, 0xf9, 0xf7, 0x18, 0xbb, 0x09, 0x63, + 0xcb, 0xb0, 0x75, 0xfd, 0x18, 0x6b, 0xc1, 0xd8, 0xf5, 0x18, 0xfb, 0x1e, + 0xc6, 0xf0, 0x00, 0x6f, 0x33, 0x6e, 0xaf, 0x1f, 0xb9, 0x16, 0x63, 0xf8, + 0x73, 0xbb, 0x47, 0x2a, 0x30, 0xf6, 0x32, 0xc6, 0xe6, 0x63, 0xec, 0x1f, + 0x18, 0xc3, 0x43, 0xc8, 0xcd, 0x13, 0xb1, 0x5d, 0xb2, 0x30, 0x36, 0x13, + 0x63, 0xe3, 0x31, 0x66, 0xc2, 0xd8, 0xc5, 0x18, 0xab, 0xc3, 0xd8, 0x10, + 0x8c, 0x39, 0x31, 0xd6, 0x0f, 0x63, 0xf7, 0x63, 0xec, 0xbb, 0xd3, 0x10, + 0xfb, 0x33, 0xc6, 0x3e, 0xc7, 0xd8, 0x53, 0x18, 0x0b, 0x63, 0x6c, 0x30, + 0x96, 0xef, 0x5d, 0x8c, 0x35, 0x62, 0xec, 0x00, 0xc6, 0x6e, 0xc1, 0xd8, + 0xf3, 0x18, 0xfb, 0x05, 0xc6, 0xf0, 0x20, 0x75, 0xf3, 0x93, 0x18, 0x7b, + 0x18, 0x63, 0x7f, 0xc3, 0xd8, 0x0e, 0x8c, 0xbd, 0x83, 0xb1, 0x5f, 0x63, + 0xec, 0x32, 0x2c, 0xdf, 0x36, 0x8c, 0xa1, 0x29, 0x3d, 0xf2, 0x43, 0x88, + 0x29, 0x4a, 0xa3, 0x37, 0xeb, 0xfa, 0x80, 0xcb, 0xe9, 0x70, 0xb7, 0xb5, + 0x65, 0x79, 0x7c, 0xbe, 0x2c, 0xbf, 0xc3, 0xdb, 0xe2, 0x74, 0x5b, 0x5d, + 0xd3, 0xdc, 0x1e, 0xbf, 0xb3, 0xd1, 0xe9, 0xf0, 0x2a, 0x36, 0x4f, 0x4b, + 0x96, 0xb5, 0xb5, 0xd5, 0xe5, 0xc8, 0xe2, 0x49, 0x36, 0xf6, 0x93, 0x6e, + 0x36, 0x87, 0x1b, 0x48, 0x03, 0x4e, 0x65, 0xa5, 0xe2, 0x73, 0xb8, 0xed, + 0x3a, 0xba, 0x5a, 0x92, 0xa1, 0x94, 0x2c, 0x98, 0x1f, 0x70, 0xdb, 0x5d, + 0x8e, 0xb2, 0x36, 0x87, 0x2d, 0xe0, 0xb7, 0x36, 0xb8, 0x1c, 0x6a, 0x52, + 0x4d, 0xb3, 0xc7, 0xeb, 0xa7, 0x1f, 0x8c, 0xab, 0xe1, 0xbf, 0x0b, 0x3b, + 0xc1, 0x67, 0xcc, 0x9c, 0xe0, 0x9b, 0x64, 0x74, 0xfa, 0x8c, 0x56, 0x23, + 0xfe, 0xda, 0xa4, 0xd5, 0x6d, 0x9f, 0xe6, 0x72, 0xba, 0x1d, 0x46, 0xbf, + 0xc7, 0xe3, 0x82, 0x9b, 0x11, 0x73, 0x32, 0xb6, 0x58, 0x6d, 0x8b, 0x6b, + 0x8c, 0x75, 0x3e, 0x87, 0xd7, 0xb8, 0x48, 0x53, 0x20, 0x5f, 0xd6, 0xc0, + 0x81, 0x75, 0x3e, 0x6b, 0x93, 0xa3, 0xd0, 0x08, 0x82, 0xa6, 0xad, 0x68, + 0x71, 0xf8, 0x10, 0xba, 0x11, 0x7f, 0x2c, 0xf5, 0x46, 0xaf, 0xa3, 0xc5, + 0xb3, 0xce, 0xb1, 0xca, 0xb8, 0xe2, 0x5a, 0x53, 0x45, 0x5d, 0xd9, 0x8d, + 0xe5, 0xa5, 0xf0, 0x1f, 0x20, 0x4f, 0x2b, 0xe3, 0x5c, 0x35, 0x70, 0xa0, + 0xd1, 0x68, 0x2c, 0x73, 0xfa, 0x9b, 0x41, 0xa6, 0xa7, 0xd1, 0x08, 0xa1, + 0xcf, 0x81, 0xc5, 0xf0, 0x3a, 0xd6, 0x06, 0x9c, 0x5e, 0x87, 0xdd, 0x98, + 0x19, 0x70, 0xbb, 0x40, 0x9e, 0x91, 0x84, 0x1a, 0xf1, 0xb7, 0x35, 0x91, + 0xa0, 0xd5, 0xd9, 0x0a, 0x58, 0x28, 0x19, 0xb0, 0xb0, 0x52, 0x4e, 0x2a, + 0x64, 0xb2, 0xf0, 0x6f, 0x1a, 0xfe, 0x46, 0xb5, 0x51, 0xf7, 0x57, 0xea, + 0xf4, 0xb5, 0xba, 0xac, 0x1b, 0x80, 0x1a, 0x78, 0x19, 0xba, 0xc1, 0xea, + 0x76, 0x3b, 0xbc, 0x59, 0x2a, 0xcf, 0x3a, 0xde, 0x22, 0xf1, 0x78, 0xe4, + 0x8e, 0x31, 0x12, 0x6d, 0x94, 0x59, 0x94, 0x8e, 0x55, 0x92, 0x25, 0xd5, + 0x42, 0xb1, 0xb4, 0xbd, 0x26, 0x2a, 0x10, 0xe5, 0xe1, 0x2d, 0x63, 0x2c, + 0x2f, 0x55, 0x33, 0xac, 0x66, 0x29, 0xd8, 0x07, 0x3a, 0xce, 0xf5, 0xd0, + 0x3c, 0xac, 0x9a, 0xbe, 0x56, 0x87, 0x0d, 0x0b, 0x60, 0x37, 0x7e, 0xd0, + 0xbe, 0xad, 0xc9, 0xeb, 0x09, 0xb4, 0x7e, 0xd0, 0x7e, 0x37, 0x08, 0x88, + 0xca, 0xc4, 0x26, 0xd7, 0x4a, 0x34, 0x1a, 0xcb, 0x1b, 0x7b, 0x65, 0x35, + 0x3a, 0xda, 0x80, 0xc5, 0x67, 0xf4, 0x35, 0x7b, 0xd6, 0x1b, 0xd7, 0x37, + 0x3b, 0xdc, 0x46, 0xa7, 0xdf, 0xb8, 0xde, 0xea, 0x33, 0xda, 0x1d, 0x2e, + 0x27, 0x54, 0xd3, 0x61, 0x9f, 0x3a, 0xd0, 0x98, 0xf0, 0xcf, 0xe3, 0x35, + 0x06, 0xa0, 0xbf, 0x40, 0xa4, 0xa9, 0xa2, 0x02, 0x05, 0x02, 0x23, 0xc8, + 0x64, 0xfa, 0xe2, 0x30, 0x5a, 0x5d, 0x2e, 0x5d, 0x45, 0x7c, 0x59, 0xbd, + 0x88, 0xc2, 0xf6, 0xf2, 0x04, 0xfc, 0xad, 0x01, 0x3f, 0xd7, 0x42, 0xd0, + 0xd9, 0x69, 0x3e, 0x47, 0xab, 0xd5, 0x6b, 0xf5, 0x43, 0xa1, 0xb1, 0x5e, + 0x59, 0xac, 0x7f, 0x17, 0x33, 0xc5, 0xb1, 0xba, 0x34, 0xbd, 0xed, 0x77, + 0xfa, 0x5d, 0xda, 0xa6, 0x8f, 0xd3, 0xf8, 0x8c, 0x24, 0xcb, 0x58, 0xea, + 0x68, 0xb4, 0x06, 0x5c, 0x50, 0x5d, 0x28, 0x21, 0x14, 0x5a, 0x8c, 0x16, + 0x28, 0x79, 0xb4, 0x09, 0x7d, 0x81, 0x06, 0x49, 0x60, 0x8c, 0x34, 0x41, + 0xa2, 0x61, 0xc2, 0x1f, 0x5c, 0x34, 0x2e, 0x32, 0x55, 0x96, 0x69, 0xeb, + 0x83, 0xbf, 0x1a, 0x8e, 0x5a, 0x6d, 0x35, 0x72, 0x3c, 0xe4, 0xca, 0x14, + 0x8a, 0xb5, 0xb3, 0x5f, 0x96, 0x0a, 0x23, 0xd8, 0x61, 0xf5, 0xfa, 0xb2, + 0x54, 0x56, 0x68, 0x06, 0xaf, 0x83, 0x55, 0xdd, 0x61, 0xef, 0xa5, 0xe5, + 0x9c, 0x6e, 0x63, 0x0d, 0x13, 0x5f, 0xe5, 0x75, 0x34, 0x42, 0x8f, 0x81, + 0x81, 0x00, 0x21, 0x30, 0x4a, 0x8d, 0x13, 0xed, 0xbc, 0xbe, 0x13, 0x8d, + 0x8d, 0xd0, 0x53, 0x98, 0x21, 0x25, 0x48, 0xd5, 0x41, 0xee, 0x68, 0x5d, + 0x98, 0x76, 0xe8, 0x94, 0xc8, 0x64, 0xe4, 0xbf, 0x1f, 0x0d, 0x05, 0x77, + 0xda, 0x9a, 0x8d, 0x4e, 0x3b, 0x58, 0x20, 0x54, 0x26, 0x1f, 0x93, 0xc9, + 0xe9, 0xe5, 0xea, 0xf8, 0x8c, 0x0d, 0x0e, 0x97, 0x07, 0x78, 0xfc, 0x9e, + 0xde, 0xba, 0x7d, 0xb1, 0xcb, 0x2e, 0xb1, 0x45, 0xb5, 0x1d, 0x5b, 0x0f, + 0x8a, 0xb1, 0xde, 0x09, 0x7a, 0xd4, 0xe0, 0x30, 0xf2, 0xf1, 0xa2, 0x29, + 0xa8, 0xd5, 0xe6, 0x77, 0xae, 0x03, 0xf5, 0x88, 0x96, 0x15, 0x5b, 0xae, + 0x81, 0x19, 0xb9, 0x68, 0x21, 0x85, 0x5d, 0xc1, 0xf6, 0x75, 0xa9, 0xfa, + 0xe0, 0x31, 0xaa, 0xdc, 0x6a, 0x6f, 0x04, 0xd0, 0xb0, 0xd9, 0x80, 0x66, + 0x8d, 0x2f, 0xa6, 0x3a, 0x9a, 0xae, 0x66, 0x36, 0x57, 0xdb, 0x3e, 0x7d, + 0xcf, 0xb5, 0xd9, 0xea, 0xc7, 0x91, 0x16, 0x80, 0x4a, 0x43, 0x85, 0x70, + 0xcc, 0xb9, 0x71, 0xc8, 0xb0, 0xda, 0x32, 0xb1, 0x53, 0xa1, 0x37, 0x6d, + 0xae, 0x80, 0x1d, 0x1b, 0xdb, 0x09, 0x7a, 0xea, 0xb4, 0x69, 0xb3, 0x06, + 0x59, 0xe5, 0x90, 0x60, 0xac, 0xab, 0xae, 0xd0, 0x64, 0x8d, 0x10, 0x53, + 0x32, 0xf6, 0x8b, 0xd2, 0x58, 0x35, 0x3b, 0x19, 0x2e, 0xa7, 0x1b, 0x54, + 0xc7, 0x6a, 0x8f, 0x57, 0x14, 0x14, 0x6c, 0xcc, 0xac, 0xb4, 0xc2, 0x10, + 0xc7, 0xfa, 0x4e, 0x31, 0x7a, 0xdc, 0xae, 0x0d, 0x93, 0xd4, 0x9c, 0x00, + 0xeb, 0x87, 0x9a, 0x94, 0x33, 0x89, 0x2c, 0xbb, 0xde, 0x73, 0xb2, 0xfa, + 0xfd, 0x56, 0x5b, 0x73, 0xd4, 0x20, 0xeb, 0xf4, 0x2b, 0x71, 0x36, 0x9e, + 0x56, 0x87, 0xb6, 0x36, 0x72, 0x85, 0xbc, 0x0e, 0x50, 0x4d, 0xaf, 0x8d, + 0xe5, 0xc4, 0x48, 0xcf, 0xb1, 0xab, 0x1c, 0x6c, 0xf2, 0x73, 0x18, 0x4b, + 0x16, 0x57, 0x56, 0x9a, 0x16, 0x95, 0x72, 0x4d, 0x06, 0xe3, 0xef, 0x12, + 0x73, 0x1c, 0x1b, 0x91, 0x0e, 0x2f, 0x8c, 0x8e, 0x96, 0x73, 0x95, 0xed, + 0x6c, 0x72, 0x7b, 0xbc, 0x8e, 0x52, 0x77, 0x54, 0x0d, 0x6a, 0x70, 0x8a, + 0xd4, 0x55, 0xdc, 0xb1, 0x0e, 0xed, 0x69, 0xa3, 0xb1, 0xd4, 0x83, 0xf3, + 0x25, 0xce, 0x27, 0xfe, 0x80, 0xb7, 0x01, 0xed, 0x9b, 0xc3, 0x8d, 0x53, + 0x32, 0xe8, 0xf2, 0xc0, 0xa5, 0xba, 0x6c, 0x85, 0x52, 0xca, 0x73, 0xc0, + 0x54, 0x46, 0x02, 0xed, 0xc1, 0xac, 0x17, 0x33, 0x0b, 0x9e, 0xa6, 0xa6, + 0x68, 0x7b, 0xfb, 0xd8, 0x4f, 0xc6, 0x62, 0x22, 0x18, 0x59, 0x1c, 0xfa, + 0x25, 0x30, 0x94, 0x3c, 0x60, 0xa1, 0xa0, 0xcf, 0x91, 0x66, 0x9d, 0xd3, + 0xb1, 0x9e, 0x26, 0x57, 0x4e, 0x33, 0x10, 0x0a, 0xe4, 0xe0, 0x0a, 0xe9, + 0x44, 0x0b, 0x00, 0x43, 0xcd, 0xe6, 0xf4, 0xda, 0x02, 0x2d, 0x3e, 0xbf, + 0x15, 0x0d, 0x08, 0x93, 0xda, 0xe8, 0xf4, 0xc2, 0x74, 0x62, 0x6b, 0x06, + 0x23, 0x6c, 0xf3, 0x73, 0x95, 0xb6, 0xaa, 0x13, 0x71, 0xb3, 0x95, 0x99, + 0x51, 0xd0, 0x63, 0x87, 0xcf, 0x66, 0xc5, 0xc9, 0x18, 0x04, 0x79, 0xbc, + 0x38, 0x36, 0x78, 0xb2, 0xd7, 0x61, 0xf3, 0x34, 0xb9, 0x9d, 0x1b, 0xb1, + 0x9a, 0x26, 0x68, 0x8c, 0x36, 0x6b, 0x0b, 0xb8, 0x28, 0x5c, 0x19, 0xa1, + 0x09, 0xe0, 0x3f, 0x6b, 0xf2, 0x80, 0x0f, 0x95, 0xdd, 0xea, 0xe6, 0x3d, + 0xdc, 0x00, 0x59, 0xad, 0x71, 0xf8, 0xa7, 0x92, 0xa9, 0x89, 0xcd, 0xc4, + 0xe5, 0x5c, 0x03, 0xd5, 0xf5, 0x14, 0xa2, 0xfd, 0x5e, 0xb9, 0x82, 0x59, + 0xee, 0x81, 0x0b, 0xc0, 0xba, 0xb5, 0x40, 0x6f, 0x18, 0xf1, 0xe7, 0xd4, + 0xbd, 0x2d, 0x64, 0xd5, 0x60, 0x06, 0x6a, 0xf6, 0xfb, 0x5b, 0x7d, 0x85, + 0xd9, 0xd9, 0x4d, 0x60, 0x53, 0x02, 0x0d, 0x59, 0xd0, 0xeb, 0xd9, 0xdc, + 0xe5, 0xaa, 0xaf, 0xcf, 0x8e, 0x99, 0xd5, 0xb3, 0x06, 0xa2, 0x1f, 0x34, + 0x01, 0x1a, 0x47, 0x61, 0x0e, 0x84, 0x22, 0x5c, 0x02, 0x85, 0x0f, 0xee, + 0x72, 0x75, 0x6c, 0x2b, 0x2b, 0xc6, 0xae, 0x32, 0xd6, 0xb1, 0x2e, 0x64, + 0x1a, 0xe4, 0x81, 0x56, 0x92, 0xe6, 0x6c, 0x61, 0x70, 0x6d, 0x01, 0x2f, + 0x58, 0x64, 0x3f, 0xef, 0xdd, 0xcc, 0x09, 0xc5, 0x93, 0xa6, 0xe2, 0x80, + 0x87, 0x39, 0x16, 0x6b, 0xe6, 0xf6, 0x18, 0xbd, 0x01, 0xb7, 0x1b, 0xeb, + 0xaf, 0xf5, 0xa7, 0x4a, 0x98, 0x83, 0xc7, 0x46, 0x2f, 0xf6, 0x45, 0x96, + 0x22, 0xe6, 0x1b, 0x85, 0xda, 0x5e, 0xe1, 0xa6, 0x50, 0x61, 0xbf, 0x6f, + 0xcf, 0xac, 0xb7, 0x22, 0x14, 0x47, 0x94, 0xb5, 0x54, 0x61, 0x66, 0x99, + 0xdf, 0x01, 0xa2, 0xa1, 0xa0, 0x90, 0xe2, 0x2b, 0x64, 0x4a, 0x14, 0xed, + 0x40, 0x57, 0xb0, 0x07, 0x94, 0x89, 0x13, 0x8a, 0x27, 0x62, 0xe7, 0x40, + 0x75, 0xa0, 0x52, 0xeb, 0xac, 0x2e, 0xa7, 0x1d, 0x46, 0x64, 0x79, 0x96, + 0x12, 0x55, 0x79, 0x25, 0x1a, 0xe3, 0xe5, 0x52, 0xdd, 0xce, 0x09, 0xd3, + 0x67, 0x28, 0x57, 0x28, 0x16, 0x6e, 0x06, 0xfd, 0x1b, 0xb8, 0x58, 0x3d, + 0x68, 0xb6, 0xfa, 0xe6, 0x33, 0x35, 0x51, 0x68, 0x32, 0x02, 0x3c, 0x13, + 0xe7, 0x2b, 0xf5, 0x40, 0x2b, 0xd0, 0x20, 0x51, 0xc0, 0xa1, 0x50, 0x26, + 0x73, 0x8f, 0x08, 0xdb, 0xa7, 0xd5, 0xeb, 0x58, 0xe7, 0xf4, 0x04, 0x7c, + 0xae, 0x0d, 0x68, 0x29, 0xfd, 0xd2, 0xe0, 0xe0, 0xca, 0x82, 0x6e, 0x0b, + 0x43, 0x7a, 0xdc, 0xe8, 0x89, 0x42, 0x77, 0x16, 0x0f, 0xd0, 0xfc, 0x57, + 0xea, 0xb4, 0x23, 0x4c, 0x3f, 0x54, 0x0b, 0x15, 0xa3, 0x98, 0xf6, 0x80, + 0xb5, 0x58, 0xc1, 0xf1, 0xcc, 0xaa, 0xc6, 0x21, 0xd1, 0x01, 0x84, 0xa3, + 0x6e, 0x60, 0x10, 0x19, 0x7e, 0x95, 0x8f, 0x1a, 0x58, 0x95, 0xc2, 0xd4, + 0x9a, 0x41, 0x51, 0x85, 0x69, 0x74, 0x82, 0xa5, 0xb0, 0xba, 0x75, 0x06, + 0x39, 0x8e, 0x93, 0x27, 0xe6, 0x14, 0xb7, 0xaa, 0x78, 0x59, 0x4a, 0x76, + 0x83, 0xd3, 0x9d, 0xed, 0x6b, 0x56, 0xa6, 0xd9, 0x44, 0x57, 0x92, 0xd7, + 0x54, 0x38, 0x10, 0xb2, 0x00, 0xa5, 0x6a, 0x56, 0x6a, 0x97, 0x4c, 0xad, + 0x06, 0x95, 0x01, 0xbb, 0xc6, 0x7e, 0x22, 0x5f, 0xa9, 0xbd, 0x02, 0x60, + 0x3b, 0x8c, 0x1f, 0xf6, 0xf3, 0xdf, 0xd0, 0xe7, 0xb5, 0xc5, 0xe3, 0x16, + 0xd5, 0x70, 0xcf, 0x7f, 0xdc, 0xd4, 0xea, 0xa9, 0x25, 0x80, 0x6c, 0x08, + 0x34, 0x95, 0x6a, 0x28, 0x16, 0xd5, 0xf0, 0xa5, 0x82, 0xa2, 0xfd, 0xbb, + 0x9a, 0xab, 0xd2, 0x80, 0x5a, 0x6c, 0x89, 0x01, 0x35, 0xd4, 0x24, 0x03, + 0x2a, 0x79, 0x63, 0x0c, 0x28, 0x15, 0x0e, 0xa3, 0xd1, 0xe4, 0x07, 0x01, + 0xa6, 0x00, 0xfe, 0xda, 0xbf, 0xcb, 0x61, 0xf5, 0x39, 0xaa, 0xc0, 0x3b, + 0x57, 0xf8, 0x8f, 0xec, 0x5b, 0xf5, 0xa9, 0x55, 0x01, 0x28, 0x6f, 0x7c, + 0x8c, 0xa7, 0x55, 0x7c, 0x80, 0x44, 0xf3, 0xbb, 0xf2, 0x20, 0xd6, 0xeb, + 0xb5, 0x6e, 0x80, 0xb0, 0x92, 0x2f, 0x6a, 0x04, 0x58, 0xea, 0xb4, 0x31, + 0xb7, 0xd0, 0x8b, 0xc0, 0x62, 0xd4, 0x2e, 0x87, 0xbd, 0xc6, 0xe1, 0x8f, + 0x12, 0xc6, 0x4b, 0xd3, 0x30, 0x61, 0x19, 0x1c, 0x36, 0xbf, 0xc5, 0xe7, + 0xf0, 0x97, 0xd3, 0xb0, 0xbb, 0xd6, 0xea, 0x75, 0xb2, 0x75, 0x93, 0x16, + 0xb7, 0xce, 0xea, 0x55, 0x61, 0x9b, 0xa7, 0x75, 0x03, 0x15, 0xde, 0xeb, + 0xf0, 0x5b, 0x9d, 0x6e, 0x1d, 0x30, 0xdf, 0xe5, 0xb1, 0xad, 0x51, 0x53, + 0x58, 0xbd, 0x62, 0x6b, 0xaa, 0xe3, 0x30, 0xc5, 0xa4, 0x6b, 0x28, 0xab, + 0x1d, 0x30, 0x2a, 0xdc, 0xd7, 0x5a, 0x5d, 0x81, 0x84, 0x4c, 0x7d, 0x20, + 0xb1, 0xc7, 0xd2, 0xf8, 0x10, 0x09, 0xca, 0x00, 0xae, 0x1a, 0xb4, 0x4c, + 0x9d, 0xdb, 0xee, 0xa9, 0xb4, 0xba, 0xa1, 0x3f, 0xbd, 0x55, 0x5e, 0x4f, + 0x1b, 0xd4, 0xcf, 0x6f, 0xf5, 0x36, 0x39, 0xfc, 0x25, 0x4c, 0x93, 0x8a, + 0x0b, 0xaf, 0xc0, 0xd6, 0x63, 0x78, 0xfb, 0x62, 0xd6, 0x0a, 0x00, 0xe3, + 0x54, 0x03, 0x2d, 0xe6, 0xa7, 0xb5, 0xa4, 0x50, 0x2d, 0x88, 0x2c, 0x74, + 0x83, 0x83, 0xb3, 0xd0, 0xb1, 0xc1, 0x57, 0x09, 0x9a, 0x0e, 0x49, 0x80, + 0x80, 0x91, 0xd7, 0xb4, 0x21, 0x57, 0x8b, 0x8b, 0xf6, 0x42, 0xae, 0x5a, + 0x6c, 0xab, 0x9d, 0x65, 0x58, 0x65, 0x75, 0x7a, 0x45, 0x53, 0xb8, 0xa0, + 0x3d, 0x81, 0x59, 0x9f, 0x8e, 0xdd, 0xd0, 0x84, 0x5d, 0x66, 0x07, 0xfb, + 0x66, 0xc7, 0xde, 0xf1, 0x11, 0xbd, 0x5a, 0x66, 0x15, 0xac, 0x84, 0xc6, + 0x90, 0x92, 0xaa, 0x69, 0x91, 0xa9, 0x4d, 0x76, 0x79, 0x3c, 0x6b, 0xea, + 0x5a, 0x25, 0xc2, 0x2a, 0xfc, 0x76, 0x85, 0x0d, 0xb5, 0x98, 0x0d, 0x29, + 0x4c, 0x5a, 0xc4, 0x3e, 0x31, 0xd4, 0x4a, 0x88, 0x68, 0x0a, 0x7d, 0x8b, + 0xa3, 0x75, 0x03, 0x13, 0x81, 0x69, 0x3e, 0x98, 0x9e, 0xb8, 0x21, 0x5c, + 0x57, 0x5c, 0xa8, 0xd4, 0xac, 0x77, 0x36, 0x82, 0xc9, 0xab, 0xf5, 0x4f, + 0xb0, 0xd5, 0xf8, 0x26, 0x6c, 0x0c, 0x4c, 0xc8, 0x9a, 0xec, 0x9b, 0x00, + 0x59, 0xf1, 0x24, 0x91, 0x10, 0x4d, 0xaf, 0xf5, 0x57, 0xe1, 0xad, 0x44, + 0xa9, 0xf1, 0x29, 0x98, 0x96, 0x85, 0x37, 0xa5, 0x05, 0x35, 0x8c, 0x0f, + 0x51, 0x8b, 0x25, 0x66, 0x7a, 0xe2, 0x2d, 0x03, 0xd9, 0x42, 0xfb, 0x16, + 0x2a, 0xdc, 0x0a, 0x38, 0x7d, 0x0b, 0xc1, 0x90, 0x2c, 0x6e, 0x64, 0xc5, + 0x2a, 0x44, 0x4b, 0x81, 0xcb, 0x05, 0x67, 0x5b, 0x21, 0xce, 0x2e, 0xdc, + 0xbd, 0x5f, 0xe0, 0xf5, 0xb4, 0xb0, 0xa6, 0x2c, 0xd4, 0x49, 0x80, 0x51, + 0x03, 0x14, 0xcc, 0x36, 0x00, 0x31, 0xf4, 0xb4, 0xdd, 0xea, 0xb5, 0xa3, + 0x2d, 0x15, 0xab, 0x29, 0xc5, 0xae, 0x76, 0xe1, 0x52, 0xb0, 0x62, 0x5c, + 0x31, 0x7c, 0x85, 0x8d, 0x8c, 0xdb, 0x57, 0x68, 0x83, 0x09, 0x0a, 0x38, + 0xbd, 0x8e, 0x26, 0x5c, 0xc9, 0xa8, 0x5c, 0x9a, 0x4c, 0xca, 0x61, 0xda, + 0x8e, 0xaa, 0x01, 0x2b, 0x74, 0x5d, 0xed, 0x82, 0x7c, 0xd2, 0x23, 0x9c, + 0x3a, 0x91, 0x82, 0x45, 0x4c, 0xc2, 0x7c, 0x2f, 0xd2, 0x59, 0x6f, 0xe8, + 0x07, 0x70, 0x5a, 0x7c, 0x8c, 0x0c, 0x14, 0x36, 0xd0, 0x02, 0x6d, 0x01, + 0x75, 0xc6, 0xca, 0x2c, 0x6e, 0xe4, 0x05, 0x42, 0x22, 0xa7, 0xdb, 0x6f, + 0x86, 0x99, 0x7d, 0x3e, 0x5b, 0xfa, 0x73, 0x98, 0x36, 0x42, 0x14, 0x1f, + 0x78, 0x39, 0x0e, 0xfb, 0x52, 0xfc, 0x99, 0xfd, 0x56, 0xab, 0x0d, 0xa6, + 0x58, 0x3e, 0x31, 0x9b, 0xa2, 0x26, 0xda, 0xa7, 0xac, 0xc3, 0x71, 0x23, + 0x9a, 0xb5, 0xd1, 0xe9, 0x82, 0xb9, 0x0c, 0x5b, 0x1e, 0x2b, 0x5d, 0x43, + 0xed, 0x52, 0xee, 0x06, 0x5b, 0xac, 0xa0, 0x06, 0x97, 0x5a, 0xfd, 0xd6, + 0x5a, 0x4f, 0x19, 0xb6, 0xf9, 0x02, 0x20, 0x55, 0x70, 0xe3, 0x02, 0x29, + 0x31, 0xbd, 0x50, 0x61, 0xfa, 0x0c, 0x05, 0x74, 0xfa, 0xd5, 0x34, 0x58, + 0xb8, 0x79, 0xd0, 0xf1, 0x2f, 0x64, 0xf3, 0xba, 0xb6, 0x7e, 0x48, 0x42, + 0xd6, 0xb7, 0x90, 0xe6, 0xfe, 0x84, 0x68, 0x97, 0xc3, 0xdd, 0xe4, 0x6f, + 0xd6, 0x74, 0x89, 0x02, 0x76, 0x8b, 0x5a, 0xa0, 0x31, 0xb6, 0x3f, 0xc1, + 0xd7, 0xe6, 0xc5, 0xf7, 0xb2, 0x9c, 0x7d, 0xe0, 0xc4, 0x83, 0x16, 0x37, + 0x83, 0x47, 0x03, 0x1a, 0x83, 0xe5, 0x06, 0x02, 0xe6, 0x24, 0x80, 0xc2, + 0xf9, 0x44, 0x43, 0xba, 0x03, 0x2d, 0x0d, 0x0e, 0x2f, 0xf2, 0xcd, 0x07, + 0x53, 0x5d, 0xa8, 0xd0, 0x5e, 0x81, 0x5c, 0x26, 0x36, 0x51, 0x14, 0xaa, + 0x73, 0xa7, 0x98, 0x35, 0x69, 0xeb, 0xa7, 0x90, 0x39, 0x2e, 0xbc, 0x1d, + 0xa9, 0x14, 0x55, 0x56, 0x7f, 0x73, 0xa1, 0xda, 0x28, 0x25, 0xdc, 0x35, + 0xf1, 0x2d, 0x6e, 0x04, 0x34, 0x6a, 0x1e, 0x16, 0x71, 0xfe, 0x06, 0xe8, + 0x11, 0x70, 0xb4, 0xb9, 0x35, 0xe1, 0x65, 0x26, 0x44, 0xb5, 0x03, 0x96, + 0x22, 0x36, 0x88, 0x2e, 0xb6, 0x71, 0xaf, 0x0b, 0x34, 0x62, 0x71, 0x23, + 0x51, 0xad, 0xd7, 0x54, 0xd2, 0xed, 0x58, 0x8f, 0x8d, 0xc2, 0x8b, 0x87, + 0x31, 0x31, 0x97, 0x31, 0xa0, 0x5c, 0xf8, 0x90, 0xeb, 0x1c, 0xb5, 0x8e, + 0x36, 0x3f, 0x4b, 0xab, 0x23, 0x15, 0x2c, 0x54, 0xd0, 0xda, 0xe0, 0x58, + 0xc6, 0xb1, 0xc2, 0x8b, 0xe5, 0xf0, 0x33, 0x73, 0x4a, 0x8d, 0xab, 0x6d, + 0x9c, 0x72, 0x37, 0xe7, 0x2e, 0xd1, 0xf8, 0x58, 0x50, 0x3d, 0x5f, 0xd9, + 0xda, 0x80, 0xd5, 0x55, 0xeb, 0x51, 0xcb, 0x0f, 0x05, 0xc0, 0xa6, 0x40, + 0x5b, 0x51, 0x28, 0x9c, 0x22, 0xcc, 0x31, 0xd6, 0x27, 0x44, 0x5a, 0x98, + 0x67, 0x1d, 0x4d, 0x30, 0x02, 0x78, 0x67, 0xd9, 0x03, 0x2e, 0x87, 0x7e, + 0x28, 0xa8, 0x1b, 0x37, 0xba, 0x2d, 0x3a, 0x85, 0x8d, 0xc2, 0xf9, 0x1b, + 0xca, 0xa0, 0x78, 0x0e, 0xb0, 0xc2, 0x90, 0x33, 0xa9, 0x2d, 0x48, 0xf2, + 0xd0, 0x88, 0xa5, 0x91, 0x0a, 0x2e, 0x12, 0x14, 0x90, 0xe6, 0xf3, 0x0d, + 0xa5, 0xe8, 0x55, 0x6a, 0xdd, 0x07, 0xae, 0x80, 0xa5, 0xf1, 0xb2, 0x01, + 0x5e, 0x36, 0x21, 0x73, 0xaf, 0x50, 0x75, 0x5b, 0x9d, 0xfa, 0x26, 0xa5, + 0x1e, 0xc3, 0xfc, 0x17, 0xb0, 0x74, 0x60, 0xb3, 0xdb, 0x85, 0x72, 0xb1, + 0x42, 0xa8, 0xfe, 0x2c, 0xf4, 0x36, 0xd3, 0x33, 0xf2, 0x6a, 0x0b, 0x85, + 0x23, 0x5b, 0x83, 0xcb, 0xb8, 0x12, 0xf2, 0xb5, 0x98, 0xe3, 0xca, 0x7a, + 0x43, 0xe3, 0x51, 0x69, 0xd8, 0x54, 0xcb, 0x58, 0x18, 0xf5, 0x93, 0x71, + 0xff, 0x50, 0x33, 0x86, 0xa1, 0x20, 0xd5, 0x30, 0x68, 0xd1, 0xde, 0x40, + 0x1b, 0x57, 0x58, 0x03, 0x6e, 0x1b, 0xa9, 0x23, 0xab, 0x91, 0xd6, 0xae, + 0x51, 0x2b, 0x01, 0x99, 0x49, 0x58, 0x1a, 0xde, 0x89, 0x64, 0x02, 0x16, + 0x73, 0x7f, 0x4c, 0x9b, 0x54, 0xe6, 0xf5, 0x7a, 0x20, 0x73, 0x17, 0x13, + 0xcb, 0x2c, 0x81, 0x62, 0x5d, 0x67, 0x75, 0xba, 0x98, 0x17, 0xc2, 0x20, + 0xa6, 0xd4, 0xdc, 0x34, 0xac, 0xb7, 0x3a, 0xfd, 0x75, 0x50, 0x60, 0x57, + 0x59, 0x9b, 0xd3, 0xaf, 0xd0, 0x32, 0xc5, 0xcf, 0x36, 0x6b, 0xad, 0xfe, + 0x80, 0x8f, 0x8d, 0x0f, 0x27, 0xb8, 0xe5, 0x1b, 0x1d, 0x3a, 0x23, 0x4c, + 0x7a, 0x85, 0xf9, 0xba, 0x1a, 0x15, 0x5a, 0xd5, 0xd6, 0x80, 0xb2, 0xd8, + 0xfc, 0x98, 0xb7, 0x9c, 0xb0, 0x5e, 0xad, 0x51, 0xaf, 0x38, 0x2d, 0x99, + 0xd3, 0xc7, 0x7d, 0x02, 0xa7, 0xaf, 0xd2, 0x81, 0x3a, 0xae, 0x4e, 0x26, + 0x60, 0x1f, 0x90, 0xdf, 0x57, 0xeb, 0x11, 0x13, 0x25, 0x9a, 0x29, 0x5f, + 0xab, 0xc7, 0x6d, 0x87, 0xb4, 0x68, 0x19, 0xc8, 0x4d, 0x12, 0x4e, 0x8e, + 0xd6, 0x11, 0xe2, 0xa8, 0x12, 0xd6, 0xf7, 0x1b, 0x3d, 0x6e, 0x07, 0x77, + 0x65, 0x35, 0x5e, 0x6c, 0x8c, 0x8f, 0xaa, 0xe9, 0xea, 0x1a, 0xb6, 0xa5, + 0x42, 0x8b, 0x10, 0x1c, 0x19, 0x1a, 0x5c, 0x21, 0xe9, 0x86, 0x2f, 0x36, + 0x15, 0xcd, 0x5b, 0xfc, 0xd4, 0x38, 0xc4, 0xb5, 0x8e, 0x96, 0xd6, 0x18, + 0x06, 0x9e, 0xf1, 0x62, 0xcc, 0xc1, 0xcd, 0x54, 0xdd, 0x1e, 0x43, 0xd2, + 0x2b, 0x52, 0xcd, 0x10, 0xf5, 0x0b, 0xfc, 0xf8, 0xba, 0x72, 0x3d, 0x9a, + 0xcd, 0x50, 0xb1, 0x5c, 0x6a, 0xb2, 0x8f, 0xdb, 0x35, 0x87, 0x1f, 0xc7, + 0x33, 0x58, 0xd4, 0x66, 0xcf, 0xfa, 0x2a, 0xc4, 0x55, 0x59, 0xdd, 0x0e, + 0x97, 0x2f, 0x4e, 0x51, 0xd5, 0x36, 0x32, 0x35, 0x82, 0x62, 0x55, 0x58, + 0x7d, 0x60, 0x69, 0xc1, 0xe5, 0x5b, 0x5f, 0xe2, 0xf2, 0x80, 0x77, 0x18, + 0x87, 0x81, 0x8f, 0x8e, 0x6a, 0x07, 0x5b, 0xc5, 0x40, 0x9f, 0x5c, 0xeb, + 0xf4, 0x39, 0x1b, 0xb0, 0xbc, 0xc8, 0xa5, 0xcf, 0xa1, 0x14, 0x1c, 0xde, + 0x4a, 0x87, 0x3b, 0xa0, 0x2f, 0x2b, 0xee, 0xde, 0x81, 0xa7, 0x81, 0xeb, + 0x32, 0x1a, 0x05, 0x5a, 0xac, 0xdd, 0x09, 0x2e, 0x29, 0xf7, 0x0b, 0xd8, + 0x08, 0x6c, 0xf1, 0xf8, 0x75, 0xe6, 0xcc, 0xc7, 0x66, 0x47, 0x58, 0xfa, + 0xd9, 0x1c, 0xb5, 0x9e, 0x35, 0x0e, 0x77, 0x0c, 0xf7, 0x02, 0x18, 0x45, + 0xb5, 0x9e, 0xb3, 0xcb, 0x48, 0x94, 0xb7, 0xcd, 0x01, 0x46, 0x29, 0x96, + 0x27, 0xb6, 0x0e, 0x65, 0x38, 0x3b, 0x03, 0x25, 0xfa, 0xcb, 0x38, 0x6c, + 0xb9, 0xe5, 0x94, 0x05, 0x96, 0x3a, 0xce, 0x4a, 0x85, 0xc2, 0x70, 0x46, + 0x70, 0xba, 0x03, 0x6c, 0x00, 0x33, 0x8f, 0x06, 0x16, 0xc7, 0x6c, 0xc6, + 0xdc, 0xd0, 0x2a, 0x51, 0xdb, 0xe2, 0x50, 0x16, 0x7a, 0xb9, 0x7c, 0x24, + 0xe0, 0xfd, 0x13, 0x5b, 0x33, 0xde, 0x2e, 0xbd, 0xe6, 0xe3, 0x88, 0xdb, + 0x24, 0x75, 0xad, 0x60, 0x9e, 0xf4, 0xd9, 0xe9, 0x48, 0xd0, 0x09, 0x2b, + 0x75, 0xda, 0x4d, 0x36, 0x9b, 0xa3, 0x15, 0x5c, 0x6c, 0x4f, 0xc0, 0xbe, + 0xd0, 0xe9, 0xaf, 0x41, 0xe7, 0x09, 0x05, 0xa3, 0x93, 0x6d, 0xe7, 0x0e, + 0x8e, 0xd6, 0x12, 0xbb, 0x5c, 0x0b, 0xc0, 0x6a, 0xf9, 0x9a, 0xb9, 0x5d, + 0x65, 0xb3, 0x9e, 0x56, 0x71, 0xa0, 0xb8, 0xbd, 0xa0, 0x91, 0xdd, 0xec, + 0xb4, 0x3b, 0x64, 0x9e, 0x98, 0x34, 0x24, 0xac, 0x73, 0x37, 0xc7, 0x21, + 0x8d, 0x93, 0x8a, 0xc4, 0xf3, 0xa1, 0xb7, 0x5a, 0x1c, 0xac, 0x9e, 0x31, + 0x2c, 0x09, 0x71, 0xc8, 0x08, 0x1d, 0xec, 0x6c, 0x72, 0xc7, 0x67, 0x4c, + 0x88, 0x63, 0xc5, 0x63, 0xad, 0x1b, 0x53, 0xbc, 0xd8, 0x54, 0x24, 0x8e, + 0x6f, 0xd0, 0x80, 0xbe, 0xa4, 0xd9, 0xea, 0x6e, 0x72, 0xd4, 0xd8, 0xbc, + 0x0e, 0x87, 0xbb, 0xca, 0x8a, 0x1f, 0x81, 0x02, 0xdd, 0xf7, 0xc5, 0xa7, + 0x02, 0x67, 0xc8, 0x15, 0xf0, 0xd1, 0xec, 0x01, 0x92, 0x02, 0x71, 0x1d, + 0x0b, 0xae, 0xbb, 0x31, 0x5e, 0x5c, 0x6f, 0xe4, 0xc2, 0x13, 0xef, 0x13, + 0x3d, 0xdf, 0xf4, 0x26, 0x3b, 0x20, 0xfb, 0x2b, 0x38, 0x64, 0x16, 0x78, + 0xad, 0x4d, 0x38, 0x95, 0x96, 0xb3, 0x79, 0xbc, 0x91, 0xa0, 0xc2, 0xd8, + 0xad, 0x37, 0x97, 0xc7, 0x6a, 0x57, 0xec, 0x5e, 0x9c, 0x47, 0xb8, 0xdb, + 0x62, 0x12, 0xcb, 0x3f, 0xed, 0x2a, 0x45, 0x75, 0x79, 0xad, 0x71, 0xb0, + 0x3a, 0x3e, 0x9c, 0x95, 0xd0, 0x6f, 0x74, 0x2c, 0xd6, 0xa5, 0x6a, 0xe7, + 0xbd, 0x18, 0x69, 0x85, 0x31, 0x3e, 0xb5, 0x70, 0xcb, 0x17, 0xeb, 0x56, + 0x5e, 0x38, 0x53, 0x73, 0x4f, 0x9f, 0x99, 0x20, 0xb6, 0x07, 0x46, 0xae, + 0xff, 0x7c, 0xab, 0xdf, 0xd6, 0xcc, 0x72, 0xa1, 0x64, 0xf2, 0x2a, 0x1a, + 0xc1, 0x24, 0xb3, 0x3c, 0x50, 0x06, 0x2d, 0x91, 0x0b, 0xf9, 0x42, 0x46, + 0x48, 0x05, 0x5f, 0x09, 0x78, 0xbc, 0x4e, 0x58, 0x58, 0x82, 0x13, 0x1a, + 0x5d, 0x37, 0x15, 0x6a, 0x3c, 0x03, 0x5a, 0x06, 0x2c, 0x6e, 0x9c, 0xbf, + 0xc1, 0xef, 0xf0, 0xd5, 0xe1, 0x16, 0x6b, 0x99, 0xba, 0xbc, 0xc0, 0xb5, + 0x31, 0x39, 0x9f, 0x2d, 0xd6, 0xb6, 0x0a, 0x46, 0xa9, 0x59, 0x7d, 0x08, + 0xff, 0x9b, 0xb1, 0x16, 0xba, 0x64, 0xf4, 0x1a, 0x87, 0xea, 0x44, 0x7a, + 0xbc, 0xe0, 0x4b, 0xb7, 0x51, 0x4b, 0x28, 0x0b, 0xac, 0x6b, 0x1c, 0xb2, + 0xc3, 0xa5, 0xa8, 0xcd, 0x6e, 0x72, 0xc3, 0x28, 0xe4, 0x9b, 0xb8, 0x0a, + 0x38, 0x75, 0xc2, 0x8b, 0xc5, 0x2d, 0x1d, 0x8d, 0xd6, 0x46, 0x53, 0xd5, + 0xed, 0x85, 0xf8, 0x9e, 0xb0, 0x4a, 0x69, 0xb1, 0x98, 0xaa, 0x4b, 0x2a, + 0x9c, 0x7e, 0x87, 0xc5, 0x12, 0x8d, 0xcb, 0x7d, 0x0e, 0x05, 0xd7, 0xa2, + 0xf5, 0x8b, 0x20, 0x8e, 0x2c, 0xce, 0x9d, 0x55, 0x9c, 0x53, 0x98, 0xaf, + 0x14, 0x4f, 0x9f, 0x89, 0x21, 0x80, 0xca, 0x3a, 0x4a, 0xb2, 0x45, 0x93, + 0xae, 0xd0, 0x53, 0x15, 0x42, 0x52, 0xf1, 0x8c, 0xe9, 0x14, 0x85, 0x44, + 0xa5, 0x78, 0x66, 0x4e, 0x14, 0x02, 0x94, 0x62, 0xd3, 0x0b, 0x01, 0x01, + 0x22, 0x8a, 0xcc, 0xd7, 0x8a, 0x3c, 0x96, 0x50, 0x78, 0xdd, 0x0d, 0x96, + 0x45, 0x35, 0xcb, 0xc1, 0x01, 0x2a, 0xda, 0x24, 0xe5, 0x3e, 0x4e, 0xf8, + 0x56, 0xe3, 0x30, 0xd3, 0xe8, 0x0e, 0x9e, 0x10, 0xa0, 0x29, 0x37, 0x2f, + 0x51, 0x31, 0x2f, 0x91, 0x4d, 0x07, 0x2d, 0x99, 0x39, 0x33, 0x0a, 0x41, + 0xf9, 0x6c, 0x33, 0x73, 0x20, 0x87, 0x7c, 0x4a, 0xb3, 0x61, 0x0d, 0xf4, + 0xdc, 0xbc, 0x3e, 0x44, 0x3f, 0x0f, 0x2a, 0xb4, 0x4e, 0x97, 0x82, 0x09, + 0xd1, 0x9c, 0x45, 0x21, 0xc6, 0xe9, 0x7a, 0x75, 0x9c, 0xa6, 0x4c, 0x31, + 0x18, 0x96, 0x82, 0x2e, 0xf6, 0x38, 0x4d, 0x59, 0xe3, 0x52, 0x51, 0x7d, + 0x91, 0x2c, 0x61, 0x36, 0x9a, 0xca, 0xea, 0x38, 0x44, 0xb5, 0x7b, 0xcd, + 0x1e, 0xe3, 0xd1, 0xe1, 0x34, 0x4e, 0xdf, 0x38, 0x31, 0x9c, 0xac, 0xad, + 0x20, 0x15, 0x5d, 0x9e, 0x71, 0x09, 0x0b, 0x84, 0x49, 0xcc, 0xf7, 0x18, + 0xd7, 0x5b, 0xd5, 0x38, 0x05, 0x08, 0xec, 0xb5, 0x99, 0x70, 0x79, 0x70, + 0x56, 0xa2, 0x3e, 0x8a, 0x8a, 0x56, 0xf3, 0x6c, 0xa4, 0x25, 0x60, 0x9d, + 0x99, 0x40, 0xa1, 0x0a, 0x71, 0xa9, 0xb4, 0x0e, 0x03, 0xb6, 0xc6, 0xbc, + 0xb9, 0xeb, 0x8a, 0xe7, 0x45, 0x1b, 0xf7, 0x2a, 0x8d, 0xe2, 0xf4, 0xde, + 0xb9, 0xda, 0x06, 0xeb, 0xbd, 0x60, 0x52, 0x96, 0xbd, 0x11, 0x97, 0x2c, + 0x64, 0x1e, 0x8a, 0xf0, 0x4e, 0x18, 0x75, 0xb4, 0xcb, 0xb4, 0xd6, 0x45, + 0xd2, 0xd5, 0xf8, 0xc6, 0x47, 0x53, 0x00, 0x1d, 0xaf, 0x5e, 0x83, 0xcf, + 0x99, 0x77, 0x5d, 0xde, 0x2c, 0xdd, 0xc8, 0x42, 0x5b, 0x32, 0x33, 0x9f, + 0xed, 0x1a, 0x92, 0xbd, 0x59, 0xa2, 0x1b, 0xdd, 0x30, 0xda, 0xd4, 0xcd, + 0xf9, 0x13, 0xb7, 0x17, 0xe3, 0x31, 0xcd, 0x4b, 0x15, 0xfe, 0x7d, 0x6a, + 0x81, 0xc0, 0x90, 0x3e, 0xe3, 0x6a, 0x78, 0xa5, 0x3e, 0xd5, 0x30, 0xf4, + 0x82, 0x14, 0x83, 0x41, 0x31, 0x18, 0xac, 0x86, 0x64, 0xc3, 0x58, 0x25, + 0xc9, 0x80, 0xdf, 0x1e, 0xad, 0x50, 0xf8, 0xf5, 0xd7, 0x6b, 0x39, 0x21, + 0xc6, 0xf1, 0xfb, 0xb1, 0x17, 0x2a, 0x53, 0x95, 0xc7, 0x49, 0xce, 0x40, + 0x45, 0x49, 0x1d, 0x63, 0x50, 0x52, 0xde, 0x01, 0xe6, 0xed, 0x97, 0x29, + 0xa9, 0xc9, 0x97, 0x2b, 0x06, 0xff, 0x58, 0x45, 0xb9, 0x79, 0xac, 0x92, + 0x7a, 0x1f, 0x08, 0x7a, 0x62, 0x82, 0x92, 0xbc, 0xe0, 0x4a, 0x45, 0x59, + 0x7b, 0xa5, 0x62, 0x38, 0x96, 0xa9, 0x28, 0x67, 0x32, 0x95, 0x94, 0xd5, + 0x93, 0x14, 0xa5, 0x60, 0x8a, 0x92, 0x74, 0xfb, 0x14, 0xc5, 0x50, 0x97, + 0xa5, 0x28, 0x77, 0x66, 0x29, 0xc9, 0xdd, 0x10, 0xbe, 0x0a, 0xe1, 0x69, + 0xfc, 0xfd, 0xda, 0x6c, 0x25, 0xc9, 0x92, 0xad, 0x28, 0xd7, 0xe4, 0x2a, + 0xc9, 0x1d, 0xb9, 0x4a, 0xea, 0xc3, 0xb9, 0x8a, 0xf2, 0x4e, 0xae, 0x92, + 0x32, 0x7a, 0xba, 0x92, 0x64, 0x9b, 0xa1, 0x18, 0x8e, 0xe7, 0x2b, 0xc9, + 0xf3, 0x0b, 0x94, 0x94, 0xe3, 0x85, 0x8a, 0x72, 0xc9, 0x1c, 0x25, 0xe9, + 0xa6, 0x39, 0x8a, 0x21, 0x69, 0xae, 0x92, 0x52, 0x39, 0x57, 0x31, 0x3c, + 0x37, 0x57, 0x51, 0x5e, 0x9e, 0x0b, 0xfc, 0x45, 0x8a, 0xe1, 0x8e, 0xab, + 0x94, 0xa4, 0x85, 0xc5, 0x8a, 0xf2, 0x6c, 0xb1, 0x92, 0x7c, 0xb2, 0x38, + 0xe6, 0xf3, 0xb4, 0xff, 0x63, 0xfe, 0xee, 0xa0, 0xef, 0xdd, 0xdf, 0x26, + 0xbe, 0x7b, 0x5f, 0xcf, 0xc3, 0x05, 0x14, 0xfe, 0x71, 0x19, 0x0f, 0x77, + 0x53, 0xf8, 0x14, 0x85, 0x2f, 0x52, 0xf8, 0x06, 0x85, 0x87, 0x28, 0xfc, + 0x84, 0xc2, 0x2a, 0xe2, 0x5f, 0x4e, 0xa1, 0x9d, 0x42, 0x37, 0x85, 0x6d, + 0x14, 0xde, 0x4a, 0xe1, 0x0f, 0x28, 0xbc, 0x8b, 0xc2, 0xed, 0x14, 0xfe, + 0x8e, 0xc2, 0x87, 0x28, 0xfc, 0x92, 0xe4, 0x9f, 0xa1, 0x30, 0x8d, 0xca, + 0x3d, 0x8c, 0xc2, 0x4b, 0x29, 0x7c, 0x92, 0xe8, 0x7b, 0x28, 0xbc, 0x92, + 0xd2, 0x73, 0x28, 0x2c, 0xa4, 0xf0, 0x55, 0xc2, 0xbf, 0x43, 0xe1, 0x47, + 0x14, 0x9e, 0xa0, 0xf0, 0x1b, 0x0a, 0x53, 0x28, 0xbf, 0xc1, 0x14, 0x8e, + 0xa2, 0x70, 0x1c, 0x85, 0x53, 0x29, 0x9c, 0x45, 0x61, 0x31, 0x85, 0xd7, + 0x50, 0x58, 0x4b, 0xe1, 0x75, 0x14, 0x36, 0x53, 0xe8, 0xa5, 0xf0, 0x46, + 0x0a, 0xbf, 0x47, 0x61, 0x29, 0x95, 0x6f, 0x2b, 0xc1, 0xf7, 0x50, 0xb8, + 0x88, 0xd2, 0xeb, 0x29, 0x6c, 0xa0, 0xf0, 0x7e, 0xc2, 0xbb, 0x08, 0x5e, + 0x47, 0x61, 0x3b, 0x85, 0xe2, 0x7b, 0xeb, 0x3d, 0xb7, 0xea, 0xbf, 0x7f, + 0xdc, 0xd3, 0x9f, 0x87, 0xdb, 0x89, 0x6e, 0xac, 0xa4, 0x1f, 0x02, 0xff, + 0x14, 0xe1, 0x2f, 0x4b, 0x80, 0x7f, 0x7f, 0xb9, 0xf8, 0x62, 0x70, 0x7c, + 0xfc, 0x87, 0x84, 0xef, 0x97, 0x00, 0xff, 0x89, 0xe8, 0xc7, 0x04, 0xf8, + 0xd3, 0x67, 0xc1, 0x0f, 0x59, 0xc1, 0xf1, 0x17, 0x27, 0xc0, 0xcf, 0xb1, + 0x73, 0x7c, 0x6a, 0x02, 0xbc, 0xc9, 0x1e, 0xfb, 0x3d, 0x6b, 0x2d, 0xfe, + 0x1a, 0xbb, 0xfe, 0x7b, 0xe1, 0x32, 0x7e, 0x05, 0xe1, 0xdd, 0x09, 0xf0, + 0xcf, 0x9f, 0x45, 0xfe, 0x6b, 0x84, 0xef, 0x9f, 0x00, 0xff, 0xb6, 0xbd, + 0xf7, 0xf6, 0xfb, 0x80, 0xf0, 0x29, 0x09, 0xf0, 0x1f, 0x9f, 0xa5, 0xfe, + 0xff, 0x3a, 0x4b, 0xf9, 0x4e, 0x9e, 0x05, 0x1f, 0x39, 0x8b, 0x7c, 0xfc, + 0xa1, 0xb0, 0xde, 0xea, 0x37, 0xe8, 0x2c, 0xf8, 0x8c, 0xb3, 0xe0, 0xc7, + 0x9c, 0x05, 0x3f, 0x81, 0xf0, 0x17, 0x26, 0xc0, 0x4f, 0x77, 0xf4, 0xde, + 0x7e, 0xb3, 0x09, 0x3f, 0x2a, 0x01, 0xbe, 0x8a, 0xf0, 0x03, 0x13, 0xe0, + 0x57, 0x10, 0x7e, 0x40, 0x02, 0xbc, 0xc3, 0xd1, 0x7b, 0xfb, 0xad, 0x71, + 0xf4, 0xde, 0xfe, 0x7e, 0xc2, 0xcb, 0xdf, 0x74, 0x17, 0xf8, 0x36, 0x47, + 0xef, 0xe3, 0x73, 0x23, 0xe1, 0x07, 0x27, 0xc0, 0x07, 0x09, 0x7f, 0x51, + 0x02, 0xfc, 0xaf, 0xce, 0xd2, 0xfe, 0xff, 0x49, 0xf8, 0x11, 0x09, 0xf0, + 0x4f, 0x9e, 0xa5, 0xfc, 0x49, 0x8d, 0xbd, 0x97, 0x6f, 0x28, 0xe1, 0x2f, + 0x4d, 0x80, 0xcf, 0x22, 0xfc, 0xa0, 0x04, 0xf8, 0xb9, 0x67, 0xc1, 0x5f, + 0x73, 0x16, 0x7c, 0xfd, 0x59, 0xf0, 0x8d, 0x67, 0xc1, 0xfb, 0xcf, 0x82, + 0xbf, 0xf5, 0x2c, 0xf8, 0xad, 0x84, 0x2f, 0x4d, 0x80, 0x7f, 0xbd, 0xb1, + 0xf7, 0xfe, 0xf9, 0x07, 0xe1, 0x93, 0x12, 0xe0, 0x0f, 0x35, 0xea, 0xed, + 0xaf, 0xf9, 0x1e, 0x0e, 0x6f, 0xa3, 0xb0, 0x3e, 0x48, 0x7e, 0x02, 0x85, + 0xdd, 0x94, 0x6e, 0xfc, 0x19, 0xcd, 0x43, 0x14, 0x1e, 0xa2, 0xb0, 0xf8, + 0xe7, 0x51, 0x5d, 0x2c, 0x56, 0xf8, 0xb8, 0x42, 0xf8, 0xe3, 0xeb, 0x79, + 0x98, 0xb5, 0x91, 0x87, 0xa7, 0x46, 0xf0, 0x10, 0xbf, 0x3d, 0xa6, 0xd5, + 0xdd, 0xfc, 0x60, 0xac, 0x2e, 0xc7, 0xfb, 0x2b, 0xa6, 0x50, 0xc8, 0x9f, + 0xbb, 0x86, 0xe6, 0x69, 0x92, 0xdf, 0x9a, 0xc1, 0xc3, 0x4e, 0x49, 0xfe, + 0xb6, 0xff, 0xa6, 0xfc, 0x83, 0xad, 0x3c, 0x34, 0x91, 0xfc, 0x0b, 0x46, + 0x46, 0xed, 0xc6, 0x70, 0xb8, 0x3e, 0x25, 0x7c, 0xf9, 0x46, 0xbd, 0xfc, + 0x34, 0x2a, 0x57, 0xad, 0x94, 0x7e, 0xaa, 0x55, 0xdf, 0x1e, 0xe2, 0xef, + 0x34, 0xa5, 0xaf, 0x94, 0xd2, 0x07, 0xaf, 0xe5, 0x70, 0x93, 0x94, 0x3e, + 0x99, 0xd2, 0x03, 0x52, 0xfa, 0x12, 0x4a, 0xff, 0x9e, 0x2c, 0x87, 0xca, + 0xf3, 0x43, 0x29, 0x7d, 0xd9, 0xda, 0xf8, 0xe9, 0xd7, 0xaf, 0x8d, 0x5f, + 0xaf, 0x9b, 0x28, 0xfd, 0x6e, 0x29, 0xfd, 0xf6, 0xb5, 0xf1, 0xeb, 0x75, + 0x37, 0xa5, 0xdf, 0x2f, 0xa5, 0xff, 0x2a, 0x01, 0xfd, 0x1f, 0x28, 0xfd, + 0x0f, 0x52, 0xfa, 0xa3, 0x94, 0xbe, 0x4b, 0x4a, 0x7f, 0x32, 0x01, 0xfd, + 0xde, 0xb5, 0xf1, 0xdb, 0xbf, 0xc2, 0x13, 0x3f, 0x5f, 0xd1, 0xdf, 0x2f, + 0x25, 0x28, 0x17, 0xfa, 0x09, 0x38, 0x97, 0x7c, 0x41, 0xe3, 0xe6, 0x14, + 0x85, 0xa7, 0x29, 0x4c, 0x6b, 0xa2, 0xf1, 0x4c, 0xe1, 0x68, 0x0a, 0x27, + 0x4b, 0xb0, 0x68, 0x4f, 0x51, 0x2e, 0x91, 0x8f, 0xe8, 0x77, 0xd1, 0xcf, + 0xa2, 0x5f, 0x45, 0x3f, 0xfe, 0x50, 0x0a, 0xf7, 0x6d, 0xd4, 0xf7, 0x83, + 0x90, 0x73, 0xbf, 0x04, 0x8b, 0x76, 0xd9, 0x25, 0xc1, 0x22, 0xff, 0x77, + 0xa4, 0x50, 0xd4, 0x59, 0x8c, 0x77, 0x6d, 0xfb, 0x4c, 0x84, 0xeb, 0x3d, + 0x6a, 0x9f, 0xe3, 0x52, 0xfb, 0x7c, 0x4b, 0xe9, 0x5f, 0x4b, 0xe9, 0x43, + 0xbd, 0x64, 0xa7, 0x6e, 0xd0, 0xa7, 0x4f, 0xf4, 0xc6, 0xa7, 0xbf, 0x2a, + 0x01, 0x7d, 0xbd, 0x37, 0xbe, 0x3e, 0xde, 0x90, 0x20, 0x7d, 0x5b, 0x02, + 0x39, 0x8f, 0x24, 0x48, 0x7f, 0x89, 0xd2, 0x33, 0xa4, 0xf4, 0x64, 0x5f, + 0x7c, 0xf9, 0x33, 0x29, 0x7d, 0x92, 0x44, 0xef, 0xf0, 0xe9, 0xed, 0x91, + 0xf8, 0xdb, 0x48, 0xe9, 0xb3, 0x25, 0xfa, 0x6d, 0xbe, 0xf8, 0xed, 0xf0, + 0x46, 0x82, 0xf4, 0x11, 0xfe, 0x04, 0xed, 0x96, 0x20, 0xdd, 0x91, 0x20, + 0x3d, 0xe4, 0x8f, 0xdf, 0x0e, 0x8f, 0x52, 0x7a, 0x99, 0x94, 0x7e, 0x9c, + 0xd2, 0x97, 0xca, 0xfd, 0x18, 0x88, 0x2f, 0xff, 0x9a, 0x04, 0xe9, 0x37, + 0x51, 0x7a, 0xb3, 0x24, 0xe7, 0x17, 0x09, 0xd2, 0x9f, 0x48, 0x90, 0xfe, + 0x6a, 0x82, 0xf4, 0x8f, 0x12, 0xa4, 0x9f, 0x4e, 0x90, 0x3e, 0x7c, 0x5d, + 0xfc, 0xf4, 0x9c, 0x04, 0xe9, 0x15, 0x09, 0xd2, 0x9d, 0x09, 0xd2, 0x3b, + 0x13, 0xa4, 0xff, 0x3c, 0x41, 0xfa, 0x7f, 0x25, 0x48, 0x7f, 0x31, 0x41, + 0xfa, 0xe7, 0x09, 0xd2, 0x7d, 0x04, 0x77, 0x51, 0xf8, 0xe7, 0x04, 0xf0, + 0x5b, 0x52, 0xf8, 0xa5, 0x84, 0xbf, 0xf0, 0x46, 0x3d, 0x7e, 0x01, 0xc1, + 0x36, 0x0a, 0x3b, 0x29, 0x7c, 0x88, 0xc2, 0xbf, 0x53, 0x18, 0xa1, 0x70, + 0xf2, 0x26, 0x7d, 0x28, 0xe4, 0x56, 0x11, 0xbc, 0x95, 0xc2, 0xbd, 0x14, + 0x9e, 0xa0, 0xf0, 0xb2, 0x9b, 0xfe, 0xcf, 0x84, 0xbd, 0xd9, 0x3f, 0xf4, + 0x65, 0x47, 0xae, 0x8f, 0xaf, 0xd7, 0x65, 0x09, 0xd2, 0x03, 0xeb, 0xe3, + 0x8f, 0xb3, 0x02, 0xca, 0x4f, 0x84, 0x01, 0x0a, 0x85, 0xbf, 0x26, 0xfb, + 0x59, 0xe2, 0xef, 0xc7, 0x70, 0x65, 0xd2, 0xa5, 0xfd, 0xbb, 0x87, 0xfc, + 0x9d, 0x53, 0xe4, 0xe7, 0xb4, 0xde, 0xae, 0xe7, 0x93, 0xff, 0xb0, 0x3e, + 0xe8, 0x7b, 0x0e, 0x75, 0x71, 0x3a, 0xe1, 0xdf, 0x3c, 0x4f, 0xfe, 0xcd, + 0x58, 0x29, 0xfd, 0xb9, 0x8b, 0x78, 0x28, 0x8f, 0xd3, 0x67, 0x46, 0xf1, + 0xb0, 0xce, 0xad, 0xb7, 0x7b, 0x27, 0xc7, 0xf1, 0xf0, 0x3f, 0xd6, 0xeb, + 0xed, 0xde, 0xc7, 0x57, 0xf0, 0xf0, 0xfa, 0x16, 0x1e, 0x3e, 0x48, 0xf5, + 0x7e, 0x74, 0x3c, 0x0f, 0xdf, 0x74, 0xe9, 0xe5, 0xff, 0x30, 0x93, 0x87, + 0x8f, 0x49, 0xe9, 0x77, 0x4d, 0xe1, 0xe1, 0x2b, 0x6b, 0xf4, 0xe9, 0xbf, + 0xc8, 0xe1, 0xe1, 0x13, 0x34, 0xcf, 0x0b, 0xbb, 0xfd, 0xc3, 0x19, 0x3c, + 0x7c, 0x43, 0x4a, 0xff, 0x8c, 0xd2, 0xe5, 0x7e, 0x6a, 0x98, 0xc5, 0x43, + 0xb9, 0xbf, 0x5b, 0x28, 0xfd, 0x7f, 0x97, 0x3f, 0xb0, 0x55, 0xe1, 0x6b, + 0x40, 0x79, 0x1d, 0x28, 0xfa, 0xf3, 0xe0, 0xed, 0xbd, 0xf7, 0xe7, 0xa8, + 0x3b, 0x78, 0xfa, 0xf0, 0x04, 0x7a, 0xf1, 0x11, 0xc9, 0xc9, 0xbf, 0xb3, + 0x77, 0x7d, 0x10, 0x7f, 0xf2, 0x7e, 0x8c, 0x2c, 0xa7, 0xaf, 0x7f, 0xc2, + 0x9f, 0x7a, 0x83, 0xda, 0xaf, 0x87, 0xfa, 0xf9, 0xc7, 0xd4, 0x7e, 0x88, + 0x47, 0x5d, 0x7f, 0x9f, 0xf0, 0x2f, 0xde, 0xa4, 0x97, 0xff, 0x2d, 0xa5, + 0xbf, 0x29, 0xa5, 0x0b, 0x3a, 0x91, 0x2e, 0xe4, 0xc8, 0xeb, 0x00, 0xf1, + 0x97, 0xd6, 0x12, 0x7f, 0x5c, 0x0a, 0x3a, 0x91, 0xfe, 0x0e, 0xad, 0x53, + 0xc4, 0x7a, 0xe5, 0x1b, 0x0a, 0x85, 0x1f, 0x2f, 0xfc, 0xe7, 0x31, 0x14, + 0x66, 0x52, 0x58, 0x47, 0xe1, 0xf5, 0x14, 0xfe, 0x88, 0xc2, 0x5f, 0x51, + 0xf8, 0x04, 0x85, 0x3d, 0x14, 0x8a, 0x72, 0x0a, 0xbd, 0x3d, 0x46, 0xe1, + 0x29, 0x0a, 0x93, 0x48, 0xcf, 0xc5, 0xb8, 0x14, 0xe3, 0x30, 0x8b, 0xc2, + 0xab, 0x28, 0xac, 0xa6, 0xd0, 0x42, 0xe1, 0x0d, 0x14, 0xfe, 0x88, 0xc2, + 0x7b, 0x29, 0xbc, 0xcf, 0xa5, 0x1f, 0x3f, 0x62, 0x7c, 0x9d, 0xa4, 0xf0, + 0x34, 0x85, 0xa2, 0x9d, 0x26, 0x50, 0x38, 0x93, 0xc2, 0x39, 0x14, 0x16, + 0x53, 0x78, 0x0d, 0x85, 0xcb, 0x5b, 0xf4, 0xe3, 0xf8, 0x3f, 0x28, 0xdc, + 0x4d, 0xe1, 0xcb, 0x14, 0x86, 0x29, 0x1c, 0x4d, 0xf6, 0x61, 0x0c, 0x85, + 0x13, 0x29, 0x9c, 0x49, 0xa1, 0xd9, 0xad, 0xb7, 0x23, 0x8d, 0x14, 0xae, + 0xa7, 0xf0, 0x7b, 0x14, 0xfe, 0x94, 0xc2, 0x07, 0x28, 0x7c, 0x98, 0xc2, + 0x03, 0x14, 0xbe, 0x4f, 0xe1, 0x57, 0x14, 0x0e, 0xa6, 0xf1, 0x5e, 0x40, + 0xa1, 0xf0, 0xff, 0xeb, 0x29, 0x0c, 0x50, 0x78, 0x03, 0x85, 0xb7, 0x50, + 0x78, 0x1b, 0x85, 0xf7, 0x50, 0xb8, 0x83, 0xc2, 0x47, 0x3c, 0x7a, 0xfb, + 0x22, 0xec, 0xc9, 0x51, 0x0a, 0xbf, 0xa4, 0x30, 0x83, 0xd6, 0x73, 0x97, + 0x51, 0x78, 0x05, 0x85, 0xf9, 0x14, 0x5e, 0x4d, 0xa1, 0x85, 0xc2, 0x16, + 0x0a, 0xdb, 0x29, 0xbc, 0x9d, 0xc2, 0xbb, 0x29, 0xfc, 0x05, 0x85, 0x3b, + 0x28, 0xdc, 0x4d, 0xe1, 0xb3, 0x14, 0x3e, 0x43, 0xe3, 0xe5, 0x6d, 0x0a, + 0xc5, 0xb8, 0x12, 0xe3, 0x68, 0x74, 0x1b, 0xe9, 0x2d, 0x85, 0xe5, 0x14, + 0xae, 0xa4, 0xd0, 0x4d, 0xa1, 0x58, 0xc7, 0x89, 0x75, 0x9b, 0x58, 0xa7, + 0xdd, 0x4a, 0xf8, 0xef, 0x53, 0xb8, 0x8d, 0xc2, 0x5d, 0x14, 0xbe, 0x40, + 0xe1, 0x41, 0x0a, 0xc5, 0x3a, 0xf7, 0x73, 0x82, 0x4f, 0x53, 0x38, 0x5a, + 0xd8, 0x23, 0x0a, 0x97, 0x52, 0xe8, 0xa0, 0x30, 0xde, 0x7e, 0xc2, 0xff, + 0xe4, 0xbf, 0xad, 0x64, 0xb7, 0x8d, 0xf7, 0xf4, 0x5e, 0x9f, 0xd5, 0x64, + 0xc7, 0x5b, 0xa5, 0x7d, 0x18, 0xf9, 0xef, 0x01, 0x89, 0x2e, 0xd1, 0xdf, + 0x89, 0x3b, 0xf4, 0xf8, 0xc7, 0x25, 0xfb, 0x3d, 0xea, 0x36, 0x3d, 0x1c, + 0x0e, 0xe9, 0xe1, 0xb4, 0x1f, 0x70, 0x78, 0x35, 0xc1, 0x55, 0x3f, 0xe8, + 0x3d, 0xbf, 0xdf, 0x92, 0xfc, 0x13, 0x09, 0xe8, 0xd2, 0xba, 0xe2, 0xa7, + 0x0b, 0xf9, 0xbb, 0xb7, 0xf6, 0x2e, 0xff, 0x19, 0x21, 0xff, 0xc7, 0x09, + 0xe4, 0x27, 0x98, 0x1f, 0x85, 0xfc, 0xfa, 0xb3, 0xf8, 0x43, 0x9f, 0x4b, + 0xed, 0x53, 0xdf, 0xc7, 0xf9, 0x52, 0xc8, 0xdf, 0x7a, 0x16, 0xfa, 0xa1, + 0xd2, 0xfc, 0xb3, 0xfd, 0x1c, 0xe5, 0x1f, 0x4c, 0x40, 0xff, 0x1f, 0xbf, + 0xff, 0xdd, 0xf4, 0x3e, 0x88, 0x39, 0xff, 0x77, 0xfe, 0xef, 0xfc, 0xdf, + 0x7f, 0xe3, 0x6f, 0xe8, 0xb8, 0x9d, 0x86, 0xd5, 0xf3, 0xe6, 0xb7, 0xe7, + 0x8e, 0x6a, 0x4d, 0x5b, 0x36, 0xbf, 0xd6, 0xd4, 0x9a, 0x83, 0x57, 0x8d, + 0xa9, 0xba, 0x2f, 0xff, 0xe6, 0x57, 0xcf, 0x5f, 0x7d, 0xa9, 0xa9, 0x75, + 0x48, 0x9f, 0x88, 0xfb, 0xfc, 0x6f, 0xf5, 0x44, 0x55, 0x24, 0x94, 0xa3, + 0xb4, 0xa6, 0x14, 0x12, 0xea, 0x4b, 0x6a, 0xe6, 0xb7, 0x8e, 0xaa, 0xbe, + 0x5a, 0x5f, 0xb4, 0xd5, 0x81, 0x9c, 0x6e, 0x43, 0x35, 0xa0, 0xaa, 0x4b, + 0xda, 0x53, 0xd3, 0x00, 0x0f, 0x34, 0xe2, 0xde, 0x9a, 0xd6, 0x9a, 0xc9, + 0xef, 0x4b, 0x58, 0x3d, 0x8b, 0x2d, 0x8b, 0xe7, 0x5f, 0x53, 0x62, 0x29, + 0xa9, 0x30, 0xd5, 0xd4, 0x58, 0xc6, 0x5b, 0x6a, 0xe6, 0x6b, 0x8e, 0xbf, + 0x28, 0x4b, 0xbc, 0xa7, 0x66, 0x6c, 0x1d, 0x5e, 0x6c, 0x89, 0x3d, 0x72, + 0x42, 0x6f, 0x0e, 0xa8, 0xef, 0x9e, 0x28, 0xed, 0xdb, 0x5e, 0x8c, 0xf0, + 0x3f, 0xc3, 0x56, 0x49, 0xa6, 0xfa, 0x42, 0x68, 0x7b, 0xf7, 0xb0, 0xed, + 0xdb, 0x8c, 0xb1, 0xe8, 0x05, 0xea, 0x9b, 0x14, 0x4a, 0x7b, 0x4e, 0x2c, + 0x7a, 0x11, 0x7b, 0x29, 0x46, 0x69, 0x1f, 0x12, 0x8b, 0xaa, 0xc2, 0x17, + 0x31, 0xda, 0x33, 0xe3, 0x20, 0x34, 0xef, 0x74, 0xb5, 0x6f, 0x8b, 0x24, + 0x2e, 0x1a, 0xbd, 0x27, 0xd6, 0x7e, 0xa8, 0x17, 0x9a, 0x5a, 0xab, 0x6f, + 0x8d, 0xd2, 0xde, 0x16, 0x8b, 0x90, 0x5b, 0x45, 0x69, 0xdf, 0xdf, 0x8b, + 0x98, 0x04, 0xaf, 0xe5, 0x6c, 0x1d, 0x11, 0x43, 0x49, 0xe7, 0x17, 0xdb, + 0x57, 0x0b, 0x21, 0x95, 0x65, 0xb5, 0xa6, 0x58, 0x74, 0x4f, 0x34, 0x33, + 0x20, 0xe4, 0x6f, 0x0f, 0x3a, 0x5a, 0x5a, 0xfd, 0x1b, 0x2c, 0x36, 0xfc, + 0x41, 0x05, 0xa5, 0x3b, 0xd9, 0x28, 0xa5, 0xaf, 0xe3, 0xbf, 0xe6, 0xd3, + 0x7e, 0x50, 0xe5, 0x7c, 0x08, 0x28, 0xf4, 0xef, 0x25, 0xb6, 0x9f, 0x7a, + 0x5e, 0x53, 0x87, 0x04, 0x2f, 0x50, 0xb6, 0xa7, 0x6d, 0x35, 0x25, 0x7e, + 0x2b, 0x57, 0xf0, 0x25, 0x78, 0x95, 0x51, 0xa0, 0xd5, 0xf7, 0x2c, 0x35, + 0x09, 0xd1, 0x37, 0x2d, 0x35, 0x89, 0xea, 0x2b, 0x94, 0x9a, 0x34, 0xfd, + 0xfb, 0x97, 0x02, 0xa1, 0x7d, 0x03, 0x53, 0xa4, 0xb5, 0xf8, 0x9a, 0xf0, + 0xe7, 0x15, 0x14, 0x51, 0x62, 0xfd, 0x2b, 0xa2, 0x82, 0x4a, 0xbc, 0x4c, + 0x12, 0x85, 0xd9, 0xfb, 0x26, 0x1c, 0x8c, 0xf7, 0xae, 0x28, 0x60, 0x62, + 0xde, 0xe0, 0xdc, 0x9a, 0x01, 0xed, 0x4d, 0x63, 0xa3, 0x3a, 0xe0, 0x76, + 0x54, 0x40, 0xb3, 0x61, 0x7b, 0xe3, 0x57, 0x9c, 0xd5, 0x26, 0xb5, 0x58, + 0x7c, 0x7e, 0xab, 0x6d, 0x8d, 0xc5, 0xd6, 0xbc, 0xc6, 0xd2, 0x14, 0xb0, + 0x7a, 0xa1, 0x64, 0xc5, 0xf6, 0x0d, 0x2e, 0x3b, 0x24, 0x07, 0x1a, 0x2c, + 0x0d, 0x4e, 0xf6, 0xb3, 0x4c, 0x5a, 0x4d, 0x1a, 0x89, 0x23, 0x50, 0x33, + 0x2e, 0xf9, 0x51, 0x77, 0x59, 0x9d, 0x16, 0x82, 0x2f, 0x0d, 0xdd, 0x12, + 0xa3, 0x4c, 0xbc, 0xcd, 0xdb, 0xbb, 0x67, 0xc4, 0xa2, 0xa2, 0x6f, 0x2c, + 0x6a, 0x75, 0xe9, 0xa2, 0x18, 0x3a, 0xfe, 0xa6, 0x74, 0x54, 0x1d, 0xa3, + 0x18, 0xf6, 0x02, 0x52, 0xaf, 0x03, 0x4c, 0xf3, 0xa2, 0x74, 0xaf, 0x83, + 0x4c, 0xf7, 0x52, 0x76, 0x7b, 0x55, 0x42, 0x02, 0x9e, 0x63, 0x1c, 0x2b, + 0x12, 0xfb, 0x62, 0x76, 0xfb, 0xf6, 0xde, 0x46, 0x63, 0x75, 0x85, 0x12, + 0x7f, 0x8c, 0xaa, 0x6f, 0x45, 0xb5, 0x9f, 0x78, 0x4f, 0xf0, 0x6f, 0xef, + 0xb9, 0x9c, 0xf5, 0x5c, 0xc9, 0x02, 0xfd, 0x1b, 0xcb, 0x4c, 0x8f, 0xaa, + 0xc5, 0x4f, 0xe7, 0x28, 0xed, 0x5b, 0x5f, 0x15, 0x1c, 0xdd, 0xb9, 0xa3, + 0x80, 0x63, 0x0d, 0x32, 0x78, 0x1d, 0x0b, 0xd0, 0x4e, 0xb2, 0x5e, 0xa2, + 0x57, 0x46, 0x85, 0x4d, 0x0b, 0x1f, 0x57, 0x4b, 0xc8, 0xe6, 0x1d, 0xef, + 0x4e, 0x03, 0x34, 0x7f, 0xc9, 0x02, 0x2e, 0xfd, 0x6a, 0xf5, 0xb0, 0x75, + 0x95, 0x1f, 0x34, 0x55, 0xf1, 0xee, 0x36, 0xc8, 0xba, 0x50, 0xc9, 0x94, + 0x54, 0xf1, 0x76, 0x1b, 0x98, 0x9d, 0xae, 0xf0, 0x34, 0x21, 0xd4, 0x63, + 0x88, 0x5a, 0x6d, 0xa6, 0x97, 0x8a, 0x77, 0xbf, 0x01, 0x75, 0x93, 0xbd, + 0x59, 0xce, 0xdf, 0x3e, 0x87, 0xb4, 0x83, 0x2c, 0x4d, 0xa3, 0x8e, 0x8d, + 0x56, 0xa7, 0x0b, 0x11, 0x87, 0x18, 0x82, 0x29, 0xa5, 0x78, 0xf5, 0xd6, + 0xd2, 0x08, 0x4a, 0x67, 0x69, 0xf4, 0x78, 0x2d, 0x56, 0xbb, 0xdd, 0xe2, + 0xe4, 0x03, 0x59, 0xf1, 0x86, 0x91, 0xd2, 0xda, 0xe0, 0xf1, 0xfa, 0x11, + 0x3a, 0xc1, 0x20, 0x1f, 0x7b, 0xc7, 0xa8, 0x11, 0x13, 0x4e, 0x61, 0x42, + 0xc3, 0x46, 0x87, 0xd7, 0x83, 0x50, 0x7b, 0x12, 0x40, 0x36, 0xfe, 0xfa, + 0x2a, 0x80, 0x5b, 0x92, 0x46, 0x08, 0xe3, 0x03, 0x32, 0x61, 0xe4, 0x37, + 0x7b, 0xec, 0x98, 0xbe, 0x35, 0x69, 0x84, 0x29, 0x9a, 0x0e, 0x83, 0xbf, + 0xd5, 0xe1, 0xf5, 0xb3, 0x02, 0x6f, 0xd3, 0x71, 0x44, 0xcd, 0x82, 0xe2, + 0xdd, 0x1e, 0xc5, 0x34, 0x45, 0xdf, 0xc3, 0x8f, 0xca, 0x7c, 0x20, 0x2e, + 0xbe, 0x06, 0x8f, 0xbb, 0x03, 0x76, 0x67, 0x5c, 0xac, 0xfa, 0x16, 0x3f, + 0xb6, 0xbc, 0x9e, 0x02, 0x2c, 0x40, 0x85, 0x75, 0x83, 0x27, 0xc0, 0x6a, + 0xdd, 0xad, 0xc3, 0xd5, 0x44, 0xdf, 0x3b, 0xc3, 0x9e, 0x88, 0xe2, 0xf0, + 0xd5, 0x37, 0xd5, 0xb8, 0x41, 0x87, 0x44, 0x31, 0xf4, 0x16, 0x41, 0xb4, + 0xb4, 0x07, 0xb5, 0x38, 0xf9, 0x5d, 0x38, 0xd6, 0x41, 0xd8, 0x92, 0x0e, + 0x7c, 0xc7, 0x0f, 0xfb, 0x00, 0x81, 0x46, 0xaf, 0x83, 0x15, 0xf4, 0x04, + 0x02, 0xf8, 0x02, 0x9c, 0xc5, 0x06, 0x86, 0xce, 0xcf, 0xd2, 0x4e, 0xa9, + 0x69, 0x3e, 0x87, 0xd5, 0x6b, 0x6b, 0x66, 0x7d, 0x91, 0x0c, 0x69, 0x4e, + 0x9f, 0xd5, 0xcf, 0x5b, 0x76, 0x4b, 0x32, 0xe4, 0xe8, 0x84, 0x6a, 0x45, + 0x6d, 0x19, 0x74, 0x84, 0x36, 0x71, 0x71, 0x63, 0xa3, 0xcf, 0xc1, 0xf2, + 0xdb, 0x86, 0xac, 0x2d, 0x6a, 0x37, 0x6e, 0x67, 0xa0, 0xa3, 0xc5, 0xd6, + 0xd2, 0xca, 0x5a, 0x5a, 0x80, 0x5c, 0xc7, 0x76, 0xa2, 0x8c, 0x16, 0x56, + 0x33, 0x28, 0xb0, 0x8d, 0xbd, 0x57, 0x52, 0x8e, 0x3f, 0xe6, 0x82, 0xef, + 0x68, 0xd0, 0xfb, 0xa5, 0xd8, 0xbe, 0x1a, 0x32, 0x7c, 0x91, 0x56, 0x47, + 0xc1, 0x1a, 0x19, 0x09, 0x12, 0xfd, 0xda, 0x03, 0x36, 0x74, 0x42, 0x3c, + 0x9b, 0x91, 0xa0, 0xbd, 0xe3, 0x11, 0x68, 0x7f, 0xd3, 0x00, 0xdb, 0x5d, + 0xa5, 0xb1, 0xe1, 0x30, 0xf7, 0x06, 0x6c, 0xaa, 0x32, 0xb0, 0x56, 0x57, + 0xd1, 0x0e, 0xf1, 0x2a, 0x2c, 0x8c, 0xc0, 0x40, 0xb4, 0x90, 0x61, 0x95, + 0x20, 0x3a, 0xb7, 0x41, 0x97, 0x68, 0x53, 0x75, 0x3a, 0x70, 0x4a, 0x8b, + 0xd1, 0xaa, 0x73, 0x7b, 0xca, 0x88, 0x84, 0x53, 0x1d, 0x74, 0x96, 0x8a, + 0x8d, 0xbe, 0xb5, 0xa1, 0x99, 0xd1, 0xa0, 0xe3, 0x54, 0x02, 0xdd, 0x84, + 0x08, 0x5d, 0xa7, 0x22, 0xc4, 0xb8, 0xd6, 0xf1, 0x6d, 0xd7, 0xa0, 0xe5, + 0x9f, 0x95, 0xc0, 0xae, 0x4d, 0x8c, 0xb6, 0x4b, 0x2d, 0xb9, 0x93, 0x48, + 0x69, 0xe6, 0x54, 0x0b, 0xb0, 0x5b, 0x9f, 0xce, 0x7e, 0x14, 0x03, 0x7b, + 0x57, 0x93, 0xec, 0x8b, 0x26, 0xf7, 0xa4, 0x64, 0xe0, 0x2c, 0x2b, 0xac, + 0xc9, 0xfe, 0x14, 0x30, 0x0c, 0xad, 0x64, 0x0f, 0x98, 0x15, 0x33, 0xf9, + 0xc1, 0x3c, 0x36, 0x04, 0xfc, 0x8e, 0x0a, 0xfc, 0x39, 0x1b, 0xec, 0x41, + 0x14, 0xa4, 0x9d, 0x97, 0xf9, 0xa0, 0xd2, 0xbe, 0xfc, 0x89, 0x1d, 0xc9, + 0xe4, 0xfa, 0x9b, 0xd1, 0x15, 0xb0, 0xb4, 0x00, 0x7b, 0x9b, 0x85, 0xfd, + 0xe4, 0x06, 0x76, 0x61, 0x2c, 0x2a, 0xe0, 0x16, 0xc8, 0x13, 0x0c, 0x19, + 0xf0, 0xf3, 0xce, 0xc3, 0xac, 0x7c, 0x0e, 0x96, 0x4b, 0x9d, 0x93, 0x8d, + 0xdb, 0xf6, 0x54, 0xc0, 0x83, 0xde, 0xd0, 0x50, 0xd8, 0x42, 0xa0, 0xcb, + 0xc1, 0x72, 0xdd, 0x4a, 0xa0, 0x9b, 0xa3, 0xd9, 0x9f, 0xc1, 0x62, 0x69, + 0x69, 0xb6, 0xd0, 0x8b, 0xc9, 0x96, 0x66, 0xc8, 0x14, 0xa6, 0x85, 0x8b, + 0xd4, 0xe3, 0x3b, 0xc7, 0x27, 0x0d, 0x6c, 0xfb, 0x99, 0xe1, 0xaf, 0x86, + 0x88, 0xe1, 0x3b, 0xc3, 0x83, 0x23, 0x3e, 0x33, 0xbc, 0x6a, 0x78, 0xbd, + 0xff, 0x96, 0x7e, 0x5b, 0x06, 0x9e, 0x48, 0xb5, 0x7d, 0x96, 0x72, 0xc1, + 0xf8, 0x7b, 0xd2, 0x82, 0x86, 0xd1, 0xc3, 0xbe, 0x4d, 0x19, 0xd6, 0x30, + 0x6c, 0xd8, 0xb0, 0xcc, 0x6f, 0x93, 0x96, 0xed, 0x48, 0xfa, 0x69, 0xf2, + 0xb0, 0x81, 0xc3, 0x86, 0x4d, 0x81, 0x7f, 0x55, 0x47, 0x93, 0x0b, 0x66, + 0x0c, 0x1f, 0x5e, 0x54, 0x5d, 0x5d, 0x5d, 0xeb, 0xfc, 0xcf, 0xa4, 0xb7, + 0xfa, 0xfd, 0xd2, 0x50, 0x5b, 0x07, 0x7f, 0xf5, 0x19, 0xa3, 0x6c, 0x9b, + 0x0d, 0x0b, 0x6f, 0xec, 0xb7, 0xd5, 0xb0, 0x2b, 0xe9, 0x91, 0xe4, 0x00, + 0x7e, 0xf1, 0x74, 0x5a, 0x9a, 0xa2, 0xd8, 0x35, 0xeb, 0x1f, 0x87, 0x04, + 0xbb, 0x00, 0x6e, 0x4c, 0x36, 0x28, 0xbf, 0xff, 0xf2, 0xeb, 0x65, 0xac, + 0xd8, 0x70, 0x65, 0xc1, 0xed, 0x38, 0x9d, 0xeb, 0x39, 0x06, 0xf8, 0xf1, + 0x1a, 0x18, 0xaf, 0xf1, 0x4a, 0xf4, 0x1c, 0x1d, 0xc2, 0x8b, 0x0c, 0x7a, + 0xd8, 0xae, 0xd9, 0xd8, 0x90, 0xf3, 0xff, 0x5c, 0x82, 0xf1, 0xc0, 0x1d, + 0xe6, 0x7f, 0xdb, 0xbf, 0xf5, 0xf9, 0x8b, 0x73, 0x45, 0xdf, 0x1f, 0xc0, + 0xf3, 0x3f, 0x25, 0xe5, 0xdf, 0x26, 0xe5, 0xaf, 0x85, 0x91, 0x5f, 0x9c, + 0x1b, 0x7a, 0x9c, 0xf8, 0x05, 0x2c, 0xf8, 0x7f, 0x26, 0xf1, 0xff, 0x4c, + 0xe2, 0x17, 0xe7, 0x82, 0x4e, 0x13, 0xbf, 0x80, 0x05, 0xff, 0x5f, 0x25, + 0xfe, 0xbf, 0x4a, 0xfc, 0xe2, 0xb9, 0xdb, 0x15, 0x03, 0x39, 0xff, 0xf3, + 0x12, 0x7f, 0x44, 0xe2, 0x8f, 0x48, 0xfc, 0xe2, 0xf9, 0xdc, 0x7c, 0xe2, + 0x17, 0xb0, 0xe0, 0xff, 0x4e, 0xe2, 0xff, 0x4e, 0xe2, 0x17, 0xcf, 0xf1, + 0xae, 0x23, 0x7e, 0x01, 0x0b, 0xfe, 0xdc, 0x81, 0x7a, 0x7e, 0x2d, 0x8c, + 0xfc, 0xe2, 0x79, 0xdf, 0x0f, 0x88, 0x5f, 0xc0, 0x82, 0xff, 0x33, 0x29, + 0xff, 0xcf, 0xa4, 0xfc, 0xc5, 0x73, 0xc1, 0x1d, 0xc4, 0x2f, 0x60, 0xc1, + 0xff, 0xaa, 0xc4, 0xff, 0xaa, 0xc4, 0x2f, 0x9e, 0x1f, 0xfe, 0x9d, 0xf8, + 0x05, 0x2c, 0xf8, 0x5f, 0x4f, 0xd6, 0xf3, 0x6b, 0x61, 0xe4, 0x17, 0xcf, + 0x19, 0x27, 0x5c, 0xc0, 0xf9, 0x05, 0x2c, 0xf8, 0xd3, 0x24, 0xfe, 0x34, + 0x89, 0x5f, 0x3c, 0x8f, 0xac, 0x21, 0x7e, 0x01, 0xab, 0xfc, 0xa9, 0x12, + 0x7f, 0xaa, 0x9e, 0x5f, 0x3c, 0xb7, 0xbc, 0x99, 0xf8, 0x05, 0x2c, 0xf8, + 0x4f, 0x24, 0xe9, 0xf9, 0xb5, 0x30, 0x2b, 0x3f, 0x3d, 0xc7, 0xfc, 0x4f, + 0x51, 0xfe, 0x19, 0x7a, 0x7e, 0x9b, 0xd4, 0x7e, 0x5a, 0x18, 0xf9, 0xc5, + 0x73, 0xd0, 0x57, 0x88, 0xff, 0x33, 0x89, 0x7f, 0xad, 0x94, 0xff, 0x5a, + 0x29, 0x7f, 0xf1, 0xbc, 0xf4, 0xdf, 0xc4, 0x2f, 0x60, 0xc1, 0x7f, 0x81, + 0x94, 0xff, 0x05, 0x52, 0xfe, 0xe2, 0xb9, 0xea, 0xac, 0x0b, 0x39, 0x7f, + 0x8b, 0xc4, 0x3f, 0x5e, 0xe2, 0x17, 0xb0, 0x1f, 0xe8, 0x8d, 0x4a, 0xf4, + 0xef, 0x87, 0x12, 0xbc, 0x43, 0x82, 0x9f, 0x97, 0xe0, 0xc3, 0x12, 0x8c, + 0xf2, 0xb5, 0xf6, 0xe8, 0xdb, 0x0b, 0xf5, 0xf6, 0x67, 0xee, 0x20, 0x3d, + 0x7c, 0xf5, 0x20, 0x6e, 0x8f, 0x3e, 0xfb, 0xfb, 0x16, 0x9d, 0x3d, 0x12, + 0xcf, 0x39, 0xf7, 0x0c, 0xe2, 0xf5, 0xf9, 0xb1, 0x54, 0x9f, 0x8b, 0x53, + 0xf4, 0xf5, 0xd1, 0xc2, 0xc8, 0xff, 0xfb, 0x42, 0x1e, 0x3f, 0x48, 0xfc, + 0x02, 0x16, 0xfc, 0x41, 0xa9, 0x3d, 0xb4, 0x30, 0xf2, 0xcf, 0x9c, 0xc3, + 0xe3, 0x83, 0x06, 0x73, 0x7e, 0x01, 0x0b, 0xfe, 0xd1, 0x12, 0xff, 0x68, + 0x89, 0xbf, 0x92, 0xe8, 0x67, 0x13, 0x7f, 0xa5, 0xc4, 0x3f, 0x4c, 0xe2, + 0x1f, 0x26, 0xf1, 0x5b, 0x88, 0xde, 0x4a, 0xfc, 0x16, 0x89, 0xff, 0x06, + 0x49, 0x9f, 0x6e, 0x90, 0xf4, 0xe9, 0xad, 0x22, 0x1e, 0xbf, 0x83, 0xf8, + 0x05, 0xdc, 0xd7, 0xfc, 0x8f, 0x11, 0xfd, 0x7b, 0xc4, 0x7f, 0x4c, 0xe2, + 0x6f, 0x90, 0xf8, 0x1b, 0x24, 0xfe, 0x45, 0x57, 0xf1, 0xf8, 0xc2, 0x74, + 0xce, 0x2f, 0xe0, 0xbe, 0xe6, 0xbf, 0x9a, 0xe8, 0xff, 0x40, 0xfc, 0xab, + 0xcf, 0x91, 0xdf, 0x4b, 0xf4, 0xc9, 0x43, 0x38, 0xbf, 0xf7, 0x1c, 0xf9, + 0x37, 0x13, 0xfd, 0x06, 0xe2, 0xdf, 0x2c, 0xf1, 0x67, 0x4a, 0xfc, 0x99, + 0x12, 0xff, 0x0e, 0xa2, 0xff, 0x8c, 0xf8, 0x77, 0x48, 0xfc, 0x37, 0x18, + 0xa4, 0xfe, 0x33, 0xe8, 0xf9, 0xf1, 0xe3, 0x17, 0x18, 0xbf, 0x78, 0x28, + 0xe7, 0x17, 0xb0, 0xe0, 0x5f, 0x26, 0xe5, 0xbf, 0x4c, 0xca, 0xbf, 0x9d, + 0xe8, 0xeb, 0x89, 0xbf, 0x5d, 0xe2, 0x9f, 0x2a, 0xe5, 0x3f, 0x55, 0xca, + 0x7f, 0x87, 0x89, 0xc7, 0x7f, 0x42, 0xfc, 0x02, 0x16, 0xfc, 0x3f, 0x95, + 0xf8, 0x7f, 0x2a, 0xf1, 0x97, 0x94, 0xf0, 0xf8, 0x93, 0xc4, 0x2f, 0xe0, + 0xbe, 0xb6, 0x7f, 0x1d, 0xd1, 0x87, 0x89, 0xbf, 0x4e, 0xe2, 0xef, 0xcd, + 0x1f, 0x62, 0xe3, 0x87, 0xe8, 0x2f, 0x1a, 0x46, 0xe3, 0xe7, 0x1c, 0xf3, + 0x5f, 0x4b, 0xf4, 0xf3, 0x89, 0x7f, 0xed, 0x39, 0xf2, 0x77, 0x10, 0xfd, + 0x5a, 0xe2, 0xef, 0x90, 0xf8, 0xa7, 0x48, 0xfc, 0x53, 0x24, 0xfe, 0x3f, + 0x12, 0xfd, 0x6f, 0x89, 0xff, 0x8f, 0xe7, 0x98, 0x7f, 0x37, 0xd1, 0x1f, + 0x22, 0xfe, 0xee, 0x73, 0xcc, 0xff, 0x28, 0xd1, 0x1b, 0x87, 0x73, 0xfe, + 0xa3, 0xe7, 0x98, 0xff, 0x69, 0xa2, 0xb7, 0x12, 0xff, 0x69, 0x89, 0xbf, + 0x4a, 0xe2, 0xaf, 0x92, 0xf8, 0x2b, 0x4b, 0xc9, 0x7e, 0x11, 0xbf, 0x80, + 0x05, 0xff, 0x51, 0x49, 0xff, 0xb4, 0x30, 0xf2, 0xe7, 0x2f, 0xa0, 0xf9, + 0x83, 0xf8, 0x05, 0x2c, 0xf8, 0x0b, 0xa4, 0xfc, 0x0b, 0xa4, 0xfc, 0xd7, + 0x12, 0xfd, 0x98, 0x11, 0xd4, 0xff, 0x12, 0xff, 0x0c, 0x89, 0x7f, 0x86, + 0xc4, 0x7f, 0x3f, 0xd1, 0x5f, 0x4f, 0xfc, 0xf7, 0x4b, 0xfc, 0xc3, 0x25, + 0xfe, 0xe1, 0x12, 0xff, 0x23, 0x44, 0xff, 0x07, 0xe2, 0x7f, 0xe4, 0x1c, + 0xf9, 0x9f, 0x27, 0xfa, 0x33, 0xc4, 0xff, 0xbc, 0xc4, 0x5f, 0x24, 0xf1, + 0x17, 0x49, 0xfc, 0xfd, 0xaf, 0xe6, 0xf1, 0xc5, 0x19, 0x9c, 0x5f, 0xc0, + 0x82, 0xbf, 0x5a, 0xe2, 0xaf, 0x96, 0xf8, 0x97, 0x11, 0xfd, 0xcf, 0x89, + 0x7f, 0xd9, 0x39, 0xf2, 0xff, 0x9e, 0xe8, 0x0f, 0x11, 0xff, 0xef, 0xcf, + 0x91, 0xff, 0x34, 0xd1, 0x4f, 0x18, 0x49, 0xfa, 0x27, 0xf1, 0xd7, 0x4a, + 0xfc, 0xb5, 0x12, 0xff, 0x12, 0x33, 0x8f, 0xb7, 0x12, 0xbf, 0x80, 0x05, + 0xbf, 0x53, 0xe2, 0x77, 0x4a, 0xfc, 0x8f, 0x11, 0xfd, 0xe3, 0xc4, 0xff, + 0x98, 0xc4, 0x3f, 0x49, 0xd2, 0x5f, 0x2d, 0x8c, 0xfc, 0x1f, 0x96, 0xf3, + 0xf8, 0xe8, 0x8b, 0x38, 0xbf, 0x80, 0x05, 0xff, 0x72, 0xc9, 0x9f, 0x5e, + 0x2e, 0xf9, 0xd3, 0x45, 0x95, 0x3c, 0xbe, 0x92, 0xf8, 0x05, 0x2c, 0xf8, + 0x7f, 0x29, 0x95, 0x5f, 0x0b, 0x23, 0xff, 0x3b, 0x44, 0x7f, 0x07, 0xf1, + 0xbf, 0x53, 0x79, 0x6e, 0xed, 0x97, 0xb3, 0x88, 0xc7, 0x9f, 0x23, 0x7e, + 0x01, 0x0b, 0xfe, 0x3a, 0x89, 0xbf, 0x4e, 0xe2, 0xef, 0x24, 0xfa, 0x4f, + 0x88, 0xbf, 0xf3, 0x1c, 0xf9, 0xdf, 0x22, 0xfa, 0xf4, 0x51, 0xe4, 0xff, + 0x9c, 0x23, 0x7f, 0xf6, 0x62, 0x1e, 0xcf, 0x27, 0x7e, 0x01, 0xf7, 0x95, + 0x7f, 0x33, 0xd1, 0xaf, 0x24, 0xfe, 0xcd, 0x12, 0x7f, 0xbd, 0xc4, 0x5f, + 0x2f, 0xf1, 0xbf, 0x43, 0xf4, 0xed, 0xc4, 0xff, 0x8e, 0xc4, 0x9f, 0x21, + 0xf1, 0x67, 0x48, 0xfc, 0x9f, 0x11, 0xfd, 0xef, 0x89, 0xff, 0x33, 0x89, + 0x7f, 0x94, 0xc4, 0x3f, 0x4a, 0xe2, 0xc7, 0x8f, 0xd1, 0x61, 0xfc, 0x0d, + 0xe2, 0x17, 0xb0, 0xe0, 0x3f, 0xdb, 0x7a, 0xc8, 0x45, 0xf4, 0xfd, 0x47, + 0x73, 0x7e, 0x97, 0xc4, 0xbf, 0x59, 0xe2, 0xdf, 0x2c, 0xf1, 0x9f, 0x20, + 0xfa, 0xab, 0x88, 0xff, 0x84, 0xc4, 0xbf, 0x50, 0xe2, 0x5f, 0x28, 0xf1, + 0xcf, 0x59, 0xc2, 0xe3, 0xeb, 0x89, 0x5f, 0xc0, 0x82, 0xff, 0x46, 0x89, + 0xff, 0x46, 0x89, 0xff, 0x11, 0xa2, 0x7f, 0x90, 0xf8, 0x1f, 0x91, 0xf8, + 0xfb, 0x49, 0xfc, 0xfd, 0x24, 0xfe, 0x27, 0x88, 0xfe, 0x30, 0xf1, 0x3f, + 0x21, 0xf1, 0x6f, 0x95, 0xf8, 0xb7, 0x4a, 0xfc, 0x95, 0xd5, 0x3c, 0x3e, + 0xfc, 0x62, 0x9a, 0xff, 0xaa, 0xf5, 0xfc, 0x79, 0x06, 0x3d, 0xbf, 0x16, + 0x46, 0xfe, 0x5b, 0x6b, 0x78, 0x7c, 0x26, 0xf1, 0x0b, 0x58, 0xf0, 0x3f, + 0x22, 0xf1, 0x3f, 0x22, 0xf1, 0x17, 0xd4, 0xf1, 0x78, 0x05, 0xf1, 0x0b, + 0xd8, 0x73, 0x71, 0xb4, 0xaf, 0x14, 0x8d, 0xbc, 0x80, 0x54, 0x1f, 0x2d, + 0xcc, 0xfc, 0x19, 0xe2, 0x3f, 0x41, 0xf2, 0x04, 0xdc, 0xd7, 0xf6, 0x7c, + 0x88, 0xe8, 0x47, 0x5e, 0xc2, 0xf9, 0x1f, 0x92, 0xf8, 0x73, 0x24, 0xfe, + 0x1c, 0x89, 0xff, 0x30, 0xd1, 0xcf, 0x26, 0xfe, 0xc3, 0x12, 0xff, 0x5b, + 0x12, 0xbf, 0x80, 0x57, 0x03, 0xbd, 0x51, 0x53, 0x5f, 0x1f, 0xc0, 0x57, + 0x8e, 0x88, 0x9e, 0x23, 0xbb, 0x9b, 0x60, 0x71, 0x5e, 0xec, 0x2f, 0x04, + 0x8b, 0xf3, 0xc2, 0x1f, 0x48, 0xfc, 0xf8, 0x42, 0xe6, 0x95, 0xa3, 0xa2, + 0xe7, 0xd3, 0x2e, 0x47, 0x18, 0x74, 0x64, 0x3b, 0x9d, 0xd7, 0x9b, 0x8e, + 0x30, 0xf0, 0x9c, 0x20, 0xb8, 0x8a, 0x60, 0xe5, 0x5e, 0x0e, 0xff, 0x88, + 0x60, 0x23, 0xc1, 0xfb, 0x09, 0xce, 0x21, 0x38, 0x79, 0x0c, 0xf1, 0x13, + 0x9c, 0x4f, 0xf0, 0x29, 0x82, 0x57, 0x11, 0xac, 0xfc, 0x82, 0xc3, 0xb7, + 0x10, 0x9c, 0x46, 0xf0, 0x4e, 0x82, 0x87, 0x10, 0xfc, 0x16, 0xc1, 0xa3, + 0x08, 0xfe, 0x86, 0x60, 0x23, 0xc1, 0x17, 0x5d, 0xc6, 0xe1, 0x4c, 0x82, + 0xa7, 0x12, 0x9c, 0x43, 0xf0, 0x52, 0x82, 0xf3, 0x09, 0xde, 0x40, 0x70, + 0x31, 0xc1, 0x3f, 0x27, 0xd8, 0x4c, 0xf0, 0x33, 0x04, 0x57, 0x11, 0x7c, + 0x8c, 0xe0, 0x7a, 0x82, 0x2f, 0xb9, 0x9c, 0xc3, 0xab, 0x09, 0xae, 0x26, + 0x78, 0xc8, 0x2f, 0x39, 0x1c, 0x22, 0x78, 0x14, 0xc1, 0x0f, 0x12, 0x6c, + 0x24, 0xf8, 0x4d, 0x82, 0x33, 0x09, 0xfe, 0x92, 0xe0, 0x1c, 0x82, 0x33, + 0x8c, 0x54, 0x5e, 0x82, 0x0b, 0x09, 0x2e, 0x26, 0x78, 0x39, 0xc1, 0x66, + 0x82, 0x37, 0x12, 0x5c, 0x45, 0xf0, 0x4f, 0x09, 0xae, 0x27, 0xf8, 0x11, + 0x82, 0x57, 0x13, 0xfc, 0x01, 0xc1, 0xcd, 0xbf, 0x8c, 0xea, 0x9f, 0x76, + 0xbf, 0xe4, 0x33, 0xc0, 0xe3, 0xe7, 0xac, 0xc4, 0xfe, 0xef, 0x57, 0x00, + 0x0f, 0x36, 0x44, 0xf7, 0x63, 0xa7, 0x8e, 0xe5, 0xb0, 0xd8, 0x5f, 0x6d, + 0x21, 0x58, 0xec, 0x97, 0xfe, 0x84, 0x60, 0xb1, 0xff, 0xf9, 0x5f, 0x04, + 0x8b, 0xfd, 0xcc, 0x97, 0x08, 0x16, 0xfb, 0x93, 0xdf, 0x11, 0x2c, 0xf6, + 0x1b, 0x2f, 0x1d, 0xc7, 0x61, 0xb1, 0x7f, 0x58, 0x4e, 0xb0, 0xd8, 0x0f, + 0xbc, 0x93, 0x60, 0xb1, 0xbf, 0xb7, 0x97, 0x60, 0xb1, 0x5f, 0xf7, 0x29, + 0xc1, 0x62, 0xff, 0x6d, 0xf4, 0x15, 0x44, 0x4f, 0xfb, 0x61, 0x26, 0x82, + 0xc5, 0xfe, 0x98, 0x83, 0x60, 0xb1, 0xdf, 0xf5, 0x5b, 0x82, 0xc5, 0xfe, + 0xd5, 0x61, 0x82, 0xc5, 0xfe, 0xcf, 0xb7, 0x04, 0x8b, 0xfd, 0x9c, 0x9c, + 0xf1, 0x1c, 0x16, 0xfb, 0x33, 0xcb, 0x09, 0x16, 0xfb, 0x2d, 0x9b, 0x09, + 0x16, 0xfb, 0x27, 0x8f, 0x10, 0x2c, 0xf6, 0x43, 0x92, 0x26, 0x70, 0x58, + 0xec, 0x6f, 0xb8, 0x09, 0x16, 0xfb, 0x15, 0xfb, 0x09, 0x16, 0xfb, 0x0f, + 0x57, 0x5e, 0xc9, 0x61, 0xb1, 0x9f, 0xf0, 0x73, 0x82, 0xc5, 0xfe, 0xc0, + 0x88, 0x89, 0x1c, 0x16, 0xeb, 0xfd, 0x22, 0x82, 0xc5, 0xfa, 0xfd, 0x06, + 0x82, 0xc5, 0x7a, 0xfc, 0x61, 0x41, 0x6f, 0xe2, 0xf0, 0xfb, 0x04, 0x8b, + 0xf5, 0xf2, 0x05, 0x99, 0x1c, 0x16, 0xeb, 0xdf, 0x42, 0x82, 0xc5, 0x7a, + 0xd6, 0x41, 0xb0, 0x58, 0x9f, 0xde, 0x41, 0xb0, 0x58, 0x6f, 0x3e, 0x47, + 0xb0, 0x58, 0x3f, 0x26, 0x4f, 0xe2, 0xb0, 0x58, 0x0f, 0x96, 0x10, 0x2c, + 0xd6, 0x77, 0x9b, 0x09, 0x16, 0xeb, 0xb5, 0x47, 0x08, 0x16, 0xeb, 0xaf, + 0xc3, 0x04, 0x8b, 0xf5, 0x14, 0x7e, 0x23, 0x8e, 0xe5, 0x4f, 0x70, 0x17, + 0xc1, 0x62, 0xbd, 0xb3, 0x9f, 0x60, 0xb1, 0x7e, 0x19, 0x3b, 0x85, 0xf4, + 0x93, 0x60, 0x2f, 0xc1, 0x62, 0x7d, 0xf1, 0x57, 0x82, 0xc5, 0x7a, 0x21, + 0x79, 0x2a, 0xf5, 0x37, 0xc1, 0x66, 0x82, 0x85, 0x3f, 0xff, 0x13, 0x82, + 0x85, 0x7f, 0xfe, 0x1e, 0xc1, 0xc2, 0xdf, 0x9e, 0x3b, 0x8d, 0xc3, 0xc2, + 0x7f, 0xbe, 0x99, 0x60, 0xe1, 0x0f, 0x3f, 0x42, 0xb0, 0xf0, 0x6f, 0x8f, + 0x11, 0x2c, 0xfc, 0xd5, 0x41, 0x59, 0x1c, 0x16, 0xfe, 0xe7, 0x74, 0x82, + 0x85, 0x3f, 0xb9, 0x82, 0x60, 0xe1, 0x1f, 0xde, 0x4c, 0xb0, 0xf0, 0xf7, + 0xee, 0x23, 0x58, 0xf8, 0x6f, 0x2f, 0x11, 0x2c, 0xfc, 0xb1, 0xaf, 0x09, + 0x16, 0xfe, 0xd5, 0xe4, 0x6c, 0x0e, 0x0b, 0x7f, 0xc9, 0x4a, 0xb0, 0xf0, + 0x7f, 0xee, 0x21, 0x58, 0xf8, 0x33, 0x07, 0x08, 0x16, 0xfe, 0x49, 0xff, + 0x1c, 0x0e, 0x0b, 0x7f, 0x63, 0x16, 0xc1, 0xc2, 0x7f, 0x58, 0x4a, 0xb0, + 0xf0, 0x07, 0x3c, 0x04, 0x8b, 0xf9, 0xfd, 0x76, 0x82, 0xc5, 0xfc, 0xbc, + 0x9b, 0x60, 0x31, 0xdf, 0xfe, 0x9d, 0x60, 0x31, 0x7f, 0x26, 0xe5, 0x02, + 0x9c, 0x1a, 0x7d, 0x4f, 0xe5, 0x62, 0x84, 0xfb, 0x45, 0xdf, 0x77, 0x99, + 0x8a, 0x70, 0xff, 0xe8, 0xfb, 0x2b, 0xa5, 0x00, 0x5f, 0x36, 0x08, 0xe6, + 0x3f, 0xfa, 0xdd, 0x95, 0xeb, 0x08, 0xde, 0x4e, 0xf0, 0x8d, 0x08, 0x0f, + 0x81, 0xfa, 0x6e, 0xa1, 0xf9, 0x0e, 0xf9, 0x35, 0xf3, 0xed, 0x2e, 0x82, + 0xc5, 0x7c, 0xfb, 0x26, 0xc1, 0x62, 0xbe, 0x3d, 0x83, 0xfc, 0x60, 0xdb, + 0xc4, 0x79, 0xf1, 0x4b, 0xa7, 0x73, 0x58, 0xbc, 0x9f, 0x3f, 0x8b, 0x60, + 0x71, 0xfe, 0xbb, 0x16, 0xe0, 0xc1, 0x9a, 0xf9, 0xd8, 0x87, 0xb0, 0x66, + 0x3e, 0xfe, 0x1e, 0xd2, 0x83, 0xcf, 0x72, 0x88, 0xe0, 0x7b, 0x11, 0xaf, + 0x99, 0x9f, 0xff, 0x42, 0xb0, 0x98, 0x9f, 0xbf, 0x21, 0x58, 0xcc, 0xcf, + 0x73, 0x66, 0x70, 0x58, 0xcc, 0xcf, 0x6e, 0x82, 0xc5, 0xfc, 0x7c, 0x1f, + 0xc1, 0x62, 0x7e, 0xee, 0x21, 0x58, 0xcc, 0xcf, 0xc7, 0x08, 0x16, 0xf3, + 0xf3, 0x25, 0x33, 0x39, 0x2c, 0xe6, 0xe7, 0x32, 0x82, 0xc5, 0xfc, 0xec, + 0x20, 0x58, 0xcc, 0xcf, 0xb7, 0x12, 0x2c, 0xe6, 0xe7, 0x9f, 0x12, 0x2c, + 0xe6, 0xe7, 0xa7, 0x08, 0x16, 0xf3, 0xf3, 0x61, 0x82, 0xc5, 0xfc, 0xdc, + 0x3f, 0x8f, 0xc3, 0x62, 0x7e, 0xce, 0x21, 0x58, 0xcc, 0xcf, 0x4b, 0x09, + 0x16, 0xf3, 0xf3, 0xf7, 0x08, 0x16, 0xf3, 0xf3, 0x13, 0x04, 0x8b, 0xf9, + 0xf9, 0x24, 0xc1, 0x62, 0x7e, 0xbe, 0x74, 0x16, 0x95, 0x97, 0xe0, 0xf9, + 0x04, 0x8b, 0xf9, 0xd9, 0x42, 0xb0, 0x98, 0x9f, 0xdb, 0x09, 0x16, 0xf3, + 0xf3, 0x6f, 0x08, 0x16, 0xf3, 0xf3, 0x33, 0x04, 0x8b, 0xf9, 0xf9, 0x9f, + 0x04, 0x8b, 0xf9, 0x39, 0x69, 0x36, 0x95, 0x97, 0xe0, 0x71, 0x04, 0x8b, + 0xf9, 0xb9, 0x92, 0x60, 0x31, 0x3f, 0xe3, 0xb6, 0x7a, 0xba, 0x81, 0xff, + 0xca, 0x0d, 0xc2, 0x23, 0x79, 0xa8, 0xfe, 0x6c, 0xc4, 0x34, 0x0e, 0xab, + 0x3f, 0x43, 0x53, 0x27, 0xc1, 0xcd, 0x1c, 0x56, 0x7f, 0xc6, 0xc3, 0x23, + 0xc1, 0x37, 0x48, 0xf0, 0x2f, 0x25, 0xf9, 0xbb, 0x24, 0xfc, 0x8b, 0x12, + 0xfe, 0x7d, 0x09, 0xfe, 0x4e, 0xa2, 0xbf, 0xc8, 0xa0, 0x2f, 0xcf, 0x34, + 0x83, 0x9e, 0xfe, 0x1a, 0x09, 0x6e, 0x94, 0xe0, 0x2d, 0x06, 0xa9, 0x7c, + 0x1c, 0x56, 0x7f, 0x16, 0xe6, 0x61, 0x09, 0xff, 0x82, 0x04, 0x7f, 0x2c, + 0xc1, 0x67, 0x24, 0x78, 0x78, 0x92, 0x3e, 0xbf, 0x89, 0x12, 0x5c, 0x9a, + 0xa4, 0xa7, 0x77, 0x48, 0xf0, 0x0f, 0x92, 0xf4, 0xf5, 0xfb, 0x2d, 0x87, + 0x0d, 0x02, 0x7e, 0x2a, 0x49, 0x5f, 0xde, 0x7f, 0x70, 0x58, 0xfd, 0x59, + 0x99, 0x4f, 0x24, 0xf8, 0x8c, 0x94, 0x3f, 0x7e, 0xc9, 0x57, 0x8b, 0x9f, + 0x2e, 0xc1, 0x65, 0x12, 0xdc, 0x9c, 0xac, 0xcf, 0xef, 0x06, 0x09, 0xfe, + 0x91, 0x44, 0x7f, 0x97, 0x04, 0x6f, 0x97, 0xe0, 0xff, 0x90, 0xe0, 0x3f, + 0x49, 0xf2, 0xba, 0x19, 0x5c, 0xac, 0xc2, 0xaf, 0x49, 0xf8, 0x8f, 0x24, + 0x38, 0x22, 0xc1, 0x23, 0x53, 0xf4, 0x70, 0xae, 0x04, 0x2f, 0x90, 0xe0, + 0x3a, 0x09, 0xbe, 0x5e, 0x82, 0x37, 0x49, 0xf0, 0xed, 0x12, 0xbc, 0x23, + 0x45, 0x5f, 0x9f, 0xff, 0x92, 0xe0, 0xdd, 0x12, 0xfc, 0x8c, 0x04, 0xbf, + 0x2a, 0xc1, 0x6f, 0x49, 0xf2, 0xc3, 0x12, 0x7c, 0x2a, 0x45, 0xdf, 0x9f, + 0xa3, 0x52, 0xf5, 0xfc, 0x46, 0x09, 0xce, 0x94, 0xe0, 0x9c, 0x54, 0xbd, + 0xbc, 0x2a, 0x09, 0xbe, 0x5e, 0x82, 0x6f, 0x95, 0xe0, 0x9f, 0x49, 0xf0, + 0x2e, 0x09, 0x7e, 0x55, 0x82, 0x3f, 0x91, 0xe0, 0xfe, 0xfd, 0xf4, 0xf0, + 0x58, 0x09, 0xce, 0x91, 0xe0, 0x12, 0x09, 0xae, 0x93, 0x60, 0x97, 0x04, + 0x7f, 0x4f, 0x82, 0xb7, 0x49, 0xf0, 0x6f, 0xfb, 0xe9, 0xf5, 0xeb, 0x31, + 0x09, 0xff, 0xaa, 0x04, 0x1f, 0x92, 0xe0, 0x7f, 0x49, 0x70, 0x6a, 0x7f, + 0x3d, 0x3c, 0x49, 0x82, 0x0b, 0x25, 0xb8, 0x5a, 0x82, 0x1b, 0x24, 0xd8, + 0xdb, 0x5f, 0xdf, 0x5f, 0x1b, 0xfb, 0xeb, 0xcb, 0x7b, 0x97, 0x44, 0xbf, + 0x4b, 0x82, 0xf7, 0x49, 0xfc, 0x6f, 0x4b, 0xf0, 0x67, 0x12, 0xfc, 0x95, + 0xc4, 0x9f, 0x9c, 0xa6, 0xc7, 0x5f, 0x20, 0xc1, 0xc3, 0x25, 0xf8, 0x52, + 0x09, 0x7e, 0x17, 0x80, 0x43, 0x70, 0xbd, 0x0f, 0xd7, 0x07, 0x70, 0x7d, + 0x03, 0xd7, 0x69, 0xb8, 0x22, 0x70, 0x25, 0x81, 0x2d, 0x4a, 0x86, 0x2b, + 0x05, 0xae, 0x54, 0xb8, 0xf0, 0xb3, 0xc4, 0xfd, 0xe1, 0x4a, 0x83, 0x6b, + 0x00, 0x5c, 0x03, 0xe1, 0xba, 0x00, 0xae, 0x0b, 0xe1, 0x1a, 0x0c, 0x57, + 0x3a, 0x5c, 0x43, 0xe0, 0x1a, 0x0a, 0xd7, 0xb0, 0x24, 0x6e, 0x5b, 0xf1, + 0xcb, 0xdd, 0x19, 0x70, 0x8d, 0x84, 0x0b, 0x4f, 0x43, 0x8d, 0x82, 0xeb, + 0x62, 0xb8, 0x2e, 0x81, 0xeb, 0x52, 0xb8, 0xc6, 0xc0, 0x75, 0x19, 0x5c, + 0x46, 0xb8, 0xc6, 0xc2, 0x35, 0x0e, 0xae, 0x2b, 0xe0, 0x9a, 0x00, 0xd7, + 0x95, 0x49, 0xdc, 0x1e, 0x67, 0xc2, 0x35, 0x09, 0xae, 0xc9, 0x70, 0x4d, + 0x81, 0x2b, 0x0b, 0xae, 0x5c, 0xb8, 0xa6, 0xc3, 0x35, 0x03, 0xae, 0x3c, + 0xb8, 0x66, 0xc1, 0x35, 0x1b, 0xae, 0x7c, 0xb8, 0x0a, 0xe0, 0x9a, 0x03, + 0xd7, 0x5c, 0xb8, 0x8a, 0xe0, 0xba, 0x0a, 0xae, 0x79, 0x70, 0x15, 0xc3, + 0x85, 0x9f, 0x01, 0x9e, 0xcf, 0x9f, 0x55, 0x17, 0xbf, 0x07, 0x75, 0xfc, + 0x10, 0xae, 0x6f, 0x0d, 0x7c, 0x5e, 0x18, 0x04, 0xe9, 0xa3, 0xe1, 0xba, + 0x9c, 0xca, 0x32, 0x3e, 0x4e, 0x19, 0x30, 0xff, 0xa9, 0x70, 0x4d, 0x83, + 0x2b, 0x1b, 0xae, 0x1c, 0xb8, 0xf0, 0x23, 0xc3, 0x85, 0x49, 0xff, 0x6f, + 0xb6, 0xa5, 0x51, 0x89, 0x77, 0xee, 0x2d, 0xc1, 0xc1, 0xe7, 0xbe, 0x9e, + 0x7e, 0x8f, 0x73, 0x32, 0x9a, 0x8e, 0x44, 0x6b, 0xcf, 0x42, 0xf7, 0xe5, + 0x6d, 0x96, 0xf8, 0x07, 0xe0, 0x13, 0xbc, 0xd6, 0x12, 0xf7, 0x4c, 0x7c, + 0x2f, 0xc7, 0xe0, 0x7b, 0x79, 0xfd, 0x25, 0xfe, 0xd9, 0xfd, 0x5e, 0x8f, + 0xca, 0xf7, 0x76, 0x4c, 0xfe, 0xec, 0x47, 0xe4, 0x13, 0xbc, 0x6b, 0x93, + 0xe0, 0x85, 0x94, 0xb8, 0xaf, 0xdf, 0xf4, 0xf6, 0xea, 0x4d, 0x82, 0xb7, + 0x6d, 0xe2, 0xbe, 0x60, 0x13, 0xef, 0x80, 0x7e, 0xaf, 0xc7, 0xf3, 0xcf, + 0xfa, 0x36, 0x4e, 0x1f, 0x5f, 0xc0, 0x49, 0xfc, 0x56, 0x44, 0x6f, 0xef, + 0x46, 0xf5, 0xf2, 0x62, 0x8e, 0xee, 0x98, 0x7d, 0xbc, 0xf7, 0x41, 0xce, + 0xfe, 0x22, 0x41, 0xec, 0xa9, 0xfc, 0x38, 0xaf, 0x8d, 0xf4, 0xe1, 0x84, + 0x7e, 0x9c, 0xb7, 0x82, 0xe2, 0xbd, 0x10, 0x44, 0x27, 0xf8, 0xa3, 0x47, + 0xf7, 0xe9, 0xcc, 0xbe, 0x38, 0xac, 0x1f, 0x73, 0x4a, 0x3f, 0xce, 0xf1, + 0xfc, 0x38, 0xe7, 0xf2, 0x13, 0x1e, 0xc8, 0x4f, 0x70, 0x12, 0xbf, 0x97, + 0x23, 0xf8, 0x71, 0xcf, 0xde, 0xcb, 0x5f, 0x54, 0x8b, 0x77, 0x06, 0x3f, + 0xce, 0xe1, 0xfb, 0xb8, 0xa7, 0xee, 0x13, 0x1f, 0xb7, 0xe7, 0xe7, 0xec, + 0xf9, 0x01, 0x7b, 0xdd, 0xc9, 0x7a, 0xdd, 0x91, 0x7a, 0x71, 0x96, 0x5e, + 0x7f, 0x88, 0x5e, 0x3e, 0x3d, 0x7f, 0xb6, 0x17, 0x42, 0xc4, 0xb1, 0x7a, + 0x71, 0x9e, 0x5e, 0x1c, 0xa4, 0x3f, 0xdb, 0x09, 0xfa, 0xc4, 0x47, 0xe7, + 0x7b, 0xfb, 0x04, 0x5e, 0xfc, 0x2f, 0x27, 0xf6, 0xfd, 0x63, 0x8b, 0xb1, + 0x5f, 0x04, 0x8c, 0x3d, 0x36, 0xdf, 0xeb, 0x9b, 0x60, 0x89, 0x0f, 0xd3, + 0x9f, 0xc3, 0x97, 0xf8, 0xa2, 0xea, 0xd6, 0xdb, 0xb7, 0xf9, 0xe2, 0x9d, + 0x94, 0x4f, 0xf4, 0xd5, 0x3e, 0xf1, 0xc6, 0x58, 0xe2, 0x4f, 0x0a, 0xc6, + 0x9e, 0x9e, 0x8f, 0xf7, 0xb5, 0xc6, 0x38, 0x9f, 0x76, 0x8c, 0xfd, 0x50, + 0xe3, 0xd9, 0x3f, 0xb4, 0xa8, 0x3b, 0x43, 0xdf, 0xdb, 0xa7, 0x0b, 0xb5, + 0x87, 0xea, 0x63, 0xbe, 0x3c, 0x29, 0x46, 0x76, 0x2f, 0xe7, 0xe7, 0xcf, + 0x72, 0x70, 0x3e, 0xce, 0x17, 0x0b, 0xe3, 0x9c, 0xa1, 0x8f, 0x7f, 0x78, + 0x9e, 0x9f, 0x9a, 0xd7, 0x1e, 0x97, 0x17, 0xe7, 0xe4, 0xc5, 0x01, 0x79, + 0xf5, 0x64, 0x7c, 0xcc, 0xbb, 0x70, 0xd9, 0x68, 0xb8, 0x7d, 0xf4, 0xf5, + 0xdd, 0x6c, 0xfc, 0x4d, 0xf9, 0xd8, 0x0f, 0xf0, 0x66, 0x8b, 0xcf, 0xc8, + 0xd2, 0xd7, 0x70, 0x21, 0x85, 0x7d, 0xe8, 0x30, 0xab, 0xa5, 0x6f, 0xec, + 0x0d, 0x01, 0xa7, 0xcb, 0x1e, 0x2b, 0x24, 0x8b, 0xa7, 0x57, 0xf3, 0x9e, + 0x89, 0xf3, 0xdd, 0x5f, 0x8e, 0xa7, 0xcf, 0x7b, 0x41, 0xb2, 0x17, 0x06, + 0x70, 0x76, 0x5b, 0xfe, 0x2c, 0xcb, 0xac, 0x99, 0xd9, 0x2c, 0x7f, 0x0f, + 0x8e, 0x69, 0x50, 0x02, 0xcd, 0x77, 0x2b, 0xfe, 0x4f, 0x96, 0x49, 0x5b, + 0x0c, 0x8f, 0x32, 0x6d, 0x85, 0xf0, 0x62, 0x32, 0xe3, 0x7d, 0x81, 0x63, + 0x92, 0x31, 0xf6, 0x03, 0x91, 0xab, 0x18, 0x93, 0x76, 0x22, 0xce, 0x8c, + 0xf7, 0x9d, 0x8e, 0x49, 0xc6, 0x44, 0x9f, 0x81, 0x5c, 0xa5, 0x4c, 0x59, + 0xa1, 0x29, 0x85, 0x31, 0xfe, 0x27, 0xc9, 0x30, 0x1b, 0x2d, 0x95, 0xf4, + 0xfd, 0xc5, 0xb8, 0x68, 0x32, 0xa5, 0x32, 0xae, 0xf7, 0xaf, 0x05, 0xc9, + 0xd4, 0xf2, 0x47, 0xfa, 0x64, 0x7c, 0xaf, 0x9f, 0x9c, 0x89, 0x25, 0xfe, + 0xef, 0x7f, 0xdc, 0x50, 0x96, 0xd5, 0xfb, 0xb7, 0x1b, 0x65, 0xea, 0xde, + 0x3e, 0x03, 0x29, 0xd3, 0x26, 0xfe, 0x36, 0x66, 0x4c, 0x53, 0x26, 0xf8, + 0xb2, 0x9e, 0x4c, 0x17, 0xef, 0x43, 0x7b, 0xf1, 0x72, 0x3d, 0xa7, 0xaf, + 0xfd, 0xf4, 0x51, 0x40, 0x82, 0xaf, 0x11, 0xad, 0x52, 0x2c, 0x62, 0x24, + 0x89, 0x81, 0x24, 0x8a, 0x0f, 0x4b, 0x82, 0x18, 0x31, 0x75, 0xe5, 0x51, + 0x6c, 0x8c, 0xa7, 0xa7, 0xfd, 0x06, 0x8d, 0xde, 0x47, 0xd4, 0x61, 0xc0, + 0x71, 0x8b, 0xf3, 0x55, 0x9b, 0xec, 0x0a, 0x67, 0x83, 0x17, 0x7c, 0xef, + 0xec, 0x12, 0x74, 0xc7, 0x7c, 0xd9, 0x36, 0x4f, 0x0b, 0x7e, 0x69, 0xdd, + 0xe5, 0xc8, 0x6a, 0x6b, 0xf0, 0x65, 0xd7, 0xb0, 0x8f, 0xd6, 0xfb, 0xb2, + 0xc1, 0xa7, 0x70, 0x39, 0xfd, 0x0e, 0x11, 0x4e, 0x9b, 0x35, 0x2b, 0x9b, + 0x7f, 0xcf, 0x3e, 0x5b, 0xa1, 0xa4, 0xac, 0x16, 0x30, 0x23, 0xda, 0x4f, + 0x8c, 0x66, 0xd7, 0xa3, 0x66, 0xa2, 0xac, 0x6c, 0xf1, 0xf9, 0xcb, 0xec, + 0x52, 0xc7, 0x3a, 0x87, 0x0b, 0xed, 0x7d, 0x76, 0x2d, 0xcc, 0xe2, 0xe0, + 0x3b, 0x38, 0x05, 0x1d, 0x0d, 0xb4, 0xac, 0x36, 0xf0, 0x71, 0x08, 0x93, + 0x1d, 0xf0, 0x79, 0xb3, 0x5d, 0xce, 0x06, 0xcc, 0x14, 0x43, 0xca, 0x08, + 0xec, 0x97, 0xcd, 0xe3, 0x6b, 0xcb, 0xb2, 0x66, 0x8a, 0x9c, 0x3d, 0x93, + 0xa0, 0x72, 0xcb, 0x2b, 0x72, 0xf3, 0x34, 0x1f, 0xd0, 0xc1, 0x6f, 0x2b, + 0xad, 0x63, 0xc9, 0x33, 0x72, 0x54, 0xff, 0xd3, 0xd2, 0x0c, 0x73, 0xab, + 0xd6, 0x63, 0x68, 0x45, 0x5f, 0x62, 0x61, 0x6e, 0x2e, 0x88, 0x6c, 0xa6, + 0x55, 0x9f, 0x8b, 0x33, 0xcd, 0xb4, 0x58, 0x44, 0x7e, 0x89, 0x1c, 0x10, + 0x12, 0x3f, 0xe3, 0x2c, 0x94, 0x9e, 0xd6, 0x2a, 0x4e, 0x99, 0x5b, 0xd0, + 0x8a, 0x5f, 0x4a, 0xb2, 0xb8, 0xac, 0x1b, 0x37, 0x58, 0x5a, 0x3d, 0x4e, + 0xec, 0x57, 0x9f, 0x94, 0x7b, 0xd5, 0x6c, 0x4e, 0xe3, 0x6f, 0x61, 0x2c, + 0x33, 0xa7, 0x47, 0x85, 0xd3, 0xb2, 0xcf, 0x92, 0xe8, 0x53, 0x51, 0x55, + 0xb3, 0x89, 0xa2, 0x2a, 0x77, 0x06, 0xff, 0x1c, 0x32, 0x79, 0x8c, 0x5c, + 0x54, 0xde, 0x0c, 0xad, 0x28, 0xed, 0x9a, 0xcd, 0xa2, 0x7e, 0x01, 0xca, + 0x12, 0xfb, 0x89, 0xa9, 0xaa, 0xdc, 0x99, 0x7a, 0x6a, 0x59, 0x7a, 0x55, + 0x6e, 0x2e, 0x83, 0x79, 0xb1, 0xa8, 0xd8, 0xb3, 0xb4, 0x79, 0x45, 0xd7, + 0x77, 0x96, 0x04, 0x46, 0xb8, 0x2a, 0x77, 0xba, 0x96, 0xac, 0xf7, 0x2c, + 0x78, 0x0e, 0xb3, 0xb5, 0x39, 0x44, 0xbf, 0x88, 0x9d, 0xb8, 0x75, 0x30, + 0x8b, 0x28, 0x5d, 0x82, 0x36, 0xca, 0x8f, 0xd3, 0x46, 0x1a, 0xe1, 0xbd, + 0x37, 0x54, 0x41, 0x1c, 0x96, 0xbe, 0xb4, 0x56, 0xdc, 0x5c, 0x35, 0x8d, + 0xa6, 0xc9, 0x36, 0xe6, 0xab, 0xb7, 0xda, 0x5c, 0xfb, 0xda, 0x80, 0x35, + 0x33, 0x2d, 0x5c, 0x1f, 0xf3, 0xa5, 0x81, 0x01, 0x83, 0x27, 0xfe, 0x60, + 0x98, 0xa5, 0x53, 0xf1, 0x04, 0x1f, 0x17, 0xd7, 0x67, 0x52, 0xb5, 0xd0, + 0x46, 0x6a, 0x3f, 0x7d, 0x66, 0x5c, 0x6e, 0x70, 0x02, 0x25, 0x8e, 0x02, + 0xee, 0x18, 0x03, 0xa2, 0x26, 0x87, 0x97, 0x70, 0x7a, 0x6e, 0x0c, 0x2b, + 0x7a, 0x89, 0xf1, 0x1a, 0x51, 0x22, 0x15, 0x7e, 0x6c, 0x1c, 0xd5, 0x99, + 0x3e, 0x2b, 0x2e, 0x25, 0x5b, 0x23, 0xc7, 0x23, 0x9f, 0x1e, 0x43, 0xce, + 0xc7, 0x76, 0x1f, 0x24, 0x6b, 0x4d, 0x41, 0x2c, 0xf9, 0x8c, 0x58, 0xc9, + 0x92, 0xeb, 0x1d, 0x8f, 0x69, 0x76, 0xe2, 0x3c, 0x34, 0x8e, 0x7a, 0xbc, + 0x21, 0x23, 0x1b, 0xaa, 0xde, 0xbe, 0xba, 0x1e, 0x8f, 0x5f, 0x36, 0x89, + 0xbd, 0xae, 0x14, 0xfa, 0xd2, 0x3c, 0x9a, 0xef, 0xb5, 0x57, 0x49, 0x2a, + 0x2a, 0x14, 0x60, 0xba, 0xa4, 0xa2, 0x3e, 0xfc, 0xe4, 0xf8, 0xb5, 0xb9, + 0x71, 0xd5, 0x54, 0x6f, 0x2c, 0xe5, 0xcf, 0xbf, 0x5b, 0x74, 0x5f, 0x0d, + 0x97, 0x54, 0x2f, 0x66, 0xbc, 0xe4, 0xf0, 0x65, 0x22, 0x5f, 0xe2, 0xe0, + 0x58, 0x99, 0xa1, 0x5b, 0x9e, 0xeb, 0x08, 0x62, 0xb8, 0x17, 0xc4, 0x8c, + 0xb7, 0x9a, 0xe9, 0x96, 0x8d, 0x65, 0x55, 0x35, 0xb3, 0x2c, 0x34, 0x23, + 0xe9, 0x06, 0xbc, 0xf6, 0x1b, 0xf4, 0x6c, 0x5d, 0xd8, 0x7b, 0xe1, 0x78, + 0x5d, 0x73, 0x13, 0x8b, 0x90, 0xbe, 0xd2, 0xd7, 0xbb, 0x34, 0xd1, 0xd2, + 0x33, 0x66, 0x9d, 0x45, 0x20, 0xfb, 0xca, 0xdf, 0x59, 0x9a, 0x0d, 0x84, + 0xc1, 0xff, 0xeb, 0x63, 0x14, 0x75, 0x51, 0xcd, 0xc2, 0x85, 0x95, 0x35, + 0x96, 0x78, 0x1f, 0x04, 0xec, 0x5b, 0xe9, 0xa6, 0xe7, 0xc7, 0x08, 0xd3, + 0x7c, 0x47, 0xb0, 0x8f, 0x32, 0x0a, 0xf4, 0x32, 0x7c, 0xa5, 0xba, 0xe9, + 0xa8, 0x8f, 0xcd, 0x94, 0x17, 0x23, 0x24, 0xf6, 0x6b, 0x89, 0x7d, 0x14, + 0x35, 0x23, 0x46, 0x94, 0x6c, 0xe8, 0xcf, 0x2a, 0x48, 0xc8, 0xd2, 0xab, + 0x03, 0x93, 0x95, 0xe8, 0xd3, 0x8a, 0x67, 0xd3, 0xfc, 0xe9, 0xfa, 0xcd, + 0x61, 0xa9, 0xf1, 0x63, 0x77, 0x20, 0xf4, 0x43, 0x61, 0x61, 0x6e, 0x1e, + 0xb7, 0xe2, 0x6c, 0xc8, 0x3a, 0xd9, 0xa6, 0x6b, 0x3c, 0x53, 0x17, 0xb3, + 0x01, 0x24, 0x89, 0xb1, 0xb5, 0xc4, 0xe3, 0x8b, 0xb3, 0xd1, 0x10, 0xcf, + 0xce, 0xc8, 0x86, 0x4e, 0x6c, 0x56, 0x80, 0x58, 0x4e, 0x20, 0xdb, 0x50, + 0xed, 0x46, 0x8e, 0x20, 0x9a, 0x21, 0x4f, 0x28, 0xf2, 0x46, 0x8e, 0x2a, + 0x4d, 0x36, 0x6b, 0x9a, 0x0d, 0x9c, 0x84, 0x34, 0x9a, 0x7d, 0x22, 0x95, + 0x46, 0x53, 0x6c, 0xdd, 0x46, 0x62, 0xac, 0x35, 0xd2, 0x8a, 0x93, 0x37, + 0x41, 0xaa, 0xf2, 0xa3, 0x1b, 0x50, 0xf1, 0xe6, 0x8b, 0xf8, 0x5b, 0x5f, + 0x38, 0x5d, 0xf3, 0x71, 0x9b, 0x3b, 0xdb, 0xef, 0xb5, 0xba, 0xd1, 0xbb, + 0x68, 0x20, 0x63, 0xe7, 0x93, 0xac, 0x5d, 0x5e, 0x13, 0xd8, 0x77, 0xb1, + 0x3f, 0xe9, 0xb1, 0xf8, 0xc9, 0xb9, 0x8d, 0xb2, 0x89, 0x02, 0xf4, 0x89, + 0x71, 0x7a, 0x8e, 0x8e, 0x11, 0xf7, 0x82, 0x40, 0x67, 0xfb, 0x94, 0xe5, + 0xcc, 0xe8, 0x5a, 0x1d, 0x14, 0xae, 0xb5, 0x0f, 0x66, 0x13, 0x5c, 0x1e, + 0x52, 0xbc, 0x4a, 0xeb, 0x86, 0x06, 0x47, 0x0d, 0xce, 0x26, 0x55, 0xb9, + 0xf9, 0x4c, 0x3a, 0x9b, 0x5a, 0x28, 0x0f, 0xe1, 0x54, 0x4c, 0xc7, 0xd6, + 0xaa, 0xe1, 0x73, 0x0e, 0xd8, 0xc4, 0x26, 0x97, 0x83, 0x3d, 0x90, 0x81, + 0xd6, 0x6a, 0xa0, 0x69, 0xc1, 0xee, 0x68, 0x89, 0x97, 0x3e, 0xcb, 0x67, + 0xb3, 0xba, 0x89, 0x63, 0x81, 0xd3, 0xe1, 0xb2, 0x57, 0x03, 0x0e, 0x07, + 0x6c, 0xae, 0xa5, 0xda, 0x79, 0x2e, 0xeb, 0xa4, 0x2a, 0x97, 0xd5, 0xcf, + 0x3e, 0x48, 0x9e, 0x5d, 0x69, 0xb5, 0x2d, 0xae, 0xa9, 0xcf, 0x6a, 0xa5, + 0x04, 0x0d, 0x4d, 0x4d, 0xe9, 0x42, 0x81, 0xce, 0xcd, 0xc9, 0xca, 0x9d, + 0x91, 0x55, 0x8e, 0x4b, 0x0b, 0x58, 0x59, 0x66, 0xf9, 0xec, 0x6b, 0xd8, + 0x2a, 0xca, 0xe9, 0xb6, 0xb9, 0x02, 0x76, 0x47, 0xb6, 0xcd, 0xbf, 0xa1, + 0xd5, 0x91, 0xd5, 0x2c, 0xd6, 0x45, 0xa4, 0x17, 0x01, 0x77, 0xb4, 0x21, + 0xed, 0x6c, 0xdb, 0x1e, 0x0b, 0x46, 0x8b, 0x96, 0xe9, 0xb6, 0xb6, 0xb6, + 0x12, 0xb1, 0x8d, 0x1a, 0x6f, 0xb4, 0xe5, 0x34, 0x3a, 0xdb, 0xf8, 0x43, + 0x03, 0x50, 0x26, 0xdc, 0x4c, 0xc6, 0x67, 0x3d, 0x31, 0x84, 0x6e, 0x8f, + 0x9b, 0x2f, 0x7c, 0x58, 0x03, 0x3b, 0x7c, 0x34, 0xc6, 0xa4, 0xb5, 0x6c, + 0xf5, 0x62, 0x58, 0xb4, 0xea, 0x3f, 0x83, 0x8a, 0xc3, 0x55, 0xb3, 0xa6, + 0x8d, 0x4b, 0x31, 0x63, 0x3a, 0xa3, 0x18, 0x4f, 0x34, 0x20, 0xcf, 0xbc, + 0xb8, 0xb4, 0x46, 0x4f, 0x16, 0xb3, 0x6a, 0x8e, 0xc9, 0x66, 0xa6, 0x6e, + 0xe9, 0x2c, 0xa3, 0x73, 0xa7, 0x8b, 0xae, 0xae, 0x60, 0x1b, 0x88, 0x6c, + 0xc4, 0xc2, 0x8a, 0x4b, 0xbf, 0xda, 0x8b, 0x0e, 0xd2, 0x73, 0x5f, 0x78, + 0x96, 0xf1, 0xb5, 0x1f, 0x6f, 0x9b, 0xab, 0xaf, 0xfd, 0xff, 0x28, 0xa0, + 0x6f, 0xfe, 0x7d, 0x4c, 0x9e, 0xe7, 0xcc, 0x04, 0xa5, 0x8c, 0xe3, 0x6c, + 0xf9, 0xad, 0xde, 0xe8, 0x16, 0x31, 0x9b, 0x7c, 0x3d, 0x5e, 0x67, 0x13, + 0xee, 0x76, 0xc4, 0xf5, 0x78, 0xf8, 0x24, 0x96, 0x93, 0x90, 0x46, 0x72, + 0x69, 0x68, 0x2a, 0xee, 0x9d, 0x9c, 0x39, 0x2c, 0x3c, 0xf3, 0xbc, 0x78, + 0xcb, 0x2a, 0x8d, 0x39, 0x9d, 0x8e, 0x9f, 0x06, 0xd5, 0x3e, 0xfe, 0xd2, + 0x7a, 0x7e, 0x33, 0xc5, 0x73, 0x42, 0x4d, 0xe2, 0x8c, 0x59, 0x9a, 0xbc, + 0x13, 0xfa, 0x36, 0xa4, 0xbd, 0x32, 0xa9, 0xc6, 0x73, 0xa1, 0xf9, 0x55, + 0x47, 0x21, 0xf9, 0x25, 0xb4, 0x1d, 0x21, 0x93, 0xc4, 0x7a, 0x1d, 0x34, + 0x12, 0x64, 0x42, 0xd9, 0xa7, 0x88, 0x6d, 0xea, 0x5e, 0xdd, 0x05, 0xae, + 0x4a, 0x7d, 0xf5, 0xc3, 0x63, 0xd4, 0xe9, 0xbf, 0xc5, 0x08, 0x76, 0x41, + 0x2d, 0x5e, 0x7c, 0x6f, 0x21, 0x0e, 0x55, 0xdc, 0x87, 0x10, 0xac, 0x73, + 0xf5, 0xb2, 0xf4, 0x6a, 0x39, 0x2b, 0x06, 0xa9, 0x79, 0xa2, 0xc3, 0x94, + 0x3b, 0x86, 0x40, 0x7a, 0x9a, 0xc3, 0xf4, 0x4b, 0x4f, 0xa4, 0x7b, 0x82, + 0x13, 0x07, 0xaf, 0x7b, 0x48, 0xa4, 0x2f, 0xa2, 0xf4, 0x04, 0x51, 0xcf, + 0x1c, 0xfb, 0xbc, 0x43, 0xaf, 0x8a, 0xbd, 0xcc, 0xef, 0x8c, 0xb4, 0xa0, + 0x54, 0x4c, 0x56, 0xf4, 0x10, 0xe0, 0xfc, 0x7e, 0xfb, 0xf9, 0xfd, 0xf6, + 0xff, 0x77, 0xf6, 0xdb, 0xcf, 0x6f, 0x11, 0x9f, 0xdf, 0x22, 0x3e, 0xbf, + 0x45, 0x7c, 0x7e, 0x8b, 0xf8, 0xfc, 0x16, 0xf1, 0xf9, 0x2d, 0xe2, 0xf3, + 0x5b, 0xc4, 0xe7, 0xb7, 0x88, 0xcf, 0x6f, 0x11, 0x9f, 0xdf, 0x22, 0x3e, + 0xbf, 0x45, 0x7c, 0x7e, 0x8b, 0xf8, 0xff, 0xca, 0x2d, 0xe2, 0xff, 0xff, + 0x77, 0x68, 0xb1, 0x5f, 0xd9, 0x9a, 0x48, 0x1c, 0xde, 0x75, 0x8b, 0x2d, + 0x86, 0xdc, 0x5c, 0xaa, 0x73, 0x34, 0x45, 0x4f, 0x89, 0xbb, 0xca, 0xff, + 0xfd, 0xf3, 0x4c, 0xff, 0x17, 0xee, 0x0d, 0xf7, 0xf1, 0x44, 0xd5, 0xff, + 0xf6, 0x3d, 0xe5, 0xb8, 0x27, 0xb4, 0xce, 0x6f, 0x35, 0x9f, 0xdf, 0x6a, + 0x3e, 0xbf, 0xd5, 0x7c, 0x7e, 0xab, 0xf9, 0x7f, 0xe8, 0x56, 0x33, 0xfe, + 0xfd, 0x2f, 0x50, 0x4b, 0x07, 0x08, 0x5d, 0x9c, 0xb1, 0x3d, 0xe6, 0x52, + 0x00, 0x00, 0xc0, 0x0a, 0x01, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6e, 0x09, 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x20, 0x00, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x41, 0xc8, + 0xb1, 0x61, 0x43, 0xc8, 0xb1, 0x61, 0x41, 0xc8, 0xb1, 0x61, 0x75, 0x78, + 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, + 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, + 0x05, 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x32, 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, + 0x65, 0x6e, 0x2e, 0x6c, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x55, 0x54, 0x0d, + 0x00, 0x07, 0xd3, 0xc1, 0xb1, 0x61, 0xda, 0xc1, 0xb1, 0x61, 0xd3, 0xc1, + 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, + 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0xc1, 0x4a, 0x61, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0x3d, 0x00, 0x20, 0x00, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x2e, 0x6c, 0x70, 0x72, 0x6f, 0x6a, + 0x2f, 0x43, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x2e, 0x72, 0x74, 0x66, + 0x55, 0x54, 0x0d, 0x00, 0x07, 0xab, 0xf4, 0xf9, 0x59, 0x42, 0xc2, 0xb1, + 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, + 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x5d, 0x8e, 0xcb, 0x6e, + 0xc2, 0x30, 0x10, 0x45, 0xd7, 0xf5, 0x57, 0xf8, 0x13, 0x4c, 0x48, 0x52, + 0x28, 0x5b, 0x2a, 0xa5, 0x8b, 0xae, 0x5a, 0x89, 0xcd, 0x6c, 0x9c, 0x30, + 0x49, 0x2c, 0x1c, 0x4f, 0xb0, 0x27, 0x50, 0x84, 0xf8, 0xf7, 0x3a, 0xae, + 0xe8, 0x6b, 0x61, 0x9f, 0xab, 0xd1, 0xb9, 0xa3, 0xb9, 0x82, 0xe7, 0x56, + 0x81, 0x76, 0xc1, 0x5c, 0xa1, 0x25, 0xc7, 0x5c, 0x5b, 0x88, 0x83, 0x36, + 0x9c, 0x4d, 0x08, 0xb2, 0x42, 0x7b, 0x42, 0x36, 0x8d, 0xde, 0xdc, 0xc4, + 0x15, 0x1a, 0xb2, 0xe4, 0xa3, 0xb0, 0x01, 0x8f, 0xfb, 0xac, 0x28, 0xa0, + 0xf3, 0x88, 0x6e, 0x0e, 0xb5, 0x9d, 0x30, 0x32, 0x5a, 0x30, 0xea, 0x11, + 0xfd, 0x79, 0xbd, 0xca, 0xd5, 0x57, 0xec, 0x63, 0x52, 0xf3, 0xd8, 0xef, + 0x81, 0x3f, 0x8a, 0x52, 0xc5, 0x7f, 0xb1, 0xc8, 0x12, 0xca, 0xd5, 0x8c, + 0x2c, 0xcb, 0x13, 0x56, 0x6a, 0xc6, 0x72, 0x99, 0x94, 0xe5, 0x3a, 0x29, + 0x79, 0x9e, 0x94, 0x42, 0x25, 0x25, 0xb6, 0x67, 0x94, 0x8b, 0xa4, 0x94, + 0x8f, 0x51, 0x39, 0x5a, 0x38, 0x3a, 0xcd, 0x93, 0xd7, 0x56, 0x88, 0xf9, + 0xf2, 0x3a, 0xde, 0x9e, 0xe5, 0x12, 0x9a, 0x56, 0xc9, 0x67, 0xd7, 0x19, + 0x87, 0xe8, 0x8d, 0xeb, 0x9e, 0x04, 0xd4, 0x4a, 0x82, 0x78, 0x78, 0xa3, + 0x01, 0xe5, 0x88, 0x34, 0x5a, 0x04, 0x01, 0xb1, 0x53, 0xcb, 0x6a, 0x1a, + 0xb4, 0x93, 0x2f, 0x8e, 0xd1, 0xb7, 0xba, 0x41, 0xb9, 0xc5, 0x60, 0x3a, + 0xf7, 0xb7, 0x41, 0xdc, 0xa3, 0xff, 0xd7, 0x7b, 0xc7, 0xc0, 0xbf, 0x57, + 0x57, 0x34, 0x62, 0x3b, 0x59, 0x7b, 0x91, 0x8e, 0x38, 0xbe, 0x9a, 0xf6, + 0x97, 0xbb, 0xbb, 0xa5, 0x66, 0x1a, 0xd0, 0xb1, 0x66, 0x43, 0x3f, 0xab, + 0x77, 0x3d, 0xe1, 0x09, 0xfd, 0x5d, 0xda, 0x19, 0xee, 0x65, 0x18, 0xb1, + 0x31, 0xda, 0x4a, 0xee, 0xb5, 0x3b, 0x04, 0xc9, 0xf4, 0x6d, 0xbf, 0xd2, + 0x00, 0xe2, 0x26, 0x3e, 0x01, 0x50, 0x4b, 0x07, 0x08, 0x5f, 0x52, 0xc2, + 0x53, 0x11, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0x50, 0x4b, 0x03, + 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0xc1, 0x4a, 0x61, 0x4b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x43, + 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x2e, 0x6c, + 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x6c, 0x69, + 0x73, 0x74, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x54, + 0x0d, 0x00, 0x07, 0xab, 0xf4, 0xf9, 0x59, 0x42, 0xc2, 0xb1, 0x61, 0xd3, + 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, + 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x1d, 0x8a, 0x51, 0x0a, 0x80, 0x20, + 0x10, 0x05, 0xe7, 0xdb, 0x53, 0xf8, 0xed, 0x87, 0x9e, 0x23, 0xe8, 0x12, + 0x91, 0x09, 0x91, 0x64, 0x64, 0x04, 0x76, 0xf8, 0xea, 0x21, 0x0b, 0x3b, + 0xbb, 0xc3, 0x7c, 0x6f, 0xc0, 0x61, 0x19, 0x29, 0xcc, 0x4c, 0x64, 0x56, + 0x1e, 0x16, 0xa2, 0xdc, 0x2d, 0x9e, 0x54, 0x99, 0xc2, 0x2e, 0x5a, 0x31, + 0x69, 0x0f, 0xfa, 0x92, 0x6e, 0xcf, 0xd1, 0xfb, 0xca, 0x25, 0xbb, 0xa9, + 0x6e, 0xbd, 0x72, 0x04, 0x8c, 0xe6, 0x07, 0x50, 0x4b, 0x07, 0x08, 0xf9, + 0x0d, 0xcc, 0x63, 0x49, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x50, + 0x4b, 0x03, 0x04, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0xc1, 0x4a, 0x61, + 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x64, 0x00, + 0x00, 0x3e, 0x00, 0x20, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, + 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x6e, + 0x2e, 0x6c, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x4d, 0x61, 0x69, 0x6e, 0x4d, + 0x65, 0x6e, 0x75, 0x2e, 0x6e, 0x69, 0x62, 0x55, 0x54, 0x0d, 0x00, 0x07, + 0xab, 0xf4, 0xf9, 0x59, 0xd7, 0xc2, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, + 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, + 0x03, 0x00, 0x00, 0xed, 0xbc, 0x77, 0x7c, 0x14, 0x55, 0xd4, 0x3f, 0x3c, + 0xf7, 0x6c, 0xcd, 0x4c, 0xda, 0xa4, 0xf7, 0x6c, 0x7a, 0x65, 0xd3, 0x7b, + 0xc2, 0x2e, 0xd9, 0x25, 0xdb, 0x42, 0x20, 0x24, 0xf4, 0xe6, 0x92, 0x2c, + 0x21, 0x10, 0x92, 0x90, 0x02, 0x84, 0xa2, 0x73, 0x51, 0x7a, 0x11, 0x29, + 0x4a, 0x91, 0x0e, 0xd2, 0xa4, 0x09, 0x52, 0x04, 0x05, 0x51, 0x7a, 0x95, + 0x22, 0x45, 0xa4, 0x09, 0xd8, 0x40, 0x40, 0x44, 0x44, 0x11, 0x7e, 0x77, + 0x66, 0x93, 0x25, 0x51, 0x8c, 0x3e, 0xcf, 0x1f, 0xef, 0xfb, 0x79, 0xdf, + 0xcf, 0xcf, 0x89, 0xd9, 0x99, 0xd9, 0x99, 0xef, 0xf7, 0xdc, 0x73, 0xcf, + 0x3d, 0x6d, 0x86, 0xf4, 0xaf, 0xae, 0x28, 0xaf, 0xad, 0x8b, 0x8f, 0x3f, + 0x4b, 0x21, 0x0a, 0x28, 0x11, 0x25, 0xa6, 0x24, 0x94, 0x94, 0xf9, 0x86, + 0xb9, 0xd9, 0x3d, 0x74, 0x98, 0xa5, 0xa6, 0xb6, 0xbc, 0xaa, 0xb2, 0x7b, + 0x68, 0x55, 0xff, 0x41, 0x96, 0x92, 0xba, 0xda, 0x1e, 0xa1, 0xe6, 0x9a, + 0x92, 0x81, 0xe5, 0xe4, 0x74, 0x71, 0x68, 0x5d, 0x55, 0xb5, 0x0b, 0x85, + 0xc6, 0x2f, 0xd9, 0xc8, 0xc2, 0x37, 0x94, 0x8c, 0x92, 0x53, 0x81, 0x54, + 0x08, 0x15, 0x4a, 0x45, 0x53, 0x4a, 0x2a, 0x91, 0x9a, 0x44, 0xbd, 0x45, + 0xcd, 0xa6, 0xe6, 0x50, 0x6f, 0x53, 0xf3, 0xa9, 0x45, 0xd4, 0x06, 0xea, + 0x43, 0x6a, 0x1b, 0xb5, 0x9d, 0xfa, 0x98, 0xfa, 0x84, 0xda, 0x43, 0xed, + 0xa3, 0x0e, 0x50, 0x07, 0xa9, 0x23, 0xd4, 0x51, 0xea, 0x24, 0x75, 0x86, + 0xba, 0x44, 0x7d, 0x45, 0x5d, 0xa6, 0xbe, 0xa6, 0x6e, 0x50, 0xdf, 0x53, + 0x3f, 0x51, 0xf7, 0xa8, 0xfb, 0xd4, 0x2f, 0xd4, 0x1f, 0xd4, 0x73, 0x44, + 0x21, 0x84, 0x00, 0x49, 0x91, 0x03, 0x72, 0x44, 0x4e, 0xc8, 0x19, 0xb9, + 0x21, 0x5f, 0xe4, 0x87, 0xfc, 0x51, 0x00, 0x0a, 0x46, 0xb1, 0xa8, 0x0d, + 0x52, 0xa2, 0x38, 0x94, 0x84, 0x32, 0x51, 0x16, 0xca, 0x46, 0x39, 0xa8, + 0x1d, 0xd2, 0x23, 0x03, 0x32, 0x22, 0x13, 0xea, 0x88, 0xba, 0xa2, 0x6e, + 0xa8, 0x3b, 0xea, 0x8d, 0x4a, 0xd0, 0x40, 0x54, 0x8e, 0x06, 0xa1, 0x4a, + 0x54, 0x8f, 0x86, 0xa1, 0xe1, 0x68, 0x04, 0x1a, 0x83, 0xde, 0x40, 0xe3, + 0xd0, 0x78, 0x34, 0x09, 0x4d, 0x46, 0x53, 0xd0, 0x9b, 0xe8, 0x1d, 0x34, + 0x17, 0xcd, 0x43, 0x0b, 0xd1, 0x0a, 0xb4, 0x12, 0xbd, 0x87, 0xd6, 0xa2, + 0xcd, 0xe8, 0x43, 0xb4, 0x0d, 0x6d, 0x47, 0xbb, 0xd0, 0x3e, 0xf4, 0x19, + 0xfa, 0x1c, 0x1d, 0x42, 0x27, 0xd1, 0x19, 0x74, 0x16, 0x9d, 0x43, 0x5f, + 0xa2, 0x4b, 0xe8, 0x3a, 0xba, 0x81, 0xbe, 0x41, 0x37, 0xd1, 0x77, 0xe8, + 0x1e, 0xba, 0x8f, 0x1e, 0xa0, 0x9f, 0xd1, 0xaf, 0xe8, 0x4f, 0x40, 0x00, + 0x20, 0x02, 0x31, 0xc8, 0xc1, 0x09, 0x9c, 0x81, 0x05, 0x77, 0xf0, 0x03, + 0x7f, 0x08, 0x80, 0x40, 0x08, 0x81, 0x68, 0x88, 0x81, 0x58, 0x68, 0x03, + 0x09, 0x90, 0x0e, 0x19, 0x90, 0x09, 0x59, 0xa0, 0x02, 0x3d, 0xe4, 0x43, + 0x07, 0x28, 0x80, 0x8e, 0x50, 0x04, 0xbd, 0xa0, 0x37, 0xf4, 0x01, 0x33, + 0x0c, 0x84, 0x72, 0x18, 0x04, 0x83, 0xa1, 0x0a, 0x86, 0xc3, 0x08, 0x68, + 0x80, 0x31, 0xf0, 0x06, 0x8c, 0x83, 0xf1, 0x30, 0x01, 0xa6, 0xc0, 0x4c, + 0x98, 0x05, 0xb3, 0x61, 0x2e, 0x2c, 0x81, 0xa5, 0xb0, 0x0c, 0xde, 0x83, + 0xf5, 0xb0, 0x01, 0x36, 0xc2, 0x16, 0xf8, 0x08, 0x3e, 0x81, 0x3d, 0xb0, + 0x17, 0x3e, 0x85, 0xfd, 0x70, 0x0c, 0x8e, 0xc3, 0x09, 0x38, 0x0d, 0x17, + 0xe1, 0x12, 0x7c, 0x05, 0x57, 0xe1, 0x36, 0xfc, 0x00, 0x3f, 0xc2, 0x1d, + 0xb8, 0x0f, 0x8f, 0xe1, 0x37, 0x78, 0x02, 0x7f, 0x8a, 0xc4, 0x22, 0x89, + 0x48, 0x2a, 0x62, 0x44, 0x2e, 0x22, 0x4f, 0x91, 0x97, 0xc8, 0x57, 0xe4, + 0x27, 0xf2, 0x17, 0x05, 0x8b, 0xa2, 0x44, 0xd1, 0xa2, 0x18, 0x51, 0xac, + 0x28, 0x41, 0x94, 0x2e, 0xca, 0x10, 0x65, 0x8a, 0xda, 0x8a, 0xda, 0x8b, + 0xf2, 0x44, 0x3a, 0x91, 0x5e, 0xd4, 0x41, 0x54, 0x2c, 0xea, 0x22, 0xea, + 0x2a, 0xea, 0x26, 0xea, 0x2d, 0x2a, 0x15, 0x59, 0x44, 0x03, 0x44, 0x83, + 0x44, 0x43, 0x45, 0x35, 0xa2, 0x5a, 0x51, 0x9d, 0x68, 0x84, 0xe8, 0x35, + 0x11, 0x27, 0xc2, 0xa2, 0x71, 0xa2, 0xa9, 0xa2, 0x69, 0xa2, 0xe9, 0xa2, + 0x99, 0xa2, 0x79, 0xa2, 0x85, 0xa2, 0x45, 0xa2, 0xc5, 0xa2, 0xe5, 0xa2, + 0xb5, 0xa2, 0x75, 0xa2, 0xf7, 0x45, 0x9b, 0x44, 0xdb, 0x45, 0x3b, 0x44, + 0x3b, 0x45, 0x1f, 0x8b, 0x3e, 0x17, 0xed, 0x17, 0x1d, 0x10, 0x1d, 0x11, + 0x7d, 0x21, 0x3a, 0x2d, 0x3a, 0x23, 0x3a, 0x2f, 0xba, 0x22, 0xba, 0x21, + 0xfa, 0x46, 0xf4, 0xad, 0xe8, 0x27, 0xd1, 0x3d, 0xd1, 0x7d, 0xd1, 0x2f, + 0xa2, 0x3f, 0x44, 0x4f, 0x45, 0x7f, 0x8a, 0x91, 0x58, 0x2e, 0xb6, 0x17, + 0x3b, 0x88, 0x59, 0xb1, 0x97, 0xd8, 0x5b, 0xec, 0x2f, 0x0e, 0x15, 0x87, + 0x89, 0xc3, 0xc5, 0xd1, 0xe2, 0x04, 0x71, 0xa2, 0x38, 0x49, 0x9c, 0x26, + 0x6e, 0x2b, 0xce, 0x15, 0x6b, 0xc4, 0x5a, 0xb1, 0x5e, 0xdc, 0x51, 0xdc, + 0x49, 0x5c, 0x28, 0xee, 0x22, 0xee, 0x2d, 0xee, 0x23, 0xee, 0x2b, 0xee, + 0x2f, 0x2e, 0x17, 0x0f, 0x12, 0x0f, 0x16, 0x57, 0x89, 0x87, 0x89, 0x87, + 0x8b, 0x47, 0x88, 0x47, 0x8b, 0x5f, 0x17, 0xbf, 0x21, 0x1e, 0x27, 0x9e, + 0x24, 0x9e, 0x21, 0x7e, 0x4b, 0x3c, 0x53, 0xfc, 0xb6, 0x78, 0xa1, 0x78, + 0x91, 0x78, 0xb1, 0x78, 0x89, 0x78, 0x85, 0x78, 0x9d, 0x78, 0x93, 0x78, + 0xb3, 0xf8, 0x03, 0xf1, 0x16, 0xf1, 0x76, 0xf1, 0x27, 0xe2, 0x7d, 0xe2, + 0xcf, 0xc4, 0x9f, 0x8b, 0xf7, 0x8b, 0x0f, 0x8b, 0x4f, 0x89, 0xbf, 0x10, + 0x9f, 0x16, 0x9f, 0x11, 0x9f, 0x17, 0x5f, 0x11, 0x5f, 0x15, 0x5f, 0x13, + 0xdf, 0x14, 0xff, 0x28, 0xbe, 0x23, 0xbe, 0x2b, 0xfe, 0x49, 0xfc, 0xb3, + 0xf8, 0x89, 0xf8, 0x77, 0xf1, 0x1f, 0xe2, 0xe7, 0x12, 0x99, 0x44, 0x2e, + 0xb1, 0x93, 0x38, 0x48, 0xdc, 0x24, 0xee, 0x12, 0x0f, 0x89, 0x8f, 0x24, + 0x48, 0x12, 0x26, 0x09, 0x97, 0x44, 0x48, 0x62, 0x24, 0x89, 0x92, 0x24, + 0x49, 0xb2, 0x24, 0x5d, 0xa2, 0x92, 0xa8, 0x25, 0xed, 0x24, 0xed, 0x25, + 0xf9, 0x92, 0x0e, 0x92, 0x42, 0x49, 0x77, 0x49, 0x0f, 0x49, 0x1f, 0x49, + 0xa9, 0xc4, 0x22, 0x29, 0x97, 0x0c, 0x95, 0xd4, 0x48, 0x86, 0x49, 0x1d, + 0xa4, 0x2e, 0x52, 0x57, 0xa9, 0xbf, 0x34, 0x5a, 0x1a, 0x23, 0x8d, 0x95, + 0x66, 0x4a, 0xdb, 0x4b, 0xf3, 0xa5, 0x1d, 0xa4, 0x05, 0xd2, 0x6e, 0x52, + 0xb3, 0xb4, 0xbf, 0xb4, 0x4c, 0x3a, 0x48, 0x3a, 0x58, 0x5a, 0x29, 0x1d, + 0x2e, 0xe5, 0xa4, 0x58, 0x3a, 0x45, 0x3a, 0x55, 0x3a, 0x4f, 0xba, 0x5c, + 0xba, 0x42, 0xba, 0x5a, 0xba, 0x46, 0xfa, 0x81, 0x74, 0x97, 0x74, 0xbf, + 0xf4, 0x80, 0xf4, 0x82, 0xf4, 0xba, 0xf4, 0x07, 0xe9, 0x2f, 0xd2, 0x47, + 0xd2, 0x67, 0x32, 0xb9, 0xcc, 0x4e, 0xe6, 0x22, 0xf3, 0x95, 0x85, 0xc9, + 0xc2, 0x65, 0xf1, 0xb2, 0x0c, 0x99, 0x46, 0xa6, 0x95, 0x19, 0x65, 0xc5, + 0xb2, 0x2e, 0xb2, 0x9e, 0xb2, 0x52, 0x99, 0x45, 0x56, 0x2e, 0xab, 0x94, + 0x8d, 0x90, 0x35, 0xc8, 0xa6, 0xca, 0xe6, 0xc8, 0x16, 0xc9, 0x56, 0xcb, + 0xd6, 0xc8, 0x36, 0xc9, 0x3e, 0x92, 0xed, 0x92, 0x7d, 0x2a, 0x3b, 0x2a, + 0x3b, 0x26, 0x3b, 0x2b, 0xfb, 0x5a, 0x76, 0x5b, 0xf6, 0xad, 0xec, 0x81, + 0xec, 0x67, 0xd9, 0x73, 0xb9, 0x5c, 0xee, 0x22, 0x77, 0x95, 0x07, 0xca, + 0x23, 0xe4, 0x91, 0xf2, 0x04, 0x79, 0x86, 0x3c, 0x53, 0xae, 0x91, 0x77, + 0x90, 0x17, 0xc8, 0x8b, 0xe4, 0x7d, 0xe4, 0x7d, 0xe5, 0x16, 0x79, 0xa5, + 0xbc, 0x4a, 0xde, 0x20, 0x1f, 0x29, 0x7f, 0x55, 0xfe, 0x9a, 0x9c, 0x93, + 0x8f, 0xb5, 0xf3, 0xa6, 0x25, 0xf4, 0x03, 0xfa, 0x67, 0xfa, 0x21, 0xfd, + 0x0b, 0xfd, 0x88, 0xfe, 0x95, 0x7e, 0x4c, 0xff, 0x46, 0x3f, 0xa1, 0x7f, + 0xa7, 0xff, 0xa0, 0x9f, 0xd2, 0x7f, 0xd2, 0xcf, 0xe8, 0xe7, 0x0c, 0xc5, + 0x20, 0x06, 0x18, 0x11, 0x23, 0x66, 0x24, 0x8c, 0x94, 0x91, 0x31, 0x72, + 0xc6, 0x8e, 0xa1, 0x19, 0x86, 0xb1, 0x67, 0x1c, 0x18, 0x47, 0xc6, 0x89, + 0x71, 0x66, 0x58, 0xc6, 0x85, 0x71, 0x65, 0xdc, 0x18, 0x77, 0xc6, 0x83, + 0xf1, 0x64, 0xbc, 0x18, 0x6f, 0xc6, 0x87, 0xf1, 0x65, 0xfc, 0x18, 0x7f, + 0x26, 0x80, 0x09, 0x64, 0x14, 0x4c, 0x10, 0x13, 0xcc, 0x84, 0x30, 0xa1, + 0x4c, 0x18, 0x13, 0xce, 0x44, 0x30, 0x91, 0x4c, 0x14, 0x13, 0xcd, 0xc4, + 0x30, 0xb1, 0x4c, 0x1b, 0x46, 0xc9, 0xc4, 0x31, 0xf1, 0x4c, 0x02, 0x93, + 0xc8, 0x24, 0x31, 0xc9, 0x4c, 0x0a, 0x93, 0xca, 0xa4, 0x31, 0xe9, 0x4c, + 0x06, 0x93, 0xc9, 0x64, 0x31, 0xd9, 0x4c, 0x0e, 0xd3, 0x96, 0x51, 0x31, + 0x6a, 0xa6, 0x1d, 0x93, 0xcb, 0x68, 0x18, 0x2d, 0xd3, 0x9e, 0xc9, 0x63, + 0x74, 0x8c, 0x9e, 0x31, 0x30, 0x46, 0xc6, 0xc4, 0xe4, 0x33, 0x1d, 0x98, + 0x02, 0xa6, 0x23, 0xd3, 0x89, 0x29, 0x64, 0x3a, 0x33, 0x45, 0x4c, 0x31, + 0xd3, 0x85, 0xe9, 0xca, 0x74, 0x63, 0xba, 0x33, 0x3d, 0x98, 0x9e, 0x4c, + 0x2f, 0xa6, 0x37, 0xd3, 0x87, 0xe9, 0xcb, 0xf4, 0x63, 0x5e, 0x61, 0xcc, + 0x4c, 0x7f, 0xa6, 0x84, 0x29, 0x65, 0x2c, 0xcc, 0x00, 0xa6, 0x8c, 0x19, + 0xc8, 0x94, 0x33, 0x83, 0x98, 0xc1, 0x4c, 0x05, 0x33, 0x84, 0xa9, 0x64, + 0xaa, 0x98, 0x6a, 0x66, 0x28, 0x53, 0xc3, 0xd4, 0x32, 0x75, 0x4c, 0x3d, + 0x33, 0x8c, 0x19, 0xce, 0x8c, 0x60, 0x1a, 0x98, 0x91, 0xcc, 0x28, 0x66, + 0x34, 0x33, 0x86, 0x79, 0x95, 0x79, 0x8d, 0xe1, 0x18, 0xcc, 0x8c, 0x65, + 0x5e, 0x67, 0xde, 0x60, 0xc6, 0x31, 0xe3, 0x99, 0x09, 0xcc, 0x44, 0x66, + 0x12, 0x33, 0x99, 0x99, 0xc2, 0x4c, 0x65, 0xa6, 0x31, 0xd3, 0x99, 0x37, + 0x99, 0x19, 0xcc, 0x5b, 0xcc, 0x4c, 0x66, 0x16, 0x33, 0x9b, 0x99, 0xc3, + 0xbc, 0xcd, 0xbc, 0xc3, 0xcc, 0x65, 0xe6, 0x31, 0xf3, 0x99, 0x05, 0xcc, + 0xbb, 0xcc, 0x42, 0x66, 0x11, 0xb3, 0x98, 0x59, 0xc2, 0x2c, 0x65, 0x96, + 0x31, 0xcb, 0x99, 0x15, 0xcc, 0x4a, 0xe6, 0x3d, 0x66, 0x15, 0xb3, 0x9a, + 0x59, 0xc3, 0xac, 0x65, 0xd6, 0x31, 0xef, 0x33, 0xeb, 0x99, 0x0d, 0xcc, + 0x46, 0x66, 0x13, 0xb3, 0x99, 0xf9, 0x80, 0xd9, 0xc2, 0x6c, 0x65, 0x3e, + 0x64, 0xb6, 0x31, 0xdb, 0x99, 0x1d, 0xcc, 0x4e, 0xe6, 0x23, 0x66, 0x17, + 0xb3, 0x9b, 0xf9, 0x98, 0xf9, 0x84, 0xd9, 0xc3, 0xec, 0x65, 0x3e, 0x65, + 0xf6, 0x31, 0x9f, 0x31, 0x9f, 0x33, 0xfb, 0x99, 0x03, 0xcc, 0x41, 0xe6, + 0x10, 0x73, 0x98, 0x39, 0xc2, 0x1c, 0x65, 0x8e, 0x31, 0xc7, 0x99, 0x13, + 0xcc, 0x49, 0xe6, 0x14, 0xf3, 0x05, 0x73, 0x9a, 0x39, 0xc3, 0x9c, 0x65, + 0xce, 0x31, 0x5f, 0x32, 0xe7, 0x99, 0x0b, 0xcc, 0x45, 0xe6, 0x12, 0xf3, + 0x35, 0x73, 0xad, 0x4b, 0x68, 0x65, 0x7d, 0x45, 0xc5, 0x57, 0x94, 0x1d, + 0x45, 0x53, 0x0c, 0x65, 0x4f, 0x39, 0x50, 0x8e, 0x94, 0x13, 0xe5, 0x4c, + 0xb1, 0x94, 0x0b, 0xe5, 0x4a, 0xb9, 0x51, 0xee, 0x94, 0x07, 0xe5, 0x49, + 0x79, 0x51, 0xde, 0x94, 0x0f, 0xf9, 0xdf, 0x8f, 0xf2, 0xa7, 0x02, 0xba, + 0x16, 0x14, 0x75, 0xae, 0xaa, 0xaa, 0xeb, 0x53, 0x50, 0xa4, 0xa9, 0xaa, + 0xac, 0x24, 0x21, 0x82, 0x44, 0x8b, 0xda, 0xde, 0x05, 0x45, 0x1d, 0xcb, + 0x4b, 0x6b, 0xbb, 0x9a, 0x2b, 0xea, 0x2d, 0xb5, 0xfd, 0x9c, 0x9d, 0xc8, + 0xa1, 0x35, 0x7c, 0x58, 0xcf, 0xf4, 0xb1, 0x1d, 0x9b, 0x2c, 0x0d, 0xe4, + 0x7b, 0xef, 0x82, 0xa2, 0x76, 0x25, 0x25, 0x96, 0xda, 0xda, 0xf2, 0xfe, + 0xe5, 0x15, 0xe5, 0x75, 0x0d, 0xcd, 0xef, 0x75, 0x2e, 0x28, 0xea, 0x5a, + 0x4e, 0xbe, 0xa8, 0xb0, 0x74, 0x2b, 0xaf, 0x2c, 0xad, 0x1a, 0x4e, 0x4e, + 0x79, 0xbe, 0xe4, 0xf2, 0x97, 0x03, 0x35, 0x8a, 0x54, 0x55, 0x53, 0xdb, + 0x35, 0xb4, 0xa4, 0xc2, 0x5c, 0x5b, 0xdb, 0xd3, 0x2a, 0x18, 0x7f, 0x35, + 0x07, 0x9c, 0x0c, 0xa3, 0x5f, 0x31, 0xfa, 0x05, 0xa3, 0x37, 0x31, 0x5c, + 0xe7, 0x24, 0xe4, 0x17, 0x86, 0x6b, 0x18, 0x6e, 0x60, 0xf4, 0xe8, 0x34, + 0xa5, 0x20, 0x63, 0x0e, 0xa2, 0x82, 0x7b, 0x91, 0x81, 0xf1, 0x77, 0x16, + 0x98, 0x87, 0x58, 0x38, 0x11, 0x27, 0x26, 0xb2, 0xb7, 0xab, 0x26, 0xf1, + 0xb2, 0xc4, 0xcc, 0x8f, 0xf4, 0x34, 0x15, 0x46, 0x85, 0x53, 0x11, 0x54, + 0x64, 0x4f, 0x2b, 0x7e, 0x25, 0xb9, 0xaa, 0xbb, 0x75, 0xd7, 0x52, 0xdb, + 0x97, 0xdc, 0x5a, 0x5f, 0x5b, 0x57, 0x35, 0xc4, 0x3a, 0xd8, 0x65, 0xe4, + 0xba, 0xa8, 0xee, 0x4d, 0x43, 0x3f, 0x4d, 0xc5, 0x10, 0x82, 0x58, 0xaa, + 0x0d, 0x11, 0x49, 0xd9, 0x18, 0x5c, 0x97, 0x70, 0x52, 0x2b, 0x60, 0x1c, + 0x15, 0x4f, 0x54, 0xd8, 0xa1, 0xbe, 0xce, 0x4c, 0xc6, 0x5d, 0x64, 0xa9, + 0x5b, 0x4e, 0xce, 0x24, 0x50, 0x51, 0x5d, 0x0a, 0x8a, 0xc8, 0x81, 0xf5, + 0xce, 0x24, 0x6a, 0xe2, 0x46, 0xe7, 0x62, 0x2a, 0x99, 0x4a, 0xa1, 0x52, + 0xa9, 0x34, 0x2a, 0x9d, 0xca, 0xa0, 0x32, 0xa9, 0x2c, 0x2a, 0x9b, 0xca, + 0xa1, 0xda, 0x52, 0x2a, 0x4a, 0x4d, 0xb5, 0xa3, 0x72, 0x29, 0x0d, 0xa5, + 0xa5, 0xda, 0x53, 0x79, 0x94, 0x8e, 0xd2, 0x53, 0x06, 0xca, 0x48, 0x99, + 0xa8, 0x7c, 0xaa, 0x03, 0x55, 0x40, 0x75, 0xa4, 0x3a, 0x51, 0x85, 0x54, + 0x67, 0xaa, 0x88, 0x2a, 0xa6, 0xba, 0x50, 0x5d, 0xa9, 0x6e, 0x54, 0x77, + 0xaa, 0x07, 0xd5, 0x93, 0xea, 0x45, 0xf5, 0xa6, 0xfa, 0x50, 0x7d, 0xa9, + 0x7e, 0xd4, 0x2b, 0x94, 0x99, 0xea, 0x4f, 0x95, 0x50, 0xa5, 0x94, 0x85, + 0x1a, 0x40, 0x95, 0x51, 0x03, 0xa9, 0x72, 0x6a, 0x10, 0x35, 0x98, 0xaa, + 0xa0, 0x86, 0x50, 0x95, 0x54, 0x15, 0x55, 0x4d, 0x0d, 0xa5, 0x6a, 0xa8, + 0x5a, 0xaa, 0x8e, 0xaa, 0xa7, 0x86, 0x51, 0xc3, 0xa9, 0x11, 0x54, 0x03, + 0x35, 0x92, 0x1a, 0x45, 0x8d, 0xa6, 0xc6, 0x50, 0xaf, 0x52, 0xaf, 0x51, + 0x1c, 0x85, 0xa9, 0xb1, 0xd4, 0xeb, 0xd4, 0x1b, 0xd4, 0x38, 0x6a, 0x3c, + 0x35, 0x81, 0x93, 0x73, 0x0e, 0x9c, 0x2f, 0xa7, 0xe0, 0xc2, 0xb8, 0x18, + 0x2e, 0x9e, 0x4b, 0xe1, 0x32, 0x39, 0x15, 0xa7, 0xe5, 0xf4, 0x5c, 0x07, + 0xae, 0x33, 0xd7, 0x83, 0xeb, 0xc3, 0x99, 0xb9, 0x01, 0xdc, 0x20, 0xae, + 0x9a, 0xab, 0xe7, 0x46, 0x72, 0x1c, 0xf7, 0x06, 0x37, 0x89, 0x9b, 0xce, + 0xcd, 0xe2, 0xe6, 0x71, 0x0b, 0xb9, 0x65, 0xdc, 0x7b, 0xdc, 0x3a, 0x6e, + 0x23, 0xb7, 0x85, 0xdb, 0xce, 0x7d, 0xcc, 0x7d, 0xca, 0xed, 0xe7, 0x8e, + 0x70, 0x27, 0xb8, 0xd3, 0xdc, 0x45, 0xee, 0x0a, 0x77, 0x83, 0xfb, 0x96, + 0xbb, 0xc3, 0xdd, 0xe7, 0x1e, 0x71, 0x4f, 0xb8, 0x3f, 0x31, 0x02, 0x8c, + 0xa4, 0x18, 0xd1, 0x18, 0x39, 0x62, 0xe4, 0x82, 0x91, 0x07, 0x46, 0x3e, + 0x18, 0x05, 0x60, 0x14, 0x8c, 0x51, 0x18, 0x46, 0x51, 0x18, 0xb5, 0xc1, + 0x28, 0x11, 0xa3, 0x54, 0x8c, 0x32, 0x31, 0x6a, 0x8b, 0x51, 0x2e, 0x46, + 0x79, 0x18, 0x19, 0x31, 0xea, 0x88, 0x51, 0x17, 0x8c, 0x7a, 0x61, 0xf4, + 0x0a, 0x46, 0xa5, 0x18, 0x95, 0x63, 0x34, 0x04, 0xa3, 0xa1, 0x18, 0xd5, + 0x63, 0x34, 0x12, 0xa3, 0x57, 0x31, 0x1a, 0x8b, 0xd1, 0x38, 0x8c, 0x26, + 0x62, 0x34, 0x05, 0xa3, 0xe9, 0x67, 0xa9, 0xc9, 0xd4, 0x14, 0x6a, 0x2a, + 0x99, 0x04, 0x37, 0x6a, 0x3a, 0xf5, 0x26, 0x35, 0x83, 0x4c, 0x6a, 0x51, + 0x55, 0x7d, 0x4d, 0x89, 0x85, 0x18, 0x87, 0xd6, 0x52, 0x5b, 0x57, 0x5e, + 0x29, 0x18, 0x47, 0xb7, 0x82, 0xa2, 0x7c, 0x73, 0x7f, 0x4b, 0x05, 0xb1, + 0x34, 0x3b, 0x8e, 0xe1, 0xec, 0xad, 0x36, 0x35, 0x93, 0x0a, 0xe6, 0x68, + 0x4e, 0xdc, 0x8b, 0x58, 0x91, 0xd6, 0x52, 0x61, 0x29, 0x33, 0xd7, 0x59, + 0xba, 0x97, 0x36, 0xee, 0x58, 0x67, 0xff, 0x1d, 0x6a, 0x6e, 0x3f, 0x67, + 0xb7, 0x82, 0xa2, 0x82, 0xf2, 0xfe, 0x1d, 0xeb, 0xeb, 0x2a, 0x2c, 0x75, + 0x36, 0x33, 0x5e, 0x4e, 0xbe, 0x9b, 0x47, 0x45, 0xf5, 0x15, 0xbe, 0xb3, + 0x9d, 0x3d, 0x43, 0xe4, 0xe1, 0xa5, 0x59, 0x40, 0xbd, 0x4b, 0x2d, 0xe4, + 0x1c, 0x39, 0x6f, 0xce, 0xe7, 0x02, 0xb5, 0x98, 0x5a, 0x42, 0x2d, 0x25, + 0x27, 0x97, 0x51, 0xcb, 0xa9, 0x15, 0xd4, 0x4a, 0xea, 0x3d, 0x6a, 0x15, + 0xb5, 0x9a, 0x5a, 0x43, 0xad, 0xa5, 0xd6, 0x51, 0xef, 0x53, 0xeb, 0x89, + 0xa4, 0x1d, 0x2a, 0x2d, 0x43, 0xaa, 0x2a, 0xcb, 0x4b, 0xf2, 0xab, 0x4a, + 0xc8, 0x22, 0xee, 0x60, 0xa9, 0xac, 0xef, 0xe7, 0xcc, 0x16, 0x14, 0x91, + 0xb5, 0xd1, 0x7e, 0x68, 0x7d, 0xf9, 0xb0, 0x0e, 0x55, 0xa5, 0x1d, 0xcc, + 0xb5, 0x83, 0x7b, 0x10, 0x83, 0xad, 0x34, 0x0c, 0x31, 0x97, 0x59, 0x7a, + 0xbe, 0xf8, 0x8e, 0x8c, 0xac, 0xb8, 0x9c, 0x48, 0xc6, 0x1b, 0x69, 0xf9, + 0x08, 0x4b, 0xa9, 0xf0, 0xbd, 0xcb, 0x6b, 0xcf, 0x9f, 0x3f, 0xe7, 0x9c, + 0x5c, 0x88, 0xbf, 0xa0, 0x38, 0x2f, 0xce, 0x85, 0x63, 0x39, 0x67, 0xce, + 0xe3, 0x2c, 0x91, 0x61, 0x23, 0x91, 0x60, 0x13, 0xb5, 0x99, 0xfa, 0x80, + 0xda, 0x42, 0x6d, 0xed, 0x65, 0xe5, 0x32, 0xd4, 0x59, 0x86, 0xd4, 0x12, + 0x5e, 0x7e, 0x5d, 0x61, 0xb4, 0x14, 0xa3, 0x1f, 0x31, 0xfa, 0x01, 0xa3, + 0xbb, 0xfd, 0x9c, 0x5d, 0x72, 0x6b, 0xca, 0x2b, 0xcb, 0x14, 0xed, 0x2a, + 0x2a, 0x14, 0x75, 0x55, 0x8a, 0xbc, 0x9a, 0xaa, 0xca, 0xba, 0x4e, 0x67, + 0xa8, 0x1d, 0x04, 0x67, 0x27, 0xf5, 0x11, 0xb5, 0x8b, 0xda, 0xdd, 0x7c, + 0x49, 0x12, 0x55, 0x74, 0xb6, 0xd4, 0x0a, 0xca, 0x17, 0x56, 0xa8, 0x2b, + 0xe7, 0xce, 0xb9, 0x11, 0xf1, 0x04, 0x89, 0x04, 0xcf, 0xc3, 0x93, 0x69, + 0x06, 0x5a, 0x4a, 0x06, 0x0f, 0x31, 0xd7, 0x0c, 0xb6, 0x2a, 0x78, 0x2f, + 0xf5, 0xa9, 0xe0, 0x58, 0xac, 0xab, 0xb3, 0xe9, 0xfe, 0x65, 0xe4, 0x7c, + 0x54, 0x73, 0xa2, 0xfd, 0x02, 0x9a, 0xa7, 0x70, 0x29, 0x8f, 0x22, 0x0c, + 0xb5, 0xa8, 0xce, 0x36, 0x4f, 0x87, 0xa8, 0xc3, 0x3d, 0x5f, 0x0c, 0x66, + 0x19, 0x39, 0x8e, 0x22, 0x8c, 0xe6, 0x9a, 0x1a, 0x73, 0x65, 0x99, 0xc5, + 0x50, 0x29, 0x48, 0x9e, 0x69, 0xbd, 0xf4, 0x18, 0x75, 0xbc, 0x9f, 0xb3, + 0x7b, 0xd3, 0xb4, 0xd5, 0xd5, 0x54, 0x55, 0x34, 0x9b, 0xd3, 0x63, 0xd4, + 0x89, 0x7f, 0x9c, 0xd3, 0x53, 0xd4, 0x17, 0x64, 0x4e, 0xfd, 0xb8, 0xc0, + 0xd6, 0xe7, 0xf4, 0x3c, 0x75, 0x81, 0x5a, 0xcf, 0x39, 0x09, 0x6a, 0x0f, + 0xe0, 0xfc, 0x39, 0x8f, 0xee, 0x1d, 0xca, 0x2b, 0xcb, 0x87, 0x94, 0x8f, + 0xb4, 0x14, 0x0e, 0xe9, 0xe7, 0xec, 0x5a, 0x6d, 0xa9, 0x19, 0x50, 0x55, + 0x33, 0x84, 0x3f, 0x67, 0xae, 0xab, 0xaf, 0x21, 0xa7, 0x33, 0x5f, 0x18, + 0xf1, 0x15, 0x62, 0xc6, 0xd7, 0x08, 0x49, 0x10, 0xb1, 0xd3, 0x50, 0xce, + 0xe7, 0x3c, 0x39, 0xb5, 0x84, 0x50, 0x35, 0x91, 0xac, 0xa1, 0x6e, 0x12, + 0x22, 0xde, 0x6c, 0xbe, 0x25, 0x14, 0x5e, 0x5c, 0xb0, 0x30, 0xb3, 0x21, + 0x2d, 0x67, 0xf6, 0x47, 0xea, 0x0e, 0x75, 0x57, 0x98, 0xc6, 0xb7, 0x31, + 0x9a, 0x8d, 0xd1, 0x0a, 0xe2, 0xa5, 0xdb, 0xf5, 0xaf, 0xaa, 0xaf, 0x53, + 0x14, 0x5b, 0x6a, 0x86, 0x90, 0xf5, 0x50, 0xa1, 0x28, 0xa8, 0xaa, 0x2b, + 0x1f, 0x50, 0x6e, 0xa9, 0xe9, 0xe7, 0xec, 0x5f, 0x55, 0x53, 0x6a, 0xa9, + 0x11, 0xd4, 0x43, 0xb4, 0x59, 0x59, 0x6a, 0xae, 0x29, 0x15, 0xae, 0xed, + 0x64, 0xae, 0xb4, 0x54, 0x64, 0x36, 0x8d, 0xfc, 0x01, 0xf5, 0x33, 0x11, + 0x2a, 0x9c, 0x8b, 0x7e, 0xf9, 0xc8, 0x1f, 0x35, 0x8e, 0xfc, 0x37, 0xea, + 0x09, 0x11, 0x2b, 0x42, 0x18, 0x79, 0x14, 0x17, 0xc9, 0x79, 0x9c, 0x21, + 0x17, 0x6c, 0x24, 0x97, 0x3e, 0xa5, 0xfe, 0xa4, 0x36, 0x63, 0xf4, 0x1e, + 0x46, 0xab, 0x88, 0x60, 0x16, 0xe2, 0xf3, 0xaa, 0x89, 0x2f, 0xab, 0x54, + 0x84, 0x17, 0x56, 0xf5, 0xa9, 0xaa, 0xb6, 0x54, 0x6a, 0xab, 0x4a, 0xea, + 0x87, 0x58, 0xc8, 0x0c, 0x35, 0x12, 0x22, 0x11, 0x12, 0x13, 0xc2, 0x58, + 0x2e, 0xae, 0x55, 0x42, 0x44, 0x23, 0xc6, 0x46, 0xa8, 0xe4, 0xda, 0x70, + 0x1e, 0x5d, 0x34, 0x15, 0x55, 0xb5, 0x96, 0xc2, 0xe1, 0x7d, 0x1a, 0xb5, + 0x2c, 0x1c, 0xda, 0x50, 0x59, 0xe4, 0x42, 0x50, 0x13, 0xb8, 0xe4, 0xd6, + 0x51, 0xbd, 0x90, 0xb7, 0x0d, 0x35, 0x89, 0x4b, 0xe4, 0x3c, 0x2c, 0xc4, + 0x39, 0x9b, 0x89, 0x6b, 0xb5, 0x10, 0x81, 0x6b, 0xfb, 0xd4, 0x9a, 0x87, + 0x59, 0xfe, 0x26, 0x70, 0x20, 0x52, 0x10, 0xe8, 0x54, 0x2e, 0x83, 0xf3, + 0xb9, 0xf8, 0x02, 0x1a, 0x85, 0xbc, 0x00, 0x47, 0x61, 0xd6, 0x15, 0x8f, + 0xa2, 0x50, 0x34, 0xb5, 0x9e, 0x2c, 0xe5, 0xe2, 0xaa, 0xaa, 0x8a, 0xe2, + 0xf2, 0x6a, 0x2e, 0xc2, 0x85, 0x5c, 0xda, 0xb4, 0x4a, 0xd3, 0xb9, 0x34, + 0xce, 0xa3, 0x4f, 0x27, 0xb2, 0x60, 0x14, 0x24, 0xbc, 0xd4, 0x57, 0x2b, + 0x95, 0xca, 0xc2, 0x4e, 0x7d, 0x6b, 0xea, 0x2b, 0xf9, 0x53, 0xf9, 0xe6, + 0x06, 0x32, 0x35, 0x36, 0xce, 0x78, 0x94, 0x40, 0x38, 0xb3, 0xb8, 0xb6, + 0xad, 0x0f, 0x27, 0x0d, 0xa5, 0xdb, 0x86, 0x93, 0xc3, 0x65, 0x73, 0x1e, + 0x03, 0x48, 0xc4, 0xa9, 0x21, 0x31, 0xa4, 0x92, 0xaa, 0x23, 0x03, 0xaa, + 0xee, 0x5a, 0x4d, 0xd6, 0xf8, 0x0b, 0xd4, 0xb6, 0x48, 0x45, 0x50, 0xd5, + 0x9c, 0xa6, 0x75, 0xd4, 0xf6, 0x28, 0xcf, 0x86, 0x9a, 0xcb, 0xb5, 0xe3, + 0x3c, 0x8a, 0x0a, 0x2c, 0xc3, 0x0b, 0x2b, 0x7b, 0x57, 0x5a, 0x86, 0xff, + 0x4d, 0x39, 0xf9, 0xa8, 0x03, 0x81, 0x6c, 0xcf, 0xe9, 0x5e, 0x66, 0xd1, + 0x8f, 0xac, 0x16, 0x8d, 0x8a, 0x05, 0x8b, 0x8e, 0x10, 0xb4, 0x90, 0xc7, + 0x79, 0x90, 0xd5, 0xdb, 0xd9, 0x42, 0x4a, 0xdb, 0x3a, 0xde, 0xf1, 0x14, + 0x11, 0x95, 0x97, 0xf6, 0x73, 0xf6, 0xa8, 0x11, 0xce, 0x34, 0xe1, 0x17, + 0x57, 0x09, 0xe7, 0x6d, 0x34, 0x3d, 0x50, 0x4f, 0x42, 0x63, 0xe0, 0xf2, + 0x5f, 0x2a, 0x39, 0xea, 0xd3, 0xe4, 0x73, 0x91, 0x99, 0x50, 0x19, 0x1b, + 0x15, 0x6e, 0x6a, 0xb1, 0x78, 0x90, 0x05, 0x0d, 0x40, 0x65, 0xc2, 0xe2, + 0x59, 0x8b, 0xd1, 0x1a, 0x8c, 0xd6, 0xf5, 0xd4, 0x54, 0x58, 0xcc, 0x35, + 0x0a, 0xab, 0x4b, 0x76, 0x2f, 0xe1, 0x0f, 0x3a, 0x5b, 0x4a, 0x08, 0x7b, + 0x93, 0x14, 0xb5, 0x36, 0xfe, 0xc1, 0xa8, 0x82, 0xf0, 0x17, 0x70, 0x85, + 0x2f, 0xd7, 0xdc, 0xcd, 0x46, 0xcd, 0xd5, 0xa0, 0x5a, 0xc2, 0x1f, 0x2c, + 0xf0, 0x77, 0xe2, 0x3a, 0xf2, 0x43, 0xf5, 0xd0, 0x97, 0x97, 0x5a, 0xfe, + 0xbe, 0x3c, 0x0b, 0x07, 0x76, 0x19, 0x48, 0xbe, 0x78, 0xe1, 0x1f, 0x50, + 0x03, 0x1a, 0x89, 0x46, 0x11, 0x92, 0x22, 0xae, 0x2b, 0xd7, 0xbd, 0x75, + 0x1a, 0x12, 0x28, 0x6d, 0x34, 0x5d, 0xb8, 0x62, 0x81, 0xa6, 0xb0, 0xbe, + 0xfc, 0x25, 0x5e, 0xa0, 0x70, 0xa8, 0x10, 0x0d, 0xd1, 0x04, 0x12, 0x0d, + 0xbb, 0xfd, 0x35, 0xab, 0xea, 0x59, 0x67, 0xbd, 0xbc, 0xee, 0xc5, 0x32, + 0x9a, 0x8a, 0xa6, 0x11, 0x11, 0x7a, 0x72, 0xbd, 0xff, 0x41, 0x00, 0xf4, + 0x56, 0xe3, 0x38, 0xe7, 0xf0, 0x02, 0xb8, 0x90, 0x1c, 0x95, 0x6a, 0x1c, + 0x6c, 0x2f, 0xce, 0xa3, 0x97, 0x30, 0xd4, 0x8e, 0x75, 0x03, 0x2d, 0x35, + 0x24, 0x49, 0xf4, 0xe0, 0xc7, 0x27, 0x1c, 0x34, 0xa3, 0x7c, 0xa1, 0xd1, + 0xf9, 0x68, 0x01, 0x61, 0xea, 0xcb, 0xbd, 0xd2, 0xea, 0x50, 0xc9, 0x8c, + 0x2e, 0xb3, 0x0d, 0x95, 0xe5, 0xfa, 0x11, 0x8f, 0x5b, 0x34, 0xb0, 0x6a, + 0x38, 0x1f, 0xb5, 0x08, 0x43, 0x7d, 0x25, 0xcf, 0x41, 0xf6, 0x5f, 0xca, + 0xb0, 0x0a, 0xad, 0x26, 0x0c, 0xfd, 0x39, 0xcb, 0xcb, 0x6d, 0x66, 0x9d, + 0x8d, 0x61, 0x23, 0x61, 0x28, 0x69, 0x64, 0x28, 0xb5, 0x79, 0x36, 0xf4, + 0x01, 0xda, 0xc2, 0x7b, 0xb6, 0x7d, 0x18, 0x7d, 0x46, 0xac, 0xa6, 0x4f, + 0x51, 0x5d, 0x55, 0xb5, 0xa2, 0xa8, 0xda, 0x62, 0x1e, 0x4c, 0xc2, 0x66, + 0x1f, 0x12, 0xd1, 0xaa, 0x9b, 0x0e, 0x6c, 0x8c, 0x3b, 0xd0, 0x4e, 0xc2, + 0x58, 0xc6, 0x95, 0xff, 0x1b, 0xe3, 0xde, 0x66, 0x8c, 0x03, 0x39, 0x8f, + 0xbe, 0xc4, 0x3f, 0x93, 0xd5, 0xd0, 0x84, 0xd7, 0xb7, 0x96, 0x3f, 0xfc, + 0x1b, 0xfa, 0x7e, 0x74, 0x80, 0xa0, 0x0f, 0xe6, 0xaa, 0x5e, 0x8e, 0x7e, + 0xb8, 0xd1, 0x38, 0x8e, 0xa1, 0xe3, 0x04, 0xbd, 0x42, 0x40, 0xaf, 0xe4, + 0x86, 0xbc, 0x18, 0xcf, 0x29, 0xf4, 0x05, 0x3f, 0x9e, 0x8d, 0x18, 0x6d, + 0x22, 0xe3, 0x29, 0xd6, 0x54, 0x55, 0x37, 0x14, 0x96, 0x74, 0x29, 0x21, + 0x1f, 0x36, 0x8a, 0xf3, 0xe8, 0x02, 0xa1, 0x18, 0xca, 0xd5, 0xb5, 0x4e, + 0x71, 0x05, 0x5d, 0xb5, 0x51, 0xd4, 0x72, 0x35, 0x9c, 0x47, 0xcf, 0x22, + 0x92, 0x59, 0x95, 0xd4, 0xf1, 0xd3, 0x52, 0x68, 0xee, 0x59, 0x2b, 0x1c, + 0x90, 0x7d, 0x1b, 0xee, 0x2d, 0x74, 0x9b, 0xe0, 0x0e, 0xe3, 0x1a, 0x5a, + 0xc7, 0xbd, 0x83, 0xee, 0xda, 0x70, 0x47, 0x70, 0xc3, 0x89, 0xe3, 0xd1, + 0xd4, 0xd7, 0x15, 0x8e, 0x28, 0x2e, 0x69, 0xe6, 0x19, 0x1f, 0xa2, 0x5f, + 0x08, 0xd4, 0x28, 0xee, 0xb5, 0x97, 0x43, 0x3d, 0x6e, 0x84, 0xfa, 0x1d, + 0xfd, 0x41, 0xa0, 0x46, 0x0b, 0x50, 0xaf, 0x72, 0x63, 0x5e, 0x68, 0xe1, + 0x19, 0x7a, 0xce, 0x6b, 0x61, 0x3b, 0x46, 0x3b, 0x88, 0x16, 0x48, 0x1a, + 0x24, 0x24, 0x2d, 0x8a, 0xa6, 0x25, 0x4f, 0x56, 0xce, 0xf0, 0xc2, 0xac, + 0xbe, 0x25, 0xfc, 0x49, 0x32, 0x03, 0x15, 0x15, 0xcd, 0x66, 0x00, 0x24, + 0x20, 0x25, 0xdc, 0x98, 0x7b, 0xbd, 0xd5, 0x61, 0x50, 0xeb, 0xc0, 0xc1, + 0x36, 0x0c, 0x96, 0x1b, 0xcb, 0x79, 0x74, 0xe5, 0x33, 0xd0, 0x3a, 0x4b, + 0xb7, 0x52, 0xe1, 0xc3, 0x06, 0xe7, 0x02, 0xae, 0x04, 0x6e, 0x1c, 0x37, + 0xb1, 0x55, 0x38, 0xf0, 0x06, 0x1f, 0x1b, 0xdc, 0x04, 0x6e, 0x3c, 0x89, + 0x84, 0x9d, 0xcc, 0xb5, 0x75, 0x96, 0xc2, 0x61, 0x5d, 0xab, 0xf9, 0x4f, + 0x1b, 0x9c, 0x02, 0x82, 0x08, 0xdc, 0x64, 0x6e, 0x5a, 0xab, 0x9a, 0x81, + 0x08, 0x88, 0xb4, 0x69, 0x66, 0x2a, 0x37, 0x85, 0x77, 0x1e, 0xde, 0xc2, + 0x9a, 0x6a, 0x1a, 0xae, 0x82, 0xe4, 0x0a, 0x0a, 0x5d, 0x8d, 0x79, 0x08, + 0xc9, 0xe4, 0x0a, 0x33, 0x89, 0xb3, 0xae, 0x25, 0xdf, 0xea, 0x48, 0x95, + 0x58, 0xdb, 0x22, 0x73, 0x00, 0x25, 0xc4, 0x11, 0xbe, 0x37, 0xb9, 0x99, + 0xad, 0x8b, 0x9f, 0x02, 0xa9, 0x36, 0xf1, 0xdf, 0xe2, 0x66, 0x70, 0x1e, + 0xc5, 0x5d, 0x48, 0x81, 0x59, 0x38, 0xb2, 0x4b, 0x3d, 0xf9, 0xb0, 0x81, + 0x65, 0x43, 0x0e, 0x01, 0x9b, 0xcd, 0xcd, 0x6d, 0x11, 0x64, 0xa9, 0xe5, + 0xa0, 0xb6, 0xc2, 0x41, 0xbb, 0x46, 0x38, 0x2d, 0xb4, 0x07, 0x12, 0x9e, + 0x48, 0x8d, 0x56, 0x6c, 0x2e, 0xe3, 0xe6, 0x08, 0xb0, 0xef, 0x38, 0x03, + 0xf7, 0xb6, 0x6d, 0x8a, 0xc1, 0x00, 0x46, 0x7e, 0x8a, 0xb7, 0x62, 0xf4, + 0x21, 0x99, 0xe2, 0x1e, 0x79, 0xa4, 0xa0, 0x55, 0x14, 0x58, 0x46, 0xd4, + 0x15, 0x96, 0x91, 0x74, 0xa9, 0x31, 0x7b, 0xe0, 0x4f, 0x0a, 0xc3, 0x69, + 0x27, 0x94, 0xd2, 0x36, 0x39, 0x3a, 0x09, 0x72, 0xcc, 0xff, 0x77, 0x39, + 0xba, 0x41, 0x77, 0xe8, 0x41, 0x06, 0x66, 0x95, 0xe0, 0x5d, 0x67, 0xc4, + 0x2d, 0xe0, 0xb3, 0x89, 0x3c, 0x21, 0xf8, 0x96, 0x92, 0xe0, 0x3b, 0xa0, + 0x09, 0xb2, 0x2f, 0xf4, 0x23, 0x90, 0x8b, 0xb8, 0xa5, 0x2f, 0xd5, 0x93, + 0x0d, 0xd0, 0x02, 0x03, 0x6c, 0x70, 0x4b, 0xb8, 0xc5, 0xfc, 0xbc, 0xb0, + 0xc6, 0xfa, 0x21, 0xd5, 0x42, 0x90, 0x14, 0x56, 0x14, 0x91, 0xb3, 0x70, + 0x10, 0xc9, 0xeb, 0xf8, 0x10, 0x65, 0xa9, 0xb1, 0x9d, 0x33, 0x54, 0x36, + 0x56, 0xee, 0xed, 0x6a, 0x2c, 0x66, 0xdb, 0x40, 0x2a, 0x84, 0x81, 0x2c, + 0x6f, 0x65, 0x20, 0xd6, 0xac, 0x05, 0x6a, 0xa1, 0x0e, 0xea, 0x6d, 0xcc, + 0x2b, 0x9d, 0x45, 0xdc, 0x0a, 0x92, 0xa6, 0x08, 0x4a, 0xeb, 0x44, 0x82, + 0x72, 0x79, 0x55, 0x7d, 0x6d, 0xa1, 0xae, 0x09, 0x75, 0x24, 0xf0, 0x21, + 0x6a, 0x15, 0xb7, 0xf6, 0x1f, 0xe6, 0xbc, 0x11, 0x13, 0xc3, 0x58, 0xdb, + 0x9c, 0xaf, 0xe1, 0x56, 0x93, 0x39, 0xef, 0x6c, 0x21, 0x73, 0xde, 0xb3, + 0x4b, 0x8d, 0xa5, 0xd9, 0x9c, 0x4f, 0x84, 0x49, 0x04, 0xec, 0x7d, 0x6e, + 0x43, 0xab, 0x06, 0x4b, 0x96, 0xd3, 0x0c, 0x9b, 0xc1, 0xb2, 0xdc, 0x7a, + 0x5e, 0x31, 0xbe, 0xd6, 0x45, 0x6b, 0xb3, 0xd8, 0x6e, 0x03, 0xcb, 0x2b, + 0x48, 0x90, 0x6d, 0xa8, 0x26, 0x07, 0xfd, 0x9c, 0x03, 0xea, 0xaa, 0xca, + 0xca, 0x2a, 0x2c, 0x7c, 0x05, 0x50, 0x5e, 0x59, 0x4f, 0xe4, 0x17, 0xae, + 0x13, 0x6e, 0x69, 0xbe, 0x9a, 0xe7, 0x08, 0x1a, 0xda, 0xf4, 0xef, 0x53, + 0xfd, 0x2e, 0x2c, 0x84, 0x45, 0x36, 0x0d, 0x7d, 0xe0, 0x2c, 0xe3, 0x36, + 0x0b, 0x21, 0xb7, 0x4b, 0xad, 0xe5, 0xc5, 0xcc, 0x28, 0x88, 0x55, 0x29, + 0x78, 0xad, 0x15, 0x5a, 0x9a, 0x08, 0x96, 0xc3, 0x0a, 0x42, 0xb0, 0x95, + 0xdb, 0xf6, 0x2f, 0x85, 0x22, 0xac, 0xb3, 0x15, 0x15, 0x2c, 0xf7, 0x21, + 0x51, 0x56, 0xcf, 0xaa, 0xaa, 0x21, 0xbd, 0x1b, 0x0d, 0x95, 0xdf, 0xb7, + 0x89, 0xbc, 0x09, 0x36, 0x13, 0xc4, 0x1d, 0xdc, 0xee, 0x97, 0x9b, 0xd2, + 0x56, 0x6b, 0x78, 0x86, 0xed, 0xb0, 0x83, 0x20, 0xee, 0x14, 0x10, 0x77, + 0x71, 0x1f, 0xbd, 0x58, 0x19, 0xbb, 0x60, 0x37, 0xbf, 0x32, 0xbe, 0xc5, + 0xe8, 0x3b, 0xb2, 0x32, 0x7a, 0x0b, 0xcb, 0x9e, 0xcf, 0x55, 0xfb, 0x93, + 0x95, 0x5e, 0x47, 0x0a, 0x18, 0xab, 0xe2, 0x1a, 0xcf, 0xf0, 0xdf, 0xbe, + 0x58, 0x18, 0xfb, 0xe0, 0x33, 0x42, 0xfd, 0x09, 0xb7, 0xf7, 0x1f, 0xa8, + 0x6d, 0x83, 0x39, 0x62, 0xa3, 0x66, 0xb9, 0x3d, 0x9c, 0x47, 0x95, 0xb3, + 0x0b, 0xa5, 0xa1, 0xea, 0x85, 0x1e, 0x46, 0x15, 0x35, 0x84, 0x2c, 0x8f, + 0x91, 0xa4, 0x3e, 0x50, 0x50, 0xc5, 0xe4, 0xa8, 0x8a, 0xaa, 0xa0, 0xfa, + 0x93, 0xf4, 0xbb, 0x46, 0x11, 0xde, 0xcf, 0x39, 0x90, 0x64, 0xc2, 0x8d, + 0xcc, 0xd6, 0x82, 0xb1, 0x7c, 0xa4, 0x10, 0xd0, 0x3b, 0x99, 0x89, 0xd3, + 0x6c, 0xe6, 0xe6, 0x4e, 0xc2, 0x29, 0x22, 0xc8, 0x3e, 0xee, 0xf3, 0x7f, + 0xb3, 0x9a, 0xf3, 0xcd, 0xac, 0xe6, 0xb3, 0x66, 0x56, 0xd3, 0xe8, 0xda, + 0x14, 0xdd, 0xca, 0xeb, 0x06, 0xda, 0x4c, 0x88, 0x4c, 0xa7, 0x75, 0xf0, + 0x8d, 0xdf, 0xfe, 0xcd, 0x5a, 0x2e, 0xc3, 0xd7, 0x84, 0xf6, 0x00, 0x77, + 0xf8, 0x9f, 0xac, 0xe5, 0x5a, 0x33, 0xc7, 0x70, 0x93, 0x50, 0x1f, 0xb4, + 0x3a, 0x06, 0xee, 0xd0, 0x0b, 0xf5, 0x7f, 0x0b, 0xdf, 0xf1, 0xea, 0xdf, + 0x85, 0xd1, 0x6e, 0x21, 0xf6, 0x38, 0x17, 0x0d, 0xe1, 0xe3, 0x3e, 0x1f, + 0x89, 0xe3, 0x04, 0x9f, 0xde, 0xcf, 0xd9, 0xcb, 0x2a, 0x85, 0xf0, 0x85, + 0xa1, 0xb2, 0x96, 0x4f, 0x89, 0x5b, 0x06, 0x8d, 0xbb, 0xf0, 0x13, 0x91, + 0xe3, 0x28, 0x77, 0xfc, 0xdf, 0xe4, 0xe0, 0x1d, 0xe5, 0x23, 0x9b, 0x1c, + 0xef, 0x70, 0xc7, 0x38, 0x8f, 0xde, 0x56, 0xbe, 0xc2, 0xfa, 0xaa, 0x3a, + 0xbe, 0xe7, 0x17, 0x64, 0xe5, 0x6a, 0x57, 0x4f, 0x94, 0x4d, 0x54, 0x5d, + 0x22, 0x9c, 0x2f, 0xaa, 0xef, 0x5f, 0x5b, 0x57, 0x5e, 0x57, 0xdf, 0xc2, + 0x2b, 0xfe, 0x0e, 0x7f, 0x10, 0xd2, 0x93, 0xdc, 0x17, 0xff, 0x48, 0xfa, + 0xc2, 0x99, 0x88, 0xc0, 0x46, 0xba, 0x92, 0x3b, 0x45, 0xb2, 0x42, 0x2b, + 0x69, 0x7e, 0x79, 0xe5, 0x60, 0xc2, 0xe9, 0xff, 0x17, 0x4e, 0xfe, 0xb4, + 0x96, 0x8c, 0xcf, 0xea, 0x85, 0x6d, 0xd9, 0xb0, 0x48, 0x26, 0x92, 0x8b, + 0xec, 0x08, 0xe7, 0x19, 0xee, 0x4b, 0xee, 0xc2, 0x4b, 0x67, 0x5a, 0x64, + 0xdf, 0x38, 0xd0, 0xed, 0x22, 0x67, 0xc2, 0x78, 0xb6, 0xd1, 0xda, 0xcf, + 0xb5, 0x48, 0xfa, 0x45, 0x6e, 0x22, 0x77, 0x91, 0x87, 0x90, 0xf4, 0x1f, + 0xc1, 0xe8, 0x30, 0x46, 0x17, 0x7a, 0x0a, 0x46, 0x9f, 0x47, 0x7c, 0x43, + 0xad, 0x90, 0x1a, 0x8b, 0xbc, 0x49, 0x6a, 0x7c, 0x5e, 0x48, 0x8d, 0xf9, + 0x93, 0x1d, 0xcc, 0x95, 0xa4, 0x1a, 0x23, 0xd5, 0xb3, 0xdb, 0x8b, 0xea, + 0x99, 0x3f, 0x6f, 0x0d, 0x7d, 0x2f, 0xe4, 0x0b, 0x20, 0xf2, 0xf1, 0x65, + 0xe1, 0x25, 0x22, 0xdf, 0xd7, 0xff, 0xa0, 0x95, 0x26, 0x09, 0x45, 0xe1, + 0xd0, 0x5e, 0x14, 0x61, 0x93, 0xf1, 0x32, 0xf7, 0x15, 0x59, 0xe3, 0xb9, + 0x55, 0x15, 0xa5, 0x85, 0xfd, 0xfb, 0x98, 0x4b, 0x4b, 0x79, 0xf8, 0xe2, + 0x1a, 0x73, 0x79, 0x5d, 0x33, 0xf8, 0x36, 0x8d, 0xf0, 0x57, 0xff, 0x0b, + 0x7c, 0x0a, 0x74, 0x17, 0xa5, 0xda, 0xe0, 0xaf, 0x73, 0xd7, 0x48, 0xc6, + 0x61, 0xa8, 0x33, 0x93, 0x8c, 0xb8, 0xb0, 0xbc, 0x71, 0x06, 0x45, 0x59, + 0xa2, 0x6c, 0x02, 0xf7, 0x0d, 0x77, 0xbb, 0x55, 0x5d, 0x8a, 0x72, 0x45, + 0x1a, 0x1b, 0xd0, 0x2d, 0xee, 0x26, 0xe7, 0xd1, 0x83, 0x04, 0x6b, 0x4b, + 0x0d, 0x59, 0x21, 0x96, 0xc2, 0xfa, 0x9e, 0xf5, 0x4d, 0xfb, 0xcd, 0x24, + 0x35, 0x10, 0x49, 0x4d, 0x04, 0xfa, 0x3b, 0x22, 0xe9, 0x8f, 0xff, 0x26, + 0x69, 0x21, 0x31, 0x8f, 0xce, 0x36, 0x82, 0x1f, 0xb8, 0xef, 0x89, 0xa4, + 0xb9, 0xe5, 0x65, 0x44, 0xe1, 0x85, 0x31, 0xbd, 0x86, 0x54, 0x95, 0x96, + 0x0f, 0x68, 0xe0, 0xb5, 0xd1, 0x0c, 0xbe, 0x7b, 0x23, 0xfc, 0xdd, 0xff, + 0x02, 0xff, 0x8a, 0xc8, 0x2c, 0xea, 0x6f, 0x83, 0xbf, 0xe7, 0x2c, 0xe6, + 0x7e, 0xe2, 0x3c, 0xba, 0x11, 0xfb, 0xab, 0xa8, 0x20, 0x0c, 0x6d, 0x9a, + 0x74, 0x51, 0x26, 0x1a, 0x48, 0x10, 0x1f, 0x70, 0xbf, 0xb4, 0xae, 0x8b, + 0x4a, 0x51, 0x95, 0x0d, 0xeb, 0x21, 0xf7, 0x33, 0x6f, 0xc9, 0xbc, 0xe9, + 0x68, 0xaa, 0x2a, 0xaa, 0x6a, 0x6a, 0x0b, 0x35, 0xa4, 0x64, 0x7c, 0x61, + 0x22, 0xc2, 0xc9, 0x16, 0xe9, 0x91, 0xa8, 0x5e, 0x34, 0x8c, 0xb0, 0xfc, + 0xca, 0xfd, 0xf6, 0x0f, 0x2c, 0x8d, 0xa5, 0xd4, 0x31, 0xd1, 0x18, 0x1b, + 0x4b, 0x25, 0xf7, 0x98, 0xe4, 0xd2, 0xbc, 0x3b, 0x50, 0x14, 0xd5, 0x35, + 0x54, 0x58, 0x7a, 0xf0, 0xc9, 0xb9, 0xa0, 0x90, 0x26, 0xd0, 0xb1, 0xa2, + 0xd7, 0x09, 0xe8, 0xef, 0xdc, 0xd3, 0x56, 0x41, 0xc1, 0x5b, 0x34, 0xd9, + 0x06, 0x3a, 0x81, 0xfb, 0x83, 0x88, 0x2e, 0xb8, 0x17, 0x2b, 0x6a, 0x4f, + 0x21, 0x6d, 0x6c, 0x01, 0xfb, 0xa6, 0x68, 0x06, 0x81, 0x7d, 0x86, 0x11, + 0x7a, 0x49, 0x19, 0x2f, 0x9a, 0x6d, 0x2d, 0xe3, 0x45, 0xef, 0x08, 0x65, + 0xfc, 0x73, 0xde, 0xa1, 0x62, 0x44, 0xd9, 0xdc, 0x9a, 0x68, 0xbe, 0x68, + 0x01, 0xef, 0xd6, 0xce, 0x62, 0x74, 0x8e, 0xac, 0xb4, 0x5e, 0x7c, 0x58, + 0xd4, 0x5a, 0x06, 0x98, 0xeb, 0x2b, 0xea, 0x7a, 0xd4, 0x57, 0xd6, 0x96, + 0xd4, 0x94, 0x57, 0xbf, 0x60, 0x5a, 0x22, 0x5a, 0x4a, 0x2d, 0xc4, 0x48, + 0x84, 0x91, 0xa4, 0x35, 0xaa, 0xd5, 0xcd, 0xa9, 0xc4, 0xbc, 0xea, 0xeb, + 0x49, 0x3c, 0xb4, 0x62, 0xf5, 0xae, 0x7d, 0xb1, 0x6f, 0xc3, 0x5d, 0x2f, + 0xda, 0xc0, 0xe3, 0xca, 0x30, 0xb2, 0x6b, 0x0d, 0xf7, 0xc3, 0xe6, 0xb8, + 0x72, 0x62, 0xde, 0xbc, 0xbb, 0x13, 0x90, 0x7a, 0xd6, 0x36, 0xed, 0xd9, + 0x30, 0x3f, 0x12, 0xed, 0xe2, 0x31, 0x19, 0x8c, 0x1c, 0x5a, 0xc3, 0xdc, + 0xd7, 0x1c, 0xd3, 0x9e, 0xa4, 0xe7, 0x9d, 0xcd, 0xe5, 0xb5, 0x96, 0xbe, + 0x35, 0xfc, 0xef, 0x5c, 0x33, 0x29, 0x86, 0xf8, 0x05, 0xd3, 0x84, 0x79, + 0x50, 0x74, 0x88, 0xc7, 0x74, 0xc2, 0x88, 0x6d, 0x0d, 0xf3, 0x64, 0x73, + 0x4c, 0x67, 0x82, 0x99, 0x5f, 0x35, 0xdc, 0x52, 0xd3, 0xb7, 0x82, 0xff, + 0xfd, 0x37, 0xcc, 0xb3, 0xa2, 0x73, 0x3c, 0xa6, 0x2b, 0x46, 0xee, 0x2f, + 0xc3, 0xbc, 0xd8, 0x7c, 0xfa, 0x30, 0x72, 0xfb, 0xdb, 0xfc, 0x5d, 0x15, + 0x5d, 0xe3, 0xe7, 0xef, 0x0b, 0x8c, 0x4e, 0x0b, 0x61, 0xc9, 0xbd, 0xbe, + 0xd6, 0xd2, 0xd4, 0x31, 0xcc, 0x2f, 0x2f, 0xe3, 0x5b, 0x99, 0x16, 0x5b, + 0x59, 0x2d, 0xba, 0x29, 0xba, 0xc5, 0xb3, 0x79, 0x62, 0xe4, 0xdd, 0x1a, + 0xdb, 0x9d, 0x16, 0x6c, 0x5e, 0xa4, 0x70, 0xe7, 0xed, 0xa2, 0xa0, 0xaa, + 0x92, 0x04, 0x39, 0x96, 0x20, 0x56, 0x76, 0x1c, 0x30, 0xe0, 0xef, 0xe0, + 0x0f, 0x44, 0x3f, 0xf3, 0xe0, 0xbe, 0x18, 0xf9, 0xb7, 0x06, 0xfe, 0xa4, + 0x05, 0xb8, 0x1f, 0x59, 0xe4, 0x3c, 0xb8, 0xd0, 0x14, 0x70, 0x26, 0xc2, + 0x93, 0x9d, 0xbf, 0x43, 0x3f, 0x13, 0x3d, 0xe7, 0xa1, 0x03, 0x31, 0x0a, + 0x7a, 0x09, 0xb4, 0x58, 0xd4, 0x52, 0x4b, 0x8a, 0xbf, 0x6a, 0x49, 0x6c, + 0x27, 0xa6, 0x79, 0x2d, 0x9d, 0xc0, 0xe8, 0xa4, 0xa0, 0x25, 0xd7, 0x66, + 0x5a, 0x32, 0x59, 0x6a, 0x2a, 0x9b, 0x25, 0x0b, 0x62, 0x47, 0xb1, 0x13, + 0xcf, 0x15, 0x82, 0xd1, 0xcb, 0x3a, 0xbd, 0x36, 0xae, 0x3b, 0x2d, 0xb8, + 0xbc, 0x84, 0xce, 0x58, 0xa3, 0x6a, 0xfe, 0x8a, 0xe8, 0x23, 0xf6, 0xe5, + 0x11, 0xc3, 0x31, 0x8a, 0x6c, 0x05, 0x51, 0x1c, 0xdc, 0x02, 0x31, 0x82, + 0x28, 0xa6, 0xb8, 0xbc, 0x6c, 0x60, 0x9d, 0xa5, 0x92, 0x47, 0xb6, 0xee, + 0xfd, 0x15, 0x39, 0x42, 0x1c, 0xc9, 0x23, 0x47, 0x63, 0x14, 0xdb, 0x1a, + 0x72, 0x5c, 0x0b, 0xe4, 0x18, 0xe2, 0xb8, 0xf3, 0xab, 0xaa, 0x6a, 0x2d, + 0x95, 0xc4, 0x26, 0xf9, 0x8f, 0xbf, 0xa2, 0x26, 0x8b, 0x53, 0x78, 0x54, + 0x25, 0x46, 0x09, 0x2f, 0x43, 0xcd, 0x68, 0x44, 0xcd, 0xb6, 0xa2, 0xc6, + 0x59, 0x51, 0xe3, 0x5f, 0x68, 0x5b, 0x25, 0x56, 0xf3, 0xda, 0xde, 0x83, + 0xd1, 0x5e, 0x41, 0xdb, 0x4e, 0x1d, 0xcc, 0x83, 0x2d, 0x8a, 0x2e, 0xd5, + 0x64, 0xe5, 0x2b, 0x34, 0x64, 0x01, 0xf4, 0xad, 0xe7, 0x77, 0x4b, 0xc8, + 0x5e, 0x37, 0xe2, 0x85, 0x6d, 0xb4, 0xed, 0xc5, 0x79, 0x3c, 0x6d, 0x12, + 0x46, 0x29, 0x2f, 0xa1, 0x25, 0xc9, 0xa1, 0x95, 0xb6, 0x83, 0xb0, 0xbc, + 0x46, 0x5b, 0x59, 0x93, 0x79, 0xbd, 0x07, 0x68, 0xaa, 0x6a, 0x6a, 0xf8, + 0x16, 0x86, 0xad, 0xa6, 0xb0, 0xa5, 0x28, 0x24, 0x7a, 0x34, 0xf4, 0x73, + 0x0e, 0xfe, 0x4b, 0xe2, 0xd2, 0x74, 0x5d, 0xe3, 0x7d, 0xcd, 0xb2, 0x25, + 0x71, 0x67, 0x71, 0x11, 0x2f, 0x44, 0x1a, 0x46, 0x19, 0x2f, 0x11, 0x82, + 0x24, 0x68, 0x56, 0x21, 0x7a, 0x0a, 0x42, 0x1c, 0xb4, 0x0a, 0x91, 0xce, + 0x0b, 0xe1, 0x62, 0xad, 0xc3, 0x9b, 0x65, 0x60, 0xb5, 0x2d, 0xdb, 0xf8, + 0xcd, 0xbf, 0x69, 0x11, 0x6d, 0xc4, 0xfd, 0xc4, 0xaf, 0xf0, 0x9c, 0x59, + 0x18, 0xe5, 0xb4, 0xc6, 0x59, 0xd6, 0x9c, 0x33, 0xdb, 0x96, 0x11, 0x6a, + 0xcd, 0xb5, 0x03, 0xf9, 0x8c, 0x50, 0xf1, 0x97, 0x41, 0xf2, 0xe7, 0x5f, + 0x96, 0x10, 0x8a, 0x2b, 0xc4, 0x43, 0x78, 0x3a, 0x15, 0x46, 0xed, 0x5a, + 0xa3, 0xab, 0x6b, 0x4e, 0xa7, 0xe6, 0x87, 0xe8, 0x5c, 0x4c, 0x0a, 0x71, + 0x45, 0x67, 0x4b, 0x75, 0x85, 0xb9, 0xc4, 0xc2, 0x37, 0x5c, 0x48, 0xe2, + 0xff, 0x17, 0x52, 0xfe, 0x8a, 0x66, 0x17, 0xd8, 0x38, 0x1b, 0xc4, 0x23, + 0x79, 0x4e, 0x0d, 0x46, 0xed, 0x5b, 0x33, 0x29, 0xdc, 0xc2, 0xa4, 0xb4, + 0xc2, 0xa2, 0x12, 0x8c, 0x47, 0x70, 0xa1, 0x56, 0xe3, 0x11, 0xfc, 0xe8, + 0xdf, 0x8c, 0x67, 0xbc, 0x78, 0x02, 0x4f, 0xa0, 0xc3, 0xc8, 0xd0, 0x1a, + 0xc1, 0xf4, 0x16, 0x04, 0x7a, 0x3e, 0x62, 0x9b, 0xab, 0xcb, 0xf9, 0x7c, + 0x6b, 0x24, 0xff, 0x28, 0xac, 0xc4, 0x76, 0xd0, 0x02, 0x7c, 0x96, 0x78, + 0x36, 0x0f, 0x6e, 0xc2, 0xa8, 0xe0, 0x9f, 0x6a, 0x67, 0x21, 0x76, 0x8b, + 0xe7, 0x8b, 0x17, 0x34, 0xd5, 0xce, 0x18, 0x75, 0xc0, 0x28, 0x9f, 0x1f, + 0x81, 0xbb, 0x35, 0x7e, 0xf3, 0x9d, 0x99, 0x0e, 0xe6, 0xba, 0x92, 0x81, + 0xd6, 0x48, 0x5e, 0xd8, 0x95, 0xf8, 0x52, 0x21, 0x9a, 0xb7, 0xab, 0xed, + 0x54, 0x61, 0x2e, 0xaf, 0xe4, 0x55, 0x67, 0x63, 0x5c, 0x2a, 0x5e, 0xc6, + 0x33, 0x76, 0xc2, 0xa8, 0xf8, 0xa5, 0x8c, 0xe2, 0x95, 0xd6, 0x44, 0x47, + 0xbc, 0x5a, 0xbc, 0x86, 0x5a, 0x8f, 0x51, 0xa1, 0x95, 0xb2, 0x08, 0xa3, + 0xce, 0x2d, 0x72, 0x68, 0xf1, 0x7a, 0xf1, 0x06, 0xf1, 0x46, 0x21, 0x87, + 0xbe, 0x8f, 0xd1, 0x3d, 0x8c, 0x1e, 0x90, 0x62, 0xe9, 0x6f, 0x9d, 0x66, + 0x85, 0xde, 0x52, 0x51, 0x5d, 0xa8, 0xea, 0xc1, 0x37, 0x8b, 0xf8, 0x5d, + 0x9b, 0x18, 0x5b, 0xc5, 0x1f, 0xf2, 0x62, 0x74, 0xc5, 0xa8, 0xe7, 0xcb, + 0xc5, 0xd8, 0xd1, 0x28, 0xc6, 0x2e, 0xf1, 0x6e, 0x5e, 0x8c, 0x6e, 0x56, + 0x31, 0x7a, 0x60, 0xd4, 0xfd, 0x85, 0x3b, 0xd8, 0x23, 0xde, 0xcb, 0xbb, + 0x83, 0x4b, 0x18, 0x7d, 0x45, 0x04, 0xe9, 0xd9, 0xae, 0xa2, 0xbc, 0xac, + 0x52, 0x91, 0x6f, 0x19, 0x50, 0x57, 0x38, 0xaa, 0xa7, 0x99, 0x3f, 0xe0, + 0xf7, 0x6d, 0x94, 0x07, 0xc4, 0x07, 0x79, 0xca, 0xde, 0x18, 0xf5, 0x6b, + 0x9d, 0xf2, 0xb8, 0xf8, 0x44, 0x33, 0xca, 0xbe, 0x18, 0xf5, 0x21, 0x7e, + 0x4d, 0x23, 0xb4, 0x57, 0x0a, 0x47, 0xf7, 0x16, 0x80, 0xad, 0x47, 0x36, + 0xe8, 0xb3, 0x62, 0x21, 0xd6, 0x9a, 0x31, 0x2a, 0x79, 0x99, 0x8d, 0xec, + 0x68, 0xb4, 0x91, 0xcb, 0x56, 0x1b, 0xe9, 0x66, 0xb5, 0x91, 0xfe, 0xc4, + 0x0f, 0x1b, 0x49, 0x4d, 0x4b, 0xd2, 0x5b, 0xfe, 0xc9, 0x25, 0x0f, 0x6b, + 0x3d, 0x2c, 0x7f, 0xf1, 0x88, 0x43, 0x7c, 0x5d, 0x7c, 0x83, 0x47, 0xb6, + 0x60, 0x34, 0xb0, 0x75, 0xa1, 0xbf, 0x13, 0x7f, 0xdf, 0x4c, 0xe8, 0x32, + 0x8c, 0x06, 0x90, 0xfc, 0xc8, 0xaa, 0x91, 0xce, 0xbc, 0x8b, 0x2f, 0x1c, + 0xd3, 0x4b, 0xa0, 0x10, 0x0e, 0x6c, 0xf0, 0xf7, 0xc4, 0xf7, 0x79, 0xf8, + 0x41, 0x18, 0x55, 0xb4, 0x26, 0xf8, 0xe3, 0x16, 0x82, 0x0f, 0xe6, 0x5b, + 0xbb, 0xbc, 0x4f, 0xea, 0x5c, 0x4f, 0x32, 0xe8, 0xde, 0xd6, 0x85, 0x2a, + 0xec, 0xdb, 0x70, 0x9f, 0x8a, 0xff, 0xe4, 0x71, 0x2b, 0x31, 0xaa, 0xfe, + 0x07, 0xb1, 0x25, 0xc8, 0x9a, 0xe8, 0x4a, 0x24, 0x82, 0xd8, 0xfc, 0xe3, + 0x7c, 0xeb, 0x43, 0x03, 0x72, 0x4f, 0x55, 0x53, 0xbe, 0x2b, 0x80, 0xf6, + 0xe4, 0xf3, 0xdd, 0x16, 0xf0, 0x12, 0x5a, 0xc2, 0xf0, 0xf0, 0x35, 0x18, + 0xbd, 0xbc, 0x27, 0xdd, 0x04, 0x0f, 0xde, 0x12, 0x17, 0x9b, 0x56, 0xb8, + 0x09, 0x18, 0xd5, 0xda, 0x92, 0x5e, 0x01, 0xb0, 0x97, 0xb0, 0x4c, 0x5a, + 0x62, 0x7b, 0x4a, 0xbc, 0x78, 0xec, 0x61, 0x18, 0x35, 0xbc, 0x44, 0x25, + 0x12, 0x3f, 0xab, 0x4a, 0x24, 0x81, 0x56, 0x95, 0x0c, 0xb7, 0xaa, 0x64, + 0x84, 0xcd, 0x28, 0x25, 0xc1, 0x92, 0x10, 0xde, 0x28, 0xaf, 0x60, 0x74, + 0x95, 0x18, 0x65, 0x77, 0xbb, 0xc6, 0xa4, 0x97, 0xb8, 0xd1, 0x21, 0xc4, + 0xdf, 0xf0, 0x69, 0x5a, 0xb7, 0x9a, 0xf2, 0x3a, 0x12, 0x23, 0xb4, 0xe5, + 0x8d, 0x21, 0xa2, 0x80, 0xcf, 0x49, 0xcc, 0x36, 0xaf, 0x2d, 0x89, 0x94, + 0x44, 0xf1, 0x12, 0x8c, 0xc2, 0x68, 0x4c, 0x6b, 0x12, 0xc4, 0xb7, 0x90, + 0x60, 0x34, 0xe7, 0xd1, 0xd7, 0x8e, 0xb7, 0x77, 0xbe, 0x33, 0x28, 0x4c, + 0x72, 0x3f, 0xe7, 0xd0, 0x7f, 0x62, 0xe4, 0xaf, 0x2b, 0xae, 0x6a, 0x61, + 0x0a, 0x92, 0x14, 0x49, 0x2a, 0xcf, 0xfa, 0x1a, 0x46, 0xb8, 0x35, 0xd6, + 0x9c, 0x16, 0xac, 0x1c, 0xcf, 0x2a, 0xe0, 0xf0, 0xb4, 0x3c, 0x6c, 0x2b, + 0xac, 0xc2, 0x75, 0xc5, 0x55, 0xcd, 0x17, 0xa5, 0x24, 0x57, 0xa2, 0xe1, + 0x59, 0x5f, 0xc7, 0xe8, 0x8d, 0xff, 0x91, 0xb6, 0x1b, 0xd5, 0xc9, 0xbb, + 0xb6, 0x7f, 0x53, 0x67, 0x81, 0xa4, 0x23, 0x4f, 0x31, 0x1e, 0xa3, 0x09, + 0xff, 0x23, 0x75, 0x36, 0x8e, 0xe4, 0x65, 0x14, 0x2f, 0xd3, 0x5f, 0x4f, + 0x49, 0x2f, 0x9e, 0x66, 0x12, 0x46, 0x93, 0xff, 0x47, 0xfa, 0x6b, 0x85, + 0xe6, 0x65, 0x0a, 0x1b, 0xc0, 0xf7, 0x27, 0x31, 0x9a, 0xda, 0x5a, 0x0b, + 0xd7, 0x5a, 0xee, 0x75, 0x93, 0x54, 0x4a, 0xaa, 0x9a, 0xf5, 0xa2, 0xed, + 0x31, 0x9a, 0xc6, 0x77, 0xde, 0xd8, 0xa6, 0x76, 0x34, 0xa5, 0xa0, 0xcc, + 0x8d, 0x9f, 0x9d, 0x29, 0x0b, 0x55, 0x4d, 0x55, 0x90, 0xe3, 0x12, 0xfe, + 0xa1, 0xb7, 0xf0, 0xde, 0x84, 0xa4, 0x56, 0x52, 0xd7, 0xd7, 0xf6, 0x22, + 0x54, 0xbb, 0x9a, 0x1a, 0x73, 0xc3, 0x72, 0x72, 0xae, 0x9e, 0x8a, 0xea, + 0x56, 0x50, 0x24, 0x1c, 0x0a, 0x2f, 0x43, 0x49, 0x86, 0x4b, 0xed, 0x37, + 0x3a, 0xcf, 0x46, 0x23, 0x25, 0x0d, 0x92, 0x91, 0xd4, 0x2a, 0xc9, 0x68, + 0x6a, 0x01, 0x2c, 0xa7, 0x4e, 0x49, 0x38, 0xea, 0x26, 0x75, 0x05, 0x0d, + 0x46, 0xf3, 0x51, 0x83, 0x64, 0xbc, 0x64, 0x82, 0x64, 0xa2, 0x64, 0x92, + 0x64, 0xb2, 0x64, 0x8a, 0x64, 0x2a, 0x9a, 0x2a, 0x99, 0x8e, 0x0e, 0x83, + 0x04, 0x9d, 0x07, 0xa5, 0x64, 0x16, 0xba, 0x05, 0x2e, 0x68, 0xbf, 0xe4, + 0x1d, 0x18, 0x29, 0x99, 0x07, 0xed, 0xa0, 0x02, 0xfa, 0xc2, 0x1c, 0xc8, + 0x86, 0x4e, 0x92, 0x01, 0x92, 0xa5, 0xe8, 0x31, 0x4c, 0x44, 0x0f, 0x41, + 0x01, 0x27, 0x25, 0xab, 0xc4, 0xed, 0x25, 0x6b, 0xd0, 0x3a, 0xb4, 0x0a, + 0xed, 0x90, 0xac, 0x87, 0x6b, 0x70, 0x19, 0xee, 0xc2, 0xef, 0xe2, 0xce, + 0x92, 0x2d, 0x24, 0xc7, 0xa9, 0x90, 0x6c, 0x13, 0x67, 0x90, 0xdc, 0xb2, + 0x81, 0xc4, 0xea, 0x59, 0x92, 0xdd, 0xd4, 0x23, 0xc4, 0xa2, 0x78, 0xea, + 0x01, 0x6a, 0x2b, 0xd9, 0x87, 0xfa, 0xa0, 0x1e, 0x28, 0x10, 0x89, 0x24, + 0x07, 0x51, 0xbe, 0xe4, 0xb0, 0xe4, 0x08, 0x6c, 0x85, 0x4d, 0xb0, 0x4f, + 0x72, 0x42, 0x72, 0x52, 0x72, 0x4a, 0x64, 0x2f, 0x92, 0x89, 0x02, 0x44, + 0x6d, 0x44, 0x59, 0x92, 0x2f, 0x45, 0x06, 0x51, 0x77, 0xc9, 0x45, 0xc9, + 0x25, 0xb1, 0x48, 0xf4, 0x8c, 0xe4, 0xe9, 0x3e, 0xe2, 0x08, 0xc9, 0x35, + 0xd1, 0x45, 0x52, 0x43, 0xdd, 0x14, 0x3d, 0x90, 0xdc, 0x12, 0xcd, 0x26, + 0xb5, 0xf0, 0x12, 0x52, 0x4d, 0x7e, 0x24, 0x3a, 0x28, 0xb9, 0x23, 0x2a, + 0x93, 0xfc, 0x44, 0xea, 0xf8, 0xb1, 0x92, 0x07, 0xe2, 0x1d, 0x24, 0x8e, + 0x1d, 0x20, 0xde, 0xff, 0xba, 0xe4, 0xb1, 0xe4, 0x37, 0x89, 0x9f, 0xe4, + 0x77, 0xe2, 0x3d, 0x22, 0xc9, 0x4a, 0x7a, 0x26, 0x79, 0x4e, 0x2c, 0xbb, + 0x40, 0xd2, 0x53, 0x2a, 0x22, 0x2e, 0xf6, 0xa9, 0x84, 0x96, 0xca, 0xc4, + 0x2b, 0xc5, 0x4b, 0xa9, 0xe9, 0x22, 0x39, 0x47, 0x42, 0xde, 0x0c, 0x8c, + 0xbe, 0xe7, 0x48, 0xb1, 0x77, 0x87, 0x73, 0xe4, 0xb6, 0x72, 0x7e, 0x18, + 0xcd, 0xe2, 0x82, 0xb9, 0x20, 0xae, 0x80, 0xeb, 0xcb, 0x91, 0x38, 0xbb, + 0x0c, 0xa3, 0xb9, 0x18, 0x2d, 0xc0, 0xe8, 0x1d, 0x8c, 0xde, 0xc5, 0x68, + 0x11, 0x46, 0xcb, 0xb9, 0x9e, 0x18, 0x6d, 0x20, 0xd1, 0x1f, 0x73, 0x43, + 0xb9, 0x37, 0x31, 0xfa, 0x80, 0x1b, 0xc6, 0x8d, 0xe3, 0x06, 0x63, 0xb4, + 0x99, 0x5b, 0x85, 0xd1, 0x16, 0x32, 0xc3, 0xcb, 0xb9, 0x45, 0xdc, 0x26, + 0x6e, 0x36, 0x37, 0x9f, 0x58, 0x06, 0x46, 0xdb, 0x48, 0x12, 0xfb, 0x3e, + 0x37, 0x8a, 0x9b, 0xcc, 0xed, 0xc3, 0x68, 0xa7, 0x90, 0xf8, 0x7e, 0xca, + 0x95, 0x70, 0xfd, 0x39, 0x12, 0x16, 0x3e, 0x22, 0x89, 0xd7, 0x01, 0xee, + 0x28, 0x77, 0x52, 0x48, 0x45, 0x3f, 0x16, 0x92, 0x43, 0x92, 0xb0, 0x7d, + 0x42, 0x52, 0x17, 0x21, 0x31, 0xd7, 0x08, 0xa9, 0x0e, 0x49, 0x48, 0x56, + 0x72, 0x11, 0x5c, 0x02, 0x97, 0xc5, 0x85, 0x73, 0x6a, 0x8c, 0x56, 0x73, + 0x46, 0xce, 0xc0, 0xa5, 0x72, 0xb1, 0x18, 0xbd, 0xcf, 0xb5, 0xc7, 0x88, + 0xf8, 0xd4, 0xdb, 0xdc, 0x4e, 0x6e, 0x07, 0x47, 0xee, 0xfb, 0x1c, 0xa3, + 0x03, 0x18, 0x1d, 0xe2, 0xce, 0x72, 0x67, 0xb8, 0x4b, 0xdc, 0x55, 0xee, + 0x1b, 0x8c, 0x8e, 0x72, 0xdf, 0x71, 0x77, 0x31, 0x3a, 0x86, 0xd1, 0x71, + 0x52, 0x1c, 0x08, 0xe5, 0x55, 0x88, 0x50, 0xa6, 0x90, 0x7a, 0xe2, 0x14, + 0xa9, 0xd0, 0x84, 0xb2, 0xd4, 0x53, 0xa8, 0xe8, 0xce, 0x90, 0x7a, 0xf6, + 0x99, 0x50, 0xfa, 0xcb, 0x84, 0xa2, 0x9a, 0xa8, 0xe5, 0x4b, 0xee, 0x01, + 0x46, 0xe7, 0xb9, 0x5f, 0xb9, 0xdf, 0x31, 0xba, 0x48, 0x9c, 0xb7, 0x90, + 0x26, 0xf4, 0x16, 0xc2, 0x2b, 0x89, 0x83, 0x97, 0x31, 0xfa, 0x9a, 0xac, + 0x1f, 0x8c, 0xae, 0x09, 0x4e, 0x7a, 0x94, 0xe0, 0xb2, 0x6e, 0x60, 0xf4, + 0x8d, 0xe0, 0x45, 0xc6, 0x0b, 0x2b, 0xf0, 0x96, 0x10, 0xd2, 0x2a, 0x85, + 0x08, 0xf1, 0x13, 0xc9, 0x61, 0x48, 0xbe, 0xc3, 0xd9, 0x71, 0x5f, 0x62, + 0xf4, 0xb0, 0x59, 0x06, 0x23, 0x75, 0x92, 0x3a, 0x4b, 0x59, 0x21, 0x83, + 0x99, 0x89, 0xd1, 0x5b, 0x18, 0xfd, 0xdc, 0xa3, 0x5d, 0x07, 0x92, 0x2e, + 0xf1, 0x4f, 0xfe, 0x05, 0xcb, 0x96, 0xba, 0x51, 0x13, 0x57, 0x49, 0x38, + 0xc9, 0x6e, 0xc9, 0x74, 0x62, 0x31, 0x47, 0x24, 0x23, 0xa5, 0x44, 0xc4, + 0x59, 0x44, 0x33, 0x64, 0x32, 0x84, 0x61, 0xdf, 0x26, 0xf3, 0x28, 0x10, + 0x4c, 0xff, 0xaa, 0xf9, 0x4a, 0x94, 0x06, 0x48, 0x03, 0xa9, 0x15, 0x52, + 0x05, 0xbf, 0x1a, 0x25, 0x0d, 0xb6, 0x17, 0xbf, 0x6e, 0x92, 0xed, 0x8e, + 0x34, 0x92, 0x5a, 0xdf, 0x9d, 0x7f, 0x4a, 0x55, 0x53, 0x66, 0xa9, 0xeb, + 0x51, 0x50, 0x44, 0xf2, 0x68, 0x92, 0xce, 0xd6, 0x77, 0xe7, 0xdf, 0x9d, + 0xe4, 0x97, 0x3c, 0x31, 0x8e, 0xc6, 0xe6, 0x74, 0x30, 0x17, 0x2c, 0xbc, + 0xcd, 0x33, 0x47, 0x78, 0xe6, 0xf3, 0xb7, 0xcc, 0xaa, 0x6f, 0xad, 0xf5, + 0xce, 0xc6, 0x27, 0x55, 0x56, 0x81, 0xdb, 0x50, 0x13, 0xd7, 0x51, 0x57, + 0xc8, 0x42, 0xe3, 0x97, 0xdb, 0x64, 0xc9, 0x78, 0xb2, 0xfc, 0xa6, 0xa2, + 0xf9, 0x64, 0xc9, 0x35, 0x70, 0x41, 0x82, 0x3d, 0x59, 0x0d, 0x8b, 0x58, + 0xd5, 0x32, 0x62, 0x6d, 0x3d, 0xb9, 0xbe, 0xbc, 0x6d, 0x11, 0x93, 0x9b, + 0x7e, 0xa9, 0x49, 0x7e, 0x69, 0x96, 0x30, 0x82, 0xec, 0xe6, 0x0f, 0xdc, + 0xa5, 0x2a, 0x5e, 0x7e, 0xf2, 0x7b, 0x9d, 0xf0, 0xea, 0x9a, 0xa1, 0xb6, + 0xc8, 0x52, 0x6d, 0xae, 0x31, 0xd7, 0x55, 0xd5, 0xf4, 0xe6, 0x8f, 0xb4, + 0xe5, 0xb5, 0xbc, 0x83, 0x28, 0xe5, 0x9f, 0xc7, 0xdb, 0xf1, 0xa2, 0xdb, + 0x11, 0xe9, 0x3d, 0x5a, 0x79, 0x7c, 0x2f, 0x35, 0x48, 0x8d, 0x4d, 0x8f, + 0xef, 0x31, 0x22, 0x26, 0x3b, 0x8f, 0xf3, 0xa8, 0x10, 0x5e, 0x51, 0xe1, + 0x5f, 0x77, 0xb4, 0x08, 0x9f, 0x95, 0xbc, 0x23, 0xa2, 0x6a, 0x15, 0xe1, + 0x85, 0xb1, 0xff, 0x59, 0xb6, 0x96, 0x02, 0xfc, 0xe3, 0x94, 0xbc, 0x78, + 0x8b, 0x80, 0x78, 0xa3, 0x29, 0xd2, 0xbe, 0xfc, 0x94, 0x34, 0xbd, 0x4b, + 0x20, 0x2c, 0x37, 0xf2, 0xb3, 0x50, 0xd0, 0x7b, 0xf7, 0x22, 0x4b, 0xcd, + 0xb0, 0xf2, 0x12, 0x4b, 0x6d, 0x73, 0xab, 0x29, 0x25, 0x77, 0x0c, 0x10, + 0xac, 0x66, 0xb1, 0x70, 0xdd, 0x12, 0xab, 0xea, 0x07, 0x52, 0x13, 0x97, + 0x10, 0x45, 0x92, 0x4c, 0xae, 0x1f, 0xff, 0xa2, 0xa8, 0xf5, 0x3e, 0xab, + 0x29, 0x11, 0x5f, 0x2a, 0xad, 0x90, 0x0e, 0x69, 0x7c, 0xcf, 0x6f, 0x99, + 0xb4, 0x82, 0x8a, 0xfa, 0x5f, 0x8e, 0xe9, 0x7f, 0x79, 0x5b, 0xef, 0x7e, + 0xd6, 0x37, 0x3c, 0x2c, 0x3c, 0xff, 0x7f, 0x31, 0xd5, 0x47, 0x64, 0x7b, + 0xca, 0xeb, 0xe5, 0x85, 0x39, 0x46, 0x70, 0x11, 0xc2, 0xfb, 0x5c, 0x44, + 0x2d, 0xc5, 0x79, 0xe5, 0x15, 0x16, 0xeb, 0xa8, 0xa7, 0x51, 0x13, 0xd7, + 0xa2, 0xb6, 0xd4, 0x03, 0xc9, 0x3e, 0xe2, 0x61, 0x45, 0xc4, 0xef, 0x12, + 0x2f, 0x4b, 0xfc, 0x6d, 0x3c, 0xa7, 0xe6, 0xc8, 0x6a, 0x5f, 0xcd, 0x7b, + 0x8b, 0x58, 0xe2, 0x45, 0x78, 0x8f, 0x41, 0xbc, 0x47, 0x56, 0x6b, 0x2b, + 0xc5, 0xf6, 0x52, 0xd9, 0x3a, 0xe2, 0xb4, 0xfb, 0xa0, 0x01, 0xc2, 0xb4, + 0x44, 0x34, 0xb2, 0x1b, 0x39, 0xa3, 0xf0, 0x76, 0x0e, 0x61, 0xef, 0xd5, + 0xb1, 0xda, 0x42, 0x72, 0x5a, 0xe1, 0x95, 0x1c, 0xab, 0x10, 0x2b, 0xa9, + 0x89, 0x4b, 0x51, 0x0f, 0xce, 0x20, 0xa8, 0xdf, 0xa3, 0x1f, 0xff, 0x52, + 0x62, 0x8b, 0xf7, 0x75, 0xf8, 0x51, 0xff, 0x93, 0xe6, 0x1e, 0xfd, 0x4d, + 0x73, 0x11, 0xff, 0x45, 0xe1, 0xff, 0x72, 0xdb, 0x7f, 0xd0, 0x31, 0xa9, + 0xec, 0x0e, 0xa3, 0x53, 0x2d, 0x75, 0x5c, 0xc1, 0x55, 0x08, 0x6f, 0x62, + 0xf0, 0x3a, 0x6e, 0x5f, 0x5a, 0xde, 0x38, 0xbc, 0x83, 0xfc, 0xcb, 0xc6, + 0x4e, 0xa0, 0x24, 0x11, 0xf2, 0x1d, 0x74, 0x0b, 0xed, 0x07, 0x52, 0x36, + 0xf2, 0xd1, 0x53, 0x32, 0x4b, 0x32, 0x4f, 0xb2, 0x54, 0xb2, 0x5e, 0xb2, + 0x4d, 0xb2, 0x86, 0x7b, 0x93, 0x8f, 0x04, 0x9b, 0x49, 0x5c, 0x18, 0xcc, + 0x8d, 0x23, 0xee, 0x9b, 0x8f, 0x14, 0x24, 0x4e, 0x90, 0xe0, 0x40, 0xa2, + 0x01, 0x71, 0xfa, 0x82, 0x83, 0xff, 0xf4, 0x9f, 0x17, 0xba, 0xf5, 0xb9, + 0x7c, 0x8b, 0x01, 0x55, 0xfc, 0x07, 0x3d, 0xfc, 0xdb, 0x6d, 0xff, 0xa8, + 0x87, 0x66, 0x6f, 0x45, 0xb4, 0x23, 0x9b, 0x41, 0x98, 0xec, 0xa6, 0x77, + 0x23, 0xe6, 0x70, 0x73, 0x84, 0xe7, 0xf4, 0x56, 0x53, 0xab, 0x2c, 0xb5, + 0xaa, 0xe1, 0x57, 0x6a, 0xe2, 0x7b, 0x7c, 0x5a, 0x40, 0x92, 0x83, 0x0a, + 0x92, 0x22, 0xf4, 0x15, 0x62, 0x1d, 0x09, 0x79, 0xcb, 0x49, 0xe0, 0x5b, + 0xd4, 0x9a, 0x61, 0xbd, 0xe0, 0x42, 0x8f, 0xc9, 0xf6, 0xac, 0x05, 0xd7, + 0x68, 0x6e, 0xb4, 0xf0, 0xda, 0x87, 0xe0, 0x65, 0xdd, 0x5e, 0xf6, 0xb2, + 0x83, 0xc0, 0x2e, 0xa3, 0x79, 0x76, 0x05, 0x7a, 0x28, 0x59, 0x05, 0x13, + 0xe1, 0xa4, 0xb8, 0x3d, 0x89, 0xad, 0x24, 0xf2, 0xec, 0x24, 0x61, 0x76, + 0x9f, 0x10, 0x5f, 0xa7, 0x5b, 0x73, 0x31, 0x42, 0x4e, 0x34, 0xf4, 0x42, + 0x3f, 0x8f, 0x05, 0x7f, 0xa7, 0xb2, 0x69, 0x47, 0x78, 0xf2, 0x68, 0xf7, + 0x3f, 0xd0, 0xce, 0x35, 0xb2, 0x7d, 0xdb, 0x42, 0xe2, 0x83, 0xdc, 0x41, + 0xe1, 0x61, 0x21, 0x91, 0xb8, 0x4f, 0x8b, 0xd6, 0x8f, 0x55, 0xd0, 0x08, + 0x12, 0xb3, 0xf8, 0xbc, 0x88, 0xcf, 0x90, 0xc4, 0xfd, 0x48, 0x8e, 0x54, + 0x61, 0x0d, 0xf4, 0x7c, 0xd0, 0x27, 0xc1, 0x9e, 0x8f, 0xfb, 0xaa, 0x7f, + 0x12, 0x17, 0xae, 0xfd, 0x45, 0xdc, 0x83, 0xcd, 0xc5, 0xbd, 0x24, 0x64, + 0xb4, 0x7f, 0x11, 0x96, 0x88, 0xfa, 0x9e, 0x55, 0x54, 0x92, 0x82, 0x65, + 0x88, 0x55, 0xcd, 0x45, 0x15, 0x52, 0x8a, 0x38, 0xa1, 0x5d, 0x27, 0xa8, + 0xd7, 0xa9, 0xb8, 0xc6, 0x5c, 0x59, 0xcb, 0x3f, 0xbe, 0x36, 0x37, 0x13, + 0xb8, 0x3d, 0x35, 0x71, 0xb9, 0x35, 0x79, 0x6b, 0x96, 0x7f, 0xfc, 0xa7, + 0xd9, 0xe4, 0xb7, 0x0f, 0x5a, 0xe8, 0xa6, 0x84, 0x2b, 0x11, 0x5e, 0xcd, + 0x22, 0x74, 0x5d, 0xc9, 0x5c, 0x5a, 0x4a, 0x06, 0x5a, 0x39, 0xba, 0x52, + 0x13, 0x97, 0xa1, 0x1d, 0x68, 0x15, 0x57, 0xc6, 0xf5, 0x17, 0x16, 0xc1, + 0x4b, 0x46, 0x42, 0x96, 0x66, 0xe3, 0x48, 0x48, 0x72, 0x78, 0x52, 0x66, + 0x6e, 0xb1, 0x34, 0x85, 0x14, 0x87, 0xfc, 0xec, 0xb7, 0x62, 0xe7, 0x09, + 0x63, 0x68, 0xac, 0xf8, 0x64, 0x66, 0x59, 0x19, 0x5f, 0xf1, 0x91, 0xef, + 0xc8, 0xcc, 0x2c, 0xb5, 0x32, 0x0e, 0x22, 0x8c, 0x92, 0x53, 0x12, 0x92, + 0xc8, 0x1c, 0x12, 0x92, 0x98, 0x7f, 0xe0, 0x3c, 0xd9, 0xc4, 0x49, 0x92, + 0x51, 0x7b, 0x91, 0xbb, 0x95, 0xf3, 0x40, 0xe3, 0x68, 0xce, 0x72, 0x67, + 0x85, 0xa7, 0x93, 0xc2, 0x3a, 0xa8, 0x6a, 0xf4, 0x76, 0xb2, 0x91, 0xbc, + 0x3b, 0x70, 0xfe, 0x7b, 0xea, 0x2a, 0xb9, 0x26, 0xb9, 0xf5, 0x22, 0x39, + 0xfd, 0x87, 0x5c, 0x8c, 0x24, 0x5f, 0x67, 0x5a, 0x26, 0x58, 0x2f, 0xb7, + 0x04, 0x91, 0xfd, 0x5f, 0x2c, 0xe1, 0x6c, 0x73, 0x4b, 0xf8, 0x5f, 0xdc, + 0xf2, 0xd2, 0xe1, 0x93, 0x5b, 0x9a, 0x8c, 0x47, 0x44, 0x36, 0x3b, 0x61, + 0x2e, 0xcf, 0x36, 0x69, 0x5c, 0x21, 0xfc, 0x9c, 0xb0, 0x8e, 0x9f, 0xef, + 0x24, 0x5b, 0xc7, 0xbf, 0x96, 0x9a, 0xb8, 0xa2, 0x29, 0x49, 0x6f, 0x99, + 0x59, 0xbe, 0x5c, 0xc7, 0x2f, 0x48, 0x48, 0x42, 0x7f, 0x51, 0x74, 0xb5, + 0x25, 0x89, 0x9b, 0xf0, 0xf3, 0x85, 0x40, 0xd2, 0xc3, 0xf6, 0x78, 0xc0, + 0xca, 0xb4, 0x9b, 0x58, 0xa6, 0xb5, 0x04, 0x68, 0x96, 0xaf, 0xfe, 0x2b, + 0xc9, 0x6c, 0xb2, 0xcd, 0x6f, 0x4e, 0x42, 0x12, 0xdc, 0xe7, 0xc2, 0x73, + 0x30, 0x3e, 0xa3, 0x68, 0x7a, 0x4c, 0x63, 0x65, 0x38, 0x4e, 0x4d, 0x5c, + 0xf9, 0xa2, 0xb4, 0xf8, 0x6b, 0x1e, 0xfc, 0xff, 0xd0, 0xd4, 0xf4, 0xea, + 0xd7, 0xf8, 0x90, 0x5b, 0x08, 0x93, 0xad, 0x5a, 0x29, 0x29, 0x78, 0x76, + 0x88, 0xf7, 0xb4, 0xb0, 0x52, 0x21, 0x3f, 0xef, 0x26, 0x34, 0xe1, 0xf8, + 0x79, 0xe2, 0xcb, 0x58, 0xeb, 0xd8, 0x1e, 0x92, 0xd4, 0xa0, 0x79, 0x79, + 0xd4, 0x54, 0x0a, 0xbd, 0x2c, 0x9b, 0x6f, 0x9e, 0xaf, 0xbf, 0x7c, 0xd4, + 0xe2, 0x1d, 0x2d, 0x87, 0xd0, 0xd8, 0xd3, 0x69, 0xd5, 0xbc, 0x84, 0xf6, + 0x95, 0x75, 0x45, 0xfb, 0x91, 0x2d, 0xd8, 0x2a, 0x77, 0xb7, 0x26, 0xb9, + 0x87, 0x0b, 0x3f, 0x57, 0x9a, 0x32, 0xec, 0xc6, 0xe2, 0x5b, 0x61, 0xab, + 0xbe, 0x85, 0x61, 0xc8, 0x49, 0x0d, 0xb0, 0xe6, 0xef, 0x75, 0x5d, 0xab, + 0xd5, 0xc7, 0xf4, 0x0b, 0x4d, 0x23, 0x78, 0x21, 0x3f, 0xa9, 0xff, 0xd7, + 0x58, 0xa3, 0xa4, 0x3c, 0x8c, 0x97, 0x62, 0xb8, 0x55, 0x0a, 0x3b, 0x8c, + 0xae, 0x13, 0xc3, 0xeb, 0x44, 0xd2, 0xe9, 0xb2, 0x1a, 0x73, 0xf5, 0xc0, + 0x97, 0x8e, 0xdd, 0x7a, 0x6f, 0xf3, 0xb1, 0x0f, 0x6f, 0x3e, 0xf6, 0xd6, + 0xd9, 0xd2, 0x5a, 0xb2, 0xf1, 0x0f, 0xef, 0x6d, 0x6f, 0x27, 0xfd, 0x6f, + 0x34, 0xfd, 0x1f, 0x52, 0x1b, 0x52, 0x64, 0x6f, 0x85, 0x5d, 0x2d, 0x53, + 0x9b, 0x9d, 0xdc, 0x4e, 0xe1, 0x0d, 0x23, 0xde, 0x46, 0xba, 0x96, 0x5b, + 0x86, 0x5b, 0x95, 0xdb, 0x91, 0x78, 0x49, 0xbe, 0x20, 0xb7, 0x16, 0x92, + 0xff, 0xa9, 0x8a, 0x5a, 0x45, 0xb6, 0x2d, 0x2d, 0xb1, 0x9d, 0xf8, 0x5a, + 0xfa, 0x07, 0xab, 0x67, 0xb6, 0xfe, 0x3b, 0x35, 0x2b, 0x7a, 0x3f, 0xe2, + 0x29, 0xa8, 0x53, 0xb0, 0x9c, 0x6f, 0x49, 0x70, 0x7e, 0xdc, 0x56, 0xa1, + 0xe0, 0x6e, 0xa5, 0xd8, 0x59, 0xf5, 0xb7, 0x64, 0xc6, 0xa9, 0x79, 0x32, + 0xd3, 0x97, 0xac, 0x93, 0xc6, 0x7f, 0x06, 0xf7, 0xcf, 0x4b, 0xc5, 0x16, + 0x44, 0x48, 0xbd, 0xbf, 0x52, 0xbc, 0xe1, 0x2f, 0x41, 0xa4, 0x50, 0xf8, + 0xb9, 0x67, 0x55, 0x03, 0xdf, 0x0f, 0xb7, 0x0a, 0x3a, 0x8a, 0x24, 0xb0, + 0xe2, 0xa5, 0x42, 0x53, 0x7e, 0x3a, 0xbf, 0x1a, 0xf9, 0x6f, 0x78, 0x0a, + 0x7e, 0xff, 0x45, 0x45, 0xca, 0xb7, 0x64, 0xea, 0xe5, 0x78, 0x19, 0xdf, + 0x81, 0xb1, 0xde, 0xf7, 0xba, 0xd0, 0x79, 0xa1, 0xdc, 0x28, 0x37, 0x6b, + 0xef, 0xc5, 0xba, 0x91, 0x7d, 0x4e, 0x28, 0x36, 0x5b, 0x6c, 0x92, 0xc9, + 0xc2, 0xef, 0x06, 0xbe, 0xf7, 0xf2, 0xf7, 0x4d, 0xe8, 0xbd, 0xd8, 0x36, + 0x72, 0xbc, 0x54, 0xc8, 0x95, 0x9a, 0xb6, 0xc3, 0x42, 0xef, 0x85, 0xe4, + 0xac, 0x42, 0xef, 0xa5, 0xd9, 0x46, 0xce, 0x6c, 0x13, 0x02, 0x7f, 0x06, + 0xd9, 0x6b, 0xe0, 0x7b, 0x2f, 0x4d, 0x1b, 0xdf, 0x7b, 0x69, 0x76, 0xd4, + 0x20, 0xf4, 0x5e, 0xb6, 0x92, 0xcf, 0xa6, 0xde, 0xcb, 0x5f, 0x36, 0xbe, + 0xf7, 0x62, 0xdd, 0xc8, 0xfe, 0x35, 0xc1, 0x55, 0x5f, 0x24, 0x7b, 0xb7, + 0x04, 0x7f, 0x6a, 0xdd, 0x5e, 0x5c, 0x7b, 0x52, 0xe8, 0xbd, 0xd8, 0x36, + 0xa1, 0xf7, 0xf2, 0x97, 0xcd, 0xf6, 0x5d, 0x03, 0xdf, 0x7b, 0xe1, 0x75, + 0xc4, 0x01, 0x07, 0x4d, 0xbd, 0x17, 0xeb, 0x26, 0x1c, 0xf1, 0xbd, 0x97, + 0xbf, 0x6c, 0xa4, 0x42, 0xb6, 0x7e, 0xcc, 0xb0, 0xb6, 0x5d, 0xfe, 0xb6, + 0x59, 0x9b, 0x2e, 0x2f, 0xb6, 0x0a, 0x6b, 0xcf, 0xe5, 0xc5, 0x56, 0x61, + 0xed, 0xb8, 0x94, 0xf0, 0x3b, 0x7c, 0xc7, 0xa5, 0xf9, 0x56, 0xd1, 0xd4, + 0x6d, 0xe1, 0x7f, 0xf8, 0xa3, 0x19, 0xd6, 0x66, 0x4b, 0xe3, 0x66, 0x6d, + 0xb6, 0x34, 0x3b, 0x9c, 0x61, 0xed, 0xb5, 0xec, 0x14, 0xf6, 0x5e, 0x34, + 0x5b, 0xfe, 0xb2, 0x35, 0xb5, 0x5a, 0x1a, 0x7f, 0xf8, 0x13, 0xa7, 0x9a, + 0xc2, 0x9b, 0x1b, 0x7f, 0xc4, 0x37, 0x5a, 0x9a, 0xb6, 0x66, 0x77, 0x1d, + 0x68, 0xea, 0xb1, 0xfc, 0xe5, 0xe7, 0xeb, 0x26, 0x07, 0xf9, 0xd2, 0x9f, + 0xe6, 0x57, 0xce, 0xb0, 0xf6, 0x58, 0xac, 0xea, 0x7d, 0x28, 0x58, 0xa6, + 0x9d, 0x0f, 0x6f, 0x99, 0xdf, 0x53, 0x6e, 0xff, 0xb7, 0x2b, 0xf8, 0xdf, + 0xba, 0x82, 0xff, 0x9f, 0xf9, 0xa7, 0xa4, 0xf0, 0x7f, 0xfb, 0x97, 0xff, + 0xef, 0xf5, 0x2f, 0xff, 0xff, 0xf4, 0x0f, 0x79, 0xad, 0x8e, 0x82, 0x96, + 0x0a, 0x8e, 0x82, 0x96, 0xd1, 0x72, 0xda, 0x8e, 0xa6, 0x69, 0x86, 0xb6, + 0xa7, 0x1d, 0x68, 0x47, 0xda, 0x89, 0x76, 0xa6, 0x59, 0xda, 0x85, 0x76, + 0xa5, 0xdd, 0x68, 0x77, 0xda, 0x83, 0xf6, 0xa4, 0xbd, 0x68, 0x6f, 0xda, + 0x87, 0xf6, 0xa5, 0xfd, 0x68, 0x7f, 0x3a, 0x80, 0x0e, 0xa4, 0x15, 0x74, + 0x10, 0x1d, 0x4c, 0x87, 0xd0, 0xa1, 0x74, 0x18, 0x1d, 0x4e, 0x47, 0xd0, + 0x91, 0x74, 0x14, 0x1d, 0x4d, 0xc7, 0xd0, 0xb1, 0x74, 0x1b, 0x5a, 0x49, + 0xc7, 0xd1, 0xf1, 0x74, 0x02, 0x9d, 0x48, 0x27, 0xd1, 0xc9, 0x74, 0x0a, + 0x9d, 0x4a, 0xa7, 0xd1, 0xe9, 0x74, 0x06, 0x9d, 0x49, 0x67, 0xd1, 0xd9, + 0x74, 0x0e, 0xdd, 0x96, 0x56, 0xd1, 0x6a, 0xba, 0x1d, 0x9d, 0x4b, 0x6b, + 0x68, 0x2d, 0xdd, 0x9e, 0xce, 0xa3, 0x75, 0xb4, 0x9e, 0x36, 0xd0, 0x46, + 0xda, 0x44, 0xe7, 0xd3, 0x1d, 0xe8, 0x02, 0xba, 0x23, 0xdd, 0x89, 0x2e, + 0xa4, 0x3b, 0xd3, 0x45, 0x74, 0x31, 0xdd, 0x85, 0xee, 0x4a, 0x77, 0xa3, + 0xbb, 0xd3, 0x3d, 0xe8, 0x9e, 0x74, 0x2f, 0xba, 0x37, 0xdd, 0x87, 0xee, + 0x4b, 0xf7, 0xa3, 0x5f, 0xa1, 0xcd, 0x74, 0x7f, 0xba, 0x84, 0x2e, 0xa5, + 0x2d, 0xf4, 0x00, 0xba, 0x8c, 0x1e, 0x48, 0x97, 0xd3, 0x83, 0xe8, 0xc1, + 0x74, 0x05, 0x3d, 0x84, 0xae, 0xa4, 0xab, 0xe8, 0x6a, 0x7a, 0x28, 0x5d, + 0x43, 0xd7, 0xd2, 0x75, 0x74, 0x3d, 0x3d, 0x8c, 0x1e, 0x4e, 0x8f, 0xa0, + 0x1b, 0xe8, 0x91, 0xf4, 0x28, 0x7a, 0x34, 0x3d, 0x86, 0x7e, 0x95, 0x7e, + 0x8d, 0xe6, 0x68, 0x4c, 0x8f, 0xa5, 0x5f, 0xa7, 0xdf, 0xa0, 0xc7, 0xd1, + 0xe3, 0xe9, 0x09, 0xf4, 0x44, 0x7a, 0x12, 0x3d, 0x99, 0x9e, 0x42, 0x4f, + 0xa5, 0xa7, 0xd1, 0xd3, 0xe9, 0x37, 0xe9, 0x19, 0xf4, 0x5b, 0xf4, 0x4c, + 0x7a, 0x16, 0x3d, 0x9b, 0x9e, 0x43, 0xbf, 0x4d, 0xbf, 0x43, 0xcf, 0xa5, + 0xe7, 0xd1, 0xf3, 0xe9, 0x05, 0xf4, 0xbb, 0xf4, 0x42, 0x7a, 0x11, 0xbd, + 0x98, 0x5e, 0x42, 0x2f, 0xa5, 0x97, 0xd1, 0xcb, 0xe9, 0x15, 0xf4, 0x4a, + 0xfa, 0x3d, 0x7a, 0x15, 0xbd, 0x9a, 0x5e, 0x43, 0xaf, 0xa5, 0xd7, 0xd1, + 0xef, 0xd3, 0xeb, 0xe9, 0x0d, 0xf4, 0x46, 0x7a, 0x13, 0xbd, 0x99, 0xfe, + 0x80, 0xde, 0x42, 0x6f, 0xa5, 0x3f, 0xa4, 0xb7, 0xd1, 0xdb, 0xe9, 0x1d, + 0xf4, 0x4e, 0xfa, 0x23, 0x7a, 0x17, 0xbd, 0x9b, 0xfe, 0x98, 0xfe, 0x84, + 0xde, 0x43, 0xef, 0xa5, 0x3f, 0xa5, 0xf7, 0xd1, 0x9f, 0xd1, 0x9f, 0xd3, + 0xfb, 0xe9, 0x03, 0xf4, 0x41, 0xfa, 0x10, 0x7d, 0x98, 0x3e, 0x42, 0x1f, + 0xa5, 0x8f, 0xd1, 0xc7, 0xe9, 0x13, 0xf4, 0x49, 0xfa, 0x14, 0xfd, 0x05, + 0x7d, 0x9a, 0x3e, 0x43, 0x9f, 0xa5, 0xcf, 0xd1, 0x5f, 0xd2, 0xe7, 0xe9, + 0x0b, 0xf4, 0x45, 0xfa, 0x12, 0xfd, 0x15, 0x7d, 0x99, 0xfe, 0x9a, 0xbe, + 0x42, 0x5f, 0xa5, 0xaf, 0xd1, 0xd7, 0xe9, 0x1b, 0xf4, 0x37, 0xf4, 0x4d, + 0xfa, 0x16, 0x7d, 0x9b, 0xfe, 0x96, 0xfe, 0x8e, 0xfe, 0x9e, 0xfe, 0x81, + 0xfe, 0x91, 0xbe, 0x43, 0xdf, 0xa5, 0x7f, 0xa2, 0x49, 0x8a, 0xf3, 0x18, + 0xa3, 0xdf, 0x30, 0x7a, 0x82, 0x11, 0x59, 0x05, 0x7f, 0x60, 0xf4, 0x14, + 0x23, 0x62, 0x5b, 0x64, 0xa5, 0x3c, 0xc7, 0x40, 0x61, 0x40, 0x18, 0x00, + 0x83, 0x08, 0x83, 0x18, 0x83, 0x04, 0x83, 0x14, 0x83, 0x0c, 0x83, 0x1c, + 0x83, 0x1d, 0x06, 0x1a, 0x03, 0x83, 0xc1, 0x1e, 0x83, 0x03, 0x06, 0x47, + 0x0c, 0x4e, 0x18, 0x9c, 0x31, 0xb0, 0x18, 0x5c, 0x30, 0xb8, 0x62, 0x70, + 0xc3, 0xe0, 0x8e, 0xc1, 0x03, 0x83, 0x27, 0x06, 0x2f, 0x0c, 0xde, 0x18, + 0x7c, 0x30, 0xf8, 0x62, 0xf0, 0xc3, 0xe0, 0x8f, 0x21, 0x00, 0x43, 0x20, + 0x06, 0x05, 0x86, 0x20, 0x0c, 0xc1, 0x18, 0x42, 0x30, 0x84, 0x62, 0x08, + 0xc3, 0x10, 0x8e, 0x21, 0x02, 0x43, 0x24, 0x86, 0x28, 0x0c, 0xd1, 0x18, + 0x62, 0x30, 0xc4, 0x62, 0x68, 0x83, 0x41, 0x89, 0x21, 0x0e, 0x43, 0x3c, + 0x86, 0x04, 0x0c, 0x89, 0x18, 0x92, 0x30, 0x24, 0x63, 0x48, 0xc1, 0x90, + 0x8a, 0x21, 0x0d, 0x43, 0x3a, 0x86, 0x0c, 0x0c, 0x99, 0x18, 0xb2, 0x30, + 0x64, 0x63, 0xc8, 0xc1, 0xd0, 0x16, 0x83, 0x0a, 0x83, 0x1a, 0x43, 0x3b, + 0x0c, 0xb9, 0x18, 0x34, 0x18, 0xb4, 0x18, 0xda, 0x63, 0xc8, 0xc3, 0xa0, + 0xc3, 0xa0, 0xc7, 0x60, 0xc0, 0x60, 0xc4, 0x60, 0xc2, 0x90, 0x8f, 0xa1, + 0x03, 0x86, 0x02, 0x0c, 0x1d, 0x31, 0x74, 0xc2, 0x50, 0x88, 0xa1, 0x33, + 0x86, 0x22, 0x0c, 0xc5, 0x18, 0xba, 0x60, 0xe8, 0x8a, 0xa1, 0x1b, 0x86, + 0xee, 0x18, 0x7a, 0x60, 0xe8, 0x89, 0xa1, 0x17, 0x86, 0xde, 0x18, 0xfa, + 0x60, 0xe8, 0x8b, 0xa1, 0x1f, 0x86, 0x57, 0x30, 0x98, 0x31, 0xf4, 0xc7, + 0x50, 0x82, 0xa1, 0x14, 0x83, 0x05, 0xc3, 0x00, 0x0c, 0x65, 0x18, 0x06, + 0x62, 0x28, 0xc7, 0x30, 0x08, 0xc3, 0x60, 0x0c, 0x15, 0x18, 0x86, 0x60, + 0xa8, 0xc4, 0x50, 0x85, 0xa1, 0x1a, 0xc3, 0x50, 0x0c, 0x35, 0x18, 0x6a, + 0x31, 0xd4, 0x61, 0xa8, 0xc7, 0x30, 0x0c, 0xc3, 0x70, 0x0c, 0x23, 0x30, + 0x34, 0x60, 0x18, 0x89, 0x61, 0x14, 0x86, 0xd1, 0x18, 0xc6, 0x60, 0x78, + 0x15, 0xc3, 0x6b, 0x18, 0x38, 0x0c, 0x18, 0xc3, 0x58, 0x0c, 0xaf, 0x63, + 0x78, 0x03, 0xc3, 0x38, 0x0c, 0xe3, 0x31, 0x4c, 0xc0, 0x30, 0x11, 0xc3, + 0x24, 0x0c, 0x93, 0x31, 0x4c, 0xc1, 0x30, 0x15, 0xc3, 0x34, 0x0c, 0xd3, + 0x31, 0xbc, 0x89, 0x61, 0x06, 0x86, 0xb7, 0x30, 0xcc, 0xc4, 0x30, 0x0b, + 0xc3, 0x6c, 0x0c, 0x73, 0x30, 0xbc, 0x8d, 0xe1, 0x1d, 0x0c, 0x73, 0x31, + 0xcc, 0xc3, 0x30, 0x1f, 0xc3, 0x02, 0x0c, 0xef, 0x62, 0x58, 0x88, 0x61, + 0x11, 0x86, 0xc5, 0x18, 0x96, 0x60, 0x58, 0x8a, 0x61, 0x19, 0x86, 0xe5, + 0x18, 0x56, 0x60, 0x58, 0x89, 0xe1, 0x3d, 0x0c, 0xab, 0x30, 0xac, 0xc6, + 0xb0, 0x06, 0xc3, 0x5a, 0x0c, 0xeb, 0x30, 0xbc, 0x8f, 0x61, 0x3d, 0x86, + 0x0d, 0x18, 0x36, 0x62, 0xd8, 0x84, 0x61, 0x33, 0x86, 0x0f, 0x30, 0x6c, + 0xc1, 0xb0, 0x15, 0xc3, 0x87, 0x18, 0xb6, 0x61, 0xd8, 0x8e, 0x61, 0x07, + 0x86, 0x9d, 0x18, 0x3e, 0xc2, 0xb0, 0x0b, 0xc3, 0x6e, 0x0c, 0x1f, 0x63, + 0xf8, 0x04, 0xc3, 0x1e, 0x0c, 0x7b, 0x31, 0x7c, 0x8a, 0x61, 0x1f, 0x86, + 0xcf, 0x30, 0x7c, 0x8e, 0x61, 0x3f, 0x86, 0x03, 0x18, 0x0e, 0x62, 0x38, + 0x84, 0xe1, 0x30, 0x86, 0x23, 0x18, 0x8e, 0x62, 0x38, 0x86, 0xe1, 0x38, + 0x86, 0x13, 0x18, 0x4e, 0x62, 0x38, 0x85, 0xe1, 0x0b, 0x0c, 0xa7, 0x31, + 0x9c, 0xc1, 0x70, 0x16, 0xc3, 0x39, 0x0c, 0x5f, 0x62, 0x38, 0x8f, 0xe1, + 0x02, 0x86, 0x8b, 0x18, 0x2e, 0x61, 0xf8, 0x0a, 0xc3, 0x65, 0x0c, 0x5f, + 0x63, 0xb8, 0x82, 0xe1, 0x2a, 0xf1, 0x4d, 0x2c, 0x78, 0xb1, 0xe0, 0xcd, + 0x82, 0x0f, 0x0b, 0xbe, 0x2c, 0xf8, 0xb1, 0xe0, 0xcf, 0x42, 0x00, 0x0b, + 0x81, 0x2c, 0x28, 0x58, 0x08, 0x62, 0x21, 0x98, 0x85, 0x10, 0x16, 0x42, + 0x59, 0x08, 0x63, 0x21, 0x9c, 0x85, 0x08, 0x16, 0x22, 0x59, 0x88, 0x62, + 0x21, 0x9a, 0x85, 0x18, 0x16, 0x62, 0x59, 0x68, 0xc3, 0x82, 0x92, 0x85, + 0x38, 0x16, 0xe2, 0x59, 0x48, 0x60, 0x21, 0x91, 0x85, 0x24, 0x16, 0x92, + 0x59, 0x48, 0x61, 0x21, 0x95, 0x85, 0x34, 0x16, 0xd2, 0x59, 0xc8, 0x60, + 0x21, 0x93, 0x85, 0x2c, 0x16, 0xb2, 0x59, 0xc8, 0x61, 0xa1, 0x2d, 0x0b, + 0x2a, 0x16, 0xd4, 0x2c, 0xb4, 0x63, 0x21, 0x97, 0x05, 0x0d, 0x0b, 0x5a, + 0x16, 0xda, 0xb3, 0x90, 0xc7, 0x82, 0x8e, 0x05, 0x3d, 0x0b, 0x06, 0x16, + 0x8c, 0x2c, 0x98, 0x58, 0xc8, 0x67, 0xa1, 0x03, 0x0b, 0x05, 0x2c, 0x74, + 0x64, 0xa1, 0x13, 0x0b, 0x85, 0x2c, 0x74, 0x66, 0xa1, 0x88, 0x85, 0x62, + 0x16, 0xba, 0xb0, 0xd0, 0x95, 0x85, 0x6e, 0x2c, 0x74, 0x67, 0xa1, 0x07, + 0x0b, 0x3d, 0x59, 0xe8, 0xc5, 0x42, 0x6f, 0x16, 0xfa, 0xb0, 0xd0, 0x97, + 0x85, 0x7e, 0x2c, 0xbc, 0xc2, 0x82, 0x99, 0x85, 0xfe, 0x2c, 0x94, 0xb0, + 0x50, 0xca, 0x82, 0x85, 0x85, 0x01, 0x2c, 0x94, 0xb1, 0x30, 0x90, 0x85, + 0x72, 0x16, 0x06, 0xb1, 0x30, 0x98, 0x85, 0x0a, 0x16, 0x86, 0xb0, 0x50, + 0xc9, 0x42, 0x15, 0x0b, 0xd5, 0x2c, 0x0c, 0x65, 0xa1, 0x86, 0x85, 0x5a, + 0x16, 0xea, 0x58, 0xa8, 0x67, 0x61, 0x18, 0x0b, 0xc3, 0x59, 0x18, 0xc1, + 0x42, 0x03, 0x0b, 0x23, 0x59, 0x18, 0xc5, 0xc2, 0x68, 0x16, 0xc6, 0xb0, + 0xf0, 0x2a, 0x0b, 0xaf, 0xb1, 0xc0, 0xb1, 0x80, 0x59, 0x18, 0xcb, 0xc2, + 0xeb, 0x2c, 0xbc, 0xc1, 0xc2, 0x38, 0x16, 0xc6, 0xb3, 0x30, 0x81, 0x85, + 0x89, 0x2c, 0x4c, 0x62, 0x61, 0x32, 0x0b, 0x53, 0x58, 0x98, 0xca, 0xc2, + 0x34, 0x16, 0xa6, 0xb3, 0xf0, 0x26, 0x0b, 0x33, 0x58, 0x78, 0x8b, 0x85, + 0x99, 0x2c, 0xcc, 0x62, 0x61, 0x36, 0x0b, 0x73, 0x58, 0x78, 0x9b, 0x85, + 0x77, 0x58, 0x98, 0xcb, 0xc2, 0x3c, 0x16, 0xe6, 0xb3, 0xb0, 0x80, 0x85, + 0x77, 0x59, 0x58, 0xc8, 0xc2, 0x22, 0x16, 0x16, 0xb3, 0xb0, 0x84, 0x85, + 0xa5, 0x2c, 0x2c, 0x63, 0x61, 0x39, 0x0b, 0x2b, 0x58, 0x58, 0xc9, 0xc2, + 0x7b, 0x2c, 0xac, 0x62, 0x61, 0x35, 0x0b, 0x6b, 0x58, 0x58, 0xcb, 0xc2, + 0x3a, 0x16, 0xde, 0x67, 0x61, 0x3d, 0x0b, 0x1b, 0x58, 0xd8, 0xc8, 0xc2, + 0x26, 0x16, 0x36, 0xb3, 0xf0, 0x01, 0x0b, 0x5b, 0x58, 0xd8, 0xca, 0xc2, + 0x87, 0x2c, 0x6c, 0x63, 0x61, 0x3b, 0x0b, 0x3b, 0x58, 0xd8, 0xc9, 0xc2, + 0x47, 0x2c, 0xec, 0x62, 0x61, 0x37, 0x0b, 0x1f, 0xb3, 0xf0, 0x09, 0x0b, + 0x7b, 0x58, 0xd8, 0xcb, 0xc2, 0xa7, 0x2c, 0xec, 0x63, 0xe1, 0x33, 0x16, + 0x3e, 0x67, 0x61, 0x3f, 0x0b, 0x07, 0x58, 0x38, 0xc8, 0xc2, 0x21, 0x16, + 0x0e, 0xb3, 0x70, 0x84, 0x85, 0xa3, 0x2c, 0x1c, 0x63, 0xe1, 0x38, 0x0b, + 0x27, 0x58, 0x38, 0xc9, 0xc2, 0x29, 0x16, 0xbe, 0x60, 0xe1, 0x34, 0x0b, + 0x67, 0x58, 0x38, 0xcb, 0xc2, 0x39, 0x16, 0xbe, 0x64, 0xe1, 0x3c, 0x0b, + 0x17, 0x58, 0xb8, 0xc8, 0xc2, 0x25, 0x16, 0xbe, 0x62, 0xe1, 0x32, 0x0b, + 0x5f, 0xb3, 0x70, 0x85, 0x85, 0xab, 0x2c, 0x5c, 0x63, 0xe1, 0x3a, 0x0b, + 0x37, 0x58, 0xf8, 0x86, 0x85, 0x9b, 0x2c, 0xdc, 0x62, 0xe1, 0x36, 0x0b, + 0xdf, 0xb2, 0xf0, 0x1d, 0x0b, 0xdf, 0xb3, 0xf0, 0x03, 0x0b, 0x3f, 0xb2, + 0x70, 0x87, 0x85, 0xbb, 0x2c, 0xfc, 0xc4, 0xc2, 0x3d, 0x16, 0xee, 0xb3, + 0xf0, 0x80, 0x85, 0x9f, 0x59, 0x20, 0x36, 0xf9, 0x0b, 0x0b, 0x8f, 0x58, + 0xf8, 0x95, 0x85, 0xc7, 0x2c, 0xfc, 0xc6, 0xc2, 0x13, 0x16, 0x7e, 0x67, + 0xe1, 0x0f, 0x16, 0x9e, 0xb2, 0xf0, 0x27, 0x0b, 0xcf, 0x58, 0x78, 0xce, + 0x8a, 0x28, 0x21, 0xac, 0x32, 0x5f, 0x59, 0x9f, 0x46, 0x59, 0x0f, 0xae, + 0x48, 0xed, 0x97, 0x08, 0x01, 0x97, 0x54, 0x90, 0xcc, 0x75, 0xe6, 0x46, + 0xdf, 0x82, 0x22, 0x43, 0xae, 0xf5, 0x0f, 0xa1, 0x68, 0xcd, 0x75, 0xe6, + 0x65, 0xcc, 0x75, 0xe1, 0x6f, 0x27, 0x08, 0x7f, 0x61, 0xc2, 0x52, 0xda, + 0xae, 0xf1, 0x4f, 0x8c, 0x9d, 0x66, 0x6e, 0x31, 0xb7, 0xa1, 0x3b, 0xf3, + 0x6d, 0x3f, 0x67, 0x1f, 0x43, 0xae, 0xb2, 0xb6, 0xa1, 0xb6, 0xce, 0x32, + 0x84, 0xef, 0x13, 0x75, 0xa9, 0x2e, 0x35, 0xd7, 0x59, 0xba, 0x5a, 0xff, + 0x36, 0x59, 0x1f, 0xf2, 0x95, 0xf5, 0x0f, 0xa8, 0x90, 0x93, 0x66, 0x0e, + 0x51, 0x72, 0xca, 0x9b, 0x0a, 0x26, 0xb4, 0x29, 0x24, 0x8d, 0x55, 0x49, + 0xed, 0xa4, 0x4e, 0xd2, 0x6c, 0xa9, 0x46, 0x5a, 0x28, 0xed, 0x2b, 0xad, + 0x96, 0xbe, 0x2a, 0x9d, 0x2f, 0x5d, 0x2f, 0x3d, 0x28, 0xfd, 0x46, 0xfa, + 0x83, 0xf4, 0x91, 0xf4, 0xb1, 0xf4, 0x89, 0xf4, 0xa9, 0xf4, 0xb9, 0x0c, + 0x64, 0x12, 0x99, 0x4c, 0x46, 0xcb, 0x1c, 0x64, 0xce, 0x32, 0x57, 0x99, + 0x9f, 0x2c, 0x52, 0x16, 0x2d, 0x8b, 0x95, 0x65, 0xca, 0x34, 0xb2, 0x02, + 0x59, 0x37, 0xd9, 0x00, 0xd9, 0x60, 0x59, 0x9d, 0x6c, 0x8c, 0x6c, 0xa2, + 0x6c, 0x92, 0x6c, 0x8a, 0x6c, 0xb6, 0x6c, 0xa9, 0x6c, 0xb5, 0x6c, 0x83, + 0x6c, 0xbb, 0xbc, 0xbf, 0xbc, 0x54, 0x3e, 0x40, 0x3e, 0x50, 0x3e, 0x48, + 0x5e, 0x21, 0xaf, 0x94, 0x57, 0xcb, 0x6b, 0xe4, 0x75, 0xf2, 0x61, 0xf2, + 0x11, 0xf2, 0x91, 0xf2, 0xd1, 0xf2, 0x57, 0xf9, 0x3f, 0x95, 0x24, 0x7f, + 0x43, 0x3e, 0x5e, 0x3e, 0x51, 0x3e, 0x59, 0x3e, 0x55, 0x3e, 0x5d, 0x3e, + 0x43, 0x3e, 0x53, 0x3e, 0x5b, 0xfe, 0xb6, 0x7c, 0xae, 0x7c, 0xbe, 0xfc, + 0x5d, 0xf9, 0x22, 0xf9, 0x12, 0xf9, 0x32, 0xf9, 0x0a, 0xf9, 0x7b, 0xf2, + 0xd5, 0xf2, 0xb5, 0xf2, 0xf7, 0xe5, 0x1b, 0xe4, 0x9b, 0xe4, 0x1f, 0xc8, + 0xb7, 0xca, 0xb7, 0xc9, 0x77, 0xc8, 0x3f, 0x92, 0xef, 0x96, 0x7f, 0x22, + 0xdf, 0x2b, 0xdf, 0x27, 0xff, 0x5c, 0x7e, 0x40, 0x7e, 0x58, 0x7e, 0x4c, + 0x7e, 0x52, 0x7e, 0x5a, 0x7e, 0x4e, 0x7e, 0x41, 0xfe, 0x95, 0xfc, 0x8a, + 0xfc, 0xba, 0xfc, 0xa6, 0xfc, 0x5b, 0xf9, 0x0f, 0xf2, 0xbb, 0xf2, 0xfb, + 0xf2, 0x87, 0xf2, 0x5f, 0xe5, 0x4f, 0xe4, 0x4f, 0xe5, 0xcf, 0xed, 0xc0, + 0x4e, 0x62, 0x27, 0xb7, 0x63, 0xec, 0x1c, 0xed, 0x58, 0x3b, 0x37, 0x3b, + 0x4f, 0x3b, 0x1f, 0x3b, 0x7f, 0x3b, 0x85, 0x5d, 0x88, 0x5d, 0xb8, 0x5d, + 0x94, 0x5d, 0xac, 0x5d, 0x9c, 0x9d, 0xda, 0xce, 0x60, 0xd7, 0xcd, 0xae, + 0x9f, 0x9d, 0xd9, 0xae, 0xc4, 0xce, 0x62, 0x57, 0x66, 0x57, 0x6d, 0x57, + 0x63, 0x57, 0x67, 0xc7, 0xd9, 0x4d, 0xb2, 0x9b, 0x69, 0xb7, 0xc6, 0x6e, + 0x93, 0xdd, 0x1e, 0xbb, 0x63, 0x76, 0x27, 0xec, 0x4e, 0xd9, 0x9d, 0xb6, + 0x7b, 0x48, 0x23, 0x92, 0x09, 0xf9, 0x91, 0x8c, 0x26, 0x81, 0xe4, 0x2b, + 0x79, 0x24, 0x1f, 0xe9, 0x40, 0xb2, 0x90, 0x62, 0x92, 0x81, 0x74, 0x27, + 0xd9, 0x47, 0x6f, 0x92, 0x5b, 0x34, 0x90, 0xcc, 0xe1, 0x75, 0x92, 0x31, + 0x4c, 0x22, 0x99, 0x02, 0x9f, 0x01, 0x6c, 0x24, 0x31, 0xfd, 0x08, 0x89, + 0xda, 0x27, 0x48, 0xc4, 0xbe, 0x40, 0x22, 0xf0, 0x43, 0x46, 0xca, 0x30, + 0x8c, 0x17, 0xe3, 0xc3, 0xf8, 0x31, 0x01, 0x4c, 0x02, 0x93, 0xc9, 0xb4, + 0x67, 0x8c, 0x4c, 0x6f, 0xc6, 0xc2, 0x8c, 0x61, 0xde, 0x60, 0x66, 0x31, + 0x4b, 0x98, 0x65, 0xcc, 0x0a, 0xe6, 0x3d, 0xe6, 0x20, 0x73, 0x98, 0x39, + 0xca, 0x1c, 0x67, 0x4e, 0x32, 0x5f, 0x30, 0x67, 0x98, 0xcb, 0xcc, 0x15, + 0xe6, 0x17, 0x7b, 0x89, 0xbd, 0xcc, 0xde, 0xce, 0x9e, 0xb1, 0x77, 0xb0, + 0x8f, 0xb6, 0x8f, 0xb5, 0x57, 0xda, 0xc7, 0xdb, 0x27, 0xda, 0x27, 0xdb, + 0xa7, 0xda, 0xeb, 0xec, 0x8d, 0xf6, 0x1d, 0xec, 0x3b, 0xd9, 0x17, 0xd9, + 0x0f, 0xb1, 0x9f, 0x66, 0x3f, 0xdf, 0xfe, 0x5d, 0xfb, 0x45, 0xf6, 0x4b, + 0xec, 0x3f, 0xb5, 0xff, 0xcc, 0x7e, 0xbf, 0xfd, 0x41, 0xfb, 0xc3, 0xf6, + 0x47, 0xed, 0x8f, 0xdb, 0x5f, 0xb2, 0xff, 0xda, 0xfe, 0x9a, 0xfd, 0x37, + 0xf6, 0x3f, 0xd9, 0xdf, 0xb7, 0x7f, 0xe6, 0xc0, 0x38, 0x38, 0x38, 0x38, + 0x39, 0xb0, 0x0e, 0x89, 0x0e, 0xc9, 0x0e, 0xa9, 0x0e, 0xe9, 0x0e, 0x99, + 0x0e, 0xd9, 0x0e, 0x6d, 0x1d, 0xb4, 0x0e, 0x79, 0x0e, 0xc5, 0x0e, 0x66, + 0x87, 0x12, 0x07, 0x8b, 0x43, 0x99, 0xc3, 0x44, 0x87, 0xc9, 0x0e, 0x53, + 0x1d, 0xa6, 0x3b, 0xcc, 0x70, 0x98, 0xe9, 0x30, 0xdb, 0x61, 0xb1, 0xc3, + 0x52, 0x87, 0x8d, 0x0e, 0xbb, 0x1d, 0x3e, 0x71, 0xd8, 0xeb, 0xb0, 0xcf, + 0xe1, 0x5b, 0x87, 0x07, 0x0e, 0x0f, 0x1d, 0x7e, 0x73, 0xf8, 0xdd, 0xe1, + 0xa9, 0xc3, 0x33, 0x47, 0xca, 0x11, 0x1c, 0xc5, 0x8e, 0x2e, 0x8e, 0x6e, + 0x8e, 0x21, 0x8e, 0xf1, 0x8e, 0x89, 0x8e, 0xc9, 0x8e, 0xa9, 0x8e, 0xdd, + 0x1c, 0x7b, 0x38, 0xf6, 0x72, 0xec, 0xe3, 0xd8, 0xcf, 0xd1, 0xec, 0x58, + 0xe2, 0x58, 0xed, 0x58, 0xe3, 0xd8, 0xe0, 0x38, 0xde, 0x71, 0xa2, 0xe3, + 0x64, 0xc7, 0xa9, 0x8e, 0xeb, 0x1d, 0x37, 0x3a, 0x6e, 0x76, 0xdc, 0xe2, + 0xf8, 0xa1, 0xe3, 0x76, 0xc7, 0x9d, 0x8e, 0x1f, 0x3b, 0xee, 0x71, 0x3c, + 0xe6, 0x78, 0xd1, 0xf1, 0x2b, 0xc7, 0xaf, 0x1d, 0xaf, 0x3a, 0x3e, 0x75, + 0x7c, 0xe6, 0x44, 0x39, 0x81, 0x93, 0xd8, 0x49, 0xea, 0x24, 0x77, 0xf2, + 0x71, 0x4a, 0x72, 0x52, 0x3b, 0xe5, 0x3a, 0x69, 0x9d, 0xf2, 0x9c, 0xca, + 0x9c, 0xca, 0x9d, 0x06, 0x3b, 0x0d, 0x71, 0xaa, 0x72, 0x1a, 0xea, 0x54, + 0xeb, 0xf4, 0x86, 0xd3, 0x04, 0xa7, 0xc9, 0x4e, 0xd3, 0x9c, 0x66, 0x38, + 0x2d, 0x70, 0xda, 0xe2, 0xb4, 0xd7, 0x69, 0x9f, 0xd3, 0xe7, 0x4e, 0x07, + 0x9c, 0xbe, 0x75, 0xfa, 0xde, 0xe9, 0x47, 0xa7, 0xbb, 0x4e, 0xf7, 0x9c, + 0x1e, 0x38, 0x3d, 0x74, 0xb6, 0x77, 0x76, 0x74, 0x76, 0x73, 0x0e, 0x73, + 0x8e, 0x70, 0x8e, 0x72, 0x8e, 0x71, 0x6e, 0xe3, 0x5c, 0xe0, 0xdc, 0xc9, + 0xb9, 0xb3, 0x73, 0xb1, 0x73, 0x57, 0xe7, 0xee, 0xce, 0x3d, 0x9d, 0x6b, + 0x9d, 0xeb, 0x9d, 0x5f, 0x75, 0xe6, 0x9c, 0xc7, 0x3a, 0xcf, 0x70, 0x5e, + 0xe0, 0xbc, 0xda, 0x79, 0xad, 0xf3, 0xfb, 0xce, 0x1b, 0x9c, 0x4f, 0x3a, + 0x7f, 0xe1, 0xfc, 0xa5, 0xf3, 0x05, 0xe7, 0x4b, 0xce, 0x97, 0x9d, 0xaf, + 0x38, 0x5f, 0x73, 0xbe, 0xc3, 0x4a, 0x58, 0x17, 0xd6, 0x8d, 0xf5, 0x60, + 0xbd, 0xd8, 0x0c, 0x36, 0x8b, 0xcd, 0x61, 0x55, 0x6c, 0x3b, 0x56, 0xc3, + 0xb6, 0x67, 0x0b, 0xd8, 0x32, 0xb6, 0x8e, 0x1d, 0xc6, 0x8e, 0x60, 0x47, + 0xb2, 0x0b, 0xd8, 0x85, 0xec, 0x62, 0x76, 0x29, 0xbb, 0x9c, 0x5d, 0xc9, + 0xae, 0x62, 0xb7, 0xb2, 0xdb, 0xd9, 0x8f, 0xd8, 0x8f, 0xd9, 0xa3, 0xec, + 0x45, 0xf6, 0x36, 0xfb, 0x1d, 0xfb, 0x03, 0x7b, 0xc7, 0xc5, 0xc1, 0xc5, + 0xc9, 0x85, 0x75, 0x71, 0x75, 0x71, 0x77, 0xf1, 0x74, 0xf1, 0x76, 0x89, + 0x74, 0x49, 0x73, 0xd1, 0xba, 0xe4, 0xb9, 0xe8, 0x5d, 0x8c, 0x2e, 0x83, + 0x5d, 0x86, 0xb8, 0x54, 0xb9, 0x0c, 0x75, 0xa9, 0x75, 0xa9, 0x77, 0x19, + 0xee, 0xf2, 0x86, 0xcb, 0x04, 0x97, 0xc9, 0x2e, 0xd3, 0x5c, 0x66, 0xba, + 0xcc, 0x76, 0x99, 0xef, 0xb2, 0xca, 0x65, 0x8d, 0xcb, 0x3a, 0x97, 0xf5, + 0x2e, 0x27, 0x5c, 0x4e, 0xb9, 0x9c, 0x76, 0x39, 0xeb, 0xf2, 0xa5, 0xcb, + 0x05, 0x97, 0x4b, 0x2e, 0xb7, 0x5c, 0xbe, 0x75, 0xf9, 0xd9, 0xe5, 0xb9, + 0x2b, 0x72, 0x15, 0xb9, 0x4a, 0x5c, 0xc3, 0x5d, 0x23, 0x5d, 0xa3, 0x5d, + 0x63, 0x5d, 0x95, 0xae, 0xf1, 0xae, 0x89, 0xae, 0xa9, 0xae, 0xe9, 0xae, + 0x39, 0xae, 0x46, 0xd7, 0x7c, 0xd7, 0x02, 0xd7, 0x4e, 0xae, 0x43, 0x5d, + 0x6b, 0x5d, 0xeb, 0x5d, 0x87, 0xbb, 0x36, 0xb8, 0x8e, 0x72, 0x1d, 0xe3, + 0x3a, 0xd9, 0x75, 0x9a, 0xeb, 0x0c, 0xd7, 0x59, 0xae, 0xab, 0x5d, 0xd7, + 0xba, 0xee, 0x74, 0x3d, 0xe0, 0x7a, 0xc8, 0xf5, 0x88, 0xeb, 0x31, 0xd7, + 0xbb, 0xae, 0xf7, 0x5c, 0x1f, 0xb8, 0x3e, 0x74, 0x7d, 0xe4, 0xfa, 0xd8, + 0xf5, 0x89, 0x1b, 0xe5, 0x26, 0x77, 0x73, 0x77, 0xf3, 0x74, 0xf3, 0x76, + 0xf3, 0x75, 0xcb, 0x76, 0x6b, 0xeb, 0xa6, 0x76, 0xcb, 0x75, 0xd3, 0xba, + 0xe5, 0xb9, 0xe9, 0xdd, 0x0a, 0xdc, 0x3a, 0xb9, 0x75, 0x73, 0x2b, 0x75, + 0x1b, 0xe0, 0x36, 0xd0, 0x6d, 0x90, 0xdb, 0x14, 0xb7, 0x69, 0x6e, 0x6f, + 0xba, 0xbd, 0xe5, 0x36, 0xcb, 0x6d, 0x8e, 0xdb, 0x3b, 0x6e, 0x5b, 0xdc, + 0x3e, 0x74, 0x3b, 0xe8, 0x76, 0xd6, 0xed, 0x4b, 0xb7, 0x0b, 0x6e, 0x97, + 0xdc, 0xfe, 0x70, 0xfb, 0xd3, 0xed, 0xb9, 0x3b, 0x72, 0x17, 0xb9, 0x4b, + 0xdc, 0x65, 0xee, 0xf6, 0xee, 0x8e, 0xee, 0x6e, 0xee, 0x41, 0xee, 0x21, + 0xee, 0x61, 0xee, 0x11, 0xee, 0xf9, 0xee, 0x9d, 0xdd, 0x8b, 0xdd, 0xbb, + 0xba, 0x77, 0x77, 0xef, 0xe9, 0xde, 0xdb, 0xbd, 0xaf, 0xfb, 0x2b, 0xee, + 0x43, 0xdc, 0xab, 0xdd, 0x6b, 0xdd, 0x87, 0xb9, 0x73, 0xee, 0x63, 0xdd, + 0xdf, 0x75, 0x5f, 0xe3, 0xbe, 0xce, 0x7d, 0xbd, 0xfb, 0x46, 0xf7, 0xb3, + 0xee, 0x5f, 0xba, 0x5f, 0x70, 0xbf, 0xe4, 0x7e, 0xd9, 0xfd, 0x8a, 0xfb, + 0x35, 0xf7, 0x1b, 0xee, 0x77, 0xdd, 0xef, 0xb9, 0x3f, 0x75, 0x7f, 0xe6, + 0x41, 0x79, 0x80, 0x47, 0x88, 0x47, 0x98, 0x47, 0x84, 0x47, 0x94, 0x47, + 0x8c, 0x47, 0x1b, 0x8f, 0x38, 0x0f, 0x8d, 0x47, 0x7b, 0x0f, 0x8b, 0x47, + 0x8d, 0x47, 0x9d, 0xc7, 0x30, 0x8f, 0x11, 0x1e, 0x0b, 0x3d, 0x16, 0x7b, + 0x2c, 0xf5, 0x58, 0xee, 0xb1, 0xd2, 0x63, 0x95, 0xc7, 0x1a, 0x8f, 0x75, + 0x1e, 0x3b, 0x3d, 0x76, 0x79, 0x1c, 0xf2, 0x38, 0xe2, 0x71, 0xcc, 0xe3, + 0x84, 0xc7, 0x3d, 0x8f, 0x07, 0x1e, 0x0f, 0x3d, 0x1e, 0x79, 0x3c, 0xf6, + 0x78, 0xe2, 0xf1, 0x87, 0x27, 0xe5, 0x09, 0x9e, 0x72, 0x4f, 0x77, 0x4f, + 0x4f, 0x4f, 0x6f, 0x4f, 0x5f, 0xcf, 0x6c, 0xcf, 0xb6, 0x9e, 0x6a, 0xcf, + 0x5c, 0x4f, 0xad, 0x67, 0x9e, 0xa7, 0xde, 0x73, 0x80, 0xe7, 0x04, 0xcf, + 0xd9, 0x9e, 0x6f, 0x7b, 0xce, 0xf5, 0x9c, 0xef, 0xb9, 0xc7, 0xf3, 0x53, + 0xcf, 0xcf, 0x3c, 0xf7, 0x7b, 0x1e, 0xf4, 0x3c, 0xec, 0x79, 0xd4, 0xf3, + 0xb8, 0xe7, 0x6d, 0xcf, 0xef, 0x3c, 0x1f, 0x79, 0x3e, 0xf6, 0x7c, 0xe2, + 0xf9, 0x87, 0x97, 0x9f, 0x57, 0x80, 0x97, 0xc2, 0x2b, 0xd8, 0x2b, 0xd4, + 0x2b, 0xdc, 0x2b, 0xd2, 0xab, 0x8d, 0x57, 0xa6, 0x97, 0xce, 0xcb, 0xe0, + 0x65, 0xf2, 0xea, 0xe0, 0x55, 0xe9, 0x55, 0xed, 0x55, 0xe3, 0x55, 0xe7, + 0x35, 0xcc, 0x6b, 0x84, 0xd7, 0x48, 0xaf, 0x09, 0x5e, 0x93, 0xbd, 0xa6, + 0x79, 0xcd, 0xf0, 0x5a, 0xe8, 0xb5, 0xd8, 0xeb, 0x43, 0xaf, 0x7d, 0x5e, + 0x9f, 0x7b, 0x1d, 0xf0, 0x3a, 0xe4, 0xf5, 0xbd, 0xd7, 0x8f, 0x5e, 0x77, + 0xbd, 0xee, 0x79, 0x3d, 0xf0, 0x7a, 0xe8, 0xf5, 0xc8, 0xdb, 0xcf, 0xbb, + 0xad, 0xb7, 0xc9, 0xbb, 0x83, 0x77, 0x47, 0xef, 0x42, 0xef, 0x1a, 0xef, + 0x3a, 0xef, 0x61, 0xde, 0x23, 0xbc, 0x47, 0x7a, 0x8f, 0xf6, 0x7e, 0xd5, + 0xfb, 0x5d, 0xef, 0x0f, 0xbd, 0xf7, 0x79, 0x7f, 0xee, 0x7d, 0xc0, 0xfb, + 0x90, 0xf7, 0x5d, 0xef, 0x7b, 0xde, 0x0f, 0xbc, 0x1f, 0x7a, 0x3f, 0xf2, + 0x7e, 0xec, 0xfd, 0xc4, 0x47, 0xea, 0x63, 0xe7, 0x63, 0xef, 0xe3, 0xe4, + 0x13, 0xec, 0x93, 0xe3, 0x63, 0xf4, 0xc9, 0xf7, 0x29, 0xf0, 0xe9, 0xe4, + 0x53, 0xef, 0x33, 0xdc, 0xa7, 0xc1, 0x67, 0x94, 0xcf, 0x18, 0x9f, 0xd7, + 0x7c, 0xb0, 0xcf, 0x74, 0x9f, 0x0f, 0x7c, 0xf6, 0xf8, 0x7c, 0xea, 0xf3, + 0x99, 0xcf, 0x7e, 0x9f, 0x1f, 0x7c, 0xee, 0xf8, 0xfc, 0xe4, 0x73, 0xdf, + 0xe7, 0x67, 0x9f, 0x5f, 0x7c, 0x7e, 0xf5, 0x05, 0xdf, 0x60, 0xdf, 0x24, + 0xdf, 0x14, 0xdf, 0x34, 0xdf, 0x0c, 0xdf, 0x2c, 0xdf, 0xde, 0xbe, 0x7d, + 0x7d, 0x5f, 0xf1, 0xed, 0xef, 0x5b, 0xea, 0x3b, 0xc0, 0x77, 0xa0, 0x6f, + 0x83, 0xef, 0x68, 0xdf, 0xd7, 0x7c, 0xc7, 0xfa, 0x8e, 0xf3, 0x9d, 0xe1, + 0x3b, 0xcf, 0x77, 0x81, 0xef, 0x42, 0xdf, 0x75, 0xbe, 0xfb, 0x7c, 0xcf, + 0xf8, 0x9e, 0xf3, 0x3d, 0xef, 0x7b, 0xd1, 0xf7, 0x2b, 0x3f, 0xca, 0x0f, + 0xfc, 0xc4, 0x7e, 0x52, 0x3f, 0xb9, 0x1f, 0xed, 0x67, 0xef, 0xc7, 0xfa, + 0xb9, 0xfa, 0x05, 0xf9, 0x25, 0xfa, 0x25, 0xfb, 0xa5, 0xfa, 0xa5, 0xfb, + 0x65, 0xfa, 0xf5, 0xf3, 0x33, 0xfb, 0x95, 0xf8, 0x59, 0xfc, 0xca, 0xfc, + 0xca, 0xfd, 0x06, 0xfb, 0xd5, 0xf8, 0xd5, 0xf9, 0x61, 0xbf, 0xd7, 0xfd, + 0xc6, 0xf9, 0x4d, 0xf0, 0x5b, 0xed, 0xb7, 0xd6, 0xef, 0x7d, 0xbf, 0x0d, + 0x7e, 0x9b, 0xfc, 0x3e, 0xf0, 0xdb, 0xea, 0xf7, 0x89, 0xdf, 0x5e, 0xbf, + 0xa3, 0x7e, 0x97, 0xfd, 0xae, 0xf8, 0x5d, 0xf3, 0xbb, 0xe1, 0x77, 0xd3, + 0xdf, 0xce, 0x9f, 0xf1, 0x77, 0xf0, 0x77, 0xf2, 0x67, 0xfd, 0x5d, 0xfd, + 0xdd, 0xfd, 0xfd, 0xfc, 0x03, 0xfc, 0xa3, 0xfd, 0xb3, 0xfc, 0x73, 0xfc, + 0x55, 0xfe, 0xed, 0xfc, 0x35, 0xfe, 0x03, 0xfd, 0x07, 0xf9, 0x57, 0xf8, + 0x57, 0xfa, 0x57, 0xfb, 0xd7, 0xf8, 0xd7, 0xf9, 0x0f, 0xf3, 0x7f, 0xd5, + 0x9f, 0xf3, 0x9f, 0xe6, 0xff, 0xa6, 0xff, 0x5b, 0xfe, 0xb3, 0xfc, 0xb7, + 0xfa, 0x6f, 0xf3, 0xdf, 0xe1, 0xff, 0x91, 0xff, 0x6e, 0xff, 0x4f, 0xfc, + 0xf7, 0xfa, 0x1f, 0xf3, 0x3f, 0xe1, 0x7f, 0xdb, 0xff, 0xa1, 0xff, 0x23, + 0xff, 0xc7, 0xfe, 0x4f, 0x02, 0x7c, 0x02, 0xfc, 0x02, 0x02, 0x02, 0x14, + 0x01, 0xc1, 0x01, 0xa1, 0x01, 0xe1, 0x01, 0x09, 0x01, 0x59, 0x01, 0xfa, + 0x00, 0x63, 0x40, 0x7e, 0x40, 0x41, 0x40, 0x55, 0xc0, 0xd0, 0x80, 0xda, + 0x80, 0xfa, 0x80, 0xe1, 0x01, 0x0d, 0x01, 0xa3, 0x02, 0x26, 0x04, 0xcc, + 0x0c, 0x58, 0x1c, 0xb0, 0x34, 0x60, 0x45, 0xc0, 0x7b, 0x01, 0x9f, 0x05, + 0xec, 0x0f, 0x38, 0x18, 0x70, 0x38, 0xe0, 0x68, 0xc0, 0x89, 0x80, 0x53, + 0x01, 0x5f, 0x07, 0x5c, 0x0b, 0xf8, 0x26, 0xe0, 0x76, 0xc0, 0xcf, 0x01, + 0x4f, 0x03, 0xed, 0x02, 0xed, 0x03, 0x9d, 0x02, 0xd9, 0x40, 0x65, 0x60, + 0x7c, 0x60, 0x62, 0x60, 0x72, 0x60, 0x6a, 0x60, 0x46, 0x60, 0x56, 0xa0, + 0x2e, 0xb0, 0x38, 0xd0, 0x1c, 0x58, 0x1a, 0x58, 0x16, 0x58, 0x1e, 0x38, + 0x3e, 0x70, 0x62, 0xe0, 0xe4, 0xc0, 0xa9, 0x81, 0xd3, 0x03, 0xdf, 0x0a, + 0x9c, 0x15, 0xb8, 0x30, 0x70, 0x75, 0xe0, 0x87, 0x81, 0x3b, 0x02, 0x77, + 0x05, 0x7e, 0x1c, 0x78, 0x29, 0xf0, 0x72, 0xe0, 0x95, 0xc0, 0x6b, 0x81, + 0x37, 0x02, 0x6f, 0x05, 0x7e, 0x1b, 0x78, 0x37, 0xf0, 0xa9, 0xc2, 0x4e, + 0x61, 0xaf, 0x70, 0x52, 0xb0, 0x0a, 0xa5, 0x22, 0x5e, 0x91, 0xa8, 0x48, + 0x56, 0xa4, 0x2a, 0x32, 0x14, 0x59, 0x8a, 0x76, 0x8a, 0x4e, 0x8a, 0x3e, + 0x8a, 0x57, 0x14, 0x25, 0x0a, 0x8b, 0x62, 0xac, 0xe2, 0x0d, 0xc5, 0x04, + 0xc5, 0x24, 0xc5, 0x14, 0xc5, 0x74, 0xc5, 0x0c, 0xc5, 0x42, 0xc5, 0x12, + 0xc5, 0x72, 0xc5, 0x7b, 0x8a, 0x4f, 0x14, 0x47, 0x15, 0x27, 0x14, 0x5f, + 0x28, 0xce, 0x28, 0xee, 0x2b, 0x7e, 0x56, 0x3c, 0x52, 0x3c, 0x56, 0x3c, + 0x51, 0x3c, 0x55, 0x3c, 0x0b, 0x92, 0x05, 0xf9, 0x06, 0x45, 0x06, 0xc5, + 0x04, 0x29, 0x83, 0xe2, 0x83, 0x3a, 0x04, 0x75, 0x0c, 0xea, 0x1c, 0x54, + 0x1c, 0xd4, 0x35, 0xa8, 0x47, 0x50, 0xaf, 0xa0, 0x92, 0xa0, 0x61, 0x41, + 0xaf, 0x07, 0x8d, 0x0f, 0x9a, 0x14, 0x34, 0x25, 0x68, 0x75, 0xd0, 0xda, + 0xa0, 0xf5, 0x41, 0x1b, 0x83, 0x36, 0x07, 0x6d, 0x0d, 0xda, 0x16, 0xf4, + 0x59, 0xd0, 0x81, 0xa0, 0xc3, 0x41, 0xc7, 0x82, 0x6e, 0x04, 0xdd, 0x0b, + 0xfa, 0x39, 0xe8, 0x51, 0xd0, 0xe3, 0x60, 0xb7, 0x60, 0x8f, 0x60, 0xef, + 0x60, 0xdf, 0x60, 0xff, 0x60, 0x45, 0x70, 0x70, 0x70, 0x72, 0x70, 0xbb, + 0x60, 0x6d, 0xb0, 0x2e, 0xd8, 0x10, 0x3c, 0x20, 0x78, 0x60, 0xf0, 0xe0, + 0xe0, 0x21, 0xc1, 0x55, 0xc1, 0x35, 0xc1, 0x75, 0xc1, 0xa3, 0x83, 0xa7, + 0x07, 0x2f, 0x08, 0x5e, 0x14, 0xbc, 0x34, 0x78, 0x79, 0xf0, 0xde, 0xe0, + 0x7d, 0xc1, 0xfb, 0x83, 0x0f, 0x06, 0x1f, 0x0e, 0x3e, 0x16, 0x7c, 0x22, + 0xf8, 0x5c, 0xf0, 0xcd, 0xe0, 0x07, 0xc1, 0xbf, 0x04, 0x3f, 0x0e, 0x7e, + 0x12, 0xe2, 0x11, 0xe2, 0x15, 0xe2, 0x1b, 0xe2, 0x1f, 0x12, 0x18, 0x12, + 0x1c, 0x12, 0x1a, 0x92, 0x10, 0x92, 0x1c, 0x92, 0x16, 0x92, 0x19, 0x92, + 0x1f, 0xd2, 0x2b, 0x64, 0x60, 0xc8, 0xe0, 0x90, 0xca, 0x90, 0xea, 0x90, + 0x69, 0x21, 0x6f, 0x86, 0xbc, 0x15, 0x32, 0x2b, 0x64, 0x4e, 0xc8, 0xdc, + 0x90, 0xf9, 0x21, 0xbb, 0x42, 0xae, 0x85, 0xdc, 0x0d, 0xb9, 0x1f, 0xf2, + 0x30, 0xe4, 0x51, 0xa8, 0x4b, 0xa8, 0x5b, 0xa8, 0x47, 0xa8, 0x57, 0xa8, + 0x4f, 0xa8, 0x7f, 0x68, 0x60, 0x68, 0x72, 0x68, 0x71, 0xa8, 0x39, 0xb4, + 0x34, 0xb4, 0x2c, 0xb4, 0x3c, 0x74, 0x7c, 0xe8, 0xc4, 0xd0, 0xc9, 0xa1, + 0x53, 0x43, 0xa7, 0x87, 0xbe, 0x15, 0x3a, 0x2b, 0x74, 0x49, 0xe8, 0x67, + 0xa1, 0xa7, 0x42, 0xcf, 0x84, 0x7e, 0x19, 0x7a, 0x21, 0xf4, 0x51, 0xe8, + 0xe3, 0xd0, 0x27, 0xa1, 0x7f, 0x84, 0xfe, 0x19, 0x46, 0x85, 0x41, 0x98, + 0x7b, 0x58, 0x5a, 0x98, 0x36, 0x4c, 0x17, 0x66, 0x0c, 0xcb, 0x0f, 0x2b, + 0x0f, 0x1b, 0x1c, 0x56, 0x19, 0x56, 0x1d, 0x56, 0x13, 0x56, 0x1f, 0x36, + 0x3c, 0x6c, 0x52, 0xd8, 0xdc, 0xb0, 0x95, 0x61, 0xab, 0xc3, 0xd6, 0x85, + 0xad, 0x0f, 0x3b, 0x12, 0x76, 0x2c, 0xec, 0x64, 0xd8, 0x17, 0x61, 0x67, + 0xc2, 0xbe, 0x0c, 0xbb, 0x10, 0xf6, 0x4d, 0xd8, 0xa3, 0x70, 0x08, 0x97, + 0x84, 0xcb, 0xc3, 0xe9, 0xf0, 0x98, 0xf0, 0x36, 0xe1, 0x71, 0xe1, 0x09, + 0xe1, 0xc9, 0xe1, 0x69, 0xe1, 0x19, 0xe1, 0x85, 0xe1, 0x45, 0xe1, 0x65, + 0xe1, 0x75, 0xe1, 0xc3, 0xc3, 0x47, 0x86, 0x8f, 0x0e, 0x5f, 0x18, 0xbe, + 0x24, 0x7c, 0x59, 0xf8, 0x8a, 0xf0, 0x55, 0xe1, 0x6b, 0xc3, 0xdf, 0x0f, + 0xff, 0x38, 0x7c, 0x6f, 0xf8, 0x67, 0xe1, 0x07, 0xc2, 0x0f, 0x87, 0xdf, + 0x08, 0xbf, 0x19, 0xfe, 0x53, 0xf8, 0x1f, 0xe1, 0xcf, 0x22, 0x50, 0x84, + 0x28, 0x22, 0x34, 0x22, 0x22, 0x22, 0x2a, 0x22, 0x26, 0x42, 0x19, 0x91, + 0x10, 0x91, 0x14, 0xa1, 0x8e, 0xd0, 0x44, 0xe4, 0x45, 0x18, 0x22, 0x8a, + 0x23, 0xba, 0x46, 0x98, 0x23, 0x2a, 0x23, 0x86, 0x46, 0xd4, 0x45, 0x0c, + 0x8b, 0x78, 0x27, 0x62, 0x7e, 0xc4, 0xbb, 0x11, 0x8b, 0x22, 0x96, 0x46, + 0xac, 0x88, 0x78, 0x2f, 0x62, 0x7d, 0xc4, 0xc6, 0x88, 0xdd, 0x11, 0x87, + 0x23, 0x8e, 0x45, 0x9c, 0x8c, 0xf8, 0x22, 0xe2, 0xa7, 0x88, 0xfb, 0x11, + 0x0f, 0x23, 0x1e, 0x45, 0x3c, 0x8e, 0xf8, 0x3d, 0xe2, 0x69, 0xa4, 0x38, + 0xd2, 0x23, 0x32, 0x24, 0x32, 0x3c, 0x32, 0x2a, 0x32, 0x26, 0x32, 0x3f, + 0xb2, 0x63, 0x64, 0x61, 0x64, 0x51, 0x64, 0xd7, 0xc8, 0x1e, 0x91, 0xbd, + 0x22, 0xcb, 0x22, 0xcb, 0x23, 0xeb, 0x23, 0xc7, 0x46, 0x8e, 0x8b, 0x9c, + 0x18, 0x39, 0x39, 0x72, 0x55, 0xe4, 0x9a, 0xc8, 0xf7, 0x23, 0x37, 0x44, + 0x6e, 0x8a, 0xdc, 0x12, 0xf9, 0x61, 0xe4, 0xde, 0xc8, 0xe3, 0x91, 0x97, + 0x22, 0xbf, 0x8e, 0xbc, 0x16, 0x79, 0x23, 0x4a, 0x14, 0x25, 0x8d, 0x62, + 0xa2, 0x1c, 0xa2, 0x9c, 0xa2, 0xd8, 0x28, 0xb7, 0x28, 0x8f, 0xa8, 0xa0, + 0xa8, 0xd8, 0xa8, 0x8c, 0xa8, 0xec, 0x28, 0x55, 0x54, 0xbb, 0xa8, 0xfe, + 0x51, 0x96, 0xa8, 0xb2, 0xa8, 0xf2, 0xa8, 0xc1, 0x51, 0x95, 0x51, 0xd5, + 0x51, 0xa3, 0xa3, 0x26, 0x46, 0xcd, 0x89, 0x9a, 0x1b, 0xb5, 0x20, 0x6a, + 0x61, 0xd4, 0x47, 0x51, 0xbb, 0xa3, 0xf6, 0x44, 0x7d, 0x1a, 0xf5, 0x59, + 0xd4, 0x81, 0xa8, 0x43, 0x51, 0xe7, 0xa2, 0x2e, 0x44, 0x7d, 0x15, 0x75, + 0x25, 0xea, 0xdb, 0x68, 0x3a, 0xda, 0x33, 0xda, 0x27, 0xda, 0x3f, 0x3a, + 0x30, 0x3a, 0x3b, 0xba, 0x6d, 0x74, 0xbb, 0x68, 0x4d, 0x74, 0xfb, 0x68, + 0x7d, 0xb4, 0x31, 0xba, 0x47, 0x34, 0x17, 0x3d, 0x2d, 0x7a, 0x46, 0xf4, + 0xac, 0xe8, 0x39, 0xd1, 0x1f, 0x44, 0x6f, 0x8d, 0xde, 0x1e, 0xbd, 0x33, + 0x7a, 0x57, 0xf4, 0x27, 0xd1, 0x7b, 0xa3, 0x4f, 0x46, 0xff, 0x1a, 0x23, + 0x8a, 0x91, 0xc6, 0xd8, 0xc5, 0x30, 0x31, 0x91, 0x31, 0xd1, 0x31, 0x6d, + 0x62, 0xe2, 0x62, 0x12, 0x62, 0x92, 0x63, 0x52, 0x63, 0x7a, 0xc4, 0x0c, + 0x88, 0x29, 0x8f, 0xa9, 0x88, 0xa9, 0x8c, 0x99, 0x12, 0x33, 0x2d, 0x66, + 0x46, 0xcc, 0xcc, 0x98, 0xd9, 0x31, 0xef, 0xc4, 0xcc, 0x8b, 0xd9, 0x1b, + 0x73, 0x3c, 0xe6, 0x54, 0xcc, 0x99, 0x98, 0x73, 0x31, 0x3f, 0xc7, 0xfc, + 0x12, 0xf3, 0x38, 0xe6, 0x49, 0xcc, 0x1f, 0x31, 0xcf, 0x62, 0xa9, 0xd8, + 0x88, 0xd8, 0xe4, 0xd8, 0xb4, 0xd8, 0x8c, 0xd8, 0xac, 0xd8, 0x57, 0x62, + 0xfb, 0xc7, 0x96, 0xc6, 0x0e, 0x88, 0x1d, 0x18, 0x3b, 0x28, 0x76, 0x48, + 0x6c, 0x55, 0xec, 0xec, 0xd8, 0x85, 0xb1, 0xef, 0xc7, 0x6e, 0x89, 0xdd, + 0x15, 0xfb, 0x79, 0x9b, 0x7b, 0x6d, 0x1e, 0xb4, 0xf9, 0xa5, 0xcd, 0xe3, + 0x36, 0x4f, 0xda, 0x3c, 0x6d, 0xf3, 0x4c, 0x49, 0x29, 0x41, 0x29, 0x51, + 0xca, 0x94, 0x76, 0x4a, 0x46, 0xe9, 0xa0, 0x74, 0x52, 0xba, 0x28, 0xdd, + 0x95, 0x5e, 0x4a, 0x5f, 0x65, 0x80, 0x32, 0x48, 0x19, 0xaa, 0x0c, 0x57, + 0x46, 0x29, 0x63, 0x94, 0x6d, 0x94, 0x71, 0xca, 0x04, 0x65, 0xb2, 0x32, + 0x55, 0x99, 0xae, 0xcc, 0x54, 0xe6, 0x28, 0x55, 0xca, 0x5c, 0xa5, 0x56, + 0x99, 0xa7, 0xd4, 0x2b, 0x8d, 0xca, 0x7c, 0x65, 0x81, 0xb2, 0x50, 0x59, + 0xac, 0xec, 0xaa, 0xec, 0xae, 0xec, 0xa9, 0xec, 0xad, 0xec, 0xab, 0x34, + 0x2b, 0x4b, 0x95, 0x65, 0xca, 0x72, 0xe5, 0x60, 0xe5, 0x10, 0x65, 0xb5, + 0xb2, 0x46, 0x59, 0xa7, 0x1c, 0xa6, 0x1c, 0xa1, 0x1c, 0xa5, 0x7c, 0x55, + 0x89, 0x95, 0x6f, 0x28, 0x27, 0x28, 0x27, 0x2b, 0xa7, 0x29, 0x67, 0x28, + 0x67, 0x29, 0xdf, 0x56, 0xce, 0x53, 0x2e, 0x50, 0x2e, 0x54, 0x2e, 0x56, + 0x2e, 0x55, 0x2e, 0x57, 0xbe, 0xa7, 0x5c, 0xad, 0x5c, 0xab, 0x7c, 0x5f, + 0xb9, 0x41, 0xb9, 0x59, 0xb9, 0x45, 0xb9, 0x4d, 0xb9, 0x53, 0xb9, 0x4b, + 0xf9, 0xb1, 0x72, 0x8f, 0x72, 0x9f, 0x72, 0xbf, 0xf2, 0x90, 0xf2, 0x88, + 0xf2, 0x98, 0xf2, 0x84, 0xf2, 0x94, 0xf2, 0xb4, 0xf2, 0x9c, 0xf2, 0xbc, + 0xf2, 0xa2, 0xf2, 0xb2, 0xf2, 0xaa, 0xf2, 0x86, 0xf2, 0x96, 0xf2, 0x3b, + 0xe5, 0x8f, 0xca, 0x9f, 0x94, 0x0f, 0x94, 0xbf, 0x28, 0x1f, 0x2b, 0x7f, + 0x57, 0xfe, 0x19, 0x47, 0xc5, 0x41, 0x9c, 0x38, 0x4e, 0x16, 0x47, 0xc7, + 0x39, 0xc4, 0x39, 0xc7, 0xb9, 0xc6, 0xb9, 0xc7, 0x79, 0xc5, 0xf9, 0xc4, + 0xf9, 0xc5, 0x05, 0xc6, 0x05, 0xc7, 0x85, 0xc5, 0x45, 0xc6, 0xc5, 0xc4, + 0x29, 0xe3, 0x12, 0xe2, 0x92, 0xe3, 0xd2, 0xe2, 0x32, 0xe3, 0x72, 0xe2, + 0xd4, 0x71, 0x9a, 0xb8, 0xbc, 0x38, 0x43, 0x5c, 0x7e, 0x5c, 0xc7, 0xb8, + 0xce, 0x71, 0x5d, 0xe2, 0xba, 0xc7, 0xf5, 0x8a, 0xeb, 0x1b, 0x67, 0x8e, + 0x2b, 0x8d, 0x2b, 0x8b, 0x2b, 0x8f, 0x1b, 0x1c, 0x57, 0x19, 0xf7, 0x5a, + 0xdc, 0xd8, 0xb8, 0x71, 0x71, 0x13, 0xe3, 0xa6, 0xc4, 0xcd, 0x89, 0x5b, + 0x14, 0xb7, 0x3e, 0x6e, 0x53, 0xdc, 0x96, 0xb8, 0x6d, 0x71, 0x3b, 0xe3, + 0x76, 0xc7, 0xed, 0x89, 0xdb, 0x17, 0xb7, 0x3f, 0xee, 0xe7, 0xb8, 0x3f, + 0xe2, 0x25, 0xf1, 0x8e, 0xf1, 0x6c, 0xbc, 0x6b, 0xbc, 0x7b, 0xbc, 0x67, + 0xbc, 0x77, 0xbc, 0x6f, 0x7c, 0x40, 0x7c, 0x50, 0x7c, 0x48, 0x7c, 0x5a, + 0x7c, 0x5e, 0x7c, 0xc7, 0xf8, 0x01, 0xf1, 0x03, 0xe3, 0x07, 0xc7, 0x57, + 0xc6, 0x0f, 0x8d, 0xaf, 0x8b, 0x1f, 0x1e, 0xdf, 0x10, 0x3f, 0x2a, 0x7e, + 0x4c, 0x3c, 0x17, 0x3f, 0x36, 0x7e, 0x5c, 0xfc, 0x86, 0xf8, 0xdd, 0xf1, + 0x87, 0xe3, 0x8f, 0xc6, 0x1f, 0x8f, 0x3f, 0x11, 0x7f, 0x2a, 0xfe, 0x74, + 0xfc, 0x99, 0xf8, 0x73, 0xf1, 0xe7, 0xe3, 0x7f, 0x8b, 0xff, 0x3d, 0xfe, + 0x69, 0xfc, 0xb3, 0x04, 0x94, 0x20, 0x4e, 0x90, 0x26, 0x04, 0x26, 0x04, + 0x25, 0x18, 0x13, 0xf2, 0x13, 0x0a, 0x12, 0x3a, 0x26, 0x14, 0x26, 0x14, + 0x25, 0x14, 0x27, 0x74, 0x4d, 0xe8, 0x9e, 0x30, 0x2e, 0x61, 0x42, 0xc2, + 0xa4, 0x84, 0x29, 0x09, 0xd3, 0x12, 0x66, 0x24, 0xcc, 0x4a, 0x78, 0x3b, + 0x61, 0x5e, 0xc2, 0x82, 0x84, 0x15, 0x09, 0x1f, 0x26, 0xec, 0x48, 0xd8, + 0x95, 0xf0, 0x49, 0xc2, 0xa7, 0x09, 0x47, 0x12, 0x8e, 0x26, 0x9c, 0x48, + 0xb8, 0x96, 0xf0, 0x7d, 0xc2, 0xfd, 0x84, 0x47, 0x89, 0x01, 0x89, 0x8a, + 0xc4, 0xe0, 0xc4, 0x90, 0xc4, 0xb0, 0xc4, 0x88, 0xc4, 0xc8, 0xc4, 0xe8, + 0xc4, 0xd8, 0xc4, 0x2e, 0x89, 0xdd, 0x12, 0x7b, 0x24, 0xf6, 0x4c, 0xec, + 0x9d, 0xd8, 0x37, 0xb1, 0x5f, 0xa2, 0x39, 0xb1, 0x24, 0xb1, 0x3a, 0x71, + 0x61, 0xe2, 0x92, 0xc4, 0x65, 0x89, 0x2b, 0x12, 0xdf, 0x4b, 0x5c, 0x9d, + 0xb8, 0x36, 0x71, 0x7d, 0xe2, 0xa6, 0xc4, 0x0f, 0x12, 0xb7, 0x27, 0xee, + 0x4d, 0x3c, 0x97, 0x78, 0x3e, 0xf1, 0x62, 0xe2, 0xe5, 0xc4, 0xab, 0x89, + 0xd7, 0x13, 0xbf, 0x49, 0xbc, 0x95, 0xf8, 0x5d, 0xe2, 0x0f, 0x89, 0x77, + 0x12, 0xef, 0x25, 0xf9, 0x25, 0x05, 0x24, 0x29, 0x92, 0x82, 0x93, 0x42, + 0x93, 0xc2, 0x93, 0x22, 0x93, 0x62, 0x92, 0x94, 0x49, 0xf1, 0x49, 0xd9, + 0x49, 0xed, 0x93, 0xf4, 0x49, 0xc6, 0xa4, 0x0e, 0x49, 0x03, 0x92, 0xde, + 0x4c, 0x7a, 0x2b, 0x69, 0x56, 0xd2, 0xec, 0xa4, 0xb7, 0x93, 0xe6, 0x26, + 0xcd, 0x4b, 0x5a, 0x90, 0xb4, 0x30, 0xe9, 0x40, 0xd2, 0xa1, 0xa4, 0x23, + 0x49, 0x47, 0x93, 0x8e, 0x27, 0x9d, 0x4c, 0x3a, 0x95, 0x74, 0x3a, 0xe9, + 0x6c, 0x32, 0x4a, 0x16, 0x27, 0x4b, 0x93, 0xe5, 0xc9, 0x74, 0xb2, 0x7d, + 0xb2, 0x63, 0x32, 0x9b, 0xec, 0x96, 0xec, 0x91, 0xec, 0x9b, 0x1c, 0x9a, + 0xdc, 0x3e, 0x59, 0x97, 0x6c, 0x48, 0xce, 0x4f, 0x2e, 0x48, 0xee, 0x94, + 0xdc, 0x39, 0xb9, 0x4b, 0x72, 0xb7, 0xe4, 0x1e, 0xc9, 0xbd, 0x93, 0xfb, + 0x25, 0xf7, 0x4f, 0xb6, 0x24, 0x0f, 0x4c, 0x1e, 0x9c, 0x5c, 0x99, 0xfc, + 0x4e, 0xf2, 0xbc, 0xe4, 0x05, 0xc9, 0xef, 0x26, 0x2f, 0x4a, 0x5e, 0x92, + 0xbc, 0x34, 0x79, 0x79, 0xf2, 0xca, 0xe4, 0x13, 0xc9, 0xa7, 0x92, 0x4f, + 0x27, 0x9f, 0x49, 0x3e, 0x97, 0x7c, 0x3e, 0xf9, 0x42, 0xf2, 0xa5, 0xe4, + 0xcb, 0x29, 0x76, 0x29, 0x4c, 0x8a, 0x43, 0x8a, 0x53, 0x0a, 0x9b, 0xe2, + 0x9a, 0xe2, 0x9e, 0xe2, 0x95, 0xe2, 0x9b, 0xe2, 0x9f, 0x12, 0x9c, 0x12, + 0x93, 0x92, 0x9e, 0x92, 0x99, 0x92, 0x93, 0xa2, 0x4a, 0x69, 0x97, 0xa2, + 0x49, 0x69, 0x9f, 0xa2, 0x4f, 0xa9, 0x4f, 0x19, 0x9e, 0xd2, 0x90, 0x32, + 0x2a, 0x65, 0x4c, 0xca, 0x6b, 0x29, 0x38, 0xe5, 0x8d, 0x94, 0x09, 0x29, + 0x93, 0x52, 0x96, 0xa4, 0xac, 0x49, 0xd9, 0x96, 0xb2, 0x23, 0xe5, 0xa3, + 0x94, 0x8f, 0x53, 0xf6, 0xa4, 0x7c, 0x9a, 0xf2, 0x79, 0xca, 0xc1, 0x94, + 0x3b, 0x29, 0x3f, 0xa5, 0xdc, 0x4f, 0xf9, 0x39, 0xe5, 0x61, 0xca, 0xa3, + 0x94, 0x5f, 0x53, 0x7e, 0x4b, 0xf9, 0x3d, 0x35, 0x22, 0x35, 0x2a, 0x35, + 0x26, 0xb5, 0x4d, 0x6a, 0x5c, 0x6a, 0x42, 0x6a, 0x52, 0x6a, 0x6a, 0x6a, + 0x46, 0x6a, 0x56, 0xaa, 0x21, 0xb5, 0x73, 0xaa, 0x39, 0xb5, 0x34, 0xb5, + 0x2c, 0xb5, 0x3c, 0x75, 0x70, 0x6a, 0x65, 0x6a, 0x75, 0x6a, 0x6d, 0xea, + 0xb0, 0xd4, 0x05, 0xa9, 0x0b, 0x53, 0x17, 0xa7, 0x2e, 0x4d, 0x5d, 0x96, + 0xba, 0x22, 0x75, 0x65, 0xea, 0xaa, 0xd4, 0x35, 0xa9, 0xa7, 0x53, 0xcf, + 0xa6, 0x7e, 0x99, 0x7a, 0x21, 0xf5, 0x52, 0xea, 0xd7, 0xa9, 0xd7, 0x52, + 0xbf, 0x49, 0xbd, 0x9d, 0xfa, 0x5d, 0xea, 0xef, 0x69, 0xa2, 0x34, 0x3a, + 0xcd, 0x21, 0xcd, 0x39, 0xcd, 0x35, 0xcd, 0x23, 0x4d, 0x93, 0xd6, 0x3e, + 0x4d, 0x97, 0x66, 0x48, 0x33, 0xa5, 0x75, 0x48, 0xeb, 0x98, 0xd6, 0x39, + 0xad, 0x4b, 0x5a, 0xb7, 0xb4, 0xbe, 0x69, 0x65, 0x69, 0x15, 0x69, 0x95, + 0x69, 0xd5, 0x69, 0xb5, 0x69, 0xef, 0xa6, 0x2d, 0x4e, 0x5b, 0x9a, 0xb6, + 0x3c, 0x6d, 0x65, 0xda, 0xea, 0xb4, 0x75, 0x69, 0x1b, 0xd2, 0x36, 0xa7, + 0x6d, 0x49, 0xfb, 0x28, 0xed, 0x60, 0xda, 0x91, 0xb4, 0xe3, 0x69, 0xa7, + 0xd2, 0x2e, 0xa6, 0x5d, 0x49, 0xbb, 0x9e, 0x76, 0x33, 0xed, 0xdb, 0x74, + 0xe7, 0x74, 0xd7, 0x74, 0xf7, 0x74, 0xcf, 0x74, 0xef, 0x74, 0xdf, 0x74, + 0xff, 0x74, 0x45, 0x7a, 0x48, 0x7a, 0x58, 0x7a, 0x74, 0x7a, 0x52, 0x7a, + 0xd7, 0xf4, 0xee, 0xe9, 0x3d, 0xd3, 0x7b, 0xa7, 0xf7, 0x4d, 0x37, 0xa7, + 0x97, 0xa4, 0x5b, 0xd2, 0x07, 0xa6, 0x0f, 0x4e, 0xaf, 0x4c, 0x1f, 0x9a, + 0x5e, 0x97, 0x3e, 0x2c, 0xbd, 0x21, 0x7d, 0x54, 0xfa, 0x98, 0x74, 0x2e, + 0x7d, 0x65, 0xfa, 0xaa, 0xf4, 0x35, 0xe9, 0xeb, 0xd2, 0xdf, 0x4f, 0xdf, + 0x90, 0xbe, 0x31, 0x7d, 0x73, 0xfa, 0x96, 0xf4, 0x0b, 0xe9, 0x97, 0xd2, + 0x2f, 0xa7, 0x5f, 0x49, 0xbf, 0x9a, 0x7e, 0x3d, 0xfd, 0x46, 0xfa, 0xcd, + 0xf4, 0xdb, 0x19, 0x4e, 0x19, 0x6c, 0x86, 0x6b, 0x86, 0x7b, 0x86, 0x67, + 0x86, 0x4f, 0x86, 0x7f, 0x86, 0x22, 0x23, 0x24, 0x23, 0x2c, 0x23, 0x3a, + 0x23, 0x29, 0x23, 0x3b, 0x43, 0x95, 0x91, 0x9b, 0xd1, 0x3e, 0x43, 0x9f, + 0x61, 0xca, 0xa8, 0xcb, 0x18, 0x96, 0x31, 0x22, 0x63, 0x64, 0xc6, 0xe8, + 0x8c, 0xd7, 0x32, 0xc6, 0x66, 0x8c, 0xcb, 0x98, 0x98, 0x31, 0x39, 0x63, + 0x76, 0xc6, 0xc2, 0x8c, 0x15, 0x19, 0xab, 0x32, 0xd6, 0x66, 0xac, 0xcf, + 0xd8, 0x94, 0x71, 0x31, 0xe3, 0xab, 0x8c, 0xaf, 0x33, 0xae, 0x66, 0x5c, + 0xcf, 0xf8, 0x26, 0xe3, 0x56, 0xc6, 0x77, 0x19, 0x3f, 0x66, 0xdc, 0xcd, + 0xf8, 0x35, 0xe3, 0x79, 0x26, 0x9d, 0x69, 0x9f, 0xe9, 0x94, 0xe9, 0x92, + 0xe9, 0x9e, 0xe9, 0x95, 0xe9, 0x9b, 0xa9, 0xce, 0xcc, 0xcd, 0xd4, 0x66, + 0xe6, 0x65, 0xea, 0x32, 0x0d, 0x99, 0xc6, 0xcc, 0xfc, 0xcc, 0x82, 0xcc, + 0xda, 0xcc, 0xfa, 0xcc, 0xe1, 0x99, 0x0d, 0x99, 0x23, 0x33, 0x47, 0x67, + 0x8e, 0xc9, 0x7c, 0x2d, 0x13, 0x67, 0x4e, 0xcb, 0xdc, 0x96, 0xb9, 0x33, + 0x73, 0x57, 0xe6, 0xc7, 0x99, 0x7b, 0x32, 0xf7, 0x65, 0xee, 0xcf, 0x3c, + 0x94, 0x79, 0x34, 0xf3, 0x78, 0xe6, 0xe9, 0xcc, 0xaf, 0x32, 0xef, 0x67, + 0x3e, 0xcc, 0xfc, 0x35, 0xf3, 0x49, 0xe6, 0xd3, 0xcc, 0xe7, 0x59, 0x90, + 0x25, 0xc9, 0x92, 0x67, 0x31, 0x59, 0x8e, 0x59, 0x6c, 0x56, 0x6a, 0x56, + 0x46, 0x56, 0x56, 0x56, 0x4e, 0x56, 0xdb, 0x2c, 0x75, 0x56, 0xbb, 0x2c, + 0x4d, 0x56, 0xfb, 0xac, 0xca, 0xac, 0xa1, 0x59, 0xb5, 0x59, 0xf5, 0x59, + 0xc3, 0xb3, 0x46, 0x66, 0x8d, 0xc9, 0xe2, 0xb2, 0x5e, 0xcf, 0x1a, 0x97, + 0x35, 0x2f, 0x6b, 0x59, 0xd6, 0x87, 0x59, 0x3b, 0xb2, 0x76, 0x65, 0x7d, + 0x92, 0xf5, 0x69, 0xd6, 0xe7, 0x59, 0x07, 0xb3, 0x8e, 0x64, 0x1d, 0xcf, + 0x3a, 0x95, 0x75, 0x26, 0xeb, 0x97, 0xac, 0xc7, 0x59, 0x4f, 0xb2, 0xfe, + 0xc8, 0xfa, 0x33, 0xeb, 0x59, 0x36, 0xca, 0x16, 0x65, 0x3b, 0x64, 0x27, + 0x66, 0xa7, 0x64, 0xa7, 0x65, 0x67, 0x64, 0x67, 0x66, 0x67, 0x67, 0xe7, + 0x64, 0xab, 0xb2, 0xdb, 0x65, 0xf7, 0xcf, 0xb6, 0x64, 0x97, 0x65, 0x97, + 0x67, 0x0f, 0xce, 0xae, 0xc8, 0xae, 0xca, 0x1e, 0x9a, 0x3d, 0x2a, 0x7b, + 0x49, 0xf6, 0xf2, 0xec, 0x95, 0xd9, 0xab, 0xb2, 0x57, 0x67, 0xaf, 0xcd, + 0x5e, 0x97, 0xbd, 0x3e, 0x7b, 0x63, 0xf6, 0xe5, 0xec, 0xab, 0xd9, 0xd7, + 0xb3, 0xbf, 0xc9, 0xbe, 0x95, 0xfd, 0x6d, 0xf6, 0xf7, 0xd9, 0x77, 0xb2, + 0xef, 0x65, 0x3f, 0xc8, 0xfe, 0x35, 0xfb, 0x79, 0x8e, 0x38, 0x47, 0x9a, + 0x23, 0xcf, 0x61, 0x72, 0xd2, 0x73, 0xb2, 0x72, 0x72, 0x72, 0x54, 0x39, + 0xed, 0x72, 0x34, 0x39, 0xed, 0x73, 0xf4, 0x39, 0xa6, 0x9c, 0x0e, 0x39, + 0xc5, 0x39, 0x7d, 0x72, 0x06, 0xe4, 0x0c, 0xcc, 0x19, 0x94, 0x33, 0x24, + 0xa7, 0x2a, 0xa7, 0x26, 0x67, 0x41, 0xce, 0xc2, 0x9c, 0xc5, 0x39, 0x4b, + 0x72, 0x96, 0xe5, 0xac, 0xc8, 0x59, 0x99, 0xb3, 0x2a, 0x67, 0x4d, 0xce, + 0x8e, 0x9c, 0xeb, 0x39, 0x37, 0x73, 0x6e, 0xe7, 0x7c, 0x97, 0xf3, 0x43, + 0xce, 0xdd, 0x9c, 0xfb, 0x39, 0x0f, 0x73, 0x7e, 0xcd, 0xf9, 0x2d, 0xe7, + 0xcf, 0xb6, 0xd2, 0xb6, 0x76, 0x6d, 0xed, 0xdb, 0x3a, 0xb5, 0xf5, 0x6d, + 0x1b, 0xd1, 0x36, 0xbe, 0x6d, 0x4a, 0xdb, 0xb6, 0xaa, 0x72, 0xd5, 0x60, + 0xd5, 0x10, 0x55, 0xb5, 0xaa, 0x56, 0x55, 0xaf, 0x1a, 0xae, 0x6a, 0x50, + 0x8d, 0x52, 0xbd, 0xaa, 0xc2, 0xaa, 0xd7, 0x55, 0xe3, 0x54, 0x13, 0x54, + 0x93, 0x54, 0x53, 0x54, 0xd3, 0x54, 0x6f, 0xaa, 0xde, 0x52, 0xcd, 0x52, + 0xbd, 0xad, 0x9a, 0xab, 0x9a, 0xaf, 0x5a, 0xa8, 0x5a, 0xa2, 0x5a, 0xa6, + 0x5a, 0xa1, 0x7a, 0x4f, 0xb5, 0x5a, 0xb5, 0x56, 0xf5, 0xbe, 0x6a, 0x83, + 0x6a, 0x93, 0xea, 0x03, 0xd5, 0x56, 0xd5, 0x76, 0xd5, 0x4e, 0xd5, 0x2e, + 0xd5, 0xc7, 0xaa, 0x3d, 0xaa, 0x4f, 0x55, 0x9f, 0xa9, 0xf6, 0xab, 0x0e, + 0xa9, 0x8e, 0xa8, 0x8e, 0xa9, 0x4e, 0xa8, 0x4e, 0xa9, 0x4e, 0xab, 0xce, + 0xaa, 0xbe, 0x54, 0x5d, 0x54, 0x7d, 0xa5, 0xfa, 0x5a, 0x75, 0x55, 0x75, + 0x43, 0x75, 0x53, 0x75, 0x5b, 0xf5, 0x9d, 0xea, 0x07, 0xd5, 0x1d, 0xd5, + 0x4f, 0xaa, 0xfb, 0xaa, 0x9f, 0x55, 0x8f, 0x54, 0xbf, 0xa9, 0xfe, 0x50, + 0x3d, 0x53, 0x53, 0x6a, 0x91, 0x5a, 0xaa, 0x96, 0xab, 0x69, 0xb5, 0xbd, + 0xda, 0x51, 0xed, 0xac, 0x76, 0x55, 0xbb, 0xab, 0x3d, 0xd5, 0xde, 0x6a, + 0x5f, 0xb5, 0xbf, 0x3a, 0x50, 0x1d, 0xac, 0x0e, 0x53, 0x47, 0xa8, 0xa3, + 0xd4, 0xb1, 0xea, 0x38, 0x75, 0xa2, 0x3a, 0x45, 0x9d, 0xa6, 0xce, 0x50, + 0x67, 0xa9, 0x73, 0xd4, 0x2a, 0x75, 0x3b, 0xb5, 0x46, 0xdd, 0x5e, 0xad, + 0x53, 0x1b, 0xd5, 0x1d, 0xd4, 0x9d, 0xd4, 0x45, 0xea, 0xae, 0xea, 0xee, + 0xea, 0x5e, 0xea, 0xbe, 0x6a, 0xb3, 0xba, 0x54, 0x3d, 0x40, 0x5d, 0xae, + 0x1e, 0xac, 0x1e, 0xa2, 0xae, 0x52, 0x0f, 0x55, 0xd7, 0xaa, 0xeb, 0xd5, + 0xc3, 0xd5, 0x0d, 0xea, 0x51, 0xea, 0x31, 0x6a, 0x4e, 0xfd, 0xba, 0x7a, + 0xbc, 0x7a, 0x92, 0x7a, 0xaa, 0xfa, 0x4d, 0xf5, 0x4c, 0xf5, 0x1c, 0xf5, + 0x5c, 0xf5, 0x02, 0xf5, 0x22, 0xf5, 0x52, 0xf5, 0x0a, 0xf5, 0x2a, 0xf5, + 0x5a, 0xf5, 0x7a, 0xf5, 0x26, 0xf5, 0x16, 0xf5, 0x36, 0xf5, 0x4e, 0xf5, + 0x6e, 0xf5, 0x1e, 0xf5, 0x3e, 0xf5, 0x7e, 0xf5, 0x21, 0xf5, 0x11, 0xf5, + 0x31, 0xf5, 0x49, 0xf5, 0x85, 0xdc, 0xf5, 0xb9, 0x1b, 0x73, 0x37, 0xe7, + 0x6e, 0xcd, 0xdd, 0x9e, 0xbb, 0x33, 0x77, 0x77, 0xee, 0x27, 0xb9, 0x7b, + 0x73, 0xf7, 0xe5, 0xee, 0xcf, 0x3d, 0x98, 0x7b, 0x38, 0xf7, 0x68, 0xee, + 0xf1, 0xdc, 0x93, 0xb9, 0xa7, 0x73, 0xcf, 0xe5, 0x5e, 0xc8, 0xfd, 0x2a, + 0xf7, 0x4a, 0xee, 0xf5, 0xdc, 0x9b, 0xb9, 0xb7, 0x73, 0xbf, 0xcf, 0xfd, + 0x31, 0xf7, 0x6e, 0xee, 0xbd, 0xdc, 0x07, 0xb9, 0xbf, 0xe4, 0xfe, 0x9a, + 0xfb, 0x5b, 0xee, 0xef, 0xb9, 0x7f, 0xe6, 0x3e, 0xd7, 0x80, 0x46, 0xac, + 0x91, 0x6a, 0xe4, 0x1a, 0x5a, 0x63, 0xaf, 0x71, 0xd4, 0xb0, 0x1a, 0x37, + 0x8d, 0x87, 0xc6, 0x4b, 0xe3, 0xa3, 0xf1, 0xd3, 0x04, 0x68, 0x82, 0x34, + 0xa1, 0x9a, 0x08, 0x4d, 0x94, 0x26, 0x46, 0xd3, 0x46, 0x13, 0xaf, 0x49, + 0xd4, 0x24, 0x6b, 0x52, 0x35, 0xe9, 0x9a, 0x2c, 0x4d, 0x5b, 0x4d, 0x3b, + 0x8d, 0x56, 0xa3, 0xd3, 0x18, 0x35, 0x1d, 0x34, 0x9d, 0x34, 0x45, 0x9a, + 0xae, 0x9a, 0x1e, 0x9a, 0x5e, 0x9a, 0x3e, 0x9a, 0x7e, 0x1a, 0xb3, 0xa6, + 0x44, 0x33, 0x40, 0x33, 0x50, 0x33, 0x48, 0x53, 0xa1, 0xa9, 0xd4, 0x0c, + 0xd5, 0xd4, 0x6a, 0x86, 0x69, 0x1a, 0x34, 0xa3, 0x34, 0x63, 0x34, 0xaf, + 0x69, 0xc6, 0x6a, 0xc6, 0x69, 0x26, 0x6a, 0x26, 0x6b, 0xa6, 0x6a, 0xa6, + 0x6b, 0x66, 0x68, 0x66, 0x6a, 0xe6, 0x68, 0xde, 0xd1, 0xcc, 0xd3, 0xbc, + 0xab, 0x59, 0xac, 0x59, 0xa6, 0x59, 0xa9, 0x59, 0xad, 0x59, 0xa7, 0xd9, + 0xa0, 0xd9, 0xac, 0xd9, 0xaa, 0xd9, 0xae, 0xf9, 0x48, 0xf3, 0xb1, 0x66, + 0xaf, 0x66, 0x9f, 0xe6, 0x73, 0xcd, 0x41, 0xcd, 0x11, 0xcd, 0x71, 0xcd, + 0x29, 0xcd, 0x19, 0xcd, 0x39, 0xcd, 0x05, 0xcd, 0x25, 0xcd, 0x65, 0xcd, + 0x55, 0xcd, 0x0d, 0xcd, 0x2d, 0xcd, 0x77, 0x9a, 0x1f, 0x35, 0x3f, 0x69, + 0x1e, 0x68, 0x7e, 0xd1, 0x3c, 0xd6, 0xfc, 0xae, 0xf9, 0x53, 0x4b, 0x69, + 0x45, 0x5a, 0xa9, 0xd6, 0x4e, 0x6b, 0xaf, 0x75, 0xd2, 0xba, 0x68, 0xdd, + 0xb5, 0x5e, 0x5a, 0x5f, 0x6d, 0x80, 0x36, 0x48, 0x1b, 0xaa, 0x8d, 0xd0, + 0x46, 0x69, 0x63, 0xb4, 0x6d, 0xb4, 0x71, 0xda, 0x04, 0x6d, 0x92, 0x36, + 0x45, 0x9b, 0xa6, 0xcd, 0xd0, 0x66, 0x69, 0x73, 0xb4, 0x2a, 0x6d, 0x3b, + 0xad, 0x46, 0xdb, 0x5e, 0xab, 0xd3, 0x1a, 0xb4, 0x26, 0x6d, 0x07, 0x6d, + 0x47, 0x6d, 0xa1, 0xb6, 0x48, 0xdb, 0x45, 0xdb, 0x4d, 0xdb, 0x43, 0xdb, + 0x4b, 0xdb, 0x47, 0xdb, 0x4f, 0x6b, 0xd6, 0x96, 0x68, 0x2d, 0xda, 0x32, + 0x6d, 0xb9, 0x76, 0xb0, 0x76, 0x88, 0xb6, 0x4a, 0x3b, 0x54, 0x5b, 0xab, + 0xad, 0xd7, 0x0e, 0xd7, 0x36, 0x68, 0x47, 0x69, 0xc7, 0x68, 0x5f, 0xd3, + 0x62, 0xed, 0xeb, 0xda, 0x71, 0xda, 0x09, 0xda, 0x49, 0xda, 0x29, 0xda, + 0x69, 0xda, 0x37, 0xb5, 0x33, 0xb5, 0x73, 0xb4, 0x73, 0xb5, 0x0b, 0xb4, + 0x8b, 0xb4, 0x4b, 0xb5, 0x2b, 0xb4, 0xab, 0xb4, 0x6b, 0xb5, 0xeb, 0xb5, + 0x9b, 0xb4, 0x5b, 0xb4, 0xdb, 0xb4, 0x3b, 0xb5, 0xbb, 0xb5, 0x7b, 0xb4, + 0xfb, 0xb4, 0xfb, 0xb5, 0x87, 0xb4, 0x47, 0xb5, 0x27, 0xb4, 0x5f, 0x68, + 0xcf, 0x6a, 0xcf, 0x6b, 0x2f, 0x69, 0xbf, 0xd6, 0x5e, 0xd3, 0x7e, 0xa3, + 0xbd, 0xad, 0xfd, 0x5e, 0x7b, 0x47, 0x7b, 0x4f, 0xfb, 0xb3, 0xf6, 0x91, + 0xf6, 0xb7, 0xf6, 0x28, 0xef, 0xcb, 0xbc, 0x8b, 0x79, 0x97, 0xf3, 0xae, + 0xe6, 0xdd, 0xc8, 0xbb, 0x95, 0xf7, 0x5d, 0xde, 0x8f, 0x79, 0x3f, 0xe5, + 0x3d, 0xc8, 0xfb, 0x25, 0xef, 0x71, 0xde, 0xef, 0x79, 0x7f, 0xea, 0x28, + 0x9d, 0x48, 0x27, 0xd5, 0xd9, 0xe9, 0xec, 0x75, 0x4e, 0x3a, 0x17, 0x9d, + 0xbb, 0xce, 0x4b, 0xe7, 0xab, 0x0b, 0xd0, 0x05, 0xe9, 0x42, 0x75, 0x11, + 0xba, 0x68, 0x5d, 0x1b, 0x5d, 0xbc, 0x2e, 0x49, 0x97, 0xaa, 0xcb, 0xd0, + 0x65, 0xeb, 0x54, 0xba, 0x5c, 0x5d, 0x7b, 0x9d, 0x5e, 0x67, 0xd2, 0x15, + 0xe8, 0x0a, 0x75, 0xc5, 0xba, 0x6e, 0xba, 0x9e, 0xba, 0x3e, 0xba, 0x57, + 0x74, 0x25, 0xba, 0x01, 0xba, 0x72, 0x5d, 0x85, 0xae, 0x4a, 0x57, 0xa3, + 0xab, 0xd7, 0x8d, 0xd0, 0x8d, 0xd2, 0xbd, 0xaa, 0xc3, 0xba, 0x37, 0x74, + 0x13, 0x74, 0x93, 0x75, 0xd3, 0x74, 0x33, 0x74, 0xb3, 0x74, 0x6f, 0xeb, + 0xe6, 0xe9, 0xde, 0xd5, 0x2d, 0xd6, 0x2d, 0xd3, 0xad, 0xd4, 0xad, 0xd6, + 0xad, 0xd3, 0x6d, 0xd0, 0x6d, 0xd6, 0x6d, 0xd5, 0x6d, 0xd7, 0x7d, 0xa4, + 0xfb, 0x58, 0xb7, 0x57, 0xf7, 0x99, 0xee, 0x80, 0xee, 0xb0, 0xee, 0x98, + 0xee, 0xa4, 0xee, 0xb4, 0xee, 0x9c, 0xee, 0x82, 0xee, 0x2b, 0xdd, 0x15, + 0xdd, 0x75, 0xdd, 0x4d, 0xdd, 0xb7, 0xba, 0x1f, 0x74, 0x77, 0x75, 0xf7, + 0x75, 0x0f, 0x75, 0xbf, 0xea, 0x9e, 0xe8, 0x9e, 0xea, 0x9e, 0xeb, 0x41, + 0x2f, 0xd1, 0xcb, 0xf5, 0x8c, 0xde, 0x51, 0xcf, 0xea, 0xdd, 0xf4, 0x9e, + 0x7a, 0x1f, 0xbd, 0xbf, 0x5e, 0xa1, 0x0f, 0xd1, 0x87, 0xeb, 0xa3, 0xf4, + 0xb1, 0xfa, 0x38, 0x7d, 0xa2, 0x3e, 0x45, 0x9f, 0xae, 0xcf, 0xd2, 0xb7, + 0xd5, 0xb7, 0xd3, 0x6b, 0xf5, 0x3a, 0xbd, 0x51, 0xdf, 0x41, 0xdf, 0x49, + 0x5f, 0xa4, 0xef, 0xaa, 0xef, 0xa1, 0xef, 0xad, 0xef, 0xa7, 0xef, 0xaf, + 0xb7, 0xe8, 0x07, 0xea, 0x07, 0xeb, 0x2b, 0xf5, 0x43, 0xf5, 0x75, 0xfa, + 0xe1, 0xfa, 0x91, 0xfa, 0x31, 0x7a, 0x4e, 0xff, 0xba, 0x7e, 0xbc, 0x7e, + 0x92, 0x7e, 0xaa, 0xfe, 0x4d, 0xfd, 0x4c, 0xfd, 0x1c, 0xfd, 0x5c, 0xfd, + 0x02, 0xfd, 0x22, 0xfd, 0x52, 0xfd, 0x0a, 0xfd, 0x2a, 0xfd, 0x5a, 0xfd, + 0x7a, 0xfd, 0x26, 0xfd, 0x16, 0xfd, 0x36, 0xfd, 0x4e, 0xfd, 0x6e, 0xfd, + 0x1e, 0xfd, 0x3e, 0xfd, 0x7e, 0xfd, 0x21, 0xfd, 0x51, 0xfd, 0x09, 0xfd, + 0x17, 0xfa, 0xb3, 0xfa, 0xf3, 0xfa, 0x4b, 0xfa, 0xaf, 0xf5, 0xd7, 0xf4, + 0xdf, 0xe8, 0x6f, 0xeb, 0xbf, 0xd7, 0xdf, 0xd1, 0xdf, 0xd3, 0xff, 0xac, + 0x7f, 0xa4, 0xff, 0x4d, 0xff, 0x87, 0xfe, 0x99, 0x01, 0x19, 0xc4, 0x06, + 0x99, 0x81, 0x36, 0x38, 0x18, 0x9c, 0x0d, 0xae, 0x06, 0x0f, 0x83, 0xb7, + 0xc1, 0xcf, 0x10, 0x68, 0x08, 0x36, 0x84, 0x19, 0x22, 0x0d, 0x31, 0x06, + 0xa5, 0x21, 0xc1, 0x90, 0x6c, 0x48, 0x33, 0x64, 0x1a, 0x72, 0x0c, 0x6a, + 0x83, 0xc6, 0x90, 0x67, 0x30, 0x18, 0xf2, 0x0d, 0x1d, 0x0d, 0x9d, 0x0d, + 0x5d, 0x0c, 0xdd, 0x0d, 0xbd, 0x0c, 0x7d, 0x0d, 0x66, 0x43, 0xa9, 0xa1, + 0xcc, 0x30, 0xc8, 0x30, 0xc4, 0x50, 0x6d, 0xa8, 0x35, 0x0c, 0x33, 0x34, + 0x18, 0x46, 0x1b, 0x5e, 0x33, 0x8c, 0x35, 0x8c, 0x33, 0x4c, 0x34, 0x4c, + 0x31, 0x4c, 0x37, 0xbc, 0x65, 0x98, 0x6d, 0x78, 0xc7, 0x30, 0xdf, 0xb0, + 0xd0, 0xb0, 0xc4, 0xb0, 0xdc, 0xf0, 0x9e, 0x61, 0x8d, 0xe1, 0x7d, 0xc3, + 0x46, 0xc3, 0x07, 0x86, 0x0f, 0x0d, 0x3b, 0x0c, 0xbb, 0x0c, 0x9f, 0x18, + 0x3e, 0x35, 0x7c, 0x6e, 0x38, 0x68, 0x38, 0x62, 0x38, 0x6e, 0x38, 0x65, + 0x38, 0x63, 0xf8, 0xd2, 0x70, 0xd1, 0x70, 0xd9, 0x70, 0xd5, 0x70, 0xc3, + 0x70, 0xcb, 0xf0, 0x9d, 0xe1, 0x47, 0xc3, 0x4f, 0x86, 0x07, 0x86, 0x5f, + 0x0c, 0x8f, 0x0d, 0xbf, 0x1b, 0xfe, 0x34, 0x52, 0x46, 0x91, 0x51, 0x6a, + 0xb4, 0x33, 0xda, 0x1b, 0x9d, 0x8c, 0x2e, 0x46, 0x77, 0xa3, 0x97, 0xd1, + 0xd7, 0x18, 0x60, 0x0c, 0x32, 0x86, 0x1a, 0x23, 0x8c, 0xd1, 0xc6, 0x36, + 0xc6, 0x78, 0x63, 0x92, 0x31, 0xd5, 0x98, 0x61, 0xcc, 0x36, 0xaa, 0x8c, + 0xb9, 0xc6, 0xf6, 0x46, 0xbd, 0xd1, 0x64, 0x2c, 0x30, 0x16, 0x1a, 0x8b, + 0x8d, 0xdd, 0x8c, 0x3d, 0x8d, 0x7d, 0x8c, 0xaf, 0x18, 0x4b, 0x8c, 0x03, + 0x8c, 0xe5, 0xc6, 0x0a, 0x63, 0x95, 0xb1, 0xc6, 0x58, 0x6f, 0x1c, 0x61, + 0x1c, 0x65, 0x7c, 0xd5, 0x88, 0x8d, 0x6f, 0x18, 0x27, 0x18, 0x27, 0x1b, + 0xa7, 0x19, 0x67, 0x18, 0x67, 0x19, 0xdf, 0x36, 0xce, 0x33, 0xbe, 0x6b, + 0x5c, 0x6c, 0x5c, 0x66, 0x5c, 0x69, 0x5c, 0x6d, 0x5c, 0x67, 0xdc, 0x60, + 0xdc, 0x6c, 0xdc, 0x6a, 0xdc, 0x6e, 0xfc, 0xc8, 0xf8, 0xb1, 0x71, 0xaf, + 0xf1, 0x33, 0xe3, 0x01, 0xe3, 0x61, 0xe3, 0x31, 0xe3, 0x49, 0xe3, 0x69, + 0xe3, 0x39, 0xe3, 0x05, 0xe3, 0x57, 0xc6, 0x2b, 0xc6, 0xeb, 0xc6, 0x9b, + 0xc6, 0x6f, 0x8d, 0x3f, 0x18, 0xef, 0x1a, 0xef, 0x1b, 0x1f, 0x1a, 0x7f, + 0x35, 0x3e, 0x31, 0x3e, 0x35, 0x3e, 0x37, 0x81, 0x49, 0x62, 0x92, 0x9b, + 0x18, 0x93, 0xa3, 0x89, 0x35, 0xb9, 0x99, 0x3c, 0x4d, 0x3e, 0x26, 0x7f, + 0x93, 0xc2, 0x14, 0x62, 0x0a, 0x37, 0x45, 0x99, 0x62, 0x4d, 0x71, 0xa6, + 0x44, 0x53, 0x8a, 0x29, 0xdd, 0x94, 0x65, 0x6a, 0x6b, 0x6a, 0x67, 0xd2, + 0x9a, 0x74, 0x26, 0xa3, 0xa9, 0x83, 0xa9, 0x93, 0xa9, 0xc8, 0xd4, 0xd5, + 0xd4, 0xc3, 0xd4, 0xdb, 0xd4, 0xcf, 0xd4, 0xdf, 0x64, 0x31, 0x0d, 0x34, + 0x0d, 0x36, 0x55, 0x9a, 0x86, 0x9a, 0xea, 0x4c, 0xc3, 0x4d, 0x23, 0x4d, + 0x63, 0x4c, 0x9c, 0xe9, 0x75, 0xd3, 0x78, 0xd3, 0x24, 0xd3, 0x54, 0xd3, + 0x9b, 0xa6, 0x99, 0xa6, 0x39, 0xa6, 0xb9, 0xa6, 0x05, 0xa6, 0x45, 0xa6, + 0xa5, 0xa6, 0x15, 0xa6, 0x55, 0xa6, 0xb5, 0xa6, 0xf5, 0xa6, 0x4d, 0xa6, + 0x2d, 0xa6, 0x6d, 0xa6, 0x9d, 0xa6, 0xdd, 0xa6, 0x3d, 0xa6, 0x7d, 0xa6, + 0xfd, 0xa6, 0x43, 0xa6, 0xa3, 0xa6, 0x13, 0xa6, 0x2f, 0x4c, 0x67, 0x4d, + 0xe7, 0x4d, 0x97, 0x4c, 0x5f, 0x9b, 0xae, 0x99, 0xbe, 0x31, 0xdd, 0x36, + 0x7d, 0x6f, 0xba, 0x63, 0xba, 0x67, 0xfa, 0xd9, 0xf4, 0xc8, 0xf4, 0x9b, + 0xe9, 0x0f, 0xd3, 0xb3, 0x7c, 0x94, 0x2f, 0xce, 0x97, 0xe5, 0xd3, 0xf9, + 0x0e, 0xf9, 0xce, 0xf9, 0xae, 0xf9, 0x1e, 0xf9, 0xde, 0xf9, 0x7e, 0xf9, + 0x81, 0xf9, 0xc1, 0xf9, 0x61, 0xf9, 0x91, 0xf9, 0x31, 0xf9, 0xca, 0xfc, + 0x84, 0xfc, 0xe4, 0xfc, 0xb4, 0xfc, 0xcc, 0xfc, 0x9c, 0x7c, 0x75, 0xbe, + 0x26, 0x3f, 0x2f, 0xdf, 0x90, 0x9f, 0x9f, 0xdf, 0x31, 0xbf, 0x7b, 0x7e, + 0x8f, 0xfc, 0xde, 0xf9, 0x96, 0xfc, 0x01, 0xf9, 0xe5, 0xf9, 0x35, 0xf9, + 0x38, 0x7f, 0x7c, 0xfe, 0xdc, 0xfc, 0xa5, 0xf9, 0x9f, 0xe4, 0x1f, 0xa3, + 0x84, 0xff, 0x00, 0xac, 0x9f, 0xcc, 0x77, 0x54, 0x8b, 0xff, 0xf2, 0x4f, + 0xfc, 0x1f, 0x50, 0x4b, 0x07, 0x08, 0xcf, 0x3e, 0x6f, 0x7f, 0xf3, 0x3e, + 0x00, 0x00, 0xbe, 0x64, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x89, 0x53, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, + 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, + 0x70, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x59, 0xc1, 0xb1, 0x61, 0xc1, + 0xc1, 0xb1, 0x61, 0x59, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, + 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x09, + 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xed, 0x41, 0x54, 0x00, 0x00, 0x00, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x3c, 0xc8, 0xb1, 0x61, + 0x43, 0xc8, 0xb1, 0x61, 0x3c, 0xc8, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, + 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, + 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x6c, + 0x09, 0x89, 0x53, 0x33, 0xf2, 0xe4, 0x12, 0x9d, 0x02, 0x00, 0x00, 0xdc, + 0x06, 0x00, 0x00, 0x29, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xa4, 0x81, 0xb1, 0x00, 0x00, 0x00, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x6c, 0x69, + 0x73, 0x74, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x3c, 0xc8, 0xb1, 0x61, 0x3c, + 0xc8, 0xb1, 0x61, 0x3c, 0xc8, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, + 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, + 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0x37, 0x4b, + 0x61, 0x4b, 0x49, 0x04, 0x8a, 0x5b, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x26, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa4, 0x81, 0xc5, 0x03, 0x00, 0x00, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x50, 0x6b, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x54, + 0x0d, 0x00, 0x07, 0x8a, 0xf5, 0xf9, 0x59, 0x42, 0xc2, 0xb1, 0x61, 0xd3, + 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, + 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, + 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x05, 0x89, 0x53, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x41, + 0x41, 0x04, 0x00, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, + 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x4d, + 0x61, 0x63, 0x4f, 0x53, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0xd3, 0xc1, + 0xb1, 0x61, 0xd6, 0xc1, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, + 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, + 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, + 0x00, 0x37, 0x4b, 0x61, 0x4b, 0x5d, 0x9c, 0xb1, 0x3d, 0xe6, 0x52, 0x00, + 0x00, 0xc0, 0x0a, 0x01, 0x00, 0x36, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x81, 0xa4, 0x04, 0x00, 0x00, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x2f, + 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x8a, 0xf5, + 0xf9, 0x59, 0xd7, 0xc2, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, + 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, + 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6e, 0x09, 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x41, 0x0e, 0x58, 0x00, 0x00, 0x74, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x2f, 0x55, 0x54, 0x0d, 0x00, 0x07, 0x41, 0xc8, 0xb1, + 0x61, 0x43, 0xc8, 0xb1, 0x61, 0x41, 0xc8, 0xb1, 0x61, 0x75, 0x78, 0x0b, + 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, + 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x81, 0x05, 0x89, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xed, 0x41, 0x75, 0x58, 0x00, 0x00, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x2e, 0x6c, 0x70, 0x72, 0x6f, 0x6a, 0x2f, + 0x55, 0x54, 0x0d, 0x00, 0x07, 0xd3, 0xc1, 0xb1, 0x61, 0xda, 0xc1, 0xb1, + 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, + 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, + 0x14, 0x03, 0x14, 0x00, 0x08, 0x00, 0x08, 0x00, 0xc1, 0x4a, 0x61, 0x4b, + 0x5f, 0x52, 0xc2, 0x53, 0x11, 0x01, 0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, + 0x3d, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa4, 0x81, 0xe5, 0x58, 0x00, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x6c, 0x2d, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, + 0x61, 0x70, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, + 0x6e, 0x2e, 0x6c, 0x70, 0x72, 0x6f, 0x6a, 0x2f, 0x43, 0x72, 0x65, 0x64, + 0x69, 0x74, 0x73, 0x2e, 0x72, 0x74, 0x66, 0x55, 0x54, 0x0d, 0x00, 0x07, + 0xab, 0xf4, 0xf9, 0x59, 0x42, 0xc2, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, + 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, + 0x03, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, 0x08, + 0x00, 0x08, 0x00, 0xc1, 0x4a, 0x61, 0x4b, 0xf9, 0x0d, 0xcc, 0x63, 0x49, + 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x43, 0x00, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x81, 0x5a, 0x00, + 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x2e, 0x6c, 0x70, 0x72, + 0x6f, 0x6a, 0x2f, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x6c, 0x69, 0x73, 0x74, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x55, 0x54, 0x0d, 0x00, + 0x07, 0xab, 0xf4, 0xf9, 0x59, 0x42, 0xc2, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, + 0x61, 0x75, 0x78, 0x0b, 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, + 0xe8, 0x03, 0x00, 0x00, 0x50, 0x4b, 0x01, 0x02, 0x14, 0x03, 0x14, 0x00, + 0x08, 0x00, 0x08, 0x00, 0xc1, 0x4a, 0x61, 0x4b, 0xcf, 0x3e, 0x6f, 0x7f, + 0xf3, 0x3e, 0x00, 0x00, 0xbe, 0x64, 0x00, 0x00, 0x3e, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x81, 0x5b, 0x5b, + 0x00, 0x00, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x2d, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x61, 0x70, 0x70, 0x2f, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x65, 0x6e, 0x2e, 0x6c, 0x70, + 0x72, 0x6f, 0x6a, 0x2f, 0x4d, 0x61, 0x69, 0x6e, 0x4d, 0x65, 0x6e, 0x75, + 0x2e, 0x6e, 0x69, 0x62, 0x55, 0x54, 0x0d, 0x00, 0x07, 0xab, 0xf4, 0xf9, + 0x59, 0xd7, 0xc2, 0xb1, 0x61, 0xd3, 0xc1, 0xb1, 0x61, 0x75, 0x78, 0x0b, + 0x00, 0x01, 0x04, 0xe8, 0x03, 0x00, 0x00, 0x04, 0xe8, 0x03, 0x00, 0x00, + 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x0b, 0x00, + 0x52, 0x05, 0x00, 0x00, 0xda, 0x9a, 0x00, 0x00, 0x00, 0x00, + } + + return zipFile +} diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-zip.go b/vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-zip.go new file mode 100644 index 000000000..685bf5ecd --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/gosx-notifier/terminal-app-zip.go @@ -0,0 +1,116 @@ +package gosxnotifier + +import ( + "archive/zip" + "bytes" + "fmt" + "io" + "log" + "os" + "path/filepath" + "runtime" +) + +const ( + zipPath = "terminal-notifier.temp.zip" + executablePath = "terminal-notifier.app/Contents/MacOS/terminal-notifier" + tempDirSuffix = "gosxnotifier" +) + +var ( + rootPath string + FinalPath string +) + +func supportedOS() bool { + if runtime.GOOS == "darwin" { + return true + } else { + log.Print("OS does not support terminal-notifier") + return false + } +} + +func init() { + if supportedOS() { + err := installTerminalNotifier() + if err != nil { + log.Fatalf("Could not install Terminal Notifier to a temp directory: %s", err) + } else { + FinalPath = filepath.Join(rootPath, executablePath) + } + } +} + +func exists(file string) bool { + if _, err := os.Stat(file); os.IsNotExist(err) { + return false + } + return true +} + +func installTerminalNotifier() error { + rootPath = filepath.Join(os.TempDir(), tempDirSuffix) + + //if terminal-notifier.app already installed no-need to re-install + if exists(filepath.Join(rootPath, executablePath)) { + return nil + } + buf := bytes.NewReader(terminalnotifier()) + reader, err := zip.NewReader(buf, int64(buf.Len())) + if err != nil { + return err + } + err = unpackZip(reader, rootPath) + if err != nil { + return fmt.Errorf("could not unpack zip terminal-notifier file: %s", err) + } + + err = os.Chmod(filepath.Join(rootPath, executablePath), 0755) + if err != nil { + return fmt.Errorf("could not make terminal-notifier executable: %s", err) + } + + return nil +} + +func unpackZip(reader *zip.Reader, tempPath string) error { + for _, zipFile := range reader.File { + name := zipFile.Name + mode := zipFile.Mode() + if mode.IsDir() { + if err := os.MkdirAll(filepath.Join(tempPath, name), 0755); err != nil { + return err + } + } else { + if err := unpackZippedFile(name, tempPath, zipFile); err != nil { + return err + } + } + } + + return nil +} + +func unpackZippedFile(filename, tempPath string, zipFile *zip.File) error { + writer, err := os.Create(filepath.Join(tempPath, filename)) + + if err != nil { + return err + } + + defer writer.Close() + + reader, err := zipFile.Open() + if err != nil { + return err + } + + defer reader.Close() + + if _, err = io.Copy(writer, reader); err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/kermieisinthehouse/systray/.gitignore b/vendor/github.com/kermieisinthehouse/systray/.gitignore new file mode 100644 index 000000000..2e85ef697 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/.gitignore @@ -0,0 +1,12 @@ +example/example +webview_example/webview_example +*~ +*.swp +**/*.exe +Release +Debug +*.sdf +dll/systray_unsigned.dll +out.txt +.vs +on_exit*.txt diff --git a/vendor/github.com/kermieisinthehouse/systray/CHANGELOG.md b/vendor/github.com/kermieisinthehouse/systray/CHANGELOG.md new file mode 100644 index 000000000..58e7fc8b3 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/CHANGELOG.md @@ -0,0 +1,125 @@ +# Changelog + +## [v1.1.0](https://github.com/getlantern/systray/tree/v1.1.0) (2020-11-18) + +[Full Changelog](https://github.com/getlantern/systray/compare/v1.0.5...v1.1.0) + +**Merged pull requests:** + +- Add submenu support for Linux [\#183](https://github.com/getlantern/systray/pull/183) ([fbrinker](https://github.com/fbrinker)) +- Add checkbox support for Linux [\#181](https://github.com/getlantern/systray/pull/181) ([fbrinker](https://github.com/fbrinker)) +- fix SetTitle documentation [\#179](https://github.com/getlantern/systray/pull/179) ([delthas](https://github.com/delthas)) + +## [v1.0.5](https://github.com/getlantern/systray/tree/v1.0.5) (2020-10-19) + +[Full Changelog](https://github.com/getlantern/systray/compare/v1.0.4...v1.0.5) + +**Merged pull requests:** + +- start menu ID with positive, and change the type to uint32 [\#173](https://github.com/getlantern/systray/pull/173) ([joesis](https://github.com/joesis)) +- Allows disabling items in submenu on macOS [\#172](https://github.com/getlantern/systray/pull/172) ([joesis](https://github.com/joesis)) +- Does not use the template icon for regular icons [\#171](https://github.com/getlantern/systray/pull/171) ([sithembiso](https://github.com/sithembiso)) + +## [v1.0.4](https://github.com/getlantern/systray/tree/v1.0.4) (2020-07-21) + +[Full Changelog](https://github.com/getlantern/systray/compare/1.0.3...v1.0.4) + +**Merged pull requests:** + +- protect shared data structures with proper mutexes [\#162](https://github.com/getlantern/systray/pull/162) ([joesis](https://github.com/joesis)) + +## [1.0.3](https://github.com/getlantern/systray/tree/1.0.3) (2020-06-11) + +[Full Changelog](https://github.com/getlantern/systray/compare/v1.0.3...1.0.3) + +## [v1.0.3](https://github.com/getlantern/systray/tree/v1.0.3) (2020-06-11) + +[Full Changelog](https://github.com/getlantern/systray/compare/v1.0.2...v1.0.3) + +**Merged pull requests:** + +- have a workaround to avoid crash on old macOS versions [\#153](https://github.com/getlantern/systray/pull/153) ([joesis](https://github.com/joesis)) +- Fix bug on darwin of setting icon for menu [\#147](https://github.com/getlantern/systray/pull/147) ([mangalaman93](https://github.com/mangalaman93)) + +## [v1.0.2](https://github.com/getlantern/systray/tree/v1.0.2) (2020-05-19) + +[Full Changelog](https://github.com/getlantern/systray/compare/v1.0.1...v1.0.2) + +**Merged pull requests:** + +- remove unused dependencies [\#145](https://github.com/getlantern/systray/pull/145) ([joesis](https://github.com/joesis)) + +## [v1.0.1](https://github.com/getlantern/systray/tree/v1.0.1) (2020-05-18) + +[Full Changelog](https://github.com/getlantern/systray/compare/1.0.1...v1.0.1) + +## [1.0.1](https://github.com/getlantern/systray/tree/1.0.1) (2020-05-18) + +[Full Changelog](https://github.com/getlantern/systray/compare/1.0.0...1.0.1) + +**Merged pull requests:** + +- Unlock menuItemsLock before changing UI [\#144](https://github.com/getlantern/systray/pull/144) ([joesis](https://github.com/joesis)) + +## [1.0.0](https://github.com/getlantern/systray/tree/1.0.0) (2020-05-18) + +[Full Changelog](https://github.com/getlantern/systray/compare/v1.0.0...1.0.0) + +## [v1.0.0](https://github.com/getlantern/systray/tree/v1.0.0) (2020-05-18) + +[Full Changelog](https://github.com/getlantern/systray/compare/0.9.0...v1.0.0) + +**Merged pull requests:** + +- Check if the menu item is nil [\#137](https://github.com/getlantern/systray/pull/137) ([myleshorton](https://github.com/myleshorton)) + +## [0.9.0](https://github.com/getlantern/systray/tree/0.9.0) (2020-03-24) + +[Full Changelog](https://github.com/getlantern/systray/compare/v0.9.0...0.9.0) + +## [v0.9.0](https://github.com/getlantern/systray/tree/v0.9.0) (2020-03-24) + +[Full Changelog](https://github.com/getlantern/systray/compare/8e63b37ef27d94f6db79c4ffb941608e8f0dc2f9...v0.9.0) + +**Merged pull requests:** + +- Backport all features and fixes from master [\#140](https://github.com/getlantern/systray/pull/140) ([joesis](https://github.com/joesis)) +- Nested menu windows [\#132](https://github.com/getlantern/systray/pull/132) ([joesis](https://github.com/joesis)) +- Support for nested sub-menus on OS X [\#131](https://github.com/getlantern/systray/pull/131) ([oxtoacart](https://github.com/oxtoacart)) +- Use temp directory for walk resource manager [\#129](https://github.com/getlantern/systray/pull/129) ([max-b](https://github.com/max-b)) +- Added support for template icons on macOS [\#119](https://github.com/getlantern/systray/pull/119) ([oxtoacart](https://github.com/oxtoacart)) +- When launching app window on macOS, make application a foreground app… [\#118](https://github.com/getlantern/systray/pull/118) ([oxtoacart](https://github.com/oxtoacart)) +- Include stdlib.h in systray\_browser\_linux to explicitly declare funct… [\#114](https://github.com/getlantern/systray/pull/114) ([oxtoacart](https://github.com/oxtoacart)) +- Fix panic when resources root path is not the working directory [\#112](https://github.com/getlantern/systray/pull/112) ([ksubileau](https://github.com/ksubileau)) +- Don't print close reason to console [\#111](https://github.com/getlantern/systray/pull/111) ([ksubileau](https://github.com/ksubileau)) +- Systray icon could not be changed dynamically [\#110](https://github.com/getlantern/systray/pull/110) ([ksubileau](https://github.com/ksubileau)) +- Preventing deadlock on menu item ClickeCh when no one is listening, c… [\#105](https://github.com/getlantern/systray/pull/105) ([oxtoacart](https://github.com/oxtoacart)) +- Reverted deadlock fix \(Affected other receivers\) [\#104](https://github.com/getlantern/systray/pull/104) ([ldstein](https://github.com/ldstein)) +- Fix Deadlock and item ordering in Windows [\#103](https://github.com/getlantern/systray/pull/103) ([ldstein](https://github.com/ldstein)) +- Minor README improvements \(go modules, example app, screenshot\) [\#98](https://github.com/getlantern/systray/pull/98) ([tstromberg](https://github.com/tstromberg)) +- Add support for app window [\#97](https://github.com/getlantern/systray/pull/97) ([oxtoacart](https://github.com/oxtoacart)) +- systray\_darwin.m: Compare Mac OS min version with value instead of macro [\#94](https://github.com/getlantern/systray/pull/94) ([teddywing](https://github.com/teddywing)) +- Attempt to fix https://github.com/getlantern/systray/issues/75 [\#92](https://github.com/getlantern/systray/pull/92) ([mikeschinkel](https://github.com/mikeschinkel)) +- Fix application path for MacOS in README [\#91](https://github.com/getlantern/systray/pull/91) ([zereraz](https://github.com/zereraz)) +- Document cross-platform console window details [\#81](https://github.com/getlantern/systray/pull/81) ([michaelsanford](https://github.com/michaelsanford)) +- Fix bad-looking system tray icon in Windows [\#78](https://github.com/getlantern/systray/pull/78) ([juja256](https://github.com/juja256)) +- Add the separator to the visible items [\#76](https://github.com/getlantern/systray/pull/76) ([meskio](https://github.com/meskio)) +- keep track of hidden items [\#74](https://github.com/getlantern/systray/pull/74) ([kalikaneko](https://github.com/kalikaneko)) +- Support macOS older than 10.13 [\#73](https://github.com/getlantern/systray/pull/73) ([swznd](https://github.com/swznd)) +- define ERROR\_SUCCESS as syscall.Errno [\#69](https://github.com/getlantern/systray/pull/69) ([joesis](https://github.com/joesis)) +- Bug/fix broken menuitem show [\#68](https://github.com/getlantern/systray/pull/68) ([kalikaneko](https://github.com/kalikaneko)) +- Fix mac deprecations [\#66](https://github.com/getlantern/systray/pull/66) ([jefvel](https://github.com/jefvel)) +- Made it possible to add icons to menu items on Mac [\#65](https://github.com/getlantern/systray/pull/65) ([jefvel](https://github.com/jefvel)) +- linux: delete temp files as soon as they are not needed [\#63](https://github.com/getlantern/systray/pull/63) ([meskio](https://github.com/meskio)) +- Merge changes from amkulikov to remove DLL for windows [\#56](https://github.com/getlantern/systray/pull/56) ([oxtoacart](https://github.com/oxtoacart)) +- Revert "Use templated icons for the menu bar in macOS" [\#51](https://github.com/getlantern/systray/pull/51) ([stoggi](https://github.com/stoggi)) +- Use templated icons for the menu bar in macOS [\#46](https://github.com/getlantern/systray/pull/46) ([stoggi](https://github.com/stoggi)) +- Syscalls instead of custom DLLs [\#44](https://github.com/getlantern/systray/pull/44) ([amkulikov](https://github.com/amkulikov)) +- On quit exit main loop on linux [\#41](https://github.com/getlantern/systray/pull/41) ([meskio](https://github.com/meskio)) +- Fixed hide show in linux \(\#37\) [\#39](https://github.com/getlantern/systray/pull/39) ([meskio](https://github.com/meskio)) +- fix: linux compilation warning [\#36](https://github.com/getlantern/systray/pull/36) ([novln](https://github.com/novln)) +- Added separator functionality [\#32](https://github.com/getlantern/systray/pull/32) ([oxtoacart](https://github.com/oxtoacart)) + + + +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* diff --git a/vendor/github.com/kermieisinthehouse/systray/LICENSE b/vendor/github.com/kermieisinthehouse/systray/LICENSE new file mode 100644 index 000000000..3ee01626e --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2014 Brave New Software Project, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/kermieisinthehouse/systray/Makefile b/vendor/github.com/kermieisinthehouse/systray/Makefile new file mode 100644 index 000000000..12f3d221f --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/Makefile @@ -0,0 +1,18 @@ +tag-changelog: require-version require-gh-token + echo "Tagging..." && \ + git tag -a "$$VERSION" -f --annotate -m"Tagged $$VERSION" && \ + git push --tags -f && \ + git checkout master && \ + git pull && \ + github_changelog_generator --no-issues --max-issues 100 --token "${GH_TOKEN}" --user getlantern --project systray && \ + git add CHANGELOG.md && \ + git commit -m "Updated changelog for $$VERSION" && \ + git push origin HEAD && \ + git checkout - + +guard-%: + @ if [ -z '${${*}}' ]; then echo 'Environment variable $* not set' && exit 1; fi + +require-version: guard-VERSION + +require-gh-token: guard-GH_TOKEN diff --git a/vendor/github.com/kermieisinthehouse/systray/README.md b/vendor/github.com/kermieisinthehouse/systray/README.md new file mode 100644 index 000000000..900802d6a --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/README.md @@ -0,0 +1,122 @@ +systray is a cross-platform Go library to place an icon and menu in the notification area. + +This is a fork of the abandoned https://github.com/getlantern/systray with pull requests reviewed and merged, and bugs fixed. + +## Features + +* Supported on Windows, macOS, and Linux +* Menu items can be checked and/or disabled +* Methods may be called from any Goroutine + +## API + +```go +func main() { + systray.Run(onReady, onExit) +} + +func onReady() { + systray.SetIcon(icon.Data) + systray.SetTitle("Awesome App") + systray.SetTooltip("Pretty awesome超级棒") + mQuit := systray.AddMenuItem("Quit", "Quit the whole app") + + // Sets the icon of a menu item. Only available on Mac and Windows. + mQuit.SetIcon(icon.Data) +} + +func onExit() { + // clean up here +} +``` + +See [full API](https://pkg.go.dev/github.com/getlantern/systray?tab=doc) as well as [CHANGELOG](https://github.com/getlantern/systray/tree/master/CHANGELOG.md). + +## Try the example app! + +Have go v1.12+ or higher installed? Here's an example to get started on macOS: + +```sh +git clone https://github.com/getlantern/systray +cd example +env GO111MODULE=on go build +./example +``` + +On Windows, you should build like this: + +``` +env GO111MODULE=on go build -ldflags "-H=windowsgui" +``` + +The following text will then appear on the console: + + +```sh +go: finding github.com/skratchdot/open-golang latest +go: finding github.com/getlantern/systray latest +go: finding github.com/getlantern/golog latest +``` + +Now look for *Awesome App* in your menu bar! + +![Awesome App screenshot](example/screenshot.png) + +## The Webview example + +The code under `webview_example` is to demostrate how it can co-exist with other UI elements. Note that the example doesn't work on macOS versions older than 10.15 Catalina. + +## Platform notes + +### Linux + +* Building apps requires gcc as well as the `gtk3` and `libayatana-appindicator` development headers to be installed. For Debian or Ubuntu, you may install these using: + +```sh +sudo apt-get install gcc libgtk-3-dev libappindicator3-dev +``` + +On Linux Mint, `libxapp-dev` is also required . + +To build `webview_example`, you also need to install `libwebkit2gtk-4.0-dev` and remove `webview_example/rsrc.syso` which is required on Windows. + +### Windows + +* To avoid opening a console at application startup, use these compile flags: + +```sh +go build -ldflags -H=windowsgui +``` + +### macOS + +On macOS, you will need to create an application bundle to wrap the binary; simply folders with the following minimal structure and assets: + +``` +SystrayApp.app/ + Contents/ + Info.plist + MacOS/ + go-executable + Resources/ + SystrayApp.icns +``` + +When running as an app bundle, you may want to add one or both of the following to your Info.plist: + +```xml + + NSHighResolutionCapable + True + + + LSUIElement + 1 +``` + +Consult the [Official Apple Documentation here](https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1). + +## Credits + +- https://github.com/xilp/systray +- https://github.com/cratonica/trayhost diff --git a/vendor/github.com/kermieisinthehouse/systray/systray.go b/vendor/github.com/kermieisinthehouse/systray/systray.go new file mode 100644 index 000000000..5324a86b4 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray.go @@ -0,0 +1,244 @@ +/* +Package systray is a cross-platform Go library to place an icon and menu in the notification area. +*/ +package systray + +import ( + "fmt" + "log" + "runtime" + "sync" + "sync/atomic" +) + +var ( + systrayReady func() + systrayExit func() + menuItems = make(map[uint32]*MenuItem) + menuItemsLock sync.RWMutex + + currentID = uint32(0) + quitOnce sync.Once +) + +func init() { + runtime.LockOSThread() +} + +// MenuItem is used to keep track each menu item of systray. +// Don't create it directly, use the one systray.AddMenuItem() returned +type MenuItem struct { + // ClickedCh is the channel which will be notified when the menu item is clicked + ClickedCh chan struct{} + + // id uniquely identify a menu item, not supposed to be modified + id uint32 + // title is the text shown on menu item + title string + // tooltip is the text shown when pointing to menu item + tooltip string + // disabled menu item is grayed out and has no effect when clicked + disabled bool + // checked menu item has a tick before the title + checked bool + // has the menu item a checkbox (Linux) + isCheckable bool + // parent item, for sub menus + parent *MenuItem +} + +func (item *MenuItem) String() string { + if item.parent == nil { + return fmt.Sprintf("MenuItem[%d, %q]", item.id, item.title) + } + return fmt.Sprintf("MenuItem[%d, parent %d, %q]", item.id, item.parent.id, item.title) +} + +// newMenuItem returns a populated MenuItem object +func newMenuItem(title string, tooltip string, parent *MenuItem) *MenuItem { + return &MenuItem{ + ClickedCh: make(chan struct{}), + id: atomic.AddUint32(¤tID, 1), + title: title, + tooltip: tooltip, + disabled: false, + checked: false, + isCheckable: false, + parent: parent, + } +} + +// Run initializes GUI and starts the event loop, then invokes the onReady +// callback. It blocks until systray.Quit() is called. +func Run(onReady func(), onExit func()) { + Register(onReady, onExit) + nativeLoop() +} + +// Register initializes GUI and registers the callbacks but relies on the +// caller to run the event loop somewhere else. It's useful if the program +// needs to show other UI elements, for example, webview. +// To overcome some OS weirdness, On macOS versions before Catalina, calling +// this does exactly the same as Run(). +func Register(onReady func(), onExit func()) { + if onReady == nil { + systrayReady = func() {} + } else { + // Run onReady on separate goroutine to avoid blocking event loop + readyCh := make(chan interface{}) + go func() { + <-readyCh + onReady() + }() + systrayReady = func() { + close(readyCh) + } + } + // unlike onReady, onExit runs in the event loop to make sure it has time to + // finish before the process terminates + if onExit == nil { + onExit = func() {} + } + systrayExit = onExit + registerSystray() +} + +// Quit the systray +func Quit() { + quitOnce.Do(quit) +} + +// AddMenuItem adds a menu item with the designated title and tooltip. +// It can be safely invoked from different goroutines. +// Created menu items are checkable on Windows and OSX by default. For Linux you have to use AddMenuItemCheckbox +func AddMenuItem(title string, tooltip string) *MenuItem { + item := newMenuItem(title, tooltip, nil) + item.update() + return item +} + +// AddMenuItemCheckbox adds a menu item with the designated title and tooltip and a checkbox for Linux. +// It can be safely invoked from different goroutines. +// On Windows and OSX this is the same as calling AddMenuItem +func AddMenuItemCheckbox(title string, tooltip string, checked bool) *MenuItem { + item := newMenuItem(title, tooltip, nil) + item.isCheckable = true + item.checked = checked + item.update() + return item +} + +// AddSeparator adds a separator bar to the menu +func AddSeparator() { + addSeparator(atomic.AddUint32(¤tID, 1)) +} + +// AddSubMenuItem adds a nested sub-menu item with the designated title and tooltip. +// It can be safely invoked from different goroutines. +// Created menu items are checkable on Windows and OSX by default. For Linux you have to use AddSubMenuItemCheckbox +func (item *MenuItem) AddSubMenuItem(title string, tooltip string) *MenuItem { + child := newMenuItem(title, tooltip, item) + child.update() + return child +} + +// AddSubMenuItemCheckbox adds a nested sub-menu item with the designated title and tooltip and a checkbox for Linux. +// It can be safely invoked from different goroutines. +// On Windows and OSX this is the same as calling AddSubMenuItem +func (item *MenuItem) AddSubMenuItemCheckbox(title string, tooltip string, checked bool) *MenuItem { + child := newMenuItem(title, tooltip, item) + child.isCheckable = true + child.checked = checked + child.update() + return child +} + +// SetTitle set the text to display on a menu item +func (item *MenuItem) SetTitle(title string) { + item.title = title + item.update() +} + +// Title returns the text displayed on a menu item +func (item *MenuItem) Title() string { + return item.title +} + +// SetTooltip set the tooltip to show when mouse hover +func (item *MenuItem) SetTooltip(tooltip string) { + item.tooltip = tooltip + item.update() +} + +// Tooltip returns the tooltip shown when mouse hover +func (item *MenuItem) Tooltip() string { + return item.tooltip +} + +// Disabled checks if the menu item is disabled +func (item *MenuItem) Disabled() bool { + return item.disabled +} + +// Enable a menu item regardless if it's previously enabled or not +func (item *MenuItem) Enable() { + item.disabled = false + item.update() +} + +// Disable a menu item regardless if it's previously disabled or not +func (item *MenuItem) Disable() { + item.disabled = true + item.update() +} + +// Hide hides a menu item +func (item *MenuItem) Hide() { + hideMenuItem(item) +} + +// Show shows a previously hidden menu item +func (item *MenuItem) Show() { + showMenuItem(item) +} + +// Checked returns if the menu item has a check mark +func (item *MenuItem) Checked() bool { + return item.checked +} + +// Check a menu item regardless if it's previously checked or not +func (item *MenuItem) Check() { + item.checked = true + item.update() +} + +// Uncheck a menu item regardless if it's previously unchecked or not +func (item *MenuItem) Uncheck() { + item.checked = false + item.update() +} + +// update propagates changes on a menu item to systray +func (item *MenuItem) update() { + menuItemsLock.Lock() + menuItems[item.id] = item + menuItemsLock.Unlock() + addOrUpdateMenuItem(item) +} + +func systrayMenuItemSelected(id uint32) { + menuItemsLock.RLock() + item, ok := menuItems[id] + menuItemsLock.RUnlock() + if !ok { + log.Printf("No menu item with ID %v", id) + return + } + + select { + case item.ClickedCh <- struct{}{}: + // in case no one waiting for the channel + default: + } +} diff --git a/vendor/github.com/kermieisinthehouse/systray/systray.h b/vendor/github.com/kermieisinthehouse/systray/systray.h new file mode 100644 index 000000000..888c82905 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray.h @@ -0,0 +1,17 @@ +#include "stdbool.h" + +extern void systray_ready(); +extern void systray_on_exit(); +extern void systray_menu_item_selected(int menu_id); +void registerSystray(void); +int nativeLoop(void); + +void setIcon(const char* iconBytes, int length, bool template); +void setMenuItemIcon(const char* iconBytes, int length, int menuId, bool template); +void setTitle(char* title); +void setTooltip(char* tooltip); +void add_or_update_menu_item(int menuId, int parentMenuId, char* title, char* tooltip, short disabled, short checked, short isCheckable); +void add_separator(int menuId); +void hide_menu_item(int menuId); +void show_menu_item(int menuId); +void quit(); diff --git a/vendor/github.com/kermieisinthehouse/systray/systray_darwin.go b/vendor/github.com/kermieisinthehouse/systray/systray_darwin.go new file mode 100644 index 000000000..740ec5b5e --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray_darwin.go @@ -0,0 +1,38 @@ +package systray + +/* +#cgo darwin CFLAGS: -DDARWIN -x objective-c -fobjc-arc +#cgo darwin LDFLAGS: -framework Cocoa -framework WebKit + +#include "systray.h" +*/ +import "C" + +import ( + "unsafe" +) + +// SetTemplateIcon sets the systray icon as a template icon (on Mac), falling back +// to a regular icon on other platforms. +// templateIconBytes and regularIconBytes should be the content of .ico for windows and +// .ico/.jpg/.png for other platforms. +func SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) { + cstr := (*C.char)(unsafe.Pointer(&templateIconBytes[0])) + C.setIcon(cstr, (C.int)(len(templateIconBytes)), true) +} + +// SetIcon sets the icon of a menu item. Only works on macOS and Windows. +// iconBytes should be the content of .ico/.jpg/.png +func (item *MenuItem) SetIcon(iconBytes []byte) { + cstr := (*C.char)(unsafe.Pointer(&iconBytes[0])) + C.setMenuItemIcon(cstr, (C.int)(len(iconBytes)), C.int(item.id), false) +} + +// SetTemplateIcon sets the icon of a menu item as a template icon (on macOS). On Windows, it +// falls back to the regular icon bytes and on Linux it does nothing. +// templateIconBytes and regularIconBytes should be the content of .ico for windows and +// .ico/.jpg/.png for other platforms. +func (item *MenuItem) SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) { + cstr := (*C.char)(unsafe.Pointer(&templateIconBytes[0])) + C.setMenuItemIcon(cstr, (C.int)(len(templateIconBytes)), C.int(item.id), true) +} diff --git a/vendor/github.com/kermieisinthehouse/systray/systray_darwin.m b/vendor/github.com/kermieisinthehouse/systray/systray_darwin.m new file mode 100644 index 000000000..34f198236 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray_darwin.m @@ -0,0 +1,294 @@ +#import +#include "systray.h" + +#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101400 + + #ifndef NSControlStateValueOff + #define NSControlStateValueOff NSOffState + #endif + + #ifndef NSControlStateValueOn + #define NSControlStateValueOn NSOnState + #endif + +#endif + +@interface MenuItem : NSObject +{ + @public + NSNumber* menuId; + NSNumber* parentMenuId; + NSString* title; + NSString* tooltip; + short disabled; + short checked; +} +-(id) initWithId: (int)theMenuId +withParentMenuId: (int)theParentMenuId + withTitle: (const char*)theTitle + withTooltip: (const char*)theTooltip + withDisabled: (short)theDisabled + withChecked: (short)theChecked; + @end + @implementation MenuItem + -(id) initWithId: (int)theMenuId + withParentMenuId: (int)theParentMenuId + withTitle: (const char*)theTitle + withTooltip: (const char*)theTooltip + withDisabled: (short)theDisabled + withChecked: (short)theChecked +{ + menuId = [NSNumber numberWithInt:theMenuId]; + parentMenuId = [NSNumber numberWithInt:theParentMenuId]; + title = [[NSString alloc] initWithCString:theTitle + encoding:NSUTF8StringEncoding]; + tooltip = [[NSString alloc] initWithCString:theTooltip + encoding:NSUTF8StringEncoding]; + disabled = theDisabled; + checked = theChecked; + return self; +} +@end + +@interface AppDelegate: NSObject + - (void) add_or_update_menu_item:(MenuItem*) item; + - (IBAction)menuHandler:(id)sender; + @property (assign) IBOutlet NSWindow *window; + @end + + @implementation AppDelegate +{ + NSStatusItem *statusItem; + NSMenu *menu; + NSCondition* cond; +} + +@synthesize window = _window; + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + self->statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; + self->menu = [[NSMenu alloc] init]; + [self->menu setAutoenablesItems: FALSE]; + [self->statusItem setMenu:self->menu]; + systray_ready(); +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification +{ + systray_on_exit(); +} + +- (void)setIcon:(NSImage *)image { + statusItem.button.image = image; + [self updateTitleButtonStyle]; +} + +- (void)setTitle:(NSString *)title { + statusItem.button.title = title; + [self updateTitleButtonStyle]; +} + +-(void)updateTitleButtonStyle { + if (statusItem.button.image != nil) { + if ([statusItem.button.title length] == 0) { + statusItem.button.imagePosition = NSImageOnly; + } else { + statusItem.button.imagePosition = NSImageLeft; + } + } else { + statusItem.button.imagePosition = NSNoImage; + } +} + + +- (void)setTooltip:(NSString *)tooltip { + statusItem.button.toolTip = tooltip; +} + +- (IBAction)menuHandler:(id)sender +{ + NSNumber* menuId = [sender representedObject]; + systray_menu_item_selected(menuId.intValue); +} + +- (void)add_or_update_menu_item:(MenuItem *)item { + NSMenu *theMenu = self->menu; + NSMenuItem *parentItem; + if ([item->parentMenuId integerValue] > 0) { + parentItem = find_menu_item(menu, item->parentMenuId); + if (parentItem.hasSubmenu) { + theMenu = parentItem.submenu; + } else { + theMenu = [[NSMenu alloc] init]; + [theMenu setAutoenablesItems:NO]; + [parentItem setSubmenu:theMenu]; + } + } + + NSMenuItem *menuItem; + menuItem = find_menu_item(theMenu, item->menuId); + if (menuItem == NULL) { + menuItem = [theMenu addItemWithTitle:item->title + action:@selector(menuHandler:) + keyEquivalent:@""]; + [menuItem setRepresentedObject:item->menuId]; + } + [menuItem setTitle:item->title]; + [menuItem setTag:[item->menuId integerValue]]; + [menuItem setTarget:self]; + [menuItem setToolTip:item->tooltip]; + if (item->disabled == 1) { + menuItem.enabled = FALSE; + } else { + menuItem.enabled = TRUE; + } + if (item->checked == 1) { + menuItem.state = NSControlStateValueOn; + } else { + menuItem.state = NSControlStateValueOff; + } +} + +NSMenuItem *find_menu_item(NSMenu *ourMenu, NSNumber *menuId) { + NSMenuItem *foundItem = [ourMenu itemWithTag:[menuId integerValue]]; + if (foundItem != NULL) { + return foundItem; + } + NSArray *menu_items = ourMenu.itemArray; + int i; + for (i = 0; i < [menu_items count]; i++) { + NSMenuItem *i_item = [menu_items objectAtIndex:i]; + if (i_item.hasSubmenu) { + foundItem = find_menu_item(i_item.submenu, menuId); + if (foundItem != NULL) { + return foundItem; + } + } + } + + return NULL; +}; + +- (void) add_separator:(NSNumber*) menuId +{ + [menu addItem: [NSMenuItem separatorItem]]; +} + +- (void) hide_menu_item:(NSNumber*) menuId +{ + NSMenuItem* menuItem = find_menu_item(menu, menuId); + if (menuItem != NULL) { + [menuItem setHidden:TRUE]; + } +} + +- (void) setMenuItemIcon:(NSArray*)imageAndMenuId { + NSImage* image = [imageAndMenuId objectAtIndex:0]; + NSNumber* menuId = [imageAndMenuId objectAtIndex:1]; + + NSMenuItem* menuItem; + menuItem = find_menu_item(menu, menuId); + if (menuItem == NULL) { + return; + } + menuItem.image = image; +} + +- (void) show_menu_item:(NSNumber*) menuId +{ + NSMenuItem* menuItem = find_menu_item(menu, menuId); + if (menuItem != NULL) { + [menuItem setHidden:FALSE]; + } +} + +- (void) quit +{ + [NSApp stop:self]; + [NSApp abortModal]; +} + +@end + +void registerSystray(void) { + AppDelegate *delegate = [[AppDelegate alloc] init]; + [[NSApplication sharedApplication] setDelegate:delegate]; + // A workaround to avoid crashing on macOS versions before Catalina. Somehow + // SIGSEGV would happen inside AppKit if [NSApp run] is called from a + // different function, even if that function is called right after this. + if (floor(NSAppKitVersionNumber) <= /*NSAppKitVersionNumber10_14*/ 1671){ + [NSApp run]; + } +} + +int nativeLoop(void) { + if (floor(NSAppKitVersionNumber) > /*NSAppKitVersionNumber10_14*/ 1671){ + [NSApp run]; + } + return EXIT_SUCCESS; +} + +void runInMainThread(SEL method, id object) { + [(AppDelegate*)[NSApp delegate] + performSelectorOnMainThread:method + withObject:object + waitUntilDone: YES]; +} + +void setIcon(const char* iconBytes, int length, bool template) { + NSData* buffer = [NSData dataWithBytes: iconBytes length:length]; + NSImage *image = [[NSImage alloc] initWithData:buffer]; + [image setSize:NSMakeSize(16, 16)]; + image.template = template; + runInMainThread(@selector(setIcon:), (id)image); +} + +void setMenuItemIcon(const char* iconBytes, int length, int menuId, bool template) { + NSData* buffer = [NSData dataWithBytes: iconBytes length:length]; + NSImage *image = [[NSImage alloc] initWithData:buffer]; + [image setSize:NSMakeSize(16, 16)]; + image.template = template; + NSNumber *mId = [NSNumber numberWithInt:menuId]; + runInMainThread(@selector(setMenuItemIcon:), @[image, (id)mId]); +} + +void setTitle(char* ctitle) { + NSString* title = [[NSString alloc] initWithCString:ctitle + encoding:NSUTF8StringEncoding]; + free(ctitle); + runInMainThread(@selector(setTitle:), (id)title); +} + +void setTooltip(char* ctooltip) { + NSString* tooltip = [[NSString alloc] initWithCString:ctooltip + encoding:NSUTF8StringEncoding]; + free(ctooltip); + runInMainThread(@selector(setTooltip:), (id)tooltip); +} + +void add_or_update_menu_item(int menuId, int parentMenuId, char* title, char* tooltip, short disabled, short checked, short isCheckable) { + MenuItem* item = [[MenuItem alloc] initWithId: menuId withParentMenuId: parentMenuId withTitle: title withTooltip: tooltip withDisabled: disabled withChecked: checked]; + free(title); + free(tooltip); + runInMainThread(@selector(add_or_update_menu_item:), (id)item); +} + +void add_separator(int menuId) { + NSNumber *mId = [NSNumber numberWithInt:menuId]; + runInMainThread(@selector(add_separator:), (id)mId); +} + +void hide_menu_item(int menuId) { + NSNumber *mId = [NSNumber numberWithInt:menuId]; + runInMainThread(@selector(hide_menu_item:), (id)mId); +} + +void show_menu_item(int menuId) { + NSNumber *mId = [NSNumber numberWithInt:menuId]; + runInMainThread(@selector(show_menu_item:), (id)mId); +} + +void quit() { + runInMainThread(@selector(quit), nil); +} diff --git a/vendor/github.com/kermieisinthehouse/systray/systray_linux.c b/vendor/github.com/kermieisinthehouse/systray/systray_linux.c new file mode 100644 index 000000000..0510bff96 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray_linux.c @@ -0,0 +1,269 @@ +#include +#include +#include +#include +#include +#include "systray.h" + +static AppIndicator *global_app_indicator; +static GtkWidget *global_tray_menu = NULL; +static GList *global_menu_items = NULL; +static char temp_file_name[PATH_MAX] = ""; + +typedef struct { + GtkWidget *menu_item; + int menu_id; + long signalHandlerId; +} MenuItemNode; + +typedef struct { + int menu_id; + int parent_menu_id; + char* title; + char* tooltip; + short disabled; + short checked; + short isCheckable; +} MenuItemInfo; + +void registerSystray(void) { + gtk_init(0, NULL); + global_app_indicator = app_indicator_new("systray", "", APP_INDICATOR_CATEGORY_APPLICATION_STATUS); + app_indicator_set_status(global_app_indicator, APP_INDICATOR_STATUS_ACTIVE); + global_tray_menu = gtk_menu_new(); + app_indicator_set_menu(global_app_indicator, GTK_MENU(global_tray_menu)); + systray_ready(); +} + +int nativeLoop(void) { + gtk_main(); + systray_on_exit(); + return 0; +} + +void _unlink_temp_file() { + if (strlen(temp_file_name) != 0) { + int ret = unlink(temp_file_name); + if (ret == -1) { + printf("failed to remove temp icon file %s: %s\n", temp_file_name, strerror(errno)); + } + temp_file_name[0] = '\0'; + } +} + +// runs in main thread, should always return FALSE to prevent gtk to execute it again +gboolean do_set_icon(gpointer data) { + _unlink_temp_file(); + char *tmpdir = getenv("TMPDIR"); + if (NULL == tmpdir) { + tmpdir = "/tmp"; + } + strncpy(temp_file_name, tmpdir, PATH_MAX-1); + strncat(temp_file_name, "/systray_XXXXXX", PATH_MAX-1); + temp_file_name[PATH_MAX-1] = '\0'; + + GBytes* bytes = (GBytes*)data; + int fd = mkstemp(temp_file_name); + if (fd == -1) { + printf("failed to create temp icon file %s: %s\n", temp_file_name, strerror(errno)); + return FALSE; + } + gsize size = 0; + gconstpointer icon_data = g_bytes_get_data(bytes, &size); + ssize_t written = write(fd, icon_data, size); + close(fd); + if(written != size) { + printf("failed to write temp icon file %s: %s\n", temp_file_name, strerror(errno)); + return FALSE; + } + app_indicator_set_icon_full(global_app_indicator, temp_file_name, ""); + app_indicator_set_attention_icon_full(global_app_indicator, temp_file_name, ""); + g_bytes_unref(bytes); + return FALSE; +} + +void _systray_menu_item_selected(int *id) { + systray_menu_item_selected(*id); +} + +GtkMenuItem* find_menu_by_id(int id) { + GList* it; + for(it = global_menu_items; it != NULL; it = it->next) { + MenuItemNode* item = (MenuItemNode*)(it->data); + if(item->menu_id == id) { + return GTK_MENU_ITEM(item->menu_item); + } + } + return NULL; +} + +// runs in main thread, should always return FALSE to prevent gtk to execute it again +gboolean do_add_or_update_menu_item(gpointer data) { + MenuItemInfo *mii = (MenuItemInfo*)data; + GList* it; + for(it = global_menu_items; it != NULL; it = it->next) { + MenuItemNode* item = (MenuItemNode*)(it->data); + if(item->menu_id == mii->menu_id) { + gtk_menu_item_set_label(GTK_MENU_ITEM(item->menu_item), mii->title); + + if (mii->isCheckable) { + // We need to block the "activate" event, to emulate the same behaviour as in the windows version + // A Check/Uncheck does change the checkbox, but does not trigger the checkbox menuItem channel + g_signal_handler_block(GTK_CHECK_MENU_ITEM(item->menu_item), item->signalHandlerId); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item->menu_item), mii->checked == 1); + g_signal_handler_unblock(GTK_CHECK_MENU_ITEM(item->menu_item), item->signalHandlerId); + } + break; + } + } + + // menu id doesn't exist, add new item + if(it == NULL) { + GtkWidget *menu_item; + if (mii->isCheckable) { + menu_item = gtk_check_menu_item_new_with_label(mii->title); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item), mii->checked == 1); + } else { + menu_item = gtk_menu_item_new_with_label(mii->title); + } + int *id = malloc(sizeof(int)); + *id = mii->menu_id; + long signalHandlerId = g_signal_connect_swapped( + G_OBJECT(menu_item), + "activate", + G_CALLBACK(_systray_menu_item_selected), + id + ); + + if (mii->parent_menu_id == 0) { + gtk_menu_shell_append(GTK_MENU_SHELL(global_tray_menu), menu_item); + } else { + GtkMenuItem* parentMenuItem = find_menu_by_id(mii->parent_menu_id); + GtkWidget* parentMenu = gtk_menu_item_get_submenu(parentMenuItem); + + if(parentMenu == NULL) { + parentMenu = gtk_menu_new(); + gtk_menu_item_set_submenu(parentMenuItem, parentMenu); + } + + gtk_menu_shell_append(GTK_MENU_SHELL(parentMenu), menu_item); + } + + MenuItemNode* new_item = malloc(sizeof(MenuItemNode)); + new_item->menu_id = mii->menu_id; + new_item->signalHandlerId = signalHandlerId; + new_item->menu_item = menu_item; + GList* new_node = malloc(sizeof(GList)); + new_node->data = new_item; + new_node->next = global_menu_items; + if(global_menu_items != NULL) { + global_menu_items->prev = new_node; + } + global_menu_items = new_node; + it = new_node; + } + GtkWidget* menu_item = GTK_WIDGET(((MenuItemNode*)(it->data))->menu_item); + gtk_widget_set_sensitive(menu_item, mii->disabled != 1); + gtk_widget_show(menu_item); + + free(mii->title); + free(mii->tooltip); + free(mii); + return FALSE; +} + +gboolean do_add_separator(gpointer data) { + GtkWidget *separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(global_tray_menu), separator); + gtk_widget_show(separator); + return FALSE; +} + +// runs in main thread, should always return FALSE to prevent gtk to execute it again +gboolean do_hide_menu_item(gpointer data) { + MenuItemInfo *mii = (MenuItemInfo*)data; + GList* it; + for(it = global_menu_items; it != NULL; it = it->next) { + MenuItemNode* item = (MenuItemNode*)(it->data); + if(item->menu_id == mii->menu_id){ + gtk_widget_hide(GTK_WIDGET(item->menu_item)); + break; + } + } + return FALSE; +} + +// runs in main thread, should always return FALSE to prevent gtk to execute it again +gboolean do_show_menu_item(gpointer data) { + MenuItemInfo *mii = (MenuItemInfo*)data; + GList* it; + for(it = global_menu_items; it != NULL; it = it->next) { + MenuItemNode* item = (MenuItemNode*)(it->data); + if(item->menu_id == mii->menu_id){ + gtk_widget_show(GTK_WIDGET(item->menu_item)); + break; + } + } + return FALSE; +} + +// runs in main thread, should always return FALSE to prevent gtk to execute it again +gboolean do_quit(gpointer data) { + _unlink_temp_file(); + // app indicator doesn't provide a way to remove it, hide it as a workaround + app_indicator_set_status(global_app_indicator, APP_INDICATOR_STATUS_PASSIVE); + gtk_main_quit(); + return FALSE; +} + +void setIcon(const char* iconBytes, int length, bool template) { + GBytes* bytes = g_bytes_new_static(iconBytes, length); + g_idle_add(do_set_icon, bytes); +} + +void setTitle(char* ctitle) { + app_indicator_set_title(global_app_indicator,ctitle); + app_indicator_set_label(global_app_indicator, ctitle, ""); + free(ctitle); +} + +void setTooltip(char* ctooltip) { + free(ctooltip); +} + +void setMenuItemIcon(const char* iconBytes, int length, int menuId, bool template) { +} + +void add_or_update_menu_item(int menu_id, int parent_menu_id, char* title, char* tooltip, short disabled, short checked, short isCheckable) { + MenuItemInfo *mii = malloc(sizeof(MenuItemInfo)); + mii->menu_id = menu_id; + mii->parent_menu_id = parent_menu_id; + mii->title = title; + mii->tooltip = tooltip; + mii->disabled = disabled; + mii->checked = checked; + mii->isCheckable = isCheckable; + g_idle_add(do_add_or_update_menu_item, mii); +} + +void add_separator(int menu_id) { + MenuItemInfo *mii = malloc(sizeof(MenuItemInfo)); + mii->menu_id = menu_id; + g_idle_add(do_add_separator, mii); +} + +void hide_menu_item(int menu_id) { + MenuItemInfo *mii = malloc(sizeof(MenuItemInfo)); + mii->menu_id = menu_id; + g_idle_add(do_hide_menu_item, mii); +} + +void show_menu_item(int menu_id) { + MenuItemInfo *mii = malloc(sizeof(MenuItemInfo)); + mii->menu_id = menu_id; + g_idle_add(do_show_menu_item, mii); +} + +void quit() { + g_idle_add(do_quit, NULL); +} diff --git a/vendor/github.com/kermieisinthehouse/systray/systray_linux.go b/vendor/github.com/kermieisinthehouse/systray/systray_linux.go new file mode 100644 index 000000000..1f508c7b4 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray_linux.go @@ -0,0 +1,29 @@ +package systray + +/* +#cgo darwin CFLAGS: -DDARWIN -x objective-c -fobjc-arc +#cgo darwin LDFLAGS: -framework Cocoa -framework WebKit + +#include "systray.h" +*/ +import "C" + +// SetTemplateIcon sets the systray icon as a template icon (on macOS), falling back +// to a regular icon on other platforms. +// templateIconBytes and iconBytes should be the content of .ico for windows and +// .ico/.jpg/.png for other platforms. +func SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) { + SetIcon(regularIconBytes) +} + +// SetIcon sets the icon of a menu item. Only works on macOS and Windows. +// iconBytes should be the content of .ico/.jpg/.png +func (item *MenuItem) SetIcon(iconBytes []byte) { +} + +// SetTemplateIcon sets the icon of a menu item as a template icon (on macOS). On Windows, it +// falls back to the regular icon bytes and on Linux it does nothing. +// templateIconBytes and regularIconBytes should be the content of .ico for windows and +// .ico/.jpg/.png for other platforms. +func (item *MenuItem) SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) { +} diff --git a/vendor/github.com/kermieisinthehouse/systray/systray_nonwindows.go b/vendor/github.com/kermieisinthehouse/systray/systray_nonwindows.go new file mode 100644 index 000000000..6f6e42929 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray_nonwindows.go @@ -0,0 +1,107 @@ +//go:build !windows +// +build !windows + +package systray + +/* +#cgo linux pkg-config: gtk+-3.0 ayatana-appindicator3-0.1 +#cgo darwin CFLAGS: -DDARWIN -x objective-c -fobjc-arc +#cgo darwin LDFLAGS: -framework Cocoa + +#include "systray.h" +*/ +import "C" + +import ( + "unsafe" +) + +func registerSystray() { + C.registerSystray() +} + +func nativeLoop() { + C.nativeLoop() +} + +func quit() { + C.quit() +} + +// SetIcon sets the systray icon. +// iconBytes should be the content of .ico for windows and .ico/.jpg/.png +// for other platforms. +func SetIcon(iconBytes []byte) { + cstr := (*C.char)(unsafe.Pointer(&iconBytes[0])) + C.setIcon(cstr, (C.int)(len(iconBytes)), false) +} + +// SetTitle sets the systray title, only available on Mac and Linux. +func SetTitle(title string) { + C.setTitle(C.CString(title)) +} + +// SetTooltip sets the systray tooltip to display on mouse hover of the tray icon, +// only available on Mac and Windows. +func SetTooltip(tooltip string) { + C.setTooltip(C.CString(tooltip)) +} + +func addOrUpdateMenuItem(item *MenuItem) { + var disabled C.short + if item.disabled { + disabled = 1 + } + var checked C.short + if item.checked { + checked = 1 + } + var isCheckable C.short + if item.isCheckable { + isCheckable = 1 + } + var parentID uint32 = 0 + if item.parent != nil { + parentID = item.parent.id + } + C.add_or_update_menu_item( + C.int(item.id), + C.int(parentID), + C.CString(item.title), + C.CString(item.tooltip), + disabled, + checked, + isCheckable, + ) +} + +func addSeparator(id uint32) { + C.add_separator(C.int(id)) +} + +func hideMenuItem(item *MenuItem) { + C.hide_menu_item( + C.int(item.id), + ) +} + +func showMenuItem(item *MenuItem) { + C.show_menu_item( + C.int(item.id), + ) +} + +//export systray_ready +func systray_ready() { + systrayReady() +} + +//export systray_on_exit +func systray_on_exit() { + systrayExit() +} + +//export systray_menu_item_selected +func systray_menu_item_selected(cID C.int) { + systrayMenuItemSelected(uint32(cID)) +} diff --git a/vendor/github.com/kermieisinthehouse/systray/systray_windows.go b/vendor/github.com/kermieisinthehouse/systray/systray_windows.go new file mode 100644 index 000000000..180da3004 --- /dev/null +++ b/vendor/github.com/kermieisinthehouse/systray/systray_windows.go @@ -0,0 +1,946 @@ +//go:build windows +// +build windows + +package systray + +import ( + "crypto/md5" + "encoding/hex" + "io/ioutil" + "log" + "os" + "path/filepath" + "sort" + "sync" + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +// Helpful sources: https://github.com/golang/exp/blob/master/shiny/driver/internal/win32 + +var ( + g32 = windows.NewLazySystemDLL("Gdi32.dll") + pCreateCompatibleBitmap = g32.NewProc("CreateCompatibleBitmap") + pCreateCompatibleDC = g32.NewProc("CreateCompatibleDC") + pDeleteDC = g32.NewProc("DeleteDC") + pSelectObject = g32.NewProc("SelectObject") + + k32 = windows.NewLazySystemDLL("Kernel32.dll") + pGetModuleHandle = k32.NewProc("GetModuleHandleW") + + s32 = windows.NewLazySystemDLL("Shell32.dll") + pShellNotifyIcon = s32.NewProc("Shell_NotifyIconW") + + u32 = windows.NewLazySystemDLL("User32.dll") + pCreateMenu = u32.NewProc("CreateMenu") + pCreatePopupMenu = u32.NewProc("CreatePopupMenu") + pCreateWindowEx = u32.NewProc("CreateWindowExW") + pDefWindowProc = u32.NewProc("DefWindowProcW") + pRemoveMenu = u32.NewProc("RemoveMenu") + pDestroyWindow = u32.NewProc("DestroyWindow") + pDispatchMessage = u32.NewProc("DispatchMessageW") + pDrawIconEx = u32.NewProc("DrawIconEx") + pGetCursorPos = u32.NewProc("GetCursorPos") + pGetDC = u32.NewProc("GetDC") + pGetMessage = u32.NewProc("GetMessageW") + pGetSystemMetrics = u32.NewProc("GetSystemMetrics") + pInsertMenuItem = u32.NewProc("InsertMenuItemW") + pLoadCursor = u32.NewProc("LoadCursorW") + pLoadIcon = u32.NewProc("LoadIconW") + pLoadImage = u32.NewProc("LoadImageW") + pPostMessage = u32.NewProc("PostMessageW") + pPostQuitMessage = u32.NewProc("PostQuitMessage") + pRegisterClass = u32.NewProc("RegisterClassExW") + pRegisterWindowMessage = u32.NewProc("RegisterWindowMessageW") + pReleaseDC = u32.NewProc("ReleaseDC") + pSetForegroundWindow = u32.NewProc("SetForegroundWindow") + pSetMenuInfo = u32.NewProc("SetMenuInfo") + pSetMenuItemInfo = u32.NewProc("SetMenuItemInfoW") + pShowWindow = u32.NewProc("ShowWindow") + pTrackPopupMenu = u32.NewProc("TrackPopupMenu") + pTranslateMessage = u32.NewProc("TranslateMessage") + pUnregisterClass = u32.NewProc("UnregisterClassW") + pUpdateWindow = u32.NewProc("UpdateWindow") +) + +// Contains window class information. +// It is used with the RegisterClassEx and GetClassInfoEx functions. +// https://msdn.microsoft.com/en-us/library/ms633577.aspx +type wndClassEx struct { + Size, Style uint32 + WndProc uintptr + ClsExtra, WndExtra int32 + Instance, Icon, Cursor, Background windows.Handle + MenuName, ClassName *uint16 + IconSm windows.Handle +} + +// Registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function. +// https://msdn.microsoft.com/en-us/library/ms633587.aspx +func (w *wndClassEx) register() error { + w.Size = uint32(unsafe.Sizeof(*w)) + res, _, err := pRegisterClass.Call(uintptr(unsafe.Pointer(w))) + if res == 0 { + return err + } + return nil +} + +// Unregisters a window class, freeing the memory required for the class. +// https://msdn.microsoft.com/en-us/library/ms644899.aspx +func (w *wndClassEx) unregister() error { + res, _, err := pUnregisterClass.Call( + uintptr(unsafe.Pointer(w.ClassName)), + uintptr(w.Instance), + ) + if res == 0 { + return err + } + return nil +} + +// Contains information that the system needs to display notifications in the notification area. +// Used by Shell_NotifyIcon. +// https://msdn.microsoft.com/en-us/library/windows/desktop/bb773352(v=vs.85).aspx +// https://msdn.microsoft.com/en-us/library/windows/desktop/bb762159 +type notifyIconData struct { + Size uint32 + Wnd windows.Handle + ID, Flags, CallbackMessage uint32 + Icon windows.Handle + Tip [128]uint16 + State, StateMask uint32 + Info [256]uint16 + Timeout, Version uint32 + InfoTitle [64]uint16 + InfoFlags uint32 + GuidItem windows.GUID + BalloonIcon windows.Handle +} + +func (nid *notifyIconData) add() error { + const NIM_ADD = 0x00000000 + res, _, err := pShellNotifyIcon.Call( + uintptr(NIM_ADD), + uintptr(unsafe.Pointer(nid)), + ) + if res == 0 { + return err + } + return nil +} + +func (nid *notifyIconData) modify() error { + const NIM_MODIFY = 0x00000001 + res, _, err := pShellNotifyIcon.Call( + uintptr(NIM_MODIFY), + uintptr(unsafe.Pointer(nid)), + ) + if res == 0 { + return err + } + return nil +} + +func (nid *notifyIconData) delete() error { + const NIM_DELETE = 0x00000002 + res, _, err := pShellNotifyIcon.Call( + uintptr(NIM_DELETE), + uintptr(unsafe.Pointer(nid)), + ) + if res == 0 { + return err + } + return nil +} + +// Contains information about a menu item. +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms647578(v=vs.85).aspx +type menuItemInfo struct { + Size, Mask, Type, State uint32 + ID uint32 + SubMenu, Checked, Unchecked windows.Handle + ItemData uintptr + TypeData *uint16 + Cch uint32 + BMPItem windows.Handle +} + +// The POINT structure defines the x- and y- coordinates of a point. +// https://msdn.microsoft.com/en-us/library/windows/desktop/dd162805(v=vs.85).aspx +type point struct { + X, Y int32 +} + +// Contains information about loaded resources +type winTray struct { + instance, + icon, + cursor, + window windows.Handle + + loadedImages map[string]windows.Handle + muLoadedImages sync.RWMutex + // menus keeps track of the submenus keyed by the menu item ID, plus 0 + // which corresponds to the main popup menu. + menus map[uint32]windows.Handle + muMenus sync.RWMutex + // menuOf keeps track of the menu each menu item belongs to. + menuOf map[uint32]windows.Handle + muMenuOf sync.RWMutex + // menuItemIcons maintains the bitmap of each menu item (if applies). It's + // needed to show the icon correctly when showing a previously hidden menu + // item again. + menuItemIcons map[uint32]windows.Handle + muMenuItemIcons sync.RWMutex + visibleItems map[uint32][]uint32 + muVisibleItems sync.RWMutex + + nid *notifyIconData + muNID sync.RWMutex + wcex *wndClassEx + + wmSystrayMessage, + wmTaskbarCreated uint32 +} + +// Loads an image from file and shows it in tray. +// Shell_NotifyIcon: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762159(v=vs.85).aspx +func (t *winTray) setIcon(src string) error { + const NIF_ICON = 0x00000002 + + h, err := t.loadIconFrom(src) + if err != nil { + return err + } + + t.muNID.Lock() + defer t.muNID.Unlock() + t.nid.Icon = h + t.nid.Flags |= NIF_ICON + t.nid.Size = uint32(unsafe.Sizeof(*t.nid)) + + return t.nid.modify() +} + +// Sets tooltip on icon. +// Shell_NotifyIcon: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762159(v=vs.85).aspx +func (t *winTray) setTooltip(src string) error { + const NIF_TIP = 0x00000004 + b, err := windows.UTF16FromString(src) + if err != nil { + return err + } + + t.muNID.Lock() + defer t.muNID.Unlock() + copy(t.nid.Tip[:], b[:]) + t.nid.Flags |= NIF_TIP + t.nid.Size = uint32(unsafe.Sizeof(*t.nid)) + + return t.nid.modify() +} + +var wt winTray + +// WindowProc callback function that processes messages sent to a window. +// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633573(v=vs.85).aspx +func (t *winTray) wndProc(hWnd windows.Handle, message uint32, wParam, lParam uintptr) (lResult uintptr) { + const ( + WM_RBUTTONUP = 0x0205 + WM_LBUTTONUP = 0x0202 + WM_COMMAND = 0x0111 + WM_ENDSESSION = 0x0016 + WM_CLOSE = 0x0010 + WM_DESTROY = 0x0002 + ) + switch message { + case WM_COMMAND: + menuItemId := int32(wParam) + // https://docs.microsoft.com/en-us/windows/win32/menurc/wm-command#menus + if menuItemId != -1 { + systrayMenuItemSelected(uint32(wParam)) + } + case WM_CLOSE: + pDestroyWindow.Call(uintptr(t.window)) + t.wcex.unregister() + case WM_DESTROY: + // same as WM_ENDSESSION, but throws 0 exit code after all + defer pPostQuitMessage.Call(uintptr(int32(0))) + fallthrough + case WM_ENDSESSION: + t.muNID.Lock() + if t.nid != nil { + t.nid.delete() + } + t.muNID.Unlock() + systrayExit() + case t.wmSystrayMessage: + switch lParam { + case WM_RBUTTONUP, WM_LBUTTONUP: + t.showMenu() + } + case t.wmTaskbarCreated: // on explorer.exe restarts + t.muNID.Lock() + t.nid.add() + t.muNID.Unlock() + default: + // Calls the default window procedure to provide default processing for any window messages that an application does not process. + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms633572(v=vs.85).aspx + lResult, _, _ = pDefWindowProc.Call( + uintptr(hWnd), + uintptr(message), + uintptr(wParam), + uintptr(lParam), + ) + } + return +} + +func (t *winTray) initInstance() error { + const IDI_APPLICATION = 32512 + const IDC_ARROW = 32512 // Standard arrow + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx + const SW_HIDE = 0 + const CW_USEDEFAULT = 0x80000000 + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx + const ( + WS_CAPTION = 0x00C00000 + WS_MAXIMIZEBOX = 0x00010000 + WS_MINIMIZEBOX = 0x00020000 + WS_OVERLAPPED = 0x00000000 + WS_SYSMENU = 0x00080000 + WS_THICKFRAME = 0x00040000 + + WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX + ) + // https://msdn.microsoft.com/en-us/library/windows/desktop/ff729176 + const ( + CS_HREDRAW = 0x0002 + CS_VREDRAW = 0x0001 + ) + const NIF_MESSAGE = 0x00000001 + + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644931(v=vs.85).aspx + const WM_USER = 0x0400 + + const ( + className = "SystrayClass" + windowName = "" + ) + + t.wmSystrayMessage = WM_USER + 1 + t.visibleItems = make(map[uint32][]uint32) + t.menus = make(map[uint32]windows.Handle) + t.menuOf = make(map[uint32]windows.Handle) + t.menuItemIcons = make(map[uint32]windows.Handle) + + taskbarEventNamePtr, _ := windows.UTF16PtrFromString("TaskbarCreated") + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644947 + res, _, err := pRegisterWindowMessage.Call( + uintptr(unsafe.Pointer(taskbarEventNamePtr)), + ) + t.wmTaskbarCreated = uint32(res) + + t.loadedImages = make(map[string]windows.Handle) + + instanceHandle, _, err := pGetModuleHandle.Call(0) + if instanceHandle == 0 { + return err + } + t.instance = windows.Handle(instanceHandle) + + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms648072(v=vs.85).aspx + iconHandle, _, err := pLoadIcon.Call(0, uintptr(IDI_APPLICATION)) + if iconHandle == 0 { + return err + } + t.icon = windows.Handle(iconHandle) + + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms648391(v=vs.85).aspx + cursorHandle, _, err := pLoadCursor.Call(0, uintptr(IDC_ARROW)) + if cursorHandle == 0 { + return err + } + t.cursor = windows.Handle(cursorHandle) + + classNamePtr, err := windows.UTF16PtrFromString(className) + if err != nil { + return err + } + + windowNamePtr, err := windows.UTF16PtrFromString(windowName) + if err != nil { + return err + } + + t.wcex = &wndClassEx{ + Style: CS_HREDRAW | CS_VREDRAW, + WndProc: windows.NewCallback(t.wndProc), + Instance: t.instance, + Icon: t.icon, + Cursor: t.cursor, + Background: windows.Handle(6), // (COLOR_WINDOW + 1) + ClassName: classNamePtr, + IconSm: t.icon, + } + if err := t.wcex.register(); err != nil { + return err + } + + windowHandle, _, err := pCreateWindowEx.Call( + uintptr(0), + uintptr(unsafe.Pointer(classNamePtr)), + uintptr(unsafe.Pointer(windowNamePtr)), + uintptr(WS_OVERLAPPEDWINDOW), + uintptr(CW_USEDEFAULT), + uintptr(CW_USEDEFAULT), + uintptr(CW_USEDEFAULT), + uintptr(CW_USEDEFAULT), + uintptr(0), + uintptr(0), + uintptr(t.instance), + uintptr(0), + ) + if windowHandle == 0 { + return err + } + t.window = windows.Handle(windowHandle) + + pShowWindow.Call( + uintptr(t.window), + uintptr(SW_HIDE), + ) + + pUpdateWindow.Call( + uintptr(t.window), + ) + + t.muNID.Lock() + defer t.muNID.Unlock() + t.nid = ¬ifyIconData{ + Wnd: windows.Handle(t.window), + ID: 100, + Flags: NIF_MESSAGE, + CallbackMessage: t.wmSystrayMessage, + } + t.nid.Size = uint32(unsafe.Sizeof(*t.nid)) + + return t.nid.add() +} + +func (t *winTray) createMenu() error { + const MIM_APPLYTOSUBMENUS = 0x80000000 // Settings apply to the menu and all of its submenus + + menuHandle, _, err := pCreatePopupMenu.Call() + if menuHandle == 0 { + return err + } + t.menus[0] = windows.Handle(menuHandle) + + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms647575(v=vs.85).aspx + mi := struct { + Size, Mask, Style, Max uint32 + Background windows.Handle + ContextHelpID uint32 + MenuData uintptr + }{ + Mask: MIM_APPLYTOSUBMENUS, + } + mi.Size = uint32(unsafe.Sizeof(mi)) + + res, _, err := pSetMenuInfo.Call( + uintptr(t.menus[0]), + uintptr(unsafe.Pointer(&mi)), + ) + if res == 0 { + return err + } + return nil +} + +func (t *winTray) convertToSubMenu(menuItemId uint32) (windows.Handle, error) { + const MIIM_SUBMENU = 0x00000004 + + res, _, err := pCreateMenu.Call() + if res == 0 { + return 0, err + } + menu := windows.Handle(res) + + mi := menuItemInfo{Mask: MIIM_SUBMENU, SubMenu: menu} + mi.Size = uint32(unsafe.Sizeof(mi)) + t.muMenuOf.RLock() + hMenu := t.menuOf[menuItemId] + t.muMenuOf.RUnlock() + res, _, err = pSetMenuItemInfo.Call( + uintptr(hMenu), + uintptr(menuItemId), + 0, + uintptr(unsafe.Pointer(&mi)), + ) + if res == 0 { + return 0, err + } + t.muMenus.Lock() + t.menus[menuItemId] = menu + t.muMenus.Unlock() + return menu, nil +} + +func (t *winTray) addOrUpdateMenuItem(menuItemId uint32, parentId uint32, title string, disabled, checked bool) error { + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms647578(v=vs.85).aspx + const ( + MIIM_FTYPE = 0x00000100 + MIIM_BITMAP = 0x00000080 + MIIM_STRING = 0x00000040 + MIIM_SUBMENU = 0x00000004 + MIIM_ID = 0x00000002 + MIIM_STATE = 0x00000001 + ) + const MFT_STRING = 0x00000000 + const ( + MFS_CHECKED = 0x00000008 + MFS_DISABLED = 0x00000003 + ) + titlePtr, err := windows.UTF16PtrFromString(title) + if err != nil { + return err + } + + mi := menuItemInfo{ + Mask: MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_STATE, + Type: MFT_STRING, + ID: uint32(menuItemId), + TypeData: titlePtr, + Cch: uint32(len(title)), + } + mi.Size = uint32(unsafe.Sizeof(mi)) + if disabled { + mi.State |= MFS_DISABLED + } + if checked { + mi.State |= MFS_CHECKED + } + t.muMenuItemIcons.RLock() + hIcon := t.menuItemIcons[menuItemId] + t.muMenuItemIcons.RUnlock() + if hIcon > 0 { + mi.Mask |= MIIM_BITMAP + mi.BMPItem = hIcon + } + + var res uintptr + t.muMenus.RLock() + menu, exists := t.menus[parentId] + t.muMenus.RUnlock() + if !exists { + menu, err = t.convertToSubMenu(parentId) + if err != nil { + return err + } + t.muMenus.Lock() + t.menus[parentId] = menu + t.muMenus.Unlock() + } else if t.getVisibleItemIndex(parentId, menuItemId) != -1 { + // We set the menu item info based on the menuID + res, _, err = pSetMenuItemInfo.Call( + uintptr(menu), + uintptr(menuItemId), + 0, + uintptr(unsafe.Pointer(&mi)), + ) + } + + if res == 0 { + // Menu item does not already exist, create it + t.muMenus.RLock() + submenu, exists := t.menus[menuItemId] + t.muMenus.RUnlock() + if exists { + mi.Mask |= MIIM_SUBMENU + mi.SubMenu = submenu + } + t.addToVisibleItems(parentId, menuItemId) + position := t.getVisibleItemIndex(parentId, menuItemId) + res, _, err = pInsertMenuItem.Call( + uintptr(menu), + uintptr(position), + 1, + uintptr(unsafe.Pointer(&mi)), + ) + if res == 0 { + t.delFromVisibleItems(parentId, menuItemId) + return err + } + t.muMenuOf.Lock() + t.menuOf[menuItemId] = menu + t.muMenuOf.Unlock() + } + + return nil +} + +func (t *winTray) addSeparatorMenuItem(menuItemId, parentId uint32) error { + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms647578(v=vs.85).aspx + const ( + MIIM_FTYPE = 0x00000100 + MIIM_ID = 0x00000002 + MIIM_STATE = 0x00000001 + ) + const MFT_SEPARATOR = 0x00000800 + + mi := menuItemInfo{ + Mask: MIIM_FTYPE | MIIM_ID | MIIM_STATE, + Type: MFT_SEPARATOR, + ID: uint32(menuItemId), + } + + mi.Size = uint32(unsafe.Sizeof(mi)) + + t.addToVisibleItems(parentId, menuItemId) + position := t.getVisibleItemIndex(parentId, menuItemId) + t.muMenus.RLock() + menu := uintptr(t.menus[parentId]) + t.muMenus.RUnlock() + res, _, err := pInsertMenuItem.Call( + menu, + uintptr(position), + 1, + uintptr(unsafe.Pointer(&mi)), + ) + if res == 0 { + return err + } + + return nil +} + +func (t *winTray) hideMenuItem(menuItemId, parentId uint32) error { + // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-removemenu + const MF_BYCOMMAND = 0x00000000 + const ERROR_SUCCESS syscall.Errno = 0 + + t.muMenus.RLock() + menu := uintptr(t.menus[parentId]) + t.muMenus.RUnlock() + res, _, err := pRemoveMenu.Call( + menu, + uintptr(menuItemId), + MF_BYCOMMAND, + ) + if res == 0 && err.(syscall.Errno) != ERROR_SUCCESS { + return err + } + t.delFromVisibleItems(parentId, menuItemId) + + return nil +} + +func (t *winTray) showMenu() error { + const ( + TPM_BOTTOMALIGN = 0x0020 + TPM_LEFTALIGN = 0x0000 + ) + p := point{} + res, _, err := pGetCursorPos.Call(uintptr(unsafe.Pointer(&p))) + if res == 0 { + return err + } + pSetForegroundWindow.Call(uintptr(t.window)) + + res, _, err = pTrackPopupMenu.Call( + uintptr(t.menus[0]), + TPM_BOTTOMALIGN|TPM_LEFTALIGN, + uintptr(p.X), + uintptr(p.Y), + 0, + uintptr(t.window), + 0, + ) + if res == 0 { + return err + } + + return nil +} + +func (t *winTray) delFromVisibleItems(parent, val uint32) { + t.muVisibleItems.Lock() + defer t.muVisibleItems.Unlock() + visibleItems := t.visibleItems[parent] + for i, itemval := range visibleItems { + if val == itemval { + t.visibleItems[parent] = append(visibleItems[:i], visibleItems[i+1:]...) + break + } + } +} + +func (t *winTray) addToVisibleItems(parent, val uint32) { + t.muVisibleItems.Lock() + defer t.muVisibleItems.Unlock() + if visibleItems, exists := t.visibleItems[parent]; !exists { + t.visibleItems[parent] = []uint32{val} + } else { + newvisible := append(visibleItems, val) + sort.Slice(newvisible, func(i, j int) bool { return newvisible[i] < newvisible[j] }) + t.visibleItems[parent] = newvisible + } +} + +func (t *winTray) getVisibleItemIndex(parent, val uint32) int { + t.muVisibleItems.RLock() + defer t.muVisibleItems.RUnlock() + for i, itemval := range t.visibleItems[parent] { + if val == itemval { + return i + } + } + return -1 +} + +// Loads an image from file to be shown in tray or menu item. +// LoadImage: https://msdn.microsoft.com/en-us/library/windows/desktop/ms648045(v=vs.85).aspx +func (t *winTray) loadIconFrom(src string) (windows.Handle, error) { + const IMAGE_ICON = 1 // Loads an icon + const LR_LOADFROMFILE = 0x00000010 // Loads the stand-alone image from the file + const LR_DEFAULTSIZE = 0x00000040 // Loads default-size icon for windows(SM_CXICON x SM_CYICON) if cx, cy are set to zero + + // Save and reuse handles of loaded images + t.muLoadedImages.RLock() + h, ok := t.loadedImages[src] + t.muLoadedImages.RUnlock() + if !ok { + srcPtr, err := windows.UTF16PtrFromString(src) + if err != nil { + return 0, err + } + res, _, err := pLoadImage.Call( + 0, + uintptr(unsafe.Pointer(srcPtr)), + IMAGE_ICON, + 0, + 0, + LR_LOADFROMFILE|LR_DEFAULTSIZE, + ) + if res == 0 { + return 0, err + } + h = windows.Handle(res) + t.muLoadedImages.Lock() + t.loadedImages[src] = h + t.muLoadedImages.Unlock() + } + return h, nil +} + +func (t *winTray) iconToBitmap(hIcon windows.Handle) (windows.Handle, error) { + const SM_CXSMICON = 49 + const SM_CYSMICON = 50 + const DI_NORMAL = 0x3 + hDC, _, err := pGetDC.Call(uintptr(0)) + if hDC == 0 { + return 0, err + } + defer pReleaseDC.Call(uintptr(0), hDC) + hMemDC, _, err := pCreateCompatibleDC.Call(hDC) + if hMemDC == 0 { + return 0, err + } + defer pDeleteDC.Call(hMemDC) + cx, _, _ := pGetSystemMetrics.Call(SM_CXSMICON) + cy, _, _ := pGetSystemMetrics.Call(SM_CYSMICON) + hMemBmp, _, err := pCreateCompatibleBitmap.Call(hDC, cx, cy) + if hMemBmp == 0 { + return 0, err + } + hOriginalBmp, _, _ := pSelectObject.Call(hMemDC, hMemBmp) + defer pSelectObject.Call(hMemDC, hOriginalBmp) + res, _, err := pDrawIconEx.Call(hMemDC, 0, 0, uintptr(hIcon), cx, cy, 0, uintptr(0), DI_NORMAL) + if res == 0 { + return 0, err + } + return windows.Handle(hMemBmp), nil +} + +func registerSystray() { + if err := wt.initInstance(); err != nil { + log.Printf("Unable to init instance: %v", err) + return + } + + if err := wt.createMenu(); err != nil { + log.Printf("Unable to create menu: %v", err) + return + } + + systrayReady() +} + +func nativeLoop() { + // Main message pump. + m := &struct { + WindowHandle windows.Handle + Message uint32 + Wparam uintptr + Lparam uintptr + Time uint32 + Pt point + }{} + for { + ret, _, err := pGetMessage.Call(uintptr(unsafe.Pointer(m)), 0, 0, 0) + + // If the function retrieves a message other than WM_QUIT, the return value is nonzero. + // If the function retrieves the WM_QUIT message, the return value is zero. + // If there is an error, the return value is -1 + // https://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx + switch int32(ret) { + case -1: + log.Printf("Error at message loop: %v", err) + return + case 0: + return + default: + pTranslateMessage.Call(uintptr(unsafe.Pointer(m))) + pDispatchMessage.Call(uintptr(unsafe.Pointer(m))) + } + } +} + +func quit() { + const WM_CLOSE = 0x0010 + + pPostMessage.Call( + uintptr(wt.window), + WM_CLOSE, + 0, + 0, + ) +} + +func iconBytesToFilePath(iconBytes []byte) (string, error) { + bh := md5.Sum(iconBytes) + dataHash := hex.EncodeToString(bh[:]) + iconFilePath := filepath.Join(os.TempDir(), "systray_temp_icon_"+dataHash) + + if _, err := os.Stat(iconFilePath); os.IsNotExist(err) { + if err := ioutil.WriteFile(iconFilePath, iconBytes, 0644); err != nil { + return "", err + } + } + return iconFilePath, nil +} + +// SetIcon sets the systray icon. +// iconBytes should be the content of .ico for windows and .ico/.jpg/.png +// for other platforms. +func SetIcon(iconBytes []byte) { + iconFilePath, err := iconBytesToFilePath(iconBytes) + if err != nil { + log.Printf("Unable to write icon data to temp file: %v", err) + return + } + if err := wt.setIcon(iconFilePath); err != nil { + log.Printf("Unable to set icon: %v", err) + return + } +} + +// SetTemplateIcon sets the systray icon as a template icon (on macOS), falling back +// to a regular icon on other platforms. +// templateIconBytes and iconBytes should be the content of .ico for windows and +// .ico/.jpg/.png for other platforms. +func SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) { + SetIcon(regularIconBytes) +} + +// SetTitle sets the systray title, only available on Mac and Linux. +func SetTitle(title string) { + // do nothing +} + +func (item *MenuItem) parentId() uint32 { + if item.parent != nil { + return uint32(item.parent.id) + } + return 0 +} + +// SetIcon sets the icon of a menu item. Only works on macOS and Windows. +// iconBytes should be the content of .ico/.jpg/.png +func (item *MenuItem) SetIcon(iconBytes []byte) { + iconFilePath, err := iconBytesToFilePath(iconBytes) + if err != nil { + log.Printf("Unable to write icon data to temp file: %v", err) + return + } + + h, err := wt.loadIconFrom(iconFilePath) + if err != nil { + log.Printf("Unable to load icon from temp file: %v", err) + return + } + + h, err = wt.iconToBitmap(h) + if err != nil { + log.Printf("Unable to convert icon to bitmap: %v", err) + return + } + wt.muMenuItemIcons.Lock() + wt.menuItemIcons[uint32(item.id)] = h + wt.muMenuItemIcons.Unlock() + + err = wt.addOrUpdateMenuItem(uint32(item.id), item.parentId(), item.title, item.disabled, item.checked) + if err != nil { + log.Printf("Unable to addOrUpdateMenuItem: %v", err) + return + } +} + +// SetTooltip sets the systray tooltip to display on mouse hover of the tray icon, +// only available on Mac and Windows. +func SetTooltip(tooltip string) { + if err := wt.setTooltip(tooltip); err != nil { + log.Printf("Unable to set tooltip: %v", err) + return + } +} + +func addOrUpdateMenuItem(item *MenuItem) { + err := wt.addOrUpdateMenuItem(uint32(item.id), item.parentId(), item.title, item.disabled, item.checked) + if err != nil { + log.Printf("Unable to addOrUpdateMenuItem: %v", err) + return + } +} + +// SetTemplateIcon sets the icon of a menu item as a template icon (on macOS). On Windows, it +// falls back to the regular icon bytes and on Linux it does nothing. +// templateIconBytes and regularIconBytes should be the content of .ico for windows and +// .ico/.jpg/.png for other platforms. +func (item *MenuItem) SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) { + item.SetIcon(regularIconBytes) +} + +func addSeparator(id uint32) { + err := wt.addSeparatorMenuItem(id, 0) + if err != nil { + log.Printf("Unable to addSeparator: %v", err) + return + } +} + +func hideMenuItem(item *MenuItem) { + err := wt.hideMenuItem(uint32(item.id), item.parentId()) + if err != nil { + log.Printf("Unable to hideMenuItem: %v", err) + return + } +} + +func showMenuItem(item *MenuItem) { + addOrUpdateMenuItem(item) +} diff --git a/vendor/github.com/nu7hatch/gouuid/.gitignore b/vendor/github.com/nu7hatch/gouuid/.gitignore new file mode 100644 index 000000000..f9d9cd8ab --- /dev/null +++ b/vendor/github.com/nu7hatch/gouuid/.gitignore @@ -0,0 +1,11 @@ +_obj +_test +*.6 +*.out +_testmain.go +\#* +.\#* +*.log +_cgo* +*.o +*.a diff --git a/vendor/github.com/nu7hatch/gouuid/COPYING b/vendor/github.com/nu7hatch/gouuid/COPYING new file mode 100644 index 000000000..d7849fd8f --- /dev/null +++ b/vendor/github.com/nu7hatch/gouuid/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2011 by Krzysztof Kowalik + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/nu7hatch/gouuid/README.md b/vendor/github.com/nu7hatch/gouuid/README.md new file mode 100644 index 000000000..e3d025d5e --- /dev/null +++ b/vendor/github.com/nu7hatch/gouuid/README.md @@ -0,0 +1,21 @@ +# Pure Go UUID implementation + +This package provides immutable UUID structs and the functions +NewV3, NewV4, NewV5 and Parse() for generating versions 3, 4 +and 5 UUIDs as specified in [RFC 4122](http://www.ietf.org/rfc/rfc4122.txt). + +## Installation + +Use the `go` tool: + + $ go get github.com/nu7hatch/gouuid + +## Usage + +See [documentation and examples](http://godoc.org/github.com/nu7hatch/gouuid) +for more information. + +## Copyright + +Copyright (C) 2011 by Krzysztof Kowalik . See [COPYING](https://github.com/nu7hatch/gouuid/tree/master/COPYING) +file for details. diff --git a/vendor/github.com/nu7hatch/gouuid/uuid.go b/vendor/github.com/nu7hatch/gouuid/uuid.go new file mode 100644 index 000000000..ac9623b72 --- /dev/null +++ b/vendor/github.com/nu7hatch/gouuid/uuid.go @@ -0,0 +1,173 @@ +// This package provides immutable UUID structs and the functions +// NewV3, NewV4, NewV5 and Parse() for generating versions 3, 4 +// and 5 UUIDs as specified in RFC 4122. +// +// Copyright (C) 2011 by Krzysztof Kowalik +package uuid + +import ( + "crypto/md5" + "crypto/rand" + "crypto/sha1" + "encoding/hex" + "errors" + "fmt" + "hash" + "regexp" +) + +// The UUID reserved variants. +const ( + ReservedNCS byte = 0x80 + ReservedRFC4122 byte = 0x40 + ReservedMicrosoft byte = 0x20 + ReservedFuture byte = 0x00 +) + +// The following standard UUIDs are for use with NewV3() or NewV5(). +var ( + NamespaceDNS, _ = ParseHex("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + NamespaceURL, _ = ParseHex("6ba7b811-9dad-11d1-80b4-00c04fd430c8") + NamespaceOID, _ = ParseHex("6ba7b812-9dad-11d1-80b4-00c04fd430c8") + NamespaceX500, _ = ParseHex("6ba7b814-9dad-11d1-80b4-00c04fd430c8") +) + +// Pattern used to parse hex string representation of the UUID. +// FIXME: do something to consider both brackets at one time, +// current one allows to parse string with only one opening +// or closing bracket. +const hexPattern = "^(urn\\:uuid\\:)?\\{?([a-z0-9]{8})-([a-z0-9]{4})-" + + "([1-5][a-z0-9]{3})-([a-z0-9]{4})-([a-z0-9]{12})\\}?$" + +var re = regexp.MustCompile(hexPattern) + +// A UUID representation compliant with specification in +// RFC 4122 document. +type UUID [16]byte + +// ParseHex creates a UUID object from given hex string +// representation. Function accepts UUID string in following +// formats: +// +// uuid.ParseHex("6ba7b814-9dad-11d1-80b4-00c04fd430c8") +// uuid.ParseHex("{6ba7b814-9dad-11d1-80b4-00c04fd430c8}") +// uuid.ParseHex("urn:uuid:6ba7b814-9dad-11d1-80b4-00c04fd430c8") +// +func ParseHex(s string) (u *UUID, err error) { + md := re.FindStringSubmatch(s) + if md == nil { + err = errors.New("Invalid UUID string") + return + } + hash := md[2] + md[3] + md[4] + md[5] + md[6] + b, err := hex.DecodeString(hash) + if err != nil { + return + } + u = new(UUID) + copy(u[:], b) + return +} + +// Parse creates a UUID object from given bytes slice. +func Parse(b []byte) (u *UUID, err error) { + if len(b) != 16 { + err = errors.New("Given slice is not valid UUID sequence") + return + } + u = new(UUID) + copy(u[:], b) + return +} + +// Generate a UUID based on the MD5 hash of a namespace identifier +// and a name. +func NewV3(ns *UUID, name []byte) (u *UUID, err error) { + if ns == nil { + err = errors.New("Invalid namespace UUID") + return + } + u = new(UUID) + // Set all bits to MD5 hash generated from namespace and name. + u.setBytesFromHash(md5.New(), ns[:], name) + u.setVariant(ReservedRFC4122) + u.setVersion(3) + return +} + +// Generate a random UUID. +func NewV4() (u *UUID, err error) { + u = new(UUID) + // Set all bits to randomly (or pseudo-randomly) chosen values. + _, err = rand.Read(u[:]) + if err != nil { + return + } + u.setVariant(ReservedRFC4122) + u.setVersion(4) + return +} + +// Generate a UUID based on the SHA-1 hash of a namespace identifier +// and a name. +func NewV5(ns *UUID, name []byte) (u *UUID, err error) { + u = new(UUID) + // Set all bits to truncated SHA1 hash generated from namespace + // and name. + u.setBytesFromHash(sha1.New(), ns[:], name) + u.setVariant(ReservedRFC4122) + u.setVersion(5) + return +} + +// Generate a MD5 hash of a namespace and a name, and copy it to the +// UUID slice. +func (u *UUID) setBytesFromHash(hash hash.Hash, ns, name []byte) { + hash.Write(ns[:]) + hash.Write(name) + copy(u[:], hash.Sum([]byte{})[:16]) +} + +// Set the two most significant bits (bits 6 and 7) of the +// clock_seq_hi_and_reserved to zero and one, respectively. +func (u *UUID) setVariant(v byte) { + switch v { + case ReservedNCS: + u[8] = (u[8] | ReservedNCS) & 0xBF + case ReservedRFC4122: + u[8] = (u[8] | ReservedRFC4122) & 0x7F + case ReservedMicrosoft: + u[8] = (u[8] | ReservedMicrosoft) & 0x3F + } +} + +// Variant returns the UUID Variant, which determines the internal +// layout of the UUID. This will be one of the constants: RESERVED_NCS, +// RFC_4122, RESERVED_MICROSOFT, RESERVED_FUTURE. +func (u *UUID) Variant() byte { + if u[8]&ReservedNCS == ReservedNCS { + return ReservedNCS + } else if u[8]&ReservedRFC4122 == ReservedRFC4122 { + return ReservedRFC4122 + } else if u[8]&ReservedMicrosoft == ReservedMicrosoft { + return ReservedMicrosoft + } + return ReservedFuture +} + +// Set the four most significant bits (bits 12 through 15) of the +// time_hi_and_version field to the 4-bit version number. +func (u *UUID) setVersion(v byte) { + u[6] = (u[6] & 0xF) | (v << 4) +} + +// Version returns a version number of the algorithm used to +// generate the UUID sequence. +func (u *UUID) Version() uint { + return uint(u[6] >> 4) +} + +// Returns unparsed version of the generated UUID sequence. +func (u *UUID) String() string { + return fmt.Sprintf("%x-%x-%x-%x-%x", u[0:4], u[4:6], u[6:8], u[8:10], u[10:]) +} diff --git a/vendor/github.com/rs/zerolog/README.md b/vendor/github.com/rs/zerolog/README.md index bd28c29a5..c7db02553 100644 --- a/vendor/github.com/rs/zerolog/README.md +++ b/vendor/github.com/rs/zerolog/README.md @@ -341,7 +341,7 @@ If your writer might be slow or not thread-safe and you need your log producers wr := diode.NewWriter(os.Stdout, 1000, 10*time.Millisecond, func(missed int) { fmt.Printf("Logger Dropped %d messages", missed) }) -log := zerolog.New(w) +log := zerolog.New(wr) log.Print("test") ``` @@ -435,7 +435,7 @@ c := alice.New() c = c.Append(hlog.NewHandler(log)) // Install some provided extra handler to set some request's context fields. -// Thanks to those handler, all our logs will come with some pre-populated fields. +// Thanks to that handler, all our logs will come with some prepopulated fields. c = c.Append(hlog.AccessHandler(func(r *http.Request, status, size int, duration time.Duration) { hlog.FromRequest(r).Info(). Str("method", r.Method). @@ -474,7 +474,7 @@ if err := http.ListenAndServe(":8080", nil); err != nil { Some settings can be changed and will by applied to all loggers: * `log.Logger`: You can set this value to customize the global logger (the one used by package level methods). -* `zerolog.SetGlobalLevel`: Can raise the minimum level of all loggers. Set this to `zerolog.Disabled` to disable logging altogether (quiet mode). +* `zerolog.SetGlobalLevel`: Can raise the minimum level of all loggers. Call this with `zerolog.Disabled` to disable logging altogether (quiet mode). * `zerolog.DisableSampling`: If argument is `true`, all sampled loggers will stop sampling and issue 100% of their log events. * `zerolog.TimestampFieldName`: Can be set to customize `Timestamp` field name. * `zerolog.LevelFieldName`: Can be set to customize level field name. @@ -497,13 +497,17 @@ Some settings can be changed and will by applied to all loggers: ### Advanced Fields -* `Err`: Takes an `error` and render it as a string using the `zerolog.ErrorFieldName` field name. -* `Timestamp`: Insert a timestamp field with `zerolog.TimestampFieldName` field name and formatted using `zerolog.TimeFieldFormat`. -* `Time`: Adds a field with the time formated with the `zerolog.TimeFieldFormat`. -* `Dur`: Adds a field with a `time.Duration`. +* `Err`: Takes an `error` and renders it as a string using the `zerolog.ErrorFieldName` field name. +* `Timestamp`: Inserts a timestamp field with `zerolog.TimestampFieldName` field name, formatted using `zerolog.TimeFieldFormat`. +* `Time`: Adds a field with time formatted with `zerolog.TimeFieldFormat`. +* `Dur`: Adds a field with `time.Duration`. * `Dict`: Adds a sub-key/value as a field of the event. +* `RawJSON`: Adds a field with an already encoded JSON (`[]byte`) +* `Hex`: Adds a field with value formatted as a hexadecimal string (`[]byte`) * `Interface`: Uses reflection to marshal the type. +Most fields are also available in the slice format (`Strs` for `[]string`, `Errs` for `[]error` etc.) + ## Binary Encoding In addition to the default JSON encoding, `zerolog` can produce binary logs using [CBOR](http://cbor.io) encoding. The choice of encoding can be decided at compile time using the build tag `binary_log` as follows: diff --git a/vendor/github.com/rs/zerolog/event.go b/vendor/github.com/rs/zerolog/event.go index 224799c8b..309b8d156 100644 --- a/vendor/github.com/rs/zerolog/event.go +++ b/vendor/github.com/rs/zerolog/event.go @@ -61,6 +61,7 @@ func newEvent(w LevelWriter, level Level) *Event { e.buf = enc.AppendBeginMarker(e.buf) e.w = w e.level = level + e.stack = false return e } @@ -317,7 +318,6 @@ func (e *Event) Errs(key string, errs []error) *Event { // Err adds the field "error" with serialized err to the *Event context. // If err is nil, no field is added. -// To customize the key name, change zerolog.ErrorFieldName. // // To customize the key name, change zerolog.ErrorFieldName. // diff --git a/vendor/github.com/rs/zerolog/internal/cbor/types_test_64.go b/vendor/github.com/rs/zerolog/internal/cbor/types_test_64.go new file mode 100644 index 000000000..728b17195 --- /dev/null +++ b/vendor/github.com/rs/zerolog/internal/cbor/types_test_64.go @@ -0,0 +1,35 @@ +// +build !386 + +package cbor + +import ( + "encoding/hex" + "testing" +) + +var enc2 = Encoder{} + +var integerTestCases_64bit = []struct { + val int + binary string +}{ + // Value in 8 bytes. + {0xabcd100000000, "\x1b\x00\x0a\xbc\xd1\x00\x00\x00\x00"}, + {1000000000000, "\x1b\x00\x00\x00\xe8\xd4\xa5\x10\x00"}, + // Value in 8 bytes. + {-0xabcd100000001, "\x3b\x00\x0a\xbc\xd1\x00\x00\x00\x00"}, + {-1000000000001, "\x3b\x00\x00\x00\xe8\xd4\xa5\x10\x00"}, + +} + +func TestAppendInt_64bit(t *testing.T) { + for _, tc := range integerTestCases_64bit { + s := enc2.AppendInt([]byte{}, tc.val) + got := string(s) + if got != tc.binary { + t.Errorf("AppendInt(0x%x)=0x%s, want: 0x%s", + tc.val, hex.EncodeToString(s), + hex.EncodeToString([]byte(tc.binary))) + } + } +} diff --git a/vendor/github.com/rs/zerolog/internal/json/base.go b/vendor/github.com/rs/zerolog/internal/json/base.go index d6f8839e3..62248e713 100644 --- a/vendor/github.com/rs/zerolog/internal/json/base.go +++ b/vendor/github.com/rs/zerolog/internal/json/base.go @@ -4,9 +4,8 @@ type Encoder struct{} // AppendKey appends a new key to the output JSON. func (e Encoder) AppendKey(dst []byte, key string) []byte { - if len(dst) > 1 && dst[len(dst)-1] != '{' { + if dst[len(dst)-1] != '{' { dst = append(dst, ',') } - dst = e.AppendString(dst, key) - return append(dst, ':') -} \ No newline at end of file + return append(e.AppendString(dst, key), ':') +} diff --git a/vendor/github.com/rs/zerolog/internal/json/types.go b/vendor/github.com/rs/zerolog/internal/json/types.go index bc8bc0957..d18624269 100644 --- a/vendor/github.com/rs/zerolog/internal/json/types.go +++ b/vendor/github.com/rs/zerolog/internal/json/types.go @@ -379,11 +379,10 @@ func (Encoder) AppendObjectData(dst []byte, o []byte) []byte { // to separate with existing content OR // 3. existing content has already other fields if o[0] == '{' { - if len(dst) == 0 { - o = o[1:] - } else { - o[0] = ',' + if len(dst) > 1 { + dst = append(dst, ',') } + o = o[1:] } else if len(dst) > 1 { dst = append(dst, ',') } diff --git a/vendor/github.com/rs/zerolog/log.go b/vendor/github.com/rs/zerolog/log.go index b1e7ac136..cbf68850e 100644 --- a/vendor/github.com/rs/zerolog/log.go +++ b/vendor/github.com/rs/zerolog/log.go @@ -234,6 +234,10 @@ func (l Logger) With() Context { l.context = make([]byte, 0, 500) if context != nil { l.context = append(l.context, context...) + } else { + // This is needed for AppendKey to not check len of input + // thus making it inlinable + l.context = enc.AppendBeginMarker(l.context) } return Context{l} } @@ -415,7 +419,7 @@ func (l *Logger) newEvent(level Level, done func(string)) *Event { if level != NoLevel { e.Str(LevelFieldName, LevelFieldMarshalFunc(level)) } - if l.context != nil && len(l.context) > 0 { + if l.context != nil && len(l.context) > 1 { e.buf = enc.AppendObjectData(e.buf, l.context) } return e diff --git a/vendor/github.com/rs/zerolog/writer.go b/vendor/github.com/rs/zerolog/writer.go index a58d71776..67605e2a7 100644 --- a/vendor/github.com/rs/zerolog/writer.go +++ b/vendor/github.com/rs/zerolog/writer.go @@ -29,7 +29,7 @@ type syncWriter struct { // This syncer can be the call to writer's Write method is not thread safe. // Note that os.File Write operation is using write() syscall which is supposed // to be thread-safe on POSIX systems. So there is no need to use this with -// os.File on such systems as zerolog guaranties to issue a single Write call +// os.File on such systems as zerolog guarantees to issue a single Write call // per log event. func SyncWriter(w io.Writer) io.Writer { if lw, ok := w.(LevelWriter); ok { diff --git a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go index 3298a87e9..fa7cdb9bc 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_gc_x86.go @@ -15,7 +15,3 @@ func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) // xgetbv with ecx = 0 is implemented in cpu_x86.s for gc compiler // and in cpu_gccgo.c for gccgo. func xgetbv() (eax, edx uint32) - -// darwinSupportsAVX512 is implemented in cpu_x86.s for gc compiler -// and in cpu_gccgo_x86.go for gccgo. -func darwinSupportsAVX512() bool diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go index 5ea287b7e..f5aacfc82 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -90,9 +90,10 @@ func archInit() { osSupportsAVX = isSet(1, eax) && isSet(2, eax) if runtime.GOOS == "darwin" { - // Check darwin commpage for AVX512 support. Necessary because: - // https://github.com/apple/darwin-xnu/blob/0a798f6738bc1db01281fc08ae024145e84df927/osfmk/i386/fpu.c#L175-L201 - osSupportsAVX512 = osSupportsAVX && darwinSupportsAVX512() + // Darwin doesn't save/restore AVX-512 mask registers correctly across signal handlers. + // Since users can't rely on mask register contents, let's not advertise AVX-512 support. + // See issue 49233. + osSupportsAVX512 = false } else { // Check if OPMASK and ZMM registers have OS support. osSupportsAVX512 = osSupportsAVX && isSet(5, eax) && isSet(6, eax) && isSet(7, eax) diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.s b/vendor/golang.org/x/sys/cpu/cpu_x86.s index b748ba52f..39acab2ff 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.s +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.s @@ -26,27 +26,3 @@ TEXT ·xgetbv(SB),NOSPLIT,$0-8 MOVL AX, eax+0(FP) MOVL DX, edx+4(FP) RET - -// func darwinSupportsAVX512() bool -TEXT ·darwinSupportsAVX512(SB), NOSPLIT, $0-1 - MOVB $0, ret+0(FP) // default to false -#ifdef GOOS_darwin // return if not darwin -#ifdef GOARCH_amd64 // return if not amd64 -// These values from: -// https://github.com/apple/darwin-xnu/blob/xnu-4570.1.46/osfmk/i386/cpu_capabilities.h -#define commpage64_base_address 0x00007fffffe00000 -#define commpage64_cpu_capabilities64 (commpage64_base_address+0x010) -#define commpage64_version (commpage64_base_address+0x01E) -#define hasAVX512F 0x0000004000000000 - MOVQ $commpage64_version, BX - CMPW (BX), $13 // cpu_capabilities64 undefined in versions < 13 - JL no_avx512 - MOVQ $commpage64_cpu_capabilities64, BX - MOVQ $hasAVX512F, CX - TESTQ (BX), CX - JZ no_avx512 - MOVB $1, ret+0(FP) -no_avx512: -#endif -#endif - RET diff --git a/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go b/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go index 87ae9d2a3..c9b69937a 100644 --- a/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go +++ b/vendor/golang.org/x/sys/plan9/pwd_go15_plan9.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.5 // +build go1.5 package plan9 diff --git a/vendor/golang.org/x/sys/plan9/pwd_plan9.go b/vendor/golang.org/x/sys/plan9/pwd_plan9.go index c07c798bc..98bf56b73 100644 --- a/vendor/golang.org/x/sys/plan9/pwd_plan9.go +++ b/vendor/golang.org/x/sys/plan9/pwd_plan9.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.5 // +build !go1.5 package plan9 diff --git a/vendor/golang.org/x/sys/plan9/race.go b/vendor/golang.org/x/sys/plan9/race.go index 42edd93ef..62377d2ff 100644 --- a/vendor/golang.org/x/sys/plan9/race.go +++ b/vendor/golang.org/x/sys/plan9/race.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build plan9 && race // +build plan9,race package plan9 diff --git a/vendor/golang.org/x/sys/plan9/race0.go b/vendor/golang.org/x/sys/plan9/race0.go index c89cf8fc0..f8da30876 100644 --- a/vendor/golang.org/x/sys/plan9/race0.go +++ b/vendor/golang.org/x/sys/plan9/race0.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build plan9 && !race // +build plan9,!race package plan9 diff --git a/vendor/golang.org/x/sys/plan9/str.go b/vendor/golang.org/x/sys/plan9/str.go index 4f7f9ad7c..55fa8d025 100644 --- a/vendor/golang.org/x/sys/plan9/str.go +++ b/vendor/golang.org/x/sys/plan9/str.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build plan9 // +build plan9 package plan9 diff --git a/vendor/golang.org/x/sys/plan9/syscall.go b/vendor/golang.org/x/sys/plan9/syscall.go index e7363a2f5..602473cba 100644 --- a/vendor/golang.org/x/sys/plan9/syscall.go +++ b/vendor/golang.org/x/sys/plan9/syscall.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build plan9 // +build plan9 // Package plan9 contains an interface to the low-level operating system diff --git a/vendor/golang.org/x/sys/plan9/syscall_plan9.go b/vendor/golang.org/x/sys/plan9/syscall_plan9.go index 84e147148..723b1f400 100644 --- a/vendor/golang.org/x/sys/plan9/syscall_plan9.go +++ b/vendor/golang.org/x/sys/plan9/syscall_plan9.go @@ -132,8 +132,10 @@ func Pipe(p []int) (err error) { } var pp [2]int32 err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return } diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go index 6819bc209..3f40b9bd7 100644 --- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_386.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -plan9 -tags plan9,386 syscall_plan9.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build plan9 && 386 // +build plan9,386 package plan9 diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go index 418abbbfc..0e6a96aa4 100644 --- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_amd64.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -plan9 -tags plan9,amd64 syscall_plan9.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build plan9 && amd64 // +build plan9,amd64 package plan9 diff --git a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go index 3e8a1a58c..244c501b7 100644 --- a/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go +++ b/vendor/golang.org/x/sys/plan9/zsyscall_plan9_arm.go @@ -1,6 +1,7 @@ // go run mksyscall.go -l32 -plan9 -tags plan9,arm syscall_plan9.go // Code generated by the command above; see README.md. DO NOT EDIT. +//go:build plan9 && arm // +build plan9,arm package plan9 diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/golang.org/x/sys/unix/README.md index 474efad0e..7d3c060e1 100644 --- a/vendor/golang.org/x/sys/unix/README.md +++ b/vendor/golang.org/x/sys/unix/README.md @@ -149,7 +149,7 @@ To add a constant, add the header that includes it to the appropriate variable. Then, edit the regex (if necessary) to match the desired constant. Avoid making the regex too broad to avoid matching unintended constants. -### mkmerge.go +### internal/mkmerge This program is used to extract duplicate const, func, and type declarations from the generated architecture-specific files listed below, and merge these diff --git a/vendor/golang.org/x/sys/unix/mkall.sh b/vendor/golang.org/x/sys/unix/mkall.sh index 396aadf86..ee7362348 100644 --- a/vendor/golang.org/x/sys/unix/mkall.sh +++ b/vendor/golang.org/x/sys/unix/mkall.sh @@ -50,7 +50,7 @@ if [[ "$GOOS" = "linux" ]]; then # Use the Docker-based build system # Files generated through docker (use $cmd so you can Ctl-C the build or run) $cmd docker build --tag generate:$GOOS $GOOS - $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")" && /bin/pwd):/build generate:$GOOS + $cmd docker run --interactive --tty --volume $(cd -- "$(dirname -- "$0")/.." && /bin/pwd):/build generate:$GOOS exit fi diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 0bcb8c322..a47b035f9 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -54,7 +54,7 @@ includes_AIX=' includes_Darwin=' #define _DARWIN_C_SOURCE -#define KERNEL +#define KERNEL 1 #define _DARWIN_USE_64_BIT_INODE #define __APPLE_USE_RFC_3542 #include @@ -75,6 +75,7 @@ includes_Darwin=' #include #include #include +#include #include #include #include @@ -82,6 +83,9 @@ includes_Darwin=' #include #include #include + +// for backwards compatibility because moved TIOCREMOTE to Kernel.framework after MacOSX12.0.sdk. +#define TIOCREMOTE 0x80047469 ' includes_DragonFly=' @@ -229,11 +233,13 @@ struct ltchars { #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -255,6 +261,7 @@ struct ltchars { #include #include #include +#include #include #include @@ -465,7 +472,6 @@ ccflags="$@" $2 !~ /^EQUIV_/ && $2 !~ /^EXPR_/ && $2 !~ /^EVIOC/ && - $2 !~ /^EV_/ && $2 ~ /^E[A-Z0-9_]+$/ || $2 ~ /^B[0-9_]+$/ || $2 ~ /^(OLD|NEW)DEV$/ || @@ -497,6 +503,7 @@ ccflags="$@" $2 ~ /^O?XTABS$/ || $2 ~ /^TC[IO](ON|OFF)$/ || $2 ~ /^IN_/ || + $2 ~ /^LANDLOCK_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || @@ -515,7 +522,7 @@ ccflags="$@" $2 ~ /^HW_MACHINE$/ || $2 ~ /^SYSCTL_VERS/ || $2 !~ "MNT_BITS" && - $2 ~ /^(MS|MNT|UMOUNT)_/ || + $2 ~ /^(MS|MNT|MOUNT|UMOUNT)_/ || $2 ~ /^NS_GET_/ || $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || $2 ~ /^(O|F|[ES]?FD|NAME|S|PTRACE|PT|TFD)_/ || @@ -600,6 +607,7 @@ ccflags="$@" $2 ~ /^MTD/ || $2 ~ /^OTP/ || $2 ~ /^MEM/ || + $2 ~ /^WG/ || $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/golang.org/x/sys/unix/sockcmsg_linux.go b/vendor/golang.org/x/sys/unix/sockcmsg_linux.go index 8bf457059..5f63147e0 100644 --- a/vendor/golang.org/x/sys/unix/sockcmsg_linux.go +++ b/vendor/golang.org/x/sys/unix/sockcmsg_linux.go @@ -34,3 +34,52 @@ func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) { ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0])) return &ucred, nil } + +// PktInfo4 encodes Inet4Pktinfo into a socket control message of type IP_PKTINFO. +func PktInfo4(info *Inet4Pktinfo) []byte { + b := make([]byte, CmsgSpace(SizeofInet4Pktinfo)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_IP + h.Type = IP_PKTINFO + h.SetLen(CmsgLen(SizeofInet4Pktinfo)) + *(*Inet4Pktinfo)(h.data(0)) = *info + return b +} + +// PktInfo6 encodes Inet6Pktinfo into a socket control message of type IPV6_PKTINFO. +func PktInfo6(info *Inet6Pktinfo) []byte { + b := make([]byte, CmsgSpace(SizeofInet6Pktinfo)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_IPV6 + h.Type = IPV6_PKTINFO + h.SetLen(CmsgLen(SizeofInet6Pktinfo)) + *(*Inet6Pktinfo)(h.data(0)) = *info + return b +} + +// ParseOrigDstAddr decodes a socket control message containing the original +// destination address. To receive such a message the IP_RECVORIGDSTADDR or +// IPV6_RECVORIGDSTADDR option must be enabled on the socket. +func ParseOrigDstAddr(m *SocketControlMessage) (Sockaddr, error) { + switch { + case m.Header.Level == SOL_IP && m.Header.Type == IP_ORIGDSTADDR: + pp := (*RawSockaddrInet4)(unsafe.Pointer(&m.Data[0])) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.Addr = pp.Addr + return sa, nil + + case m.Header.Level == SOL_IPV6 && m.Header.Type == IPV6_ORIGDSTADDR: + pp := (*RawSockaddrInet6)(unsafe.Pointer(&m.Data[0])) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + sa.Addr = pp.Addr + return sa, nil + + default: + return nil, EINVAL + } +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index d8efb715f..4f55c8d99 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -70,9 +70,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil } @@ -85,9 +83,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil } @@ -261,9 +257,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil case AF_INET6: @@ -272,9 +266,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } return nil, EAFNOSUPPORT @@ -385,6 +377,11 @@ func (w WaitStatus) TrapCause() int { return -1 } //sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys fsyncRange(fd int, how int, start int64, length int64) (err error) = fsync_range +func Fsync(fd int) error { + return fsyncRange(fd, O_SYNC, 0, 0) +} + /* * Direct access */ @@ -401,7 +398,6 @@ func (w WaitStatus) TrapCause() int { return -1 } //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) //sys Fdatasync(fd int) (err error) -//sys Fsync(fd int) (err error) // readdir_r //sysnb Getpgid(pid int) (pgid int, err error) @@ -523,8 +519,10 @@ func Pipe(p []int) (err error) { } var pp [2]_C_int err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return } diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 95ac3946b..0ce452326 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -163,9 +163,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } @@ -179,9 +177,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } @@ -210,9 +206,7 @@ func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Nlen = sa.Nlen sa.raw.Alen = sa.Alen sa.raw.Slen = sa.Slen - for i := 0; i < len(sa.raw.Data); i++ { - sa.raw.Data[i] = sa.Data[i] - } + sa.raw.Data = sa.Data return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil } @@ -228,9 +222,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa.Nlen = pp.Nlen sa.Alen = pp.Alen sa.Slen = pp.Slen - for i := 0; i < len(sa.Data); i++ { - sa.Data[i] = pp.Data[i] - } + sa.Data = pp.Data return sa, nil case AF_UNIX: @@ -262,9 +254,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil case AF_INET6: @@ -273,9 +263,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } return anyToSockaddrGOOS(fd, rsa) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 23f6b5760..0eaab9131 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -48,6 +48,30 @@ func (sa *SockaddrCtl) sockaddr() (unsafe.Pointer, _Socklen, error) { return unsafe.Pointer(&sa.raw), SizeofSockaddrCtl, nil } +// SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets. +// SockaddrVM provides access to Darwin VM sockets: a mechanism that enables +// bidirectional communication between a hypervisor and its guest virtual +// machines. +type SockaddrVM struct { + // CID and Port specify a context ID and port address for a VM socket. + // Guests have a unique CID, and hosts may have a well-known CID of: + // - VMADDR_CID_HYPERVISOR: refers to the hypervisor process. + // - VMADDR_CID_LOCAL: refers to local communication (loopback). + // - VMADDR_CID_HOST: refers to other processes on the host. + CID uint32 + Port uint32 + raw RawSockaddrVM +} + +func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Len = SizeofSockaddrVM + sa.raw.Family = AF_VSOCK + sa.raw.Port = sa.Port + sa.raw.Cid = sa.CID + + return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil +} + func anyToSockaddrGOOS(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { switch rsa.Addr.Family { case AF_SYSTEM: @@ -58,6 +82,13 @@ func anyToSockaddrGOOS(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa.Unit = pp.Sc_unit return sa, nil } + case AF_VSOCK: + pp := (*RawSockaddrVM)(unsafe.Pointer(rsa)) + sa := &SockaddrVM{ + CID: pp.Cid, + Port: pp.Port, + } + return sa, nil } return nil, EAFNOSUPPORT } @@ -128,8 +159,10 @@ func Pipe(p []int) (err error) { } var x [2]int32 err = pipe(&x) - p[0] = int(x[0]) - p[1] = int(x[1]) + if err == nil { + p[0] = int(x[0]) + p[1] = int(x[1]) + } return } @@ -399,8 +432,25 @@ func GetsockoptXucred(fd, level, opt int) (*Xucred, error) { return x, err } -func SysctlKinfoProcSlice(name string) ([]KinfoProc, error) { - mib, err := sysctlmib(name) +func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + var kinfo KinfoProc + n := uintptr(SizeofKinfoProc) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&kinfo)), &n, nil, 0); err != nil { + return nil, err + } + if n != SizeofKinfoProc { + return nil, EIO + } + return &kinfo, nil +} + +func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { + mib, err := sysctlmib(name, args...) if err != nil { return nil, err } @@ -433,6 +483,11 @@ func SysctlKinfoProcSlice(name string) ([]KinfoProc, error) { //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) +//sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) +//sys shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) +//sys shmdt(addr uintptr) (err error) +//sys shmget(key int, size int, flag int) (id int, err error) + /* * Exposed directly */ @@ -590,10 +645,6 @@ func SysctlKinfoProcSlice(name string) ([]KinfoProc, error) { // Msgget // Msgsnd // Msgrcv -// Shmat -// Shmctl -// Shmdt -// Shmget // Shm_open // Shm_unlink // Sem_open diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 5af108a50..2e37c3167 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -101,7 +101,10 @@ func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } - p[0], p[1], err = pipe() + r, w, err := pipe() + if err == nil { + p[0], p[1] = r, w + } return } @@ -114,7 +117,10 @@ func Pipe2(p []int, flags int) (err error) { var pp [2]_C_int // pipe2 on dragonfly takes an fds array as an argument, but still // returns the file descriptors. - p[0], p[1], err = pipe2(&pp, flags) + r, w, err := pipe2(&pp, flags) + if err == nil { + p[0], p[1] = r, w + } return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/vendor/golang.org/x/sys/unix/syscall_freebsd.go index 18c392cf3..2f650ae66 100644 --- a/vendor/golang.org/x/sys/unix/syscall_freebsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -110,8 +110,10 @@ func Pipe2(p []int, flags int) error { } var pp [2]_C_int err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go index 8c5357683..8d5f294c4 100644 --- a/vendor/golang.org/x/sys/unix/syscall_illumos.go +++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go @@ -162,6 +162,14 @@ func (l *Lifreq) GetLifruInt() int { return *(*int)(unsafe.Pointer(&l.Lifru[0])) } +func (l *Lifreq) SetLifruUint(d uint) { + *(*uint)(unsafe.Pointer(&l.Lifru[0])) = d +} + +func (l *Lifreq) GetLifruUint() uint { + return *(*uint)(unsafe.Pointer(&l.Lifru[0])) +} + func IoctlLifreq(fd int, req uint, l *Lifreq) error { return ioctl(fd, req, uintptr(unsafe.Pointer(l))) } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 2839435e3..f432b0684 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -13,7 +13,6 @@ package unix import ( "encoding/binary" - "runtime" "syscall" "unsafe" ) @@ -38,6 +37,13 @@ func Creat(path string, mode uint32) (fd int, err error) { return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) } +func EpollCreate(size int) (fd int, err error) { + if size <= 0 { + return -1, EINVAL + } + return EpollCreate1(0) +} + //sys FanotifyInit(flags uint, event_f_flags uint) (fd int, err error) //sys fanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname *byte) (err error) @@ -66,6 +72,10 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return fchmodat(dirfd, path, mode) } +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + //sys ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL //sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL @@ -109,6 +119,25 @@ func Openat2(dirfd int, path string, how *OpenHow) (fd int, err error) { return openat2(dirfd, path, how, SizeofOpenHow) } +func Pipe(p []int) error { + return Pipe2(p, 0) +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err := pipe2(&pp, flags) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } + return err +} + //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { @@ -118,6 +147,15 @@ func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error return ppoll(&fds[0], len(fds), timeout, sigmask) } +func Poll(fds []PollFd, timeout int) (n int, err error) { + var ts *Timespec + if timeout >= 0 { + ts = new(Timespec) + *ts = NsecToTimespec(int64(timeout) * 1e6) + } + return Ppoll(fds, ts, nil) +} + //sys Readlinkat(dirfd int, path string, buf []byte) (n int, err error) func Readlink(path string, buf []byte) (n int, err error) { @@ -168,27 +206,7 @@ func Utimes(path string, tv []Timeval) error { //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) func UtimesNano(path string, ts []Timespec) error { - if ts == nil { - err := utimensat(AT_FDCWD, path, nil, 0) - if err != ENOSYS { - return err - } - return utimes(path, nil) - } - if len(ts) != 2 { - return EINVAL - } - err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) - if err != ENOSYS { - return err - } - // If the utimensat syscall isn't available (utimensat was added to Linux - // in 2.6.22, Released, 8 July 2007) then fall back to utimes - var tv [2]Timeval - for i := 0; i < 2; i++ { - tv[i] = NsecToTimeval(TimespecToNsec(ts[i])) - } - return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) + return UtimesNanoAt(AT_FDCWD, path, ts, 0) } func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { @@ -356,9 +374,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil } @@ -371,9 +387,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil } @@ -422,9 +436,7 @@ func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Hatype = sa.Hatype sa.raw.Pkttype = sa.Pkttype sa.raw.Halen = sa.Halen - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil } @@ -839,12 +851,10 @@ func (sa *SockaddrTIPC) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Addr == nil { return nil, 0, EINVAL } - sa.raw.Family = AF_TIPC sa.raw.Scope = int8(sa.Scope) sa.raw.Addrtype = sa.Addr.tipcAddrtype() sa.raw.Addr = sa.Addr.tipcAddr() - return unsafe.Pointer(&sa.raw), SizeofSockaddrTIPC, nil } @@ -858,9 +868,7 @@ type SockaddrL2TPIP struct { func (sa *SockaddrL2TPIP) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Family = AF_INET sa.raw.Conn_id = sa.ConnId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP, nil } @@ -876,9 +884,7 @@ func (sa *SockaddrL2TPIP6) sockaddr() (unsafe.Pointer, _Socklen, error) { sa.raw.Family = AF_INET6 sa.raw.Conn_id = sa.ConnId sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrL2TPIP6, nil } @@ -974,9 +980,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa.Hatype = pp.Hatype sa.Pkttype = pp.Pkttype sa.Halen = pp.Halen - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil case AF_UNIX: @@ -1015,18 +1019,14 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { pp := (*RawSockaddrL2TPIP)(unsafe.Pointer(rsa)) sa := new(SockaddrL2TPIP) sa.ConnId = pp.Conn_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil default: pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } @@ -1042,9 +1042,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa := new(SockaddrL2TPIP6) sa.ConnId = pp.Conn_id sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil default: pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) @@ -1052,9 +1050,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } @@ -1229,11 +1225,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { func Accept(fd int) (nfd int, sa Sockaddr, err error) { var rsa RawSockaddrAny var len _Socklen = SizeofSockaddrAny - // Try accept4 first for Android, then try accept for kernel older than 2.6.28 nfd, err = accept4(fd, &rsa, &len, 0) - if err == ENOSYS { - nfd, err = accept(fd, &rsa, &len) - } if err != nil { return } @@ -1785,6 +1777,16 @@ func Mount(source string, target string, fstype string, flags uintptr, data stri return mount(source, target, fstype, flags, datap) } +//sys mountSetattr(dirfd int, pathname string, flags uint, attr *MountAttr, size uintptr) (err error) = SYS_MOUNT_SETATTR + +// MountSetattr is a wrapper for mount_setattr(2). +// https://man7.org/linux/man-pages/man2/mount_setattr.2.html +// +// Requires kernel >= 5.12. +func MountSetattr(dirfd int, pathname string, flags uint, attr *MountAttr) error { + return mountSetattr(dirfd, pathname, flags, attr, unsafe.Sizeof(*attr)) +} + func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { if raceenabled { raceReleaseMerge(unsafe.Pointer(&ioSync)) @@ -1816,11 +1818,7 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e //sys Dup(oldfd int) (fd int, err error) func Dup2(oldfd, newfd int) error { - // Android O and newer blocks dup2; riscv and arm64 don't implement dup2. - if runtime.GOOS == "android" || runtime.GOARCH == "riscv64" || runtime.GOARCH == "arm64" { - return Dup3(oldfd, newfd, 0) - } - return dup2(oldfd, newfd) + return Dup3(oldfd, newfd, 0) } //sys Dup3(oldfd int, newfd int, flags int) (err error) @@ -2308,6 +2306,14 @@ type RemoteIovec struct { //sys ProcessVMReadv(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags uint) (n int, err error) = SYS_PROCESS_VM_READV //sys ProcessVMWritev(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags uint) (n int, err error) = SYS_PROCESS_VM_WRITEV +//sys PidfdOpen(pid int, flags int) (fd int, err error) = SYS_PIDFD_OPEN +//sys PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) = SYS_PIDFD_GETFD + +//sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) +//sys shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) +//sys shmdt(addr uintptr) (err error) +//sys shmget(key int, size int, flag int) (id int, err error) + /* * Unimplemented */ @@ -2389,10 +2395,6 @@ type RemoteIovec struct { // SetRobustList // SetThreadArea // SetTidAddress -// Shmat -// Shmctl -// Shmdt -// Shmget // Sigaltstack // Swapoff // Swapon diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index 91317d749..5f757e8aa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -19,36 +19,8 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } -//sysnb pipe(p *[2]_C_int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - // 64-bit file system and 32-bit uid calls // (386 default is 32-bit file system and 16-bit uid). -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 //sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 @@ -59,7 +31,6 @@ func Pipe2(p []int, flags int) (err error) { //sysnb Geteuid() (euid int) = SYS_GETEUID32 //sysnb Getgid() (gid int) = SYS_GETGID32 //sysnb Getuid() (uid int) = SYS_GETUID32 -//sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 @@ -381,12 +352,3 @@ func (cmsg *Cmsghdr) SetLen(length int) { func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint32(length) } - -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 85cd97da0..4299125aa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -7,8 +7,6 @@ package unix -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -21,17 +19,6 @@ package unix //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) -//sysnb inotifyInit() (fd int, err error) - -func InotifyInit() (fd int, err error) { - // First try inotify_init1, because Android's seccomp policy blocks the latter. - fd, err = InotifyInit1(0) - if err == ENOSYS { - fd, err = inotifyInit() - } - return -} - //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) @@ -126,32 +113,6 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } -//sysnb pipe(p *[2]_C_int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - func (r *PtraceRegs) PC() uint64 { return r.Rip } func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } @@ -176,15 +137,6 @@ func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint64(length) } -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} - //sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index b961a620e..79edeb9cb 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -19,36 +19,6 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } -//sysnb pipe(p *[2]_C_int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - // Try pipe2 first for Android O, then try pipe for kernel 2.6.23. - err = pipe2(&pp, 0) - if err == ENOSYS { - err = pipe(&pp) - } - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { newoffset, errno := seek(fd, offset, whence) if errno != 0 { @@ -76,8 +46,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { // 64-bit file system and 32-bit uid calls // (16-bit uid calls are not always supported in newer kernels) -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 @@ -86,7 +54,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { //sysnb Geteuid() (euid int) = SYS_GETEUID32 //sysnb Getgid() (gid int) = SYS_GETGID32 //sysnb Getuid() (uid int) = SYS_GETUID32 -//sysnb InotifyInit() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 @@ -260,15 +227,6 @@ func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint32(length) } -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} - //sys armSyncFileRange(fd int, flags int, off int64, n int64) (err error) = SYS_ARM_SYNC_FILE_RANGE func SyncFileRange(fd int, off int64, n int64, flags int) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 4b977ba44..862890de2 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -9,13 +9,6 @@ package unix import "unsafe" -func EpollCreate(size int) (fd int, err error) { - if size <= 0 { - return -1, EINVAL - } - return EpollCreate1(0) -} - //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -145,30 +138,6 @@ func utimes(path string, tv *[2]Timeval) (err error) { return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) } -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, 0) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - // Getrlimit prefers the prlimit64 system call. See issue 38604. func Getrlimit(resource int, rlim *Rlimit) error { err := Prlimit(0, resource, nil, rlim) @@ -211,31 +180,11 @@ func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint64(length) } -func InotifyInit() (fd int, err error) { - return InotifyInit1(0) -} - -// dup2 exists because func Dup3 in syscall_linux.go references -// it in an unreachable path. dup2 isn't available on arm64. -func dup2(oldfd int, newfd int) error - func Pause() error { _, err := ppoll(nil, 0, nil, nil) return err } -func Poll(fds []PollFd, timeout int) (n int, err error) { - var ts *Timespec - if timeout >= 0 { - ts = new(Timespec) - *ts = NsecToTimespec(int64(timeout) * 1e6) - } - if len(fds) == 0 { - return ppoll(nil, 0, ts, nil) - } - return ppoll(&fds[0], len(fds), ts, nil) -} - //sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 27aee81d9..8932e34ad 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -8,8 +8,6 @@ package unix -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -94,30 +92,6 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, 0) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - func Ioperm(from int, num int, on int) (err error) { return ENOSYS } @@ -220,16 +194,3 @@ func (cmsg *Cmsghdr) SetLen(length int) { func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint64(length) } - -func InotifyInit() (fd int, err error) { - return InotifyInit1(0) -} - -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 21d74e2fb..7821c25d9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -15,8 +15,6 @@ import ( func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -60,7 +58,6 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) -//sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) @@ -113,29 +110,6 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: int32(sec), Usec: int32(usec)} } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe() (p1 int, p2 int, err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - p[0], p[1], err = pipe() - return -} - //sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { @@ -232,12 +206,3 @@ func (cmsg *Cmsghdr) SetLen(length int) { func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint32(length) } - -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index 6f1fc581e..c5053a0f0 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -12,8 +12,6 @@ import ( "unsafe" ) -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 @@ -23,7 +21,6 @@ import ( //sysnb Geteuid() (euid int) //sysnb Getgid() (gid int) //sysnb Getuid() (uid int) -//sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) @@ -218,41 +215,6 @@ func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint32(length) } -//sysnb pipe(p *[2]_C_int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} - //sys syncFileRange2(fd int, flags int, off int64, n int64) (err error) = SYS_SYNC_FILE_RANGE2 func SyncFileRange(fd int, off int64, n int64, flags int) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go index 5259a5fea..25786c421 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -8,8 +8,6 @@ package unix -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -22,7 +20,6 @@ package unix //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT //sysnb Getuid() (uid int) -//sysnb InotifyInit() (fd int, err error) //sys Ioperm(from int, num int, on int) (err error) //sys Iopl(level int) (err error) //sys Lchown(path string, uid int, gid int) (err error) @@ -104,41 +101,6 @@ func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint64(length) } -//sysnb pipe(p *[2]_C_int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} - //sys syncFileRange2(fd int, flags int, off int64, n int64) (err error) = SYS_SYNC_FILE_RANGE2 func SyncFileRange(fd int, off int64, n int64, flags int) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 8ef821e5d..6f9f71041 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -9,13 +9,6 @@ package unix import "unsafe" -func EpollCreate(size int) (fd int, err error) { - if size <= 0 { - return -1, EINVAL - } - return EpollCreate1(0) -} - //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -144,30 +137,6 @@ func utimes(path string, tv *[2]Timeval) (err error) { return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) } -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, 0) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - func (r *PtraceRegs) PC() uint64 { return r.Pc } func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } @@ -192,27 +161,11 @@ func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint64(length) } -func InotifyInit() (fd int, err error) { - return InotifyInit1(0) -} - func Pause() error { _, err := ppoll(nil, 0, nil, nil) return err } -func Poll(fds []PollFd, timeout int) (n int, err error) { - var ts *Timespec - if timeout >= 0 { - ts = new(Timespec) - *ts = NsecToTimespec(int64(timeout) * 1e6) - } - if len(fds) == 0 { - return ppoll(nil, 0, ts, nil) - } - return ppoll(&fds[0], len(fds), ts, nil) -} - func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { return Renameat2(olddirfd, oldpath, newdirfd, newpath, 0) } @@ -229,7 +182,3 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } - -// dup2 exists because func Dup3 in syscall_linux.go references -// it in an unreachable path. dup2 isn't available on arm64. -func dup2(oldfd int, newfd int) error diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go index a1c0574b5..6aa59cb27 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -11,8 +11,6 @@ import ( "unsafe" ) -//sys dup2(oldfd int, newfd int) (err error) -//sysnb EpollCreate(size int) (fd int, err error) //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 //sys Fchown(fd int, uid int, gid int) (err error) @@ -25,7 +23,6 @@ import ( //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) -//sysnb InotifyInit() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) //sys Pause() (err error) @@ -77,30 +74,6 @@ func setTimeval(sec, usec int64) Timeval { return Timeval{Sec: sec, Usec: usec} } -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - func Ioperm(from int, num int, on int) (err error) { return ENOSYS } @@ -324,15 +297,6 @@ func Shutdown(s, how int) error { return nil } -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} - //sys kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error { diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go index de14b8898..bbe8d174f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go @@ -9,7 +9,6 @@ package unix //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) //sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 -//sys dup2(oldfd int, newfd int) (err error) //sys Fchown(fd int, uid int, gid int) (err error) //sys Fstat(fd int, stat *Stat_t) (err error) //sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64 @@ -20,7 +19,6 @@ package unix //sysnb Getgid() (gid int) //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) //sysnb Getuid() (uid int) -//sysnb InotifyInit() (fd int, err error) //sys Lchown(path string, uid int, gid int) (err error) //sys Listen(s int, n int) (err error) //sys Lstat(path string, stat *Stat_t) (err error) @@ -119,38 +117,3 @@ func (cmsg *Cmsghdr) SetLen(length int) { func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) { rsa.Service_name_len = uint64(length) } - -//sysnb pipe(p *[2]_C_int) (err error) - -func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) (err error) { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err = pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return -} - -//sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) - -func Poll(fds []PollFd, timeout int) (n int, err error) { - if len(fds) == 0 { - return poll(nil, 0, timeout) - } - return poll(&fds[0], len(fds), timeout) -} diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 853d5f0f4..696fed496 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -110,14 +110,8 @@ func direntNamlen(buf []byte) (uint64, bool) { return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen)) } -//sysnb pipe() (fd1 int, fd2 int, err error) - func Pipe(p []int) (err error) { - if len(p) != 2 { - return EINVAL - } - p[0], p[1], err = pipe() - return + return Pipe2(p, 0) } //sysnb pipe2(p *[2]_C_int, flags int) (err error) @@ -128,8 +122,10 @@ func Pipe2(p []int, flags int) error { } var pp [2]_C_int err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index 22b550385..11b1d419d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -87,8 +87,10 @@ func Pipe2(p []int, flags int) error { } var pp [2]_C_int err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index d2a6495c7..5c813921e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -66,8 +66,10 @@ func Pipe(p []int) (err error) { if n != 0 { return err } - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return nil } @@ -79,8 +81,10 @@ func Pipe2(p []int, flags int) error { } var pp [2]_C_int err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return err } @@ -92,9 +96,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil } @@ -107,9 +109,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil } @@ -417,9 +417,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil case AF_INET6: @@ -428,9 +426,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } return nil, EAFNOSUPPORT diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index 1ffd8bfcf..f8616f454 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -67,9 +67,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } @@ -83,9 +81,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil } @@ -144,9 +140,7 @@ func anyToSockaddr(_ int, rsa *RawSockaddrAny) (Sockaddr, error) { sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil case AF_INET6: @@ -155,9 +149,7 @@ func anyToSockaddr(_ int, rsa *RawSockaddrAny) (Sockaddr, error) { p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } return nil, EAFNOSUPPORT @@ -587,8 +579,10 @@ func Pipe(p []int) (err error) { } var pp [2]_C_int err = pipe(&pp) - p[0] = int(pp[0]) - p[1] = int(pp[1]) + if err == nil { + p[0] = int(pp[0]) + p[1] = int(pp[1]) + } return } diff --git a/vendor/golang.org/x/sys/unix/sysvshm_linux.go b/vendor/golang.org/x/sys/unix/sysvshm_linux.go new file mode 100644 index 000000000..2c3a4437f --- /dev/null +++ b/vendor/golang.org/x/sys/unix/sysvshm_linux.go @@ -0,0 +1,21 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux +// +build linux + +package unix + +import "runtime" + +// SysvShmCtl performs control operations on the shared memory segment +// specified by id. +func SysvShmCtl(id, cmd int, desc *SysvShmDesc) (result int, err error) { + if runtime.GOARCH == "arm" || + runtime.GOARCH == "mips64" || runtime.GOARCH == "mips64le" { + cmd |= ipc_64 + } + + return shmctl(id, cmd, desc) +} diff --git a/vendor/golang.org/x/sys/unix/sysvshm_unix.go b/vendor/golang.org/x/sys/unix/sysvshm_unix.go new file mode 100644 index 000000000..0bb4c8de5 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/sysvshm_unix.go @@ -0,0 +1,61 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build (darwin && !ios) || linux +// +build darwin,!ios linux + +package unix + +import ( + "unsafe" + + "golang.org/x/sys/internal/unsafeheader" +) + +// SysvShmAttach attaches the Sysv shared memory segment associated with the +// shared memory identifier id. +func SysvShmAttach(id int, addr uintptr, flag int) ([]byte, error) { + addr, errno := shmat(id, addr, flag) + if errno != nil { + return nil, errno + } + + // Retrieve the size of the shared memory to enable slice creation + var info SysvShmDesc + + _, err := SysvShmCtl(id, IPC_STAT, &info) + if err != nil { + // release the shared memory if we can't find the size + + // ignoring error from shmdt as there's nothing sensible to return here + shmdt(addr) + return nil, err + } + + // Use unsafe to convert addr into a []byte. + // TODO: convert to unsafe.Slice once we can assume Go 1.17 + var b []byte + hdr := (*unsafeheader.Slice)(unsafe.Pointer(&b)) + hdr.Data = unsafe.Pointer(addr) + hdr.Cap = int(info.Segsz) + hdr.Len = int(info.Segsz) + return b, nil +} + +// SysvShmDetach unmaps the shared memory slice returned from SysvShmAttach. +// +// It is not safe to use the slice after calling this function. +func SysvShmDetach(data []byte) error { + if len(data) == 0 { + return EINVAL + } + + return shmdt(uintptr(unsafe.Pointer(&data[0]))) +} + +// SysvShmGet returns the Sysv shared memory identifier associated with key. +// If the IPC_CREAT flag is specified a new segment is created. +func SysvShmGet(key, size, flag int) (id int, err error) { + return shmget(key, size, flag) +} diff --git a/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go b/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go new file mode 100644 index 000000000..71bddefdb --- /dev/null +++ b/vendor/golang.org/x/sys/unix/sysvshm_unix_other.go @@ -0,0 +1,14 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build darwin && !ios +// +build darwin,!ios + +package unix + +// SysvShmCtl performs control operations on the shared memory segment +// specified by id. +func SysvShmCtl(id, cmd int, desc *SysvShmDesc) (result int, err error) { + return shmctl(id, cmd, desc) +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index a3a45fec5..476a1c7e7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -12,1556 +12,1582 @@ package unix import "syscall" const ( - AF_APPLETALK = 0x10 - AF_CCITT = 0xa - AF_CHAOS = 0x5 - AF_CNT = 0x15 - AF_COIP = 0x14 - AF_DATAKIT = 0x9 - AF_DECnet = 0xc - AF_DLI = 0xd - AF_E164 = 0x1c - AF_ECMA = 0x8 - AF_HYLINK = 0xf - AF_IEEE80211 = 0x25 - AF_IMPLINK = 0x3 - AF_INET = 0x2 - AF_INET6 = 0x1e - AF_IPX = 0x17 - AF_ISDN = 0x1c - AF_ISO = 0x7 - AF_LAT = 0xe - AF_LINK = 0x12 - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_NATM = 0x1f - AF_NDRV = 0x1b - AF_NETBIOS = 0x21 - AF_NS = 0x6 - AF_OSI = 0x7 - AF_PPP = 0x22 - AF_PUP = 0x4 - AF_RESERVED_36 = 0x24 - AF_ROUTE = 0x11 - AF_SIP = 0x18 - AF_SNA = 0xb - AF_SYSTEM = 0x20 - AF_SYS_CONTROL = 0x2 - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_UTUN = 0x26 - AF_VSOCK = 0x28 - ALTWERASE = 0x200 - ATTR_BIT_MAP_COUNT = 0x5 - ATTR_CMN_ACCESSMASK = 0x20000 - ATTR_CMN_ACCTIME = 0x1000 - ATTR_CMN_ADDEDTIME = 0x10000000 - ATTR_CMN_BKUPTIME = 0x2000 - ATTR_CMN_CHGTIME = 0x800 - ATTR_CMN_CRTIME = 0x200 - ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 - ATTR_CMN_DEVID = 0x2 - ATTR_CMN_DOCUMENT_ID = 0x100000 - ATTR_CMN_ERROR = 0x20000000 - ATTR_CMN_EXTENDED_SECURITY = 0x400000 - ATTR_CMN_FILEID = 0x2000000 - ATTR_CMN_FLAGS = 0x40000 - ATTR_CMN_FNDRINFO = 0x4000 - ATTR_CMN_FSID = 0x4 - ATTR_CMN_FULLPATH = 0x8000000 - ATTR_CMN_GEN_COUNT = 0x80000 - ATTR_CMN_GRPID = 0x10000 - ATTR_CMN_GRPUUID = 0x1000000 - ATTR_CMN_MODTIME = 0x400 - ATTR_CMN_NAME = 0x1 - ATTR_CMN_NAMEDATTRCOUNT = 0x80000 - ATTR_CMN_NAMEDATTRLIST = 0x100000 - ATTR_CMN_OBJID = 0x20 - ATTR_CMN_OBJPERMANENTID = 0x40 - ATTR_CMN_OBJTAG = 0x10 - ATTR_CMN_OBJTYPE = 0x8 - ATTR_CMN_OWNERID = 0x8000 - ATTR_CMN_PARENTID = 0x4000000 - ATTR_CMN_PAROBJID = 0x80 - ATTR_CMN_RETURNED_ATTRS = 0x80000000 - ATTR_CMN_SCRIPT = 0x100 - ATTR_CMN_SETMASK = 0x51c7ff00 - ATTR_CMN_USERACCESS = 0x200000 - ATTR_CMN_UUID = 0x800000 - ATTR_CMN_VALIDMASK = 0xffffffff - ATTR_CMN_VOLSETMASK = 0x6700 - ATTR_FILE_ALLOCSIZE = 0x4 - ATTR_FILE_CLUMPSIZE = 0x10 - ATTR_FILE_DATAALLOCSIZE = 0x400 - ATTR_FILE_DATAEXTENTS = 0x800 - ATTR_FILE_DATALENGTH = 0x200 - ATTR_FILE_DEVTYPE = 0x20 - ATTR_FILE_FILETYPE = 0x40 - ATTR_FILE_FORKCOUNT = 0x80 - ATTR_FILE_FORKLIST = 0x100 - ATTR_FILE_IOBLOCKSIZE = 0x8 - ATTR_FILE_LINKCOUNT = 0x1 - ATTR_FILE_RSRCALLOCSIZE = 0x2000 - ATTR_FILE_RSRCEXTENTS = 0x4000 - ATTR_FILE_RSRCLENGTH = 0x1000 - ATTR_FILE_SETMASK = 0x20 - ATTR_FILE_TOTALSIZE = 0x2 - ATTR_FILE_VALIDMASK = 0x37ff - ATTR_VOL_ALLOCATIONCLUMP = 0x40 - ATTR_VOL_ATTRIBUTES = 0x40000000 - ATTR_VOL_CAPABILITIES = 0x20000 - ATTR_VOL_DIRCOUNT = 0x400 - ATTR_VOL_ENCODINGSUSED = 0x10000 - ATTR_VOL_FILECOUNT = 0x200 - ATTR_VOL_FSTYPE = 0x1 - ATTR_VOL_INFO = 0x80000000 - ATTR_VOL_IOBLOCKSIZE = 0x80 - ATTR_VOL_MAXOBJCOUNT = 0x800 - ATTR_VOL_MINALLOCATION = 0x20 - ATTR_VOL_MOUNTEDDEVICE = 0x8000 - ATTR_VOL_MOUNTFLAGS = 0x4000 - ATTR_VOL_MOUNTPOINT = 0x1000 - ATTR_VOL_NAME = 0x2000 - ATTR_VOL_OBJCOUNT = 0x100 - ATTR_VOL_QUOTA_SIZE = 0x10000000 - ATTR_VOL_RESERVED_SIZE = 0x20000000 - ATTR_VOL_SETMASK = 0x80002000 - ATTR_VOL_SIGNATURE = 0x2 - ATTR_VOL_SIZE = 0x4 - ATTR_VOL_SPACEAVAIL = 0x10 - ATTR_VOL_SPACEFREE = 0x8 - ATTR_VOL_UUID = 0x40000 - ATTR_VOL_VALIDMASK = 0xf007ffff - B0 = 0x0 - B110 = 0x6e - B115200 = 0x1c200 - B1200 = 0x4b0 - B134 = 0x86 - B14400 = 0x3840 - B150 = 0x96 - B1800 = 0x708 - B19200 = 0x4b00 - B200 = 0xc8 - B230400 = 0x38400 - B2400 = 0x960 - B28800 = 0x7080 - B300 = 0x12c - B38400 = 0x9600 - B4800 = 0x12c0 - B50 = 0x32 - B57600 = 0xe100 - B600 = 0x258 - B7200 = 0x1c20 - B75 = 0x4b - B76800 = 0x12c00 - B9600 = 0x2580 - BIOCFLUSH = 0x20004268 - BIOCGBLEN = 0x40044266 - BIOCGDLT = 0x4004426a - BIOCGDLTLIST = 0xc00c4279 - BIOCGETIF = 0x4020426b - BIOCGHDRCMPLT = 0x40044274 - BIOCGRSIG = 0x40044272 - BIOCGRTIMEOUT = 0x4010426e - BIOCGSEESENT = 0x40044276 - BIOCGSTATS = 0x4008426f - BIOCIMMEDIATE = 0x80044270 - BIOCPROMISC = 0x20004269 - BIOCSBLEN = 0xc0044266 - BIOCSDLT = 0x80044278 - BIOCSETF = 0x80104267 - BIOCSETFNR = 0x8010427e - BIOCSETIF = 0x8020426c - BIOCSHDRCMPLT = 0x80044275 - BIOCSRSIG = 0x80044273 - BIOCSRTIMEOUT = 0x8010426d - BIOCSSEESENT = 0x80044277 - BIOCVERSION = 0x40044271 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALIGNMENT = 0x4 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXBUFSIZE = 0x80000 - BPF_MAXINSNS = 0x200 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINBUFSIZE = 0x20 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RELEASE = 0x30bb6 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x8000 - BSDLY = 0x8000 - CFLUSH = 0xf - CLOCAL = 0x8000 - CLOCK_MONOTONIC = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_MONOTONIC_RAW_APPROX = 0x5 - CLOCK_PROCESS_CPUTIME_ID = 0xc - CLOCK_REALTIME = 0x0 - CLOCK_THREAD_CPUTIME_ID = 0x10 - CLOCK_UPTIME_RAW = 0x8 - CLOCK_UPTIME_RAW_APPROX = 0x9 - CLONE_NOFOLLOW = 0x1 - CLONE_NOOWNERCOPY = 0x2 - CR0 = 0x0 - CR1 = 0x1000 - CR2 = 0x2000 - CR3 = 0x3000 - CRDLY = 0x3000 - CREAD = 0x800 - CRTSCTS = 0x30000 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x14 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - CTLIOCGINFO = 0xc0644e03 - CTL_HW = 0x6 - CTL_KERN = 0x1 - CTL_MAXNAME = 0xc - CTL_NET = 0x4 - DLT_A429 = 0xb8 - DLT_A653_ICM = 0xb9 - DLT_AIRONET_HEADER = 0x78 - DLT_AOS = 0xde - DLT_APPLE_IP_OVER_IEEE1394 = 0x8a - DLT_ARCNET = 0x7 - DLT_ARCNET_LINUX = 0x81 - DLT_ATM_CLIP = 0x13 - DLT_ATM_RFC1483 = 0xb - DLT_AURORA = 0x7e - DLT_AX25 = 0x3 - DLT_AX25_KISS = 0xca - DLT_BACNET_MS_TP = 0xa5 - DLT_BLUETOOTH_HCI_H4 = 0xbb - DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 - DLT_CAN20B = 0xbe - DLT_CAN_SOCKETCAN = 0xe3 - DLT_CHAOS = 0x5 - DLT_CHDLC = 0x68 - DLT_CISCO_IOS = 0x76 - DLT_C_HDLC = 0x68 - DLT_C_HDLC_WITH_DIR = 0xcd - DLT_DBUS = 0xe7 - DLT_DECT = 0xdd - DLT_DOCSIS = 0x8f - DLT_DVB_CI = 0xeb - DLT_ECONET = 0x73 - DLT_EN10MB = 0x1 - DLT_EN3MB = 0x2 - DLT_ENC = 0x6d - DLT_ERF = 0xc5 - DLT_ERF_ETH = 0xaf - DLT_ERF_POS = 0xb0 - DLT_FC_2 = 0xe0 - DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 - DLT_FDDI = 0xa - DLT_FLEXRAY = 0xd2 - DLT_FRELAY = 0x6b - DLT_FRELAY_WITH_DIR = 0xce - DLT_GCOM_SERIAL = 0xad - DLT_GCOM_T1E1 = 0xac - DLT_GPF_F = 0xab - DLT_GPF_T = 0xaa - DLT_GPRS_LLC = 0xa9 - DLT_GSMTAP_ABIS = 0xda - DLT_GSMTAP_UM = 0xd9 - DLT_HHDLC = 0x79 - DLT_IBM_SN = 0x92 - DLT_IBM_SP = 0x91 - DLT_IEEE802 = 0x6 - DLT_IEEE802_11 = 0x69 - DLT_IEEE802_11_RADIO = 0x7f - DLT_IEEE802_11_RADIO_AVS = 0xa3 - DLT_IEEE802_15_4 = 0xc3 - DLT_IEEE802_15_4_LINUX = 0xbf - DLT_IEEE802_15_4_NOFCS = 0xe6 - DLT_IEEE802_15_4_NONASK_PHY = 0xd7 - DLT_IEEE802_16_MAC_CPS = 0xbc - DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 - DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 - DLT_IPMB_LINUX = 0xd1 - DLT_IPNET = 0xe2 - DLT_IPOIB = 0xf2 - DLT_IPV4 = 0xe4 - DLT_IPV6 = 0xe5 - DLT_IP_OVER_FC = 0x7a - DLT_JUNIPER_ATM1 = 0x89 - DLT_JUNIPER_ATM2 = 0x87 - DLT_JUNIPER_ATM_CEMIC = 0xee - DLT_JUNIPER_CHDLC = 0xb5 - DLT_JUNIPER_ES = 0x84 - DLT_JUNIPER_ETHER = 0xb2 - DLT_JUNIPER_FIBRECHANNEL = 0xea - DLT_JUNIPER_FRELAY = 0xb4 - DLT_JUNIPER_GGSN = 0x85 - DLT_JUNIPER_ISM = 0xc2 - DLT_JUNIPER_MFR = 0x86 - DLT_JUNIPER_MLFR = 0x83 - DLT_JUNIPER_MLPPP = 0x82 - DLT_JUNIPER_MONITOR = 0xa4 - DLT_JUNIPER_PIC_PEER = 0xae - DLT_JUNIPER_PPP = 0xb3 - DLT_JUNIPER_PPPOE = 0xa7 - DLT_JUNIPER_PPPOE_ATM = 0xa8 - DLT_JUNIPER_SERVICES = 0x88 - DLT_JUNIPER_SRX_E2E = 0xe9 - DLT_JUNIPER_ST = 0xc8 - DLT_JUNIPER_VP = 0xb7 - DLT_JUNIPER_VS = 0xe8 - DLT_LAPB_WITH_DIR = 0xcf - DLT_LAPD = 0xcb - DLT_LIN = 0xd4 - DLT_LINUX_EVDEV = 0xd8 - DLT_LINUX_IRDA = 0x90 - DLT_LINUX_LAPD = 0xb1 - DLT_LINUX_PPP_WITHDIRECTION = 0xa6 - DLT_LINUX_SLL = 0x71 - DLT_LOOP = 0x6c - DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x10a - DLT_MATCHING_MIN = 0x68 - DLT_MFR = 0xb6 - DLT_MOST = 0xd3 - DLT_MPEG_2_TS = 0xf3 - DLT_MPLS = 0xdb - DLT_MTP2 = 0x8c - DLT_MTP2_WITH_PHDR = 0x8b - DLT_MTP3 = 0x8d - DLT_MUX27010 = 0xec - DLT_NETANALYZER = 0xf0 - DLT_NETANALYZER_TRANSPARENT = 0xf1 - DLT_NFC_LLCP = 0xf5 - DLT_NFLOG = 0xef - DLT_NG40 = 0xf4 - DLT_NULL = 0x0 - DLT_PCI_EXP = 0x7d - DLT_PFLOG = 0x75 - DLT_PFSYNC = 0x12 - DLT_PPI = 0xc0 - DLT_PPP = 0x9 - DLT_PPP_BSDOS = 0x10 - DLT_PPP_ETHER = 0x33 - DLT_PPP_PPPD = 0xa6 - DLT_PPP_SERIAL = 0x32 - DLT_PPP_WITH_DIR = 0xcc - DLT_PPP_WITH_DIRECTION = 0xa6 - DLT_PRISM_HEADER = 0x77 - DLT_PRONET = 0x4 - DLT_RAIF1 = 0xc6 - DLT_RAW = 0xc - DLT_RIO = 0x7c - DLT_SCCP = 0x8e - DLT_SITA = 0xc4 - DLT_SLIP = 0x8 - DLT_SLIP_BSDOS = 0xf - DLT_STANAG_5066_D_PDU = 0xed - DLT_SUNATM = 0x7b - DLT_SYMANTEC_FIREWALL = 0x63 - DLT_TZSP = 0x80 - DLT_USB = 0xba - DLT_USB_DARWIN = 0x10a - DLT_USB_LINUX = 0xbd - DLT_USB_LINUX_MMAPPED = 0xdc - DLT_USER0 = 0x93 - DLT_USER1 = 0x94 - DLT_USER10 = 0x9d - DLT_USER11 = 0x9e - DLT_USER12 = 0x9f - DLT_USER13 = 0xa0 - DLT_USER14 = 0xa1 - DLT_USER15 = 0xa2 - DLT_USER2 = 0x95 - DLT_USER3 = 0x96 - DLT_USER4 = 0x97 - DLT_USER5 = 0x98 - DLT_USER6 = 0x99 - DLT_USER7 = 0x9a - DLT_USER8 = 0x9b - DLT_USER9 = 0x9c - DLT_WIHART = 0xdf - DLT_X2E_SERIAL = 0xd5 - DLT_X2E_XORAYA = 0xd6 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - EVFILT_AIO = -0x3 - EVFILT_EXCEPT = -0xf - EVFILT_FS = -0x9 - EVFILT_MACHPORT = -0x8 - EVFILT_PROC = -0x5 - EVFILT_READ = -0x1 - EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0x11 - EVFILT_THREADMARKER = 0x11 - EVFILT_TIMER = -0x7 - EVFILT_USER = -0xa - EVFILT_VM = -0xc - EVFILT_VNODE = -0x4 - EVFILT_WRITE = -0x2 - EV_ADD = 0x1 - EV_CLEAR = 0x20 - EV_DELETE = 0x2 - EV_DISABLE = 0x8 - EV_DISPATCH = 0x80 - EV_DISPATCH2 = 0x180 - EV_ENABLE = 0x4 - EV_EOF = 0x8000 - EV_ERROR = 0x4000 - EV_FLAG0 = 0x1000 - EV_FLAG1 = 0x2000 - EV_ONESHOT = 0x10 - EV_OOBAND = 0x2000 - EV_POLL = 0x1000 - EV_RECEIPT = 0x40 - EV_SYSFLAGS = 0xf000 - EV_UDATA_SPECIFIC = 0x100 - EV_VANISHED = 0x200 - EXTA = 0x4b00 - EXTB = 0x9600 - EXTPROC = 0x800 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x4000 - FFDLY = 0x4000 - FLUSHO = 0x800000 - FSOPT_ATTR_CMN_EXTENDED = 0x20 - FSOPT_NOFOLLOW = 0x1 - FSOPT_NOINMEMUPDATE = 0x2 - FSOPT_PACK_INVAL_ATTRS = 0x8 - FSOPT_REPORT_FULLSIZE = 0x4 - FSOPT_RETURN_REALDEV = 0x200 - F_ADDFILESIGS = 0x3d - F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 - F_ADDFILESIGS_INFO = 0x67 - F_ADDFILESIGS_RETURN = 0x61 - F_ADDFILESUPPL = 0x68 - F_ADDSIGS = 0x3b - F_ALLOCATEALL = 0x4 - F_ALLOCATECONTIG = 0x2 - F_BARRIERFSYNC = 0x55 - F_CHECK_LV = 0x62 - F_CHKCLEAN = 0x29 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x43 - F_FINDSIGS = 0x4e - F_FLUSH_DATA = 0x28 - F_FREEZE_FS = 0x35 - F_FULLFSYNC = 0x33 - F_GETCODEDIR = 0x48 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLK = 0x7 - F_GETLKPID = 0x42 - F_GETNOSIGPIPE = 0x4a - F_GETOWN = 0x5 - F_GETPATH = 0x32 - F_GETPATH_MTMINFO = 0x47 - F_GETPATH_NOFIRMLINK = 0x66 - F_GETPROTECTIONCLASS = 0x3f - F_GETPROTECTIONLEVEL = 0x4d - F_GETSIGSINFO = 0x69 - F_GLOBAL_NOCACHE = 0x37 - F_LOG2PHYS = 0x31 - F_LOG2PHYS_EXT = 0x41 - F_NOCACHE = 0x30 - F_NODIRECT = 0x3e - F_OK = 0x0 - F_PATHPKG_CHECK = 0x34 - F_PEOFPOSMODE = 0x3 - F_PREALLOCATE = 0x2a - F_PUNCHHOLE = 0x63 - F_RDADVISE = 0x2c - F_RDAHEAD = 0x2d - F_RDLCK = 0x1 - F_SETBACKINGSTORE = 0x46 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLK = 0x8 - F_SETLKW = 0x9 - F_SETLKWTIMEOUT = 0xa - F_SETNOSIGPIPE = 0x49 - F_SETOWN = 0x6 - F_SETPROTECTIONCLASS = 0x40 - F_SETSIZE = 0x2b - F_SINGLE_WRITER = 0x4c - F_SPECULATIVE_READ = 0x65 - F_THAW_FS = 0x36 - F_TRANSCODEKEY = 0x4b - F_TRIM_ACTIVE_FILE = 0x64 - F_UNLCK = 0x2 - F_VOLPOSMODE = 0x4 - F_WRLCK = 0x3 - HUPCL = 0x4000 - HW_MACHINE = 0x1 - ICANON = 0x100 - ICMP6_FILTER = 0x12 - ICRNL = 0x100 - IEXTEN = 0x400 - IFF_ALLMULTI = 0x200 - IFF_ALTPHYS = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_LINK0 = 0x1000 - IFF_LINK1 = 0x2000 - IFF_LINK2 = 0x4000 - IFF_LOOPBACK = 0x8 - IFF_MULTICAST = 0x8000 - IFF_NOARP = 0x80 - IFF_NOTRAILERS = 0x20 - IFF_OACTIVE = 0x400 - IFF_POINTOPOINT = 0x10 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SIMPLEX = 0x800 - IFF_UP = 0x1 - IFNAMSIZ = 0x10 - IFT_1822 = 0x2 - IFT_6LOWPAN = 0x40 - IFT_AAL5 = 0x31 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ATM = 0x25 - IFT_BRIDGE = 0xd1 - IFT_CARP = 0xf8 - IFT_CELLULAR = 0xff - IFT_CEPT = 0x13 - IFT_DS3 = 0x1e - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_ETHER = 0x6 - IFT_FAITH = 0x38 - IFT_FDDI = 0xf - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_GIF = 0x37 - IFT_HDH1822 = 0x3 - IFT_HIPPI = 0x2f - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IEEE1394 = 0x90 - IFT_IEEE8023ADLAG = 0x88 - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88026 = 0xa - IFT_L2VLAN = 0x87 - IFT_LAPB = 0x10 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_NSIP = 0x1b - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PDP = 0xff - IFT_PFLOG = 0xf5 - IFT_PFSYNC = 0xf6 - IFT_PKTAP = 0xfe - IFT_PPP = 0x17 - IFT_PROPMUX = 0x36 - IFT_PROPVIRTUAL = 0x35 - IFT_PTPSERIAL = 0x16 - IFT_RS232 = 0x21 - IFT_SDLC = 0x11 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_STARLAN = 0xb - IFT_STF = 0x39 - IFT_T1 = 0x12 - IFT_ULTRA = 0x1d - IFT_V35 = 0x2d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLASSD_HOST = 0xfffffff - IN_CLASSD_NET = 0xf0000000 - IN_CLASSD_NSHIFT = 0x1c - IN_LINKLOCALNETNUM = 0xa9fe0000 - IN_LOOPBACKNET = 0x7f - IPPROTO_3PC = 0x22 - IPPROTO_ADFS = 0x44 - IPPROTO_AH = 0x33 - IPPROTO_AHIP = 0x3d - IPPROTO_APES = 0x63 - IPPROTO_ARGUS = 0xd - IPPROTO_AX25 = 0x5d - IPPROTO_BHA = 0x31 - IPPROTO_BLT = 0x1e - IPPROTO_BRSATMON = 0x4c - IPPROTO_CFTP = 0x3e - IPPROTO_CHAOS = 0x10 - IPPROTO_CMTP = 0x26 - IPPROTO_CPHB = 0x49 - IPPROTO_CPNX = 0x48 - IPPROTO_DDP = 0x25 - IPPROTO_DGP = 0x56 - IPPROTO_DIVERT = 0xfe - IPPROTO_DONE = 0x101 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_EMCON = 0xe - IPPROTO_ENCAP = 0x62 - IPPROTO_EON = 0x50 - IPPROTO_ESP = 0x32 - IPPROTO_ETHERIP = 0x61 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GGP = 0x3 - IPPROTO_GMTP = 0x64 - IPPROTO_GRE = 0x2f - IPPROTO_HELLO = 0x3f - IPPROTO_HMP = 0x14 - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IDPR = 0x23 - IPPROTO_IDRP = 0x2d - IPPROTO_IGMP = 0x2 - IPPROTO_IGP = 0x55 - IPPROTO_IGRP = 0x58 - IPPROTO_IL = 0x28 - IPPROTO_INLSP = 0x34 - IPPROTO_INP = 0x20 - IPPROTO_IP = 0x0 - IPPROTO_IPCOMP = 0x6c - IPPROTO_IPCV = 0x47 - IPPROTO_IPEIP = 0x5e - IPPROTO_IPIP = 0x4 - IPPROTO_IPPC = 0x43 - IPPROTO_IPV4 = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_IRTP = 0x1c - IPPROTO_KRYPTOLAN = 0x41 - IPPROTO_LARP = 0x5b - IPPROTO_LEAF1 = 0x19 - IPPROTO_LEAF2 = 0x1a - IPPROTO_MAX = 0x100 - IPPROTO_MAXID = 0x34 - IPPROTO_MEAS = 0x13 - IPPROTO_MHRP = 0x30 - IPPROTO_MICP = 0x5f - IPPROTO_MTP = 0x5c - IPPROTO_MUX = 0x12 - IPPROTO_ND = 0x4d - IPPROTO_NHRP = 0x36 - IPPROTO_NONE = 0x3b - IPPROTO_NSP = 0x1f - IPPROTO_NVPII = 0xb - IPPROTO_OSPFIGP = 0x59 - IPPROTO_PGM = 0x71 - IPPROTO_PIGP = 0x9 - IPPROTO_PIM = 0x67 - IPPROTO_PRM = 0x15 - IPPROTO_PUP = 0xc - IPPROTO_PVP = 0x4b - IPPROTO_RAW = 0xff - IPPROTO_RCCMON = 0xa - IPPROTO_RDP = 0x1b - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_RVD = 0x42 - IPPROTO_SATEXPAK = 0x40 - IPPROTO_SATMON = 0x45 - IPPROTO_SCCSP = 0x60 - IPPROTO_SCTP = 0x84 - IPPROTO_SDRP = 0x2a - IPPROTO_SEP = 0x21 - IPPROTO_SRPC = 0x5a - IPPROTO_ST = 0x7 - IPPROTO_SVMTP = 0x52 - IPPROTO_SWIPE = 0x35 - IPPROTO_TCF = 0x57 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_TPXX = 0x27 - IPPROTO_TRUNK1 = 0x17 - IPPROTO_TRUNK2 = 0x18 - IPPROTO_TTP = 0x54 - IPPROTO_UDP = 0x11 - IPPROTO_VINES = 0x53 - IPPROTO_VISA = 0x46 - IPPROTO_VMTP = 0x51 - IPPROTO_WBEXPAK = 0x4f - IPPROTO_WBMON = 0x4e - IPPROTO_WSN = 0x4a - IPPROTO_XNET = 0xf - IPPROTO_XTP = 0x24 - IPV6_2292DSTOPTS = 0x17 - IPV6_2292HOPLIMIT = 0x14 - IPV6_2292HOPOPTS = 0x16 - IPV6_2292NEXTHOP = 0x15 - IPV6_2292PKTINFO = 0x13 - IPV6_2292PKTOPTIONS = 0x19 - IPV6_2292RTHDR = 0x18 - IPV6_3542DSTOPTS = 0x32 - IPV6_3542HOPLIMIT = 0x2f - IPV6_3542HOPOPTS = 0x31 - IPV6_3542NEXTHOP = 0x30 - IPV6_3542PKTINFO = 0x2e - IPV6_3542RTHDR = 0x33 - IPV6_ADDR_MC_FLAGS_PREFIX = 0x20 - IPV6_ADDR_MC_FLAGS_TRANSIENT = 0x10 - IPV6_ADDR_MC_FLAGS_UNICAST_BASED = 0x30 - IPV6_AUTOFLOWLABEL = 0x3b - IPV6_BINDV6ONLY = 0x1b - IPV6_BOUND_IF = 0x7d - IPV6_CHECKSUM = 0x1a - IPV6_DEFAULT_MULTICAST_HOPS = 0x1 - IPV6_DEFAULT_MULTICAST_LOOP = 0x1 - IPV6_DEFHLIM = 0x40 - IPV6_DONTFRAG = 0x3e - IPV6_DSTOPTS = 0x32 - IPV6_FAITH = 0x1d - IPV6_FLOWINFO_MASK = 0xffffff0f - IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FLOW_ECN_MASK = 0x3000 - IPV6_FRAGTTL = 0x3c - IPV6_FW_ADD = 0x1e - IPV6_FW_DEL = 0x1f - IPV6_FW_FLUSH = 0x20 - IPV6_FW_GET = 0x22 - IPV6_FW_ZERO = 0x21 - IPV6_HLIMDEC = 0x1 - IPV6_HOPLIMIT = 0x2f - IPV6_HOPOPTS = 0x31 - IPV6_IPSEC_POLICY = 0x1c - IPV6_JOIN_GROUP = 0xc - IPV6_LEAVE_GROUP = 0xd - IPV6_MAXHLIM = 0xff - IPV6_MAXOPTHDR = 0x800 - IPV6_MAXPACKET = 0xffff - IPV6_MAX_GROUP_SRC_FILTER = 0x200 - IPV6_MAX_MEMBERSHIPS = 0xfff - IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f - IPV6_MMTU = 0x500 - IPV6_MSFILTER = 0x4a - IPV6_MULTICAST_HOPS = 0xa - IPV6_MULTICAST_IF = 0x9 - IPV6_MULTICAST_LOOP = 0xb - IPV6_NEXTHOP = 0x30 - IPV6_PATHMTU = 0x2c - IPV6_PKTINFO = 0x2e - IPV6_PORTRANGE = 0xe - IPV6_PORTRANGE_DEFAULT = 0x0 - IPV6_PORTRANGE_HIGH = 0x1 - IPV6_PORTRANGE_LOW = 0x2 - IPV6_PREFER_TEMPADDR = 0x3f - IPV6_RECVDSTOPTS = 0x28 - IPV6_RECVHOPLIMIT = 0x25 - IPV6_RECVHOPOPTS = 0x27 - IPV6_RECVPATHMTU = 0x2b - IPV6_RECVPKTINFO = 0x3d - IPV6_RECVRTHDR = 0x26 - IPV6_RECVTCLASS = 0x23 - IPV6_RTHDR = 0x33 - IPV6_RTHDRDSTOPTS = 0x39 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_SOCKOPT_RESERVED1 = 0x3 - IPV6_TCLASS = 0x24 - IPV6_UNICAST_HOPS = 0x4 - IPV6_USE_MIN_MTU = 0x2a - IPV6_V6ONLY = 0x1b - IPV6_VERSION = 0x60 - IPV6_VERSION_MASK = 0xf0 - IP_ADD_MEMBERSHIP = 0xc - IP_ADD_SOURCE_MEMBERSHIP = 0x46 - IP_BLOCK_SOURCE = 0x48 - IP_BOUND_IF = 0x19 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DONTFRAG = 0x1c - IP_DROP_MEMBERSHIP = 0xd - IP_DROP_SOURCE_MEMBERSHIP = 0x47 - IP_DUMMYNET_CONFIGURE = 0x3c - IP_DUMMYNET_DEL = 0x3d - IP_DUMMYNET_FLUSH = 0x3e - IP_DUMMYNET_GET = 0x40 - IP_FAITH = 0x16 - IP_FW_ADD = 0x28 - IP_FW_DEL = 0x29 - IP_FW_FLUSH = 0x2a - IP_FW_GET = 0x2c - IP_FW_RESETLOG = 0x2d - IP_FW_ZERO = 0x2b - IP_HDRINCL = 0x2 - IP_IPSEC_POLICY = 0x15 - IP_MAXPACKET = 0xffff - IP_MAX_GROUP_SRC_FILTER = 0x200 - IP_MAX_MEMBERSHIPS = 0xfff - IP_MAX_SOCK_MUTE_FILTER = 0x80 - IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MF = 0x2000 - IP_MIN_MEMBERSHIPS = 0x1f - IP_MSFILTER = 0x4a - IP_MSS = 0x240 - IP_MULTICAST_IF = 0x9 - IP_MULTICAST_IFINDEX = 0x42 - IP_MULTICAST_LOOP = 0xb - IP_MULTICAST_TTL = 0xa - IP_MULTICAST_VIF = 0xe - IP_NAT__XXX = 0x37 - IP_OFFMASK = 0x1fff - IP_OLD_FW_ADD = 0x32 - IP_OLD_FW_DEL = 0x33 - IP_OLD_FW_FLUSH = 0x34 - IP_OLD_FW_GET = 0x36 - IP_OLD_FW_RESETLOG = 0x38 - IP_OLD_FW_ZERO = 0x35 - IP_OPTIONS = 0x1 - IP_PKTINFO = 0x1a - IP_PORTRANGE = 0x13 - IP_PORTRANGE_DEFAULT = 0x0 - IP_PORTRANGE_HIGH = 0x1 - IP_PORTRANGE_LOW = 0x2 - IP_RECVDSTADDR = 0x7 - IP_RECVIF = 0x14 - IP_RECVOPTS = 0x5 - IP_RECVPKTINFO = 0x1a - IP_RECVRETOPTS = 0x6 - IP_RECVTOS = 0x1b - IP_RECVTTL = 0x18 - IP_RETOPTS = 0x8 - IP_RF = 0x8000 - IP_RSVP_OFF = 0x10 - IP_RSVP_ON = 0xf - IP_RSVP_VIF_OFF = 0x12 - IP_RSVP_VIF_ON = 0x11 - IP_STRIPHDR = 0x17 - IP_TOS = 0x3 - IP_TRAFFIC_MGT_BACKGROUND = 0x41 - IP_TTL = 0x4 - IP_UNBLOCK_SOURCE = 0x49 - ISIG = 0x80 - ISTRIP = 0x20 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - KERN_HOSTNAME = 0xa - KERN_OSRELEASE = 0x2 - KERN_OSTYPE = 0x1 - KERN_VERSION = 0x4 - LOCAL_PEERCRED = 0x1 - LOCAL_PEEREPID = 0x3 - LOCAL_PEEREUUID = 0x5 - LOCAL_PEERPID = 0x2 - LOCAL_PEERTOKEN = 0x6 - LOCAL_PEERUUID = 0x4 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_CAN_REUSE = 0x9 - MADV_DONTNEED = 0x4 - MADV_FREE = 0x5 - MADV_FREE_REUSABLE = 0x7 - MADV_FREE_REUSE = 0x8 - MADV_NORMAL = 0x0 - MADV_PAGEOUT = 0xa - MADV_RANDOM = 0x1 - MADV_SEQUENTIAL = 0x2 - MADV_WILLNEED = 0x3 - MADV_ZERO_WIRED_PAGES = 0x6 - MAP_32BIT = 0x8000 - MAP_ANON = 0x1000 - MAP_ANONYMOUS = 0x1000 - MAP_COPY = 0x2 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_HASSEMAPHORE = 0x200 - MAP_JIT = 0x800 - MAP_NOCACHE = 0x400 - MAP_NOEXTEND = 0x100 - MAP_NORESERVE = 0x40 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x20 - MAP_RESERVED0080 = 0x80 - MAP_RESILIENT_CODESIGN = 0x2000 - MAP_RESILIENT_MEDIA = 0x4000 - MAP_SHARED = 0x1 - MAP_TRANSLATED_ALLOW_EXECUTE = 0x20000 - MAP_UNIX03 = 0x40000 - MCAST_BLOCK_SOURCE = 0x54 - MCAST_EXCLUDE = 0x2 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x50 - MCAST_JOIN_SOURCE_GROUP = 0x52 - MCAST_LEAVE_GROUP = 0x51 - MCAST_LEAVE_SOURCE_GROUP = 0x53 - MCAST_UNBLOCK_SOURCE = 0x55 - MCAST_UNDEFINED = 0x0 - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_ASYNC = 0x40 - MNT_AUTOMOUNTED = 0x400000 - MNT_CMDFLAGS = 0xf0000 - MNT_CPROTECT = 0x80 - MNT_DEFWRITE = 0x2000000 - MNT_DONTBROWSE = 0x100000 - MNT_DOVOLFS = 0x8000 - MNT_DWAIT = 0x4 - MNT_EXPORTED = 0x100 - MNT_EXT_ROOT_DATA_VOL = 0x1 - MNT_FORCE = 0x80000 - MNT_IGNORE_OWNERSHIP = 0x200000 - MNT_JOURNALED = 0x800000 - MNT_LOCAL = 0x1000 - MNT_MULTILABEL = 0x4000000 - MNT_NOATIME = 0x10000000 - MNT_NOBLOCK = 0x20000 - MNT_NODEV = 0x10 - MNT_NOEXEC = 0x4 - MNT_NOSUID = 0x8 - MNT_NOUSERXATTR = 0x1000000 - MNT_NOWAIT = 0x2 - MNT_QUARANTINE = 0x400 - MNT_QUOTA = 0x2000 - MNT_RDONLY = 0x1 - MNT_RELOAD = 0x40000 - MNT_REMOVABLE = 0x200 - MNT_ROOTFS = 0x4000 - MNT_SNAPSHOT = 0x40000000 - MNT_STRICTATIME = 0x80000000 - MNT_SYNCHRONOUS = 0x2 - MNT_UNION = 0x20 - MNT_UNKNOWNPERMISSIONS = 0x200000 - MNT_UPDATE = 0x10000 - MNT_VISFLAGMASK = 0xd7f0f7ff - MNT_WAIT = 0x1 - MSG_CTRUNC = 0x20 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x80 - MSG_EOF = 0x100 - MSG_EOR = 0x8 - MSG_FLUSH = 0x400 - MSG_HAVEMORE = 0x2000 - MSG_HOLD = 0x800 - MSG_NEEDSA = 0x10000 - MSG_NOSIGNAL = 0x80000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_RCVMORE = 0x4000 - MSG_SEND = 0x1000 - MSG_TRUNC = 0x10 - MSG_WAITALL = 0x40 - MSG_WAITSTREAM = 0x200 - MS_ASYNC = 0x1 - MS_DEACTIVATE = 0x8 - MS_INVALIDATE = 0x2 - MS_KILLPAGES = 0x4 - MS_SYNC = 0x10 - NAME_MAX = 0xff - NET_RT_DUMP = 0x1 - NET_RT_DUMP2 = 0x7 - NET_RT_FLAGS = 0x2 - NET_RT_FLAGS_PRIV = 0xa - NET_RT_IFLIST = 0x3 - NET_RT_IFLIST2 = 0x6 - NET_RT_MAXID = 0xb - NET_RT_STAT = 0x4 - NET_RT_TRASH = 0x5 - NFDBITS = 0x20 - NL0 = 0x0 - NL1 = 0x100 - NL2 = 0x200 - NL3 = 0x300 - NLDLY = 0x300 - NOFLSH = 0x80000000 - NOKERNINFO = 0x2000000 - NOTE_ABSOLUTE = 0x8 - NOTE_ATTRIB = 0x8 - NOTE_BACKGROUND = 0x40 - NOTE_CHILD = 0x4 - NOTE_CRITICAL = 0x20 - NOTE_DELETE = 0x1 - NOTE_EXEC = 0x20000000 - NOTE_EXIT = 0x80000000 - NOTE_EXITSTATUS = 0x4000000 - NOTE_EXIT_CSERROR = 0x40000 - NOTE_EXIT_DECRYPTFAIL = 0x10000 - NOTE_EXIT_DETAIL = 0x2000000 - NOTE_EXIT_DETAIL_MASK = 0x70000 - NOTE_EXIT_MEMORY = 0x20000 - NOTE_EXIT_REPARENTED = 0x80000 - NOTE_EXTEND = 0x4 - NOTE_FFAND = 0x40000000 - NOTE_FFCOPY = 0xc0000000 - NOTE_FFCTRLMASK = 0xc0000000 - NOTE_FFLAGSMASK = 0xffffff - NOTE_FFNOP = 0x0 - NOTE_FFOR = 0x80000000 - NOTE_FORK = 0x40000000 - NOTE_FUNLOCK = 0x100 - NOTE_LEEWAY = 0x10 - NOTE_LINK = 0x10 - NOTE_LOWAT = 0x1 - NOTE_MACHTIME = 0x100 - NOTE_MACH_CONTINUOUS_TIME = 0x80 - NOTE_NONE = 0x80 - NOTE_NSECONDS = 0x4 - NOTE_OOB = 0x2 - NOTE_PCTRLMASK = -0x100000 - NOTE_PDATAMASK = 0xfffff - NOTE_REAP = 0x10000000 - NOTE_RENAME = 0x20 - NOTE_REVOKE = 0x40 - NOTE_SECONDS = 0x1 - NOTE_SIGNAL = 0x8000000 - NOTE_TRACK = 0x1 - NOTE_TRACKERR = 0x2 - NOTE_TRIGGER = 0x1000000 - NOTE_USECONDS = 0x2 - NOTE_VM_ERROR = 0x10000000 - NOTE_VM_PRESSURE = 0x80000000 - NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 - NOTE_VM_PRESSURE_TERMINATE = 0x40000000 - NOTE_WRITE = 0x2 - OCRNL = 0x10 - OFDEL = 0x20000 - OFILL = 0x80 - ONLCR = 0x2 - ONLRET = 0x40 - ONOCR = 0x20 - ONOEOT = 0x8 - OPOST = 0x1 - OXTABS = 0x4 - O_ACCMODE = 0x3 - O_ALERT = 0x20000000 - O_APPEND = 0x8 - O_ASYNC = 0x40 - O_CLOEXEC = 0x1000000 - O_CREAT = 0x200 - O_DIRECTORY = 0x100000 - O_DP_GETRAWENCRYPTED = 0x1 - O_DP_GETRAWUNENCRYPTED = 0x2 - O_DSYNC = 0x400000 - O_EVTONLY = 0x8000 - O_EXCL = 0x800 - O_EXLOCK = 0x20 - O_FSYNC = 0x80 - O_NDELAY = 0x4 - O_NOCTTY = 0x20000 - O_NOFOLLOW = 0x100 - O_NOFOLLOW_ANY = 0x20000000 - O_NONBLOCK = 0x4 - O_POPUP = 0x80000000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_SHLOCK = 0x10 - O_SYMLINK = 0x200000 - O_SYNC = 0x80 - O_TRUNC = 0x400 - O_WRONLY = 0x1 - PARENB = 0x1000 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PT_ATTACH = 0xa - PT_ATTACHEXC = 0xe - PT_CONTINUE = 0x7 - PT_DENY_ATTACH = 0x1f - PT_DETACH = 0xb - PT_FIRSTMACH = 0x20 - PT_FORCEQUOTA = 0x1e - PT_KILL = 0x8 - PT_READ_D = 0x2 - PT_READ_I = 0x1 - PT_READ_U = 0x3 - PT_SIGEXC = 0xc - PT_STEP = 0x9 - PT_THUPDATE = 0xd - PT_TRACE_ME = 0x0 - PT_WRITE_D = 0x5 - PT_WRITE_I = 0x4 - PT_WRITE_U = 0x6 - RLIMIT_AS = 0x5 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_CPU_USAGE_MONITOR = 0x2 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_MEMLOCK = 0x6 - RLIMIT_NOFILE = 0x8 - RLIMIT_NPROC = 0x7 - RLIMIT_RSS = 0x5 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0x7fffffffffffffff - RTAX_AUTHOR = 0x6 - RTAX_BRD = 0x7 - RTAX_DST = 0x0 - RTAX_GATEWAY = 0x1 - RTAX_GENMASK = 0x3 - RTAX_IFA = 0x5 - RTAX_IFP = 0x4 - RTAX_MAX = 0x8 - RTAX_NETMASK = 0x2 - RTA_AUTHOR = 0x40 - RTA_BRD = 0x80 - RTA_DST = 0x1 - RTA_GATEWAY = 0x2 - RTA_GENMASK = 0x8 - RTA_IFA = 0x20 - RTA_IFP = 0x10 - RTA_NETMASK = 0x4 - RTF_BLACKHOLE = 0x1000 - RTF_BROADCAST = 0x400000 - RTF_CLONING = 0x100 - RTF_CONDEMNED = 0x2000000 - RTF_DEAD = 0x20000000 - RTF_DELCLONE = 0x80 - RTF_DONE = 0x40 - RTF_DYNAMIC = 0x10 - RTF_GATEWAY = 0x2 - RTF_GLOBAL = 0x40000000 - RTF_HOST = 0x4 - RTF_IFREF = 0x4000000 - RTF_IFSCOPE = 0x1000000 - RTF_LLDATA = 0x400 - RTF_LLINFO = 0x400 - RTF_LOCAL = 0x200000 - RTF_MODIFIED = 0x20 - RTF_MULTICAST = 0x800000 - RTF_NOIFREF = 0x2000 - RTF_PINNED = 0x100000 - RTF_PRCLONING = 0x10000 - RTF_PROTO1 = 0x8000 - RTF_PROTO2 = 0x4000 - RTF_PROTO3 = 0x40000 - RTF_PROXY = 0x8000000 - RTF_REJECT = 0x8 - RTF_ROUTER = 0x10000000 - RTF_STATIC = 0x800 - RTF_UP = 0x1 - RTF_WASCLONED = 0x20000 - RTF_XRESOLVE = 0x200 - RTM_ADD = 0x1 - RTM_CHANGE = 0x3 - RTM_DELADDR = 0xd - RTM_DELETE = 0x2 - RTM_DELMADDR = 0x10 - RTM_GET = 0x4 - RTM_GET2 = 0x14 - RTM_IFINFO = 0xe - RTM_IFINFO2 = 0x12 - RTM_LOCK = 0x8 - RTM_LOSING = 0x5 - RTM_MISS = 0x7 - RTM_NEWADDR = 0xc - RTM_NEWMADDR = 0xf - RTM_NEWMADDR2 = 0x13 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RTM_REDIRECT = 0x6 - RTM_RESOLVE = 0xb - RTM_RTTUNIT = 0xf4240 - RTM_VERSION = 0x5 - RTV_EXPIRE = 0x4 - RTV_HOPCOUNT = 0x2 - RTV_MTU = 0x1 - RTV_RPIPE = 0x8 - RTV_RTT = 0x40 - RTV_RTTVAR = 0x80 - RTV_SPIPE = 0x10 - RTV_SSTHRESH = 0x20 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - SCM_CREDS = 0x3 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x2 - SCM_TIMESTAMP_MONOTONIC = 0x4 - SEEK_CUR = 0x1 - SEEK_DATA = 0x4 - SEEK_END = 0x2 - SEEK_HOLE = 0x3 - SEEK_SET = 0x0 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDMULTI = 0x80206931 - SIOCAIFADDR = 0x8040691a - SIOCARPIPLL = 0xc0206928 - SIOCATMARK = 0x40047307 - SIOCAUTOADDR = 0xc0206926 - SIOCAUTONETMASK = 0x80206927 - SIOCDELMULTI = 0x80206932 - SIOCDIFADDR = 0x80206919 - SIOCDIFPHYADDR = 0x80206941 - SIOCGDRVSPEC = 0xc028697b - SIOCGETVLAN = 0xc020697f - SIOCGHIWAT = 0x40047301 - SIOCGIF6LOWPAN = 0xc02069c5 - SIOCGIFADDR = 0xc0206921 - SIOCGIFALTMTU = 0xc0206948 - SIOCGIFASYNCMAP = 0xc020697c - SIOCGIFBOND = 0xc0206947 - SIOCGIFBRDADDR = 0xc0206923 - SIOCGIFCAP = 0xc020695b - SIOCGIFCONF = 0xc00c6924 - SIOCGIFDEVMTU = 0xc0206944 - SIOCGIFDSTADDR = 0xc0206922 - SIOCGIFFLAGS = 0xc0206911 - SIOCGIFFUNCTIONALTYPE = 0xc02069ad - SIOCGIFGENERIC = 0xc020693a - SIOCGIFKPI = 0xc0206987 - SIOCGIFMAC = 0xc0206982 - SIOCGIFMEDIA = 0xc02c6938 - SIOCGIFMETRIC = 0xc0206917 - SIOCGIFMTU = 0xc0206933 - SIOCGIFNETMASK = 0xc0206925 - SIOCGIFPDSTADDR = 0xc0206940 - SIOCGIFPHYS = 0xc0206935 - SIOCGIFPSRCADDR = 0xc020693f - SIOCGIFSTATUS = 0xc331693d - SIOCGIFVLAN = 0xc020697f - SIOCGIFWAKEFLAGS = 0xc0206988 - SIOCGIFXMEDIA = 0xc02c6948 - SIOCGLOWAT = 0x40047303 - SIOCGPGRP = 0x40047309 - SIOCIFCREATE = 0xc0206978 - SIOCIFCREATE2 = 0xc020697a - SIOCIFDESTROY = 0x80206979 - SIOCIFGCLONERS = 0xc0106981 - SIOCRSLVMULTI = 0xc010693b - SIOCSDRVSPEC = 0x8028697b - SIOCSETVLAN = 0x8020697e - SIOCSHIWAT = 0x80047300 - SIOCSIF6LOWPAN = 0x802069c4 - SIOCSIFADDR = 0x8020690c - SIOCSIFALTMTU = 0x80206945 - SIOCSIFASYNCMAP = 0x8020697d - SIOCSIFBOND = 0x80206946 - SIOCSIFBRDADDR = 0x80206913 - SIOCSIFCAP = 0x8020695a - SIOCSIFDSTADDR = 0x8020690e - SIOCSIFFLAGS = 0x80206910 - SIOCSIFGENERIC = 0x80206939 - SIOCSIFKPI = 0x80206986 - SIOCSIFLLADDR = 0x8020693c - SIOCSIFMAC = 0x80206983 - SIOCSIFMEDIA = 0xc0206937 - SIOCSIFMETRIC = 0x80206918 - SIOCSIFMTU = 0x80206934 - SIOCSIFNETMASK = 0x80206916 - SIOCSIFPHYADDR = 0x8040693e - SIOCSIFPHYS = 0x80206936 - SIOCSIFVLAN = 0x8020697e - SIOCSLOWAT = 0x80047302 - SIOCSPGRP = 0x80047308 - SOCK_DGRAM = 0x2 - SOCK_MAXADDRLEN = 0xff - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_LOCAL = 0x0 - SOL_SOCKET = 0xffff - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x2 - SO_BROADCAST = 0x20 - SO_DEBUG = 0x1 - SO_DONTROUTE = 0x10 - SO_DONTTRUNC = 0x2000 - SO_ERROR = 0x1007 - SO_KEEPALIVE = 0x8 - SO_LABEL = 0x1010 - SO_LINGER = 0x80 - SO_LINGER_SEC = 0x1080 - SO_NETSVC_MARKING_LEVEL = 0x1119 - SO_NET_SERVICE_TYPE = 0x1116 - SO_NKE = 0x1021 - SO_NOADDRERR = 0x1023 - SO_NOSIGPIPE = 0x1022 - SO_NOTIFYCONFLICT = 0x1026 - SO_NP_EXTENSIONS = 0x1083 - SO_NREAD = 0x1020 - SO_NUMRCVPKT = 0x1112 - SO_NWRITE = 0x1024 - SO_OOBINLINE = 0x100 - SO_PEERLABEL = 0x1011 - SO_RANDOMPORT = 0x1082 - SO_RCVBUF = 0x1002 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_REUSESHAREUID = 0x1025 - SO_SNDBUF = 0x1001 - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_TIMESTAMP = 0x400 - SO_TIMESTAMP_MONOTONIC = 0x800 - SO_TYPE = 0x1008 - SO_UPCALLCLOSEWAIT = 0x1027 - SO_USELOOPBACK = 0x40 - SO_WANTMORE = 0x4000 - SO_WANTOOBFLAG = 0x8000 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IFWHT = 0xe000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISTXT = 0x200 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x400 - TAB2 = 0x800 - TAB3 = 0x4 - TABDLY = 0xc04 - TCIFLUSH = 0x1 - TCIOFF = 0x3 - TCIOFLUSH = 0x3 - TCION = 0x4 - TCOFLUSH = 0x2 - TCOOFF = 0x1 - TCOON = 0x2 - TCP_CONNECTIONTIMEOUT = 0x20 - TCP_CONNECTION_INFO = 0x106 - TCP_ENABLE_ECN = 0x104 - TCP_FASTOPEN = 0x105 - TCP_KEEPALIVE = 0x10 - TCP_KEEPCNT = 0x102 - TCP_KEEPINTVL = 0x101 - TCP_MAXHLEN = 0x3c - TCP_MAXOLEN = 0x28 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_SACK = 0x4 - TCP_MAX_WINSHIFT = 0xe - TCP_MINMSS = 0xd8 - TCP_MSS = 0x200 - TCP_NODELAY = 0x1 - TCP_NOOPT = 0x8 - TCP_NOPUSH = 0x4 - TCP_NOTSENT_LOWAT = 0x201 - TCP_RXT_CONNDROPTIME = 0x80 - TCP_RXT_FINDROP = 0x100 - TCP_SENDMOREACKS = 0x103 - TCSAFLUSH = 0x2 - TIOCCBRK = 0x2000747a - TIOCCDTR = 0x20007478 - TIOCCONS = 0x80047462 - TIOCDCDTIMESTAMP = 0x40107458 - TIOCDRAIN = 0x2000745e - TIOCDSIMICROCODE = 0x20007455 - TIOCEXCL = 0x2000740d - TIOCEXT = 0x80047460 - TIOCFLUSH = 0x80047410 - TIOCGDRAINWAIT = 0x40047456 - TIOCGETA = 0x40487413 - TIOCGETD = 0x4004741a - TIOCGPGRP = 0x40047477 - TIOCGWINSZ = 0x40087468 - TIOCIXOFF = 0x20007480 - TIOCIXON = 0x20007481 - TIOCMBIC = 0x8004746b - TIOCMBIS = 0x8004746c - TIOCMGDTRWAIT = 0x4004745a - TIOCMGET = 0x4004746a - TIOCMODG = 0x40047403 - TIOCMODS = 0x80047404 - TIOCMSDTRWAIT = 0x8004745b - TIOCMSET = 0x8004746d - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x20007471 - TIOCNXCL = 0x2000740e - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x80047470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCPTYGNAME = 0x40807453 - TIOCPTYGRANT = 0x20007454 - TIOCPTYUNLK = 0x20007452 - TIOCREMOTE = 0x80047469 - TIOCSBRK = 0x2000747b - TIOCSCONS = 0x20007463 - TIOCSCTTY = 0x20007461 - TIOCSDRAINWAIT = 0x80047457 - TIOCSDTR = 0x20007479 - TIOCSETA = 0x80487414 - TIOCSETAF = 0x80487416 - TIOCSETAW = 0x80487415 - TIOCSETD = 0x8004741b - TIOCSIG = 0x2000745f - TIOCSPGRP = 0x80047476 - TIOCSTART = 0x2000746e - TIOCSTAT = 0x20007465 - TIOCSTI = 0x80017472 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCTIMESTAMP = 0x40107459 - TIOCUCNTL = 0x80047466 - TOSTOP = 0x400000 - VDISCARD = 0xf - VDSUSP = 0xb - VEOF = 0x0 - VEOL = 0x1 - VEOL2 = 0x2 - VERASE = 0x3 - VINTR = 0x8 - VKILL = 0x5 - VLNEXT = 0xe - VMIN = 0x10 - VM_LOADAVG = 0x2 - VM_MACHFACTOR = 0x4 - VM_MAXID = 0x6 - VM_METER = 0x1 - VM_SWAPUSAGE = 0x5 - VQUIT = 0x9 - VREPRINT = 0x6 - VSTART = 0xc - VSTATUS = 0x12 - VSTOP = 0xd - VSUSP = 0xa - VT0 = 0x0 - VT1 = 0x10000 - VTDLY = 0x10000 - VTIME = 0x11 - VWERASE = 0x4 - WCONTINUED = 0x10 - WCOREFLAG = 0x80 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOWAIT = 0x20 - WORDSIZE = 0x40 - WSTOPPED = 0x8 - WUNTRACED = 0x2 - XATTR_CREATE = 0x2 - XATTR_NODEFAULT = 0x10 - XATTR_NOFOLLOW = 0x1 - XATTR_NOSECURITY = 0x8 - XATTR_REPLACE = 0x4 - XATTR_SHOWCOMPRESSION = 0x20 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_SYS_CONTROL = 0x2 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + AF_VSOCK = 0x28 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x51c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_SPACEUSED = 0x800000 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf087ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CLONE_NOFOLLOW = 0x1 + CLONE_NOOWNERCOPY = 0x2 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTLIOCGINFO = 0xc0644e03 + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x10a + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_DARWIN = 0x10a + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x11 + EVFILT_THREADMARKER = 0x11 + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + FSOPT_RETURN_REALDEV = 0x200 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_INFO = 0x67 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDFILESUPPL = 0x68 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPATH_NOFIRMLINK = 0x66 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GETSIGSINFO = 0x69 + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_SPECULATIVE_READ = 0x65 + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6LOWPAN = 0x40 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x400473d1 + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_3542DSTOPTS = 0x32 + IPV6_3542HOPLIMIT = 0x2f + IPV6_3542HOPOPTS = 0x31 + IPV6_3542NEXTHOP = 0x30 + IPV6_3542PKTINFO = 0x2e + IPV6_3542RTHDR = 0x33 + IPV6_ADDR_MC_FLAGS_PREFIX = 0x20 + IPV6_ADDR_MC_FLAGS_TRANSIENT = 0x10 + IPV6_ADDR_MC_FLAGS_UNICAST_BASED = 0x30 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x3000 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x3d + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x39 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x1c + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCAL_PEERCRED = 0x1 + LOCAL_PEEREPID = 0x3 + LOCAL_PEEREUUID = 0x5 + LOCAL_PEERPID = 0x2 + LOCAL_PEERTOKEN = 0x6 + LOCAL_PEERUUID = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_32BIT = 0x8000 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MAP_TRANSLATED_ALLOW_EXECUTE = 0x20000 + MAP_UNIX03 = 0x40000 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_EXT_ROOT_DATA_VOL = 0x1 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_REMOVABLE = 0x200 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x40000000 + MNT_STRICTATIME = 0x80000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xd7f0f7ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_NOSIGNAL = 0x80000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_FLAGS_PRIV = 0xa + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xb + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NFDBITS = 0x20 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACHTIME = 0x100 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NOFOLLOW_ANY = 0x20000000 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DEAD = 0x20000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_GLOBAL = 0x40000000 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SEEK_CUR = 0x1 + SEEK_DATA = 0x4 + SEEK_END = 0x2 + SEEK_HOLE = 0x3 + SEEK_SET = 0x0 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIF6LOWPAN = 0xc02069c5 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFFUNCTIONALTYPE = 0xc02069ad + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGIFXMEDIA = 0xc02c6948 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIF6LOWPAN = 0x802069c4 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TRACKER_ATTRIBUTE_FLAGS_APP_APPROVED = 0x1 + SO_TRACKER_ATTRIBUTE_FLAGS_DOMAIN_SHORT = 0x4 + SO_TRACKER_ATTRIBUTE_FLAGS_TRACKER = 0x2 + SO_TRACKER_TRANSPARENCY_VERSION = 0x3 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCPOPT_CC = 0xb + TCPOPT_CCECHO = 0xd + TCPOPT_CCNEW = 0xc + TCPOPT_EOL = 0x0 + TCPOPT_FASTOPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_HDR = 0x1010500 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SACK_PERMIT_HDR = 0x1010402 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_TSTAMP_HDR = 0x101080a + TCPOPT_WINDOW = 0x3 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index 31009d7f0..e36f5178d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -12,1556 +12,1582 @@ package unix import "syscall" const ( - AF_APPLETALK = 0x10 - AF_CCITT = 0xa - AF_CHAOS = 0x5 - AF_CNT = 0x15 - AF_COIP = 0x14 - AF_DATAKIT = 0x9 - AF_DECnet = 0xc - AF_DLI = 0xd - AF_E164 = 0x1c - AF_ECMA = 0x8 - AF_HYLINK = 0xf - AF_IEEE80211 = 0x25 - AF_IMPLINK = 0x3 - AF_INET = 0x2 - AF_INET6 = 0x1e - AF_IPX = 0x17 - AF_ISDN = 0x1c - AF_ISO = 0x7 - AF_LAT = 0xe - AF_LINK = 0x12 - AF_LOCAL = 0x1 - AF_MAX = 0x29 - AF_NATM = 0x1f - AF_NDRV = 0x1b - AF_NETBIOS = 0x21 - AF_NS = 0x6 - AF_OSI = 0x7 - AF_PPP = 0x22 - AF_PUP = 0x4 - AF_RESERVED_36 = 0x24 - AF_ROUTE = 0x11 - AF_SIP = 0x18 - AF_SNA = 0xb - AF_SYSTEM = 0x20 - AF_SYS_CONTROL = 0x2 - AF_UNIX = 0x1 - AF_UNSPEC = 0x0 - AF_UTUN = 0x26 - AF_VSOCK = 0x28 - ALTWERASE = 0x200 - ATTR_BIT_MAP_COUNT = 0x5 - ATTR_CMN_ACCESSMASK = 0x20000 - ATTR_CMN_ACCTIME = 0x1000 - ATTR_CMN_ADDEDTIME = 0x10000000 - ATTR_CMN_BKUPTIME = 0x2000 - ATTR_CMN_CHGTIME = 0x800 - ATTR_CMN_CRTIME = 0x200 - ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 - ATTR_CMN_DEVID = 0x2 - ATTR_CMN_DOCUMENT_ID = 0x100000 - ATTR_CMN_ERROR = 0x20000000 - ATTR_CMN_EXTENDED_SECURITY = 0x400000 - ATTR_CMN_FILEID = 0x2000000 - ATTR_CMN_FLAGS = 0x40000 - ATTR_CMN_FNDRINFO = 0x4000 - ATTR_CMN_FSID = 0x4 - ATTR_CMN_FULLPATH = 0x8000000 - ATTR_CMN_GEN_COUNT = 0x80000 - ATTR_CMN_GRPID = 0x10000 - ATTR_CMN_GRPUUID = 0x1000000 - ATTR_CMN_MODTIME = 0x400 - ATTR_CMN_NAME = 0x1 - ATTR_CMN_NAMEDATTRCOUNT = 0x80000 - ATTR_CMN_NAMEDATTRLIST = 0x100000 - ATTR_CMN_OBJID = 0x20 - ATTR_CMN_OBJPERMANENTID = 0x40 - ATTR_CMN_OBJTAG = 0x10 - ATTR_CMN_OBJTYPE = 0x8 - ATTR_CMN_OWNERID = 0x8000 - ATTR_CMN_PARENTID = 0x4000000 - ATTR_CMN_PAROBJID = 0x80 - ATTR_CMN_RETURNED_ATTRS = 0x80000000 - ATTR_CMN_SCRIPT = 0x100 - ATTR_CMN_SETMASK = 0x51c7ff00 - ATTR_CMN_USERACCESS = 0x200000 - ATTR_CMN_UUID = 0x800000 - ATTR_CMN_VALIDMASK = 0xffffffff - ATTR_CMN_VOLSETMASK = 0x6700 - ATTR_FILE_ALLOCSIZE = 0x4 - ATTR_FILE_CLUMPSIZE = 0x10 - ATTR_FILE_DATAALLOCSIZE = 0x400 - ATTR_FILE_DATAEXTENTS = 0x800 - ATTR_FILE_DATALENGTH = 0x200 - ATTR_FILE_DEVTYPE = 0x20 - ATTR_FILE_FILETYPE = 0x40 - ATTR_FILE_FORKCOUNT = 0x80 - ATTR_FILE_FORKLIST = 0x100 - ATTR_FILE_IOBLOCKSIZE = 0x8 - ATTR_FILE_LINKCOUNT = 0x1 - ATTR_FILE_RSRCALLOCSIZE = 0x2000 - ATTR_FILE_RSRCEXTENTS = 0x4000 - ATTR_FILE_RSRCLENGTH = 0x1000 - ATTR_FILE_SETMASK = 0x20 - ATTR_FILE_TOTALSIZE = 0x2 - ATTR_FILE_VALIDMASK = 0x37ff - ATTR_VOL_ALLOCATIONCLUMP = 0x40 - ATTR_VOL_ATTRIBUTES = 0x40000000 - ATTR_VOL_CAPABILITIES = 0x20000 - ATTR_VOL_DIRCOUNT = 0x400 - ATTR_VOL_ENCODINGSUSED = 0x10000 - ATTR_VOL_FILECOUNT = 0x200 - ATTR_VOL_FSTYPE = 0x1 - ATTR_VOL_INFO = 0x80000000 - ATTR_VOL_IOBLOCKSIZE = 0x80 - ATTR_VOL_MAXOBJCOUNT = 0x800 - ATTR_VOL_MINALLOCATION = 0x20 - ATTR_VOL_MOUNTEDDEVICE = 0x8000 - ATTR_VOL_MOUNTFLAGS = 0x4000 - ATTR_VOL_MOUNTPOINT = 0x1000 - ATTR_VOL_NAME = 0x2000 - ATTR_VOL_OBJCOUNT = 0x100 - ATTR_VOL_QUOTA_SIZE = 0x10000000 - ATTR_VOL_RESERVED_SIZE = 0x20000000 - ATTR_VOL_SETMASK = 0x80002000 - ATTR_VOL_SIGNATURE = 0x2 - ATTR_VOL_SIZE = 0x4 - ATTR_VOL_SPACEAVAIL = 0x10 - ATTR_VOL_SPACEFREE = 0x8 - ATTR_VOL_UUID = 0x40000 - ATTR_VOL_VALIDMASK = 0xf007ffff - B0 = 0x0 - B110 = 0x6e - B115200 = 0x1c200 - B1200 = 0x4b0 - B134 = 0x86 - B14400 = 0x3840 - B150 = 0x96 - B1800 = 0x708 - B19200 = 0x4b00 - B200 = 0xc8 - B230400 = 0x38400 - B2400 = 0x960 - B28800 = 0x7080 - B300 = 0x12c - B38400 = 0x9600 - B4800 = 0x12c0 - B50 = 0x32 - B57600 = 0xe100 - B600 = 0x258 - B7200 = 0x1c20 - B75 = 0x4b - B76800 = 0x12c00 - B9600 = 0x2580 - BIOCFLUSH = 0x20004268 - BIOCGBLEN = 0x40044266 - BIOCGDLT = 0x4004426a - BIOCGDLTLIST = 0xc00c4279 - BIOCGETIF = 0x4020426b - BIOCGHDRCMPLT = 0x40044274 - BIOCGRSIG = 0x40044272 - BIOCGRTIMEOUT = 0x4010426e - BIOCGSEESENT = 0x40044276 - BIOCGSTATS = 0x4008426f - BIOCIMMEDIATE = 0x80044270 - BIOCPROMISC = 0x20004269 - BIOCSBLEN = 0xc0044266 - BIOCSDLT = 0x80044278 - BIOCSETF = 0x80104267 - BIOCSETFNR = 0x8010427e - BIOCSETIF = 0x8020426c - BIOCSHDRCMPLT = 0x80044275 - BIOCSRSIG = 0x80044273 - BIOCSRTIMEOUT = 0x8010426d - BIOCSSEESENT = 0x80044277 - BIOCVERSION = 0x40044271 - BPF_A = 0x10 - BPF_ABS = 0x20 - BPF_ADD = 0x0 - BPF_ALIGNMENT = 0x4 - BPF_ALU = 0x4 - BPF_AND = 0x50 - BPF_B = 0x10 - BPF_DIV = 0x30 - BPF_H = 0x8 - BPF_IMM = 0x0 - BPF_IND = 0x40 - BPF_JA = 0x0 - BPF_JEQ = 0x10 - BPF_JGE = 0x30 - BPF_JGT = 0x20 - BPF_JMP = 0x5 - BPF_JSET = 0x40 - BPF_K = 0x0 - BPF_LD = 0x0 - BPF_LDX = 0x1 - BPF_LEN = 0x80 - BPF_LSH = 0x60 - BPF_MAJOR_VERSION = 0x1 - BPF_MAXBUFSIZE = 0x80000 - BPF_MAXINSNS = 0x200 - BPF_MEM = 0x60 - BPF_MEMWORDS = 0x10 - BPF_MINBUFSIZE = 0x20 - BPF_MINOR_VERSION = 0x1 - BPF_MISC = 0x7 - BPF_MSH = 0xa0 - BPF_MUL = 0x20 - BPF_NEG = 0x80 - BPF_OR = 0x40 - BPF_RELEASE = 0x30bb6 - BPF_RET = 0x6 - BPF_RSH = 0x70 - BPF_ST = 0x2 - BPF_STX = 0x3 - BPF_SUB = 0x10 - BPF_TAX = 0x0 - BPF_TXA = 0x80 - BPF_W = 0x0 - BPF_X = 0x8 - BRKINT = 0x2 - BS0 = 0x0 - BS1 = 0x8000 - BSDLY = 0x8000 - CFLUSH = 0xf - CLOCAL = 0x8000 - CLOCK_MONOTONIC = 0x6 - CLOCK_MONOTONIC_RAW = 0x4 - CLOCK_MONOTONIC_RAW_APPROX = 0x5 - CLOCK_PROCESS_CPUTIME_ID = 0xc - CLOCK_REALTIME = 0x0 - CLOCK_THREAD_CPUTIME_ID = 0x10 - CLOCK_UPTIME_RAW = 0x8 - CLOCK_UPTIME_RAW_APPROX = 0x9 - CLONE_NOFOLLOW = 0x1 - CLONE_NOOWNERCOPY = 0x2 - CR0 = 0x0 - CR1 = 0x1000 - CR2 = 0x2000 - CR3 = 0x3000 - CRDLY = 0x3000 - CREAD = 0x800 - CRTSCTS = 0x30000 - CS5 = 0x0 - CS6 = 0x100 - CS7 = 0x200 - CS8 = 0x300 - CSIZE = 0x300 - CSTART = 0x11 - CSTATUS = 0x14 - CSTOP = 0x13 - CSTOPB = 0x400 - CSUSP = 0x1a - CTLIOCGINFO = 0xc0644e03 - CTL_HW = 0x6 - CTL_KERN = 0x1 - CTL_MAXNAME = 0xc - CTL_NET = 0x4 - DLT_A429 = 0xb8 - DLT_A653_ICM = 0xb9 - DLT_AIRONET_HEADER = 0x78 - DLT_AOS = 0xde - DLT_APPLE_IP_OVER_IEEE1394 = 0x8a - DLT_ARCNET = 0x7 - DLT_ARCNET_LINUX = 0x81 - DLT_ATM_CLIP = 0x13 - DLT_ATM_RFC1483 = 0xb - DLT_AURORA = 0x7e - DLT_AX25 = 0x3 - DLT_AX25_KISS = 0xca - DLT_BACNET_MS_TP = 0xa5 - DLT_BLUETOOTH_HCI_H4 = 0xbb - DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 - DLT_CAN20B = 0xbe - DLT_CAN_SOCKETCAN = 0xe3 - DLT_CHAOS = 0x5 - DLT_CHDLC = 0x68 - DLT_CISCO_IOS = 0x76 - DLT_C_HDLC = 0x68 - DLT_C_HDLC_WITH_DIR = 0xcd - DLT_DBUS = 0xe7 - DLT_DECT = 0xdd - DLT_DOCSIS = 0x8f - DLT_DVB_CI = 0xeb - DLT_ECONET = 0x73 - DLT_EN10MB = 0x1 - DLT_EN3MB = 0x2 - DLT_ENC = 0x6d - DLT_ERF = 0xc5 - DLT_ERF_ETH = 0xaf - DLT_ERF_POS = 0xb0 - DLT_FC_2 = 0xe0 - DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 - DLT_FDDI = 0xa - DLT_FLEXRAY = 0xd2 - DLT_FRELAY = 0x6b - DLT_FRELAY_WITH_DIR = 0xce - DLT_GCOM_SERIAL = 0xad - DLT_GCOM_T1E1 = 0xac - DLT_GPF_F = 0xab - DLT_GPF_T = 0xaa - DLT_GPRS_LLC = 0xa9 - DLT_GSMTAP_ABIS = 0xda - DLT_GSMTAP_UM = 0xd9 - DLT_HHDLC = 0x79 - DLT_IBM_SN = 0x92 - DLT_IBM_SP = 0x91 - DLT_IEEE802 = 0x6 - DLT_IEEE802_11 = 0x69 - DLT_IEEE802_11_RADIO = 0x7f - DLT_IEEE802_11_RADIO_AVS = 0xa3 - DLT_IEEE802_15_4 = 0xc3 - DLT_IEEE802_15_4_LINUX = 0xbf - DLT_IEEE802_15_4_NOFCS = 0xe6 - DLT_IEEE802_15_4_NONASK_PHY = 0xd7 - DLT_IEEE802_16_MAC_CPS = 0xbc - DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 - DLT_IPFILTER = 0x74 - DLT_IPMB = 0xc7 - DLT_IPMB_LINUX = 0xd1 - DLT_IPNET = 0xe2 - DLT_IPOIB = 0xf2 - DLT_IPV4 = 0xe4 - DLT_IPV6 = 0xe5 - DLT_IP_OVER_FC = 0x7a - DLT_JUNIPER_ATM1 = 0x89 - DLT_JUNIPER_ATM2 = 0x87 - DLT_JUNIPER_ATM_CEMIC = 0xee - DLT_JUNIPER_CHDLC = 0xb5 - DLT_JUNIPER_ES = 0x84 - DLT_JUNIPER_ETHER = 0xb2 - DLT_JUNIPER_FIBRECHANNEL = 0xea - DLT_JUNIPER_FRELAY = 0xb4 - DLT_JUNIPER_GGSN = 0x85 - DLT_JUNIPER_ISM = 0xc2 - DLT_JUNIPER_MFR = 0x86 - DLT_JUNIPER_MLFR = 0x83 - DLT_JUNIPER_MLPPP = 0x82 - DLT_JUNIPER_MONITOR = 0xa4 - DLT_JUNIPER_PIC_PEER = 0xae - DLT_JUNIPER_PPP = 0xb3 - DLT_JUNIPER_PPPOE = 0xa7 - DLT_JUNIPER_PPPOE_ATM = 0xa8 - DLT_JUNIPER_SERVICES = 0x88 - DLT_JUNIPER_SRX_E2E = 0xe9 - DLT_JUNIPER_ST = 0xc8 - DLT_JUNIPER_VP = 0xb7 - DLT_JUNIPER_VS = 0xe8 - DLT_LAPB_WITH_DIR = 0xcf - DLT_LAPD = 0xcb - DLT_LIN = 0xd4 - DLT_LINUX_EVDEV = 0xd8 - DLT_LINUX_IRDA = 0x90 - DLT_LINUX_LAPD = 0xb1 - DLT_LINUX_PPP_WITHDIRECTION = 0xa6 - DLT_LINUX_SLL = 0x71 - DLT_LOOP = 0x6c - DLT_LTALK = 0x72 - DLT_MATCHING_MAX = 0x10a - DLT_MATCHING_MIN = 0x68 - DLT_MFR = 0xb6 - DLT_MOST = 0xd3 - DLT_MPEG_2_TS = 0xf3 - DLT_MPLS = 0xdb - DLT_MTP2 = 0x8c - DLT_MTP2_WITH_PHDR = 0x8b - DLT_MTP3 = 0x8d - DLT_MUX27010 = 0xec - DLT_NETANALYZER = 0xf0 - DLT_NETANALYZER_TRANSPARENT = 0xf1 - DLT_NFC_LLCP = 0xf5 - DLT_NFLOG = 0xef - DLT_NG40 = 0xf4 - DLT_NULL = 0x0 - DLT_PCI_EXP = 0x7d - DLT_PFLOG = 0x75 - DLT_PFSYNC = 0x12 - DLT_PPI = 0xc0 - DLT_PPP = 0x9 - DLT_PPP_BSDOS = 0x10 - DLT_PPP_ETHER = 0x33 - DLT_PPP_PPPD = 0xa6 - DLT_PPP_SERIAL = 0x32 - DLT_PPP_WITH_DIR = 0xcc - DLT_PPP_WITH_DIRECTION = 0xa6 - DLT_PRISM_HEADER = 0x77 - DLT_PRONET = 0x4 - DLT_RAIF1 = 0xc6 - DLT_RAW = 0xc - DLT_RIO = 0x7c - DLT_SCCP = 0x8e - DLT_SITA = 0xc4 - DLT_SLIP = 0x8 - DLT_SLIP_BSDOS = 0xf - DLT_STANAG_5066_D_PDU = 0xed - DLT_SUNATM = 0x7b - DLT_SYMANTEC_FIREWALL = 0x63 - DLT_TZSP = 0x80 - DLT_USB = 0xba - DLT_USB_DARWIN = 0x10a - DLT_USB_LINUX = 0xbd - DLT_USB_LINUX_MMAPPED = 0xdc - DLT_USER0 = 0x93 - DLT_USER1 = 0x94 - DLT_USER10 = 0x9d - DLT_USER11 = 0x9e - DLT_USER12 = 0x9f - DLT_USER13 = 0xa0 - DLT_USER14 = 0xa1 - DLT_USER15 = 0xa2 - DLT_USER2 = 0x95 - DLT_USER3 = 0x96 - DLT_USER4 = 0x97 - DLT_USER5 = 0x98 - DLT_USER6 = 0x99 - DLT_USER7 = 0x9a - DLT_USER8 = 0x9b - DLT_USER9 = 0x9c - DLT_WIHART = 0xdf - DLT_X2E_SERIAL = 0xd5 - DLT_X2E_XORAYA = 0xd6 - DT_BLK = 0x6 - DT_CHR = 0x2 - DT_DIR = 0x4 - DT_FIFO = 0x1 - DT_LNK = 0xa - DT_REG = 0x8 - DT_SOCK = 0xc - DT_UNKNOWN = 0x0 - DT_WHT = 0xe - ECHO = 0x8 - ECHOCTL = 0x40 - ECHOE = 0x2 - ECHOK = 0x4 - ECHOKE = 0x1 - ECHONL = 0x10 - ECHOPRT = 0x20 - EVFILT_AIO = -0x3 - EVFILT_EXCEPT = -0xf - EVFILT_FS = -0x9 - EVFILT_MACHPORT = -0x8 - EVFILT_PROC = -0x5 - EVFILT_READ = -0x1 - EVFILT_SIGNAL = -0x6 - EVFILT_SYSCOUNT = 0x11 - EVFILT_THREADMARKER = 0x11 - EVFILT_TIMER = -0x7 - EVFILT_USER = -0xa - EVFILT_VM = -0xc - EVFILT_VNODE = -0x4 - EVFILT_WRITE = -0x2 - EV_ADD = 0x1 - EV_CLEAR = 0x20 - EV_DELETE = 0x2 - EV_DISABLE = 0x8 - EV_DISPATCH = 0x80 - EV_DISPATCH2 = 0x180 - EV_ENABLE = 0x4 - EV_EOF = 0x8000 - EV_ERROR = 0x4000 - EV_FLAG0 = 0x1000 - EV_FLAG1 = 0x2000 - EV_ONESHOT = 0x10 - EV_OOBAND = 0x2000 - EV_POLL = 0x1000 - EV_RECEIPT = 0x40 - EV_SYSFLAGS = 0xf000 - EV_UDATA_SPECIFIC = 0x100 - EV_VANISHED = 0x200 - EXTA = 0x4b00 - EXTB = 0x9600 - EXTPROC = 0x800 - FD_CLOEXEC = 0x1 - FD_SETSIZE = 0x400 - FF0 = 0x0 - FF1 = 0x4000 - FFDLY = 0x4000 - FLUSHO = 0x800000 - FSOPT_ATTR_CMN_EXTENDED = 0x20 - FSOPT_NOFOLLOW = 0x1 - FSOPT_NOINMEMUPDATE = 0x2 - FSOPT_PACK_INVAL_ATTRS = 0x8 - FSOPT_REPORT_FULLSIZE = 0x4 - FSOPT_RETURN_REALDEV = 0x200 - F_ADDFILESIGS = 0x3d - F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 - F_ADDFILESIGS_INFO = 0x67 - F_ADDFILESIGS_RETURN = 0x61 - F_ADDFILESUPPL = 0x68 - F_ADDSIGS = 0x3b - F_ALLOCATEALL = 0x4 - F_ALLOCATECONTIG = 0x2 - F_BARRIERFSYNC = 0x55 - F_CHECK_LV = 0x62 - F_CHKCLEAN = 0x29 - F_DUPFD = 0x0 - F_DUPFD_CLOEXEC = 0x43 - F_FINDSIGS = 0x4e - F_FLUSH_DATA = 0x28 - F_FREEZE_FS = 0x35 - F_FULLFSYNC = 0x33 - F_GETCODEDIR = 0x48 - F_GETFD = 0x1 - F_GETFL = 0x3 - F_GETLK = 0x7 - F_GETLKPID = 0x42 - F_GETNOSIGPIPE = 0x4a - F_GETOWN = 0x5 - F_GETPATH = 0x32 - F_GETPATH_MTMINFO = 0x47 - F_GETPATH_NOFIRMLINK = 0x66 - F_GETPROTECTIONCLASS = 0x3f - F_GETPROTECTIONLEVEL = 0x4d - F_GETSIGSINFO = 0x69 - F_GLOBAL_NOCACHE = 0x37 - F_LOG2PHYS = 0x31 - F_LOG2PHYS_EXT = 0x41 - F_NOCACHE = 0x30 - F_NODIRECT = 0x3e - F_OK = 0x0 - F_PATHPKG_CHECK = 0x34 - F_PEOFPOSMODE = 0x3 - F_PREALLOCATE = 0x2a - F_PUNCHHOLE = 0x63 - F_RDADVISE = 0x2c - F_RDAHEAD = 0x2d - F_RDLCK = 0x1 - F_SETBACKINGSTORE = 0x46 - F_SETFD = 0x2 - F_SETFL = 0x4 - F_SETLK = 0x8 - F_SETLKW = 0x9 - F_SETLKWTIMEOUT = 0xa - F_SETNOSIGPIPE = 0x49 - F_SETOWN = 0x6 - F_SETPROTECTIONCLASS = 0x40 - F_SETSIZE = 0x2b - F_SINGLE_WRITER = 0x4c - F_SPECULATIVE_READ = 0x65 - F_THAW_FS = 0x36 - F_TRANSCODEKEY = 0x4b - F_TRIM_ACTIVE_FILE = 0x64 - F_UNLCK = 0x2 - F_VOLPOSMODE = 0x4 - F_WRLCK = 0x3 - HUPCL = 0x4000 - HW_MACHINE = 0x1 - ICANON = 0x100 - ICMP6_FILTER = 0x12 - ICRNL = 0x100 - IEXTEN = 0x400 - IFF_ALLMULTI = 0x200 - IFF_ALTPHYS = 0x4000 - IFF_BROADCAST = 0x2 - IFF_DEBUG = 0x4 - IFF_LINK0 = 0x1000 - IFF_LINK1 = 0x2000 - IFF_LINK2 = 0x4000 - IFF_LOOPBACK = 0x8 - IFF_MULTICAST = 0x8000 - IFF_NOARP = 0x80 - IFF_NOTRAILERS = 0x20 - IFF_OACTIVE = 0x400 - IFF_POINTOPOINT = 0x10 - IFF_PROMISC = 0x100 - IFF_RUNNING = 0x40 - IFF_SIMPLEX = 0x800 - IFF_UP = 0x1 - IFNAMSIZ = 0x10 - IFT_1822 = 0x2 - IFT_6LOWPAN = 0x40 - IFT_AAL5 = 0x31 - IFT_ARCNET = 0x23 - IFT_ARCNETPLUS = 0x24 - IFT_ATM = 0x25 - IFT_BRIDGE = 0xd1 - IFT_CARP = 0xf8 - IFT_CELLULAR = 0xff - IFT_CEPT = 0x13 - IFT_DS3 = 0x1e - IFT_ENC = 0xf4 - IFT_EON = 0x19 - IFT_ETHER = 0x6 - IFT_FAITH = 0x38 - IFT_FDDI = 0xf - IFT_FRELAY = 0x20 - IFT_FRELAYDCE = 0x2c - IFT_GIF = 0x37 - IFT_HDH1822 = 0x3 - IFT_HIPPI = 0x2f - IFT_HSSI = 0x2e - IFT_HY = 0xe - IFT_IEEE1394 = 0x90 - IFT_IEEE8023ADLAG = 0x88 - IFT_ISDNBASIC = 0x14 - IFT_ISDNPRIMARY = 0x15 - IFT_ISO88022LLC = 0x29 - IFT_ISO88023 = 0x7 - IFT_ISO88024 = 0x8 - IFT_ISO88025 = 0x9 - IFT_ISO88026 = 0xa - IFT_L2VLAN = 0x87 - IFT_LAPB = 0x10 - IFT_LOCALTALK = 0x2a - IFT_LOOP = 0x18 - IFT_MIOX25 = 0x26 - IFT_MODEM = 0x30 - IFT_NSIP = 0x1b - IFT_OTHER = 0x1 - IFT_P10 = 0xc - IFT_P80 = 0xd - IFT_PARA = 0x22 - IFT_PDP = 0xff - IFT_PFLOG = 0xf5 - IFT_PFSYNC = 0xf6 - IFT_PKTAP = 0xfe - IFT_PPP = 0x17 - IFT_PROPMUX = 0x36 - IFT_PROPVIRTUAL = 0x35 - IFT_PTPSERIAL = 0x16 - IFT_RS232 = 0x21 - IFT_SDLC = 0x11 - IFT_SIP = 0x1f - IFT_SLIP = 0x1c - IFT_SMDSDXI = 0x2b - IFT_SMDSICIP = 0x34 - IFT_SONET = 0x27 - IFT_SONETPATH = 0x32 - IFT_SONETVT = 0x33 - IFT_STARLAN = 0xb - IFT_STF = 0x39 - IFT_T1 = 0x12 - IFT_ULTRA = 0x1d - IFT_V35 = 0x2d - IFT_X25 = 0x5 - IFT_X25DDN = 0x4 - IFT_X25PLE = 0x28 - IFT_XETHER = 0x1a - IGNBRK = 0x1 - IGNCR = 0x80 - IGNPAR = 0x4 - IMAXBEL = 0x2000 - INLCR = 0x40 - INPCK = 0x10 - IN_CLASSA_HOST = 0xffffff - IN_CLASSA_MAX = 0x80 - IN_CLASSA_NET = 0xff000000 - IN_CLASSA_NSHIFT = 0x18 - IN_CLASSB_HOST = 0xffff - IN_CLASSB_MAX = 0x10000 - IN_CLASSB_NET = 0xffff0000 - IN_CLASSB_NSHIFT = 0x10 - IN_CLASSC_HOST = 0xff - IN_CLASSC_NET = 0xffffff00 - IN_CLASSC_NSHIFT = 0x8 - IN_CLASSD_HOST = 0xfffffff - IN_CLASSD_NET = 0xf0000000 - IN_CLASSD_NSHIFT = 0x1c - IN_LINKLOCALNETNUM = 0xa9fe0000 - IN_LOOPBACKNET = 0x7f - IPPROTO_3PC = 0x22 - IPPROTO_ADFS = 0x44 - IPPROTO_AH = 0x33 - IPPROTO_AHIP = 0x3d - IPPROTO_APES = 0x63 - IPPROTO_ARGUS = 0xd - IPPROTO_AX25 = 0x5d - IPPROTO_BHA = 0x31 - IPPROTO_BLT = 0x1e - IPPROTO_BRSATMON = 0x4c - IPPROTO_CFTP = 0x3e - IPPROTO_CHAOS = 0x10 - IPPROTO_CMTP = 0x26 - IPPROTO_CPHB = 0x49 - IPPROTO_CPNX = 0x48 - IPPROTO_DDP = 0x25 - IPPROTO_DGP = 0x56 - IPPROTO_DIVERT = 0xfe - IPPROTO_DONE = 0x101 - IPPROTO_DSTOPTS = 0x3c - IPPROTO_EGP = 0x8 - IPPROTO_EMCON = 0xe - IPPROTO_ENCAP = 0x62 - IPPROTO_EON = 0x50 - IPPROTO_ESP = 0x32 - IPPROTO_ETHERIP = 0x61 - IPPROTO_FRAGMENT = 0x2c - IPPROTO_GGP = 0x3 - IPPROTO_GMTP = 0x64 - IPPROTO_GRE = 0x2f - IPPROTO_HELLO = 0x3f - IPPROTO_HMP = 0x14 - IPPROTO_HOPOPTS = 0x0 - IPPROTO_ICMP = 0x1 - IPPROTO_ICMPV6 = 0x3a - IPPROTO_IDP = 0x16 - IPPROTO_IDPR = 0x23 - IPPROTO_IDRP = 0x2d - IPPROTO_IGMP = 0x2 - IPPROTO_IGP = 0x55 - IPPROTO_IGRP = 0x58 - IPPROTO_IL = 0x28 - IPPROTO_INLSP = 0x34 - IPPROTO_INP = 0x20 - IPPROTO_IP = 0x0 - IPPROTO_IPCOMP = 0x6c - IPPROTO_IPCV = 0x47 - IPPROTO_IPEIP = 0x5e - IPPROTO_IPIP = 0x4 - IPPROTO_IPPC = 0x43 - IPPROTO_IPV4 = 0x4 - IPPROTO_IPV6 = 0x29 - IPPROTO_IRTP = 0x1c - IPPROTO_KRYPTOLAN = 0x41 - IPPROTO_LARP = 0x5b - IPPROTO_LEAF1 = 0x19 - IPPROTO_LEAF2 = 0x1a - IPPROTO_MAX = 0x100 - IPPROTO_MAXID = 0x34 - IPPROTO_MEAS = 0x13 - IPPROTO_MHRP = 0x30 - IPPROTO_MICP = 0x5f - IPPROTO_MTP = 0x5c - IPPROTO_MUX = 0x12 - IPPROTO_ND = 0x4d - IPPROTO_NHRP = 0x36 - IPPROTO_NONE = 0x3b - IPPROTO_NSP = 0x1f - IPPROTO_NVPII = 0xb - IPPROTO_OSPFIGP = 0x59 - IPPROTO_PGM = 0x71 - IPPROTO_PIGP = 0x9 - IPPROTO_PIM = 0x67 - IPPROTO_PRM = 0x15 - IPPROTO_PUP = 0xc - IPPROTO_PVP = 0x4b - IPPROTO_RAW = 0xff - IPPROTO_RCCMON = 0xa - IPPROTO_RDP = 0x1b - IPPROTO_ROUTING = 0x2b - IPPROTO_RSVP = 0x2e - IPPROTO_RVD = 0x42 - IPPROTO_SATEXPAK = 0x40 - IPPROTO_SATMON = 0x45 - IPPROTO_SCCSP = 0x60 - IPPROTO_SCTP = 0x84 - IPPROTO_SDRP = 0x2a - IPPROTO_SEP = 0x21 - IPPROTO_SRPC = 0x5a - IPPROTO_ST = 0x7 - IPPROTO_SVMTP = 0x52 - IPPROTO_SWIPE = 0x35 - IPPROTO_TCF = 0x57 - IPPROTO_TCP = 0x6 - IPPROTO_TP = 0x1d - IPPROTO_TPXX = 0x27 - IPPROTO_TRUNK1 = 0x17 - IPPROTO_TRUNK2 = 0x18 - IPPROTO_TTP = 0x54 - IPPROTO_UDP = 0x11 - IPPROTO_VINES = 0x53 - IPPROTO_VISA = 0x46 - IPPROTO_VMTP = 0x51 - IPPROTO_WBEXPAK = 0x4f - IPPROTO_WBMON = 0x4e - IPPROTO_WSN = 0x4a - IPPROTO_XNET = 0xf - IPPROTO_XTP = 0x24 - IPV6_2292DSTOPTS = 0x17 - IPV6_2292HOPLIMIT = 0x14 - IPV6_2292HOPOPTS = 0x16 - IPV6_2292NEXTHOP = 0x15 - IPV6_2292PKTINFO = 0x13 - IPV6_2292PKTOPTIONS = 0x19 - IPV6_2292RTHDR = 0x18 - IPV6_3542DSTOPTS = 0x32 - IPV6_3542HOPLIMIT = 0x2f - IPV6_3542HOPOPTS = 0x31 - IPV6_3542NEXTHOP = 0x30 - IPV6_3542PKTINFO = 0x2e - IPV6_3542RTHDR = 0x33 - IPV6_ADDR_MC_FLAGS_PREFIX = 0x20 - IPV6_ADDR_MC_FLAGS_TRANSIENT = 0x10 - IPV6_ADDR_MC_FLAGS_UNICAST_BASED = 0x30 - IPV6_AUTOFLOWLABEL = 0x3b - IPV6_BINDV6ONLY = 0x1b - IPV6_BOUND_IF = 0x7d - IPV6_CHECKSUM = 0x1a - IPV6_DEFAULT_MULTICAST_HOPS = 0x1 - IPV6_DEFAULT_MULTICAST_LOOP = 0x1 - IPV6_DEFHLIM = 0x40 - IPV6_DONTFRAG = 0x3e - IPV6_DSTOPTS = 0x32 - IPV6_FAITH = 0x1d - IPV6_FLOWINFO_MASK = 0xffffff0f - IPV6_FLOWLABEL_MASK = 0xffff0f00 - IPV6_FLOW_ECN_MASK = 0x3000 - IPV6_FRAGTTL = 0x3c - IPV6_FW_ADD = 0x1e - IPV6_FW_DEL = 0x1f - IPV6_FW_FLUSH = 0x20 - IPV6_FW_GET = 0x22 - IPV6_FW_ZERO = 0x21 - IPV6_HLIMDEC = 0x1 - IPV6_HOPLIMIT = 0x2f - IPV6_HOPOPTS = 0x31 - IPV6_IPSEC_POLICY = 0x1c - IPV6_JOIN_GROUP = 0xc - IPV6_LEAVE_GROUP = 0xd - IPV6_MAXHLIM = 0xff - IPV6_MAXOPTHDR = 0x800 - IPV6_MAXPACKET = 0xffff - IPV6_MAX_GROUP_SRC_FILTER = 0x200 - IPV6_MAX_MEMBERSHIPS = 0xfff - IPV6_MAX_SOCK_SRC_FILTER = 0x80 - IPV6_MIN_MEMBERSHIPS = 0x1f - IPV6_MMTU = 0x500 - IPV6_MSFILTER = 0x4a - IPV6_MULTICAST_HOPS = 0xa - IPV6_MULTICAST_IF = 0x9 - IPV6_MULTICAST_LOOP = 0xb - IPV6_NEXTHOP = 0x30 - IPV6_PATHMTU = 0x2c - IPV6_PKTINFO = 0x2e - IPV6_PORTRANGE = 0xe - IPV6_PORTRANGE_DEFAULT = 0x0 - IPV6_PORTRANGE_HIGH = 0x1 - IPV6_PORTRANGE_LOW = 0x2 - IPV6_PREFER_TEMPADDR = 0x3f - IPV6_RECVDSTOPTS = 0x28 - IPV6_RECVHOPLIMIT = 0x25 - IPV6_RECVHOPOPTS = 0x27 - IPV6_RECVPATHMTU = 0x2b - IPV6_RECVPKTINFO = 0x3d - IPV6_RECVRTHDR = 0x26 - IPV6_RECVTCLASS = 0x23 - IPV6_RTHDR = 0x33 - IPV6_RTHDRDSTOPTS = 0x39 - IPV6_RTHDR_LOOSE = 0x0 - IPV6_RTHDR_STRICT = 0x1 - IPV6_RTHDR_TYPE_0 = 0x0 - IPV6_SOCKOPT_RESERVED1 = 0x3 - IPV6_TCLASS = 0x24 - IPV6_UNICAST_HOPS = 0x4 - IPV6_USE_MIN_MTU = 0x2a - IPV6_V6ONLY = 0x1b - IPV6_VERSION = 0x60 - IPV6_VERSION_MASK = 0xf0 - IP_ADD_MEMBERSHIP = 0xc - IP_ADD_SOURCE_MEMBERSHIP = 0x46 - IP_BLOCK_SOURCE = 0x48 - IP_BOUND_IF = 0x19 - IP_DEFAULT_MULTICAST_LOOP = 0x1 - IP_DEFAULT_MULTICAST_TTL = 0x1 - IP_DF = 0x4000 - IP_DONTFRAG = 0x1c - IP_DROP_MEMBERSHIP = 0xd - IP_DROP_SOURCE_MEMBERSHIP = 0x47 - IP_DUMMYNET_CONFIGURE = 0x3c - IP_DUMMYNET_DEL = 0x3d - IP_DUMMYNET_FLUSH = 0x3e - IP_DUMMYNET_GET = 0x40 - IP_FAITH = 0x16 - IP_FW_ADD = 0x28 - IP_FW_DEL = 0x29 - IP_FW_FLUSH = 0x2a - IP_FW_GET = 0x2c - IP_FW_RESETLOG = 0x2d - IP_FW_ZERO = 0x2b - IP_HDRINCL = 0x2 - IP_IPSEC_POLICY = 0x15 - IP_MAXPACKET = 0xffff - IP_MAX_GROUP_SRC_FILTER = 0x200 - IP_MAX_MEMBERSHIPS = 0xfff - IP_MAX_SOCK_MUTE_FILTER = 0x80 - IP_MAX_SOCK_SRC_FILTER = 0x80 - IP_MF = 0x2000 - IP_MIN_MEMBERSHIPS = 0x1f - IP_MSFILTER = 0x4a - IP_MSS = 0x240 - IP_MULTICAST_IF = 0x9 - IP_MULTICAST_IFINDEX = 0x42 - IP_MULTICAST_LOOP = 0xb - IP_MULTICAST_TTL = 0xa - IP_MULTICAST_VIF = 0xe - IP_NAT__XXX = 0x37 - IP_OFFMASK = 0x1fff - IP_OLD_FW_ADD = 0x32 - IP_OLD_FW_DEL = 0x33 - IP_OLD_FW_FLUSH = 0x34 - IP_OLD_FW_GET = 0x36 - IP_OLD_FW_RESETLOG = 0x38 - IP_OLD_FW_ZERO = 0x35 - IP_OPTIONS = 0x1 - IP_PKTINFO = 0x1a - IP_PORTRANGE = 0x13 - IP_PORTRANGE_DEFAULT = 0x0 - IP_PORTRANGE_HIGH = 0x1 - IP_PORTRANGE_LOW = 0x2 - IP_RECVDSTADDR = 0x7 - IP_RECVIF = 0x14 - IP_RECVOPTS = 0x5 - IP_RECVPKTINFO = 0x1a - IP_RECVRETOPTS = 0x6 - IP_RECVTOS = 0x1b - IP_RECVTTL = 0x18 - IP_RETOPTS = 0x8 - IP_RF = 0x8000 - IP_RSVP_OFF = 0x10 - IP_RSVP_ON = 0xf - IP_RSVP_VIF_OFF = 0x12 - IP_RSVP_VIF_ON = 0x11 - IP_STRIPHDR = 0x17 - IP_TOS = 0x3 - IP_TRAFFIC_MGT_BACKGROUND = 0x41 - IP_TTL = 0x4 - IP_UNBLOCK_SOURCE = 0x49 - ISIG = 0x80 - ISTRIP = 0x20 - IUTF8 = 0x4000 - IXANY = 0x800 - IXOFF = 0x400 - IXON = 0x200 - KERN_HOSTNAME = 0xa - KERN_OSRELEASE = 0x2 - KERN_OSTYPE = 0x1 - KERN_VERSION = 0x4 - LOCAL_PEERCRED = 0x1 - LOCAL_PEEREPID = 0x3 - LOCAL_PEEREUUID = 0x5 - LOCAL_PEERPID = 0x2 - LOCAL_PEERTOKEN = 0x6 - LOCAL_PEERUUID = 0x4 - LOCK_EX = 0x2 - LOCK_NB = 0x4 - LOCK_SH = 0x1 - LOCK_UN = 0x8 - MADV_CAN_REUSE = 0x9 - MADV_DONTNEED = 0x4 - MADV_FREE = 0x5 - MADV_FREE_REUSABLE = 0x7 - MADV_FREE_REUSE = 0x8 - MADV_NORMAL = 0x0 - MADV_PAGEOUT = 0xa - MADV_RANDOM = 0x1 - MADV_SEQUENTIAL = 0x2 - MADV_WILLNEED = 0x3 - MADV_ZERO_WIRED_PAGES = 0x6 - MAP_32BIT = 0x8000 - MAP_ANON = 0x1000 - MAP_ANONYMOUS = 0x1000 - MAP_COPY = 0x2 - MAP_FILE = 0x0 - MAP_FIXED = 0x10 - MAP_HASSEMAPHORE = 0x200 - MAP_JIT = 0x800 - MAP_NOCACHE = 0x400 - MAP_NOEXTEND = 0x100 - MAP_NORESERVE = 0x40 - MAP_PRIVATE = 0x2 - MAP_RENAME = 0x20 - MAP_RESERVED0080 = 0x80 - MAP_RESILIENT_CODESIGN = 0x2000 - MAP_RESILIENT_MEDIA = 0x4000 - MAP_SHARED = 0x1 - MAP_TRANSLATED_ALLOW_EXECUTE = 0x20000 - MAP_UNIX03 = 0x40000 - MCAST_BLOCK_SOURCE = 0x54 - MCAST_EXCLUDE = 0x2 - MCAST_INCLUDE = 0x1 - MCAST_JOIN_GROUP = 0x50 - MCAST_JOIN_SOURCE_GROUP = 0x52 - MCAST_LEAVE_GROUP = 0x51 - MCAST_LEAVE_SOURCE_GROUP = 0x53 - MCAST_UNBLOCK_SOURCE = 0x55 - MCAST_UNDEFINED = 0x0 - MCL_CURRENT = 0x1 - MCL_FUTURE = 0x2 - MNT_ASYNC = 0x40 - MNT_AUTOMOUNTED = 0x400000 - MNT_CMDFLAGS = 0xf0000 - MNT_CPROTECT = 0x80 - MNT_DEFWRITE = 0x2000000 - MNT_DONTBROWSE = 0x100000 - MNT_DOVOLFS = 0x8000 - MNT_DWAIT = 0x4 - MNT_EXPORTED = 0x100 - MNT_EXT_ROOT_DATA_VOL = 0x1 - MNT_FORCE = 0x80000 - MNT_IGNORE_OWNERSHIP = 0x200000 - MNT_JOURNALED = 0x800000 - MNT_LOCAL = 0x1000 - MNT_MULTILABEL = 0x4000000 - MNT_NOATIME = 0x10000000 - MNT_NOBLOCK = 0x20000 - MNT_NODEV = 0x10 - MNT_NOEXEC = 0x4 - MNT_NOSUID = 0x8 - MNT_NOUSERXATTR = 0x1000000 - MNT_NOWAIT = 0x2 - MNT_QUARANTINE = 0x400 - MNT_QUOTA = 0x2000 - MNT_RDONLY = 0x1 - MNT_RELOAD = 0x40000 - MNT_REMOVABLE = 0x200 - MNT_ROOTFS = 0x4000 - MNT_SNAPSHOT = 0x40000000 - MNT_STRICTATIME = 0x80000000 - MNT_SYNCHRONOUS = 0x2 - MNT_UNION = 0x20 - MNT_UNKNOWNPERMISSIONS = 0x200000 - MNT_UPDATE = 0x10000 - MNT_VISFLAGMASK = 0xd7f0f7ff - MNT_WAIT = 0x1 - MSG_CTRUNC = 0x20 - MSG_DONTROUTE = 0x4 - MSG_DONTWAIT = 0x80 - MSG_EOF = 0x100 - MSG_EOR = 0x8 - MSG_FLUSH = 0x400 - MSG_HAVEMORE = 0x2000 - MSG_HOLD = 0x800 - MSG_NEEDSA = 0x10000 - MSG_NOSIGNAL = 0x80000 - MSG_OOB = 0x1 - MSG_PEEK = 0x2 - MSG_RCVMORE = 0x4000 - MSG_SEND = 0x1000 - MSG_TRUNC = 0x10 - MSG_WAITALL = 0x40 - MSG_WAITSTREAM = 0x200 - MS_ASYNC = 0x1 - MS_DEACTIVATE = 0x8 - MS_INVALIDATE = 0x2 - MS_KILLPAGES = 0x4 - MS_SYNC = 0x10 - NAME_MAX = 0xff - NET_RT_DUMP = 0x1 - NET_RT_DUMP2 = 0x7 - NET_RT_FLAGS = 0x2 - NET_RT_FLAGS_PRIV = 0xa - NET_RT_IFLIST = 0x3 - NET_RT_IFLIST2 = 0x6 - NET_RT_MAXID = 0xb - NET_RT_STAT = 0x4 - NET_RT_TRASH = 0x5 - NFDBITS = 0x20 - NL0 = 0x0 - NL1 = 0x100 - NL2 = 0x200 - NL3 = 0x300 - NLDLY = 0x300 - NOFLSH = 0x80000000 - NOKERNINFO = 0x2000000 - NOTE_ABSOLUTE = 0x8 - NOTE_ATTRIB = 0x8 - NOTE_BACKGROUND = 0x40 - NOTE_CHILD = 0x4 - NOTE_CRITICAL = 0x20 - NOTE_DELETE = 0x1 - NOTE_EXEC = 0x20000000 - NOTE_EXIT = 0x80000000 - NOTE_EXITSTATUS = 0x4000000 - NOTE_EXIT_CSERROR = 0x40000 - NOTE_EXIT_DECRYPTFAIL = 0x10000 - NOTE_EXIT_DETAIL = 0x2000000 - NOTE_EXIT_DETAIL_MASK = 0x70000 - NOTE_EXIT_MEMORY = 0x20000 - NOTE_EXIT_REPARENTED = 0x80000 - NOTE_EXTEND = 0x4 - NOTE_FFAND = 0x40000000 - NOTE_FFCOPY = 0xc0000000 - NOTE_FFCTRLMASK = 0xc0000000 - NOTE_FFLAGSMASK = 0xffffff - NOTE_FFNOP = 0x0 - NOTE_FFOR = 0x80000000 - NOTE_FORK = 0x40000000 - NOTE_FUNLOCK = 0x100 - NOTE_LEEWAY = 0x10 - NOTE_LINK = 0x10 - NOTE_LOWAT = 0x1 - NOTE_MACHTIME = 0x100 - NOTE_MACH_CONTINUOUS_TIME = 0x80 - NOTE_NONE = 0x80 - NOTE_NSECONDS = 0x4 - NOTE_OOB = 0x2 - NOTE_PCTRLMASK = -0x100000 - NOTE_PDATAMASK = 0xfffff - NOTE_REAP = 0x10000000 - NOTE_RENAME = 0x20 - NOTE_REVOKE = 0x40 - NOTE_SECONDS = 0x1 - NOTE_SIGNAL = 0x8000000 - NOTE_TRACK = 0x1 - NOTE_TRACKERR = 0x2 - NOTE_TRIGGER = 0x1000000 - NOTE_USECONDS = 0x2 - NOTE_VM_ERROR = 0x10000000 - NOTE_VM_PRESSURE = 0x80000000 - NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 - NOTE_VM_PRESSURE_TERMINATE = 0x40000000 - NOTE_WRITE = 0x2 - OCRNL = 0x10 - OFDEL = 0x20000 - OFILL = 0x80 - ONLCR = 0x2 - ONLRET = 0x40 - ONOCR = 0x20 - ONOEOT = 0x8 - OPOST = 0x1 - OXTABS = 0x4 - O_ACCMODE = 0x3 - O_ALERT = 0x20000000 - O_APPEND = 0x8 - O_ASYNC = 0x40 - O_CLOEXEC = 0x1000000 - O_CREAT = 0x200 - O_DIRECTORY = 0x100000 - O_DP_GETRAWENCRYPTED = 0x1 - O_DP_GETRAWUNENCRYPTED = 0x2 - O_DSYNC = 0x400000 - O_EVTONLY = 0x8000 - O_EXCL = 0x800 - O_EXLOCK = 0x20 - O_FSYNC = 0x80 - O_NDELAY = 0x4 - O_NOCTTY = 0x20000 - O_NOFOLLOW = 0x100 - O_NOFOLLOW_ANY = 0x20000000 - O_NONBLOCK = 0x4 - O_POPUP = 0x80000000 - O_RDONLY = 0x0 - O_RDWR = 0x2 - O_SHLOCK = 0x10 - O_SYMLINK = 0x200000 - O_SYNC = 0x80 - O_TRUNC = 0x400 - O_WRONLY = 0x1 - PARENB = 0x1000 - PARMRK = 0x8 - PARODD = 0x2000 - PENDIN = 0x20000000 - PRIO_PGRP = 0x1 - PRIO_PROCESS = 0x0 - PRIO_USER = 0x2 - PROT_EXEC = 0x4 - PROT_NONE = 0x0 - PROT_READ = 0x1 - PROT_WRITE = 0x2 - PT_ATTACH = 0xa - PT_ATTACHEXC = 0xe - PT_CONTINUE = 0x7 - PT_DENY_ATTACH = 0x1f - PT_DETACH = 0xb - PT_FIRSTMACH = 0x20 - PT_FORCEQUOTA = 0x1e - PT_KILL = 0x8 - PT_READ_D = 0x2 - PT_READ_I = 0x1 - PT_READ_U = 0x3 - PT_SIGEXC = 0xc - PT_STEP = 0x9 - PT_THUPDATE = 0xd - PT_TRACE_ME = 0x0 - PT_WRITE_D = 0x5 - PT_WRITE_I = 0x4 - PT_WRITE_U = 0x6 - RLIMIT_AS = 0x5 - RLIMIT_CORE = 0x4 - RLIMIT_CPU = 0x0 - RLIMIT_CPU_USAGE_MONITOR = 0x2 - RLIMIT_DATA = 0x2 - RLIMIT_FSIZE = 0x1 - RLIMIT_MEMLOCK = 0x6 - RLIMIT_NOFILE = 0x8 - RLIMIT_NPROC = 0x7 - RLIMIT_RSS = 0x5 - RLIMIT_STACK = 0x3 - RLIM_INFINITY = 0x7fffffffffffffff - RTAX_AUTHOR = 0x6 - RTAX_BRD = 0x7 - RTAX_DST = 0x0 - RTAX_GATEWAY = 0x1 - RTAX_GENMASK = 0x3 - RTAX_IFA = 0x5 - RTAX_IFP = 0x4 - RTAX_MAX = 0x8 - RTAX_NETMASK = 0x2 - RTA_AUTHOR = 0x40 - RTA_BRD = 0x80 - RTA_DST = 0x1 - RTA_GATEWAY = 0x2 - RTA_GENMASK = 0x8 - RTA_IFA = 0x20 - RTA_IFP = 0x10 - RTA_NETMASK = 0x4 - RTF_BLACKHOLE = 0x1000 - RTF_BROADCAST = 0x400000 - RTF_CLONING = 0x100 - RTF_CONDEMNED = 0x2000000 - RTF_DEAD = 0x20000000 - RTF_DELCLONE = 0x80 - RTF_DONE = 0x40 - RTF_DYNAMIC = 0x10 - RTF_GATEWAY = 0x2 - RTF_GLOBAL = 0x40000000 - RTF_HOST = 0x4 - RTF_IFREF = 0x4000000 - RTF_IFSCOPE = 0x1000000 - RTF_LLDATA = 0x400 - RTF_LLINFO = 0x400 - RTF_LOCAL = 0x200000 - RTF_MODIFIED = 0x20 - RTF_MULTICAST = 0x800000 - RTF_NOIFREF = 0x2000 - RTF_PINNED = 0x100000 - RTF_PRCLONING = 0x10000 - RTF_PROTO1 = 0x8000 - RTF_PROTO2 = 0x4000 - RTF_PROTO3 = 0x40000 - RTF_PROXY = 0x8000000 - RTF_REJECT = 0x8 - RTF_ROUTER = 0x10000000 - RTF_STATIC = 0x800 - RTF_UP = 0x1 - RTF_WASCLONED = 0x20000 - RTF_XRESOLVE = 0x200 - RTM_ADD = 0x1 - RTM_CHANGE = 0x3 - RTM_DELADDR = 0xd - RTM_DELETE = 0x2 - RTM_DELMADDR = 0x10 - RTM_GET = 0x4 - RTM_GET2 = 0x14 - RTM_IFINFO = 0xe - RTM_IFINFO2 = 0x12 - RTM_LOCK = 0x8 - RTM_LOSING = 0x5 - RTM_MISS = 0x7 - RTM_NEWADDR = 0xc - RTM_NEWMADDR = 0xf - RTM_NEWMADDR2 = 0x13 - RTM_OLDADD = 0x9 - RTM_OLDDEL = 0xa - RTM_REDIRECT = 0x6 - RTM_RESOLVE = 0xb - RTM_RTTUNIT = 0xf4240 - RTM_VERSION = 0x5 - RTV_EXPIRE = 0x4 - RTV_HOPCOUNT = 0x2 - RTV_MTU = 0x1 - RTV_RPIPE = 0x8 - RTV_RTT = 0x40 - RTV_RTTVAR = 0x80 - RTV_SPIPE = 0x10 - RTV_SSTHRESH = 0x20 - RUSAGE_CHILDREN = -0x1 - RUSAGE_SELF = 0x0 - SCM_CREDS = 0x3 - SCM_RIGHTS = 0x1 - SCM_TIMESTAMP = 0x2 - SCM_TIMESTAMP_MONOTONIC = 0x4 - SEEK_CUR = 0x1 - SEEK_DATA = 0x4 - SEEK_END = 0x2 - SEEK_HOLE = 0x3 - SEEK_SET = 0x0 - SHUT_RD = 0x0 - SHUT_RDWR = 0x2 - SHUT_WR = 0x1 - SIOCADDMULTI = 0x80206931 - SIOCAIFADDR = 0x8040691a - SIOCARPIPLL = 0xc0206928 - SIOCATMARK = 0x40047307 - SIOCAUTOADDR = 0xc0206926 - SIOCAUTONETMASK = 0x80206927 - SIOCDELMULTI = 0x80206932 - SIOCDIFADDR = 0x80206919 - SIOCDIFPHYADDR = 0x80206941 - SIOCGDRVSPEC = 0xc028697b - SIOCGETVLAN = 0xc020697f - SIOCGHIWAT = 0x40047301 - SIOCGIF6LOWPAN = 0xc02069c5 - SIOCGIFADDR = 0xc0206921 - SIOCGIFALTMTU = 0xc0206948 - SIOCGIFASYNCMAP = 0xc020697c - SIOCGIFBOND = 0xc0206947 - SIOCGIFBRDADDR = 0xc0206923 - SIOCGIFCAP = 0xc020695b - SIOCGIFCONF = 0xc00c6924 - SIOCGIFDEVMTU = 0xc0206944 - SIOCGIFDSTADDR = 0xc0206922 - SIOCGIFFLAGS = 0xc0206911 - SIOCGIFFUNCTIONALTYPE = 0xc02069ad - SIOCGIFGENERIC = 0xc020693a - SIOCGIFKPI = 0xc0206987 - SIOCGIFMAC = 0xc0206982 - SIOCGIFMEDIA = 0xc02c6938 - SIOCGIFMETRIC = 0xc0206917 - SIOCGIFMTU = 0xc0206933 - SIOCGIFNETMASK = 0xc0206925 - SIOCGIFPDSTADDR = 0xc0206940 - SIOCGIFPHYS = 0xc0206935 - SIOCGIFPSRCADDR = 0xc020693f - SIOCGIFSTATUS = 0xc331693d - SIOCGIFVLAN = 0xc020697f - SIOCGIFWAKEFLAGS = 0xc0206988 - SIOCGIFXMEDIA = 0xc02c6948 - SIOCGLOWAT = 0x40047303 - SIOCGPGRP = 0x40047309 - SIOCIFCREATE = 0xc0206978 - SIOCIFCREATE2 = 0xc020697a - SIOCIFDESTROY = 0x80206979 - SIOCIFGCLONERS = 0xc0106981 - SIOCRSLVMULTI = 0xc010693b - SIOCSDRVSPEC = 0x8028697b - SIOCSETVLAN = 0x8020697e - SIOCSHIWAT = 0x80047300 - SIOCSIF6LOWPAN = 0x802069c4 - SIOCSIFADDR = 0x8020690c - SIOCSIFALTMTU = 0x80206945 - SIOCSIFASYNCMAP = 0x8020697d - SIOCSIFBOND = 0x80206946 - SIOCSIFBRDADDR = 0x80206913 - SIOCSIFCAP = 0x8020695a - SIOCSIFDSTADDR = 0x8020690e - SIOCSIFFLAGS = 0x80206910 - SIOCSIFGENERIC = 0x80206939 - SIOCSIFKPI = 0x80206986 - SIOCSIFLLADDR = 0x8020693c - SIOCSIFMAC = 0x80206983 - SIOCSIFMEDIA = 0xc0206937 - SIOCSIFMETRIC = 0x80206918 - SIOCSIFMTU = 0x80206934 - SIOCSIFNETMASK = 0x80206916 - SIOCSIFPHYADDR = 0x8040693e - SIOCSIFPHYS = 0x80206936 - SIOCSIFVLAN = 0x8020697e - SIOCSLOWAT = 0x80047302 - SIOCSPGRP = 0x80047308 - SOCK_DGRAM = 0x2 - SOCK_MAXADDRLEN = 0xff - SOCK_RAW = 0x3 - SOCK_RDM = 0x4 - SOCK_SEQPACKET = 0x5 - SOCK_STREAM = 0x1 - SOL_LOCAL = 0x0 - SOL_SOCKET = 0xffff - SOMAXCONN = 0x80 - SO_ACCEPTCONN = 0x2 - SO_BROADCAST = 0x20 - SO_DEBUG = 0x1 - SO_DONTROUTE = 0x10 - SO_DONTTRUNC = 0x2000 - SO_ERROR = 0x1007 - SO_KEEPALIVE = 0x8 - SO_LABEL = 0x1010 - SO_LINGER = 0x80 - SO_LINGER_SEC = 0x1080 - SO_NETSVC_MARKING_LEVEL = 0x1119 - SO_NET_SERVICE_TYPE = 0x1116 - SO_NKE = 0x1021 - SO_NOADDRERR = 0x1023 - SO_NOSIGPIPE = 0x1022 - SO_NOTIFYCONFLICT = 0x1026 - SO_NP_EXTENSIONS = 0x1083 - SO_NREAD = 0x1020 - SO_NUMRCVPKT = 0x1112 - SO_NWRITE = 0x1024 - SO_OOBINLINE = 0x100 - SO_PEERLABEL = 0x1011 - SO_RANDOMPORT = 0x1082 - SO_RCVBUF = 0x1002 - SO_RCVLOWAT = 0x1004 - SO_RCVTIMEO = 0x1006 - SO_REUSEADDR = 0x4 - SO_REUSEPORT = 0x200 - SO_REUSESHAREUID = 0x1025 - SO_SNDBUF = 0x1001 - SO_SNDLOWAT = 0x1003 - SO_SNDTIMEO = 0x1005 - SO_TIMESTAMP = 0x400 - SO_TIMESTAMP_MONOTONIC = 0x800 - SO_TYPE = 0x1008 - SO_UPCALLCLOSEWAIT = 0x1027 - SO_USELOOPBACK = 0x40 - SO_WANTMORE = 0x4000 - SO_WANTOOBFLAG = 0x8000 - S_IEXEC = 0x40 - S_IFBLK = 0x6000 - S_IFCHR = 0x2000 - S_IFDIR = 0x4000 - S_IFIFO = 0x1000 - S_IFLNK = 0xa000 - S_IFMT = 0xf000 - S_IFREG = 0x8000 - S_IFSOCK = 0xc000 - S_IFWHT = 0xe000 - S_IREAD = 0x100 - S_IRGRP = 0x20 - S_IROTH = 0x4 - S_IRUSR = 0x100 - S_IRWXG = 0x38 - S_IRWXO = 0x7 - S_IRWXU = 0x1c0 - S_ISGID = 0x400 - S_ISTXT = 0x200 - S_ISUID = 0x800 - S_ISVTX = 0x200 - S_IWGRP = 0x10 - S_IWOTH = 0x2 - S_IWRITE = 0x80 - S_IWUSR = 0x80 - S_IXGRP = 0x8 - S_IXOTH = 0x1 - S_IXUSR = 0x40 - TAB0 = 0x0 - TAB1 = 0x400 - TAB2 = 0x800 - TAB3 = 0x4 - TABDLY = 0xc04 - TCIFLUSH = 0x1 - TCIOFF = 0x3 - TCIOFLUSH = 0x3 - TCION = 0x4 - TCOFLUSH = 0x2 - TCOOFF = 0x1 - TCOON = 0x2 - TCP_CONNECTIONTIMEOUT = 0x20 - TCP_CONNECTION_INFO = 0x106 - TCP_ENABLE_ECN = 0x104 - TCP_FASTOPEN = 0x105 - TCP_KEEPALIVE = 0x10 - TCP_KEEPCNT = 0x102 - TCP_KEEPINTVL = 0x101 - TCP_MAXHLEN = 0x3c - TCP_MAXOLEN = 0x28 - TCP_MAXSEG = 0x2 - TCP_MAXWIN = 0xffff - TCP_MAX_SACK = 0x4 - TCP_MAX_WINSHIFT = 0xe - TCP_MINMSS = 0xd8 - TCP_MSS = 0x200 - TCP_NODELAY = 0x1 - TCP_NOOPT = 0x8 - TCP_NOPUSH = 0x4 - TCP_NOTSENT_LOWAT = 0x201 - TCP_RXT_CONNDROPTIME = 0x80 - TCP_RXT_FINDROP = 0x100 - TCP_SENDMOREACKS = 0x103 - TCSAFLUSH = 0x2 - TIOCCBRK = 0x2000747a - TIOCCDTR = 0x20007478 - TIOCCONS = 0x80047462 - TIOCDCDTIMESTAMP = 0x40107458 - TIOCDRAIN = 0x2000745e - TIOCDSIMICROCODE = 0x20007455 - TIOCEXCL = 0x2000740d - TIOCEXT = 0x80047460 - TIOCFLUSH = 0x80047410 - TIOCGDRAINWAIT = 0x40047456 - TIOCGETA = 0x40487413 - TIOCGETD = 0x4004741a - TIOCGPGRP = 0x40047477 - TIOCGWINSZ = 0x40087468 - TIOCIXOFF = 0x20007480 - TIOCIXON = 0x20007481 - TIOCMBIC = 0x8004746b - TIOCMBIS = 0x8004746c - TIOCMGDTRWAIT = 0x4004745a - TIOCMGET = 0x4004746a - TIOCMODG = 0x40047403 - TIOCMODS = 0x80047404 - TIOCMSDTRWAIT = 0x8004745b - TIOCMSET = 0x8004746d - TIOCM_CAR = 0x40 - TIOCM_CD = 0x40 - TIOCM_CTS = 0x20 - TIOCM_DSR = 0x100 - TIOCM_DTR = 0x2 - TIOCM_LE = 0x1 - TIOCM_RI = 0x80 - TIOCM_RNG = 0x80 - TIOCM_RTS = 0x4 - TIOCM_SR = 0x10 - TIOCM_ST = 0x8 - TIOCNOTTY = 0x20007471 - TIOCNXCL = 0x2000740e - TIOCOUTQ = 0x40047473 - TIOCPKT = 0x80047470 - TIOCPKT_DATA = 0x0 - TIOCPKT_DOSTOP = 0x20 - TIOCPKT_FLUSHREAD = 0x1 - TIOCPKT_FLUSHWRITE = 0x2 - TIOCPKT_IOCTL = 0x40 - TIOCPKT_NOSTOP = 0x10 - TIOCPKT_START = 0x8 - TIOCPKT_STOP = 0x4 - TIOCPTYGNAME = 0x40807453 - TIOCPTYGRANT = 0x20007454 - TIOCPTYUNLK = 0x20007452 - TIOCREMOTE = 0x80047469 - TIOCSBRK = 0x2000747b - TIOCSCONS = 0x20007463 - TIOCSCTTY = 0x20007461 - TIOCSDRAINWAIT = 0x80047457 - TIOCSDTR = 0x20007479 - TIOCSETA = 0x80487414 - TIOCSETAF = 0x80487416 - TIOCSETAW = 0x80487415 - TIOCSETD = 0x8004741b - TIOCSIG = 0x2000745f - TIOCSPGRP = 0x80047476 - TIOCSTART = 0x2000746e - TIOCSTAT = 0x20007465 - TIOCSTI = 0x80017472 - TIOCSTOP = 0x2000746f - TIOCSWINSZ = 0x80087467 - TIOCTIMESTAMP = 0x40107459 - TIOCUCNTL = 0x80047466 - TOSTOP = 0x400000 - VDISCARD = 0xf - VDSUSP = 0xb - VEOF = 0x0 - VEOL = 0x1 - VEOL2 = 0x2 - VERASE = 0x3 - VINTR = 0x8 - VKILL = 0x5 - VLNEXT = 0xe - VMIN = 0x10 - VM_LOADAVG = 0x2 - VM_MACHFACTOR = 0x4 - VM_MAXID = 0x6 - VM_METER = 0x1 - VM_SWAPUSAGE = 0x5 - VQUIT = 0x9 - VREPRINT = 0x6 - VSTART = 0xc - VSTATUS = 0x12 - VSTOP = 0xd - VSUSP = 0xa - VT0 = 0x0 - VT1 = 0x10000 - VTDLY = 0x10000 - VTIME = 0x11 - VWERASE = 0x4 - WCONTINUED = 0x10 - WCOREFLAG = 0x80 - WEXITED = 0x4 - WNOHANG = 0x1 - WNOWAIT = 0x20 - WORDSIZE = 0x40 - WSTOPPED = 0x8 - WUNTRACED = 0x2 - XATTR_CREATE = 0x2 - XATTR_NODEFAULT = 0x10 - XATTR_NOFOLLOW = 0x1 - XATTR_NOSECURITY = 0x8 - XATTR_REPLACE = 0x4 - XATTR_SHOWCOMPRESSION = 0x20 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_SYS_CONTROL = 0x2 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + AF_VSOCK = 0x28 + ALTWERASE = 0x200 + ATTR_BIT_MAP_COUNT = 0x5 + ATTR_CMN_ACCESSMASK = 0x20000 + ATTR_CMN_ACCTIME = 0x1000 + ATTR_CMN_ADDEDTIME = 0x10000000 + ATTR_CMN_BKUPTIME = 0x2000 + ATTR_CMN_CHGTIME = 0x800 + ATTR_CMN_CRTIME = 0x200 + ATTR_CMN_DATA_PROTECT_FLAGS = 0x40000000 + ATTR_CMN_DEVID = 0x2 + ATTR_CMN_DOCUMENT_ID = 0x100000 + ATTR_CMN_ERROR = 0x20000000 + ATTR_CMN_EXTENDED_SECURITY = 0x400000 + ATTR_CMN_FILEID = 0x2000000 + ATTR_CMN_FLAGS = 0x40000 + ATTR_CMN_FNDRINFO = 0x4000 + ATTR_CMN_FSID = 0x4 + ATTR_CMN_FULLPATH = 0x8000000 + ATTR_CMN_GEN_COUNT = 0x80000 + ATTR_CMN_GRPID = 0x10000 + ATTR_CMN_GRPUUID = 0x1000000 + ATTR_CMN_MODTIME = 0x400 + ATTR_CMN_NAME = 0x1 + ATTR_CMN_NAMEDATTRCOUNT = 0x80000 + ATTR_CMN_NAMEDATTRLIST = 0x100000 + ATTR_CMN_OBJID = 0x20 + ATTR_CMN_OBJPERMANENTID = 0x40 + ATTR_CMN_OBJTAG = 0x10 + ATTR_CMN_OBJTYPE = 0x8 + ATTR_CMN_OWNERID = 0x8000 + ATTR_CMN_PARENTID = 0x4000000 + ATTR_CMN_PAROBJID = 0x80 + ATTR_CMN_RETURNED_ATTRS = 0x80000000 + ATTR_CMN_SCRIPT = 0x100 + ATTR_CMN_SETMASK = 0x51c7ff00 + ATTR_CMN_USERACCESS = 0x200000 + ATTR_CMN_UUID = 0x800000 + ATTR_CMN_VALIDMASK = 0xffffffff + ATTR_CMN_VOLSETMASK = 0x6700 + ATTR_FILE_ALLOCSIZE = 0x4 + ATTR_FILE_CLUMPSIZE = 0x10 + ATTR_FILE_DATAALLOCSIZE = 0x400 + ATTR_FILE_DATAEXTENTS = 0x800 + ATTR_FILE_DATALENGTH = 0x200 + ATTR_FILE_DEVTYPE = 0x20 + ATTR_FILE_FILETYPE = 0x40 + ATTR_FILE_FORKCOUNT = 0x80 + ATTR_FILE_FORKLIST = 0x100 + ATTR_FILE_IOBLOCKSIZE = 0x8 + ATTR_FILE_LINKCOUNT = 0x1 + ATTR_FILE_RSRCALLOCSIZE = 0x2000 + ATTR_FILE_RSRCEXTENTS = 0x4000 + ATTR_FILE_RSRCLENGTH = 0x1000 + ATTR_FILE_SETMASK = 0x20 + ATTR_FILE_TOTALSIZE = 0x2 + ATTR_FILE_VALIDMASK = 0x37ff + ATTR_VOL_ALLOCATIONCLUMP = 0x40 + ATTR_VOL_ATTRIBUTES = 0x40000000 + ATTR_VOL_CAPABILITIES = 0x20000 + ATTR_VOL_DIRCOUNT = 0x400 + ATTR_VOL_ENCODINGSUSED = 0x10000 + ATTR_VOL_FILECOUNT = 0x200 + ATTR_VOL_FSTYPE = 0x1 + ATTR_VOL_INFO = 0x80000000 + ATTR_VOL_IOBLOCKSIZE = 0x80 + ATTR_VOL_MAXOBJCOUNT = 0x800 + ATTR_VOL_MINALLOCATION = 0x20 + ATTR_VOL_MOUNTEDDEVICE = 0x8000 + ATTR_VOL_MOUNTFLAGS = 0x4000 + ATTR_VOL_MOUNTPOINT = 0x1000 + ATTR_VOL_NAME = 0x2000 + ATTR_VOL_OBJCOUNT = 0x100 + ATTR_VOL_QUOTA_SIZE = 0x10000000 + ATTR_VOL_RESERVED_SIZE = 0x20000000 + ATTR_VOL_SETMASK = 0x80002000 + ATTR_VOL_SIGNATURE = 0x2 + ATTR_VOL_SIZE = 0x4 + ATTR_VOL_SPACEAVAIL = 0x10 + ATTR_VOL_SPACEFREE = 0x8 + ATTR_VOL_SPACEUSED = 0x800000 + ATTR_VOL_UUID = 0x40000 + ATTR_VOL_VALIDMASK = 0xf087ffff + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_MONOTONIC_RAW_APPROX = 0x5 + CLOCK_PROCESS_CPUTIME_ID = 0xc + CLOCK_REALTIME = 0x0 + CLOCK_THREAD_CPUTIME_ID = 0x10 + CLOCK_UPTIME_RAW = 0x8 + CLOCK_UPTIME_RAW_APPROX = 0x9 + CLONE_NOFOLLOW = 0x1 + CLONE_NOOWNERCOPY = 0x2 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x30000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTLIOCGINFO = 0xc0644e03 + CTL_HW = 0x6 + CTL_KERN = 0x1 + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0x10a + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_DARWIN = 0x10a + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0xf + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x11 + EVFILT_THREADMARKER = 0x11 + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DISPATCH2 = 0x180 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EV_UDATA_SPECIFIC = 0x100 + EV_VANISHED = 0x200 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + FSOPT_ATTR_CMN_EXTENDED = 0x20 + FSOPT_NOFOLLOW = 0x1 + FSOPT_NOINMEMUPDATE = 0x2 + FSOPT_PACK_INVAL_ATTRS = 0x8 + FSOPT_REPORT_FULLSIZE = 0x4 + FSOPT_RETURN_REALDEV = 0x200 + F_ADDFILESIGS = 0x3d + F_ADDFILESIGS_FOR_DYLD_SIM = 0x53 + F_ADDFILESIGS_INFO = 0x67 + F_ADDFILESIGS_RETURN = 0x61 + F_ADDFILESUPPL = 0x68 + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_BARRIERFSYNC = 0x55 + F_CHECK_LV = 0x62 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPATH_NOFIRMLINK = 0x66 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GETSIGSINFO = 0x69 + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_PUNCHHOLE = 0x63 + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_SPECULATIVE_READ = 0x65 + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_TRIM_ACTIVE_FILE = 0x64 + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + HW_MACHINE = 0x1 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6LOWPAN = 0x40 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IOCTL_VM_SOCKETS_GET_LOCAL_CID = 0x400473d1 + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_3542DSTOPTS = 0x32 + IPV6_3542HOPLIMIT = 0x2f + IPV6_3542HOPOPTS = 0x31 + IPV6_3542NEXTHOP = 0x30 + IPV6_3542PKTINFO = 0x2e + IPV6_3542RTHDR = 0x33 + IPV6_ADDR_MC_FLAGS_PREFIX = 0x20 + IPV6_ADDR_MC_FLAGS_TRANSIENT = 0x10 + IPV6_ADDR_MC_FLAGS_UNICAST_BASED = 0x30 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FLOW_ECN_MASK = 0x3000 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x3d + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x39 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x1c + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x1b + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + KERN_HOSTNAME = 0xa + KERN_OSRELEASE = 0x2 + KERN_OSTYPE = 0x1 + KERN_VERSION = 0x4 + LOCAL_PEERCRED = 0x1 + LOCAL_PEEREPID = 0x3 + LOCAL_PEEREUUID = 0x5 + LOCAL_PEERPID = 0x2 + LOCAL_PEERTOKEN = 0x6 + LOCAL_PEERUUID = 0x4 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_PAGEOUT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_32BIT = 0x8000 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESILIENT_CODESIGN = 0x2000 + MAP_RESILIENT_MEDIA = 0x4000 + MAP_SHARED = 0x1 + MAP_TRANSLATED_ALLOW_EXECUTE = 0x20000 + MAP_UNIX03 = 0x40000 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_ASYNC = 0x40 + MNT_AUTOMOUNTED = 0x400000 + MNT_CMDFLAGS = 0xf0000 + MNT_CPROTECT = 0x80 + MNT_DEFWRITE = 0x2000000 + MNT_DONTBROWSE = 0x100000 + MNT_DOVOLFS = 0x8000 + MNT_DWAIT = 0x4 + MNT_EXPORTED = 0x100 + MNT_EXT_ROOT_DATA_VOL = 0x1 + MNT_FORCE = 0x80000 + MNT_IGNORE_OWNERSHIP = 0x200000 + MNT_JOURNALED = 0x800000 + MNT_LOCAL = 0x1000 + MNT_MULTILABEL = 0x4000000 + MNT_NOATIME = 0x10000000 + MNT_NOBLOCK = 0x20000 + MNT_NODEV = 0x10 + MNT_NOEXEC = 0x4 + MNT_NOSUID = 0x8 + MNT_NOUSERXATTR = 0x1000000 + MNT_NOWAIT = 0x2 + MNT_QUARANTINE = 0x400 + MNT_QUOTA = 0x2000 + MNT_RDONLY = 0x1 + MNT_RELOAD = 0x40000 + MNT_REMOVABLE = 0x200 + MNT_ROOTFS = 0x4000 + MNT_SNAPSHOT = 0x40000000 + MNT_STRICTATIME = 0x80000000 + MNT_SYNCHRONOUS = 0x2 + MNT_UNION = 0x20 + MNT_UNKNOWNPERMISSIONS = 0x200000 + MNT_UPDATE = 0x10000 + MNT_VISFLAGMASK = 0xd7f0f7ff + MNT_WAIT = 0x1 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_NOSIGNAL = 0x80000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_FLAGS_PRIV = 0xa + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xb + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NFDBITS = 0x20 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLDLY = 0x300 + NOFLSH = 0x80000000 + NOKERNINFO = 0x2000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_FUNLOCK = 0x100 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MACHTIME = 0x100 + NOTE_MACH_CONTINUOUS_TIME = 0x80 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + OXTABS = 0x4 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DP_GETRAWUNENCRYPTED = 0x2 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NOFOLLOW_ANY = 0x20000000 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 + RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DEAD = 0x20000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_GLOBAL = 0x40000000 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SEEK_CUR = 0x1 + SEEK_DATA = 0x4 + SEEK_END = 0x2 + SEEK_HOLE = 0x3 + SEEK_SET = 0x0 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIF6LOWPAN = 0xc02069c5 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFFUNCTIONALTYPE = 0xc02069ad + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGIFXMEDIA = 0xc02c6948 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIF6LOWPAN = 0x802069c4 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_LOCAL = 0x0 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NETSVC_MARKING_LEVEL = 0x1119 + SO_NET_SERVICE_TYPE = 0x1116 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TRACKER_ATTRIBUTE_FLAGS_APP_APPROVED = 0x1 + SO_TRACKER_ATTRIBUTE_FLAGS_DOMAIN_SHORT = 0x4 + SO_TRACKER_ATTRIBUTE_FLAGS_TRACKER = 0x2 + SO_TRACKER_TRANSPARENCY_VERSION = 0x3 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0x4 + TABDLY = 0xc04 + TCIFLUSH = 0x1 + TCIOFF = 0x3 + TCIOFLUSH = 0x3 + TCION = 0x4 + TCOFLUSH = 0x2 + TCOOFF = 0x1 + TCOON = 0x2 + TCPOPT_CC = 0xb + TCPOPT_CCECHO = 0xd + TCPOPT_CCNEW = 0xc + TCPOPT_EOL = 0x0 + TCPOPT_FASTOPEN = 0x22 + TCPOPT_MAXSEG = 0x2 + TCPOPT_NOP = 0x1 + TCPOPT_SACK = 0x5 + TCPOPT_SACK_HDR = 0x1010500 + TCPOPT_SACK_PERMITTED = 0x4 + TCPOPT_SACK_PERMIT_HDR = 0x1010402 + TCPOPT_SIGNATURE = 0x13 + TCPOPT_TIMESTAMP = 0x8 + TCPOPT_TSTAMP_HDR = 0x101080a + TCPOPT_WINDOW = 0x3 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_CONNECTION_INFO = 0x106 + TCP_ENABLE_ECN = 0x104 + TCP_FASTOPEN = 0x105 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMADDR_CID_ANY = 0xffffffff + VMADDR_CID_HOST = 0x2 + VMADDR_CID_HYPERVISOR = 0x0 + VMADDR_CID_RESERVED = 0x1 + VMADDR_PORT_ANY = 0xffffffff + VMIN = 0x10 + VM_LOADAVG = 0x2 + VM_MACHFACTOR = 0x4 + VM_MAXID = 0x6 + VM_METER = 0x1 + VM_SWAPUSAGE = 0x5 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 + XATTR_CREATE = 0x2 + XATTR_NODEFAULT = 0x10 + XATTR_NOFOLLOW = 0x1 + XATTR_NOSECURITY = 0x8 + XATTR_REPLACE = 0x4 + XATTR_SHOWCOMPRESSION = 0x20 ) // Errors diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 135e3a47a..bcc45d108 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -1,4 +1,4 @@ -// Code generated by mkmerge.go; DO NOT EDIT. +// Code generated by mkmerge; DO NOT EDIT. //go:build linux // +build linux @@ -116,6 +116,7 @@ const ( ARPHRD_LAPB = 0x204 ARPHRD_LOCALTLK = 0x305 ARPHRD_LOOPBACK = 0x304 + ARPHRD_MCTP = 0x122 ARPHRD_METRICOM = 0x17 ARPHRD_NETLINK = 0x338 ARPHRD_NETROM = 0x0 @@ -231,6 +232,8 @@ const ( BPF_PSEUDO_FUNC = 0x4 BPF_PSEUDO_KFUNC_CALL = 0x2 BPF_PSEUDO_MAP_FD = 0x1 + BPF_PSEUDO_MAP_IDX = 0x5 + BPF_PSEUDO_MAP_IDX_VALUE = 0x6 BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 BPF_RSH = 0x70 @@ -470,6 +473,7 @@ const ( DM_DEV_WAIT = 0xc138fd08 DM_DIR = "mapper" DM_GET_TARGET_VERSION = 0xc138fd11 + DM_IMA_MEASUREMENT_FLAG = 0x80000 DM_INACTIVE_PRESENT_FLAG = 0x40 DM_INTERNAL_SUSPEND_FLAG = 0x40000 DM_IOCTL = 0xfd @@ -714,6 +718,7 @@ const ( ETH_P_LOOPBACK = 0x9000 ETH_P_MACSEC = 0x88e5 ETH_P_MAP = 0xf9 + ETH_P_MCTP = 0xfa ETH_P_MOBITEX = 0x15 ETH_P_MPLS_MC = 0x8848 ETH_P_MPLS_UC = 0x8847 @@ -749,6 +754,21 @@ const ( ETH_P_WCCP = 0x883e ETH_P_X25 = 0x805 ETH_P_XDSA = 0xf8 + EV_ABS = 0x3 + EV_CNT = 0x20 + EV_FF = 0x15 + EV_FF_STATUS = 0x17 + EV_KEY = 0x1 + EV_LED = 0x11 + EV_MAX = 0x1f + EV_MSC = 0x4 + EV_PWR = 0x16 + EV_REL = 0x2 + EV_REP = 0x14 + EV_SND = 0x12 + EV_SW = 0x5 + EV_SYN = 0x0 + EV_VERSION = 0x10001 EXABYTE_ENABLE_NEST = 0xf0 EXT2_SUPER_MAGIC = 0xef53 EXT3_SUPER_MAGIC = 0xef53 @@ -787,9 +807,11 @@ const ( FAN_DELETE_SELF = 0x400 FAN_DENY = 0x2 FAN_ENABLE_AUDIT = 0x40 + FAN_EPIDFD = -0x2 FAN_EVENT_INFO_TYPE_DFID = 0x3 FAN_EVENT_INFO_TYPE_DFID_NAME = 0x2 FAN_EVENT_INFO_TYPE_FID = 0x1 + FAN_EVENT_INFO_TYPE_PIDFD = 0x4 FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_MARK_ADD = 0x1 @@ -809,6 +831,7 @@ const ( FAN_MOVE_SELF = 0x800 FAN_NOFD = -0x1 FAN_NONBLOCK = 0x2 + FAN_NOPIDFD = -0x1 FAN_ONDIR = 0x40000000 FAN_OPEN = 0x20 FAN_OPEN_EXEC = 0x1000 @@ -819,6 +842,7 @@ const ( FAN_REPORT_DIR_FID = 0x400 FAN_REPORT_FID = 0x200 FAN_REPORT_NAME = 0x800 + FAN_REPORT_PIDFD = 0x80 FAN_REPORT_TID = 0x100 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 @@ -1331,6 +1355,20 @@ const ( KEY_SPEC_THREAD_KEYRING = -0x1 KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 + LANDLOCK_ACCESS_FS_EXECUTE = 0x1 + LANDLOCK_ACCESS_FS_MAKE_BLOCK = 0x800 + LANDLOCK_ACCESS_FS_MAKE_CHAR = 0x40 + LANDLOCK_ACCESS_FS_MAKE_DIR = 0x80 + LANDLOCK_ACCESS_FS_MAKE_FIFO = 0x400 + LANDLOCK_ACCESS_FS_MAKE_REG = 0x100 + LANDLOCK_ACCESS_FS_MAKE_SOCK = 0x200 + LANDLOCK_ACCESS_FS_MAKE_SYM = 0x1000 + LANDLOCK_ACCESS_FS_READ_DIR = 0x8 + LANDLOCK_ACCESS_FS_READ_FILE = 0x4 + LANDLOCK_ACCESS_FS_REMOVE_DIR = 0x10 + LANDLOCK_ACCESS_FS_REMOVE_FILE = 0x20 + LANDLOCK_ACCESS_FS_WRITE_FILE = 0x2 + LANDLOCK_CREATE_RULESET_VERSION = 0x1 LINUX_REBOOT_CMD_CAD_OFF = 0x0 LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef LINUX_REBOOT_CMD_HALT = 0xcdef0123 @@ -1381,6 +1419,8 @@ const ( MADV_NOHUGEPAGE = 0xf MADV_NORMAL = 0x0 MADV_PAGEOUT = 0x15 + MADV_POPULATE_READ = 0x16 + MADV_POPULATE_WRITE = 0x17 MADV_RANDOM = 0x1 MADV_REMOVE = 0x9 MADV_SEQUENTIAL = 0x2 @@ -1436,6 +1476,18 @@ const ( MNT_FORCE = 0x1 MODULE_INIT_IGNORE_MODVERSIONS = 0x1 MODULE_INIT_IGNORE_VERMAGIC = 0x2 + MOUNT_ATTR_IDMAP = 0x100000 + MOUNT_ATTR_NOATIME = 0x10 + MOUNT_ATTR_NODEV = 0x4 + MOUNT_ATTR_NODIRATIME = 0x80 + MOUNT_ATTR_NOEXEC = 0x8 + MOUNT_ATTR_NOSUID = 0x2 + MOUNT_ATTR_NOSYMFOLLOW = 0x200000 + MOUNT_ATTR_RDONLY = 0x1 + MOUNT_ATTR_RELATIME = 0x0 + MOUNT_ATTR_SIZE_VER0 = 0x20 + MOUNT_ATTR_STRICTATIME = 0x20 + MOUNT_ATTR__ATIME = 0x70 MSDOS_SUPER_MAGIC = 0x4d44 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 @@ -1635,11 +1687,12 @@ const ( NFNL_MSG_BATCH_END = 0x11 NFNL_NFA_NEST = 0x8000 NFNL_SUBSYS_ACCT = 0x7 - NFNL_SUBSYS_COUNT = 0xc + NFNL_SUBSYS_COUNT = 0xd NFNL_SUBSYS_CTHELPER = 0x9 NFNL_SUBSYS_CTNETLINK = 0x1 NFNL_SUBSYS_CTNETLINK_EXP = 0x2 NFNL_SUBSYS_CTNETLINK_TIMEOUT = 0x8 + NFNL_SUBSYS_HOOK = 0xc NFNL_SUBSYS_IPSET = 0x6 NFNL_SUBSYS_NFTABLES = 0xa NFNL_SUBSYS_NFT_COMPAT = 0xb @@ -1929,6 +1982,12 @@ const ( PR_PAC_GET_ENABLED_KEYS = 0x3d PR_PAC_RESET_KEYS = 0x36 PR_PAC_SET_ENABLED_KEYS = 0x3c + PR_SCHED_CORE = 0x3e + PR_SCHED_CORE_CREATE = 0x1 + PR_SCHED_CORE_GET = 0x0 + PR_SCHED_CORE_MAX = 0x4 + PR_SCHED_CORE_SHARE_FROM = 0x3 + PR_SCHED_CORE_SHARE_TO = 0x2 PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -1972,6 +2031,7 @@ const ( PR_SPEC_ENABLE = 0x2 PR_SPEC_FORCE_DISABLE = 0x8 PR_SPEC_INDIRECT_BRANCH = 0x1 + PR_SPEC_L1D_FLUSH = 0x2 PR_SPEC_NOT_AFFECTED = 0x0 PR_SPEC_PRCTL = 0x1 PR_SPEC_STORE_BYPASS = 0x0 @@ -2295,6 +2355,7 @@ const ( SECCOMP_MODE_DISABLED = 0x0 SECCOMP_MODE_FILTER = 0x2 SECCOMP_MODE_STRICT = 0x1 + SECRETMEM_MAGIC = 0x5345434d SECURITYFS_MAGIC = 0x73636673 SEEK_CUR = 0x1 SEEK_DATA = 0x3 @@ -2406,12 +2467,15 @@ const ( SMART_WRITE_THRESHOLDS = 0xd7 SMB_SUPER_MAGIC = 0x517b SOCKFS_MAGIC = 0x534f434b + SOCK_BUF_LOCK_MASK = 0x3 SOCK_DCCP = 0x6 SOCK_IOC_TYPE = 0x89 SOCK_PACKET = 0xa SOCK_RAW = 0x3 + SOCK_RCVBUF_LOCK = 0x2 SOCK_RDM = 0x4 SOCK_SEQPACKET = 0x5 + SOCK_SNDBUF_LOCK = 0x1 SOL_AAL = 0x109 SOL_ALG = 0x117 SOL_ATM = 0x108 @@ -2762,6 +2826,13 @@ const ( WDIOS_TEMPPANIC = 0x4 WDIOS_UNKNOWN = -0x1 WEXITED = 0x4 + WGALLOWEDIP_A_MAX = 0x3 + WGDEVICE_A_MAX = 0x8 + WGPEER_A_MAX = 0xa + WG_CMD_MAX = 0x1 + WG_GENL_NAME = "wireguard" + WG_GENL_VERSION = 0x1 + WG_KEY_LEN = 0x20 WIN_ACKMEDIACHANGE = 0xdb WIN_CHECKPOWERMODE1 = 0xe5 WIN_CHECKPOWERMODE2 = 0x98 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index cca248d1d..3ca40ca7f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -5,7 +5,7 @@ // +build 386,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/unix/_const.go package unix @@ -293,6 +293,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -309,6 +310,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 9521a4804..ead332091 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -5,7 +5,7 @@ // +build amd64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/unix/_const.go package unix @@ -294,6 +294,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -310,6 +311,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index ddb40a40d..39bdc9455 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -5,7 +5,7 @@ // +build arm,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -300,6 +300,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -316,6 +317,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 3df31e0d4..9aec987db 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -5,7 +5,7 @@ // +build arm64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/_const.go package unix @@ -290,6 +290,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -306,6 +307,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 179c7d68d..a8bba9491 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -5,7 +5,7 @@ // +build mips,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -293,6 +293,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -309,6 +310,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 84ab15a85..ee9e7e202 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -5,7 +5,7 @@ // +build mips64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -293,6 +293,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -309,6 +310,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 6aa064da5..ba4b288a3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -5,7 +5,7 @@ // +build mips64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -293,6 +293,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -309,6 +310,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 960650f2b..bc93afc36 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -5,7 +5,7 @@ // +build mipsle,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -293,6 +293,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -309,6 +310,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0x100 SO_PASSCRED = 0x11 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 7365221d0..9295e6947 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -5,7 +5,7 @@ // +build ppc,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -348,6 +348,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -364,6 +365,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 5967db35c..1fa081c9a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -5,7 +5,7 @@ // +build ppc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -352,6 +352,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -368,6 +369,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index f88869849..74b321149 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -5,7 +5,7 @@ // +build ppc64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -352,6 +352,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -368,6 +369,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x14 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 8048706f3..c91c8ac5b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -5,7 +5,7 @@ // +build riscv64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -281,6 +281,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -297,6 +298,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index fb7859417..b66bf2228 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -5,7 +5,7 @@ // +build s390x,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/_const.go package unix @@ -356,6 +356,7 @@ const ( SO_BPF_EXTENSIONS = 0x30 SO_BROADCAST = 0x6 SO_BSDCOMPAT = 0xe + SO_BUF_LOCK = 0x48 SO_BUSY_POLL = 0x2e SO_BUSY_POLL_BUDGET = 0x46 SO_CNX_ADVICE = 0x35 @@ -372,6 +373,7 @@ const ( SO_MARK = 0x24 SO_MAX_PACING_RATE = 0x2f SO_MEMINFO = 0x37 + SO_NETNS_COOKIE = 0x47 SO_NOFCS = 0x2b SO_OOBINLINE = 0xa SO_PASSCRED = 0x10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 81e18d23f..f7fb149b0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -5,7 +5,7 @@ // +build sparc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/_const.go package unix @@ -347,6 +347,7 @@ const ( SO_BPF_EXTENSIONS = 0x32 SO_BROADCAST = 0x20 SO_BSDCOMPAT = 0x400 + SO_BUF_LOCK = 0x51 SO_BUSY_POLL = 0x30 SO_BUSY_POLL_BUDGET = 0x49 SO_CNX_ADVICE = 0x37 @@ -363,6 +364,7 @@ const ( SO_MARK = 0x22 SO_MAX_PACING_RATE = 0x31 SO_MEMINFO = 0x39 + SO_NETNS_COOKIE = 0x50 SO_NOFCS = 0x27 SO_OOBINLINE = 0x100 SO_PASSCRED = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go index 91a23cc72..85e0cc386 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go @@ -17,6 +17,7 @@ int getdirent(int, uintptr_t, size_t); int wait4(int, uintptr_t, int, uintptr_t); int ioctl(int, int, uintptr_t); int fcntl(uintptr_t, int, uintptr_t); +int fsync_range(int, int, long long, long long); int acct(uintptr_t); int chdir(uintptr_t); int chroot(uintptr_t); @@ -29,7 +30,6 @@ int fchmod(int, unsigned int); int fchmodat(int, uintptr_t, unsigned int, int); int fchownat(int, uintptr_t, int, int, int); int fdatasync(int); -int fsync(int); int getpgid(int); int getpgrp(); int getpid(); @@ -255,6 +255,16 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fsyncRange(fd int, how int, start int64, length int64) (err error) { + r0, er := C.fsync_range(C.int(fd), C.int(how), C.longlong(start), C.longlong(length)) + if r0 == -1 && er != nil { + err = er + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Acct(path string) (err error) { _p0 := uintptr(unsafe.Pointer(C.CString(path))) r0, er := C.acct(C.uintptr_t(_p0)) @@ -379,16 +389,6 @@ func Fdatasync(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fsync(fd int) (err error) { - r0, er := C.fsync(C.int(fd)) - if r0 == -1 && er != nil { - err = er - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getpgid(pid int) (pgid int, err error) { r0, er := C.getpgid(C.int(pid)) pgid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go index 33c2609b8..f1d4a73b0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go @@ -135,6 +135,16 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fsyncRange(fd int, how int, start int64, length int64) (err error) { + _, e1 := callfsync_range(fd, how, start, length) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -283,16 +293,6 @@ func Fdatasync(fd int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Fsync(fd int) (err error) { - _, e1 := callfsync(fd) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getpgid(pid int) (pgid int, err error) { r0, e1 := callgetpgid(pid) pgid = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go index 8b737fa97..2caa5adf9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go @@ -18,6 +18,7 @@ import ( //go:cgo_import_dynamic libc_wait4 wait4 "libc.a/shr_64.o" //go:cgo_import_dynamic libc_ioctl ioctl "libc.a/shr_64.o" //go:cgo_import_dynamic libc_fcntl fcntl "libc.a/shr_64.o" +//go:cgo_import_dynamic libc_fsync_range fsync_range "libc.a/shr_64.o" //go:cgo_import_dynamic libc_acct acct "libc.a/shr_64.o" //go:cgo_import_dynamic libc_chdir chdir "libc.a/shr_64.o" //go:cgo_import_dynamic libc_chroot chroot "libc.a/shr_64.o" @@ -30,7 +31,6 @@ import ( //go:cgo_import_dynamic libc_fchmodat fchmodat "libc.a/shr_64.o" //go:cgo_import_dynamic libc_fchownat fchownat "libc.a/shr_64.o" //go:cgo_import_dynamic libc_fdatasync fdatasync "libc.a/shr_64.o" -//go:cgo_import_dynamic libc_fsync fsync "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getpgid getpgid "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getpgrp getpgrp "libc.a/shr_64.o" //go:cgo_import_dynamic libc_getpid getpid "libc.a/shr_64.o" @@ -136,6 +136,7 @@ import ( //go:linkname libc_wait4 libc_wait4 //go:linkname libc_ioctl libc_ioctl //go:linkname libc_fcntl libc_fcntl +//go:linkname libc_fsync_range libc_fsync_range //go:linkname libc_acct libc_acct //go:linkname libc_chdir libc_chdir //go:linkname libc_chroot libc_chroot @@ -148,7 +149,6 @@ import ( //go:linkname libc_fchmodat libc_fchmodat //go:linkname libc_fchownat libc_fchownat //go:linkname libc_fdatasync libc_fdatasync -//go:linkname libc_fsync libc_fsync //go:linkname libc_getpgid libc_getpgid //go:linkname libc_getpgrp libc_getpgrp //go:linkname libc_getpid libc_getpid @@ -257,6 +257,7 @@ var ( libc_wait4, libc_ioctl, libc_fcntl, + libc_fsync_range, libc_acct, libc_chdir, libc_chroot, @@ -269,7 +270,6 @@ var ( libc_fchmodat, libc_fchownat, libc_fdatasync, - libc_fsync, libc_getpgid, libc_getpgrp, libc_getpid, @@ -430,6 +430,13 @@ func callfcntl(fd uintptr, cmd int, arg uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func callfsync_range(fd int, how int, start int64, length int64) (r1 uintptr, e1 Errno) { + r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fsync_range)), 4, uintptr(fd), uintptr(how), uintptr(start), uintptr(length), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func callacct(_p0 uintptr) (r1 uintptr, e1 Errno) { r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_acct)), 1, _p0, 0, 0, 0, 0, 0) return @@ -514,13 +521,6 @@ func callfdatasync(fd int) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callfsync(fd int) (r1 uintptr, e1 Errno) { - r1, _, e1 = syscall6(uintptr(unsafe.Pointer(&libc_fsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func callgetpgid(pid int) (r1 uintptr, e1 Errno) { r1, _, e1 = rawSyscall6(uintptr(unsafe.Pointer(&libc_getpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) return diff --git a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go index 3c260917e..944a714b1 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go @@ -16,6 +16,7 @@ int getdirent(int, uintptr_t, size_t); int wait4(int, uintptr_t, int, uintptr_t); int ioctl(int, int, uintptr_t); int fcntl(uintptr_t, int, uintptr_t); +int fsync_range(int, int, long long, long long); int acct(uintptr_t); int chdir(uintptr_t); int chroot(uintptr_t); @@ -28,7 +29,6 @@ int fchmod(int, unsigned int); int fchmodat(int, uintptr_t, unsigned int, int); int fchownat(int, uintptr_t, int, int, int); int fdatasync(int); -int fsync(int); int getpgid(int); int getpgrp(); int getpid(); @@ -199,6 +199,14 @@ func callfcntl(fd uintptr, cmd int, arg uintptr) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func callfsync_range(fd int, how int, start int64, length int64) (r1 uintptr, e1 Errno) { + r1 = uintptr(C.fsync_range(C.int(fd), C.int(how), C.longlong(start), C.longlong(length))) + e1 = syscall.GetErrno() + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func callacct(_p0 uintptr) (r1 uintptr, e1 Errno) { r1 = uintptr(C.acct(C.uintptr_t(_p0))) e1 = syscall.GetErrno() @@ -295,14 +303,6 @@ func callfdatasync(fd int) (r1 uintptr, e1 Errno) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func callfsync(fd int) (r1 uintptr, e1 Errno) { - r1 = uintptr(C.fsync(C.int(fd))) - e1 = syscall.GetErrno() - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func callgetpgid(pid int) (r1 uintptr, e1 Errno) { r1 = uintptr(C.getpgid(C.int(pid))) e1 = syscall.GetErrno() diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index d4efe8d45..0ae0ed4cb 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -734,6 +734,65 @@ var libc_sendfile_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { + r0, _, e1 := syscall_syscall(libc_shmat_trampoline_addr, uintptr(id), uintptr(addr), uintptr(flag)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmat shmat "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) { + r0, _, e1 := syscall_syscall(libc_shmctl_trampoline_addr, uintptr(id), uintptr(cmd), uintptr(unsafe.Pointer(buf))) + result = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmctl shmctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmdt(addr uintptr) (err error) { + _, _, e1 := syscall_syscall(libc_shmdt_trampoline_addr, uintptr(addr), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmdt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmdt shmdt "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmget(key int, size int, flag int) (id int, err error) { + r0, _, e1 := syscall_syscall(libc_shmget_trampoline_addr, uintptr(key), uintptr(size), uintptr(flag)) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmget_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmget shmget "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index bc169c2ab..eac6ca806 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -264,6 +264,30 @@ TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendfile_trampoline_addr(SB)/8, $libc_sendfile_trampoline<>(SB) +TEXT libc_shmat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmat(SB) + +GLOBL ·libc_shmat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmat_trampoline_addr(SB)/8, $libc_shmat_trampoline<>(SB) + +TEXT libc_shmctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmctl(SB) + +GLOBL ·libc_shmctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmctl_trampoline_addr(SB)/8, $libc_shmctl_trampoline<>(SB) + +TEXT libc_shmdt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmdt(SB) + +GLOBL ·libc_shmdt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmdt_trampoline_addr(SB)/8, $libc_shmdt_trampoline<>(SB) + +TEXT libc_shmget_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmget(SB) + +GLOBL ·libc_shmget_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmget_trampoline_addr(SB)/8, $libc_shmget_trampoline<>(SB) + TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_access(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index f2ee2bd33..cf71be3ed 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -734,6 +734,65 @@ var libc_sendfile_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { + r0, _, e1 := syscall_syscall(libc_shmat_trampoline_addr, uintptr(id), uintptr(addr), uintptr(flag)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmat_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmat shmat "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) { + r0, _, e1 := syscall_syscall(libc_shmctl_trampoline_addr, uintptr(id), uintptr(cmd), uintptr(unsafe.Pointer(buf))) + result = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmctl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmctl shmctl "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmdt(addr uintptr) (err error) { + _, _, e1 := syscall_syscall(libc_shmdt_trampoline_addr, uintptr(addr), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmdt_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmdt shmdt "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmget(key int, size int, flag int) (id int, err error) { + r0, _, e1 := syscall_syscall(libc_shmget_trampoline_addr, uintptr(key), uintptr(size), uintptr(flag)) + id = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_shmget_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_shmget shmget "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Access(path string, mode uint32) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index 33e19776d..4ebcf2175 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -264,6 +264,30 @@ TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 DATA ·libc_sendfile_trampoline_addr(SB)/8, $libc_sendfile_trampoline<>(SB) +TEXT libc_shmat_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmat(SB) + +GLOBL ·libc_shmat_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmat_trampoline_addr(SB)/8, $libc_shmat_trampoline<>(SB) + +TEXT libc_shmctl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmctl(SB) + +GLOBL ·libc_shmctl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmctl_trampoline_addr(SB)/8, $libc_shmctl_trampoline<>(SB) + +TEXT libc_shmdt_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmdt(SB) + +GLOBL ·libc_shmdt_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmdt_trampoline_addr(SB)/8, $libc_shmdt_trampoline<>(SB) + +TEXT libc_shmget_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_shmget(SB) + +GLOBL ·libc_shmget_trampoline_addr(SB), RODATA, $8 +DATA ·libc_shmget_trampoline_addr(SB)/8, $libc_shmget_trampoline<>(SB) + TEXT libc_access_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_access(SB) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 2dbe3da7a..93edda4c4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1,4 +1,4 @@ -// Code generated by mkmerge.go; DO NOT EDIT. +// Code generated by mkmerge; DO NOT EDIT. //go:build linux // +build linux @@ -110,6 +110,16 @@ func openat2(dirfd int, path string, open_how *OpenHow, size int) (fd int, err e // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := Syscall6(SYS_PPOLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) @@ -399,6 +409,21 @@ func mount(source string, target string, fstype string, flags uintptr, data *byt // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func mountSetattr(dirfd int, pathname string, flags uint, attr *MountAttr, size uintptr) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT_SETATTR, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(unsafe.Pointer(attr)), uintptr(size), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Acct(path string) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -1945,8 +1970,63 @@ func ProcessVMWritev(pid int, localIov []Iovec, remoteIov []RemoteIovec, flags u // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) +func PidfdOpen(pid int, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_PIDFD_OPEN, uintptr(pid), uintptr(flags), 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PidfdGetfd(pidfd int, targetfd int, flags int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_PIDFD_GETFD, uintptr(pidfd), uintptr(targetfd), uintptr(flags)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmat(id int, addr uintptr, flag int) (ret uintptr, err error) { + r0, _, e1 := Syscall(SYS_SHMAT, uintptr(id), uintptr(addr), uintptr(flag)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) { + r0, _, e1 := Syscall(SYS_SHMCTL, uintptr(id), uintptr(cmd), uintptr(unsafe.Pointer(buf))) + result = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmdt(addr uintptr) (err error) { + _, _, e1 := Syscall(SYS_SHMDT, uintptr(addr), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func shmget(key int, size int, flag int) (id int, err error) { + r0, _, e1 := Syscall(SYS_SHMGET, uintptr(key), uintptr(size), uintptr(flag)) + id = int(r0) if e1 != 0 { err = errnoErr(e1) } diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go index e37096e4d..ff90c81e7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -46,37 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -181,17 +150,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -566,14 +524,3 @@ func utimes(path string, times *[2]Timeval) (err error) { } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go index 9919d8486..fa7d3dbe4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -191,17 +170,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func inotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -711,27 +679,6 @@ func utimes(path string, times *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(cmdline) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go index 076754d48..654f91530 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -46,16 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) fd = int(r0) @@ -235,27 +225,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -340,17 +309,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -681,17 +639,6 @@ func setrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func armSyncFileRange(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_ARM_SYNC_FILE_RANGE, uintptr(fd), uintptr(flags), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go index 4703cf3c3..6d1552885 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -544,17 +523,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -706,18 +674,6 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (p1 int, p2 int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - p1 = int(r0) - p2 = int(r1) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) @@ -746,14 +702,3 @@ func setrlimit(resource int, rlim *rlimit32) (err error) { } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go index a134f9a4d..1e20d72df 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -717,14 +696,3 @@ func stat(path string, st *stat_t) (err error) { } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go index b1fff2d94..82b5e2d9e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -717,14 +696,3 @@ func stat(path string, st *stat_t) (err error) { } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go index d13d6da01..a0440c1d4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -544,17 +523,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -706,18 +674,6 @@ func Pause() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (p1 int, p2 int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - p1 = int(r0) - p2 = int(r1) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) xaddr = uintptr(r0) @@ -746,14 +702,3 @@ func setrlimit(resource int, rlim *rlimit32) (err error) { } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go index 927cf1a00..5864b9ca6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -161,17 +140,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -717,27 +685,6 @@ func setrlimit(resource int, rlim *rlimit32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off>>32), uintptr(off), uintptr(n>>32), uintptr(n)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go index da8ec0396..beeb49e34 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -191,17 +170,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -763,27 +731,6 @@ func utimes(path string, times *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off), uintptr(n), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go index 083f493bb..53139b82c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -191,17 +170,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Ioperm(from int, num int, on int) (err error) { _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) if e1 != 0 { @@ -763,27 +731,6 @@ func utimes(path string, times *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func syncFileRange2(fd int, flags int, off int64, n int64) (err error) { _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(flags), uintptr(off), uintptr(n), 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go index bb347407d..202add37d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -46,27 +46,6 @@ func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func EpollCreate(size int) (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { var _p0 unsafe.Pointer if len(events) > 0 { @@ -191,17 +170,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -553,17 +521,6 @@ func utimes(path string, times *[2]Timeval) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(cmdline) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go index 8edc517e1..2ab268c34 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go @@ -73,16 +73,6 @@ func Fadvise(fd int, offset int64, length int64, advice int) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func dup2(oldfd int, newfd int) (err error) { - _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Fchown(fd int, uid int, gid int) (err error) { _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) if e1 != 0 { @@ -180,17 +170,6 @@ func Getuid() (uid int) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func InotifyInit() (fd int, err error) { - r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) - fd = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Lchown(path string, uid int, gid int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(path) @@ -718,24 +697,3 @@ func utimes(path string, times *[2]Timeval) (err error) { } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe(p *[2]_C_int) (err error) { - _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { - r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(timeout)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index 4726ab30a..51d0c0742 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -351,18 +351,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (fd1 int, fd2 int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - fd1 = int(r0) - fd2 = int(r1) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index fe71456db..df2efb6db 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -351,18 +351,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (fd1 int, fd2 int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - fd1 = int(r0) - fd2 = int(r1) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index 0b5b2f014..c8536c2c9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -351,18 +351,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (fd1 int, fd2 int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - fd1 = int(r0) - fd2 = int(r1) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index bfca28648..8b981bfc2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -351,18 +351,6 @@ func Munlockall() (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (fd1 int, fd2 int, err error) { - r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) - fd1 = int(r0) - fd2 = int(r1) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func pipe2(p *[2]_C_int, flags int) (err error) { _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index eb3afe678..31847d230 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -439,7 +439,10 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 8e7e3aedc..3503cbbde 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -361,7 +361,10 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 0e6ebfef0..5ecd24bf6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -7,6 +7,7 @@ package unix const ( + SYS_SYSCALL_MASK = 0 SYS_RESTART_SYSCALL = 0 SYS_EXIT = 1 SYS_FORK = 2 @@ -403,7 +404,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index cd2a3ef41..7e5c94cc7 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -306,7 +306,10 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 773640b83..e1e2a2bf5 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -424,7 +424,9 @@ const ( SYS_PROCESS_MADVISE = 4440 SYS_EPOLL_PWAIT2 = 4441 SYS_MOUNT_SETATTR = 4442 + SYS_QUOTACTL_FD = 4443 SYS_LANDLOCK_CREATE_RULESET = 4444 SYS_LANDLOCK_ADD_RULE = 4445 SYS_LANDLOCK_RESTRICT_SELF = 4446 + SYS_PROCESS_MRELEASE = 4448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 86a41e568..7651915a3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -354,7 +354,9 @@ const ( SYS_PROCESS_MADVISE = 5440 SYS_EPOLL_PWAIT2 = 5441 SYS_MOUNT_SETATTR = 5442 + SYS_QUOTACTL_FD = 5443 SYS_LANDLOCK_CREATE_RULESET = 5444 SYS_LANDLOCK_ADD_RULE = 5445 SYS_LANDLOCK_RESTRICT_SELF = 5446 + SYS_PROCESS_MRELEASE = 5448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index 77f5728da..a26a2c050 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -354,7 +354,9 @@ const ( SYS_PROCESS_MADVISE = 5440 SYS_EPOLL_PWAIT2 = 5441 SYS_MOUNT_SETATTR = 5442 + SYS_QUOTACTL_FD = 5443 SYS_LANDLOCK_CREATE_RULESET = 5444 SYS_LANDLOCK_ADD_RULE = 5445 SYS_LANDLOCK_RESTRICT_SELF = 5446 + SYS_PROCESS_MRELEASE = 5448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index dcd926513..fda9a6a99 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -424,7 +424,9 @@ const ( SYS_PROCESS_MADVISE = 4440 SYS_EPOLL_PWAIT2 = 4441 SYS_MOUNT_SETATTR = 4442 + SYS_QUOTACTL_FD = 4443 SYS_LANDLOCK_CREATE_RULESET = 4444 SYS_LANDLOCK_ADD_RULE = 4445 SYS_LANDLOCK_RESTRICT_SELF = 4446 + SYS_PROCESS_MRELEASE = 4448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index d5ee2c935..e8496150d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -431,7 +431,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index fec32207c..5ee0678a3 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -403,7 +403,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 53a89b206..29c0f9a39 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -403,7 +403,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 0db9fbba5..5c9a9a3b6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -305,7 +305,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 378e6ec8b..913f50f98 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -368,7 +368,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 58e72b0cb..0de03a722 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -382,7 +382,9 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_QUOTACTL_FD = 443 SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_PROCESS_MRELEASE = 448 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 4c8dc0ba2..885842c0e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -209,6 +209,92 @@ type RawSockaddrCtl struct { Sc_reserved [5]uint32 } +type RawSockaddrVM struct { + Len uint8 + Family uint8 + Reserved1 uint16 + Port uint32 + Cid uint32 +} + +type XVSockPCB struct { + Xv_len uint32 + Xv_vsockpp uint64 + Xvp_local_cid uint32 + Xvp_local_port uint32 + Xvp_remote_cid uint32 + Xvp_remote_port uint32 + Xvp_rxcnt uint32 + Xvp_txcnt uint32 + Xvp_peer_rxhiwat uint32 + Xvp_peer_rxcnt uint32 + Xvp_last_pid int32 + Xvp_gencnt uint64 + Xv_socket XSocket + _ [4]byte +} + +type XSocket struct { + Xso_len uint32 + Xso_so uint32 + So_type int16 + So_options int16 + So_linger int16 + So_state int16 + So_pcb uint32 + Xso_protocol int32 + Xso_family int32 + So_qlen int16 + So_incqlen int16 + So_qlimit int16 + So_timeo int16 + So_error uint16 + So_pgid int32 + So_oobmark uint32 + So_rcv XSockbuf + So_snd XSockbuf + So_uid uint32 +} + +type XSocket64 struct { + Xso_len uint32 + _ [8]byte + So_type int16 + So_options int16 + So_linger int16 + So_state int16 + _ [8]byte + Xso_protocol int32 + Xso_family int32 + So_qlen int16 + So_incqlen int16 + So_qlimit int16 + So_timeo int16 + So_error uint16 + So_pgid int32 + So_oobmark uint32 + So_rcv XSockbuf + So_snd XSockbuf + So_uid uint32 +} + +type XSockbuf struct { + Cc uint32 + Hiwat uint32 + Mbcnt uint32 + Mbmax uint32 + Lowat int32 + Flags int16 + Timeo int16 +} + +type XVSockPgen struct { + Len uint32 + Count uint64 + Gen uint64 + Sogen uint64 +} + type _Socklen uint32 type Xucred struct { @@ -287,6 +373,11 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofSockaddrCtl = 0x20 + SizeofSockaddrVM = 0xc + SizeofXvsockpcb = 0xa8 + SizeofXSocket = 0x64 + SizeofXSockbuf = 0x18 + SizeofXVSockPgen = 0x20 SizeofXucred = 0x4c SizeofLinger = 0x8 SizeofIovec = 0x10 @@ -550,13 +641,13 @@ type Eproc struct { Tdev int32 Tpgid int32 Tsess uintptr - Wmesg [8]int8 + Wmesg [8]byte Xsize int32 Xrssize int16 Xccount int16 Xswrss int16 Flag int32 - Login [12]int8 + Login [12]byte Spare [4]int32 _ [4]byte } @@ -597,7 +688,7 @@ type ExternProc struct { P_priority uint8 P_usrpri uint8 P_nice int8 - P_comm [17]int8 + P_comm [17]byte P_pgrp uintptr P_addr uintptr P_xstat uint16 @@ -639,3 +730,39 @@ type Ucred struct { Ngroups int16 Groups [16]uint32 } + +type SysvIpcPerm struct { + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint16 + _ uint16 + _ int32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Lpid int32 + Cpid int32 + Nattch uint16 + _ [34]byte +} + +const ( + IPC_CREAT = 0x200 + IPC_EXCL = 0x400 + IPC_NOWAIT = 0x800 + IPC_PRIVATE = 0x0 +) + +const ( + IPC_RMID = 0x0 + IPC_SET = 0x1 + IPC_STAT = 0x2 +) + +const ( + SHM_RDONLY = 0x1000 + SHM_RND = 0x2000 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index 96f0e6ae2..b23c02337 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -209,6 +209,92 @@ type RawSockaddrCtl struct { Sc_reserved [5]uint32 } +type RawSockaddrVM struct { + Len uint8 + Family uint8 + Reserved1 uint16 + Port uint32 + Cid uint32 +} + +type XVSockPCB struct { + Xv_len uint32 + Xv_vsockpp uint64 + Xvp_local_cid uint32 + Xvp_local_port uint32 + Xvp_remote_cid uint32 + Xvp_remote_port uint32 + Xvp_rxcnt uint32 + Xvp_txcnt uint32 + Xvp_peer_rxhiwat uint32 + Xvp_peer_rxcnt uint32 + Xvp_last_pid int32 + Xvp_gencnt uint64 + Xv_socket XSocket + _ [4]byte +} + +type XSocket struct { + Xso_len uint32 + Xso_so uint32 + So_type int16 + So_options int16 + So_linger int16 + So_state int16 + So_pcb uint32 + Xso_protocol int32 + Xso_family int32 + So_qlen int16 + So_incqlen int16 + So_qlimit int16 + So_timeo int16 + So_error uint16 + So_pgid int32 + So_oobmark uint32 + So_rcv XSockbuf + So_snd XSockbuf + So_uid uint32 +} + +type XSocket64 struct { + Xso_len uint32 + _ [8]byte + So_type int16 + So_options int16 + So_linger int16 + So_state int16 + _ [8]byte + Xso_protocol int32 + Xso_family int32 + So_qlen int16 + So_incqlen int16 + So_qlimit int16 + So_timeo int16 + So_error uint16 + So_pgid int32 + So_oobmark uint32 + So_rcv XSockbuf + So_snd XSockbuf + So_uid uint32 +} + +type XSockbuf struct { + Cc uint32 + Hiwat uint32 + Mbcnt uint32 + Mbmax uint32 + Lowat int32 + Flags int16 + Timeo int16 +} + +type XVSockPgen struct { + Len uint32 + Count uint64 + Gen uint64 + Sogen uint64 +} + type _Socklen uint32 type Xucred struct { @@ -287,6 +373,11 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofSockaddrCtl = 0x20 + SizeofSockaddrVM = 0xc + SizeofXvsockpcb = 0xa8 + SizeofXSocket = 0x64 + SizeofXSockbuf = 0x18 + SizeofXVSockPgen = 0x20 SizeofXucred = 0x4c SizeofLinger = 0x8 SizeofIovec = 0x10 @@ -550,13 +641,13 @@ type Eproc struct { Tdev int32 Tpgid int32 Tsess uintptr - Wmesg [8]int8 + Wmesg [8]byte Xsize int32 Xrssize int16 Xccount int16 Xswrss int16 Flag int32 - Login [12]int8 + Login [12]byte Spare [4]int32 _ [4]byte } @@ -597,7 +688,7 @@ type ExternProc struct { P_priority uint8 P_usrpri uint8 P_nice int8 - P_comm [17]int8 + P_comm [17]byte P_pgrp uintptr P_addr uintptr P_xstat uint16 @@ -639,3 +730,39 @@ type Ucred struct { Ngroups int16 Groups [16]uint32 } + +type SysvIpcPerm struct { + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint16 + _ uint16 + _ int32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Lpid int32 + Cpid int32 + Nattch uint16 + _ [34]byte +} + +const ( + IPC_CREAT = 0x200 + IPC_EXCL = 0x400 + IPC_NOWAIT = 0x800 + IPC_PRIVATE = 0x0 +) + +const ( + IPC_RMID = 0x0 + IPC_SET = 0x1 + IPC_STAT = 0x2 +) + +const ( + SHM_RDONLY = 0x1000 + SHM_RND = 0x2000 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 1f99c024a..4eec078e5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -31,6 +31,8 @@ type Timeval struct { Usec int32 } +type Time_t int32 + type Rusage struct { Utime Timeval Stime Timeval diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index ddf0305a5..7622904a5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -31,6 +31,8 @@ type Timeval struct { Usec int64 } +type Time_t int64 + type Rusage struct { Utime Timeval Stime Timeval diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index dce0a5c80..19223ce8e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -33,6 +33,8 @@ type Timeval struct { _ [4]byte } +type Time_t int32 + type Rusage struct { Utime Timeval Stime Timeval diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index e23244702..8e3e33f67 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -31,6 +31,8 @@ type Timeval struct { Usec int64 } +type Time_t int64 + type Rusage struct { Utime Timeval Stime Timeval diff --git a/vendor/golang.org/x/sys/unix/ztypes_illumos_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_illumos_amd64.go index 236f37ef6..4c485261d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_illumos_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_illumos_amd64.go @@ -13,6 +13,8 @@ const ( I_STR = 0x5308 I_POP = 0x5303 I_PUSH = 0x5302 + I_LINK = 0x530c + I_UNLINK = 0x530d I_PLINK = 0x5316 I_PUNLINK = 0x5317 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 878141d6d..f6f0d79c4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -1,4 +1,4 @@ -// Code generated by mkmerge.go; DO NOT EDIT. +// Code generated by mkmerge; DO NOT EDIT. //go:build linux // +build linux @@ -743,6 +743,8 @@ const ( AT_STATX_FORCE_SYNC = 0x2000 AT_STATX_DONT_SYNC = 0x4000 + AT_RECURSIVE = 0x8000 + AT_SYMLINK_FOLLOW = 0x400 AT_SYMLINK_NOFOLLOW = 0x100 @@ -865,6 +867,7 @@ const ( CTRL_CMD_NEWMCAST_GRP = 0x7 CTRL_CMD_DELMCAST_GRP = 0x8 CTRL_CMD_GETMCAST_GRP = 0x9 + CTRL_CMD_GETPOLICY = 0xa CTRL_ATTR_UNSPEC = 0x0 CTRL_ATTR_FAMILY_ID = 0x1 CTRL_ATTR_FAMILY_NAME = 0x2 @@ -873,12 +876,19 @@ const ( CTRL_ATTR_MAXATTR = 0x5 CTRL_ATTR_OPS = 0x6 CTRL_ATTR_MCAST_GROUPS = 0x7 + CTRL_ATTR_POLICY = 0x8 + CTRL_ATTR_OP_POLICY = 0x9 + CTRL_ATTR_OP = 0xa CTRL_ATTR_OP_UNSPEC = 0x0 CTRL_ATTR_OP_ID = 0x1 CTRL_ATTR_OP_FLAGS = 0x2 CTRL_ATTR_MCAST_GRP_UNSPEC = 0x0 CTRL_ATTR_MCAST_GRP_NAME = 0x1 CTRL_ATTR_MCAST_GRP_ID = 0x2 + CTRL_ATTR_POLICY_UNSPEC = 0x0 + CTRL_ATTR_POLICY_DO = 0x1 + CTRL_ATTR_POLICY_DUMP = 0x2 + CTRL_ATTR_POLICY_DUMP_MAX = 0x2 ) const ( @@ -2356,8 +2366,8 @@ const ( SOF_TIMESTAMPING_OPT_PKTINFO = 0x2000 SOF_TIMESTAMPING_OPT_TX_SWHW = 0x4000 - SOF_TIMESTAMPING_LAST = 0x4000 - SOF_TIMESTAMPING_MASK = 0x7fff + SOF_TIMESTAMPING_LAST = 0x8000 + SOF_TIMESTAMPING_MASK = 0xffff SCM_TSTAMP_SND = 0x0 SCM_TSTAMP_SCHED = 0x1 @@ -2933,7 +2943,7 @@ const ( DEVLINK_CMD_TRAP_POLICER_NEW = 0x47 DEVLINK_CMD_TRAP_POLICER_DEL = 0x48 DEVLINK_CMD_HEALTH_REPORTER_TEST = 0x49 - DEVLINK_CMD_MAX = 0x49 + DEVLINK_CMD_MAX = 0x4d DEVLINK_PORT_TYPE_NOTSET = 0x0 DEVLINK_PORT_TYPE_AUTO = 0x1 DEVLINK_PORT_TYPE_ETH = 0x2 @@ -3156,7 +3166,7 @@ const ( DEVLINK_ATTR_RELOAD_ACTION_INFO = 0xa2 DEVLINK_ATTR_RELOAD_ACTION_STATS = 0xa3 DEVLINK_ATTR_PORT_PCI_SF_NUMBER = 0xa4 - DEVLINK_ATTR_MAX = 0xa4 + DEVLINK_ATTR_MAX = 0xa9 DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 @@ -3264,7 +3274,8 @@ const ( LWTUNNEL_ENCAP_BPF = 0x6 LWTUNNEL_ENCAP_SEG6_LOCAL = 0x7 LWTUNNEL_ENCAP_RPL = 0x8 - LWTUNNEL_ENCAP_MAX = 0x8 + LWTUNNEL_ENCAP_IOAM6 = 0x9 + LWTUNNEL_ENCAP_MAX = 0x9 MPLS_IPTUNNEL_UNSPEC = 0x0 MPLS_IPTUNNEL_DST = 0x1 @@ -3452,7 +3463,7 @@ const ( ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c - ETHTOOL_MSG_USER_MAX = 0x20 + ETHTOOL_MSG_USER_MAX = 0x21 ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3483,7 +3494,7 @@ const ( ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d - ETHTOOL_MSG_KERNEL_MAX = 0x21 + ETHTOOL_MSG_KERNEL_MAX = 0x22 ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3617,7 +3628,9 @@ const ( ETHTOOL_A_COALESCE_TX_USECS_HIGH = 0x15 ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 0x16 ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 - ETHTOOL_A_COALESCE_MAX = 0x17 + ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 0x18 + ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 0x19 + ETHTOOL_A_COALESCE_MAX = 0x19 ETHTOOL_A_PAUSE_UNSPEC = 0x0 ETHTOOL_A_PAUSE_HEADER = 0x1 ETHTOOL_A_PAUSE_AUTONEG = 0x2 @@ -3923,3 +3936,110 @@ const ( NFC_SDP_ATTR_URI = 0x1 NFC_SDP_ATTR_SAP = 0x2 ) + +type LandlockRulesetAttr struct { + Access_fs uint64 +} + +type LandlockPathBeneathAttr struct { + Allowed_access uint64 + Parent_fd int32 +} + +const ( + LANDLOCK_RULE_PATH_BENEATH = 0x1 +) + +const ( + IPC_CREAT = 0x200 + IPC_EXCL = 0x400 + IPC_NOWAIT = 0x800 + IPC_PRIVATE = 0x0 + + ipc_64 = 0x100 +) + +const ( + IPC_RMID = 0x0 + IPC_SET = 0x1 + IPC_STAT = 0x2 +) + +const ( + SHM_RDONLY = 0x1000 + SHM_RND = 0x2000 +) + +type MountAttr struct { + Attr_set uint64 + Attr_clr uint64 + Propagation uint64 + Userns_fd uint64 +} + +const ( + WG_CMD_GET_DEVICE = 0x0 + WG_CMD_SET_DEVICE = 0x1 + WGDEVICE_F_REPLACE_PEERS = 0x1 + WGDEVICE_A_UNSPEC = 0x0 + WGDEVICE_A_IFINDEX = 0x1 + WGDEVICE_A_IFNAME = 0x2 + WGDEVICE_A_PRIVATE_KEY = 0x3 + WGDEVICE_A_PUBLIC_KEY = 0x4 + WGDEVICE_A_FLAGS = 0x5 + WGDEVICE_A_LISTEN_PORT = 0x6 + WGDEVICE_A_FWMARK = 0x7 + WGDEVICE_A_PEERS = 0x8 + WGPEER_F_REMOVE_ME = 0x1 + WGPEER_F_REPLACE_ALLOWEDIPS = 0x2 + WGPEER_F_UPDATE_ONLY = 0x4 + WGPEER_A_UNSPEC = 0x0 + WGPEER_A_PUBLIC_KEY = 0x1 + WGPEER_A_PRESHARED_KEY = 0x2 + WGPEER_A_FLAGS = 0x3 + WGPEER_A_ENDPOINT = 0x4 + WGPEER_A_PERSISTENT_KEEPALIVE_INTERVAL = 0x5 + WGPEER_A_LAST_HANDSHAKE_TIME = 0x6 + WGPEER_A_RX_BYTES = 0x7 + WGPEER_A_TX_BYTES = 0x8 + WGPEER_A_ALLOWEDIPS = 0x9 + WGPEER_A_PROTOCOL_VERSION = 0xa + WGALLOWEDIP_A_UNSPEC = 0x0 + WGALLOWEDIP_A_FAMILY = 0x1 + WGALLOWEDIP_A_IPADDR = 0x2 + WGALLOWEDIP_A_CIDR_MASK = 0x3 +) + +const ( + NL_ATTR_TYPE_INVALID = 0x0 + NL_ATTR_TYPE_FLAG = 0x1 + NL_ATTR_TYPE_U8 = 0x2 + NL_ATTR_TYPE_U16 = 0x3 + NL_ATTR_TYPE_U32 = 0x4 + NL_ATTR_TYPE_U64 = 0x5 + NL_ATTR_TYPE_S8 = 0x6 + NL_ATTR_TYPE_S16 = 0x7 + NL_ATTR_TYPE_S32 = 0x8 + NL_ATTR_TYPE_S64 = 0x9 + NL_ATTR_TYPE_BINARY = 0xa + NL_ATTR_TYPE_STRING = 0xb + NL_ATTR_TYPE_NUL_STRING = 0xc + NL_ATTR_TYPE_NESTED = 0xd + NL_ATTR_TYPE_NESTED_ARRAY = 0xe + NL_ATTR_TYPE_BITFIELD32 = 0xf + + NL_POLICY_TYPE_ATTR_UNSPEC = 0x0 + NL_POLICY_TYPE_ATTR_TYPE = 0x1 + NL_POLICY_TYPE_ATTR_MIN_VALUE_S = 0x2 + NL_POLICY_TYPE_ATTR_MAX_VALUE_S = 0x3 + NL_POLICY_TYPE_ATTR_MIN_VALUE_U = 0x4 + NL_POLICY_TYPE_ATTR_MAX_VALUE_U = 0x5 + NL_POLICY_TYPE_ATTR_MIN_LENGTH = 0x6 + NL_POLICY_TYPE_ATTR_MAX_LENGTH = 0x7 + NL_POLICY_TYPE_ATTR_POLICY_IDX = 0x8 + NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE = 0x9 + NL_POLICY_TYPE_ATTR_BITFIELD32_MASK = 0xa + NL_POLICY_TYPE_ATTR_PAD = 0xb + NL_POLICY_TYPE_ATTR_MASK = 0xc + NL_POLICY_TYPE_ATTR_MAX = 0xc +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 72f2e96f3..bea254945 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build 386 && linux @@ -635,3 +635,36 @@ const ( PPS_GETCAP = 0x800470a3 PPS_FETCH = 0xc00470a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint16 + _ [2]uint8 + Seq uint16 + _ uint16 + _ uint32 + _ uint32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint32 + Atime uint32 + Atime_high uint32 + Dtime uint32 + Dtime_high uint32 + Ctime uint32 + Ctime_high uint32 + Cpid int32 + Lpid int32 + Nattch uint32 + _ uint32 + _ uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index d5f018d13..b8c8f2894 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build amd64 && linux @@ -653,3 +653,33 @@ const ( PPS_GETCAP = 0x800870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 675446d93..4db443016 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm && linux @@ -630,3 +630,36 @@ const ( PPS_GETCAP = 0x800470a3 PPS_FETCH = 0xc00470a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint16 + _ [2]uint8 + Seq uint16 + _ uint16 + _ uint32 + _ uint32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint32 + Atime uint32 + Atime_high uint32 + Dtime uint32 + Dtime_high uint32 + Ctime uint32 + Ctime_high uint32 + Cpid int32 + Lpid int32 + Nattch uint32 + _ uint32 + _ uint32 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 711d0711c..3ebcad8a8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build arm64 && linux @@ -632,3 +632,33 @@ const ( PPS_GETCAP = 0x800870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index c1131c741..3eb33e48a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips && linux @@ -636,3 +636,35 @@ const ( PPS_GETCAP = 0x400470a3 PPS_FETCH = 0xc00470a4 ) + +const ( + PIDFD_NONBLOCK = 0x80 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint32 + _ uint32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint32 + Atime uint32 + Dtime uint32 + Ctime uint32 + Cpid int32 + Lpid int32 + Nattch uint32 + Atime_high uint16 + Dtime_high uint16 + Ctime_high uint16 + _ uint16 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 91d5574ff..79a944672 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64 && linux @@ -635,3 +635,33 @@ const ( PPS_GETCAP = 0x400870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x80 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 5d721497b..8f4b107ca 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mips64le && linux @@ -635,3 +635,33 @@ const ( PPS_GETCAP = 0x400870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x80 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index a5addd06a..e4eb21798 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build mipsle && linux @@ -636,3 +636,35 @@ const ( PPS_GETCAP = 0x400470a3 PPS_FETCH = 0xc00470a4 ) + +const ( + PIDFD_NONBLOCK = 0x80 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint32 + _ uint32 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint32 + Atime uint32 + Dtime uint32 + Ctime uint32 + Cpid int32 + Lpid int32 + Nattch uint32 + Atime_high uint16 + Dtime_high uint16 + Ctime_high uint16 + _ uint16 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index bb6b03dfc..d5b21f0f7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc && linux @@ -642,3 +642,37 @@ const ( PPS_GETCAP = 0x400470a3 PPS_FETCH = 0xc00470a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + Seq uint32 + _ uint32 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Atime_high uint32 + Atime uint32 + Dtime_high uint32 + Dtime uint32 + Ctime_high uint32 + Ctime uint32 + _ uint32 + Segsz uint32 + Cpid int32 + Lpid int32 + Nattch uint32 + _ uint32 + _ uint32 + _ [4]byte +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 7637243b7..5188d142b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64 && linux @@ -642,3 +642,32 @@ const ( PPS_GETCAP = 0x400870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + Seq uint32 + _ uint32 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Atime int64 + Dtime int64 + Ctime int64 + Segsz uint64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index a1a28e525..de4dd4c73 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build ppc64le && linux @@ -642,3 +642,32 @@ const ( PPS_GETCAP = 0x400870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + Seq uint32 + _ uint32 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Atime int64 + Dtime int64 + Ctime int64 + Segsz uint64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index e0a8a1362..dccbf9b06 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build riscv64 && linux @@ -660,3 +660,33 @@ const ( PPS_GETCAP = 0x800870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ [0]uint8 + Seq uint16 + _ uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 21d6e56c7..635880610 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build s390x && linux @@ -656,3 +656,32 @@ const ( PPS_GETCAP = 0x800870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x800 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ uint16 + Seq uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Segsz uint64 + Atime int64 + Dtime int64 + Ctime int64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 0531e98f6..765edc13f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/unix/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. //go:build sparc64 && linux @@ -637,3 +637,32 @@ const ( PPS_GETCAP = 0x400870a3 PPS_FETCH = 0xc00870a4 ) + +const ( + PIDFD_NONBLOCK = 0x4000 +) + +type SysvIpcPerm struct { + Key int32 + Uid uint32 + Gid uint32 + Cuid uint32 + Cgid uint32 + Mode uint32 + _ uint16 + Seq uint16 + _ uint64 + _ uint64 +} +type SysvShmDesc struct { + Perm SysvIpcPerm + Atime int64 + Dtime int64 + Ctime int64 + Segsz uint64 + Cpid int32 + Lpid int32 + Nattch uint64 + _ uint64 + _ uint64 +} diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 2a8b1e6f7..baf5fe650 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -564,12 +564,11 @@ type Uvmexp struct { Kmapent int32 } -const SizeofClockinfo = 0x14 +const SizeofClockinfo = 0x10 type Clockinfo struct { - Hz int32 - Tick int32 - Tickadj int32 - Stathz int32 - Profhz int32 + Hz int32 + Tick int32 + Stathz int32 + Profhz int32 } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index b1759cf70..e21ae8ecf 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -564,12 +564,11 @@ type Uvmexp struct { Kmapent int32 } -const SizeofClockinfo = 0x14 +const SizeofClockinfo = 0x10 type Clockinfo struct { - Hz int32 - Tick int32 - Tickadj int32 - Stathz int32 - Profhz int32 + Hz int32 + Tick int32 + Stathz int32 + Profhz int32 } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index e807de206..f190651cd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -565,12 +565,11 @@ type Uvmexp struct { Kmapent int32 } -const SizeofClockinfo = 0x14 +const SizeofClockinfo = 0x10 type Clockinfo struct { - Hz int32 - Tick int32 - Tickadj int32 - Stathz int32 - Profhz int32 + Hz int32 + Tick int32 + Stathz int32 + Profhz int32 } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go index ff3aecaee..84747c582 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -558,12 +558,11 @@ type Uvmexp struct { Kmapent int32 } -const SizeofClockinfo = 0x14 +const SizeofClockinfo = 0x10 type Clockinfo struct { - Hz int32 - Tick int32 - Tickadj int32 - Stathz int32 - Profhz int32 + Hz int32 + Tick int32 + Stathz int32 + Profhz int32 } diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go index 9ecda6917..ac5c8b637 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go @@ -558,12 +558,11 @@ type Uvmexp struct { Kmapent int32 } -const SizeofClockinfo = 0x14 +const SizeofClockinfo = 0x10 type Clockinfo struct { - Hz int32 - Tick int32 - Tickadj int32 - Stathz int32 - Profhz int32 + Hz int32 + Tick int32 + Stathz int32 + Profhz int32 } diff --git a/vendor/golang.org/x/sys/windows/aliases.go b/vendor/golang.org/x/sys/windows/aliases.go index af3af60db..a20ebea63 100644 --- a/vendor/golang.org/x/sys/windows/aliases.go +++ b/vendor/golang.org/x/sys/windows/aliases.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build windows -// +build go1.9 +//go:build windows && go1.9 +// +build windows,go1.9 package windows diff --git a/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/golang.org/x/sys/windows/eventlog.go index 40af946e1..2cd60645e 100644 --- a/vendor/golang.org/x/sys/windows/eventlog.go +++ b/vendor/golang.org/x/sys/windows/eventlog.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build windows // +build windows package windows diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go index 7a11e83b7..855698bb2 100644 --- a/vendor/golang.org/x/sys/windows/exec_windows.go +++ b/vendor/golang.org/x/sys/windows/exec_windows.go @@ -9,8 +9,6 @@ package windows import ( errorspkg "errors" "unsafe" - - "golang.org/x/sys/internal/unsafeheader" ) // EscapeArg rewrites command line argument s as prescribed @@ -147,8 +145,12 @@ func NewProcThreadAttributeList(maxAttrCount uint32) (*ProcThreadAttributeListCo } return nil, err } + alloc, err := LocalAlloc(LMEM_FIXED, uint32(size)) + if err != nil { + return nil, err + } // size is guaranteed to be ≥1 by InitializeProcThreadAttributeList. - al := &ProcThreadAttributeListContainer{data: (*ProcThreadAttributeList)(unsafe.Pointer(&make([]byte, size)[0]))} + al := &ProcThreadAttributeListContainer{data: (*ProcThreadAttributeList)(unsafe.Pointer(alloc))} err = initializeProcThreadAttributeList(al.data, maxAttrCount, 0, &size) if err != nil { return nil, err @@ -157,36 +159,17 @@ func NewProcThreadAttributeList(maxAttrCount uint32) (*ProcThreadAttributeListCo } // Update modifies the ProcThreadAttributeList using UpdateProcThreadAttribute. -// Note that the value passed to this function will be copied into memory -// allocated by LocalAlloc, the contents of which should not contain any -// Go-managed pointers, even if the passed value itself is a Go-managed -// pointer. func (al *ProcThreadAttributeListContainer) Update(attribute uintptr, value unsafe.Pointer, size uintptr) error { - alloc, err := LocalAlloc(LMEM_FIXED, uint32(size)) - if err != nil { - return err - } - var src, dst []byte - hdr := (*unsafeheader.Slice)(unsafe.Pointer(&src)) - hdr.Data = value - hdr.Cap = int(size) - hdr.Len = int(size) - hdr = (*unsafeheader.Slice)(unsafe.Pointer(&dst)) - hdr.Data = unsafe.Pointer(alloc) - hdr.Cap = int(size) - hdr.Len = int(size) - copy(dst, src) - al.heapAllocations = append(al.heapAllocations, alloc) - return updateProcThreadAttribute(al.data, 0, attribute, unsafe.Pointer(alloc), size, nil, nil) + al.pointers = append(al.pointers, value) + return updateProcThreadAttribute(al.data, 0, attribute, value, size, nil, nil) } // Delete frees ProcThreadAttributeList's resources. func (al *ProcThreadAttributeListContainer) Delete() { deleteProcThreadAttributeList(al.data) - for i := range al.heapAllocations { - LocalFree(Handle(al.heapAllocations[i])) - } - al.heapAllocations = nil + LocalFree(Handle(unsafe.Pointer(al.data))) + al.data = nil + al.pointers = nil } // List returns the actual ProcThreadAttributeList to be passed to StartupInfoEx. diff --git a/vendor/golang.org/x/sys/windows/memory_windows.go b/vendor/golang.org/x/sys/windows/memory_windows.go index 1adb60739..6dc0920a8 100644 --- a/vendor/golang.org/x/sys/windows/memory_windows.go +++ b/vendor/golang.org/x/sys/windows/memory_windows.go @@ -35,3 +35,14 @@ const ( QUOTA_LIMITS_HARDWS_MAX_DISABLE = 0x00000008 QUOTA_LIMITS_HARDWS_MAX_ENABLE = 0x00000004 ) + +type MemoryBasicInformation struct { + BaseAddress uintptr + AllocationBase uintptr + AllocationProtect uint32 + PartitionId uint16 + RegionSize uintptr + State uint32 + Protect uint32 + Type uint32 +} diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go index 328e3b2ac..8563f79c5 100644 --- a/vendor/golang.org/x/sys/windows/mksyscall.go +++ b/vendor/golang.org/x/sys/windows/mksyscall.go @@ -2,8 +2,9 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build generate // +build generate package windows -//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go +//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go setupapi_windows.go diff --git a/vendor/golang.org/x/sys/windows/race.go b/vendor/golang.org/x/sys/windows/race.go index a74e3e24b..9196b089c 100644 --- a/vendor/golang.org/x/sys/windows/race.go +++ b/vendor/golang.org/x/sys/windows/race.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build windows && race // +build windows,race package windows diff --git a/vendor/golang.org/x/sys/windows/race0.go b/vendor/golang.org/x/sys/windows/race0.go index e44a3cbf6..7bae4817a 100644 --- a/vendor/golang.org/x/sys/windows/race0.go +++ b/vendor/golang.org/x/sys/windows/race0.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build windows && !race // +build windows,!race package windows diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index b269850d0..f8deca839 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build windows // +build windows package windows @@ -16,8 +17,6 @@ const ( SC_MANAGER_ALL_ACCESS = 0xf003f ) -//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW - const ( SERVICE_KERNEL_DRIVER = 1 SERVICE_FILE_SYSTEM_DRIVER = 2 @@ -132,6 +131,14 @@ const ( SC_EVENT_DATABASE_CHANGE = 0 SC_EVENT_PROPERTY_CHANGE = 1 SC_EVENT_STATUS_CHANGE = 2 + + SERVICE_START_REASON_DEMAND = 0x00000001 + SERVICE_START_REASON_AUTO = 0x00000002 + SERVICE_START_REASON_TRIGGER = 0x00000004 + SERVICE_START_REASON_RESTART_ON_FAILURE = 0x00000008 + SERVICE_START_REASON_DELAYEDAUTO = 0x00000010 + + SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON = 1 ) type SERVICE_STATUS struct { @@ -216,6 +223,7 @@ type QUERY_SERVICE_LOCK_STATUS struct { LockDuration uint32 } +//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW //sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle //sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW //sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW @@ -235,3 +243,5 @@ type QUERY_SERVICE_LOCK_STATUS struct { //sys NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW //sys SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) = sechost.SubscribeServiceChangeNotifications? //sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications? +//sys RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) = advapi32.RegisterServiceCtrlHandlerExW +//sys QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) = advapi32.QueryServiceDynamicInformation? diff --git a/vendor/golang.org/x/sys/windows/setupapi_windows.go b/vendor/golang.org/x/sys/windows/setupapi_windows.go new file mode 100644 index 000000000..14027da3f --- /dev/null +++ b/vendor/golang.org/x/sys/windows/setupapi_windows.go @@ -0,0 +1,1425 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package windows + +import ( + "encoding/binary" + "errors" + "fmt" + "runtime" + "strings" + "syscall" + "unsafe" +) + +// This file contains functions that wrap SetupAPI.dll and CfgMgr32.dll, +// core system functions for managing hardware devices, drivers, and the PnP tree. +// Information about these APIs can be found at: +// https://docs.microsoft.com/en-us/windows-hardware/drivers/install/setupapi +// https://docs.microsoft.com/en-us/windows/win32/devinst/cfgmgr32- + +const ( + ERROR_EXPECTED_SECTION_NAME Errno = 0x20000000 | 0xC0000000 | 0 + ERROR_BAD_SECTION_NAME_LINE Errno = 0x20000000 | 0xC0000000 | 1 + ERROR_SECTION_NAME_TOO_LONG Errno = 0x20000000 | 0xC0000000 | 2 + ERROR_GENERAL_SYNTAX Errno = 0x20000000 | 0xC0000000 | 3 + ERROR_WRONG_INF_STYLE Errno = 0x20000000 | 0xC0000000 | 0x100 + ERROR_SECTION_NOT_FOUND Errno = 0x20000000 | 0xC0000000 | 0x101 + ERROR_LINE_NOT_FOUND Errno = 0x20000000 | 0xC0000000 | 0x102 + ERROR_NO_BACKUP Errno = 0x20000000 | 0xC0000000 | 0x103 + ERROR_NO_ASSOCIATED_CLASS Errno = 0x20000000 | 0xC0000000 | 0x200 + ERROR_CLASS_MISMATCH Errno = 0x20000000 | 0xC0000000 | 0x201 + ERROR_DUPLICATE_FOUND Errno = 0x20000000 | 0xC0000000 | 0x202 + ERROR_NO_DRIVER_SELECTED Errno = 0x20000000 | 0xC0000000 | 0x203 + ERROR_KEY_DOES_NOT_EXIST Errno = 0x20000000 | 0xC0000000 | 0x204 + ERROR_INVALID_DEVINST_NAME Errno = 0x20000000 | 0xC0000000 | 0x205 + ERROR_INVALID_CLASS Errno = 0x20000000 | 0xC0000000 | 0x206 + ERROR_DEVINST_ALREADY_EXISTS Errno = 0x20000000 | 0xC0000000 | 0x207 + ERROR_DEVINFO_NOT_REGISTERED Errno = 0x20000000 | 0xC0000000 | 0x208 + ERROR_INVALID_REG_PROPERTY Errno = 0x20000000 | 0xC0000000 | 0x209 + ERROR_NO_INF Errno = 0x20000000 | 0xC0000000 | 0x20A + ERROR_NO_SUCH_DEVINST Errno = 0x20000000 | 0xC0000000 | 0x20B + ERROR_CANT_LOAD_CLASS_ICON Errno = 0x20000000 | 0xC0000000 | 0x20C + ERROR_INVALID_CLASS_INSTALLER Errno = 0x20000000 | 0xC0000000 | 0x20D + ERROR_DI_DO_DEFAULT Errno = 0x20000000 | 0xC0000000 | 0x20E + ERROR_DI_NOFILECOPY Errno = 0x20000000 | 0xC0000000 | 0x20F + ERROR_INVALID_HWPROFILE Errno = 0x20000000 | 0xC0000000 | 0x210 + ERROR_NO_DEVICE_SELECTED Errno = 0x20000000 | 0xC0000000 | 0x211 + ERROR_DEVINFO_LIST_LOCKED Errno = 0x20000000 | 0xC0000000 | 0x212 + ERROR_DEVINFO_DATA_LOCKED Errno = 0x20000000 | 0xC0000000 | 0x213 + ERROR_DI_BAD_PATH Errno = 0x20000000 | 0xC0000000 | 0x214 + ERROR_NO_CLASSINSTALL_PARAMS Errno = 0x20000000 | 0xC0000000 | 0x215 + ERROR_FILEQUEUE_LOCKED Errno = 0x20000000 | 0xC0000000 | 0x216 + ERROR_BAD_SERVICE_INSTALLSECT Errno = 0x20000000 | 0xC0000000 | 0x217 + ERROR_NO_CLASS_DRIVER_LIST Errno = 0x20000000 | 0xC0000000 | 0x218 + ERROR_NO_ASSOCIATED_SERVICE Errno = 0x20000000 | 0xC0000000 | 0x219 + ERROR_NO_DEFAULT_DEVICE_INTERFACE Errno = 0x20000000 | 0xC0000000 | 0x21A + ERROR_DEVICE_INTERFACE_ACTIVE Errno = 0x20000000 | 0xC0000000 | 0x21B + ERROR_DEVICE_INTERFACE_REMOVED Errno = 0x20000000 | 0xC0000000 | 0x21C + ERROR_BAD_INTERFACE_INSTALLSECT Errno = 0x20000000 | 0xC0000000 | 0x21D + ERROR_NO_SUCH_INTERFACE_CLASS Errno = 0x20000000 | 0xC0000000 | 0x21E + ERROR_INVALID_REFERENCE_STRING Errno = 0x20000000 | 0xC0000000 | 0x21F + ERROR_INVALID_MACHINENAME Errno = 0x20000000 | 0xC0000000 | 0x220 + ERROR_REMOTE_COMM_FAILURE Errno = 0x20000000 | 0xC0000000 | 0x221 + ERROR_MACHINE_UNAVAILABLE Errno = 0x20000000 | 0xC0000000 | 0x222 + ERROR_NO_CONFIGMGR_SERVICES Errno = 0x20000000 | 0xC0000000 | 0x223 + ERROR_INVALID_PROPPAGE_PROVIDER Errno = 0x20000000 | 0xC0000000 | 0x224 + ERROR_NO_SUCH_DEVICE_INTERFACE Errno = 0x20000000 | 0xC0000000 | 0x225 + ERROR_DI_POSTPROCESSING_REQUIRED Errno = 0x20000000 | 0xC0000000 | 0x226 + ERROR_INVALID_COINSTALLER Errno = 0x20000000 | 0xC0000000 | 0x227 + ERROR_NO_COMPAT_DRIVERS Errno = 0x20000000 | 0xC0000000 | 0x228 + ERROR_NO_DEVICE_ICON Errno = 0x20000000 | 0xC0000000 | 0x229 + ERROR_INVALID_INF_LOGCONFIG Errno = 0x20000000 | 0xC0000000 | 0x22A + ERROR_DI_DONT_INSTALL Errno = 0x20000000 | 0xC0000000 | 0x22B + ERROR_INVALID_FILTER_DRIVER Errno = 0x20000000 | 0xC0000000 | 0x22C + ERROR_NON_WINDOWS_NT_DRIVER Errno = 0x20000000 | 0xC0000000 | 0x22D + ERROR_NON_WINDOWS_DRIVER Errno = 0x20000000 | 0xC0000000 | 0x22E + ERROR_NO_CATALOG_FOR_OEM_INF Errno = 0x20000000 | 0xC0000000 | 0x22F + ERROR_DEVINSTALL_QUEUE_NONNATIVE Errno = 0x20000000 | 0xC0000000 | 0x230 + ERROR_NOT_DISABLEABLE Errno = 0x20000000 | 0xC0000000 | 0x231 + ERROR_CANT_REMOVE_DEVINST Errno = 0x20000000 | 0xC0000000 | 0x232 + ERROR_INVALID_TARGET Errno = 0x20000000 | 0xC0000000 | 0x233 + ERROR_DRIVER_NONNATIVE Errno = 0x20000000 | 0xC0000000 | 0x234 + ERROR_IN_WOW64 Errno = 0x20000000 | 0xC0000000 | 0x235 + ERROR_SET_SYSTEM_RESTORE_POINT Errno = 0x20000000 | 0xC0000000 | 0x236 + ERROR_SCE_DISABLED Errno = 0x20000000 | 0xC0000000 | 0x238 + ERROR_UNKNOWN_EXCEPTION Errno = 0x20000000 | 0xC0000000 | 0x239 + ERROR_PNP_REGISTRY_ERROR Errno = 0x20000000 | 0xC0000000 | 0x23A + ERROR_REMOTE_REQUEST_UNSUPPORTED Errno = 0x20000000 | 0xC0000000 | 0x23B + ERROR_NOT_AN_INSTALLED_OEM_INF Errno = 0x20000000 | 0xC0000000 | 0x23C + ERROR_INF_IN_USE_BY_DEVICES Errno = 0x20000000 | 0xC0000000 | 0x23D + ERROR_DI_FUNCTION_OBSOLETE Errno = 0x20000000 | 0xC0000000 | 0x23E + ERROR_NO_AUTHENTICODE_CATALOG Errno = 0x20000000 | 0xC0000000 | 0x23F + ERROR_AUTHENTICODE_DISALLOWED Errno = 0x20000000 | 0xC0000000 | 0x240 + ERROR_AUTHENTICODE_TRUSTED_PUBLISHER Errno = 0x20000000 | 0xC0000000 | 0x241 + ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED Errno = 0x20000000 | 0xC0000000 | 0x242 + ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED Errno = 0x20000000 | 0xC0000000 | 0x243 + ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH Errno = 0x20000000 | 0xC0000000 | 0x244 + ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE Errno = 0x20000000 | 0xC0000000 | 0x245 + ERROR_DEVICE_INSTALLER_NOT_READY Errno = 0x20000000 | 0xC0000000 | 0x246 + ERROR_DRIVER_STORE_ADD_FAILED Errno = 0x20000000 | 0xC0000000 | 0x247 + ERROR_DEVICE_INSTALL_BLOCKED Errno = 0x20000000 | 0xC0000000 | 0x248 + ERROR_DRIVER_INSTALL_BLOCKED Errno = 0x20000000 | 0xC0000000 | 0x249 + ERROR_WRONG_INF_TYPE Errno = 0x20000000 | 0xC0000000 | 0x24A + ERROR_FILE_HASH_NOT_IN_CATALOG Errno = 0x20000000 | 0xC0000000 | 0x24B + ERROR_DRIVER_STORE_DELETE_FAILED Errno = 0x20000000 | 0xC0000000 | 0x24C + ERROR_UNRECOVERABLE_STACK_OVERFLOW Errno = 0x20000000 | 0xC0000000 | 0x300 + EXCEPTION_SPAPI_UNRECOVERABLE_STACK_OVERFLOW Errno = ERROR_UNRECOVERABLE_STACK_OVERFLOW + ERROR_NO_DEFAULT_INTERFACE_DEVICE Errno = ERROR_NO_DEFAULT_DEVICE_INTERFACE + ERROR_INTERFACE_DEVICE_ACTIVE Errno = ERROR_DEVICE_INTERFACE_ACTIVE + ERROR_INTERFACE_DEVICE_REMOVED Errno = ERROR_DEVICE_INTERFACE_REMOVED + ERROR_NO_SUCH_INTERFACE_DEVICE Errno = ERROR_NO_SUCH_DEVICE_INTERFACE +) + +const ( + MAX_DEVICE_ID_LEN = 200 + MAX_DEVNODE_ID_LEN = MAX_DEVICE_ID_LEN + MAX_GUID_STRING_LEN = 39 // 38 chars + terminator null + MAX_CLASS_NAME_LEN = 32 + MAX_PROFILE_LEN = 80 + MAX_CONFIG_VALUE = 9999 + MAX_INSTANCE_VALUE = 9999 + CONFIGMG_VERSION = 0x0400 +) + +// Maximum string length constants +const ( + LINE_LEN = 256 // Windows 9x-compatible maximum for displayable strings coming from a device INF. + MAX_INF_STRING_LENGTH = 4096 // Actual maximum size of an INF string (including string substitutions). + MAX_INF_SECTION_NAME_LENGTH = 255 // For Windows 9x compatibility, INF section names should be constrained to 32 characters. + MAX_TITLE_LEN = 60 + MAX_INSTRUCTION_LEN = 256 + MAX_LABEL_LEN = 30 + MAX_SERVICE_NAME_LEN = 256 + MAX_SUBTITLE_LEN = 256 +) + +const ( + // SP_MAX_MACHINENAME_LENGTH defines maximum length of a machine name in the format expected by ConfigMgr32 CM_Connect_Machine (i.e., "\\\\MachineName\0"). + SP_MAX_MACHINENAME_LENGTH = MAX_PATH + 3 +) + +// HSPFILEQ is type for setup file queue +type HSPFILEQ uintptr + +// DevInfo holds reference to device information set +type DevInfo Handle + +// DEVINST is a handle usually recognized by cfgmgr32 APIs +type DEVINST uint32 + +// DevInfoData is a device information structure (references a device instance that is a member of a device information set) +type DevInfoData struct { + size uint32 + ClassGUID GUID + DevInst DEVINST + _ uintptr +} + +// DevInfoListDetailData is a structure for detailed information on a device information set (used for SetupDiGetDeviceInfoListDetail which supersedes the functionality of SetupDiGetDeviceInfoListClass). +type DevInfoListDetailData struct { + size uint32 // Use unsafeSizeOf method + ClassGUID GUID + RemoteMachineHandle Handle + remoteMachineName [SP_MAX_MACHINENAME_LENGTH]uint16 +} + +func (*DevInfoListDetailData) unsafeSizeOf() uint32 { + if unsafe.Sizeof(uintptr(0)) == 4 { + // Windows declares this with pshpack1.h + return uint32(unsafe.Offsetof(DevInfoListDetailData{}.remoteMachineName) + unsafe.Sizeof(DevInfoListDetailData{}.remoteMachineName)) + } + return uint32(unsafe.Sizeof(DevInfoListDetailData{})) +} + +func (data *DevInfoListDetailData) RemoteMachineName() string { + return UTF16ToString(data.remoteMachineName[:]) +} + +func (data *DevInfoListDetailData) SetRemoteMachineName(remoteMachineName string) error { + str, err := UTF16FromString(remoteMachineName) + if err != nil { + return err + } + copy(data.remoteMachineName[:], str) + return nil +} + +// DI_FUNCTION is function type for device installer +type DI_FUNCTION uint32 + +const ( + DIF_SELECTDEVICE DI_FUNCTION = 0x00000001 + DIF_INSTALLDEVICE DI_FUNCTION = 0x00000002 + DIF_ASSIGNRESOURCES DI_FUNCTION = 0x00000003 + DIF_PROPERTIES DI_FUNCTION = 0x00000004 + DIF_REMOVE DI_FUNCTION = 0x00000005 + DIF_FIRSTTIMESETUP DI_FUNCTION = 0x00000006 + DIF_FOUNDDEVICE DI_FUNCTION = 0x00000007 + DIF_SELECTCLASSDRIVERS DI_FUNCTION = 0x00000008 + DIF_VALIDATECLASSDRIVERS DI_FUNCTION = 0x00000009 + DIF_INSTALLCLASSDRIVERS DI_FUNCTION = 0x0000000A + DIF_CALCDISKSPACE DI_FUNCTION = 0x0000000B + DIF_DESTROYPRIVATEDATA DI_FUNCTION = 0x0000000C + DIF_VALIDATEDRIVER DI_FUNCTION = 0x0000000D + DIF_DETECT DI_FUNCTION = 0x0000000F + DIF_INSTALLWIZARD DI_FUNCTION = 0x00000010 + DIF_DESTROYWIZARDDATA DI_FUNCTION = 0x00000011 + DIF_PROPERTYCHANGE DI_FUNCTION = 0x00000012 + DIF_ENABLECLASS DI_FUNCTION = 0x00000013 + DIF_DETECTVERIFY DI_FUNCTION = 0x00000014 + DIF_INSTALLDEVICEFILES DI_FUNCTION = 0x00000015 + DIF_UNREMOVE DI_FUNCTION = 0x00000016 + DIF_SELECTBESTCOMPATDRV DI_FUNCTION = 0x00000017 + DIF_ALLOW_INSTALL DI_FUNCTION = 0x00000018 + DIF_REGISTERDEVICE DI_FUNCTION = 0x00000019 + DIF_NEWDEVICEWIZARD_PRESELECT DI_FUNCTION = 0x0000001A + DIF_NEWDEVICEWIZARD_SELECT DI_FUNCTION = 0x0000001B + DIF_NEWDEVICEWIZARD_PREANALYZE DI_FUNCTION = 0x0000001C + DIF_NEWDEVICEWIZARD_POSTANALYZE DI_FUNCTION = 0x0000001D + DIF_NEWDEVICEWIZARD_FINISHINSTALL DI_FUNCTION = 0x0000001E + DIF_INSTALLINTERFACES DI_FUNCTION = 0x00000020 + DIF_DETECTCANCEL DI_FUNCTION = 0x00000021 + DIF_REGISTER_COINSTALLERS DI_FUNCTION = 0x00000022 + DIF_ADDPROPERTYPAGE_ADVANCED DI_FUNCTION = 0x00000023 + DIF_ADDPROPERTYPAGE_BASIC DI_FUNCTION = 0x00000024 + DIF_TROUBLESHOOTER DI_FUNCTION = 0x00000026 + DIF_POWERMESSAGEWAKE DI_FUNCTION = 0x00000027 + DIF_ADDREMOTEPROPERTYPAGE_ADVANCED DI_FUNCTION = 0x00000028 + DIF_UPDATEDRIVER_UI DI_FUNCTION = 0x00000029 + DIF_FINISHINSTALL_ACTION DI_FUNCTION = 0x0000002A +) + +// DevInstallParams is device installation parameters structure (associated with a particular device information element, or globally with a device information set) +type DevInstallParams struct { + size uint32 + Flags DI_FLAGS + FlagsEx DI_FLAGSEX + hwndParent uintptr + InstallMsgHandler uintptr + InstallMsgHandlerContext uintptr + FileQueue HSPFILEQ + _ uintptr + _ uint32 + driverPath [MAX_PATH]uint16 +} + +func (params *DevInstallParams) DriverPath() string { + return UTF16ToString(params.driverPath[:]) +} + +func (params *DevInstallParams) SetDriverPath(driverPath string) error { + str, err := UTF16FromString(driverPath) + if err != nil { + return err + } + copy(params.driverPath[:], str) + return nil +} + +// DI_FLAGS is SP_DEVINSTALL_PARAMS.Flags values +type DI_FLAGS uint32 + +const ( + // Flags for choosing a device + DI_SHOWOEM DI_FLAGS = 0x00000001 // support Other... button + DI_SHOWCOMPAT DI_FLAGS = 0x00000002 // show compatibility list + DI_SHOWCLASS DI_FLAGS = 0x00000004 // show class list + DI_SHOWALL DI_FLAGS = 0x00000007 // both class & compat list shown + DI_NOVCP DI_FLAGS = 0x00000008 // don't create a new copy queue--use caller-supplied FileQueue + DI_DIDCOMPAT DI_FLAGS = 0x00000010 // Searched for compatible devices + DI_DIDCLASS DI_FLAGS = 0x00000020 // Searched for class devices + DI_AUTOASSIGNRES DI_FLAGS = 0x00000040 // No UI for resources if possible + + // Flags returned by DiInstallDevice to indicate need to reboot/restart + DI_NEEDRESTART DI_FLAGS = 0x00000080 // Reboot required to take effect + DI_NEEDREBOOT DI_FLAGS = 0x00000100 // "" + + // Flags for device installation + DI_NOBROWSE DI_FLAGS = 0x00000200 // no Browse... in InsertDisk + + // Flags set by DiBuildDriverInfoList + DI_MULTMFGS DI_FLAGS = 0x00000400 // Set if multiple manufacturers in class driver list + + // Flag indicates that device is disabled + DI_DISABLED DI_FLAGS = 0x00000800 // Set if device disabled + + // Flags for Device/Class Properties + DI_GENERALPAGE_ADDED DI_FLAGS = 0x00001000 + DI_RESOURCEPAGE_ADDED DI_FLAGS = 0x00002000 + + // Flag to indicate the setting properties for this Device (or class) caused a change so the Dev Mgr UI probably needs to be updated. + DI_PROPERTIES_CHANGE DI_FLAGS = 0x00004000 + + // Flag to indicate that the sorting from the INF file should be used. + DI_INF_IS_SORTED DI_FLAGS = 0x00008000 + + // Flag to indicate that only the the INF specified by SP_DEVINSTALL_PARAMS.DriverPath should be searched. + DI_ENUMSINGLEINF DI_FLAGS = 0x00010000 + + // Flag that prevents ConfigMgr from removing/re-enumerating devices during device + // registration, installation, and deletion. + DI_DONOTCALLCONFIGMG DI_FLAGS = 0x00020000 + + // The following flag can be used to install a device disabled + DI_INSTALLDISABLED DI_FLAGS = 0x00040000 + + // Flag that causes SetupDiBuildDriverInfoList to build a device's compatible driver + // list from its existing class driver list, instead of the normal INF search. + DI_COMPAT_FROM_CLASS DI_FLAGS = 0x00080000 + + // This flag is set if the Class Install params should be used. + DI_CLASSINSTALLPARAMS DI_FLAGS = 0x00100000 + + // This flag is set if the caller of DiCallClassInstaller does NOT want the internal default action performed if the Class installer returns ERROR_DI_DO_DEFAULT. + DI_NODI_DEFAULTACTION DI_FLAGS = 0x00200000 + + // Flags for device installation + DI_QUIETINSTALL DI_FLAGS = 0x00800000 // don't confuse the user with questions or excess info + DI_NOFILECOPY DI_FLAGS = 0x01000000 // No file Copy necessary + DI_FORCECOPY DI_FLAGS = 0x02000000 // Force files to be copied from install path + DI_DRIVERPAGE_ADDED DI_FLAGS = 0x04000000 // Prop provider added Driver page. + DI_USECI_SELECTSTRINGS DI_FLAGS = 0x08000000 // Use Class Installer Provided strings in the Select Device Dlg + DI_OVERRIDE_INFFLAGS DI_FLAGS = 0x10000000 // Override INF flags + DI_PROPS_NOCHANGEUSAGE DI_FLAGS = 0x20000000 // No Enable/Disable in General Props + + DI_NOSELECTICONS DI_FLAGS = 0x40000000 // No small icons in select device dialogs + + DI_NOWRITE_IDS DI_FLAGS = 0x80000000 // Don't write HW & Compat IDs on install +) + +// DI_FLAGSEX is SP_DEVINSTALL_PARAMS.FlagsEx values +type DI_FLAGSEX uint32 + +const ( + DI_FLAGSEX_CI_FAILED DI_FLAGSEX = 0x00000004 // Failed to Load/Call class installer + DI_FLAGSEX_FINISHINSTALL_ACTION DI_FLAGSEX = 0x00000008 // Class/co-installer wants to get a DIF_FINISH_INSTALL action in client context. + DI_FLAGSEX_DIDINFOLIST DI_FLAGSEX = 0x00000010 // Did the Class Info List + DI_FLAGSEX_DIDCOMPATINFO DI_FLAGSEX = 0x00000020 // Did the Compat Info List + DI_FLAGSEX_FILTERCLASSES DI_FLAGSEX = 0x00000040 + DI_FLAGSEX_SETFAILEDINSTALL DI_FLAGSEX = 0x00000080 + DI_FLAGSEX_DEVICECHANGE DI_FLAGSEX = 0x00000100 + DI_FLAGSEX_ALWAYSWRITEIDS DI_FLAGSEX = 0x00000200 + DI_FLAGSEX_PROPCHANGE_PENDING DI_FLAGSEX = 0x00000400 // One or more device property sheets have had changes made to them, and need to have a DIF_PROPERTYCHANGE occur. + DI_FLAGSEX_ALLOWEXCLUDEDDRVS DI_FLAGSEX = 0x00000800 + DI_FLAGSEX_NOUIONQUERYREMOVE DI_FLAGSEX = 0x00001000 + DI_FLAGSEX_USECLASSFORCOMPAT DI_FLAGSEX = 0x00002000 // Use the device's class when building compat drv list. (Ignored if DI_COMPAT_FROM_CLASS flag is specified.) + DI_FLAGSEX_NO_DRVREG_MODIFY DI_FLAGSEX = 0x00008000 // Don't run AddReg and DelReg for device's software (driver) key. + DI_FLAGSEX_IN_SYSTEM_SETUP DI_FLAGSEX = 0x00010000 // Installation is occurring during initial system setup. + DI_FLAGSEX_INET_DRIVER DI_FLAGSEX = 0x00020000 // Driver came from Windows Update + DI_FLAGSEX_APPENDDRIVERLIST DI_FLAGSEX = 0x00040000 // Cause SetupDiBuildDriverInfoList to append a new driver list to an existing list. + DI_FLAGSEX_PREINSTALLBACKUP DI_FLAGSEX = 0x00080000 // not used + DI_FLAGSEX_BACKUPONREPLACE DI_FLAGSEX = 0x00100000 // not used + DI_FLAGSEX_DRIVERLIST_FROM_URL DI_FLAGSEX = 0x00200000 // build driver list from INF(s) retrieved from URL specified in SP_DEVINSTALL_PARAMS.DriverPath (empty string means Windows Update website) + DI_FLAGSEX_EXCLUDE_OLD_INET_DRIVERS DI_FLAGSEX = 0x00800000 // Don't include old Internet drivers when building a driver list. Ignored on Windows Vista and later. + DI_FLAGSEX_POWERPAGE_ADDED DI_FLAGSEX = 0x01000000 // class installer added their own power page + DI_FLAGSEX_FILTERSIMILARDRIVERS DI_FLAGSEX = 0x02000000 // only include similar drivers in class list + DI_FLAGSEX_INSTALLEDDRIVER DI_FLAGSEX = 0x04000000 // only add the installed driver to the class or compat driver list. Used in calls to SetupDiBuildDriverInfoList + DI_FLAGSEX_NO_CLASSLIST_NODE_MERGE DI_FLAGSEX = 0x08000000 // Don't remove identical driver nodes from the class list + DI_FLAGSEX_ALTPLATFORM_DRVSEARCH DI_FLAGSEX = 0x10000000 // Build driver list based on alternate platform information specified in associated file queue + DI_FLAGSEX_RESTART_DEVICE_ONLY DI_FLAGSEX = 0x20000000 // only restart the device drivers are being installed on as opposed to restarting all devices using those drivers. + DI_FLAGSEX_RECURSIVESEARCH DI_FLAGSEX = 0x40000000 // Tell SetupDiBuildDriverInfoList to do a recursive search + DI_FLAGSEX_SEARCH_PUBLISHED_INFS DI_FLAGSEX = 0x80000000 // Tell SetupDiBuildDriverInfoList to do a "published INF" search +) + +// ClassInstallHeader is the first member of any class install parameters structure. It contains the device installation request code that defines the format of the rest of the install parameters structure. +type ClassInstallHeader struct { + size uint32 + InstallFunction DI_FUNCTION +} + +func MakeClassInstallHeader(installFunction DI_FUNCTION) *ClassInstallHeader { + hdr := &ClassInstallHeader{InstallFunction: installFunction} + hdr.size = uint32(unsafe.Sizeof(*hdr)) + return hdr +} + +// DICS_STATE specifies values indicating a change in a device's state +type DICS_STATE uint32 + +const ( + DICS_ENABLE DICS_STATE = 0x00000001 // The device is being enabled. + DICS_DISABLE DICS_STATE = 0x00000002 // The device is being disabled. + DICS_PROPCHANGE DICS_STATE = 0x00000003 // The properties of the device have changed. + DICS_START DICS_STATE = 0x00000004 // The device is being started (if the request is for the currently active hardware profile). + DICS_STOP DICS_STATE = 0x00000005 // The device is being stopped. The driver stack will be unloaded and the CSCONFIGFLAG_DO_NOT_START flag will be set for the device. +) + +// DICS_FLAG specifies the scope of a device property change +type DICS_FLAG uint32 + +const ( + DICS_FLAG_GLOBAL DICS_FLAG = 0x00000001 // make change in all hardware profiles + DICS_FLAG_CONFIGSPECIFIC DICS_FLAG = 0x00000002 // make change in specified profile only + DICS_FLAG_CONFIGGENERAL DICS_FLAG = 0x00000004 // 1 or more hardware profile-specific changes to follow (obsolete) +) + +// PropChangeParams is a structure corresponding to a DIF_PROPERTYCHANGE install function. +type PropChangeParams struct { + ClassInstallHeader ClassInstallHeader + StateChange DICS_STATE + Scope DICS_FLAG + HwProfile uint32 +} + +// DI_REMOVEDEVICE specifies the scope of the device removal +type DI_REMOVEDEVICE uint32 + +const ( + DI_REMOVEDEVICE_GLOBAL DI_REMOVEDEVICE = 0x00000001 // Make this change in all hardware profiles. Remove information about the device from the registry. + DI_REMOVEDEVICE_CONFIGSPECIFIC DI_REMOVEDEVICE = 0x00000002 // Make this change to only the hardware profile specified by HwProfile. this flag only applies to root-enumerated devices. When Windows removes the device from the last hardware profile in which it was configured, Windows performs a global removal. +) + +// RemoveDeviceParams is a structure corresponding to a DIF_REMOVE install function. +type RemoveDeviceParams struct { + ClassInstallHeader ClassInstallHeader + Scope DI_REMOVEDEVICE + HwProfile uint32 +} + +// DrvInfoData is driver information structure (member of a driver info list that may be associated with a particular device instance, or (globally) with a device information set) +type DrvInfoData struct { + size uint32 + DriverType uint32 + _ uintptr + description [LINE_LEN]uint16 + mfgName [LINE_LEN]uint16 + providerName [LINE_LEN]uint16 + DriverDate Filetime + DriverVersion uint64 +} + +func (data *DrvInfoData) Description() string { + return UTF16ToString(data.description[:]) +} + +func (data *DrvInfoData) SetDescription(description string) error { + str, err := UTF16FromString(description) + if err != nil { + return err + } + copy(data.description[:], str) + return nil +} + +func (data *DrvInfoData) MfgName() string { + return UTF16ToString(data.mfgName[:]) +} + +func (data *DrvInfoData) SetMfgName(mfgName string) error { + str, err := UTF16FromString(mfgName) + if err != nil { + return err + } + copy(data.mfgName[:], str) + return nil +} + +func (data *DrvInfoData) ProviderName() string { + return UTF16ToString(data.providerName[:]) +} + +func (data *DrvInfoData) SetProviderName(providerName string) error { + str, err := UTF16FromString(providerName) + if err != nil { + return err + } + copy(data.providerName[:], str) + return nil +} + +// IsNewer method returns true if DrvInfoData date and version is newer than supplied parameters. +func (data *DrvInfoData) IsNewer(driverDate Filetime, driverVersion uint64) bool { + if data.DriverDate.HighDateTime > driverDate.HighDateTime { + return true + } + if data.DriverDate.HighDateTime < driverDate.HighDateTime { + return false + } + + if data.DriverDate.LowDateTime > driverDate.LowDateTime { + return true + } + if data.DriverDate.LowDateTime < driverDate.LowDateTime { + return false + } + + if data.DriverVersion > driverVersion { + return true + } + if data.DriverVersion < driverVersion { + return false + } + + return false +} + +// DrvInfoDetailData is driver information details structure (provides detailed information about a particular driver information structure) +type DrvInfoDetailData struct { + size uint32 // Use unsafeSizeOf method + InfDate Filetime + compatIDsOffset uint32 + compatIDsLength uint32 + _ uintptr + sectionName [LINE_LEN]uint16 + infFileName [MAX_PATH]uint16 + drvDescription [LINE_LEN]uint16 + hardwareID [1]uint16 +} + +func (*DrvInfoDetailData) unsafeSizeOf() uint32 { + if unsafe.Sizeof(uintptr(0)) == 4 { + // Windows declares this with pshpack1.h + return uint32(unsafe.Offsetof(DrvInfoDetailData{}.hardwareID) + unsafe.Sizeof(DrvInfoDetailData{}.hardwareID)) + } + return uint32(unsafe.Sizeof(DrvInfoDetailData{})) +} + +func (data *DrvInfoDetailData) SectionName() string { + return UTF16ToString(data.sectionName[:]) +} + +func (data *DrvInfoDetailData) InfFileName() string { + return UTF16ToString(data.infFileName[:]) +} + +func (data *DrvInfoDetailData) DrvDescription() string { + return UTF16ToString(data.drvDescription[:]) +} + +func (data *DrvInfoDetailData) HardwareID() string { + if data.compatIDsOffset > 1 { + bufW := data.getBuf() + return UTF16ToString(bufW[:wcslen(bufW)]) + } + + return "" +} + +func (data *DrvInfoDetailData) CompatIDs() []string { + a := make([]string, 0) + + if data.compatIDsLength > 0 { + bufW := data.getBuf() + bufW = bufW[data.compatIDsOffset : data.compatIDsOffset+data.compatIDsLength] + for i := 0; i < len(bufW); { + j := i + wcslen(bufW[i:]) + if i < j { + a = append(a, UTF16ToString(bufW[i:j])) + } + i = j + 1 + } + } + + return a +} + +func (data *DrvInfoDetailData) getBuf() []uint16 { + len := (data.size - uint32(unsafe.Offsetof(data.hardwareID))) / 2 + sl := struct { + addr *uint16 + len int + cap int + }{&data.hardwareID[0], int(len), int(len)} + return *(*[]uint16)(unsafe.Pointer(&sl)) +} + +// IsCompatible method tests if given hardware ID matches the driver or is listed on the compatible ID list. +func (data *DrvInfoDetailData) IsCompatible(hwid string) bool { + hwidLC := strings.ToLower(hwid) + if strings.ToLower(data.HardwareID()) == hwidLC { + return true + } + a := data.CompatIDs() + for i := range a { + if strings.ToLower(a[i]) == hwidLC { + return true + } + } + + return false +} + +// DICD flags control SetupDiCreateDeviceInfo +type DICD uint32 + +const ( + DICD_GENERATE_ID DICD = 0x00000001 + DICD_INHERIT_CLASSDRVS DICD = 0x00000002 +) + +// SUOI flags control SetupUninstallOEMInf +type SUOI uint32 + +const ( + SUOI_FORCEDELETE SUOI = 0x0001 +) + +// SPDIT flags to distinguish between class drivers and +// device drivers. (Passed in 'DriverType' parameter of +// driver information list APIs) +type SPDIT uint32 + +const ( + SPDIT_NODRIVER SPDIT = 0x00000000 + SPDIT_CLASSDRIVER SPDIT = 0x00000001 + SPDIT_COMPATDRIVER SPDIT = 0x00000002 +) + +// DIGCF flags control what is included in the device information set built by SetupDiGetClassDevs +type DIGCF uint32 + +const ( + DIGCF_DEFAULT DIGCF = 0x00000001 // only valid with DIGCF_DEVICEINTERFACE + DIGCF_PRESENT DIGCF = 0x00000002 + DIGCF_ALLCLASSES DIGCF = 0x00000004 + DIGCF_PROFILE DIGCF = 0x00000008 + DIGCF_DEVICEINTERFACE DIGCF = 0x00000010 +) + +// DIREG specifies values for SetupDiCreateDevRegKey, SetupDiOpenDevRegKey, and SetupDiDeleteDevRegKey. +type DIREG uint32 + +const ( + DIREG_DEV DIREG = 0x00000001 // Open/Create/Delete device key + DIREG_DRV DIREG = 0x00000002 // Open/Create/Delete driver key + DIREG_BOTH DIREG = 0x00000004 // Delete both driver and Device key +) + +// SPDRP specifies device registry property codes +// (Codes marked as read-only (R) may only be used for +// SetupDiGetDeviceRegistryProperty) +// +// These values should cover the same set of registry properties +// as defined by the CM_DRP codes in cfgmgr32.h. +// +// Note that SPDRP codes are zero based while CM_DRP codes are one based! +type SPDRP uint32 + +const ( + SPDRP_DEVICEDESC SPDRP = 0x00000000 // DeviceDesc (R/W) + SPDRP_HARDWAREID SPDRP = 0x00000001 // HardwareID (R/W) + SPDRP_COMPATIBLEIDS SPDRP = 0x00000002 // CompatibleIDs (R/W) + SPDRP_SERVICE SPDRP = 0x00000004 // Service (R/W) + SPDRP_CLASS SPDRP = 0x00000007 // Class (R--tied to ClassGUID) + SPDRP_CLASSGUID SPDRP = 0x00000008 // ClassGUID (R/W) + SPDRP_DRIVER SPDRP = 0x00000009 // Driver (R/W) + SPDRP_CONFIGFLAGS SPDRP = 0x0000000A // ConfigFlags (R/W) + SPDRP_MFG SPDRP = 0x0000000B // Mfg (R/W) + SPDRP_FRIENDLYNAME SPDRP = 0x0000000C // FriendlyName (R/W) + SPDRP_LOCATION_INFORMATION SPDRP = 0x0000000D // LocationInformation (R/W) + SPDRP_PHYSICAL_DEVICE_OBJECT_NAME SPDRP = 0x0000000E // PhysicalDeviceObjectName (R) + SPDRP_CAPABILITIES SPDRP = 0x0000000F // Capabilities (R) + SPDRP_UI_NUMBER SPDRP = 0x00000010 // UiNumber (R) + SPDRP_UPPERFILTERS SPDRP = 0x00000011 // UpperFilters (R/W) + SPDRP_LOWERFILTERS SPDRP = 0x00000012 // LowerFilters (R/W) + SPDRP_BUSTYPEGUID SPDRP = 0x00000013 // BusTypeGUID (R) + SPDRP_LEGACYBUSTYPE SPDRP = 0x00000014 // LegacyBusType (R) + SPDRP_BUSNUMBER SPDRP = 0x00000015 // BusNumber (R) + SPDRP_ENUMERATOR_NAME SPDRP = 0x00000016 // Enumerator Name (R) + SPDRP_SECURITY SPDRP = 0x00000017 // Security (R/W, binary form) + SPDRP_SECURITY_SDS SPDRP = 0x00000018 // Security (W, SDS form) + SPDRP_DEVTYPE SPDRP = 0x00000019 // Device Type (R/W) + SPDRP_EXCLUSIVE SPDRP = 0x0000001A // Device is exclusive-access (R/W) + SPDRP_CHARACTERISTICS SPDRP = 0x0000001B // Device Characteristics (R/W) + SPDRP_ADDRESS SPDRP = 0x0000001C // Device Address (R) + SPDRP_UI_NUMBER_DESC_FORMAT SPDRP = 0x0000001D // UiNumberDescFormat (R/W) + SPDRP_DEVICE_POWER_DATA SPDRP = 0x0000001E // Device Power Data (R) + SPDRP_REMOVAL_POLICY SPDRP = 0x0000001F // Removal Policy (R) + SPDRP_REMOVAL_POLICY_HW_DEFAULT SPDRP = 0x00000020 // Hardware Removal Policy (R) + SPDRP_REMOVAL_POLICY_OVERRIDE SPDRP = 0x00000021 // Removal Policy Override (RW) + SPDRP_INSTALL_STATE SPDRP = 0x00000022 // Device Install State (R) + SPDRP_LOCATION_PATHS SPDRP = 0x00000023 // Device Location Paths (R) + SPDRP_BASE_CONTAINERID SPDRP = 0x00000024 // Base ContainerID (R) + + SPDRP_MAXIMUM_PROPERTY SPDRP = 0x00000025 // Upper bound on ordinals +) + +// DEVPROPTYPE represents the property-data-type identifier that specifies the +// data type of a device property value in the unified device property model. +type DEVPROPTYPE uint32 + +const ( + DEVPROP_TYPEMOD_ARRAY DEVPROPTYPE = 0x00001000 + DEVPROP_TYPEMOD_LIST DEVPROPTYPE = 0x00002000 + + DEVPROP_TYPE_EMPTY DEVPROPTYPE = 0x00000000 + DEVPROP_TYPE_NULL DEVPROPTYPE = 0x00000001 + DEVPROP_TYPE_SBYTE DEVPROPTYPE = 0x00000002 + DEVPROP_TYPE_BYTE DEVPROPTYPE = 0x00000003 + DEVPROP_TYPE_INT16 DEVPROPTYPE = 0x00000004 + DEVPROP_TYPE_UINT16 DEVPROPTYPE = 0x00000005 + DEVPROP_TYPE_INT32 DEVPROPTYPE = 0x00000006 + DEVPROP_TYPE_UINT32 DEVPROPTYPE = 0x00000007 + DEVPROP_TYPE_INT64 DEVPROPTYPE = 0x00000008 + DEVPROP_TYPE_UINT64 DEVPROPTYPE = 0x00000009 + DEVPROP_TYPE_FLOAT DEVPROPTYPE = 0x0000000A + DEVPROP_TYPE_DOUBLE DEVPROPTYPE = 0x0000000B + DEVPROP_TYPE_DECIMAL DEVPROPTYPE = 0x0000000C + DEVPROP_TYPE_GUID DEVPROPTYPE = 0x0000000D + DEVPROP_TYPE_CURRENCY DEVPROPTYPE = 0x0000000E + DEVPROP_TYPE_DATE DEVPROPTYPE = 0x0000000F + DEVPROP_TYPE_FILETIME DEVPROPTYPE = 0x00000010 + DEVPROP_TYPE_BOOLEAN DEVPROPTYPE = 0x00000011 + DEVPROP_TYPE_STRING DEVPROPTYPE = 0x00000012 + DEVPROP_TYPE_STRING_LIST DEVPROPTYPE = DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST + DEVPROP_TYPE_SECURITY_DESCRIPTOR DEVPROPTYPE = 0x00000013 + DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING DEVPROPTYPE = 0x00000014 + DEVPROP_TYPE_DEVPROPKEY DEVPROPTYPE = 0x00000015 + DEVPROP_TYPE_DEVPROPTYPE DEVPROPTYPE = 0x00000016 + DEVPROP_TYPE_BINARY DEVPROPTYPE = DEVPROP_TYPE_BYTE | DEVPROP_TYPEMOD_ARRAY + DEVPROP_TYPE_ERROR DEVPROPTYPE = 0x00000017 + DEVPROP_TYPE_NTSTATUS DEVPROPTYPE = 0x00000018 + DEVPROP_TYPE_STRING_INDIRECT DEVPROPTYPE = 0x00000019 + + MAX_DEVPROP_TYPE DEVPROPTYPE = 0x00000019 + MAX_DEVPROP_TYPEMOD DEVPROPTYPE = 0x00002000 + + DEVPROP_MASK_TYPE DEVPROPTYPE = 0x00000FFF + DEVPROP_MASK_TYPEMOD DEVPROPTYPE = 0x0000F000 +) + +// DEVPROPGUID specifies a property category. +type DEVPROPGUID GUID + +// DEVPROPID uniquely identifies the property within the property category. +type DEVPROPID uint32 + +const DEVPROPID_FIRST_USABLE DEVPROPID = 2 + +// DEVPROPKEY represents a device property key for a device property in the +// unified device property model. +type DEVPROPKEY struct { + FmtID DEVPROPGUID + PID DEVPROPID +} + +// CONFIGRET is a return value or error code from cfgmgr32 APIs +type CONFIGRET uint32 + +func (ret CONFIGRET) Error() string { + if win32Error, ok := ret.Unwrap().(Errno); ok { + return fmt.Sprintf("%s (CfgMgr error: 0x%08x)", win32Error.Error(), uint32(ret)) + } + return fmt.Sprintf("CfgMgr error: 0x%08x", uint32(ret)) +} + +func (ret CONFIGRET) Win32Error(defaultError Errno) Errno { + return cm_MapCrToWin32Err(ret, defaultError) +} + +func (ret CONFIGRET) Unwrap() error { + const noMatch = Errno(^uintptr(0)) + win32Error := ret.Win32Error(noMatch) + if win32Error == noMatch { + return nil + } + return win32Error +} + +const ( + CR_SUCCESS CONFIGRET = 0x00000000 + CR_DEFAULT CONFIGRET = 0x00000001 + CR_OUT_OF_MEMORY CONFIGRET = 0x00000002 + CR_INVALID_POINTER CONFIGRET = 0x00000003 + CR_INVALID_FLAG CONFIGRET = 0x00000004 + CR_INVALID_DEVNODE CONFIGRET = 0x00000005 + CR_INVALID_DEVINST = CR_INVALID_DEVNODE + CR_INVALID_RES_DES CONFIGRET = 0x00000006 + CR_INVALID_LOG_CONF CONFIGRET = 0x00000007 + CR_INVALID_ARBITRATOR CONFIGRET = 0x00000008 + CR_INVALID_NODELIST CONFIGRET = 0x00000009 + CR_DEVNODE_HAS_REQS CONFIGRET = 0x0000000A + CR_DEVINST_HAS_REQS = CR_DEVNODE_HAS_REQS + CR_INVALID_RESOURCEID CONFIGRET = 0x0000000B + CR_DLVXD_NOT_FOUND CONFIGRET = 0x0000000C + CR_NO_SUCH_DEVNODE CONFIGRET = 0x0000000D + CR_NO_SUCH_DEVINST = CR_NO_SUCH_DEVNODE + CR_NO_MORE_LOG_CONF CONFIGRET = 0x0000000E + CR_NO_MORE_RES_DES CONFIGRET = 0x0000000F + CR_ALREADY_SUCH_DEVNODE CONFIGRET = 0x00000010 + CR_ALREADY_SUCH_DEVINST = CR_ALREADY_SUCH_DEVNODE + CR_INVALID_RANGE_LIST CONFIGRET = 0x00000011 + CR_INVALID_RANGE CONFIGRET = 0x00000012 + CR_FAILURE CONFIGRET = 0x00000013 + CR_NO_SUCH_LOGICAL_DEV CONFIGRET = 0x00000014 + CR_CREATE_BLOCKED CONFIGRET = 0x00000015 + CR_NOT_SYSTEM_VM CONFIGRET = 0x00000016 + CR_REMOVE_VETOED CONFIGRET = 0x00000017 + CR_APM_VETOED CONFIGRET = 0x00000018 + CR_INVALID_LOAD_TYPE CONFIGRET = 0x00000019 + CR_BUFFER_SMALL CONFIGRET = 0x0000001A + CR_NO_ARBITRATOR CONFIGRET = 0x0000001B + CR_NO_REGISTRY_HANDLE CONFIGRET = 0x0000001C + CR_REGISTRY_ERROR CONFIGRET = 0x0000001D + CR_INVALID_DEVICE_ID CONFIGRET = 0x0000001E + CR_INVALID_DATA CONFIGRET = 0x0000001F + CR_INVALID_API CONFIGRET = 0x00000020 + CR_DEVLOADER_NOT_READY CONFIGRET = 0x00000021 + CR_NEED_RESTART CONFIGRET = 0x00000022 + CR_NO_MORE_HW_PROFILES CONFIGRET = 0x00000023 + CR_DEVICE_NOT_THERE CONFIGRET = 0x00000024 + CR_NO_SUCH_VALUE CONFIGRET = 0x00000025 + CR_WRONG_TYPE CONFIGRET = 0x00000026 + CR_INVALID_PRIORITY CONFIGRET = 0x00000027 + CR_NOT_DISABLEABLE CONFIGRET = 0x00000028 + CR_FREE_RESOURCES CONFIGRET = 0x00000029 + CR_QUERY_VETOED CONFIGRET = 0x0000002A + CR_CANT_SHARE_IRQ CONFIGRET = 0x0000002B + CR_NO_DEPENDENT CONFIGRET = 0x0000002C + CR_SAME_RESOURCES CONFIGRET = 0x0000002D + CR_NO_SUCH_REGISTRY_KEY CONFIGRET = 0x0000002E + CR_INVALID_MACHINENAME CONFIGRET = 0x0000002F + CR_REMOTE_COMM_FAILURE CONFIGRET = 0x00000030 + CR_MACHINE_UNAVAILABLE CONFIGRET = 0x00000031 + CR_NO_CM_SERVICES CONFIGRET = 0x00000032 + CR_ACCESS_DENIED CONFIGRET = 0x00000033 + CR_CALL_NOT_IMPLEMENTED CONFIGRET = 0x00000034 + CR_INVALID_PROPERTY CONFIGRET = 0x00000035 + CR_DEVICE_INTERFACE_ACTIVE CONFIGRET = 0x00000036 + CR_NO_SUCH_DEVICE_INTERFACE CONFIGRET = 0x00000037 + CR_INVALID_REFERENCE_STRING CONFIGRET = 0x00000038 + CR_INVALID_CONFLICT_LIST CONFIGRET = 0x00000039 + CR_INVALID_INDEX CONFIGRET = 0x0000003A + CR_INVALID_STRUCTURE_SIZE CONFIGRET = 0x0000003B + NUM_CR_RESULTS CONFIGRET = 0x0000003C +) + +const ( + CM_GET_DEVICE_INTERFACE_LIST_PRESENT = 0 // only currently 'live' device interfaces + CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES = 1 // all registered device interfaces, live or not +) + +const ( + DN_ROOT_ENUMERATED = 0x00000001 // Was enumerated by ROOT + DN_DRIVER_LOADED = 0x00000002 // Has Register_Device_Driver + DN_ENUM_LOADED = 0x00000004 // Has Register_Enumerator + DN_STARTED = 0x00000008 // Is currently configured + DN_MANUAL = 0x00000010 // Manually installed + DN_NEED_TO_ENUM = 0x00000020 // May need reenumeration + DN_NOT_FIRST_TIME = 0x00000040 // Has received a config + DN_HARDWARE_ENUM = 0x00000080 // Enum generates hardware ID + DN_LIAR = 0x00000100 // Lied about can reconfig once + DN_HAS_MARK = 0x00000200 // Not CM_Create_DevInst lately + DN_HAS_PROBLEM = 0x00000400 // Need device installer + DN_FILTERED = 0x00000800 // Is filtered + DN_MOVED = 0x00001000 // Has been moved + DN_DISABLEABLE = 0x00002000 // Can be disabled + DN_REMOVABLE = 0x00004000 // Can be removed + DN_PRIVATE_PROBLEM = 0x00008000 // Has a private problem + DN_MF_PARENT = 0x00010000 // Multi function parent + DN_MF_CHILD = 0x00020000 // Multi function child + DN_WILL_BE_REMOVED = 0x00040000 // DevInst is being removed + DN_NOT_FIRST_TIMEE = 0x00080000 // Has received a config enumerate + DN_STOP_FREE_RES = 0x00100000 // When child is stopped, free resources + DN_REBAL_CANDIDATE = 0x00200000 // Don't skip during rebalance + DN_BAD_PARTIAL = 0x00400000 // This devnode's log_confs do not have same resources + DN_NT_ENUMERATOR = 0x00800000 // This devnode's is an NT enumerator + DN_NT_DRIVER = 0x01000000 // This devnode's is an NT driver + DN_NEEDS_LOCKING = 0x02000000 // Devnode need lock resume processing + DN_ARM_WAKEUP = 0x04000000 // Devnode can be the wakeup device + DN_APM_ENUMERATOR = 0x08000000 // APM aware enumerator + DN_APM_DRIVER = 0x10000000 // APM aware driver + DN_SILENT_INSTALL = 0x20000000 // Silent install + DN_NO_SHOW_IN_DM = 0x40000000 // No show in device manager + DN_BOOT_LOG_PROB = 0x80000000 // Had a problem during preassignment of boot log conf + DN_NEED_RESTART = DN_LIAR // System needs to be restarted for this Devnode to work properly + DN_DRIVER_BLOCKED = DN_NOT_FIRST_TIME // One or more drivers are blocked from loading for this Devnode + DN_LEGACY_DRIVER = DN_MOVED // This device is using a legacy driver + DN_CHILD_WITH_INVALID_ID = DN_HAS_MARK // One or more children have invalid IDs + DN_DEVICE_DISCONNECTED = DN_NEEDS_LOCKING // The function driver for a device reported that the device is not connected. Typically this means a wireless device is out of range. + DN_QUERY_REMOVE_PENDING = DN_MF_PARENT // Device is part of a set of related devices collectively pending query-removal + DN_QUERY_REMOVE_ACTIVE = DN_MF_CHILD // Device is actively engaged in a query-remove IRP + DN_CHANGEABLE_FLAGS = DN_NOT_FIRST_TIME | DN_HARDWARE_ENUM | DN_HAS_MARK | DN_DISABLEABLE | DN_REMOVABLE | DN_MF_CHILD | DN_MF_PARENT | DN_NOT_FIRST_TIMEE | DN_STOP_FREE_RES | DN_REBAL_CANDIDATE | DN_NT_ENUMERATOR | DN_NT_DRIVER | DN_SILENT_INSTALL | DN_NO_SHOW_IN_DM +) + +//sys setupDiCreateDeviceInfoListEx(classGUID *GUID, hwndParent uintptr, machineName *uint16, reserved uintptr) (handle DevInfo, err error) [failretval==DevInfo(InvalidHandle)] = setupapi.SetupDiCreateDeviceInfoListExW + +// SetupDiCreateDeviceInfoListEx function creates an empty device information set on a remote or a local computer and optionally associates the set with a device setup class. +func SetupDiCreateDeviceInfoListEx(classGUID *GUID, hwndParent uintptr, machineName string) (deviceInfoSet DevInfo, err error) { + var machineNameUTF16 *uint16 + if machineName != "" { + machineNameUTF16, err = UTF16PtrFromString(machineName) + if err != nil { + return + } + } + return setupDiCreateDeviceInfoListEx(classGUID, hwndParent, machineNameUTF16, 0) +} + +//sys setupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo, deviceInfoSetDetailData *DevInfoListDetailData) (err error) = setupapi.SetupDiGetDeviceInfoListDetailW + +// SetupDiGetDeviceInfoListDetail function retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name. +func SetupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo) (deviceInfoSetDetailData *DevInfoListDetailData, err error) { + data := &DevInfoListDetailData{} + data.size = data.unsafeSizeOf() + + return data, setupDiGetDeviceInfoListDetail(deviceInfoSet, data) +} + +// DeviceInfoListDetail method retrieves information associated with a device information set including the class GUID, remote computer handle, and remote computer name. +func (deviceInfoSet DevInfo) DeviceInfoListDetail() (*DevInfoListDetailData, error) { + return SetupDiGetDeviceInfoListDetail(deviceInfoSet) +} + +//sys setupDiCreateDeviceInfo(deviceInfoSet DevInfo, DeviceName *uint16, classGUID *GUID, DeviceDescription *uint16, hwndParent uintptr, CreationFlags DICD, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiCreateDeviceInfoW + +// SetupDiCreateDeviceInfo function creates a new device information element and adds it as a new member to the specified device information set. +func SetupDiCreateDeviceInfo(deviceInfoSet DevInfo, deviceName string, classGUID *GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (deviceInfoData *DevInfoData, err error) { + deviceNameUTF16, err := UTF16PtrFromString(deviceName) + if err != nil { + return + } + + var deviceDescriptionUTF16 *uint16 + if deviceDescription != "" { + deviceDescriptionUTF16, err = UTF16PtrFromString(deviceDescription) + if err != nil { + return + } + } + + data := &DevInfoData{} + data.size = uint32(unsafe.Sizeof(*data)) + + return data, setupDiCreateDeviceInfo(deviceInfoSet, deviceNameUTF16, classGUID, deviceDescriptionUTF16, hwndParent, creationFlags, data) +} + +// CreateDeviceInfo method creates a new device information element and adds it as a new member to the specified device information set. +func (deviceInfoSet DevInfo) CreateDeviceInfo(deviceName string, classGUID *GUID, deviceDescription string, hwndParent uintptr, creationFlags DICD) (*DevInfoData, error) { + return SetupDiCreateDeviceInfo(deviceInfoSet, deviceName, classGUID, deviceDescription, hwndParent, creationFlags) +} + +//sys setupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex uint32, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiEnumDeviceInfo + +// SetupDiEnumDeviceInfo function returns a DevInfoData structure that specifies a device information element in a device information set. +func SetupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex int) (*DevInfoData, error) { + data := &DevInfoData{} + data.size = uint32(unsafe.Sizeof(*data)) + + return data, setupDiEnumDeviceInfo(deviceInfoSet, uint32(memberIndex), data) +} + +// EnumDeviceInfo method returns a DevInfoData structure that specifies a device information element in a device information set. +func (deviceInfoSet DevInfo) EnumDeviceInfo(memberIndex int) (*DevInfoData, error) { + return SetupDiEnumDeviceInfo(deviceInfoSet, memberIndex) +} + +// SetupDiDestroyDeviceInfoList function deletes a device information set and frees all associated memory. +//sys SetupDiDestroyDeviceInfoList(deviceInfoSet DevInfo) (err error) = setupapi.SetupDiDestroyDeviceInfoList + +// Close method deletes a device information set and frees all associated memory. +func (deviceInfoSet DevInfo) Close() error { + return SetupDiDestroyDeviceInfoList(deviceInfoSet) +} + +//sys SetupDiBuildDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) = setupapi.SetupDiBuildDriverInfoList + +// BuildDriverInfoList method builds a list of drivers that is associated with a specific device or with the global class driver list for a device information set. +func (deviceInfoSet DevInfo) BuildDriverInfoList(deviceInfoData *DevInfoData, driverType SPDIT) error { + return SetupDiBuildDriverInfoList(deviceInfoSet, deviceInfoData, driverType) +} + +//sys SetupDiCancelDriverInfoSearch(deviceInfoSet DevInfo) (err error) = setupapi.SetupDiCancelDriverInfoSearch + +// CancelDriverInfoSearch method cancels a driver list search that is currently in progress in a different thread. +func (deviceInfoSet DevInfo) CancelDriverInfoSearch() error { + return SetupDiCancelDriverInfoSearch(deviceInfoSet) +} + +//sys setupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex uint32, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiEnumDriverInfoW + +// SetupDiEnumDriverInfo function enumerates the members of a driver list. +func SetupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex int) (*DrvInfoData, error) { + data := &DrvInfoData{} + data.size = uint32(unsafe.Sizeof(*data)) + + return data, setupDiEnumDriverInfo(deviceInfoSet, deviceInfoData, driverType, uint32(memberIndex), data) +} + +// EnumDriverInfo method enumerates the members of a driver list. +func (deviceInfoSet DevInfo) EnumDriverInfo(deviceInfoData *DevInfoData, driverType SPDIT, memberIndex int) (*DrvInfoData, error) { + return SetupDiEnumDriverInfo(deviceInfoSet, deviceInfoData, driverType, memberIndex) +} + +//sys setupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiGetSelectedDriverW + +// SetupDiGetSelectedDriver function retrieves the selected driver for a device information set or a particular device information element. +func SetupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (*DrvInfoData, error) { + data := &DrvInfoData{} + data.size = uint32(unsafe.Sizeof(*data)) + + return data, setupDiGetSelectedDriver(deviceInfoSet, deviceInfoData, data) +} + +// SelectedDriver method retrieves the selected driver for a device information set or a particular device information element. +func (deviceInfoSet DevInfo) SelectedDriver(deviceInfoData *DevInfoData) (*DrvInfoData, error) { + return SetupDiGetSelectedDriver(deviceInfoSet, deviceInfoData) +} + +//sys SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) = setupapi.SetupDiSetSelectedDriverW + +// SetSelectedDriver method sets, or resets, the selected driver for a device information element or the selected class driver for a device information set. +func (deviceInfoSet DevInfo) SetSelectedDriver(deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) error { + return SetupDiSetSelectedDriver(deviceInfoSet, deviceInfoData, driverInfoData) +} + +//sys setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *DrvInfoDetailData, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDriverInfoDetailW + +// SetupDiGetDriverInfoDetail function retrieves driver information detail for a device information set or a particular device information element in the device information set. +func SetupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) { + reqSize := uint32(2048) + for { + buf := make([]byte, reqSize) + data := (*DrvInfoDetailData)(unsafe.Pointer(&buf[0])) + data.size = data.unsafeSizeOf() + err := setupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData, data, uint32(len(buf)), &reqSize) + if err == ERROR_INSUFFICIENT_BUFFER { + continue + } + if err != nil { + return nil, err + } + data.size = reqSize + return data, nil + } +} + +// DriverInfoDetail method retrieves driver information detail for a device information set or a particular device information element in the device information set. +func (deviceInfoSet DevInfo) DriverInfoDetail(deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (*DrvInfoDetailData, error) { + return SetupDiGetDriverInfoDetail(deviceInfoSet, deviceInfoData, driverInfoData) +} + +//sys SetupDiDestroyDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) = setupapi.SetupDiDestroyDriverInfoList + +// DestroyDriverInfoList method deletes a driver list. +func (deviceInfoSet DevInfo) DestroyDriverInfoList(deviceInfoData *DevInfoData, driverType SPDIT) error { + return SetupDiDestroyDriverInfoList(deviceInfoSet, deviceInfoData, driverType) +} + +//sys setupDiGetClassDevsEx(classGUID *GUID, Enumerator *uint16, hwndParent uintptr, Flags DIGCF, deviceInfoSet DevInfo, machineName *uint16, reserved uintptr) (handle DevInfo, err error) [failretval==DevInfo(InvalidHandle)] = setupapi.SetupDiGetClassDevsExW + +// SetupDiGetClassDevsEx function returns a handle to a device information set that contains requested device information elements for a local or a remote computer. +func SetupDiGetClassDevsEx(classGUID *GUID, enumerator string, hwndParent uintptr, flags DIGCF, deviceInfoSet DevInfo, machineName string) (handle DevInfo, err error) { + var enumeratorUTF16 *uint16 + if enumerator != "" { + enumeratorUTF16, err = UTF16PtrFromString(enumerator) + if err != nil { + return + } + } + var machineNameUTF16 *uint16 + if machineName != "" { + machineNameUTF16, err = UTF16PtrFromString(machineName) + if err != nil { + return + } + } + return setupDiGetClassDevsEx(classGUID, enumeratorUTF16, hwndParent, flags, deviceInfoSet, machineNameUTF16, 0) +} + +// SetupDiCallClassInstaller function calls the appropriate class installer, and any registered co-installers, with the specified installation request (DIF code). +//sys SetupDiCallClassInstaller(installFunction DI_FUNCTION, deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiCallClassInstaller + +// CallClassInstaller member calls the appropriate class installer, and any registered co-installers, with the specified installation request (DIF code). +func (deviceInfoSet DevInfo) CallClassInstaller(installFunction DI_FUNCTION, deviceInfoData *DevInfoData) error { + return SetupDiCallClassInstaller(installFunction, deviceInfoSet, deviceInfoData) +} + +// SetupDiOpenDevRegKey function opens a registry key for device-specific configuration information. +//sys SetupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (key Handle, err error) [failretval==InvalidHandle] = setupapi.SetupDiOpenDevRegKey + +// OpenDevRegKey method opens a registry key for device-specific configuration information. +func (deviceInfoSet DevInfo) OpenDevRegKey(DeviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (Handle, error) { + return SetupDiOpenDevRegKey(deviceInfoSet, DeviceInfoData, Scope, HwProfile, KeyType, samDesired) +} + +//sys setupDiGetDeviceProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, propertyKey *DEVPROPKEY, propertyType *DEVPROPTYPE, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32, flags uint32) (err error) = setupapi.SetupDiGetDevicePropertyW + +// SetupDiGetDeviceProperty function retrieves a specified device instance property. +func SetupDiGetDeviceProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, propertyKey *DEVPROPKEY) (value interface{}, err error) { + reqSize := uint32(256) + for { + var dataType DEVPROPTYPE + buf := make([]byte, reqSize) + err = setupDiGetDeviceProperty(deviceInfoSet, deviceInfoData, propertyKey, &dataType, &buf[0], uint32(len(buf)), &reqSize, 0) + if err == ERROR_INSUFFICIENT_BUFFER { + continue + } + if err != nil { + return + } + switch dataType { + case DEVPROP_TYPE_STRING: + ret := UTF16ToString(bufToUTF16(buf)) + runtime.KeepAlive(buf) + return ret, nil + } + return nil, errors.New("unimplemented property type") + } +} + +//sys setupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyRegDataType *uint32, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceRegistryPropertyW + +// SetupDiGetDeviceRegistryProperty function retrieves a specified Plug and Play device property. +func SetupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP) (value interface{}, err error) { + reqSize := uint32(256) + for { + var dataType uint32 + buf := make([]byte, reqSize) + err = setupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &dataType, &buf[0], uint32(len(buf)), &reqSize) + if err == ERROR_INSUFFICIENT_BUFFER { + continue + } + if err != nil { + return + } + return getRegistryValue(buf[:reqSize], dataType) + } +} + +func getRegistryValue(buf []byte, dataType uint32) (interface{}, error) { + switch dataType { + case REG_SZ: + ret := UTF16ToString(bufToUTF16(buf)) + runtime.KeepAlive(buf) + return ret, nil + case REG_EXPAND_SZ: + value := UTF16ToString(bufToUTF16(buf)) + if value == "" { + return "", nil + } + p, err := syscall.UTF16PtrFromString(value) + if err != nil { + return "", err + } + ret := make([]uint16, 100) + for { + n, err := ExpandEnvironmentStrings(p, &ret[0], uint32(len(ret))) + if err != nil { + return "", err + } + if n <= uint32(len(ret)) { + return UTF16ToString(ret[:n]), nil + } + ret = make([]uint16, n) + } + case REG_BINARY: + return buf, nil + case REG_DWORD_LITTLE_ENDIAN: + return binary.LittleEndian.Uint32(buf), nil + case REG_DWORD_BIG_ENDIAN: + return binary.BigEndian.Uint32(buf), nil + case REG_MULTI_SZ: + bufW := bufToUTF16(buf) + a := []string{} + for i := 0; i < len(bufW); { + j := i + wcslen(bufW[i:]) + if i < j { + a = append(a, UTF16ToString(bufW[i:j])) + } + i = j + 1 + } + runtime.KeepAlive(buf) + return a, nil + case REG_QWORD_LITTLE_ENDIAN: + return binary.LittleEndian.Uint64(buf), nil + default: + return nil, fmt.Errorf("Unsupported registry value type: %v", dataType) + } +} + +// bufToUTF16 function reinterprets []byte buffer as []uint16 +func bufToUTF16(buf []byte) []uint16 { + sl := struct { + addr *uint16 + len int + cap int + }{(*uint16)(unsafe.Pointer(&buf[0])), len(buf) / 2, cap(buf) / 2} + return *(*[]uint16)(unsafe.Pointer(&sl)) +} + +// utf16ToBuf function reinterprets []uint16 as []byte +func utf16ToBuf(buf []uint16) []byte { + sl := struct { + addr *byte + len int + cap int + }{(*byte)(unsafe.Pointer(&buf[0])), len(buf) * 2, cap(buf) * 2} + return *(*[]byte)(unsafe.Pointer(&sl)) +} + +func wcslen(str []uint16) int { + for i := 0; i < len(str); i++ { + if str[i] == 0 { + return i + } + } + return len(str) +} + +// DeviceRegistryProperty method retrieves a specified Plug and Play device property. +func (deviceInfoSet DevInfo) DeviceRegistryProperty(deviceInfoData *DevInfoData, property SPDRP) (interface{}, error) { + return SetupDiGetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property) +} + +//sys setupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffer *byte, propertyBufferSize uint32) (err error) = setupapi.SetupDiSetDeviceRegistryPropertyW + +// SetupDiSetDeviceRegistryProperty function sets a Plug and Play device property for a device. +func SetupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffers []byte) error { + return setupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, &propertyBuffers[0], uint32(len(propertyBuffers))) +} + +// SetDeviceRegistryProperty function sets a Plug and Play device property for a device. +func (deviceInfoSet DevInfo) SetDeviceRegistryProperty(deviceInfoData *DevInfoData, property SPDRP, propertyBuffers []byte) error { + return SetupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, propertyBuffers) +} + +// SetDeviceRegistryPropertyString method sets a Plug and Play device property string for a device. +func (deviceInfoSet DevInfo) SetDeviceRegistryPropertyString(deviceInfoData *DevInfoData, property SPDRP, str string) error { + str16, err := UTF16FromString(str) + if err != nil { + return err + } + err = SetupDiSetDeviceRegistryProperty(deviceInfoSet, deviceInfoData, property, utf16ToBuf(append(str16, 0))) + runtime.KeepAlive(str16) + return err +} + +//sys setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) = setupapi.SetupDiGetDeviceInstallParamsW + +// SetupDiGetDeviceInstallParams function retrieves device installation parameters for a device information set or a particular device information element. +func SetupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (*DevInstallParams, error) { + params := &DevInstallParams{} + params.size = uint32(unsafe.Sizeof(*params)) + + return params, setupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData, params) +} + +// DeviceInstallParams method retrieves device installation parameters for a device information set or a particular device information element. +func (deviceInfoSet DevInfo) DeviceInstallParams(deviceInfoData *DevInfoData) (*DevInstallParams, error) { + return SetupDiGetDeviceInstallParams(deviceInfoSet, deviceInfoData) +} + +//sys setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) = setupapi.SetupDiGetDeviceInstanceIdW + +// SetupDiGetDeviceInstanceId function retrieves the instance ID of the device. +func SetupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (string, error) { + reqSize := uint32(1024) + for { + buf := make([]uint16, reqSize) + err := setupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData, &buf[0], uint32(len(buf)), &reqSize) + if err == ERROR_INSUFFICIENT_BUFFER { + continue + } + if err != nil { + return "", err + } + return UTF16ToString(buf), nil + } +} + +// DeviceInstanceID method retrieves the instance ID of the device. +func (deviceInfoSet DevInfo) DeviceInstanceID(deviceInfoData *DevInfoData) (string, error) { + return SetupDiGetDeviceInstanceId(deviceInfoSet, deviceInfoData) +} + +// SetupDiGetClassInstallParams function retrieves class installation parameters for a device information set or a particular device information element. +//sys SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) = setupapi.SetupDiGetClassInstallParamsW + +// ClassInstallParams method retrieves class installation parameters for a device information set or a particular device information element. +func (deviceInfoSet DevInfo) ClassInstallParams(deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) error { + return SetupDiGetClassInstallParams(deviceInfoSet, deviceInfoData, classInstallParams, classInstallParamsSize, requiredSize) +} + +//sys SetupDiSetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) = setupapi.SetupDiSetDeviceInstallParamsW + +// SetDeviceInstallParams member sets device installation parameters for a device information set or a particular device information element. +func (deviceInfoSet DevInfo) SetDeviceInstallParams(deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) error { + return SetupDiSetDeviceInstallParams(deviceInfoSet, deviceInfoData, deviceInstallParams) +} + +// SetupDiSetClassInstallParams function sets or clears class install parameters for a device information set or a particular device information element. +//sys SetupDiSetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) (err error) = setupapi.SetupDiSetClassInstallParamsW + +// SetClassInstallParams method sets or clears class install parameters for a device information set or a particular device information element. +func (deviceInfoSet DevInfo) SetClassInstallParams(deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) error { + return SetupDiSetClassInstallParams(deviceInfoSet, deviceInfoData, classInstallParams, classInstallParamsSize) +} + +//sys setupDiClassNameFromGuidEx(classGUID *GUID, className *uint16, classNameSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) = setupapi.SetupDiClassNameFromGuidExW + +// SetupDiClassNameFromGuidEx function retrieves the class name associated with a class GUID. The class can be installed on a local or remote computer. +func SetupDiClassNameFromGuidEx(classGUID *GUID, machineName string) (className string, err error) { + var classNameUTF16 [MAX_CLASS_NAME_LEN]uint16 + + var machineNameUTF16 *uint16 + if machineName != "" { + machineNameUTF16, err = UTF16PtrFromString(machineName) + if err != nil { + return + } + } + + err = setupDiClassNameFromGuidEx(classGUID, &classNameUTF16[0], MAX_CLASS_NAME_LEN, nil, machineNameUTF16, 0) + if err != nil { + return + } + + className = UTF16ToString(classNameUTF16[:]) + return +} + +//sys setupDiClassGuidsFromNameEx(className *uint16, classGuidList *GUID, classGuidListSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) = setupapi.SetupDiClassGuidsFromNameExW + +// SetupDiClassGuidsFromNameEx function retrieves the GUIDs associated with the specified class name. This resulting list contains the classes currently installed on a local or remote computer. +func SetupDiClassGuidsFromNameEx(className string, machineName string) ([]GUID, error) { + classNameUTF16, err := UTF16PtrFromString(className) + if err != nil { + return nil, err + } + + var machineNameUTF16 *uint16 + if machineName != "" { + machineNameUTF16, err = UTF16PtrFromString(machineName) + if err != nil { + return nil, err + } + } + + reqSize := uint32(4) + for { + buf := make([]GUID, reqSize) + err = setupDiClassGuidsFromNameEx(classNameUTF16, &buf[0], uint32(len(buf)), &reqSize, machineNameUTF16, 0) + if err == ERROR_INSUFFICIENT_BUFFER { + continue + } + if err != nil { + return nil, err + } + return buf[:reqSize], nil + } +} + +//sys setupDiGetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiGetSelectedDevice + +// SetupDiGetSelectedDevice function retrieves the selected device information element in a device information set. +func SetupDiGetSelectedDevice(deviceInfoSet DevInfo) (*DevInfoData, error) { + data := &DevInfoData{} + data.size = uint32(unsafe.Sizeof(*data)) + + return data, setupDiGetSelectedDevice(deviceInfoSet, data) +} + +// SelectedDevice method retrieves the selected device information element in a device information set. +func (deviceInfoSet DevInfo) SelectedDevice() (*DevInfoData, error) { + return SetupDiGetSelectedDevice(deviceInfoSet) +} + +// SetupDiSetSelectedDevice function sets a device information element as the selected member of a device information set. This function is typically used by an installation wizard. +//sys SetupDiSetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) = setupapi.SetupDiSetSelectedDevice + +// SetSelectedDevice method sets a device information element as the selected member of a device information set. This function is typically used by an installation wizard. +func (deviceInfoSet DevInfo) SetSelectedDevice(deviceInfoData *DevInfoData) error { + return SetupDiSetSelectedDevice(deviceInfoSet, deviceInfoData) +} + +//sys setupUninstallOEMInf(infFileName *uint16, flags SUOI, reserved uintptr) (err error) = setupapi.SetupUninstallOEMInfW + +// SetupUninstallOEMInf uninstalls the specified driver. +func SetupUninstallOEMInf(infFileName string, flags SUOI) error { + infFileName16, err := UTF16PtrFromString(infFileName) + if err != nil { + return err + } + return setupUninstallOEMInf(infFileName16, flags, 0) +} + +//sys cm_MapCrToWin32Err(configRet CONFIGRET, defaultWin32Error Errno) (ret Errno) = CfgMgr32.CM_MapCrToWin32Err + +//sys cm_Get_Device_Interface_List_Size(len *uint32, interfaceClass *GUID, deviceID *uint16, flags uint32) (ret CONFIGRET) = CfgMgr32.CM_Get_Device_Interface_List_SizeW +//sys cm_Get_Device_Interface_List(interfaceClass *GUID, deviceID *uint16, buffer *uint16, bufferLen uint32, flags uint32) (ret CONFIGRET) = CfgMgr32.CM_Get_Device_Interface_ListW + +func CM_Get_Device_Interface_List(deviceID string, interfaceClass *GUID, flags uint32) ([]string, error) { + deviceID16, err := UTF16PtrFromString(deviceID) + if err != nil { + return nil, err + } + var buf []uint16 + var buflen uint32 + for { + if ret := cm_Get_Device_Interface_List_Size(&buflen, interfaceClass, deviceID16, flags); ret != CR_SUCCESS { + return nil, ret + } + buf = make([]uint16, buflen) + if ret := cm_Get_Device_Interface_List(interfaceClass, deviceID16, &buf[0], buflen, flags); ret == CR_SUCCESS { + break + } else if ret != CR_BUFFER_SMALL { + return nil, ret + } + } + var interfaces []string + for i := 0; i < len(buf); { + j := i + wcslen(buf[i:]) + if i < j { + interfaces = append(interfaces, UTF16ToString(buf[i:j])) + } + i = j + 1 + } + if interfaces == nil { + return nil, ERROR_NO_SUCH_DEVICE_INTERFACE + } + return interfaces, nil +} + +//sys cm_Get_DevNode_Status(status *uint32, problemNumber *uint32, devInst DEVINST, flags uint32) (ret CONFIGRET) = CfgMgr32.CM_Get_DevNode_Status + +func CM_Get_DevNode_Status(status *uint32, problemNumber *uint32, devInst DEVINST, flags uint32) error { + ret := cm_Get_DevNode_Status(status, problemNumber, devInst, flags) + if ret == CR_SUCCESS { + return nil + } + return ret +} diff --git a/vendor/golang.org/x/sys/windows/setupapierrors_windows.go b/vendor/golang.org/x/sys/windows/setupapierrors_windows.go deleted file mode 100644 index 1681810e0..000000000 --- a/vendor/golang.org/x/sys/windows/setupapierrors_windows.go +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package windows - -import "syscall" - -const ( - ERROR_EXPECTED_SECTION_NAME syscall.Errno = 0x20000000 | 0xC0000000 | 0 - ERROR_BAD_SECTION_NAME_LINE syscall.Errno = 0x20000000 | 0xC0000000 | 1 - ERROR_SECTION_NAME_TOO_LONG syscall.Errno = 0x20000000 | 0xC0000000 | 2 - ERROR_GENERAL_SYNTAX syscall.Errno = 0x20000000 | 0xC0000000 | 3 - ERROR_WRONG_INF_STYLE syscall.Errno = 0x20000000 | 0xC0000000 | 0x100 - ERROR_SECTION_NOT_FOUND syscall.Errno = 0x20000000 | 0xC0000000 | 0x101 - ERROR_LINE_NOT_FOUND syscall.Errno = 0x20000000 | 0xC0000000 | 0x102 - ERROR_NO_BACKUP syscall.Errno = 0x20000000 | 0xC0000000 | 0x103 - ERROR_NO_ASSOCIATED_CLASS syscall.Errno = 0x20000000 | 0xC0000000 | 0x200 - ERROR_CLASS_MISMATCH syscall.Errno = 0x20000000 | 0xC0000000 | 0x201 - ERROR_DUPLICATE_FOUND syscall.Errno = 0x20000000 | 0xC0000000 | 0x202 - ERROR_NO_DRIVER_SELECTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x203 - ERROR_KEY_DOES_NOT_EXIST syscall.Errno = 0x20000000 | 0xC0000000 | 0x204 - ERROR_INVALID_DEVINST_NAME syscall.Errno = 0x20000000 | 0xC0000000 | 0x205 - ERROR_INVALID_CLASS syscall.Errno = 0x20000000 | 0xC0000000 | 0x206 - ERROR_DEVINST_ALREADY_EXISTS syscall.Errno = 0x20000000 | 0xC0000000 | 0x207 - ERROR_DEVINFO_NOT_REGISTERED syscall.Errno = 0x20000000 | 0xC0000000 | 0x208 - ERROR_INVALID_REG_PROPERTY syscall.Errno = 0x20000000 | 0xC0000000 | 0x209 - ERROR_NO_INF syscall.Errno = 0x20000000 | 0xC0000000 | 0x20A - ERROR_NO_SUCH_DEVINST syscall.Errno = 0x20000000 | 0xC0000000 | 0x20B - ERROR_CANT_LOAD_CLASS_ICON syscall.Errno = 0x20000000 | 0xC0000000 | 0x20C - ERROR_INVALID_CLASS_INSTALLER syscall.Errno = 0x20000000 | 0xC0000000 | 0x20D - ERROR_DI_DO_DEFAULT syscall.Errno = 0x20000000 | 0xC0000000 | 0x20E - ERROR_DI_NOFILECOPY syscall.Errno = 0x20000000 | 0xC0000000 | 0x20F - ERROR_INVALID_HWPROFILE syscall.Errno = 0x20000000 | 0xC0000000 | 0x210 - ERROR_NO_DEVICE_SELECTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x211 - ERROR_DEVINFO_LIST_LOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x212 - ERROR_DEVINFO_DATA_LOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x213 - ERROR_DI_BAD_PATH syscall.Errno = 0x20000000 | 0xC0000000 | 0x214 - ERROR_NO_CLASSINSTALL_PARAMS syscall.Errno = 0x20000000 | 0xC0000000 | 0x215 - ERROR_FILEQUEUE_LOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x216 - ERROR_BAD_SERVICE_INSTALLSECT syscall.Errno = 0x20000000 | 0xC0000000 | 0x217 - ERROR_NO_CLASS_DRIVER_LIST syscall.Errno = 0x20000000 | 0xC0000000 | 0x218 - ERROR_NO_ASSOCIATED_SERVICE syscall.Errno = 0x20000000 | 0xC0000000 | 0x219 - ERROR_NO_DEFAULT_DEVICE_INTERFACE syscall.Errno = 0x20000000 | 0xC0000000 | 0x21A - ERROR_DEVICE_INTERFACE_ACTIVE syscall.Errno = 0x20000000 | 0xC0000000 | 0x21B - ERROR_DEVICE_INTERFACE_REMOVED syscall.Errno = 0x20000000 | 0xC0000000 | 0x21C - ERROR_BAD_INTERFACE_INSTALLSECT syscall.Errno = 0x20000000 | 0xC0000000 | 0x21D - ERROR_NO_SUCH_INTERFACE_CLASS syscall.Errno = 0x20000000 | 0xC0000000 | 0x21E - ERROR_INVALID_REFERENCE_STRING syscall.Errno = 0x20000000 | 0xC0000000 | 0x21F - ERROR_INVALID_MACHINENAME syscall.Errno = 0x20000000 | 0xC0000000 | 0x220 - ERROR_REMOTE_COMM_FAILURE syscall.Errno = 0x20000000 | 0xC0000000 | 0x221 - ERROR_MACHINE_UNAVAILABLE syscall.Errno = 0x20000000 | 0xC0000000 | 0x222 - ERROR_NO_CONFIGMGR_SERVICES syscall.Errno = 0x20000000 | 0xC0000000 | 0x223 - ERROR_INVALID_PROPPAGE_PROVIDER syscall.Errno = 0x20000000 | 0xC0000000 | 0x224 - ERROR_NO_SUCH_DEVICE_INTERFACE syscall.Errno = 0x20000000 | 0xC0000000 | 0x225 - ERROR_DI_POSTPROCESSING_REQUIRED syscall.Errno = 0x20000000 | 0xC0000000 | 0x226 - ERROR_INVALID_COINSTALLER syscall.Errno = 0x20000000 | 0xC0000000 | 0x227 - ERROR_NO_COMPAT_DRIVERS syscall.Errno = 0x20000000 | 0xC0000000 | 0x228 - ERROR_NO_DEVICE_ICON syscall.Errno = 0x20000000 | 0xC0000000 | 0x229 - ERROR_INVALID_INF_LOGCONFIG syscall.Errno = 0x20000000 | 0xC0000000 | 0x22A - ERROR_DI_DONT_INSTALL syscall.Errno = 0x20000000 | 0xC0000000 | 0x22B - ERROR_INVALID_FILTER_DRIVER syscall.Errno = 0x20000000 | 0xC0000000 | 0x22C - ERROR_NON_WINDOWS_NT_DRIVER syscall.Errno = 0x20000000 | 0xC0000000 | 0x22D - ERROR_NON_WINDOWS_DRIVER syscall.Errno = 0x20000000 | 0xC0000000 | 0x22E - ERROR_NO_CATALOG_FOR_OEM_INF syscall.Errno = 0x20000000 | 0xC0000000 | 0x22F - ERROR_DEVINSTALL_QUEUE_NONNATIVE syscall.Errno = 0x20000000 | 0xC0000000 | 0x230 - ERROR_NOT_DISABLEABLE syscall.Errno = 0x20000000 | 0xC0000000 | 0x231 - ERROR_CANT_REMOVE_DEVINST syscall.Errno = 0x20000000 | 0xC0000000 | 0x232 - ERROR_INVALID_TARGET syscall.Errno = 0x20000000 | 0xC0000000 | 0x233 - ERROR_DRIVER_NONNATIVE syscall.Errno = 0x20000000 | 0xC0000000 | 0x234 - ERROR_IN_WOW64 syscall.Errno = 0x20000000 | 0xC0000000 | 0x235 - ERROR_SET_SYSTEM_RESTORE_POINT syscall.Errno = 0x20000000 | 0xC0000000 | 0x236 - ERROR_SCE_DISABLED syscall.Errno = 0x20000000 | 0xC0000000 | 0x238 - ERROR_UNKNOWN_EXCEPTION syscall.Errno = 0x20000000 | 0xC0000000 | 0x239 - ERROR_PNP_REGISTRY_ERROR syscall.Errno = 0x20000000 | 0xC0000000 | 0x23A - ERROR_REMOTE_REQUEST_UNSUPPORTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x23B - ERROR_NOT_AN_INSTALLED_OEM_INF syscall.Errno = 0x20000000 | 0xC0000000 | 0x23C - ERROR_INF_IN_USE_BY_DEVICES syscall.Errno = 0x20000000 | 0xC0000000 | 0x23D - ERROR_DI_FUNCTION_OBSOLETE syscall.Errno = 0x20000000 | 0xC0000000 | 0x23E - ERROR_NO_AUTHENTICODE_CATALOG syscall.Errno = 0x20000000 | 0xC0000000 | 0x23F - ERROR_AUTHENTICODE_DISALLOWED syscall.Errno = 0x20000000 | 0xC0000000 | 0x240 - ERROR_AUTHENTICODE_TRUSTED_PUBLISHER syscall.Errno = 0x20000000 | 0xC0000000 | 0x241 - ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED syscall.Errno = 0x20000000 | 0xC0000000 | 0x242 - ERROR_AUTHENTICODE_PUBLISHER_NOT_TRUSTED syscall.Errno = 0x20000000 | 0xC0000000 | 0x243 - ERROR_SIGNATURE_OSATTRIBUTE_MISMATCH syscall.Errno = 0x20000000 | 0xC0000000 | 0x244 - ERROR_ONLY_VALIDATE_VIA_AUTHENTICODE syscall.Errno = 0x20000000 | 0xC0000000 | 0x245 - ERROR_DEVICE_INSTALLER_NOT_READY syscall.Errno = 0x20000000 | 0xC0000000 | 0x246 - ERROR_DRIVER_STORE_ADD_FAILED syscall.Errno = 0x20000000 | 0xC0000000 | 0x247 - ERROR_DEVICE_INSTALL_BLOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x248 - ERROR_DRIVER_INSTALL_BLOCKED syscall.Errno = 0x20000000 | 0xC0000000 | 0x249 - ERROR_WRONG_INF_TYPE syscall.Errno = 0x20000000 | 0xC0000000 | 0x24A - ERROR_FILE_HASH_NOT_IN_CATALOG syscall.Errno = 0x20000000 | 0xC0000000 | 0x24B - ERROR_DRIVER_STORE_DELETE_FAILED syscall.Errno = 0x20000000 | 0xC0000000 | 0x24C - ERROR_UNRECOVERABLE_STACK_OVERFLOW syscall.Errno = 0x20000000 | 0xC0000000 | 0x300 - EXCEPTION_SPAPI_UNRECOVERABLE_STACK_OVERFLOW syscall.Errno = ERROR_UNRECOVERABLE_STACK_OVERFLOW - ERROR_NO_DEFAULT_INTERFACE_DEVICE syscall.Errno = ERROR_NO_DEFAULT_DEVICE_INTERFACE - ERROR_INTERFACE_DEVICE_ACTIVE syscall.Errno = ERROR_DEVICE_INTERFACE_ACTIVE - ERROR_INTERFACE_DEVICE_REMOVED syscall.Errno = ERROR_DEVICE_INTERFACE_REMOVED - ERROR_NO_SUCH_INTERFACE_DEVICE syscall.Errno = ERROR_NO_SUCH_DEVICE_INTERFACE -) diff --git a/vendor/golang.org/x/sys/windows/str.go b/vendor/golang.org/x/sys/windows/str.go index 917cc2aae..4fc01434e 100644 --- a/vendor/golang.org/x/sys/windows/str.go +++ b/vendor/golang.org/x/sys/windows/str.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build windows // +build windows package windows diff --git a/vendor/golang.org/x/sys/windows/svc/security.go b/vendor/golang.org/x/sys/windows/svc/security.go new file mode 100644 index 000000000..1c51006ea --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/security.go @@ -0,0 +1,101 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build windows +// +build windows + +package svc + +import ( + "strings" + "unsafe" + + "golang.org/x/sys/windows" +) + +func allocSid(subAuth0 uint32) (*windows.SID, error) { + var sid *windows.SID + err := windows.AllocateAndInitializeSid(&windows.SECURITY_NT_AUTHORITY, + 1, subAuth0, 0, 0, 0, 0, 0, 0, 0, &sid) + if err != nil { + return nil, err + } + return sid, nil +} + +// IsAnInteractiveSession determines if calling process is running interactively. +// It queries the process token for membership in the Interactive group. +// http://stackoverflow.com/questions/2668851/how-do-i-detect-that-my-application-is-running-as-service-or-in-an-interactive-s +// +// Deprecated: Use IsWindowsService instead. +func IsAnInteractiveSession() (bool, error) { + interSid, err := allocSid(windows.SECURITY_INTERACTIVE_RID) + if err != nil { + return false, err + } + defer windows.FreeSid(interSid) + + serviceSid, err := allocSid(windows.SECURITY_SERVICE_RID) + if err != nil { + return false, err + } + defer windows.FreeSid(serviceSid) + + t, err := windows.OpenCurrentProcessToken() + if err != nil { + return false, err + } + defer t.Close() + + gs, err := t.GetTokenGroups() + if err != nil { + return false, err + } + + for _, g := range gs.AllGroups() { + if windows.EqualSid(g.Sid, interSid) { + return true, nil + } + if windows.EqualSid(g.Sid, serviceSid) { + return false, nil + } + } + return false, nil +} + +// IsWindowsService reports whether the process is currently executing +// as a Windows service. +func IsWindowsService() (bool, error) { + // The below technique looks a bit hairy, but it's actually + // exactly what the .NET framework does for the similarly named function: + // https://github.com/dotnet/extensions/blob/f4066026ca06984b07e90e61a6390ac38152ba93/src/Hosting/WindowsServices/src/WindowsServiceHelpers.cs#L26-L31 + // Specifically, it looks up whether the parent process has session ID zero + // and is called "services". + + var currentProcess windows.PROCESS_BASIC_INFORMATION + infoSize := uint32(unsafe.Sizeof(currentProcess)) + err := windows.NtQueryInformationProcess(windows.CurrentProcess(), windows.ProcessBasicInformation, unsafe.Pointer(¤tProcess), infoSize, &infoSize) + if err != nil { + return false, err + } + var parentProcess *windows.SYSTEM_PROCESS_INFORMATION + for infoSize = uint32((unsafe.Sizeof(*parentProcess) + unsafe.Sizeof(uintptr(0))) * 1024); ; { + parentProcess = (*windows.SYSTEM_PROCESS_INFORMATION)(unsafe.Pointer(&make([]byte, infoSize)[0])) + err = windows.NtQuerySystemInformation(windows.SystemProcessInformation, unsafe.Pointer(parentProcess), infoSize, &infoSize) + if err == nil { + break + } else if err != windows.STATUS_INFO_LENGTH_MISMATCH { + return false, err + } + } + for ; ; parentProcess = (*windows.SYSTEM_PROCESS_INFORMATION)(unsafe.Pointer(uintptr(unsafe.Pointer(parentProcess)) + uintptr(parentProcess.NextEntryOffset))) { + if parentProcess.UniqueProcessID == currentProcess.InheritedFromUniqueProcessId { + return parentProcess.SessionID == 0 && strings.EqualFold("services.exe", parentProcess.ImageName.String()), nil + } + if parentProcess.NextEntryOffset == 0 { + break + } + } + return false, nil +} diff --git a/vendor/golang.org/x/sys/windows/svc/service.go b/vendor/golang.org/x/sys/windows/svc/service.go new file mode 100644 index 000000000..5b05c3e33 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/svc/service.go @@ -0,0 +1,314 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build windows +// +build windows + +// Package svc provides everything required to build Windows service. +// +package svc + +import ( + "errors" + "sync" + "unsafe" + + "golang.org/x/sys/internal/unsafeheader" + "golang.org/x/sys/windows" +) + +// State describes service execution state (Stopped, Running and so on). +type State uint32 + +const ( + Stopped = State(windows.SERVICE_STOPPED) + StartPending = State(windows.SERVICE_START_PENDING) + StopPending = State(windows.SERVICE_STOP_PENDING) + Running = State(windows.SERVICE_RUNNING) + ContinuePending = State(windows.SERVICE_CONTINUE_PENDING) + PausePending = State(windows.SERVICE_PAUSE_PENDING) + Paused = State(windows.SERVICE_PAUSED) +) + +// Cmd represents service state change request. It is sent to a service +// by the service manager, and should be actioned upon by the service. +type Cmd uint32 + +const ( + Stop = Cmd(windows.SERVICE_CONTROL_STOP) + Pause = Cmd(windows.SERVICE_CONTROL_PAUSE) + Continue = Cmd(windows.SERVICE_CONTROL_CONTINUE) + Interrogate = Cmd(windows.SERVICE_CONTROL_INTERROGATE) + Shutdown = Cmd(windows.SERVICE_CONTROL_SHUTDOWN) + ParamChange = Cmd(windows.SERVICE_CONTROL_PARAMCHANGE) + NetBindAdd = Cmd(windows.SERVICE_CONTROL_NETBINDADD) + NetBindRemove = Cmd(windows.SERVICE_CONTROL_NETBINDREMOVE) + NetBindEnable = Cmd(windows.SERVICE_CONTROL_NETBINDENABLE) + NetBindDisable = Cmd(windows.SERVICE_CONTROL_NETBINDDISABLE) + DeviceEvent = Cmd(windows.SERVICE_CONTROL_DEVICEEVENT) + HardwareProfileChange = Cmd(windows.SERVICE_CONTROL_HARDWAREPROFILECHANGE) + PowerEvent = Cmd(windows.SERVICE_CONTROL_POWEREVENT) + SessionChange = Cmd(windows.SERVICE_CONTROL_SESSIONCHANGE) + PreShutdown = Cmd(windows.SERVICE_CONTROL_PRESHUTDOWN) +) + +// Accepted is used to describe commands accepted by the service. +// Note that Interrogate is always accepted. +type Accepted uint32 + +const ( + AcceptStop = Accepted(windows.SERVICE_ACCEPT_STOP) + AcceptShutdown = Accepted(windows.SERVICE_ACCEPT_SHUTDOWN) + AcceptPauseAndContinue = Accepted(windows.SERVICE_ACCEPT_PAUSE_CONTINUE) + AcceptParamChange = Accepted(windows.SERVICE_ACCEPT_PARAMCHANGE) + AcceptNetBindChange = Accepted(windows.SERVICE_ACCEPT_NETBINDCHANGE) + AcceptHardwareProfileChange = Accepted(windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE) + AcceptPowerEvent = Accepted(windows.SERVICE_ACCEPT_POWEREVENT) + AcceptSessionChange = Accepted(windows.SERVICE_ACCEPT_SESSIONCHANGE) + AcceptPreShutdown = Accepted(windows.SERVICE_ACCEPT_PRESHUTDOWN) +) + +// Status combines State and Accepted commands to fully describe running service. +type Status struct { + State State + Accepts Accepted + CheckPoint uint32 // used to report progress during a lengthy operation + WaitHint uint32 // estimated time required for a pending operation, in milliseconds + ProcessId uint32 // if the service is running, the process identifier of it, and otherwise zero + Win32ExitCode uint32 // set if the service has exited with a win32 exit code + ServiceSpecificExitCode uint32 // set if the service has exited with a service-specific exit code +} + +// StartReason is the reason that the service was started. +type StartReason uint32 + +const ( + StartReasonDemand = StartReason(windows.SERVICE_START_REASON_DEMAND) + StartReasonAuto = StartReason(windows.SERVICE_START_REASON_AUTO) + StartReasonTrigger = StartReason(windows.SERVICE_START_REASON_TRIGGER) + StartReasonRestartOnFailure = StartReason(windows.SERVICE_START_REASON_RESTART_ON_FAILURE) + StartReasonDelayedAuto = StartReason(windows.SERVICE_START_REASON_DELAYEDAUTO) +) + +// ChangeRequest is sent to the service Handler to request service status change. +type ChangeRequest struct { + Cmd Cmd + EventType uint32 + EventData uintptr + CurrentStatus Status + Context uintptr +} + +// Handler is the interface that must be implemented to build Windows service. +type Handler interface { + // Execute will be called by the package code at the start of + // the service, and the service will exit once Execute completes. + // Inside Execute you must read service change requests from r and + // act accordingly. You must keep service control manager up to date + // about state of your service by writing into s as required. + // args contains service name followed by argument strings passed + // to the service. + // You can provide service exit code in exitCode return parameter, + // with 0 being "no error". You can also indicate if exit code, + // if any, is service specific or not by using svcSpecificEC + // parameter. + Execute(args []string, r <-chan ChangeRequest, s chan<- Status) (svcSpecificEC bool, exitCode uint32) +} + +type ctlEvent struct { + cmd Cmd + eventType uint32 + eventData uintptr + context uintptr + errno uint32 +} + +// service provides access to windows service api. +type service struct { + name string + h windows.Handle + c chan ctlEvent + handler Handler +} + +type exitCode struct { + isSvcSpecific bool + errno uint32 +} + +func (s *service) updateStatus(status *Status, ec *exitCode) error { + if s.h == 0 { + return errors.New("updateStatus with no service status handle") + } + var t windows.SERVICE_STATUS + t.ServiceType = windows.SERVICE_WIN32_OWN_PROCESS + t.CurrentState = uint32(status.State) + if status.Accepts&AcceptStop != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_STOP + } + if status.Accepts&AcceptShutdown != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_SHUTDOWN + } + if status.Accepts&AcceptPauseAndContinue != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PAUSE_CONTINUE + } + if status.Accepts&AcceptParamChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PARAMCHANGE + } + if status.Accepts&AcceptNetBindChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_NETBINDCHANGE + } + if status.Accepts&AcceptHardwareProfileChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_HARDWAREPROFILECHANGE + } + if status.Accepts&AcceptPowerEvent != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_POWEREVENT + } + if status.Accepts&AcceptSessionChange != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_SESSIONCHANGE + } + if status.Accepts&AcceptPreShutdown != 0 { + t.ControlsAccepted |= windows.SERVICE_ACCEPT_PRESHUTDOWN + } + if ec.errno == 0 { + t.Win32ExitCode = windows.NO_ERROR + t.ServiceSpecificExitCode = windows.NO_ERROR + } else if ec.isSvcSpecific { + t.Win32ExitCode = uint32(windows.ERROR_SERVICE_SPECIFIC_ERROR) + t.ServiceSpecificExitCode = ec.errno + } else { + t.Win32ExitCode = ec.errno + t.ServiceSpecificExitCode = windows.NO_ERROR + } + t.CheckPoint = status.CheckPoint + t.WaitHint = status.WaitHint + return windows.SetServiceStatus(s.h, &t) +} + +var ( + initCallbacks sync.Once + ctlHandlerCallback uintptr + serviceMainCallback uintptr +) + +func ctlHandler(ctl, evtype, evdata, context uintptr) uintptr { + s := (*service)(unsafe.Pointer(context)) + e := ctlEvent{cmd: Cmd(ctl), eventType: uint32(evtype), eventData: evdata, context: 123456} // Set context to 123456 to test issue #25660. + s.c <- e + return 0 +} + +var theService service // This is, unfortunately, a global, which means only one service per process. + +// serviceMain is the entry point called by the service manager, registered earlier by +// the call to StartServiceCtrlDispatcher. +func serviceMain(argc uint32, argv **uint16) uintptr { + handle, err := windows.RegisterServiceCtrlHandlerEx(windows.StringToUTF16Ptr(theService.name), ctlHandlerCallback, uintptr(unsafe.Pointer(&theService))) + if sysErr, ok := err.(windows.Errno); ok { + return uintptr(sysErr) + } else if err != nil { + return uintptr(windows.ERROR_UNKNOWN_EXCEPTION) + } + theService.h = handle + defer func() { + theService.h = 0 + }() + var args16 []*uint16 + hdr := (*unsafeheader.Slice)(unsafe.Pointer(&args16)) + hdr.Data = unsafe.Pointer(argv) + hdr.Len = int(argc) + hdr.Cap = int(argc) + + args := make([]string, len(args16)) + for i, a := range args16 { + args[i] = windows.UTF16PtrToString(a) + } + + cmdsToHandler := make(chan ChangeRequest) + changesFromHandler := make(chan Status) + exitFromHandler := make(chan exitCode) + + go func() { + ss, errno := theService.handler.Execute(args, cmdsToHandler, changesFromHandler) + exitFromHandler <- exitCode{ss, errno} + }() + + ec := exitCode{isSvcSpecific: true, errno: 0} + outcr := ChangeRequest{ + CurrentStatus: Status{State: Stopped}, + } + var outch chan ChangeRequest + inch := theService.c +loop: + for { + select { + case r := <-inch: + if r.errno != 0 { + ec.errno = r.errno + break loop + } + inch = nil + outch = cmdsToHandler + outcr.Cmd = r.cmd + outcr.EventType = r.eventType + outcr.EventData = r.eventData + outcr.Context = r.context + case outch <- outcr: + inch = theService.c + outch = nil + case c := <-changesFromHandler: + err := theService.updateStatus(&c, &ec) + if err != nil { + ec.errno = uint32(windows.ERROR_EXCEPTION_IN_SERVICE) + if err2, ok := err.(windows.Errno); ok { + ec.errno = uint32(err2) + } + break loop + } + outcr.CurrentStatus = c + case ec = <-exitFromHandler: + break loop + } + } + + theService.updateStatus(&Status{State: Stopped}, &ec) + + return windows.NO_ERROR +} + +// Run executes service name by calling appropriate handler function. +func Run(name string, handler Handler) error { + initCallbacks.Do(func() { + ctlHandlerCallback = windows.NewCallback(ctlHandler) + serviceMainCallback = windows.NewCallback(serviceMain) + }) + theService.name = name + theService.handler = handler + theService.c = make(chan ctlEvent) + t := []windows.SERVICE_TABLE_ENTRY{ + {ServiceName: windows.StringToUTF16Ptr(theService.name), ServiceProc: serviceMainCallback}, + {ServiceName: nil, ServiceProc: 0}, + } + return windows.StartServiceCtrlDispatcher(&t[0]) +} + +// StatusHandle returns service status handle. It is safe to call this function +// from inside the Handler.Execute because then it is guaranteed to be set. +func StatusHandle() windows.Handle { + return theService.h +} + +// DynamicStartReason returns the reason why the service was started. It is safe +// to call this function from inside the Handler.Execute because then it is +// guaranteed to be set. +func DynamicStartReason() (StartReason, error) { + var allocReason *uint32 + err := windows.QueryServiceDynamicInformation(theService.h, windows.SERVICE_DYNAMIC_INFORMATION_LEVEL_START_REASON, unsafe.Pointer(&allocReason)) + if err != nil { + return 0, err + } + reason := StartReason(*allocReason) + windows.LocalFree(windows.Handle(unsafe.Pointer(allocReason))) + return reason, nil +} diff --git a/vendor/golang.org/x/sys/windows/syscall.go b/vendor/golang.org/x/sys/windows/syscall.go index 6122f557a..72074d582 100644 --- a/vendor/golang.org/x/sys/windows/syscall.go +++ b/vendor/golang.org/x/sys/windows/syscall.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build windows // +build windows // Package windows contains an interface to the low-level operating system diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 1215b2ae2..200b62a00 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -248,6 +248,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW //sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW //sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW +//sys ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW //sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock //sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock //sys getTickCount64() (ms uint64) = kernel32.GetTickCount64 @@ -274,6 +275,11 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc //sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree //sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect +//sys VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) = kernel32.VirtualProtectEx +//sys VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQuery +//sys VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQueryEx +//sys ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) = kernel32.ReadProcessMemory +//sys WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) = kernel32.WriteProcessMemory //sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile //sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW //sys FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.FindFirstChangeNotificationW @@ -317,6 +323,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW //sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot +//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW +//sys Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32NextW //sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW //sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW //sys Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error) @@ -396,8 +404,18 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys LoadResource(module Handle, resInfo Handle) (resData Handle, err error) = kernel32.LoadResource //sys LockResource(resData Handle) (addr uintptr, err error) = kernel32.LockResource +// Version APIs +//sys GetFileVersionInfoSize(filename string, zeroHandle *Handle) (bufSize uint32, err error) = version.GetFileVersionInfoSizeW +//sys GetFileVersionInfo(filename string, handle uint32, bufSize uint32, buffer unsafe.Pointer) (err error) = version.GetFileVersionInfoW +//sys VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) = version.VerQueryValueW + // Process Status API (PSAPI) //sys EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses +//sys EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) = psapi.EnumProcessModules +//sys EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) = psapi.EnumProcessModulesEx +//sys GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation +//sys GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) = psapi.GetModuleFileNameExW +//sys GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) = psapi.GetModuleBaseNameW // NT Native APIs //sys rtlNtStatusToDosErrorNoTeb(ntstatus NTStatus) (ret syscall.Errno) = ntdll.RtlNtStatusToDosErrorNoTeb @@ -408,11 +426,16 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys RtlInitString(destinationString *NTString, sourceString *byte) = ntdll.RtlInitString //sys NtCreateFile(handle *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, allocationSize *int64, attributes uint32, share uint32, disposition uint32, options uint32, eabuffer uintptr, ealength uint32) (ntstatus error) = ntdll.NtCreateFile //sys NtCreateNamedPipeFile(pipe *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (ntstatus error) = ntdll.NtCreateNamedPipeFile +//sys NtSetInformationFile(handle Handle, iosb *IO_STATUS_BLOCK, inBuffer *byte, inBufferLen uint32, class uint32) (ntstatus error) = ntdll.NtSetInformationFile //sys RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToNtPathName_U_WithStatus //sys RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToRelativeNtPathName_U_WithStatus //sys RtlDefaultNpAcl(acl **ACL) (ntstatus error) = ntdll.RtlDefaultNpAcl //sys NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQueryInformationProcess //sys NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) = ntdll.NtSetInformationProcess +//sys NtQuerySystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQuerySystemInformation +//sys NtSetSystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32) (ntstatus error) = ntdll.NtSetSystemInformation +//sys RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) = ntdll.RtlAddFunctionTable +//sys RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) = ntdll.RtlDeleteFunctionTable // syscall interface implementation for other packages @@ -873,9 +896,7 @@ func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) { p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil } @@ -895,9 +916,7 @@ func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) { p[0] = byte(sa.Port >> 8) p[1] = byte(sa.Port) sa.raw.Scope_id = sa.ZoneId - for i := 0; i < len(sa.Addr); i++ { - sa.raw.Addr[i] = sa.Addr[i] - } + sa.raw.Addr = sa.Addr return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil } @@ -970,9 +989,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { sa := new(SockaddrInet4) p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil case AF_INET6: @@ -981,9 +998,7 @@ func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) { p := (*[2]byte)(unsafe.Pointer(&pp.Port)) sa.Port = int(p[0])<<8 + int(p[1]) sa.ZoneId = pp.Scope_id - for i := 0; i < len(sa.Addr); i++ { - sa.Addr[i] = pp.Addr[i] - } + sa.Addr = pp.Addr return sa, nil } return nil, syscall.EAFNOSUPPORT diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 17f03312d..bb31abda4 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -66,9 +66,21 @@ var signals = [...]string{ } const ( - FILE_LIST_DIRECTORY = 0x00000001 - FILE_APPEND_DATA = 0x00000004 + FILE_READ_DATA = 0x00000001 + FILE_READ_ATTRIBUTES = 0x00000080 + FILE_READ_EA = 0x00000008 + FILE_WRITE_DATA = 0x00000002 FILE_WRITE_ATTRIBUTES = 0x00000100 + FILE_WRITE_EA = 0x00000010 + FILE_APPEND_DATA = 0x00000004 + FILE_EXECUTE = 0x00000020 + + FILE_GENERIC_READ = STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE + FILE_GENERIC_WRITE = STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE + FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE + + FILE_LIST_DIRECTORY = 0x00000001 + FILE_TRAVERSE = 0x00000020 FILE_SHARE_READ = 0x00000001 FILE_SHARE_WRITE = 0x00000002 @@ -144,6 +156,8 @@ const ( MAX_PATH = 260 MAX_LONG_PATH = 32768 + MAX_MODULE_NAME32 = 255 + MAX_COMPUTERNAME_LENGTH = 15 TIME_ZONE_ID_UNKNOWN = 0 @@ -242,6 +256,14 @@ const ( TH32CS_INHERIT = 0x80000000 ) +const ( + // flags for EnumProcessModulesEx + LIST_MODULES_32BIT = 0x01 + LIST_MODULES_64BIT = 0x02 + LIST_MODULES_ALL = 0x03 + LIST_MODULES_DEFAULT = 0x00 +) + const ( // filters for ReadDirectoryChangesW and FindFirstChangeNotificationW FILE_NOTIFY_CHANGE_FILE_NAME = 0x001 @@ -916,8 +938,8 @@ type StartupInfoEx struct { type ProcThreadAttributeList struct{} type ProcThreadAttributeListContainer struct { - data *ProcThreadAttributeList - heapAllocations []uintptr + data *ProcThreadAttributeList + pointers []unsafe.Pointer } type ProcessInformation struct { @@ -950,6 +972,21 @@ type ThreadEntry32 struct { Flags uint32 } +type ModuleEntry32 struct { + Size uint32 + ModuleID uint32 + ProcessID uint32 + GlblcntUsage uint32 + ProccntUsage uint32 + ModBaseAddr uintptr + ModBaseSize uint32 + ModuleHandle Handle + Module [MAX_MODULE_NAME32 + 1]uint16 + ExePath [MAX_PATH]uint16 +} + +const SizeofModuleEntry32 = unsafe.Sizeof(ModuleEntry32{}) + type Systemtime struct { Year uint16 Month uint16 @@ -1781,7 +1818,53 @@ type reparseDataBuffer struct { } const ( - FSCTL_GET_REPARSE_POINT = 0x900A8 + FSCTL_CREATE_OR_GET_OBJECT_ID = 0x0900C0 + FSCTL_DELETE_OBJECT_ID = 0x0900A0 + FSCTL_DELETE_REPARSE_POINT = 0x0900AC + FSCTL_DUPLICATE_EXTENTS_TO_FILE = 0x098344 + FSCTL_DUPLICATE_EXTENTS_TO_FILE_EX = 0x0983E8 + FSCTL_FILESYSTEM_GET_STATISTICS = 0x090060 + FSCTL_FILE_LEVEL_TRIM = 0x098208 + FSCTL_FIND_FILES_BY_SID = 0x09008F + FSCTL_GET_COMPRESSION = 0x09003C + FSCTL_GET_INTEGRITY_INFORMATION = 0x09027C + FSCTL_GET_NTFS_VOLUME_DATA = 0x090064 + FSCTL_GET_REFS_VOLUME_DATA = 0x0902D8 + FSCTL_GET_OBJECT_ID = 0x09009C + FSCTL_GET_REPARSE_POINT = 0x0900A8 + FSCTL_GET_RETRIEVAL_POINTER_COUNT = 0x09042B + FSCTL_GET_RETRIEVAL_POINTERS = 0x090073 + FSCTL_GET_RETRIEVAL_POINTERS_AND_REFCOUNT = 0x0903D3 + FSCTL_IS_PATHNAME_VALID = 0x09002C + FSCTL_LMR_SET_LINK_TRACKING_INFORMATION = 0x1400EC + FSCTL_MARK_HANDLE = 0x0900FC + FSCTL_OFFLOAD_READ = 0x094264 + FSCTL_OFFLOAD_WRITE = 0x098268 + FSCTL_PIPE_PEEK = 0x11400C + FSCTL_PIPE_TRANSCEIVE = 0x11C017 + FSCTL_PIPE_WAIT = 0x110018 + FSCTL_QUERY_ALLOCATED_RANGES = 0x0940CF + FSCTL_QUERY_FAT_BPB = 0x090058 + FSCTL_QUERY_FILE_REGIONS = 0x090284 + FSCTL_QUERY_ON_DISK_VOLUME_INFO = 0x09013C + FSCTL_QUERY_SPARING_INFO = 0x090138 + FSCTL_READ_FILE_USN_DATA = 0x0900EB + FSCTL_RECALL_FILE = 0x090117 + FSCTL_REFS_STREAM_SNAPSHOT_MANAGEMENT = 0x090440 + FSCTL_SET_COMPRESSION = 0x09C040 + FSCTL_SET_DEFECT_MANAGEMENT = 0x098134 + FSCTL_SET_ENCRYPTION = 0x0900D7 + FSCTL_SET_INTEGRITY_INFORMATION = 0x09C280 + FSCTL_SET_INTEGRITY_INFORMATION_EX = 0x090380 + FSCTL_SET_OBJECT_ID = 0x090098 + FSCTL_SET_OBJECT_ID_EXTENDED = 0x0900BC + FSCTL_SET_REPARSE_POINT = 0x0900A4 + FSCTL_SET_SPARSE = 0x0900C4 + FSCTL_SET_ZERO_DATA = 0x0980C8 + FSCTL_SET_ZERO_ON_DEALLOCATION = 0x090194 + FSCTL_SIS_COPYFILE = 0x090100 + FSCTL_WRITE_USN_CLOSE_RECORD = 0x0900EF + MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024 IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 IO_REPARSE_TAG_SYMLINK = 0xA000000C @@ -2300,6 +2383,12 @@ type LIST_ENTRY struct { Blink *LIST_ENTRY } +type RUNTIME_FUNCTION struct { + BeginAddress uint32 + EndAddress uint32 + UnwindData uint32 +} + type LDR_DATA_TABLE_ENTRY struct { reserved1 [2]uintptr InMemoryOrderLinks LIST_ENTRY @@ -2490,6 +2579,60 @@ const ( FILE_PIPE_SERVER_END = 0x00000001 ) +const ( + // FileInformationClass for NtSetInformationFile + FileBasicInformation = 4 + FileRenameInformation = 10 + FileDispositionInformation = 13 + FilePositionInformation = 14 + FileEndOfFileInformation = 20 + FileValidDataLengthInformation = 39 + FileShortNameInformation = 40 + FileIoPriorityHintInformation = 43 + FileReplaceCompletionInformation = 61 + FileDispositionInformationEx = 64 + FileCaseSensitiveInformation = 71 + FileLinkInformation = 72 + FileCaseSensitiveInformationForceAccessCheck = 75 + FileKnownFolderInformation = 76 + + // Flags for FILE_RENAME_INFORMATION + FILE_RENAME_REPLACE_IF_EXISTS = 0x00000001 + FILE_RENAME_POSIX_SEMANTICS = 0x00000002 + FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE = 0x00000004 + FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE = 0x00000008 + FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE = 0x00000010 + FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE = 0x00000020 + FILE_RENAME_PRESERVE_AVAILABLE_SPACE = 0x00000030 + FILE_RENAME_IGNORE_READONLY_ATTRIBUTE = 0x00000040 + FILE_RENAME_FORCE_RESIZE_TARGET_SR = 0x00000080 + FILE_RENAME_FORCE_RESIZE_SOURCE_SR = 0x00000100 + FILE_RENAME_FORCE_RESIZE_SR = 0x00000180 + + // Flags for FILE_DISPOSITION_INFORMATION_EX + FILE_DISPOSITION_DO_NOT_DELETE = 0x00000000 + FILE_DISPOSITION_DELETE = 0x00000001 + FILE_DISPOSITION_POSIX_SEMANTICS = 0x00000002 + FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK = 0x00000004 + FILE_DISPOSITION_ON_CLOSE = 0x00000008 + FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE = 0x00000010 + + // Flags for FILE_CASE_SENSITIVE_INFORMATION + FILE_CS_FLAG_CASE_SENSITIVE_DIR = 0x00000001 + + // Flags for FILE_LINK_INFORMATION + FILE_LINK_REPLACE_IF_EXISTS = 0x00000001 + FILE_LINK_POSIX_SEMANTICS = 0x00000002 + FILE_LINK_SUPPRESS_STORAGE_RESERVE_INHERITANCE = 0x00000008 + FILE_LINK_NO_INCREASE_AVAILABLE_SPACE = 0x00000010 + FILE_LINK_NO_DECREASE_AVAILABLE_SPACE = 0x00000020 + FILE_LINK_PRESERVE_AVAILABLE_SPACE = 0x00000030 + FILE_LINK_IGNORE_READONLY_ATTRIBUTE = 0x00000040 + FILE_LINK_FORCE_RESIZE_TARGET_SR = 0x00000080 + FILE_LINK_FORCE_RESIZE_SOURCE_SR = 0x00000100 + FILE_LINK_FORCE_RESIZE_SR = 0x00000180 +) + // ProcessInformationClasses for NtQueryInformationProcess and NtSetInformationProcess. const ( ProcessBasicInformation = iota @@ -2606,6 +2749,240 @@ type PROCESS_BASIC_INFORMATION struct { InheritedFromUniqueProcessId uintptr } +type SYSTEM_PROCESS_INFORMATION struct { + NextEntryOffset uint32 + NumberOfThreads uint32 + WorkingSetPrivateSize int64 + HardFaultCount uint32 + NumberOfThreadsHighWatermark uint32 + CycleTime uint64 + CreateTime int64 + UserTime int64 + KernelTime int64 + ImageName NTUnicodeString + BasePriority int32 + UniqueProcessID uintptr + InheritedFromUniqueProcessID uintptr + HandleCount uint32 + SessionID uint32 + UniqueProcessKey *uint32 + PeakVirtualSize uintptr + VirtualSize uintptr + PageFaultCount uint32 + PeakWorkingSetSize uintptr + WorkingSetSize uintptr + QuotaPeakPagedPoolUsage uintptr + QuotaPagedPoolUsage uintptr + QuotaPeakNonPagedPoolUsage uintptr + QuotaNonPagedPoolUsage uintptr + PagefileUsage uintptr + PeakPagefileUsage uintptr + PrivatePageCount uintptr + ReadOperationCount int64 + WriteOperationCount int64 + OtherOperationCount int64 + ReadTransferCount int64 + WriteTransferCount int64 + OtherTransferCount int64 +} + +// SystemInformationClasses for NtQuerySystemInformation and NtSetSystemInformation +const ( + SystemBasicInformation = iota + SystemProcessorInformation + SystemPerformanceInformation + SystemTimeOfDayInformation + SystemPathInformation + SystemProcessInformation + SystemCallCountInformation + SystemDeviceInformation + SystemProcessorPerformanceInformation + SystemFlagsInformation + SystemCallTimeInformation + SystemModuleInformation + SystemLocksInformation + SystemStackTraceInformation + SystemPagedPoolInformation + SystemNonPagedPoolInformation + SystemHandleInformation + SystemObjectInformation + SystemPageFileInformation + SystemVdmInstemulInformation + SystemVdmBopInformation + SystemFileCacheInformation + SystemPoolTagInformation + SystemInterruptInformation + SystemDpcBehaviorInformation + SystemFullMemoryInformation + SystemLoadGdiDriverInformation + SystemUnloadGdiDriverInformation + SystemTimeAdjustmentInformation + SystemSummaryMemoryInformation + SystemMirrorMemoryInformation + SystemPerformanceTraceInformation + systemObsolete0 + SystemExceptionInformation + SystemCrashDumpStateInformation + SystemKernelDebuggerInformation + SystemContextSwitchInformation + SystemRegistryQuotaInformation + SystemExtendServiceTableInformation + SystemPrioritySeperation + SystemVerifierAddDriverInformation + SystemVerifierRemoveDriverInformation + SystemProcessorIdleInformation + SystemLegacyDriverInformation + SystemCurrentTimeZoneInformation + SystemLookasideInformation + SystemTimeSlipNotification + SystemSessionCreate + SystemSessionDetach + SystemSessionInformation + SystemRangeStartInformation + SystemVerifierInformation + SystemVerifierThunkExtend + SystemSessionProcessInformation + SystemLoadGdiDriverInSystemSpace + SystemNumaProcessorMap + SystemPrefetcherInformation + SystemExtendedProcessInformation + SystemRecommendedSharedDataAlignment + SystemComPlusPackage + SystemNumaAvailableMemory + SystemProcessorPowerInformation + SystemEmulationBasicInformation + SystemEmulationProcessorInformation + SystemExtendedHandleInformation + SystemLostDelayedWriteInformation + SystemBigPoolInformation + SystemSessionPoolTagInformation + SystemSessionMappedViewInformation + SystemHotpatchInformation + SystemObjectSecurityMode + SystemWatchdogTimerHandler + SystemWatchdogTimerInformation + SystemLogicalProcessorInformation + SystemWow64SharedInformationObsolete + SystemRegisterFirmwareTableInformationHandler + SystemFirmwareTableInformation + SystemModuleInformationEx + SystemVerifierTriageInformation + SystemSuperfetchInformation + SystemMemoryListInformation + SystemFileCacheInformationEx + SystemThreadPriorityClientIdInformation + SystemProcessorIdleCycleTimeInformation + SystemVerifierCancellationInformation + SystemProcessorPowerInformationEx + SystemRefTraceInformation + SystemSpecialPoolInformation + SystemProcessIdInformation + SystemErrorPortInformation + SystemBootEnvironmentInformation + SystemHypervisorInformation + SystemVerifierInformationEx + SystemTimeZoneInformation + SystemImageFileExecutionOptionsInformation + SystemCoverageInformation + SystemPrefetchPatchInformation + SystemVerifierFaultsInformation + SystemSystemPartitionInformation + SystemSystemDiskInformation + SystemProcessorPerformanceDistribution + SystemNumaProximityNodeInformation + SystemDynamicTimeZoneInformation + SystemCodeIntegrityInformation + SystemProcessorMicrocodeUpdateInformation + SystemProcessorBrandString + SystemVirtualAddressInformation + SystemLogicalProcessorAndGroupInformation + SystemProcessorCycleTimeInformation + SystemStoreInformation + SystemRegistryAppendString + SystemAitSamplingValue + SystemVhdBootInformation + SystemCpuQuotaInformation + SystemNativeBasicInformation + systemSpare1 + SystemLowPriorityIoInformation + SystemTpmBootEntropyInformation + SystemVerifierCountersInformation + SystemPagedPoolInformationEx + SystemSystemPtesInformationEx + SystemNodeDistanceInformation + SystemAcpiAuditInformation + SystemBasicPerformanceInformation + SystemQueryPerformanceCounterInformation + SystemSessionBigPoolInformation + SystemBootGraphicsInformation + SystemScrubPhysicalMemoryInformation + SystemBadPageInformation + SystemProcessorProfileControlArea + SystemCombinePhysicalMemoryInformation + SystemEntropyInterruptTimingCallback + SystemConsoleInformation + SystemPlatformBinaryInformation + SystemThrottleNotificationInformation + SystemHypervisorProcessorCountInformation + SystemDeviceDataInformation + SystemDeviceDataEnumerationInformation + SystemMemoryTopologyInformation + SystemMemoryChannelInformation + SystemBootLogoInformation + SystemProcessorPerformanceInformationEx + systemSpare0 + SystemSecureBootPolicyInformation + SystemPageFileInformationEx + SystemSecureBootInformation + SystemEntropyInterruptTimingRawInformation + SystemPortableWorkspaceEfiLauncherInformation + SystemFullProcessInformation + SystemKernelDebuggerInformationEx + SystemBootMetadataInformation + SystemSoftRebootInformation + SystemElamCertificateInformation + SystemOfflineDumpConfigInformation + SystemProcessorFeaturesInformation + SystemRegistryReconciliationInformation + SystemEdidInformation + SystemManufacturingInformation + SystemEnergyEstimationConfigInformation + SystemHypervisorDetailInformation + SystemProcessorCycleStatsInformation + SystemVmGenerationCountInformation + SystemTrustedPlatformModuleInformation + SystemKernelDebuggerFlags + SystemCodeIntegrityPolicyInformation + SystemIsolatedUserModeInformation + SystemHardwareSecurityTestInterfaceResultsInformation + SystemSingleModuleInformation + SystemAllowedCpuSetsInformation + SystemDmaProtectionInformation + SystemInterruptCpuSetsInformation + SystemSecureBootPolicyFullInformation + SystemCodeIntegrityPolicyFullInformation + SystemAffinitizedInterruptProcessorInformation + SystemRootSiloInformation +) + +type RTL_PROCESS_MODULE_INFORMATION struct { + Section Handle + MappedBase uintptr + ImageBase uintptr + ImageSize uint32 + Flags uint32 + LoadOrderIndex uint16 + InitOrderIndex uint16 + LoadCount uint16 + OffsetToFileName uint16 + FullPathName [256]byte +} + +type RTL_PROCESS_MODULES struct { + NumberOfModules uint32 + Modules [1]RTL_PROCESS_MODULE_INFORMATION +} + // Constants for LocalAlloc flags. const ( LMEM_FIXED = 0x0 @@ -2700,6 +3077,22 @@ var ( RT_MANIFEST ResourceID = 24 ) +type VS_FIXEDFILEINFO struct { + Signature uint32 + StrucVersion uint32 + FileVersionMS uint32 + FileVersionLS uint32 + ProductVersionMS uint32 + ProductVersionLS uint32 + FileFlagsMask uint32 + FileFlags uint32 + FileOS uint32 + FileType uint32 + FileSubtype uint32 + FileDateMS uint32 + FileDateLS uint32 +} + type COAUTHIDENTITY struct { User *uint16 UserLength uint32 @@ -2773,3 +3166,9 @@ const ( // Flag for QueryFullProcessImageName. const PROCESS_NAME_NATIVE = 1 + +type ModuleInfo struct { + BaseOfDll uintptr + SizeOfImage uint32 + EntryPoint uintptr +} diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 2083ec376..1055d47ed 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -36,6 +36,7 @@ func errnoErr(e syscall.Errno) error { } var ( + modCfgMgr32 = NewLazySystemDLL("CfgMgr32.dll") modadvapi32 = NewLazySystemDLL("advapi32.dll") modcrypt32 = NewLazySystemDLL("crypt32.dll") moddnsapi = NewLazySystemDLL("dnsapi.dll") @@ -48,13 +49,19 @@ var ( modpsapi = NewLazySystemDLL("psapi.dll") modsechost = NewLazySystemDLL("sechost.dll") modsecur32 = NewLazySystemDLL("secur32.dll") + modsetupapi = NewLazySystemDLL("setupapi.dll") modshell32 = NewLazySystemDLL("shell32.dll") moduser32 = NewLazySystemDLL("user32.dll") moduserenv = NewLazySystemDLL("userenv.dll") + modversion = NewLazySystemDLL("version.dll") modwintrust = NewLazySystemDLL("wintrust.dll") modws2_32 = NewLazySystemDLL("ws2_32.dll") modwtsapi32 = NewLazySystemDLL("wtsapi32.dll") + procCM_Get_DevNode_Status = modCfgMgr32.NewProc("CM_Get_DevNode_Status") + procCM_Get_Device_Interface_ListW = modCfgMgr32.NewProc("CM_Get_Device_Interface_ListW") + procCM_Get_Device_Interface_List_SizeW = modCfgMgr32.NewProc("CM_Get_Device_Interface_List_SizeW") + procCM_MapCrToWin32Err = modCfgMgr32.NewProc("CM_MapCrToWin32Err") procAdjustTokenGroups = modadvapi32.NewProc("AdjustTokenGroups") procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid") @@ -114,6 +121,7 @@ var ( procOpenThreadToken = modadvapi32.NewProc("OpenThreadToken") procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W") procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW") + procQueryServiceDynamicInformation = modadvapi32.NewProc("QueryServiceDynamicInformation") procQueryServiceLockStatusW = modadvapi32.NewProc("QueryServiceLockStatusW") procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus") procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx") @@ -124,6 +132,7 @@ var ( procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW") + procRegisterServiceCtrlHandlerExW = modadvapi32.NewProc("RegisterServiceCtrlHandlerExW") procReportEventW = modadvapi32.NewProc("ReportEventW") procRevertToSelf = modadvapi32.NewProc("RevertToSelf") procSetEntriesInAclW = modadvapi32.NewProc("SetEntriesInAclW") @@ -196,6 +205,7 @@ var ( procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") procExitProcess = modkernel32.NewProc("ExitProcess") + procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") procFindClose = modkernel32.NewProc("FindClose") procFindCloseChangeNotification = modkernel32.NewProc("FindCloseChangeNotification") procFindFirstChangeNotificationW = modkernel32.NewProc("FindFirstChangeNotificationW") @@ -285,6 +295,8 @@ var ( procLockFileEx = modkernel32.NewProc("LockFileEx") procLockResource = modkernel32.NewProc("LockResource") procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") + procModule32FirstW = modkernel32.NewProc("Module32FirstW") + procModule32NextW = modkernel32.NewProc("Module32NextW") procMoveFileExW = modkernel32.NewProc("MoveFileExW") procMoveFileW = modkernel32.NewProc("MoveFileW") procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") @@ -303,6 +315,7 @@ var ( procReadConsoleW = modkernel32.NewProc("ReadConsoleW") procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW") procReadFile = modkernel32.NewProc("ReadFile") + procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory") procReleaseMutex = modkernel32.NewProc("ReleaseMutex") procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") procResetEvent = modkernel32.NewProc("ResetEvent") @@ -345,12 +358,16 @@ var ( procVirtualFree = modkernel32.NewProc("VirtualFree") procVirtualLock = modkernel32.NewProc("VirtualLock") procVirtualProtect = modkernel32.NewProc("VirtualProtect") + procVirtualProtectEx = modkernel32.NewProc("VirtualProtectEx") + procVirtualQuery = modkernel32.NewProc("VirtualQuery") + procVirtualQueryEx = modkernel32.NewProc("VirtualQueryEx") procVirtualUnlock = modkernel32.NewProc("VirtualUnlock") procWTSGetActiveConsoleSessionId = modkernel32.NewProc("WTSGetActiveConsoleSessionId") procWaitForMultipleObjects = modkernel32.NewProc("WaitForMultipleObjects") procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject") procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") procWriteFile = modkernel32.NewProc("WriteFile") + procWriteProcessMemory = modkernel32.NewProc("WriteProcessMemory") procAcceptEx = modmswsock.NewProc("AcceptEx") procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs") procTransmitFile = modmswsock.NewProc("TransmitFile") @@ -360,8 +377,13 @@ var ( procNtCreateFile = modntdll.NewProc("NtCreateFile") procNtCreateNamedPipeFile = modntdll.NewProc("NtCreateNamedPipeFile") procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess") + procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation") + procNtSetInformationFile = modntdll.NewProc("NtSetInformationFile") procNtSetInformationProcess = modntdll.NewProc("NtSetInformationProcess") + procNtSetSystemInformation = modntdll.NewProc("NtSetSystemInformation") + procRtlAddFunctionTable = modntdll.NewProc("RtlAddFunctionTable") procRtlDefaultNpAcl = modntdll.NewProc("RtlDefaultNpAcl") + procRtlDeleteFunctionTable = modntdll.NewProc("RtlDeleteFunctionTable") procRtlDosPathNameToNtPathName_U_WithStatus = modntdll.NewProc("RtlDosPathNameToNtPathName_U_WithStatus") procRtlDosPathNameToRelativeNtPathName_U_WithStatus = modntdll.NewProc("RtlDosPathNameToRelativeNtPathName_U_WithStatus") procRtlGetCurrentPeb = modntdll.NewProc("RtlGetCurrentPeb") @@ -377,11 +399,44 @@ var ( procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") procCoUninitialize = modole32.NewProc("CoUninitialize") procStringFromGUID2 = modole32.NewProc("StringFromGUID2") + procEnumProcessModules = modpsapi.NewProc("EnumProcessModules") + procEnumProcessModulesEx = modpsapi.NewProc("EnumProcessModulesEx") procEnumProcesses = modpsapi.NewProc("EnumProcesses") + procGetModuleBaseNameW = modpsapi.NewProc("GetModuleBaseNameW") + procGetModuleFileNameExW = modpsapi.NewProc("GetModuleFileNameExW") + procGetModuleInformation = modpsapi.NewProc("GetModuleInformation") procSubscribeServiceChangeNotifications = modsechost.NewProc("SubscribeServiceChangeNotifications") procUnsubscribeServiceChangeNotifications = modsechost.NewProc("UnsubscribeServiceChangeNotifications") procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") procTranslateNameW = modsecur32.NewProc("TranslateNameW") + procSetupDiBuildDriverInfoList = modsetupapi.NewProc("SetupDiBuildDriverInfoList") + procSetupDiCallClassInstaller = modsetupapi.NewProc("SetupDiCallClassInstaller") + procSetupDiCancelDriverInfoSearch = modsetupapi.NewProc("SetupDiCancelDriverInfoSearch") + procSetupDiClassGuidsFromNameExW = modsetupapi.NewProc("SetupDiClassGuidsFromNameExW") + procSetupDiClassNameFromGuidExW = modsetupapi.NewProc("SetupDiClassNameFromGuidExW") + procSetupDiCreateDeviceInfoListExW = modsetupapi.NewProc("SetupDiCreateDeviceInfoListExW") + procSetupDiCreateDeviceInfoW = modsetupapi.NewProc("SetupDiCreateDeviceInfoW") + procSetupDiDestroyDeviceInfoList = modsetupapi.NewProc("SetupDiDestroyDeviceInfoList") + procSetupDiDestroyDriverInfoList = modsetupapi.NewProc("SetupDiDestroyDriverInfoList") + procSetupDiEnumDeviceInfo = modsetupapi.NewProc("SetupDiEnumDeviceInfo") + procSetupDiEnumDriverInfoW = modsetupapi.NewProc("SetupDiEnumDriverInfoW") + procSetupDiGetClassDevsExW = modsetupapi.NewProc("SetupDiGetClassDevsExW") + procSetupDiGetClassInstallParamsW = modsetupapi.NewProc("SetupDiGetClassInstallParamsW") + procSetupDiGetDeviceInfoListDetailW = modsetupapi.NewProc("SetupDiGetDeviceInfoListDetailW") + procSetupDiGetDeviceInstallParamsW = modsetupapi.NewProc("SetupDiGetDeviceInstallParamsW") + procSetupDiGetDeviceInstanceIdW = modsetupapi.NewProc("SetupDiGetDeviceInstanceIdW") + procSetupDiGetDevicePropertyW = modsetupapi.NewProc("SetupDiGetDevicePropertyW") + procSetupDiGetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiGetDeviceRegistryPropertyW") + procSetupDiGetDriverInfoDetailW = modsetupapi.NewProc("SetupDiGetDriverInfoDetailW") + procSetupDiGetSelectedDevice = modsetupapi.NewProc("SetupDiGetSelectedDevice") + procSetupDiGetSelectedDriverW = modsetupapi.NewProc("SetupDiGetSelectedDriverW") + procSetupDiOpenDevRegKey = modsetupapi.NewProc("SetupDiOpenDevRegKey") + procSetupDiSetClassInstallParamsW = modsetupapi.NewProc("SetupDiSetClassInstallParamsW") + procSetupDiSetDeviceInstallParamsW = modsetupapi.NewProc("SetupDiSetDeviceInstallParamsW") + procSetupDiSetDeviceRegistryPropertyW = modsetupapi.NewProc("SetupDiSetDeviceRegistryPropertyW") + procSetupDiSetSelectedDevice = modsetupapi.NewProc("SetupDiSetSelectedDevice") + procSetupDiSetSelectedDriverW = modsetupapi.NewProc("SetupDiSetSelectedDriverW") + procSetupUninstallOEMInfW = modsetupapi.NewProc("SetupUninstallOEMInfW") procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") procShellExecuteW = modshell32.NewProc("ShellExecuteW") @@ -392,6 +447,9 @@ var ( procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") + procGetFileVersionInfoSizeW = modversion.NewProc("GetFileVersionInfoSizeW") + procGetFileVersionInfoW = modversion.NewProc("GetFileVersionInfoW") + procVerQueryValueW = modversion.NewProc("VerQueryValueW") procWinVerifyTrustEx = modwintrust.NewProc("WinVerifyTrustEx") procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW") procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW") @@ -426,6 +484,30 @@ var ( procWTSQueryUserToken = modwtsapi32.NewProc("WTSQueryUserToken") ) +func cm_Get_DevNode_Status(status *uint32, problemNumber *uint32, devInst DEVINST, flags uint32) (ret CONFIGRET) { + r0, _, _ := syscall.Syscall6(procCM_Get_DevNode_Status.Addr(), 4, uintptr(unsafe.Pointer(status)), uintptr(unsafe.Pointer(problemNumber)), uintptr(devInst), uintptr(flags), 0, 0) + ret = CONFIGRET(r0) + return +} + +func cm_Get_Device_Interface_List(interfaceClass *GUID, deviceID *uint16, buffer *uint16, bufferLen uint32, flags uint32) (ret CONFIGRET) { + r0, _, _ := syscall.Syscall6(procCM_Get_Device_Interface_ListW.Addr(), 5, uintptr(unsafe.Pointer(interfaceClass)), uintptr(unsafe.Pointer(deviceID)), uintptr(unsafe.Pointer(buffer)), uintptr(bufferLen), uintptr(flags), 0) + ret = CONFIGRET(r0) + return +} + +func cm_Get_Device_Interface_List_Size(len *uint32, interfaceClass *GUID, deviceID *uint16, flags uint32) (ret CONFIGRET) { + r0, _, _ := syscall.Syscall6(procCM_Get_Device_Interface_List_SizeW.Addr(), 4, uintptr(unsafe.Pointer(len)), uintptr(unsafe.Pointer(interfaceClass)), uintptr(unsafe.Pointer(deviceID)), uintptr(flags), 0, 0) + ret = CONFIGRET(r0) + return +} + +func cm_MapCrToWin32Err(configRet CONFIGRET, defaultWin32Error Errno) (ret Errno) { + r0, _, _ := syscall.Syscall(procCM_MapCrToWin32Err.Addr(), 2, uintptr(configRet), uintptr(defaultWin32Error), 0) + ret = Errno(r0) + return +} + func AdjustTokenGroups(token Token, resetToDefault bool, newstate *Tokengroups, buflen uint32, prevstate *Tokengroups, returnlen *uint32) (err error) { var _p0 uint32 if resetToDefault { @@ -956,6 +1038,18 @@ func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, buf return } +func QueryServiceDynamicInformation(service Handle, infoLevel uint32, dynamicInfo unsafe.Pointer) (err error) { + err = procQueryServiceDynamicInformation.Find() + if err != nil { + return + } + r1, _, e1 := syscall.Syscall(procQueryServiceDynamicInformation.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(dynamicInfo)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) { r1, _, e1 := syscall.Syscall6(procQueryServiceLockStatusW.Addr(), 4, uintptr(mgr), uintptr(unsafe.Pointer(lockStatus)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0) if r1 == 0 { @@ -1045,6 +1139,15 @@ func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Hand return } +func RegisterServiceCtrlHandlerEx(serviceName *uint16, handlerProc uintptr, context uintptr) (handle Handle, err error) { + r0, _, e1 := syscall.Syscall(procRegisterServiceCtrlHandlerExW.Addr(), 3, uintptr(unsafe.Pointer(serviceName)), uintptr(handlerProc), uintptr(context)) + handle = Handle(r0) + if handle == 0 { + err = errnoErr(e1) + } + return +} + func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) { r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData))) if r1 == 0 { @@ -1674,6 +1777,15 @@ func ExitProcess(exitcode uint32) { return } +func ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) + n = uint32(r0) + if n == 0 { + err = errnoErr(e1) + } + return +} + func FindClose(handle Handle) (err error) { r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0) if r1 == 0 { @@ -2457,6 +2569,22 @@ func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow ui return } +func Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procModule32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(moduleEntry)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) { + r1, _, e1 := syscall.Syscall(procModule32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(moduleEntry)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) { r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) if r1 == 0 { @@ -2631,6 +2759,14 @@ func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) ( return } +func ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procReadProcessMemory.Addr(), 5, uintptr(process), uintptr(baseAddress), uintptr(unsafe.Pointer(buffer)), uintptr(size), uintptr(unsafe.Pointer(numberOfBytesRead)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func ReleaseMutex(mutex Handle) (err error) { r1, _, e1 := syscall.Syscall(procReleaseMutex.Addr(), 1, uintptr(mutex), 0, 0) if r1 == 0 { @@ -2985,6 +3121,30 @@ func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect return } +func VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procVirtualProtectEx.Addr(), 5, uintptr(process), uintptr(address), uintptr(size), uintptr(newProtect), uintptr(unsafe.Pointer(oldProtect)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procVirtualQuery.Addr(), 3, uintptr(address), uintptr(unsafe.Pointer(buffer)), uintptr(length)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procVirtualQueryEx.Addr(), 4, uintptr(process), uintptr(address), uintptr(unsafe.Pointer(buffer)), uintptr(length), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func VirtualUnlock(addr uintptr, length uintptr) (err error) { r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0) if r1 == 0 { @@ -3041,6 +3201,14 @@ func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) return } +func WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procWriteProcessMemory.Addr(), 5, uintptr(process), uintptr(baseAddress), uintptr(unsafe.Pointer(buffer)), uintptr(size), uintptr(unsafe.Pointer(numberOfBytesWritten)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) { r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0) if r1 == 0 { @@ -3110,6 +3278,22 @@ func NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe return } +func NtQuerySystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32, retLen *uint32) (ntstatus error) { + r0, _, _ := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(sysInfoClass), uintptr(sysInfo), uintptr(sysInfoLen), uintptr(unsafe.Pointer(retLen)), 0, 0) + if r0 != 0 { + ntstatus = NTStatus(r0) + } + return +} + +func NtSetInformationFile(handle Handle, iosb *IO_STATUS_BLOCK, inBuffer *byte, inBufferLen uint32, class uint32) (ntstatus error) { + r0, _, _ := syscall.Syscall6(procNtSetInformationFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(iosb)), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferLen), uintptr(class), 0) + if r0 != 0 { + ntstatus = NTStatus(r0) + } + return +} + func NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) { r0, _, _ := syscall.Syscall6(procNtSetInformationProcess.Addr(), 4, uintptr(proc), uintptr(procInfoClass), uintptr(procInfo), uintptr(procInfoLen), 0, 0) if r0 != 0 { @@ -3118,6 +3302,20 @@ func NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.P return } +func NtSetSystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32) (ntstatus error) { + r0, _, _ := syscall.Syscall(procNtSetSystemInformation.Addr(), 3, uintptr(sysInfoClass), uintptr(sysInfo), uintptr(sysInfoLen)) + if r0 != 0 { + ntstatus = NTStatus(r0) + } + return +} + +func RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) { + r0, _, _ := syscall.Syscall(procRtlAddFunctionTable.Addr(), 3, uintptr(unsafe.Pointer(functionTable)), uintptr(entryCount), uintptr(baseAddress)) + ret = r0 != 0 + return +} + func RtlDefaultNpAcl(acl **ACL) (ntstatus error) { r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(acl)), 0, 0) if r0 != 0 { @@ -3126,6 +3324,12 @@ func RtlDefaultNpAcl(acl **ACL) (ntstatus error) { return } +func RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) { + r0, _, _ := syscall.Syscall(procRtlDeleteFunctionTable.Addr(), 1, uintptr(unsafe.Pointer(functionTable)), 0, 0) + ret = r0 != 0 + return +} + func RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) { r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U_WithStatus.Addr(), 4, uintptr(unsafe.Pointer(dosName)), uintptr(unsafe.Pointer(ntName)), uintptr(unsafe.Pointer(ntFileNamePart)), uintptr(unsafe.Pointer(relativeName)), 0, 0) if r0 != 0 { @@ -3225,6 +3429,22 @@ func stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) { return } +func EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procEnumProcessModules.Addr(), 4, uintptr(process), uintptr(unsafe.Pointer(module)), uintptr(cb), uintptr(unsafe.Pointer(cbNeeded)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procEnumProcessModulesEx.Addr(), 5, uintptr(process), uintptr(unsafe.Pointer(module)), uintptr(cb), uintptr(unsafe.Pointer(cbNeeded)), uintptr(filterFlag), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) { var _p0 *uint32 if len(processIds) > 0 { @@ -3237,6 +3457,30 @@ func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) { return } +func GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetModuleBaseNameW.Addr(), 4, uintptr(process), uintptr(module), uintptr(unsafe.Pointer(baseName)), uintptr(size), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetModuleFileNameExW.Addr(), 4, uintptr(process), uintptr(module), uintptr(unsafe.Pointer(filename)), uintptr(size), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procGetModuleInformation.Addr(), 4, uintptr(process), uintptr(module), uintptr(unsafe.Pointer(modinfo)), uintptr(cb), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) { ret = procSubscribeServiceChangeNotifications.Find() if ret != nil { @@ -3274,6 +3518,233 @@ func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint return } +func SetupDiBuildDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiBuildDriverInfoList.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiCallClassInstaller(installFunction DI_FUNCTION, deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiCallClassInstaller.Addr(), 3, uintptr(installFunction), uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiCancelDriverInfoSearch(deviceInfoSet DevInfo) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiCancelDriverInfoSearch.Addr(), 1, uintptr(deviceInfoSet), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiClassGuidsFromNameEx(className *uint16, classGuidList *GUID, classGuidListSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiClassGuidsFromNameExW.Addr(), 6, uintptr(unsafe.Pointer(className)), uintptr(unsafe.Pointer(classGuidList)), uintptr(classGuidListSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(unsafe.Pointer(machineName)), uintptr(reserved)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiClassNameFromGuidEx(classGUID *GUID, className *uint16, classNameSize uint32, requiredSize *uint32, machineName *uint16, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiClassNameFromGuidExW.Addr(), 6, uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(className)), uintptr(classNameSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(unsafe.Pointer(machineName)), uintptr(reserved)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiCreateDeviceInfoListEx(classGUID *GUID, hwndParent uintptr, machineName *uint16, reserved uintptr) (handle DevInfo, err error) { + r0, _, e1 := syscall.Syscall6(procSetupDiCreateDeviceInfoListExW.Addr(), 4, uintptr(unsafe.Pointer(classGUID)), uintptr(hwndParent), uintptr(unsafe.Pointer(machineName)), uintptr(reserved), 0, 0) + handle = DevInfo(r0) + if handle == DevInfo(InvalidHandle) { + err = errnoErr(e1) + } + return +} + +func setupDiCreateDeviceInfo(deviceInfoSet DevInfo, DeviceName *uint16, classGUID *GUID, DeviceDescription *uint16, hwndParent uintptr, CreationFlags DICD, deviceInfoData *DevInfoData) (err error) { + r1, _, e1 := syscall.Syscall9(procSetupDiCreateDeviceInfoW.Addr(), 7, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(DeviceName)), uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(DeviceDescription)), uintptr(hwndParent), uintptr(CreationFlags), uintptr(unsafe.Pointer(deviceInfoData)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiDestroyDeviceInfoList(deviceInfoSet DevInfo) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiDestroyDeviceInfoList.Addr(), 1, uintptr(deviceInfoSet), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiDestroyDriverInfoList(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiDestroyDriverInfoList.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiEnumDeviceInfo(deviceInfoSet DevInfo, memberIndex uint32, deviceInfoData *DevInfoData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiEnumDeviceInfo.Addr(), 3, uintptr(deviceInfoSet), uintptr(memberIndex), uintptr(unsafe.Pointer(deviceInfoData))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiEnumDriverInfo(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverType SPDIT, memberIndex uint32, driverInfoData *DrvInfoData) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiEnumDriverInfoW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(driverType), uintptr(memberIndex), uintptr(unsafe.Pointer(driverInfoData)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetClassDevsEx(classGUID *GUID, Enumerator *uint16, hwndParent uintptr, Flags DIGCF, deviceInfoSet DevInfo, machineName *uint16, reserved uintptr) (handle DevInfo, err error) { + r0, _, e1 := syscall.Syscall9(procSetupDiGetClassDevsExW.Addr(), 7, uintptr(unsafe.Pointer(classGUID)), uintptr(unsafe.Pointer(Enumerator)), uintptr(hwndParent), uintptr(Flags), uintptr(deviceInfoSet), uintptr(unsafe.Pointer(machineName)), uintptr(reserved), 0, 0) + handle = DevInfo(r0) + if handle == DevInfo(InvalidHandle) { + err = errnoErr(e1) + } + return +} + +func SetupDiGetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32, requiredSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiGetClassInstallParamsW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), uintptr(unsafe.Pointer(requiredSize)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetDeviceInfoListDetail(deviceInfoSet DevInfo, deviceInfoSetDetailData *DevInfoListDetailData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiGetDeviceInfoListDetailW.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoSetDetailData)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiGetDeviceInstallParamsW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(deviceInstallParams))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetDeviceInstanceId(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, instanceId *uint16, instanceIdSize uint32, instanceIdRequiredSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiGetDeviceInstanceIdW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(instanceId)), uintptr(instanceIdSize), uintptr(unsafe.Pointer(instanceIdRequiredSize)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetDeviceProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, propertyKey *DEVPROPKEY, propertyType *DEVPROPTYPE, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32, flags uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procSetupDiGetDevicePropertyW.Addr(), 8, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(propertyKey)), uintptr(unsafe.Pointer(propertyType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), uintptr(unsafe.Pointer(requiredSize)), uintptr(flags), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyRegDataType *uint32, propertyBuffer *byte, propertyBufferSize uint32, requiredSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall9(procSetupDiGetDeviceRegistryPropertyW.Addr(), 7, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(property), uintptr(unsafe.Pointer(propertyRegDataType)), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), uintptr(unsafe.Pointer(requiredSize)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetDriverInfoDetail(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData, driverInfoDetailData *DrvInfoDetailData, driverInfoDetailDataSize uint32, requiredSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiGetDriverInfoDetailW.Addr(), 6, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData)), uintptr(unsafe.Pointer(driverInfoDetailData)), uintptr(driverInfoDetailDataSize), uintptr(unsafe.Pointer(requiredSize))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiGetSelectedDevice.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiGetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiGetSelectedDriverW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiOpenDevRegKey(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, Scope DICS_FLAG, HwProfile uint32, KeyType DIREG, samDesired uint32) (key Handle, err error) { + r0, _, e1 := syscall.Syscall6(procSetupDiOpenDevRegKey.Addr(), 6, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(Scope), uintptr(HwProfile), uintptr(KeyType), uintptr(samDesired)) + key = Handle(r0) + if key == InvalidHandle { + err = errnoErr(e1) + } + return +} + +func SetupDiSetClassInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, classInstallParams *ClassInstallHeader, classInstallParamsSize uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiSetClassInstallParamsW.Addr(), 4, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(classInstallParams)), uintptr(classInstallParamsSize), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiSetDeviceInstallParams(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, deviceInstallParams *DevInstallParams) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiSetDeviceInstallParamsW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(deviceInstallParams))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupDiSetDeviceRegistryProperty(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, property SPDRP, propertyBuffer *byte, propertyBufferSize uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procSetupDiSetDeviceRegistryPropertyW.Addr(), 5, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(property), uintptr(unsafe.Pointer(propertyBuffer)), uintptr(propertyBufferSize), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiSetSelectedDevice(deviceInfoSet DevInfo, deviceInfoData *DevInfoData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiSetSelectedDevice.Addr(), 2, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func SetupDiSetSelectedDriver(deviceInfoSet DevInfo, deviceInfoData *DevInfoData, driverInfoData *DrvInfoData) (err error) { + r1, _, e1 := syscall.Syscall(procSetupDiSetSelectedDriverW.Addr(), 3, uintptr(deviceInfoSet), uintptr(unsafe.Pointer(deviceInfoData)), uintptr(unsafe.Pointer(driverInfoData))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func setupUninstallOEMInf(infFileName *uint16, flags SUOI, reserved uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procSetupUninstallOEMInfW.Addr(), 3, uintptr(unsafe.Pointer(infFileName)), uintptr(flags), uintptr(reserved)) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) { r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0) argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0)) @@ -3359,6 +3830,58 @@ func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) { return } +func GetFileVersionInfoSize(filename string, zeroHandle *Handle) (bufSize uint32, err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(filename) + if err != nil { + return + } + return _GetFileVersionInfoSize(_p0, zeroHandle) +} + +func _GetFileVersionInfoSize(filename *uint16, zeroHandle *Handle) (bufSize uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetFileVersionInfoSizeW.Addr(), 2, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(zeroHandle)), 0) + bufSize = uint32(r0) + if bufSize == 0 { + err = errnoErr(e1) + } + return +} + +func GetFileVersionInfo(filename string, handle uint32, bufSize uint32, buffer unsafe.Pointer) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(filename) + if err != nil { + return + } + return _GetFileVersionInfo(_p0, handle, bufSize, buffer) +} + +func _GetFileVersionInfo(filename *uint16, handle uint32, bufSize uint32, buffer unsafe.Pointer) (err error) { + r1, _, e1 := syscall.Syscall6(procGetFileVersionInfoW.Addr(), 4, uintptr(unsafe.Pointer(filename)), uintptr(handle), uintptr(bufSize), uintptr(buffer), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + +func VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) { + var _p0 *uint16 + _p0, err = syscall.UTF16PtrFromString(subBlock) + if err != nil { + return + } + return _VerQueryValue(block, _p0, pointerToBufferPointer, bufSize) +} + +func _VerQueryValue(block unsafe.Pointer, subBlock *uint16, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) { + r1, _, e1 := syscall.Syscall6(procVerQueryValueW.Addr(), 4, uintptr(block), uintptr(unsafe.Pointer(subBlock)), uintptr(pointerToBufferPointer), uintptr(unsafe.Pointer(bufSize)), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) { r0, _, _ := syscall.Syscall(procWinVerifyTrustEx.Addr(), 3, uintptr(hwnd), uintptr(unsafe.Pointer(actionId)), uintptr(unsafe.Pointer(data))) if r0 != 0 { diff --git a/vendor/modules.txt b/vendor/modules.txt index 3b3004669..6469c1ef4 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -50,6 +50,12 @@ github.com/antchfx/htmlquery # github.com/antchfx/xpath v1.2.0 ## explicit; go 1.14 github.com/antchfx/xpath +# github.com/apenwarr/fixconsole v0.0.0-20191012055117-5a9f6489cc29 +## explicit; go 1.12 +github.com/apenwarr/fixconsole +# github.com/apenwarr/w32 v0.0.0-20190407065021-aa00fece76ab +## explicit +github.com/apenwarr/w32 # github.com/chromedp/cdproto v0.0.0-20210622022015-fe1827b46b84 ## explicit; go 1.14 github.com/chromedp/cdproto @@ -130,6 +136,16 @@ github.com/fvbommel/sortorder ## explicit github.com/go-chi/chi github.com/go-chi/chi/middleware +# github.com/go-chi/chi/v5 v5.0.0 +## explicit; go 1.16 +github.com/go-chi/chi/v5 +github.com/go-chi/chi/v5/middleware +# github.com/go-chi/httplog v0.2.1 +## explicit; go 1.14 +github.com/go-chi/httplog +# github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 +## explicit +github.com/go-toast/toast # github.com/gobwas/httphead v0.1.0 ## explicit; go 1.15 github.com/gobwas/httphead @@ -212,6 +228,12 @@ github.com/josharian/intern # github.com/json-iterator/go v1.1.11 ## explicit; go 1.12 github.com/json-iterator/go +# github.com/kermieisinthehouse/gosx-notifier v0.1.1 +## explicit +github.com/kermieisinthehouse/gosx-notifier +# github.com/kermieisinthehouse/systray v1.2.3 +## explicit; go 1.17 +github.com/kermieisinthehouse/systray # github.com/lucasb-eyer/go-colorful v1.2.0 ## explicit; go 1.12 github.com/lucasb-eyer/go-colorful @@ -249,6 +271,9 @@ github.com/natefinch/pie # github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 ## explicit github.com/nfnt/resize +# github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d +## explicit +github.com/nu7hatch/gouuid # github.com/pelletier/go-toml v1.9.4 ## explicit; go 1.12 github.com/pelletier/go-toml @@ -276,7 +301,7 @@ github.com/robertkrimen/otto/token # github.com/rs/cors v1.6.0 ## explicit github.com/rs/cors -# github.com/rs/zerolog v1.18.0 +# github.com/rs/zerolog v1.18.1-0.20200514152719-663cbb4c8469 ## explicit github.com/rs/zerolog github.com/rs/zerolog/internal/cbor @@ -399,7 +424,7 @@ golang.org/x/net/internal/iana golang.org/x/net/internal/socket golang.org/x/net/ipv4 golang.org/x/net/publicsuffix -# golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf +# golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e ## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/execabs @@ -407,6 +432,7 @@ golang.org/x/sys/internal/unsafeheader golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows +golang.org/x/sys/windows/svc # golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b ## explicit; go 1.17 golang.org/x/term