= ({ performers }) => {
) : (
- To use the performer tagger a stash-box instance needs to be
- configured.
+
Please see{" "}
diff --git a/ui/v2.5/src/components/Tagger/scenes/StashSearchResult.tsx b/ui/v2.5/src/components/Tagger/scenes/StashSearchResult.tsx
index 7debcbc90..f78b80ae7 100755
--- a/ui/v2.5/src/components/Tagger/scenes/StashSearchResult.tsx
+++ b/ui/v2.5/src/components/Tagger/scenes/StashSearchResult.tsx
@@ -23,6 +23,7 @@ import { OptionalField } from "../IncludeButton";
import { SceneTaggerModalsState } from "./sceneTaggerModals";
import PerformerResult from "./PerformerResult";
import StudioResult from "./StudioResult";
+import { useInitialState } from "src/hooks/state";
const getDurationStatus = (
scene: IScrapedScene,
@@ -214,7 +215,9 @@ const StashSearchResult: React.FC = ({
const [excludedFields, setExcludedFields] = useState>(
{}
);
- const [tagIDs, setTagIDs] = useState(getInitialTags());
+ const [tagIDs, setTagIDs, setInitialTagIDs] = useInitialState(
+ getInitialTags()
+ );
// map of original performer to id
const [performerIDs, setPerformerIDs] = useState<(string | undefined)[]>(
@@ -226,8 +229,8 @@ const StashSearchResult: React.FC = ({
);
useEffect(() => {
- setTagIDs(getInitialTags());
- }, [getInitialTags]);
+ setInitialTagIDs(getInitialTags());
+ }, [getInitialTags, setInitialTagIDs]);
useEffect(() => {
setPerformerIDs(getInitialPerformers());
@@ -566,6 +569,13 @@ const StashSearchResult: React.FC = ({
);
+ async function onCreateTag(t: GQL.ScrapedTag) {
+ const newTagID = await createNewTag(t);
+ if (newTagID !== undefined) {
+ setTagIDs([...tagIDs, newTagID]);
+ }
+ }
+
const renderTagsField = () => (
@@ -592,7 +602,7 @@ const StashSearchResult: React.FC
= ({
variant="secondary"
key={t.name}
onClick={() => {
- createNewTag(t);
+ onCreateTag(t);
}}
>
{t.name}
diff --git a/ui/v2.5/src/components/Tags/TagDetails/Tag.tsx b/ui/v2.5/src/components/Tags/TagDetails/Tag.tsx
index 99259be34..47bb279f8 100644
--- a/ui/v2.5/src/components/Tags/TagDetails/Tag.tsx
+++ b/ui/v2.5/src/components/Tags/TagDetails/Tag.tsx
@@ -1,4 +1,4 @@
-import { Tabs, Tab, Dropdown } from "react-bootstrap";
+import { Tabs, Tab, Dropdown, Badge } from "react-bootstrap";
import React, { useEffect, useState } from "react";
import { useParams, useHistory } from "react-router-dom";
import { FormattedMessage, useIntl } from "react-intl";
@@ -277,6 +277,7 @@ const TagPage: React.FC = ({ tag }) => {
onClearImage={() => {}}
onAutoTag={onAutoTag}
onDelete={onDelete}
+ classNames="mb-2"
customButtons={renderMergeButton()}
/>
>
@@ -297,27 +298,68 @@ const TagPage: React.FC = ({ tag }) => {
activeKey={activeTabKey}
onSelect={setActiveTabKey}
>
-
+
+ {intl.formatMessage({ id: "scenes" })}
+
+ {intl.formatNumber(tag.scene_count ?? 0)}
+
+
+ }
+ >
-
+
+ {intl.formatMessage({ id: "images" })}
+
+ {intl.formatNumber(tag.image_count ?? 0)}
+
+
+ }
+ >
+ {intl.formatMessage({ id: "galleries" })}
+
+ {intl.formatNumber(tag.gallery_count ?? 0)}
+
+
+ }
>
+ {intl.formatMessage({ id: "markers" })}
+
+ {intl.formatNumber(tag.scene_marker_count ?? 0)}
+
+
+ }
>
+ {intl.formatMessage({ id: "performers" })}
+
+ {intl.formatNumber(tag.performer_count ?? 0)}
+
+
+ }
>
diff --git a/ui/v2.5/src/components/Tags/TagDetails/TagEditPanel.tsx b/ui/v2.5/src/components/Tags/TagDetails/TagEditPanel.tsx
index 379550037..a59e8cea9 100644
--- a/ui/v2.5/src/components/Tags/TagDetails/TagEditPanel.tsx
+++ b/ui/v2.5/src/components/Tags/TagDetails/TagEditPanel.tsx
@@ -214,7 +214,7 @@ export const TagEditPanel: React.FC = ({
GQL.useImageIncrementOMutation({
variables: { id },
- update: (cache, data) =>
- updateImageO(id, cache, data.data?.imageIncrementO),
+ update: (cache, data) => {
+ updateImageO(id, cache, data.data?.imageIncrementO);
+ // impacts FindImages as well as FindImage
+ deleteCache([GQL.FindImagesDocument])(cache);
+ },
+ });
+
+export const mutateImageIncrementO = (id: string) =>
+ client.mutate({
+ mutation: GQL.ImageIncrementODocument,
+ variables: { id },
+ update: (cache, data) => {
+ updateImageO(id, cache, data.data?.imageIncrementO);
+ // impacts FindImages as well as FindImage
+ deleteCache([GQL.FindImagesDocument])(cache);
+ },
});
export const useImageDecrementO = (id: string) =>
GQL.useImageDecrementOMutation({
variables: { id },
- update: (cache, data) =>
- updateImageO(id, cache, data.data?.imageDecrementO),
+ update: (cache, data) => {
+ updateImageO(id, cache, data.data?.imageDecrementO);
+ // impacts FindImages as well as FindImage
+ deleteCache([GQL.FindImagesDocument])(cache);
+ },
+ });
+
+export const mutateImageDecrementO = (id: string) =>
+ client.mutate({
+ mutation: GQL.ImageDecrementODocument,
+ variables: { id },
+ update: (cache, data) => {
+ updateImageO(id, cache, data.data?.imageDecrementO);
+ // impacts FindImages as well as FindImage
+ deleteCache([GQL.FindImagesDocument])(cache);
+ },
});
export const useImageResetO = (id: string) =>
GQL.useImageResetOMutation({
variables: { id },
- update: (cache, data) => updateImageO(id, cache, data.data?.imageResetO),
+ update: (cache, data) => {
+ updateImageO(id, cache, data.data?.imageResetO);
+ // impacts FindImages as well as FindImage
+ deleteCache([GQL.FindImagesDocument])(cache);
+ },
+ });
+
+export const mutateImageResetO = (id: string) =>
+ client.mutate({
+ mutation: GQL.ImageResetODocument,
+ variables: { id },
+ update: (cache, data) => {
+ updateImageO(id, cache, data.data?.imageResetO);
+ // impacts FindImages as well as FindImage
+ deleteCache([GQL.FindImagesDocument])(cache);
+ },
});
const galleryMutationImpactedQueries = [
@@ -659,6 +702,14 @@ export const useMovieUpdate = () =>
update: deleteCache(movieMutationImpactedQueries),
});
+export const useBulkMovieUpdate = (input: GQL.BulkMovieUpdateInput) =>
+ GQL.useBulkMovieUpdateMutation({
+ variables: {
+ input,
+ },
+ update: deleteCache(movieMutationImpactedQueries),
+ });
+
export const useMovieDestroy = (input: GQL.MovieDestroyInput) =>
GQL.useMovieDestroyMutation({
variables: input,
@@ -1149,3 +1200,19 @@ export const stashBoxPerformerBatchQuery = (
},
},
});
+
+export const stashBoxSubmitSceneDraft = (
+ input: GQL.StashBoxDraftSubmissionInput
+) =>
+ client.mutate({
+ mutation: GQL.SubmitStashBoxSceneDraftDocument,
+ variables: { input },
+ });
+
+export const stashBoxSubmitPerformerDraft = (
+ input: GQL.StashBoxDraftSubmissionInput
+) =>
+ client.mutate({
+ mutation: GQL.SubmitStashBoxPerformerDraftDocument,
+ variables: { input },
+ });
diff --git a/ui/v2.5/src/docs/en/Contributing.md b/ui/v2.5/src/docs/en/Contributing.md
index c59092105..885253a0c 100644
--- a/ui/v2.5/src/docs/en/Contributing.md
+++ b/ui/v2.5/src/docs/en/Contributing.md
@@ -6,7 +6,7 @@ Financial contributions are welcomed and are accepted using [Open Collective](ht
## Development-related
-The Stash backend is written in golang with a sqlite database. The UI is written in react. Bug fixes, improvements and new features are welcomed. Please see the [README.md](https://github.com/stashapp/stash/raw/develop/README.md) file for details on how to get started. Assistance can be provided via our [Discord](https://discord.gg/2TsNFKt).
+The Stash backend is written in golang with a sqlite database. The UI is written in react. Bug fixes, improvements and new features are welcomed. Please see the [README.md](https://github.com/stashapp/stash/blob/develop/docs/DEVELOPMENT.md) file for details on how to get started. Assistance can be provided via our [Discord](https://discord.gg/2TsNFKt).
## Documentation
@@ -44,4 +44,4 @@ We welcome contributions for future improvements and features, and bug reports h
## Providing support
-Offering support for new users on [Discord](https://discord.gg/2TsNFKt) is also welcomed.
\ No newline at end of file
+Offering support for new users on [Discord](https://discord.gg/2TsNFKt) is also welcomed.
diff --git a/ui/v2.5/src/docs/en/Interactive.md b/ui/v2.5/src/docs/en/Interactive.md
index 53c4bd45e..831109aab 100644
--- a/ui/v2.5/src/docs/en/Interactive.md
+++ b/ui/v2.5/src/docs/en/Interactive.md
@@ -1,3 +1,5 @@
+# Interactivity
+
Stash currently supports syncing with Handy devices, using funscript files.
In order for stash to connect to your Handy device, the Handy Connection Key must be entered in Settings -> Interface.
diff --git a/ui/v2.5/src/docs/en/Interface.md b/ui/v2.5/src/docs/en/Interface.md
index 9307cd6a1..7bfe1722e 100644
--- a/ui/v2.5/src/docs/en/Interface.md
+++ b/ui/v2.5/src/docs/en/Interface.md
@@ -24,7 +24,7 @@ The maximum loop duration option allows looping of shorter videos. Set this valu
The stash UI can be customised using custom CSS. See [here](https://github.com/stashapp/stash/wiki/Custom-CSS-snippets) for a community-curated set of CSS snippets to customise your UI.
-[Stash Plex Theme](https://github.com/stashapp/stash/wiki/Stash-Plex-Theme) is a community created theme inspired by the popular Plex interface.
+[Stash Plex Theme](https://github.com/stashapp/stash/wiki/Theme-Plex) is a community created theme inspired by the popular Plex interface.
## Custom served folders
@@ -50,4 +50,4 @@ custom_served_folders:
The `background.png` and `noise.png` files can be placed in the `custom` folder, then in the custom css, the `./background.png` and `./noise.png` strings can be replaced with `/custom/background.png` and `/custom/noise.png` respectively.
-Other applications are to add custom UIs to stash, accessible via `/custom`.
\ No newline at end of file
+Other applications are to add custom UIs to stash, accessible via `/custom`.
diff --git a/ui/v2.5/src/docs/en/Introduction.md b/ui/v2.5/src/docs/en/Introduction.md
index e40f6c880..92c07a834 100644
--- a/ui/v2.5/src/docs/en/Introduction.md
+++ b/ui/v2.5/src/docs/en/Introduction.md
@@ -1,7 +1,7 @@
# Introduction
-Stash works by cataloging your media using the paths that you provide. Once you have [configured](/settings?tab=configuration) the locations where your media is stored, you can click the Scan button in [`Settings -> Tasks`](/settings?tab=tasks) and stash will begin scanning and importing your media into its library.
+Stash works by cataloging your media using the paths that you provide. Once you have [configured](/settings?tab=library) the locations where your media is stored, you can click the Scan button in [`Settings -> Tasks`](/settings?tab=tasks) and stash will begin scanning and importing your media into its library.
For the best experience, it is recommmended that after a scan is finished, that video previews and sprites are generated. You can do this in [`Settings -> Tasks`](/settings?tab=tasks). Note that currently it is only possible to perform one task at a time and there is no task queue, so the Generate task should be performed after Scan is complete.
-Once your media is imported, you are ready to begin creating Performers, Studios and Tags, and curating your content!
\ No newline at end of file
+Once your media is imported, you are ready to begin creating Performers, Studios and Tags, and curating your content!
diff --git a/ui/v2.5/src/docs/en/SceneFilenameParser.md b/ui/v2.5/src/docs/en/SceneFilenameParser.md
index 01da463fa..710bebcac 100644
--- a/ui/v2.5/src/docs/en/SceneFilenameParser.md
+++ b/ui/v2.5/src/docs/en/SceneFilenameParser.md
@@ -1,6 +1,6 @@
# Scene Filename Parser
-This tool parses the scene filenames in your library and allows setting the metadata from those filenames.
+[This tool](/sceneFilenameParser) parses the scene filenames in your library and allows setting the metadata from those filenames.
## Parser Options
diff --git a/ui/v2.5/src/docs/en/ScraperDevelopment.md b/ui/v2.5/src/docs/en/ScraperDevelopment.md
index a382fe2a0..29ee29ecd 100644
--- a/ui/v2.5/src/docs/en/ScraperDevelopment.md
+++ b/ui/v2.5/src/docs/en/ScraperDevelopment.md
@@ -273,7 +273,7 @@ Collectively, these configurations are known as mapped scraping configurations.
A mapped scraping configuration may contain a `common` field, and must contain `performer`, `scene`, `movie` or `gallery` depending on the scraping type it is configured for.
-Within the `performer`/`scene`/`movie`/`gallery` field are key/value pairs corresponding to the [golang fields](#object-fields) on the performer/scene object. These fields are case-sensitive.
+Within the `performer`/`scene`/`movie`/`gallery` field are key/value pairs corresponding to the [golang fields](/help/ScraperDevelopment.md#object-fields) on the performer/scene object. These fields are case-sensitive.
The values of these may be either a simple selector value, which tells the system where to get the value of the field from, or a more advanced configuration (see below). For example, for an xpath configuration:
@@ -319,11 +319,25 @@ The `common` field is used to configure selector fragments that can be reference
common:
$infoPiece: //div[@class="infoPiece"]/span
performer:
- Measurements: $infoPiece[text() = 'Measurements:']/../span[@class="smallInfo"]
+ Measurements: $infoPiece[text() = 'Measurements:']/../span[@class="smallInfo"]
```
The `Measurements` xpath string will replace `$infoPiece` with `//div[@class="infoPiece"]/span`, resulting in: `//div[@class="infoPiece"]/span[text() = 'Measurements:']/../span[@class="smallInfo"]`.
+> **⚠️ Note:** Recursive common fragments are **not** supported.
+Referencing a common fragment within another common fragment will cause an error. For example:
+```yaml
+common:
+ $info: //div[@class="info"]
+ # Referencing $info in $models will cause an error
+ $models: $info/a[@class="model"]
+scene:
+ Title: $info/h1
+ Performers:
+ Name: $models
+ URL: $models/@href
+```
+
### Post-processing options
Post-processing operations are contained in the `postProcess` key. Post-processing operations are performed in the order they are specified. The following post-processing operations are available:
@@ -822,4 +836,4 @@ Rating
Studio (see Studio Fields)
Tags (see Tag fields)
Performers (list of Performer fields)
-```
\ No newline at end of file
+```
diff --git a/ui/v2.5/src/hooks/Lightbox/Lightbox.tsx b/ui/v2.5/src/hooks/Lightbox/Lightbox.tsx
index 27bbca91b..49456641a 100644
--- a/ui/v2.5/src/hooks/Lightbox/Lightbox.tsx
+++ b/ui/v2.5/src/hooks/Lightbox/Lightbox.tsx
@@ -1,5 +1,4 @@
import React, { useCallback, useEffect, useRef, useState } from "react";
-import * as GQL from "src/core/generated-graphql";
import {
Button,
Col,
@@ -14,10 +13,20 @@ import Mousetrap from "mousetrap";
import debounce from "lodash/debounce";
import { Icon, LoadingIndicator } from "src/components/Shared";
-import { useInterval, usePageVisibility } from "src/hooks";
+import { useInterval, usePageVisibility, useToast } from "src/hooks";
import { FormattedMessage, useIntl } from "react-intl";
import { DisplayMode, LightboxImage, ScrollMode } from "./LightboxImage";
import { ConfigurationContext } from "../Config";
+import { Link } from "react-router-dom";
+import { RatingStars } from "src/components/Scenes/SceneDetails/RatingStars";
+import { OCounterButton } from "src/components/Scenes/SceneDetails/OCounterButton";
+import {
+ useImageUpdate,
+ mutateImageIncrementO,
+ mutateImageDecrementO,
+ mutateImageResetO,
+} from "src/core/StashService";
+import * as GQL from "src/core/generated-graphql";
const CLASSNAME = "Lightbox";
const CLASSNAME_HEADER = `${CLASSNAME}-header`;
@@ -27,6 +36,8 @@ const CLASSNAME_OPTIONS = `${CLASSNAME_HEADER}-options`;
const CLASSNAME_OPTIONS_ICON = `${CLASSNAME_OPTIONS}-icon`;
const CLASSNAME_OPTIONS_INLINE = `${CLASSNAME_OPTIONS}-inline`;
const CLASSNAME_RIGHT = `${CLASSNAME_HEADER}-right`;
+const CLASSNAME_FOOTER = `${CLASSNAME}-footer`;
+const CLASSNAME_FOOTER_LEFT = `${CLASSNAME_FOOTER}-left`;
const CLASSNAME_DISPLAY = `${CLASSNAME}-display`;
const CLASSNAME_CAROUSEL = `${CLASSNAME}-carousel`;
const CLASSNAME_INSTANT = `${CLASSNAME_CAROUSEL}-instant`;
@@ -40,9 +51,20 @@ const DEFAULT_SLIDESHOW_DELAY = 5000;
const SECONDS_TO_MS = 1000;
const MIN_VALID_INTERVAL_SECONDS = 1;
-type Image = Pick;
+interface IImagePaths {
+ image?: GQL.Maybe;
+ thumbnail?: GQL.Maybe;
+}
+export interface ILightboxImage {
+ id?: string;
+ title?: GQL.Maybe;
+ rating?: GQL.Maybe;
+ o_counter?: GQL.Maybe;
+ paths: IImagePaths;
+}
+
interface IProps {
- images: Image[];
+ images: ILightboxImage[];
isVisible: boolean;
isLoading: boolean;
initialIndex?: number;
@@ -64,6 +86,8 @@ export const LightboxComponent: React.FC = ({
pageCallback,
hide,
}) => {
+ const [updateImage] = useImageUpdate();
+
const [index, setIndex] = useState(null);
const oldIndex = useRef(null);
const [instantTransition, setInstantTransition] = useState(false);
@@ -71,7 +95,7 @@ export const LightboxComponent: React.FC = ({
const [isFullscreen, setFullscreen] = useState(false);
const [showOptions, setShowOptions] = useState(false);
- const oldImages = useRef([]);
+ const oldImages = useRef([]);
const [displayMode, setDisplayMode] = useState(DisplayMode.FIT_XY);
const oldDisplayMode = useRef(displayMode);
@@ -92,6 +116,7 @@ export const LightboxComponent: React.FC = ({
const allowNavigation = images.length > 1 || pageCallback;
+ const Toast = useToast();
const intl = useIntl();
const { configuration: config } = React.useContext(ConfigurationContext);
@@ -496,170 +521,236 @@ export const LightboxComponent: React.FC = ({
>
);
- const element = isVisible ? (
+ if (!isVisible) {
+ return <>>;
+ }
+
+ if (images.length === 0 || isLoading || isSwitchingPage) {
+ return ;
+ }
+
+ const currentImage = images[currentIndex];
+
+ function setRating(v: number | null) {
+ if (currentImage?.id) {
+ updateImage({
+ variables: {
+ input: {
+ id: currentImage.id,
+ rating: v,
+ },
+ },
+ });
+ }
+ }
+
+ async function onIncrementClick() {
+ if (currentImage.id === undefined) return;
+ try {
+ await mutateImageIncrementO(currentImage.id);
+ } catch (e) {
+ Toast.error(e);
+ }
+ }
+
+ async function onDecrementClick() {
+ if (currentImage.id === undefined) return;
+ try {
+ await mutateImageDecrementO(currentImage.id);
+ } catch (e) {
+ Toast.error(e);
+ }
+ }
+
+ async function onResetClick() {
+ if (currentImage.id === undefined) return;
+ try {
+ await mutateImageResetO(currentImage.id);
+ } catch (e) {
+ Toast.error(e);
+ }
+ }
+
+ return (
- {images.length > 0 && !isLoading && !isSwitchingPage ? (
- <>
-
-
-
- {pageHeader}
-
- {`${currentIndex + 1} / ${images.length}`}
-
-
-
-
-
-
-
setShowOptions(false)}
- >
- {({ placement, arrowProps, show: _show, ...props }) => (
-
- {optionsPopover}
-
- )}
-
-
-
-
-
-
- {slideshowEnabled && (
-
- )}
- {zoom !== 1 && (
-
- )}
- {document.fullscreenEnabled && (
-
- )}
+
+
+
+ {pageHeader}
+ {images.length > 1 ? (
+ {`${currentIndex + 1} / ${images.length}`}
+ ) : undefined}
+
+
+
+
+
setShowOptions(false)}
+ >
+ {({ placement, arrowProps, show: _show, ...props }) => (
+
+ {optionsPopover}
+
+ )}
+
+
+
+
-
- {allowNavigation && (
-
- )}
-
-
- {images.map((image, i) => (
-
- {i >= currentIndex - 1 && i <= currentIndex + 1 ? (
- setZoom(v)}
- resetPosition={resetPosition}
- />
- ) : undefined}
-
- ))}
-
-
- {allowNavigation && (
-
- )}
-
- {showNavigation && !isFullscreen && images.length > 1 && (
-
-
- {navItems}
-
-
+
+
)}
- >
- ) : (
-
- )}
-
- ) : (
- <>>
- );
+ {zoom !== 1 && (
+
+ )}
+ {document.fullscreenEnabled && (
+
+ )}
+
+
+
+
+ {allowNavigation && (
+
+ )}
- return element;
+
+ {images.map((image, i) => (
+
+ {i >= currentIndex - 1 && i <= currentIndex + 1 ? (
+ setZoom(v)}
+ resetPosition={resetPosition}
+ />
+ ) : undefined}
+
+ ))}
+
+
+ {allowNavigation && (
+
+ )}
+
+ {showNavigation && !isFullscreen && images.length > 1 && (
+
+
+ {navItems}
+
+
+ )}
+
+
+ {currentImage.id !== undefined && (
+ <>
+
+
+
+
{
+ setRating(v ?? null);
+ }}
+ />
+ >
+ )}
+
+
+ {currentImage.title && (
+ hide()}>
+ {currentImage.title ?? ""}
+
+ )}
+
+
+
+
+ );
};
diff --git a/ui/v2.5/src/hooks/Lightbox/context.tsx b/ui/v2.5/src/hooks/Lightbox/context.tsx
index 8980415af..c8e9bc106 100644
--- a/ui/v2.5/src/hooks/Lightbox/context.tsx
+++ b/ui/v2.5/src/hooks/Lightbox/context.tsx
@@ -1,11 +1,8 @@
import React, { useCallback, useState } from "react";
-import * as GQL from "src/core/generated-graphql";
-import { LightboxComponent } from "./Lightbox";
-
-type Image = Pick
;
+import { ILightboxImage, LightboxComponent } from "./Lightbox";
export interface IState {
- images: Image[];
+ images: ILightboxImage[];
isVisible: boolean;
isLoading: boolean;
showNavigation: boolean;
diff --git a/ui/v2.5/src/hooks/Lightbox/lightbox.scss b/ui/v2.5/src/hooks/Lightbox/lightbox.scss
index d759646c4..ab59bfb3e 100644
--- a/ui/v2.5/src/hooks/Lightbox/lightbox.scss
+++ b/ui/v2.5/src/hooks/Lightbox/lightbox.scss
@@ -9,23 +9,23 @@
top: 0;
z-index: 1040;
- .fa-icon {
- path {
- fill: white;
- }
- opacity: 0.4;
-
- &:hover {
- opacity: 1;
- }
- }
-
&-header {
align-items: center;
display: flex;
flex-shrink: 0;
height: 4rem;
+ .fa-icon {
+ path {
+ fill: white;
+ }
+ opacity: 0.4;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
&-left-spacer {
display: flex;
flex: 1;
@@ -72,11 +72,42 @@
}
}
+ &-footer {
+ align-items: center;
+ display: flex;
+ flex-shrink: 0;
+ height: 4.5rem;
+
+ & > div {
+ flex: 1;
+
+ &:nth-child(2) {
+ text-align: center;
+ }
+ }
+
+ .rating-stars {
+ padding-left: 0.38rem;
+ }
+
+ &-left {
+ display: flex;
+ flex-direction: column;
+ justify-content: start;
+ padding-left: 1em;
+ }
+
+ a {
+ color: $text-color;
+ font-weight: bold;
+ text-decoration: none;
+ }
+ }
+
&-display {
display: flex;
height: 100%;
justify-content: space-between;
- margin-bottom: 2rem;
position: relative;
}
@@ -125,7 +156,16 @@
.fa-icon {
height: 4rem;
+ opacity: 0.4;
width: 4rem;
+
+ path {
+ fill: white;
+ }
+
+ &:hover {
+ opacity: 1;
+ }
}
&:focus {
diff --git a/ui/v2.5/src/hooks/ListHook.tsx b/ui/v2.5/src/hooks/ListHook.tsx
index 3df899d48..ed3ea32fa 100644
--- a/ui/v2.5/src/hooks/ListHook.tsx
+++ b/ui/v2.5/src/hooks/ListHook.tsx
@@ -526,6 +526,7 @@ const RenderList = <
onAddCriterion={onAddCriterion}
onCancel={onCancelAddCriterion}
editingCriterion={editingCriterion}
+ existingCriterions={filter.criteria}
/>
)}
{newCriterion &&
diff --git a/ui/v2.5/src/hooks/state.ts b/ui/v2.5/src/hooks/state.ts
new file mode 100644
index 000000000..00ee32a91
--- /dev/null
+++ b/ui/v2.5/src/hooks/state.ts
@@ -0,0 +1,34 @@
+import React, { useCallback, Dispatch, SetStateAction } from "react";
+
+// useInitialState is an extension of the useState hook.
+// It maintains a state, but additionally exposes a setInitialState function.
+// When setInitialState is called, the current state is only updated if the current
+// state is unchanged from the initial state. This means that the current state will
+// only be updated if explicitly called, or if the initial state is changed and the current
+// state is not dirty.
+export function useInitialState(
+ initialValue: T
+): [T, Dispatch>, Dispatch] {
+ const [, setInitialValueInternal] = React.useState(initialValue);
+ const [value, setValue] = React.useState(initialValue);
+
+ const setInitialValue = useCallback((v: T) => {
+ setInitialValueInternal((currentInitial) => {
+ if (v === currentInitial) {
+ return currentInitial;
+ }
+
+ setValue((currentValue) => {
+ if (currentInitial === currentValue) {
+ return v;
+ }
+
+ return currentValue;
+ });
+
+ return v;
+ });
+ }, []);
+
+ return [value, setValue, setInitialValue];
+}
diff --git a/ui/v2.5/src/index.scss b/ui/v2.5/src/index.scss
index 2ac93c8d3..0a7399a80 100755
--- a/ui/v2.5/src/index.scss
+++ b/ui/v2.5/src/index.scss
@@ -216,6 +216,50 @@ textarea.text-input {
width: 100%;
}
+.preview-button {
+ align-items: center;
+ display: flex;
+ height: 100%;
+ justify-content: center;
+ position: absolute;
+ text-align: center;
+ width: 100%;
+
+ button.btn,
+ button.btn:not(:disabled):not(.disabled):hover,
+ button.btn:not(:disabled):not(.disabled):focus,
+ button.btn:not(:disabled):not(.disabled):active {
+ background: none;
+ border: none;
+ box-shadow: none;
+ }
+
+ .fa-icon {
+ color: $text-color;
+ filter: drop-shadow(2px 4px 6px black);
+ height: 5em;
+ opacity: 0;
+ transition: opacity 0.5s;
+ width: 5em;
+
+ &:hover {
+ opacity: 0.8;
+ }
+ }
+
+ @media (hover: none), (pointer: coarse) {
+ // always show preview button when hovering not supported
+ align-items: flex-end;
+ justify-content: right;
+
+ .fa-icon {
+ height: 3em;
+ opacity: 0.8;
+ width: 3em;
+ }
+ }
+}
+
/* this is a bit of a hack, because we can't supply direct class names
to the react-select controls */
/* stylelint-disable selector-class-pattern */
@@ -752,3 +796,7 @@ select {
background: url("data:image/svg+xml;utf8,")
no-repeat right 2px center;
}
+
+.left-spacing {
+ margin-left: 0.5em;
+}
diff --git a/ui/v2.5/src/locales/da-DK.json b/ui/v2.5/src/locales/da-DK.json
new file mode 100644
index 000000000..956a8757a
--- /dev/null
+++ b/ui/v2.5/src/locales/da-DK.json
@@ -0,0 +1,132 @@
+{
+ "actions": {
+ "add": "Tilføj",
+ "add_directory": "Tilføj mappe",
+ "add_entity": "Tilføj {entityType}",
+ "add_to_entity": "Tilføj til {entityType}",
+ "allow": "Tillad",
+ "allow_temporarily": "Tillad midlertidigt",
+ "apply": "Anvend",
+ "auto_tag": "Auto Tagge",
+ "backup": "Backup",
+ "browse_for_image": "Vælg billede…",
+ "cancel": "Afbryd",
+ "clean": "Rens",
+ "clear": "Ryd",
+ "clear_back_image": "Ryd bagerst billede",
+ "clear_front_image": "Ryd forrest billede",
+ "clear_image": "Ryd Billede",
+ "close": "Luk",
+ "confirm": "Bekræft",
+ "continue": "Forsæt",
+ "create": "Lav",
+ "create_entity": "Lav {entityType}",
+ "create_marker": "Lav Mærke",
+ "created_entity": "Lavet {entity_type}: {entity_name}",
+ "delete": "Slet",
+ "delete_entity": "Slet {entityType}",
+ "delete_file": "Slet fil",
+ "delete_generated_supporting_files": "Slet genereret filer",
+ "disallow": "Tillad ikke",
+ "download": "Download",
+ "download_backup": "Download Backup",
+ "edit": "Ændre",
+ "export": "Eksportere…",
+ "export_all": "Exportere alt…",
+ "find": "Find",
+ "finish": "Afslut",
+ "from_file": "Fra fil…",
+ "from_url": "Fra URL…",
+ "full_export": "Fuld Eksport",
+ "full_import": "Fuld Import",
+ "generate": "Generer",
+ "generate_thumb_default": "Generer standard thumbnail",
+ "generate_thumb_from_current": "Generer thumbnail fra nuværende",
+ "hash_migration": "hash migration",
+ "hide": "Skjul",
+ "identify": "identificer",
+ "ignore": "Ignorere",
+ "import": "Importer…",
+ "import_from_file": "Importer fra fil",
+ "merge": "Fusioner",
+ "merge_from": "Fusioner fra",
+ "merge_into": "Fusioner til",
+ "next_action": "Næste",
+ "not_running": "kører ikke",
+ "open_random": "Åben Tilfældig",
+ "overwrite": "Overskriv",
+ "play_random": "Afspil tilfældig",
+ "play_selected": "Afspil valgte",
+ "preview": "Forhåndsvisning",
+ "previous_action": "Tilbage",
+ "refresh": "Opdater",
+ "reload_plugins": "Genindlæs plugins",
+ "reload_scrapers": "Genindlæs scrapers",
+ "remove": "Fjern",
+ "rename_gen_files": "Omdøb genereret filer",
+ "rescan": "Genscan",
+ "reshuffle": "Bland om",
+ "running": "kører",
+ "save": "Gem",
+ "save_delete_settings": "Brug disse muligheder som standard når der slettes",
+ "save_filter": "Gem filter",
+ "scan": "Scan",
+ "scrape": "Skrabe",
+ "scrape_query": "Skrab forespørgsel",
+ "scrape_scene_fragment": "Skrab for fragment",
+ "scrape_with": "Skrab med…",
+ "search": "Søg",
+ "select_all": "Vælg Alt",
+ "select_folders": "Vælg mappe",
+ "select_none": "Vælg Ingen",
+ "selective_auto_tag": "Selektiv Auto Tag",
+ "selective_clean": "Selektiv Ryd",
+ "selective_scan": "Selektiv Scan",
+ "set_as_default": "Vælg som standard",
+ "set_back_image": "Bagerst billede…",
+ "set_front_image": "Forrest billede…",
+ "set_image": "Vælg billede…",
+ "show": "Vis",
+ "skip": "Spring over",
+ "stop": "Stop",
+ "tasks": {
+ "clean_confirm_message": "Er du sikker på, at du vil Rense? Dette vil slette databaseinformation og genereret indhold for alle scener og gallerier, der ikke længere findes i filsystemet.",
+ "dry_mode_selected": "Tør Tilstand valgt. Ingen egentlig sletning vil finde sted, kun logning.",
+ "import_warning": "Er du sikker på, at du vil importere? Dette vil slette databasen og genimportere fra dine eksporterede metadata."
+ },
+ "temp_disable": "Deaktiver midlertidigt…",
+ "temp_enable": "Aktiver midlertidigt…",
+ "use_default": "Brug standard",
+ "view_random": "Vis Tilfældig"
+ },
+ "actions_name": "Handlinger",
+ "age": "Alder",
+ "aliases": "Aliaser",
+ "all": "alt",
+ "also_known_as": "Også kendt som",
+ "ascending": "Stigende",
+ "average_resolution": "Gennemsnitlig Opløsning",
+ "birth_year": "Fødselsår",
+ "birthdate": "Fødselsdato",
+ "bitrate": "Bithastighed",
+ "career_length": "Karrierer Længde",
+ "component_tagger": {
+ "config": {
+ "active_instance": "Aktiv stash-box instans:",
+ "blacklist_desc": "Sortlistet elementer er ekskluderet fra forespørgsler. Bemærk, at de er regulære udtryk og også ufølsomme for store og små bogstaver. Visse tegn skal escapes med en omvendt skråstreg: {chars_require_escape}",
+ "blacklist_label": "Sortlist",
+ "query_mode_auto": "Auto",
+ "query_mode_auto_desc": "Bruger metadata, hvis de er til stede, eller filnavn",
+ "query_mode_dir": "Mappe",
+ "query_mode_dir_desc": "Bruger kun overordnet mappe til videofil",
+ "query_mode_filename": "Filnavn",
+ "query_mode_filename_desc": "Bruger kun filnavn",
+ "query_mode_label": "Forespørgselstilstand",
+ "query_mode_metadata": "Metadata",
+ "query_mode_metadata_desc": "Brug kun metadata",
+ "query_mode_path": "Sti",
+ "query_mode_path_desc": "Brug fuld file sti",
+ "set_cover_desc": "Overskriv scene billedet hvis en er fundet."
+ }
+ }
+}
diff --git a/ui/v2.5/src/locales/de-DE.json b/ui/v2.5/src/locales/de-DE.json
index d39d3f102..6e56515f7 100644
--- a/ui/v2.5/src/locales/de-DE.json
+++ b/ui/v2.5/src/locales/de-DE.json
@@ -21,18 +21,19 @@
"continue": "Fortsetzen",
"create": "Erstellen",
"create_entity": "Erstelle {entityType}",
- "create_marker": "Erstelle Marke",
+ "create_marker": "Erstelle Markierung",
"created_entity": "{entity_type} erstellt: {entity_name}",
"delete": "Löschen",
"delete_entity": "Lösche {entityType}",
"delete_file": "Lösche Datei",
+ "delete_file_and_funscript": "Datei löschen (inkl. funscript)",
"delete_generated_supporting_files": "Lösche generierte Hilfsdaten",
"disallow": "Nicht erlauben",
"download": "Herunterladen",
"download_backup": "Lade Backup herunter",
"edit": "Bearbeiten",
"export": "Exportieren…",
- "export_all": "Alles exportieren…",
+ "export_all": "Alle exportieren…",
"find": "Suchen",
"finish": "Fertig",
"from_file": "Aus Datei…",
@@ -43,7 +44,7 @@
"generate_thumb_default": "Erstelle voreingestelltes Vorschaubild",
"generate_thumb_from_current": "Erstelle Vorschaubild vom Gegenwärtigen",
"hash_migration": "Hash Umwandlung",
- "hide": "Verstecken",
+ "hide": "Verstecke",
"identify": "Identifizieren",
"ignore": "Ignorieren",
"import": "Importieren…",
@@ -55,7 +56,7 @@
"not_running": "wird nicht ausgeführt",
"open_random": "Öffne Zufällig",
"overwrite": "Überschreiben",
- "play_random": "Spiele zufällig ab",
+ "play_random": "Zufällige Wiedergabe",
"play_selected": "Spiele ausgewählte",
"preview": "Vorschau",
"previous_action": "Zurück",
@@ -79,7 +80,7 @@
"select_all": "Alle auswählen",
"select_folders": "Ordner auswählen",
"select_none": "Nichts auswählen",
- "selective_auto_tag": "Automatisch selektiv etikettieren",
+ "selective_auto_tag": "Automatisch selektiv taggen",
"selective_clean": "Selektive Reinigung",
"selective_scan": "Selektiv scannen",
"set_as_default": "Als Voreinstellung festlegen",
@@ -89,6 +90,7 @@
"show": "Anzeigen",
"skip": "Überspringen",
"stop": "Stopp",
+ "submit_stash_box": "Zu Stash-Box übermitteln",
"tasks": {
"clean_confirm_message": "Wollen Sie wirklich die Datenbank aufräumen? Dies wird alle Informationen und Hilfsdaten für Szenen und Galerien löschen, die nicht mehr auf dem Dateisystem vorhanden sind.",
"dry_mode_selected": "Trockenmodus ausgewählt. Es findet keine Löschung der Daten statt, lediglich Protokollierung.",
@@ -109,7 +111,7 @@
"birth_year": "Geburtsjahr",
"birthdate": "Geburtsdatum",
"bitrate": "Bitrate",
- "career_length": "Länge der Karriere",
+ "career_length": "Karrierelänge",
"component_tagger": {
"config": {
"active_instance": "Aktive stash-box Instanz:",
@@ -121,7 +123,7 @@
"query_mode_dir_desc": "Nutzt nur den übergeordneten Ordner",
"query_mode_filename": "Dateiname",
"query_mode_filename_desc": "Nutzt nur den Dateinamen",
- "query_mode_label": "Anfragemodus",
+ "query_mode_label": "Suchmodus",
"query_mode_metadata": "Metadaten",
"query_mode_metadata_desc": "Nutzt nur Metadaten",
"query_mode_path": "Pfad",
@@ -176,7 +178,7 @@
"about": "Über",
"interface": "Oberfläche",
"logs": "Protokoll",
- "metadata_providers": "Metadaten Anbieter",
+ "metadata_providers": "Metadaten-Anbieter",
"plugins": "Plugins",
"scraping": "Durchsuchen",
"security": "Sicherheit",
@@ -220,8 +222,6 @@
"password": "Passwort",
"password_desc": "Passwort für den Zugriff auf Stash. Feld leer lassen, um Benutzerauthentifizierung zu deaktivieren",
"stash-box_integration": "Stash-box Einbindung",
- "trusted_proxies": "Vertrauenswürdige Proxys",
- "trusted_proxies_desc": "Liste von Proxys denen eine Durchleitung zu Stash erlaubt ist. Leer lassen, um Traffic des privaten Netzwerks zu erlauben.",
"username": "Benutzername",
"username_desc": "Benutzername für den Zugriff auf Stash. Feld leer lassen, um Benutzerauthentifizierung zu deaktivieren"
},
@@ -245,7 +245,7 @@
"gallery_ext_head": "Galeriecontainer Dateiformate",
"generated_file_naming_hash_desc": "Verwende MD5 oder oshash für die Benennung der generierten Dateien. Um dies zu ändern, müssen für alle Szenen der entsprechende MD5/oshash berechnet werden. Nachdem dieser Wert geändert wurde, müssen vorhandene generierte Dateien migriert oder neu generiert werden. Siehe Aufgabenseite für die Migration.",
"generated_file_naming_hash_head": "Dateinamen-Hash für generierte Dateien",
- "generated_files_location": "Verzeichnisspeicherort für die generierten Dateien (Szenenmarkierungen, Szenenvorschauen, Sprites usw.)",
+ "generated_files_location": "Verzeichnisspeicherort für die generierten Dateien (Markierungen, Vorschauen, Sprites usw.)",
"generated_path_head": "Pfad für generierte Dateien",
"hashing": "Hashwertberechnung",
"image_ext_desc": "Durch Kommas getrennte Liste von Dateierweiterungen, die als Bilder identifiziert werden.",
@@ -294,7 +294,7 @@
"entity_scrapers": "{entityType} Scraper",
"excluded_tag_patterns_desc": "Reguläre Audrücke von Tags zum Ausschließen von Scraping Ergebnissen",
"excluded_tag_patterns_head": "Tag Muster ausschließen",
- "scraper": "Datenaggregator",
+ "scraper": "Scraper",
"scrapers": "Scraper",
"search_by_name": "Suche nach Name",
"supported_types": "Unterstützte Typen",
@@ -414,6 +414,8 @@
},
"desktop_integration": {
"desktop_integration": "Schreibtisch Integration",
+ "notifications_enabled": "Benachrichtigungen aktivieren",
+ "send_desktop_notifications_for_events": "Bei Neuigkeiten Benachrichtigungen auf den Desktop senden",
"skip_opening_browser": "Überspringe Öffnen des Browsers",
"skip_opening_browser_on_startup": "Überspringe automatisches Öffnen des Browsers bei Start"
},
@@ -513,8 +515,8 @@
"movies": "{count, plural, one {Film} other {Filme}}",
"performers": "{count, plural, one {Darsteller} other {Darsteller}}",
"scenes": "{count, plural, one {Szene} other {Szenen}}",
- "studios": "{Anzahl, Plural, ein {Studio} andere {Studios}}",
- "tags": "{Anzahl, Plural, ein {Tag} andere {Tags}}"
+ "studios": "{count, plural, one {Studio} other {Studios}}",
+ "tags": "{count, plural, one {Tag} other {Tags}}"
},
"country": "Land",
"cover_image": "Titelbild",
@@ -594,12 +596,12 @@
"image_previews": "Animierte Bildvorschauen",
"image_previews_tooltip": "Animierte WebP-Vorschaubilder, nur erforderlich, wenn der Vorschautyp auf Animiertes Bild eingestellt ist.",
"interactive_heatmap_speed": "Erzeugen von Heatmaps und Geschwindigkeiten für interaktive Szenen",
- "marker_image_previews": "Animierte Markierungsvorschauen",
- "marker_image_previews_tooltip": "Animierte Markierungs-WebP-Vorschauen, nur erforderlich, wenn der Vorschautyp auf Animiertes Bild eingestellt ist.",
- "marker_screenshots": "Markierungsbild",
- "marker_screenshots_tooltip": "Markierung statischer JPG-Bilder, nur erforderlich, wenn der Vorschautyp auf Statisches Bild eingestellt ist.",
- "markers": "Markierungsvorschau",
- "markers_tooltip": "20-Sekunden-Videos, die mit dem angegebenen Timecode beginnen.",
+ "marker_image_previews": "Animierte Vorschau für Markierungen",
+ "marker_image_previews_tooltip": "Animierte WebP-Vorschau für Markierungen, nur erforderlich, wenn der Vorschautyp auf Animiertes Bild eingestellt ist.",
+ "marker_screenshots": "Screenshots für Markierungen",
+ "marker_screenshots_tooltip": "Statische JPG-Bilder für Markierungen, nur erforderlich, wenn der Vorschautyp auf Statisches Bild eingestellt ist.",
+ "markers": "Vorschau für Markierungen",
+ "markers_tooltip": "20-Sekunden-Videos, die zum angegebenen Zeitpunkt beginnen.",
"overwrite": "Vorhandene generierte Dateien überschreiben",
"phash": "Perzeptuelle Hashes (zur Deduplizierung)",
"preview_exclude_end_time_desc": "Schließen Sie die letzten x Sekunden von der Szenenvorschau aus. Dies kann ein Wert in Sekunden oder ein Prozentsatz (zB 2%) der gesamten Szenendauer sein.",
@@ -634,14 +636,14 @@
"display_mode": {
"grid": "Gitter",
"list": "Liste",
- "tagger": "Etikettierer",
+ "tagger": "Tagger",
"unknown": "Unbekannt",
"wall": "Wand"
},
"donate": "Spenden",
"dupe_check": {
"description": "Bei Levels unterhalb von 'Exact' kann die Berechnung länger dauern. Bei niedrigeren Genauigkeitsstufen können auch falsch positive Ergebnisse zurückgegeben werden.",
- "found_sets": "{setCount, plural, one{# Satz von Duplikaten gefunden.} andere {# Sätze von Duplikaten gefunden.}}",
+ "found_sets": "{setCount, plural, one{# Satz von Duplikaten gefunden.} other {# Sätze von Duplikaten gefunden.}}",
"options": {
"exact": "Genau",
"high": "Hoch",
@@ -653,9 +655,9 @@
},
"duration": "Dauer",
"effect_filters": {
- "aspect": "Aspekt",
+ "aspect": "Seitenverhältnis",
"blue": "Blau",
- "blur": "Verwischen",
+ "blur": "Unschärfe",
"brightness": "Helligkeit",
"contrast": "Kontrast",
"gamma": "Gamma",
@@ -675,7 +677,7 @@
},
"ethnicity": "Ethnizität",
"eye_color": "Augenfarbe",
- "fake_tits": "Gemachte Brüste",
+ "fake_tits": "Brustvergrößerungen",
"false": "Falsch",
"favourite": "Favorit",
"file": "Datei",
@@ -692,6 +694,14 @@
"gallery": "Galerie",
"gallery_count": "Galerienanzahl",
"gender": "Geschlecht",
+ "gender_types": {
+ "FEMALE": "Weiblich",
+ "INTERSEX": "Intersexuell",
+ "MALE": "Männlich",
+ "NON_BINARY": "Nicht-Binär",
+ "TRANSGENDER_FEMALE": "Trans* weiblich",
+ "TRANSGENDER_MALE": "Trans* männlich"
+ },
"hair_color": "Haarfarbe",
"hasMarkers": "Hat Markierungen",
"height": "Größe",
@@ -700,17 +710,17 @@
"image_count": "Bilderanzahl",
"images": "Bilder",
"include_parent_tags": "Übergeordnete Tags einbeziehen",
- "include_sub_studios": "Tochterstudios einbeziehen",
- "include_sub_tags": "Sub-Tags einbeziehen",
+ "include_sub_studios": "Untergeordnete Studios einbeziehen",
+ "include_sub_tags": "Untergeordnete Tags einbeziehen",
"instagram": "Instagram",
"interactive": "Interaktiv",
"interactive_speed": "Interaktive Geschwindigkeit",
- "isMissing": "Wird vermisst",
+ "isMissing": "Fehlt",
"library": "Bibliothek",
"loading": {
"generic": "Wird geladen…"
},
- "marker_count": "Markierungsanzahl",
+ "marker_count": "Anzahl an Markierungen",
"markers": "Markierungen",
"measurements": "Maße",
"media_info": {
@@ -741,12 +751,12 @@
"pagination": {
"first": "Erste",
"last": "Letzte",
- "next": "Nächster",
- "previous": "Vorheriger"
+ "next": "Nächste",
+ "previous": "Vorherige"
},
"parent_of": "Übergeordnet von {children}",
- "parent_studios": "Elternstudios",
- "parent_tag_count": "Übergeordnete Tag-Anzahl",
+ "parent_studios": "Übergeordnete Studios",
+ "parent_tag_count": "Anzahl übergeordneter Tags",
"parent_tags": "Übergeordnete Tags",
"part_of": "Übergeordnet von {parent}",
"path": "Pfad",
@@ -853,18 +863,18 @@
"stash_id": "Stash-ID",
"stash_ids": "Stash IDs",
"stats": {
- "image_size": "Bildgröße",
+ "image_size": "Bildspeicher",
"scenes_duration": "Szenendauer",
- "scenes_size": "Szenengröße"
+ "scenes_size": "Szenenspeicher"
},
"status": "Status: {statusText}",
"studio": "Studio",
"studio_depth": "Ebenen (leer für alle)",
"studios": "Studios",
- "sub_tag_count": "Anzahl an Sub-Tags",
+ "sub_tag_count": "Anzahl an untergeordneten Tags",
"sub_tag_of": "Sub-Tag von {parent}",
- "sub_tags": "Unterkategorien",
- "subsidiary_studios": "Tochterstudios",
+ "sub_tags": "Untergeordnete Tags",
+ "subsidiary_studios": "Untergeordnete Studios",
"synopsis": "Zusammenfassung",
"tag": "Tag",
"tag_count": "Tag-Anzahl",
diff --git a/ui/v2.5/src/locales/en-GB.json b/ui/v2.5/src/locales/en-GB.json
index f94e5689a..25fdeec95 100644
--- a/ui/v2.5/src/locales/en-GB.json
+++ b/ui/v2.5/src/locales/en-GB.json
@@ -25,6 +25,7 @@
"delete": "Delete",
"delete_entity": "Delete {entityType}",
"delete_file": "Delete file",
+ "delete_file_and_funscript": "Delete file (and funscript)",
"delete_generated_supporting_files": "Delete generated supporting files",
"disallow": "Disallow",
"download": "Download",
@@ -43,6 +44,7 @@
"generate_thumb_from_current": "Generate thumbnail from current",
"hash_migration": "hash migration",
"hide": "Hide",
+ "hide_configuration": "Hide Configuration",
"identify": "Identify",
"ignore": "Ignore",
"import": "Import…",
@@ -86,8 +88,10 @@
"set_front_image": "Front image…",
"set_image": "Set image…",
"show": "Show",
+ "show_configuration": "Show Configuration",
"skip": "Skip",
"stop": "Stop",
+ "submit_stash_box": "Submit to Stash-Box",
"tasks": {
"clean_confirm_message": "Are you sure you want to Clean? This will delete database information and generated content for all scenes and galleries that are no longer found in the filesystem.",
"dry_mode_selected": "Dry Mode selected. No actual deleting will take place, only logging.",
@@ -97,7 +101,8 @@
"temp_enable": "Enable temporarily…",
"use_default": "Use default",
"view_random": "View Random",
- "continue": "Continue"
+ "continue": "Continue",
+ "submit": "Submit"
},
"actions_name": "Actions",
"age": "Age",
@@ -220,8 +225,6 @@
"password": "Password",
"password_desc": "Password to access Stash. Leave blank to disable user authentication",
"stash-box_integration": "Stash-box integration",
- "trusted_proxies": "Trusted proxies",
- "trusted_proxies_desc": "List of proxies that are allowed to proxy traffic into stash. Leave empty to allow from private network.",
"username": "Username",
"username_desc": "Username to access Stash. Leave blank to disable user authentication"
},
@@ -415,7 +418,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": {
@@ -487,7 +492,8 @@
"continue_playlist_default": {
"description": "Play next scene in queue when video finishes",
"heading": "Continue playlist by default"
- }
+ },
+ "show_scrubber": "Show Scrubber"
}
},
"scene_wall": {
@@ -600,6 +606,8 @@
"marker_screenshots_tooltip": "Marker static JPG images, only required if Preview Type is set to Static Image.",
"markers": "Marker Previews",
"markers_tooltip": "20 second videos which begin at the given timecode.",
+ "override_preview_generation_options": "Override Preview Generation Options",
+ "override_preview_generation_options_desc": "Override Preview Generation Options for this operation. Defaults are set in System -> Preview Generation.",
"overwrite": "Overwrite existing generated files",
"phash": "Perceptual hashes (for deduplication)",
"preview_exclude_end_time_desc": "Exclude the last x seconds from scene previews. This can be a value in seconds, or a percentage (eg 2%) of the total scene duration.",
@@ -651,6 +659,7 @@
"search_accuracy_label": "Search Accuracy",
"title": "Duplicate Scenes"
},
+ "duplicated_phash": "Duplicated (phash)",
"duration": "Duration",
"effect_filters": {
"aspect": "Aspect",
@@ -692,6 +701,14 @@
"gallery": "Gallery",
"gallery_count": "Gallery Count",
"gender": "Gender",
+ "gender_types": {
+ "MALE": "Male",
+ "FEMALE": "Female",
+ "TRANSGENDER_MALE": "Transgender Male",
+ "TRANSGENDER_FEMALE": "Transgender Female",
+ "INTERSEX": "Intersex",
+ "NON_BINARY": "Non-Binary"
+ },
"hair_color": "Hair Colour",
"hasMarkers": "Has Markers",
"height": "Height",
@@ -750,9 +767,12 @@
"parent_tags": "Parent Tags",
"part_of": "Part of {parent}",
"path": "Path",
+ "perceptual_similarity": "Perceptual Similarity (phash)",
"performer": "Performer",
"performerTags": "Performer Tags",
"performer_count": "Performer Count",
+ "performer_favorite": "Performer Favourited",
+ "performer_age": "Performer Age",
"performer_image": "Performer Image",
"performers": "Performers",
"piercings": "Piercings",
@@ -895,5 +915,46 @@
"url": "URL",
"videos": "Videos",
"weight": "Weight",
- "years_old": "years old"
+ "years_old": "years old",
+ "stashbox": {
+ "selected_stash_box": "Selected Stash-Box endpoint",
+ "submission_successful": "Submission successful",
+ "submission_failed": "Submission failed",
+ "go_review_draft": "Go to {endpoint_name} to review draft."
+ },
+ "performer_tagger": {
+ "network_error": "Network Error",
+ "failed_to_save_performer": "Failed to save performer \"{performer}\"",
+ "name_already_exists": "Name already exists",
+ "performer_already_tagged": "Performer already tagged",
+ "current_page": "Current page",
+ "performer_successfully_tagged": "Performer successfully tagged:",
+ "no_results_found": "No results found.",
+ "update_performer": "Update Performer",
+ "update_performers": "Update Performers",
+ "query_all_performers_in_the_database": "All performers in the database",
+ "tag_status": "Tag Status",
+ "untagged_performers": "Untagged performers",
+ "updating_untagged_performers_description": "Updating untagged performers will try to match any performers that lack a stashid and update the metadata.",
+ "refresh_tagged_performers": "Refresh tagged performers",
+ "refreshing_will_update_the_data": "Refreshing will update the data of any tagged performers from the stash-box instance.",
+ "add_new_performers": "Add New Performers",
+ "to_use_the_performer_tagger": "To use the performer tagger a stash-box instance needs to be configured.",
+ "performer_selection": "Performer selection",
+ "performer_names_separated_by_comma": "Performer names separated by comma",
+ "any_names_entered_will_be_queried": "Any names entered will be queried from the remote Stash-Box instance and added if found. Only exact matches will be considered a match.",
+ "batch_add_performers": "Batch Add Performers",
+ "batch_update_performers": "Batch Update Performers",
+ "status_tagging_performers": "Status: Tagging performers",
+ "status_tagging_job_queued": "Status: Tagging job queued",
+ "number_of_performers_will_be_processed": "{performer_count} performers will be processed",
+ "config": {
+ "excluded_fields": "Excluded fields:",
+ "these_fields_will_not_be_changed_when_updating_performers": "These fields will not be changed when updating performers.",
+ "edit_excluded_fields": "Edit Excluded Fields",
+ "no_fields_are_excluded": "No fields are excluded",
+ "active_stash-box_instance": "Active stash-box instance:",
+ "no_instances_found": "No instances found"
+ }
+ }
}
diff --git a/ui/v2.5/src/locales/en-US.json b/ui/v2.5/src/locales/en-US.json
index dc2af732f..fdf9c7b45 100644
--- a/ui/v2.5/src/locales/en-US.json
+++ b/ui/v2.5/src/locales/en-US.json
@@ -9,5 +9,6 @@
"ignore_organized": "Ignore organized scenes"
}
}
- }
+ },
+ "performer_favorite": "Performer Favorited"
}
diff --git a/ui/v2.5/src/locales/es-ES.json b/ui/v2.5/src/locales/es-ES.json
index 952052b7d..3efe85096 100644
--- a/ui/v2.5/src/locales/es-ES.json
+++ b/ui/v2.5/src/locales/es-ES.json
@@ -220,8 +220,6 @@
"password": "Contraseña",
"password_desc": "Contraseña para acceder a Stash. Dejar en blanco para deshabilitar la exigencia de identificación para acceder a la aplicación",
"stash-box_integration": "Integración Stash-box",
- "trusted_proxies": "Proxies verificados",
- "trusted_proxies_desc": "Lista de proxies que tienen permitido el acceso a Stash. Dejar en blanco para permitir redes privadas.",
"username": "Usuario",
"username_desc": "Usuario para acceder a Stash. Dejar en blanco para deshabilitar la exigencia de identificación para acceder a la aplicación"
},
@@ -324,19 +322,24 @@
"backup_and_download": "Lleva a cabo una copia de seguridad de la base de datos y la guarda en un fichero de respaldo.",
"backup_database": "Lleva a cabo una copia de seguridad de la base de datos en el mismo directorio en que se encuentre ésta. El formato de nombre del fichero generado es {filename_format}",
"cleanup_desc": "Buscar ficheros eliminados del sistema de archivos y eliminarlos de la base de datos. PRECAUCIÓN: esta es una acción destructiva.",
+ "data_management": "Gestión de datos",
"defaults_set": "Las opciones por defecto se han guardado y serán usadas cada vez que pulses el botoón de {action} en la página de Tareas.",
"dont_include_file_extension_as_part_of_the_title": "No incluir la extensión del archivo como parte del título",
+ "empty_queue": "Actualmente no hay tareas en ejecución.",
"export_to_json": "Exporta el contenido de la base de datos en formato JSON en el directorio de metadatos.",
"generate": {
"generating_from_paths": "Generando multimedia de soporte para las escenas en las siguientes rutas",
"generating_scenes": "Generando multimedia de soporte para {num} {scene}"
},
"generate_desc": "Generar imagen de soporte, conjuntos de imágenes, vídeo, vtt y resto de archivos.",
- "generate_phashes_during_scan": "Generar hashes de percepción (Phashes) de los vídeos durante el escaneo (este valor es empleado para la búsqueda de archivos de vídeo duplicados y para la identificación de escenas)",
+ "generate_phashes_during_scan": "Generar hashes de percepción (Phashes)",
+ "generate_phashes_during_scan_tooltip": "Para búsqueda de duplicados e identificación de escenas.",
"generate_previews_during_scan": "Generar imágenes previas durante el escaneo (vistas previas WebP animadas). Solo requerido si el tipo de previsualización seleccionado es “Imágenes animadas”)",
+ "generate_previews_during_scan_tooltip": "Generar vistas previas animadas WebP, solo requerido si Tipo de Vista Previa es Imagen Animada.",
"generate_sprites_during_scan": "Generar conjunto de imágenes o “sprites” durante el escaneo (para el depurador/limpiador de escenas)",
- "generate_thumbnails_during_scan": "Generar miniaturas de las imágenes durante el escaneo.",
- "generate_video_previews_during_scan": "Generar vistas previas durante el escaneo (vistas previas en vídeo que se muestran al pasar el enlace por encima de una escena)",
+ "generate_thumbnails_during_scan": "Generar miniaturas de las imágenes",
+ "generate_video_previews_during_scan": "Generar vistas previas",
+ "generate_video_previews_during_scan_tooltip": "Generar vistas previas en vídeo que se reproducen al pasar el ratón por encima de una escena",
"generated_content": "Contenido generado",
"identify": {
"and_create_missing": "y crear no existentes",
@@ -371,7 +374,7 @@
"scanning_paths": "Escaneando las siguientes rutas"
},
"scan_for_content_desc": "Buscar contenido nuevo y añadirlo a la base de datos.",
- "set_name_date_details_from_metadata_if_present": "Establecer el nombre, fecha y detalles desde los metadatos embebidos en el archivo (si se encuentran)"
+ "set_name_date_details_from_metadata_if_present": "Establecer el nombre, fecha y detalles desde los metadatos embebidos en el archivo"
},
"tools": {
"scene_duplicate_checker": "Comprobación de escenas duplicadas",
@@ -393,6 +396,7 @@
"scene_tools": "Herramientas de escenas"
},
"ui": {
+ "basic_settings": "Ajustes básicos",
"custom_css": {
"description": "La página debe ser recargada para que se lleven a cabo los cambios realizados.",
"heading": "CSS personalizado",
@@ -427,6 +431,7 @@
"heading": "Clave para conexión práctica"
},
"images": {
+ "heading": "Imágenes",
"options": {
"write_image_thumbnails": {
"description": "Guardar miniaturas de imagen en el sistema de archivos cuando son generadas al vuelo",
@@ -434,6 +439,7 @@
}
}
},
+ "interactive_options": "Opciones Interactivas",
"language": {
"heading": "Lenguaje"
},
@@ -581,6 +587,7 @@
},
"overwrite_filter_confirm": "¿Estás seguro de sobreescribir la consulta guardada {entityName}?",
"scene_gen": {
+ "force_transcodes": "Forzar generación de transcodificación",
"image_previews": "Vistas previas en imagen (animadas en formato WebP, solo requerido si el tipo de previsualización seleccionado es “Imágenes animadas”)",
"marker_image_previews": "Vistas previas de marcadores (animadas en formato WebP, solo requerido si el tipo de previsualización seleccionado es “Imágenes animadas”)",
"marker_screenshots": "Capturas de pantalla de marcadores (imagen JPG estática, solo requerido si el tipo de previsualización seleccionado es “Imagen estática”)",
@@ -672,7 +679,6 @@
"galleries": "Galerías",
"gallery": "Galería",
"gallery_count": "Número de galerías",
- "gender": "Género",
"hair_color": "Color de pelo",
"hasMarkers": "Tiene marcadores",
"height": "Estatura",
diff --git a/ui/v2.5/src/locales/fi-FI.json b/ui/v2.5/src/locales/fi-FI.json
index 628dc8859..448ec06ea 100644
--- a/ui/v2.5/src/locales/fi-FI.json
+++ b/ui/v2.5/src/locales/fi-FI.json
@@ -26,6 +26,7 @@
"delete": "Poista",
"delete_entity": "Poista {entityType}",
"delete_file": "Poista tiedosto",
+ "delete_file_and_funscript": "Poista tiedosto (ja funscript)",
"delete_generated_supporting_files": "Poista generoidut lisätiedostot",
"disallow": "Kiellä",
"download": "Lataa",
@@ -80,6 +81,7 @@
"select_folders": "Valitse kansiot",
"select_none": "Peruuta Valinta",
"selective_auto_tag": "Valikoiva automaattinen tunnisteiden asetus",
+ "selective_clean": "Valikoiva Puhdistus",
"selective_scan": "Valikoiva skannaus",
"set_as_default": "Aseta oletukseksi",
"set_back_image": "Takakansi…",
@@ -88,6 +90,7 @@
"show": "Näytä",
"skip": "Ohita",
"stop": "Pysäytä",
+ "submit_stash_box": "Lähetä Stash-Boxiin",
"tasks": {
"clean_confirm_message": "Haluatko varmasti puhdistaa? Tämä poistaa tietokannan tiedot ja poistaa kaikki generoidut tukitiedostot kaikista kohtauksista ja gallerioista, eikä niitä enää ole löydettävissä levyltä.",
"dry_mode_selected": "Kuivatila käytössä. Poistoa ei oikeasti tehdä, vain lokikirjaus.",
@@ -159,20 +162,28 @@
"build_hash": "Version tiiviste:",
"build_time": "Version päiväys:",
"check_for_new_version": "Tarkista onko uutta versiota saatavilla",
+ "latest_version": "Viimeisin Versio",
"latest_version_build_hash": "Uusimman version tiiviste:",
"new_version_notice": "[UUSI]",
"stash_discord": "Liity {url} kanavallemme",
- "stash_home": "Stashin kotisivut {ur}",
+ "stash_home": "Stashin kotisivut {url}",
"stash_open_collective": "Tue meitä {url}",
"stash_wiki": "Stashin {url} -sivu",
"version": "Versio"
},
+ "application_paths": {
+ "heading": "Sovellukset Polut"
+ },
"categories": {
"about": "Tietoja",
"interface": "Käyttöliittymä",
"logs": "Lokit",
+ "metadata_providers": "Metadatan tarjoajat",
"plugins": "Lisäosat",
"scraping": "Kaavinta",
+ "security": "Turvallisuus",
+ "services": "Palvelut",
+ "system": "Järjestelmä",
"tasks": "Tehtävät",
"tools": "Työkalut"
},
@@ -195,6 +206,10 @@
"api_key_desc": "API -avain ulkoisille järjestelmille. Tarvitaan vain jos käyttäjätunnus ja salasana on määritelty. Käyttäjätunnus taytyy tallentaa ennen API -avaimen luomista.",
"authentication": "Autentikointi",
"clear_api_key": "Puhdista API -avain",
+ "credentials": {
+ "description": "Tunnukset, joiden pääsyä stashiin rajoitetaan.",
+ "heading": "Tunnukset"
+ },
"generate_api_key": "Luo API -avain",
"log_file": "Lokitiedosto",
"log_file_desc": "Polku lokitiedostoon. Jos jätetty tyhjäksi, ei lokitiedostoa tehdä. Vaatii uudelleenkäynnistyksen.",
@@ -202,13 +217,11 @@
"log_http_desc": "Kirjaa http -pyynnöt komentoriville. Vaatii uudelleenkäynnistyksen.",
"log_to_terminal": "Kirjoita loki komentoriville",
"log_to_terminal_desc": "Kirjaa lokin komentoriville lokitiedoston sijaan. Aina päällä jos lokitiedosto ei ole käytössä. Vaatii uudelleenkäynnistyksen.",
- "maximum_session_age": "Session keston yläraja",
+ "maximum_session_age": "Istunnon keston yläraja",
"maximum_session_age_desc": "Yläraja toimettomalle ajalle sekunneissa ennen kuin kirjautuminen vanhenee.",
"password": "Salasana",
"password_desc": "Salasana Stashiin. Jätä tyhjäksi, mikäli et halua autentikointia",
"stash-box_integration": "Stash-box integraatio",
- "trusted_proxies": "Luotetut välityspalvelimet",
- "trusted_proxies_desc": "Lista välityspalvelimista, joiden liikenne Stashiin sallitaan. Jätä tyhjäksi salliaksesi pääsyn sisäverkosta.",
"username": "Käyttäjätunnus",
"username_desc": "Käyttäjätunnus Stashiin. Jätä tyhjäksi, mikäli et halua autentikointia"
},
@@ -233,7 +246,7 @@
"generated_file_naming_hash_desc": "Käytä MD5:ttä tai oshashia tiedostojen nimien generoimiseen. Tämän muuttaminen vaatii, että kaikilla kohtauksilla on MD5 tai oshash. Tämän valinnan muuttamisen jälkeen kaikki generoidut tukitiedostot täytyy joko migraatioida tai generoida uudelleen. Katso lisää migraatiosta tehtävät -sivulta.",
"generated_file_naming_hash_head": "Generoitu tiiviste tiedoston nimeämistä varten",
"generated_files_location": "Kansion polku generoiduille tiedostoille (kohtauksen merkit, kohtauksien esikatselut, tms)",
- "generated_path_head": "Generoitu polku",
+ "generated_path_head": "Generoitujen tiedostojen polku",
"hashing": "Tiivisteen luominen",
"image_ext_desc": "Pilkuilla erotettu lista tiedostopäätteistä, jotka tulkitaan kuviksi.",
"image_ext_head": "Kuvien tiedostopäätteet",
@@ -254,12 +267,21 @@
"preview_generation": "Esikatsele generointi",
"scraper_user_agent": "Kaapijan käyttäjäagentti",
"scraper_user_agent_desc": "Käyttäjäagenttikenttä, jota kaavittaessa käytetään http pyynnöissä",
+ "scrapers_path": {
+ "description": "Kaapijan konfiguraatiotiedostojen kansion sijainti",
+ "heading": "Kaapijoiden polku"
+ },
"scraping": "Kaapiminen",
"sqlite_location": "SQLite -tietokannan tiedostosijainti (vaatii uudelleenkäynnistyksen)",
"video_ext_desc": "Pilkuilla erotettu lista tiedostopäätteistä, jotka tulkitaan videoiksi.",
"video_ext_head": "Videoiden päätteet",
"video_head": "Video"
},
+ "library": {
+ "exclusions": "Poisjättäminen",
+ "gallery_and_image_options": "Galleria- ja kuva-asetukset",
+ "media_content_extensions": "Mediasisällön tiedostopäätteet"
+ },
"logs": {
"log_level": "Lokin taso"
},
@@ -283,6 +305,9 @@
"name": "Nimi",
"title": "Stash-box päätepisteet"
},
+ "system": {
+ "transcoding": "Transkoodaus"
+ },
"tasks": {
"added_job_to_queue": "Lisättiin {operation_name} tehtäväjonoon",
"auto_tag": {
@@ -298,16 +323,20 @@
"data_management": "Datan hallinta",
"defaults_set": "Oletukset on asetettu ja niitä käytetään kun painat {action} -painiketta Tehtävät -sivulla.",
"dont_include_file_extension_as_part_of_the_title": "Elä sisällytä tiedostopäätettä tiedoston nimeen",
+ "empty_queue": "Tehtäviä ei ole menossa.",
"export_to_json": "Vie tietokannan sisällön JSON -formaatissa samaan kansioon kuin missä tietokanta on.",
"generate": {
"generating_from_paths": "Generoidaan kohtauksille seuraavista poluista",
"generating_scenes": "Generoidaan {num} {scene}"
},
"generate_desc": "Generoi kuvat, esikatselut ja muut tukitiedostot.",
- "generate_phashes_during_scan": "Generoi phash -tiiviste skannauksen aikana (kaksoiskappaleiden ja kohtauksen tunnistamiseen)",
- "generate_previews_during_scan": "Generoi esikatselukuvat skannauksen aikana (animoitu WebP esikatselu, vaaditaan vain jos esikatselun tyypiksi on valittu animoitu kuva)",
- "generate_thumbnails_during_scan": "Generoi esikatselukuva skannauksen aikana.",
- "generate_video_previews_during_scan": "Generoi esikatselu skannauksen aikana (videoesikatselu, joka näytetään kun osoitin menee kohtauksen päälle)",
+ "generate_phashes_during_scan": "Generoi phash -tiivisteet",
+ "generate_phashes_during_scan_tooltip": "Kaksoiskappaleiden löytämiseen ja kohtauksien tunnistamiseen.",
+ "generate_previews_during_scan": "Generoi animoidut esikatselukuvat",
+ "generate_previews_during_scan_tooltip": "Generoi animoidun WebP -esikatselun, vaaditaan vain jos esikatselun tyypiksi on valittu animoitu kuva.",
+ "generate_thumbnails_during_scan": "Generoi esikatselukuva skannauksen aikana",
+ "generate_video_previews_during_scan": "Generoi esikatselu",
+ "generate_video_previews_during_scan_tooltip": "Generoi videoesikatselun, joka näytetään kun osoitin menee kohtauksen päälle",
"generated_content": "Generoitu sisältö",
"identify": {
"and_create_missing": "ja luo puuttuvat",
@@ -342,7 +371,7 @@
"scanning_paths": "Skannataan seuraavia polkuja"
},
"scan_for_content_desc": "Skannaa uusi sisältö ja lisää se tietokantaan.",
- "set_name_date_details_from_metadata_if_present": "Aseta nimi, päivä ja tiedot metadatasta (jos saatavilla)"
+ "set_name_date_details_from_metadata_if_present": "Aseta nimi, päivä ja tiedot metadatasta"
},
"tools": {
"scene_duplicate_checker": "Kohtauksien kaksoiskappaleiden tarkistus",
@@ -359,8 +388,9 @@
"scene_tools": "Kohtauksen työkalut"
},
"ui": {
+ "basic_settings": "Perusasetukset",
"custom_css": {
- "description": "Sivu täytyy ladata uudellee, jotta muutokset tulevat voimaan.",
+ "description": "Sivu täytyy ladata uudelleen, jotta muutokset tulevat voimaan.",
"heading": "Mukautettu CSS",
"option_label": "Mukautettu CSS käytössä"
},
@@ -388,6 +418,7 @@
"description": "Viive millisekunneissa interaktiivisille skripteille kun toistetaan."
},
"images": {
+ "heading": "Kuvat",
"options": {
"write_image_thumbnails": {
"description": "Kirjoita kuvien esikatselut levylle kun generoidaan",
@@ -509,6 +540,7 @@
"delete_object_overflow": "…ja {count} muuta {count, plural, one {{singularEntity}} other {{pluralEntity}}}.",
"delete_object_title": "Poista {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
"edit_entity_title": "Muokkaa {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
+ "export_include_related_objects": "Sisällytä liittyvät objektit vientiin",
"export_title": "Vie",
"lightbox": {
"delay": "Viive (sek)",
@@ -535,20 +567,29 @@
},
"overwrite_filter_confirm": "Haluatko varmasti ylikirjoittaa jo olemassaolevan {entityName}?",
"scene_gen": {
- "image_previews": "Esikatselukuvat (Animoitu WebP esikatselu, vaadittu vain jos esikatselutyypiksi on asetettu animoitu kuva)",
- "marker_image_previews": "Merkkien esikatselukuvat (Animoitu WebP esikatselu, vaadittu vain jos esikatselutyypiksi on asetettu animoitu kuva)",
- "marker_screenshots": "Merkkien esikatselukuvat (staattinen JPG -kuva, vaadittu vain jos esikatselutyypiksi on asetettu staattinen kuva)",
- "markers": "Merkit (20 sekunnin video jokaisen aikakoodin alusta)",
+ "force_transcodes": "Pakota transkoodaus",
+ "force_transcodes_tooltip": "Oletuksena transkoodaus tehdään vain, mikäli selain ei tue videotiedostoa. Jos tämä valinta on päällä, transkoodaus tehdään vaikka selain näyttäisi tukevan videotiedostoa.",
+ "image_previews": "Animoidut esikatselukuvat",
+ "image_previews_tooltip": "Animoidut WebP esikatselut, vaaditaan vain jos esikatselun tyyppi on Animoitu kuva.",
+ "marker_image_previews": "Animoidut merkkien esikatselukuvat",
+ "marker_image_previews_tooltip": "Animoidut merkkien WebP esikatselut, vaaditaan vain jos esikatselun tyypiksi on valittu Animoitu kuva.",
+ "marker_screenshots": "Merkkien esikatselukuvat",
+ "marker_screenshots_tooltip": "Merkkien staattinen JPG -kuva, vaadittu vain jos esikatselutyypiksi on asetettu staattinen kuva.",
+ "markers": "Merkkien esikatselut",
+ "markers_tooltip": "20 sekunnin video jokaisen aikakoodin alusta.",
"overwrite": "Ylikirjoita olemassaolevat generoidut tiedostot",
"phash": "Tiiviste (kaksoiskappaileiden tunnistamiseen)",
"preview_exclude_end_time_desc": "Jätä viimeiset x sekuntia pois esikatseluista. Arvo voi olla sekunneissa tai prosenteissa (esim. 2%) kohtauksen kestosta.",
"preview_exclude_end_time_head": "Lopusta poisjätettävä aika",
"preview_exclude_start_time_desc": "Jätä ensimmäiset x sekuntia pois esikatseluista. Arvo voi olla sekunneissa tai prosenteissa (esim. 2%) kohtauksen kestosta.",
"preview_exclude_start_time_head": "Alusta poisjätettävä aika",
+ "preview_generation_options": "Esikatselun generoinnin asetukset",
"preview_options": "Esikatseluasetukset",
"preview_preset_head": "Esikatseluidun enkoodaus",
- "transcodes": "Transkoodaus (MP4 muunto niille tiedostomuodoille, joita ei tueta)",
- "video_previews": "Esikatselu (esikatseluviedo, joka näytetään kun hiiri on kohtauksen päällä)"
+ "transcodes": "Transkoodaus",
+ "transcodes_tooltip": "MP4 muunto niille tiedostomuodoille, joita ei tueta",
+ "video_previews": "Esikatselu",
+ "video_previews_tooltip": "Esikatseluviedo, joka näytetään kun hiiri on kohtauksen päällä"
},
"scenes_found": "{count} kohtausta löydetty",
"scrape_entity_query": "{entity_type}kaavintajono",
@@ -621,6 +662,14 @@
"gallery": "Galleria",
"gallery_count": "Gallerioiden määrä",
"gender": "Sukupuoli",
+ "gender_types": {
+ "FEMALE": "Nainen",
+ "INTERSEX": "Intersukupuolinen",
+ "MALE": "Mies",
+ "NON_BINARY": "Ei-Binäärinen",
+ "TRANSGENDER_FEMALE": "Transnainen",
+ "TRANSGENDER_MALE": "Transmies"
+ },
"hair_color": "Hiusten väri",
"hasMarkers": "On merkki",
"height": "Pituus",
@@ -633,6 +682,7 @@
"include_sub_tags": "Sisällytä alitunnisteet",
"instagram": "Instagram",
"interactive": "Interaktiivinen",
+ "interactive_speed": "Interaktiivinen nopeus",
"isMissing": "Puuttuu",
"library": "Kirjasto",
"loading": {
@@ -646,6 +696,7 @@
"checksum": "Tarkistussumma",
"downloaded_from": "Ladattu kohteesta",
"hash": "Tiiviste",
+ "interactive_speed": "Interaktiivinen nopeus",
"performer_card": {
"age": "{age} {years_old}",
"age_context": "{age} {years_old} tässä kohtauksessa"
@@ -730,7 +781,10 @@
"migration_failed": "Migraatio ei onnistunut",
"migration_failed_error": "Seuraava virhe tuli tietokannan migraatiossa:",
"migration_failed_help": "Tee tarvittavat korjaukset. Muussa tapauksessa tee ilmoitus bugista {githubLink} tai pyydä apua {discordLink}.",
- "migration_required": "Migraatio vaaditaan"
+ "migration_irreversible_warning": "Migraatio ei ole peruutettavissa. Kun migraatio on suoritettu, tietokanta ei ole enää yhteensopiva stashin vanhempien versioiden kanssa.",
+ "migration_required": "Migraatio vaaditaan",
+ "perform_schema_migration": "Suorita migraatio",
+ "schema_too_old": "Tämänhetkinen stash -tietokannan muodon versio on {databaseSchema} ja se pitää muuttaa versioon {appSchema}. Tämä versio Stashista ei toimi ilman tietokannan migraatiota."
},
"paths": {
"database_filename_empty_for_default": "tietokannan tiedostonimi (oletus jos tyhjä)",
@@ -754,6 +808,7 @@
"your_system_has_been_created": "Kaikki hyvin! Järjestelmä on nyt luotu!"
},
"welcome": {
+ "in_current_stash_directory": "HOME/.stash kansioon",
"store_stash_config": "Minne haluat tallentaa Stash -konfiguraation?",
"unable_to_locate_config": "Mikäli luet tätä, Stash ei löydä olemassaolevaa konfiguraatiota. Tämä velho auttaa sinua uuden konfiguraation luomisessa."
},
@@ -807,6 +862,7 @@
"up-dir": "Ylös",
"updated_at": "Päivitetty",
"url": "URL",
+ "videos": "Videot",
"weight": "Paino",
"years_old": "-vuotias"
}
diff --git a/ui/v2.5/src/locales/fr-FR.json b/ui/v2.5/src/locales/fr-FR.json
index 7a8a01fda..3efe7366f 100644
--- a/ui/v2.5/src/locales/fr-FR.json
+++ b/ui/v2.5/src/locales/fr-FR.json
@@ -80,6 +80,7 @@
"select_folders": "Sélectionner des répertoires",
"select_none": "Ne rien sélectionner",
"selective_auto_tag": "Taggage automatique de la sélection",
+ "selective_clean": "Nettoyage sélectif",
"selective_scan": "Scan sélectif",
"set_as_default": "Définir comme valeur par défaut",
"set_back_image": "Image Verso…",
@@ -219,8 +220,6 @@
"password": "Mot de passe",
"password_desc": "Mot de passe pour accéder à Stash. Laissez vide pour désactiver l'authentification.",
"stash-box_integration": "Integration de stash-box",
- "trusted_proxies": "Proxys de confiance",
- "trusted_proxies_desc": "Liste des proxys autorisés à transférer le trafic vers Stash. Laissez vide pour autoriser à partir du réseau privé.",
"username": "Nom d'utilisateur",
"username_desc": "Nom d'utilisateur pour accéder à Stash. Laissez vide pour désactiver l'authentification."
},
@@ -266,6 +265,9 @@
"preview_generation": "Générer les aperçus",
"scraper_user_agent": "User-Agent pour les Scraper",
"scraper_user_agent_desc": "Chaîne User-Agent utilisée dans les requêtes http lors du Scraping.",
+ "scrapers_path": {
+ "heading": "Chemin des scrapers"
+ },
"scraping": "Scraping",
"sqlite_location": "Emplacement du fichier de base de données SQLite (nécéssite un redémarrage)",
"video_ext_desc": "Liste des extensions de fichiers Vidéos.",
@@ -583,9 +585,13 @@
},
"overwrite_filter_confirm": "Êtes-vous sûr de vouloir écraser le filtre sauvegardé {entityName} ?",
"scene_gen": {
+ "force_transcodes": "Forcer la génération de transcodage",
+ "force_transcodes_tooltip": "Par défaut, les transcodages ne sont générés que lorsque le fichier vidéo n'est pas pris en charge dans le navigateur. Lorsqu'il est activé, les transcodes seront générés même lorsque le fichier vidéo semble être pris en charge dans le navigateur.",
"image_previews": "Aperçus image (Image WebP animée. Requis seulement si le type d'Aperçu est défini sur Image Animée)",
+ "image_previews_tooltip": "Aperçus animés (en WebP), requis uniquement si le type d'aperçu est défini sur Image animée.",
"interactive_heatmap_speed": "Générer des cartes thermiques et des vitesses pour des scènes interactives",
"marker_image_previews": "Aperçus Marqueurs (Image WebP animée. Requis seulement si le type d'aperçu est défini sur Image Animée)",
+ "marker_image_previews_tooltip": "Aperçus animé des marqueurs (en WebP), requis uniquement si le type d'aperçu est défini sur Image animée.",
"marker_screenshots": "Capture d'écran Marqueurs (Image JPG fixe. Requis seulement si le type d'Aperçu est défini sur Image Fixe)",
"markers": "Aperçus des Marqueurs",
"markers_tooltip": "Vidéo de 20 secondes qui commence au timecode indiqué.",
@@ -595,6 +601,7 @@
"preview_exclude_end_time_head": "Exclure à la fin",
"preview_exclude_start_time_desc": "Exclure les x premières secondes de la vidéo pour la génération de l'aperçu. La valeur peut-être exprimée en secondes ou bien en pourcentage (ex : 2%) de la durée totale de la vidéo.",
"preview_exclude_start_time_head": "Exclure au début",
+ "preview_generation_options": "Options des générations d'aperçu",
"preview_options": "Options d'Aperçus",
"preview_preset_desc": "Le Preset d'encodage régule la taille, la qualité et le temps d'encodage des aperçus. Les Preset plus bas que “slow” n'apportent pas de gain significatif et ne sont pas recommandés.",
"preview_preset_head": "Preset d'encodage de l'aperçu",
@@ -680,6 +687,14 @@
"gallery": "Galerie",
"gallery_count": "Nombre de Galeries",
"gender": "Genre",
+ "gender_types": {
+ "FEMALE": "Femme",
+ "INTERSEX": "Intersexe",
+ "MALE": "Homme",
+ "NON_BINARY": "Non Binaire",
+ "TRANSGENDER_FEMALE": "Femme transgenre",
+ "TRANSGENDER_MALE": "Homme transgenre"
+ },
"hair_color": "Couleur des cheveux",
"hasMarkers": "Possède des marqueurs",
"height": "Taille",
diff --git a/ui/v2.5/src/locales/index.ts b/ui/v2.5/src/locales/index.ts
index 89da63cd0..9a1f270ca 100644
--- a/ui/v2.5/src/locales/index.ts
+++ b/ui/v2.5/src/locales/index.ts
@@ -9,6 +9,11 @@ import fiFI from "./fi-FI.json";
import svSE from "./sv-SE.json";
import zhTW from "./zh-TW.json";
import zhCN from "./zh-CN.json";
+import hrHR from "./hr-HR.json";
+import nlNL from "./nl-NL.json";
+import ruRU from "./ru-RU.json";
+import trTR from "./tr-TR.json";
+import jaJP from "./ja-JP.json";
export default {
deDE,
@@ -22,4 +27,9 @@ export default {
svSE,
zhTW,
zhCN,
+ hrHR,
+ nlNL,
+ ruRU,
+ trTR,
+ jaJP,
};
diff --git a/ui/v2.5/src/locales/it-IT.json b/ui/v2.5/src/locales/it-IT.json
index 1265eb831..7977a5182 100644
--- a/ui/v2.5/src/locales/it-IT.json
+++ b/ui/v2.5/src/locales/it-IT.json
@@ -26,6 +26,7 @@
"delete": "Cancella",
"delete_entity": "Cancella {entityType}",
"delete_file": "Cancella file",
+ "delete_file_and_funscript": "Cancella file (e funscript)",
"delete_generated_supporting_files": "Cancella file di supporto creati",
"disallow": "Non Acconsentire",
"download": "Scarica",
@@ -44,6 +45,7 @@
"generate_thumb_from_current": "Genera thumbnail dall'attuale schermata",
"hash_migration": "migrazione hash",
"hide": "Nascondi",
+ "hide_configuration": "Nascondi Configurazione",
"identify": "Identifica",
"ignore": "Ignora",
"import": "Importa…",
@@ -87,8 +89,11 @@
"set_front_image": "Immagine Frontale…",
"set_image": "Imposta immagine…",
"show": "Mostra",
+ "show_configuration": "Mostra Configurazione",
"skip": "Salta",
"stop": "Stop",
+ "submit": "Invia",
+ "submit_stash_box": "Invia a Stash-Box",
"tasks": {
"clean_confirm_message": "Sei sicuro di voler Pulire? Questa azione cancellerà informazioni e contenuto creato dal database per tutte le scene e gallerie che non si trovano più nel file system.",
"dry_mode_selected": "Dry Mode selezionato. Nessuna cancellazione avverrà, solo log.",
@@ -130,8 +135,8 @@
"set_cover_label": "Imposta la copertina della scena",
"set_tag_desc": "Attacca tag alla scena, sovrascrivendoli o unendoli a quelli esistenti sulla scena.",
"set_tag_label": "Imposta i tags",
- "show_male_desc": "Attiva/Disattiva l'opzione di taggare attori.",
- "show_male_label": "Mostra attori",
+ "show_male_desc": "Attiva/Disattiva l'opzione di taggare attori maschi.",
+ "show_male_label": "Mostra attori maschi",
"source": "Sorgente"
},
"noun_query": "Query",
@@ -220,8 +225,6 @@
"password": "Password",
"password_desc": "Password per accedere a Stash. Lasciare vuota per disabilitare l'autenticazione utente",
"stash-box_integration": "Integrazione Stash-box",
- "trusted_proxies": "Proxy fidati",
- "trusted_proxies_desc": "Lista di Proxy con accesso per incanalare traffico verso Stash. Lasciare vuoto per acconsentire da rete privata.",
"username": "Nome Utente",
"username_desc": "Nome Utente per accedere a Stash. Lasciare vuoto per disabilitare l'autenticazione"
},
@@ -303,7 +306,7 @@
"stashbox": {
"add_instance": "Aggiungi istanza stash-box",
"api_key": "Chiave API",
- "description": "Stash-box facilita il tag automatico delle scene e degli/delle attori/attrici basandosi sulle impronte e nomi file.\nL'endpoint e la chiave API possono essere trovati sul tuo account sull'istanza stash-box. I nomi sono richiesti quando più di un'istanza è aggiunta..",
+ "description": "Stash-box facilita il tag automatico delle scene e degli attori basandosi sulle impronte e nomi file.\nL'endpoint e la chiave API possono essere trovati sul tuo account sull'istanza stash-box. I nomi sono richiesti quando più di un'istanza è aggiunta..",
"endpoint": "Endpoint",
"graphql_endpoint": "Endpoint del GraphQL",
"name": "Nome",
@@ -414,6 +417,8 @@
},
"desktop_integration": {
"desktop_integration": "Integrazione Desktop",
+ "notifications_enabled": "Attiva Notifiche",
+ "send_desktop_notifications_for_events": "Invia notifiche desktop per gli eventi",
"skip_opening_browser": "Salta l'Apertura del Browser",
"skip_opening_browser_on_startup": "Salta l'apertura automatica del browser durante l'avvio"
},
@@ -456,8 +461,8 @@
"performers": {
"options": {
"image_location": {
- "description": "Percorso personalizzato per le immagini predefinite degli/delle attori/attrici. Lasciare vuoto per usare il predefinito interno",
- "heading": "Percorso Immagini Attori/Attrici Personalizzato"
+ "description": "Percorso personalizzato per le immagini predefinite degli attori. Lasciare vuoto per usare il predefinito interno",
+ "heading": "Percorso Immagine Attore/Attrice Personalizzato"
}
}
},
@@ -487,7 +492,8 @@
"continue_playlist_default": {
"description": "Avvia la prossima scena in coda quando il video finisce",
"heading": "Continua la playlist per impostazione predefinita"
- }
+ },
+ "show_scrubber": "Mostra Scrubber"
}
},
"scene_wall": {
@@ -550,7 +556,7 @@
"developmentVersion": "Versione Sviluppo",
"dialogs": {
"aliases_must_be_unique": "gli alias devono essere univoci",
- "delete_alert": "Il seguente/I seguenti {count, plural, one {{singularEntity}} other {{pluralEntity}}} sarà/saranno eliminati permanentemente:",
+ "delete_alert": "Il seguente/I seguenti {count, plural, one {{singularEntity}} other {{pluralEntity}}} sarà/saranno cancellati permanentemente:",
"delete_confirm": "Sei sicuro di voler cancellare {entityName}?",
"delete_entity_desc": "{count, plural, one {Sei sicuro di voler cancellare questo/a {singularEntity}? A meno che anche il file venga cancellato, questo/a {singularEntity} sarà riaggiunto quando la scansione verrà effettuata.} other {Sei sicuro di voler cancellare questi/e {pluralEntity}? A meno che anche i file vengano cancellati, questi/e {pluralEntity} verranno riaggiunti quando la scansione verrà effettuata.}}",
"delete_entity_title": "{count, plural, one {Cancellazione {singularEntity}} other {Cancellazione {pluralEntity}}}",
@@ -651,6 +657,7 @@
"search_accuracy_label": "Accuratezza Ricerca",
"title": "Scene Duplicate"
},
+ "duplicated_phash": "Duplicato (phash)",
"duration": "Lunghezza",
"effect_filters": {
"aspect": "Aspetto",
@@ -692,6 +699,14 @@
"gallery": "Galleria",
"gallery_count": "Numero Gallerie",
"gender": "Genere",
+ "gender_types": {
+ "FEMALE": "Donna",
+ "INTERSEX": "Intersessualità",
+ "MALE": "Uomo",
+ "NON_BINARY": "Non-Binario",
+ "TRANSGENDER_FEMALE": "Donna Transgender",
+ "TRANSGENDER_MALE": "Uomo Transgender"
+ },
"hair_color": "Colore Capelli",
"hasMarkers": "Ha Marcatori",
"height": "Altezza",
@@ -750,11 +765,49 @@
"parent_tags": "Tag Principali",
"part_of": "Parte di {parent}",
"path": "Percorso",
+ "perceptual_similarity": "Somiglianza percettiva (phash)",
"performer": "Attore/Attrice",
- "performerTags": "Tag Attori/Attrici",
+ "performerTags": "Tag Attore/Attrice",
+ "performer_age": "Età Attore/Attrice",
"performer_count": "Numero Attori",
+ "performer_favorite": "Attore/Attrice Favorito",
"performer_image": "Immagine Attore/Attrice",
- "performers": "Attori/Attrici",
+ "performer_tagger": {
+ "add_new_performers": "Aggiungi Nuovi Attori",
+ "any_names_entered_will_be_queried": "Qualsiasi nome inserito sarà richiesto dall'istanza remota Stash-Box e aggiunto se trovato. Solo corrispondenze esatte saranno considerate corrispondenze.",
+ "batch_add_performers": "Aggiungi Attori in Blocco",
+ "batch_update_performers": "Aggiorna Attori in Blocco",
+ "config": {
+ "active_stash-box_instance": "Istanza stash-box attiva:",
+ "edit_excluded_fields": "Modifica Campi Esclusi",
+ "excluded_fields": "Campi esclusi:",
+ "no_fields_are_excluded": "Nessun campo escluso",
+ "no_instances_found": "Nessuna istanza trovata",
+ "these_fields_will_not_be_changed_when_updating_performers": "Questi campi non saranno modificati quando si aggiorneranno gli attori."
+ },
+ "current_page": "Pagina corrente",
+ "failed_to_save_performer": "Salvataggio attore/attrice \"{performer}\" fallito",
+ "name_already_exists": "Nome già esistente",
+ "network_error": "Errore di Rete",
+ "no_results_found": "Nessun risultato trovato.",
+ "number_of_performers_will_be_processed": "{performer_count} attori saranno processati",
+ "performer_already_tagged": "Attore/Attrice già taggato/a",
+ "performer_names_separated_by_comma": "Nome attore/attrice separato da virgola",
+ "performer_selection": "Selezione attore/attrice",
+ "performer_successfully_tagged": "Attore/Attrice taggato/a con successo:",
+ "query_all_performers_in_the_database": "Tutti gli attori nel database",
+ "refresh_tagged_performers": "Aggiorna attori taggati",
+ "refreshing_will_update_the_data": "Aggiornare aggiornerà i dati di qualsiasi attore/attrice taggato dall'istanza stash-box.",
+ "status_tagging_job_queued": "Stato: Lavoro tag in coda",
+ "status_tagging_performers": "Stato: Taggando attori",
+ "tag_status": "Stato tag",
+ "to_use_the_performer_tagger": "Per usare un tagger per attore/attrice un'istanza stash-box dev'essere configurata.",
+ "untagged_performers": "Attori non taggati",
+ "update_performer": "Aggiornare Attore/Attrice",
+ "update_performers": "Aggiorna Attori",
+ "updating_untagged_performers_description": "Aggiornare gli attori non taggati cercherà di abbinare qualsiasi attore/attrice senza stashid e aggiornerà i metadata."
+ },
+ "performers": "Attori",
"piercings": "Piercing",
"queue": "Coda",
"random": "Casuale",
@@ -852,6 +905,12 @@
},
"stash_id": "ID Stash",
"stash_ids": "ID Stash",
+ "stashbox": {
+ "go_review_draft": "Vai al {endpoint_name} per revisionare la bozza.",
+ "selected_stash_box": "Endpoint Stash-Box selezionato",
+ "submission_failed": "Invio fallito",
+ "submission_successful": "Invio riuscito"
+ },
"stats": {
"image_size": "Dimensione immagini",
"scenes_duration": "Lunghezza scene",
diff --git a/ui/v2.5/src/locales/ja-JP.json b/ui/v2.5/src/locales/ja-JP.json
new file mode 100644
index 000000000..177c13a36
--- /dev/null
+++ b/ui/v2.5/src/locales/ja-JP.json
@@ -0,0 +1,958 @@
+{
+ "actions": {
+ "add": "追加",
+ "add_directory": "ディレクトリを追加",
+ "add_entity": "{entityType}を追加",
+ "add_to_entity": "{entityType}に追加",
+ "allow": "許可",
+ "allow_temporarily": "一時的に許可",
+ "apply": "適用",
+ "auto_tag": "自動タグ付け",
+ "backup": "バックアップ",
+ "browse_for_image": "画像を参照…",
+ "cancel": "キャンセル",
+ "clean": "クリーニング",
+ "clear": "クリア",
+ "clear_back_image": "背景画像を削除",
+ "clear_front_image": "ジャケット画像をクリア",
+ "clear_image": "画像をクリア",
+ "close": "閉じる",
+ "confirm": "確認",
+ "continue": "続行",
+ "create": "作成",
+ "create_entity": "{entityType}を作成",
+ "create_marker": "マーカーを作成",
+ "created_entity": "{entity_type}を作成しました: {entity_name}",
+ "delete": "削除",
+ "delete_entity": "{entityType}を削除",
+ "delete_file": "ファイルを削除",
+ "delete_file_and_funscript": "ファイルを削除 (ファンスクリプトを含む)",
+ "delete_generated_supporting_files": "生成済みのサポートファイルを削除",
+ "disallow": "拒否",
+ "download": "ダウンロード",
+ "download_backup": "バックアップをダウンロード",
+ "edit": "編集",
+ "export": "エクスポート…",
+ "export_all": "全てエクスポート…",
+ "find": "探す",
+ "finish": "完了",
+ "from_file": "ファイルから…",
+ "from_url": "URLから…",
+ "full_export": "完全エクスポート",
+ "full_import": "完全インポート",
+ "generate": "生成",
+ "generate_thumb_default": "デフォルトサムネイルの生成",
+ "generate_thumb_from_current": "現在のものからサムネイルを生成",
+ "hash_migration": "ハッシュ移行",
+ "hide": "非表示",
+ "hide_configuration": "設定を非表示",
+ "identify": "識別",
+ "ignore": "無視",
+ "import": "インポート…",
+ "import_from_file": "ファイルからインポート",
+ "merge": "マージ",
+ "merge_from": "次からマージ:",
+ "merge_into": "次へマージ:",
+ "next_action": "次へ",
+ "not_running": "未実行",
+ "open_random": "ランダムで開く",
+ "overwrite": "上書き",
+ "play_random": "ランダム再生",
+ "play_selected": "選択したものを再生",
+ "preview": "プレビュー",
+ "previous_action": "戻る",
+ "refresh": "更新",
+ "reload_plugins": "プラグインを再読み込み",
+ "reload_scrapers": "スクレイパーを再読み込み",
+ "remove": "削除",
+ "rename_gen_files": "生成済みのファイルの名前を変更",
+ "rescan": "再スキャン",
+ "reshuffle": "再シャッフル",
+ "running": "実行中",
+ "save": "保存",
+ "save_delete_settings": "削除時にこれらの設定をデフォルトで使用する",
+ "save_filter": "フィルターを保存",
+ "scan": "スキャン",
+ "scrape": "スクレイプ",
+ "scrape_query": "スクレイプクエリ",
+ "scrape_scene_fragment": "フラグメントでスクレイプ",
+ "scrape_with": "次でスクレイプ…",
+ "search": "検索",
+ "select_all": "全て選択",
+ "select_folders": "フォルダーを選択",
+ "select_none": "選択なし",
+ "selective_auto_tag": "選択して自動タグ付け",
+ "selective_clean": "選択してクリーニング",
+ "selective_scan": "選択してスキャン",
+ "set_as_default": "デフォルトに設定",
+ "set_back_image": "背景画像…",
+ "set_front_image": "ジャケット画像…",
+ "set_image": "画像を設定…",
+ "show": "表示",
+ "show_configuration": "設定を表示",
+ "skip": "スキップ",
+ "stop": "停止",
+ "submit": "送信",
+ "submit_stash_box": "Stash-Boxに送信",
+ "tasks": {
+ "clean_confirm_message": "クリーニングを実行してもよろしいですか?この操作により、ファイルシステムで利用されていないすべてのシーンとギャラリーから生成されたコンテンツとデータベース情報が削除されます。",
+ "dry_mode_selected": "ドライモードが選択されています。実際の削除は実施されず、ログ処理だけが実行されます。",
+ "import_warning": "インポートしてもよろしいですか?この操作により、データベースが削除され、エクスポートされているメタデータから改めてインポートされます。"
+ },
+ "temp_disable": "一時的に無効…",
+ "temp_enable": "一時的に有効…",
+ "use_default": "デフォルトを使用",
+ "view_random": "ランダムで表示"
+ },
+ "actions_name": "操作",
+ "age": "年齢",
+ "aliases": "別名",
+ "all": "全て",
+ "also_known_as": "A.K.A",
+ "ascending": "昇順",
+ "average_resolution": "平均的な解像度",
+ "birth_year": "誕生年",
+ "birthdate": "誕生日",
+ "bitrate": "ビットレート",
+ "career_length": "キャリア歴",
+ "component_tagger": {
+ "config": {
+ "active_instance": "アクティブなStash-boxのインスタンス:",
+ "blacklist_desc": "ブラックリストに指定したアイテムはクエリから除外されます。これらは正規表現かつ大文字と小文字は区別されません。特定の文字はバックスラッシュでエスケープする必要があります: {chars_require_escape}",
+ "blacklist_label": "ブラックリスト",
+ "query_mode_auto": "自動",
+ "query_mode_auto_desc": "利用可能であればメタデータまたはファイル名を使用",
+ "query_mode_dir": "ディレクトリ",
+ "query_mode_dir_desc": "動画ファイルの親ディレクトリのみを使用します",
+ "query_mode_filename": "ファイル名",
+ "query_mode_filename_desc": "ファイル名のみを使用します",
+ "query_mode_label": "クエリモード",
+ "query_mode_metadata": "メタデータ",
+ "query_mode_metadata_desc": "メタデータのみを使用します",
+ "query_mode_path": "パス",
+ "query_mode_path_desc": "ファイルパス全体を使用します",
+ "set_cover_desc": "見つかった場合はシーンのカバー画像を置き換えます。",
+ "set_cover_label": "シーンのカバー画像を設定",
+ "set_tag_desc": "シーン上の既存のタグを上書きまたはマージすることで、シーンにタグを付与します。",
+ "set_tag_label": "タグを設定",
+ "show_male_desc": "男優をタグ付けできるかを切り替えます。",
+ "show_male_label": "男優を表示",
+ "source": "ソース"
+ },
+ "noun_query": "クエリ",
+ "results": {
+ "duration_off": "最低{number}秒間オフ",
+ "duration_unknown": "長さ不明",
+ "fp_found": "{fpCount, plural, =0 {No new fingerprint matches found} other {# new fingerprint matches found}}",
+ "fp_matches": "長さが一致しました",
+ "fp_matches_multi": "長さが一致しました {matchCount}/{durationsLength}件のハッシュ値",
+ "hash_matches": "{hash_type}が一致しました",
+ "match_failed_already_tagged": "シーンはすでにタグ付けされています",
+ "match_failed_no_result": "結果が見つかりませんでした",
+ "match_success": "シーンのタグ付けに成功しました",
+ "phash_matches": "{count}件のPハッシュが一致しました",
+ "unnamed": "名称未設定"
+ },
+ "verb_match_fp": "ハッシュ値を突き合わせる",
+ "verb_matched": "一致",
+ "verb_scrape_all": "全てスクレイプ",
+ "verb_submit_fp": "送信 {fpCount, plural, one{# Fingerprint} other{# Fingerprints}}",
+ "verb_toggle_config": "{toggle} {configuration}",
+ "verb_toggle_unmatched": "{toggle} 一致しないシーン"
+ },
+ "config": {
+ "about": {
+ "build_hash": "ビルドハッシュ:",
+ "build_time": "ビルド日時:",
+ "check_for_new_version": "新しいバージョンを確認",
+ "latest_version": "最新バージョン",
+ "latest_version_build_hash": "最新バージョンのビルドハッシュ:",
+ "new_version_notice": "[NEW]",
+ "stash_discord": "私たちの{url}チャンネルへ参加しませんか",
+ "stash_home": "Stashのすべては{url}にあります",
+ "stash_open_collective": "{url}からStashの開発を支援",
+ "stash_wiki": "Stashの{url}で疑問を解決",
+ "version": "バージョン"
+ },
+ "application_paths": {
+ "heading": "アプリケーションパス"
+ },
+ "categories": {
+ "about": "Stashについて",
+ "interface": "インターフェース",
+ "logs": "ログ",
+ "metadata_providers": "メタデータのプロバイダー",
+ "plugins": "プラグイン",
+ "scraping": "スクレイピング",
+ "security": "セキュリティー",
+ "services": "サービス",
+ "system": "システム",
+ "tasks": "タスク",
+ "tools": "ツール"
+ },
+ "dlna": {
+ "allow_temp_ip": "{tempIP}を許可",
+ "allowed_ip_addresses": "許可済みのIPアドレス",
+ "default_ip_whitelist": "デフォルトIPアドレスのホワイトリスト",
+ "default_ip_whitelist_desc": "デフォルトIPアドレスからのDLNAへのアクセスを許可します。すべてのIPアドレスを許可するには、{wildcard}を使用してください。",
+ "enabled_by_default": "デフォルトで有効",
+ "network_interfaces": "インターフェース",
+ "network_interfaces_desc": "DLNAサーバーを公開するためのネットワークインターフェースです。リストが空の場合は、すべてのインターフェースで実行されます。 変更後にDLNAを再起動する必要があります。",
+ "recent_ip_addresses": "最近のIPアドレス",
+ "server_display_name": "サーバー表示名",
+ "server_display_name_desc": "DLNAサーバーの表示名を設定できます。空欄の場合は、デフォルトの{server_name}が設定されます。",
+ "until_restart": "再起動まで"
+ },
+ "general": {
+ "auth": {
+ "api_key": "APIキー",
+ "api_key_desc": "外部システムのためのAPIキーです。ユーザー名/パスワードが設定されている場合のみ必要です。ユーザー名はAPIキーを生成する前に保存されている必要があります。",
+ "authentication": "認証",
+ "clear_api_key": "APIキーをクリア",
+ "credentials": {
+ "description": "Stashへのアクセスを制限するための認証情報です。",
+ "heading": "認証情報"
+ },
+ "generate_api_key": "APIキーを生成",
+ "log_file": "ログファイル",
+ "log_file_desc": "ログを出力するファイルのパスを指定してください。空白の場合は、ファイルへのログ出力が無効になります。設定後は再起動が必要です。",
+ "log_http": "http accessのログ",
+ "log_http_desc": "http accessログをターミナルへ出力します。設定後は再起動が必要です。",
+ "log_to_terminal": "ターミナルへログ出力",
+ "log_to_terminal_desc": "ファイルに加えて、ターミナルへログ出力します。ファイルへのログ出力が無効であっても有効になります。設定後は再起動が必要です。",
+ "maximum_session_age": "最大セッション期限",
+ "maximum_session_age_desc": "ログインセッションが無効になるまでの最大待機時間を”秒”単位で指定できます。",
+ "password": "パスワード",
+ "password_desc": "Stashにアクセスするためのパスワードです。空白にすると、ユーザー認証を無効にします",
+ "stash-box_integration": "Stash-boxの連携",
+ "username": "ユーザー名",
+ "username_desc": "Stashにアクセスするためのユーザー名です。空白にすると、ユーザー認証を無効にします"
+ },
+ "cache_location": "キャッシュのディレクトリ",
+ "cache_path_head": "キャッシュのパス",
+ "calculate_md5_and_ohash_desc": "oshashに加えてMD5チェックサムを計算します。有効にすると、初期スキャンが少々遅くなります。MD5計算を無効にするには、ファイル名のハッシュをoshashに設定する必要があります。",
+ "calculate_md5_and_ohash_label": "動画のMD5を計算",
+ "check_for_insecure_certificates": "安全でない証明書をチェック",
+ "check_for_insecure_certificates_desc": "一部のサイトは安全でないSSL証明書を使用している場合があります。チェックを外すと、スクレイパーは安全でない証明書のチェックをスキップし、それらのサイトのスクレイピングを許可します。 スクレイピング時に証明書エラーが発生した場合は、これのチェックを外してください。",
+ "chrome_cdp_path": "Chrome CDPのパス",
+ "chrome_cdp_path_desc": "Chrome実行ファイルへのパスまたはChromeインスタンスへのリモートアドレス(http://またはhttps://から始まるもの、例えばhttp://localhost:9222/json/version)を指定してください。",
+ "create_galleries_from_folders_desc": "有効な場合、画像を含むフォルダーからギャラリーを作成します。",
+ "create_galleries_from_folders_label": "画像を含むフォルダーからギャラリーを作成",
+ "db_path_head": "データベースパス",
+ "directory_locations_to_your_content": "コンテンツの場所",
+ "excluded_image_gallery_patterns_desc": "スキャンから除外し、クリーニングに追加する画像とギャラリーのファイル/パスの正規表現を指定できます",
+ "excluded_image_gallery_patterns_head": "除外する画像/ギャラリーの規則",
+ "excluded_video_patterns_desc": "スキャンから除外し、クリーニングに追加する動画のファイル/パスの正規表現を指定できます",
+ "excluded_video_patterns_head": "除外する動画の規則",
+ "gallery_ext_desc": "ギャラリーzipファイルとして認識させるファイル拡張子のコンマ区切りリストです。",
+ "gallery_ext_head": "ギャラリーzipの拡張子",
+ "generated_file_naming_hash_desc": "生成されたファイルの命名にMD5またはoshashを使用します。これを変更するには、すべてのシーンに該当するMD5/oshash値が適用されている必要があります。この値を変更後、既に存在する生成済みのファイルを移行または再生成する必要があります。遺構についてはタスクページをご確認ください。",
+ "generated_file_naming_hash_head": "生成ファイルの命名ハッシュ",
+ "generated_files_location": "生成ファイル(シーンマーカー、シーンプレビュー、スプライトイメージなど)を保存するディレクトリを指定してください",
+ "generated_path_head": "生成ファイルパス",
+ "hashing": "ハッシュ",
+ "image_ext_desc": "画像として認識させるファイル拡張子のコンマ区切りリストです。",
+ "image_ext_head": "画像の拡張子",
+ "include_audio_desc": "プレビューを生成する際に、音声を含めます。",
+ "include_audio_head": "音声を含める",
+ "logging": "ロギング",
+ "maximum_streaming_transcode_size_desc": "トランスコードストリームの最大サイズ",
+ "maximum_streaming_transcode_size_head": "ストリーミングトランスコードの最大サイズ",
+ "maximum_transcode_size_desc": "生成ファイルのトランスコードの最大サイズ",
+ "maximum_transcode_size_head": "最大トランスコードサイズ",
+ "metadata_path": {
+ "description": "完全エクスポートまたはインポートを実行する際に使用されるディレクトリ",
+ "heading": "メタデータのパス"
+ },
+ "number_of_parallel_task_for_scan_generation_desc": "自動検出にする場合は0を設定してください。CPU使用率が100%に達するタスク数以上の値を設定すると、パフォーマンスの低下やその他の問題が発生する場合があります。",
+ "number_of_parallel_task_for_scan_generation_head": "スキャン/生成の同時実行タスク数",
+ "parallel_scan_head": "同時スキャン/生成",
+ "preview_generation": "プレビューの生成",
+ "scraper_user_agent": "スクレイパーのユーザーエージェント",
+ "scraper_user_agent_desc": "httpリクエストによるスクレイプを実行する際に使用するユーザーエージェント",
+ "scrapers_path": {
+ "description": "スクレイパーの設定ファイルを保存するディレクトリ",
+ "heading": "スクレイパーのパス"
+ },
+ "scraping": "スクレイピング",
+ "sqlite_location": "SQLiteデータベースファイルの保存場所(再起動が必要です)",
+ "video_ext_desc": "動画として認識させるファイル拡張子のコンマ区切りリストです。",
+ "video_ext_head": "動画の拡張子",
+ "video_head": "動画"
+ },
+ "library": {
+ "exclusions": "除外",
+ "gallery_and_image_options": "ギャラリーと画像オプション",
+ "media_content_extensions": "メディアコンテンツの拡張子"
+ },
+ "logs": {
+ "log_level": "ログレベル"
+ },
+ "plugins": {
+ "hooks": "フック",
+ "triggers_on": "ONにするトリガー"
+ },
+ "scraping": {
+ "entity_metadata": "{entityType}のメタデータ",
+ "entity_scrapers": "{entityType}のスクレイパー",
+ "excluded_tag_patterns_desc": "スクレイピング結果から除外するタグ名の正規表現",
+ "excluded_tag_patterns_head": "除外タグの規則",
+ "scraper": "スクレイパー",
+ "scrapers": "スクレイパー",
+ "search_by_name": "名前で検索",
+ "supported_types": "サポートされているタイプ",
+ "supported_urls": "URL"
+ },
+ "stashbox": {
+ "add_instance": "stash-boxインスタンスを追加",
+ "api_key": "APIキー",
+ "description": "stash-boxはフィンガープリントとファイル名をもとに、シーンと出演者のタグ付けを自動的に行います。\nエンドポイントとAPIキーは、stash-boxインスタンス上のアカウントページからご確認いただけます。2インスタンス以上を追加する場合は、名前の設定が必要になります。",
+ "endpoint": "エンドポイント",
+ "graphql_endpoint": "GraphQL エンドポイント",
+ "name": "名前",
+ "title": "Stash-box エンドポイント"
+ },
+ "system": {
+ "transcoding": "トランスコード"
+ },
+ "tasks": {
+ "added_job_to_queue": "{operation_name}がジョブキューに追加されました",
+ "auto_tag": {
+ "auto_tagging_all_paths": "すべてのパスを自動タグ付け",
+ "auto_tagging_paths": "次のパスを自動タグ付け:"
+ },
+ "auto_tag_based_on_filenames": "ファイル名をもとにコンテンツを自動タグ付けします。",
+ "auto_tagging": "自動タグ付け",
+ "backing_up_database": "データベースをバックアップ",
+ "backup_and_download": "データベースのバックアップを実施し、結果ファイルをダウンロードします。",
+ "backup_database": "{filename_format}形式で、データベースと同じフォルダーにデータベースをバックアップします",
+ "cleanup_desc": "不明なファイルを確認し、データベースから削除します。この操作はもとに戻せません。",
+ "data_management": "データ管理",
+ "defaults_set": "デフォルトが設定されており、タスクページの{action}ボタンをクリックした際に使用されます。",
+ "dont_include_file_extension_as_part_of_the_title": "タイトルの一部にファイル拡張子を含めない",
+ "empty_queue": "現在実行中のタスクはありません。",
+ "export_to_json": "メタデータディレクトリ内にJSONフォーマットでデータベースコンテンツをエクスポートします。",
+ "generate": {
+ "generating_from_paths": "次のパスからシーンを生成中",
+ "generating_scenes": "{num} {scene}を生成中"
+ },
+ "generate_desc": "サポートされている画像、スプライトイメージ、動画、vttとその他ファイルを生成します。",
+ "generate_phashes_during_scan": "知覚的ハッシュを生成",
+ "generate_phashes_during_scan_tooltip": "重複排除とシーン検知で使用されます。",
+ "generate_previews_during_scan": "アニメーション形式の画像プレビューを生成",
+ "generate_previews_during_scan_tooltip": "プレビュータイプがアニメーション画像に設定されている場合のみ必要となる、WebP形式のアニメーションプレビューを生成します。",
+ "generate_sprites_during_scan": "ザッピング用のスプライトイメージを生成",
+ "generate_thumbnails_during_scan": "画像のサムネイルを生成",
+ "generate_video_previews_during_scan": "プレビューを生成",
+ "generate_video_previews_during_scan_tooltip": "シーンにマウスカーソルを当てている際に再生されるプレビュー動画を生成",
+ "generated_content": "生成コンテンツ",
+ "identify": {
+ "and_create_missing": "と不足コンテンツを作成",
+ "create_missing": "不足コンテンツを作成",
+ "default_options": "デフォルト設定",
+ "description": "stash-boxとスクレイパーソースを使用してシーンにメタデータを自動設定します。",
+ "explicit_set_description": "これらの設定は、ソース固有の設定を上書きできない場合に使用されます。",
+ "field": "フィールド",
+ "field_behaviour": "{strategy} {field}",
+ "field_options": "フィールド設定",
+ "heading": "識別",
+ "identifying_from_paths": "次のパスからシーンを識別中",
+ "identifying_scenes": "{num} {scene}を識別中",
+ "include_male_performers": "男優を含める",
+ "set_cover_images": "カバー画像を設定",
+ "set_organized": "分類フラグを設定",
+ "source": "ソース",
+ "source_options": "{source}設定",
+ "sources": "ソース",
+ "strategy": "戦略"
+ },
+ "import_from_exported_json": "メタデータライブラリ内のエクスポート済みのJSONファイルをインポートします。既に存在するデータベースは削除されます。",
+ "incremental_import": "エクスポートされたzipファイルから差分インポートします。",
+ "job_queue": "タスクキュー",
+ "maintenance": "メンテナンス",
+ "migrate_hash_files": "生成ファイルの命名ハッシュを変更後、既に存在する生成ファイルを新しいハッシュ形式にリネームする際に使用されます。",
+ "migrations": "移行",
+ "only_dry_run": "ドライモードで実行します。削除されません",
+ "plugin_tasks": "プラグインのタスク",
+ "scan": {
+ "scanning_all_paths": "すべてのパスをスキャン中",
+ "scanning_paths": "次のパスをスキャン中"
+ },
+ "scan_for_content_desc": "新しいコンテンツをスキャンし、データベースに追加します。",
+ "set_name_date_details_from_metadata_if_present": "ファイルのメタデータに埋め込まれている情報から名前、日付、詳細を設定する"
+ },
+ "tools": {
+ "scene_duplicate_checker": "シーン重複チェッカー",
+ "scene_filename_parser": {
+ "add_field": "フィールドを追加",
+ "capitalize_title": "タイトルを大文字にする",
+ "display_fields": "表示するフィールド",
+ "escape_chars": "リテラル文字をエスケープするには \\ を使用します",
+ "filename": "ファイル名",
+ "filename_pattern": "ファイル名の規則",
+ "ignore_organized": "分類されたシーンを無視",
+ "ignored_words": "無視する単語",
+ "matches_with": "{i}と一致",
+ "select_parser_recipe": "解析のレシピを選択",
+ "title": "シーンファイル名の解析",
+ "whitespace_chars": "空白文字",
+ "whitespace_chars_desc": "タイトルに含まれるこれらの文字は空白文字で置き換えられます"
+ },
+ "scene_tools": "シーンツール"
+ },
+ "ui": {
+ "basic_settings": "基本設定",
+ "custom_css": {
+ "description": "変更を適用するにはページを更新する必要があります。",
+ "heading": "カスタムCSS",
+ "option_label": "カスタムCSSを有効にする"
+ },
+ "delete_options": {
+ "description": "画像、ギャラリー、シーンを削除するときのデフォルト設定です。",
+ "heading": "削除オプション",
+ "options": {
+ "delete_file": "ファイルの削除をデフォルトにする",
+ "delete_generated_supporting_files": "サポートされているファイルの生成ファイル削除をデフォルトにする"
+ }
+ },
+ "desktop_integration": {
+ "desktop_integration": "デスクトップ連携",
+ "notifications_enabled": "通知を有効にする",
+ "send_desktop_notifications_for_events": "イベント発生時にデスクトップ通知を送信",
+ "skip_opening_browser": "ブラウザーの起動をスキップ",
+ "skip_opening_browser_on_startup": "起動時のブラウザーの自動起動をスキップする"
+ },
+ "editing": {
+ "disable_dropdown_create": {
+ "description": "ドロップダウンセレクターからの新規オブジェクトの生成を禁止する",
+ "heading": "ドロップダウンの生成を無効にする"
+ },
+ "heading": "編集中"
+ },
+ "funscript_offset": {
+ "description": "インタラクティブスクリプトの実行までのオフセットをミリ秒で指定できます。",
+ "heading": "Funscriptオフセット (ms)"
+ },
+ "handy_connection_key": {
+ "description": "Handy connection keyは、インタラクティブなシーンで使用されます。このキーを設定すると、Stashが現在のシーン情報をhandyfeeling.comと共有することを許可します",
+ "heading": "Handy Connection Key"
+ },
+ "images": {
+ "heading": "画像",
+ "options": {
+ "write_image_thumbnails": {
+ "description": "画像のサムネイルをオンザフライでディスクに書き込みます",
+ "heading": "画像のサムネイルを書き込む"
+ }
+ }
+ },
+ "interactive_options": "インタラクティブ設定",
+ "language": {
+ "heading": "言語"
+ },
+ "max_loop_duration": {
+ "description": "シーンプレーヤーが動画をループ再生するシーン数の最大を指定できます - 「0」を設定すると無効になります",
+ "heading": "最大ループ回数"
+ },
+ "menu_items": {
+ "description": "タイプナビゲーションバー上の異なるコンテンツタイプの表示または非表示を切り替えます",
+ "heading": "メニューアイテム"
+ },
+ "performers": {
+ "options": {
+ "image_location": {
+ "description": "出演者のデフォルト画像が保存されているカスタムパスを設定します。空白にすると、内蔵のデフォルト画像が使用されます",
+ "heading": "出演者のデフォルト画像パス"
+ }
+ }
+ },
+ "preview_type": {
+ "description": "ウォールアイテムの設定",
+ "heading": "プレビュータイプ",
+ "options": {
+ "animated": "アニメーション画像",
+ "static": "静止画",
+ "video": "動画"
+ }
+ },
+ "scene_list": {
+ "heading": "シーンリスト",
+ "options": {
+ "show_studio_as_text": "スタジオをテキストで表示"
+ }
+ },
+ "scene_player": {
+ "heading": "シーンプレーヤー",
+ "options": {
+ "auto_start_video": "動画を自動再生",
+ "auto_start_video_on_play_selected": {
+ "description": "選択したものまたはシーンページからのランダム再生時に動画を自動再生します",
+ "heading": "選択したものを再生した際に動画を自動再生"
+ },
+ "continue_playlist_default": {
+ "description": "動画の再生が終了した際にキューに入っている次の動画を再生します",
+ "heading": "デフォルトでプレイリストを続行"
+ },
+ "show_scrubber": "スクラバーを表示"
+ }
+ },
+ "scene_wall": {
+ "heading": "シーン / マーカーウォール",
+ "options": {
+ "display_title": "タイトルとタグを表示",
+ "toggle_sound": "音声を有効にする"
+ }
+ },
+ "slideshow_delay": {
+ "description": "ウォールビューモードの際にギャラリーのスライドショーが利用できます",
+ "heading": "スライドショーの遅延時間"
+ },
+ "title": "ユーザーインターフェース"
+ }
+ },
+ "configuration": "設定",
+ "countables": {
+ "files": "{count, plural, one {File} other {Files}}",
+ "galleries": "{count, plural, one {Gallery} other {Galleries}}",
+ "images": "{count, plural, one {Image} other {Images}}",
+ "markers": "{count, plural, one {Marker} other {Markers}}",
+ "movies": "{count, plural, one {Movie} other {Movies}}",
+ "performers": "{count, plural, one {Performer} other {Performers}}",
+ "scenes": "{count, plural, one {Scene} other {Scenes}}",
+ "studios": "{count, plural, one {Studio} other {Studios}}",
+ "tags": "{count, plural, one {Tag} other {Tags}}"
+ },
+ "country": "国",
+ "cover_image": "カバー画像",
+ "created_at": "作成者:",
+ "criterion": {
+ "greater_than": "より大きい",
+ "less_than": "より小さい",
+ "value": "値"
+ },
+ "criterion_modifier": {
+ "between": "の間",
+ "equals": "である",
+ "excludes": "除く",
+ "format_string": "{criterion} {modifierString} {valueString}",
+ "greater_than": "が次より大きい",
+ "includes": "含む",
+ "includes_all": "すべて含む",
+ "is_null": "がnull",
+ "less_than": "が次より小さい",
+ "matches_regex": "が次の正規表現に一致",
+ "not_between": "の間でない",
+ "not_equals": "でない",
+ "not_matches_regex": "が正規表現に一致しない",
+ "not_null": "がnullでない"
+ },
+ "custom": "カスタム",
+ "date": "日付",
+ "death_date": "没日",
+ "death_year": "没年",
+ "descending": "降順",
+ "detail": "詳細",
+ "details": "詳細",
+ "developmentVersion": "開発者バージョン",
+ "dialogs": {
+ "aliases_must_be_unique": "別名は一意でなければいけません",
+ "delete_alert": "次の{count, plural, one {{singularEntity}} other {{pluralEntity}}}は完全に削除されます:",
+ "delete_confirm": "本当に{entityName}を削除してよろしいですか?",
+ "delete_entity_desc": "{count, plural, one {Are you sure you want to delete this {singularEntity}? Unless the file is also deleted, this {singularEntity} will be re-added when scan is performed.} other {Are you sure you want to delete these {pluralEntity}? Unless the files are also deleted, these {pluralEntity} will be re-added when scan is performed.}}",
+ "delete_entity_title": "{count, plural, one {Delete {singularEntity}} other {Delete {pluralEntity}}}",
+ "delete_galleries_extra": "...加えて、画像ファイルが他のどのギャラリーにも属していません。",
+ "delete_gallery_files": "ギャラリーフォルダー/zipファイルとギャラリーに属していない全ての画像を削除します。",
+ "delete_object_desc": "本当に{count, plural, one {this {singularEntity}} other {these {pluralEntity}}}を削除してもよろしいですか?",
+ "delete_object_overflow": "…加えて、{count}件とその他{count, plural, one {{singularEntity}} other {{pluralEntity}}}が含まれます。",
+ "delete_object_title": "{count, plural, one {{singularEntity}} other {{pluralEntity}}}を削除",
+ "edit_entity_title": "{count, plural, one {{singularEntity}} other {{pluralEntity}}}を編集",
+ "export_include_related_objects": "関連するオブジェクトをエクスポートに含める",
+ "export_title": "エクスポート",
+ "lightbox": {
+ "delay": "遅延時間 (秒)",
+ "display_mode": {
+ "fit_horizontally": "水平に合わせる",
+ "fit_to_screen": "画面に合わせる",
+ "label": "表示モード",
+ "original": "オリジナル"
+ },
+ "options": "オプション",
+ "reset_zoom_on_nav": "画像を変更した際のズームレベルをリセットする",
+ "scale_up": {
+ "description": "小さい画像を画面いっぱいに拡大する",
+ "label": "フィットするように拡大"
+ },
+ "scroll_mode": {
+ "description": "一時的に他のモードを使用するには、Shiftキーを押し続けてください。",
+ "label": "スクロールモード",
+ "pan_y": "Yにパン",
+ "zoom": "拡大"
+ }
+ },
+ "merge_tags": {
+ "destination": "場所",
+ "source": "ソース"
+ },
+ "overwrite_filter_confirm": "本当に保存されているクエリ「{entityName}」を上書きしてもよろしいですか?",
+ "scene_gen": {
+ "force_transcodes": "強制的にトランスコード済みファイルを生成",
+ "force_transcodes_tooltip": "初期設定では、トランスコード済みファイルはブラウザーがサポートしていない動画ファイルであった場合にのみ生成されます。有効にすると、ブラウザーがサポートする動画ファイルであった場合でもトランスコード済みファイルを生成します。",
+ "image_previews": "アニメーション画像によるプレビュー",
+ "image_previews_tooltip": "WebP形式のアニメーションプレビューは、プレビュータイプがアニメーション画像に設定されている場合のみ必要です。",
+ "interactive_heatmap_speed": "インタラクティブなシーン向けにヒートマップとスピードを生成",
+ "marker_image_previews": "マーカーにアニメーション画像プレビューを使用",
+ "marker_image_previews_tooltip": "WebP形式のアニメーションマーカープレビューは、プレビュータイプがアニメーション画像に設定されている場合のみ必要です。",
+ "marker_screenshots": "マーカーのスクリーンショット",
+ "marker_screenshots_tooltip": "マーカーのJPG画像は、プレビュータイプが静止画に設定されている場合のみ必要です。",
+ "markers": "マーカーのプレビュー",
+ "markers_tooltip": "マーカーに設定されたタイムコードから20秒間の動画を生成します。",
+ "overwrite": "既に生成済みの生成ファイルを上書きする",
+ "phash": "視覚的ハッシュ (重複排除用)",
+ "preview_exclude_end_time_desc": "シーンプレビューから最後のX秒を除外します。値は、秒またはシーンの再生時間の割合(2%など)で指定できます。",
+ "preview_exclude_end_time_head": "除外する動画の終了時間",
+ "preview_exclude_start_time_desc": "シーンプレビューから最初のX秒を除外します。値は、秒またはシーンの再生時間の割合(2%など)で指定できます。",
+ "preview_exclude_start_time_head": "除外する開始時間",
+ "preview_generation_options": "プレビューの生成オプション",
+ "preview_options": "プレビューオプション",
+ "preview_preset_desc": "エンコードプリセットは、プレビュー生成のサイズ、品質、およびエンコード時間を左右します。 「slow」を超えるプリセットは費用対効果が薄いため、推奨されません。",
+ "preview_preset_head": "プレビューのエンコードプリセット",
+ "preview_seg_count_desc": "プレビューファイルのセグメント数を設定します。",
+ "preview_seg_count_head": "プレビューのセグメント数",
+ "preview_seg_duration_desc": "各プレビューセグメントの長さを秒で指定します。",
+ "preview_seg_duration_head": "プレビューセグメントの長さ",
+ "sprites": "シーンのザッピング用スプライトイメージ",
+ "sprites_tooltip": "スプライトイメージ (シーンのザッピング用)",
+ "transcodes": "トランスコード",
+ "transcodes_tooltip": "サポートされていない動画フォーマットをMP4に変換します",
+ "video_previews": "プレビュー",
+ "video_previews_tooltip": "シーンにマウスカーソルを置いた時に再生されるビデオプレビュー"
+ },
+ "scenes_found": "{count}シーンが見つかりました",
+ "scrape_entity_query": "{entity_type}スクレイプクエリ",
+ "scrape_entity_title": "{entity_type} スクレイプ結果",
+ "scrape_results_existing": "存在します",
+ "scrape_results_scraped": "スクレイプ済み",
+ "set_image_url_title": "画像URL",
+ "unsaved_changes": "変更が保存されていません。本当に移動してよろしいですか?"
+ },
+ "dimensions": "寸法",
+ "director": "監督",
+ "display_mode": {
+ "grid": "グリッド",
+ "list": "リスト",
+ "tagger": "一括タグ付け",
+ "unknown": "不明",
+ "wall": "ウォール"
+ },
+ "donate": "寄付",
+ "dupe_check": {
+ "description": "「正確」より下のレベルは、計算に時間がかかる場合があります。 誤検知は、精度レベルが低い場合にも返却される可能性があります。",
+ "found_sets": "{setCount, plural, one{# set of duplicates found.} other {# sets of duplicates found.}}",
+ "options": {
+ "exact": "正確",
+ "high": "高",
+ "low": "低",
+ "medium": "中"
+ },
+ "search_accuracy_label": "検索精度",
+ "title": "重複シーン"
+ },
+ "duplicated_phash": "重複 (phash)",
+ "duration": "長さ",
+ "effect_filters": {
+ "aspect": "アスペクト比",
+ "blue": "青",
+ "blur": "ぼかし",
+ "brightness": "明るさ",
+ "contrast": "コントラスト",
+ "gamma": "ガンマ",
+ "green": "緑",
+ "hue": "色",
+ "name": "フィルター",
+ "name_transforms": "変換",
+ "red": "赤",
+ "reset_filters": "フィルターをリセット",
+ "reset_transforms": "変換をリセット",
+ "rotate": "回転",
+ "rotate_left_and_scale": "左に回転とスケール",
+ "rotate_right_and_scale": "右に回転とスケール",
+ "saturation": "彩度",
+ "scale": "スケール",
+ "warmth": "暖かさ"
+ },
+ "ethnicity": "民族性",
+ "eye_color": "瞳の色",
+ "fake_tits": "偽乳",
+ "false": "無効",
+ "favourite": "お気に入り",
+ "file": "ファイル",
+ "file_info": "ファイル情報",
+ "file_mod_time": "ファイル変更日時",
+ "files": "ファイル",
+ "filesize": "ファイルサイズ",
+ "filter": "フィルター",
+ "filter_name": "フィルター名",
+ "filters": "フィルター",
+ "framerate": "フレームレート",
+ "frames_per_second": "{value}FPS",
+ "galleries": "ギャラリー",
+ "gallery": "ギャラリー",
+ "gallery_count": "ギャラリー数",
+ "gender": "性別",
+ "gender_types": {
+ "FEMALE": "女性",
+ "INTERSEX": "間性",
+ "MALE": "男性",
+ "NON_BINARY": "ノンバイナリー",
+ "TRANSGENDER_FEMALE": "トランスジェンダーの女性",
+ "TRANSGENDER_MALE": "トランスジェンダーの男性"
+ },
+ "hair_color": "髪の色",
+ "hasMarkers": "マーカーあり?",
+ "height": "身長",
+ "help": "ヘルプ",
+ "image": "画像",
+ "image_count": "画像数",
+ "images": "画像",
+ "include_parent_tags": "親タグを含める",
+ "include_sub_studios": "子会社のスタジオを含める",
+ "include_sub_tags": "サブタグを含める",
+ "instagram": "Instagram",
+ "interactive": "インタラクティブ",
+ "interactive_speed": "インタラクティブ速度",
+ "isMissing": "見つからない?",
+ "library": "ライブラリー",
+ "loading": {
+ "generic": "読み込み中…"
+ },
+ "marker_count": "マーカー数",
+ "markers": "マーカー",
+ "measurements": "測定",
+ "media_info": {
+ "audio_codec": "音声コーデック",
+ "checksum": "チェックサム",
+ "downloaded_from": "ダウンロード元",
+ "hash": "ハッシュ",
+ "interactive_speed": "インタラクティブ速度",
+ "performer_card": {
+ "age": "{age}{years_old}",
+ "age_context": "{age} {years_old}(撮影当時)"
+ },
+ "phash": "PHash",
+ "stream": "ストリーム",
+ "video_codec": "動画コーデック"
+ },
+ "megabits_per_second": "{value}Mbps",
+ "metadata": "メタデータ",
+ "movie": "映画",
+ "movie_scene_number": "映画シーン数",
+ "movies": "映画",
+ "name": "名前",
+ "new": "新規作成",
+ "none": "なし",
+ "o_counter": "発射カウンター",
+ "operations": "オペレーション",
+ "organized": "分類済み",
+ "pagination": {
+ "first": "最初",
+ "last": "最後",
+ "next": "次へ",
+ "previous": "前へ"
+ },
+ "parent_of": "{children}の親",
+ "parent_studios": "親スタジオ",
+ "parent_tag_count": "親タグ数",
+ "parent_tags": "親タグ",
+ "part_of": "{parent}の一部",
+ "path": "パス",
+ "perceptual_similarity": "知覚的類似性 (phash)",
+ "performer": "出演者",
+ "performerTags": "出演者タグ",
+ "performer_age": "出演者の年齢",
+ "performer_count": "出演者数",
+ "performer_favorite": "出演者をお気に入り済み",
+ "performer_image": "出演者画像",
+ "performer_tagger": {
+ "add_new_performers": "新しい出演者を追加",
+ "any_names_entered_will_be_queried": "入力された全ての名前は外部のStash-Boxインスタンスで検索され、見つかった場合追加されます。完全一致のみ、一致とみなされます。",
+ "batch_add_performers": "出演者を一括追加",
+ "batch_update_performers": "出演者の一括更新",
+ "config": {
+ "active_stash-box_instance": "アクティブなstash-boxインスタンス:",
+ "edit_excluded_fields": "除外する欄を編集",
+ "excluded_fields": "除外する欄:",
+ "no_fields_are_excluded": "除外する欄なし",
+ "no_instances_found": "インスタンスが見つかりませんでした",
+ "these_fields_will_not_be_changed_when_updating_performers": "これらの欄は、出演者の更新時に変更されません。"
+ },
+ "current_page": "現在のページ",
+ "failed_to_save_performer": "出演者\"{performer}\"の保存に失敗しました",
+ "name_already_exists": "既に使用されている名前です",
+ "network_error": "ネットワークエラー",
+ "no_results_found": "結果が見つかりませんでした。",
+ "number_of_performers_will_be_processed": "{performer_count}人の出演者が処理されます",
+ "performer_already_tagged": "出演者は既にタグ付けされています",
+ "performer_names_separated_by_comma": "出演者の名前はコンマで区切ってください",
+ "performer_selection": "出演者の選択",
+ "performer_successfully_tagged": "出演者のタグ付けに成功しました:",
+ "query_all_performers_in_the_database": "データベース内の全出演者",
+ "refresh_tagged_performers": "タグ付けされている出演者を更新",
+ "refreshing_will_update_the_data": "更新機能を使用すると、stash-boxインスタンスからタグ付け済みの出演者のデータを更新します。",
+ "status_tagging_job_queued": "状態: タグ付けをキューに追加済み",
+ "status_tagging_performers": "状態: 出演者をタグ付け中",
+ "tag_status": "タグの状態",
+ "to_use_the_performer_tagger": "stash-boxインスタンスからの出演者タグ付け機能を使用するには、設定が必要です。",
+ "untagged_performers": "タグ付けされていない出演者",
+ "update_performer": "出演者を更新",
+ "update_performers": "出演者を更新",
+ "updating_untagged_performers_description": "タグ付けされていない出演者の更新機能により、stash IDがない出演者のマッチングを試み、メタデータを更新します。"
+ },
+ "performers": "出演者",
+ "piercings": "ピアス",
+ "queue": "キュー",
+ "random": "ランダム",
+ "rating": "評価",
+ "resolution": "解像度",
+ "scene": "シーン",
+ "sceneTagger": "シーン一括タグ付け",
+ "sceneTags": "シーンタグ",
+ "scene_count": "シーン数",
+ "scene_id": "シーンID",
+ "scenes": "シーン",
+ "scenes_updated_at": "シーンの更新日:",
+ "search_filter": {
+ "add_filter": "フィルターを追加",
+ "name": "フィルター",
+ "saved_filters": "保存済みのフィルター",
+ "update_filter": "フィルターを更新"
+ },
+ "seconds": "秒",
+ "settings": "設定",
+ "setup": {
+ "confirm": {
+ "almost_ready": "設定はほぼ完了です。次の設定をご確認ください。間違いがあった場合は「戻る」をクリックして変更できます。問題ない場合は、「確認」をクリックしてシステムの構築を開始してください。",
+ "configuration_file_location": "設定ファイルの場所:",
+ "database_file_path": "データベースのファイルパス",
+ "default_db_location": "<設定ファイルが含まれるパス>/stash-go.sqlite",
+ "default_generated_content_location": "<設定ファイルが含まれるパス>/generated",
+ "generated_directory": "生成ファイルのディレクトリ",
+ "nearly_there": "もうすぐです!",
+ "stash_library_directories": "Stashライブラリーのディレクトリ"
+ },
+ "creating": {
+ "creating_your_system": "システムを構築中",
+ "ffmpeg_notice": "ffmpegがインストールされていない、パスが通っていない場合はStashがダウンロードしますので、完了するまでお待ちください。ダウンロードの進捗状況はコンソール出力をご確認ください。"
+ },
+ "errors": {
+ "something_went_wrong": "問題が発生したようです!",
+ "something_went_wrong_description": "原因が間違った設定による場合、「戻る」をクリックして修正してください。それ以外の場合は、{githubLink}にバグを報告するか、{discordLink}で質問してみてください。",
+ "something_went_wrong_while_setting_up_your_system": "システムを設定中に問題が発生しました。次のエラーを受け取りました: {error}"
+ },
+ "github_repository": "Githubのリポジトリ",
+ "migrate": {
+ "backup_database_path_leave_empty_to_disable_backup": "データベースのバックアップパス (バックアップを無効にする場合は空白):",
+ "backup_recommended": "移行する前に、既に存在するデータベースをバックアップすることを推奨します。こちらで、{defaultBackupPath}にコピーを生成することも可能です。",
+ "migrating_database": "データベースを移行中",
+ "migration_failed": "移行失敗",
+ "migration_failed_error": "データベースの移行中に次のエラーが発生しました:",
+ "migration_failed_help": "必要な修正を加えてから再度実行してみてください。それでも問題が起きる場合は、{githubLink}にバグを報告するか、{discordLink}で質問してみてください。",
+ "migration_irreversible_warning": "スキーマの移行作業は元に戻せません。移行を開始した後は、お使いのデータベースは以前のバージョンのStashと互換性がなくなります。",
+ "migration_required": "移行が必要です",
+ "perform_schema_migration": "スキーマ移行を実施する",
+ "schema_too_old": "お使いのStashデータベースのスキーマバージョンは、{databaseSchema} であり、バージョン{appSchema}への移行が必要です。このバージョンのStashは、データベースの移行を実施しないと動作しません。"
+ },
+ "paths": {
+ "database_filename_empty_for_default": "データベースファイル名 (空白でデフォルトを使用)",
+ "description": "続いて、あなたのコレクションの保存場所、データベースと生成ファイルを保存する場所を教えていただく必要があります。これらの設定は、後で必要に応じて変更が可能です。",
+ "path_to_generated_directory_empty_for_default": "生成ファイルの保存パス (空白でデフォルト使用)",
+ "set_up_your_paths": "パスをセットアップ",
+ "stash_alert": "ライブラリーパスが選択されていません。Stashはメディアをスキャンできませんがよろしいですか?",
+ "where_can_stash_store_its_database": "Stashはどこにデータベースを保存すればよいですか?",
+ "where_can_stash_store_its_database_description": "Stashは、コレクションのメタデータを保存するためにsqliteデータベースを使用しています。初期設定では、設定ファイルが保存されているディレクトリに stash-go.sqliteという名称で保存されます。変更したい場合は、絶対または現在の作業ディレクトリまでの相対パスを含めたファイル名を入力してください。",
+ "where_can_stash_store_its_generated_content": "Stashはどこに生成コンテンツを保存すればよいですか?",
+ "where_can_stash_store_its_generated_content_description": "サムネイル、プレビューとスプライトイメージを使用できるようにするため、Stashは画像と動画を生成します。これには、未サポートのファイル形式を変換したものも含まれます。初期設定では、Stashは、設定ファイルが保存されているディレクトリに generatedディレクトリを作成します。この生成メディアの保存場所を変更したい場合は、絶対または現在の作業ディレクトリまでの相対パスを含めたパスを入力してください。ディレクトリが存在しない場合、Stashが自動的に作成します。",
+ "where_is_your_porn_located": "お宝はどこに眠っていますか?",
+ "where_is_your_porn_located_description": "あなたのお宝動画と画像が保存されているディレクトリを追加してください。Stashは、動画と画像のスキャン時にこれらのディレクトリを使用します。"
+ },
+ "stash_setup_wizard": "Stash セットアップウィザード",
+ "success": {
+ "getting_help": "ヘルプを参照",
+ "help_links": "問題に直面または質問や提案がある場合、お気軽に{githubLink}からIssueをオープンしていただくか、{discordLink}からコミュニエティに質問してみてください。",
+ "in_app_manual_explained": "次のような画面の右上にあるアイコンからアクセスできるアプリ内マニュアルを確認することもお勧めします: {icon}",
+ "next_config_step_one": "続いて、設定ページに移動します。 このページでは、コレクションに含めるファイルと除外するファイルをカスタマイズしたり、システムを不正なアクセスから保護するためのユーザー名とパスワードを設定したり、その他のさまざまなオプションを設定できます。",
+ "next_config_step_two": "これらの設定で問題ない場合は、{localized_task}へ進み、{localized_scan}をクリックすることで、コンテンツのスキャンを開始できます。",
+ "open_collective": "{open_collective_link}から、あなたがStashの継続的な開発にどのように貢献できるかを確認いただけます。",
+ "support_us": "Stashの開発をサポート",
+ "thanks_for_trying_stash": "Stashをご利用いただきありがとうございます!",
+ "welcome_contrib": "また、コード(バグ修正、機能向上、新機能)、テスト、バグ報告、改善と機能のリクエスト、ユーザーサポートの貢献も歓迎いたします。 詳細については、アプリ内マニュアルの「Contribution」セクションをご覧ください。",
+ "your_system_has_been_created": "成功しました!システムの構築が完了しました!"
+ },
+ "welcome": {
+ "config_path_logic_explained": "Stashは、まず初めに現在の作業ディレクトリに設定ファイル(config.yml)がないかどうか探し、存在しない場合は、$HOME/.stash/config.yml(Windowsは %USERPROFILE%\\.stash\\config.yml)にフォールバックします。-c <設定ファイルへのパス> または --config <設定ファイルへのパス>オプションをつけて起動させることで、特定の設定ファイルを読み込ませることもできます。",
+ "in_current_stash_directory": "$HOME/.stash ディレクトリ内",
+ "in_the_current_working_directory": "現在の作業ディレクトリ内",
+ "next_step": "これで、新しいシステムのセットアップを続行する準備ができました。構成ファイルを保存する場所を選択して、「次へ」をクリックしてください。",
+ "store_stash_config": "Stashの設定はどこに保存すればよいですか?",
+ "unable_to_locate_config": "このメッセージをお読みいただいている場合、Stashは既存の構成を見つけることができませんでした。 このウィザードで、新しい構成をセットアップするプロセスをご案内します。",
+ "unexpected_explained": "この画面が予期せず表示される場合は、正しい作業ディレクトリまたは-cフラグを使用してStashを再起動してみてください。"
+ },
+ "welcome_specific_config": {
+ "config_path": "Stashは次の設定ファイルパスを使用します: {path}",
+ "next_step": "新しいシステムの構築準備が整ったら、次へをクリックしてください。",
+ "unable_to_locate_specified_config": "このメッセージをお読みいただいている場合、Stashはコマンドラインまたは環境変数で指定された構成ファイルを見つけることができませんでした。 このウィザードで、新しい構成をセットアップするプロセスをご案内します。"
+ },
+ "welcome_to_stash": "Stashへようこそ"
+ },
+ "stash_id": "Stash ID",
+ "stash_ids": "Stash ID",
+ "stashbox": {
+ "go_review_draft": "下書きを確認するには、{endpoint_name}に移動してください。",
+ "selected_stash_box": "選択済みのStash-Boxエンドポイント",
+ "submission_failed": "送信に失敗しました",
+ "submission_successful": "送信完了しました"
+ },
+ "stats": {
+ "image_size": "画像サイズ",
+ "scenes_duration": "シーンの再生時間",
+ "scenes_size": "シーンサイズ"
+ },
+ "status": "状態: {statusText}",
+ "studio": "スタジオ",
+ "studio_depth": "レベル (空白で全て)",
+ "studios": "スタジオ",
+ "sub_tag_count": "サブタグ数",
+ "sub_tag_of": "{parent}のサブタグ",
+ "sub_tags": "サブタグ",
+ "subsidiary_studios": "子会社のスタジオ",
+ "synopsis": "概要",
+ "tag": "タグ",
+ "tag_count": "タグ数",
+ "tags": "タグ",
+ "tattoos": "タトゥー",
+ "title": "タイトル",
+ "toast": {
+ "added_entity": "{entity}が追加されました",
+ "added_generation_job_to_queue": "キューに生成ジョブが追加されました",
+ "created_entity": "{entity}が作成されました",
+ "default_filter_set": "デフォルトのフィルターセット",
+ "delete_entity": "{count, plural, one {{singularEntity}} other {{pluralEntity}}}を削除",
+ "delete_past_tense": "{count, plural, one {{singularEntity}} other {{pluralEntity}}}を削除しました",
+ "generating_screenshot": "スクリーンショットを生成中…",
+ "merged_tags": "マージされたタグ",
+ "rescanning_entity": "{count, plural, one {{singularEntity}} other {{pluralEntity}}}を再スキャン中…",
+ "saved_entity": "{entity}が保存されました",
+ "started_auto_tagging": "自動タグ付けを開始しました",
+ "started_generating": "生成を開始しました",
+ "started_importing": "インポートを開始しました",
+ "updated_entity": "{entity}を更新しました"
+ },
+ "total": "合計",
+ "true": "有効",
+ "twitter": "Twitter",
+ "up-dir": "上の階層へ",
+ "updated_at": "更新日:",
+ "url": "URL",
+ "videos": "動画",
+ "weight": "幅",
+ "years_old": "年前"
+}
diff --git a/ui/v2.5/src/locales/nl-NL.json b/ui/v2.5/src/locales/nl-NL.json
index 66d18abfb..0c843fd8d 100644
--- a/ui/v2.5/src/locales/nl-NL.json
+++ b/ui/v2.5/src/locales/nl-NL.json
@@ -80,6 +80,7 @@
"select_folders": "Selecteer bestandsmappen",
"select_none": "Selecteer Niets",
"selective_auto_tag": "Selectieve automatische Tag",
+ "selective_clean": "Selectief Opkuisen",
"selective_scan": "Selectief Aftasten",
"set_as_default": "Stel als standaard in",
"set_back_image": "Achtergrond afbeelding…",
@@ -159,6 +160,7 @@
"build_hash": "Bouw hash:",
"build_time": "Bouwtijd:",
"check_for_new_version": "Controleren op nieuwe versie",
+ "latest_version": "Laatste versie",
"latest_version_build_hash": "Nieuwste versie Bouw Hash:",
"new_version_notice": "[NIEUW]",
"stash_discord": "Word lid van ons {url} kanaal",
@@ -167,12 +169,19 @@
"stash_wiki": "Stash {url} pagina",
"version": "Versie"
},
+ "application_paths": {
+ "heading": "aplicatie pad"
+ },
"categories": {
"about": "Over",
"interface": "Interface",
"logs": "Logboeken",
+ "metadata_providers": "Metadata voorzieners",
"plugins": "Plugins",
"scraping": "Schraper",
+ "security": "Beveiliging",
+ "services": "Diensten",
+ "system": "Systeem",
"tasks": "Taken",
"tools": "Gereedschap"
},
@@ -195,6 +204,10 @@
"api_key_desc": "API sleutel voor externe systemen. Alleen vereist wanneer gebruikersnaam/wachtwoord is geconfigureerd. Gebruikersnaam moet worden opgeslagen voordat API sleutel wordt gegenereerd.",
"authentication": "Authenticatie",
"clear_api_key": "Duidelijke API sleutel",
+ "credentials": {
+ "description": "Credentials om toegang to stash te beperken.",
+ "heading": "Inloggegevens"
+ },
"generate_api_key": "Maak een API-sleutel",
"log_file": "Logboek",
"log_file_desc": "Pad naar het bestand waar naar te loggen. Laat leeg om niet logboek niet naar bestand te schrijven. Herstarten nodig.",
@@ -207,8 +220,6 @@
"password": "Wachtwoord",
"password_desc": "Wachtwoord om Stash te openen. Laat leeg om aanmelden uit te schakelen",
"stash-box_integration": "Stash-box integratie",
- "trusted_proxies": "Vertrouwde proxy's",
- "trusted_proxies_desc": "Lijst van proxy's die netwerkverkeer naar Stash mogen sturen. Laat leeg om privaat netwerk toe te laten.",
"username": "Gebruikersnaam",
"username_desc": "Gebruikersnaam om Stash te openen. Laat leeg om aanmelden uit te schakelen"
},
@@ -254,12 +265,21 @@
"preview_generation": "Voorbeeld genereren",
"scraper_user_agent": "User Agent van de schraper",
"scraper_user_agent_desc": "User-agent gebruikt tijdens het schrapen van HTTP verzoeken",
+ "scrapers_path": {
+ "description": "Map locatie van schraper configuratie bestanden",
+ "heading": "Schrapers Pad"
+ },
"scraping": "Schrapen",
"sqlite_location": "Bestandspad voor de SQLite database (vereist een herstart)",
"video_ext_desc": "Komma gescheiden lijst van bestandsextensie die worden aangemerkt als video.",
"video_ext_head": "Video extensies",
"video_head": "Video"
},
+ "library": {
+ "exclusions": "Uitzonderingen",
+ "gallery_and_image_options": "Gallerij en Foto opties",
+ "media_content_extensions": "Media content extensies"
+ },
"logs": {
"log_level": "Log niveau"
},
@@ -287,6 +307,9 @@
"name": "Naam",
"title": "Stash-box Endpoints"
},
+ "system": {
+ "transcoding": "Transcoderen"
+ },
"tasks": {
"added_job_to_queue": "{operation_name} aan takenrij toegevoegd",
"auto_tag": {
@@ -300,22 +323,583 @@
"backup_database": "Voert een backup uit naar hetzelfde pad als de database, met het bestandsformaat {filename_format}",
"cleanup_desc": "Controleer op missende bestanden en verwijder deze uit de database. Dit is een destructieve handeling.",
"data_management": "Opslagbeheer",
+ "defaults_set": "Standaarden zijn ingesteld en zullen gebruikt worden wanneer de {action} knop op de Taken pagina ingedrukt wordt.",
+ "dont_include_file_extension_as_part_of_the_title": "Neem geen bestandsextensie op als onderdeel van de titel",
+ "empty_queue": "Er zijn momenteel geen taken uitgevoerd.",
+ "export_to_json": "Exporteert de database-inhoud in JSON-formaat naar de metadata map.",
+ "generate": {
+ "generating_from_paths": "Genereren voor scènes uit de volgende paden",
+ "generating_scenes": "Genereren voor {num} {scene}"
+ },
+ "generate_desc": "Genereer ondersteunend foto, sprite, video, vtt en andere bestanden.",
+ "generate_phashes_during_scan": "Genereer perceptuele hashes",
+ "generate_phashes_during_scan_tooltip": "Voor deduplicatie en scène-identificatie.",
+ "generate_previews_during_scan": "Genereer geanimeerde afbeelding previews",
+ "generate_previews_during_scan_tooltip": "Genereer geanimeerde webp-previews, alleen vereist als het voorbeeldtype is ingesteld op geanimeerde afbeelding.",
+ "generate_sprites_during_scan": "Genereer scrubber sprites",
+ "generate_thumbnails_during_scan": "Genereer miniaturen voor afbeeldingen",
+ "generate_video_previews_during_scan": "Previews genereren",
+ "generate_video_previews_during_scan_tooltip": "Genereer video-previews die afspelen bij het zweven over een scène",
+ "generated_content": "Gegenereerde inhoud",
"identify": {
+ "and_create_missing": "en creëer missende",
"create_missing": "Missende aanmaken",
- "default_options": "Standaard instellingen"
- }
+ "default_options": "Standaard instellingen",
+ "description": "Stel automatisch scène metadata in met behulp van stash-box en schraperbronnen.",
+ "explicit_set_description": "De volgende opties worden gebruikt waar niet wordt opgeheven in de bronspecifieke opties.",
+ "field": "Veld",
+ "field_behaviour": "{strategy} {field}",
+ "field_options": "Veld Opties",
+ "heading": "Identificeer",
+ "identifying_from_paths": "Scènes identificeren uit de volgende paden",
+ "identifying_scenes": "Identificeren {num} {scene}",
+ "include_male_performers": "Inclusief mannelijke artiesten",
+ "set_cover_images": "Set Cover-afbeeldingen",
+ "set_organized": "Georganiseerde vlag instellen",
+ "source": "Bron",
+ "source_options": "{source} Opties",
+ "sources": "Bronnen",
+ "strategy": "Strategie"
+ },
+ "import_from_exported_json": "Import van geëxporteerde JSON in de map metadata. Maakt de bestaande database leeg.",
+ "incremental_import": "Incrementele import uit een meegeleverde export zip-bestand.",
+ "job_queue": "Taakwachtrij",
+ "maintenance": "Onderhoud",
+ "migrate_hash_files": "Gebruikt na het wijzigen van de gegenereerde bestandsnaaming Hash om bestaande gegenereerde bestanden te hernoemen naar het nieuwe hash-formaat.",
+ "migrations": "Migraties",
+ "only_dry_run": "Voer alleen een testronde uit. Verwijder niets",
+ "plugin_tasks": "Plugin Taken",
+ "scan": {
+ "scanning_all_paths": "Alle paden scannen",
+ "scanning_paths": "Scannen van de volgende paden"
+ },
+ "scan_for_content_desc": "Scan naar nieuwe inhoud en voeg deze toe aan de database.",
+ "set_name_date_details_from_metadata_if_present": "Stel de naam, datum, details in vanuit Embedded File Metadata"
+ },
+ "tools": {
+ "scene_duplicate_checker": "Scène Duplicator Checker",
+ "scene_filename_parser": {
+ "add_field": "Veld toevoegen",
+ "capitalize_title": "Kapitaliseer de titel",
+ "display_fields": "Weergavevelden",
+ "escape_chars": "Gebruik \\ om letterlijke karakters te ontsnappen",
+ "filename": "Bestandsnaam",
+ "filename_pattern": "Bestandsnaam patroon",
+ "ignore_organized": "Negeer georganiseerde scenes",
+ "ignored_words": "Genegeerde woorden",
+ "matches_with": "Komt overeen met {i}",
+ "select_parser_recipe": "Selecteer Parser Recept",
+ "title": "Scène-bestandsnaam parser",
+ "whitespace_chars": "WhiteSpace-tekens",
+ "whitespace_chars_desc": "Deze tekens worden vervangen door witruimte in de titel"
+ },
+ "scene_tools": "Scene gereedschap"
+ },
+ "ui": {
+ "basic_settings": "Basis instellingen",
+ "custom_css": {
+ "description": "Pagina moet worden herladen voordat wijzigingen van kracht worden.",
+ "heading": "Aangepaste CSS",
+ "option_label": "Aangepaste CSS ingeschakeld"
+ },
+ "delete_options": {
+ "description": "Standaardinstellingen bij het verwijderen van afbeeldingen, galerijen en scènes.",
+ "heading": "Verwijder opties",
+ "options": {
+ "delete_file": "Verwijder het bestand standaard",
+ "delete_generated_supporting_files": "Verwijder gegenereerde ondersteunende bestanden standaard"
+ }
+ },
+ "desktop_integration": {
+ "desktop_integration": "Desktop-integratie",
+ "skip_opening_browser": "Sla het openen van een browser over",
+ "skip_opening_browser_on_startup": "Sla het automatisch openen van een browser over tijdens het opstarten"
+ },
+ "editing": {
+ "disable_dropdown_create": {
+ "description": "Verwijder de mogelijkheid om nieuwe objecten te maken uit de dropdown menu",
+ "heading": "Schakel het maken van dropdowns uit"
+ },
+ "heading": "Aanpassen"
+ },
+ "funscript_offset": {
+ "description": "Time Offset in milliseconden voor het afspelen van interactieve scripts.",
+ "heading": "Funscript Offset (ms)"
+ },
+ "handy_connection_key": {
+ "description": "Handy connection key om te gebruiken voor interactieve scènes. Instellen van deze sleutel staat Stash toe om uw huidige scène-informatie met HandyFeeling.com te delen",
+ "heading": "Handy Connection Key"
+ },
+ "images": {
+ "heading": "Afbeeldingen",
+ "options": {
+ "write_image_thumbnails": {
+ "description": "Schrijf de beeldminiaturen naar de schijf wanneer on-the-fly is gegenereerd",
+ "heading": "Schrijf beeldminiaturen"
+ }
+ }
+ },
+ "interactive_options": "Interactieve Opties",
+ "language": {
+ "heading": "Taal"
+ },
+ "max_loop_duration": {
+ "description": "Maximale scène-duur waarbij scènespeler de video loopt - 0 om uit te schakelen",
+ "heading": "Maximale lusduur"
+ },
+ "menu_items": {
+ "description": "Toon of verberg verschillende soorten inhoud op de navigatiebalk",
+ "heading": "Menu Items"
+ },
+ "performers": {
+ "options": {
+ "image_location": {
+ "description": "Aangepast pad voor standaard performers. Laat leeg om in gebouwde standaardinstellingen te gebruiken",
+ "heading": "Aangepaste Performer afbeelding pad"
+ }
+ }
+ },
+ "preview_type": {
+ "description": "Configuratie voor wanditems",
+ "heading": "Voorbeeld Type",
+ "options": {
+ "animated": "Geanimeerde afbeelding",
+ "static": "Statische afbeelding",
+ "video": "Video"
+ }
+ },
+ "scene_list": {
+ "heading": "Scene lijst",
+ "options": {
+ "show_studio_as_text": "Laat studio's als text zien"
+ }
+ },
+ "scene_player": {
+ "heading": "Scènespeler",
+ "options": {
+ "auto_start_video": "Auto-start video",
+ "auto_start_video_on_play_selected": {
+ "description": "scene automatisch starten bij het afspelen van geselecteerde of willekeurige van scènes pagina",
+ "heading": "Auto-start video bij het afspelen van geselecteerde"
+ },
+ "continue_playlist_default": {
+ "description": "Speel de volgende scène in de wachtrij wanneer video is voltooid",
+ "heading": "Ga Standaard door met de afspeellijst"
+ }
+ }
+ },
+ "scene_wall": {
+ "heading": "Scène / markeermuur",
+ "options": {
+ "display_title": "Titel en tags weergeven",
+ "toggle_sound": "Geluid inschakelen"
+ }
+ },
+ "slideshow_delay": {
+ "description": "Diavoorstelling is beschikbaar in galerijen in de muurweergavemodus",
+ "heading": "Diavoorstellingsvertraging"
+ },
+ "title": "Gebruikers interface"
}
},
+ "configuration": "Configuratie",
+ "countables": {
+ "files": "{count, plural, one {Bestand} other {Bestanden}}",
+ "galleries": "{count, plural, one {Galerij} other {Galerijen}}",
+ "images": "{count, plural, one {Afbeelding} other {Afbeeldingen}}",
+ "markers": "{count, plural, one {Marker} other {Markers}}",
+ "movies": "{count, plural, one {Film} other {Films}}",
+ "performers": "{count, plural, one {Performer} other {Performers}}",
+ "scenes": "{count, plural, one {Scene} other {Scenes}}",
+ "studios": "{count, plural, one {Studio} other {Studios}}",
+ "tags": "{count, plural, one {Tag} other {Tags}}"
+ },
+ "country": "Land",
+ "cover_image": "Cover afbeelding",
+ "created_at": "Gemaakt op",
+ "criterion": {
+ "greater_than": "Groter dan",
+ "less_than": "Minder dan",
+ "value": "Waarde"
+ },
+ "criterion_modifier": {
+ "between": "tussen",
+ "equals": "is",
+ "excludes": "uitsluitend",
+ "format_string": "{criterion} {modifierString} {valueString}",
+ "greater_than": "is groter dan",
+ "includes": "omvat",
+ "includes_all": "omvat alles",
+ "is_null": "is null",
+ "less_than": "is minder dan",
+ "matches_regex": "komt overeen met regex",
+ "not_between": "niet tussen",
+ "not_equals": "is geen",
+ "not_matches_regex": "komt niet overeen met regex",
+ "not_null": "is geen null"
+ },
+ "custom": "Aangepast",
+ "date": "Datum",
+ "death_date": "Sterfdatum",
+ "death_year": "Sterfjaar",
+ "descending": "Aflopend",
+ "detail": "Detail",
+ "details": "Details",
+ "developmentVersion": "Ontwikkelingsversie",
+ "dialogs": {
+ "aliases_must_be_unique": "aliases moeten uniek zijn",
+ "delete_alert": "De volgende {count, plural, one {{singularEntity}} other {{pluralEntity}}} zal permanent verwijderd worden:",
+ "delete_confirm": "Weet je zeker dat je {entityName} wilt verwijderen?",
+ "delete_entity_desc": "{count, plural, one {Weet u zeker dat u deze {singularEntity} wilt verwijderen? Tenzij het bestand ook wordt verwijderd, wordt deze {singularEntity} opnieuw toegevoegd wanneer de scan wordt uitgevoerd.} other {Weet u zeker dat u deze {pluralEntity} wilt verwijderen? Tenzij de bestanden ook worden verwijderd, worden deze {pluralEntity} opnieuw toegevoegd wanneer de scan wordt uitgevoerd.}}",
+ "delete_entity_title": "{count, plural, one {Verwijder{singularEntity}} other {Verwijder{pluralEntity}}}",
+ "delete_galleries_extra": "... plus alle afbeeldingsbestanden die niet aan een andere galerij zijn gekoppeld.",
+ "delete_gallery_files": "Verwijder de galerijmap/zip-bestand en alle afbeeldingen die niet aan een andere galerij zijn gekoppeld.",
+ "delete_object_desc": "Weet u zeker dat u {count, plural, one {this {singularEntity}} other {these {pluralEntity}}} wilt gaan verwijderen?",
+ "delete_object_overflow": "…en {count} other {count, plural, one {{singularEntity}} other {{pluralEntity}}}.",
+ "delete_object_title": "Verwijder {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
+ "edit_entity_title": "Wijzig {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
+ "export_include_related_objects": "Verwante objecten opnemen met het exporteren",
+ "export_title": "Exporteer",
+ "lightbox": {
+ "delay": "Vertraging (Sec)",
+ "display_mode": {
+ "fit_horizontally": "Pas horizontaal",
+ "fit_to_screen": "Pas naar scherm",
+ "label": "Weergave modus",
+ "original": "Orgineel"
+ },
+ "options": "Opties",
+ "reset_zoom_on_nav": "Zoomniveau resetten bij het wijzigen van afbeelding",
+ "scale_up": {
+ "description": "Schaal kleinere afbeeldingen omhoog om het scherm te vullen",
+ "label": "Opschalen om te passen"
+ },
+ "scroll_mode": {
+ "description": "Houd shift ingedrukt om tijdelijk een andere modus te gebruiken.",
+ "label": "Scroll modus",
+ "pan_y": "Pan Y",
+ "zoom": "Zoom"
+ }
+ },
+ "merge_tags": {
+ "destination": "Bestemming",
+ "source": "Afkomst"
+ },
+ "overwrite_filter_confirm": "Weet u zeker dat u de bestaande opgeslagen zoekopdracht {entityName} wilt overschrijven?",
+ "scene_gen": {
+ "force_transcodes": "Genereren van transcode forceren",
+ "force_transcodes_tooltip": "Standaard worden transcodes alleen gegenereerd als het videobestand niet wordt ondersteund in de browser. Indien ingeschakeld, worden transcodes gegenereerd, zelfs als het videobestand in de browser lijkt te worden ondersteund.",
+ "image_previews": "Geanimeerde afbeelding voorbeelden",
+ "image_previews_tooltip": "Geanimeerde WebP-voorbeelden, alleen vereist als Voorbeeldtype is ingesteld op Geanimeerde afbeelding.",
+ "interactive_heatmap_speed": "Genereer heatmaps en snelheden voor interactieve scènes",
+ "marker_image_previews": "Voorvertoningen van geanimeerde markeringen",
+ "marker_image_previews_tooltip": "Geanimeerde markering WebP-voorbeelden, alleen vereist als Voorbeeldtype is ingesteld op Geanimeerde afbeelding.",
+ "marker_screenshots": "Markeer Screenshots",
+ "marker_screenshots_tooltip": "Markeer statische JPG-afbeeldingen, alleen vereist als Voorbeeldtype is ingesteld op Statische afbeelding.",
+ "markers": "Marker Voorbeelden",
+ "markers_tooltip": "Video's van 20 seconden die beginnen op de opgegeven tijdcode.",
+ "overwrite": "Bestaande gegenereerde bestanden overschrijven",
+ "phash": "Perceptuele hashes (voor deduplicatie)",
+ "preview_exclude_end_time_desc": "Sluit de laatste x seconden uit van scènevoorbeelden. Dit kan een waarde in seconden zijn, of een percentage (bijv. 2%) van de totale duur van de scène.",
+ "preview_exclude_end_time_head": "Eindtijd uitsluiten",
+ "preview_exclude_start_time_desc": "Sluit de eerste x seconden uit van scènevoorbeelden. Dit kan een waarde in seconden zijn, of een percentage (bijv. 2%) van de totale duur van de scène.",
+ "preview_exclude_start_time_head": "Starttijd uitsluiten",
+ "preview_generation_options": "Opties voor het genereren van voorbeelden",
+ "preview_options": "Voorbeeld opties",
+ "preview_preset_desc": "De voorinstelling regelt de grootte, kwaliteit en coderingstijd van het genereren van voorbeelden. Voorinstellingen die verder gaan dan \"langzaam\" hebben een afnemend rendement en worden niet aanbevolen.",
+ "preview_preset_head": "Voorbeeld van codering voorinstelling",
+ "preview_seg_count_desc": "Aantal segmenten in voorbeeldbestanden.",
+ "preview_seg_count_head": "Aantal segmenten in voorbeeld",
+ "preview_seg_duration_desc": "Duur van elk voorbeeldsegment, in seconden.",
+ "preview_seg_duration_head": "Voorbeeld Segment Duur",
+ "sprites": "Scene Scrubber Sprites",
+ "sprites_tooltip": "Sprites (voor de scene scrubber)",
+ "transcodes": "Transcodes",
+ "transcodes_tooltip": "MP4-conversies van niet-ondersteunde video-indelingen",
+ "video_previews": "Voorbeelden",
+ "video_previews_tooltip": "Videovoorbeelden die worden afgespeeld wanneer u over een scène beweegt"
+ },
+ "scenes_found": "{count} scenes gevonden",
+ "scrape_entity_query": "{entity_type} Schraper Query",
+ "scrape_entity_title": "{entity_type} Schraper Resultaten",
+ "scrape_results_existing": "Bestaande",
+ "scrape_results_scraped": "Geschraapt",
+ "set_image_url_title": "Afbeelding URL",
+ "unsaved_changes": "Niet-opgeslagen wijzigingen gaan verloren. Weet je zeker dat je wilt vertrekken?"
+ },
+ "dimensions": "Dimensies",
+ "director": "Regisseur",
+ "display_mode": {
+ "grid": "Rooster",
+ "list": "Lijst",
+ "tagger": "Label",
+ "unknown": "Onbekend",
+ "wall": "Muur"
+ },
+ "donate": "Doneer",
+ "dupe_check": {
+ "description": "Niveaus onder 'Exact' kunnen langer duren om te berekenen. Valse positieven kunnen ook worden geretourneerd bij lagere nauwkeurigheidsniveaus.",
+ "found_sets": "{setCount, plural, one{# set duplicaten gevonden.} other {# sets van duplicaten gevonden.}}",
+ "options": {
+ "exact": "Precies",
+ "high": "Hoog",
+ "low": "Laag",
+ "medium": "Medium"
+ },
+ "search_accuracy_label": "Zoek accuraatheid",
+ "title": "Dubbele Scènes"
+ },
+ "duration": "Looptijd",
+ "effect_filters": {
+ "aspect": "Aspect",
+ "blue": "Blauw",
+ "blur": "Waas",
+ "brightness": "Helderheid",
+ "contrast": "Contrast",
+ "gamma": "Gamma",
+ "green": "Groen",
+ "hue": "Tint",
+ "name": "Filters",
+ "name_transforms": "Transformeren",
+ "red": "Rood",
+ "reset_filters": "Reset Filters",
+ "reset_transforms": "Reset Transformaties",
+ "rotate": "Roteren",
+ "rotate_left_and_scale": "Naar links draaien en schalen",
+ "rotate_right_and_scale": "Naar rechts draaien en schalen",
+ "saturation": "Saturatie",
+ "scale": "Schaal",
+ "warmth": "Warmte"
+ },
+ "ethnicity": "Etniciteit",
+ "eye_color": "Oogkleur",
+ "fake_tits": "Neppe Tieten",
+ "false": "Vals",
+ "favourite": "Favoriet",
+ "file": "bestand",
+ "file_info": "Bestandsinformatie",
+ "file_mod_time": "Bestandsmodificatie tijd",
+ "files": "bestanden",
+ "filesize": "Bestands Groote",
+ "filter": "Filter",
+ "filter_name": "Filter Naam",
+ "filters": "Filters",
+ "framerate": "Frame snelheid",
+ "frames_per_second": "{value} frames per seconde",
+ "galleries": "Galerijen",
+ "gallery": "Galerij",
+ "gallery_count": "Galerij aantal",
+ "gender": "Geslacht",
+ "gender_types": {
+ "FEMALE": "Vrouw",
+ "INTERSEX": "Intersex",
+ "MALE": "Man",
+ "NON_BINARY": "Non-Binar",
+ "TRANSGENDER_FEMALE": "Transgender Vrouw",
+ "TRANSGENDER_MALE": "Transgender Man"
+ },
+ "hair_color": "Haar kleur",
+ "hasMarkers": "Heeft Markeringen",
+ "height": "Hoogte",
+ "help": "Help",
+ "image": "Afbeelding",
+ "image_count": "Afbeelding aantal",
+ "images": "Afbeeldingen",
+ "include_parent_tags": "Bovenliggende tags opnemen",
+ "include_sub_studios": "Dochteronderneming studio's opnemen",
+ "include_sub_tags": "Neem sub-tags op",
+ "instagram": "Instagram",
+ "interactive": "Interactief",
+ "interactive_speed": "Interactieve snelheid",
+ "isMissing": "Is Missende",
+ "library": "Bibliotheek",
+ "loading": {
+ "generic": "Laden…"
+ },
+ "marker_count": "Marker Aantal",
+ "markers": "Markers",
+ "measurements": "Afmetingen",
+ "media_info": {
+ "audio_codec": "Audio Codec",
+ "checksum": "Checksum",
+ "downloaded_from": "Gedownload van",
+ "hash": "Hash",
+ "interactive_speed": "Interactieve snelheid",
+ "performer_card": {
+ "age": "{age} {years_old}",
+ "age_context": "{age} {years_old} in deze scène"
+ },
+ "phash": "PHash",
+ "stream": "Stream",
+ "video_codec": "Video Codec"
+ },
+ "megabits_per_second": "{value} megabits per seconde",
+ "metadata": "Metadata",
+ "movie": "Film",
+ "movie_scene_number": "Film Scene Nummer",
+ "movies": "Films",
+ "name": "Naam",
+ "new": "Nieuw",
+ "none": "Geen",
+ "o_counter": "O-Teller",
+ "operations": "Operaties",
+ "organized": "Georganiseerd",
+ "pagination": {
+ "first": "Eerste",
+ "last": "Laatste",
+ "next": "Volgende",
+ "previous": "Vorige"
+ },
+ "parent_of": "Ouder van {children}",
+ "parent_studios": "Ouderstudio's",
+ "parent_tag_count": "Aantal bovenliggende tags",
+ "parent_tags": "Bovenlagentlabels",
+ "part_of": "Onderdeel van {parent}",
+ "path": "Pad",
+ "performer": "Performer",
+ "performerTags": "Peformer Labels",
+ "performer_count": "Performer Aantal",
+ "performer_image": "Performer Afbeelding",
+ "performers": "Performers",
+ "piercings": "Piercings",
+ "queue": "Wachtrij",
+ "random": "Willekeurig",
+ "rating": "Beoordeling",
+ "resolution": "Resolutie",
+ "scene": "Scène",
+ "sceneTagger": "Scene Labelen",
+ "sceneTags": "Scene Labels",
+ "scene_count": "Scene Aantal",
+ "scene_id": "Scene ID",
+ "scenes": "Scènes",
+ "scenes_updated_at": "Scène geüpdatet op",
+ "search_filter": {
+ "add_filter": "Filter Toevoegen",
+ "name": "Filter",
+ "saved_filters": "Opgeslagen filters",
+ "update_filter": "Filter Updaten"
+ },
+ "seconds": "Seconden",
+ "settings": "Instellingen",
"setup": {
+ "confirm": {
+ "almost_ready": "We zijn bijna klaar om de configuratie te voltooien. Bevestig de volgende instellingen. U kunt op terug klikken om iets onjuists te wijzigen. Als alles er goed uitziet, klikt u op Bevestigen om uw systeem aan te maken.",
+ "configuration_file_location": "Locatie configuratiebestand:",
+ "database_file_path": "Pad naar databasebestand",
+ "default_db_location": "/stash-go.sqlite",
+ "default_generated_content_location": "/generated",
+ "generated_directory": "Genereerde map",
+ "nearly_there": "Bijna Daar!",
+ "stash_library_directories": "Stash bibliotheekmappen"
+ },
+ "creating": {
+ "creating_your_system": "Uw systeem aanmaken",
+ "ffmpeg_notice": "Als ffmpeg nog niet in je pad staat, heb dan even geduld terwijl stash het downloadt. Bekijk de console-uitvoer om de downloadvoortgang te zien."
+ },
+ "errors": {
+ "something_went_wrong": "Oh nee! Er is iets fout gegaan!",
+ "something_went_wrong_description": "Als dit lijkt op een probleem met je invoer, ga je gang en klik je op Terug om ze op te lossen. Breng anders een bug aan op {githubLink} of zoek hulp in de {discordLink}.",
+ "something_went_wrong_while_setting_up_your_system": "Er is iets misgegaan tijdens het instellen van uw systeem. Dit is de fout die we hebben ontvangen: {error}"
+ },
+ "github_repository": "Github repository",
+ "migrate": {
+ "backup_database_path_leave_empty_to_disable_backup": "Pad naar back-up database (leeg laten om back-up uit te schakelen):",
+ "backup_recommended": "Het wordt aanbevolen een back-up van uw bestaande database te maken voordat u migreert. We kunnen dit voor je doen door een kopie van je database te maken naar {defaultBackupPath}.",
+ "migrating_database": "Database migreren",
+ "migration_failed": "Migratie gefaald",
+ "migration_failed_error": "De volgende fout is opgetreden tijdens het migreren van de database:",
+ "migration_failed_help": "Breng de nodige correcties aan en probeer het opnieuw. Breng anders een bug aan op {githubLink} of zoek hulp in de {discordLink}.",
+ "migration_irreversible_warning": "Het schemamigratieproces is niet omkeerbaar. Zodra de migratie is uitgevoerd, is uw database incompatibel met eerdere versies van stash.",
+ "migration_required": "Migratie benodigd",
+ "perform_schema_migration": "Schemamigratie uitvoeren",
+ "schema_too_old": "Uw huidige stashdatabase is schemaversie {databaseSchema} en moet worden gemigreerd naar versie {appSchema}. Deze versie van Stash werkt niet zonder de database te migreren."
+ },
+ "paths": {
+ "database_filename_empty_for_default": "database bestandsnaam (leeg als standaard)",
+ "description": "Vervolgens moeten we bepalen waar we je pornocollectie kunnen vinden, waar we de stash-database en gegenereerde bestanden kunnen opslaan. Deze instellingen kunnen indien nodig later worden gewijzigd.",
+ "path_to_generated_directory_empty_for_default": "pad naar gegenereerde map (standaard leeg)",
+ "set_up_your_paths": "Stel je paden in",
+ "stash_alert": "Er zijn geen bibliotheekpaden geselecteerd. Er kan dan geen media worden gescand in Stash. Weet je zeker dat?",
+ "where_can_stash_store_its_database": "Waar kan Stash zijn database opslaan?",
+ "where_can_stash_store_its_database_description": "Stash gebruikt een sqlite-database om je porno-metadata op te slaan. Standaard wordt dit aangemaakt als stash-go.sqlite in de map die je configuratiebestand bevat. Als u dit wilt wijzigen, voert u een absolute of relatieve (ten opzichte van de huidige werkdirectory) bestandsnaam in.",
+ "where_can_stash_store_its_generated_content": "Waar kan Stash de gegenereerde inhoud opslaan?",
+ "where_can_stash_store_its_generated_content_description": "Om thumbnails, previews en sprites aan te bieden, genereert Stash afbeeldingen en video's. Dit omvat ook transcodes voor niet-ondersteunde bestandsindelingen. Standaard zal Stash een generated directory aanmaken in de directory die uw configuratiebestand bevat. Als u wilt wijzigen waar deze gegenereerde media wordt opgeslagen, voert u een absoluut of relatief (ten opzichte van de huidige werkmap) pad in. Stash maakt deze map aan als deze nog niet bestaat.",
+ "where_is_your_porn_located": "Waar staat je porno?",
+ "where_is_your_porn_located_description": "Voeg mappen toe die uw pornovideo's en afbeeldingen bevatten. Stash gebruikt deze mappen om video's en afbeeldingen te vinden tijdens het scannen."
+ },
+ "stash_setup_wizard": "Stash-installatiewizard",
"success": {
"getting_help": "Help",
- "in_app_manual_explained": "Het is aanbevolen om de in-app handleiding te bekijken, het is raadpleegbaar via het {icon} icoontje rechts-boven"
- }
+ "help_links": "Als je problemen tegenkomt of vragen of suggesties hebt, open dan gerust een issue in de {githubLink}, of vraag het de community in de {discordLink}.",
+ "in_app_manual_explained": "Het is aanbevolen om de in-app handleiding te bekijken, het is raadpleegbaar via het {icon} icoontje rechts-boven",
+ "next_config_step_one": "U wordt vervolgens naar de configuratiepagina geleid. Op deze pagina kunt u aanpassen welke bestanden u wilt opnemen en uitsluiten, een gebruikersnaam en wachtwoord instellen om uw systeem te beschermen en een heleboel andere opties.",
+ "next_config_step_two": "Als je tevreden bent met deze instellingen, kun je beginnen met het scannen van je inhoud naar Stash door op {localized_task} te klikken en vervolgens op {localized_scan} te klikken.",
+ "open_collective": "Bekijk onze {open_collective_link} om te zien hoe jij kunt bijdragen aan de verdere ontwikkeling van Stash.",
+ "support_us": "Ondersteun ons",
+ "thanks_for_trying_stash": "Bedankt voor het proberen van Stash!",
+ "welcome_contrib": "We verwelkomen ook bijdragen in de vorm van code (bugfixes, verbeteringen en nieuwe functies), testen, bugrapporten, verbeterings- en functieverzoeken en gebruikersondersteuning. Details zijn te vinden in het gedeelte Bijdrage van de in-app-handleiding.",
+ "your_system_has_been_created": "Succes! Uw systeem is aangemaakt!"
+ },
+ "welcome": {
+ "config_path_logic_explained": "Stash probeert eerst zijn configuratiebestand (config.yml) uit de huidige werkdirectory te vinden, en als het daar niet gevonden wordt, valt het terug naar $HOME/.stash/config. yml (in Windows is dit %USERPROFILE%\\.stash\\config.yml). Je kunt Stash ook laten lezen uit een specifiek configuratiebestand door het uit te voeren met de opties -c of --config .",
+ "in_current_stash_directory": "In de $HOME/.stash map",
+ "in_the_current_working_directory": "In de huidige werkdirectory",
+ "next_step": "Met dat alles uit de weg, als u klaar bent om door te gaan met het opzetten van een nieuw systeem, kiest u waar u uw configuratiebestand wilt opslaan en klikt u op Volgende.",
+ "store_stash_config": "Waar wil jij je Stash-configuratie opslaan?",
+ "unable_to_locate_config": "Als je dit leest, kan Stash geen bestaande configuratie vinden. Deze wizard leidt u door het proces van het opzetten van een nieuwe configuratie.",
+ "unexpected_explained": "Als je dit scherm onverwachts krijgt, probeer dan Stash opnieuw op te starten in de juiste werkmap of met de -c vlag."
+ },
+ "welcome_specific_config": {
+ "config_path": "Stash gebruikt het volgende configuratiebestandspad: {path}",
+ "next_step": "Wanneer u klaar bent om door te gaan met het instellen van een nieuw systeem, klikt u op Volgende.",
+ "unable_to_locate_specified_config": "Als je dit leest, kan Stash het opgegeven configuratiebestand op de opdrachtregel of in de omgeving niet vinden. Deze wizard leidt u door het proces van het opzetten van een nieuwe configuratiebestand."
+ },
+ "welcome_to_stash": "Welkom bij Stash"
},
+ "stash_id": "Stash ID",
+ "stash_ids": "Stash IDs",
+ "stats": {
+ "image_size": "Afbeelding groote",
+ "scenes_duration": "Scene duur",
+ "scenes_size": "Scene groote"
+ },
+ "status": "Status: {statusText}",
+ "studio": "Studio",
+ "studio_depth": "Niveaus (leeg voor iedereen)",
+ "studios": "Studios",
+ "sub_tag_count": "Sub-Label aantal",
+ "sub_tag_of": "Sub-tag van {parent}",
+ "sub_tags": "Sub-Tags",
+ "subsidiary_studios": "Onderliggende Studio's",
+ "synopsis": "Synopsis",
+ "tag": "Label",
+ "tag_count": "Label Aantal",
+ "tags": "Labels",
+ "tattoos": "Tattoos",
+ "title": "Titel",
+ "toast": {
+ "added_entity": "Toegevoegd {entity}",
+ "added_generation_job_to_queue": "Generatietaak toegevoegd aan wachtrij",
+ "created_entity": "{entity} Aangemaakt",
+ "default_filter_set": "Standaard filterset",
+ "delete_entity": "Verwijder {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
+ "delete_past_tense": "Verwijderd {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
+ "generating_screenshot": "Screenshot Genereren…",
+ "merged_tags": "Samengevoegde Labels",
+ "rescanning_entity": "Opnieuw scannen van {count, plural, one {{singularEntity}} other {{pluralEntity}}}…",
+ "saved_entity": "Opgeslagen {entity}",
+ "started_auto_tagging": "Autotagging gestart",
+ "started_generating": "Genereren gestart",
+ "started_importing": "Importeren gestart",
+ "updated_entity": "Ge-updatet {entity}"
+ },
+ "total": "Totaal",
"true": "Waar",
"twitter": "Twitter",
+ "up-dir": "Een directory omhoog",
"updated_at": "Bijgewerkt op",
"url": "URL",
+ "videos": "Video's",
"weight": "Gewicht",
"years_old": "jaar oud"
}
diff --git a/ui/v2.5/src/locales/pl-PL.json b/ui/v2.5/src/locales/pl-PL.json
new file mode 100644
index 000000000..a6eaf97d7
--- /dev/null
+++ b/ui/v2.5/src/locales/pl-PL.json
@@ -0,0 +1,372 @@
+{
+ "actions": {
+ "add": "Dodaj",
+ "add_directory": "Dodaj folder",
+ "add_entity": "Dodaj {entityType}",
+ "add_to_entity": "Dodaj do {entityType}",
+ "allow": "Zezwalaj",
+ "allow_temporarily": "Zezwalaj tymczasowo",
+ "apply": "Zastosuj",
+ "auto_tag": "Automatyczne tagowanie",
+ "backup": "Kopia zapasowa",
+ "browse_for_image": "Przeglądaj zdjęcia…",
+ "cancel": "Anuluj",
+ "clean": "Wyczyść",
+ "clear": "Wyczyść",
+ "clear_back_image": "Usuń tylną okładkę",
+ "clear_front_image": "Usuń przednią okładkę",
+ "clear_image": "Usuń obraz",
+ "close": "Zamknij",
+ "confirm": "Zatwierdź",
+ "continue": "Kontynuuj",
+ "create": "Utwórz",
+ "create_entity": "Utwórz {entityType}",
+ "create_marker": "Utwórz znacznik",
+ "created_entity": "Utworzono {entity_type}: {entity_name}",
+ "delete": "Usuń",
+ "delete_entity": "Usuń {entityType}",
+ "delete_file": "Usuń plik",
+ "delete_file_and_funscript": "Usuń plik (i funscript)",
+ "delete_generated_supporting_files": "Usuń wygenerowane pliki pomocnicze",
+ "disallow": "Nie zezwalaj",
+ "download": "Pobierz",
+ "download_backup": "Pobierz kopię zapasową",
+ "edit": "Edytuj",
+ "export": "Eksportuj…",
+ "export_all": "Eksportuj wszystko…",
+ "find": "Znajdź",
+ "finish": "Zakończ",
+ "from_file": "Z pliku…",
+ "from_url": "Z linku…",
+ "full_export": "Pełny eksport",
+ "full_import": "Pełny import",
+ "generate": "Wygeneruj",
+ "generate_thumb_default": "Wygeneruj domyślną miniaturę",
+ "generate_thumb_from_current": "Wygeneruj miniaturę z bieżącego",
+ "hash_migration": "migracja hasza",
+ "hide": "Ukryj",
+ "hide_configuration": "Ukryj konfigurację",
+ "identify": "Identyfikuj",
+ "ignore": "Ignoruj",
+ "import": "Importuj…",
+ "import_from_file": "Importuj z pliku",
+ "merge": "Scal",
+ "merge_from": "Scal z",
+ "merge_into": "Scal w",
+ "next_action": "Następny",
+ "not_running": "nie uruchomiony",
+ "open_random": "Pokaż losowego",
+ "overwrite": "Nadpisz",
+ "play_random": "Odtwórz losowy",
+ "play_selected": "Odtwórz wybrane",
+ "preview": "Podgląd",
+ "previous_action": "Wstecz",
+ "refresh": "Odśwież",
+ "reload_plugins": "Przeładuj wtyczki",
+ "reload_scrapers": "Przeładuj scrapery",
+ "remove": "Usuń",
+ "rename_gen_files": "Zmień nazwy wygenerowanych plików",
+ "rescan": "Skanuj ponownie",
+ "reshuffle": "Przetasuj",
+ "running": "uruchomiony",
+ "save": "Zapisz",
+ "save_delete_settings": "Użyj tych opcji domyślnie podczas usuwania",
+ "save_filter": "Zapisz filtr",
+ "scan": "Skanuj",
+ "scrape": "Scrapuj",
+ "scrape_query": "Zapytanie scrapowania",
+ "scrape_scene_fragment": "Scrapuj według fragmentu",
+ "scrape_with": "Scrapuj za pomocą…",
+ "search": "Szukaj",
+ "select_all": "Wybierz wszystko",
+ "select_folders": "Wybierz foldery",
+ "select_none": "Odznacz wszystko",
+ "selective_auto_tag": "Selektywne automatyczne tagowanie",
+ "selective_clean": "Selektywne czyszczenie",
+ "selective_scan": "Selektywne skanowanie",
+ "set_as_default": "Ustaw jako domyślne",
+ "set_back_image": "Tylna okładka…",
+ "set_front_image": "Przednia okładka…",
+ "set_image": "Ustaw obraz…",
+ "show": "Pokaż",
+ "show_configuration": "Pokaż konfigurację",
+ "skip": "Pomiń",
+ "stop": "Zatrzymaj",
+ "submit": "Wyślij",
+ "submit_stash_box": "Przekaż do Stash-Box",
+ "tasks": {
+ "clean_confirm_message": "Czy na pewno chcesz wyczyścić? Spowoduje to usunięcie informacji o bazie danych i wygenerowanej zawartości dla wszystkich scen i galerii, które nie znajdują się już w systemie plików.",
+ "dry_mode_selected": "Wybrano tryb suchy. Nie nastąpi faktyczne usunięcie, a jedynie zapisanie informacji w dzienniku.",
+ "import_warning": "Czy na pewno chcesz zaimportować? Spowoduje to usunięcie bazy danych i ponowne zaimportowanie wyeksportowanych metadanych."
+ },
+ "temp_disable": "Wyłącz tymczasowo…",
+ "temp_enable": "Włącz tymczasowo…",
+ "use_default": "Użyj domyślnych ustawień",
+ "view_random": "Pokaż losowy"
+ },
+ "actions_name": "Akcje",
+ "age": "Wiek",
+ "aliases": "Pseudonimy",
+ "all": "wszystko",
+ "also_known_as": "Znany/a również jako",
+ "ascending": "Rosnąco",
+ "average_resolution": "Średnia rozdzielczość",
+ "birth_year": "Rok urodzenia",
+ "birthdate": "Data urodzenia",
+ "bitrate": "Bit Rate",
+ "career_length": "Długość kariery",
+ "component_tagger": {
+ "config": {
+ "active_instance": "Aktywna instancja stash-box:",
+ "blacklist_desc": "Elementy na czarnej liście są wykluczane z zapytań. Zwróć uwagę, że są to wyrażenia regularne i nie uwzględniają wielkości liter. Niektóre znaki muszą być poprzedzone za pomocą odwrotnego ukośnika: {chars_require_escape}",
+ "blacklist_label": "Czarna lista",
+ "query_mode_auto": "Auto",
+ "query_mode_auto_desc": "Używa metadanych, jeśli są dostępne, lub nazwy pliku",
+ "query_mode_dir": "Katalog",
+ "query_mode_dir_desc": "Używa tylko katalogu nadrzędnego pliku wideo",
+ "query_mode_filename": "Nazwa pliku",
+ "query_mode_filename_desc": "Używa tylko nazwy pliku",
+ "query_mode_label": "Tryb zapytań",
+ "query_mode_metadata": "Metadane",
+ "query_mode_metadata_desc": "Używa tylko metadanych",
+ "query_mode_path": "Ścieżka",
+ "query_mode_path_desc": "Wykorzystuje całą ścieżkę dostępu do pliku",
+ "set_cover_desc": "Zamień okładkę sceny, jeśli zostanie znaleziona.",
+ "set_cover_label": "Ustaw obraz okładki sceny",
+ "set_tag_desc": "Dołącz tagi do sceny, nadpisując lub łącząc z istniejącymi tagami w scenie.",
+ "set_tag_label": "Ustaw tagi",
+ "show_male_desc": "Włączenie opcji tagowania aktorów płci męskiej.",
+ "show_male_label": "Pokaż męskich aktorów",
+ "source": "Źródło"
+ },
+ "noun_query": "Zapytanie",
+ "results": {
+ "duration_off": "Czas trwania przesunięty o co najmniej {number}s",
+ "duration_unknown": "Czas trwania nieznany",
+ "fp_matches": "Czas trwania jest identyczny",
+ "match_failed_already_tagged": "Scena jest już otagowana",
+ "match_failed_no_result": "Nie znaleziono żadnych wyników",
+ "match_success": "Scena pomyślnie otagowana",
+ "phash_matches": "{count} dopasowań PHashy",
+ "unnamed": "Nienazwany"
+ },
+ "verb_match_fp": "Dopasowanie odcisków palców",
+ "verb_matched": "Dopasowane",
+ "verb_scrape_all": "Scrapuj wszystko",
+ "verb_toggle_unmatched": "{toggle} niedopasowane sceny"
+ },
+ "config": {
+ "about": {
+ "build_hash": "Hash buildu:",
+ "build_time": "Czas buildu:",
+ "check_for_new_version": "Sprawdź, czy jest nowa wersja",
+ "latest_version": "Najnowsza wersja",
+ "latest_version_build_hash": "Hash buildu najnowszej wersji:",
+ "new_version_notice": "[NOWA]",
+ "stash_discord": "Dołącz do naszego kanału {url}",
+ "stash_home": "Dom Stasha {url}",
+ "stash_open_collective": "Wesprzyj nas poprzez {url}",
+ "stash_wiki": "Strona Stasha {url}",
+ "version": "Wersja"
+ },
+ "application_paths": {
+ "heading": "Ścieżki aplikacji"
+ },
+ "categories": {
+ "about": "O aplikacji",
+ "interface": "Interfejs",
+ "logs": "Logi",
+ "metadata_providers": "Dostawcy metadanych",
+ "plugins": "Wtyczki",
+ "scraping": "Scrapowanie",
+ "security": "Bezpieczeństwo",
+ "services": "Usługi",
+ "system": "System",
+ "tasks": "Zadania",
+ "tools": "Narzędzia"
+ },
+ "dlna": {
+ "allow_temp_ip": "Zezwól na {tempIP}",
+ "allowed_ip_addresses": "Dozwolone adresy IP",
+ "default_ip_whitelist": "Domyślna biała lista IP",
+ "default_ip_whitelist_desc": "Domyślne adresy IP umożliwiają dostęp do DLNA. Użyj {wildcard}, aby zezwolić na wszystkie adresy IP.",
+ "enabled_by_default": "Domyślnie włączone",
+ "network_interfaces": "Interfejsy",
+ "network_interfaces_desc": "Interfejsy, na których ma być wystawiony serwer DLNA. Pusta lista spowoduje, że serwer będzie działał na wszystkich interfejsach. Wymaga ponownego uruchomienia DLNA po zmianie.",
+ "recent_ip_addresses": "Ostatnie adresy IP",
+ "server_display_name": "Wyświetlana nazwa serwera",
+ "server_display_name_desc": "Wyświetlana nazwa serwera DLNA. Domyślnie {server_name}, jeśli jest pusta.",
+ "until_restart": "do ponownego uruchomienia"
+ },
+ "general": {
+ "auth": {
+ "api_key": "Klucz API",
+ "api_key_desc": "Klucz API dla systemów zewnętrznych. Wymagany tylko wtedy, gdy skonfigurowana jest nazwa użytkownika/hasło. Nazwa użytkownika musi być zapisana przed wygenerowaniem klucza API.",
+ "authentication": "Uwierzytelnianie",
+ "clear_api_key": "Wyczyść klucz API",
+ "credentials": {
+ "description": "Dane uwierzytelniające ograniczające dostęp do Stasha.",
+ "heading": "Uprawnienia"
+ },
+ "generate_api_key": "Wygeneruj klucz API",
+ "log_file": "Plik dziennika",
+ "log_file_desc": "Ścieżka do pliku, do którego mają być zapisywane logi. Puste, aby wyłączyć zapisywanie do pliku. Wymaga ponownego uruchomienia.",
+ "log_http": "Logi dostępu http",
+ "log_http_desc": "Loguje dostęp http do terminala. Wymaga ponownego uruchomienia.",
+ "log_to_terminal": "Logi do terminala",
+ "log_to_terminal_desc": "Przekazuje logi do terminala oprócz logów do pliku. Zawsze prawdziwe, jeśli logowanie do pliku jest wyłączone. Wymaga restartu.",
+ "maximum_session_age": "Maksymalny czas sesji",
+ "maximum_session_age_desc": "Maksymalny czas bezczynności przed wygaśnięciem sesji logowania, w sekundach.",
+ "password": "Hasło",
+ "password_desc": "Hasło dostępu do Stash. Pozostaw puste, aby wyłączyć uwierzytelnianie użytkownika",
+ "stash-box_integration": "Integracja ze Stash-box",
+ "username": "Nazwa użytkownika",
+ "username_desc": "Nazwa użytkownika umożliwiająca dostęp do Stash. Pozostaw puste, aby wyłączyć uwierzytelnianie użytkownika"
+ },
+ "cache_location": "Lokalizacja katalogu pamięci podręcznej",
+ "cache_path_head": "Ścieżka pamięci podręcznej",
+ "calculate_md5_and_ohash_desc": "Oblicz sumę kontrolną MD5 jako dodatek do oshash. Włączenie spowoduje, że początkowe skanowanie będzie wolniejsze. Aby wyłączyć obliczanie MD5, hash nazwy pliku musi być ustawiony na oshash.",
+ "calculate_md5_and_ohash_label": "Obliczanie MD5 dla filmów",
+ "check_for_insecure_certificates": "Sprawdź, czy nie ma niepewnych certyfikatów",
+ "check_for_insecure_certificates_desc": "Niektóre strony używają niepewnych certyfikatów ssl. Gdy opcja ta nie jest zaznaczona, scraper pomija sprawdzanie niepewnych certyfikatów i pozwala na skrobanie tych stron. Jeśli podczas skrobania pojawia się błąd certyfikatu, usuń zaznaczenie tej opcji.",
+ "chrome_cdp_path": "Ścieżka Chrome CDP",
+ "chrome_cdp_path_desc": "Ścieżka do pliku wykonywalnego Chrome lub adres zdalny (zaczynający się od http:// lub https://, na przykład http://localhost:9222/json/version) do instancji Chrome.",
+ "create_galleries_from_folders_desc": "Jeśli prawda, tworzy galerie z folderów zawierających obrazy.",
+ "create_galleries_from_folders_label": "Tworzenie galerii z folderów zawierających obrazy",
+ "db_path_head": "Ścieżka bazy danych",
+ "directory_locations_to_your_content": "Lokalizacje katalogów z twoimi treściami",
+ "excluded_image_gallery_patterns_desc": "Wyrażenia regularne dotyczące plików/ścieżek obrazów i galerii do wykluczenia ze skanowania i dodania do czyszczenia",
+ "excluded_image_gallery_patterns_head": "Wykluczone wzorce obrazów/galerii",
+ "excluded_video_patterns_desc": "Wyrażenia regularne plików/ścieżek wideo do wykluczenia ze skanowania i dodania do czyszczenia",
+ "excluded_video_patterns_head": "Wykluczone wzorce wideo",
+ "gallery_ext_desc": "Rozdzielona przecinkami lista rozszerzeń plików, które będą identyfikowane jako pliki zip galerii.",
+ "gallery_ext_head": "Rozszerzenia zip galerii",
+ "generated_file_naming_hash_desc": "Użyj MD5 lub oshash dla wygenerowanych nazw plików. Zmiana tego ustawienia wymaga, aby wszystkie sceny miały uzupełnioną odpowiednią wartość MD5/oshash. Po zmianie tej wartości, istniejące wygenerowane pliki będą musiały zostać zmigrowane lub zregenerowane. Zobacz stronę Zadania, aby uzyskać informacje na temat migracji.",
+ "generated_file_naming_hash_head": "Wygenerowany hash nazwy pliku",
+ "generated_files_location": "Lokalizacja katalogu z wygenerowanymi plikami (znaczniki scen, podglądy scen, sprite'y itp.)",
+ "generated_path_head": "Ścieżka wygenerowanych plików",
+ "hashing": "Hashowanie",
+ "image_ext_desc": "Lista rozszerzeń plików, które będą identyfikowane jako obrazy, rozdzielona przecinkami.",
+ "image_ext_head": "Rozszerzenia obrazów",
+ "include_audio_desc": "Uwzględnia strumień audio podczas generowania podglądu.",
+ "include_audio_head": "Dołącz dźwięk",
+ "logging": "Logowanie",
+ "maximum_streaming_transcode_size_desc": "Maksymalny rozmiar dla transkodowanych strumieni",
+ "maximum_streaming_transcode_size_head": "Maksymalny rozmiar transkodowania strumienia",
+ "maximum_transcode_size_desc": "Maksymalny rozmiar generowanych transkodowań",
+ "maximum_transcode_size_head": "Maksymalny rozmiar transkodowania",
+ "metadata_path": {
+ "description": "Lokalizacja katalogu używana podczas wykonywania pełnego eksportu lub importu",
+ "heading": "Ścieżka metadanych"
+ },
+ "number_of_parallel_task_for_scan_generation_desc": "Ustaw 0 dla automatycznego wykrywania. Ostrzeżenie Uruchamianie większej liczby zadań, niż jest to wymagane do osiągnięcia 100% wykorzystania procesora, spowoduje spadek wydajności i potencjalnie inne problemy.",
+ "number_of_parallel_task_for_scan_generation_head": "Liczba zadań równoległych dla skanowania/generowania",
+ "parallel_scan_head": "Równoległe skanowanie/generowanie",
+ "preview_generation": "Podgląd generacji",
+ "scraper_user_agent": "User Agent scrapera",
+ "scraper_user_agent_desc": "Ciąg User-Agent używany podczas skrobania zapytań http",
+ "scrapers_path": {
+ "description": "Katalog, w którym znajdują się pliki konfiguracyjne scrapera",
+ "heading": "Ścieżka scraperów"
+ },
+ "scraping": "Scrapowanie",
+ "sqlite_location": "Lokalizacja pliku dla bazy danych SQLite (wymaga ponownego uruchomienia)",
+ "video_ext_desc": "Lista rozszerzeń plików, które będą identyfikowane jako pliki wideo, rozdzielona przecinkami.",
+ "video_ext_head": "Rozszerzenia wideo",
+ "video_head": "Wideo"
+ },
+ "library": {
+ "exclusions": "Wyłączenia",
+ "gallery_and_image_options": "Opcje galerii i obrazów",
+ "media_content_extensions": "Rozszerzenia treści multimedialnych"
+ },
+ "logs": {
+ "log_level": "Poziom dziennika logowania"
+ },
+ "plugins": {
+ "hooks": "Hooki"
+ },
+ "scraping": {
+ "entity_metadata": "Metadane {entityType}",
+ "entity_scrapers": "Scrapery {entityType}",
+ "excluded_tag_patterns_desc": "Wyrażenia regularne nazw tagów do wykluczenia z wyników scrapowania",
+ "excluded_tag_patterns_head": "Wykluczone wzorce tagów",
+ "scraper": "Scraper",
+ "scrapers": "Scrapery",
+ "search_by_name": "Wyszukiwanie według nazwy",
+ "supported_types": "Obsługiwane typy",
+ "supported_urls": "Adresy URL"
+ },
+ "stashbox": {
+ "add_instance": "Dodaj instancję stash-box",
+ "api_key": "Klucz API",
+ "description": "Stash-box ułatwia automatyczne tagowanie scen i aktorów na podstawie odcisków palców i nazw plików.\nPunkt końcowy oraz klucz API można znaleźć na stronie swojego konta w instancji stash-box. Nazwy są wymagane, gdy dodawana jest więcej niż jedna instancja.",
+ "endpoint": "Punkt końcowy",
+ "graphql_endpoint": "Punkt końcowy GraphQL",
+ "name": "Nazwa",
+ "title": "Punkty końcowe stash-box"
+ },
+ "system": {
+ "transcoding": "Transkodowanie"
+ },
+ "tasks": {
+ "added_job_to_queue": "Dodano {operation_name} do kolejki zadań",
+ "auto_tag": {
+ "auto_tagging_all_paths": "Automatyczne tagowanie wszystkich ścieżek",
+ "auto_tagging_paths": "Automatyczne tagowanie następujących ścieżek"
+ },
+ "auto_tag_based_on_filenames": "Automatyczne tagowanie zawartości na podstawie nazw plików.",
+ "auto_tagging": "Automatyczne tagowanie",
+ "backing_up_database": "Tworzenie kopii zapasowej bazy danych",
+ "backup_and_download": "Wykonuje kopię zapasową bazy danych i pobiera plik wynikowy.",
+ "backup_database": "Wykonuje kopię zapasową bazy danych w tym samym katalogu, w którym znajduje się baza danych, z nazwą pliku w formacie {filename_format}",
+ "cleanup_desc": "Sprawdza, czy nie ma brakujących plików i usuwa je z bazy danych. Jest to działanie destrukcyjne.",
+ "data_management": "Zarządzanie danymi",
+ "defaults_set": "Zostały ustawione wartości domyślne, które będą używane po kliknięciu przycisku {action} na stronie Zadania.",
+ "dont_include_file_extension_as_part_of_the_title": "Nie dołączaj rozszerzenia pliku jako części tytułu",
+ "empty_queue": "Obecnie nie są wykonywane żadne zadania.",
+ "export_to_json": "Eksportuje zawartość bazy danych do formatu JSON w katalogu metadanych.",
+ "generate": {
+ "generating_from_paths": "Generowanie dla scen z następujących ścieżek",
+ "generating_scenes": "Generowanie dla {num} {scene}"
+ },
+ "generate_desc": "Generowanie pomocniczych plików graficznych, sprite'ów, wideo, vtt i innych.",
+ "generate_phashes_during_scan": "Generowanie hashy percepcyjnych",
+ "generate_phashes_during_scan_tooltip": "Do deduplikacji i identyfikacji scen.",
+ "generate_previews_during_scan": "Generowanie animowanych podglądów z wykorzystaniem obrazów",
+ "generate_previews_during_scan_tooltip": "Generuj animowane podglądy WebP, wymagane tylko wtedy, gdy opcja Typ podglądu jest ustawiona na Animowany obraz.",
+ "generate_sprites_during_scan": "Generowanie sprite'ów scrubberów",
+ "generate_thumbnails_during_scan": "Generowanie miniatur dla obrazów",
+ "generate_video_previews_during_scan": "Generowanie podglądów",
+ "generate_video_previews_during_scan_tooltip": "Generowanie podglądów wideo, które są odtwarzane po najechaniu kursorem myszy na scenę",
+ "generated_content": "Wygenerowane treści",
+ "identify": {
+ "and_create_missing": "i utworzyć brakujące",
+ "create_missing": "Utwórz brakujące",
+ "default_options": "Ustawienia domyślne",
+ "description": "Automatycznie ustawiaj metadane sceny przy użyciu źródeł typu stash-box i scrapery.",
+ "explicit_set_description": "Następujące opcje będą używane, jeśli nie zostały nadpisane w opcjach specyficznych dla źródła.",
+ "field": "Pole",
+ "field_options": "Opcje pól",
+ "heading": "Identyfikacja",
+ "identifying_from_paths": "Identyfikacja scen z następujących ścieżek",
+ "identifying_scenes": "Identyfikowanie {num} {scene}",
+ "include_male_performers": "Uwzględnij aktorów płci męskiej",
+ "set_cover_images": "Ustaw obrazy okładek",
+ "set_organized": "Ustaw flagę zorganizowane"
+ },
+ "plugin_tasks": "Zadania wtyczki"
+ },
+ "tools": {
+ "scene_filename_parser": {
+ "filename_pattern": "Wzór nazwy pliku"
+ }
+ }
+ },
+ "dialogs": {
+ "scrape_entity_query": "{entity_type} zapytanie scrapowania",
+ "scrape_entity_title": "{entity_type} rezultaty scrapowania",
+ "scrape_results_existing": "Istniejące",
+ "scrape_results_scraped": "Zeskrobane"
+ }
+}
diff --git a/ui/v2.5/src/locales/pt-BR.json b/ui/v2.5/src/locales/pt-BR.json
index be21a0e19..5f6591e9e 100644
--- a/ui/v2.5/src/locales/pt-BR.json
+++ b/ui/v2.5/src/locales/pt-BR.json
@@ -9,12 +9,16 @@
"apply": "Aplicar",
"auto_tag": "Auto tag",
"backup": "Backup",
+ "browse_for_image": "Navegar imagens…",
"cancel": "Cancelar",
"clean": "Limpar",
+ "clear": "Limpar",
"clear_back_image": "Limpar imagem de fundo",
"clear_front_image": "Limpar imagem frontal",
"clear_image": "Limpar imagem",
"close": "Fechar",
+ "confirm": "Confirmar",
+ "continue": "Continuar",
"create": "Criar",
"create_entity": "Criar {entityType}",
"create_marker": "Criar marcador",
@@ -22,6 +26,7 @@
"delete": "Apagar",
"delete_entity": "Apagar {entityType}",
"delete_file": "Apagar arquivo",
+ "delete_file_and_funscript": "Deletar arquivo (e funscript)",
"delete_generated_supporting_files": "Apagar arquivos gerados de suporte",
"disallow": "Não permitir",
"download": "Download",
@@ -30,6 +35,7 @@
"export": "Exportar…",
"export_all": "Exportar tudo…",
"find": "Encontrar",
+ "finish": "Finalizar",
"from_file": "Do arquivo…",
"from_url": "Da URL…",
"full_export": "Exportação completa",
@@ -39,16 +45,22 @@
"generate_thumb_from_current": "Gerar thumbnail do atual",
"hash_migration": "migrar hash",
"hide": "Esconder",
+ "hide_configuration": "Esconder Configuração",
+ "identify": "Identificar",
+ "ignore": "Ignorar",
"import": "Importar…",
"import_from_file": "Importar do arquivo",
"merge": "Unir",
"merge_from": "Unir do",
"merge_into": "Unir em",
+ "next_action": "Próximo",
"not_running": "não realizado",
+ "open_random": "Abrir aleatório",
"overwrite": "Sobrescrever",
"play_random": "Tocar aleatório",
"play_selected": "Tocar selecionado",
"preview": "Previsualizar",
+ "previous_action": "Voltar",
"refresh": "Atualizar",
"reload_plugins": "Recarregar plugins",
"reload_scrapers": "Recarregar scrapers",
@@ -58,20 +70,30 @@
"reshuffle": "Reembaralhar",
"running": "rodando",
"save": "Salvar",
+ "save_delete_settings": "Usar essas opções por padrão quando deletar",
"save_filter": "Salvar filtro",
"scan": "Escanear",
+ "scrape": "Buscar",
+ "scrape_query": "Query de busca",
+ "scrape_scene_fragment": "Buscar por fragmento",
"scrape_with": "Scrape com…",
"search": "Buscar",
"select_all": "Selecionar todos",
+ "select_folders": "Selecionar pastas",
"select_none": "Selecionar nenhum",
"selective_auto_tag": "Auto Tag seletivo",
+ "selective_clean": "Limpeza Seletiva",
"selective_scan": "Escaneamento seletivo",
"set_as_default": "Aplicar como padrão",
"set_back_image": "Imagem de fundo…",
"set_front_image": "Imagem frontal…",
"set_image": "Aplicar imagem…",
"show": "Mostrar",
+ "show_configuration": "Exibir Configuração",
"skip": "Pular",
+ "stop": "Parar",
+ "submit": "Enviar",
+ "submit_stash_box": "Enviar para o Stash-Box",
"tasks": {
"clean_confirm_message": "Tem certeza de que quer limpar? Isto irá apagar as informações do banco de dados e conteúdos gerados de todas as cenas e galerias que não são mais encontradas no sistema.",
"dry_mode_selected": "Modo não destrutivo. Nenhum arquivo será apagado, apenas será logado.",
@@ -79,11 +101,13 @@
},
"temp_disable": "Desabilitar temporariamente…",
"temp_enable": "Habilitar temporariamente…",
+ "use_default": "Usar padrão",
"view_random": "Mostrar aleatoriamente"
},
"actions_name": "Ações",
"age": "Idade",
"aliases": "Apelidos",
+ "all": "todos",
"also_known_as": "Também conhecido(a) como",
"ascending": "Ascendente",
"average_resolution": "Resolução média",
@@ -98,11 +122,11 @@
"blacklist_label": "Lista negra",
"query_mode_auto": "Automático",
"query_mode_auto_desc": "Usa metadados se existentes, ou nome do arquivo",
- "query_mode_dir": "Dir",
+ "query_mode_dir": "Diretório",
"query_mode_dir_desc": "Usa apenas o diretório pai do arquivo de vídeo",
"query_mode_filename": "Nome do arquivo",
"query_mode_filename_desc": "Usa apenas o nome do arquivo",
- "query_mode_label": "Modo de consulta.",
+ "query_mode_label": "Modo de consulta",
"query_mode_metadata": "Metadados",
"query_mode_metadata_desc": "Usa apenas metadados",
"query_mode_path": "Caminho",
@@ -110,9 +134,10 @@
"set_cover_desc": "Substitua a capa da cena se alguma for encontrada.",
"set_cover_label": "Definir imagem da capa da cena",
"set_tag_desc": "Anexar tags à cena, sobrescrevendo ou mesclando com as tags existentes na cena.",
- "set_tag_label": "Definir tags.",
+ "set_tag_label": "Definir tags",
"show_male_desc": "Artistas masculinos estarão disponíveis para tag.",
- "show_male_label": "Mostrar artistas masculinos"
+ "show_male_label": "Mostrar artistas masculinos",
+ "source": "Fonte"
},
"noun_query": "Query",
"results": {
@@ -124,10 +149,13 @@
"hash_matches": "{hash_type} é uma correspondência",
"match_failed_already_tagged": "Cena já marcada",
"match_failed_no_result": "Nenhum resultado encontrado",
- "match_success": "Cena marcada com sucesso"
+ "match_success": "Cena marcada com sucesso",
+ "phash_matches": "{count} PHashes coincide(m)",
+ "unnamed": "Sem nome"
},
"verb_match_fp": "Combine as impressões digitais",
"verb_matched": "Combinado",
+ "verb_scrape_all": "Buscar tudo",
"verb_submit_fp": "Enviar {fpCount, plural, one{# impressão digital} other{# impressões digitais}}",
"verb_toggle_config": "{toggle} {configuration}",
"verb_toggle_unmatched": "{toggle} cenas incomparáveis"
@@ -137,6 +165,7 @@
"build_hash": "Build hash:",
"build_time": "Tempo de build:",
"check_for_new_version": "Verificar se há uma nova versão",
+ "latest_version": "Última versão",
"latest_version_build_hash": "Build Hash da última versão:",
"new_version_notice": "[NOVA]",
"stash_discord": "Junte-se ao nosso {url} canal",
@@ -145,12 +174,19 @@
"stash_wiki": "Stash {url} página",
"version": "Versão"
},
+ "application_paths": {
+ "heading": "Caminhos da Aplicação"
+ },
"categories": {
"about": "Sobre",
"interface": "Interface",
"logs": "Logs",
+ "metadata_providers": "Provedores de Meta-dados",
"plugins": "Plugins",
"scraping": "Scraping",
+ "security": "Segurança",
+ "services": "Serviços",
+ "system": "Sistema",
"tasks": "Tarefas",
"tools": "Ferramentas"
},
@@ -173,19 +209,23 @@
"api_key_desc": "Chave de API para sistemas externos. Exigido apenas quando username/senha está configurado. Username deve ser salvo antes de gerar uma chave de API.",
"authentication": "Autenticação",
"clear_api_key": "Limpar Chave de API",
+ "credentials": {
+ "description": "Credenciais para restringir o acesso ao Stash.",
+ "heading": "Credenciais"
+ },
"generate_api_key": "Gerar Chave de API",
"log_file": "Arquivo de log",
"log_file_desc": "Caminho para o arquivo para o log de saída. Em branco para desativar o registro de arquivos. Requer reinicialização.",
"log_http": "Log de acesso http",
"log_http_desc": "Logs de acesso http para o terminal. Requer reinicialização.",
- "log_to_terminal": "Log para terminal.",
+ "log_to_terminal": "Log para terminal",
"log_to_terminal_desc": "Logs para o terminal, além de um arquivo. Sempre ativo se o log de arquivos estiver desativado. Requer reinicialização.",
"maximum_session_age": "Tempo máximo da sessão",
"maximum_session_age_desc": "Tempo ocioso máximo antes de uma sessão de login expirar, em segundos.",
"password": "Senha",
"password_desc": "Senha para acesso Stash. Deixe em branco para desativar a autenticação do usuário",
"stash-box_integration": "Integração com Stash-box",
- "username": "Username",
+ "username": "Usuário",
"username_desc": "Username para acessar o Stash. Deixe em branco para desativar a autenticação do usuário"
},
"cache_location": "Localização do diretório do cache",
@@ -194,7 +234,7 @@
"calculate_md5_and_ohash_label": "Calcular MD5 para vídeos",
"check_for_insecure_certificates": "Verifique se há certificados inseguros",
"check_for_insecure_certificates_desc": "Alguns sites usam ssl certificados inseguros. Quando desmarcado o scraper pula a verificação de certificados inseguros e permite o scraping desses sites. Se você receber um erro de certificado quando scraping desmarque isto.",
- "chrome_cdp_path": "Chrome CDP path",
+ "chrome_cdp_path": "Caminho do Chrome CDP",
"chrome_cdp_path_desc": "Caminho do arquivo para o executavel do Chrome, ou um endereço remoto (começando com http:// ou https://, por exemplo http://localhost:9222/json/version) para uma instância do Chrome.",
"create_galleries_from_folders_desc": "Se marcado, cria galerias de pastas contendo imagens.",
"create_galleries_from_folders_label": "Crie galerias de pastas contendo imagens",
@@ -213,23 +253,38 @@
"hashing": "Hashing",
"image_ext_desc": "Lista delimitada por vírgulas de extensões de arquivo que serão identificadas como imagens.",
"image_ext_head": "Extensões de imagem",
+ "include_audio_desc": "Inclui stream de áudio quando gerar pré-visualizações.",
+ "include_audio_head": "Incluir áudio",
"logging": "Logging",
"maximum_streaming_transcode_size_desc": "Tamanho máximo para streams transcodados",
"maximum_streaming_transcode_size_head": "Tamanho máximo de transcodação de streaming",
"maximum_transcode_size_desc": "Tamanho máximo para transcodes gerados",
- "maximum_transcode_size_head": "Tamanho máximo de transcode.",
+ "maximum_transcode_size_head": "Tamanho máximo de transcodificação",
+ "metadata_path": {
+ "description": "Localização do diretório usado durante importação ou exportação completa dos meta-dados",
+ "heading": "Caminho dos Meta-dados"
+ },
"number_of_parallel_task_for_scan_generation_desc": "Defina como 0 para detecção automática. AVISO Execução de mais tarefas do que é necessário para obter 100% de utilização da CPU diminuirá o desempenho e potencialmente causar outros problemas.",
"number_of_parallel_task_for_scan_generation_head": "Número de tarefas paralelas para varredura/geração",
"parallel_scan_head": "Varredura/Geração paralela",
"preview_generation": "Pré visualizar a geração",
"scraper_user_agent": "Scraper User Agent",
"scraper_user_agent_desc": "User-Agent string usado durante solicitações http do scrape",
+ "scrapers_path": {
+ "description": "Caminho para o diretório para os arquivos de configuração de scrapers",
+ "heading": "Caminho dos scrapers"
+ },
"scraping": "Scraping",
"sqlite_location": "Localização do arquivo para o banco de dados SQLite (requer reinicialização)",
"video_ext_desc": "Lista delimitada por vírgulas de extensões de arquivo que serão identificadas como vídeos.",
- "video_ext_head": "Extensões de vídeo.",
+ "video_ext_head": "Extensões de vídeo",
"video_head": "Vídeo"
},
+ "library": {
+ "exclusions": "Exclusões",
+ "gallery_and_image_options": "Opções de Imagem e Galeria",
+ "media_content_extensions": "Extensões de arquivo de mídia"
+ },
"logs": {
"log_level": "Log Level"
},
@@ -239,7 +294,10 @@
},
"scraping": {
"entity_metadata": "{entityType} metadados",
- "entity_scrapers": "{entityType} scrapers",
+ "entity_scrapers": "Scrapers de {entityType}",
+ "excluded_tag_patterns_desc": "Expressões regulares de tags para excluir dos resultados da busca",
+ "excluded_tag_patterns_head": "Padrões de Tag Excluídos",
+ "scraper": "Scraper",
"scrapers": "Scrapers",
"search_by_name": "Buscar por nome",
"supported_types": "Tipos suportados",
@@ -250,76 +308,164 @@
"api_key": "Chave de API",
"description": "Stash-box facilita o tagging automático de cenas e artistas baseados em 'impressões digitais' e nomes de arquivos..\nEndpoint e chave de API pode ser encontrado na sua página de conta na instancia stash-box. Os nomes são necessários quando mais de uma instância são adicionados.",
"endpoint": "Endpoint",
- "graphql_endpoint": "GraphQL endpoint",
+ "graphql_endpoint": "Endpoint GraphQL",
"name": "Nome",
- "title": "Stash-box Endpoints"
+ "title": "Endpoints do Stash-box"
+ },
+ "system": {
+ "transcoding": "Transcodificação"
},
"tasks": {
- "added_job_to_queue": "{operation_name} adicionada para a fila de trabalho.",
+ "added_job_to_queue": "{operation_name} adicionada para a fila de trabalho",
+ "auto_tag": {
+ "auto_tagging_all_paths": "Adicionar tags automaticamente em todos os caminhos",
+ "auto_tagging_paths": "Adicionar tags automaticamente nos seguintes caminhos"
+ },
"auto_tag_based_on_filenames": "Conteúdo automático de tag baseado em nomes de arquivos.",
"auto_tagging": "Auto tagging",
"backing_up_database": "Backup do banco de dados",
"backup_and_download": "Executa um backup do banco de dados e baixa do arquivo resultante.",
"backup_database": "Executa um backup do banco de dados para o mesmo diretório que o banco de dados, com o formato do nome do arquivo {filename_format}",
"cleanup_desc": "Verifique os arquivos ausentes removendo-os do banco de dados. Esta é uma ação destrutiva.",
+ "data_management": "Gestão de dados",
+ "defaults_set": "Opções padrão foram definidas e serão usadas quando clicar o botão {action} na página de Tarefas.",
"dont_include_file_extension_as_part_of_the_title": "Não incluir extensão de arquivo como parte do título",
+ "empty_queue": "Não há tarefas atualmente em execução.",
"export_to_json": "Exporta o conteúdo do banco de dados para o formato JSON no diretório de metadados.",
+ "generate": {
+ "generating_from_paths": "Gerando mídia de suporte para as cenas dos seguintes diretórios",
+ "generating_scenes": "Gerando mídia de suporta para {num} {scene}"
+ },
"generate_desc": "Gerar imagem de suporte, sprite, video, vtt e outros arquivos.",
- "generate_phashes_during_scan": "Gerar phashes durante a varredura (para uma deduplicação e identificação de cena)",
- "generate_previews_during_scan": "Gerar pré-visualizações de imagem durante a digitalização (WebP animadas, somente necessário se o tipo de pré-visualização for definido para imagem animada)",
- "generate_sprites_during_scan": "Gerar sprites durante a digitalização (para o cena scrubber)",
- "generate_video_previews_during_scan": "Gerar pré-visualizações durante a digitalização (pré-visualizações de vídeo que tocam ao posicionar o mouse sobre uma cena)",
+ "generate_phashes_during_scan": "Gerar hashes perceptivos (phash)",
+ "generate_phashes_during_scan_tooltip": "Para desduplicação e identificação de cenas.",
+ "generate_previews_during_scan": "Gerar pré-visualizações de imagem animada",
+ "generate_previews_during_scan_tooltip": "Gerar pré-visualizações WebP animadas, necessário apenas de o Tipo de Pré-visualização estiver configurado para Imagem Animada.",
+ "generate_sprites_during_scan": "Gerar sprites para o scrubber de cena",
+ "generate_thumbnails_during_scan": "Gerar miniaturas das imagens",
+ "generate_video_previews_during_scan": "Gerar pré-visualizações",
+ "generate_video_previews_during_scan_tooltip": "Gerar pré-visualizações de vídeo que são exibidos ao passar o mouse sobre uma cena",
"generated_content": "Conteúdo gerado",
+ "identify": {
+ "and_create_missing": "e criar ausentes",
+ "create_missing": "Criar ausentes",
+ "default_options": "Opções padrão",
+ "description": "Defina meta-dados de cena automaticamente usando stash-box e fontes de scrapers.",
+ "explicit_set_description": "As opções a seguir serão usadas se não sobrescreverem as opções específicas de cada fonte.",
+ "field": "Campo",
+ "field_behaviour": "{strategy} {field}",
+ "field_options": "Opções de campo",
+ "heading": "Identificar",
+ "identifying_from_paths": "Identificação de cenas nos seguintes caminhos",
+ "identifying_scenes": "Identificando {num} {scene}",
+ "include_male_performers": "Incluir atores",
+ "set_cover_images": "Definir imagens de capa",
+ "set_organized": "Marcar cena como \"organizada\"",
+ "source": "Fonte",
+ "source_options": "Opções de {source}",
+ "sources": "Fontes",
+ "strategy": "Estratégia"
+ },
"import_from_exported_json": "Importação de JSON exportado no diretório de metadados. Limpa o banco de dados existente.",
"incremental_import": "Importação incremental de um arquivo zip de exportação fornecido.",
- "job_queue": "Fila de trabalho.",
+ "job_queue": "Fila de tarefas",
"maintenance": "Manutenção",
"migrate_hash_files": "Usado depois de alterar o hash gerado de nomeação de arquivos para renomear arquivos gerados existentes para o novo formato hash.",
"migrations": "Migrações",
"only_dry_run": "Executar apenas modo não destrutivo. Não remova nada",
"plugin_tasks": "Tarefas de plugin",
+ "scan": {
+ "scanning_all_paths": "Escaneando todos os caminhos",
+ "scanning_paths": "Escaneando os seguintes caminhos"
+ },
"scan_for_content_desc": "Varre para novos conteúdos e adicioná-los ao banco de dados.",
- "set_name_date_details_from_metadata_if_present": "Definir nome, data, detalhes de metadados (se presente)"
+ "set_name_date_details_from_metadata_if_present": "Definir nome, data e detalhes a partir dos meta-dados do arquivo"
},
"tools": {
"scene_duplicate_checker": "Verificador de cena duplicada",
"scene_filename_parser": {
"add_field": "Adicionar campo",
- "capitalize_title": "Capitalizar o título.",
+ "capitalize_title": "Capitalizar o título",
"display_fields": "Exibir os campos",
"escape_chars": "Use \\ para digitar caracteres literais",
"filename": "Nome do arquivo",
"filename_pattern": "Padrão de nome de arquivo",
+ "ignore_organized": "Ignorar cenas organizadas",
"ignored_words": "Palavras ignoradas",
"matches_with": "Corresponde com {i}",
- "select_parser_recipe": "Select Parser Recipe",
+ "select_parser_recipe": "Selecionar a fórmula do analisador sintático",
"title": "Parser de nome de arquivo de cena",
"whitespace_chars": "Caracteres de espaço em branco",
- "whitespace_chars_desc": "Esses caracteres serão substituídos pelo espaço em branco no título."
+ "whitespace_chars_desc": "Esses caracteres serão substituídos pelo espaço em branco no título"
},
"scene_tools": "Ferramentas de cena"
},
"ui": {
+ "basic_settings": "Configurações básicas",
"custom_css": {
"description": "A página deve ser recarregada para alterações para terem efeito.",
"heading": "CSS customizado",
"option_label": "CSS customizado habilitado"
},
+ "delete_options": {
+ "description": "Opções padrão ao deletar imagens, galerias e cenas.",
+ "heading": "Opções de deleção",
+ "options": {
+ "delete_file": "Deletar arquivo por padrão",
+ "delete_generated_supporting_files": "Deletar arquivos de suporte gerados por padrão"
+ }
+ },
+ "desktop_integration": {
+ "desktop_integration": "Integração com o Desktop",
+ "notifications_enabled": "Ativar Notificações",
+ "send_desktop_notifications_for_events": "Enviar notificações desktop para eventos",
+ "skip_opening_browser": "Pular abertura do navegador",
+ "skip_opening_browser_on_startup": "Pular abertura automática do navegador durante a inicialização"
+ },
+ "editing": {
+ "disable_dropdown_create": {
+ "description": "Remover a capacidade de criar novos objetos a partir dos seletores dropdown",
+ "heading": "Desabilitar criação no menu dropdown"
+ },
+ "heading": "Edição"
+ },
+ "funscript_offset": {
+ "description": "Compensação de tempo em milissegundos para a reprodução de scripts interativos.",
+ "heading": "Compensação de tempo Funscript (ms)"
+ },
"handy_connection_key": {
- "description": "Chave de conexão para usar em cenas interativas.",
+ "description": "Chave de conexão para usar em cenas interativas. Ativar esta chave permitirá o Stash a compartilhar as informações da cena atual com handyfeeling.com",
"heading": "Chave de conexão"
},
+ "images": {
+ "heading": "Imagens",
+ "options": {
+ "write_image_thumbnails": {
+ "description": "Salvar miniaturas de imagem no disco quando geradas em tempo real",
+ "heading": "Salvar miniaturas de imagem"
+ }
+ }
+ },
+ "interactive_options": "Opções interativas",
"language": {
"heading": "Idioma"
},
"max_loop_duration": {
"description": "Duração máxima da cena onde o player realizará o loop do vídeo - 0 para desabilitar",
- "heading": "Duração máxima do loop."
+ "heading": "Duração máxima do loop"
},
"menu_items": {
"description": "Mostrar ou ocultar diferentes tipos de conteúdo na barra de navegação",
"heading": "Itens do menu"
},
+ "performers": {
+ "options": {
+ "image_location": {
+ "description": "Caminho personalizado para imagens de atrizes/atores. Deixe em branco para usar o padrão da aplicação",
+ "heading": "Caminho para imagens personalizadas de atrizes/atores"
+ }
+ }
+ },
"preview_type": {
"description": "Configuração para itens do paredão",
"heading": "Tipo de visualização",
@@ -338,11 +484,20 @@
"scene_player": {
"heading": "Player de cenas",
"options": {
- "auto_start_video": "Começar vídeos automaticamente"
+ "auto_start_video": "Começar vídeos automaticamente",
+ "auto_start_video_on_play_selected": {
+ "description": "Começar reprodução de vídeos de cenas automaticamente quando reproduzindo selecionado ou aleatório a partir da página de Cenas",
+ "heading": "Começar vídeo automaticamente quando reproduzindo selecionado"
+ },
+ "continue_playlist_default": {
+ "description": "Reproduzir próxima cena na fila quando o vídeo finalizar",
+ "heading": "Continuar playlist por padrão"
+ },
+ "show_scrubber": "Mostrar Scrubber"
}
},
"scene_wall": {
- "heading": "Scene / Marker Wall",
+ "heading": "Muro de cenas/marcadores",
"options": {
"display_title": "Exibir título e tags",
"toggle_sound": "Habilitar som"
@@ -357,6 +512,7 @@
},
"configuration": "Configuração",
"countables": {
+ "files": "{count, plural, one {Arquivo} other {Arquivos}}",
"galleries": "{count, plural, one {Galeria} other {Galerias}}",
"images": "{count, plural, one {Imagem} other {Imagens}}",
"markers": "{count, plural, one {Marcador} other {Marcadores}}",
@@ -369,7 +525,13 @@
"country": "País",
"cover_image": "Imagem de capa",
"created_at": "Criado em",
+ "criterion": {
+ "greater_than": "Maior que",
+ "less_than": "Menor que",
+ "value": "Valor"
+ },
"criterion_modifier": {
+ "between": "está entre",
"equals": "é",
"excludes": "exclui",
"format_string": "{criterion} {modifierString} {valueString}",
@@ -379,41 +541,78 @@
"is_null": "é nulo",
"less_than": "é menor que",
"matches_regex": "regex combina com",
+ "not_between": "não está entre",
"not_equals": "não é",
"not_matches_regex": "regex não combina com",
"not_null": "não é nulo"
},
+ "custom": "Personalizado",
"date": "Data",
"death_date": "Data de óbito",
"death_year": "Ano da morte",
"descending": "Descendente",
"detail": "Detalhe",
"details": "Detalhes",
- "developmentVersion": "Versão de desenvolvimento.",
+ "developmentVersion": "Versão de desenvolvimento",
"dialogs": {
+ "aliases_must_be_unique": "apelidos devem ser únicos",
+ "delete_alert": "Os seguintes {count, plural, one {{singularEntity}} other {{pluralEntity}}} serão deletados permanentemente:",
"delete_confirm": "Tem certeza de que deseja excluir {entityName}?",
"delete_entity_desc": "{count, plural, one {Tem certeza de que deseja excluir este(a) {singularEntity}? A menos que o arquivo também seja excluído, este(a) {singularEntity} será re-adicionado quando a varredura for executada.} other {Tem certeza de que deseja excluir estes(as) {pluralEntity}? A menos que os arquivos também sejam excluídos, estes(as) {pluralEntity} serão re-adicionados quando a varredura for executada.}}",
"delete_entity_title": "{count, plural, one {Excluir {singularEntity}} other {Excluir {pluralEntity}}}",
+ "delete_galleries_extra": "...e qualquer imagem não anexada a uma galeria.",
+ "delete_gallery_files": "Deletar diretório, arquivo zip ou imagem não anexada a alguma galeria.",
"delete_object_desc": "Tem certeza de que deseja excluir {count, plural, one {este(a) {singularEntity}} other {estes(as) {pluralEntity}}}?",
"delete_object_overflow": "…e {count} other {count, plural, one {{singularEntity}} other {{pluralEntity}}}.",
"delete_object_title": "Excluir {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
"edit_entity_title": "Editar {count, plural, one {{singularEntity}} other {{pluralEntity}}}",
"export_include_related_objects": "Inclua objetos relacionados na exportação",
"export_title": "Exportar",
+ "lightbox": {
+ "delay": "Delay (seg)",
+ "display_mode": {
+ "fit_horizontally": "Ajustar horizontalmente",
+ "fit_to_screen": "Ajustar à tela",
+ "label": "Modo de visualização",
+ "original": "Original"
+ },
+ "options": "Opções",
+ "reset_zoom_on_nav": "Restaurar nível de zoom ao trocar de imagem",
+ "scale_up": {
+ "description": "Aumentar imagens menores até que preencham a tela",
+ "label": "Aumentar para caber"
+ },
+ "scroll_mode": {
+ "description": "Mantenha shift pressionado para usar outro modo temporariamente.",
+ "label": "Modo scroll",
+ "pan_y": "Pan Y",
+ "zoom": "Zoom"
+ }
+ },
"merge_tags": {
"destination": "Destino",
"source": "Fonte"
},
"overwrite_filter_confirm": "Tem certeza de que deseja sobrescrever a consulta salva existente {entityName}?",
"scene_gen": {
- "image_previews": "Pré-visualizações de imagem (WebP animadas, somente necessário se o tipo de pré-visualização for definido para imagem animada)",
- "markers": "Marcadores (vídeos de 20 segundos que iniciam no dado tempo)",
+ "force_transcodes": "Forçar geração de transcodificação",
+ "force_transcodes_tooltip": "Por padrão, transcodificações são geradas apenas quando o arquivo de vídeo não é suportado pelo navegador. Quando ativado, transcodificações serão geradas mesmo quando o vídeo parecer ser suportado no navegador.",
+ "image_previews": "Pré-visualizações de imagem animada",
+ "image_previews_tooltip": "Pré-visualizações WebP animadas, necessárias somente se o Tipo de Pré-visualização estiver configurado para Imagem Animada.",
+ "interactive_heatmap_speed": "Gerar heatmaps e velocidades para cenas interativas",
+ "marker_image_previews": "Pré-visualizações de Imagem Animada para Marcadores",
+ "marker_image_previews_tooltip": "Pré-visualizações WebP animadas para marcadores, necessário apenas de o Tipo de Pré-visualização estiver configurado para Imagem Animada.",
+ "marker_screenshots": "Capturas de Tela de Marcadores",
+ "marker_screenshots_tooltip": "Imagens JPG estáticas para marcadores, necessário apenas se o Tipo de Pré-visualização estiver configurado para Imagem Estática.",
+ "markers": "Pré-visualizações de Marcadores",
+ "markers_tooltip": "Vídeos de 20 segundos que iniciam em dado código de tempo.",
"overwrite": "Substituir arquivos gerados existentes",
"phash": "Hashes perceptivos (para desduplicação)",
"preview_exclude_end_time_desc": "Excluir os últimos x segundos de pré-visualizações de cena. Isso pode ser um valor em segundos, ou uma porcentagem (p. ex. 2%) da duração total da cena.",
"preview_exclude_end_time_head": "Excluir tempo de término",
"preview_exclude_start_time_desc": "Excluir os primeiros x segundos de pré-visualizações de cena. Isso pode ser um valor em segundos, ou uma porcentagem (p. ex. 2%) da duração total da cena.",
"preview_exclude_start_time_head": "Excluir tempo de início",
+ "preview_generation_options": "Opções para Geração de Pré-visualizações",
"preview_options": "Opções de pré-visualização",
"preview_preset_desc": "A predefinição regula o tamanho, a qualidade e o tempo de codificação da geração de pré-visualização. Predefinições além de “lenta” tem retornos diminuindo e não são recomendados.",
"preview_preset_head": "Codificação predefinida de pré-visualização",
@@ -421,13 +620,18 @@
"preview_seg_count_head": "Número de segmentos em pré-visualização",
"preview_seg_duration_desc": "Duração de cada segmento de pré-visualização, em segundos.",
"preview_seg_duration_head": "Duração do segmento de pré-visualização",
- "sprites": "Sprites (para scrubber de cena)",
- "transcodes": "Transcodes (conversões MP4 de formatos de vídeo não suportados)",
- "video_previews": "Pré-visualizações (pré-visualizações de vídeo que tocam ao posicionar o mouse sobre uma cena)"
+ "sprites": "Sprites do scrubber de cena",
+ "sprites_tooltip": "Sprites (para o scrubber de cena)",
+ "transcodes": "Transcodificações",
+ "transcodes_tooltip": "Conversões MP4 de formatos de vídeo não suportados",
+ "video_previews": "Pré-visualizações",
+ "video_previews_tooltip": "Pré-visualizações de vídeo que são exibidas ao passar o mouse sobre uma cena"
},
+ "scenes_found": "{count} cenas encontradas",
+ "scrape_entity_query": "Query de busca de {entity_type}",
"scrape_entity_title": "{entity_type} resultados de scrape",
"scrape_results_existing": "Existem",
- "scrape_results_scraped": "Scraped",
+ "scrape_results_scraped": "Scrape finalizado",
"set_image_url_title": "URL da imagem",
"unsaved_changes": "Mudanças não salvas. Você tem certeza de que quer sair?"
},
@@ -453,9 +657,10 @@
"search_accuracy_label": "Precisão de pesquisa",
"title": "Cenas duplicadas"
},
+ "duplicated_phash": "Duplicado (phash)",
"duration": "Duração",
"effect_filters": {
- "aspect": "Aspect",
+ "aspect": "Aspecto",
"blue": "Azul",
"blur": "Blur",
"brightness": "Brilho",
@@ -478,18 +683,30 @@
"ethnicity": "Etnicidade",
"eye_color": "Cor dos olhos",
"fake_tits": "Peitos falsos",
+ "false": "Falso",
"favourite": "Favorito(a)",
+ "file": "arquivo",
"file_info": "Informações do arquivo",
"file_mod_time": "Tempo de modificação do arquivo",
+ "files": "arquivos",
"filesize": "Tamanho do arquivo",
"filter": "Filtro",
"filter_name": "Nome do filtro",
"filters": "Filtros",
"framerate": "Taxa de quadros",
+ "frames_per_second": "{value} quadros por segundo",
"galleries": "Galerias",
"gallery": "Galeria",
"gallery_count": "Contagem de galeria",
"gender": "Gênero",
+ "gender_types": {
+ "FEMALE": "Feminino",
+ "INTERSEX": "Intersexo",
+ "MALE": "Masculino",
+ "NON_BINARY": "Não-Binário",
+ "TRANSGENDER_FEMALE": "Transgênero Feminino",
+ "TRANSGENDER_MALE": "Transgênero Masculino"
+ },
"hair_color": "Cor do cabelo",
"hasMarkers": "Possui marcadores",
"height": "Altura",
@@ -497,9 +714,12 @@
"image": "Imagem",
"image_count": "Contagem de imagem",
"images": "Imagens",
+ "include_parent_tags": "Incluir tags pai",
"include_sub_studios": "Incluem estúdios filho",
+ "include_sub_tags": "Incluir sub-tags",
"instagram": "Instagram",
"interactive": "Interativo",
+ "interactive_speed": "Velocidade interativa",
"isMissing": "Está faltando",
"library": "Biblioteca",
"loading": {
@@ -513,6 +733,7 @@
"checksum": "Checksum",
"downloaded_from": "Baixado de",
"hash": "Hash",
+ "interactive_speed": "Velocidade interativa",
"performer_card": {
"age": "{age} {years_old}",
"age_context": "{age} {years_old} nesta cena"
@@ -521,6 +742,7 @@
"stream": "Stream",
"video_codec": "Codec de vídeo"
},
+ "megabits_per_second": "{value} megabits por segundo",
"metadata": "Metadados",
"movie": "Filme",
"movie_scene_number": "Número da cena do filme",
@@ -537,12 +759,54 @@
"next": "Próximo",
"previous": "Anterior"
},
+ "parent_of": "Pai de {children}",
"parent_studios": "Estúdios pai",
+ "parent_tag_count": "Contador de tags pai",
+ "parent_tags": "Tags pai",
+ "part_of": "Parte de {parent}",
"path": "Caminho",
+ "perceptual_similarity": "Semelhança Perceptiva (phash)",
"performer": "Artista",
"performerTags": "Tags de artitas",
+ "performer_age": "Idade do Artista",
"performer_count": "Contagem de artistas",
+ "performer_favorite": "Artista Favoritado",
"performer_image": "Imagem do(a) artita",
+ "performer_tagger": {
+ "add_new_performers": "Adicionar Novos Artistas",
+ "any_names_entered_will_be_queried": "Quaisquer nomes inseridos serão consultados na instância remota do Stash-Box e adicionados caso encontrados. Apenas correspondências exatas serão consideradas.",
+ "batch_add_performers": "Adicionar Artistas em Lote",
+ "batch_update_performers": "Atualizar Artistas em Lote",
+ "config": {
+ "active_stash-box_instance": "Instância Stash-Box ativa:",
+ "edit_excluded_fields": "Editar Campos Excluídos",
+ "excluded_fields": "Campos excluídos:",
+ "no_fields_are_excluded": "Nenhum campo é excluído",
+ "no_instances_found": "Nenhuma instância encontrada",
+ "these_fields_will_not_be_changed_when_updating_performers": "Estes campos não serão alterados ao atualizar artistas."
+ },
+ "current_page": "Página atual",
+ "failed_to_save_performer": "Falha ao salvar artista \"{performer}\"",
+ "name_already_exists": "Nome já existe",
+ "network_error": "Erro de Rede",
+ "no_results_found": "Nenhum resultado encontrado.",
+ "number_of_performers_will_be_processed": "{performer_count} artistas serão processados",
+ "performer_already_tagged": "Artista já taggeado",
+ "performer_names_separated_by_comma": "Nomes de artistas separados por vírgula",
+ "performer_selection": "Seleção de artista",
+ "performer_successfully_tagged": "Artista taggeado com sucesso:",
+ "query_all_performers_in_the_database": "Todos os artistas no banco de dados",
+ "refresh_tagged_performers": "Recarregar artistas taggeados",
+ "refreshing_will_update_the_data": "Recarregar irá atualizar os dados de qualquer artista taggeado da instância do stash-box.",
+ "status_tagging_job_queued": "Status: Taggeamento adicionado à fila",
+ "status_tagging_performers": "Status: Taggeando artistas",
+ "tag_status": "Status da Tag",
+ "to_use_the_performer_tagger": "Para usar o tagger de artistas, uma instância do stash-box deve ser configurada.",
+ "untagged_performers": "Artistas sem tag",
+ "update_performer": "Atualizar Artista",
+ "update_performers": "Atualizar Artistas",
+ "updating_untagged_performers_description": "A atualização de artistas sem tag tentará corresponder a qualquer artista sem um shashid e atualizar os metadados."
+ },
"performers": "Artistas",
"piercings": "Piercings",
"queue": "Fila",
@@ -564,15 +828,101 @@
},
"seconds": "Segundos",
"settings": "Definições",
+ "setup": {
+ "confirm": {
+ "almost_ready": "Estamos quase prontos para concluis a configuração. Por favor confirme as configurações a seguir. Você pode clicar em voltar para alterar qualquer dado incorreto. Se tudo parece certo, clique Confirmar para criar seu novo sistema.",
+ "configuration_file_location": "Caminho para o arquivo de configuração:",
+ "database_file_path": "Caminho para o banco de dados",
+ "default_db_location": "/stash-go.sqlite",
+ "default_generated_content_location": "/generated",
+ "generated_directory": "Diretório contendo arquivos de mídia de suporte gerados pelo Stash",
+ "nearly_there": "Quase lá!",
+ "stash_library_directories": "Diretórios de biblioteca do Stash"
+ },
+ "creating": {
+ "creating_your_system": "Criando seu sistema",
+ "ffmpeg_notice": "Se ffmpeg não está no seu path, por favor, tenha paciência enquanto o Stash faz o download. Veja o progresso do download no output do console."
+ },
+ "errors": {
+ "something_went_wrong": "Ah não! Algo deu errado!",
+ "something_went_wrong_description": "Se isso parece um problema com os dados fornecidos, clique no em Voltar para corrigi-los. Caso contrário, reporte um bug em {githubLink} ou busque ajuda em {discordLink}.",
+ "something_went_wrong_while_setting_up_your_system": "Algo deu errado enquanto configurávamos seu sistema. Aqui está o erro que recebemos: {error}"
+ },
+ "github_repository": "Repositório do Github",
+ "migrate": {
+ "backup_database_path_leave_empty_to_disable_backup": "Caminho para o backup do banco de dados (deixe em branco para desabilitar o backup):",
+ "backup_recommended": "É recomendado que você faça o backup do banco de dados existente antes de migrar. Podemos fazer isso por você, fazendo uma cópia do seu banco de dados para {defaultBackupPath}.",
+ "migrating_database": "Migrando banco de dados",
+ "migration_failed": "Falha na migração",
+ "migration_failed_error": "Foi encontrado o seguinte erro durante a migração do banco de dados:",
+ "migration_failed_help": "Por favor, faça qualquer correção necessária e tente novamente. Caso contrário, reporte um bug em {githubLink} ou busque ajuda em {discordLink}.",
+ "migration_irreversible_warning": "O processo de migração não é reversível. Uma vez que a migração seja concluída, seu banco de dados será incompatível com versões anteriores do Stash.",
+ "migration_required": "Migração necessária",
+ "perform_schema_migration": "Fazer migração",
+ "schema_too_old": "A versão atual de seu banco de dados é {databaseSchema} e necessita ser migrada para a versão {appSchema}. Esta versão do Stash não funcionará sem migrar o banco de dados."
+ },
+ "paths": {
+ "database_filename_empty_for_default": "nome do arquivo do banco de dados (em branco para usar padrão)",
+ "description": "A seguir, precisamos determinar onde achar sua coleção pornô, onde armazenar o banco de dados do Stash e arquivos de suporte gerados. Estas configurações podem ser alteradas posteriormente se necessário.",
+ "path_to_generated_directory_empty_for_default": "caminho para o diretório de arquivos de suporte gerados (deixar em branco para usar padrão)",
+ "set_up_your_paths": "Configure seus diretórios",
+ "stash_alert": "Nenhum caminho para sua biblioteca foi selecionado. Nenhum arquivo poderá ser escaneado para o Stash. Tem certeza?",
+ "where_can_stash_store_its_database": "Onde o Stash pode armazenar seu banco de dados?",
+ "where_can_stash_store_its_database_description": "Stash usa um banco de dados sqlite para armazenar os meta-dados de sua coleção. Por padrão ele será criado como stash-go.sqlite no diretório contendo seu arquivo de configuração. Se deseja alterar isto, por favor indique um arquivo com caminho absoluto ou relativo ao diretório de trabalho atual.",
+ "where_can_stash_store_its_generated_content": "Onde o Stash pode armazenar os arquivos de suporte que forem gerados?",
+ "where_can_stash_store_its_generated_content_description": "A fim de fornecer miniaturas, pré-visualizações e sprites, Stash gera imagens e vídeos. Isto também inclui transcodificações para formatos de arquivos não suportados. Por padrão, o Stash irá criar o diretório generated no diretório contento seu arquivo de configuração. Se deseja alterar onde esses arquivos gerados serão armazenados, por favor indique um caminho absoluto ou relativo ao diretório de trabalho atual. O stash irá criar este diretório caso ele já não exista.",
+ "where_is_your_porn_located": "Onde seu pornô está localizado?",
+ "where_is_your_porn_located_description": "Adicione diretórios contendo seus vídeos e imagens pornô. O Stash irá usar esses diretórios para encontrar vídeos e imagens durante o scan."
+ },
+ "stash_setup_wizard": "Assistente de configuração Stash",
+ "success": {
+ "getting_help": "Obter ajuda",
+ "help_links": "Se tiver algum problema ou sugestão, sinta-se à vontade para abrir uma issue no {githubLink} ou pergunte à comunidade em {discordLink}.",
+ "in_app_manual_explained": "Recomendados checar o manual integrado à aplicação, que pode ser acessado pelo ícone no canto superior direito da tela que parece com isso: {icon}",
+ "next_config_step_one": "A seguir você será levado à página de Configuração. Essa página permitirá que você personalize quais arquivos incluir ou excluir, definir um nome de usuário e senha para proteger seu sistema, e várias outras opções.",
+ "next_config_step_two": "Quando estiver satisfeito com estas configurações, você pode começar a escanear seu conteúdo para o Stash clicando em {localized_task}, e então {localized_scan}.",
+ "open_collective": "Visite {open_collective_link} para saber como você pode contribuir com o desenvolvimento do Stash.",
+ "support_us": "Apoie-nos",
+ "thanks_for_trying_stash": "Obrigado por usar Stash!",
+ "welcome_contrib": "Também agradecemos contribuições em forma de código (correções de bug, melhorias e novas funcionalidades), testes, reports de bugs, pedidos de melhorias e funcionalidades e suporte de usuário. Detalhes podem ser encontrados na seção Contribuição do manual da aplicação.",
+ "your_system_has_been_created": "Sucesso! Seu sistema foi criado!"
+ },
+ "welcome": {
+ "config_path_logic_explained": "Stash tenta encontrar o arquivo de configuração (config.yml) a partir do diretório de trabalho atual, caso não o encontre lá, tentará encontra-lo em $HOME/.stash/config.yml (no Windows, será %USERPROFILE%\\.stash\\config.yml). Você também pode fazer o Stash ler um arquivo de configuração específico ao executar a aplicação com as opções -c ou --config .",
+ "in_current_stash_directory": "No diretório $HOME/.stash",
+ "in_the_current_working_directory": "No diretório de trabalho atual",
+ "next_step": "Caso esteja pronto para criar um novo sistema, escolha onde você deseja armazenar seu arquivo de configuração e clique Próximo.",
+ "store_stash_config": "Onde quer armazenar a configuração do Stash?",
+ "unable_to_locate_config": "Caso esteja lendo isto, então o Stash não pôde encontrar uma configuração existente. Este assistente te guiará durante o processo de criar uma nova configuração.",
+ "unexpected_explained": "Se chegou à esta tela inesperadamente, por favor tente reiniciar o Stash no diretório de trabalho correto ou com a opção -c."
+ },
+ "welcome_specific_config": {
+ "config_path": "Stash usará o seguinte caminho para o arquivo de configuração: {path}",
+ "next_step": "Quando estiver pronto para prosseguir com a criação do novo sistema, clique Próximo.",
+ "unable_to_locate_specified_config": "Se está lendo isto, então o Stash não pôde encontrar o arquivo de configuração especificado na linha de comando ou no ambiente. Este assistente irá te guiar durante o processo de criação de uma nova configuração."
+ },
+ "welcome_to_stash": "Bem-vindo ao Stash"
+ },
"stash_id": "Stash ID",
+ "stash_ids": "Stash IDs",
+ "stashbox": {
+ "go_review_draft": "Vá para {endpoint_name} para revisar rascunho.",
+ "selected_stash_box": "Endpoint do Stash-Box selecionado",
+ "submission_failed": "Falha no envio",
+ "submission_successful": "Envio bem-sucedido"
+ },
"stats": {
"image_size": "Tamanho das imagens",
+ "scenes_duration": "Duração das cenas",
"scenes_size": "Tamanho de cenas"
},
"status": "Status: {statusText}",
"studio": "Estúdio",
"studio_depth": "Níveis (vazio para todos)",
"studios": "Estúdios",
+ "sub_tag_count": "Número de sub-tags",
+ "sub_tag_of": "Sub-tags de {parent}",
+ "sub_tags": "Sub-tags",
"subsidiary_studios": "Estúdios filhos",
"synopsis": "Sinopse",
"tag": "Tag",
@@ -592,13 +942,17 @@
"rescanning_entity": "Reescaneando {count, plural, one {{singularEntity}} other {{pluralEntity}}}…",
"saved_entity": "{entity} salvo(a)",
"started_auto_tagging": "Auto tagging iniciado",
+ "started_generating": "Geração de arquivos multimídia iniciada",
+ "started_importing": "Importação iniciada",
"updated_entity": "{entity} atualizado(a)"
},
"total": "Total",
+ "true": "Verdadeiro",
"twitter": "Twitter",
"up-dir": "Subir um diretório",
"updated_at": "Atualizado em",
"url": "URL",
+ "videos": "Vídeos",
"weight": "Peso",
"years_old": "anos"
}
diff --git a/ui/v2.5/src/locales/ru-RU.json b/ui/v2.5/src/locales/ru-RU.json
index 52a04b96d..6a988e277 100644
--- a/ui/v2.5/src/locales/ru-RU.json
+++ b/ui/v2.5/src/locales/ru-RU.json
@@ -13,9 +13,12 @@
"cancel": "Отмена",
"clean": "Очистить",
"clear": "Очистить",
+ "clear_back_image": "Очистить заднее изображение",
+ "clear_front_image": "Очистить лицевое изображение",
"clear_image": "Очистить Изображение",
"close": "Закрыть",
"confirm": "Подтвердить",
+ "continue": "Продолжить",
"create": "Создать",
"create_entity": "Создать {entityType}",
"create_marker": "Создать Маркер",
@@ -23,6 +26,7 @@
"delete": "Удалить",
"delete_entity": "Удалить {entityType}",
"delete_file": "Удалить файл",
+ "delete_generated_supporting_files": "Удалить сгенерированные вспомогательные файлы",
"disallow": "Запретить",
"download": "Скачать",
"download_backup": "Скачать Бэкап",
@@ -38,6 +42,7 @@
"generate": "Сгенерировать",
"generate_thumb_default": "Сгенерировать миниатюру по умолчанию",
"generate_thumb_from_current": "Сгенерировать миниатюру из текущей",
+ "hash_migration": "миграция хэшей",
"hide": "Скрыть",
"identify": "Идентифицировать",
"ignore": "Игнорировать",
@@ -45,6 +50,369 @@
"import_from_file": "Импорт из файла",
"merge": "Слияние",
"merge_from": "Слияние из",
- "merge_into": "Слияние в"
- }
+ "merge_into": "Слияние в",
+ "next_action": "Вперёд",
+ "not_running": "не выполняется",
+ "open_random": "Открыть Случайный",
+ "overwrite": "Перезаписать",
+ "play_random": "Воспроизвести Случайный",
+ "play_selected": "Воспроизвести выбранный",
+ "preview": "Предпросмотр",
+ "previous_action": "Назад",
+ "refresh": "Обновить",
+ "reload_plugins": "Перезагрузить плагины",
+ "reload_scrapers": "Перезагрузить скрейперы",
+ "remove": "Удалить",
+ "rename_gen_files": "Переименовать сгенерированные файлы",
+ "rescan": "Сканировать заново",
+ "reshuffle": "Перемешать",
+ "running": "выполняется",
+ "save": "Сохранить",
+ "save_delete_settings": "Использовать эти настройки по умолчанию во время удаления",
+ "save_filter": "Сохранить фильтр",
+ "scan": "Сканировать",
+ "scrape": "Скрейпить",
+ "scrape_query": "Запрос скрейпера",
+ "scrape_scene_fragment": "Скрейпить по фрагменту",
+ "scrape_with": "Скрейпить используя…",
+ "search": "Поиск",
+ "select_all": "Выбрать все",
+ "select_folders": "Выбрать папки",
+ "select_none": "Ничего не выбрать",
+ "selective_auto_tag": "Выборочный автоматический тэгинг",
+ "selective_clean": "Выборочная чистка",
+ "selective_scan": "Выборочнное сканирование",
+ "set_as_default": "Установить по умолчанию",
+ "set_back_image": "Заднее изображение…",
+ "set_front_image": "Лицевое изображение…",
+ "set_image": "Установить изображение…",
+ "show": "Показать",
+ "skip": "Пропустить",
+ "stop": "Остановить",
+ "tasks": {
+ "dry_mode_selected": "Выбран режим симуляции. Фактического удаления не будет, только запись в журнал.",
+ "import_warning": "Вы уверены, что хотите импортировать? Это приведет к удалению базы данных и повторному импорту из экспортированных метаданных."
+ },
+ "temp_disable": "Временно отключить…",
+ "temp_enable": "Временно включить…",
+ "use_default": "Использовать по умолчанию",
+ "view_random": "Смотреть случайный"
+ },
+ "actions_name": "Действия",
+ "age": "Возраст",
+ "aliases": "Псевдонимы",
+ "all": "все",
+ "also_known_as": "Так же известный как",
+ "ascending": "По возрастанию",
+ "average_resolution": "Среднее разрешение",
+ "birth_year": "Год рождения",
+ "birthdate": "Дата рождения",
+ "bitrate": "Битрейт",
+ "career_length": "Продолжительность карьеры",
+ "component_tagger": {
+ "config": {
+ "active_instance": "Активная инстанция Stash-устройства:",
+ "blacklist_label": "Черный список",
+ "query_mode_auto": "Автоматически",
+ "query_mode_auto_desc": "Использует метаданные, если они есть, или имя файла",
+ "query_mode_dir": "Директория",
+ "query_mode_filename": "Имя файла",
+ "query_mode_label": "Режим Очереди",
+ "query_mode_metadata": "Метаданные",
+ "query_mode_metadata_desc": "Только используя метадату",
+ "query_mode_path": "Путь",
+ "query_mode_path_desc": "Используя полный путь до файла",
+ "set_cover_desc": "Заменить обложку сцены, если она будет найдена.",
+ "set_cover_label": "Выставить обложку для данной сцены",
+ "set_tag_label": "Установить теги",
+ "show_male_label": "Показывать актеров мужского пола",
+ "source": "Источник"
+ },
+ "noun_query": "Запрос",
+ "results": {
+ "duration_unknown": "Длительность неизвестна",
+ "fp_matches": "Продолжительность совпадает",
+ "match_failed_already_tagged": "Сцена уже помечена",
+ "match_failed_no_result": "Ничего не найдено",
+ "match_success": "Сцена успешно помечена",
+ "unnamed": "Безымянный"
+ },
+ "verb_matched": "Совпавший"
+ },
+ "config": {
+ "about": {
+ "check_for_new_version": "Проверить наличие обновления",
+ "latest_version": "Последняя версия",
+ "new_version_notice": "[НОВЫЙ]",
+ "stash_open_collective": "Поддержи нас через {url}",
+ "version": "Версия"
+ },
+ "categories": {
+ "about": "О программе",
+ "interface": "Интерфейс",
+ "logs": "Журнал",
+ "metadata_providers": "Источники метадаты",
+ "plugins": "Плагины",
+ "scraping": "Скрейпинг",
+ "security": "Безопасность",
+ "services": "Сервисы",
+ "system": "Система",
+ "tasks": "Задачи",
+ "tools": "Инструменты"
+ },
+ "dlna": {
+ "allowed_ip_addresses": "Разрешенные IP адреса",
+ "enabled_by_default": "Включено по умолчанию",
+ "network_interfaces": "Интерфейсы",
+ "recent_ip_addresses": "Последние IP адреса",
+ "server_display_name": "Наименование сервера",
+ "until_restart": "до перезагрузки"
+ },
+ "general": {
+ "auth": {
+ "api_key": "API ключ",
+ "api_key_desc": "API ключ для внешних систем. Необходимо только когда настроены логин и пароль. Логин должен быть сохранён перед генерацией ключа API.",
+ "authentication": "Аутентификация",
+ "clear_api_key": "Стереть ключ API",
+ "credentials": {
+ "heading": "Реквизиты для входа"
+ },
+ "generate_api_key": "Сгенерировать ключ API",
+ "maximum_session_age": "Максимальное время активной сессии",
+ "maximum_session_age_desc": "Максимальное время ожидания, в секундах, до истечения срока действия сессии.",
+ "password": "Пароль",
+ "password_desc": "Пароль для доступа к Stash. Оставьте пустым для отключения аутентификации",
+ "username": "Имя пользователя",
+ "username_desc": "Имя для доступа к Stash. Оставьте пустым для отключения аутентификации"
+ },
+ "cache_location": "Папка для расположения кэша",
+ "cache_path_head": "Путь кэша",
+ "calculate_md5_and_ohash_label": "Просчитать MD5 для видеофайлов",
+ "check_for_insecure_certificates": "Проверить на незащищённость сертификата",
+ "create_galleries_from_folders_desc": "Если включено, генерирует галлереи из папок с картинками.",
+ "create_galleries_from_folders_label": "Генерация галлереи из папок с картинками",
+ "db_path_head": "Путь к базе данных",
+ "directory_locations_to_your_content": "Адреса папок с вашим контентом",
+ "generated_file_naming_hash_head": "Сгенерированный хеш для наименования файлов",
+ "generated_path_head": "Сгенерированный путь",
+ "hashing": "Хэширование",
+ "image_ext_head": "Расширения изображений",
+ "include_audio_desc": "Включает аудио при генерации превью.",
+ "include_audio_head": "Включать аудио",
+ "logging": "Ведение журнала",
+ "maximum_streaming_transcode_size_desc": "Максимальный размер транскодируемых потоков",
+ "maximum_streaming_transcode_size_head": "Максимальный размер потокового транскодирования",
+ "maximum_transcode_size_desc": "Максимальный размер генерируемых транскодов",
+ "maximum_transcode_size_head": "Максимальный размер перекодирования",
+ "metadata_path": {
+ "description": "Местоположение каталога, используемое при выполнении полного экспорта или импорта",
+ "heading": "Путь к метаданным"
+ },
+ "number_of_parallel_task_for_scan_generation_desc": "Установите 0 для автоматического определения. Предупреждение: запуск большего количества задач, чем требуется для достижения 100% загрузки процессора, снизит производительность и может вызвать другие проблемы.",
+ "scraping": "Скрейпинг",
+ "video_head": "Видео"
+ },
+ "library": {
+ "exclusions": "Исключения"
+ },
+ "plugins": {
+ "hooks": "Триггеры"
+ },
+ "scraping": {
+ "scraper": "Скрейпер",
+ "scrapers": "Скрейперы",
+ "supported_urls": "Ссылки"
+ },
+ "stashbox": {
+ "endpoint": "Конечная точка",
+ "name": "Имя"
+ },
+ "system": {
+ "transcoding": "Транскодирование"
+ },
+ "tasks": {
+ "identify": {
+ "field": "Поле",
+ "heading": "Идентифицировать",
+ "source": "Источник",
+ "sources": "Источники",
+ "strategy": "Стратегия"
+ },
+ "maintenance": "Техническое обслуживание",
+ "migrations": "Миграции"
+ },
+ "tools": {
+ "scene_filename_parser": {
+ "filename": "Имя файла"
+ }
+ },
+ "ui": {
+ "editing": {
+ "heading": "Редактирование"
+ },
+ "images": {
+ "heading": "Изображения"
+ },
+ "language": {
+ "heading": "Язык"
+ },
+ "preview_type": {
+ "options": {
+ "video": "Видео"
+ }
+ }
+ }
+ },
+ "configuration": "Настройки",
+ "country": "Страна",
+ "criterion": {
+ "value": "Значение"
+ },
+ "criterion_modifier": {
+ "between": "между",
+ "equals": "есть",
+ "excludes": "исключает",
+ "includes": "включает"
+ },
+ "custom": "Пользовательский",
+ "date": "Дата",
+ "descending": "По убыванию",
+ "detail": "Дополнительная информация",
+ "details": "Подробности",
+ "dialogs": {
+ "delete_entity_desc": "{count, plural, one {Вы уверены, что хотите удалить этот {singularEntity}? Если файл также не будет удален, этот {singularEntity} будет повторно добавлен при сканировании.} other {Вы уверены, что хотите удалить эти {pluralEntity}? Если файлы также не будут удалены, эти {pluralEntity} будут повторно добавлены при выполнении сканирования.}}",
+ "export_title": "Экспорт",
+ "lightbox": {
+ "display_mode": {
+ "original": "Оригинал"
+ },
+ "options": "Параметры",
+ "scroll_mode": {
+ "zoom": "Увеличить"
+ }
+ },
+ "merge_tags": {
+ "destination": "Назначение",
+ "source": "Источник"
+ },
+ "scene_gen": {
+ "transcodes": "Транскоды",
+ "video_previews": "Превью"
+ },
+ "scrape_results_existing": "Существующий"
+ },
+ "dimensions": "Размер",
+ "director": "Режиссер",
+ "display_mode": {
+ "grid": "Сетка",
+ "list": "Список",
+ "tagger": "Теггер",
+ "unknown": "Неизвестный",
+ "wall": "Стена"
+ },
+ "donate": "Пожертвование",
+ "dupe_check": {
+ "options": {
+ "exact": "Точный",
+ "high": "Высокий",
+ "low": "Нижний",
+ "medium": "Средний"
+ }
+ },
+ "duration": "Продолжительность",
+ "effect_filters": {
+ "aspect": "Аспект",
+ "blue": "Синий",
+ "blur": "Размытие",
+ "brightness": "Яркость",
+ "contrast": "Контраст",
+ "gamma": "Гамма",
+ "green": "Зеленый",
+ "hue": "Оттенок",
+ "name": "Фильтры",
+ "red": "Красный",
+ "rotate": "Поворот",
+ "saturation": "Насыщенность",
+ "scale": "Масштаб",
+ "warmth": "Тепло"
+ },
+ "ethnicity": "Этническая принадлежность",
+ "false": "Нет",
+ "favourite": "Избранный",
+ "file": "файл",
+ "files": "файлы",
+ "filter": "Фильтр",
+ "filters": "Фильтры",
+ "galleries": "Галлереи",
+ "gallery": "Галлерея",
+ "height": "Рост",
+ "help": "Помощь",
+ "image": "Изображение",
+ "images": "Изображения",
+ "instagram": "Instagram",
+ "interactive": "Интерактивно",
+ "library": "Библиотека",
+ "loading": {
+ "generic": "Загрузка…"
+ },
+ "markers": "Маркеры",
+ "measurements": "Размеры",
+ "media_info": {
+ "checksum": "Контрольная сумма",
+ "hash": "Хэш",
+ "phash": "PHash",
+ "stream": "Стрим"
+ },
+ "metadata": "Метаданные",
+ "movie": "Фильм",
+ "movies": "Фильмы",
+ "name": "Имя",
+ "new": "Новый",
+ "none": "Никакой",
+ "o_counter": "О-Счетчик",
+ "operations": "Операции",
+ "organized": "Организован",
+ "pagination": {
+ "first": "Первый",
+ "last": "Последний",
+ "next": "Следующий",
+ "previous": "Предыдущий"
+ },
+ "path": "Путь",
+ "performer": "Исполнитель",
+ "performers": "Исполнители",
+ "piercings": "Пирсинг",
+ "queue": "Очередь",
+ "random": "Случайный",
+ "rating": "Рейтинг",
+ "resolution": "Разрешение",
+ "scene": "Сцена",
+ "scenes": "Сцены",
+ "search_filter": {
+ "name": "Фильтр"
+ },
+ "seconds": "Секунды",
+ "settings": "Настройки",
+ "setup": {
+ "paths": {
+ "where_can_stash_store_its_generated_content_description": "Чтобы предоставить эскизы, превью и спрайты, Stash генерирует изображения и видео. Сюда также входят транскоды для неподдерживаемых форматов файлов. По умолчанию Stash создает каталог generated в каталоге, содержащем ваш файл конфигурации. Если вы хотите изменить место хранения сгенерированного мультимедиа, введите абсолютный или относительный (по отношению к текущему рабочему каталогу) путь. Stash создаст этот каталог, если он еще не существует."
+ },
+ "welcome": {
+ "config_path_logic_explained": "Stash сначала пытается найти свой файл конфигурации (config.yml) в текущем рабочем каталоге, и, если он не находит его там, возвращается к $HOME/.stash/config.yml (в Windows это будет %USERPROFILE%\\.stash\\config.yml). Вы также можете заставить Stash читать из определенного файла конфигурации, запустив его с параметрами -c <путь к файлу конфигурации> или --config <путь к файлу конфигурации>."
+ }
+ },
+ "studio": "Студия",
+ "studios": "Студии",
+ "sub_tags": "Под-Теги",
+ "synopsis": "Резюме",
+ "tag": "Тег",
+ "tags": "Теги",
+ "tattoos": "Татуировки",
+ "title": "Заголовок",
+ "total": "Всего",
+ "true": "Да",
+ "twitter": "Twitter",
+ "url": "Ссылка",
+ "videos": "Видео",
+ "weight": "Вес"
}
diff --git a/ui/v2.5/src/locales/sv-SE.json b/ui/v2.5/src/locales/sv-SE.json
index afe59cc1b..ef9a2f8a6 100644
--- a/ui/v2.5/src/locales/sv-SE.json
+++ b/ui/v2.5/src/locales/sv-SE.json
@@ -26,6 +26,7 @@
"delete": "Radera",
"delete_entity": "Radera {entityType}",
"delete_file": "Radera fil",
+ "delete_file_and_funscript": "Radera fil (och funskript)",
"delete_generated_supporting_files": "Radera genererade filer",
"disallow": "Tillåt ej",
"download": "Ladda ner",
@@ -44,6 +45,7 @@
"generate_thumb_from_current": "Generera miniatyrbild från nuvarande",
"hash_migration": "Hash-migration",
"hide": "Dölj",
+ "hide_configuration": "Göm konfigurering",
"identify": "Identifiera",
"ignore": "Ignorera",
"import": "Importera…",
@@ -87,8 +89,11 @@
"set_front_image": "Frambild…",
"set_image": "Välj bild…",
"show": "Visa",
+ "show_configuration": "Visa konfigureringen",
"skip": "Hoppa över",
"stop": "Stoppa",
+ "submit": "Skicka",
+ "submit_stash_box": "Skicka till Stash-Box",
"tasks": {
"clean_confirm_message": "Är du säker att du vill rensa? Detta kommer radera databasinformation och genererade filer för alla scener och gallerier som inte längre finns på filsystemet.",
"dry_mode_selected": "Torrt läge valt. Inget kommer raderas utan bara loggning kommer ske.",
@@ -220,8 +225,6 @@
"password": "Lösenord",
"password_desc": "Lösenord till Stash. Lämna tom för att inaktivera användarautentisering",
"stash-box_integration": "Integration med Stash-box",
- "trusted_proxies": "Pålitliga proxyer",
- "trusted_proxies_desc": "Lista över proxyer som tillåts omdirigera trafik till stash. Lämna blank för att tillåta från privat nätverk.",
"username": "Användarnamn",
"username_desc": "Användarnamn till Stash. Lämna tom för att inaktivera användarautentisering"
},
@@ -414,6 +417,8 @@
},
"desktop_integration": {
"desktop_integration": "Desktopintegration",
+ "notifications_enabled": "Aktivera Notifikationer",
+ "send_desktop_notifications_for_events": "Skicka skrivbordsnotifikationer för händelser",
"skip_opening_browser": "Öppna inte webbläsare",
"skip_opening_browser_on_startup": "Öppna inte webbläsaren under serverstart"
},
@@ -487,7 +492,8 @@
"continue_playlist_default": {
"description": "Spela nästa scen i kö efter scenens slut",
"heading": "Fortsätt spellista som standard"
- }
+ },
+ "show_scrubber": "Visa skrubbaren"
}
},
"scene_wall": {
@@ -651,6 +657,7 @@
"search_accuracy_label": "Sökprecision",
"title": "Duplikata scener"
},
+ "duplicated_phash": "Duplikat (phash)",
"duration": "Varaktighet",
"effect_filters": {
"aspect": "Bildförhållande",
@@ -692,6 +699,14 @@
"gallery": "Galleri",
"gallery_count": "Antal Gallerier",
"gender": "Kön",
+ "gender_types": {
+ "FEMALE": "Kvinna",
+ "INTERSEX": "Intersex",
+ "MALE": "Man",
+ "NON_BINARY": "Icke-binär",
+ "TRANSGENDER_FEMALE": "Trans Kvinna",
+ "TRANSGENDER_MALE": "Trans Man"
+ },
"hair_color": "Hårfärg",
"hasMarkers": "Har markörer",
"height": "Längd",
@@ -750,10 +765,48 @@
"parent_tags": "Överordnade Taggar",
"part_of": "Del av {parent}",
"path": "Sökväg",
+ "perceptual_similarity": "Perceptuell likhet (phash)",
"performer": "Stjärna",
"performerTags": "Stjärntagg",
+ "performer_age": "Ålder på stjärna",
"performer_count": "Antal stjärnor",
+ "performer_favorite": "Favoritiserad stjärna",
"performer_image": "Stjärnbild",
+ "performer_tagger": {
+ "add_new_performers": "Lägg till stjärnor",
+ "any_names_entered_will_be_queried": "Alla namn kommer skickas till Stash-Box-instansen och läggas till om de hittas. Endast exakta matchningar kommer övervägas.",
+ "batch_add_performers": "Lägg till flera stjärnor",
+ "batch_update_performers": "Uppdatera flera stjärnor",
+ "config": {
+ "active_stash-box_instance": "Aktiv Stash-Box-instans:",
+ "edit_excluded_fields": "Ändra exkluderade fält",
+ "excluded_fields": "Exkluderade fält:",
+ "no_fields_are_excluded": "Inga fält är exkluderade",
+ "no_instances_found": "Inga instanser hittades",
+ "these_fields_will_not_be_changed_when_updating_performers": "Dessa fält kommer inte ändras när stjärnor uppdateras."
+ },
+ "current_page": "Nuvarande sida",
+ "failed_to_save_performer": "Misslyckades med att spara \"{performer}\"",
+ "name_already_exists": "Namnet finns redan",
+ "network_error": "Nätverksfel",
+ "no_results_found": "Inga resultat hittades.",
+ "number_of_performers_will_be_processed": "{performer_count} stjärnor kommer behandlas",
+ "performer_already_tagged": "Stjärna som redan är taggad",
+ "performer_names_separated_by_comma": "Namn på stjärnor separerade med ett komma",
+ "performer_selection": "Val av stjärna",
+ "performer_successfully_tagged": "Lyckad taggning av stjärna:",
+ "query_all_performers_in_the_database": "Alla stjärnor i databasen",
+ "refresh_tagged_performers": "Återuppdatera redan taggade stjärnor",
+ "refreshing_will_update_the_data": "Återuppdatering kommer uppdatera redan taggade stjärnor med data från stash-box-instansen.",
+ "status_tagging_job_queued": "Status: Taggande köat",
+ "status_tagging_performers": "Status: Taggar stjärnor",
+ "tag_status": "Tagg-status",
+ "to_use_the_performer_tagger": "För att använda stjärntaggaren krävs en konfigurerad stash-box-instans.",
+ "untagged_performers": "Ej taggade stjärnor",
+ "update_performer": "Uppdatera stjärna",
+ "update_performers": "Uppdatera stjärnor",
+ "updating_untagged_performers_description": "Uppdatering av ej taggade stjärnor kommer försöka att matcha alla stjärnor som saknar StashID och uppdatera metadatan."
+ },
"performers": "Stjärnor",
"piercings": "Piercingar",
"queue": "Kö",
@@ -852,6 +905,12 @@
},
"stash_id": "Stash ID",
"stash_ids": "Stash ID:er",
+ "stashbox": {
+ "go_review_draft": "Gå till {endpoint_name} för att granska utkast.",
+ "selected_stash_box": "Vald stash-box adress",
+ "submission_failed": "Misslyckad inskickning",
+ "submission_successful": "Lyckad inskickning"
+ },
"stats": {
"image_size": "Storlek på bilder",
"scenes_duration": "Total speltid",
diff --git a/ui/v2.5/src/locales/tr-TR.json b/ui/v2.5/src/locales/tr-TR.json
index 567cee482..f43c31ece 100644
--- a/ui/v2.5/src/locales/tr-TR.json
+++ b/ui/v2.5/src/locales/tr-TR.json
@@ -3,7 +3,7 @@
"add": "Ekle",
"add_directory": "Dizin Ekle",
"add_entity": "{entityType} Ekle",
- "add_to_entity": "{entityType}'a Ekle",
+ "add_to_entity": "Buraya Ekle: {entityType}",
"allow": "İzin Ver",
"allow_temporarily": "Geçici olarak izin ver",
"apply": "Uygula",
@@ -13,14 +13,14 @@
"cancel": "İptal",
"clean": "Temizle",
"clear": "Temizle",
- "clear_back_image": "Arka resmi temizle",
- "clear_front_image": "Ön resmi temizle",
- "clear_image": "Resmi Temizle",
+ "clear_back_image": "Arka kapak resmini kaldır",
+ "clear_front_image": "Ön kapak resmini kaldır",
+ "clear_image": "Resmi Kaldır",
"close": "Kapat",
"confirm": "Onayla",
"continue": "Devam et",
- "create": "Yarat",
- "create_entity": "{entityType} Yarat",
+ "create": "Oluştur",
+ "create_entity": "{entityType} Oluştur",
"create_marker": "Yer İmi Oluştur",
"created_entity": "{entity_type}: {entity_name} oluşturuldu",
"delete": "Sil",
@@ -29,23 +29,30 @@
"delete_generated_supporting_files": "Oluşturulan ek dosyaları sil",
"disallow": "İzin verme",
"download": "İndir",
- "download_backup": "Yedeği İndir",
+ "download_backup": "Yedekleme Dosyasını İndir",
"edit": "Düzenle",
"export": "Dışa Aktar…",
"export_all": "Tümünü dışa aktar…",
"find": "Bul",
- "finish": "Tamamla",
+ "finish": "Bitir",
"from_file": "Dosyadan…",
- "from_url": "Linkten…",
+ "from_url": "Internetten…",
"full_export": "Tam Dışa Aktarım",
"full_import": "Tam İçe Aktarım",
+ "generate": "Oluştur",
+ "generate_thumb_default": "Varsayılan küçük resim oluştur",
+ "generate_thumb_from_current": "Mevcut görüntüden küçük resim oluştur",
+ "hash_migration": "hash taşıma",
"hide": "Gizle",
"identify": "Tanımla",
"ignore": "Yoksay",
"import": "İçe Aktar…",
"import_from_file": "Dosyadan içe aktar",
"merge": "Birleştir",
+ "merge_from": "Buradan birleştir",
+ "merge_into": "Bununla birleştir",
"next_action": "Sonraki",
+ "not_running": "çalışmıyor",
"open_random": "Rastgele Aç",
"overwrite": "Üzerine Yaz",
"play_random": "Rastgele Oynat",
@@ -53,29 +60,32 @@
"preview": "Önizleme",
"previous_action": "Geri",
"refresh": "Yenile",
- "reload_plugins": "Eklentileri yenile",
+ "reload_plugins": "Eklentileri yeniden yükle",
+ "reload_scrapers": "Veri Toplayıcıları yeniden yükle",
"remove": "Kaldır",
"rename_gen_files": "Oluşturulan dosyaları yeniden adlandır",
- "rescan": "Tekrar Tara",
- "reshuffle": "Sırasını değiştir",
+ "rescan": "Yeniden tara",
+ "reshuffle": "Tekrar karıştır",
+ "running": "çalışıyor",
"save": "Kaydet",
"save_delete_settings": "Artık silerken bu seçenekleri kullan",
"save_filter": "Filtreyi kaydet",
"scan": "Tara",
- "scrape": "Karşıdan İndir",
- "scrape_query": "Karşıdan indirme sorgusu",
- "scrape_scene_fragment": "Sahneye göre indir",
- "scrape_with": "İndirme aracı…",
+ "scrape": "Veri Topla",
+ "scrape_query": "Veri Toplama sorgusu",
+ "scrape_scene_fragment": "Sahneye göre Veri Topla",
+ "scrape_with": "Bununla Veri Topla…",
"search": "Ara",
"select_all": "Tümünü Seç",
"select_folders": "Dizinleri seç",
"select_none": "Hiçbirini Seçme",
+ "selective_auto_tag": "Seçerek Otomatik Etiketle",
"selective_clean": "Seçerek Temizle",
"selective_scan": "Seçerek Tara",
- "set_as_default": "Öntanımlı olarak ayarla",
- "set_back_image": "Arka resim…",
- "set_front_image": "Ön resim…",
- "set_image": "Resim ayarla…",
+ "set_as_default": "Varsayılan olarak ayarla",
+ "set_back_image": "Arka kapak resmi…",
+ "set_front_image": "Ön kapak resmi…",
+ "set_image": "Resim seç…",
"show": "Göster",
"skip": "Geç",
"stop": "Dur",
@@ -87,7 +97,7 @@
"temp_disable": "Geçici olarak devre dışı bırak…",
"temp_enable": "Geçici olarak etkinleştir…",
"use_default": "Varsayılanı kullan",
- "view_random": "Rastgele Bak"
+ "view_random": "Rastgele Göster"
},
"actions_name": "Eylemler",
"age": "Yaş",
@@ -99,10 +109,12 @@
"birth_year": "Doğum Yılı",
"birthdate": "Doğum Tarihi",
"bitrate": "Bit Hızı",
+ "career_length": "Kariyer Süresi",
"component_tagger": {
"config": {
"active_instance": "Aktif stash-box:",
- "blacklist_label": "Karaliste",
+ "blacklist_desc": "Kara listeye alınan kelimeler sorguya eklenmez. Sözkonusu kelimeler kurallı ifadelerdir (regex) ve büyük-küçük harf ayrımına duyarlı değillerdir. Belirli karakterler ters bölü işaretiyle ayrılmalıdır: {chars_require_escape}",
+ "blacklist_label": "Kara liste",
"query_mode_auto": "Otomatik",
"query_mode_auto_desc": "Varsa üst veri veya dosya adını kullanır",
"query_mode_dir": "Dizin",
@@ -114,11 +126,11 @@
"query_mode_metadata_desc": "Sadece üst veri bilgisini kullanır",
"query_mode_path": "Konum",
"query_mode_path_desc": "Dosya yolunu kullanır",
- "set_cover_desc": "Eğer bulunursa sahne kapağını değiştir.",
+ "set_cover_desc": "Eğer bulunursa sahne kapak resmini değiştir.",
"set_cover_label": "Sahne için kapak resmi seç",
"set_tag_desc": "Sahneye etiket ekle (varolan etiketlerle birleştir veya üzerine yaz).",
"set_tag_label": "Etiketleri düzenle",
- "show_male_desc": "Erkek oyuncuların etiketlenebilirliğini aç/kapat.",
+ "show_male_desc": "Erkek oyunculara etiket ekleme işlemini aç/kapat.",
"show_male_label": "Erkek oyuncuları göster",
"source": "Kaynak"
},
@@ -126,6 +138,7 @@
"results": {
"duration_off": "Süre en az {number} saniye hatalı",
"duration_unknown": "Süre bilinmiyor",
+ "fp_found": "{fpCount, plural, =0 {Yeni parmak izi eşleşmesi bulunamadı} other {# yeni parmak izi eşleşmesi bulundu}}",
"fp_matches": "Süre eşleşiyor",
"fp_matches_multi": "Süre {matchCount}/{durationsLength} parmak iziyle eşleşiyor",
"hash_matches": "{hash_type} eşleşiyor",
@@ -136,7 +149,11 @@
"unnamed": "İsimsiz"
},
"verb_match_fp": "Parmak İzlerini Eşleştir",
- "verb_matched": "Eşleşti"
+ "verb_matched": "Eşleşti",
+ "verb_scrape_all": "Tümü için Veri Topla",
+ "verb_submit_fp": "{fpCount, plural, one{# Parmak izi} other{# Parmak izlerini}} gönder",
+ "verb_toggle_config": "{toggle} {configuration}",
+ "verb_toggle_unmatched": "{toggle} eşleşmeyen sahneler"
},
"config": {
"about": {
@@ -161,7 +178,7 @@
"logs": "Kayıtlar",
"metadata_providers": "Üst Veri Sağlayıcılar",
"plugins": "Eklentiler",
- "scraping": "Veri Çekme",
+ "scraping": "Veri Toplama",
"security": "Güvenlik",
"services": "Servisler",
"system": "Sistem",
@@ -169,11 +186,11 @@
"tools": "Araçlar"
},
"dlna": {
- "allow_temp_ip": "{tempIP} adresine izin ver",
+ "allow_temp_ip": "{tempIP} IP adresine izin ver",
"allowed_ip_addresses": "İzinli IP adresleri",
"default_ip_whitelist": "Öntanımlı izinli IP'ler",
"default_ip_whitelist_desc": "DLNA erişimi için izin verilen IP'ler. {wildcard} kullanarak tüm IP adreslerine izin verebilirsiniz.",
- "enabled_by_default": "Öntanımlı olarak etkin",
+ "enabled_by_default": "Varsayılan olarak etkin",
"network_interfaces": "Arayüzler",
"network_interfaces_desc": "DLNA erişimi için izin verilecek ağ arayüzleri. Boş bırakmak tüm arayüzlerden yayın yapılmasını sağlar. Değişikliğin ardından DLNA yeniden başlatılmalıdır.",
"recent_ip_addresses": "Son kullanılan IP adresleri",
@@ -198,18 +215,17 @@
"log_http_desc": "HTTP erişimini terminalde gösterir. Yeniden başlatma gerektirir.",
"log_to_terminal": "Terminale kaydet",
"log_to_terminal_desc": "Dosyanın yanı sıra terminale de kayıt gösterir. Dosyaya kayıt kapalı ise her zaman etkindir. Yeniden başlatma gerektirir.",
- "maximum_session_age": "Maksimum Oturum Yaşı",
+ "maximum_session_age": "Maksimum Oturum Süresi",
"maximum_session_age_desc": "Oturumun sonlanmaması için izin verilen süre, saniye cinsinden.",
"password": "Parola",
"password_desc": "Stash'a erişim için parola. Kullanıcı yetkilendirme yapmak istemiyorsanız boş bırakın",
"stash-box_integration": "Stash-box entegrasyonu",
- "trusted_proxies": "Güvenilen proxy sunucular",
- "trusted_proxies_desc": "Stash'a veri göndermesine izin verdiğiniz proxy listesi. Özel ağdan erişime izin vermek için boş bırakın.",
"username": "Kullanıcı adı",
"username_desc": "Stash'a erişim için kullanıcı adı. Kullanıcı yetkilendirme yapmak istemiyorsanız boş bırakın"
},
"cache_location": "Önbellek dizininin konumu",
"cache_path_head": "Önbellek Dizini",
+ "calculate_md5_and_ohash_desc": "oshash'in yanısıra MD5 checksum'ı da hesapla. Bu özelliği etkinleştirmek tarama işlemini yavaşlatacaktır. MD5 hesaplamasını devre dışı bırakmak için dosya adı imzası (hash) oshash olarak ayarlanmalıdır.",
"calculate_md5_and_ohash_label": "Videolar için MD5 hesapla",
"check_for_insecure_certificates": "Güvensiz sertifikaları kontrol et",
"check_for_insecure_certificates_desc": "Bazı siteler güvensiz SSL sertifikası kullanıyor olabilir. Bu seçenek kapalı ise veri çekici sertifika doğrulama adımını yapmaz. Veri çekerken sertifika hatası alıyorsanız bu işareti kaldırabilirsiniz.",
@@ -218,18 +234,663 @@
"create_galleries_from_folders_desc": "Seçili ise resim içeren dizinlerden galeriler oluşturur.",
"create_galleries_from_folders_label": "Resim içeren dizinlerden galeri oluştur",
"db_path_head": "Veritabanı Yolu",
- "directory_locations_to_your_content": "İçeriğiniz için dizin lokasyonları"
+ "directory_locations_to_your_content": "İçeriğiniz için dizin lokasyonları",
+ "excluded_image_gallery_patterns_desc": "Tarama ve Temizleme işlemine eklenmeyecek Resim ve Galeri dosyaları/dosya konumları için kurallı ifadeler (Regexp)",
+ "excluded_image_gallery_patterns_head": "Dışta tutulan Resim/Galeri Kuralları",
+ "excluded_video_patterns_desc": "Tarama ve Temizleme işlemine eklenmeyecek Video dosyaları/dosya konumları için kurallı ifadeler (Regexp)",
+ "excluded_video_patterns_head": "Dışta tutulan Video Kuralları",
+ "gallery_ext_desc": "Galeri ZIP dosyaları olarak tanımlanacak dosya uzantıları listesi (virgülle ayrılmış).",
+ "gallery_ext_head": "Galeri ZIP dosya Uzantıları",
+ "generated_file_naming_hash_desc": "Oluşturulacak dosya isimleri için MD5 veya oshash kullanın. Bu değeri değiştirmek, tüm sahneler için MD5/oshash hesaplaması gerektirir. Bu değeri değiştirdikten sonra mevcut tüm ek dosyalar yeniden oluşturulacak veya yer değiştirecektir. Yer değiştirme işlemleri için Görevler sayfasını ziyaret edin.",
+ "generated_file_naming_hash_head": "Oluşturulan dosya adı imzası",
+ "generated_files_location": "Oluşturulan ek dosyalar için dizin konumu (yer işaretleri, sahne önizlemeler, küçük resimler vb.)",
+ "generated_path_head": "Oluşturulan Dizin Konumu",
+ "hashing": "Dosya imzası hesaplama (Hashing)",
+ "image_ext_desc": "Resim olarak tanımlanacak dosya uzantıları listesi (virgülle ayrılmış).",
+ "image_ext_head": "Resim Dosyası Uzantıları",
+ "include_audio_desc": "Önizleme oluştururken videodan sesleri de ekler.",
+ "include_audio_head": "Sesi ekle",
+ "logging": "Kayıt Tutma",
+ "maximum_streaming_transcode_size_desc": "Dönüştürülmüş video yayınları için maksimum boyut",
+ "maximum_streaming_transcode_size_head": "Maksimum yayınlanacak dönüştürülmüş video boyutu",
+ "maximum_transcode_size_desc": "Dönüştürülmüş videoların maksimum boyutu",
+ "maximum_transcode_size_head": "Maksimum dönüştürülmüş video boyutu",
+ "metadata_path": {
+ "description": "Tam dışa verme veya Tam içe aktarma işlemi için dizin konumu",
+ "heading": "Üst Veri Konumu"
+ },
+ "number_of_parallel_task_for_scan_generation_desc": "Otomatik algılama için 0 olarak ayarlayın. Uyarı: Gerekenden fazla görev çalıştırmak %100 CPU kullanımına, performans düşüşüne ve diğer sorunlara yol açar.",
+ "number_of_parallel_task_for_scan_generation_head": "Eş zamanlı olarak çalıştırılacak Tarama/Oluşturma görev sayısı",
+ "parallel_scan_head": "Eş zamanlı Tarama/Oluşturma",
+ "preview_generation": "Önizleme Oluşturma",
+ "scraper_user_agent": "Veri Toplama Kimliği (User Agent)",
+ "scraper_user_agent_desc": "Veri Toplama sırasında HTTP istekleri için kullanılacak Kimliği (User Agent)",
+ "scrapers_path": {
+ "description": "Veri Toplama yapılandırma dosyaları için dizin konumu",
+ "heading": "Veri Toplama Dosyaları Dizin Konumu"
+ },
+ "scraping": "Veri Toplama",
+ "sqlite_location": "SQLite veritabanı için dizin konumu (değiştirirseniz yeniden başlatma gerekir)",
+ "video_ext_desc": "Video olarak işlem görecek dosya uzantı listesi (virgülle ayrılmış).",
+ "video_ext_head": "Video Uzantıları",
+ "video_head": "Video"
+ },
+ "library": {
+ "exclusions": "Dışta Tutulanlar",
+ "gallery_and_image_options": "Galeri ve Resim seçenekleri",
+ "media_content_extensions": "Medya içerik uzantıları"
+ },
+ "logs": {
+ "log_level": "Kayıt Tutma Seviyesi"
+ },
+ "plugins": {
+ "hooks": "Kancalar",
+ "triggers_on": "Tetikleyiciler açık"
+ },
+ "scraping": {
+ "entity_metadata": "{entityType} Üst Verisi",
+ "entity_scrapers": "{entityType} veri toplayıcıları",
+ "excluded_tag_patterns_desc": "Veri toplama sonuçlarına eklenmeyecek etiketler için kurallı ifadeler",
+ "excluded_tag_patterns_head": "Dışta Tutulan Etiket Kuralları",
+ "scraper": "Veri Toplayıcı",
+ "scrapers": "Veri Toplayıcılar",
+ "search_by_name": "Ada göre ara",
+ "supported_types": "Desteklenen türler",
+ "supported_urls": "Internet Adresleri"
+ },
+ "stashbox": {
+ "add_instance": "Stash-box oturumu ekle",
+ "api_key": "API anahtarı",
+ "description": "Stash-box, sahne ve oyuncuları parmak izleri ve dosya adlarına göre otomatik olarak tanımlamaya yardımcı olur.\nBağlantı noktası and API anahtarı, hesabınız sekmesinde stash-box oturumu bölümünden bulunabilir. Birden fazla oturum açacaksanız isim eklemeniz gerekmektedir.",
+ "endpoint": "Bağlantı Noktası",
+ "graphql_endpoint": "GraphQL bağlantı noktası",
+ "name": "İsim",
+ "title": "Stash-box Bağlantı Noktaları"
+ },
+ "system": {
+ "transcoding": "Dönüştürme"
+ },
+ "tasks": {
+ "added_job_to_queue": "{operation_name} işlem kuyruğuna eklendi",
+ "auto_tag": {
+ "auto_tagging_all_paths": "Tüm konumlar otomatik olarak etiketleniyor",
+ "auto_tagging_paths": "Bu konumlar otomatik olarak etiketleniyor"
+ },
+ "auto_tag_based_on_filenames": "İçeriği dosya adlarına göre otomatik etiketle.",
+ "auto_tagging": "Otomatik Etiketleme",
+ "backing_up_database": "Veritabanı yedekleniyor",
+ "backup_and_download": "Veritabanını yedekler ve yedek dosyasını kaydetmenizi sağlar.",
+ "backup_database": "Veritabanı diziniyle aynı yere {filename_format} biçimini kullanarak yedekler",
+ "cleanup_desc": "Eksik dosyaları kontrol eder ve veritabanından siler. Bu geri döndürülemez bir işlemdir.",
+ "data_management": "Veri yönetimi",
+ "defaults_set": "Varsayılanlar ayarlandı. Bundan sonra Görevler sayfasındaki {action} düğmesi bu varsayılanları kullanacak.",
+ "dont_include_file_extension_as_part_of_the_title": "Dosya uzantısını başlıkta gösterme",
+ "empty_queue": "Şu anda çalışan bir görev yok.",
+ "export_to_json": "Veritabanı içeriğini JSON olarak Üst Veri dizinine kaydeder.",
+ "generate": {
+ "generating_from_paths": "Bu dizinlerdeki sahneler için oluşturuluyor",
+ "generating_scenes": "{num} {scene} için oluşturuluyor"
+ },
+ "generate_desc": "Resim, hareketli resim, video, vtt ve diğer ek dosyaları oluştur.",
+ "generate_phashes_during_scan": "Algısal dosya imzası oluştur",
+ "generate_phashes_during_scan_tooltip": "Tekrarlayan verilerin silinmesi ve sahne tanımlaması için.",
+ "generate_previews_during_scan": "Hareketli resim önizlemeleri oluştur",
+ "generate_previews_during_scan_tooltip": "Önizleme türü Hareketli Görüntü olarak ayarlanmışsa hareketli WebP önizlemeleri oluştur.",
+ "generate_sprites_during_scan": "Basit hareketli resimler oluştur",
+ "generate_thumbnails_during_scan": "Resimler için küçük önizleme resimleri oluştur",
+ "generate_video_previews_during_scan": "Önizlemeler oluştur",
+ "generate_video_previews_during_scan_tooltip": "Fare sahne üzerinde iken önizleme için hareketli video oluştur",
+ "generated_content": "Oluşturulan İçerik",
+ "identify": {
+ "and_create_missing": "ve eksik olanı oluştur",
+ "create_missing": "Eksik olanı oluştur",
+ "default_options": "Varsayılan Seçenekler",
+ "description": "Sahne üst verisini stash-box ve veri toplama kaynakları kullanarak otomatik olarak belirle.",
+ "explicit_set_description": "Bu seçenekler yok saymayı özellikle belirtmediğiniz sürece kullanılacaktır.",
+ "field": "Alan",
+ "field_behaviour": "{strategy} {field}",
+ "field_options": "Alan Seçenekleri",
+ "heading": "Tanımla",
+ "identifying_from_paths": "Bu dizin konumlarından sahneler tanımlanıyor",
+ "identifying_scenes": "{num} {scene} tanımlanıyor",
+ "include_male_performers": "Erkek oyuncuları dahil et",
+ "set_cover_images": "Kapak resimlerini ayarla",
+ "set_organized": "Düzenlenmiş olarak işaretle",
+ "source": "Kaynak",
+ "source_options": "{source} Seçenekleri",
+ "sources": "Kaynaklar",
+ "strategy": "Strateji"
+ },
+ "import_from_exported_json": "Üst Veri dizinine kaydedilen JSON dosyasından içeri aktar. Mevcut veritabanını tamamen siler.",
+ "incremental_import": "Tarih sırasına göre dışa aktarılan ZIP dosyasından içeri aktar.",
+ "job_queue": "Görev Kuyruğu",
+ "maintenance": "Bakım",
+ "migrate_hash_files": "Oluşturulan dosya adı imzası, varolan dosya imza biçimleriyle değiştirildikten sonra kullanıldı.",
+ "migrations": "Yer Değiştirmeler",
+ "only_dry_run": "Sadece genel tarama yap. Hiçbir şeyi silme",
+ "plugin_tasks": "Eklenti Görevleri",
+ "scan": {
+ "scanning_all_paths": "Tüm dizin konumlarını tarıyor",
+ "scanning_paths": "Bu dizin konumlarını tarıyor"
+ },
+ "scan_for_content_desc": "Yeni içerik için tara ve veritabanına ekle.",
+ "set_name_date_details_from_metadata_if_present": "Gömülü üst veriden isim, tarih ve detayları ayarla"
+ },
+ "tools": {
+ "scene_duplicate_checker": "Kopya Sahne Denetçisi",
+ "scene_filename_parser": {
+ "add_field": "Alan Ekle",
+ "capitalize_title": "Başlığın ilk harflerini büyük harf yap",
+ "display_fields": "Alanları göster",
+ "escape_chars": "Özel harfler ve karakterler için \\ kullan",
+ "filename": "Dosya adı",
+ "filename_pattern": "Dosya adı Kuralı",
+ "ignore_organized": "Düzenlenmiş sahneleri yoksay",
+ "ignored_words": "Yoksayılan kelimeler",
+ "matches_with": "{i} ile eşleşen",
+ "select_parser_recipe": "Derleyici Tarifi Seç",
+ "title": "Sahne Dosya Adı Derleyicisi",
+ "whitespace_chars": "Boşluk karakterleri",
+ "whitespace_chars_desc": "Bu karakterler başlıkta boşluk karakteri ile değiştirilecektir"
+ },
+ "scene_tools": "Sahne Araçları"
+ },
+ "ui": {
+ "basic_settings": "Temel Seçenekler",
+ "custom_css": {
+ "description": "Değişikliklerin geçerli olması için sayfa yeniden yüklenmelidir.",
+ "heading": "İsteğe Uyarlanmış CSS",
+ "option_label": "İsteğe Uyarlanmış CSS etkinleştirildi"
+ },
+ "delete_options": {
+ "description": "Resimleri, galerileri ve sahneleri silerken kullanılacak varsayılan seçenekler.",
+ "heading": "Silme Seçenekleri",
+ "options": {
+ "delete_file": "Varsayılan olarak dosyayı her zaman sil",
+ "delete_generated_supporting_files": "Varsayılan olarak ek dosyaları her zaman sil"
+ }
+ },
+ "desktop_integration": {
+ "desktop_integration": "Masaüstü Bütünleştirmesi",
+ "skip_opening_browser": "Web Tarayıcısını Açma",
+ "skip_opening_browser_on_startup": "Başlangıçta web tarayıcısının otomatik olarak açılmasını engeller"
+ },
+ "editing": {
+ "disable_dropdown_create": {
+ "description": "Açılır menülerden yeni veri oluşturma özelliğini kapatır",
+ "heading": "Açılır menüden yeni veri oluşturmayı devre dışı bırak"
+ },
+ "heading": "Düzenleme"
+ },
+ "funscript_offset": {
+ "description": "Etkileşimli komut oynatmaları için milisaniye cinsinden süre farkı.",
+ "heading": "Funscript Süre Farkı (ms)"
+ },
+ "handy_connection_key": {
+ "description": "Etkileşimli sahneler içinHandy bağlantı anahtarı. Bu anahtarı kullanırsanız, Stash izlediğiniz sahne bilgisini handyfeeling.com ile paylaşacaktır",
+ "heading": "Handy Bağlantı Anahtarı"
+ },
+ "images": {
+ "heading": "Resimler",
+ "options": {
+ "write_image_thumbnails": {
+ "description": "Resim önizlemelerini oluşturulma anında diske kaydet",
+ "heading": "Resim önizlemelerini kaydet"
+ }
+ }
+ },
+ "interactive_options": "Etkileşimli Sahne Seçenekleri",
+ "language": {
+ "heading": "Dil"
+ },
+ "max_loop_duration": {
+ "description": "Sahne oynatıcısı videoyu yeniden oynatırken ara vereceği süre - Aralıksız yeniden oynatmak için 0 seçin",
+ "heading": "Yeniden oynatma sırasında ara verilecek maksimum süre"
+ },
+ "menu_items": {
+ "description": "Gezinti çubuğunda farklı türdeki içerikleri göster veya gizle",
+ "heading": "Menü Öğeleri"
+ },
+ "performers": {
+ "options": {
+ "image_location": {
+ "description": "Varsayılan oyuncu resimleri için isteğe bağlı dizin konumu. Varolan konumu kullanmak için boş bırakın",
+ "heading": "İsteğe Bağlı Oyuncu Resim Konumu"
+ }
+ }
+ },
+ "preview_type": {
+ "description": "Duvar görünümündeki öğeler için ayarlar",
+ "heading": "Önizleme Türü",
+ "options": {
+ "animated": "Hareketli Resim",
+ "static": "Hareketsiz Resim",
+ "video": "Video"
+ }
+ },
+ "scene_list": {
+ "heading": "Sahne Listesi",
+ "options": {
+ "show_studio_as_text": "Stüdyoları düz metin olarak göster"
+ }
+ },
+ "scene_player": {
+ "heading": "Sahne Oynatıcısı",
+ "options": {
+ "auto_start_video": "Videoları otomatik başlat",
+ "auto_start_video_on_play_selected": {
+ "description": "Seçili olanı veya Sahneler sayfasından rastgele seçilen videoları otomatik başlat",
+ "heading": "Seçilen oynatılırken videoyu otomatik başlat"
+ },
+ "continue_playlist_default": {
+ "description": "Kuyruktaki video bitince sıradaki sahneyi oynat",
+ "heading": "Varsayılan olarak oynatma listesine devam et"
+ }
+ }
+ },
+ "scene_wall": {
+ "heading": "Sahne / Yer İmi Duvarı",
+ "options": {
+ "display_title": "Başlık ve etiketleri göster",
+ "toggle_sound": "Sesi etkinleştir"
+ }
+ },
+ "slideshow_delay": {
+ "description": "Galeri sayfasında Duvar görünümü seçilirse slayt gösterisi yapılabilir",
+ "heading": "Slayt Gösterisi Geciktirme"
+ },
+ "title": "Kullanıcı Arayüzü"
}
},
- "media_info": {
- "downloaded_from": "İndirildiği Yer"
+ "configuration": "Yapılandırma",
+ "countables": {
+ "files": "{count, plural, one {Dosya} other {Dosyalar}}",
+ "galleries": "{count, plural, one {Galeri} other {Galeriler}}",
+ "images": "{count, plural, one {Resim} other {Resimler}}",
+ "markers": "{count, plural, one {Yer İmi} other {Yer İmleri}}",
+ "movies": "{count, plural, one {Film} other {Filmler}}",
+ "performers": "{count, plural, one {Oyuncu} other {Oyuncular}}",
+ "scenes": "{count, plural, one {Sahne} other {Sahneler}}",
+ "studios": "{count, plural, one {Stüdyo} other {Stüdyolar}}",
+ "tags": "{count, plural, one {Etiket} other {Etiketler}}"
},
+ "country": "Ülke",
+ "cover_image": "Kapak Resmi",
+ "created_at": "Oluşturulma Tarihi",
+ "criterion": {
+ "greater_than": "Büyüktür",
+ "less_than": "Küçüktür",
+ "value": "Değer"
+ },
+ "criterion_modifier": {
+ "between": "arasında",
+ "equals": "eşittir",
+ "excludes": "içermeyen",
+ "format_string": "{criterion} {modifierString} {valueString}",
+ "greater_than": "büyüktür",
+ "includes": "içeren",
+ "includes_all": "tümünü içeren",
+ "is_null": "boş olan",
+ "less_than": "küçüktür",
+ "matches_regex": "kurallı ifadeyle eşleşen",
+ "not_between": "arasında olmayan",
+ "not_equals": "eşit değildir",
+ "not_matches_regex": "kurallı ifadeyle eşleşmeyen",
+ "not_null": "boş olmayan"
+ },
+ "custom": "İsteğe Bağlı",
+ "date": "Tarih",
+ "death_date": "Ölüm Tarihi",
+ "death_year": "Ölüm Yılı",
+ "descending": "Azalan",
+ "detail": "Ayrıntı",
+ "details": "Ayrıntılar",
+ "developmentVersion": "Geliştirme Sürümü",
+ "dialogs": {
+ "aliases_must_be_unique": "takma adlar benzersiz olmalıdır",
+ "delete_alert": "Bu {count, plural, one {{singularEntity}} other {{pluralEntity}}} kalıcı olarak silinecektir:",
+ "delete_confirm": "Bunu silmek istediğinizden emin misiniz: {entityName}?",
+ "delete_entity_desc": "{count, plural, one {Bunu silmek istediğinizden emin misiniz: {entityName}? Dosyayı bilgisayarınızdan silmediğiniz sürece, yeniden tarama işleminde bu {singularEntity} tekrar veritabanına eklenecektir.} other {Bunları silmek istediğinizden emin misiniz: {pluralEntity}? Dosyayı bilgisayarınızdan silmediğiniz sürece, yeniden tarama işleminde bu {pluralEntity} tekrar veritabanına eklenecektir.}}",
+ "delete_entity_title": "{count, plural, one {{singularEntity} Sil} other {{pluralEntity} Sil}}",
+ "delete_galleries_extra": "...ek olarak herhangi bir galeriye eklenmemiş tüm resim dosyaları.",
+ "delete_gallery_files": "Herhangi bir galeriye eklenmemiş tüm galeri dizinlerini ve ZIP dosyalarını sil.",
+ "delete_object_desc": "{count, plural, one {Bunu: {singularEntity}} other {Bunları: {pluralEntity}}} silmek istediğinizden emin misiniz?",
+ "delete_object_overflow": "…ve {count} diğer {count, plural, one {{singularEntity}} other {{pluralEntity}}}.",
+ "delete_object_title": "{count, plural, one {{singularEntity}} other {{pluralEntity}}} Sil",
+ "edit_entity_title": "{count, plural, one {{singularEntity}} other {{pluralEntity}}} Düzenle",
+ "export_include_related_objects": "Dışa aktarırken bağlantılı nesneleri de ekle",
+ "export_title": "Dışa Aktar",
+ "lightbox": {
+ "delay": "Gecikme (Saniye)",
+ "display_mode": {
+ "fit_horizontally": "Yatay olarak sığdır",
+ "fit_to_screen": "Ekrana sığdır",
+ "label": "Görüntüleme Modu",
+ "original": "Orijinal"
+ },
+ "options": "Seçenekler",
+ "reset_zoom_on_nav": "Resim değiştirirken yakınlaştırma seviyesini sıfırla",
+ "scale_up": {
+ "description": "Küçük resimleri ekrana sığdırmak için büyüt",
+ "label": "Sığdırmak için büyüt"
+ },
+ "scroll_mode": {
+ "description": "Geçici olarak başka mod kullanmak için Shift tuşuna basın.",
+ "label": "Kaydırma Modu",
+ "pan_y": "Y Ekseninde Çevir",
+ "zoom": "Yakınlaştırma"
+ }
+ },
+ "merge_tags": {
+ "destination": "Hedef Noktası",
+ "source": "Kaynak"
+ },
+ "overwrite_filter_confirm": "Kayıtlı {entityName} sorgusunun üzerine yazmak istediğinizden emin misiniz?",
+ "scene_gen": {
+ "force_transcodes": "Dönüştürülmüş video oluşturmayı zorla",
+ "force_transcodes_tooltip": "Dönüştürülmüş video dosyaları, web tarayıcınız desteklenmeyen bir videoyu görüntülemeye çalışırken oluşturulur. Bu seçeneği işaretlerseniz, web tarayıcınız o videoyu desteklese bile yine de dönüştürülmüş video dosyası oluşturur.",
+ "image_previews": "Hareketli Resim Önizlemeleri",
+ "image_previews_tooltip": "Hareketli WebP önizlemeleri, Önizleme Türü sadece Hareketli Resim olarak seçilmişse gereklidir.",
+ "interactive_heatmap_speed": "Etkileşimli sahneler için ısı haritaları ve hız kayıtları oluştur",
+ "marker_image_previews": "Yer İmi Hareketli Resim Önizlemeleri",
+ "marker_image_previews_tooltip": "Hareketli Yer İmi WebP önizlemeleri, Önizleme Türü sadece Hareketli Resim olarak seçilmişse gereklidir.",
+ "marker_screenshots": "Yer İmi Ekran Görüntüleri",
+ "marker_screenshots_tooltip": "Yer İmi hareketsiz JPG resimleri, Önizleme Türü sadece Hareketsiz Resim olarak seçilmişse gereklidir.",
+ "markers": "Yer İmi Önizlemeleri",
+ "markers_tooltip": "Belirlenen zamandan itibaren başlayan 20 saniyelik videolar.",
+ "overwrite": "Varolan oluşturulmuş dosyaların üzerine yaz",
+ "phash": "Algısal dosya imzaları (kopya dosyaları tespit için)",
+ "preview_exclude_end_time_desc": "Sahne önizlemelerinden son x saniyeyi çıkarır. Bu değer, saniye cinsinden veya toplam sahne uzunluğunun yüzdesi (örneğin %2) cinsinden belirlenebilir.",
+ "preview_exclude_end_time_head": "Son bölümü çıkar",
+ "preview_exclude_start_time_desc": "Sahne önizlemelerinden ilk x saniyeyi çıkarır. Bu değer, saniye cinsinden veya toplam sahne uzunluğunun yüzdesi (örneğin %2) cinsinden belirlenebilir.",
+ "preview_exclude_start_time_head": "İlk bölümü çıkar",
+ "preview_generation_options": "Önizleme Oluşturma Seçenekleri",
+ "preview_options": "Önizleme Seçenekleri",
+ "preview_preset_desc": "Bu ön ayar, oluşturulacak önizleme boyutunu, kalitesini ve düzenleme süresini belirler. \"Yavaş\" dışındaki ayarların kullanılması tavsiye edilmez.",
+ "preview_preset_head": "Düzenleme ön ayarı önizlemesi",
+ "preview_seg_count_desc": "Önizleme dosyalarındaki bölüm sayısı.",
+ "preview_seg_count_head": "Önizlemedeki bölüm sayısı",
+ "preview_seg_duration_desc": "Saniye cinsinden her önizleme bölümünün süresi.",
+ "preview_seg_duration_head": "Bölüm önizleme süresi",
+ "sprites": "Basit Sahne Hareketli Görüntüleri",
+ "sprites_tooltip": "Hareketli Görüntüler (basit sahne hareketli görüntüleri için)",
+ "transcodes": "Dönüştürülmüş Videolar",
+ "transcodes_tooltip": "Desteklenmeyen video biçimleri için MP4 dönüştürmeleri",
+ "video_previews": "Önizlemeler",
+ "video_previews_tooltip": "Fare sahne üzerinde iken video önizlemeleri"
+ },
+ "scenes_found": "{count} sahne bulundu",
+ "scrape_entity_query": "{entity_type} Veri Toplama Sorgusu",
+ "scrape_entity_title": "{entity_type} Veri Toplama Sonuçları",
+ "scrape_results_existing": "Mevcut",
+ "scrape_results_scraped": "Toplanan",
+ "set_image_url_title": "Resim Internet Adresi",
+ "unsaved_changes": "Değişiklikler kaydedilmedi. Sayfadan ayrılmak istediğinize emin misiniz?"
+ },
+ "dimensions": "Boyutlar",
+ "director": "Yönetmen",
+ "display_mode": {
+ "grid": "Izgara",
+ "list": "Liste",
+ "tagger": "Etiketleyici",
+ "unknown": "Bilinmeyen",
+ "wall": "Duvar"
+ },
+ "donate": "Bağış Yap",
+ "dupe_check": {
+ "description": "'Mutlak' seviyesinin altındaki seviyeleri hesaplamak çok daha uzun sürebilir. Ayrıca düşük kesinlik seviyelerinde yanlış sonuçlar da alabilirsiniz.",
+ "found_sets": "{setCount, plural, one{# kopya bulundu.} other {# kopya bulundu.}}",
+ "options": {
+ "exact": "Mutlak",
+ "high": "Yüksek",
+ "low": "Düşük",
+ "medium": "Orta"
+ },
+ "search_accuracy_label": "Arama Kesinliği",
+ "title": "Kopya Sahneler"
+ },
+ "duration": "Süre",
+ "effect_filters": {
+ "aspect": "Yön",
+ "blue": "Mavi",
+ "blur": "Bulanıklaştır",
+ "brightness": "Parlaklık",
+ "contrast": "Zıtlık",
+ "gamma": "Gamma",
+ "green": "Yeşil",
+ "hue": "Ton",
+ "name": "Filtreler",
+ "name_transforms": "Dönüşümler",
+ "red": "Kırmızı",
+ "reset_filters": "Filtreleri Sıfırla",
+ "reset_transforms": "Dönüşümleri Sıfırla",
+ "rotate": "Döndür",
+ "rotate_left_and_scale": "Sola Döndür & Boyutlandır",
+ "rotate_right_and_scale": "Sağa Döndür & Boyutlandır",
+ "saturation": "Canlılık",
+ "scale": "Boyutlandır",
+ "warmth": "Sıcaklık"
+ },
+ "ethnicity": "Etnik Köken",
+ "eye_color": "Göz Rengi",
+ "fake_tits": "Takma Göğüs",
+ "false": "Yanlış",
+ "favourite": "Favori",
+ "file": "dosya",
+ "file_info": "Dosya Bilgisi",
+ "file_mod_time": "Dosya Düzenleme Tarihi",
+ "files": "dosyalar",
+ "filesize": "Dosya Boyutu",
+ "filter": "Filtre",
+ "filter_name": "Filtre adı",
+ "filters": "Filtreler",
+ "framerate": "Resim Karesi Hızı",
+ "frames_per_second": "Saniyede {value} resim",
+ "galleries": "Galeriler",
+ "gallery": "Galeri",
+ "gallery_count": "Galeri Sayısı",
+ "hair_color": "Saç Rengi",
+ "hasMarkers": "Yer İmi Var",
+ "height": "Boy",
+ "help": "Yardım",
+ "image": "Resim",
+ "image_count": "Resim Sayısı",
+ "images": "Resimler",
+ "include_parent_tags": "Bir üst etiketleri de ekle",
+ "include_sub_studios": "Bağlı stüdyoları da ekle",
+ "include_sub_tags": "Bir alt etiketleri de ekle",
+ "instagram": "Instagram",
+ "interactive": "Etkileşimli",
+ "interactive_speed": "Etkileşim hızı",
+ "isMissing": "Eksik",
+ "library": "Kitaplık",
+ "loading": {
+ "generic": "Yükleniyor…"
+ },
+ "marker_count": "Yer İmi Sayısı",
+ "markers": "Yer İmleri",
+ "measurements": "Beden Ölçüleri",
+ "media_info": {
+ "audio_codec": "Ses Kodlayıcı",
+ "checksum": "Sağlama Toplamı (checksum)",
+ "downloaded_from": "İndirildiği Yer",
+ "hash": "Dosya İmzası (Hash)",
+ "interactive_speed": "Etkileşim hızı",
+ "performer_card": {
+ "age": "{age} {years_old}",
+ "age_context": "Bu sahnede {age} {years_old}"
+ },
+ "phash": "PHash",
+ "stream": "Yayınla",
+ "video_codec": "Video Kodlayıcı"
+ },
+ "megabits_per_second": "Saniyede {value} megabit",
"metadata": "Üst Veri",
+ "movie": "Film",
+ "movie_scene_number": "Filmdeki Sahne Sırası",
+ "movies": "Filmler",
"name": "İsim",
"new": "Yeni",
"none": "Hiçbiri",
+ "o_counter": "O-Sayacı",
+ "operations": "İşlemler",
+ "organized": "Düzenlendi",
+ "pagination": {
+ "first": "İlk",
+ "last": "Son",
+ "next": "Sonraki",
+ "previous": "Önceki"
+ },
+ "parent_of": "{children} öğesinin üstü",
+ "parent_studios": "Üst Stüdyolar",
+ "parent_tag_count": "Üst Etiket Sayısı",
+ "parent_tags": "Üst Etiketler",
+ "part_of": "{parent} öğesinin parçası",
+ "path": "Konum",
+ "performer": "Oyuncu",
+ "performerTags": "Oyuncu Etiketleri",
+ "performer_count": "Oyuncu Sayısı",
+ "performer_image": "Oyuncu Resmi",
+ "performers": "Oyuncular",
+ "piercings": "Piercings",
+ "queue": "Oynatma Listesi",
+ "random": "Rastgele",
+ "rating": "Derecelendirme",
+ "resolution": "Çözünürlük",
+ "scene": "Sahne",
+ "sceneTagger": "Sahne Etiketleyici",
+ "sceneTags": "Sahne Etiketleri",
+ "scene_count": "Sahne Sayısı",
+ "scene_id": "Sahne Kimliği (ID)",
+ "scenes": "Sahneler",
+ "scenes_updated_at": "Sahne Güncelleme Tarihi",
+ "search_filter": {
+ "add_filter": "Filtre Ekle",
+ "name": "Filtre",
+ "saved_filters": "Kaydedilmiş filtreler",
+ "update_filter": "Filtreyi Güncelle"
+ },
+ "seconds": "Saniye",
+ "settings": "Ayarlar",
+ "setup": {
+ "confirm": {
+ "almost_ready": "Ayarlamaları neredeyse tamamlamak üzereyiz. Lütfen bu ayarları onaylayın. Eğer düzenleme yapmak isterseniz geri giderek ayarları değiştirebilirsiniz. Herşey tamamsa Onayla tuşuna basın.",
+ "configuration_file_location": "Yapılandırma dosyası konumu:",
+ "database_file_path": "Veritabanı dosya konumu",
+ "default_db_location": "/stash-go.sqlite",
+ "default_generated_content_location": "/generated",
+ "generated_directory": "Oluşturulan dizin",
+ "nearly_there": "Bitmek üzere!",
+ "stash_library_directories": "Stash kitaplık dizinleri"
+ },
+ "creating": {
+ "creating_your_system": "Sisteminiz oluşturuluyor",
+ "ffmpeg_notice": "ffmpeg sisteminizde yüklü değilse lütfen otomatik olarak indirilip yüklenmesini bekleyin. Konsol detayları bölümünden indirme sürecini görebilirsiniz."
+ },
+ "errors": {
+ "something_went_wrong": "Hata! Birşeyler yanlış gitti!",
+ "something_went_wrong_description": "Hatanın sizin belirlediğiniz özel ayarlardan kaynaklanıyor olabilir, lütfen geriye giderek o ayarları değiştirin. Tekrar hata alırsanız {githubLink} veya {discordLink} adreslerini kullanarak sorunu bildirin (Şimdilik yalnızca İngilizce).",
+ "something_went_wrong_while_setting_up_your_system": "Sisteminizi ayarlarken birşeyler yanlış gitti ve bu hata mesajını aldık: {error}"
+ },
+ "github_repository": "Github repository",
+ "migrate": {
+ "backup_database_path_leave_empty_to_disable_backup": "Veritabanı yedekleme konumu (yedeklemeyi devre dışı bırakmak için bu alanı boş bırakın):",
+ "backup_recommended": "Yer değiştirme işlemi yapmadan önce varolan veritabanınızı yedeklemeniz önerilir. Eğer isterseniz otomatik olarak {defaultBackupPath} konumuna veritabanınızın bir yedeğini oluşturabiliriz.",
+ "migrating_database": "Veritabanı yer değiştirme",
+ "migration_failed": "Yer değiştirme başarısız",
+ "migration_failed_error": "Veritabanı yer değiştirilirken bu hatayla karşılaşıldı:",
+ "migration_failed_help": "Lütfen gerekli düzeltmeleri yapın ve yeniden deneyin. Tekrar hata alırsanız {githubLink} veya {discordLink} adreslerini kullanarak sorunu bildirin (Şimdilik yalnızca İngilizce).",
+ "migration_irreversible_warning": "Veritabanı şema yer değiştirme işlemi geri alınamaz. Veritabanınız yer değiştirme işlemi tamamlandıktan sonra önceki Stash sürümleriyle uyumsuz olacaktır.",
+ "migration_required": "Yer değiştirme işlemi gerekli",
+ "perform_schema_migration": "Şema yer değiştirme işlemi uygula",
+ "schema_too_old": "Mevcut Stash veritabanı şema sürümünüz {databaseSchema} ve {appSchema} sürümü ile değiştirilmesi gerekiyor. Stash'ın bu sürümü değiştirme işlemi yapılmadan çalışmayacaktır."
+ },
+ "paths": {
+ "database_filename_empty_for_default": "veritabanı adı (varsayılan için boş bırakın)",
+ "description": "Sırada porno koleksiyonunuzun hangi dizinde olduğunun, stash veritabanının ve oluşturulan ek dosyaların nereye kaydedileceğinin belirlenmesi var. Bu ayarları sonradan değiştirebilirsiniz.",
+ "path_to_generated_directory_empty_for_default": "oluşturulan ek dosyalar için dizin konumu (varsayılan için boş bırakın)",
+ "set_up_your_paths": "Konumlarınızı belirleyin",
+ "stash_alert": "Herhangi bir kitaplık konumu seçilmedi. Stash'a hiçbir şey eklenmeyecek. Emin misiniz?",
+ "where_can_stash_store_its_database": "Stash veritabanı nereye kaydedilsin?",
+ "where_can_stash_store_its_database_description": "Stash porno arşiviniz için SQLite veritabanı kullanır. Bu veritabanı, varsayılan olarak stash-go.sqlite dizininde, yapılandırma dosyasıyla aynı yerde oluşturulur. Bu dizini değiştirmek isterseniz, yapılandırma dosyasının bulunduğu dizinin tam konumunu girin.",
+ "where_can_stash_store_its_generated_content": "Stash için oluşturulan ek dosyalar nereye kaydedilsin?",
+ "where_can_stash_store_its_generated_content_description": "Stash, önizlemeler için küçük hareketli resimler ve videolar oluşturur. Ayrıca web tarayıcınızın desteklemediği video dosyaları için dönüştürülmüş video dosyaları da oluşturulur. Bu amaçla, varsayılan olarak yapılandırma dosyasının bulunduğu generated dizini kullanılır. Bu dizini değiştirmek isterseniz, yapılandırma dosyasının bulunduğu dizinin tam konumunu girin. Eğer dizin bulunamazsa otomatik olarak oluşturulacaktır.",
+ "where_is_your_porn_located": "Porno koleksiyonunuz hangi dizinde?",
+ "where_is_your_porn_located_description": "Fotoğraf ve videoların bulunduğu dizinleri ekleyin. Stash, tarama sırasında bu dizinleri kullanacaktır."
+ },
+ "stash_setup_wizard": "Stash Kurulum Sihirbazı",
+ "success": {
+ "getting_help": "Yardım alın",
+ "help_links": "Hata mesajları, soru-yorum-görüş-önerileriniz için lütfen {githubLink} veya {discordLink} adreslerini kullanarak bizimle iletişime geçin (Şimdilik yalnızca İngilizce).",
+ "in_app_manual_explained": "Sağ üst köşede bulunan {icon} simgesine basarak Yardım dokümanını incelemeniz tavsiye edilir (Şimdilik yalnızca İngilizce)",
+ "next_config_step_one": "Sırada Yapılandırma sayfası var. Bu sayfada hangi dosyaların eklenip eklenmeyeceğini belirleyebilir, güvenlik amacıyla kullanıcı adı ve şifre seçebilir ve daha bir çok seçeneği ayarlayabilirsiniz.",
+ "next_config_step_two": "Herşey tamamsa {localized_task}, sonrasında {localized_scan} düğmelerine tıklayarak arşivinizi Stash'e ekleyebilirsiniz.",
+ "open_collective": "Stash geliştiricilerine destek sağlamak için {open_collective_link} adresini ziyaret edebilirsiniz.",
+ "support_us": "Bizi destekleyin",
+ "thanks_for_trying_stash": "Stash'i denediğiniz için teşekkürler!",
+ "welcome_contrib": "Ayrıca her türlü kod katkınızı (hata düzeltme, geliştirme, yeni özellikler ekleme), uygulamayla ilgili her türlü görüş-öneri-yorum-sorunuzu bekliyoruz. Ayrıntıları uygulama içindeki Yardım belgesinde bulabilirsiniz.",
+ "your_system_has_been_created": "Sistem oluşturma başarılı!"
+ },
+ "welcome": {
+ "config_path_logic_explained": "Stash (config.yml) yapılandırma dosyasını ilk olarak mevcut dizinde bulmaya çalışır. Eğer bulamazsa, $HOME/.stash/config.yml dizinini (Windows işletim sistemi için %USERPROFILE%\\.stash\\config.yml dizini) araştırır. Öte yandan -c veya --config seçeneklerini kullanarak özelleştirilmiş bir yapılandırma dosyası da kullanabilirsiniz.",
+ "in_current_stash_directory": "$HOME/.stash dizini altında",
+ "in_the_current_working_directory": "Mevcut dizinde",
+ "next_step": "Eğer yeni bir sistem oluşturmak için hazırsanız, yapılandırma dosyasının nereye kaydedileceğini seçin ve Sonraki düğmesine basın.",
+ "store_stash_config": "Stash yapılandırmasını nereye kaydetmek istiyorsunuz?",
+ "unable_to_locate_config": "Eğer bunu okuyorsanız, Stash herhangi bir mevcut yapılandırma bulamamış demektir. Bu sihirbaz yeni bir yapılandırma sırasında size yol gösterecektir.",
+ "unexpected_explained": "Eğer beklenmedik bir şekilde bu ekranı gördüyseniz, Stash uygulamasını doğru dizinden başlatın veya başlatma komutuna -c değişkenini ekleyin."
+ },
+ "welcome_specific_config": {
+ "config_path": "Stash, yapılandırma dosyası için bu dizini kullanacak: {path}",
+ "next_step": "Yeni bir sistem oluşturmak için hazır olduğunuzda Sonraki düğmesine basın.",
+ "unable_to_locate_specified_config": "Eğer bunu okuyorsanız, Stash yapılandırma dosyasını bulamamış demektir. Bu sihirbaz yeni bir yapılandırma sırasında size yol gösterecektir."
+ },
+ "welcome_to_stash": "Stash uygulamasına hoşgeldiniz"
+ },
+ "stash_id": "Stash Kimliği (ID)",
+ "stash_ids": "Stash Kimlikleri (ID)",
+ "stats": {
+ "image_size": "Toplam resim boyutu",
+ "scenes_duration": "Toplam sahne süresi",
+ "scenes_size": "Toplam sahne boyutu"
+ },
+ "status": "Durum: {statusText}",
+ "studio": "Stüdyo",
+ "studio_depth": "Seviyeler (tümü için boş bırakın)",
+ "studios": "Stüdyolar",
+ "sub_tag_count": "Alt Etiket Sayısı",
+ "sub_tag_of": "{parent} öğesinin alt etiketi",
+ "sub_tags": "Alt Etiketler",
+ "subsidiary_studios": "Bağlı Stüdyolar",
+ "synopsis": "Özet",
+ "tag": "Etiket",
+ "tag_count": "Etiket Sayısı",
+ "tags": "Etiketler",
+ "tattoos": "Dövmeler",
+ "title": "Başlık",
+ "toast": {
+ "added_entity": "{entity} eklendi",
+ "added_generation_job_to_queue": "Oluşturma işlemi kuyruğa eklendi",
+ "created_entity": "{entity} oluşturuldu",
+ "default_filter_set": "Varsayılan filtre ayarla",
+ "delete_entity": "{count, plural, one {{singularEntity}} other {{pluralEntity}}} sil",
+ "delete_past_tense": "{count, plural, one {{singularEntity}} other {{pluralEntity}}} silindi",
+ "generating_screenshot": "Ekran görüntüsü oluşturuluyor…",
+ "merged_tags": "Etiketler birleştirildi",
+ "rescanning_entity": "{count, plural, one {{singularEntity}} other {{pluralEntity}}} yeniden taranıyor…",
+ "saved_entity": "{entity} kaydedildi",
+ "started_auto_tagging": "Otomatik etiketleme başladı",
+ "started_generating": "Oluşturma işlemi başladı",
+ "started_importing": "İçe aktarma başladı",
+ "updated_entity": "{entity} güncellendi"
+ },
+ "total": "Toplam",
+ "true": "Doğru",
+ "twitter": "Twitter",
"up-dir": "Bir dizin üste çık",
"updated_at": "Güncellenme Zamanı",
- "url": "URL",
- "videos": "Videolar"
+ "url": "Internet Adresi (URL)",
+ "videos": "Videolar",
+ "weight": "Kilo",
+ "years_old": "yaşında"
}
diff --git a/ui/v2.5/src/locales/zh-CN.json b/ui/v2.5/src/locales/zh-CN.json
index 0ce07b141..4379ba2c1 100644
--- a/ui/v2.5/src/locales/zh-CN.json
+++ b/ui/v2.5/src/locales/zh-CN.json
@@ -220,8 +220,6 @@
"password": "密码",
"password_desc": "登录 Stash 时所需的密码.留空表示关闭身份验证",
"stash-box_integration": "整合 Stash-box",
- "trusted_proxies": "可信任的代理服务器",
- "trusted_proxies_desc": "允许网络流进入stash的代理服务器列表.如留空则为允许私有网络的流入.",
"username": "用户名",
"username_desc": "登录 Stash 时所需的用户名.留空表示关闭身份验证"
},
@@ -692,6 +690,14 @@
"gallery": "图库",
"gallery_count": "图库数量",
"gender": "性别",
+ "gender_types": {
+ "FEMALE": "女性",
+ "INTERSEX": "多性别",
+ "MALE": "男性",
+ "NON_BINARY": "非二元",
+ "TRANSGENDER_FEMALE": "跨性别女性",
+ "TRANSGENDER_MALE": "跨性别男性"
+ },
"hair_color": "头发颜色",
"hasMarkers": "含有章节标记",
"height": "身高",
diff --git a/ui/v2.5/src/locales/zh-TW.json b/ui/v2.5/src/locales/zh-TW.json
index da84aeb75..b0555d295 100644
--- a/ui/v2.5/src/locales/zh-TW.json
+++ b/ui/v2.5/src/locales/zh-TW.json
@@ -26,6 +26,7 @@
"delete": "刪除",
"delete_entity": "刪除{entityType}",
"delete_file": "刪除檔案",
+ "delete_file_and_funscript": "刪除檔案 (及其 Funscript)",
"delete_generated_supporting_files": "刪除已生成的資訊檔案",
"disallow": "不允許",
"download": "下載",
@@ -44,6 +45,7 @@
"generate_thumb_from_current": "從現在的畫面產生預覽圖",
"hash_migration": "雜湊值遷移",
"hide": "隱藏",
+ "hide_configuration": "隱藏設定",
"identify": "辨認",
"ignore": "忽略",
"import": "匯入…",
@@ -87,8 +89,11 @@
"set_front_image": "設定正面圖…",
"set_image": "設定圖像…",
"show": "顯示",
+ "show_configuration": "顯示設定",
"skip": "跳過",
"stop": "停止",
+ "submit": "提交",
+ "submit_stash_box": "提交至 Stash-Box",
"tasks": {
"clean_confirm_message": "您確定要進行清理嗎?這將從資料庫及產生的文件中清除已不在的短片及圖庫。",
"dry_mode_selected": "已選擇了模擬作業模式。不會進行任何實際刪除作業,只會進行模擬記錄。",
@@ -220,8 +225,6 @@
"password": "密碼",
"password_desc": "使用 Stash 時所需的密碼,留空以關閉身份驗證",
"stash-box_integration": "整合 Stash-box",
- "trusted_proxies": "已信任代理伺服器",
- "trusted_proxies_desc": "允許代理 stash 流量的代理伺服器列表。留空以允許內網。",
"username": "用戶名",
"username_desc": "使用 Stash 時所需的用戶名,留空以關閉身份驗證"
},
@@ -414,6 +417,8 @@
},
"desktop_integration": {
"desktop_integration": "桌面整合",
+ "notifications_enabled": "開啟通知",
+ "send_desktop_notifications_for_events": "當事件發生時,傳送瀏覽器通知",
"skip_opening_browser": "關閉瀏覽器自動開啟",
"skip_opening_browser_on_startup": "伺服器啟動時,不要自動開啟瀏覽器"
},
@@ -487,7 +492,8 @@
"continue_playlist_default": {
"description": "當影片播放完畢時,自動跳至下一個短片",
"heading": "持續播放播放清單"
- }
+ },
+ "show_scrubber": "顯示預覽軸"
}
},
"scene_wall": {
@@ -651,6 +657,7 @@
"search_accuracy_label": "搜尋準確度",
"title": "相近的短片"
},
+ "duplicated_phash": "重複的檔案 (PHash)",
"duration": "長度",
"effect_filters": {
"aspect": "比例",
@@ -692,6 +699,14 @@
"gallery": "圖庫",
"gallery_count": "圖庫數量",
"gender": "性別",
+ "gender_types": {
+ "FEMALE": "女性",
+ "INTERSEX": "多性別",
+ "MALE": "男性",
+ "NON_BINARY": "非二元",
+ "TRANSGENDER_FEMALE": "跨性別女性",
+ "TRANSGENDER_MALE": "跨型別男性"
+ },
"hair_color": "頭髮顏色",
"hasMarkers": "含有章節標記",
"height": "身高",
@@ -750,10 +765,48 @@
"parent_tags": "母標籤",
"part_of": "{parent} 的一部分",
"path": "路徑",
+ "perceptual_similarity": "感知相似度 (PHash)",
"performer": "演員",
"performerTags": "演員標籤",
+ "performer_age": "演員年齡",
"performer_count": "演員數量",
+ "performer_favorite": "已收藏的演員",
"performer_image": "演員圖像",
+ "performer_tagger": {
+ "add_new_performers": "新增演員",
+ "any_names_entered_will_be_queried": "如果輸入的名稱有在設定的 Stash-Box 端點上找到的話,則相對應的結果將會被自動新增。只有完全符合的結果才會被視為匹配。",
+ "batch_add_performers": "大量新增演員",
+ "batch_update_performers": "大量更新演員",
+ "config": {
+ "active_stash-box_instance": "目前使用的 Stash-box:",
+ "edit_excluded_fields": "編輯排除的種類",
+ "excluded_fields": "已排除種類:",
+ "no_fields_are_excluded": "尚無排除任何種類",
+ "no_instances_found": "尚未設定端點",
+ "these_fields_will_not_be_changed_when_updating_performers": "以下種類的資訊將不會於更新演員時更動。"
+ },
+ "current_page": "目前頁面",
+ "failed_to_save_performer": "無法新增演員「{performer}」",
+ "name_already_exists": "名稱已存在",
+ "network_error": "網路錯誤",
+ "no_results_found": "找不到結果。",
+ "number_of_performers_will_be_processed": "將自動處理 {performer_count} 個演員",
+ "performer_already_tagged": "演員資料早已新增",
+ "performer_names_separated_by_comma": "演員名稱 (以逗號分隔)",
+ "performer_selection": "選取演員",
+ "performer_successfully_tagged": "成功新增演員資料:",
+ "query_all_performers_in_the_database": "查詢所有資料庫中的演員",
+ "refresh_tagged_performers": "重新整理已新增的演員資料",
+ "refreshing_will_update_the_data": "重新整理資料將會把任何現有的演員資料重新與 Stash-Box 端點上的資料同步。",
+ "status_tagging_job_queued": "狀態:已排成資料標記",
+ "status_tagging_performers": "狀態:新增演員資料中",
+ "tag_status": "標記狀態",
+ "to_use_the_performer_tagger": "在使用演員標記工具前,請先設定 Stash-Box 端點。",
+ "untagged_performers": "未標記的演員",
+ "update_performer": "更新演員資料",
+ "update_performers": "更新演員",
+ "updating_untagged_performers_description": "更新未標記的演員將試著把尚有 stashid 的演員在 Stash-Box 上找尋對應的資料,並將其資料加入至本地的 Metadata 中。"
+ },
"performers": "演員",
"piercings": "穿洞",
"queue": "佇列",
@@ -852,6 +905,12 @@
},
"stash_id": "Stash ID",
"stash_ids": "Stash IDs",
+ "stashbox": {
+ "go_review_draft": "到 {endpoint_name} 預覽草稿。",
+ "selected_stash_box": "已選擇的 Stash-Box 端點",
+ "submission_failed": "提交失敗",
+ "submission_successful": "提交成功"
+ },
"stats": {
"image_size": "圖片大小",
"scenes_duration": "短片長度",
diff --git a/ui/v2.5/src/models/list-filter/criteria/criterion.ts b/ui/v2.5/src/models/list-filter/criteria/criterion.ts
index 3819bd417..e67ef95c0 100644
--- a/ui/v2.5/src/models/list-filter/criteria/criterion.ts
+++ b/ui/v2.5/src/models/list-filter/criteria/criterion.ts
@@ -6,6 +6,7 @@ import {
HierarchicalMultiCriterionInput,
IntCriterionInput,
MultiCriterionInput,
+ PHashDuplicationCriterionInput,
} from "src/core/generated-graphql";
import DurationUtils from "src/utils/duration";
import {
@@ -206,7 +207,10 @@ export function createStringCriterionOption(
export class StringCriterion extends Criterion {
public getLabelValue() {
- return this.value;
+ let ret = this.value;
+ ret = StringCriterion.unreplaceSpecialCharacter(ret, "&");
+ ret = StringCriterion.unreplaceSpecialCharacter(ret, "+");
+ return ret;
}
public encodeValue() {
@@ -221,6 +225,10 @@ export class StringCriterion extends Criterion {
return str.replaceAll(c, encodeURIComponent(c));
}
+ private static unreplaceSpecialCharacter(str: string, c: string) {
+ return str.replaceAll(encodeURIComponent(c), c);
+ }
+
constructor(type: CriterionOption) {
super(type, "");
}
@@ -435,7 +443,9 @@ export class IHierarchicalLabeledIdCriterion extends Criterion v.label).join(", ");
+ const labels = decodeURI(
+ (this.value.items ?? []).map((v) => v.label).join(", ")
+ );
if (this.value.depth === 0) {
return labels;
@@ -512,3 +522,11 @@ export class DurationCriterion extends Criterion {
: "?";
}
}
+
+export class PhashDuplicateCriterion extends StringCriterion {
+ protected toCriterionInput(): PHashDuplicationCriterionInput {
+ return {
+ duplicated: this.value === "true",
+ };
+ }
+}
diff --git a/ui/v2.5/src/models/list-filter/criteria/factory.ts b/ui/v2.5/src/models/list-filter/criteria/factory.ts
index 82264e2ff..4c9cae2a3 100644
--- a/ui/v2.5/src/models/list-filter/criteria/factory.ts
+++ b/ui/v2.5/src/models/list-filter/criteria/factory.ts
@@ -10,7 +10,7 @@ import {
ILabeledIdCriterion,
} from "./criterion";
import { OrganizedCriterion } from "./organized";
-import { FavoriteCriterion } from "./favorite";
+import { FavoriteCriterion, PerformerFavoriteCriterion } from "./favorite";
import { HasMarkersCriterion } from "./has-markers";
import {
PerformerIsMissingCriterionOption,
@@ -40,7 +40,7 @@ import { GalleriesCriterion } from "./galleries";
import { CriterionType } from "../types";
import { InteractiveCriterion } from "./interactive";
import { RatingCriterionOption } from "./rating";
-import { PhashCriterionOption } from "./phash";
+import { DuplicatedCriterion, PhashCriterionOption } from "./phash";
export function makeCriteria(type: CriterionType = "none") {
switch (type) {
@@ -67,6 +67,7 @@ export function makeCriteria(type: CriterionType = "none") {
case "image_count":
case "gallery_count":
case "performer_count":
+ case "performer_age":
case "tag_count":
return new NumberCriterion(
new MandatoryNumberCriterionOption(type, type)
@@ -107,6 +108,8 @@ export function makeCriteria(type: CriterionType = "none") {
return new TagsCriterion(ChildTagsCriterionOption);
case "performers":
return new PerformersCriterion();
+ case "performer_favorite":
+ return new PerformerFavoriteCriterion();
case "studios":
return new StudiosCriterion();
case "parent_studios":
@@ -132,6 +135,8 @@ export function makeCriteria(type: CriterionType = "none") {
);
case "phash":
return new StringCriterion(PhashCriterionOption);
+ case "duplicated":
+ return new DuplicatedCriterion();
case "ethnicity":
case "country":
case "hair_color":
diff --git a/ui/v2.5/src/models/list-filter/criteria/favorite.ts b/ui/v2.5/src/models/list-filter/criteria/favorite.ts
index 1d5f2c03a..362ebab93 100644
--- a/ui/v2.5/src/models/list-filter/criteria/favorite.ts
+++ b/ui/v2.5/src/models/list-filter/criteria/favorite.ts
@@ -11,3 +11,15 @@ export class FavoriteCriterion extends BooleanCriterion {
super(FavoriteCriterionOption);
}
}
+
+export const PerformerFavoriteCriterionOption = new BooleanCriterionOption(
+ "performer_favorite",
+ "performer_favorite",
+ "performer_favorite"
+);
+
+export class PerformerFavoriteCriterion extends BooleanCriterion {
+ constructor() {
+ super(PerformerFavoriteCriterionOption);
+ }
+}
diff --git a/ui/v2.5/src/models/list-filter/criteria/phash.ts b/ui/v2.5/src/models/list-filter/criteria/phash.ts
index 25915e7e0..25bc8f6e7 100644
--- a/ui/v2.5/src/models/list-filter/criteria/phash.ts
+++ b/ui/v2.5/src/models/list-filter/criteria/phash.ts
@@ -1,5 +1,10 @@
import { CriterionModifier } from "src/core/generated-graphql";
-import { CriterionOption, StringCriterion } from "./criterion";
+import {
+ BooleanCriterionOption,
+ CriterionOption,
+ PhashDuplicateCriterion,
+ StringCriterion,
+} from "./criterion";
export const PhashCriterionOption = new CriterionOption({
messageID: "media_info.phash",
@@ -19,3 +24,15 @@ export class PhashCriterion extends StringCriterion {
super(PhashCriterionOption);
}
}
+
+export const DuplicatedCriterionOption = new BooleanCriterionOption(
+ "duplicated_phash",
+ "duplicated",
+ "duplicated"
+);
+
+export class DuplicatedCriterion extends PhashDuplicateCriterion {
+ constructor() {
+ super(DuplicatedCriterionOption);
+ }
+}
diff --git a/ui/v2.5/src/models/list-filter/galleries.ts b/ui/v2.5/src/models/list-filter/galleries.ts
index 3845830e0..334c2685d 100644
--- a/ui/v2.5/src/models/list-filter/galleries.ts
+++ b/ui/v2.5/src/models/list-filter/galleries.ts
@@ -1,4 +1,8 @@
-import { createStringCriterionOption } from "./criteria/criterion";
+import {
+ createMandatoryNumberCriterionOption,
+ createStringCriterionOption,
+} from "./criteria/criterion";
+import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
import { GalleryIsMissingCriterionOption } from "./criteria/is-missing";
import { OrganizedCriterionOption } from "./criteria/organized";
import { PerformersCriterionOption } from "./criteria/performers";
@@ -47,6 +51,8 @@ const criterionOptions = [
PerformerTagsCriterionOption,
PerformersCriterionOption,
createStringCriterionOption("performer_count"),
+ createMandatoryNumberCriterionOption("performer_age"),
+ PerformerFavoriteCriterionOption,
createStringCriterionOption("image_count"),
StudiosCriterionOption,
createStringCriterionOption("url"),
diff --git a/ui/v2.5/src/models/list-filter/images.ts b/ui/v2.5/src/models/list-filter/images.ts
index 31589c6a3..0f675cd4c 100644
--- a/ui/v2.5/src/models/list-filter/images.ts
+++ b/ui/v2.5/src/models/list-filter/images.ts
@@ -3,6 +3,7 @@ import {
createMandatoryStringCriterionOption,
createStringCriterionOption,
} from "./criteria/criterion";
+import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
import { ImageIsMissingCriterionOption } from "./criteria/is-missing";
import { OrganizedCriterionOption } from "./criteria/organized";
import { PerformersCriterionOption } from "./criteria/performers";
@@ -37,6 +38,8 @@ const criterionOptions = [
PerformerTagsCriterionOption,
PerformersCriterionOption,
createMandatoryNumberCriterionOption("performer_count"),
+ createMandatoryNumberCriterionOption("performer_age"),
+ PerformerFavoriteCriterionOption,
StudiosCriterionOption,
];
export const ImageListFilterOptions = new ListFilterOptions(
diff --git a/ui/v2.5/src/models/list-filter/scenes.ts b/ui/v2.5/src/models/list-filter/scenes.ts
index 88d76534b..71c91b966 100644
--- a/ui/v2.5/src/models/list-filter/scenes.ts
+++ b/ui/v2.5/src/models/list-filter/scenes.ts
@@ -18,7 +18,11 @@ import {
} from "./criteria/tags";
import { ListFilterOptions, MediaSortByOptions } from "./filter-options";
import { DisplayMode } from "./types";
-import { PhashCriterionOption } from "./criteria/phash";
+import {
+ DuplicatedCriterionOption,
+ PhashCriterionOption,
+} from "./criteria/phash";
+import { PerformerFavoriteCriterionOption } from "./criteria/favorite";
const defaultSortBy = "date";
const sortByOptions = [
@@ -32,6 +36,7 @@ const sortByOptions = [
"movie_scene_number",
"interactive",
"interactive_speed",
+ "perceptual_similarity",
...MediaSortByOptions,
].map(ListFilterOptions.createSortBy);
@@ -53,6 +58,7 @@ const criterionOptions = [
"checksum"
),
PhashCriterionOption,
+ DuplicatedCriterionOption,
RatingCriterionOption,
OrganizedCriterionOption,
createMandatoryNumberCriterionOption("o_counter"),
@@ -65,6 +71,8 @@ const criterionOptions = [
PerformerTagsCriterionOption,
PerformersCriterionOption,
createMandatoryNumberCriterionOption("performer_count"),
+ createMandatoryNumberCriterionOption("performer_age"),
+ PerformerFavoriteCriterionOption,
StudiosCriterionOption,
MoviesCriterionOption,
createStringCriterionOption("url"),
diff --git a/ui/v2.5/src/models/list-filter/types.ts b/ui/v2.5/src/models/list-filter/types.ts
index 817c81237..50009a76e 100644
--- a/ui/v2.5/src/models/list-filter/types.ts
+++ b/ui/v2.5/src/models/list-filter/types.ts
@@ -28,6 +28,11 @@ export interface INumberValue {
value2: number | undefined;
}
+export interface IPHashDuplicationValue {
+ duplicated: boolean;
+ distance?: number; // currently not implemented
+}
+
export function criterionIsHierarchicalLabelValue(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
value: any
@@ -119,4 +124,7 @@ export type CriterionType =
| "director"
| "synopsis"
| "parent_tag_count"
- | "child_tag_count";
+ | "child_tag_count"
+ | "performer_favorite"
+ | "performer_age"
+ | "duplicated";
diff --git a/ui/v2.5/src/utils/bulkUpdate.ts b/ui/v2.5/src/utils/bulkUpdate.ts
new file mode 100644
index 000000000..9624e5605
--- /dev/null
+++ b/ui/v2.5/src/utils/bulkUpdate.ts
@@ -0,0 +1,175 @@
+import * as GQL from "src/core/generated-graphql";
+import _ from "lodash";
+
+interface IHasRating {
+ rating?: GQL.Maybe | undefined;
+}
+
+export function getAggregateRating(state: IHasRating[]) {
+ let ret: number | undefined;
+ let first = true;
+
+ state.forEach((o) => {
+ if (first) {
+ ret = o.rating ?? undefined;
+ first = false;
+ } else if (ret !== o.rating) {
+ ret = undefined;
+ }
+ });
+
+ return ret;
+}
+
+interface IHasID {
+ id: string;
+}
+
+interface IHasStudio {
+ studio?: GQL.Maybe | undefined;
+}
+
+export function getAggregateStudioId(state: IHasStudio[]) {
+ let ret: string | undefined;
+ let first = true;
+
+ state.forEach((o) => {
+ if (first) {
+ ret = o?.studio?.id;
+ first = false;
+ } else {
+ const studio = o?.studio?.id;
+ if (ret !== studio) {
+ ret = undefined;
+ }
+ }
+ });
+
+ return ret;
+}
+
+interface IHasPerformers {
+ performers: IHasID[];
+}
+
+export function getAggregatePerformerIds(state: IHasPerformers[]) {
+ let ret: string[] = [];
+ let first = true;
+
+ state.forEach((o) => {
+ if (first) {
+ ret = o.performers ? o.performers.map((p) => p.id).sort() : [];
+ first = false;
+ } else {
+ const perfIds = o.performers ? o.performers.map((p) => p.id).sort() : [];
+
+ if (!_.isEqual(ret, perfIds)) {
+ ret = [];
+ }
+ }
+ });
+
+ return ret;
+}
+
+interface IHasTags {
+ tags: IHasID[];
+}
+
+export function getAggregateTagIds(state: IHasTags[]) {
+ let ret: string[] = [];
+ let first = true;
+
+ state.forEach((o) => {
+ if (first) {
+ ret = o.tags ? o.tags.map((t) => t.id).sort() : [];
+ first = false;
+ } else {
+ const tIds = o.tags ? o.tags.map((t) => t.id).sort() : [];
+
+ if (!_.isEqual(ret, tIds)) {
+ ret = [];
+ }
+ }
+ });
+
+ return ret;
+}
+
+interface IMovie {
+ movie: IHasID;
+}
+
+interface IHasMovies {
+ movies: IMovie[];
+}
+
+export function getAggregateMovieIds(state: IHasMovies[]) {
+ let ret: string[] = [];
+ let first = true;
+
+ state.forEach((o) => {
+ if (first) {
+ ret = o.movies ? o.movies.map((m) => m.movie.id).sort() : [];
+ first = false;
+ } else {
+ const mIds = o.movies ? o.movies.map((m) => m.movie.id).sort() : [];
+
+ if (!_.isEqual(ret, mIds)) {
+ ret = [];
+ }
+ }
+ });
+
+ return ret;
+}
+
+function makeBulkUpdateIds(
+ ids: string[],
+ mode: GQL.BulkUpdateIdMode
+): GQL.BulkUpdateIds {
+ return {
+ mode,
+ ids,
+ };
+}
+
+export function getAggregateInputValue(
+ inputValue: V | null | undefined,
+ aggregateValue: V | null | undefined
+) {
+ if (inputValue === undefined) {
+ // and all objects have the same value, then we are unsetting the value.
+ if (aggregateValue !== undefined) {
+ // null to unset rating
+ return null;
+ }
+ // otherwise not setting the rating
+ return undefined;
+ } else {
+ // if value is set, then we are setting the value for all
+ return inputValue;
+ }
+}
+
+export function getAggregateInputIDs(
+ mode: GQL.BulkUpdateIdMode,
+ inputIds: string[] | undefined,
+ aggregateIds: string[]
+) {
+ if (
+ mode === GQL.BulkUpdateIdMode.Set &&
+ (!inputIds || inputIds.length === 0)
+ ) {
+ // and all scenes have the same ids,
+ if (aggregateIds.length > 0) {
+ // then unset the performerIds, otherwise ignore
+ return makeBulkUpdateIds(inputIds || [], mode);
+ }
+ } else {
+ // if performerIds non-empty, then we are setting them
+ return makeBulkUpdateIds(inputIds || [], mode);
+ }
+
+ return undefined;
+}
diff --git a/ui/v2.5/src/utils/country.ts b/ui/v2.5/src/utils/country.ts
index 20555abb8..d9961a388 100644
--- a/ui/v2.5/src/utils/country.ts
+++ b/ui/v2.5/src/utils/country.ts
@@ -20,8 +20,10 @@ const fuzzyDict: Record = {
const getISOCountry = (country: string | null | undefined) => {
if (!country) return null;
- const code = fuzzyDict[country] ?? Countries.getAlpha2Code(country, "en");
- if (!code) return null;
+ const code =
+ fuzzyDict[country] ?? Countries.getAlpha2Code(country, "en") ?? country;
+ // Check if code is valid alpha2 iso
+ if (!Countries.alpha2ToAlpha3(code)) return null;
return {
code,
diff --git a/ui/v2.5/src/utils/gender.ts b/ui/v2.5/src/utils/gender.ts
index 1a1934468..b68faf4ef 100644
--- a/ui/v2.5/src/utils/gender.ts
+++ b/ui/v2.5/src/utils/gender.ts
@@ -26,11 +26,14 @@ export const genderToString = (value?: GQL.GenderEnum | string) => {
export const stringToGender = (
value?: string | null,
caseInsensitive?: boolean
-) => {
+): GQL.GenderEnum | undefined => {
if (!value) {
return undefined;
}
+ const existing = Object.entries(GQL.GenderEnum).find((e) => e[1] === value);
+ if (existing) return existing[1];
+
const ret = stringGenderMap.get(value);
if (ret || !caseInsensitive) {
return ret;
diff --git a/ui/v2.5/src/utils/index.ts b/ui/v2.5/src/utils/index.ts
index 05b1336ff..66095f3c6 100644
--- a/ui/v2.5/src/utils/index.ts
+++ b/ui/v2.5/src/utils/index.ts
@@ -14,3 +14,4 @@ export { default as useFocus } from "./focus";
export { default as downloadFile } from "./download";
export * from "./data";
export { getStashIDs } from "./stashIds";
+export * from "./stashbox";
diff --git a/ui/v2.5/src/utils/stashbox.ts b/ui/v2.5/src/utils/stashbox.ts
index a511b4f3f..d641da7b8 100644
--- a/ui/v2.5/src/utils/stashbox.ts
+++ b/ui/v2.5/src/utils/stashbox.ts
@@ -1,3 +1,6 @@
export function stashboxDisplayName(name: string, index: number) {
return name || `Stash-Box #${index + 1}`;
}
+
+export const getStashboxBase = (endpoint: string) =>
+ endpoint.match(/(https?:\/\/.*?\/)graphql/)?.[1];
diff --git a/ui/v2.5/src/utils/text.ts b/ui/v2.5/src/utils/text.ts
index e90de3cd1..7404ab9db 100644
--- a/ui/v2.5/src/utils/text.ts
+++ b/ui/v2.5/src/utils/text.ts
@@ -284,14 +284,22 @@ const sanitiseURL = (url?: string, siteURL?: URL) => {
return `https://${url}`;
};
-const formatDate = (intl: IntlShape, date?: string) => {
+const formatDate = (intl: IntlShape, date?: string, utc = true) => {
if (!date) {
return "";
}
- return intl.formatDate(date, { format: "long", timeZone: "utc" });
+ return intl.formatDate(date, {
+ format: "long",
+ timeZone: utc ? "utc" : undefined,
+ });
};
+const formatDateTime = (intl: IntlShape, dateTime?: string, utc = false) =>
+ `${formatDate(intl, dateTime, utc)} ${intl.formatTime(dateTime, {
+ timeZone: utc ? "utc" : undefined,
+ })}`;
+
const capitalize = (val: string) =>
val
.replace(/^[-_]*(.)/, (_, c) => c.toUpperCase())
@@ -311,6 +319,7 @@ const TextUtils = {
twitterURL,
instagramURL,
formatDate,
+ formatDateTime,
capitalize,
secondsAsTimeString,
};
diff --git a/ui/v2.5/yarn.lock b/ui/v2.5/yarn.lock
index b7afddd25..60ecc4e27 100644
--- a/ui/v2.5/yarn.lock
+++ b/ui/v2.5/yarn.lock
@@ -3429,9 +3429,9 @@ flexbin@^0.2.0:
integrity sha1-ASYwbT1ZX8t9/LhxSbnJWZ/49Ok=
follow-redirects@^1.14.0:
- version "1.14.4"
- resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz"
- integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==
+ version "1.14.8"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
+ integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
form-data@4.0.0:
version "4.0.0"
@@ -5385,15 +5385,10 @@ nanoclone@^0.2.1:
resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz"
integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==
-nanoid@^3.1.20:
- version "3.1.22"
- resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz"
- integrity sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==
-
-nanoid@^3.1.30:
- version "3.1.30"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362"
- integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==
+nanoid@^3.1.20, nanoid@^3.1.30:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c"
+ integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==
natural-compare@^1.4.0:
version "1.4.0"
@@ -6029,7 +6024,7 @@ query-string@6.13.8:
querystringify@^2.1.1:
version "2.2.0"
- resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
queue-microtask@^1.2.2:
@@ -6477,7 +6472,7 @@ require-main-filename@^2.0.0:
requires-port@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resolve-from@5.0.0, resolve-from@^5.0.0:
@@ -7571,9 +7566,9 @@ url-parse-lax@^3.0.0:
prepend-http "^2.0.0"
url-parse@^1.4.3:
- version "1.5.3"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862"
- integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"
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 @@
+#
+
+
+[![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://..."
+```
+
+
+
+## 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
+
+
+
+
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 000000000..e63917b2d
Binary files /dev/null and b/vendor/github.com/go-toast/toast/screenshot-action-centre.png differ
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 000000000..fc03c37e8
Binary files /dev/null and b/vendor/github.com/go-toast/toast/screenshot-cli.png differ
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 000000000..93904061d
Binary files /dev/null and b/vendor/github.com/go-toast/toast/screenshot-toast.png differ
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"}}
+
+ {{else}}
+
+ {{end}}
+ {{if .Actions}}
+
+ {{range .Actions}}
+
+ {{end}}
+
+ {{end}}
+
+"@
+
+$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).
+
+[](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.
+
+
+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.
+
+
+[](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 000000000..194e25741
Binary files /dev/null and b/vendor/github.com/kermieisinthehouse/gosx-notifier/example.png differ
diff --git a/vendor/github.com/kermieisinthehouse/gosx-notifier/gopher.png b/vendor/github.com/kermieisinthehouse/gosx-notifier/gopher.png
new file mode 100644
index 000000000..ec274053b
Binary files /dev/null and b/vendor/github.com/kermieisinthehouse/gosx-notifier/gopher.png differ
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!
+
+
+
+## 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..55c5b5699
--- /dev/null
+++ b/vendor/github.com/kermieisinthehouse/systray/systray_windows.go
@@ -0,0 +1,956 @@
+//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_ENDSESSION = 0x0016
+ WM_CLOSE = 0x0010
+ )
+
+ pPostMessage.Call(
+ uintptr(wt.window),
+ WM_ENDSESSION,
+ 0,
+ 0,
+ )
+
+ 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..987bacd0b 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.4
+## 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