summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2016-10-21 08:05:26 -0700
committerAaron Plattner <aplattner@nvidia.com>2016-10-21 08:05:26 -0700
commit7155801a4e8e162981fdb963cd5b76982a2deb76 (patch)
tree1d3ad6181e09b0cffcfa707f2f0a12ff47c8a138
parent9712ba1ec965cea9f5155b95d32bd2f13a2bb95a (diff)
375.10375.10
-rw-r--r--doc/version.mk2
-rw-r--r--samples/version.mk2
-rw-r--r--src/Makefile24
-rw-r--r--src/gtk+-2.x/ctkbanner.c2
-rw-r--r--src/gtk+-2.x/ctkbanner.h1
-rw-r--r--src/gtk+-2.x/ctkdisplayconfig-utils.c29
-rw-r--r--src/gtk+-2.x/ctkdisplayconfig.c180
-rw-r--r--src/gtk+-2.x/ctkdisplayconfig.h3
-rw-r--r--src/gtk+-2.x/ctkdisplaylayout.h3
-rw-r--r--src/gtk+-2.x/ctkevent.c3
-rw-r--r--src/gtk+-2.x/ctkframelock.c62
-rw-r--r--src/image_data/server_licensing.pngbin0 -> 6181 bytes
-rw-r--r--src/image_data/server_licensing_pixdata.h570
-rw-r--r--src/libXNVCtrl/NVCtrl.h40
-rw-r--r--src/libXNVCtrl/version.mk2
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributes.c8
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributes.h17
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c168
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h4
-rw-r--r--src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c3
-rw-r--r--src/parse.c3
-rw-r--r--src/src.mk2
-rw-r--r--src/version.h2
-rw-r--r--src/version.mk2
-rw-r--r--version.mk2
25 files changed, 983 insertions, 151 deletions
diff --git a/doc/version.mk b/doc/version.mk
index 184e0ee..b31360a 100644
--- a/doc/version.mk
+++ b/doc/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 370.28
+NVIDIA_VERSION = 375.10
diff --git a/samples/version.mk b/samples/version.mk
index 184e0ee..b31360a 100644
--- a/samples/version.mk
+++ b/samples/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 370.28
+NVIDIA_VERSION = 375.10
diff --git a/src/Makefile b/src/Makefile
index 7ae58cc..5ed9ad3 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -150,17 +150,19 @@ LDFLAGS += $(X_LDFLAGS)
# Link against NVIDIA NVML library if available
# Set to 1 if NVML is available on the target system
-NVML_AVAILABLE ?= 0
-
-ifeq (1,$(NVML_AVAILABLE))
- # Here "gdk" stands for "GPU Developer Kit", rather than gtk's lower-level
- # "GIMP Drawing Kit"
- NVML_CFLAGS ?= -I /usr/include/nvidia/gdk -DNVML_AVAILABLE
- NVML_LDFLAGS ?=
- CFLAGS += $(NVML_CFLAGS)
- LDFLAGS += $(NVML_LDFLAGS)
- LIBS += -lnvidia-ml
-endif
+NVML_EXPERIMENTAL ?=
+
+# Here "gdk" stands for "GPU Developer Kit", rather than gtk's lower-level
+# "GIMP Drawing Kit"
+NVML_CFLAGS ?= -I /usr/include/nvidia/gdk
+
+NVML_CFLAGS += $(if $(NVML_EXPERIMENTAL),-DNVML_EXPERIMENTAL)
+
+NVML_LDFLAGS ?=
+CFLAGS += $(NVML_CFLAGS)
+LDFLAGS += $(NVML_LDFLAGS)
+LIBS += -lnvidia-ml
+
# Some older Linux distributions do not have the dynamic library
# libXxf86vm.so, though some newer Linux distributions do not have the
diff --git a/src/gtk+-2.x/ctkbanner.c b/src/gtk+-2.x/ctkbanner.c
index 368d5de..6b51d61 100644
--- a/src/gtk+-2.x/ctkbanner.c
+++ b/src/gtk+-2.x/ctkbanner.c
@@ -52,6 +52,7 @@
#include "gvi_pixdata.h"
#include "sdi_pixdata.h"
#include "sdi_shared_sync_bnc_pixdata.h"
+#include "server_licensing_pixdata.h"
#include "slimm_pixdata.h"
#include "solaris_pixdata.h"
#include "thermal_pixdata.h"
@@ -427,6 +428,7 @@ static gboolean select_artwork(BannerArtworkType artwork,
{ BANNER_ARTWORK_PENGUIN, TRUE, 16, &penguin_pixdata },
{ BANNER_ARTWORK_SDI, FALSE, 16, &sdi_pixdata },
{ BANNER_ARTWORK_SDI_SHARED_SYNC_BNC, FALSE, 16, &sdi_shared_sync_bnc_pixdata },
+ { BANNER_ARTWORK_SERVER_LICENSING, FALSE, 16, &server_licensing_pixdata },
{ BANNER_ARTWORK_SLIMM, FALSE, 16, &slimm_pixdata },
{ BANNER_ARTWORK_SOLARIS, TRUE, 16, &solaris_pixdata },
{ BANNER_ARTWORK_THERMAL, FALSE, 16, &thermal_pixdata },
diff --git a/src/gtk+-2.x/ctkbanner.h b/src/gtk+-2.x/ctkbanner.h
index 565460c..f924bef 100644
--- a/src/gtk+-2.x/ctkbanner.h
+++ b/src/gtk+-2.x/ctkbanner.h
@@ -61,6 +61,7 @@ typedef enum {
BANNER_ARTWORK_PENGUIN,
BANNER_ARTWORK_SDI,
BANNER_ARTWORK_SDI_SHARED_SYNC_BNC,
+ BANNER_ARTWORK_SERVER_LICENSING,
BANNER_ARTWORK_SLIMM,
BANNER_ARTWORK_SOLARIS,
BANNER_ARTWORK_THERMAL,
diff --git a/src/gtk+-2.x/ctkdisplayconfig-utils.c b/src/gtk+-2.x/ctkdisplayconfig-utils.c
index 575995b..fd0ca17 100644
--- a/src/gtk+-2.x/ctkdisplayconfig-utils.c
+++ b/src/gtk+-2.x/ctkdisplayconfig-utils.c
@@ -662,7 +662,20 @@ static void apply_mode_attribute_token(char *token, char *value, void *data)
} else if (!strcasecmp("8k", value)) {
mode->pixelshift = PIXELSHIFT_8K;
}
+
+ /* ForceCompositionPipeline */
+ } else if (!strcasecmp("forcecompositionpipeline", token)) {
+ if (!strcasecmp("on", value)) {
+ mode->forceCompositionPipeline = True;
+ }
+
+ /* ForceFullCompositionPipeline */
+ } else if (!strcasecmp("forcefullcompositionpipeline", token)) {
+ if (!strcasecmp("on", value)) {
+ mode->forceFullCompositionPipeline = True;
+ }
}
+
}
@@ -1149,6 +1162,22 @@ static gchar *mode_get_str(nvModePtr mode, int force_target_id_name)
flags_str = tmp;
}
+ /* ForceCompositionPipeline */
+ if (mode->forceCompositionPipeline) {
+ tmp = g_strdup_printf("%s, ForceCompositionPipeline=On",
+ (flags_str ? flags_str : ""));
+ g_free(flags_str);
+ flags_str = tmp;
+ }
+
+ /* ForceFullCompositionPipeline */
+ if (mode->forceFullCompositionPipeline) {
+ tmp = g_strdup_printf("%s, ForceFullCompositionPipeline=On",
+ (flags_str ? flags_str : ""));
+ g_free(flags_str);
+ flags_str = tmp;
+ }
+
if (flags_str) {
tmp = g_strdup_printf("%s {%s}",
mode_str,
diff --git a/src/gtk+-2.x/ctkdisplayconfig.c b/src/gtk+-2.x/ctkdisplayconfig.c
index 43ba968..50fbe06 100644
--- a/src/gtk+-2.x/ctkdisplayconfig.c
+++ b/src/gtk+-2.x/ctkdisplayconfig.c
@@ -114,6 +114,8 @@ static void display_config_attribute_changed(GtkWidget *object,
static void reset_layout(CtkDisplayConfig *ctk_object);
static gboolean force_layout_reset(gpointer user_data);
static void user_changed_attributes(CtkDisplayConfig *ctk_object);
+static void update_forcecompositionpipeline_buttons(CtkDisplayConfig
+ *ctk_object);
static XConfigPtr xconfig_generate(XConfigPtr xconfCur,
Bool merge,
@@ -260,6 +262,17 @@ static const char * __dpy_primary_help =
"important windows etc; changing this option may require restarting your X "
"server, depending on your window manager.";
+static const char * __dpy_forcecompositionpipeline_help =
+"The NVIDIA X driver can use a composition pipeline to apply X screen "
+"transformations and rotations. \"ForceCompositionPipeline\" can be used to "
+"force the use of this pipeline, even when no transformations or rotations are "
+"applied to the screen. This option is implicitly set by "
+"ForceFullCompositionPipeline.";
+
+static const char * __dpy_forcefullcompositionpipeline_help =
+"This option implicitly enables \"ForceCompositionPipeline\" and additionally "
+"makes use of the composition pipeline to apply ViewPortOut scaling.";
+
/* Screen tooltips */
static const char * __screen_virtual_size_help =
@@ -1097,6 +1110,109 @@ static void user_changed_attributes(CtkDisplayConfig *ctk_object)
+/** display_forcecompositionpipeline_toggled() ************************
+ *
+ * Sets ForceCompositionPipeline for a dpy.
+ *
+ **/
+static void display_forcecompositionpipeline_toggled(GtkWidget *widget,
+ gpointer user_data)
+{
+ CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data);
+ gint enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ nvDisplayPtr display = ctk_display_layout_get_selected_display
+ (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout));
+
+ if (enabled) {
+ display->cur_mode->forceCompositionPipeline = TRUE;
+ } else {
+ display->cur_mode->forceCompositionPipeline = FALSE;
+ }
+
+ update_forcecompositionpipeline_buttons(ctk_object);
+ user_changed_attributes(ctk_object);
+}
+
+
+
+/** display_forcefullcompositionpipeline_toggled() ********************
+ *
+ * Sets ForceFullCompositionPipeline for a dpy.
+ *
+ **/
+static void display_forcefullcompositionpipeline_toggled(GtkWidget *widget,
+ gpointer user_data)
+{
+ CtkDisplayConfig *ctk_object = CTK_DISPLAY_CONFIG(user_data);
+ gint enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+ nvDisplayPtr display = ctk_display_layout_get_selected_display
+ (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout));
+
+ if (enabled) {
+ display->cur_mode->forceFullCompositionPipeline = TRUE;
+ /* forceFullCompositionPipeline implies forceCompositionPipeline in the
+ * X driver, so we should reflect that within nvidia-settings even
+ * before actually changing the current X MetaMode.
+ */
+ display->cur_mode->forceCompositionPipeline = TRUE;
+ } else {
+ display->cur_mode->forceFullCompositionPipeline = FALSE;
+ }
+
+ update_forcecompositionpipeline_buttons(ctk_object);
+ user_changed_attributes(ctk_object);
+}
+
+
+
+/** update_forcecompositionpipeline_buttons() *************************
+ *
+ * Updates the buttons for Force{Full,}CompositionPipeline to reflect their
+ * state and sensitivity.
+ *
+ **/
+
+static void update_forcecompositionpipeline_buttons(CtkDisplayConfig *ctk_object)
+{
+ nvDisplayPtr display = ctk_display_layout_get_selected_display
+ (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout));
+
+ g_signal_handlers_block_by_func
+ (G_OBJECT(ctk_object->chk_forcecompositionpipeline_enabled),
+ G_CALLBACK(display_forcecompositionpipeline_toggled),
+ (gpointer)ctk_object);
+
+ g_signal_handlers_block_by_func
+ (G_OBJECT(ctk_object->chk_forcefullcompositionpipeline_enabled),
+ G_CALLBACK(display_forcefullcompositionpipeline_toggled),
+ (gpointer)ctk_object);
+
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(ctk_object->chk_forcecompositionpipeline_enabled),
+ display->cur_mode->forceCompositionPipeline |
+ display->cur_mode->forceFullCompositionPipeline);
+
+ gtk_toggle_button_set_active
+ (GTK_TOGGLE_BUTTON(ctk_object->chk_forcefullcompositionpipeline_enabled),
+ display->cur_mode->forceFullCompositionPipeline);
+
+ gtk_widget_set_sensitive
+ (GTK_WIDGET(ctk_object->chk_forcecompositionpipeline_enabled),
+ !display->cur_mode->forceFullCompositionPipeline);
+
+ g_signal_handlers_unblock_by_func
+ (G_OBJECT(ctk_object->chk_forcecompositionpipeline_enabled),
+ G_CALLBACK(display_forcecompositionpipeline_toggled),
+ (gpointer)ctk_object);
+
+ g_signal_handlers_unblock_by_func
+ (G_OBJECT(ctk_object->chk_forcefullcompositionpipeline_enabled),
+ G_CALLBACK(display_forcefullcompositionpipeline_toggled),
+ (gpointer)ctk_object);
+}
+
+
+
/** screen_primary_display_toggled() ******************************
*
* Sets the primary display for a screen.
@@ -1957,6 +2073,36 @@ GtkWidget* ctk_display_config_new(CtrlTarget *ctrl_target,
gtk_box_pack_start(GTK_BOX(hbox), ctk_object->chk_primary_display,
TRUE, TRUE, 0);
+ /* checkboxes for Force{Full,}CompositionPipeline */
+ hbox = gtk_hbox_new(FALSE, 5);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
+ ctk_object->chk_forcecompositionpipeline_enabled =
+ gtk_check_button_new_with_label("Force Composition Pipeline");
+ ctk_config_set_tooltip(ctk_config,
+ ctk_object->chk_forcecompositionpipeline_enabled,
+ __dpy_forcecompositionpipeline_help);
+ g_signal_connect(G_OBJECT(ctk_object->chk_forcecompositionpipeline_enabled),
+ "toggled",
+ G_CALLBACK(display_forcecompositionpipeline_toggled),
+ (gpointer)ctk_object);
+ gtk_box_pack_start(GTK_BOX(hbox),
+ ctk_object->chk_forcecompositionpipeline_enabled,
+ TRUE, TRUE, 0);
+
+ ctk_object->chk_forcefullcompositionpipeline_enabled =
+ gtk_check_button_new_with_label("Force Full Composition Pipeline");
+ ctk_config_set_tooltip(ctk_config,
+ ctk_object->
+ chk_forcefullcompositionpipeline_enabled,
+ __dpy_forcefullcompositionpipeline_help);
+ g_signal_connect(G_OBJECT(ctk_object->chk_forcefullcompositionpipeline_enabled),
+ "toggled",
+ G_CALLBACK(display_forcefullcompositionpipeline_toggled),
+ (gpointer)ctk_object);
+ gtk_box_pack_start(GTK_BOX(hbox),
+ ctk_object->chk_forcefullcompositionpipeline_enabled,
+ TRUE, TRUE, 0);
+
/* Up the object ref count to make sure that the page and its widgets
* do not get freed if/when the page is removed from the notebook.
*/
@@ -4106,6 +4252,39 @@ static void setup_display_position(CtkDisplayConfig *ctk_object)
+/** setup_forcecompositionpipeline_buttons() *************************
+ *
+ * Sets up the ForceCompositionPipeline and ForceFullCompositionPipeline
+ * checkboxes to reflect whether or not they are selected in the current
+ * MetaMode.
+ *
+ **/
+
+static void setup_forcecompositionpipeline_buttons(CtkDisplayConfig *ctk_object)
+{
+ nvDisplayPtr display = ctk_display_layout_get_selected_display
+ (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout));
+
+ if (!display || !display->screen || !ctk_object->advanced_mode) {
+ gtk_widget_hide(ctk_object->chk_forcecompositionpipeline_enabled);
+ gtk_widget_hide(ctk_object->chk_forcefullcompositionpipeline_enabled);
+ return;
+ }
+
+ if (!display->cur_mode) {
+ gtk_widget_hide(ctk_object->chk_forcecompositionpipeline_enabled);
+ gtk_widget_hide(ctk_object->chk_forcefullcompositionpipeline_enabled);
+ return;
+ }
+
+ gtk_widget_show(ctk_object->chk_forcecompositionpipeline_enabled);
+ gtk_widget_show(ctk_object->chk_forcefullcompositionpipeline_enabled);
+
+ update_forcecompositionpipeline_buttons(ctk_object);
+}
+
+
+
/** setup_primary_display() ******************************************
*
* Sets up the primary display device for an X screen.
@@ -4231,6 +4410,7 @@ static void setup_display_page(CtkDisplayConfig *ctk_object)
setup_display_viewport_out(ctk_object);
setup_display_position(ctk_object);
setup_display_panning(ctk_object);
+ setup_forcecompositionpipeline_buttons(ctk_object);
setup_primary_display(ctk_object);
} /* setup_display_page() */
diff --git a/src/gtk+-2.x/ctkdisplayconfig.h b/src/gtk+-2.x/ctkdisplayconfig.h
index 149a845..3c49d20 100644
--- a/src/gtk+-2.x/ctkdisplayconfig.h
+++ b/src/gtk+-2.x/ctkdisplayconfig.h
@@ -93,6 +93,9 @@ typedef struct _CtkDisplayConfig
GtkWidget *chk_primary_display;
gboolean primary_display_changed;
+ GtkWidget *chk_forcecompositionpipeline_enabled;
+ GtkWidget *chk_forcefullcompositionpipeline_enabled;
+
GtkWidget *mnu_selected_item;
SelectableItem *selected_item_table;
int selected_item_table_len;
diff --git a/src/gtk+-2.x/ctkdisplaylayout.h b/src/gtk+-2.x/ctkdisplaylayout.h
index 45b0195..4c7830b 100644
--- a/src/gtk+-2.x/ctkdisplaylayout.h
+++ b/src/gtk+-2.x/ctkdisplaylayout.h
@@ -224,6 +224,9 @@ typedef struct nvModeRec {
Reflection reflection;
PixelShift pixelshift;
+ Bool forceCompositionPipeline;
+ Bool forceFullCompositionPipeline;
+
} nvMode, *nvModePtr;
diff --git a/src/gtk+-2.x/ctkevent.c b/src/gtk+-2.x/ctkevent.c
index c7d735e..2a6a510 100644
--- a/src/gtk+-2.x/ctkevent.c
+++ b/src/gtk+-2.x/ctkevent.c
@@ -207,6 +207,7 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
MAKE_SIGNAL(NV_CTRL_PCI_DEVICE);
MAKE_SIGNAL(NV_CTRL_PCI_FUNCTION);
MAKE_SIGNAL(NV_CTRL_FRAMELOCK_FPGA_REVISION);
+ MAKE_SIGNAL(NV_CTRL_FRAMELOCK_FIRMWARE_VERSION);
MAKE_SIGNAL(NV_CTRL_MAX_SCREEN_WIDTH);
MAKE_SIGNAL(NV_CTRL_MAX_SCREEN_HEIGHT);
MAKE_SIGNAL(NV_CTRL_MAX_DISPLAYS);
@@ -353,7 +354,7 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
* knows about.
*/
-#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS
+#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_FRAMELOCK_FIRMWARE_VERSION
#warning "There are attributes that do not emit signals!"
#endif
diff --git a/src/gtk+-2.x/ctkframelock.c b/src/gtk+-2.x/ctkframelock.c
index 0fdde54..78dbd91 100644
--- a/src/gtk+-2.x/ctkframelock.c
+++ b/src/gtk+-2.x/ctkframelock.c
@@ -215,38 +215,39 @@ struct _nvGPUDataRec {
struct _nvFrameLockDataRec {
CtrlTarget *ctrl_target; /* Frame Lock Target */
- int server_id;
+ int server_id;
- int sync_delay_resolution;
+ int sync_delay_resolution;
- GtkWidget *label;
+ GtkWidget *label;
- GtkWidget *receiving_label;
- GtkWidget *receiving_hbox; /* LED */
+ GtkWidget *receiving_label;
+ GtkWidget *receiving_hbox; /* LED */
- GtkWidget *rate_label;
- GtkWidget *rate_text;
+ GtkWidget *rate_label;
+ GtkWidget *rate_text;
- GtkWidget *delay_label;
- GtkWidget *delay_text;
+ GtkWidget *delay_label;
+ GtkWidget *delay_text;
- GtkWidget *house_label;
- GtkWidget *house_sync_rate_label;
- GtkWidget *house_sync_rate_text;
- GtkWidget *house_hbox; /* LED */
+ GtkWidget *house_label;
+ GtkWidget *house_sync_rate_label;
+ GtkWidget *house_sync_rate_text;
+ GtkWidget *house_hbox; /* LED */
- GtkWidget *port0_label;
- GtkWidget *port0_hbox; /* IMAGE */
- guint port0_ethernet_error;
+ GtkWidget *port0_label;
+ GtkWidget *port0_hbox; /* IMAGE */
+ guint port0_ethernet_error;
- GtkWidget *port1_label;
- GtkWidget *port1_hbox; /* IMAGE */
- guint port1_ethernet_error;
+ GtkWidget *port1_label;
+ GtkWidget *port1_hbox; /* IMAGE */
+ guint port1_ethernet_error;
- GtkWidget *revision_label;
- GtkWidget *revision_text;
+ GtkWidget *revision_label;
+ GtkWidget *revision_text;
+ const char *board_name;
- GtkWidget *extra_info_hbox;
+ GtkWidget *extra_info_hbox;
};
@@ -935,7 +936,9 @@ static char *get_framelock_name(nvFrameLockDataPtr data, gboolean simple)
*/
server_name = NvCtrlGetDisplayName(ctrl_target);
- snprintf(tmp, 32, " (Quadro Sync %d)", NvCtrlGetTargetId(ctrl_target));
+ snprintf(tmp, 32, " (%s %d)",
+ data->board_name,
+ NvCtrlGetTargetId(ctrl_target));
name = g_strconcat(server_name?server_name:"Unknown X Server", tmp, NULL);
@@ -5487,6 +5490,7 @@ static void add_framelock_devices(CtkFramelock *ctk_framelock,
nvListEntryPtr entry;
ReturnStatus ret;
int val;
+ char *product_name;
char *revision_str = NULL;
CtrlTarget *ctrl_target = node->t;
@@ -5515,13 +5519,23 @@ static void add_framelock_devices(CtkFramelock *ctk_framelock,
}
ret = NvCtrlGetAttribute(ctrl_target,
- NV_CTRL_FRAMELOCK_FPGA_REVISION,
+ NV_CTRL_FRAMELOCK_FIRMWARE_VERSION,
&val);
if (ret != NvCtrlSuccess) {
goto fail;
}
revision_str = g_strdup_printf("0x%X", val);
+ /* Get the product name for the framelock board */
+ ret = NvCtrlGetStringAttribute(ctrl_target,
+ NV_CTRL_STRING_PRODUCT_NAME,
+ &product_name);
+ if (ret != NvCtrlSuccess) {
+ goto fail;
+ }
+
+ framelock_data->board_name = product_name;
+
/* Create the frame lock widgets */
framelock_data->label = gtk_label_new("");
diff --git a/src/image_data/server_licensing.png b/src/image_data/server_licensing.png
new file mode 100644
index 0000000..6631971
--- /dev/null
+++ b/src/image_data/server_licensing.png
Binary files differ
diff --git a/src/image_data/server_licensing_pixdata.h b/src/image_data/server_licensing_pixdata.h
new file mode 100644
index 0000000..9bcc726
--- /dev/null
+++ b/src/image_data/server_licensing_pixdata.h
@@ -0,0 +1,570 @@
+/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */
+
+static guint8 server_licensing_pixdata_pixel_data[] = {
+ 0x01,0x88,0xd7,0x01,0xff,0x93,0x89,0xd9,0x00,0xff,0x08,0x8d,0xde,0x00,0xff,
+ 0x97,0xe7,0x05,0xff,0x9d,0xe9,0x08,0xff,0x9d,0xe9,0x05,0xff,0x9e,0xe9,0x08,
+ 0xff,0x9d,0xe9,0x06,0xff,0x99,0xe7,0x07,0xff,0x8c,0xdd,0x00,0xff,0x93,0x89,
+ 0xd9,0x00,0xff,0x04,0x88,0xd7,0x01,0xff,0x88,0xd7,0x00,0xff,0x7c,0xbd,0x0a,
+ 0xff,0x70,0xa1,0x19,0xff,0x8f,0x70,0xa1,0x1b,0xff,0x0c,0x70,0xa4,0x18,0xff,
+ 0x80,0xc6,0x07,0xff,0xa5,0xf1,0x18,0xff,0xd7,0xff,0x49,0xff,0xe3,0xff,0x4f,
+ 0xff,0xe4,0xff,0x61,0xff,0xe4,0xff,0x4f,0xff,0xe4,0xff,0x5b,0xff,0xdb,0xff,
+ 0x55,0xff,0x93,0xe9,0x00,0xff,0x7d,0xc2,0x07,0xff,0x70,0xa4,0x18,0xff,0x8f,
+ 0x70,0xa1,0x1b,0xff,0x06,0x70,0xa1,0x19,0xff,0x7c,0xbd,0x0a,0xff,0x88,0xd7,
+ 0x00,0xff,0x86,0xd5,0x00,0xff,0x73,0xa0,0x23,0xff,0x65,0x6c,0x59,0xff,0x8f,
+ 0x68,0x6c,0x5f,0xff,0x0c,0x66,0x6e,0x57,0xff,0x6e,0x95,0x2a,0xff,0x90,0xc9,
+ 0x2b,0xff,0xc4,0xf2,0x5e,0xff,0xd5,0xfe,0x69,0xff,0xe0,0xff,0x7e,0xff,0xd9,
+ 0xff,0x69,0xff,0xde,0xff,0x77,0xff,0xce,0xf6,0x6e,0xff,0x7f,0xbc,0x16,0xff,
+ 0x6b,0x92,0x29,0xff,0x66,0x6e,0x57,0xff,0x8f,0x68,0x6c,0x5f,0xff,0x08,0x65,
+ 0x6c,0x59,0xff,0x73,0xa0,0x23,0xff,0x86,0xd5,0x00,0xff,0x85,0xd3,0x00,0xff,
+ 0x74,0x9f,0x29,0xff,0x6b,0x6d,0x67,0xff,0x6d,0x6d,0x6e,0xff,0x6b,0x6b,0x6c,
+ 0xff,0x8f,0x6a,0x6a,0x6b,0xff,0x08,0x6c,0x6b,0x6c,0xff,0x70,0x6f,0x70,0xff,
+ 0x72,0x72,0x73,0xff,0x74,0x73,0x74,0xff,0x73,0x73,0x74,0xff,0x74,0x73,0x74,
+ 0xff,0x72,0x71,0x72,0xff,0x6c,0x6b,0x6c,0xff,0x8f,0x6a,0x6a,0x6b,0xff,0x7f,
+ 0x6c,0x6b,0x6c,0xff,0x6d,0x6d,0x6e,0xff,0x6b,0x6d,0x67,0xff,0x74,0x9f,0x29,
+ 0xff,0x85,0xd3,0x00,0xff,0x84,0xd1,0x00,0xff,0x73,0x9e,0x2a,0xff,0x6b,0x6d,
+ 0x68,0xff,0x6b,0x69,0x6b,0xff,0x6f,0x58,0x67,0xff,0x88,0x56,0x74,0xff,0x7c,
+ 0x52,0x6b,0xff,0x80,0x55,0x6c,0xff,0x8c,0x55,0x72,0xff,0x70,0x51,0x60,0xff,
+ 0x8c,0x55,0x6d,0xff,0x70,0x51,0x5f,0xff,0x8c,0x56,0x6a,0xff,0x80,0x55,0x64,
+ 0xff,0x7c,0x52,0x60,0xff,0x89,0x57,0x64,0xff,0x79,0x53,0x5c,0xff,0x86,0x57,
+ 0x60,0xff,0x83,0x55,0x5c,0xff,0x79,0x54,0x58,0xff,0x8c,0x57,0x5b,0xff,0x70,
+ 0x54,0x55,0xff,0x8c,0x5b,0x5a,0xff,0x79,0x58,0x56,0xff,0x83,0x5b,0x57,0xff,
+ 0x86,0x5d,0x58,0xff,0x76,0x59,0x53,0xff,0x8c,0x63,0x58,0xff,0x79,0x5d,0x54,
+ 0xff,0x83,0x62,0x55,0xff,0x83,0x63,0x54,0xff,0x79,0x62,0x53,0xff,0x8c,0x6c,
+ 0x58,0xff,0x76,0x62,0x52,0xff,0x86,0x6d,0x55,0xff,0x83,0x6c,0x54,0xff,0x79,
+ 0x68,0x54,0xff,0x8c,0x76,0x57,0xff,0x70,0x65,0x52,0xff,0x8c,0x79,0x55,0xff,
+ 0x79,0x6d,0x53,0xff,0x82,0x75,0x54,0xff,0x85,0x78,0x56,0xff,0x6c,0x67,0x5c,
+ 0xff,0x6c,0x6b,0x6d,0xff,0x6b,0x6d,0x68,0xff,0x73,0x9e,0x2a,0xff,0x84,0xd1,
+ 0x00,0xff,0x82,0xcf,0x00,0xff,0x73,0x9e,0x2a,0xff,0x6c,0x6e,0x69,0xff,0x69,
+ 0x68,0x69,0xff,0x87,0x51,0x74,0xff,0xe0,0x77,0xb8,0xff,0xc4,0x63,0x9b,0xff,
+ 0xcc,0x6f,0xa2,0xff,0xed,0x7c,0xb8,0xff,0xa3,0x5b,0x7e,0xff,0xed,0x79,0xad,
+ 0xff,0xa3,0x5b,0x7a,0xff,0xed,0x7d,0xa7,0xff,0xcc,0x6f,0x90,0xff,0xc4,0x64,
+ 0x81,0xff,0xe5,0x7e,0x9a,0xff,0xbc,0x61,0x77,0xff,0xdd,0x7c,0x8f,0xff,0xd4,
+ 0x73,0x81,0xff,0xbc,0x69,0x72,0xff,0xed,0x80,0x88,0xff,0xa3,0x60,0x62,0xff,
+ 0xed,0x89,0x88,0xff,0xbc,0x6e,0x6a,0xff,0xd5,0x7c,0x73,0xff,0xdd,0x86,0x79,
+ 0xff,0xb4,0x6d,0x5f,0xff,0xed,0x9b,0x84,0xff,0xbc,0x7c,0x67,0xff,0xd4,0x8d,
+ 0x71,0xff,0xd4,0x91,0x70,0xff,0xbc,0x86,0x66,0xff,0xed,0xae,0x82,0xff,0xb4,
+ 0x84,0x5d,0xff,0xdd,0xa8,0x75,0xff,0xd5,0xa4,0x6e,0xff,0xbc,0x95,0x64,0xff,
+ 0xec,0xc0,0x7f,0xff,0xa3,0x88,0x5b,0xff,0xec,0xc6,0x79,0xff,0xbb,0xa0,0x65,
+ 0xff,0xd4,0xb8,0x6f,0xff,0xd5,0xbc,0x74,0xff,0x78,0x6f,0x52,0xff,0x6c,0x6b,
+ 0x6c,0xff,0x6c,0x6e,0x69,0xff,0x73,0x9e,0x2a,0xff,0x82,0xcf,0x00,0xff,0x81,
+ 0xcd,0x00,0xff,0x74,0x9f,0x2a,0xff,0x6d,0x70,0x69,0xff,0x6a,0x68,0x6a,0xff,
+ 0x7d,0x4f,0x6d,0xff,0xc6,0x64,0xa3,0xff,0xb4,0x59,0x91,0xff,0xbb,0x61,0x95,
+ 0xff,0xd3,0x68,0xa3,0xff,0x9d,0x57,0x7b,0xff,0xd4,0x67,0x9a,0xff,0x9d,0x57,
+ 0x76,0xff,0xd4,0x69,0x93,0xff,0xbb,0x62,0x82,0xff,0xb5,0x5a,0x78,0xff,0xce,
+ 0x6a,0x87,0xff,0xaf,0x5a,0x6f,0xff,0xc8,0x6a,0x7d,0xff,0xc1,0x64,0x74,0xff,
+ 0xaf,0x61,0x6a,0xff,0xd4,0x6c,0x76,0xff,0x9d,0x5d,0x5f,0xff,0xd4,0x74,0x74,
+ 0xff,0xaf,0x65,0x62,0xff,0xc1,0x6f,0x65,0xff,0xc7,0x76,0x69,0xff,0x7f,0xa9,
+ 0x67,0x59,0xff,0xd4,0x85,0x6f,0xff,0xaf,0x73,0x5e,0xff,0xc2,0x80,0x62,0xff,
+ 0xc2,0x83,0x62,0xff,0xaf,0x7d,0x5d,0xff,0xd4,0x98,0x6d,0xff,0xa9,0x7e,0x56,
+ 0xff,0xc7,0x97,0x64,0xff,0xc1,0x95,0x60,0xff,0xaf,0x8d,0x5b,0xff,0xd3,0xab,
+ 0x6a,0xff,0x9d,0x84,0x57,0xff,0xd3,0xb0,0x67,0xff,0xaf,0x96,0x5c,0xff,0xc0,
+ 0xa7,0x61,0xff,0xbd,0xa8,0x63,0xff,0x72,0x6a,0x52,0xff,0x6c,0x6c,0x6d,0xff,
+ 0x6d,0x70,0x69,0xff,0x74,0x9f,0x2a,0xff,0x81,0xcd,0x00,0xff,0x80,0xcb,0x00,
+ 0xff,0x74,0x9f,0x2a,0xff,0x6e,0x71,0x6a,0xff,0x6b,0x69,0x6b,0xff,0x80,0x51,
+ 0x72,0xff,0xce,0x70,0xaf,0xff,0xbb,0x61,0x9a,0xff,0xc1,0x6b,0x9f,0xff,0xdc,
+ 0x75,0xb0,0xff,0xa1,0x5c,0x81,0xff,0xdc,0x73,0xa8,0xff,0xa1,0x5c,0x7c,0xff,
+ 0xdc,0x76,0xa1,0xff,0xc2,0x6b,0x8d,0xff,0xbb,0x62,0x81,0xff,0xd6,0x77,0x94,
+ 0xff,0xb5,0x61,0x77,0xff,0xcf,0x76,0x8a,0xff,0xc8,0x6f,0x7f,0xff,0xb5,0x68,
+ 0x71,0xff,0xdc,0x79,0x83,0xff,0xa1,0x61,0x64,0xff,0xdc,0x82,0x81,0xff,0xb5,
+ 0x6c,0x69,0xff,0xc9,0x79,0x6f,0xff,0xcf,0x81,0x74,0xff,0xaf,0x6e,0x5f,0xff,
+ 0xdc,0x92,0x7c,0xff,0xb5,0x7b,0x65,0xff,0xc8,0x8a,0x6c,0xff,0xc8,0x8d,0x6c,
+ 0xff,0xb5,0x85,0x64,0xff,0xdc,0xa6,0x7a,0xff,0xae,0x85,0x5c,0xff,0xcf,0xa3,
+ 0x70,0xff,0xc8,0xa0,0x6a,0xff,0xb4,0x94,0x62,0xff,0xdc,0xb8,0x77,0xff,0xa1,
+ 0x8a,0x5c,0xff,0xdc,0xbd,0x73,0xff,0xb4,0x9f,0x64,0xff,0xc7,0xb2,0x6b,0xff,
+ 0xc5,0xb2,0x6d,0xff,0x74,0x6d,0x53,0xff,0x6d,0x6d,0x6e,0xff,0x6e,0x71,0x6a,
+ 0xff,0x74,0x9f,0x2a,0xff,0x80,0xcb,0x00,0xff,0x7f,0xc9,0x00,0xff,0x75,0x9f,
+ 0x2b,0xff,0x6f,0x71,0x6b,0xff,0x6b,0x69,0x6c,0xff,0x8d,0x52,0x7c,0xff,0xef,
+ 0x7d,0xcc,0xff,0xd3,0x68,0xae,0xff,0xdc,0x75,0xb5,0xff,0xfe,0x84,0xcd,0xff,
+ 0xb0,0x60,0x8d,0xff,0xfe,0x81,0xc2,0xff,0xb0,0x60,0x87,0xff,0xfe,0x85,0xba,
+ 0xff,0xdc,0x76,0x9f,0xff,0xd4,0x69,0x90,0xff,0xf7,0x86,0xaa,0xff,0xcb,0x67,
+ 0x82,0xff,0xee,0x84,0x9c,0xff,0xe5,0x7a,0x8e,0xff,0xcb,0x70,0x7d,0xff,0xff,
+ 0x89,0x95,0xff,0xb1,0x66,0x6a,0xff,0xff,0x94,0x93,0xff,0xcb,0x76,0x72,0xff,
+ 0xe6,0x87,0x7b,0xff,0xee,0x92,0x82,0xff,0xc2,0x77,0x65,0xff,0xff,0xa9,0x8d,
+ 0xff,0xcb,0x88,0x6d,0xff,0xe4,0x9c,0x77,0xff,0xe4,0xa0,0x77,0xff,0xca,0x94,
+ 0x6c,0xff,0xfe,0xc0,0x8a,0xff,0xc2,0x93,0x62,0xff,0xed,0xbb,0x7c,0xff,0xe5,
+ 0xb6,0x74,0xff,0xca,0xa6,0x69,0xff,0xfe,0xd6,0x87,0xff,0xb0,0x98,0x60,0xff,
+ 0xfd,0xdc,0x81,0xff,0xca,0xb3,0x6b,0xff,0xe3,0xcc,0x76,0xff,0xe3,0xd0,0x7b,
+ 0xff,0x7d,0x75,0x54,0xff,0x6e,0x6d,0x6e,0xff,0x6f,0x71,0x6b,0xff,0x75,0x9f,
+ 0x2b,0xff,0x7f,0xc9,0x00,0xff,0x7e,0xc6,0x00,0xff,0x75,0x9f,0x2b,0xff,0x71,
+ 0x73,0x6c,0xff,0x6c,0x6a,0x6d,0xff,0x71,0x4f,0x69,0xff,0xa5,0x5c,0x91,0xff,
+ 0x9d,0x57,0x87,0xff,0xa1,0x5c,0x89,0xff,0xb0,0x60,0x93,0xff,0x7f,0x8d,0x55,
+ 0x76,0xff,0xb0,0x5f,0x8c,0xff,0x8d,0x55,0x73,0xff,0xb0,0x61,0x86,0xff,0xa1,
+ 0x5c,0x7a,0xff,0x9d,0x58,0x73,0xff,0xad,0x62,0x7b,0xff,0x99,0x58,0x6c,0xff,
+ 0xa9,0x61,0x74,0xff,0xa5,0x5f,0x6d,0xff,0x9a,0x5c,0x65,0xff,0xb1,0x64,0x6d,
+ 0xff,0x8d,0x5b,0x5d,0xff,0xb0,0x6a,0x6b,0xff,0x99,0x61,0x5e,0xff,0xa5,0x68,
+ 0x60,0xff,0xa9,0x6e,0x62,0xff,0x95,0x65,0x58,0xff,0xb1,0x79,0x64,0xff,0x99,
+ 0x6d,0x5a,0xff,0xa4,0x76,0x5d,0xff,0xa4,0x79,0x5c,0xff,0x99,0x76,0x59,0xff,
+ 0xb1,0x89,0x63,0xff,0x95,0x78,0x56,0xff,0xa9,0x89,0x5e,0xff,0xa5,0x89,0x5b,
+ 0xff,0x98,0x83,0x58,0xff,0xb0,0x98,0x61,0xff,0x8d,0x7d,0x55,0xff,0xb0,0x9c,
+ 0x5f,0xff,0x98,0x8a,0x58,0xff,0xa3,0x96,0x5b,0xff,0x9d,0x93,0x5b,0xff,0x6a,
+ 0x67,0x54,0xff,0x6f,0x6e,0x70,0xff,0x71,0x73,0x6c,0xff,0x75,0x9f,0x2b,0xff,
+ 0x7e,0xc6,0x00,0xff,0x7d,0xc4,0x00,0xff,0x75,0x9f,0x2c,0xff,0x72,0x75,0x6d,
+ 0xff,0x6d,0x6c,0x6e,0xff,0x8f,0x53,0x81,0xff,0xef,0x7b,0xd1,0xff,0xd3,0x67,
+ 0xb3,0xff,0xdc,0x73,0xba,0xff,0xfe,0x81,0xd3,0xff,0xb0,0x5f,0x91,0xff,0xfe,
+ 0x7e,0xc8,0xff,0xb0,0x5f,0x8b,0xff,0xfe,0x82,0xbf,0xff,0xdc,0x74,0xa4,0xff,
+ 0xd3,0x68,0x94,0xff,0xf6,0x84,0xad,0xff,0xcb,0x66,0x86,0xff,0xed,0x82,0x9f,
+ 0xff,0xe4,0x78,0x91,0xff,0xca,0x6e,0x7e,0xff,0xfe,0x87,0x96,0xff,0xb0,0x67,
+ 0x6b,0xff,0xfe,0x93,0x94,0xff,0xca,0x76,0x72,0xff,0xe5,0x87,0x7b,0xff,0xed,
+ 0x93,0x81,0xff,0xc2,0x79,0x64,0xff,0xfe,0xab,0x8b,0xff,0xca,0x8a,0x6c,0xff,
+ 0xe4,0x9f,0x75,0xff,0xe4,0xa4,0x75,0xff,0xca,0x98,0x6a,0xff,0xfe,0xc4,0x87,
+ 0xff,0xc2,0x97,0x60,0xff,0xed,0xbf,0x7a,0xff,0xe4,0xbb,0x72,0xff,0xc9,0xab,
+ 0x67,0xff,0xfd,0xdb,0x84,0xff,0xb0,0x9b,0x5f,0xff,0xfd,0xe1,0x7e,0xff,0xc9,
+ 0xb6,0x69,0xff,0xe2,0xd0,0x74,0xff,0xe2,0xd4,0x79,0xff,0x7e,0x79,0x56,0xff,
+ 0x70,0x70,0x70,0xff,0x72,0x75,0x6d,0xff,0x75,0x9f,0x2c,0xff,0x7d,0xc4,0x00,
+ 0xff,0x7b,0xc2,0x00,0xff,0x75,0x9f,0x2c,0xff,0x72,0x75,0x6d,0xff,0x6d,0x6c,
+ 0x6f,0xff,0x72,0x51,0x6b,0xff,0xa5,0x5d,0x94,0xff,0x9c,0x57,0x8a,0xff,0xa0,
+ 0x5c,0x8c,0xff,0xb0,0x60,0x96,0xff,0x8e,0x55,0x79,0xff,0xb0,0x5f,0x8f,0xff,
+ 0x8e,0x56,0x75,0xff,0xb0,0x60,0x8a,0xff,0xa1,0x5c,0x7e,0xff,0x9d,0x59,0x76,
+ 0xff,0xad,0x62,0x7f,0xff,0x99,0x58,0x6e,0xff,0xa9,0x62,0x77,0xff,0xa4,0x5f,
+ 0x70,0xff,0x99,0x5c,0x67,0xff,0xb0,0x64,0x6f,0xff,0x8d,0x5b,0x5e,0xff,0xb0,
+ 0x6b,0x6b,0xff,0x99,0x63,0x60,0xff,0xa5,0x6a,0x61,0xff,0xa9,0x6f,0x63,0xff,
+ 0x95,0x66,0x59,0xff,0xb1,0x7b,0x65,0xff,0x99,0x6f,0x5a,0xff,0xa4,0x79,0x5d,
+ 0xff,0xa5,0x7c,0x5c,0xff,0x99,0x78,0x59,0xff,0xb1,0x8c,0x63,0xff,0x95,0x7a,
+ 0x56,0xff,0xa9,0x8c,0x5e,0xff,0xa5,0x8c,0x5b,0xff,0x98,0x85,0x58,0xff,0xaf,
+ 0x9b,0x61,0xff,0x8d,0x7f,0x55,0xff,0xaf,0x9f,0x5f,0xff,0x7f,0x98,0x8c,0x58,
+ 0xff,0xa3,0x98,0x5b,0xff,0x9d,0x95,0x5b,0xff,0x6b,0x69,0x55,0xff,0x70,0x70,
+ 0x71,0xff,0x72,0x75,0x6d,0xff,0x75,0x9f,0x2c,0xff,0x7b,0xc2,0x00,0xff,0x7a,
+ 0xc0,0x00,0xff,0x75,0xa0,0x2c,0xff,0x73,0x77,0x6f,0xff,0x6e,0x6d,0x70,0xff,
+ 0x90,0x55,0x85,0xff,0xee,0x7e,0xd7,0xff,0xd1,0x68,0xb9,0xff,0xda,0x75,0xc0,
+ 0xff,0xfd,0x84,0xdb,0xff,0xaf,0x60,0x95,0xff,0xfd,0x81,0xd1,0xff,0xaf,0x60,
+ 0x90,0xff,0xfd,0x85,0xc8,0xff,0xdb,0x75,0xab,0xff,0xd3,0x69,0x9b,0xff,0xf5,
+ 0x87,0xb4,0xff,0xca,0x67,0x8c,0xff,0xed,0x85,0xa6,0xff,0xe4,0x7b,0x97,0xff,
+ 0xca,0x71,0x83,0xff,0xfe,0x8c,0x9d,0xff,0xb0,0x69,0x6e,0xff,0xfe,0x97,0x99,
+ 0xff,0xca,0x7a,0x76,0xff,0xe4,0x8c,0x7f,0xff,0xed,0x98,0x85,0xff,0xc2,0x7d,
+ 0x67,0xff,0xfe,0xb1,0x8e,0xff,0xca,0x8f,0x6e,0xff,0xe3,0xa5,0x78,0xff,0xe3,
+ 0xaa,0x78,0xff,0xc9,0x9d,0x6c,0xff,0xfd,0xcc,0x8a,0xff,0xc1,0x9c,0x62,0xff,
+ 0xec,0xc5,0x7d,0xff,0xe3,0xc1,0x74,0xff,0xc8,0xb0,0x69,0xff,0xfb,0xe1,0x87,
+ 0xff,0xae,0x9f,0x60,0xff,0xfb,0xe7,0x81,0xff,0xc7,0xba,0x6b,0xff,0xe0,0xd5,
+ 0x76,0xff,0xe1,0xd8,0x7b,0xff,0x7e,0x7b,0x57,0xff,0x6f,0x6f,0x70,0xff,0x71,
+ 0x75,0x6c,0xff,0x74,0x9e,0x2b,0xff,0x7a,0xc0,0x00,0xff,0x79,0xbe,0x00,0xff,
+ 0x75,0xa0,0x2c,0xff,0x74,0x78,0x6f,0xff,0x6f,0x6e,0x70,0xff,0x83,0x56,0x7d,
+ 0xff,0xcc,0x71,0xbd,0xff,0xb9,0x61,0xa7,0xff,0xc0,0x6b,0xac,0xff,0xda,0x75,
+ 0xc0,0xff,0xa1,0x5c,0x8c,0xff,0xdb,0x73,0xb8,0xff,0xa1,0x5c,0x88,0xff,0xdb,
+ 0x76,0xb1,0xff,0xc1,0x6c,0x9a,0xff,0xba,0x63,0x8e,0xff,0xd5,0x78,0xa1,0xff,
+ 0xb4,0x62,0x82,0xff,0xce,0x77,0x95,0xff,0xc8,0x70,0x89,0xff,0xb4,0x6a,0x7a,
+ 0xff,0xdb,0x7d,0x8c,0xff,0xa1,0x65,0x69,0xff,0xdb,0x86,0x89,0xff,0xb4,0x72,
+ 0x6e,0xff,0xc8,0x7f,0x74,0xff,0xce,0x89,0x78,0xff,0xae,0x76,0x62,0xff,0xdb,
+ 0x9d,0x7e,0xff,0xb4,0x84,0x66,0xff,0xc7,0x95,0x6e,0xff,0xc7,0x9a,0x6d,0xff,
+ 0xb4,0x90,0x65,0xff,0xda,0xb4,0x7a,0xff,0xad,0x91,0x5d,0xff,0xcd,0xb0,0x70,
+ 0xff,0xc6,0xad,0x6a,0xff,0xb2,0xa0,0x62,0xff,0xd9,0xc6,0x77,0xff,0x9f,0x93,
+ 0x5c,0xff,0xd7,0xca,0x72,0xff,0xb0,0xa8,0x62,0xff,0xc3,0xbc,0x6a,0xff,0xc0,
+ 0xbb,0x6d,0xff,0x73,0x72,0x54,0xff,0x6b,0x6b,0x6c,0xff,0x6c,0x70,0x67,0xff,
+ 0x72,0x9c,0x29,0xff,0x79,0xbe,0x00,0xff,0x77,0xbc,0x00,0xff,0x76,0xa0,0x2c,
+ 0xff,0x75,0x79,0x6f,0xff,0x70,0x6f,0x71,0xff,0x80,0x54,0x7b,0xff,0xc4,0x65,
+ 0xb6,0xff,0xb1,0x59,0xa3,0xff,0xb8,0x61,0xa7,0xff,0xd0,0x68,0xb8,0xff,0x9b,
+ 0x57,0x89,0xff,0xd1,0x67,0xb1,0xff,0x9c,0x58,0x85,0xff,0xd2,0x69,0xa9,0xff,
+ 0xba,0x63,0x94,0xff,0xb3,0x5b,0x8a,0xff,0xcc,0x6c,0x99,0xff,0xad,0x5b,0x7e,
+ 0xff,0xc6,0x6c,0x8d,0xff,0xc0,0x67,0x82,0xff,0xae,0x63,0x75,0xff,0xd2,0x72,
+ 0x82,0xff,0x9c,0x61,0x66,0xff,0xd2,0x7b,0x7e,0xff,0x7f,0xae,0x6b,0x68,0xff,
+ 0xc0,0x77,0x6c,0xff,0xc6,0x80,0x6e,0xff,0xa8,0x71,0x5d,0xff,0xd2,0x93,0x72,
+ 0xff,0xae,0x7f,0x60,0xff,0xbf,0x8e,0x64,0xff,0xbf,0x93,0x63,0xff,0xad,0x8c,
+ 0x5e,0xff,0xd1,0xab,0x6d,0xff,0xa6,0x8d,0x57,0xff,0xc4,0xa9,0x65,0xff,0xbd,
+ 0xa7,0x60,0xff,0xab,0x9c,0x5b,0xff,0xce,0xbd,0x6a,0xff,0x98,0x8e,0x55,0xff,
+ 0xcd,0xc3,0x66,0xff,0xa7,0xa1,0x58,0xff,0xb8,0xb4,0x5e,0xff,0xb5,0xb3,0x61,
+ 0xff,0x6c,0x6c,0x50,0xff,0x66,0x66,0x66,0xff,0x67,0x6b,0x61,0xff,0x70,0x9a,
+ 0x27,0xff,0x77,0xbc,0x00,0xff,0x76,0xba,0x00,0xff,0x76,0xa0,0x2d,0xff,0x76,
+ 0x7a,0x70,0xff,0x71,0x70,0x72,0xff,0x8e,0x59,0x89,0xff,0xe3,0x7f,0xd9,0xff,
+ 0xc9,0x69,0xbc,0xff,0xd2,0x76,0xc3,0xff,0xf1,0x84,0xdd,0xff,0xaa,0x61,0x9a,
+ 0xff,0xf2,0x82,0xd5,0xff,0xab,0x61,0x95,0xff,0xf3,0x85,0xcd,0xff,0xd3,0x76,
+ 0xb0,0xff,0xcb,0x6b,0xa1,0xff,0xeb,0x87,0xbb,0xff,0xc3,0x69,0x92,0xff,0xe3,
+ 0x86,0xac,0xff,0xdb,0x7d,0x9d,0xff,0xc3,0x74,0x89,0xff,0xf3,0x8f,0xa3,0xff,
+ 0xab,0x6c,0x72,0xff,0xf3,0x9a,0x9e,0xff,0xc3,0x7d,0x7a,0xff,0xdb,0x90,0x83,
+ 0xff,0xe3,0x9d,0x88,0xff,0xbb,0x82,0x6a,0xff,0xf3,0xb5,0x90,0xff,0xc2,0x93,
+ 0x70,0xff,0xda,0xaa,0x7a,0xff,0xda,0xb0,0x79,0xff,0xc2,0xa2,0x6d,0xff,0xf2,
+ 0xcf,0x8b,0xff,0xb8,0xa0,0x62,0xff,0xe0,0xc8,0x7c,0xff,0xd6,0xc3,0x74,0xff,
+ 0xbd,0xb0,0x67,0xff,0xee,0xe2,0x86,0xff,0xa2,0x9b,0x59,0xff,0xed,0xe6,0x80,
+ 0xff,0xb8,0xb5,0x64,0xff,0xd1,0xd1,0x72,0xff,0xd2,0xd4,0x79,0xff,0x6e,0x6f,
+ 0x4b,0xff,0x5c,0x5c,0x5e,0xff,0x5e,0x62,0x58,0xff,0x6b,0x96,0x23,0xff,0x76,
+ 0xba,0x00,0xff,0x75,0xb8,0x00,0xff,0x76,0xa0,0x2d,0xff,0x76,0x7a,0x71,0xff,
+ 0x71,0x70,0x72,0xff,0x7e,0x56,0x7c,0xff,0xb9,0x63,0xb3,0xff,0xa9,0x58,0xa2,
+ 0xff,0xb0,0x5f,0xa6,0xff,0xc6,0x65,0xb6,0xff,0x96,0x57,0x89,0xff,0xc6,0x64,
+ 0xb0,0xff,0x97,0x57,0x86,0xff,0xc6,0x66,0xa9,0xff,0xb2,0x60,0x96,0xff,0xac,
+ 0x5a,0x8b,0xff,0xc2,0x69,0x99,0xff,0xa7,0x5a,0x80,0xff,0xbd,0x6a,0x8e,0xff,
+ 0xb7,0x65,0x83,0xff,0xa7,0x62,0x76,0xff,0xc8,0x70,0x83,0xff,0x96,0x61,0x68,
+ 0xff,0xc8,0x79,0x7d,0xff,0xa7,0x6c,0x69,0xff,0xb7,0x77,0x6c,0xff,0xbc,0x80,
+ 0x6d,0xff,0xa1,0x72,0x5d,0xff,0xc7,0x92,0x6f,0xff,0xa6,0x7f,0x5e,0xff,0xb5,
+ 0x8e,0x61,0xff,0xb4,0x91,0x5f,0xff,0xa3,0x8a,0x59,0xff,0xc3,0xa7,0x67,0xff,
+ 0x9a,0x89,0x50,0xff,0xb5,0xa3,0x5d,0xff,0xad,0x9f,0x57,0xff,0x9b,0x93,0x50,
+ 0xff,0xbd,0xb5,0x5f,0xff,0x86,0x83,0x47,0xff,0xb9,0xb7,0x5a,0xff,0x94,0x94,
+ 0x4b,0xff,0xa4,0xa7,0x51,0xff,0xa0,0xa5,0x52,0xff,0x58,0x5a,0x3e,0xff,0x4f,
+ 0x4f,0x50,0xff,0x51,0x55,0x4b,0xff,0x66,0x90,0x1d,0xff,0x75,0xb8,0x00,0xff,
+ 0x74,0xb6,0x00,0xff,0x76,0xa0,0x2d,0xff,0x77,0x7c,0x71,0xff,0x72,0x71,0x73,
+ 0xff,0x8a,0x5b,0x8a,0xff,0xd8,0x7d,0xd5,0xff,0x7f,0xc0,0x67,0xbb,0xff,0xc8,
+ 0x73,0xc1,0xff,0xe6,0x81,0xdb,0xff,0xa4,0x60,0x9a,0xff,0xe6,0x7f,0xd4,0xff,
+ 0xa4,0x60,0x96,0xff,0xe7,0x82,0xcd,0xff,0xca,0x75,0xb1,0xff,0xc2,0x6a,0xa3,
+ 0xff,0xe1,0x85,0xbb,0xff,0xbb,0x69,0x95,0xff,0xd9,0x84,0xac,0xff,0xd1,0x7c,
+ 0x9e,0xff,0xbc,0x74,0x8a,0xff,0xe8,0x8d,0xa3,0xff,0xa5,0x6d,0x74,0xff,0xe8,
+ 0x9a,0x9d,0xff,0xbb,0x7e,0x7b,0xff,0xd1,0x90,0x83,0xff,0xd9,0x9c,0x87,0xff,
+ 0xb2,0x82,0x69,0xff,0xe7,0xb4,0x8e,0xff,0xb8,0x92,0x6d,0xff,0xcf,0xa9,0x77,
+ 0xff,0xcd,0xae,0x75,0xff,0xb5,0x9e,0x67,0xff,0xe4,0xcd,0x87,0xff,0xaa,0x9a,
+ 0x5a,0xff,0xd3,0xc4,0x76,0xff,0xc8,0xbe,0x6d,0xff,0xae,0xa8,0x5e,0xff,0xe0,
+ 0xdc,0x81,0xff,0x91,0x90,0x4c,0xff,0xdd,0xe0,0x7a,0xff,0xa4,0xa8,0x55,0xff,
+ 0xbf,0xc6,0x67,0xff,0xc1,0xc9,0x6f,0xff,0x59,0x5d,0x38,0xff,0x47,0x47,0x48,
+ 0xff,0x4d,0x51,0x47,0xff,0x65,0x8f,0x1c,0xff,0x74,0xb6,0x00,0xff,0x73,0xb4,
+ 0x00,0xff,0x76,0xa4,0x27,0xff,0x79,0x82,0x6a,0xff,0x73,0x72,0x74,0xff,0x87,
+ 0x59,0x88,0xff,0xcd,0x72,0xcf,0xff,0xb7,0x61,0xb6,0xff,0xbf,0x6b,0xbd,0xff,
+ 0xda,0x76,0xd4,0xff,0x9e,0x5c,0x98,0xff,0xda,0x75,0xce,0xff,0x9e,0x5c,0x94,
+ 0xff,0xdb,0x77,0xc7,0xff,0xc0,0x6d,0xac,0xff,0xba,0x64,0x9f,0xff,0xd6,0x7b,
+ 0xb5,0xff,0xb4,0x64,0x92,0xff,0xd0,0x7b,0xa6,0xff,0xc8,0x74,0x99,0xff,0xb3,
+ 0x6d,0x86,0xff,0xdc,0x83,0x9c,0xff,0x9e,0x68,0x71,0xff,0xdc,0x8f,0x94,0xff,
+ 0xb1,0x77,0x73,0xff,0xc5,0x88,0x7a,0xff,0xcc,0x93,0x7c,0xff,0xa6,0x7a,0x60,
+ 0xff,0xd8,0xaa,0x81,0xff,0xab,0x89,0x61,0xff,0xc0,0xa0,0x6a,0xff,0xbf,0xa4,
+ 0x67,0xff,0xa7,0x94,0x5a,0xff,0xd3,0xc1,0x76,0xff,0x9a,0x8e,0x4b,0xff,0xc0,
+ 0xb6,0x64,0xff,0xb5,0xaf,0x5a,0xff,0x9a,0x99,0x4a,0xff,0xcd,0xcf,0x6d,0xff,
+ 0x7b,0x7e,0x36,0xff,0xcb,0xd2,0x69,0xff,0x95,0x9d,0x47,0xff,0xae,0xb9,0x58,
+ 0xff,0xb2,0xbe,0x61,0xff,0x55,0x5a,0x38,0xff,0x48,0x48,0x49,0xff,0x54,0x60,
+ 0x40,0xff,0x68,0x95,0x19,0xff,0x73,0xb4,0x00,0xff,0x72,0xb2,0x00,0xff,0x74,
+ 0xaf,0x0b,0xff,0x79,0x9a,0x41,0xff,0x73,0x73,0x75,0xff,0x7e,0x59,0x81,0xff,
+ 0xb4,0x68,0xba,0xff,0xa4,0x5c,0xa8,0xff,0xaa,0x64,0xac,0xff,0xbe,0x6b,0xbe,
+ 0xff,0x91,0x59,0x8f,0xff,0xbf,0x6a,0xba,0xff,0x91,0x59,0x8c,0xff,0xbf,0x6c,
+ 0xb4,0xff,0xab,0x65,0x9f,0xff,0xa6,0x5f,0x95,0xff,0xbc,0x6f,0xa5,0xff,0xa1,
+ 0x5f,0x8a,0xff,0xb6,0x70,0x9a,0xff,0xb0,0x6b,0x8d,0xff,0x9f,0x66,0x7d,0xff,
+ 0xbf,0x77,0x8f,0xff,0x8d,0x60,0x69,0xff,0xbe,0x81,0x86,0xff,0x9b,0x6c,0x6a,
+ 0xff,0xab,0x7b,0x6f,0xff,0xb0,0x84,0x70,0xff,0x91,0x70,0x58,0xff,0xba,0x97,
+ 0x71,0xff,0x93,0x7a,0x55,0xff,0xa4,0x8d,0x5c,0xff,0xa1,0x8f,0x57,0xff,0x8c,
+ 0x80,0x4a,0xff,0xb2,0xa7,0x63,0xff,0x7d,0x78,0x39,0xff,0x9d,0x9b,0x50,0xff,
+ 0x95,0x95,0x47,0xff,0x7f,0x83,0x3a,0xff,0x7f,0xa8,0xaf,0x57,0xff,0x6a,0x71,
+ 0x2e,0xff,0xa6,0xb3,0x54,0xff,0x7d,0x88,0x3b,0xff,0x90,0x9f,0x47,0xff,0x92,
+ 0xa0,0x4e,0xff,0x4d,0x54,0x36,0xff,0x48,0x49,0x4a,0xff,0x6d,0xa1,0x14,0xff,
+ 0x70,0xab,0x07,0xff,0x72,0xb2,0x00,0xff,0x71,0xb2,0x00,0xff,0x78,0xbd,0x00,
+ 0xff,0x82,0xb0,0x30,0xff,0x75,0x75,0x77,0xff,0x8e,0x5d,0x95,0xff,0xdf,0x7d,
+ 0xea,0xff,0xc2,0x67,0xcc,0xff,0xcc,0x73,0xd3,0xff,0xeb,0x82,0xf1,0xff,0xa5,
+ 0x60,0xa5,0xff,0xec,0x7f,0xeb,0xff,0xa5,0x5f,0xa2,0xff,0xed,0x83,0xe4,0xff,
+ 0xcd,0x75,0xc2,0xff,0xc5,0x69,0xb3,0xff,0xe6,0x87,0xcf,0xff,0xbb,0x67,0xa2,
+ 0xff,0xde,0x87,0xbe,0xff,0xd4,0x7e,0xad,0xff,0xba,0x73,0x93,0xff,0xee,0x95,
+ 0xb5,0xff,0x9d,0x68,0x73,0xff,0xee,0xa4,0xab,0xff,0xb6,0x7e,0x7b,0xff,0xd0,
+ 0x98,0x88,0xff,0xd9,0xa6,0x8c,0xff,0xa6,0x7f,0x5f,0xff,0xed,0xc8,0x95,0xff,
+ 0xab,0x91,0x5f,0xff,0xcb,0xb3,0x72,0xff,0xca,0xb8,0x6f,0xff,0xa9,0x9f,0x58,
+ 0xff,0xeb,0xe4,0x8a,0xff,0x9b,0x9a,0x49,0xff,0xd2,0xd4,0x75,0xff,0xc6,0xcc,
+ 0x69,0xff,0xa5,0xaf,0x53,0xff,0xe5,0xf4,0x85,0xff,0x85,0x91,0x3f,0xff,0xe3,
+ 0xf7,0x7e,0xff,0xa3,0xb5,0x54,0xff,0xc1,0xd8,0x69,0xff,0xc8,0xdf,0x75,0xff,
+ 0x5c,0x66,0x3d,0xff,0x4b,0x4c,0x4d,0xff,0x81,0xcc,0x00,0xff,0x77,0xbc,0x00,
+ 0xff,0x71,0xb1,0x00,0xff,0x75,0xb9,0x00,0xff,0xb7,0xeb,0x47,0xff,0xd7,0xf6,
+ 0x8c,0xff,0x7d,0x7c,0x7e,0xff,0x75,0x5a,0x7b,0xff,0x98,0x5f,0xa5,0xff,0x8e,
+ 0x57,0x99,0xff,0x93,0x5c,0x9c,0xff,0xa1,0x60,0xaa,0xff,0x81,0x53,0x86,0xff,
+ 0x9f,0x5e,0xa5,0xff,0x7f,0x52,0x82,0xff,0x9f,0x5e,0x9f,0xff,0x90,0x58,0x8e,
+ 0xff,0x8a,0x53,0x85,0xff,0x99,0x5d,0x90,0xff,0x84,0x50,0x79,0xff,0x93,0x5d,
+ 0x84,0xff,0x8c,0x58,0x79,0xff,0x7f,0x53,0x6a,0xff,0x96,0x62,0x78,0xff,0x6d,
+ 0x4b,0x53,0xff,0x91,0x66,0x6c,0xff,0x71,0x50,0x4d,0xff,0x7a,0x59,0x4d,0xff,
+ 0x7d,0x60,0x4d,0xff,0x64,0x4f,0x38,0xff,0x86,0x73,0x4e,0xff,0x68,0x5b,0x37,
+ 0xff,0x4e,0x48,0x28,0xff,0x3e,0x3a,0x1f,0xff,0x68,0x67,0x32,0xff,0x84,0x86,
+ 0x45,0xff,0x62,0x67,0x2d,0xff,0x7a,0x82,0x3c,0xff,0x74,0x7e,0x37,0xff,0x65,
+ 0x71,0x2f,0xff,0x81,0x91,0x41,0xff,0x57,0x64,0x27,0xff,0x7f,0x93,0x3f,0xff,
+ 0x63,0x74,0x2e,0xff,0x6f,0x84,0x36,0xff,0x70,0x84,0x3c,0xff,0x46,0x4d,0x35,
+ 0xff,0x54,0x54,0x55,0xff,0xe9,0xff,0x80,0xff,0xaf,0xe5,0x35,0xff,0x73,0xb6,
+ 0x00,0xff,0x75,0xb9,0x00,0xff,0xc3,0xef,0x4f,0xff,0xeb,0xff,0x9a,0xff,0x7d,
+ 0x7c,0x7f,0xff,0x8c,0x5f,0x98,0xff,0xd8,0x83,0xee,0xff,0xb8,0x69,0xce,0xff,
+ 0xc3,0x76,0xd5,0xff,0xe3,0x87,0xf6,0xff,0x9a,0x5d,0xa5,0xff,0xe3,0x85,0xf1,
+ 0xff,0x98,0x5a,0xa0,0xff,0xe4,0x8a,0xeb,0xff,0xc2,0x76,0xc5,0xff,0xb6,0x69,
+ 0xb6,0xff,0xdc,0x8d,0xd7,0xff,0xab,0x64,0xa2,0xff,0xd3,0x8b,0xc5,0xff,0xc6,
+ 0x7f,0xb2,0xff,0xa8,0x6e,0x90,0xff,0x7f,0xe4,0x9f,0xc1,0xff,0x85,0x59,0x67,
+ 0xff,0xe5,0xaf,0xb7,0xff,0xa3,0x7a,0x78,0xff,0xc2,0x9c,0x8c,0xff,0xce,0xad,
+ 0x92,0xff,0x96,0x7f,0x5e,0xff,0xe3,0xd2,0x9f,0xff,0xa1,0x96,0x64,0xff,0x65,
+ 0x62,0x3f,0xff,0x00,0x00,0x00,0xff,0xa0,0xa5,0x5d,0xff,0xe1,0xea,0x92,0xff,
+ 0x93,0x9f,0x4d,0xff,0xc9,0xda,0x7a,0xff,0xbc,0xd1,0x6e,0xff,0x9c,0xb2,0x56,
+ 0xff,0xdd,0xf8,0x8b,0xff,0x7d,0x93,0x41,0xff,0xd9,0xfb,0x85,0xff,0x9b,0xb6,
+ 0x57,0xff,0xb9,0xda,0x6d,0xff,0xc1,0xe1,0x7b,0xff,0x5a,0x67,0x3e,0xff,0x56,
+ 0x56,0x57,0xff,0xfd,0xff,0x89,0xff,0xbd,0xe8,0x3b,0xff,0x73,0xb5,0x00,0xff,
+ 0x74,0xb6,0x00,0xff,0xbe,0xec,0x40,0xff,0xe0,0xff,0x88,0xff,0x77,0x76,0x7a,
+ 0xff,0x77,0x59,0x82,0xff,0xa5,0x65,0xbb,0xff,0x92,0x55,0xa6,0xff,0x98,0x5c,
+ 0xab,0xff,0xab,0x63,0xc0,0xff,0x7d,0x4c,0x89,0xff,0xa9,0x61,0xbb,0xff,0x79,
+ 0x49,0x84,0xff,0xa6,0x60,0xb3,0xff,0x8d,0x51,0x96,0xff,0x82,0x45,0x88,0xff,
+ 0x99,0x5a,0x9c,0xff,0x78,0x41,0x77,0xff,0x93,0x5a,0x8e,0xff,0x8b,0x55,0x81,
+ 0xff,0x78,0x4b,0x6a,0xff,0x9e,0x6b,0x89,0xff,0x64,0x44,0x50,0xff,0x9e,0x78,
+ 0x7f,0xff,0x77,0x5b,0x59,0xff,0x89,0x70,0x63,0xff,0x90,0x7c,0x65,0xff,0x6f,
+ 0x62,0x46,0xff,0x9d,0x95,0x69,0xff,0x75,0x72,0x47,0xff,0x88,0x89,0x52,0xff,
+ 0x87,0x8e,0x4f,0xff,0x74,0x7e,0x40,0xff,0x9b,0xaa,0x5d,0xff,0x6c,0x7c,0x37,
+ 0xff,0x8c,0xa1,0x4e,0xff,0x84,0x9b,0x47,0xff,0x71,0x88,0x3b,0xff,0x97,0xb4,
+ 0x56,0xff,0x5e,0x74,0x2f,0xff,0x95,0xb6,0x53,0xff,0x70,0x8c,0x3a,0xff,0x81,
+ 0xa1,0x46,0xff,0x85,0xa4,0x4f,0xff,0x4c,0x57,0x38,0xff,0x54,0x54,0x56,0xff,
+ 0xfa,0xff,0x77,0xff,0xb6,0xe5,0x30,0xff,0x71,0xb3,0x00,0xff,0x73,0xb5,0x00,
+ 0xff,0xc3,0xed,0x57,0xff,0xe9,0xff,0x9d,0xff,0x6f,0x6e,0x71,0xff,0x78,0x55,
+ 0x88,0xff,0xb4,0x6f,0xd4,0xff,0x98,0x57,0xb6,0xff,0xa1,0x61,0xbd,0xff,0xbc,
+ 0x71,0xdc,0xff,0x77,0x44,0x8c,0xff,0xb8,0x6c,0xd6,0xff,0x6e,0x3a,0x81,0xff,
+ 0xb6,0x6d,0xce,0xff,0x96,0x58,0xa8,0xff,0x8b,0x4d,0x9b,0xff,0xaf,0x70,0xbc,
+ 0xff,0x83,0x4c,0x8c,0xff,0xa7,0x72,0xac,0xff,0x9c,0x6a,0x9d,0xff,0x84,0x5c,
+ 0x80,0xff,0xb5,0x86,0xaa,0xff,0x6b,0x50,0x5e,0xff,0xb5,0x95,0x9f,0xff,0x83,
+ 0x6d,0x6c,0xff,0x9a,0x89,0x7b,0xff,0xa3,0x98,0x7f,0xff,0x78,0x74,0x55,0xff,
+ 0xb5,0xb7,0x85,0xff,0x81,0x87,0x57,0xff,0x99,0xa5,0x65,0xff,0x99,0xaa,0x63,
+ 0xff,0x80,0x94,0x4f,0xff,0xb3,0xcc,0x76,0xff,0x76,0x90,0x41,0xff,0xa0,0xc0,
+ 0x62,0xff,0x95,0xb8,0x59,0xff,0x7d,0x9e,0x46,0xff,0xae,0xd8,0x6e,0xff,0x65,
+ 0x84,0x37,0xff,0xac,0xda,0x68,0xff,0x7c,0xa2,0x46,0xff,0x93,0xbe,0x57,0xff,
+ 0x9b,0xc4,0x63,0xff,0x50,0x61,0x3c,0xff,0x53,0x53,0x54,0xff,0xfd,0xff,0x91,
+ 0xff,0xbc,0xe6,0x41,0xff,0x70,0xb2,0x00,0xff,0x71,0xb2,0x00,0xff,0xb8,0xe9,
+ 0x40,0xff,0xcf,0xf5,0x7c,0xff,0x2c,0x5e,0x5e,0x60,0xff,0x6e,0x4c,0x82,0xff,
+ 0xb3,0x72,0xda,0xff,0x91,0x51,0xb5,0xff,0x9b,0x5e,0xbe,0xff,0xbd,0x76,0xe3,
+ 0xff,0x6e,0x3c,0x89,0xff,0xbc,0x76,0xe1,0xff,0x6e,0x3d,0x87,0xff,0xbc,0x7a,
+ 0xdc,0xff,0x9a,0x62,0xb3,0xff,0x8e,0x56,0xa6,0xff,0xb5,0x7e,0xcb,0xff,0x85,
+ 0x55,0x96,0xff,0xac,0x7d,0xb9,0xff,0xa1,0x76,0xaa,0xff,0x87,0x65,0x8a,0xff,
+ 0xba,0x94,0xb9,0xff,0x6c,0x57,0x66,0xff,0xbb,0xa4,0xaf,0xff,0x85,0x77,0x76,
+ 0xff,0x9e,0x96,0x87,0xff,0xa7,0xa6,0x8c,0xff,0x79,0x7d,0x5d,0xff,0xba,0xc6,
+ 0x94,0xff,0x84,0x92,0x60,0xff,0x9d,0xb1,0x71,0xff,0x9d,0xb6,0x6e,0xff,0x83,
+ 0x9d,0x57,0xff,0xb8,0xda,0x83,0xff,0x77,0x98,0x48,0xff,0xa4,0xcc,0x6e,0xff,
+ 0x99,0xc3,0x62,0xff,0x80,0xa7,0x4e,0xff,0xb5,0xe4,0x7a,0xff,0x67,0x8b,0x3c,
+ 0xff,0xb2,0xe6,0x74,0xff,0x80,0xaa,0x4e,0xff,0x98,0xc9,0x60,0xff,0xa1,0xcf,
+ 0x6d,0xff,0x51,0x64,0x3e,0xff,0x50,0x50,0x52,0xff,0xf3,0xff,0x77,0xff,0xb0,
+ 0xe2,0x30,0xff,0x82,0x6f,0xae,0x00,0xff,0x7f,0xae,0xe4,0x40,0xff,0xb9,0xe0,
+ 0x6f,0xff,0x49,0x47,0x4b,0xff,0x51,0x38,0x63,0xff,0x7c,0x48,0xa2,0xff,0x67,
+ 0x34,0x8b,0xff,0x6d,0x3d,0x91,0xff,0x82,0x49,0xab,0xff,0x53,0x2b,0x6f,0xff,
+ 0x81,0x4a,0xa9,0xff,0x53,0x2d,0x6d,0xff,0x82,0x4d,0xa5,0xff,0x6d,0x41,0x8a,
+ 0xff,0x65,0x3b,0x81,0xff,0x7e,0x53,0x98,0xff,0x60,0x3d,0x76,0xff,0x78,0x55,
+ 0x8c,0xff,0x71,0x52,0x81,0xff,0x61,0x4a,0x6c,0xff,0x7f,0x67,0x88,0xff,0x51,
+ 0x45,0x53,0xff,0x80,0x75,0x7e,0xff,0x60,0x5b,0x5a,0xff,0x6e,0x70,0x63,0xff,
+ 0x74,0x7a,0x64,0xff,0x59,0x63,0x48,0xff,0x7f,0x91,0x65,0xff,0x5e,0x71,0x46,
+ 0xff,0x6d,0x87,0x4e,0xff,0x48,0x5c,0x32,0xff,0x31,0x40,0x20,0xff,0x7d,0xa3,
+ 0x55,0xff,0x57,0x79,0x34,0xff,0x71,0x9b,0x47,0xff,0x6b,0x95,0x41,0xff,0x5c,
+ 0x83,0x36,0xff,0x7b,0xab,0x4c,0xff,0x4d,0x71,0x2c,0xff,0x79,0xad,0x48,0xff,
+ 0x5c,0x85,0x34,0xff,0x6a,0x99,0x3d,0xff,0x6f,0x9b,0x46,0xff,0x46,0x55,0x39,
+ 0xff,0x4c,0x4c,0x4d,0xff,0xdd,0xff,0x6e,0xff,0xa5,0xde,0x30,0xff,0x6d,0xab,
+ 0x00,0xff,0x6a,0xa6,0x00,0xff,0x84,0xc2,0x18,0xff,0x82,0xab,0x38,0xff,0x41,
+ 0x3f,0x43,0xff,0x64,0x45,0x81,0xff,0xbc,0x84,0xf0,0xff,0x91,0x5b,0xc4,0xff,
+ 0x9f,0x6d,0xcf,0xff,0xc6,0x8c,0xfc,0xff,0x6d,0x45,0x95,0xff,0xc3,0x8b,0xfa,
+ 0xff,0x6c,0x46,0x93,0xff,0xc4,0x91,0xf7,0xff,0x9e,0x73,0xc8,0xff,0x8e,0x66,
+ 0xba,0xff,0xbc,0x95,0xe5,0xff,0x85,0x64,0xa9,0xff,0xb2,0x95,0xd3,0xff,0xa3,
+ 0x8b,0xc3,0xff,0x86,0x76,0x9e,0xff,0xbf,0xb0,0xd8,0xff,0x69,0x65,0x76,0xff,
+ 0xc2,0xc1,0xce,0xff,0x85,0x8a,0x8a,0xff,0xa1,0xae,0xa0,0xff,0xad,0xc0,0xa6,
+ 0xff,0x78,0x8f,0x6e,0xff,0xc2,0xe2,0xb1,0xff,0x84,0xa4,0x72,0xff,0xa0,0xc9,
+ 0x87,0xff,0x53,0x6b,0x44,0xff,0x00,0x00,0x00,0xff,0xc0,0xf5,0x9d,0xff,0x77,
+ 0xa8,0x55,0xff,0xaa,0xe3,0x83,0xff,0x9d,0xd8,0x75,0xff,0x81,0xb7,0x5c,0xff,
+ 0xbe,0xfd,0x91,0xff,0x67,0x96,0x45,0xff,0xba,0xfe,0x89,0xff,0x82,0xb9,0x5b,
+ 0xff,0x9d,0xdb,0x71,0xff,0xaa,0xe4,0x80,0xff,0x52,0x6a,0x40,0xff,0x43,0x43,
+ 0x44,0xff,0x97,0xd9,0x23,0xff,0x7f,0xbd,0x12,0xff,0x69,0xa5,0x00,0xff,0x67,
+ 0xa2,0x00,0xff,0x68,0xa1,0x06,0xff,0x5b,0x7b,0x24,0xff,0x3e,0x3d,0x40,0xff,
+ 0x4f,0x3a,0x67,0xff,0x7e,0x54,0xae,0xff,0x65,0x3d,0x93,0xff,0x6d,0x47,0x9a,
+ 0xff,0x83,0x58,0xb8,0xff,0x50,0x31,0x76,0xff,0x82,0x58,0xb6,0xff,0x4f,0x33,
+ 0x74,0xff,0x82,0x5d,0xb4,0xff,0x6c,0x4d,0x96,0xff,0x63,0x46,0x8c,0xff,0x7d,
+ 0x62,0xa7,0xff,0x5d,0x48,0x81,0xff,0x77,0x64,0x9b,0xff,0x6e,0x60,0x90,0xff,
+ 0x5d,0x56,0x78,0xff,0x7e,0x79,0x9b,0xff,0x4c,0x4e,0x5d,0xff,0x7f,0x87,0x92,
+ 0xff,0x5c,0x67,0x68,0xff,0x6c,0x7f,0x73,0xff,0x73,0x8b,0x76,0xff,0x55,0x6e,
+ 0x53,0xff,0x7f,0xa3,0x78,0xff,0x5b,0x7d,0x52,0xff,0x6b,0x95,0x5d,0xff,0x6b,
+ 0x98,0x59,0xff,0x5b,0x85,0x48,0xff,0x7f,0x7e,0xb2,0x66,0xff,0x54,0x82,0x3d,
+ 0xff,0x71,0xa7,0x56,0xff,0x6a,0xa1,0x4d,0xff,0x5a,0x8b,0x3f,0xff,0x7d,0xb8,
+ 0x5b,0xff,0x4b,0x76,0x31,0xff,0x7b,0xb9,0x56,0xff,0x5b,0x8d,0x3d,0xff,0x6a,
+ 0xa2,0x49,0xff,0x72,0xa6,0x52,0xff,0x46,0x59,0x3a,0xff,0x3f,0x3f,0x40,0xff,
+ 0x69,0x9c,0x11,0xff,0x68,0xa0,0x06,0xff,0x67,0xa2,0x00,0xff,0x65,0xa0,0x00,
+ 0xff,0x5d,0x87,0x15,0xff,0x46,0x4f,0x38,0xff,0x3c,0x3c,0x3e,0xff,0x55,0x3f,
+ 0x74,0xff,0x93,0x69,0xd0,0xff,0x71,0x4a,0xac,0xff,0x7c,0x57,0xb5,0xff,0x98,
+ 0x6e,0xdb,0xff,0x56,0x3a,0x86,0xff,0x96,0x6e,0xd9,0xff,0x55,0x3b,0x85,0xff,
+ 0x96,0x75,0xd7,0xff,0x7a,0x60,0xb1,0xff,0x6d,0x56,0xa6,0xff,0x90,0x7c,0xc8,
+ 0xff,0x66,0x57,0x98,0xff,0x88,0x7d,0xba,0xff,0x7d,0x77,0xad,0xff,0x68,0x68,
+ 0x8e,0xff,0x91,0x97,0xbe,0xff,0x52,0x5c,0x6d,0xff,0x93,0xa7,0xb4,0xff,0x66,
+ 0x7c,0x7d,0xff,0x7a,0x9a,0x8e,0xff,0x83,0xa9,0x92,0xff,0x5c,0x81,0x64,0xff,
+ 0x93,0xc6,0x97,0xff,0x65,0x92,0x65,0xff,0x7a,0xb1,0x74,0xff,0x7a,0xb4,0x70,
+ 0xff,0x65,0x9c,0x59,0xff,0x93,0xd5,0x81,0xff,0x5b,0x95,0x49,0xff,0x82,0xc6,
+ 0x6c,0xff,0x79,0xbe,0x60,0xff,0x65,0xa1,0x4d,0xff,0x91,0xda,0x74,0xff,0x51,
+ 0x86,0x3a,0xff,0x8e,0xdb,0x6d,0xff,0x65,0xa3,0x4a,0xff,0x7a,0xbf,0x5a,0xff,
+ 0x86,0xc6,0x67,0xff,0x49,0x62,0x3d,0xff,0x3d,0x3d,0x3e,0xff,0x49,0x56,0x35,
+ 0xff,0x5d,0x87,0x15,0xff,0x65,0xa0,0x00,0xff,0x64,0x9e,0x00,0xff,0x59,0x80,
+ 0x17,0xff,0x41,0x45,0x3a,0xff,0x3b,0x3a,0x3d,0xff,0x53,0x40,0x76,0xff,0x8e,
+ 0x6a,0xd0,0xff,0x6d,0x4b,0xad,0xff,0x78,0x58,0xb6,0xff,0x93,0x6f,0xdb,0xff,
+ 0x53,0x3b,0x86,0xff,0x90,0x70,0xda,0xff,0x52,0x3d,0x86,0xff,0x90,0x77,0xd8,
+ 0xff,0x75,0x62,0xb2,0xff,0x69,0x58,0xa7,0xff,0x8a,0x7e,0xcb,0xff,0x61,0x5a,
+ 0x9a,0xff,0x83,0x80,0xbc,0xff,0x77,0x7a,0xaf,0xff,0x63,0x6b,0x91,0xff,0x8a,
+ 0x9b,0xc1,0xff,0x4d,0x5f,0x70,0xff,0x8d,0xab,0xb8,0xff,0x61,0x7f,0x81,0xff,
+ 0x75,0x9d,0x91,0xff,0x7e,0xab,0x96,0xff,0x58,0x84,0x68,0xff,0x8d,0xc7,0x9b,
+ 0xff,0x60,0x95,0x68,0xff,0x74,0xb4,0x78,0xff,0x74,0xb6,0x73,0xff,0x60,0x9d,
+ 0x5c,0xff,0x8d,0xd7,0x84,0xff,0x57,0x97,0x4b,0xff,0x7d,0xc6,0x6e,0xff,0x74,
+ 0xbe,0x62,0xff,0x60,0xa2,0x4e,0xff,0x8c,0xdc,0x75,0xff,0x4d,0x88,0x3b,0xff,
+ 0x89,0xdc,0x6e,0xff,0x61,0xa3,0x4a,0xff,0x76,0xbf,0x5b,0xff,0x82,0xc7,0x68,
+ 0xff,0x48,0x62,0x3e,0xff,0x3c,0x3b,0x3d,0xff,0x41,0x45,0x3a,0xff,0x59,0x80,
+ 0x17,0xff,0x64,0x9e,0x00,0xff,0x63,0x9c,0x00,0xff,0x59,0x7e,0x17,0xff,0x40,
+ 0x44,0x39,0xff,0x3a,0x39,0x3c,0xff,0x4a,0x3c,0x69,0xff,0x71,0x56,0xb0,0xff,
+ 0x57,0x3f,0x95,0xff,0x5f,0x49,0x9c,0xff,0x73,0x5a,0xb9,0xff,0x44,0x33,0x77,
+ 0xff,0x71,0x5c,0xb8,0xff,0x43,0x36,0x76,0xff,0x70,0x62,0xb7,0xff,0x5d,0x53,
+ 0x99,0xff,0x53,0x4c,0x91,0xff,0x7f,0x6c,0x69,0xad,0xff,0x4d,0x4e,0x87,0xff,
+ 0x66,0x6c,0xa1,0xff,0x5d,0x69,0x97,0xff,0x4f,0x5e,0x7f,0xff,0x6b,0x83,0xa4,
+ 0xff,0x3f,0x55,0x64,0xff,0x6e,0x91,0x9c,0xff,0x4d,0x70,0x71,0xff,0x5b,0x87,
+ 0x7e,0xff,0x62,0x92,0x81,0xff,0x46,0x75,0x5d,0xff,0x6e,0xa9,0x83,0xff,0x4d,
+ 0x82,0x5b,0xff,0x5b,0x9a,0x67,0xff,0x5c,0x9c,0x62,0xff,0x4d,0x88,0x50,0xff,
+ 0x6e,0xb5,0x6e,0xff,0x46,0x84,0x43,0xff,0x62,0xa9,0x5b,0xff,0x5b,0xa2,0x53,
+ 0xff,0x4d,0x8c,0x43,0xff,0x6e,0xb9,0x60,0xff,0x3f,0x77,0x34,0xff,0x6b,0xb9,
+ 0x59,0xff,0x4e,0x8d,0x3f,0xff,0x5d,0xa3,0x4a,0xff,0x67,0xa8,0x55,0xff,0x42,
+ 0x5a,0x3c,0xff,0x3b,0x3a,0x3b,0xff,0x40,0x44,0x39,0xff,0x59,0x7e,0x17,0xff,
+ 0x63,0x9c,0x00,0xff,0x61,0x9a,0x00,0xff,0x57,0x7c,0x16,0xff,0x3f,0x42,0x37,
+ 0xff,0x39,0x37,0x3b,0xff,0x58,0x49,0x83,0xff,0xa3,0x88,0xf1,0xff,0x77,0x5f,
+ 0xc5,0xff,0x86,0x70,0xd0,0xff,0xa8,0x90,0xfe,0xff,0x58,0x48,0x97,0xff,0xa4,
+ 0x92,0xfe,0xff,0x57,0x4b,0x96,0xff,0xa5,0x9a,0xfd,0xff,0x82,0x7c,0xce,0xff,
+ 0x72,0x70,0xc1,0xff,0x9e,0xa2,0xee,0xff,0x69,0x70,0xb3,0xff,0x95,0xa2,0xde,
+ 0xff,0x86,0x99,0xcf,0xff,0x6c,0x84,0xab,0xff,0x9e,0xc2,0xe9,0xff,0x52,0x72,
+ 0x83,0xff,0xa3,0xd2,0xe0,0xff,0x69,0x98,0x9b,0xff,0x82,0xbd,0xb3,0xff,0x8e,
+ 0xce,0xba,0xff,0x5d,0x9a,0x7f,0xff,0xa4,0xee,0xc4,0xff,0x6a,0xae,0x81,0xff,
+ 0x83,0xd2,0x97,0xff,0x84,0xd5,0x92,0xff,0x6b,0xb5,0x74,0xff,0xa4,0xfa,0xab,
+ 0xff,0x5d,0xac,0x5f,0xff,0x8f,0xe6,0x8d,0xff,0x83,0xdb,0x7f,0xff,0x6a,0xb9,
+ 0x63,0xff,0xa3,0xfe,0x98,0xff,0x53,0x97,0x49,0xff,0x9f,0xfe,0x8f,0xff,0x6c,
+ 0xb9,0x5f,0xff,0x86,0xdc,0x75,0xff,0x96,0xe7,0x85,0xff,0x4a,0x6b,0x42,0xff,
+ 0x3a,0x38,0x3a,0xff,0x3f,0x42,0x37,0xff,0x57,0x7c,0x16,0xff,0x61,0x9a,0x00,
+ 0xff,0x60,0x98,0x00,0xff,0x56,0x7b,0x15,0xff,0x3d,0x41,0x35,0xff,0x38,0x36,
+ 0x39,0xff,0x44,0x3b,0x65,0xff,0x5e,0x4c,0xa5,0xff,0x47,0x38,0x8d,0xff,0x4f,
+ 0x41,0x94,0xff,0x5e,0x4f,0xae,0xff,0x39,0x31,0x73,0xff,0x5b,0x53,0xae,0xff,
+ 0x38,0x34,0x72,0xff,0x5b,0x59,0xac,0xff,0x4b,0x4d,0x92,0xff,0x43,0x48,0x89,
+ 0xff,0x57,0x62,0xa4,0xff,0x3e,0x4c,0x81,0xff,0x53,0x66,0x9a,0xff,0x4c,0x64,
+ 0x90,0xff,0x40,0x5c,0x7b,0xff,0x56,0x7e,0x9d,0xff,0x34,0x55,0x63,0xff,0x58,
+ 0x89,0x96,0xff,0x3f,0x6c,0x6e,0xff,0x49,0x82,0x7a,0xff,0x4f,0x8d,0x7d,0xff,
+ 0x38,0x71,0x5c,0xff,0x58,0xa0,0x7d,0xff,0x3f,0x7d,0x5a,0xff,0x49,0x92,0x63,
+ 0xff,0x4a,0x95,0x5f,0xff,0x3f,0x83,0x4d,0xff,0x3b,0x71,0x44,0xff,0x1e,0x42,
+ 0x22,0xff,0x4f,0xa0,0x55,0xff,0x49,0x99,0x4c,0xff,0x3f,0x86,0x3f,0xff,0x58,
+ 0xae,0x56,0xff,0x36,0x73,0x32,0xff,0x57,0xaf,0x4f,0xff,0x41,0x86,0x3a,0xff,
+ 0x4d,0x9a,0x43,0xff,0x57,0x9f,0x4c,0xff,0x3f,0x57,0x3b,0xff,0x38,0x37,0x38,
+ 0xff,0x3d,0x41,0x35,0xff,0x7f,0x56,0x7b,0x15,0xff,0x60,0x98,0x00,0xff,0x60,
+ 0x96,0x00,0xff,0x55,0x7a,0x14,0xff,0x3c,0x3f,0x33,0xff,0x36,0x35,0x38,0xff,
+ 0x4f,0x46,0x7b,0xff,0x87,0x77,0xdd,0xff,0x61,0x53,0xb5,0xff,0x6e,0x63,0xbf,
+ 0xff,0x89,0x7f,0xe7,0xff,0x48,0x43,0x8d,0xff,0x86,0x82,0xe8,0xff,0x48,0x47,
+ 0x8c,0xff,0x87,0x8a,0xe6,0xff,0x6a,0x72,0xbe,0xff,0x5c,0x68,0xb2,0xff,0x81,
+ 0x93,0xda,0xff,0x54,0x6a,0xa6,0xff,0x7a,0x95,0xcd,0xff,0x6c,0x8f,0xbf,0xff,
+ 0x58,0x7d,0xa0,0xff,0x80,0xb4,0xd6,0xff,0x43,0x6d,0x7d,0xff,0x84,0xc2,0xcf,
+ 0xff,0x56,0x8f,0x93,0xff,0x6a,0xb0,0xa7,0xff,0x74,0xbe,0xad,0xff,0x4c,0x91,
+ 0x7a,0xff,0x86,0xda,0xb5,0xff,0x57,0xa2,0x7c,0xff,0x6c,0xc2,0x8e,0xff,0x6c,
+ 0xc4,0x89,0xff,0x57,0xa8,0x6e,0xff,0x46,0x77,0x51,0xff,0x00,0x00,0x00,0xff,
+ 0x75,0xd2,0x81,0xff,0x6b,0xc8,0x74,0xff,0x57,0xab,0x5c,0xff,0x86,0xe7,0x88,
+ 0xff,0x45,0x8d,0x45,0xff,0x82,0xe8,0x7f,0xff,0x5a,0xab,0x55,0xff,0x6e,0xca,
+ 0x68,0xff,0x7e,0xd3,0x76,0xff,0x44,0x66,0x41,0xff,0x36,0x36,0x36,0xff,0x3c,
+ 0x3f,0x33,0xff,0x55,0x7a,0x14,0xff,0x60,0x96,0x00,0xff,0x5e,0x94,0x00,0xff,
+ 0x54,0x78,0x14,0xff,0x3a,0x3e,0x32,0xff,0x35,0x33,0x37,0xff,0x4a,0x44,0x77,
+ 0xff,0x79,0x6d,0xd2,0xff,0x57,0x4e,0xad,0xff,0x62,0x5c,0xb7,0xff,0x7a,0x75,
+ 0xdc,0xff,0x41,0x40,0x88,0xff,0x77,0x78,0xdc,0xff,0x41,0x44,0x87,0xff,0x78,
+ 0x81,0xdb,0xff,0x5e,0x6b,0xb5,0xff,0x52,0x63,0xab,0xff,0x73,0x8b,0xcf,0xff,
+ 0x4b,0x66,0x9f,0xff,0x6c,0x8d,0xc4,0xff,0x61,0x89,0xb8,0xff,0x4f,0x79,0x9a,
+ 0xff,0x71,0xab,0xcd,0xff,0x3d,0x6a,0x79,0xff,0x75,0xb9,0xc6,0xff,0x4c,0x8a,
+ 0x8e,0xff,0x5e,0xa8,0xa1,0xff,0x67,0xb6,0xa6,0xff,0x43,0x8c,0x77,0xff,0x76,
+ 0xd0,0xac,0xff,0x4e,0x9b,0x77,0xff,0x5f,0xba,0x88,0xff,0x5f,0xbb,0x83,0xff,
+ 0x4e,0xa1,0x69,0xff,0x77,0xda,0x93,0xff,0x44,0x99,0x57,0xff,0x67,0xc9,0x79,
+ 0xff,0x5f,0xbf,0x6d,0xff,0x4e,0xa3,0x57,0xff,0x77,0xdc,0x7e,0xff,0x3e,0x87,
+ 0x42,0xff,0x73,0xdd,0x75,0xff,0x50,0xa4,0x50,0xff,0x62,0xc0,0x60,0xff,0x72,
+ 0xc9,0x6d,0xff,0x42,0x63,0x40,0xff,0x35,0x34,0x35,0xff,0x3a,0x3e,0x32,0xff,
+ 0x54,0x78,0x14,0xff,0x5e,0x94,0x00,0xff,0x5d,0x92,0x00,0xff,0x53,0x76,0x13,
+ 0xff,0x39,0x3c,0x30,0xff,0x34,0x32,0x35,0xff,0x43,0x40,0x6a,0xff,0x60,0x5a,
+ 0xb1,0xff,0x45,0x42,0x95,0xff,0x4e,0x4d,0x9c,0xff,0x5f,0x60,0xb9,0xff,0x36,
+ 0x39,0x77,0xff,0x5c,0x64,0xb9,0xff,0x36,0x3d,0x77,0xff,0x5d,0x6b,0xb9,0xff,
+ 0x4b,0x5c,0x9b,0xff,0x41,0x57,0x93,0xff,0x59,0x75,0xaf,0xff,0x3c,0x59,0x8a,
+ 0xff,0x55,0x79,0xa6,0xff,0x4c,0x75,0x9d,0xff,0x3f,0x69,0x85,0xff,0x58,0x91,
+ 0xae,0xff,0x32,0x5f,0x6c,0xff,0x5b,0x9d,0xa8,0xff,0x3e,0x78,0x7c,0xff,0x4a,
+ 0x91,0x8b,0xff,0x51,0x9b,0x8e,0xff,0x37,0x7b,0x6a,0xff,0x5c,0xb0,0x92,0xff,
+ 0x3e,0x87,0x68,0xff,0x7f,0x4b,0x9e,0x75,0xff,0x4b,0xa0,0x71,0xff,0x3f,0x8b,
+ 0x5c,0xff,0x5d,0xb8,0x7c,0xff,0x37,0x84,0x4e,0xff,0x51,0xaa,0x67,0xff,0x4b,
+ 0xa3,0x5d,0xff,0x3f,0x8d,0x4c,0xff,0x5c,0xb9,0x69,0xff,0x34,0x77,0x3b,0xff,
+ 0x5b,0xb9,0x60,0xff,0x41,0x8d,0x45,0xff,0x4e,0xa3,0x50,0xff,0x5b,0xa9,0x5b,
+ 0xff,0x3e,0x5a,0x3e,0xff,0x34,0x33,0x34,0xff,0x39,0x3c,0x30,0xff,0x53,0x76,
+ 0x13,0xff,0x5d,0x92,0x00,0xff,0x5c,0x91,0x00,0xff,0x52,0x75,0x12,0xff,0x38,
+ 0x3b,0x2e,0xff,0x33,0x31,0x34,0xff,0x4f,0x4c,0x85,0xff,0x8f,0x8c,0xf3,0xff,
+ 0x63,0x63,0xc5,0xff,0x73,0x75,0xd1,0xff,0x92,0x97,0xff,0xff,0x48,0x4f,0x97,
+ 0xff,0x8d,0x9b,0xfe,0xff,0x47,0x54,0x97,0xff,0x8f,0xa6,0xfe,0xff,0x6f,0x87,
+ 0xd0,0xff,0x5f,0x7d,0xc4,0xff,0x8a,0xae,0xf1,0xff,0x57,0x7e,0xb7,0xff,0x84,
+ 0xb1,0xe3,0xff,0x76,0xaa,0xd6,0xff,0x5f,0x94,0xb3,0xff,0x8c,0xd3,0xf3,0xff,
+ 0x48,0x7f,0x8e,0xff,0x91,0xe0,0xed,0xff,0x5e,0xa4,0xa9,0xff,0x74,0xc9,0xc3,
+ 0xff,0x7f,0xd7,0xca,0xff,0x52,0xa3,0x91,0xff,0x94,0xf5,0xd6,0xff,0x5e,0xb4,
+ 0x94,0xff,0x75,0xd7,0xaa,0xff,0x74,0xd8,0xa5,0xff,0x5b,0xb7,0x82,0xff,0x92,
+ 0xfd,0xba,0xff,0x4e,0xad,0x6d,0xff,0x7d,0xe7,0x9b,0xff,0x71,0xdc,0x8c,0xff,
+ 0x5b,0xb9,0x6e,0xff,0x90,0xff,0xa3,0xff,0x45,0x97,0x52,0xff,0x8c,0xff,0x98,
+ 0xff,0x5d,0xba,0x65,0xff,0x75,0xdc,0x7b,0xff,0x88,0xe8,0x8c,0xff,0x45,0x6c,
+ 0x46,0xff,0x33,0x31,0x32,0xff,0x38,0x3b,0x2e,0xff,0x52,0x75,0x12,0xff,0x5c,
+ 0x91,0x00,0xff,0x5a,0x8f,0x00,0xff,0x50,0x73,0x12,0xff,0x37,0x39,0x2d,0xff,
+ 0x32,0x30,0x33,0xff,0x3c,0x3b,0x5e,0xff,0x48,0x48,0x90,0xff,0x36,0x38,0x7d,
+ 0xff,0x3b,0x3f,0x82,0xff,0x46,0x4d,0x97,0xff,0x2b,0x33,0x68,0xff,0x44,0x51,
+ 0x97,0xff,0x2a,0x37,0x68,0xff,0x44,0x58,0x97,0xff,0x39,0x4d,0x82,0xff,0x32,
+ 0x4b,0x7c,0xff,0x43,0x61,0x91,0xff,0x40,0x5c,0x81,0xff,0x59,0x74,0x90,0xff,
+ 0x53,0x71,0x89,0xff,0x4c,0x6a,0x7b,0xff,0x5a,0x81,0x92,0xff,0x45,0x64,0x6d,
+ 0xff,0x5c,0x88,0x8f,0xff,0x4d,0x74,0x76,0xff,0x53,0x81,0x7e,0xff,0x56,0x87,
+ 0x81,0xff,0x48,0x75,0x6b,0xff,0x5d,0x93,0x82,0xff,0x4c,0x7c,0x6b,0xff,0x53,
+ 0x88,0x71,0xff,0x50,0x89,0x6d,0xff,0x3a,0x7d,0x59,0xff,0x45,0x95,0x66,0xff,
+ 0x2d,0x71,0x45,0xff,0x3d,0x8d,0x57,0xff,0x39,0x87,0x4f,0xff,0x31,0x77,0x42,
+ 0xff,0x44,0x97,0x55,0xff,0x29,0x68,0x35,0xff,0x42,0x97,0x4e,0xff,0x32,0x78,
+ 0x3a,0xff,0x3a,0x87,0x41,0xff,0x45,0x8b,0x4a,0xff,0x3a,0x52,0x3b,0xff,0x32,
+ 0x30,0x31,0xff,0x37,0x39,0x2d,0xff,0x50,0x73,0x12,0xff,0x5a,0x8f,0x00,0xff,
+ 0x5d,0x93,0x00,0xff,0x51,0x75,0x11,0xff,0x35,0x37,0x2b,0xff,0x31,0x2e,0x31,
+ 0xff,0x4b,0x4c,0x85,0xff,0x86,0x8b,0xf4,0xff,0x5b,0x63,0xc5,0xff,0x6a,0x75,
+ 0xd1,0xff,0x87,0x97,0xff,0xff,0x42,0x51,0x97,0xff,0x84,0x9c,0xff,0xff,0x42,
+ 0x56,0x97,0xff,0x7f,0x86,0xa8,0xfe,0xff,0x68,0x8a,0xd0,0xff,0x58,0x80,0xc4,
+ 0xff,0x85,0xb4,0xf3,0xff,0x5c,0x7c,0xa1,0xff,0x36,0x39,0x3e,0xff,0x2f,0x2c,
+ 0x2d,0xff,0x3c,0x39,0x3a,0xff,0x53,0x51,0x52,0xff,0x37,0x34,0x35,0xff,0x39,
+ 0x37,0x38,0xff,0x4c,0x4b,0x4b,0xff,0x48,0x46,0x47,0xff,0x34,0x32,0x33,0xff,
+ 0x41,0x3f,0x40,0xff,0x2f,0x2c,0x2d,0xff,0x3d,0x3b,0x3c,0xff,0x33,0x30,0x31,
+ 0xff,0x36,0x3f,0x3a,0xff,0x68,0xb9,0x90,0xff,0x8b,0xfd,0xbf,0xff,0x49,0xad,
+ 0x71,0xff,0x75,0xe7,0x9e,0xff,0x6a,0xdc,0x8f,0xff,0x55,0xb9,0x71,0xff,0x87,
+ 0xff,0xa5,0xff,0x41,0x97,0x53,0xff,0x82,0xff,0x99,0xff,0x57,0xba,0x67,0xff,
+ 0x6d,0xdc,0x7c,0xff,0x80,0xe8,0x8b,0xff,0x43,0x6b,0x47,0xff,0x30,0x2e,0x2f,
+ 0xff,0x35,0x37,0x2b,0xff,0x51,0x75,0x11,0xff,0x5d,0x93,0x00,0xff,0x60,0x97,
+ 0x00,0xff,0x52,0x76,0x11,0xff,0x33,0x36,0x2a,0xff,0x2f,0x2d,0x30,0xff,0x40,
+ 0x43,0x6b,0xff,0x5a,0x61,0xb2,0xff,0x40,0x48,0x95,0xff,0x49,0x54,0x9c,0xff,
+ 0x59,0x68,0xba,0xff,0x31,0x3f,0x78,0xff,0x57,0x6e,0xb9,0xff,0x31,0x43,0x78,
+ 0xff,0x58,0x77,0xb9,0xff,0x47,0x65,0x9c,0xff,0x3e,0x60,0x94,0xff,0x5b,0x83,
+ 0xb4,0xff,0x4c,0x67,0x83,0xff,0x33,0x35,0x3a,0xff,0x3a,0x38,0x39,0xff,0x8a,
+ 0x8a,0x8a,0xff,0xa6,0xa5,0xa5,0xff,0x8b,0x8a,0x8b,0xff,0x6d,0x6d,0x6d,0xff,
+ 0xa5,0xa5,0xa5,0xff,0x97,0x96,0x96,0xff,0x79,0x79,0x79,0xff,0xaa,0xaa,0xaa,
+ 0xff,0x31,0x2f,0x30,0xff,0x88,0x88,0x88,0xff,0x4d,0x4b,0x4c,0xff,0x34,0x3b,
+ 0x38,0xff,0x51,0x93,0x74,0xff,0x5c,0xba,0x89,0xff,0x35,0x86,0x58,0xff,0x4f,
+ 0xab,0x73,0xff,0x48,0xa4,0x68,0xff,0x3c,0x8d,0x55,0xff,0x59,0xba,0x74,0xff,
+ 0x30,0x78,0x42,0xff,0x57,0xba,0x6b,0xff,0x3d,0x8e,0x4c,0xff,0x4a,0xa3,0x58,
+ 0xff,0x57,0xaa,0x63,0xff,0x3c,0x5a,0x40,0xff,0x2e,0x2d,0x2d,0xff,0x33,0x36,
+ 0x2a,0xff,0x52,0x76,0x11,0xff,0x60,0x97,0x00,0xff,0x63,0x9a,0x00,0xff,0x53,
+ 0x77,0x10,0xff,0x32,0x34,0x28,0xff,0x2e,0x2c,0x2e,0xff,0x44,0x49,0x78,0xff,
+ 0x6e,0x79,0xd3,0xff,0x4b,0x59,0xad,0xff,0x58,0x68,0xb6,0xff,0x6f,0x84,0xdc,
+ 0xff,0x38,0x4a,0x87,0xff,0x6c,0x89,0xdc,0xff,0x38,0x50,0x87,0xff,0x6d,0x93,
+ 0xdc,0xff,0x57,0x7b,0xb5,0xff,0x4a,0x74,0xac,0xff,0x6f,0xa0,0xd4,0xff,0x53,
+ 0x74,0x91,0xff,0x33,0x35,0x3a,0xff,0x51,0x4f,0x50,0xff,0xa1,0x9f,0xa0,0xff,
+ 0x57,0x55,0x56,0xff,0x6a,0x67,0x68,0xff,0x7a,0x78,0x79,0xff,0x90,0x90,0x90,
+ 0xff,0x87,0x86,0x86,0xff,0xa5,0xa4,0xa4,0xff,0xc5,0xc4,0xc4,0xff,0x31,0x2f,
+ 0x2f,0xff,0x9e,0x9d,0x9d,0xff,0x54,0x53,0x53,0xff,0x33,0x3b,0x38,0xff,0x5c,
+ 0xa6,0x86,0xff,0x72,0xdc,0xaa,0xff,0x3e,0x99,0x69,0xff,0x61,0xc9,0x8e,0xff,
+ 0x58,0xbf,0x80,0xff,0x47,0xa3,0x67,0xff,0x6f,0xdc,0x91,0xff,0x38,0x87,0x4e,
+ 0xff,0x6b,0xdc,0x87,0xff,0x49,0xa3,0x5d,0xff,0x5a,0xc0,0x6e,0xff,0x6a,0xc9,
+ 0x7a,0xff,0x5e,0x3f,0x62,0x44,0xff,0x2d,0x2b,0x2b,0xff,0x32,0x34,0x28,0xff,
+ 0x53,0x77,0x10,0xff,0x63,0x9a,0x00,0xff,0x66,0xa0,0x00,0xff,0x54,0x79,0x0f,
+ 0xff,0x31,0x33,0x26,0xff,0x2c,0x2a,0x2c,0xff,0x47,0x4d,0x7a,0xff,0x7d,0x8b,
+ 0xde,0xff,0x5a,0x69,0xb6,0xff,0x66,0x78,0xc0,0xff,0x80,0x98,0xe9,0xff,0x43,
+ 0x56,0x8c,0xff,0x7e,0x9d,0xe9,0xff,0x43,0x5b,0x8c,0xff,0x7f,0xa7,0xe8,0xff,
+ 0x65,0x8b,0xbf,0xff,0x58,0x83,0xb5,0xff,0x7e,0xb0,0xdf,0xff,0x58,0x79,0x94,
+ 0xff,0x32,0x34,0x38,0xff,0x50,0x4e,0x4f,0xff,0xa0,0x9f,0x9f,0xff,0xad,0xab,
+ 0xac,0xff,0xc9,0xc8,0xc8,0xff,0x8a,0x88,0x89,0xff,0xb8,0xb7,0xb7,0xff,0x7d,
+ 0x7b,0x7c,0xff,0x48,0x45,0x46,0xff,0xc2,0xc0,0xc1,0xff,0x3e,0x3c,0x3d,0xff,
+ 0xa0,0x9f,0x9f,0xff,0x50,0x4e,0x4f,0xff,0x32,0x39,0x36,0xff,0x64,0xaa,0x8d,
+ 0xff,0x84,0xe8,0xbc,0xff,0x4a,0xa1,0x75,0xff,0x71,0xd4,0x9e,0xff,0x67,0xca,
+ 0x91,0xff,0x54,0xab,0x75,0xff,0x81,0xe9,0xa5,0xff,0x43,0x8c,0x5a,0xff,0x7d,
+ 0xe9,0x9a,0xff,0x56,0xab,0x6b,0xff,0x6a,0xca,0x7f,0xff,0x79,0xd4,0x8b,0xff,
+ 0x3e,0x62,0x44,0xff,0x2c,0x29,0x2a,0xff,0x31,0x33,0x26,0xff,0x54,0x79,0x0f,
+ 0xff,0x66,0xa0,0x00,0xff,0x68,0xa4,0x00,0xff,0x54,0x7b,0x0f,0xff,0x2f,0x31,
+ 0x25,0xff,0x2a,0x27,0x29,0xff,0x34,0x35,0x44,0xff,0x3f,0x44,0x66,0xff,0x3b,
+ 0x40,0x5c,0xff,0x3c,0x43,0x5f,0xff,0x40,0x49,0x6b,0xff,0x37,0x3d,0x51,0xff,
+ 0x40,0x4c,0x6b,0xff,0x37,0x3f,0x51,0xff,0x40,0x50,0x6b,0xff,0x3c,0x4a,0x5f,
+ 0xff,0x3a,0x49,0x5c,0xff,0x3e,0x53,0x68,0xff,0x37,0x43,0x4f,0xff,0x2c,0x2b,
+ 0x2d,0xff,0x37,0x33,0x34,0xff,0x88,0x87,0x88,0xff,0xa5,0xa3,0xa4,0xff,0x8b,
+ 0x89,0x89,0xff,0x6f,0x6d,0x6d,0xff,0x66,0x65,0x65,0xff,0x26,0x22,0x23,0xff,
+ 0x2c,0x28,0x29,0xff,0x8b,0x89,0x89,0xff,0x99,0x98,0x98,0xff,0x95,0x93,0x94,
+ 0xff,0x37,0x33,0x34,0xff,0x2d,0x2d,0x2d,0xff,0x3b,0x56,0x4b,0xff,0x40,0x6a,
+ 0x57,0xff,0x38,0x56,0x47,0xff,0x3d,0x64,0x4f,0xff,0x3c,0x61,0x4c,0xff,0x3a,
+ 0x59,0x45,0xff,0x40,0x6a,0x4f,0xff,0x37,0x51,0x3f,0xff,0x40,0x6a,0x4c,0xff,
+ 0x3a,0x59,0x42,0xff,0x82,0x3d,0x62,0x45,0xff,0x0a,0x31,0x3b,0x32,0xff,0x2a,
+ 0x27,0x28,0xff,0x2f,0x31,0x25,0xff,0x54,0x7b,0x0f,0xff,0x68,0xa4,0x00,0xff,
+ 0x6b,0xa7,0x00,0xff,0x55,0x7c,0x0e,0xff,0x2e,0x2f,0x23,0xff,0x28,0x24,0x25,
+ 0xff,0x29,0x25,0x26,0xff,0x8b,0x29,0x26,0x27,0xff,0x0f,0x29,0x25,0x27,0xff,
+ 0x28,0x24,0x26,0xff,0x28,0x24,0x25,0xff,0x35,0x32,0x33,0xff,0x4f,0x4c,0x4c,
+ 0xff,0x32,0x2f,0x30,0xff,0x34,0x31,0x32,0xff,0x35,0x31,0x32,0xff,0x29,0x25,
+ 0x26,0xff,0x2a,0x25,0x26,0xff,0x32,0x2f,0x30,0xff,0x4b,0x48,0x49,0xff,0x3c,
+ 0x38,0x39,0xff,0x28,0x24,0x25,0xff,0x28,0x25,0x26,0xff,0x8c,0x29,0x26,0x27,
+ 0xff,0x08,0x29,0x25,0x26,0xff,0x28,0x24,0x25,0xff,0x2e,0x2f,0x23,0xff,0x55,
+ 0x7c,0x0e,0xff,0x6b,0xa7,0x00,0xff,0x6e,0xac,0x00,0xff,0x58,0x81,0x0d,0xff,
+ 0x31,0x38,0x1f,0xff,0x8f,0x2c,0x2e,0x22,0xff,0x0c,0x30,0x36,0x20,0xff,0x4f,
+ 0x6e,0x15,0xff,0x76,0xa4,0x23,0xff,0x9c,0xc4,0x47,0xff,0xa5,0xcb,0x48,0xff,
+ 0xb2,0xd5,0x5d,0xff,0xa8,0xce,0x48,0xff,0xae,0xd2,0x56,0xff,0xa1,0xc8,0x4e,
+ 0xff,0x63,0x91,0x0e,0xff,0x4a,0x66,0x15,0xff,0x2f,0x34,0x20,0xff,0x8f,0x2c,
+ 0x2e,0x22,0xff,0x06,0x31,0x38,0x1f,0xff,0x58,0x81,0x0d,0xff,0x6e,0xac,0x00,
+ 0xff,0x70,0xb0,0x00,0xff,0x68,0xa0,0x05,0xff,0x59,0x84,0x0c,0xff,0x8f,0x57,
+ 0x80,0x0d,0xff,0x0c,0x5b,0x88,0x0c,0xff,0x6e,0xac,0x04,0xff,0x92,0xd6,0x1e,
+ 0xff,0xc3,0xf9,0x4f,0xff,0xce,0xfe,0x4f,0xff,0xdb,0xff,0x6d,0xff,0xd3,0xff,
+ 0x4f,0xff,0xd9,0xff,0x63,0xff,0xc8,0xf9,0x59,0xff,0x79,0xbe,0x00,0xff,0x6c,
+ 0xa7,0x04,0xff,0x5b,0x88,0x0c,0xff,0x8f,0x57,0x80,0x0d,0xff,0x03,0x59,0x84,
+ 0x0c,0xff,0x68,0xa0,0x05,0xff,0x70,0xb0,0x00,0xff,0x93,0x73,0xb4,0x00,0xff,
+ 0x09,0x73,0xb6,0x00,0xff,0x7a,0xbd,0x03,0xff,0x83,0xca,0x08,0xff,0x86,0xce,
+ 0x08,0xff,0x8a,0xd0,0x0b,0xff,0x87,0xcf,0x08,0xff,0x89,0xcf,0x0a,0xff,0x85,
+ 0xcb,0x09,0xff,0x75,0xb8,0x00,0xff,0x93,0x73,0xb4,0x00,0xff,0x01,0x74,0xb4,
+ 0x02,0xff
+};
+
+static const GdkPixdata server_licensing_pixdata = {
+ 0x47646b50, /* Pixbuf magic: 'GdkP' */
+ 24 + 8327, /* header length + pixel_data length */
+ 0x2010002, /* pixdata_type */
+ 192, /* rowstride */
+ 48, /* width */
+ 48, /* height */
+ server_licensing_pixdata_pixel_data /* pixel_data */
+};
diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h
index 5fa00dc..805ff57 100644
--- a/src/libXNVCtrl/NVCtrl.h
+++ b/src/libXNVCtrl/NVCtrl.h
@@ -1745,7 +1745,7 @@
/*
- * NV_CTRL_FRAMELOCK_FPGA_REVISION - Querys the FPGA revision of the
+ * NV_CTRL_FRAMELOCK_FPGA_REVISION - Queries the FPGA revision of the
* Frame Lock device.
*
* This attribute must be queried through XNVCTRLQueryTargetAttribute()
@@ -3483,8 +3483,17 @@
*/
#define NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS 425 /* RW-G */
+/*
+ * NV_CTRL_FRAMELOCK_FIRMWARE_VERSION - Queries the firmware version of the
+ * Frame Lock device.
+ *
+ * This attribute must be queried through XNVCTRLQueryTargetAttribute()
+ * using a NV_CTRL_TARGET_TYPE_FRAMELOCK target.
+ */
+
+#define NV_CTRL_FRAMELOCK_FIRMWARE_VERSION 426 /* R--F */
-#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS
+#define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_FRAMELOCK_FIRMWARE_VERSION
/**************************************************************************/
@@ -3507,14 +3516,17 @@
/*
- * NV_CTRL_STRING_PRODUCT_NAME - the GPU product name on which the
- * specified X screen is running.
+ * NV_CTRL_STRING_PRODUCT_NAME - the product name on which the
+ * specified X screen is running, or the product name of the specified
+ * Frame Lock device.
*
* This attribute may be queried through XNVCTRLQueryTargetStringAttribute()
- * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target.
+ * using a NV_CTRL_TARGET_TYPE_GPU or NV_CTRL_TARGET_TYPE_X_SCREEN target to
+ * return the product name of the GPU, or a NV_CTRL_TARGET_TYPE_FRAMELOCK to
+ * return the product name of the Frame Lock device.
*/
-#define NV_CTRL_STRING_PRODUCT_NAME 0 /* R--G */
+#define NV_CTRL_STRING_PRODUCT_NAME 0 /* R--GF */
/*
@@ -3651,7 +3663,7 @@
/*
- * NV_CTRL_STRING_VCSC_PRODUCT_NAME - Querys the product name of the
+ * NV_CTRL_STRING_VCSC_PRODUCT_NAME - Queries the product name of the
* VCSC device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
@@ -3662,7 +3674,7 @@
/*
- * NV_CTRL_STRING_VCSC_PRODUCT_ID - Querys the product ID of the VCSC device.
+ * NV_CTRL_STRING_VCSC_PRODUCT_ID - Queries the product ID of the VCSC device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
* using a NV_CTRL_TARGET_TYPE_VCSC target.
@@ -3672,7 +3684,7 @@
/*
- * NV_CTRL_STRING_VCSC_SERIAL_NUMBER - Querys the unique serial number
+ * NV_CTRL_STRING_VCSC_SERIAL_NUMBER - Queries the unique serial number
* of the VCS device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
@@ -3683,7 +3695,7 @@
/*
- * NV_CTRL_STRING_VCSC_BUILD_DATE - Querys the date of the VCS device.
+ * NV_CTRL_STRING_VCSC_BUILD_DATE - Queries the date of the VCS device.
* the returned string is in the following format: "Week.Year"
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
@@ -3694,7 +3706,7 @@
/*
- * NV_CTRL_STRING_VCSC_FIRMWARE_VERSION - Querys the firmware version
+ * NV_CTRL_STRING_VCSC_FIRMWARE_VERSION - Queries the firmware version
* of the VCS device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
@@ -3705,7 +3717,7 @@
/*
- * NV_CTRL_STRING_VCSC_FIRMWARE_REVISION - Querys the firmware revision
+ * NV_CTRL_STRING_VCSC_FIRMWARE_REVISION - Queries the firmware revision
* of the VCS device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
@@ -3716,7 +3728,7 @@
/*
- * NV_CTRL_STRING_VCSC_HARDWARE_VERSION - Querys the hardware version
+ * NV_CTRL_STRING_VCSC_HARDWARE_VERSION - Queries the hardware version
* of the VCS device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
@@ -3727,7 +3739,7 @@
/*
- * NV_CTRL_STRING_VCSC_HARDWARE_REVISION - Querys the hardware revision
+ * NV_CTRL_STRING_VCSC_HARDWARE_REVISION - Queries the hardware revision
* of the VCS device.
*
* This attribute must be queried through XNVCTRLQueryTargetStringAttribute()
diff --git a/src/libXNVCtrl/version.mk b/src/libXNVCtrl/version.mk
index 184e0ee..b31360a 100644
--- a/src/libXNVCtrl/version.mk
+++ b/src/libXNVCtrl/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 370.28
+NVIDIA_VERSION = 375.10
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributes.c b/src/libXNVCtrlAttributes/NvCtrlAttributes.c
index ae7c212..dbb4d89 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributes.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributes.c
@@ -610,6 +610,7 @@ ReturnStatus NvCtrlQueryTargetCount(const CtrlTarget *ctrl_target,
target_type,
val);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -771,6 +772,7 @@ ReturnStatus NvCtrlGetDisplayAttribute64(const CtrlTarget *ctrl_target,
attr,
val);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -833,6 +835,7 @@ ReturnStatus NvCtrlSetDisplayAttribute(CtrlTarget *ctrl_target,
display_mask,
val);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -900,6 +903,7 @@ NvCtrlGetValidDisplayAttributeValues(const CtrlTarget *ctrl_target,
attr,
val);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -974,6 +978,7 @@ NvCtrlGetValidStringDisplayAttributeValues(const CtrlTarget *ctrl_target,
attr,
val);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -1058,6 +1063,7 @@ ReturnStatus NvCtrlGetStringDisplayAttribute(const CtrlTarget *ctrl_target,
attr,
ptr);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -1133,6 +1139,7 @@ ReturnStatus NvCtrlSetStringDisplayAttribute(CtrlTarget *ctrl_target,
attr,
ptr);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
@@ -1176,6 +1183,7 @@ ReturnStatus NvCtrlGetBinaryAttribute(const CtrlTarget *ctrl_target,
data,
len);
if ((ret != NvCtrlMissingExtension) &&
+ (ret != NvCtrlBadHandle) &&
(ret != NvCtrlNotSupported)) {
return ret;
}
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributes.h b/src/libXNVCtrlAttributes/NvCtrlAttributes.h
index 52c46a4..fd97786 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributes.h
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributes.h
@@ -256,7 +256,22 @@ typedef enum {
#define NV_CTRL_ATTR_RANDR_LAST_ATTRIBUTE \
(NV_CTRL_ATTR_RANDR_GAMMA_AVAILABLE)
-#define NV_CTRL_ATTR_LAST_ATTRIBUTE (NV_CTRL_ATTR_RANDR_LAST_ATTRIBUTE)
+/* NVML */
+
+#define NV_CTRL_ATTR_NVML_BASE \
+ (NV_CTRL_ATTR_RANDR_LAST_ATTRIBUTE + 1)
+
+#define NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE (NV_CTRL_ATTR_NVML_BASE + 0)
+#define NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE_NONE 0
+#define NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE_PASSTHROUGH 1
+#define NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE_VGPU 2
+#define NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE_HOST_VGPU 3
+#define NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE_HOST_VSGA 4
+
+#define NV_CTRL_ATTR_NVML_LAST_ATTRIBUTE (NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE)
+
+#define NV_CTRL_ATTR_LAST_ATTRIBUTE \
+ (NV_CTRL_ATTR_NVML_LAST_ATTRIBUTE)
typedef enum {
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c b/src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c
index 27ce8ff..5302339 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c
@@ -33,9 +33,7 @@
#include "NVCtrlLib.h"
-#ifdef NVML_AVAILABLE
-
-#include <nvml.h>
+#include "nvml.h"
#define MAX_NVML_STR_LEN 64
@@ -128,14 +126,12 @@ static void printNvmlError(nvmlReturn_t error)
"operating system/cgroups");
break;
- case NVML_ERROR_UNKNOWN:
+ default:
nv_error_msg("An internal driver error occurred");
break;
}
}
-#endif // NVML_AVAILABLE
-
/*
* Loads and initializes the NVML library
@@ -143,8 +139,6 @@ static void printNvmlError(nvmlReturn_t error)
ReturnStatus NvCtrlInitNvml(void)
{
-#ifdef NVML_AVAILABLE
-
if (!__isNvmlLoaded) {
nvmlReturn_t ret = nvmlInit();
if (ret != NVML_SUCCESS) {
@@ -158,10 +152,6 @@ ReturnStatus NvCtrlInitNvml(void)
__nvmlUsers++;
return NvCtrlSuccess;
-
-#else
- return NvCtrlMissingExtension;
-#endif
}
@@ -172,8 +162,6 @@ ReturnStatus NvCtrlInitNvml(void)
ReturnStatus NvCtrlDestroyNvml(void)
{
-#ifdef NVML_AVAILABLE
-
if (__isNvmlLoaded) {
__nvmlUsers--;
if (__nvmlUsers == 0) {
@@ -186,10 +174,6 @@ ReturnStatus NvCtrlDestroyNvml(void)
}
}
return NvCtrlSuccess;
-
-#else
- return NvCtrlMissingExtension;
-#endif
}
@@ -200,26 +184,37 @@ ReturnStatus NvCtrlDestroyNvml(void)
* XXX Needed while using NV-CONTROL as fallback during the migration process
*/
-#ifdef NVML_AVAILABLE
-
-static void matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
- int deviceCount,
+static Bool matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
+ int nvmlGpuCount,
unsigned int **idsDictionary)
{
char nvmlUUID[MAX_NVML_STR_LEN];
char *nvctrlUUID = NULL;
nvmlDevice_t device;
int i, j;
+ int nvctrlGpuCount = 0;
+ ReturnStatus ret;
- *idsDictionary = nvalloc(deviceCount * sizeof(unsigned int));
+ /* Get the gpu count returned by NV-CONTROL.
+ * If there is mismatch between count returned by NVML and NV-CONTROL
+ * return early.
+ */
+ ret = XNVCTRLQueryTargetCount(h->dpy, NV_CTRL_TARGET_TYPE_GPU,
+ &nvctrlGpuCount);
+
+ if ((ret != NvCtrlSuccess) || (nvctrlGpuCount != nvmlGpuCount)) {
+ return FALSE;
+ }
+
+ *idsDictionary = nvalloc(nvmlGpuCount * sizeof(unsigned int));
/* Fallback case is to use same id either for NV-CONTROL and NVML */
- for (i = 0; i < deviceCount; i++) {
+ for (i = 0; i < nvmlGpuCount; i++) {
(*idsDictionary)[i] = i;
}
if (h->nv != NULL) {
- for (i = 0; i < deviceCount; i++) {
+ for (i = 0; i < nvctrlGpuCount; i++) {
/* Get GPU UUID through NV-CONTROL */
if (!XNVCTRLQueryTargetStringAttribute(h->dpy,
NV_CTRL_TARGET_TYPE_GPU,
@@ -234,7 +229,7 @@ static void matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
}
/* Look for the same UUID through NVML */
- for (j = 0; j < deviceCount; j++) {
+ for (j = 0; j < nvmlGpuCount; j++) {
if (NVML_SUCCESS != nvmlDeviceGetHandleByIndex(j, &device)) {
continue;
}
@@ -254,10 +249,9 @@ static void matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
XFree(nvctrlUUID);
}
}
+ return TRUE;
}
-#endif // NVML_AVAILABLE
-
/*
@@ -267,8 +261,6 @@ static void matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
NvCtrlNvmlAttributes *NvCtrlInitNvmlAttributes(NvCtrlAttributePrivateHandle *h)
{
-#ifdef NVML_AVAILABLE
-
NvCtrlNvmlAttributes *nvml = NULL;
unsigned int count;
unsigned int *nvctrlToNvmlId;
@@ -300,7 +292,9 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttributes(NvCtrlAttributePrivateHandle *h)
}
/* Fill the NV-CONTROL to NVML IDs dictionary */
- matchNvCtrlWithNvmlIds(h, count, &nvctrlToNvmlId);
+ if (!matchNvCtrlWithNvmlIds(h, count, &nvctrlToNvmlId)) {
+ goto fail;
+ }
/*
* Fill 'sensorCountPerGPU', 'coolerCountPerGPU' and properly set
@@ -366,10 +360,6 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttributes(NvCtrlAttributePrivateHandle *h)
free(nvml->coolerCountPerGPU);
free(nvml);
return NULL;
-
-#else
- return NULL;
-#endif
}
@@ -380,8 +370,6 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttributes(NvCtrlAttributePrivateHandle *h)
void NvCtrlNvmlAttributesClose(NvCtrlAttributePrivateHandle *h)
{
-#ifdef NVML_AVAILABLE
-
/* Check parameters */
if (h == NULL || h->nvml == NULL) {
return;
@@ -391,8 +379,6 @@ void NvCtrlNvmlAttributesClose(NvCtrlAttributePrivateHandle *h)
free(h->nvml->coolerCountPerGPU);
free(h->nvml);
h->nvml = NULL;
-
-#endif
}
@@ -404,8 +390,6 @@ void NvCtrlNvmlAttributesClose(NvCtrlAttributePrivateHandle *h)
ReturnStatus NvCtrlNvmlQueryTargetCount(const CtrlTarget *ctrl_target,
int target_type, int *val)
{
-#ifdef NVML_AVAILABLE
-
const NvCtrlAttributePrivateHandle *h = getPrivateHandleConst(ctrl_target);
if (!__isNvmlLoaded) {
@@ -438,10 +422,6 @@ ReturnStatus NvCtrlNvmlQueryTargetCount(const CtrlTarget *ctrl_target,
}
return NvCtrlSuccess;
-
-#else
- return NvCtrlMissingExtension;
-#endif
}
@@ -450,7 +430,7 @@ ReturnStatus NvCtrlNvmlQueryTargetCount(const CtrlTarget *ctrl_target,
* Get NVML String Attribute Values
*/
-#ifdef NVML_AVAILABLE
+#ifdef NVML_EXPERIMENTAL
static ReturnStatus NvCtrlNvmlGetGPUStringAttribute(const CtrlTarget *ctrl_target,
int attr, char **ptr)
@@ -512,17 +492,16 @@ static ReturnStatus NvCtrlNvmlGetGPUStringAttribute(const CtrlTarget *ctrl_targe
return NvCtrlNotSupported;
}
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus NvCtrlNvmlGetStringAttribute(const CtrlTarget *ctrl_target,
int attr, char **ptr)
{
-#ifdef NVML_AVAILABLE
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
+#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -553,7 +532,7 @@ ReturnStatus NvCtrlNvmlGetStringAttribute(const CtrlTarget *ctrl_target,
}
#else
- return NvCtrlMissingExtension;
+ return NvCtrlNotSupported;
#endif
}
@@ -563,7 +542,7 @@ ReturnStatus NvCtrlNvmlGetStringAttribute(const CtrlTarget *ctrl_target,
* Set NVML String Attribute Values
*/
-#ifdef NVML_AVAILABLE
+#ifdef NVML_EXPERIMENTAL
static ReturnStatus NvCtrlNvmlSetGPUStringAttribute(CtrlTarget *ctrl_target,
int attr, const char *ptr)
@@ -604,17 +583,16 @@ static ReturnStatus NvCtrlNvmlSetGPUStringAttribute(CtrlTarget *ctrl_target,
return NvCtrlNotSupported;
}
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus NvCtrlNvmlSetStringAttribute(CtrlTarget *ctrl_target,
int attr, const char *ptr)
{
-#ifdef NVML_AVAILABLE
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
+#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -646,7 +624,7 @@ ReturnStatus NvCtrlNvmlSetStringAttribute(CtrlTarget *ctrl_target,
}
#else
- return NvCtrlMissingExtension;
+ return NvCtrlNotSupported;
#endif
}
@@ -656,8 +634,6 @@ ReturnStatus NvCtrlNvmlSetStringAttribute(CtrlTarget *ctrl_target,
* Get NVML Attribute Values
*/
-#ifdef NVML_AVAILABLE
-
static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
int attr, int64_t *val)
{
@@ -673,6 +649,7 @@ static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
ret = nvmlDeviceGetHandleByIndex(h->nvml->deviceIdx, &device);
if (ret == NVML_SUCCESS) {
switch (attr) {
+#ifdef NVML_EXPERIMENTAL
case NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY:
case NV_CTRL_USED_DEDICATED_GPU_MEMORY:
{
@@ -737,7 +714,17 @@ static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
case NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH:
ret = nvmlDeviceGetMaxPcieLinkWidth(device, &res);
break;
-
+#else
+ case NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY:
+ case NV_CTRL_USED_DEDICATED_GPU_MEMORY:
+ case NV_CTRL_PCI_DOMAIN:
+ case NV_CTRL_PCI_BUS:
+ case NV_CTRL_PCI_DEVICE:
+ case NV_CTRL_PCI_FUNCTION:
+ case NV_CTRL_PCI_ID:
+ case NV_CTRL_GPU_PCIE_GENERATION:
+ case NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH:
+#endif // NVML_EXPERIMENTAL
case NV_CTRL_VIDEO_RAM:
case NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH:
case NV_CTRL_GPU_PCIE_MAX_LINK_SPEED:
@@ -803,6 +790,14 @@ static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
*/
return NvCtrlNotSupported;
+ case NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE:
+ {
+ nvmlGpuVirtualizationMode_t mode;
+ ret = nvmlDeviceGetVirtualizationMode(device, &mode);
+ res = mode;
+ }
+ break;
+
default:
/* Did we forget to handle a GPU integer attribute? */
nv_warning_msg("Unhandled integer attribute %s (%d) of GPU "
@@ -822,6 +817,8 @@ static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
return NvCtrlNotSupported;
}
+#ifdef NVML_EXPERIMENTAL
+
static int getThermalCoolerId(const NvCtrlAttributePrivateHandle *h,
unsigned int thermalCoolerCount,
const unsigned int *thermalCoolerCountPerGPU)
@@ -956,14 +953,11 @@ static ReturnStatus NvCtrlNvmlGetCoolerAttribute(const CtrlTarget *ctrl_target,
printNvmlError(ret);
return NvCtrlNotSupported;
}
-
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus NvCtrlNvmlGetAttribute(const CtrlTarget *ctrl_target,
int attr, int64_t *val)
{
-#ifdef NVML_AVAILABLE
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
@@ -978,17 +972,19 @@ ReturnStatus NvCtrlNvmlGetAttribute(const CtrlTarget *ctrl_target,
switch (NvCtrlGetTargetType(ctrl_target)) {
case GPU_TARGET:
return NvCtrlNvmlGetGPUAttribute(ctrl_target, attr, val);
+#ifdef NVML_EXPERIMENTAL
case THERMAL_SENSOR_TARGET:
return NvCtrlNvmlGetThermalAttribute(ctrl_target, attr, val);
case COOLER_TARGET:
return NvCtrlNvmlGetCoolerAttribute(ctrl_target, attr, val);
+#else
+ case THERMAL_SENSOR_TARGET:
+ case COOLER_TARGET:
+ return NvCtrlNotSupported;
+#endif
default:
return NvCtrlBadHandle;
}
-
-#else
- return NvCtrlMissingExtension;
-#endif
}
@@ -997,7 +993,7 @@ ReturnStatus NvCtrlNvmlGetAttribute(const CtrlTarget *ctrl_target,
* Set NVML Attribute Values
*/
-#ifdef NVML_AVAILABLE
+#ifdef NVML_EXPERIMENTAL
static ReturnStatus NvCtrlNvmlSetGPUAttribute(CtrlTarget *ctrl_target,
int attr, int index, int val)
@@ -1097,17 +1093,16 @@ static ReturnStatus NvCtrlNvmlSetCoolerAttribute(CtrlTarget *ctrl_target,
return NvCtrlNotSupported;
}
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus NvCtrlNvmlSetAttribute(CtrlTarget *ctrl_target, int attr,
int index, int val)
{
-#ifdef NVML_AVAILABLE
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
+#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1133,7 +1128,7 @@ ReturnStatus NvCtrlNvmlSetAttribute(CtrlTarget *ctrl_target, int attr,
}
#else
- return NvCtrlMissingExtension;
+ return NvCtrlNotSupported;
#endif
}
@@ -1143,7 +1138,7 @@ ReturnStatus NvCtrlNvmlSetAttribute(CtrlTarget *ctrl_target, int attr,
* Get NVML Binary Attribute Values
*/
-#ifdef NVML_AVAILABLE
+#ifdef NVML_EXPERIMENTAL
static ReturnStatus
NvCtrlNvmlGetGPUBinaryAttribute(const CtrlTarget *ctrl_target,
@@ -1192,18 +1187,17 @@ NvCtrlNvmlGetGPUBinaryAttribute(const CtrlTarget *ctrl_target,
return NvCtrlNotSupported;
}
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus
NvCtrlNvmlGetBinaryAttribute(const CtrlTarget *ctrl_target,
int attr, unsigned char **data, int *len)
{
-#ifdef NVML_AVAILABLE
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
+#ifdef NVML_EXPERIMENTAL
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1237,7 +1231,7 @@ NvCtrlNvmlGetBinaryAttribute(const CtrlTarget *ctrl_target,
}
#else
- return NvCtrlMissingExtension;
+ return NvCtrlNotSupported;
#endif
}
@@ -1247,7 +1241,7 @@ NvCtrlNvmlGetBinaryAttribute(const CtrlTarget *ctrl_target,
* Get NVML Valid String Attribute Values
*/
-#ifdef NVML_AVAILABLE
+#ifdef NVML_EXPERIMENTAL
static ReturnStatus
NvCtrlNvmlGetGPUValidStringAttributeValues(int attr,
@@ -1279,20 +1273,19 @@ NvCtrlNvmlGetGPUValidStringAttributeValues(int attr,
return NvCtrlSuccess;
}
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus
NvCtrlNvmlGetValidStringAttributeValues(const CtrlTarget *ctrl_target,
int attr,
CtrlAttributeValidValues *val)
{
-#ifdef NVML_AVAILABLE
- ReturnStatus ret;
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
+#ifdef NVML_EXPERIMENTAL
+ ReturnStatus ret;
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1339,7 +1332,7 @@ NvCtrlNvmlGetValidStringAttributeValues(const CtrlTarget *ctrl_target,
return ret;
#else
- return NvCtrlMissingExtension;
+ return NvCtrlNotSupported;
#endif
}
@@ -1349,7 +1342,7 @@ NvCtrlNvmlGetValidStringAttributeValues(const CtrlTarget *ctrl_target,
* Get NVML Valid Attribute Values
*/
-#ifdef NVML_AVAILABLE
+#ifdef NVML_EXPERIMENTAL
static ReturnStatus
NvCtrlNvmlGetGPUValidAttributeValues(const CtrlTarget *ctrl_target, int attr,
@@ -1554,20 +1547,19 @@ NvCtrlNvmlGetCoolerValidAttributeValues(const CtrlTarget *ctrl_target,
return NvCtrlNotSupported;
}
-#endif // NVML_AVAILABLE
+#endif // NVML_EXPERIMENTAL
ReturnStatus
NvCtrlNvmlGetValidAttributeValues(const CtrlTarget *ctrl_target,
int attr,
CtrlAttributeValidValues *val)
{
-#ifdef NVML_AVAILABLE
- ReturnStatus ret;
-
if (!__isNvmlLoaded) {
return NvCtrlMissingExtension;
}
+#ifdef NVML_EXPERIMENTAL
+ ReturnStatus ret;
/*
* This should't be reached for target types that are not handled through
* NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1621,7 +1613,7 @@ NvCtrlNvmlGetValidAttributeValues(const CtrlTarget *ctrl_target,
return ret;
#else
- return NvCtrlMissingExtension;
+ return NvCtrlNotSupported;
#endif
}
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h b/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h
index a96840e..ce8c383 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesPrivate.h
@@ -79,15 +79,11 @@
/* Useful macros to deal with target types */
-#ifndef NVML_AVAILABLE
-#define TARGET_TYPE_IS_NVML_COMPATIBLE(_TARGET_TYPE) (FALSE)
-#else
/* XXX Modify to be TRUE only for target types which are NVML-related */
#define TARGET_TYPE_IS_NVML_COMPATIBLE(_TARGET_TYPE_) \
(((_TARGET_TYPE_) == GPU_TARGET) || \
((_TARGET_TYPE_) == THERMAL_SENSOR_TARGET) || \
((_TARGET_TYPE_) == COOLER_TARGET))
-#endif
#define TARGET_TYPE_NEEDS_NVCONTROL(_TARGET_TYPE_) \
(!(TARGET_TYPE_IS_NVML_COMPATIBLE(_TARGET_TYPE_)))
diff --git a/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c b/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c
index 61cdcbf..1b77575 100644
--- a/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c
+++ b/src/libXNVCtrlAttributes/NvCtrlAttributesUtils.c
@@ -856,6 +856,7 @@ static Bool load_system_info(CtrlSystem *system, const char *display)
for (target_type = 0;
target_type < MAX_TARGET_TYPES;
target_type++) {
+ NvCtrlAttributePrivateHandle *h = getPrivateHandle(nvmlQueryTarget);
targetTypeInfo = NvCtrlGetTargetTypeInfo(target_type);
target_count = 0;
@@ -872,7 +873,7 @@ static Bool load_system_info(CtrlSystem *system, const char *display)
target_count = ScreenCount(system->dpy);
}
}
- else if ((nvmlQueryTarget != NULL) &&
+ else if ((h != NULL) && (h->nvml != NULL) &&
TARGET_TYPE_IS_NVML_COMPATIBLE(target_type)) {
status = NvCtrlNvmlQueryTargetCount(nvmlQueryTarget,
diff --git a/src/parse.c b/src/parse.c
index 135e2a3..ea4938d 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -227,6 +227,7 @@ const AttributeTableEntry attributeTable[] = {
{ "FrameLockMasterable", NV_CTRL_FRAMELOCK_MASTERABLE, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,1,0,0,0} }, "DEPRECATED: use \"FrameLockDisplayConfig\" instead." },
{ "FrameLockSlaveable", NV_CTRL_FRAMELOCK_SLAVEABLE, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,1,0,0,0} }, "DEPRECATED: use \"FrameLockDisplayConfig\" instead." },
{ "FrameLockFPGARevision", NV_CTRL_FRAMELOCK_FPGA_REVISION, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,0,0,0,0} }, "Returns the FPGA revision of the Frame Lock device." },
+ { "FrameLockFirmwareVersion", NV_CTRL_FRAMELOCK_FIRMWARE_VERSION, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,0,0,0,0} }, "Returns the firmware version of the Frame Lock device." },
{ "FrameLockSyncRate4", NV_CTRL_FRAMELOCK_SYNC_RATE_4, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,0,0,0,0} }, "Returns the refresh rate that the frame lock board is sending to the GPU in 1/10000 Hz (i.e., to get the refresh rate in Hz, divide the returned value by 10000)." },
{ "FrameLockSyncDelayResolution", NV_CTRL_FRAMELOCK_SYNC_DELAY_RESOLUTION, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,0,0,0,0} }, "Returns the number of nanoseconds that one unit of FrameLockSyncDelay corresponds to." },
{ "FrameLockIncomingHouseSyncRate", NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE, INT_ATTR, {1,1,0,0,1,0}, { .int_flags = {0,0,0,0,0,0,0} }, "Returns the rate of the incoming house sync signal to the frame lock board, in mHz (Millihertz) (i.e., to get the house sync rate in Hz, divide the returned value by 1000)." },
@@ -388,7 +389,7 @@ const int attributeTableLen = ARRAY_LEN(attributeTable);
* the last attribute that the table knows about.
*/
-#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET_ALL_PERFORMANCE_LEVELS
+#if NV_CTRL_LAST_ATTRIBUTE != NV_CTRL_FRAMELOCK_FIRMWARE_VERSION
#warning "Have you forgotten to add a new integer attribute to attributeTable?"
#endif
diff --git a/src/src.mk b/src/src.mk
index 36d4112..77ac7ad 100644
--- a/src/src.mk
+++ b/src/src.mk
@@ -103,6 +103,8 @@ IMAGE_DATA_EXTRA_DIST += image_data/sdi.png
IMAGE_DATA_EXTRA_DIST += image_data/sdi_pixdata.h
IMAGE_DATA_EXTRA_DIST += image_data/sdi_shared_sync_bnc.png
IMAGE_DATA_EXTRA_DIST += image_data/sdi_shared_sync_bnc_pixdata.h
+IMAGE_DATA_EXTRA_DIST += image_data/server_licensing.png
+IMAGE_DATA_EXTRA_DIST += image_data/server_licensing_pixdata.h
IMAGE_DATA_EXTRA_DIST += image_data/slimm.png
IMAGE_DATA_EXTRA_DIST += image_data/slimm_pixdata.h
IMAGE_DATA_EXTRA_DIST += image_data/solaris.png
diff --git a/src/version.h b/src/version.h
index ed44ede..286aa3e 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define NVIDIA_VERSION "370.28"
+#define NVIDIA_VERSION "375.10"
diff --git a/src/version.mk b/src/version.mk
index 184e0ee..b31360a 100644
--- a/src/version.mk
+++ b/src/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 370.28
+NVIDIA_VERSION = 375.10
diff --git a/version.mk b/version.mk
index 184e0ee..b31360a 100644
--- a/version.mk
+++ b/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 370.28
+NVIDIA_VERSION = 375.10