[
  {
    "path": ".gitignore",
    "content": "*.swp\n*.png\ntst_first\ntst_graphics\nTAGS\n\n"
  },
  {
    "path": "COPYING",
    "content": "            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n                    Version 2, December 2004\n\n Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>\n\n Everyone is permitted to copy and distribute verbatim or modified\n copies of this license document, and changing it is allowed as long\n as the name is changed.\n\n            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. You just DO WHAT THE FUCK YOU WANT TO.\n"
  },
  {
    "path": "Makefile",
    "content": "all: callback.go types_auto.go gofmt\n\ninstall:\n\tgo install -p 6 . ./ewmh ./gopher ./icccm ./keybind ./motif ./mousebind \\\n\t\t./xcursor ./xevent ./xgraphics ./xinerama ./xprop ./xrect ./xwindow\n\npush:\n\tgit push origin master\n\tgit push github master\n\nbuild-ex:\n\tfind ./_examples/ -type d -wholename './_examples/[a-z]*' -print0 \\\n\t\t| xargs -0 go build -p 6\n\ngofmt:\n\tgofmt -w *.go */*.go _examples/*/*.go\n\tcolcheck *.go */*.go _examples/*/*.go\n\ncallback.go:\n\tscripts/write-events callbacks > xevent/callback.go\n\ntypes_auto.go:\n\tscripts/write-events evtypes > xevent/types_auto.go\n\ntags:\n\tfind ./ \\( -name '*.go' -and -not -wholename './tests/*' -and -not -wholename './_examples/*' \\) -print0 | xargs -0 gotags > TAGS\n\nloc:\n\tfind ./ -name '*.go' -and -not -wholename './tests*' -and -not -name '*keysymdef.go' -and -not -name '*gopher.go' -print | sort | xargs wc -l\n\nex-%:\n\tgo run _examples/$*/main.go\n\ngopherimg:\n\tgo-bindata -f GopherPng -p gopher -i gopher/gophercolor-small.png -o gopher/gopher.go\n\n"
  },
  {
    "path": "README",
    "content": "xgbutil is a utility library designed to work with the X Go Binding. This\nproject's main goal is to make various X related tasks easier. For example,\nbinding keys, using the EWMH or ICCCM specs with the window manager,\nmoving/resizing windows, assigning function callbacks to particular events,\ndrawing images to a window, etc.\n\nxgbutil attempts to be thread safe, but it has not been completely tested in\nthis regard. In general, the X event loop implemented in the xevent package is\nsequential. The idea is to be sequential by default, and let the user spawn\nconcurrent code at their discretion. (i.e., the complexity of making the main\nevent loop generally concurrent is vast.)\n\nYou may sleep safely at night by assuming that XGB is thread safe, though.\n\nTo start using xgbutil, you should have at least a passing familiarity with X.\nYour first stop should be the examples directory.\n\nInstallation\n============\ngo get github.com/BurntSushi/xgbutil\n\nDependencies\n============\nXGB is the main dependency. Use of the xgraphics packages requires graphics-go\nand freetype-go.\n\nXGB project URL: https://github.com/BurntSushi/xgb\n\nQuick Example\n=============\ngo get github.com/BurntSushi/xgbutil/_examples/window-name-sizes\n\"$GOPATH\"/bin/window-name-sizes\n\nThe output will be a list of names of all top-level windows and their geometry\nincluding window manager decorations. (Assuming your window manager supports\nsome basic EWMH properties.)\n\nDocumentation\n=============\nhttps://godoc.org/github.com/BurntSushi/xgbutil\n\nExamples\n========\nThere are several examples in the examples directory covering common use cases.\nThey are heavily documented and should run out of the box.\n\nPython\n======\nAn older project of mine, xpybutil, served as inspiration for xgbutil. If you\nwant to use Python, xpybutil should help quite a bit. Please note though, that\nat this point, xgbutil provides a lot more functionality and is much better\ndocumented.\n\nxpybutil project URL: https://github.com/BurntSushi/xpybutil\n\n"
  },
  {
    "path": "STYLE",
    "content": "I like to keep all my code to 80 columns or less. I have plenty of screen real \nestate, but enjoy 80 columns so that I can have multiple code windows open side \nto side and not be plagued by the ugly auto-wrapping of a text editor.\n\nIf you don't oblige me, I will fix any patch you submit to abide 80 columns.\n\nNote that this style restriction does not preclude gofmt, but introduces a few\npeculiarities. The first is that gofmt will occasionally add spacing (typically \nto comments) that ends up going over 80 columns. Either shorten the comment or \nput it on its own line.\n\nThe second and more common hiccup is when a function definition extends beyond \n80 columns. If one adds line breaks to keep it below 80 columns, gofmt will \nindent all subsequent lines in a function definition to the same indentation \nlevel of the function body. This results in a less-than-ideal separation \nbetween function definition and function body. To remedy this, simply add a \nline break like so:\n\n  func RestackWindowExtra(xu *xgbutil.XUtil, win xproto.Window, stackMode int,\n    sibling xproto.Window, source int) error {\n\n    return ClientEvent(xu, win, \"_NET_RESTACK_WINDOW\", source, int(sibling),\n      stackMode)\n  }\n\nSomething similar should also be applied to long 'if' or 'for' conditionals, \nalthough it would probably be preferrable to break up the conditional to \nsmaller chunks with a few helper variables.\n\n"
  },
  {
    "path": "_examples/change-cursor/main.go",
    "content": "// Example change-cursor shows how to use the cursor package to change the\n// X cursor in a particular window. To see the new cursor, move your cursor\n// into the window created by this program.\n// Note that this only shows how to use one of the pre-defined cursors built\n// into X using the \"cursor\" font. Creating your own cursor with your own\n// image is a bit more complex, and probably not an instructive example.\n//\n// While this example shows how to set a cursor in an entire window, the cursor\n// value returned from xcursor.CreateCursor[Extra] can be used in pointer\n// grab requests too. (So that the cursor changes during the grab.)\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xcursor\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create the cursor. You can find a list of available cursors in\n\t// xcursor/cursordef.go.\n\t// We'll make an umbrella here, with an orange foreground and a blue\n\t// background. (The background it typically the outline of the cursor.)\n\t// Note that each component of the RGB color is a 16 bit color. I think\n\t// using the most significant byte to specify each component is good\n\t// enough.\n\tcursor, err := xcursor.CreateCursorExtra(X, xcursor.Umbrella,\n\t\t0xff00, 0x5500, 0x0000,\n\t\t0x3300, 0x6600, 0xff00)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create a new window. In the create window request, we'll set the\n\t// background color and set the cursor we created above.\n\t// This results in changing the cursor only when it moves into this window.\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\twin.Create(X.RootWin(), 0, 0, 500, 500,\n\t\txproto.CwBackPixel|xproto.CwCursor,\n\t\t0xffffffff, uint32(cursor))\n\twin.Map()\n\n\t// We can free the cursor now that we've set it.\n\t// If you plan on using this cursor again, then it shouldn't be freed.\n\t// (i.e., if you try to free this before setting it as the cursor in a\n\t// window, you'll get a BadCursor error when trying to use it.)\n\txproto.FreeCursor(X.Conn(), cursor)\n\n\t// Block. No need to process any events.\n\tselect {}\n}\n"
  },
  {
    "path": "_examples/compress-events/main.go",
    "content": "/*\nExample compress-events shows how to manipulate the xevent package's event\nqueue to compress events that arrive more often than you'd like to process\nthem. This example in particular shows how to compress MotionNotify events,\nbut the same approach could be used to compress ConfigureNotify events.\n\nNote that we show the difference between compressed and uncompressed\nMotionNotify events by displaying two windows that listen for MotionNotify\nevents. The green window compresses them while the red window does not.\nHovering over each window will print the x and y positions in each\nMotionNotify event received. You should notice that the red window\nlags behind the pointer (particularly if you moved the pointer quickly in\nand out of the window) while the green window always keeps up, regardless\nof the speed of the pointer.\n\nIn each case, we simulate work by sleeping for some amount of time. (The\nwhole point of compressing events is that there is too much work to be done\nfor each event.)\n\nNote that when compressing events, you should always make sure that the\nevent you're compressing *ought* to be compressed. For example, with\nMotionNotify events, if the Event field changes, then it applies to a\ndifferent window and probably shouldn't be compressed with MotionNotify\nevents for other windows.\n\nFinally, compressing events implicitly assumes that the event handler doing\nthe compression is the *only* event handler for a particular (event, window)\ntuple. If there is more than one event handler for a single (event, window)\ntuple and one of them does compression, the other will be left out in the\ncold. (Since the main event loop is subverted and won't process the\ncompressed events in the usual way.)\n\nN.B. This functionality isn't included in xgbutil because event compression\nisn't something that is always desirable, and the conditions under which\ncompression happens can vary. In particular, compressing ConfigureRequest\nevents from the perspective of the window manager can be faulty, since\nchanges to other properties (like WM_NORMAL_HINTS) can change the semantics\nof a ConfigureRequest event. (i.e., your compression would need to\nspecifically look for events that could change future ConfigureRequest\nevents.)\n*/\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\n// workTime is the amount of time to sleep to simulate \"work\" in response to\n// MotionNotify events. Increasing this will exacerbate the difference\n// between the green and red windows. But if you increase it too much,\n// the red window starts to *really* lag, and you'll probably have to kill\n// the program.\nvar workTime = 50 * time.Millisecond\n\n// newWindow creates a new window that listens to MotionNotify events with\n// the given backgroundcolor.\nfunc newWindow(X *xgbutil.XUtil, color uint32) *xwindow.Window {\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\terr = win.CreateChecked(X.RootWin(), 0, 0, 400, 400,\n\t\txproto.CwBackPixel|xproto.CwEventMask,\n\t\tcolor, xproto.EventMaskPointerMotion)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\twin.Map()\n\treturn win\n}\n\n// compressMotionNotify takes a MotionNotify event, and inspects the event\n// queue for any future MotionNotify events that can be received without\n// blocking. The most recent MotionNotify event is then returned.\n// Note that we need to make sure that the Event, Child, Detail, State, Root\n// and SameScreen fields are the same to ensure the same window/action is\n// generating events. That is, we are only compressing the RootX, RootY,\n// EventX and EventY fields.\n// This function is not thread safe, since Peek returns a *copy* of the\n// event queue---which could be out of date by the time we dequeue events.\nfunc compressMotionNotify(X *xgbutil.XUtil,\n\tev xevent.MotionNotifyEvent) xevent.MotionNotifyEvent {\n\n\t// We force a round trip request so that we make sure to read all\n\t// available events.\n\tX.Sync()\n\txevent.Read(X, false)\n\n\t// The most recent MotionNotify event that we'll end up returning.\n\tlaste := ev\n\n\t// Look through each event in the queue. If it's an event and it matches\n\t// all the fields in 'ev' that are detailed above, then set it to 'laste'.\n\t// In which case, we'll also dequeue the event, otherwise it will be\n\t// processed twice!\n\t// N.B. If our only goal was to find the most recent relevant MotionNotify\n\t// event, we could traverse the event queue backwards and simply use\n\t// the first MotionNotify we see. However, this could potentially leave\n\t// other MotionNotify events in the queue, which we *don't* want to be\n\t// processed. So we stride along and just pick off MotionNotify events\n\t// until we don't see any more.\n\tfor i, ee := range xevent.Peek(X) {\n\t\tif ee.Err != nil { // This is an error, skip it.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Use type assertion to make sure this is a MotionNotify event.\n\t\tif mn, ok := ee.Event.(xproto.MotionNotifyEvent); ok {\n\t\t\t// Now make sure all appropriate fields are equivalent.\n\t\t\tif ev.Event == mn.Event && ev.Child == mn.Child &&\n\t\t\t\tev.Detail == mn.Detail && ev.State == mn.State &&\n\t\t\t\tev.Root == mn.Root && ev.SameScreen == mn.SameScreen {\n\n\t\t\t\t// Set the most recent/valid motion notify event.\n\t\t\t\tlaste = xevent.MotionNotifyEvent{&mn}\n\n\t\t\t\t// We cheat and use the stack semantics of defer to dequeue\n\t\t\t\t// most recent motion notify events first, so that the indices\n\t\t\t\t// don't become invalid. (If we dequeued oldest first, we'd\n\t\t\t\t// have to account for all future events shifting to the left\n\t\t\t\t// by one.)\n\t\t\t\tdefer func(i int) { xevent.DequeueAt(X, i) }(i)\n\t\t\t}\n\t\t}\n\t}\n\n\t// This isn't strictly necessary, but is correct. We should update\n\t// xgbutil's sense of time with the most recent event processed.\n\t// This is typically done in the main event loop, but since we are\n\t// subverting the main event loop, we should take care of it.\n\tX.TimeSet(laste.Time)\n\n\treturn laste\n}\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create window for receiving compressed MotionNotify events.\n\tcwin := newWindow(X, 0x00ff00)\n\n\t// Attach event handler for MotionNotify that compresses events.\n\txevent.MotionNotifyFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.MotionNotifyEvent) {\n\t\t\tev = compressMotionNotify(X, ev)\n\t\t\tfmt.Printf(\"COMPRESSED: (EventX %d, EventY %d)\\n\",\n\t\t\t\tev.EventX, ev.EventY)\n\t\t\ttime.Sleep(workTime)\n\t\t}).Connect(X, cwin.Id)\n\n\t// Create window for receiving uncompressed MotionNotify events.\n\tuwin := newWindow(X, 0xff0000)\n\n\t// Attach event handler for MotionNotify that does not compress events.\n\txevent.MotionNotifyFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.MotionNotifyEvent) {\n\t\t\tfmt.Printf(\"UNCOMPRESSED: (EventX %d, EventY %d)\\n\",\n\t\t\t\tev.EventX, ev.EventY)\n\t\t\ttime.Sleep(workTime)\n\t\t}).Connect(X, uwin.Id)\n\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/doc.go",
    "content": "/*\nPackage examples contains several complete examples depicting some common use\ncases of xgbutil.\n\nThe examples included are designed to either demonstrate how a particular\nfacility of xgbutil works, or how to accomplish some common goal when using X.\n\nFor example, example simple-keybinding demonstrates how to use xgbutil to\nrespond to particular key presses while example graceful-window-close shows\nhow to close windows without killing your connection to X.\n\nMy goal is that each example demonstrates one thing, although the nature of X\ntypically requires some amount of boilerplate so that some examples are a bit\nmore bloated than I would like.\n\nIf you have any suggestions for other examples to include, I'd be happy to hear\nthem. You may post them at the main project page:\nhttps://github.com/BurntSushi/xgbutil.\n*/\npackage documentation\n"
  },
  {
    "path": "_examples/draw-text/main.go",
    "content": "// Example draw-text shows how to draw text to an xgraphics.Image type.\npackage main\n\nimport (\n\t\"image\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n)\n\nvar (\n\t// The geometry of the canvas to draw text on.\n\tcanvasWidth, canvasHeight = 600, 100\n\n\t// The background color of the canvas.\n\tbg = xgraphics.BGRA{B: 0xff, G: 0x66, R: 0x33, A: 0xff}\n\n\t// The path to the font used to draw text.\n\tfontPath = \"/usr/share/fonts/TTF/FreeMonoBold.ttf\"\n\n\t// The color of the text.\n\tfg = xgraphics.BGRA{B: 0xff, G: 0xff, R: 0xff, A: 0xff}\n\n\t// The size of the text.\n\tsize = 20.0\n\n\t// The text to draw.\n\tmsg = \"This is some text drawn by xgraphics!\"\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Load some font. You may need to change the path depending upon your\n\t// system configuration.\n\tfontReader, err := os.Open(fontPath)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Now parse the font.\n\tfont, err := xgraphics.ParseFont(fontReader)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create some canvas.\n\tximg := xgraphics.New(X, image.Rect(0, 0, canvasWidth, canvasHeight))\n\tximg.For(func(x, y int) xgraphics.BGRA {\n\t\treturn bg\n\t})\n\n\t// Now write the text.\n\t_, _, err = ximg.Text(10, 10, fg, size, font, msg)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Compute extents of first line of text.\n\t_, firsth := xgraphics.Extents(font, size, msg)\n\n\t// Now show the image in its own window.\n\twin := ximg.XShowExtra(\"Drawing text using xgraphics\", true)\n\n\t// Now draw some more text below the above and demonstrate how to update\n\t// only the region we've updated.\n\t_, _, err = ximg.Text(10, 10+firsth, fg, size, font, \"Some more text.\")\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Now compute extents of the second line of text, so we know which region\n\t// to update.\n\tsecw, sech := xgraphics.Extents(font, size, \"Some more text.\")\n\n\t// Now repaint on the region that we drew text on. Then update the screen.\n\tbounds := image.Rect(10, 10+firsth, 10+secw, 10+firsth+sech)\n\tximg.SubImage(bounds).(*xgraphics.Image).XDraw()\n\tximg.XPaint(win.Id)\n\n\t// All we really need to do is block, which could be achieved using\n\t// 'select{}'. Invoking the main event loop however, will emit error\n\t// message if anything went seriously wrong above.\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/fullscreen/main.go",
    "content": "// Example fullscreen shows how to make a window showing the Go Gopher go\n// fullscreen and back using keybindings and EWMH.\npackage main\n\nimport (\n\t\"bytes\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/gopher\"\n\t\"github.com/BurntSushi/xgbutil/icccm\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/mousebind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tkeybind.Initialize(X) // call once before using keybind package\n\n\t// Read an example gopher image into a regular png image.\n\timg, _, err := image.Decode(bytes.NewBuffer(gopher.GopherPng()))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Now convert it into an X image.\n\tximg := xgraphics.NewConvert(X, img)\n\n\t// Now show it in a new window.\n\t// We set the window title and tell the program to quit gracefully when\n\t// the window is closed.\n\t// There is also a convenience method, XShow, that requires no parameters.\n\twin := showImage(ximg, \"The Go Gopher!\", true)\n\n\t// Listen for key press events.\n\twin.Listen(xproto.EventMaskKeyPress)\n\n\terr = keybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\tprintln(\"fullscreen!\")\n\t\t\terr := ewmh.WmStateReq(X, win.Id, ewmh.StateToggle,\n\t\t\t\t\"_NET_WM_STATE_FULLSCREEN\")\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t}).Connect(X, win.Id, \"f\", false)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\terr = keybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\tprintln(\"quit fullscreen!\")\n\t\t\terr := ewmh.WmStateReq(X, win.Id, ewmh.StateToggle,\n\t\t\t\t\"_NET_WM_STATE_FULLSCREEN\")\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t}).Connect(X, win.Id, \"Escape\", false)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// If we don't block, the program will end and the window will disappear.\n\t// We could use a 'select{}' here, but xevent.Main will emit errors if\n\t// something went wrong, so use that instead.\n\txevent.Main(X)\n}\n\n// This is a slightly modified version of xgraphics.XShowExtra that does\n// not set any resize constraints on the window (so that it can go\n// fullscreen).\nfunc showImage(im *xgraphics.Image, name string, quit bool) *xwindow.Window {\n\tif len(name) == 0 {\n\t\tname = \"xgbutil Image Window\"\n\t}\n\tw, h := im.Rect.Dx(), im.Rect.Dy()\n\n\twin, err := xwindow.Generate(im.X)\n\tif err != nil {\n\t\txgbutil.Logger.Printf(\"Could not generate new window id: %s\", err)\n\t\treturn nil\n\t}\n\n\t// Create a very simple window with dimensions equal to the image.\n\twin.Create(im.X.RootWin(), 0, 0, w, h, 0)\n\n\t// Make this window close gracefully.\n\twin.WMGracefulClose(func(w *xwindow.Window) {\n\t\txevent.Detach(w.X, w.Id)\n\t\tkeybind.Detach(w.X, w.Id)\n\t\tmousebind.Detach(w.X, w.Id)\n\t\tw.Destroy()\n\n\t\tif quit {\n\t\t\txevent.Quit(w.X)\n\t\t}\n\t})\n\n\t// Set WM_STATE so it is interpreted as a top-level window.\n\terr = icccm.WmStateSet(im.X, win.Id, &icccm.WmState{\n\t\tState: icccm.StateNormal,\n\t})\n\tif err != nil { // not a fatal error\n\t\txgbutil.Logger.Printf(\"Could not set WM_STATE: %s\", err)\n\t}\n\n\t// Set _NET_WM_NAME so it looks nice.\n\terr = ewmh.WmNameSet(im.X, win.Id, name)\n\tif err != nil { // not a fatal error\n\t\txgbutil.Logger.Printf(\"Could not set _NET_WM_NAME: %s\", err)\n\t}\n\n\t// Paint our image before mapping.\n\tim.XSurfaceSet(win.Id)\n\tim.XDraw()\n\tim.XPaint(win.Id)\n\n\t// Now we can map, since we've set all our properties.\n\t// (The initial map is when the window manager starts managing.)\n\twin.Map()\n\n\treturn win\n}\n"
  },
  {
    "path": "_examples/graceful-window-close/main.go",
    "content": "// Example graceful-window-close shows how to create windows that can be closed\n// without killing your X connection (and thereby destroying any other windows\n// you may have open). This is actually achieved through an ICCCM standard.\n// We add the WM_DELETE_WINDOW to the WM_PROTOCOLS property on our window.\n// This indicates to well-behaving window managers that a certain kind of\n// client message should be sent to our client when the window should be closed.\n// If we *don't* add the WM_DELETE_WINDOW to the WM_PROTOCOLS property, the\n// window manager will typically call KillClient---which will destroy the\n// window and your X connection.\n//\n// If you click inside one of the windows created, a new window will be\n// automatically created.\n//\n// The program will stop when all windows have been closed.\n//\n// For more information on the convention used please see\n// http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.7 and\n// http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8\npackage main\n\nimport (\n\t\"log\"\n\t\"math/rand\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/mousebind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\n// When counter reaches 0, exit.\nvar counter int32\n\n// Just iniaitlize the RNG seed for generating random background colors.\nfunc init() {\n\trand.Seed(time.Now().UnixNano())\n}\n\n// newWindow creates a new window with a random background color. It sets the\n// WM_PROTOCOLS property to contain the WM_DELETE_WINDOW atom. It also sets\n// up a ClientMessage event handler so that we know when to destroy the window.\n// We also set up a mouse binding so that clicking inside a window will\n// create another one.\nfunc newWindow(X *xgbutil.XUtil) {\n\tcounter++\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Get a random background color, create the window (ask to receive button\n\t// release events while we're at it) and map the window.\n\tbgColor := rand.Intn(0xffffff + 1)\n\twin.Create(X.RootWin(), 0, 0, 200, 200,\n\t\txproto.CwBackPixel|xproto.CwEventMask,\n\t\tuint32(bgColor), xproto.EventMaskButtonRelease)\n\n\t// WMGracefulClose does all of the work for us. It sets the appropriate\n\t// values for WM_PROTOCOLS, and listens for ClientMessages that implement\n\t// the WM_DELETE_WINDOW protocol. When one is found, the provided callback\n\t// is executed.\n\twin.WMGracefulClose(\n\t\tfunc(w *xwindow.Window) {\n\t\t\t// Detach all event handlers.\n\t\t\t// This should always be done when a window can no longer\n\t\t\t// receive events.\n\t\t\txevent.Detach(w.X, w.Id)\n\t\t\tmousebind.Detach(w.X, w.Id)\n\t\t\tw.Destroy()\n\n\t\t\t// Exit if there are no more windows left.\n\t\t\tcounter--\n\t\t\tif counter == 0 {\n\t\t\t\tos.Exit(0)\n\t\t\t}\n\t\t})\n\n\t// It's important that the map comes after setting WMGracefulClose, since\n\t// the WM isn't obliged to watch updates to the WM_PROTOCOLS property.\n\twin.Map()\n\n\t// A mouse binding so that a left click will spawn a new window.\n\t// Note that we don't issue a grab here. Typically, window managers will\n\t// grab a button press on the client window (which usually activates the\n\t// window), so that we'd end up competing with the window manager if we\n\t// tried to grab it.\n\t// Instead, we set a ButtonRelease mask when creating the window and attach\n\t// a mouse binding *without* a grab.\n\terr = mousebind.ButtonReleaseFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ButtonReleaseEvent) {\n\t\t\tnewWindow(X)\n\t\t}).Connect(X, win.Id, \"1\", false, false)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n}\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Anytime the mousebind (keybind) package is used, mousebind.Initialize\n\t// *should* be called once. In the case of the mousebind package, this\n\t// isn't strictly necessary (currently!), but the 'Drag' features of\n\t// the mousebind package won't work without it.\n\tmousebind.Initialize(X)\n\n\t// Create two windows to prove we can close one while keeping the\n\t// other alive.\n\tnewWindow(X)\n\tnewWindow(X)\n\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/image-speed/main.go",
    "content": "//This demonstration shows drawing entire generated images to an x window\n//and calculating the speed of the generation and the drawing operations\n//It should be noted that redrawing the entire image is inefficient, this demo\n//was made to show me how fast I could draw to the windows with this method.\npackage main\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n\t\"image\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\n\t//Initialize the keybind package\n\tkeybind.Initialize(X)\n\n\t//Create a window\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not generate a new window X id: %s\", err)\n\t}\n\twin.Create(X.RootWin(), 0, 0, 1024, 768, xproto.CwBackPixel, 0x606060ff)\n\n\t// Listen for Key{Press,Release} events.\n\twin.Listen(xproto.EventMaskKeyPress, xproto.EventMaskKeyRelease)\n\n\t// Map the window. This is what makes it on the screen\n\twin.Map()\n\n\t//Make a ...callback... for the events and connect\n\txevent.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.KeyPressEvent) {\n\t\t\tmodStr := keybind.ModifierString(e.State)\n\t\t\tkeyStr := keybind.LookupString(X, e.State, e.Detail)\n\t\t\tif len(modStr) > 0 {\n\t\t\t\tlog.Printf(\"Key: %s-%s\\n\", modStr, keyStr)\n\t\t\t} else {\n\t\t\t\tlog.Println(\"Key:\", keyStr)\n\t\t\t}\n\n\t\t\tif keybind.KeyMatch(X, \"Escape\", e.State, e.Detail) {\n\t\t\t\tif e.State&xproto.ModMaskControl > 0 {\n\t\t\t\t\tlog.Println(\"Control-Escape detected. Quitting...\")\n\t\t\t\t\txevent.Quit(X)\n\t\t\t\t}\n\t\t\t}\n\t\t}).Connect(X, win.Id)\n\n\t//So here i'm going to try to make a image..'\n\timg := xgraphics.New(X, image.Rect(0, 0, 1024, 768))\n\n\terr = img.XSurfaceSet(win.Id)\n\tif err != nil {\n\t\tlog.Printf(\"Error while setting window surface to image %d: %s\\n\",\n\t\t\twin, err)\n\t} else {\n\t\tlog.Printf(\"Window %d surface set to image OK\\n\", win)\n\t}\n\n\t// I /think/ XDraw actually sends data to server?\n\timg.XDraw()\n\t// I /think/ XPaint tells the server to paint image to window\n\timg.XPaint(win.Id)\n\n\t//Start the routine that updates the window\n\tgo updater(img, win)\n\n\t//This seems to start a main loop for listening to xevents\n\txevent.Main(X)\n}\n\nfunc updater(img *xgraphics.Image, win *xwindow.Window) {\n\t//We keep track of times based on 1024 frames\n\tframe := 0\n\tstart := time.Now()\n\tvar genStart, drawStart time.Time\n\tvar genTotal, drawTotal time.Duration\n\n\tfor {\n\t\tframe = frame + 1\n\t\tif frame > 1024 {\n\t\t\tframe = 0\n\t\t\tlog.Printf(\"Time elapsed: %s\\n\", time.Now().Sub(start))\n\t\t\tlog.Printf(\"Time generate: %s\\n\", genTotal)\n\t\t\tlog.Printf(\"Time drawing: %s\\n\", drawTotal)\n\t\t\tstart = time.Now()\n\t\t\tdrawTotal, genTotal = 0, 0\n\t\t}\n\n\t\tgenStart = time.Now()\n\t\tvar x, y, i int\n\t\tfor y = 0; y < 768; y++ {\n\t\t\t//set last pixel back to black\n\t\t\timg.SetBGRA(frame-1, y, xgraphics.BGRA{0, 0, 0, 255})\n\t\t\tfor i = 0; i < 10; i++ {\n\t\t\t\tx = i + frame\n\t\t\t\tif x > 1024 {\n\t\t\t\t\tx = 1024\n\t\t\t\t}\n\t\t\t\timg.SetBGRA(x, y, xgraphics.BGRA{0, 0, 255, 255})\n\t\t\t}\n\t\t}\n\t\tgenTotal += time.Now().Sub(genStart)\n\n\t\tdrawStart = time.Now()\n\t\t//hopefully using checked will block us from drawing again before x\n\t\t//draws although XDraw might block anyway, we can check for an error\n\t\t//here\n\t\terr := img.XDrawChecked()\n\t\tif err != nil {\n\t\t\tlog.Println(err)\n\t\t\treturn\n\t\t}\n\t\t//img.XDraw()\n\n\t\timg.XPaint(win.Id)\n\t\tdrawTotal += time.Now().Sub(drawStart)\n\t}\n}\n"
  },
  {
    "path": "_examples/keypress-english/main.go",
    "content": "// Example keypress-english shows how to convert the State (modifiers) and\n// Detail (keycode) members of Key{Press,Release} events to an english\n// string representation.\npackage main\n\nimport (\n\t\"flag\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nvar flagRoot = false\n\nfunc init() {\n\tlog.SetFlags(0)\n\tflag.BoolVar(&flagRoot, \"root\", flagRoot,\n\t\t\"When set, the keyboard will be grabbed on the root window. \"+\n\t\t\t\"Make sure you have a way to kill the window created with \"+\n\t\t\t\"the mouse.\")\n\tflag.Parse()\n}\n\nfunc main() {\n\n\t// Connect to the X server using the DISPLAY environment variable.\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Anytime the keybind (mousebind) package is used, keybind.Initialize\n\t// *should* be called once. It isn't strictly necessary, but allows your\n\t// keybindings to persist even if the keyboard mapping is changed during\n\t// run-time. (Assuming you're using the xevent package's event loop.)\n\t// It also handles the case when your modifier map is changed.\n\tkeybind.Initialize(X)\n\n\t// Create a new window. We will listen for key presses and translate them\n\t// only when this window is in focus. (Similar to how `xev` works.)\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not generate a new window X id: %s\", err)\n\t}\n\twin.Create(X.RootWin(), 0, 0, 500, 500, xproto.CwBackPixel, 0xffffffff)\n\n\t// Listen for Key{Press,Release} events.\n\twin.Listen(xproto.EventMaskKeyPress, xproto.EventMaskKeyRelease)\n\n\t// Map the window.\n\twin.Map()\n\n\t// Notice that we use xevent.KeyPressFun instead of keybind.KeyPressFun,\n\t// because we aren't trying to make a grab *and* because we want to listen\n\t// to *all* key press events, rather than just a particular key sequence\n\t// that has been pressed.\n\twid := win.Id\n\tif flagRoot {\n\t\twid = X.RootWin()\n\t}\n\txevent.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.KeyPressEvent) {\n\t\t\t// keybind.LookupString does the magic of implementing parts of\n\t\t\t// the X Keyboard Encoding to determine an english representation\n\t\t\t// of the modifiers/keycode tuple.\n\t\t\t// N.B. It's working for me, but probably isn't 100% correct in\n\t\t\t// all environments yet.\n\t\t\tmodStr := keybind.ModifierString(e.State)\n\t\t\tkeyStr := keybind.LookupString(X, e.State, e.Detail)\n\t\t\tif len(modStr) > 0 {\n\t\t\t\tlog.Printf(\"Key: %s-%s\\n\", modStr, keyStr)\n\t\t\t} else {\n\t\t\t\tlog.Println(\"Key:\", keyStr)\n\t\t\t}\n\n\t\t\tif keybind.KeyMatch(X, \"Escape\", e.State, e.Detail) {\n\t\t\t\tif e.State&xproto.ModMaskControl > 0 {\n\t\t\t\t\tlog.Println(\"Control-Escape detected. Quitting...\")\n\t\t\t\t\txevent.Quit(X)\n\t\t\t\t}\n\t\t\t}\n\t\t}).Connect(X, wid)\n\n\t// If we want root, then we take over the entire keyboard.\n\tif flagRoot {\n\t\tif err := keybind.GrabKeyboard(X, X.RootWin()); err != nil {\n\t\t\tlog.Fatalf(\"Could not grab keyboard: %s\", err)\n\t\t}\n\t\tlog.Println(\"WARNING: We are taking *complete* control of the root \" +\n\t\t\t\"window. The only way out is to press 'Control + Escape' or to \" +\n\t\t\t\"close the window with the mouse.\")\n\t}\n\n\t// Finally, start the main event loop. This will route any appropriate\n\t// KeyPressEvents to your callback function.\n\tlog.Println(\"Program initialized. Start pressing keys!\")\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/multiple-source-event-loop/main.go",
    "content": "// Example multiple-source-event-loop shows how to use the xevent package to\n// combine multiple sources in your main event loop. This is particularly\n// useful if your application can respond to user input from other sources.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xprop\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\n// otherSource serves as a placeholder from some other source of user input.\nfunc otherSource() chan int {\n\tc := make(chan int, 0)\n\tgo func() {\n\t\tdefer close(c)\n\n\t\ti := 1\n\t\tfor {\n\t\t\tc <- i\n\t\t\ti++\n\t\t\ttime.Sleep(time.Second)\n\t\t}\n\t}()\n\treturn c\n}\n\n// sendClientMessages is a goroutine that sends client messages to the root\n// window. We then listen to them later as a demonstration of responding to\n// X events. (They are sent with SubstructureNotify and SubstructureRedirect\n// masks set. So in order to receive them, we'll have to explicitly listen\n// to events of that type on the root window.)\nfunc xSource(X *xgbutil.XUtil) {\n\ti := 1\n\tfor {\n\t\tewmh.ClientEvent(X, X.RootWin(), \"NOOP\", i)\n\t\ti++\n\t\ttime.Sleep(200 * time.Millisecond)\n\t}\n}\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Start generating other source events.\n\totherChan := otherSource()\n\n\t// Start generating X events (by sending client messages to root window).\n\tgo xSource(X)\n\n\t// Listen to those X events.\n\txwindow.New(X, X.RootWin()).Listen(xproto.EventMaskSubstructureNotify)\n\n\t// Respond to those X events.\n\txevent.ClientMessageFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) {\n\t\t\tatmName, err := xprop.AtomName(X, ev.Type)\n\t\t\tif err != nil {\n\t\t\t\tlog.Fatal(err)\n\t\t\t}\n\t\t\tfmt.Printf(\"ClientMessage: %d. %s\\n\", ev.Data.Data32[0], atmName)\n\t\t}).Connect(X, X.RootWin())\n\n\t// Instead of using the usual xevent.Main, we use xevent.MainPing.\n\t// It runs the main event loop inside a goroutine and returns ping\n\t// channels, which are sent benign values right before an event is\n\t// dequeued and right after that event has finished running all callbacks\n\t// associated with it, respectively.\n\tpingBefore, pingAfter, pingQuit := xevent.MainPing(X)\n\tfor {\n\t\tselect {\n\t\tcase <-pingBefore:\n\t\t\t// Wait for the event to finish processing.\n\t\t\t<-pingAfter\n\t\tcase otherVal := <-otherChan:\n\t\t\tfmt.Printf(\"Processing other event: %d\\n\", otherVal)\n\t\tcase <-pingQuit:\n\t\t\tfmt.Printf(\"xevent loop has quit\")\n\t\t\treturn\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "_examples/pointer-painting/main.go",
    "content": "// Example pointer-painting shows how to draw on a window, MS Paint style.\n// This is an extremely involved example, but it showcases a lot of xgbutil\n// and how pieces of it can be tied together.\n//\n// If you're just starting with xgbutil, I highly recommend checking out the\n// other examples before attempting to digest this one.\npackage main\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/gopher\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/mousebind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nvar (\n\t// The color to use for the background.\n\tbg = xgraphics.BGRA{0x0, 0x0, 0x0, 0xff}\n\n\t// Different colors for drawing.\n\t// The keys represent the key sequences that must be pressed to\n\t// switch to the color value.\n\tpencils = map[string]xgraphics.BGRA{\n\t\t\"1\": xgraphics.BGRA{0xff, 0xff, 0xff, 0xff}, // white\n\t\t\"2\": xgraphics.BGRA{0xff, 0x0, 0x0, 0xff},   // blue\n\t\t\"3\": xgraphics.BGRA{0x0, 0xff, 0x0, 0xff},   // green\n\t\t\"4\": xgraphics.BGRA{0x0, 0x0, 0xff, 0xff},   // red\n\t\t\"5\": xgraphics.BGRA{0x0, 0x7f, 0xff, 0xff},  // orange\n\t\t\"6\": xgraphics.BGRA{0xaa, 0x0, 0xff, 0x55},  // transparent pink\n\t}\n\n\t// The current pencil color.\n\tpencil = xgraphics.BGRA{0xff, 0xff, 0xff, 0xff}\n\n\t// The size of the tip of the pencil, in pixels.\n\tpencilTip = 30\n\n\t// The width and height of the canvas.\n\twidth, height = 1000, 1000\n\n\t// The key sequence to use to clear the canvas.\n\tclearKey = \"c\"\n\n\t// Easter egg! Right click to draw a gopher with the following dimensions.\n\tgopherWidth, gopherHeight = 100, 100\n)\n\n// drawPencil takes an (x, y) position (from a MotionNotify event) and draws\n// a rectangle of size pencilTip on to canvas.\nfunc drawPencil(canvas *xgraphics.Image, win *xwindow.Window, x, y int) {\n\t// Create a subimage at (x, y) with pencilTip width and height from canvas.\n\t// Creating subimages is very cheap---no pixels are copied.\n\t// Moreover, when subimages are drawn to the screen, only the pixels in\n\t// the sub-image are sent to X.\n\ttipRect := midRect(x, y, pencilTip, pencilTip, width, height)\n\n\t// If the rectangle contains no pixels, don't draw anything.\n\tif tipRect.Empty() {\n\t\treturn\n\t}\n\n\t// Output a little message.\n\tlog.Printf(\"Drawing pencil point at (%d, %d)\", x, y)\n\n\t// Create the subimage of the canvas to draw to.\n\ttip := canvas.SubImage(tipRect).(*xgraphics.Image)\n\tfmt.Println(tip.Rect)\n\n\t// Now color each pixel in tip with the pencil color.\n\ttip.For(func(x, y int) xgraphics.BGRA {\n\t\treturn xgraphics.BlendBGRA(tip.At(x, y).(xgraphics.BGRA), pencil)\n\t})\n\n\t// Now draw the changes to the pixmap.\n\ttip.XDraw()\n\n\t// And paint them to the window.\n\ttip.XPaint(win.Id)\n}\n\n// drawGopher draws the gopher image to the canvas.\nfunc drawGopher(canvas *xgraphics.Image, gopher image.Image,\n\twin *xwindow.Window, x, y int) {\n\n\t// Find the rectangle of the canvas where we're going to draw the gopher.\n\tgopherRect := midRect(x, y, gopherWidth, gopherHeight, width, height)\n\n\t// If the rectangle contains no pixels, don't draw anything.\n\tif gopherRect.Empty() {\n\t\treturn\n\t}\n\n\t// Output a little message.\n\tlog.Printf(\"Drawing gopher at (%d, %d)\", x, y)\n\n\t// Get a subimage of the gopher that's in sync with gopherRect.\n\tgopherPt := image.Pt(gopher.Bounds().Min.X, gopher.Bounds().Min.Y)\n\tif gopherRect.Min.X == 0 {\n\t\tgopherPt.X = gopherWidth - gopherRect.Dx()\n\t}\n\tif gopherRect.Min.Y == 0 {\n\t\tgopherPt.Y = gopherHeight - gopherRect.Dy()\n\t}\n\n\t// Create the canvas subimage.\n\tsubCanvas := canvas.SubImage(gopherRect).(*xgraphics.Image)\n\n\t// Blend the gopher image into the sub-canvas.\n\t// This does alpha blending.\n\txgraphics.Blend(subCanvas, gopher, gopherPt)\n\n\t// Now draw the changes to the pixmap.\n\tsubCanvas.XDraw()\n\n\t// And paint them to the window.\n\tsubCanvas.XPaint(win.Id)\n}\n\n// clearCanvas erases all your pencil marks.\nfunc clearCanvas(canvas *xgraphics.Image, win *xwindow.Window) {\n\tlog.Println(\"Clearing canvas...\")\n\tcanvas.For(func(x, y int) xgraphics.BGRA {\n\t\treturn bg\n\t})\n\n\tcanvas.XDraw()\n\tcanvas.XPaint(win.Id)\n}\n\nfunc fatal(err error) {\n\tif err != nil {\n\t\tlog.Panic(err)\n\t}\n}\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tfatal(err)\n\n\t// Whenever the mousebind package is used, you must call Initialize.\n\t// Similarly for the keybind package.\n\tkeybind.Initialize(X)\n\tmousebind.Initialize(X)\n\n\t// Easter egg! Use a right click to draw a gopher.\n\tgopherPng, _, err := image.Decode(bytes.NewBuffer(gopher.GopherPng()))\n\tfatal(err)\n\n\t// Now scale it to a reasonable size.\n\tgopher := xgraphics.Scale(gopherPng, gopherWidth, gopherHeight)\n\n\t// Create a new xgraphics.Image. It automatically creates an X pixmap for\n\t// you, and handles drawing to windows in the XDraw, XPaint and\n\t// XSurfaceSet functions.\n\t// N.B. An error is possible since X pixmap allocation can fail.\n\tcanvas := xgraphics.New(X, image.Rect(0, 0, width, height))\n\n\t// Color in the background color.\n\tcanvas.For(func(x, y int) xgraphics.BGRA {\n\t\treturn bg\n\t})\n\n\t// Use the convenience function XShowExtra to create and map the\n\t// canvas window.\n\t// XShowExtra will also set the surface window of canvas for us.\n\t// We also use XShowExtra to set the name of the window and to quit the\n\t// main event loop when the window is closed.\n\twin := canvas.XShowExtra(\"Pointer painting\", true)\n\n\t// Listen for pointer motion events and key press events.\n\twin.Listen(xproto.EventMaskButtonPress | xproto.EventMaskButtonRelease |\n\t\txproto.EventMaskKeyPress)\n\n\t// The mousebind drag function runs three callbacks: one when the drag is\n\t// first started, another at each \"step\" in the drag, and a final one when\n\t// the drag is done.\n\t// The button sequence (in this case '1') is pressed, the first callback\n\t// is executed. If the first return value is true, the drag continues\n\t// and a pointer grab is initiated with the cursor id specified in the\n\t// second return value (use 0 to keep the cursor unchanged).\n\t// If it's false, the drag stops.\n\t// Note that Drag will automatically compress MotionNotify events.\n\tmousebind.Drag(X, win.Id, win.Id, \"1\", false,\n\t\tfunc(X *xgbutil.XUtil, rx, ry, ex, ey int) (bool, xproto.Cursor) {\n\t\t\tdrawPencil(canvas, win, ex, ey)\n\t\t\treturn true, 0\n\t\t},\n\t\tfunc(X *xgbutil.XUtil, rx, ry, ex, ey int) {\n\t\t\tdrawPencil(canvas, win, ex, ey)\n\t\t},\n\t\tfunc(X *xgbutil.XUtil, rx, ry, ex, ey int) {})\n\n\tmousebind.Drag(X, win.Id, win.Id, \"3\", false,\n\t\tfunc(X *xgbutil.XUtil, rx, ry, ex, ey int) (bool, xproto.Cursor) {\n\t\t\tdrawGopher(canvas, gopher, win, ex, ey)\n\t\t\treturn true, 0\n\t\t},\n\t\tfunc(X *xgbutil.XUtil, rx, ry, ex, ey int) {\n\t\t\tdrawGopher(canvas, gopher, win, ex, ey)\n\t\t},\n\t\tfunc(X *xgbutil.XUtil, rx, ry, ex, ey int) {})\n\n\t// Bind to the clear key specified, and just redraw the bg color.\n\tkeybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\tclearCanvas(canvas, win)\n\t\t}).Connect(X, win.Id, clearKey, false)\n\n\t// Bind a callback to each key specified in the 'pencils' color map.\n\t// The response is to simply switch the pencil color.\n\tfor key, clr := range pencils {\n\t\tc := clr\n\t\tkeybind.KeyPressFun(\n\t\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\t\tlog.Printf(\"Changing pencil color to: %#v\", c)\n\t\t\t\tpencil = c\n\t\t\t}).Connect(X, win.Id, key, false)\n\t}\n\n\t// Output some basic directions.\n\tfmt.Println(\"Use the left or right buttons on your mouse to paint \" +\n\t\t\"squares and gophers.\")\n\tfmt.Println(\"Pressing numbers 1, 2, 3, 4, 5 or 6 will switch your pencil \" +\n\t\t\"color.\")\n\tfmt.Println(\"Pressing 'c' will clear the canvas.\")\n\n\txevent.Main(X)\n}\n\n// midRect takes an (x, y) position where the pointer was clicked, along with\n// the width and height of the thing being drawn and the width and height of\n// the canvas, and returns a Rectangle whose midpoint (roughly) is (x, y) and\n// whose width and height match the parameters when the rectangle doesn't\n// extend past the border of the canvas. Make sure to check if the rectange is\n// empty or not before using it!\nfunc midRect(x, y, width, height, canWidth, canHeight int) image.Rectangle {\n\treturn image.Rect(\n\t\tmax(0, min(canWidth, x-width/2)),   // top left x\n\t\tmax(0, min(canHeight, y-height/2)), // top left y\n\t\tmax(0, min(canWidth, x+width/2)),   // bottom right x\n\t\tmax(0, min(canHeight, y+height/2)), // bottom right y\n\t)\n}\n\nfunc max(a, b int) int {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc min(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "_examples/screenshot/main.go",
    "content": "// Example screenshot shows how to take a screenshot of the current desktop\n// and show it in a window. In a comment, it also shows how to save it as\n// a png.\n//\n// It works by getting the image of the root window, which automatically\n// includes all child windows.\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Use the \"NewDrawable\" constructor to create an xgraphics.Image value\n\t// from a drawable. (Usually this is done with pixmaps, but drawables\n\t// can also be windows.)\n\tximg, err := xgraphics.NewDrawable(X, xproto.Drawable(X.RootWin()))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Shows the screenshot in a window.\n\tximg.XShowExtra(\"Screenshot\", true)\n\n\t// If you'd like to save it as a png, use:\n\t// err = ximg.SavePng(\"screenshot.png\")\n\t// if err != nil {\n\t// log.Fatal(err)\n\t// }\n\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/show-image/main.go",
    "content": "// Example show-image is a very simple example to show how to use the\n// xgraphics package to show an image in a window.\npackage main\n\nimport (\n\t\"bytes\"\n\t\"image\"\n\t_ \"image/png\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/gopher\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Read an example gopher image into a regular png image.\n\timg, _, err := image.Decode(bytes.NewBuffer(gopher.GopherPng()))\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Now convert it into an X image.\n\tximg := xgraphics.NewConvert(X, img)\n\n\t// Now show it in a new window.\n\t// We set the window title and tell the program to quit gracefully when\n\t// the window is closed.\n\t// There is also a convenience method, XShow, that requires no parameters.\n\tximg.XShowExtra(\"The Go Gopher!\", true)\n\n\t// If we don't block, the program will end and the window will disappear.\n\t// We could use a 'select{}' here, but xevent.Main will emit errors if\n\t// something went wrong, so use that instead.\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/show-window-icons/main.go",
    "content": "// Example show-window-icons shows how to get a list of all top-level client\n// windows managed by the currently running window manager, and show the icon\n// for each window. (Each icon is shown by opening its own window.)\npackage main\n\nimport (\n\t\"image/color\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n)\n\nvar (\n\t// The icon width and height to use.\n\t// _NET_WM_ICON will be searched for an icon closest to these values.\n\t// The icon closest in size to what's specified here will be used.\n\t// The resulting icon will be scaled to this size.\n\t// (Set both to 0 to avoid scaling and use the biggest possible icon.)\n\ticonWidth, iconHeight = 300, 300\n)\n\nfunc main() {\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Get the list of window ids managed by the window manager.\n\tclients, err := ewmh.ClientListGet(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// For each client, try to find its icon. If we find one, blend it with\n\t// a nice background color and show it in its own window.\n\t// Otherwise, skip it.\n\tfor _, wid := range clients {\n\t\t// FindIcon will find an icon closest to the size specified.\n\t\t// If one can't be found, the resulting image will be scaled\n\t\t// automatically.\n\t\t// To avoid scaling the icon, specify '0' for both the width and height.\n\t\t// In this case, the largest icon found will be returned.\n\t\txicon, err := xgraphics.FindIcon(X, wid, iconWidth, iconHeight)\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Could not find icon for window %d.\", wid)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Get the name of this client. (It will be set as the icon window's\n\t\t// name.)\n\t\tname, err := ewmh.WmNameGet(X, wid)\n\t\tif err != nil { // not a fatal error\n\t\t\tlog.Println(err)\n\t\t\tname = \"\"\n\t\t}\n\n\t\t// Blend a pink background color so its easy to see that alpha blending\n\t\t// works.\n\t\txgraphics.BlendBgColor(xicon, color.RGBA{0xff, 0x0, 0xff, 0xff})\n\t\txicon.XShowExtra(name, false)\n\t}\n\n\t// All we really need to do is block, so a 'select{}' would be sufficient.\n\t// But running the event loop will emit errors if anything went wrong.\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/simple-keybinding/main.go",
    "content": "// Example simple-keybinding shows how to grab keys on the root window and\n// respond to them via callback functions. It also shows how to remove such\n// callbacks so that they no longer respond to the key events.\n// Note that more documentation can be found in the keybind package.\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\nfunc main() {\n\t// Connect to the X server using the DISPLAY environment variable.\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Anytime the keybind (mousebind) package is used, keybind.Initialize\n\t// *should* be called once. It isn't strictly necessary, but allows your\n\t// keybindings to persist even if the keyboard mapping is changed during\n\t// run-time. (Assuming you're using the xevent package's event loop.)\n\tkeybind.Initialize(X)\n\n\t// Before attaching callbacks, wrap them in a callback function type.\n\t// The keybind package exposes two such callback types: keybind.KeyPressFun\n\t// and keybind.KeyReleaseFun.\n\tcb1 := keybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.KeyPressEvent) {\n\t\t\tlog.Println(\"Key press!\")\n\t\t})\n\n\t// We can now attach the callback to a particular window and key\n\t// combination. This particular example grabs a key on the root window,\n\t// which makes it a global keybinding.\n\t// Also, \"Mod4-j\" typically corresponds to pressing down the \"Super\" or\n\t// \"Windows\" key on your keyboard, and then pressing the letter \"j\".\n\t// N.B. This approach works by issuing a passive grab on the window\n\t// specified. To respond to Key{Press,Release} events without a grab, use\n\t// the xevent.Key{Press,Release}Fun callback function types instead.\n\terr = cb1.Connect(X, X.RootWin(), \"Mod4-j\", true)\n\n\t// A keybinding can fail if the key string could not be parsed, or if you're\n\t// trying to bind a key that has already been grabbed by another client.\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// We can even attach multiple callbacks to the same key.\n\terr = keybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.KeyPressEvent) {\n\t\t\tlog.Println(\"A second handler always happens after the first.\")\n\t\t}).Connect(X, X.RootWin(), \"Mod4-j\", true)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Finally, if we want this client to stop responding to key events, we\n\t// can attach another handler that, when run, detaches all previous\n\t// handlers.\n\t// This time, we'll show an example of a KeyRelease binding.\n\terr = keybind.KeyReleaseFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.KeyReleaseEvent) {\n\t\t\t// Use keybind.Detach to detach the root window\n\t\t\t// from all KeyPress *and* KeyRelease handlers.\n\t\t\tkeybind.Detach(X, X.RootWin())\n\n\t\t\tlog.Printf(\"Detached all Key{Press,Release}Events from the \"+\n\t\t\t\t\"root window (%d).\", X.RootWin())\n\t\t}).Connect(X, X.RootWin(), \"Mod4-Shift-q\", true)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Finally, start the main event loop. This will route any appropriate\n\t// KeyPressEvents to your callback function.\n\tlog.Println(\"Program initialized. Start pressing keys!\")\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/simple-mousebinding/main.go",
    "content": "// Example simple-mousebinding shows how to grab buttons on the root window and\n// respond to them via callback functions. It also shows how to remove such\n// callbacks so that they no longer respond to the button events.\n// Note that more documentation can be found in the mousebind package.\npackage main\n\nimport (\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/mousebind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\nfunc main() {\n\t// Connect to the X server using the DISPLAY environment variable.\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Anytime the mousebind (keybind) package is used, mousebind.Initialize\n\t// *should* be called once. In the case of the mousebind package, this\n\t// isn't strictly necessary, but the 'Drag' features of the mousebind\n\t// package won't work without it.\n\tmousebind.Initialize(X)\n\n\t// Before attaching callbacks, wrap them in a callback function type.\n\t// The mouse package exposes two such callback types:\n\t// mousebind.ButtonPressFun and mousebind.ButtonReleaseFun.\n\tcb1 := mousebind.ButtonPressFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.ButtonPressEvent) {\n\t\t\tlog.Println(\"Button press!\")\n\t\t})\n\n\t// We can now attach the callback to a particular window and button\n\t// combination. This particular example grabs a button on the root window,\n\t// which makes it a global mouse binding.\n\t// Also, \"Mod4-1\" typically corresponds to pressing down the \"Super\" or\n\t// \"Windows\" key on your keyboard, and then pressing the left mouse button.\n\t// The last two parameters are whether to make a synchronous grab and\n\t// whether to actually issue a grab, respectively.\n\t// (The parameters used here are the common case.)\n\t// See the documentation for the Connect method for more details.\n\terr = cb1.Connect(X, X.RootWin(), \"Mod4-1\", false, true)\n\n\t// A mouse binding can fail if the mouse string could not be parsed, or if\n\t// you're trying to bind a button that has already been grabbed by another\n\t// client.\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// We can even attach multiple callbacks to the same button.\n\terr = mousebind.ButtonPressFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.ButtonPressEvent) {\n\t\t\tlog.Println(\"A second handler always happens after the first.\")\n\t\t}).Connect(X, X.RootWin(), \"Mod4-1\", false, true)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Finally, if we want this client to stop responding to mouse events, we\n\t// can attach another handler that, when run, detaches all previous\n\t// handlers.\n\t// This time, we'll show an example of a ButtonRelease binding.\n\terr = mousebind.ButtonReleaseFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.ButtonReleaseEvent) {\n\t\t\t// Use mousebind.Detach to detach the root window\n\t\t\t// from all ButtonPress *and* ButtonRelease handlers.\n\t\t\tmousebind.Detach(X, X.RootWin())\n\t\t\tmousebind.Detach(X, X.RootWin())\n\n\t\t\tlog.Printf(\"Detached all Button{Press,Release}Events from the \"+\n\t\t\t\t\"root window (%d).\", X.RootWin())\n\t\t}).Connect(X, X.RootWin(), \"Mod4-Shift-1\", false, true)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Finally, start the main event loop. This will route any appropriate\n\t// ButtonPressEvents to your callback function.\n\tlog.Println(\"Program initialized. Start pressing mouse buttons!\")\n\txevent.Main(X)\n}\n"
  },
  {
    "path": "_examples/window-gradient/main.go",
    "content": "// Example window-gradient demonstrates how to create several windows and draw\n// gradients as their background. Namely, it shows how to use the\n// xgraphics.Image type as a canvas that can change size. This example also\n// demonstrates how to compress ConfigureNotify events so that the gradient\n// drawing does not lag behind the rate of incoming ConfigureNotify events.\npackage main\n\nimport (\n\t\"image\"\n\t\"image/color\"\n\t\"log\"\n\t\"math/rand\"\n\t\"time\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nfunc main() {\n\trand.Seed(time.Now().UnixNano())\n\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create three gradient windows of varying size with random colors.\n\t// Waiting a little bit inbetween seems to increase the diversity of the\n\t// random colors.\n\n\tnewGradientWindow(X, 200, 200, newRandomColor(), newRandomColor())\n\n\ttime.Sleep(500 * time.Millisecond)\n\tnewGradientWindow(X, 400, 400, newRandomColor(), newRandomColor())\n\n\ttime.Sleep(500 * time.Millisecond)\n\tnewGradientWindow(X, 600, 600, newRandomColor(), newRandomColor())\n\n\txevent.Main(X)\n}\n\n// newGradientWindow creates a new X window, paints the initial gradient\n// image, and listens for ConfigureNotify events. (A new gradient image must\n// be painted in response to each ConfigureNotify event, since a\n// ConfigureNotify event corresponds to a change in the window's geometry.)\nfunc newGradientWindow(X *xgbutil.XUtil, width, height int,\n\tstart, end color.RGBA) {\n\n\t// Generate a new window id.\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Create the window and die if it fails.\n\terr = win.CreateChecked(X.RootWin(), 0, 0, width, height, 0)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// In order to get ConfigureNotify events, we must listen to the window\n\t// using the 'StructureNotify' mask.\n\twin.Listen(xproto.EventMaskStructureNotify)\n\n\t// Paint the initial gradient to the window and then map the window.\n\tpaintGradient(X, win.Id, width, height, start, end)\n\twin.Map()\n\n\txevent.ConfigureNotifyFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ConfigureNotifyEvent) {\n\t\t\t// If the width and height have not changed, skip this one.\n\t\t\tif int(ev.Width) == width && int(ev.Height) == height {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Compress ConfigureNotify events so that we don't lag when\n\t\t\t// drawing gradients in response.\n\t\t\tev = compressConfigureNotify(X, ev)\n\n\t\t\t// Update the width and height and paint the gradient image.\n\t\t\twidth, height = int(ev.Width), int(ev.Height)\n\t\t\tpaintGradient(X, win.Id, width, height, start, end)\n\t\t}).Connect(X, win.Id)\n}\n\n// paintGradient creates a new xgraphics.Image value and draws a gradient\n// starting at color 'start' and ending at color 'end'.\n//\n// Since xgraphics.Image values use pixmaps and pixmaps cannot be resized,\n// a new pixmap must be allocated for each resize event.\nfunc paintGradient(X *xgbutil.XUtil, wid xproto.Window, width, height int,\n\tstart, end color.RGBA) {\n\n\tximg := xgraphics.New(X, image.Rect(0, 0, width, height))\n\n\t// Now calculate the increment step between each RGB channel in\n\t// the start and end colors.\n\trinc := (0xff * (int(end.R) - int(start.R))) / width\n\tginc := (0xff * (int(end.G) - int(start.G))) / width\n\tbinc := (0xff * (int(end.B) - int(start.B))) / width\n\n\t// Now apply the increment to each \"column\" in the image.\n\t// Using 'ForExp' allows us to bypass the creation of a color.BGRA value\n\t// for each pixel in the image.\n\tximg.ForExp(func(x, y int) (uint8, uint8, uint8, uint8) {\n\t\treturn uint8(int(start.B) + (binc*x)/0xff),\n\t\t\tuint8(int(start.G) + (ginc*x)/0xff),\n\t\t\tuint8(int(start.R) + (rinc*x)/0xff),\n\t\t\t0xff\n\t})\n\n\t// Set the surface to paint on for ximg.\n\t// (This simply sets the background pixmap of the window to the pixmap\n\t// used by ximg.)\n\tximg.XSurfaceSet(wid)\n\n\t// XDraw will draw the contents of ximg to its corresponding pixmap.\n\tximg.XDraw()\n\n\t// XPaint will \"clear\" the window provided so that it shows the updated\n\t// pixmap.\n\tximg.XPaint(wid)\n\n\t// Since we will not reuse ximg, we must destroy its pixmap.\n\tximg.Destroy()\n}\n\n// compressConfigureNotify \"compresses\" incoming ConfigureNotify events so that\n// event processing never lags behind gradient drawing.\n// This is necessary because drawing a gradient cannot keep up with the rate\n// at which ConfigureNotify events are sent to us, thereby creating a \"lag\".\n// Compression works by examining the \"future\" of the event queue, and skipping\n// ahead to the most recent ConfigureNotify event and throwing away the rest.\n//\n// A more detailed treatment of event compression can be found in\n// xgbutil/examples/compress-events.\nfunc compressConfigureNotify(X *xgbutil.XUtil,\n\tev xevent.ConfigureNotifyEvent) xevent.ConfigureNotifyEvent {\n\n\t// Catch up with all X events as much as we can.\n\tX.Sync()\n\txevent.Read(X, false) // non-blocking\n\n\tlaste := ev\n\tfor i, ee := range xevent.Peek(X) {\n\t\tif ee.Err != nil {\n\t\t\tcontinue\n\t\t}\n\t\tif cn, ok := ee.Event.(xproto.ConfigureNotifyEvent); ok {\n\t\t\t// Only compress this ConfigureNotify if it matches the window\n\t\t\t// of the original event.\n\t\t\tif ev.Event == cn.Event && ev.Window == cn.Window {\n\t\t\t\tlaste = xevent.ConfigureNotifyEvent{&cn}\n\t\t\t\tdefer func(i int) { xevent.DequeueAt(X, i) }(i)\n\t\t\t}\n\t\t}\n\t}\n\treturn laste\n}\n\n// newRandomColor creates a new RGBA color where each channel (except alpha)\n// is randomly generated.\nfunc newRandomColor() color.RGBA {\n\treturn color.RGBA{\n\t\tR: uint8(rand.Intn(256)),\n\t\tG: uint8(rand.Intn(256)),\n\t\tB: uint8(rand.Intn(256)),\n\t\tA: 0xff,\n\t}\n}\n"
  },
  {
    "path": "_examples/window-name-sizes/main.go",
    "content": "// Example window-names fetches a list of all top-level client windows managed\n// by the currently running window manager, and prints the name and size\n// of each window.\n//\n// This example demonstrates how to use some aspects of the ewmh and icccm\n// packages. It also shows how to use the xwindow package to find the\n// geometry of a client window. In particular, finding the geometry is\n// intelligent, as it includes the geometry of the decorations if they exist.\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/icccm\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nfunc main() {\n\t// Connect to the X server using the DISPLAY environment variable.\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Get a list of all client ids.\n\tclientids, err := ewmh.ClientListGet(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Iterate through each client, find its name and find its size.\n\tfor _, clientid := range clientids {\n\t\tname, err := ewmh.WmNameGet(X, clientid)\n\n\t\t// If there was a problem getting _NET_WM_NAME or if its empty,\n\t\t// try the old-school version.\n\t\tif err != nil || len(name) == 0 {\n\t\t\tname, err = icccm.WmNameGet(X, clientid)\n\n\t\t\t// If we still can't find anything, give up.\n\t\t\tif err != nil || len(name) == 0 {\n\t\t\t\tname = \"N/A\"\n\t\t\t}\n\t\t}\n\n\t\t// Now find the geometry, including decorations, of the client window.\n\t\t// Note that DecorGeometry actually traverses the window tree by\n\t\t// issuing QueryTree requests until a top-level window (i.e., its\n\t\t// parent is the root window) is found. The geometry of *that* window\n\t\t// is then returned.\n\t\tdgeom, err := xwindow.New(X, clientid).DecorGeometry()\n\t\tif err != nil {\n\t\t\tlog.Printf(\"Could not get geometry for %s (0x%X) because: %s\",\n\t\t\t\tname, clientid, err)\n\t\t\tcontinue\n\t\t}\n\n\t\tfmt.Printf(\"%s (0x%x)\\n\", name, clientid)\n\t\tfmt.Printf(\"\\tGeometry: %s\\n\", dgeom)\n\t}\n}\n"
  },
  {
    "path": "_examples/workarea-struts/main.go",
    "content": "// Example workarea-struts shows how to find the all of the struts set by\n// top-level clients and apply them to each active monitor to get the true\n// workarea for each monitor.\n//\n// For example, consider a monitor with a 1920x1080 resolution and a panel\n// on the bottom of the desktop 50 pixels tall. The actual workarea for the\n// desktop then, is (0, 0) 1920x1030. (When there is more than one monitor,\n// the x and y coordinates will be adjusted too.)\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/xinerama\"\n\t\"github.com/BurntSushi/xgbutil/xrect\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\nfunc main() {\n\t// Connect to the X server using the DISPLAY environment variable.\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Wrap the root window in a nice Window type.\n\troot := xwindow.New(X, X.RootWin())\n\n\t// Get the geometry of the root window.\n\trgeom, err := root.Geometry()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Get the rectangles for each of the active physical heads.\n\t// These are returned sorted in order from left to right and then top\n\t// to bottom.\n\t// But first check if Xinerama is enabled. If not, use root geometry.\n\tvar heads xinerama.Heads\n\tif X.ExtInitialized(\"XINERAMA\") {\n\t\theads, err = xinerama.PhysicalHeads(X)\n\t\tif err != nil {\n\t\t\tlog.Fatal(err)\n\t\t}\n\t} else {\n\t\theads = xinerama.Heads{rgeom}\n\t}\n\n\t// Fetch the list of top-level client window ids currently managed\n\t// by the running window manager.\n\tclients, err := ewmh.ClientListGet(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Output the head geometry before modifying them.\n\tfmt.Println(\"Workarea for each head:\")\n\tfor i, head := range heads {\n\t\tfmt.Printf(\"\\tHead #%d: %s\\n\", i+1, head)\n\t}\n\n\t// For each client, check to see if it has struts, and if so, apply\n\t// them to our list of head rectangles.\n\tfor _, clientid := range clients {\n\t\tstrut, err := ewmh.WmStrutPartialGet(X, clientid)\n\t\tif err != nil { // no struts for this client\n\t\t\tcontinue\n\t\t}\n\n\t\t// Apply the struts to our heads.\n\t\t// This modifies 'heads' in place.\n\t\txrect.ApplyStrut(heads, uint(rgeom.Width()), uint(rgeom.Height()),\n\t\t\tstrut.Left, strut.Right, strut.Top, strut.Bottom,\n\t\t\tstrut.LeftStartY, strut.LeftEndY,\n\t\t\tstrut.RightStartY, strut.RightEndY,\n\t\t\tstrut.TopStartX, strut.TopEndX,\n\t\t\tstrut.BottomStartX, strut.BottomEndX)\n\t}\n\n\t// Now output the head geometry again after modification.\n\tfmt.Println(\"Workarea for each head after applying struts:\")\n\tfor i, head := range heads {\n\t\tfmt.Printf(\"\\tHead #%d: %s\\n\", i+1, head)\n\t}\n}\n"
  },
  {
    "path": "_examples/xgraphics-compat/main.go",
    "content": "package main\n\nimport (\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xgraphics\"\n)\n\nfunc main() {\n\tlog.SetFlags(0)\n\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatalln(err)\n\t}\n\tcheckCompatibility(X)\n}\n\n// checkCompatibility reads info in the X setup info struct and emits\n// messages to stderr if they don't correspond to values that xgraphics\n// supports.\n// The idea is that in the future, we'll support more values.\n// The real reason for checkCompatibility is to make debugging easier. Without\n// it, if the values weren't what we'd expect, we'd see garbled images in the\n// best case, and probably BadLength errors in the worst case.\nfunc checkCompatibility(X *xgbutil.XUtil) {\n\ts := X.Setup()\n\tscrn := X.Screen()\n\tfailed := false\n\n\tif s.ImageByteOrder != xproto.ImageOrderLSBFirst {\n\t\tlog.Printf(\"Your X server uses MSB image byte order. Unfortunately, \" +\n\t\t\t\"xgraphics currently requires LSB image byte order. You may see \" +\n\t\t\t\"weird things. Please report this.\")\n\t\tfailed = true\n\t}\n\tif s.BitmapFormatBitOrder != xproto.ImageOrderLSBFirst {\n\t\tlog.Printf(\"Your X server uses MSB bitmap bit order. Unfortunately, \" +\n\t\t\t\"xgraphics currently requires LSB bitmap bit order. If you \" +\n\t\t\t\"aren't using X bitmaps, you should be able to proceed normally. \" +\n\t\t\t\"Please report this.\")\n\t\tfailed = true\n\t}\n\tif s.BitmapFormatScanlineUnit != 32 {\n\t\tlog.Printf(\"xgraphics expects that the scanline unit is set to 32, \"+\n\t\t\t\"but your X server has it set to '%d'. \"+\n\t\t\t\"Namely, xgraphics hasn't been tested on other values. Things \"+\n\t\t\t\"may still work. Particularly, if you aren't using X bitmaps, \"+\n\t\t\t\"you should be completely unaffected. Please report this.\",\n\t\t\ts.BitmapFormatScanlineUnit)\n\t\tfailed = true\n\t}\n\tif scrn.RootDepth != 24 {\n\t\tlog.Printf(\"xgraphics expects that the root window has a depth of 24, \"+\n\t\t\t\"but yours has depth '%d'. Its possible things will still work \"+\n\t\t\t\"if your value is 32, but will be unlikely to work with values \"+\n\t\t\t\"less than 24. Please report this.\", scrn.RootDepth)\n\t\tfailed = true\n\t}\n\n\t// Look for the default format for pixmaps and make sure bits per pixel\n\t// is 32.\n\tformat := xgraphics.GetFormat(X, scrn.RootDepth)\n\tif format.BitsPerPixel != 32 {\n\t\tlog.Printf(\"xgraphics expects that the bits per pixel for the root \"+\n\t\t\t\"window depth is 32. On your system, the root depth is %d and \"+\n\t\t\t\"the bits per pixel is %d. Things will most certainly not work. \"+\n\t\t\t\"Please report this.\",\n\t\t\tscrn.RootDepth, format.BitsPerPixel)\n\t\tfailed = true\n\t}\n\n\t// Give instructions on reporting the issue.\n\tif failed {\n\t\tlog.Printf(\"Please report the aforementioned error message(s) at \" +\n\t\t\t\"https://github.com/BurntSushi/xgbutil. Please also include the \" +\n\t\t\t\"entire output of the `xdpyinfo` command in your report. Thanks!\")\n\t} else {\n\t\tlog.Printf(\"No compatibility issues detected.\")\n\t}\n}\n"
  },
  {
    "path": "_examples/xmodmap/main.go",
    "content": "// Example xmodmap shows how one might implement a rudimentary version\n// of xmodmap's modifier listing.\n// (xmodmap is a program that shows all modifier keys, and which\n// keysyms activate each modifier. xmodmap can also modify the modifier\n// mapping, which this doesn't do.)\npackage main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"strings\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n)\n\nfunc main() {\n\t// Connect to the X server using the DISPLAY environment variable.\n\tX, err := xgbutil.NewConn()\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\t// Nice names for the modifier keys (same ones used by xmodmap).\n\t// This slice corresponds to the keybind.Modifiers slice (except for\n\t// the last 'Any' modifier element).\n\tnice := []string{\n\t\t\"shift\", \"lock\", \"control\", \"mod1\", \"mod2\", \"mod3\", \"mod4\", \"mod5\",\n\t}\n\n\t// Whenever one uses the keybind package, Initialize should always be\n\t// called first. In this case, it initializes the key and modifier maps.\n\tkeybind.Initialize(X)\n\n\t// Get the current modifier map.\n\t// The map is actually a table, where rows correspond to modifiers, and\n\t// columns correspond to the keys that activate that modifier.\n\tmodMap := keybind.ModMapGet(X)\n\n\t// The number of keycodes allowed per modifier (i.e., the number of\n\t// columns in the modifier map).\n\tkPerMod := int(modMap.KeycodesPerModifier)\n\n\t// Get the number of allowable keysyms per keycode.\n\t// This is used to search for a valid keysym for a particular keycode.\n\tsymsPerKc := int(keybind.KeyMapGet(X).KeysymsPerKeycode)\n\n\t// Imitate everything...\n\tfmt.Printf(\"xmodmap:  up to %d keys per modifier, \"+\n\t\t\"(keycodes in parentheses):\\n\\n\", kPerMod)\n\n\t// Iterate through all keyboard modifiers defined in xgb/xproto\n\t// except the 'Any' modifier (which is last).\n\tfor mmi := range keybind.Modifiers[:len(keybind.Modifiers)-1] {\n\t\tniceName := nice[mmi]\n\t\tkeys := make([]string, 0, kPerMod)\n\n\t\t// row is the row for the 'mmi' modifier in the modifier mapping table.\n\t\trow := mmi * kPerMod\n\n\t\t// Iterate over each keycode in the modifier map for this modifier.\n\t\tfor _, kc := range modMap.Keycodes[row : row+kPerMod] {\n\t\t\t// If this entry doesn't have a keycode (i.e., it's zero), we\n\t\t\t// have to skip it.\n\t\t\tif kc == 0 {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// Look for the first valid keysym in the keyboard map corresponding\n\t\t\t// to this keycode. If one can't be found, output \"BadKey.\"\n\t\t\tvar ksym xproto.Keysym = 0\n\t\t\tfor column := 0; column < symsPerKc; column++ {\n\t\t\t\tksym = keybind.KeysymGet(X, kc, byte(column))\n\t\t\t\tif ksym != 0 {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ksym == 0 {\n\t\t\t\tkeys = append(keys, fmt.Sprintf(\"BadKey (0x%x)\", kc))\n\t\t\t} else {\n\t\t\t\tkeys = append(keys,\n\t\t\t\t\tfmt.Sprintf(\"%s (0x%x)\", keybind.KeysymToStr(ksym), kc))\n\t\t\t}\n\t\t}\n\n\t\tfmt.Printf(\"%-12s%s\\n\", niceName, strings.Join(keys, \",  \"))\n\t}\n\tfmt.Println(\"\")\n}\n"
  },
  {
    "path": "doc.go",
    "content": "/*\nPackage xgbutil is a utility library designed to make common tasks with the X\nserver easier. The central design choice that has driven development is to hide\nthe complexity of X wherever possible but expose it when necessary.\n\nFor example, the xevent package provides an implementation of an X event loop\nthat acts as a dispatcher to event handlers set up with the xevent, keybind and\nmousebind packages. At the same time, the event queue is exposed and can be\nmodified using xevent.Peek and xevent.DequeueAt.\n\nSub-packages\n\nThe xgbutil package is considerably small, and only contains some type\ndefinitions and the initial setup for an X connection. Much of the\nfunctionality of xgbutil comes from its sub-packages. Each sub-package is\nappropriately documented.\n\nInstallation\n\nxgbutil is go-gettable:\n\n\tgo get github.com/BurntSushi/xgbutil\n\nDependencies\n\nXGB is the main dependency, and is required for all packages inside xgbutil.\n\ngraphics-go and freetype-go are also required if using the xgraphics package.\n\nQuick Example\n\nA quick example to demonstrate that xgbutil is working correctly:\n\n\tgo get github.com/BurntSushi/xgbutil/examples/window-name-sizes\n\tGO/PATH/bin/window-name-sizes\n\nThe output will be a list of names of all top-level windows and their geometry\nincluding window manager decorations. (Assuming your window manager supports\nsome basic EWMH properties.)\n\nExamples\n\nThe examples directory contains a sizable number of examples demonstrating\ncommon tasks with X. They are intended to demonstrate a single thing each,\nalthough a few that require setup are necessarily long. Each example is\nheavily documented.\n\nThe examples directory should be your first stop when learning how to use\nxgbutil.\n\nxgbutil is also used heavily throughout my window manager, Wingo. It may be\nuseful reference material.\n\nWingo project page: https://github.com/BurntSushi/wingo\n\nThread Safety\n\nWhile I am fairly confident that XGB is thread safe, I am only somewhat\nconfident that xgbutil is thread safe. It simply has not been tested enough for\nmy confidence to be higher.\n\nNote that the xevent package's X event loop is not concurrent. Namely,\ndesigning a generally concurrent X event loop is extremely complex. Instead,\nthe onus is on you, the user, to design concurrent callback functions if\nconcurrency is desired.\n*/\npackage xgbutil\n"
  },
  {
    "path": "ewmh/doc.go",
    "content": "/*\nPackage ewmh provides a comprehensive API to get and set properties specified\nby the EWMH spec, as well as perform actions specified by the EWMH spec.\n\nSince there are so many functions and they adhere to an existing spec,\nthis package file does not contain much documentation. Indeed, each\nmethod has only a single comment associated with it: the EWMH property name.\n\nThe idea is to\nprovide a consistent interface to use all facilities described in the EWMH\nspec: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html.\n\nNaming scheme\n\nUsing \"_NET_ACTIVE_WINDOW\" as an example,\nfunctions \"ActiveWindowGet\" and \"ActiveWindowSet\" get and set the\nproperty, respectively. Both of these functions exist for most EWMH\nproperties. Additionally, some EWMH properties support sending a client\nmessage event to request the window manager to perform some action. In the\ncase of \"_NET_ACTIVE_WINDOW\", this request is used to set the active\nwindow.\n\nThese sorts of functions end in \"Req\". So for \"_NET_ACTIVE_WINDOW\",\nthe method name is \"ActiveWindowReq\". Moreover, most requests include\nvarious parameters that don't need to be changed often (like the source\nindication). Thus, by default, functions ending in \"Req\" force these to\nsensible defaults. If you need access to all of the parameters, use the\ncorresponding \"ReqExtra\" method. So for \"_NET_ACTIVE_WINDOW\", that would\nbe \"ActiveWindowReqExtra\". (If no \"ReqExtra\" method exists, then the\n\"Req\" method covers all available parameters.)\n\nThis naming scheme has one exception: if a property's only use is through\nsending an event (like \"_NET_CLOSE_WINDOW\"), then the name will be\n\"CloseWindow\" for the short-hand version and \"CloseWindowExtra\"\nfor access to all of the parameters. (Since there is no \"_NET_CLOSE_WINDOW\"\nproperty, there is no need for \"CloseWindowGet\" and \"CloseWindowSet\"\nfunctions.)\n\nFor properties that store more than just a simple integer, name or list\nof integers, structs have been created and exposed to organize the\ninformation returned in a sensible manner. For example, the\n\"_NET_DESKTOP_GEOMETRY\" property would typically return a slice of integers\nof length 2, where the first integer is the width and the second is the\nheight. Xgbutil will wrap this in a struct with the obvious members. These\nstructs are documented.\n\nFinally, functions ending in \"*Set\" are typically only used when setting\nproperties on clients *you've* created or when the window manager sets\nproperties. Thus, it's unlikely that you should use them unless you're\ncreating a top-level client or building a window manager.\n\nFunctions ending in \"Get\" or \"Req[Extra]\" are commonly used.\n\nN.B. Not all properties have \"*Req\" functions.\n*/\npackage ewmh\n"
  },
  {
    "path": "ewmh/ewmh.go",
    "content": "package ewmh\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xprop\"\n)\n\n// ClientEvent is a convenience function that sends ClientMessage events\n// to the root window as specified by the EWMH spec.\nfunc ClientEvent(xu *xgbutil.XUtil, window xproto.Window, messageType string,\n\tdata ...interface{}) error {\n\n\tmstype, err := xprop.Atm(xu, messageType)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tevMask := (xproto.EventMaskSubstructureNotify |\n\t\txproto.EventMaskSubstructureRedirect)\n\tcm, err := xevent.NewClientMessage(32, window, mstype, data...)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn xevent.SendRootEvent(xu, cm, uint32(evMask))\n}\n\n// _NET_ACTIVE_WINDOW get\nfunc ActiveWindowGet(xu *xgbutil.XUtil) (xproto.Window, error) {\n\treturn xprop.PropValWindow(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_ACTIVE_WINDOW\"))\n}\n\n// _NET_ACTIVE_WINDOW set\nfunc ActiveWindowSet(xu *xgbutil.XUtil, win xproto.Window) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_ACTIVE_WINDOW\", \"WINDOW\",\n\t\tuint(win))\n}\n\n// _NET_ACTIVE_WINDOW req\nfunc ActiveWindowReq(xu *xgbutil.XUtil, win xproto.Window) error {\n\treturn ActiveWindowReqExtra(xu, win, 2, 0, 0)\n}\n\n// _NET_ACTIVE_WINDOW req extra\nfunc ActiveWindowReqExtra(xu *xgbutil.XUtil, win xproto.Window, source int,\n\ttime xproto.Timestamp, currentActive xproto.Window) error {\n\n\treturn ClientEvent(xu, win, \"_NET_ACTIVE_WINDOW\", source, int(time),\n\t\tint(currentActive))\n}\n\n// _NET_CLIENT_LIST get\nfunc ClientListGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {\n\treturn xprop.PropValWindows(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_CLIENT_LIST\"))\n}\n\n// _NET_CLIENT_LIST set\nfunc ClientListSet(xu *xgbutil.XUtil, wins []xproto.Window) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_CLIENT_LIST\", \"WINDOW\",\n\t\txprop.WindowToInt(wins)...)\n}\n\n// _NET_CLIENT_LIST_STACKING get\nfunc ClientListStackingGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {\n\treturn xprop.PropValWindows(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_CLIENT_LIST_STACKING\"))\n}\n\n// _NET_CLIENT_LIST_STACKING set\nfunc ClientListStackingSet(xu *xgbutil.XUtil, wins []xproto.Window) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_CLIENT_LIST_STACKING\",\n\t\t\"WINDOW\", xprop.WindowToInt(wins)...)\n}\n\n// _NET_CLOSE_WINDOW req\nfunc CloseWindow(xu *xgbutil.XUtil, win xproto.Window) error {\n\treturn CloseWindowExtra(xu, win, 0, 2)\n}\n\n// _NET_CLOSE_WINDOW req extra\nfunc CloseWindowExtra(xu *xgbutil.XUtil, win xproto.Window,\n\ttime xproto.Timestamp, source int) error {\n\n\treturn ClientEvent(xu, win, \"_NET_CLOSE_WINDOW\", int(time), source)\n}\n\n// _NET_CURRENT_DESKTOP get\nfunc CurrentDesktopGet(xu *xgbutil.XUtil) (uint, error) {\n\treturn xprop.PropValNum(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_CURRENT_DESKTOP\"))\n}\n\n// _NET_CURRENT_DESKTOP set\nfunc CurrentDesktopSet(xu *xgbutil.XUtil, desk uint) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_CURRENT_DESKTOP\",\n\t\t\"CARDINAL\", desk)\n}\n\n// _NET_CURRENT_DESKTOP req\nfunc CurrentDesktopReq(xu *xgbutil.XUtil, desk int) error {\n\treturn CurrentDesktopReqExtra(xu, desk, 0)\n}\n\n// _NET_CURRENT_DESKTOP req extra\nfunc CurrentDesktopReqExtra(xu *xgbutil.XUtil, desk int,\n\ttime xproto.Timestamp) error {\n\n\treturn ClientEvent(xu, xu.RootWin(), \"_NET_CURRENT_DESKTOP\", desk,\n\t\tint(time))\n}\n\n// _NET_DESKTOP_NAMES get\nfunc DesktopNamesGet(xu *xgbutil.XUtil) ([]string, error) {\n\treturn xprop.PropValStrs(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_DESKTOP_NAMES\"))\n}\n\n// _NET_DESKTOP_NAMES set\nfunc DesktopNamesSet(xu *xgbutil.XUtil, names []string) error {\n\tnullterm := make([]byte, 0)\n\tfor _, name := range names {\n\t\tnullterm = append(nullterm, name...)\n\t\tnullterm = append(nullterm, 0)\n\t}\n\treturn xprop.ChangeProp(xu, xu.RootWin(), 8, \"_NET_DESKTOP_NAMES\",\n\t\t\"UTF8_STRING\", nullterm)\n}\n\n// DesktopGeometry is a struct that houses the width and height of a\n// _NET_DESKTOP_GEOMETRY property reply.\ntype DesktopGeometry struct {\n\tWidth  int\n\tHeight int\n}\n\n// _NET_DESKTOP_GEOMETRY get\nfunc DesktopGeometryGet(xu *xgbutil.XUtil) (*DesktopGeometry, error) {\n\tgeom, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_DESKTOP_GEOMETRY\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &DesktopGeometry{Width: int(geom[0]), Height: int(geom[1])}, nil\n}\n\n// _NET_DESKTOP_GEOMETRY set\nfunc DesktopGeometrySet(xu *xgbutil.XUtil, dg *DesktopGeometry) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_DESKTOP_GEOMETRY\",\n\t\t\"CARDINAL\", uint(dg.Width), uint(dg.Height))\n}\n\n// _NET_DESKTOP_GEOMETRY req\nfunc DesktopGeometryReq(xu *xgbutil.XUtil, dg *DesktopGeometry) error {\n\treturn ClientEvent(xu, xu.RootWin(), \"_NET_DESKTOP_GEOMETRY\", dg.Width,\n\t\tdg.Height)\n}\n\n// DesktopLayout is a struct that organizes information pertaining to\n// the _NET_DESKTOP_LAYOUT property. Namely, the orientation, the number\n// of columns, the number of rows, and the starting corner.\ntype DesktopLayout struct {\n\tOrientation    int\n\tColumns        int\n\tRows           int\n\tStartingCorner int\n}\n\n// _NET_DESKTOP_LAYOUT constants for orientation\nconst (\n\tOrientHorz = iota\n\tOrientVert\n)\n\n// _NET_DESKTOP_LAYOUT constants for starting corner\nconst (\n\tTopLeft = iota\n\tTopRight\n\tBottomRight\n\tBottomLeft\n)\n\n// _NET_DESKTOP_LAYOUT get\nfunc DesktopLayoutGet(xu *xgbutil.XUtil) (dl *DesktopLayout, err error) {\n\tdlraw, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_DESKTOP_LAYOUT\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tdl = &DesktopLayout{}\n\tdl.Orientation = int(dlraw[0])\n\tdl.Columns = int(dlraw[1])\n\tdl.Rows = int(dlraw[2])\n\n\tif len(dlraw) > 3 {\n\t\tdl.StartingCorner = int(dlraw[3])\n\t} else {\n\t\tdl.StartingCorner = TopLeft\n\t}\n\n\treturn dl, nil\n}\n\n// _NET_DESKTOP_LAYOUT set\nfunc DesktopLayoutSet(xu *xgbutil.XUtil, orientation, columns, rows,\n\tstartingCorner uint) error {\n\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_DESKTOP_LAYOUT\",\n\t\t\"CARDINAL\", orientation, columns, rows,\n\t\tstartingCorner)\n}\n\n// DesktopViewport is a struct that contains a pairing of x,y coordinates\n// representing the top-left corner of each desktop. (There will typically\n// be one struct here for each desktop in existence.)\ntype DesktopViewport struct {\n\tX int\n\tY int\n}\n\n// _NET_DESKTOP_VIEWPORT get\nfunc DesktopViewportGet(xu *xgbutil.XUtil) ([]DesktopViewport, error) {\n\tcoords, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_DESKTOP_VIEWPORT\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tviewports := make([]DesktopViewport, len(coords)/2)\n\tfor i, _ := range viewports {\n\t\tviewports[i] = DesktopViewport{\n\t\t\tX: int(coords[i*2]),\n\t\t\tY: int(coords[i*2+1]),\n\t\t}\n\t}\n\treturn viewports, nil\n}\n\n// _NET_DESKTOP_VIEWPORT set\nfunc DesktopViewportSet(xu *xgbutil.XUtil, viewports []DesktopViewport) error {\n\tcoords := make([]uint, len(viewports)*2)\n\tfor i, viewport := range viewports {\n\t\tcoords[i*2] = uint(viewport.X)\n\t\tcoords[i*2+1] = uint(viewport.Y)\n\t}\n\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_DESKTOP_VIEWPORT\",\n\t\t\"CARDINAL\", coords...)\n}\n\n// _NET_DESKTOP_VIEWPORT req\nfunc DesktopViewportReq(xu *xgbutil.XUtil, x, y int) error {\n\treturn ClientEvent(xu, xu.RootWin(), \"_NET_DESKTOP_VIEWPORT\", x, y)\n}\n\n// FrameExtents is a struct that organizes information associated with\n// the _NET_FRAME_EXTENTS property. Namely, the left, right, top and bottom\n// decoration sizes.\ntype FrameExtents struct {\n\tLeft   int\n\tRight  int\n\tTop    int\n\tBottom int\n}\n\n// _NET_FRAME_EXTENTS get\nfunc FrameExtentsGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (*FrameExtents, error) {\n\n\traw, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"_NET_FRAME_EXTENTS\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &FrameExtents{\n\t\tLeft:   int(raw[0]),\n\t\tRight:  int(raw[1]),\n\t\tTop:    int(raw[2]),\n\t\tBottom: int(raw[3]),\n\t}, nil\n}\n\n// _NET_FRAME_EXTENTS set\nfunc FrameExtentsSet(xu *xgbutil.XUtil, win xproto.Window,\n\textents *FrameExtents) error {\n\traw := make([]uint, 4)\n\traw[0] = uint(extents.Left)\n\traw[1] = uint(extents.Right)\n\traw[2] = uint(extents.Top)\n\traw[3] = uint(extents.Bottom)\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_FRAME_EXTENTS\", \"CARDINAL\", raw...)\n}\n\n// _NET_MOVERESIZE_WINDOW req\n// If 'w' or 'h' are 0, then they are not sent.\n// If you need to resize a window without moving it, use the ReqExtra variant,\n// or Resize.\nfunc MoveresizeWindow(xu *xgbutil.XUtil, win xproto.Window,\n\tx, y, w, h int) error {\n\n\treturn MoveresizeWindowExtra(xu, win, x, y, w, h, xproto.GravityBitForget,\n\t\t2, true, true)\n}\n\n// _NET_MOVERESIZE_WINDOW req resize only\nfunc ResizeWindow(xu *xgbutil.XUtil, win xproto.Window, w, h int) error {\n\treturn MoveresizeWindowExtra(xu, win, 0, 0, w, h, xproto.GravityBitForget,\n\t\t2, false, false)\n}\n\n// _NET_MOVERESIZE_WINDOW req move only\nfunc MoveWindow(xu *xgbutil.XUtil, win xproto.Window, x, y int) error {\n\treturn MoveresizeWindowExtra(xu, win, x, y, 0, 0, xproto.GravityBitForget,\n\t\t2, true, true)\n}\n\n// _NET_MOVERESIZE_WINDOW req extra\n// If 'w' or 'h' are 0, then they are not sent.\n// To not set 'x' or 'y', 'usex' or 'usey' need to be set to false.\nfunc MoveresizeWindowExtra(xu *xgbutil.XUtil, win xproto.Window, x, y, w, h,\n\tgravity, source int, usex, usey bool) error {\n\n\tflags := gravity\n\tflags |= source << 12\n\tif usex {\n\t\tflags |= 1 << 8\n\t}\n\tif usey {\n\t\tflags |= 1 << 9\n\t}\n\tif w > 0 {\n\t\tflags |= 1 << 10\n\t}\n\tif h > 0 {\n\t\tflags |= 1 << 11\n\t}\n\n\treturn ClientEvent(xu, win, \"_NET_MOVERESIZE_WINDOW\", flags, x, y, w, h)\n}\n\n// _NET_NUMBER_OF_DESKTOPS get\nfunc NumberOfDesktopsGet(xu *xgbutil.XUtil) (uint, error) {\n\treturn xprop.PropValNum(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_NUMBER_OF_DESKTOPS\"))\n}\n\n// _NET_NUMBER_OF_DESKTOPS set\nfunc NumberOfDesktopsSet(xu *xgbutil.XUtil, numDesks uint) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_NUMBER_OF_DESKTOPS\",\n\t\t\"CARDINAL\", numDesks)\n}\n\n// _NET_NUMBER_OF_DESKTOPS req\nfunc NumberOfDesktopsReq(xu *xgbutil.XUtil, numDesks int) error {\n\treturn ClientEvent(xu, xu.RootWin(), \"_NET_NUMBER_OF_DESKTOPS\", numDesks)\n}\n\n// _NET_REQUEST_FRAME_EXTENTS req\nfunc RequestFrameExtents(xu *xgbutil.XUtil, win xproto.Window) error {\n\treturn ClientEvent(xu, win, \"_NET_REQUEST_FRAME_EXTENTS\")\n}\n\n// _NET_RESTACK_WINDOW req\n// The shortcut here is to just raise the window to the top of the window stack.\nfunc RestackWindow(xu *xgbutil.XUtil, win xproto.Window) error {\n\treturn RestackWindowExtra(xu, win, xproto.StackModeAbove, 0, 2)\n}\n\n// _NET_RESTACK_WINDOW req extra\nfunc RestackWindowExtra(xu *xgbutil.XUtil, win xproto.Window, stackMode int,\n\tsibling xproto.Window, source int) error {\n\n\treturn ClientEvent(xu, win, \"_NET_RESTACK_WINDOW\", source, int(sibling),\n\t\tstackMode)\n}\n\n// _NET_SHOWING_DESKTOP get\nfunc ShowingDesktopGet(xu *xgbutil.XUtil) (bool, error) {\n\treply, err := xprop.GetProperty(xu, xu.RootWin(), \"_NET_SHOWING_DESKTOP\")\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tval, err := xprop.PropValNum(reply, nil)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn val == 1, nil\n}\n\n// _NET_SHOWING_DESKTOP set\nfunc ShowingDesktopSet(xu *xgbutil.XUtil, show bool) error {\n\tvar showInt uint\n\tif show {\n\t\tshowInt = 1\n\t} else {\n\t\tshowInt = 0\n\t}\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_SHOWING_DESKTOP\",\n\t\t\"CARDINAL\", showInt)\n}\n\n// _NET_SHOWING_DESKTOP req\nfunc ShowingDesktopReq(xu *xgbutil.XUtil, show bool) error {\n\tvar showInt uint\n\tif show {\n\t\tshowInt = 1\n\t} else {\n\t\tshowInt = 0\n\t}\n\treturn ClientEvent(xu, xu.RootWin(), \"_NET_SHOWING_DESKTOP\", showInt)\n}\n\n// _NET_SUPPORTED get\nfunc SupportedGet(xu *xgbutil.XUtil) ([]string, error) {\n\treply, err := xprop.GetProperty(xu, xu.RootWin(), \"_NET_SUPPORTED\")\n\treturn xprop.PropValAtoms(xu, reply, err)\n}\n\n// _NET_SUPPORTED set\n// This will create any atoms in the argument if they don't already exist.\nfunc SupportedSet(xu *xgbutil.XUtil, atomNames []string) error {\n\tatoms, err := xprop.StrToAtoms(xu, atomNames)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_SUPPORTED\", \"ATOM\",\n\t\tatoms...)\n}\n\n// _NET_SUPPORTING_WM_CHECK get\nfunc SupportingWmCheckGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (xproto.Window, error) {\n\n\treturn xprop.PropValWindow(xprop.GetProperty(xu, win,\n\t\t\"_NET_SUPPORTING_WM_CHECK\"))\n}\n\n// _NET_SUPPORTING_WM_CHECK set\nfunc SupportingWmCheckSet(xu *xgbutil.XUtil, win xproto.Window,\n\twmWin xproto.Window) error {\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_SUPPORTING_WM_CHECK\", \"WINDOW\",\n\t\tuint(wmWin))\n}\n\n// _NET_VIRTUAL_ROOTS get\nfunc VirtualRootsGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {\n\treturn xprop.PropValWindows(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_VIRTUAL_ROOTS\"))\n}\n\n// _NET_VIRTUAL_ROOTS set\nfunc VirtualRootsSet(xu *xgbutil.XUtil, wins []xproto.Window) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_VIRTUAL_ROOTS\", \"WINDOW\",\n\t\txprop.WindowToInt(wins)...)\n}\n\n// _NET_VISIBLE_DESKTOPS get\n// This is not part of the EWMH spec, but is a property of my own creation.\n// It allows the window manager to report that it has multiple desktops\n// viewable at the same time. (This conflicts with other EWMH properties,\n// so I don't think this will ever be added to the official spec.)\nfunc VisibleDesktopsGet(xu *xgbutil.XUtil) ([]uint, error) {\n\treturn xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_VISIBLE_DESKTOPS\"))\n}\n\n// _NET_VISIBLE_DESKTOPS set\nfunc VisibleDesktopsSet(xu *xgbutil.XUtil, desktops []uint) error {\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_VISIBLE_DESKTOPS\",\n\t\t\"CARDINAL\", desktops...)\n}\n\n// _NET_WM_ALLOWED_ACTIONS get\nfunc WmAllowedActionsGet(xu *xgbutil.XUtil,\n\twin xproto.Window) ([]string, error) {\n\n\traw, err := xprop.GetProperty(xu, win, \"_NET_WM_ALLOWED_ACTIONS\")\n\treturn xprop.PropValAtoms(xu, raw, err)\n}\n\n// _NET_WM_ALLOWED_ACTIONS set\nfunc WmAllowedActionsSet(xu *xgbutil.XUtil, win xproto.Window,\n\tatomNames []string) error {\n\n\tatoms, err := xprop.StrToAtoms(xu, atomNames)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_ALLOWED_ACTIONS\", \"ATOM\",\n\t\tatoms...)\n}\n\n// _NET_WM_DESKTOP get\nfunc WmDesktopGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {\n\treturn xprop.PropValNum(xprop.GetProperty(xu, win, \"_NET_WM_DESKTOP\"))\n}\n\n// _NET_WM_DESKTOP set\nfunc WmDesktopSet(xu *xgbutil.XUtil, win xproto.Window, desk uint) error {\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_DESKTOP\", \"CARDINAL\",\n\t\tuint(desk))\n}\n\n// _NET_WM_DESKTOP req\nfunc WmDesktopReq(xu *xgbutil.XUtil, win xproto.Window, desk uint) error {\n\treturn WmDesktopReqExtra(xu, win, desk, 2)\n}\n\n// _NET_WM_DESKTOP req extra\nfunc WmDesktopReqExtra(xu *xgbutil.XUtil, win xproto.Window, desk uint,\n\tsource int) error {\n\n\treturn ClientEvent(xu, win, \"_NET_WM_DESKTOP\", desk, source)\n}\n\n// WmFullscreenMonitors is a struct that organizes information related to the\n// _NET_WM_FULLSCREEN_MONITORS property. Namely, the top, bottom, left and\n// right monitor edges for a particular window.\ntype WmFullscreenMonitors struct {\n\tTop    uint\n\tBottom uint\n\tLeft   uint\n\tRight  uint\n}\n\n// _NET_WM_FULLSCREEN_MONITORS get\nfunc WmFullscreenMonitorsGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (*WmFullscreenMonitors, error) {\n\n\traw, err := xprop.PropValNums(\n\t\txprop.GetProperty(xu, win, \"_NET_WM_FULLSCREEN_MONITORS\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &WmFullscreenMonitors{\n\t\tTop:    raw[0],\n\t\tBottom: raw[1],\n\t\tLeft:   raw[2],\n\t\tRight:  raw[3],\n\t}, nil\n}\n\n// _NET_WM_FULLSCREEN_MONITORS set\nfunc WmFullscreenMonitorsSet(xu *xgbutil.XUtil, win xproto.Window,\n\tedges *WmFullscreenMonitors) error {\n\n\traw := make([]uint, 4)\n\traw[0] = edges.Top\n\traw[1] = edges.Bottom\n\traw[2] = edges.Left\n\traw[3] = edges.Right\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_FULLSCREEN_MONITORS\",\n\t\t\"CARDINAL\", raw...)\n}\n\n// _NET_WM_FULLSCREEN_MONITORS req\nfunc WmFullscreenMonitorsReq(xu *xgbutil.XUtil, win xproto.Window,\n\tedges *WmFullscreenMonitors) error {\n\n\treturn WmFullscreenMonitorsReqExtra(xu, win, edges, 2)\n}\n\n// _NET_WM_FULLSCREEN_MONITORS req extra\nfunc WmFullscreenMonitorsReqExtra(xu *xgbutil.XUtil, win xproto.Window,\n\tedges *WmFullscreenMonitors, source int) error {\n\n\treturn ClientEvent(xu, win, \"_NET_WM_FULLSCREEN_MONITORS\",\n\t\tedges.Top, edges.Bottom, edges.Left, edges.Right, source)\n}\n\n// _NET_WM_HANDLED_ICONS get\nfunc WmHandledIconsGet(xu *xgbutil.XUtil, win xproto.Window) (bool, error) {\n\treply, err := xprop.GetProperty(xu, win, \"_NET_WM_HANDLED_ICONS\")\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tval, err := xprop.PropValNum(reply, nil)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\treturn val == 1, nil\n}\n\n// _NET_WM_HANDLED_ICONS set\nfunc WmHandledIconsSet(xu *xgbutil.XUtil, handle bool) error {\n\tvar handled uint\n\tif handle {\n\t\thandled = 1\n\t} else {\n\t\thandled = 0\n\t}\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_WM_HANDLED_ICONS\",\n\t\t\"CARDINAL\", handled)\n}\n\n// WmIcon is a struct that contains data for a single icon.\n// The WmIcon method will return a list of these, since a single\n// client can specify multiple icons of varying sizes.\ntype WmIcon struct {\n\tWidth  uint\n\tHeight uint\n\tData   []uint\n}\n\n// _NET_WM_ICON get\nfunc WmIconGet(xu *xgbutil.XUtil, win xproto.Window) ([]WmIcon, error) {\n\ticon, err := xprop.PropValNums(xprop.GetProperty(xu, win, \"_NET_WM_ICON\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\twmicons := make([]WmIcon, 0)\n\tstart := uint(0)\n\tfor int(start) < len(icon) {\n\t\tw, h := icon[start], icon[start+1]\n\t\tupto := w * h\n\n\t\twmicon := WmIcon{\n\t\t\tWidth:  w,\n\t\t\tHeight: h,\n\t\t\tData:   icon[(start + 2):(start + upto + 2)],\n\t\t}\n\t\twmicons = append(wmicons, wmicon)\n\n\t\tstart += upto + 2\n\t}\n\n\treturn wmicons, nil\n}\n\n// _NET_WM_ICON set\nfunc WmIconSet(xu *xgbutil.XUtil, win xproto.Window, icons []WmIcon) error {\n\traw := make([]uint, 0, 10000) // start big\n\tfor _, icon := range icons {\n\t\traw = append(raw, icon.Width, icon.Height)\n\t\traw = append(raw, icon.Data...)\n\t}\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_ICON\", \"CARDINAL\", raw...)\n}\n\n// WmIconGeometry struct organizes the information pertaining to the\n// _NET_WM_ICON_GEOMETRY property. Namely, x, y, width and height.\ntype WmIconGeometry struct {\n\tX      int\n\tY      int\n\tWidth  uint\n\tHeight uint\n}\n\n// _NET_WM_ICON_GEOMETRY get\nfunc WmIconGeometryGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (*WmIconGeometry, error) {\n\n\tgeom, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_ICON_GEOMETRY\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &WmIconGeometry{\n\t\tX:      int(geom[0]),\n\t\tY:      int(geom[1]),\n\t\tWidth:  geom[2],\n\t\tHeight: geom[3],\n\t}, nil\n}\n\n// _NET_WM_ICON_GEOMETRY set\nfunc WmIconGeometrySet(xu *xgbutil.XUtil, win xproto.Window,\n\tgeom *WmIconGeometry) error {\n\n\trawGeom := make([]uint, 4)\n\trawGeom[0] = uint(geom.X)\n\trawGeom[1] = uint(geom.Y)\n\trawGeom[2] = geom.Width\n\trawGeom[3] = geom.Height\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_ICON_GEOMETRY\", \"CARDINAL\",\n\t\trawGeom...)\n}\n\n// _NET_WM_ICON_NAME get\nfunc WmIconNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win, \"_NET_WM_ICON_NAME\"))\n}\n\n// _NET_WM_ICON_NAME set\nfunc WmIconNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {\n\treturn xprop.ChangeProp(xu, win, 8, \"_NET_WM_ICON_NAME\", \"UTF8_STRING\",\n\t\t[]byte(name))\n}\n\n// _NET_WM_MOVERESIZE constants\nconst (\n\tSizeTopLeft = iota\n\tSizeTop\n\tSizeTopRight\n\tSizeRight\n\tSizeBottomRight\n\tSizeBottom\n\tSizeBottomLeft\n\tSizeLeft\n\tMove\n\tSizeKeyboard\n\tMoveKeyboard\n\tCancel\n\tInfer // special for Wingo. DO NOT USE.\n)\n\n// _NET_WM_MOVERESIZE req\nfunc WmMoveresize(xu *xgbutil.XUtil, win xproto.Window, direction int) error {\n\treturn WmMoveresizeExtra(xu, win, direction, 0, 0, 0, 2)\n}\n\n// _NET_WM_MOVERESIZE req extra\nfunc WmMoveresizeExtra(xu *xgbutil.XUtil, win xproto.Window, direction,\n\txRoot, yRoot, button, source int) error {\n\n\treturn ClientEvent(xu, win, \"_NET_WM_MOVERESIZE\",\n\t\txRoot, yRoot, direction, button, source)\n}\n\n// _NET_WM_NAME get\nfunc WmNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win, \"_NET_WM_NAME\"))\n}\n\n// _NET_WM_NAME set\nfunc WmNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {\n\treturn xprop.ChangeProp(xu, win, 8, \"_NET_WM_NAME\", \"UTF8_STRING\",\n\t\t[]byte(name))\n}\n\n// WmOpaqueRegion organizes information related to the _NET_WM_OPAQUE_REGION\n// property. Namely, the x, y, width and height of an opaque rectangle\n// relative to the client window.\ntype WmOpaqueRegion struct {\n\tX      int\n\tY      int\n\tWidth  uint\n\tHeight uint\n}\n\n// _NET_WM_OPAQUE_REGION get\nfunc WmOpaqueRegionGet(xu *xgbutil.XUtil,\n\twin xproto.Window) ([]WmOpaqueRegion, error) {\n\n\traw, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_OPAQUE_REGION\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tregions := make([]WmOpaqueRegion, len(raw)/4)\n\tfor i, _ := range regions {\n\t\tregions[i] = WmOpaqueRegion{\n\t\t\tX:      int(raw[i*4+0]),\n\t\t\tY:      int(raw[i*4+1]),\n\t\t\tWidth:  raw[i*4+2],\n\t\t\tHeight: raw[i*4+3],\n\t\t}\n\t}\n\treturn regions, nil\n}\n\n// _NET_WM_OPAQUE_REGION set\nfunc WmOpaqueRegionSet(xu *xgbutil.XUtil, win xproto.Window,\n\tregions []WmOpaqueRegion) error {\n\n\traw := make([]uint, len(regions)*4)\n\n\tfor i, region := range regions {\n\t\traw[i*4+0] = uint(region.X)\n\t\traw[i*4+1] = uint(region.Y)\n\t\traw[i*4+2] = region.Width\n\t\traw[i*4+3] = region.Height\n\t}\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_OPAQUE_REGION\", \"CARDINAL\",\n\t\traw...)\n}\n\n// _NET_WM_PID get\nfunc WmPidGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {\n\treturn xprop.PropValNum(xprop.GetProperty(xu, win, \"_NET_WM_PID\"))\n}\n\n// _NET_WM_PID set\nfunc WmPidSet(xu *xgbutil.XUtil, win xproto.Window, pid uint) error {\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_PID\", \"CARDINAL\", pid)\n}\n\n// _NET_WM_PING req\nfunc WmPing(xu *xgbutil.XUtil, win xproto.Window, response bool) error {\n\treturn WmPingExtra(xu, win, response, 0)\n}\n\n// _NET_WM_PING req extra\nfunc WmPingExtra(xu *xgbutil.XUtil, win xproto.Window, response bool,\n\ttime xproto.Timestamp) error {\n\n\tpingAtom, err := xprop.Atm(xu, \"_NET_WM_PING\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tvar evWindow xproto.Window\n\tif response {\n\t\tevWindow = xu.RootWin()\n\t} else {\n\t\tevWindow = win\n\t}\n\n\treturn ClientEvent(xu, evWindow, \"WM_PROTOCOLS\", int(pingAtom), int(time),\n\t\tint(win))\n}\n\n// _NET_WM_STATE constants for state toggling\n// These correspond to the \"action\" parameter.\nconst (\n\tStateRemove = iota\n\tStateAdd\n\tStateToggle\n)\n\n// _NET_WM_STATE get\nfunc WmStateGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, error) {\n\traw, err := xprop.GetProperty(xu, win, \"_NET_WM_STATE\")\n\treturn xprop.PropValAtoms(xu, raw, err)\n}\n\n// _NET_WM_STATE set\nfunc WmStateSet(xu *xgbutil.XUtil, win xproto.Window,\n\tatomNames []string) error {\n\n\tatoms, err := xprop.StrToAtoms(xu, atomNames)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_STATE\", \"ATOM\", atoms...)\n}\n\n// _NET_WM_STATE req\nfunc WmStateReq(xu *xgbutil.XUtil, win xproto.Window, action int,\n\tatomName string) error {\n\n\treturn WmStateReqExtra(xu, win, action, atomName, \"\", 2)\n}\n\n// _NET_WM_STATE req extra\nfunc WmStateReqExtra(xu *xgbutil.XUtil, win xproto.Window, action int,\n\tfirst string, second string, source int) (err error) {\n\n\tvar atom1, atom2 xproto.Atom\n\n\tatom1, err = xprop.Atom(xu, first, false)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif len(second) > 0 {\n\t\tatom2, err = xprop.Atom(xu, second, false)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\tatom2 = 0\n\t}\n\n\treturn ClientEvent(xu, win, \"_NET_WM_STATE\", action, int(atom1), int(atom2),\n\t\tsource)\n}\n\n// WmStrut struct organizes information for the _NET_WM_STRUT property.\n// Namely, it encapsulates its four values: left, right, top and bottom.\ntype WmStrut struct {\n\tLeft   uint\n\tRight  uint\n\tTop    uint\n\tBottom uint\n}\n\n// _NET_WM_STRUT get\nfunc WmStrutGet(xu *xgbutil.XUtil, win xproto.Window) (*WmStrut, error) {\n\tstruts, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_STRUT\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &WmStrut{\n\t\tLeft:   struts[0],\n\t\tRight:  struts[1],\n\t\tTop:    struts[2],\n\t\tBottom: struts[3],\n\t}, nil\n}\n\n// _NET_WM_STRUT set\nfunc WmStrutSet(xu *xgbutil.XUtil, win xproto.Window, struts *WmStrut) error {\n\trawStruts := make([]uint, 4)\n\trawStruts[0] = struts.Left\n\trawStruts[1] = struts.Right\n\trawStruts[2] = struts.Top\n\trawStruts[3] = struts.Bottom\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_STRUT\", \"CARDINAL\",\n\t\trawStruts...)\n}\n\n// WmStrutPartial struct organizes information for the _NET_WM_STRUT_PARTIAL\n// property. Namely, it encapsulates its twelve values: left, right, top,\n// bottom, left_start_y, left_end_y, right_start_y, right_end_y,\n// top_start_x, top_end_x, bottom_start_x, and bottom_end_x.\ntype WmStrutPartial struct {\n\tLeft, Right, Top, Bottom                     uint\n\tLeftStartY, LeftEndY, RightStartY, RightEndY uint\n\tTopStartX, TopEndX, BottomStartX, BottomEndX uint\n}\n\n// _NET_WM_STRUT_PARTIAL get\nfunc WmStrutPartialGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (*WmStrutPartial, error) {\n\n\tstruts, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_STRUT_PARTIAL\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &WmStrutPartial{\n\t\tLeft: struts[0], Right: struts[1], Top: struts[2], Bottom: struts[3],\n\t\tLeftStartY: struts[4], LeftEndY: struts[5],\n\t\tRightStartY: struts[6], RightEndY: struts[7],\n\t\tTopStartX: struts[8], TopEndX: struts[9],\n\t\tBottomStartX: struts[10], BottomEndX: struts[11],\n\t}, nil\n}\n\n// _NET_WM_STRUT_PARTIAL set\nfunc WmStrutPartialSet(xu *xgbutil.XUtil, win xproto.Window,\n\tstruts *WmStrutPartial) error {\n\n\trawStruts := make([]uint, 12)\n\trawStruts[0] = struts.Left\n\trawStruts[1] = struts.Right\n\trawStruts[2] = struts.Top\n\trawStruts[3] = struts.Bottom\n\trawStruts[4] = struts.LeftStartY\n\trawStruts[5] = struts.LeftEndY\n\trawStruts[6] = struts.RightStartY\n\trawStruts[7] = struts.RightEndY\n\trawStruts[8] = struts.TopStartX\n\trawStruts[9] = struts.TopEndX\n\trawStruts[10] = struts.BottomStartX\n\trawStruts[11] = struts.BottomEndX\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_STRUT_PARTIAL\", \"CARDINAL\",\n\t\trawStruts...)\n}\n\n// _NET_WM_SYNC_REQUEST req\nfunc WmSyncRequest(xu *xgbutil.XUtil, win xproto.Window, req_num uint64) error {\n\treturn WmSyncRequestExtra(xu, win, req_num, 0)\n}\n\n// _NET_WM_SYNC_REQUEST req extra\nfunc WmSyncRequestExtra(xu *xgbutil.XUtil, win xproto.Window, reqNum uint64,\n\ttime xproto.Timestamp) error {\n\n\tsyncReq, err := xprop.Atm(xu, \"_NET_WM_SYNC_REQUEST\")\n\tif err != nil {\n\t\treturn err\n\t}\n\n\thigh := int(reqNum >> 32)\n\tlow := int(reqNum<<32 ^ reqNum)\n\n\treturn ClientEvent(xu, win, \"WM_PROTOCOLS\", int(syncReq), int(time),\n\t\tlow, high)\n}\n\n// _NET_WM_SYNC_REQUEST_COUNTER get\n// I'm pretty sure this needs 64 bit integers, but I'm not quite sure\n// how to go about that yet. Any ideas?\nfunc WmSyncRequestCounter(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {\n\treturn xprop.PropValNum(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_SYNC_REQUEST_COUNTER\"))\n}\n\n// _NET_WM_SYNC_REQUEST_COUNTER set\n// I'm pretty sure this needs 64 bit integers, but I'm not quite sure\n// how to go about that yet. Any ideas?\nfunc WmSyncRequestCounterSet(xu *xgbutil.XUtil, win xproto.Window,\n\tcounter uint) error {\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_SYNC_REQUEST_COUNTER\",\n\t\t\"CARDINAL\", counter)\n}\n\n// _NET_WM_USER_TIME get\nfunc WmUserTimeGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {\n\treturn xprop.PropValNum(xprop.GetProperty(xu, win, \"_NET_WM_USER_TIME\"))\n}\n\n// _NET_WM_USER_TIME set\nfunc WmUserTimeSet(xu *xgbutil.XUtil, win xproto.Window, userTime uint) error {\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_USER_TIME\", \"CARDINAL\",\n\t\tuserTime)\n}\n\n// _NET_WM_USER_TIME_WINDOW get\nfunc WmUserTimeWindowGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (xproto.Window, error) {\n\n\treturn xprop.PropValWindow(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_USER_TIME_WINDOW\"))\n}\n\n// _NET_WM_USER_TIME set\nfunc WmUserTimeWindowSet(xu *xgbutil.XUtil, win xproto.Window,\n\ttimeWin xproto.Window) error {\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_USER_TIME_WINDOW\", \"CARDINAL\",\n\t\tuint(timeWin))\n}\n\n// _NET_WM_VISIBLE_ICON_NAME get\nfunc WmVisibleIconNameGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (string, error) {\n\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win,\n\t\t\"_NET_WM_VISIBLE_ICON_NAME\"))\n}\n\n// _NET_WM_VISIBLE_ICON_NAME set\nfunc WmVisibleIconNameSet(xu *xgbutil.XUtil, win xproto.Window,\n\tname string) error {\n\n\treturn xprop.ChangeProp(xu, win, 8, \"_NET_WM_VISIBLE_ICON_NAME\",\n\t\t\"UTF8_STRING\", []byte(name))\n}\n\n// _NET_WM_VISIBLE_NAME get\nfunc WmVisibleNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win, \"_NET_WM_VISIBLE_NAME\"))\n}\n\n// _NET_WM_VISIBLE_NAME set\nfunc WmVisibleNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {\n\treturn xprop.ChangeProp(xu, win, 8, \"_NET_WM_VISIBLE_NAME\", \"UTF8_STRING\",\n\t\t[]byte(name))\n}\n\n// _NET_WM_WINDOW_OPACITY get\n// This isn't part of the EWMH spec, but is widely used by drop in\n// compositing managers (i.e., xcompmgr, cairo-compmgr, etc.).\n// This property is typically set not on a client window, but the *parent*\n// of a client window in reparenting window managers.\n// The float returned will be in the range [0.0, 1.0] where 0.0 is completely\n// transparent and 1.0 is completely opaque.\nfunc WmWindowOpacityGet(xu *xgbutil.XUtil, win xproto.Window) (float64, error) {\n\tintOpacity, err := xprop.PropValNum(\n\t\txprop.GetProperty(xu, win, \"_NET_WM_WINDOW_OPACITY\"))\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn float64(uint(intOpacity)) / float64(0xffffffff), nil\n}\n\n// _NET_WM_WINDOW_OPACITY set\nfunc WmWindowOpacitySet(xu *xgbutil.XUtil, win xproto.Window,\n\topacity float64) error {\n\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_WINDOW_OPACITY\", \"CARDINAL\",\n\t\tuint(opacity*0xffffffff))\n}\n\n// _NET_WM_WINDOW_TYPE get\nfunc WmWindowTypeGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, error) {\n\traw, err := xprop.GetProperty(xu, win, \"_NET_WM_WINDOW_TYPE\")\n\treturn xprop.PropValAtoms(xu, raw, err)\n}\n\n// _NET_WM_WINDOW_TYPE set\n// This will create any atoms used in 'atomNames' if they don't already exist.\nfunc WmWindowTypeSet(xu *xgbutil.XUtil, win xproto.Window,\n\tatomNames []string) error {\n\n\tatoms, err := xprop.StrToAtoms(xu, atomNames)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn xprop.ChangeProp32(xu, win, \"_NET_WM_WINDOW_TYPE\", \"ATOM\", atoms...)\n}\n\n// Workarea is a struct that represents a rectangle as a bounding box of\n// a single desktop. So there should be as many Workarea structs as there\n// are desktops.\ntype Workarea struct {\n\tX      int\n\tY      int\n\tWidth  uint\n\tHeight uint\n}\n\n// _NET_WORKAREA get\nfunc WorkareaGet(xu *xgbutil.XUtil) ([]Workarea, error) {\n\trects, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),\n\t\t\"_NET_WORKAREA\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tworkareas := make([]Workarea, len(rects)/4)\n\tfor i, _ := range workareas {\n\t\tworkareas[i] = Workarea{\n\t\t\tX:      int(rects[i*4]),\n\t\t\tY:      int(rects[i*4+1]),\n\t\t\tWidth:  rects[i*4+2],\n\t\t\tHeight: rects[i*4+3],\n\t\t}\n\t}\n\treturn workareas, nil\n}\n\n// _NET_WORKAREA set\nfunc WorkareaSet(xu *xgbutil.XUtil, workareas []Workarea) error {\n\trects := make([]uint, len(workareas)*4)\n\tfor i, workarea := range workareas {\n\t\trects[i*4+0] = uint(workarea.X)\n\t\trects[i*4+1] = uint(workarea.Y)\n\t\trects[i*4+2] = workarea.Width\n\t\trects[i*4+3] = workarea.Height\n\t}\n\n\treturn xprop.ChangeProp32(xu, xu.RootWin(), \"_NET_WORKAREA\", \"CARDINAL\",\n\t\trects...)\n}\n"
  },
  {
    "path": "ewmh/winman.go",
    "content": "package ewmh\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// GetEwmhWM uses the EWMH spec to find if a conforming window manager\n// is currently running or not. If it is, then its name will be returned.\n// Otherwise, an error will be returned explaining why one couldn't be found.\nfunc GetEwmhWM(xu *xgbutil.XUtil) (string, error) {\n\tchildCheck, err := SupportingWmCheckGet(xu, xu.RootWin())\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"GetEwmhWM: Failed because: %s\", err)\n\t}\n\n\tchildCheck2, err := SupportingWmCheckGet(xu, childCheck)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"GetEwmhWM: Failed because: %s\", err)\n\t}\n\n\tif childCheck != childCheck2 {\n\t\treturn \"\", fmt.Errorf(\n\t\t\t\"GetEwmhWM: _NET_SUPPORTING_WM_CHECK value on the root window \"+\n\t\t\t\t\"(%x) does not match _NET_SUPPORTING_WM_CHECK value \"+\n\t\t\t\t\"on the child window (%x).\", childCheck, childCheck2)\n\t}\n\n\treturn WmNameGet(xu, childCheck)\n}\n"
  },
  {
    "path": "gopher/doc.go",
    "content": "/*\nPackage gopher contains a single image of the Go gopher. It is included to\nguarantee that at least one image is always available for some examples\nto run successfully.\n\nThis file was automatically generated by go-bindata.\n*/\npackage gopher\n"
  },
  {
    "path": "gopher/gopher.go",
    "content": "package gopher\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"io\"\n)\n\n// GopherPng returns the raw, uncompressed file data data.\nfunc GopherPng() []byte {\n\tgz, err := gzip.NewReader(bytes.NewBuffer([]byte{\n\t\t0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0x34, 0x9b,\n\t\t0x05, 0x50, 0x5d, 0x4d, 0xd3, 0xad, 0x0f, 0xee, 0x12, 0xf4, 0x20, 0x81,\n\t\t0xe0, 0x04, 0x77, 0xf7, 0x60, 0xc1, 0xdd, 0x9d, 0xe0, 0xee, 0xee, 0xee,\n\t\t0x21, 0xb8, 0x3b, 0x04, 0x87, 0xe0, 0xee, 0xf0, 0x62, 0xc1, 0x35, 0xb8,\n\t\t0xbb, 0xbb, 0xde, 0x4d, 0x7d, 0xf7, 0x4f, 0x55, 0x8a, 0x02, 0x4e, 0xd5,\n\t\t0xee, 0xdd, 0xd3, 0xbd, 0xfa, 0x59, 0x33, 0x43, 0x84, 0x82, 0x9c, 0x04,\n\t\t0x0a, 0x22, 0x3e, 0x22, 0x08, 0x04, 0x42, 0xf9, 0x2e, 0x29, 0xaa, 0x04,\n\t\t0x02, 0x41, 0xdc, 0x7c, 0xfc, 0x87, 0x87, 0x05, 0x7e, 0x32, 0x3a, 0xbf,\n\t\t0x1e, 0x09, 0x7c, 0x81, 0x76, 0x12, 0xf9, 0xae, 0x02, 0x0f, 0xfc, 0xf3,\n\t\t0x86, 0xff, 0x11, 0x0e, 0x02, 0x7d, 0x01, 0x7d, 0x17, 0x15, 0x56, 0x71,\n\t\t0xcf, 0x3c, 0xc9, 0x72, 0x53, 0x51, 0x19, 0xc2, 0x1d, 0xea, 0xb2, 0xa3,\n\t\t0x6d, 0xbb, 0x61, 0x90, 0x52, 0x45, 0xff, 0x1a, 0x08, 0x53, 0x43, 0x8a,\n\t\t0xe8, 0xda, 0xaf, 0x67, 0x6c, 0xf7, 0x5d, 0x26, 0xba, 0x76, 0x00, 0x1c,\n\t\t0x33, 0xb8, 0x83, 0xcb, 0xde, 0x88, 0x15, 0x13, 0x31, 0x08, 0x96, 0xa5,\n\t\t0xfb, 0x1e, 0x1d, 0xc1, 0x7f, 0x87, 0x31, 0xb0, 0xa6, 0x88, 0x8e, 0x04,\n\t\t0x09, 0x39, 0xcd, 0x6b, 0xbd, 0x7e, 0xef, 0xeb, 0x97, 0x8b, 0x24, 0x8d,\n\t\t0x99, 0xac, 0xeb, 0x1a, 0xf0, 0x98, 0x99, 0xe0, 0x94, 0xf9, 0xbc, 0x37,\n\t\t0xae, 0x83, 0x72, 0xb2, 0xda, 0xe2, 0x84, 0x24, 0xf4, 0x05, 0x1d, 0x1e,\n\t\t0x1a, 0x32, 0xaf, 0xa7, 0x6f, 0xbe, 0x09, 0x12, 0x1a, 0x52, 0xb8, 0xed,\n\t\t0xe1, 0xf1, 0xb4, 0xf0, 0x4f, 0x5d, 0x4e, 0xda, 0xd3, 0x53, 0x55, 0x92,\n\t\t0x34, 0x39, 0x5d, 0x80, 0x4c, 0xf2, 0x39, 0x0a, 0xfc, 0xc9, 0x92, 0x75,\n\t\t0x14, 0x07, 0x72, 0x90, 0x2b, 0xa8, 0x0b, 0xc5, 0x60, 0x36, 0x74, 0xc8,\n\t\t0xe9, 0x20, 0x5f, 0xe5, 0x0a, 0x2f, 0xa0, 0x5b, 0x5f, 0x58, 0x71, 0x9e,\n\t\t0x50, 0x7f, 0xbd, 0xfa, 0xc7, 0xe1, 0x21, 0xdc, 0x6d, 0xa5, 0x40, 0x80,\n\t\t0xd0, 0x24, 0xba, 0xd4, 0x3a, 0x22, 0x3a, 0x7c, 0x70, 0x3a, 0x19, 0x96,\n\t\t0xeb, 0x16, 0x2d, 0x96, 0x07, 0x89, 0x94, 0x49, 0x80, 0x42, 0x29, 0x1d,\n\t\t0x4e, 0x9d, 0x06, 0xa1, 0x76, 0x68, 0x7c, 0x1b, 0x6b, 0xb4, 0x0c, 0xa8,\n\t\t0x06, 0x1a, 0x6b, 0xa0, 0x1e, 0x6e, 0x63, 0x90, 0xe9, 0x0a, 0x07, 0x44,\n\t\t0x8b, 0x9b, 0xfb, 0xe8, 0xaf, 0xa4, 0xf1, 0x5a, 0x56, 0xa1, 0xfe, 0x5e,\n\t\t0xab, 0xaf, 0x80, 0xc5, 0xf8, 0xcb, 0x50, 0x83, 0xaa, 0x59, 0xe7, 0xf9,\n\t\t0x19, 0xcb, 0x04, 0x83, 0x2c, 0x61, 0x55, 0x71, 0xb6, 0x4f, 0x3f, 0xea,\n\t\t0x23, 0xbe, 0xe0, 0xc1, 0xa8, 0xa4, 0x39, 0x78, 0xb2, 0xee, 0xa9, 0xa0,\n\t\t0xf1, 0xc6, 0xd7, 0x9f, 0xf9, 0xd0, 0x12, 0xa0, 0x33, 0x3f, 0x10, 0x27,\n\t\t0x1c, 0x48, 0x59, 0xf0, 0xfd, 0x12, 0x0b, 0x24, 0x08, 0x81, 0x4e, 0x68,\n\t\t0x50, 0x6b, 0x6d, 0x5a, 0xa7, 0x61, 0x4b, 0xe4, 0xeb, 0xcb, 0xab, 0x79,\n\t\t0x7b, 0x95, 0x52, 0x2d, 0x51, 0x51, 0x41, 0xa9, 0x79, 0xa8, 0x0d, 0x07,\n\t\t0x29, 0x4c, 0xf0, 0x13, 0x93, 0x27, 0xc0, 0x00, 0x54, 0xa3, 0x61, 0x8b,\n\t\t0x43, 0x18, 0xeb, 0xf8, 0x53, 0x26, 0x79, 0x2a, 0x33, 0x7f, 0x91, 0x01,\n\t\t0xb4, 0x3d, 0xc1, 0x74, 0x85, 0xea, 0xaf, 0xa3, 0x30, 0xc3, 0x3e, 0x26,\n\t\t0x13, 0x6c, 0xef, 0x5c, 0x03, 0x13, 0x36, 0x1e, 0x18, 0x96, 0x41, 0xe6,\n\t\t0x09, 0xdd, 0x10, 0xe2, 0x3f, 0x11, 0x94, 0x14, 0xf2, 0x15, 0x5a, 0xdc,\n\t\t0x7b, 0x07, 0x17, 0x87, 0x6c, 0x6f, 0x09, 0x29, 0xbc, 0x1f, 0x23, 0x15,\n\t\t0x3f, 0x85, 0x6e, 0x74, 0xff, 0xda, 0xc0, 0xd8, 0x10, 0x36, 0x5e, 0x34,\n\t\t0x12, 0xf3, 0x7d, 0xb5, 0xb7, 0x12, 0x4e, 0xfe, 0x67, 0x52, 0x82, 0xfe,\n\t\t0x38, 0xc3, 0x0a, 0x61, 0xe4, 0xd6, 0x2a, 0xb4, 0xc6, 0xbb, 0x03, 0xd7,\n\t\t0xb8, 0xdc, 0xe8, 0xee, 0xd5, 0x3f, 0x21, 0x48, 0xe5, 0x85, 0x2e, 0x3f,\n\t\t0x9f, 0x3e, 0xa3, 0x86, 0x3d, 0x65, 0x95, 0x29, 0x95, 0xf4, 0xbf, 0x39,\n\t\t0xe3, 0x4c, 0x18, 0x8c, 0xfe, 0x59, 0xa2, 0x8a, 0x2f, 0xd6, 0xa1, 0x86,\n\t\t0xaf, 0x23, 0xbb, 0x1c, 0xbc, 0x3d, 0x46, 0xdc, 0x7f, 0x02, 0xa0, 0xa9,\n\t\t0xec, 0xce, 0x6d, 0x4a, 0xce, 0xd6, 0x50, 0xe6, 0x9a, 0x5a, 0xa1, 0x45,\n\t\t0x62, 0xbe, 0xc0, 0x66, 0x09, 0x4d, 0x42, 0x29, 0x97, 0x48, 0xfd, 0xe6,\n\t\t0xf7, 0x82, 0xd4, 0xc1, 0x8a, 0x3c, 0x59, 0xf3, 0x37, 0xc7, 0x90, 0xc5,\n\t\t0x75, 0x81, 0x4c, 0x6c, 0x1f, 0xd9, 0xe3, 0xe1, 0x5e, 0xec, 0x5d, 0x6f,\n\t\t0xc3, 0x1e, 0x93, 0x8d, 0x21, 0x61, 0xdb, 0xea, 0x9b, 0x5e, 0x81, 0xa6,\n\t\t0xc3, 0x81, 0x81, 0xe3, 0xb5, 0xba, 0x68, 0x26, 0x5c, 0xd4, 0xd2, 0xf6,\n\t\t0x9f, 0xd8, 0xee, 0xed, 0xf9, 0x8b, 0x48, 0xe8, 0xba, 0xda, 0x6b, 0x64,\n\t\t0x9e, 0x2e, 0xee, 0xa9, 0xc6, 0x10, 0x39, 0xa0, 0xb4, 0x83, 0x8b, 0x55,\n\t\t0x20, 0x49, 0x0e, 0x0b, 0xc2, 0x8a, 0xe8, 0x0f, 0x6f, 0xc7, 0x8b, 0xa9,\n\t\t0x4b, 0x39, 0x17, 0xa2, 0x64, 0x3c, 0x0e, 0xd9, 0x2f, 0x52, 0xc0, 0x3a,\n\t\t0x27, 0x14, 0xbb, 0xb4, 0x45, 0x82, 0xfe, 0x4b, 0x15, 0x19, 0x75, 0xce,\n\t\t0x5f, 0x95, 0x00, 0xc9, 0xd3, 0xbb, 0xc8, 0xb5, 0x28, 0x45, 0xfa, 0xdd,\n\t\t0x41, 0x99, 0xa6, 0x4e, 0x67, 0xc9, 0x5a, 0xad, 0x59, 0x49, 0x93, 0x0d,\n\t\t0x5e, 0x61, 0x51, 0x4d, 0xa0, 0xed, 0xc6, 0x38, 0x3e, 0x9f, 0xee, 0xad,\n\t\t0x90, 0xfa, 0x8d, 0x43, 0xa0, 0x6b, 0x57, 0xac, 0xf6, 0x21, 0xb2, 0x3d,\n\t\t0x7b, 0x96, 0x02, 0x9d, 0x2d, 0x10, 0xec, 0x0c, 0x99, 0x97, 0xcd, 0xc4,\n\t\t0x62, 0x69, 0x47, 0x9e, 0x52, 0x72, 0x5f, 0x70, 0x98, 0xff, 0xe6, 0xdf,\n\t\t0xce, 0xda, 0x27, 0xb9, 0x9c, 0xe4, 0xde, 0x44, 0xbb, 0x65, 0x60, 0x16,\n\t\t0xb3, 0xf9, 0xda, 0x96, 0x27, 0x7f, 0x8f, 0x6a, 0x6f, 0x61, 0x88, 0x16,\n\t\t0xc9, 0x12, 0xad, 0x3f, 0x67, 0x86, 0xc0, 0x58, 0x6b, 0x3a, 0x9a, 0xd3,\n\t\t0x7c, 0xbb, 0x81, 0x00, 0x2e, 0x6e, 0x3f, 0xa3, 0x83, 0xdd, 0x58, 0x83,\n\t\t0xd4, 0x88, 0xa7, 0x4b, 0x1e, 0xf6, 0xc1, 0x4c, 0xb0, 0x35, 0x43, 0x44,\n\t\t0x44, 0x2d, 0x3e, 0x10, 0x53, 0x04, 0xe9, 0x54, 0x85, 0x61, 0xca, 0xee,\n\t\t0xfb, 0xe4, 0xaa, 0xe0, 0xdc, 0xc0, 0x62, 0xd9, 0x40, 0x50, 0x94, 0xa0,\n\t\t0x96, 0x47, 0x7c, 0x8d, 0x24, 0x80, 0xb1, 0x67, 0x54, 0x4e, 0x7c, 0x44,\n\t\t0xe0, 0x6d, 0x8b, 0x48, 0x99, 0x9e, 0x56, 0x93, 0xaa, 0x2f, 0xa1, 0x0f,\n\t\t0x50, 0x70, 0x43, 0xde, 0x56, 0x0e, 0x14, 0x32, 0x2f, 0xbc, 0x70, 0x7f,\n\t\t0x33, 0x65, 0xcb, 0x62, 0x56, 0x29, 0xa5, 0xc3, 0x1f, 0x64, 0xda, 0x62,\n\t\t0x12, 0x32, 0xd4, 0xf2, 0x8d, 0xfd, 0x94, 0x13, 0x85, 0x73, 0xc7, 0x71,\n\t\t0xb0, 0xd8, 0xc8, 0xde, 0xea, 0x7a, 0x13, 0xea, 0xe4, 0xc4, 0x5b, 0xef,\n\t\t0xec, 0x3a, 0x19, 0xd6, 0xca, 0x4e, 0xc9, 0x4d, 0x8f, 0xf4, 0x9e, 0xdd,\n\t\t0x15, 0xf0, 0x50, 0xa8, 0xb2, 0xe2, 0x7b, 0x81, 0x85, 0xb7, 0xe4, 0x91,\n\t\t0x34, 0x66, 0x34, 0x0c, 0x71, 0x46, 0x81, 0x3a, 0xb4, 0xf5, 0x45, 0x8c,\n\t\t0xfb, 0x8d, 0x3e, 0x65, 0xdd, 0x57, 0x93, 0xb8, 0xd5, 0xa1, 0x25, 0xfb,\n\t\t0x2f, 0xa2, 0xd8, 0x91, 0x51, 0xe8, 0x27, 0x59, 0x28, 0x2c, 0x6f, 0xdd,\n\t\t0x93, 0x1e, 0xa3, 0x34, 0x72, 0xe0, 0xf9, 0x52, 0xbc, 0x6d, 0x35, 0x39,\n\t\t0xca, 0xca, 0x7e, 0x64, 0x01, 0x41, 0xd0, 0x41, 0xfe, 0xc0, 0xfb, 0x0b,\n\t\t0x5b, 0x35, 0x07, 0x0e, 0xb1, 0xde, 0x29, 0x52, 0x2b, 0x79, 0xcd, 0xd4,\n\t\t0xff, 0xc6, 0xec, 0x7e, 0x80, 0x92, 0xe2, 0x14, 0x52, 0xdc, 0x24, 0x6a,\n\t\t0x97, 0xa5, 0xa5, 0x42, 0x3e, 0xc0, 0x0b, 0xde, 0xbb, 0x9b, 0x3f, 0x58,\n\t\t0x59, 0x93, 0x76, 0x29, 0xa9, 0x44, 0xfa, 0xe3, 0x84, 0x74, 0xb1, 0x65,\n\t\t0x02, 0xdb, 0x4c, 0x88, 0xfa, 0xe0, 0xcd, 0x80, 0x18, 0x35, 0x40, 0x4d,\n\t\t0x4d, 0xa7, 0xc6, 0xbf, 0x7f, 0xdd, 0x6c, 0xef, 0x62, 0x0d, 0x4b, 0x20,\n\t\t0xcd, 0x6a, 0xdf, 0xd2, 0x20, 0xd8, 0x4f, 0x63, 0x81, 0xaf, 0x18, 0x97,\n\t\t0x4d, 0x76, 0xa5, 0xc6, 0x86, 0xf1, 0x6b, 0x06, 0xfd, 0x95, 0xfc, 0x93,\n\t\t0x45, 0x1a, 0xf7, 0xae, 0x69, 0xad, 0x79, 0xe4, 0x1f, 0x2e, 0x4b, 0x13,\n\t\t0x6c, 0x1e, 0x76, 0x5e, 0x2f, 0xbf, 0xc7, 0x30, 0xad, 0x80, 0x51, 0x9b,\n\t\t0xdd, 0x4a, 0x15, 0x53, 0x3f, 0xa9, 0x99, 0x90, 0x3e, 0x50, 0x91, 0xe2,\n\t\t0xe3, 0x3e, 0x96, 0x58, 0x4f, 0x4b, 0xcb, 0x67, 0x3e, 0x6d, 0x9e, 0xfc,\n\t\t0x96, 0x8e, 0xdb, 0x72, 0x37, 0xae, 0x9a, 0xba, 0x46, 0x7f, 0xa5, 0xef,\n\t\t0xdb, 0xc3, 0xd7, 0x3f, 0xda, 0xc7, 0xfe, 0x0b, 0xfd, 0x55, 0x6c, 0x48,\n\t\t0x83, 0xb5, 0xb1, 0xbc, 0x2a, 0x81, 0xfe, 0xbd, 0x70, 0xee, 0xec, 0xbb,\n\t\t0x62, 0xf1, 0x3e, 0x9e, 0x38, 0x17, 0x84, 0x64, 0x75, 0x0a, 0x23, 0x2d,\n\t\t0xb4, 0x88, 0x0b, 0x7a, 0x90, 0xdc, 0x17, 0xf3, 0xf0, 0xba, 0x6b, 0x29,\n\t\t0x5f, 0xa9, 0x91, 0x64, 0x50, 0x68, 0x7c, 0x13, 0x6c, 0xff, 0xb6, 0x85,\n\t\t0xd6, 0x0a, 0xea, 0x4f, 0x6d, 0xf5, 0x5d, 0x71, 0x3b, 0x43, 0xbb, 0xa0,\n\t\t0x1a, 0xdb, 0xd3, 0x29, 0xaa, 0x66, 0x28, 0x6f, 0xad, 0xb6, 0xc0, 0x22,\n\t\t0x13, 0x4e, 0x4f, 0xe1, 0x78, 0x78, 0x6e, 0x0f, 0x18, 0xc9, 0x89, 0x91,\n\t\t0x81, 0x99, 0x87, 0x94, 0x66, 0xef, 0x67, 0x12, 0x96, 0xba, 0xeb, 0x4f,\n\t\t0x39, 0x99, 0xb0, 0x45, 0xbf, 0x7c, 0xb7, 0x9f, 0x8b, 0x07, 0x45, 0x90,\n\t\t0x11, 0x8f, 0x83, 0xf1, 0x8c, 0xe1, 0xba, 0x97, 0x7b, 0x65, 0x8c, 0xf9,\n\t\t0x13, 0xa5, 0xf0, 0x39, 0xcf, 0x86, 0xb6, 0x9a, 0xfc, 0xe4, 0xb6, 0x97,\n\t\t0x57, 0x17, 0x1d, 0xab, 0x3c, 0x6c, 0x09, 0x33, 0x6c, 0x3a, 0xa6, 0xfa,\n\t\t0x0b, 0x87, 0xfe, 0xbe, 0xbc, 0xf8, 0xc0, 0xe0, 0xdb, 0x29, 0xc1, 0xd2,\n\t\t0x96, 0x0b, 0xdc, 0x3d, 0x3e, 0x36, 0x09, 0xaa, 0xd3, 0x20, 0x15, 0x43,\n\t\t0x21, 0xa2, 0x02, 0x0d, 0x8a, 0xe5, 0xe9, 0x7a, 0x17, 0x96, 0xd5, 0x00,\n\t\t0x73, 0x52, 0x41, 0xbf, 0x31, 0xb3, 0x8c, 0x5d, 0x15, 0x7b, 0x57, 0xd3,\n\t\t0x54, 0x5b, 0x71, 0xd9, 0xba, 0xe4, 0x11, 0xd2, 0xec, 0xbc, 0x0d, 0x71,\n\t\t0x47, 0xc4, 0x13, 0x46, 0x75, 0x39, 0x3c, 0x37, 0xb6, 0x33, 0x50, 0xab,\n\t\t0x81, 0x7a, 0x9e, 0x9e, 0xe1, 0xe7, 0xcc, 0xc1, 0xe9, 0xe6, 0x1a, 0x84,\n\t\t0x84, 0x4e, 0xce, 0x46, 0x14, 0x2e, 0x4c, 0x85, 0x6e, 0x19, 0x42, 0xfb,\n\t\t0xe0, 0xed, 0xaa, 0xdf, 0xc2, 0xe7, 0xf7, 0xa5, 0x0f, 0x2b, 0xce, 0x0c,\n\t\t0x5c, 0x2b, 0x6b, 0x52, 0xb7, 0x48, 0x87, 0xc3, 0xf3, 0xd0, 0xda, 0x57,\n\t\t0xd2, 0x40, 0x2b, 0x13, 0x13, 0x72, 0x61, 0x7b, 0x1a, 0xe8, 0xdf, 0x48,\n\t\t0xb4, 0xe1, 0x78, 0x64, 0x1f, 0xf3, 0x8c, 0x18, 0x6a, 0xa8, 0x40, 0x97,\n\t\t0x4c, 0xca, 0xc0, 0x0c, 0x23, 0x46, 0x8a, 0x60, 0x94, 0x4d, 0x4e, 0xca,\n\t\t0x4a, 0x45, 0x0c, 0x27, 0xaf, 0x1f, 0x20, 0xa3, 0x76, 0xdf, 0x4c, 0x4f,\n\t\t0x26, 0x80, 0xa6, 0x77, 0xf6, 0xb7, 0xa6, 0x81, 0x45, 0x22, 0x43, 0x4d,\n\t\t0xee, 0xa3, 0x98, 0xbc, 0xf9, 0x75, 0x7b, 0x4c, 0xe7, 0x04, 0x8c, 0x4f,\n\t\t0xf5, 0x64, 0x08, 0xe5, 0x24, 0xd6, 0x84, 0x75, 0xb6, 0xa4, 0x57, 0xa2,\n\t\t0x3d, 0x75, 0xf6, 0xa2, 0x60, 0x38, 0xe3, 0x46, 0x5d, 0x5e, 0x94, 0x18,\n\t\t0xcc, 0x3a, 0xa1, 0x30, 0xd8, 0x9c, 0x35, 0xdb, 0x94, 0xf8, 0x88, 0x1a,\n\t\t0x44, 0x29, 0xa5, 0xd3, 0xd0, 0xfe, 0x53, 0x29, 0x35, 0x43, 0x75, 0x55,\n\t\t0x7b, 0x58, 0x7f, 0xf9, 0x0a, 0x7f, 0x61, 0x55, 0xb9, 0xf4, 0x67, 0xf7,\n\t\t0xa7, 0xa4, 0xc9, 0xc3, 0xf1, 0x7a, 0x14, 0x97, 0xeb, 0x19, 0x2c, 0x91,\n\t\t0xa0, 0x7c, 0x19, 0xb9, 0x6b, 0x2e, 0x34, 0xc3, 0xc2, 0xa1, 0x79, 0x9d,\n\t\t0x69, 0x9f, 0x38, 0x05, 0x85, 0x0d, 0xb9, 0xdb, 0x31, 0x74, 0x87, 0x10,\n\t\t0x32, 0x4f, 0x80, 0x02, 0x54, 0x70, 0x2f, 0xd1, 0x9d, 0x91, 0xc3, 0xac,\n\t\t0xb9, 0x90, 0x40, 0x90, 0x61, 0xe4, 0x6b, 0x59, 0xba, 0x99, 0xb1, 0x49,\n\t\t0x6c, 0x78, 0xcd, 0x5f, 0xb0, 0x20, 0x1b, 0x16, 0x47, 0xf2, 0x9e, 0xd6,\n\t\t0x9c, 0x30, 0x65, 0xc2, 0xf6, 0x74, 0x65, 0x18, 0x97, 0xf7, 0x1e, 0x0d,\n\t\t0xc3, 0x7a, 0x74, 0xa8, 0x48, 0xe9, 0xec, 0xd1, 0xd3, 0xdc, 0xe6, 0x81,\n\t\t0x41, 0x14, 0x73, 0x90, 0x08, 0x3a, 0xd1, 0x32, 0x82, 0xda, 0x1e, 0x76,\n\t\t0x2f, 0x68, 0x0d, 0xbe, 0x8f, 0x49, 0xf2, 0xfb, 0xc4, 0x60, 0x00, 0x66,\n\t\t0xfc, 0xc3, 0x73, 0x3f, 0xc5, 0x0e, 0x76, 0xbb, 0xeb, 0x23, 0x01, 0x3f,\n\t\t0xd4, 0xc3, 0x31, 0x17, 0x61, 0x58, 0xb9, 0x80, 0xc0, 0x73, 0xc1, 0xf9,\n\t\t0xfa, 0xbd, 0x4f, 0x1d, 0x2d, 0x04, 0x28, 0x6a, 0x6e, 0x3a, 0xb2, 0x78,\n\t\t0xa6, 0x09, 0x6a, 0xe0, 0xdb, 0xe8, 0x08, 0x59, 0x2f, 0xcf, 0x76, 0x81,\n\t\t0x9b, 0x78, 0xdf, 0xd8, 0x0e, 0x4a, 0x83, 0x33, 0x9b, 0xbf, 0x21, 0x98,\n\t\t0x4f, 0x5e, 0xaa, 0xaf, 0x38, 0x0b, 0xce, 0x61, 0x73, 0xf9, 0x95, 0xc6,\n\t\t0x14, 0xc1, 0x16, 0x21, 0xc4, 0x46, 0x00, 0x3d, 0xe2, 0x4c, 0x6f, 0xa6,\n\t\t0x15, 0x12, 0xba, 0x97, 0xe0, 0x43, 0xb3, 0x7e, 0x43, 0x2a, 0xcf, 0x30,\n\t\t0xc4, 0x92, 0x2a, 0xae, 0xa8, 0xa4, 0x33, 0x1c, 0x0d, 0x32, 0x4d, 0x9f,\n\t\t0xf9, 0x4f, 0x37, 0x9f, 0x38, 0x45, 0xe6, 0xa3, 0x1f, 0x9c, 0x23, 0xc8,\n\t\t0x73, 0x4a, 0xa4, 0x66, 0xe0, 0x17, 0x48, 0x50, 0x09, 0xd6, 0x3b, 0xba,\n\t\t0x82, 0x32, 0x2a, 0x57, 0x97, 0x69, 0x91, 0xfb, 0x36, 0xba, 0x87, 0x47,\n\t\t0x1f, 0x1c, 0xee, 0x3f, 0xfd, 0x50, 0xcb, 0x20, 0xd3, 0xe3, 0xd6, 0x61,\n\t\t0xc0, 0xe5, 0x23, 0x42, 0x43, 0xee, 0x13, 0x22, 0xc7, 0x98, 0xfb, 0x8e,\n\t\t0x9b, 0xf7, 0x89, 0xd8, 0x18, 0xee, 0xbe, 0xb7, 0x7e, 0xea, 0xd5, 0x80,\n\t\t0x74, 0xf6, 0x64, 0xad, 0x4b, 0x83, 0xae, 0xe7, 0x50, 0xda, 0xad, 0xc6,\n\t\t0x61, 0x1f, 0x62, 0x67, 0x07, 0xbb, 0x6c, 0x87, 0x2e, 0x79, 0xc9, 0x04,\n\t\t0x67, 0xd4, 0xb7, 0xb1, 0xb4, 0xf4, 0xb8, 0x63, 0x65, 0x65, 0x46, 0xb5,\n\t\t0xf3, 0xfc, 0xfc, 0x1d, 0x1d, 0x8d, 0x08, 0x3a, 0xa7, 0xf8, 0x70, 0x65,\n\t\t0xad, 0xda, 0x04, 0xc7, 0x94, 0x32, 0x55, 0xd0, 0x18, 0x9a, 0xb4, 0x97,\n\t\t0xe7, 0x98, 0x8f, 0x0c, 0x88, 0x1d, 0x58, 0xa0, 0xc0, 0x4a, 0xaf, 0xb8,\n\t\t0xad, 0xbf, 0x7d, 0x66, 0x49, 0x99, 0x8b, 0x5f, 0x61, 0xc2, 0xb6, 0x9b,\n\t\t0xf5, 0xf3, 0x0c, 0xe4, 0x41, 0x18, 0x47, 0xe7, 0xda, 0xb8, 0x79, 0xc3,\n\t\t0xdf, 0x3e, 0x72, 0x8d, 0xca, 0xd1, 0x66, 0x82, 0x94, 0xfe, 0xf7, 0x19,\n\t\t0x44, 0xed, 0x19, 0x67, 0xf8, 0x03, 0x3b, 0xb6, 0x00, 0x58, 0xb2, 0x83,\n\t\t0x05, 0x32, 0x90, 0x4f, 0x10, 0xd4, 0xc6, 0xe9, 0x66, 0x85, 0xb2, 0xae,\n\t\t0xe3, 0x75, 0xd4, 0xc5, 0xa3, 0x5b, 0x5b, 0x19, 0xf7, 0xa7, 0x32, 0xe3,\n\t\t0x1f, 0x3f, 0x82, 0x3f, 0x91, 0x89, 0x77, 0xcf, 0xcd, 0x61, 0xf3, 0x7b,\n\t\t0xde, 0xf8, 0xc7, 0xc4, 0xa0, 0xf0, 0xf1, 0xf3, 0x1b, 0x5a, 0x5b, 0x23,\n\t\t0x17, 0x29, 0x45, 0x94, 0xc8, 0xe7, 0xe4, 0xe7, 0xe6, 0x82, 0xd2, 0xd2,\n\t\t0xd2, 0x9a, 0x3d, 0xae, 0x29, 0xe5, 0x72, 0x04, 0x62, 0x9a, 0x9b, 0xb9,\n\t\t0x7e, 0x98, 0x9a, 0x06, 0x16, 0x5b, 0x39, 0x73, 0xc1, 0x82, 0x34, 0xd2,\n\t\t0x32, 0x8c, 0x64, 0x44, 0xe5, 0xa3, 0x09, 0x56, 0xa4, 0xb7, 0x67, 0xec,\n\t\t0x2d, 0xc5, 0x51, 0x05, 0xd6, 0x9b, 0x91, 0x16, 0xce, 0xf8, 0x68, 0xc8,\n\t\t0x8a, 0xba, 0x8d, 0xd2, 0xd6, 0xa0, 0x64, 0xd6, 0xf3, 0x0e, 0x13, 0x09,\n\t\t0x92, 0x3a, 0x86, 0xb6, 0x1f, 0x91, 0x4c, 0xfe, 0xa4, 0x1a, 0xe5, 0xee,\n\t\t0x78, 0x1a, 0x8a, 0xbe, 0x1b, 0x78, 0x33, 0x99, 0x50, 0xd3, 0x8d, 0x45,\n\t\t0xd3, 0x66, 0x54, 0x29, 0x13, 0xf1, 0xc5, 0x0e, 0x99, 0xad, 0xbf, 0x84,\n\t\t0xee, 0x33, 0x2a, 0xd1, 0xf2, 0x19, 0xd7, 0x8e, 0xc9, 0x39, 0xb4, 0xd8,\n\t\t0x94, 0x7c, 0x2f, 0x4a, 0xb9, 0x4d, 0x6e, 0x95, 0x30, 0xd7, 0xfa, 0x68,\n\t\t0x66, 0x10, 0x48, 0xa7, 0x67, 0x17, 0xf1, 0x25, 0x69, 0xe4, 0xa6, 0x85,\n\t\t0x4d, 0x97, 0x0b, 0xe2, 0x67, 0xb9, 0xae, 0x2b, 0x52, 0xcc, 0xc3, 0xc1,\n\t\t0xf4, 0x14, 0x01, 0x3f, 0xef, 0x73, 0x81, 0x7e, 0x1c, 0xe8, 0x82, 0x2d,\n\t\t0x1c, 0xb6, 0xfa, 0xab, 0x63, 0x0b, 0xa4, 0x5b, 0x7e, 0xce, 0xe6, 0x41,\n\t\t0xcb, 0x31, 0x97, 0xdb, 0x2e, 0x43, 0xa4, 0x98, 0xaa, 0xfe, 0x70, 0xa3,\n\t\t0xcd, 0x3f, 0x1c, 0x9f, 0xe7, 0xbb, 0x10, 0xa1, 0x2f, 0xfe, 0x21, 0x21,\n\t\t0x21, 0x23, 0xa9, 0x0b, 0x38, 0x11, 0xa2, 0x81, 0xbf, 0x7f, 0x53, 0x93,\n\t\t0x93, 0x93, 0x7f, 0xa1, 0xa1, 0x41, 0x54, 0xaf, 0xd2, 0xe9, 0x89, 0x21,\n\t\t0xe0, 0x54, 0xd0, 0xd1, 0xd1, 0x39, 0xf5, 0x4a, 0x06, 0x92, 0xcc, 0x96,\n\t\t0x8f, 0x06, 0x7b, 0x7f, 0x06, 0x69, 0x25, 0x3d, 0x0e, 0x79, 0x88, 0x9a,\n\t\t0xd5, 0x19, 0x18, 0xc3, 0x8b, 0x46, 0xca, 0xdb, 0x64, 0x1d, 0x4d, 0xa8,\n\t\t0xdd, 0xb3, 0xb9, 0xe8, 0x53, 0xa9, 0x70, 0xa1, 0x0e, 0x42, 0xd8, 0x5a,\n\t\t0x50, 0xca, 0xab, 0xc9, 0x48, 0x90, 0x74, 0x36, 0x43, 0xfa, 0x42, 0xf4,\n\t\t0xdf, 0xae, 0x7d, 0xcd, 0x8f, 0x3b, 0x6d, 0xf0, 0x7c, 0x53, 0xb9, 0xf8,\n\t\t0xb3, 0x25, 0x52, 0x9a, 0x4e, 0x80, 0xf1, 0x7e, 0xf5, 0x76, 0x9b, 0x3e,\n\t\t0xea, 0x97, 0xea, 0x5c, 0xc9, 0x53, 0xbc, 0x0c, 0x9b, 0xb7, 0xe9, 0xc5,\n\t\t0xc5, 0x6a, 0x75, 0xe1, 0x9e, 0x22, 0x2a, 0x4f, 0xa5, 0xb8, 0xc9, 0x60,\n\t\t0xa0, 0xb0, 0x26, 0x77, 0x0c, 0xeb, 0xb2, 0xf8, 0x03, 0x7a, 0x93, 0xa4,\n\t\t0x4c, 0xde, 0x98, 0xfc, 0xd5, 0xae, 0x53, 0x32, 0x32, 0xf0, 0xc9, 0xf2,\n\t\t0xdd, 0x70, 0x65, 0x88, 0x57, 0xd1, 0x92, 0xf1, 0x57, 0x3e, 0x2f, 0x84,\n\t\t0x06, 0x92, 0x7e, 0xf2, 0x7d, 0x7a, 0xd5, 0x27, 0xe4, 0x76, 0xc2, 0x7e,\n\t\t0x0c, 0x99, 0x23, 0x50, 0x32, 0x33, 0x33, 0xb3, 0x5e, 0xef, 0xfc, 0x6c,\n\t\t0x68, 0x68, 0xc8, 0xe3, 0xc4, 0x4c, 0x8b, 0x85, 0x28, 0x2a, 0x21, 0x61,\n\t\t0x3c, 0x91, 0xcd, 0xff, 0xb0, 0x1d, 0x27, 0xf8, 0x33, 0x31, 0x51, 0x65,\n\t\t0x57, 0x07, 0x35, 0x23, 0x26, 0xd7, 0x35, 0x3b, 0x95, 0xd3, 0x06, 0x9a,\n\t\t0x6f, 0x45, 0x6b, 0xd6, 0x93, 0x31, 0x4d, 0x27, 0x76, 0x26, 0xde, 0xad,\n\t\t0xd6, 0x62, 0xbf, 0xc7, 0xf1, 0xab, 0xdd, 0x8a, 0x8c, 0xbf, 0x13, 0x58,\n\t\t0x88, 0x2e, 0x8a, 0xc2, 0xbe, 0xf8, 0x30, 0xd0, 0xc1, 0xbf, 0x17, 0x16,\n\t\t0xa4, 0xe6, 0xc7, 0x07, 0x05, 0x25, 0x02, 0x69, 0xd9, 0x91, 0x52, 0xf5,\n\t\t0xa1, 0x7a, 0xb8, 0x04, 0x6e, 0xdb, 0x57, 0x95, 0x07, 0x8e, 0xf2, 0x5c,\n\t\t0x4b, 0xe2, 0xe2, 0xd9, 0x51, 0xe4, 0xbf, 0x0e, 0xf4, 0x6f, 0xf2, 0xc1,\n\t\t0x79, 0xc3, 0x40, 0xcb, 0xe6, 0x0d, 0x1b, 0x59, 0xe2, 0x6f, 0x28, 0xeb,\n\t\t0x10, 0xde, 0x63, 0xcb, 0xee, 0xdf, 0xc3, 0x99, 0x37, 0x90, 0xb9, 0x79,\n\t\t0x11, 0xbb, 0x21, 0x1f, 0x2f, 0xa0, 0x18, 0xae, 0x2e, 0xf7, 0x69, 0x28,\n\t\t0x90, 0x14, 0x69, 0x1e, 0xf7, 0x53, 0x74, 0xf6, 0xb7, 0x33, 0x36, 0x6d,\n\t\t0x88, 0x49, 0x89, 0x37, 0x5c, 0x6b, 0xd0, 0xe1, 0x0c, 0xc6, 0x11, 0xc7,\n\t\t0xb9, 0x1c, 0xcf, 0xf7, 0xac, 0xad, 0xe9, 0xed, 0x7b, 0x76, 0x84, 0x16,\n\t\t0x5b, 0xe8, 0xb4, 0xbb, 0x7f, 0x3a, 0x5e, 0xa8, 0x1e, 0xf2, 0x7b, 0x7f,\n\t\t0x0d, 0xcb, 0xcf, 0xcf, 0x97, 0xda, 0xc7, 0xbb, 0xf4, 0x78, 0x30, 0xb8,\n\t\t0x52, 0x68, 0x67, 0x2f, 0x4c, 0x11, 0xd7, 0x67, 0xfb, 0xe3, 0x78, 0x55,\n\t\t0xbb, 0xf5, 0x4f, 0x37, 0xbc, 0xfd, 0xb6, 0x66, 0xd9, 0x83, 0x24, 0xeb,\n\t\t0xf5, 0xe2, 0xf4, 0x8f, 0x26, 0xac, 0xb2, 0xf0, 0x39, 0x3b, 0x9b, 0xec,\n\t\t0x76, 0x6f, 0x03, 0xf5, 0x09, 0x8f, 0x3d, 0xac, 0x5b, 0x41, 0x4e, 0x92,\n\t\t0x47, 0x6f, 0x71, 0x8b, 0xce, 0x7e, 0x9c, 0x8f, 0x4f, 0x53, 0x35, 0x55,\n\t\t0xc3, 0x26, 0x42, 0x6b, 0x6f, 0x8d, 0x2f, 0x01, 0x7c, 0xb0, 0x67, 0xf7,\n\t\t0x92, 0x47, 0x99, 0x85, 0xe3, 0xd5, 0x14, 0x05, 0x72, 0x42, 0x93, 0xbf,\n\t\t0xe1, 0xce, 0xca, 0x82, 0x23, 0xa2, 0x7f, 0x75, 0x09, 0x81, 0xa9, 0x6c,\n\t\t0xb4, 0x50, 0xca, 0x9d, 0xde, 0xad, 0x11, 0x1d, 0x38, 0xb4, 0x67, 0xca,\n\t\t0x89, 0xb3, 0xe6, 0x29, 0xac, 0x03, 0x3d, 0xa2, 0x9c, 0xc1, 0xa8, 0xd7,\n\t\t0xa8, 0x76, 0xb2, 0xcd, 0xcd, 0xae, 0x42, 0xaf, 0x03, 0xff, 0x33, 0x8f,\n\t\t0xf3, 0x64, 0x8b, 0xde, 0x1c, 0x49, 0xbc, 0xa4, 0xfd, 0xf1, 0x3c, 0xfd,\n\t\t0xcb, 0xcd, 0x8c, 0xfc, 0x62, 0x93, 0x1d, 0x71, 0xe1, 0x74, 0xa4, 0x27,\n\t\t0x1a, 0xe2, 0x69, 0x70, 0xda, 0x76, 0xef, 0xe6, 0x74, 0x6f, 0xd5, 0xfc,\n\t\t0x31, 0x2b, 0x72, 0xd0, 0x07, 0x16, 0xa5, 0xac, 0x9f, 0x97, 0x5e, 0xb5,\n\t\t0x6e, 0x6e, 0xc8, 0xd3, 0x6e, 0x1c, 0x2d, 0x56, 0xcc, 0x5b, 0x2d, 0xe0,\n\t\t0x22, 0x52, 0xc4, 0xa0, 0x08, 0x9e, 0x0f, 0x9d, 0x87, 0xfd, 0x4d, 0x8a,\n\t\t0x57, 0xda, 0xb8, 0xee, 0xd8, 0x93, 0x2e, 0x62, 0x5e, 0x3f, 0x90, 0x65,\n\t\t0x16, 0x29, 0x08, 0x05, 0x3b, 0x8b, 0x24, 0x08, 0x7f, 0x39, 0x20, 0x4f,\n\t\t0x1c, 0xc6, 0x10, 0x54, 0xa1, 0x71, 0xda, 0x03, 0xb1, 0xb0, 0x5b, 0xa1,\n\t\t0x4f, 0x36, 0xb2, 0xe3, 0x74, 0xf0, 0xe2, 0x13, 0x55, 0xd1, 0x1f, 0x9d,\n\t\t0xce, 0x96, 0x14, 0x5a, 0xbc, 0x5c, 0xfc, 0x33, 0x7c, 0xb9, 0x5a, 0x40,\n\t\t0x50, 0x89, 0x5f, 0x46, 0x06, 0xc1, 0xa3, 0xa2, 0x0e, 0xc6, 0x09, 0xbe,\n\t\t0xc1, 0x13, 0x13, 0xe7, 0x78, 0x4e, 0x95, 0x73, 0xfc, 0x30, 0x31, 0x31,\n\t\t0x9c, 0xaf, 0xd0, 0x5c, 0xec, 0xf2, 0xf3, 0x0b, 0x31, 0xa3, 0xc3, 0x09,\n\t\t0x41, 0x91, 0x5e, 0x17, 0xae, 0x66, 0x38, 0x65, 0xd3, 0xe2, 0xfd, 0xca,\n\t\t0x8e, 0xc9, 0x7b, 0x9f, 0xd3, 0xbb, 0xc9, 0xaa, 0x4e, 0x92, 0x52, 0x5e,\n\t\t0x52, 0x16, 0x47, 0xb8, 0x08, 0x25, 0xbd, 0x4e, 0x6c, 0x66, 0x4f, 0x75,\n\t\t0xf3, 0x87, 0x09, 0x39, 0x28, 0x69, 0xfd, 0x7c, 0xe0, 0x6d, 0x3b, 0x65,\n\t\t0x44, 0xf2, 0x91, 0xdb, 0x5f, 0x0c, 0xf7, 0x4b, 0xd6, 0x4a, 0x29, 0x66,\n\t\t0xbd, 0xdc, 0xaa, 0x16, 0xeb, 0x27, 0x78, 0x14, 0x90, 0xdf, 0x7b, 0xd8,\n\t\t0x7f, 0x23, 0xad, 0x8b, 0x8a, 0x0c, 0x7e, 0xae, 0x81, 0xc5, 0x4e, 0x83,\n\t\t0x90, 0x52, 0x98, 0xa0, 0x9a, 0x46, 0xb6, 0xbe, 0x1a, 0xdf, 0xd5, 0x8b,\n\t\t0x61, 0x2f, 0x63, 0x66, 0x1b, 0x67, 0xbf, 0x45, 0x8d, 0xf4, 0x85, 0x8c,\n\t\t0x80, 0x9f, 0xb4, 0x89, 0x1a, 0x97, 0xab, 0xb6, 0x2f, 0x1e, 0x3b, 0x22,\n\t\t0x45, 0x13, 0x30, 0x90, 0x10, 0x83, 0x31, 0x04, 0x61, 0xb2, 0x19, 0x1c,\n\t\t0x86, 0x8f, 0x57, 0xbb, 0xb7, 0x47, 0x7a, 0xd5, 0x28, 0x22, 0x79, 0xe8,\n\t\t0x7d, 0xa1, 0x28, 0xdf, 0xb4, 0xb4, 0xf0, 0xcf, 0x56, 0xdb, 0x4a, 0x92,\n\t\t0x7b, 0x07, 0x98, 0xba, 0x1f, 0xcb, 0xef, 0x7f, 0xa6, 0xa7, 0x05, 0x71,\n\t\t0x54, 0x66, 0x5a, 0x66, 0xed, 0x99, 0xda, 0x5a, 0x46, 0xff, 0x94, 0xf3,\n\t\t0x05, 0x66, 0x43, 0x4c, 0x9d, 0xfa, 0x59, 0x99, 0x8b, 0x47, 0x94, 0x47,\n\t\t0x3a, 0x7c, 0xba, 0x21, 0xfa, 0xc1, 0xc2, 0xb2, 0x41, 0x0c, 0x8f, 0x98,\n\t\t0xe2, 0x01, 0x90, 0x88, 0xaa, 0x95, 0x58, 0x61, 0xb5, 0xb3, 0x63, 0xe7,\n\t\t0x6f, 0x45, 0xfe, 0xf9, 0x93, 0xeb, 0xcb, 0x9e, 0x7b, 0x68, 0x46, 0x97,\n\t\t0xb2, 0x4a, 0xaa, 0xb1, 0xb9, 0xaa, 0xc8, 0xd7, 0x9c, 0x00, 0x6d, 0x63,\n\t\t0x8c, 0xa7, 0xcb, 0x62, 0x98, 0x9a, 0xe5, 0xac, 0xd2, 0xa6, 0x94, 0xa0,\n\t\t0x42, 0x98, 0x03, 0x3c, 0xe8, 0x6c, 0xb9, 0x1f, 0x72, 0x16, 0xd0, 0x19,\n\t\t0x0e, 0x7f, 0x8c, 0x9c, 0x27, 0x44, 0xd5, 0xc1, 0x5b, 0x46, 0xd1, 0x55,\n\t\t0x03, 0x8e, 0x52, 0xb3, 0xeb, 0xbb, 0xf5, 0xaa, 0xc5, 0xce, 0x06, 0xe4,\n\t\t0xc9, 0xf0, 0x70, 0xba, 0x28, 0x95, 0xc3, 0x06, 0xdf, 0xda, 0x9a, 0x86,\n\t\t0x5e, 0xc4, 0xac, 0xa6, 0xdd, 0xfd, 0x12, 0x52, 0xbb, 0xc9, 0x76, 0xa0,\n\t\t0x4a, 0xb7, 0x8d, 0x06, 0x7a, 0x32, 0x2d, 0x0d, 0xbe, 0x76, 0x73, 0xc6,\n\t\t0xed, 0xd3, 0x6f, 0xc3, 0xdb, 0xc6, 0xe7, 0xb8, 0x2d, 0x66, 0xaf, 0x47,\n\t\t0x71, 0x2c, 0x9c, 0xa8, 0xb9, 0x1d, 0x40, 0x40, 0xb6, 0x47, 0x43, 0x94,\n\t\t0x0d, 0x49, 0x2b, 0x34, 0x33, 0x83, 0x7e, 0x15, 0x2b, 0x6a, 0x90, 0x8b,\n\t\t0x68, 0x99, 0x32, 0xd8, 0xf2, 0xbb, 0x07, 0xbe, 0x04, 0x92, 0xb2, 0xd5,\n\t\t0xd5, 0x89, 0x3b, 0xf1, 0x5a, 0xd5, 0xdb, 0x6c, 0x97, 0x39, 0xd8, 0xfa,\n\t\t0xb8, 0x00, 0x4a, 0x6d, 0x74, 0x15, 0xd8, 0x20, 0x29, 0x35, 0xae, 0x32,\n\t\t0xbc, 0x68, 0x9d, 0x02, 0x21, 0x65, 0xb2, 0x85, 0x50, 0x69, 0x27, 0x6e,\n\t\t0x3e, 0x0d, 0x68, 0x94, 0x79, 0xbd, 0x7d, 0xcb, 0x5a, 0xd6, 0xee, 0x55,\n\t\t0xbf, 0xac, 0x90, 0x83, 0x7f, 0x44, 0x2d, 0x28, 0x41, 0xe2, 0xa6, 0xe7,\n\t\t0x77, 0x00, 0xbf, 0x81, 0xa1, 0x69, 0x3e, 0x67, 0x16, 0x86, 0xf2, 0x34,\n\t\t0xf3, 0x7d, 0x14, 0xf1, 0xa7, 0x9c, 0x44, 0xb5, 0x4d, 0xcd, 0xf5, 0x4e,\n\t\t0x9f, 0x5a, 0xe3, 0x21, 0x54, 0x36, 0xbb, 0x35, 0x1d, 0xb4, 0x74, 0x0b,\n\t\t0xb4, 0x5a, 0x8d, 0xe8, 0x34, 0x56, 0x33, 0x23, 0xa0, 0x9d, 0x2d, 0x1d,\n\t\t0x03, 0x3e, 0x11, 0x77, 0x55, 0xe8, 0x82, 0x18, 0xdd, 0xc6, 0x1d, 0xef,\n\t\t0x89, 0x07, 0x28, 0x0c, 0xff, 0x46, 0x8e, 0xff, 0x47, 0xb7, 0xb0, 0x34,\n\t\t0x5e, 0x2d, 0x2b, 0x6d, 0xad, 0xf9, 0x68, 0x98, 0xa4, 0xff, 0xf7, 0x87,\n\t\t0x23, 0xcc, 0x5f, 0xd1, 0xb5, 0x1e, 0xe0, 0x95, 0xb9, 0xdc, 0x6e, 0x89,\n\t\t0x22, 0x23, 0x07, 0x92, 0x92, 0xed, 0x76, 0x1d, 0xb9, 0x2f, 0x5c, 0xdd,\n\t\t0x7a, 0xfa, 0x0d, 0x0d, 0x0f, 0x56, 0x75, 0xdb, 0x1c, 0x10, 0x3f, 0x58,\n\t\t0x90, 0xe2, 0x58, 0x2a, 0x68, 0x65, 0xc9, 0x7a, 0x74, 0x55, 0xca, 0xe4,\n\t\t0x4c, 0xb4, 0xd2, 0x56, 0xc4, 0xfc, 0xea, 0x23, 0xc6, 0x1f, 0xcd, 0x8e,\n\t\t0x0f, 0xde, 0x77, 0xff, 0x94, 0x2c, 0x46, 0xd8, 0x84, 0x96, 0x89, 0x0c,\n\t\t0x34, 0x82, 0xbc, 0xdc, 0x7a, 0xc2, 0x94, 0xc3, 0x2c, 0x32, 0xa9, 0x2a,\n\t\t0xe9, 0x19, 0x56, 0xbd, 0xc3, 0x29, 0xac, 0x9a, 0xd4, 0xb9, 0x4c, 0x1a,\n\t\t0x2d, 0xe7, 0x10, 0x09, 0x38, 0xac, 0xbb, 0x37, 0x7a, 0x82, 0x50, 0xe6,\n\t\t0x7d, 0x74, 0xb4, 0xc1, 0xa1, 0xc2, 0x2a, 0x2a, 0x58, 0xbd, 0x7d, 0x7d,\n\t\t0xf1, 0xbf, 0x94, 0xb4, 0xd4, 0x07, 0x56, 0x1b, 0xb8, 0x5d, 0xfd, 0xea,\n\t\t0xc0, 0xe2, 0xde, 0xd9, 0xe2, 0xc7, 0x02, 0xd2, 0xde, 0x11, 0x87, 0x51,\n\t\t0x1c, 0x2a, 0x92, 0xc7, 0xc7, 0x38, 0x1b, 0x51, 0xd5, 0x82, 0x3e, 0xb8,\n\t\t0xde, 0xd9, 0x9e, 0x3e, 0xfe, 0xbf, 0x17, 0xf7, 0x35, 0xee, 0x6e, 0xab,\n\t\t0x25, 0x65, 0xe4, 0xaa, 0xe7, 0x04, 0xfa, 0x9e, 0xdd, 0x86, 0x86, 0xce,\n\t\t0x63, 0x21, 0x72, 0x86, 0x7c, 0xae, 0x77, 0xf0, 0xbf, 0xfc, 0x92, 0x9c,\n\t\t0x72, 0xdb, 0x32, 0xc2, 0x2a, 0x7d, 0x5b, 0x77, 0x3a, 0x87, 0x72, 0x1c,\n\t\t0x0f, 0x44, 0x82, 0x0f, 0xa6, 0xf9, 0xe2, 0x76, 0x10, 0x2c, 0x1e, 0x10,\n\t\t0xf1, 0x1d, 0x8d, 0x43, 0x96, 0xd6, 0x74, 0xc6, 0x79, 0xb0, 0x5a, 0xca,\n\t\t0x64, 0x8f, 0x5c, 0x68, 0x6a, 0x65, 0x70, 0x24, 0xf3, 0xc9, 0xe8, 0x0d,\n\t\t0x4b, 0x86, 0x60, 0x15, 0xad, 0xd7, 0x53, 0x92, 0xbf, 0x1c, 0x31, 0x14,\n\t\t0x22, 0x36, 0xb3, 0x23, 0xb2, 0xe8, 0xd8, 0x4d, 0x88, 0x2e, 0xbe, 0x74,\n\t\t0x87, 0x0e, 0x07, 0x09, 0x93, 0x52, 0xa6, 0xbb, 0x27, 0x08, 0x6e, 0xf3,\n\t\t0xfc, 0x7c, 0xdd, 0x3c, 0x9a, 0x5b, 0xc1, 0xd1, 0x6f, 0xa5, 0x42, 0x93,\n\t\t0x95, 0x1a, 0x0b, 0x31, 0x93, 0xdb, 0x49, 0x9c, 0x62, 0x62, 0x98, 0x56,\n\t\t0x34, 0x5e, 0x32, 0xd0, 0x16, 0x42, 0x00, 0xff, 0xd5, 0xa7, 0x92, 0x4e,\n\t\t0xe6, 0xd3, 0xc1, 0x3a, 0x2c, 0x6e, 0xd5, 0xaa, 0xfa, 0x73, 0x93, 0x8c,\n\t\t0x67, 0x5a, 0x40, 0x73, 0xbf, 0xca, 0xcd, 0xc9, 0x16, 0x1a, 0x6a, 0x06,\n\t\t0x4a, 0xad, 0x68, 0x68, 0x5f, 0x49, 0xb5, 0xc1, 0x65, 0xfa, 0xe9, 0x2e,\n\t\t0xe2, 0x7c, 0x22, 0x06, 0x06, 0x46, 0x60, 0x6e, 0xee, 0x97, 0x1f, 0x66,\n\t\t0x66, 0xea, 0xd4, 0xb9, 0xd7, 0x07, 0x4b, 0x48, 0x3a, 0x6d, 0xcf, 0xf0,\n\t\t0x3e, 0x81, 0xbc, 0x96, 0x03, 0xbf, 0x9d, 0xb8, 0x09, 0xc9, 0x8b, 0x4c,\n\t\t0x49, 0x39, 0xce, 0x6e, 0x55, 0xa1, 0x79, 0x3f, 0xe7, 0x36, 0xcd, 0x7a,\n\t\t0x18, 0x42, 0xe6, 0x21, 0xc7, 0xec, 0x63, 0x06, 0x4f, 0xfe, 0xd8, 0xbc,\n\t\t0xe4, 0x69, 0x4c, 0x1e, 0x26, 0x3a, 0x85, 0x15, 0x0d, 0x10, 0xfa, 0xce,\n\t\t0x70, 0xb3, 0x18, 0x9e, 0x9d, 0xca, 0x6c, 0x0a, 0x92, 0x71, 0x5e, 0x34,\n\t\t0x6b, 0x2f, 0xce, 0x6c, 0x73, 0x44, 0x43, 0x52, 0xb7, 0x81, 0x91, 0x4d,\n\t\t0x69, 0xf5, 0xe8, 0xeb, 0xed, 0xad, 0xf1, 0x79, 0x76, 0x6d, 0x6e, 0x6e,\n\t\t0x3e, 0x50, 0x64, 0x5d, 0x2d, 0x50, 0xa1, 0x61, 0xb6, 0x59, 0x66, 0x7b,\n\t\t0xb9, 0xfb, 0x67, 0x47, 0x83, 0x07, 0x63, 0x30, 0xd0, 0x3e, 0x0c, 0x9e,\n\t\t0x2e, 0x89, 0x1a, 0x3c, 0xa6, 0x2c, 0xfe, 0x61, 0xb0, 0xb7, 0x65, 0xf7,\n\t\t0x33, 0x3e, 0xab, 0x9c, 0xd2, 0xce, 0xd6, 0x0e, 0x85, 0x80, 0xd6, 0x89,\n\t\t0x4f, 0x5a, 0xb2, 0x94, 0x03, 0x05, 0x1d, 0x24, 0xf0, 0x74, 0x40, 0x56,\n\t\t0xa1, 0xdb, 0x86, 0x03, 0xa8, 0xe3, 0xce, 0x70, 0x02, 0x98, 0xd5, 0x14,\n\t\t0x19, 0x11, 0x09, 0x69, 0x6e, 0x0f, 0xd0, 0xe4, 0xcf, 0xa3, 0xfb, 0xd1,\n\t\t0x0b, 0x23, 0x29, 0x95, 0x8b, 0xcd, 0xe4, 0xd1, 0xcf, 0x06, 0x14, 0x60,\n\t\t0x10, 0x16, 0xc5, 0xd8, 0xc5, 0xfd, 0xfb, 0xca, 0xe5, 0x5a, 0x47, 0xdc,\n\t\t0xd1, 0x1a, 0x51, 0x9c, 0x90, 0x3b, 0x0c, 0x77, 0x1e, 0x26, 0x3e, 0x9d,\n\t\t0xb8, 0xf8, 0x9b, 0x1a, 0x9b, 0x2c, 0xbd, 0x1a, 0x35, 0x46, 0x13, 0xd4,\n\t\t0xaf, 0xe4, 0x41, 0x48, 0x32, 0x19, 0xbc, 0x39, 0x5c, 0x5a, 0x5c, 0x39,\n\t\t0x31, 0x8d, 0x85, 0xbb, 0x0d, 0x8b, 0x61, 0x5d, 0x2d, 0x5c, 0x00, 0xe2,\n\t\t0x7a, 0xf3, 0xe7, 0xfe, 0xcd, 0xca, 0x25, 0x70, 0x70, 0x70, 0x34, 0x3b,\n\t\t0xee, 0x46, 0xf6, 0x88, 0x57, 0x59, 0x61, 0xe2, 0x44, 0x85, 0x5c, 0x5c,\n\t\t0xd8, 0xaf, 0x34, 0x3b, 0x40, 0x39, 0x38, 0x38, 0xd0, 0x78, 0xec, 0x8c,\n\t\t0x87, 0x99, 0xaf, 0x4e, 0x23, 0x54, 0xc5, 0xa6, 0xbf, 0x12, 0x68, 0xa4,\n\t\t0xe2, 0x15, 0x74, 0xc4, 0xf1, 0x02, 0xab, 0x53, 0x76, 0x27, 0x56, 0x5a,\n\t\t0xa3, 0x11, 0x7d, 0x53, 0xa1, 0xf3, 0x1f, 0xb6, 0xea, 0xbd, 0xe8, 0xe1,\n\t\t0x42, 0x35, 0x71, 0xbf, 0x11, 0x33, 0x83, 0x5e, 0x3b, 0x7c, 0x7a, 0xb1,\n\t\t0xa1, 0xb1, 0x71, 0x90, 0xed, 0x6a, 0x6b, 0x40, 0x3e, 0x75, 0x26, 0xbf,\n\t\t0x97, 0x9a, 0x8d, 0xad, 0xf5, 0x0a, 0x52, 0xcd, 0x92, 0xb5, 0xb3, 0xf5,\n\t\t0x71, 0x5e, 0x7c, 0xb6, 0x49, 0x2d, 0x20, 0x45, 0xc3, 0xd2, 0x4d, 0xfa,\n\t\t0x49, 0x61, 0x49, 0x04, 0x66, 0x26, 0xfc, 0xef, 0x51, 0xc5, 0x4e, 0xe5,\n\t\t0xd5, 0xe4, 0xa2, 0x5f, 0x66, 0x21, 0x4f, 0x1b, 0x43, 0x48, 0xd1, 0x8f,\n\t\t0x10, 0x88, 0x26, 0x1a, 0x52, 0x54, 0x9e, 0xe8, 0x00, 0xa2, 0x4b, 0x86,\n\t\t0x62, 0x71, 0xf2, 0xab, 0x56, 0x5b, 0x7c, 0xdf, 0x76, 0x6c, 0x17, 0x74,\n\t\t0x60, 0xb2, 0xae, 0xac, 0xff, 0xd7, 0xa8, 0xa2, 0xcc, 0xa0, 0xd3, 0x16,\n\t\t0x77, 0x48, 0xec, 0x17, 0xb3, 0xf2, 0x32, 0x5d, 0x66, 0x49, 0x88, 0x0a,\n\t\t0xf7, 0xaf, 0xd1, 0x26, 0x28, 0x2d, 0xcd, 0xf7, 0xfc, 0xfa, 0x18, 0x93,\n\t\t0x28, 0x2e, 0x2c, 0x08, 0x0e, 0x2d, 0x5f, 0x3e, 0x47, 0x80, 0x26, 0x4d,\n\t\t0xa4, 0xb4, 0xff, 0xaa, 0xda, 0x8d, 0x54, 0x3a, 0xe8, 0xcc, 0xa1, 0xfa,\n\t\t0xf2, 0xd6, 0x79, 0xa0, 0x7b, 0x52, 0xae, 0xc1, 0xd7, 0x6e, 0x20, 0x12,\n\t\t0x9b, 0xcb, 0xfb, 0x81, 0x89, 0x1c, 0x03, 0x21, 0x99, 0x51, 0x3f, 0xd6,\n\t\t0xf5, 0x74, 0xd9, 0x70, 0x2c, 0x95, 0x59, 0x52, 0x4e, 0xae, 0xca, 0xf9,\n\t\t0x6d, 0xbe, 0x43, 0x22, 0x5e, 0x91, 0x01, 0x5d, 0x1e, 0x93, 0x3a, 0x52,\n\t\t0xe4, 0xa7, 0x1f, 0xc1, 0x5c, 0xaa, 0x61, 0x64, 0xc3, 0x4c, 0x4d, 0x16,\n\t\t0x90, 0x4d, 0xe6, 0x83, 0x60, 0xd8, 0x90, 0xa6, 0x7b, 0x16, 0x08, 0x83,\n\t\t0x4e, 0x29, 0x4a, 0x2f, 0x87, 0x48, 0xc3, 0x48, 0x6d, 0x05, 0xac, 0x90,\n\t\t0x78, 0xa8, 0xc0, 0x5a, 0x93, 0x5d, 0x42, 0xae, 0x45, 0xc0, 0xa5, 0xf3,\n\t\t0x83, 0x28, 0x20, 0x0c, 0xfd, 0x88, 0x3a, 0xc2, 0x1f, 0xf5, 0x6d, 0xe9,\n\t\t0x31, 0xa1, 0x55, 0x1d, 0xb5, 0x5e, 0x81, 0xa1, 0xcd, 0xe4, 0x7c, 0x30,\n\t\t0x69, 0xb9, 0x66, 0x9b, 0x09, 0x0f, 0x0d, 0x69, 0xbd, 0xda, 0xaa, 0x7a,\n\t\t0x1a, 0x25, 0x03, 0x58, 0x90, 0xa8, 0xce, 0x27, 0x3c, 0xa5, 0xb4, 0x3d,\n\t\t0xbd, 0xfd, 0xcd, 0xd7, 0xd6, 0x85, 0xa7, 0xac, 0x16, 0xa7, 0xfd, 0xfc,\n\t\t0xdf, 0xbf, 0xe1, 0xdf, 0xdf, 0x9e, 0x19, 0x4f, 0x4e, 0x4f, 0xf3, 0x54,\n\t\t0x68, 0x6a, 0xed, 0xd6, 0x05, 0xac, 0xd7, 0xda, 0x5b, 0xa6, 0x1f, 0xa5,\n\t\t0x28, 0x62, 0xde, 0xab, 0x24, 0x2c, 0x2a, 0x8c, 0x35, 0xb5, 0xd8, 0xea,\n\t\t0xd4, 0x5e, 0xd3, 0x0c, 0x77, 0x0c, 0xb5, 0x34, 0x13, 0xff, 0x7f, 0x3c,\n\t\t0x50, 0x61, 0x33, 0xcb, 0x82, 0x94, 0xa6, 0x7d, 0x36, 0x5f, 0xde, 0x31,\n\t\t0xfd, 0xf7, 0xc0, 0x97, 0x1e, 0x1a, 0x2d, 0xf6, 0x34, 0x02, 0xaf, 0x06,\n\t\t0x7c, 0xd0, 0xe2, 0xb7, 0x39, 0xf2, 0x7a, 0xd8, 0x1f, 0xc1, 0x54, 0xfb,\n\t\t0xbe, 0x74, 0x88, 0xf0, 0x4e, 0x03, 0x8b, 0x19, 0x0d, 0x66, 0x16, 0x91,\n\t\t0xd7, 0x3a, 0x24, 0xe6, 0xe4, 0xe4, 0x04, 0x5a, 0x06, 0x76, 0x7e, 0xbe,\n\t\t0x48, 0xfc, 0xf4, 0x6f, 0x5f, 0xc9, 0x62, 0xf3, 0x75, 0xee, 0xa0, 0xd5,\n\t\t0x53, 0x83, 0xc3, 0xb7, 0xf7, 0xec, 0x80, 0x06, 0xcf, 0xfd, 0xa7, 0xdb,\n\t\t0x63, 0x78, 0x24, 0xa4, 0x20, 0x0d, 0xba, 0xc1, 0x0e, 0xaf, 0xfb, 0x8d,\n\t\t0x93, 0x97, 0x3d, 0xb6, 0x56, 0x3b, 0xbf, 0x47, 0xb8, 0x96, 0xc7, 0x10,\n\t\t0xbb, 0xcc, 0x7b, 0xca, 0xf4, 0x7f, 0x49, 0x6f, 0xab, 0x16, 0x5a, 0xb3,\n\t\t0xe5, 0x7f, 0x91, 0x30, 0xe0, 0x4d, 0x00, 0xc2, 0x31, 0x98, 0x6c, 0x6e,\n\t\t0xdd, 0xfb, 0x46, 0x7d, 0xc2, 0x14, 0x9d, 0x1f, 0x5c, 0x82, 0x1d, 0x69,\n\t\t0xd6, 0x04, 0x8a, 0xc7, 0x05, 0x01, 0x7e, 0x7e, 0x23, 0xa5, 0x01, 0x89,\n\t\t0xa9, 0x46, 0xfd, 0x67, 0xa7, 0xaa, 0xca, 0xb6, 0xf3, 0xce, 0xe7, 0x8a,\n\t\t0xa5, 0x2b, 0x89, 0x10, 0x3e, 0x33, 0x34, 0x34, 0xb4, 0x97, 0x97, 0xeb,\n\t\t0x09, 0xcf, 0xe9, 0x11, 0x7b, 0x78, 0x64, 0xe4, 0xfe, 0xcb, 0xed, 0xa1,\n\t\t0x9e, 0xfd, 0x14, 0x5f, 0x88, 0xe7, 0xd7, 0x8b, 0x16, 0x29, 0x9e, 0xc4,\n\t\t0x39, 0xe4, 0xc8, 0xfc, 0x8b, 0xdd, 0xc0, 0xaf, 0x60, 0x6c, 0x22, 0xa5,\n\t\t0xf2, 0xfb, 0x44, 0x29, 0x8a, 0x50, 0x34, 0xe2, 0xd8, 0x38, 0x81, 0xa7,\n\t\t0xdf, 0xe2, 0xd7, 0x51, 0x62, 0x18, 0xfd, 0x7c, 0x5e, 0x79, 0x11, 0x91,\n\t\t0x96, 0x1a, 0x9a, 0x89, 0xa7, 0x8b, 0x54, 0x54, 0xcc, 0x32, 0xd0, 0x95,\n\t\t0x22, 0xc8, 0x3c, 0x3d, 0x06, 0x9b, 0xf6, 0xed, 0xc1, 0xdf, 0xbf, 0x13,\n\t\t0x79, 0x89, 0xe5, 0x7b, 0xbd, 0x33, 0x45, 0xff, 0xbe, 0x3f, 0x8e, 0x35,\n\t\t0x17, 0x20, 0x62, 0x78, 0x30, 0x39, 0x85, 0x74, 0xf7, 0x02, 0xab, 0x05,\n\t\t0xbb, 0x2b, 0xd6, 0x82, 0xcb, 0x39, 0xce, 0x2b, 0xeb, 0xcd, 0x87, 0xd3,\n\t\t0xd9, 0xad, 0x0c, 0xcc, 0xd4, 0x9f, 0xc5, 0x29, 0x62, 0xe2, 0xbb, 0xbb,\n\t\t0x85, 0xa2, 0x09, 0xb9, 0x95, 0xd8, 0x8b, 0x2d, 0x60, 0xad, 0x1a, 0x5f,\n\t\t0x4a, 0x6b, 0x8f, 0xb3, 0xfa, 0x4c, 0x8d, 0x2f, 0x2b, 0x98, 0x0f, 0x4a,\n\t\t0x84, 0x69, 0xe7, 0x56, 0xdb, 0xdc, 0xb6, 0x07, 0xa2, 0xd2, 0xf1, 0x8e,\n\t\t0xa2, 0x38, 0x89, 0x66, 0x3d, 0x5f, 0xaf, 0xc2, 0x47, 0xa0, 0x25, 0x20,\n\t\t0xed, 0x59, 0xd9, 0x4f, 0xcb, 0xbb, 0x68, 0x24, 0x82, 0xc5, 0xe1, 0x98,\n\t\t0x0f, 0xa0, 0x83, 0xfa, 0xff, 0xfb, 0xed, 0xa4, 0x1d, 0x42, 0xfa, 0x56,\n\t\t0xac, 0x94, 0xc6, 0x8c, 0x4a, 0xed, 0xa0, 0x9b, 0x81, 0x8f, 0x74, 0xd1,\n\t\t0x93, 0x98, 0xb7, 0xd8, 0xb2, 0x49, 0xc6, 0xc5, 0xbd, 0x78, 0xa4, 0xd9,\n\t\t0x17, 0x99, 0xd9, 0xee, 0x2e, 0x4d, 0x0f, 0x3a, 0x63, 0xef, 0xf0, 0xbc,\n\t\t0x15, 0x11, 0x15, 0x0d, 0x26, 0x62, 0x63, 0xd1, 0x19, 0xc1, 0x77, 0x06,\n\t\t0xb9, 0x5f, 0xb2, 0x40, 0x49, 0xfc, 0xd5, 0x9b, 0x71, 0xe7, 0xe7, 0x88,\n\t\t0x0a, 0x79, 0x1f, 0xcf, 0xc8, 0x77, 0x20, 0x4b, 0x4d, 0xb7, 0xbf, 0x39,\n\t\t0x61, 0xc7, 0x8a, 0xe8, 0xb7, 0xcb, 0xd6, 0x40, 0x69, 0xf1, 0xb0, 0xe4,\n\t\t0xbe, 0x4c, 0x6c, 0x69, 0x69, 0xaa, 0x28, 0x6b, 0x81, 0x16, 0xb1, 0x21,\n\t\t0x01, 0x32, 0xac, 0x20, 0x93, 0xae, 0x02, 0xcf, 0xb0, 0xe0, 0x52, 0x23,\n\t\t0x83, 0xe3, 0x82, 0xf0, 0xd3, 0xbd, 0x2b, 0x19, 0xed, 0x00, 0x2f, 0xfc,\n\t\t0xdb, 0xbf, 0xce, 0xee, 0x9b, 0xa9, 0xd7, 0x9e, 0x5d, 0xfb, 0x32, 0x6d,\n\t\t0x11, 0xc6, 0xf0, 0x7e, 0xa5, 0x97, 0xa7, 0xfb, 0x43, 0x44, 0x47, 0x4c,\n\t\t0x4c, 0xcc, 0x97, 0xc7, 0xfd, 0x9c, 0x0d, 0x70, 0xee, 0xdf, 0xe5, 0x60,\n\t\t0xc3, 0x54, 0x44, 0x66, 0xa8, 0xb9, 0x4f, 0x38, 0x38, 0xb0, 0x44, 0xf2,\n\t\t0x1d, 0x5a, 0x2b, 0x67, 0x50, 0x66, 0x56, 0x0d, 0xe2, 0x1e, 0xee, 0x7c,\n\t\t0xa8, 0xf3, 0x0c, 0xd9, 0x01, 0x9f, 0xa0, 0x02, 0xf3, 0xa2, 0xf0, 0xf9,\n\t\t0xd9, 0xc6, 0xfd, 0xc7, 0xa7, 0x8f, 0x24, 0x28, 0x13, 0x32, 0x5f, 0xe8,\n\t\t0x81, 0x17, 0xab, 0x9c, 0x6a, 0x16, 0x34, 0x81, 0x47, 0x41, 0x0c, 0xc8,\n\t\t0xad, 0xbe, 0xad, 0xd2, 0x95, 0xd3, 0x06, 0x53, 0xfa, 0x91, 0x2b, 0x6c,\n\t\t0x35, 0x36, 0x36, 0xd5, 0xf6, 0xe3, 0x5e, 0x53, 0x91, 0xfd, 0xb7, 0x3e,\n\t\t0x93, 0x4b, 0x5b, 0xfa, 0xea, 0x70, 0x03, 0xa9, 0xd7, 0x5e, 0x91, 0xaa,\n\t\t0xf4, 0x72, 0x58, 0x92, 0xd3, 0x3b, 0x3f, 0x7f, 0xd1, 0x8e, 0xb0, 0x2c,\n\t\t0x52, 0xaa, 0xb2, 0x35, 0x99, 0xf7, 0x4d, 0xa3, 0xc5, 0x91, 0x82, 0x48,\n\t\t0xd0, 0x37, 0xda, 0xf7, 0xf5, 0x09, 0x80, 0x42, 0x22, 0x40, 0x52, 0x98,\n\t\t0xd8, 0xd9, 0x43, 0x6a, 0x6b, 0x99, 0xc5, 0xe3, 0x88, 0x74, 0xf3, 0xa6,\n\t\t0xa2, 0x4b, 0x4b, 0xbf, 0x7a, 0xde, 0x1c, 0xe4, 0xa9, 0x89, 0x31, 0x90,\n\t\t0x70, 0xa3, 0xe0, 0x56, 0x49, 0x90, 0xd4, 0xa3, 0x96, 0x58, 0x33, 0xa4,\n\t\t0x04, 0xc9, 0x9b, 0xc5, 0x85, 0x75, 0xa9, 0xd3, 0x7a, 0xd7, 0x3a, 0xe0,\n\t\t0x62, 0xcd, 0xed, 0x14, 0x2c, 0x24, 0x33, 0x7c, 0x6e, 0xaf, 0x27, 0xf4,\n\t\t0x1e, 0xae, 0xe1, 0x22, 0xb4, 0x53, 0x0e, 0x21, 0x2d, 0x3e, 0x9b, 0x72,\n\t\t0x85, 0x86, 0x04, 0xec, 0x31, 0x18, 0xba, 0x8a, 0x89, 0xc5, 0xa8, 0x83,\n\t\t0x0a, 0x47, 0xff, 0x01, 0xf9, 0x67, 0x29, 0x43, 0x3a, 0xbf, 0x36, 0xf7,\n\t\t0xe6, 0x3f, 0x93, 0x3a, 0x64, 0xca, 0xcf, 0x95, 0x34, 0x8e, 0x57, 0x88,\n\t\t0xb5, 0xcf, 0xdd, 0x69, 0x88, 0x8e, 0x12, 0x12, 0x12, 0x74, 0x3a, 0xcd,\n\t\t0x0a, 0x68, 0xf8, 0x87, 0x44, 0xf1, 0x92, 0xc1, 0xf4, 0xda, 0x8d, 0x06,\n\t\t0xd7, 0x7b, 0xe3, 0xee, 0x6f, 0x2f, 0x2d, 0x52, 0x6f, 0x13, 0x82, 0xef,\n\t\t0x2a, 0xa9, 0xbc, 0x7e, 0x6f, 0xde, 0xc1, 0xa1, 0xa1, 0x5b, 0xd7, 0x13,\n\t\t0x82, 0x12, 0x43, 0xb1, 0x9f, 0x7b, 0x3c, 0x5d, 0x46, 0xb2, 0x38, 0xed,\n\t\t0xb2, 0xd3, 0x85, 0xe1, 0xfc, 0x6f, 0xb5, 0xdf, 0x45, 0x4a, 0x5c, 0x6d,\n\t\t0x0c, 0x74, 0xc2, 0x94, 0x3a, 0xb0, 0x60, 0x90, 0xcf, 0x56, 0xf1, 0xf6,\n\t\t0x8a, 0x45, 0xbc, 0xff, 0xdc, 0xe1, 0x86, 0xf7, 0x63, 0xc4, 0x2c, 0xd0,\n\t\t0x48, 0x2f, 0xc1, 0xbb, 0x9c, 0x0a, 0x29, 0xd3, 0xe1, 0xac, 0x13, 0x82,\n\t\t0x3e, 0xb2, 0x25, 0xa4, 0x73, 0x06, 0xcd, 0xbf, 0x6d, 0x29, 0xa7, 0xd8,\n\t\t0x02, 0x47, 0xf1, 0x6b, 0x3f, 0x43, 0x9f, 0xc0, 0x89, 0x28, 0x25, 0x68,\n\t\t0x29, 0x21, 0x6c, 0x63, 0xe1, 0x96, 0x18, 0xaf, 0x9d, 0x19, 0xce, 0x3f,\n\t\t0xcb, 0x2f, 0x47, 0x44, 0x2e, 0xfb, 0xc9, 0xec, 0x4f, 0x47, 0x07, 0x3f,\n\t\t0x87, 0xf5, 0x22, 0x88, 0xa3, 0xcd, 0x01, 0x86, 0x05, 0xa0, 0x4c, 0xe5,\n\t\t0x12, 0xb9, 0x9e, 0x99, 0x19, 0x4c, 0x24, 0x1c, 0x3a, 0x05, 0xd6, 0x3d,\n\t\t0x55, 0x92, 0x24, 0x29, 0x87, 0x97, 0x07, 0x07, 0x68, 0x18, 0x18, 0x12,\n\t\t0x6a, 0x6a, 0xf8, 0xf8, 0xf8, 0x78, 0x90, 0x3f, 0x04, 0x14, 0xac, 0xd0,\n\t\t0x17, 0x05, 0xc6, 0xf1, 0x67, 0x16, 0x32, 0x02, 0x60, 0xca, 0xe7, 0x61,\n\t\t0xeb, 0x7e, 0xe3, 0x79, 0x34, 0xdc, 0x6f, 0x0d, 0x81, 0x3f, 0x5d, 0x46,\n\t\t0xa5, 0x53, 0x5b, 0x6d, 0xe7, 0x5d, 0x85, 0xf4, 0xbe, 0x78, 0x2b, 0x24,\n\t\t0x71, 0x99, 0x1f, 0x6e, 0x95, 0x99, 0x22, 0x8b, 0x64, 0x91, 0x4b, 0x18,\n\t\t0x3e, 0x53, 0xd3, 0x1b, 0x0f, 0x15, 0x9a, 0x04, 0x19, 0x4d, 0x22, 0x78,\n\t\t0xf6, 0xcd, 0xbb, 0x26, 0x92, 0x85, 0x29, 0x3b, 0x47, 0x19, 0x5e, 0xa9,\n\t\t0xe6, 0x24, 0xf6, 0x04, 0x74, 0x3e, 0x98, 0xac, 0x8a, 0x8c, 0x81, 0x59,\n\t\t0x85, 0xb6, 0x63, 0x75, 0x6e, 0x23, 0x44, 0xf2, 0xfa, 0x4b, 0xa3, 0x9a,\n\t\t0x68, 0xff, 0x73, 0x3b, 0x5d, 0x0e, 0x99, 0x2a, 0x90, 0x38, 0x16, 0x26,\n\t\t0x5b, 0x8d, 0xff, 0xf9, 0xd3, 0xbf, 0x69, 0xdd, 0x97, 0xe0, 0xf5, 0xe9,\n\t\t0xb6, 0xfc, 0x4f, 0xd9, 0x72, 0x46, 0xb3, 0xcf, 0x33, 0x87, 0xc8, 0xb7,\n\t\t0x6f, 0x1f, 0x00, 0x03, 0x28, 0x5d, 0x77, 0x77, 0x24, 0xf7, 0x4e, 0xd7,\n\t\t0x99, 0xa0, 0xae, 0xcd, 0xe1, 0xfc, 0xf2, 0x64, 0x6b, 0x11, 0x59, 0xe7,\n\t\t0xdb, 0x8d, 0xae, 0x37, 0xb3, 0x9f, 0x54, 0x56, 0x74, 0x6b, 0x98, 0x15,\n\t\t0x12, 0x7c, 0xf4, 0xd1, 0xdb, 0xb5, 0x06, 0x07, 0x54, 0xe0, 0x78, 0x63,\n\t\t0x45, 0xfb, 0x2f, 0x94, 0x80, 0x5c, 0x92, 0xfe, 0x5d, 0xb9, 0x49, 0x24,\n\t\t0xc8, 0x00, 0xf5, 0xfb, 0x8a, 0x0a, 0x3f, 0x37, 0x26, 0x99, 0x5a, 0x5e,\n\t\t0x85, 0x69, 0x15, 0xe3, 0x9e, 0xb1, 0x78, 0xf8, 0xd3, 0xe9, 0xbf, 0xb9,\n\t\t0xe7, 0x23, 0xa3, 0x4e, 0x57, 0x5b, 0xf4, 0x85, 0x26, 0x7b, 0xbf, 0x87,\n\t\t0x97, 0xeb, 0x2d, 0x82, 0xd6, 0x3a, 0xbc, 0x8e, 0xbf, 0x93, 0x9d, 0xf6,\n\t\t0x31, 0x21, 0xbb, 0x9e, 0xad, 0x44, 0x2c, 0xd5, 0x99, 0x7d, 0x23, 0xc7,\n\t\t0xb0, 0x68, 0x8f, 0x6d, 0x69, 0xe1, 0x0e, 0x0c, 0x0a, 0x72, 0xb8, 0x39,\n\t\t0x50, 0x94, 0xc9, 0xe0, 0x40, 0xc1, 0xc3, 0xc3, 0x03, 0x33, 0x1b, 0x41,\n\t\t0x03, 0xf3, 0xe5, 0x37, 0x07, 0x23, 0x37, 0x3d, 0xe6, 0xbb, 0x6e, 0x9c,\n\t\t0xc8, 0xb9, 0xed, 0xe9, 0x71, 0x59, 0x6b, 0xa4, 0x70, 0x5e, 0x96, 0x02,\n\t\t0xdd, 0xaf, 0x8d, 0x72, 0x62, 0xda, 0x79, 0x78, 0x77, 0xcc, 0xe2, 0x41,\n\t\t0xc8, 0x4a, 0xb1, 0x09, 0x41, 0x35, 0x17, 0xed, 0x02, 0xc0, 0x97, 0x9e,\n\t\t0x2e, 0x8c, 0xe4, 0x43, 0xf7, 0xd2, 0xfe, 0x87, 0x90, 0xa5, 0x50, 0x0d,\n\t\t0x1f, 0x22, 0xcc, 0x17, 0xf9, 0x47, 0x93, 0x0a, 0x67, 0x48, 0xcf, 0x20,\n\t\t0xd5, 0xc8, 0x0d, 0x68, 0xc1, 0x43, 0x63, 0x58, 0x83, 0xf7, 0xb8, 0xd1,\n\t\t0x4f, 0xf3, 0x0d, 0x3e, 0x41, 0x2c, 0x7b, 0x20, 0xfb, 0xbd, 0xab, 0x2c,\n\t\t0xc4, 0x3f, 0xdc, 0x4e, 0x7b, 0x6c, 0xcd, 0x5d, 0x12, 0xaa, 0x93, 0x6c,\n\t\t0x31, 0x80, 0x36, 0x1b, 0x01, 0x11, 0xba, 0x00, 0xbf, 0xfb, 0x92, 0x30,\n\t\t0x5c, 0x63, 0x39, 0x47, 0x73, 0x73, 0xa4, 0xaa, 0xf4, 0xe5, 0xb4, 0x6e,\n\t\t0x42, 0xe0, 0x9b, 0xa8, 0x28, 0xb4, 0x56, 0x83, 0xa5, 0xaa, 0xe1, 0xd9,\n\t\t0x79, 0xd8, 0xc4, 0xc2, 0xf2, 0x45, 0x67, 0xc4, 0xd4, 0x26, 0xc9, 0x83,\n\t\t0xeb, 0x23, 0xdd, 0x43, 0xbd, 0x6b, 0xe5, 0x25, 0xaf, 0x08, 0x04, 0xb1,\n\t\t0xb6, 0xda, 0x78, 0x50, 0x97, 0xba, 0x74, 0xe5, 0xc1, 0xc5, 0x85, 0x43,\n\t\t0x6f, 0xb9, 0xa0, 0x83, 0xfe, 0xc3, 0x83, 0xb5, 0x67, 0x7e, 0x92, 0x18,\n\t\t0x42, 0xb0, 0x3a, 0xc0, 0x68, 0xbf, 0x39, 0x83, 0x7b, 0x51, 0x3b, 0x44,\n\t\t0xf3, 0x0f, 0x08, 0x90, 0x13, 0x1a, 0xd0, 0x0d, 0x16, 0x01, 0xb3, 0x70,\n\t\t0x71, 0xbc, 0x10, 0x75, 0xd1, 0xb3, 0x43, 0x82, 0x8e, 0xaf, 0x70, 0x38,\n\t\t0x9f, 0x2e, 0x32, 0xc3, 0x46, 0xf4, 0x5b, 0x20, 0x57, 0x7a, 0xb1, 0xd6,\n\t\t0x18, 0xce, 0x74, 0x3c, 0xbd, 0x88, 0x38, 0xc4, 0xb9, 0x1b, 0x40, 0xdc,\n\t\t0x1a, 0x87, 0x6d, 0xf1, 0xca, 0x0a, 0x0a, 0x9c, 0xa8, 0x29, 0xc0, 0xdc,\n\t\t0xa8, 0x26, 0xe0, 0x94, 0xaa, 0x44, 0x32, 0x76, 0xbd, 0x60, 0x48, 0x27,\n\t\t0xd3, 0x95, 0x32, 0xdd, 0xdb, 0xde, 0xcc, 0xf0, 0xcc, 0xb9, 0x57, 0x23,\n\t\t0x47, 0xd2, 0xb4, 0xa8, 0xaf, 0x5f, 0x9f, 0x1a, 0x55, 0xbc, 0x98, 0xe3,\n\t\t0xd3, 0x8d, 0xad, 0xe9, 0xcc, 0x98, 0x4c, 0x5f, 0x08, 0x5c, 0x5c, 0xba,\n\t\t0x3b, 0x59, 0x2c, 0xa6, 0x0b, 0xcd, 0x20, 0x67, 0x53, 0x16, 0xb6, 0x4f,\n\t\t0x87, 0xe0, 0x3a, 0xdd, 0xdb, 0xfe, 0x76, 0xed, 0xaa, 0x45, 0x4f, 0xe7,\n\t\t0x8b, 0xd9, 0x06, 0x0b, 0x33, 0x99, 0xa7, 0xb3, 0x13, 0xd8, 0x26, 0x65,\n\t\t0xfb, 0xba, 0xe2, 0xf5, 0x61, 0xfd, 0x85, 0x30, 0x4f, 0x2e, 0x8d, 0x40,\n\t\t0x3f, 0x6f, 0xc7, 0x8e, 0x05, 0x5e, 0x6b, 0xc3, 0x81, 0xe0, 0xac, 0x72,\n\t\t0x62, 0x7b, 0x7f, 0x18, 0xcc, 0xfa, 0x2c, 0x3d, 0xb7, 0xb8, 0xb4, 0x84,\n\t\t0x87, 0x80, 0x80, 0x10, 0xb3, 0xe7, 0xcc, 0x90, 0x32, 0x3a, 0xd5, 0xea,\n\t\t0x62, 0x05, 0x78, 0xec, 0x03, 0x6b, 0x34, 0x60, 0xf4, 0xce, 0xce, 0xaa,\n\t\t0xdc, 0x9c, 0xfe, 0xc3, 0x6d, 0xb2, 0x2b, 0x1f, 0x22, 0xb5, 0x7e, 0x5b,\n\t\t0x87, 0x3b, 0x98, 0x9f, 0x92, 0x30, 0xf3, 0x32, 0xfb, 0xb1, 0x6f, 0x78,\n\t\t0x99, 0x9e, 0xe3, 0xb0, 0xbf, 0x59, 0x27, 0x95, 0x43, 0x70, 0xe9, 0xc1,\n\t\t0xd5, 0x66, 0x46, 0x1f, 0x1d, 0x92, 0x2e, 0xb1, 0x92, 0xb2, 0x0b, 0xb8,\n\t\t0xbe, 0xb1, 0xd7, 0x2d, 0x38, 0x10, 0x48, 0x2c, 0xad, 0xca, 0x30, 0xb5,\n\t\t0x77, 0x40, 0x4b, 0x33, 0xf5, 0x7f, 0xec, 0xe2, 0x1c, 0x2a, 0x84, 0xfe,\n\t\t0xdf, 0x96, 0xa3, 0xf6, 0x98, 0xac, 0x34, 0xef, 0x55, 0xb8, 0xe1, 0xd5,\n\t\t0x3e, 0x24, 0x5b, 0x79, 0x50, 0x35, 0xdc, 0x9d, 0xef, 0x3d, 0x02, 0x25,\n\t\t0x32, 0x8a, 0xd5, 0xe4, 0x20, 0x21, 0x88, 0x61, 0x4d, 0xe1, 0xbc, 0x9b,\n\t\t0xdd, 0xfb, 0xe1, 0x42, 0xdc, 0x78, 0x2c, 0xe0, 0xd7, 0x4c, 0x0b, 0x43,\n\t\t0x0c, 0xb7, 0xc2, 0x56, 0xe8, 0x7a, 0xbb, 0x87, 0x53, 0x51, 0xc9, 0xcd,\n\t\t0x98, 0xf5, 0xb8, 0x76, 0xf9, 0x3c, 0x34, 0xaf, 0x15, 0x92, 0xb5, 0x2e,\n\t\t0x3b, 0xee, 0x8c, 0xf8, 0x7d, 0x35, 0x9b, 0x41, 0xec, 0xc4, 0x76, 0x99,\n\t\t0xd2, 0xc9, 0x11, 0x62, 0x1f, 0xd3, 0xa2, 0x4f, 0x0d, 0x9b, 0x58, 0xdc,\n\t\t0x78, 0x63, 0x6b, 0x45, 0x52, 0x08, 0x42, 0x30, 0x0b, 0xb0, 0x1a, 0x93,\n\t\t0x08, 0x58, 0xbb, 0x07, 0x5f, 0xe3, 0xfb, 0x75, 0x7f, 0x8e, 0x2a, 0x77,\n\t\t0x42, 0xec, 0xb8, 0x42, 0x92, 0x09, 0x08, 0x78, 0x9a, 0xb1, 0x35, 0x56,\n\t\t0x66, 0x5b, 0xfd, 0x34, 0xd1, 0x66, 0xdf, 0x1c, 0x7c, 0x1d, 0xb2, 0xdc,\n\t\t0x7e, 0x7b, 0x7d, 0x3e, 0xfe, 0x8e, 0xb9, 0x5a, 0x63, 0xf3, 0xaf, 0xd1,\n\t\t0x73, 0x69, 0xbf, 0x24, 0xc7, 0xb7, 0xb7, 0x3b, 0x00, 0x6a, 0x73, 0x6f,\n\t\t0x4f, 0x8d, 0xf1, 0x39, 0x29, 0x64, 0x74, 0xd3, 0xe0, 0x6f, 0x62, 0xde,\n\t\t0x83, 0xe9, 0x52, 0x05, 0xa2, 0x26, 0x60, 0xe6, 0x07, 0xc0, 0xdc, 0xc7,\n\t\t0x48, 0xfd, 0x7c, 0xb2, 0x15, 0xd7, 0x02, 0x29, 0x76, 0x43, 0x1b, 0x6a,\n\t\t0x2a, 0xc3, 0x49, 0xdc, 0x62, 0x08, 0x09, 0x36, 0xd6, 0x83, 0x59, 0x15,\n\t\t0xd7, 0xf9, 0xd0, 0x22, 0xdc, 0x80, 0x9c, 0x99, 0x63, 0x13, 0x4d, 0x90,\n\t\t0xfd, 0xcc, 0x97, 0x41, 0x63, 0x96, 0x39, 0xfa, 0x16, 0x3a, 0x8c, 0x00,\n\t\t0x0b, 0xf2, 0xab, 0x4e, 0x7e, 0x38, 0x0e, 0x33, 0x01, 0x0b, 0x92, 0xd7,\n\t\t0x4f, 0xed, 0x98, 0xd0, 0x62, 0x49, 0xf1, 0xd1, 0xcc, 0xf8, 0x8c, 0x2e,\n\t\t0x2e, 0x82, 0xf9, 0xbd, 0xee, 0x66, 0x73, 0x44, 0xb4, 0x28, 0xbf, 0x7e,\n\t\t0x45, 0x68, 0xb2, 0x5d, 0x2d, 0x4b, 0xe9, 0xf8, 0x95, 0x90, 0xa0, 0xa8,\n\t\t0xa1, 0x11, 0xee, 0xb0, 0x3d, 0x58, 0x3a, 0x8c, 0x14, 0x19, 0x79, 0x6c,\n\t\t0xe2, 0x97, 0xbb, 0x63, 0xeb, 0xb3, 0x2b, 0xa1, 0xdc, 0x63, 0x5a, 0xee,\n\t\t0x47, 0x5e, 0x5c, 0x68, 0xb6, 0xb9, 0x5a, 0xb4, 0xbe, 0x79, 0x65, 0x33,\n\t\t0xde, 0xda, 0xd3, 0xb1, 0x77, 0x71, 0x48, 0x5b, 0x26, 0xc8, 0x1a, 0x4d,\n\t\t0xca, 0x42, 0x7f, 0x4a, 0xab, 0x74, 0x95, 0x94, 0xeb, 0xf2, 0xf1, 0x70,\n\t\t0x04, 0x75, 0x7b, 0x2e, 0x5b, 0xa7, 0x1f, 0x7f, 0xf6, 0x71, 0xf1, 0x8a,\n\t\t0xed, 0x99, 0x72, 0x77, 0xec, 0x17, 0xad, 0x65, 0x88, 0x57, 0x89, 0x05,\n\t\t0xab, 0x35, 0x41, 0x43, 0xa6, 0x1c, 0x76, 0x7a, 0xf9, 0x10, 0x24, 0x49,\n\t\t0xa3, 0x8a, 0x74, 0x34, 0x95, 0x42, 0x38, 0x60, 0xf0, 0xef, 0x79, 0x8c,\n\t\t0xfa, 0x3c, 0xa7, 0xbd, 0x31, 0x3c, 0x00, 0xb9, 0x2b, 0xab, 0x86, 0x4d,\n\t\t0xeb, 0xa6, 0x8a, 0x65, 0x33, 0xa4, 0x56, 0x17, 0x35, 0x35, 0x35, 0xe1,\n\t\t0xd1, 0xd0, 0xd4, 0x17, 0x36, 0xaf, 0x74, 0x2b, 0x25, 0x5a, 0xd5, 0x25,\n\t\t0x00, 0xb0, 0x5c, 0xac, 0xdf, 0xf2, 0x49, 0xcd, 0xc0, 0x2f, 0x07, 0xc2,\n\t\t0x12, 0x4d, 0x7d, 0xef, 0xa2, 0xe7, 0xba, 0x5c, 0x97, 0x8d, 0xb9, 0x31,\n\t\t0x04, 0x6f, 0x78, 0x28, 0x69, 0xe1, 0x21, 0x3c, 0x2e, 0x52, 0x1c, 0xc0,\n\t\t0x5e, 0x25, 0x88, 0xfd, 0xc6, 0xf4, 0xf5, 0xe5, 0xed, 0xd9, 0x77, 0x43,\n\t\t0x2e, 0xfc, 0x7d, 0xe2, 0x83, 0x28, 0xd6, 0xeb, 0xe6, 0x3f, 0x0d, 0x0f,\n\t\t0x5a, 0xf6, 0x68, 0xa2, 0x89, 0x30, 0xc8, 0x61, 0xc1, 0xd2, 0x91, 0xdb,\n\t\t0xe6, 0x4a, 0x4a, 0xa1, 0x60, 0x27, 0x93, 0x38, 0xed, 0xeb, 0x90, 0x88,\n\t\t0x23, 0xf2, 0x9c, 0x15, 0x7f, 0x36, 0x3f, 0x3e, 0x03, 0x83, 0x06, 0x63,\n\t\t0x3f, 0x47, 0xd1, 0xaa, 0x57, 0x7d, 0x01, 0xf2, 0x10, 0x47, 0xc4, 0xdf,\n\t\t0x7b, 0x77, 0xfa, 0x8f, 0x76, 0xcc, 0xe3, 0x62, 0x03, 0x42, 0x47, 0x57,\n\t\t0x77, 0xce, 0xa4, 0xf6, 0x52, 0x72, 0x74, 0x6c, 0x2e, 0x9d, 0x88, 0x3d,\n\t\t0xcf, 0x4a, 0x22, 0x07, 0xe3, 0xde, 0xab, 0x85, 0x94, 0x45, 0x29, 0x8d,\n\t\t0x30, 0xa7, 0xe2, 0x15, 0x46, 0xf0, 0xdd, 0xa3, 0x7d, 0x5e, 0x9c, 0x9f,\n\t\t0xb7, 0x1a, 0xc4, 0xa8, 0x34, 0xad, 0x6a, 0xcc, 0xb0, 0xb0, 0x55, 0xa5,\n\t\t0x96, 0x48, 0x81, 0x3e, 0x22, 0x8c, 0xcc, 0x93, 0x87, 0xda, 0x8c, 0x2f,\n\t\t0xe8, 0xdd, 0x6c, 0xd0, 0xa4, 0xe2, 0xb9, 0x0f, 0xdb, 0x87, 0x15, 0xeb,\n\t\t0xb9, 0xaa, 0x60, 0xb2, 0x75, 0x21, 0xf0, 0x81, 0x10, 0x0f, 0x60, 0x8d,\n\t\t0x2e, 0x47, 0x9b, 0x2b, 0x16, 0x7e, 0x6d, 0x1b, 0x9d, 0xce, 0x47, 0xc9,\n\t\t0x6f, 0xfb, 0xbb, 0xa3, 0x29, 0x5a, 0x9a, 0x43, 0x13, 0x13, 0x68, 0x5e,\n\t\t0xf7, 0x67, 0x62, 0x29, 0x0c, 0xba, 0x1b, 0x1b, 0x1b, 0x20, 0x50, 0x2a,\n\t\t0x8b, 0x09, 0xa2, 0xb7, 0x8f, 0xcf, 0xdc, 0x5e, 0xed, 0x92, 0x35, 0x9b,\n\t\t0xd5, 0x3c, 0xb2, 0x9e, 0x9e, 0x1e, 0x0d, 0x5e, 0x1f, 0x53, 0x33, 0x81,\n\t\t0xae, 0x07, 0x74, 0x2b, 0xc3, 0xe1, 0xc6, 0x71, 0x6c, 0x4c, 0x4e, 0x87,\n\t\t0x7e, 0x5e, 0x36, 0x1f, 0x50, 0x77, 0x2f, 0xff, 0x0c, 0xf9, 0x94, 0xb0,\n\t\t0xc3, 0x4a, 0xf1, 0xd4, 0xed, 0x24, 0xbe, 0x51, 0xfa, 0x9d, 0x9e, 0x32,\n\t\t0x49, 0x6d, 0x5d, 0xf3, 0xfb, 0x4e, 0xff, 0x2a, 0x83, 0x0e, 0xc4, 0xef,\n\t\t0xcf, 0xc5, 0xb4, 0x8c, 0x51, 0x58, 0x6c, 0xc0, 0x0b, 0xdb, 0xae, 0x0f,\n\t\t0xcf, 0x67, 0x31, 0xb2, 0xe0, 0xf1, 0x7a, 0xb1, 0xfa, 0x86, 0x0a, 0x52,\n\t\t0x96, 0x40, 0xeb, 0x7e, 0x39, 0xec, 0x6b, 0xf0, 0xec, 0x65, 0x15, 0x1d,\n\t\t0x29, 0xe1, 0xe1, 0xe6, 0xe1, 0x39, 0x02, 0xaa, 0x70, 0x12, 0x28, 0xf4,\n\t\t0xca, 0x0a, 0x63, 0x5b, 0x5b, 0x3d, 0x92, 0x2b, 0x7d, 0x9a, 0x24, 0x52,\n\t\t0x01, 0x01, 0x3d, 0xd9, 0xbd, 0xfd, 0x7d, 0x38, 0x80, 0xdd, 0x6f, 0x8f,\n\t\t0x17, 0xca, 0x87, 0xeb, 0xe6, 0x9e, 0xc3, 0x16, 0x08, 0x84, 0xdf, 0xb2,\n\t\t0x1f, 0x0e, 0xcb, 0x3d, 0x98, 0x58, 0x3f, 0xa9, 0xb9, 0xdf, 0xdd, 0x51,\n\t\t0xad, 0xcf, 0x1e, 0x45, 0x89, 0x2f, 0x6d, 0x7c, 0x47, 0x2d, 0x59, 0x7a,\n\t\t0xca, 0xcf, 0x97, 0xf6, 0xd0, 0x52, 0xfc, 0x25, 0x44, 0x2d, 0xb1, 0xfd,\n\t\t0x36, 0x4b, 0x61, 0x8e, 0x4d, 0x56, 0x70, 0x67, 0x4a, 0xa7, 0x16, 0x15,\n\t\t0xd7, 0xbf, 0xc5, 0x2b, 0x8f, 0x1d, 0x59, 0xc8, 0x8e, 0x4c, 0xa6, 0x54,\n\t\t0x67, 0x74, 0x1e, 0x4b, 0x1c, 0xcc, 0x9d, 0x00, 0xc7, 0x59, 0x36, 0x5b,\n\t\t0x39, 0x62, 0x00, 0x86, 0x0d, 0x93, 0x4b, 0x31, 0xfd, 0x5c, 0xab, 0x41,\n\t\t0x57, 0x6f, 0x55, 0x92, 0x35, 0x9d, 0x1b, 0x13, 0x33, 0xb2, 0x32, 0x43,\n\t\t0x1a, 0x0f, 0x3f, 0x30, 0x50, 0x04, 0x61, 0x57, 0xa9, 0xd5, 0x10, 0xd8,\n\t\t0xd6, 0xc6, 0x0b, 0xca, 0x75, 0xda, 0xff, 0x6b, 0xe9, 0x34, 0xea, 0x25,\n\t\t0x72, 0x84, 0x49, 0x8c, 0x86, 0xeb, 0x5d, 0xf7, 0xd2, 0x81, 0x78, 0x76,\n\t\t0x9f, 0x6f, 0xc4, 0xec, 0xbb, 0xe4, 0xf6, 0x47, 0xbc, 0xca, 0x2d, 0xbd,\n\t\t0x78, 0x14, 0xec, 0xec, 0x9b, 0x2d, 0x42, 0x52, 0x9d, 0x33, 0x0b, 0x21,\n\t\t0x92, 0x10, 0x0c, 0x76, 0x16, 0x89, 0xd9, 0xb8, 0xf6, 0x79, 0xfe, 0xef,\n\t\t0x47, 0x5c, 0xce, 0x94, 0xf3, 0x88, 0x56, 0x68, 0xfc, 0xef, 0xa4, 0x45,\n\t\t0xa3, 0x3a, 0xcd, 0x54, 0xae, 0x76, 0xce, 0x35, 0x22, 0xce, 0x9a, 0x29,\n\t\t0x02, 0x27, 0x10, 0xba, 0x74, 0x21, 0x35, 0x0d, 0x26, 0xba, 0x99, 0x85,\n\t\t0x45, 0x69, 0x4a, 0x62, 0x79, 0xa8, 0x90, 0xb5, 0x35, 0xdd, 0xd9, 0x6a,\n\t\t0x5b, 0x58, 0x89, 0x7c, 0xce, 0xd6, 0xd1, 0x5c, 0x39, 0x97, 0xcb, 0x11,\n\t\t0xd6, 0x7c, 0x85, 0x66, 0x01, 0xc7, 0xd0, 0x4c, 0x5d, 0xfd, 0x02, 0x7f,\n\t\t0xca, 0x28, 0x4c, 0xca, 0xa8, 0x2a, 0x7f, 0x94, 0xb4, 0x4c, 0xa5, 0xba,\n\t\t0xcf, 0xe8, 0xcc, 0xd4, 0xc2, 0xe7, 0x72, 0x1c, 0xb9, 0x72, 0x74, 0x38,\n\t\t0xc7, 0xc3, 0x3d, 0x28, 0xef, 0xb7, 0x55, 0x06, 0x2c, 0x1c, 0x75, 0x7d,\n\t\t0xd4, 0xfb, 0x83, 0x96, 0x63, 0xc9, 0x09, 0x9a, 0x08, 0x28, 0x83, 0xba,\n\t\t0x90, 0x78, 0xa1, 0x48, 0x0d, 0xb3, 0x11, 0x8c, 0x74, 0x3e, 0x94, 0xb6,\n\t\t0x3f, 0x70, 0x79, 0x44, 0xf6, 0x9b, 0xb5, 0x4b, 0xf9, 0x13, 0x45, 0xd3,\n\t\t0xa9, 0x8f, 0x20, 0xdd, 0xbc, 0xd5, 0x44, 0x85, 0xee, 0xa1, 0x32, 0xb1,\n\t\t0x99, 0xa9, 0xba, 0x84, 0x1c, 0x81, 0xc4, 0x19, 0x24, 0x8c, 0x34, 0x42,\n\t\t0x44, 0x0f, 0x0b, 0x68, 0x77, 0xe3, 0x17, 0x0c, 0x63, 0x20, 0x9a, 0x24,\n\t\t0x97, 0x3f, 0x7f, 0xfe, 0x4c, 0x76, 0xfa, 0xdc, 0xca, 0xaa, 0x21, 0x22,\n\t\t0x4a, 0xad, 0x1e, 0x15, 0x17, 0x17, 0x33, 0x71, 0x70, 0x88, 0xeb, 0xe9,\n\t\t0x45, 0xa8, 0x3f, 0xf5, 0x6c, 0xbb, 0x4b, 0x9a, 0x38, 0x5e, 0x78, 0xac,\n\t\t0x94, 0xe9, 0x2d, 0x70, 0xe7, 0xe9, 0xfe, 0xdb, 0xcc, 0xa1, 0xa7, 0xad,\n\t\t0xb9, 0x3e, 0x57, 0xe6, 0xb2, 0x27, 0xc5, 0xb8, 0x29, 0x4f, 0x78, 0xec,\n\t\t0x51, 0x56, 0x47, 0xbf, 0xbe, 0x81, 0x69, 0xac, 0x4a, 0x47, 0x92, 0xbe,\n\t\t0x1e, 0x19, 0xfd, 0xaf, 0x53, 0x72, 0x58, 0xe1, 0x35, 0xad, 0x98, 0x7b,\n\t\t0xc7, 0x59, 0x6e, 0xf2, 0xeb, 0x4e, 0xb0, 0xdc, 0x6f, 0x0c, 0xa2, 0x89,\n\t\t0x36, 0x46, 0x31, 0x13, 0x01, 0x15, 0x1a, 0x56, 0x5c, 0x75, 0xd3, 0xb1,\n\t\t0x36, 0xe7, 0x8b, 0xc1, 0x80, 0x4a, 0xda, 0xf4, 0x44, 0x80, 0x2b, 0x56,\n\t\t0xda, 0x45, 0x12, 0x5d, 0x1a, 0xd5, 0xe6, 0x75, 0x0a, 0xf3, 0x58, 0x0d,\n\t\t0xba, 0x41, 0x0f, 0xcf, 0xcf, 0x0b, 0xa3, 0x7a, 0xc6, 0x83, 0xd1, 0x8a,\n\t\t0x04, 0x4e, 0x5c, 0x45, 0xfb, 0xc8, 0x11, 0x2a, 0xb0, 0x11, 0x2a, 0xef,\n\t\t0x5f, 0xff, 0xc9, 0x8d, 0xdb, 0xd4, 0x9e, 0x04, 0x5d, 0x3e, 0xac, 0xf7,\n\t\t0x96, 0x5a, 0xaa, 0xee, 0x66, 0xf7, 0x53, 0x19, 0xdf, 0xc6, 0xf9, 0xa9,\n\t\t0x3c, 0xae, 0xf5, 0x51, 0x21, 0x54, 0xbf, 0xf5, 0x0f, 0x6f, 0x3b, 0x66,\n\t\t0xc4, 0x1b, 0xb1, 0x40, 0x67, 0x89, 0xc8, 0x1d, 0x04, 0x23, 0x72, 0x71,\n\t\t0x8f, 0xb3, 0xcb, 0xca, 0xbe, 0x1e, 0xe3, 0xa6, 0x9d, 0x5c, 0xda, 0x0b,\n\t\t0x69, 0x6e, 0x4a, 0xe7, 0x84, 0xa4, 0x31, 0x9b, 0x46, 0xe3, 0x85, 0x33,\n\t\t0x7f, 0xe2, 0x27, 0x30, 0x91, 0x02, 0x80, 0xe0, 0xfd, 0xa0, 0x65, 0x79,\n\t\t0x71, 0x49, 0x93, 0x77, 0x9c, 0x17, 0x19, 0x81, 0x21, 0x25, 0xea, 0x6f,\n\t\t0x16, 0xef, 0x87, 0x20, 0xf2, 0xac, 0x8f, 0x0e, 0x0f, 0x97, 0xf6, 0x72,\n\t\t0xd1, 0xd2, 0x1e, 0xcf, 0x85, 0x07, 0xe8, 0x54, 0xad, 0x7a, 0x3f, 0xb4,\n\t\t0xa2, 0xaf, 0xd1, 0xc2, 0xab, 0xed, 0x51, 0xba, 0x63, 0xe4, 0x04, 0xbe,\n\t\t0x0e, 0x31, 0x92, 0x1e, 0x9a, 0x50, 0xca, 0xe9, 0xb6, 0x87, 0x08, 0x09,\n\t\t0xca, 0x47, 0x13, 0x4e, 0xea, 0x8e, 0x6b, 0x7f, 0x9b, 0x61, 0xcb, 0xe6,\n\t\t0xf3, 0x5b, 0xe5, 0xcc, 0xbe, 0x16, 0xa5, 0xf4, 0xfa, 0x32, 0x17, 0x37,\n\t\t0x1f, 0x5c, 0x0c, 0x09, 0x48, 0xfe, 0xc8, 0x66, 0xef, 0x77, 0xd9, 0xd7,\n\t\t0xeb, 0x1a, 0x91, 0x78, 0x96, 0x3f, 0x2c, 0xc6, 0x6b, 0x45, 0x41, 0x9c,\n\t\t0x77, 0x36, 0x7a, 0xa1, 0x08, 0x7d, 0xbd, 0xe9, 0x85, 0xcc, 0x70, 0x52,\n\t\t0x52, 0x81, 0xc9, 0x62, 0xa5, 0x2a, 0x1f, 0x85, 0xcf, 0x62, 0xbd, 0xc8,\n\t\t0x94, 0x85, 0x3b, 0x6a, 0x58, 0xab, 0x31, 0xd7, 0xba, 0x83, 0x07, 0x8b,\n\t\t0x4e, 0xd0, 0x8d, 0xd0, 0x41, 0xa7, 0xcb, 0xe3, 0x6e, 0x7c, 0x15, 0x2e,\n\t\t0xb0, 0xf8, 0x36, 0x07, 0x59, 0xef, 0xc8, 0x30, 0x0c, 0xab, 0xd1, 0xe0,\n\t\t0xc1, 0xd8, 0x78, 0xc6, 0x0f, 0x9b, 0x5e, 0xac, 0x7a, 0x8d, 0xf1, 0x6b,\n\t\t0x26, 0x3e, 0x43, 0x1f, 0x1e, 0x64, 0x50, 0x1b, 0x4c, 0x7e, 0x9f, 0x99,\n\t\t0xeb, 0x04, 0x88, 0x1f, 0x08, 0x94, 0xce, 0xb9, 0xde, 0xb3, 0xe9, 0xa8,\n\t\t0xdd, 0x01, 0x55, 0xa8, 0xaf, 0x40, 0xad, 0xe4, 0xa5, 0xc6, 0x61, 0x36,\n\t\t0x96, 0x8b, 0xfe, 0x72, 0xd1, 0x85, 0x66, 0x60, 0x66, 0xa3, 0x38, 0xb1,\n\t\t0x8c, 0x87, 0x53, 0x9a, 0xc6, 0x6d, 0xb9, 0x0d, 0x48, 0xcf, 0x21, 0xf0,\n\t\t0xc8, 0xe9, 0x6a, 0x7d, 0x41, 0xeb, 0xa5, 0x3f, 0x62, 0x25, 0x5e, 0x32,\n\t\t0xd9, 0x7c, 0x2d, 0x81, 0x61, 0x05, 0x27, 0x5f, 0x53, 0xf2, 0x7f, 0x4b,\n\t\t0x29, 0x0f, 0x21, 0x43, 0xf0, 0x12, 0x20, 0x79, 0x37, 0xb8, 0xf3, 0x68,\n\t\t0xd0, 0xe1, 0x80, 0x43, 0x7b, 0x92, 0xf9, 0x25, 0x98, 0x1d, 0xde, 0xb4,\n\t\t0x56, 0xa2, 0x22, 0xbe, 0x79, 0x2b, 0xe1, 0xe3, 0x54, 0xbf, 0xee, 0xce,\n\t\t0xcd, 0x21, 0x0f, 0xd4, 0x2c, 0xc5, 0xee, 0xbc, 0x7d, 0x3c, 0x77, 0x34,\n\t\t0x0b, 0xd4, 0x9d, 0x94, 0x95, 0xdd, 0xe9, 0x5c, 0xa2, 0xf4, 0xe8, 0xe8,\n\t\t0x6d, 0x22, 0xff, 0x35, 0xb2, 0x77, 0x31, 0x3c, 0x5b, 0x83, 0xc9, 0xf8,\n\t\t0x47, 0x01, 0x32, 0xa8, 0x9c, 0x5e, 0x6d, 0xaf, 0xd8, 0x72, 0x3b, 0x3a,\n\t\t0x3a, 0x9a, 0xc6, 0x94, 0xc3, 0x9b, 0x94, 0x94, 0xd4, 0xc0, 0xc8, 0x28,\n\t\t0x30, 0x3f, 0x9f, 0xb4, 0xb2, 0x7a, 0xb5, 0x54, 0xb9, 0x04, 0xd1, 0x63,\n\t\t0x1f, 0xb4, 0xb1, 0xb5, 0x15, 0xc8, 0xeb, 0x76, 0x06, 0xa2, 0x7e, 0x5c,\n\t\t0x62, 0xdd, 0xc9, 0xe1, 0x76, 0x4b, 0xd9, 0x03, 0x4f, 0xb2, 0xa2, 0x0f,\n\t\t0xfd, 0xd5, 0x85, 0x03, 0x89, 0x0a, 0x7e, 0xef, 0x4e, 0x0c, 0x39, 0x1e,\n\t\t0x19, 0xdf, 0xea, 0x60, 0x62, 0xbd, 0x6e, 0xcd, 0xc8, 0xfa, 0xac, 0xea,\n\t\t0x00, 0x01, 0x29, 0x1c, 0xf5, 0x13, 0xd3, 0x33, 0x61, 0x30, 0x62, 0x60,\n\t\t0x9b, 0xdb, 0x0f, 0xa1, 0x90, 0x42, 0xdd, 0x64, 0x4c, 0xf7, 0xf3, 0x69,\n\t\t0xad, 0xcb, 0x9c, 0x8e, 0xf7, 0xcb, 0x19, 0xd8, 0x3e, 0xfd, 0x77, 0x54,\n\t\t0x07, 0x5f, 0x47, 0x9b, 0x1b, 0xa8, 0x3c, 0x3a, 0x3e, 0x7e, 0x74, 0x57,\n\t\t0xab, 0xda, 0xcb, 0x96, 0x5a, 0x43, 0x5b, 0x7b, 0xfb, 0xb8, 0xba, 0x6b,\n\t\t0xfe, 0xa9, 0x95, 0xd5, 0x74, 0xac, 0x3b, 0x04, 0x09, 0xd7, 0xc0, 0xc4,\n\t\t0x44, 0x75, 0x53, 0x53, 0x13, 0xca, 0x96, 0x94, 0x8d, 0x65, 0x11, 0x93,\n\t\t0x47, 0x21, 0xff, 0xf8, 0x8a, 0x1b, 0x73, 0xb2, 0xc4, 0x6b, 0xa8, 0xcc,\n\t\t0x94, 0x49, 0xa7, 0x6a, 0xbb, 0xf7, 0xe4, 0x44, 0xf0, 0x90, 0x86, 0x12,\n\t\t0x1d, 0x5e, 0x2b, 0x28, 0x73, 0x32, 0x83, 0x09, 0x4b, 0xb5, 0x46, 0x8e,\n\t\t0x72, 0x34, 0x47, 0x7f, 0x89, 0x95, 0x80, 0xd6, 0x29, 0x1a, 0x15, 0xad,\n\t\t0xa7, 0x70, 0xb3, 0x83, 0xb6, 0x3e, 0xc9, 0xfa, 0xa8, 0xb9, 0x8d, 0xcd,\n\t\t0xd4, 0xc5, 0x28, 0xfa, 0xff, 0xee, 0x02, 0x84, 0x09, 0x75, 0xab, 0xb3,\n\t\t0x9b, 0x7d, 0xa5, 0xa6, 0x16, 0xd2, 0xd1, 0x21, 0xe4, 0xe3, 0xe7, 0xbf,\n\t\t0xad, 0x48, 0xb3, 0x4d, 0x65, 0x36, 0x86, 0xe5, 0x22, 0x44, 0xdd, 0x1b,\n\t\t0xcf, 0x08, 0x7b, 0x79, 0x69, 0xbd, 0xa5, 0x6e, 0xaa, 0xad, 0xed, 0xc9,\n\t\t0xe6, 0xf7, 0x9a, 0x6c, 0xb2, 0xd3, 0xa7, 0xb7, 0x28, 0xf1, 0x7b, 0xe0,\n\t\t0x63, 0x98, 0xa7, 0xcb, 0x46, 0xdd, 0xd7, 0x6d, 0x5c, 0x7c, 0xdb, 0x47,\n\t\t0x68, 0x30, 0xc3, 0xa2, 0x88, 0xfe, 0x35, 0xba, 0x7d, 0x77, 0xfc, 0x9d,\n\t\t0x5d, 0x04, 0xf3, 0xe3, 0xd9, 0xd4, 0x90, 0x01, 0xef, 0x3f, 0x42, 0xbf,\n\t\t0xbe, 0xd4, 0xfc, 0x31, 0x0b, 0x7a, 0x76, 0x1e, 0xe8, 0xc9, 0x11, 0x18,\n\t\t0xfa, 0xb7, 0x0d, 0x3b, 0xbf, 0x94, 0x0a, 0xe0, 0x76, 0x20, 0xe9, 0xa7,\n\t\t0x48, 0xd1, 0xa3, 0x5b, 0x36, 0x51, 0x23, 0x04, 0x22, 0x41, 0x79, 0x96,\n\t\t0xf0, 0x44, 0x72, 0x59, 0xa6, 0x4f, 0x88, 0xb3, 0x83, 0x5f, 0xbf, 0x7e,\n\t\t0xf5, 0x9c, 0x16, 0xbd, 0x07, 0xf8, 0x16, 0xc8, 0xf0, 0xd6, 0xe3, 0xf5,\n\t\t0xbe, 0x46, 0x9d, 0x29, 0x8a, 0xb5, 0x0d, 0xfb, 0xb1, 0xd9, 0xf9, 0xce,\n\t\t0x4e, 0x70, 0x14, 0x2e, 0x63, 0xe7, 0x54, 0x6a, 0xca, 0x6b, 0x53, 0x22,\n\t\t0x6d, 0xe2, 0xcf, 0xe1, 0x5d, 0xfc, 0x53, 0xf5, 0x9c, 0x1a, 0x0d, 0xba,\n\t\t0xb1, 0x6c, 0x36, 0x68, 0x81, 0x4a, 0xdd, 0xb9, 0x1d, 0x64, 0xb2, 0xbb,\n\t\t0x6d, 0x47, 0x1f, 0xbe, 0x9b, 0x02, 0xec, 0xbc, 0x52, 0x61, 0xb9, 0x03,\n\t\t0x59, 0xf4, 0x48, 0x47, 0x47, 0xcc, 0x28, 0x63, 0x5f, 0x68, 0x73, 0x76,\n\t\t0xe2, 0xd6, 0x90, 0x34, 0x04, 0x81, 0x1c, 0x4e, 0x04, 0x12, 0xfc, 0x9d,\n\t\t0xa4, 0x7d, 0x5c, 0x9c, 0x6d, 0x5b, 0x67, 0x42, 0x22, 0xbe, 0x58, 0x09,\n\t\t0x23, 0x29, 0xcf, 0xef, 0x9c, 0x2c, 0xe9, 0xe2, 0xa6, 0xb6, 0x10, 0x7f,\n\t\t0x9c, 0xae, 0x7a, 0x8c, 0x6a, 0x0d, 0x5e, 0x46, 0x7c, 0x8e, 0x36, 0xf7,\n\t\t0xc2, 0xff, 0xa1, 0x65, 0x7f, 0xe9, 0xaa, 0x01, 0x03, 0xd0, 0xb1, 0x42,\n\t\t0x78, 0x3a, 0x35, 0xd2, 0x00, 0x93, 0x49, 0x68, 0xbd, 0x79, 0xb6, 0x4c,\n\t\t0x08, 0x61, 0xa3, 0x4d, 0x50, 0x9f, 0x81, 0x0d, 0x0a, 0x0c, 0x5a, 0x36,\n\t\t0x7a, 0xef, 0xc2, 0x55, 0xdd, 0xfe, 0xef, 0x3f, 0x49, 0xc0, 0xba, 0x1c,\n\t\t0x29, 0x92, 0xad, 0x1a, 0x9b, 0x98, 0x84, 0x88, 0x45, 0xe1, 0x6c, 0x66,\n\t\t0xb9, 0xad, 0xf5, 0x00, 0x39, 0x73, 0xd8, 0xe8, 0x86, 0xe8, 0xef, 0xef,\n\t\t0x17, 0xa2, 0xc3, 0x51, 0xd7, 0x86, 0x6d, 0x70, 0x39, 0x9e, 0x07, 0xf3,\n\t\t0xba, 0xd2, 0x99, 0x4e, 0x64, 0xeb, 0x16, 0x30, 0x42, 0x15, 0x7d, 0xb5,\n\t\t0xa2, 0x60, 0x9f, 0x23, 0x90, 0xd2, 0x07, 0x45, 0xe6, 0x33, 0x79, 0x5d,\n\t\t0xa1, 0x7b, 0xd7, 0xbc, 0x78, 0x51, 0xab, 0xa4, 0xa1, 0xb1, 0x0d, 0x30,\n\t\t0x69, 0xe6, 0x34, 0x58, 0xd4, 0x39, 0x28, 0x59, 0x9f, 0x10, 0x6e, 0xb9,\n\t\t0x52, 0x1d, 0x60, 0xf5, 0xc5, 0x70, 0x90, 0x98, 0x7f, 0x66, 0xac, 0x3e,\n\t\t0xd7, 0x94, 0xcf, 0xae, 0x88, 0xca, 0x3d, 0xbc, 0x41, 0x41, 0x26, 0x53,\n\t\t0x2c, 0x0f, 0xc5, 0x38, 0x38, 0x8f, 0xd8, 0x75, 0xa2, 0xec, 0x1e, 0xce,\n\t\t0x33, 0x2d, 0x61, 0x4c, 0xd3, 0x09, 0xb8, 0x19, 0xd3, 0x21, 0x2f, 0x32,\n\t\t0xdd, 0xba, 0x48, 0xa3, 0xe5, 0xf2, 0xda, 0xcd, 0x9e, 0xbf, 0x0a, 0xf1,\n\t\t0xe0, 0x63, 0xf0, 0xd6, 0x6e, 0x23, 0xe5, 0x9a, 0xc4, 0x85, 0xf2, 0x84,\n\t\t0xcd, 0x4b, 0xab, 0x74, 0x2d, 0x4b, 0xb6, 0x48, 0xe0, 0x9d, 0x9a, 0x60,\n\t\t0x3a, 0x2d, 0x98, 0xf6, 0xaf, 0xba, 0xb8, 0xb0, 0x27, 0xe4, 0xf7, 0x54,\n\t\t0x89, 0xc3, 0x3f, 0x84, 0x0b, 0x35, 0xbc, 0x78, 0x79, 0x74, 0xd2, 0x69,\n\t\t0x71, 0x84, 0x71, 0x3b, 0x5b, 0x11, 0x36, 0x32, 0xca, 0x3f, 0x3a, 0x22,\n\t\t0xa1, 0xa2, 0x82, 0xf3, 0x79, 0xbe, 0x1b, 0xf8, 0x49, 0xf2, 0x6d, 0x36,\n\t\t0x72, 0x40, 0x45, 0x42, 0x4f, 0x8f, 0xa8, 0xa2, 0xb2, 0x52, 0xf5, 0x50,\n\t\t0xbf, 0xad, 0x53, 0x33, 0xba, 0x31, 0xbb, 0xaa, 0x55, 0x49, 0x9f, 0x6a,\n\t\t0xa5, 0xf9, 0x1d, 0x5c, 0xee, 0xf7, 0xf0, 0xf9, 0xd2, 0xc4, 0x33, 0xd7,\n\t\t0xa9, 0x85, 0xde, 0x95, 0x06, 0x2b, 0x79, 0x06, 0x6f, 0x8f, 0x84, 0xf9,\n\t\t0x08, 0x3a, 0x4b, 0x18, 0xd9, 0x13, 0x53, 0xf8, 0xcb, 0xc1, 0x39, 0x5d,\n\t\t0xbc, 0xce, 0xea, 0x20, 0xd3, 0xa3, 0xe5, 0x9b, 0x1c, 0x43, 0x58, 0x4c,\n\t\t0xcb, 0x8c, 0xc4, 0x46, 0x65, 0x4f, 0x87, 0x25, 0x96, 0xec, 0x0b, 0x0b,\n\t\t0x19, 0x9c, 0xf6, 0x3d, 0xe1, 0x40, 0xda, 0xa8, 0x9b, 0x8a, 0xdb, 0x7f,\n\t\t0xad, 0xc1, 0xa3, 0x9b, 0xb9, 0x4e, 0xcf, 0x1c, 0x07, 0xb8, 0x18, 0xe1,\n\t\t0x6f, 0x24, 0x10, 0x1b, 0x35, 0x28, 0x64, 0x4c, 0xf2, 0xa5, 0x85, 0x53,\n\t\t0x6e, 0xd3, 0x46, 0x3f, 0xf6, 0x93, 0x13, 0xe9, 0x1b, 0x9a, 0x9a, 0x24,\n\t\t0xb4, 0xb4, 0x96, 0x09, 0xd6, 0x48, 0xdb, 0x23, 0x32, 0x38, 0xed, 0x48,\n\t\t0xa9, 0xa9, 0x25, 0xd9, 0xcf, 0x16, 0xc8, 0x40, 0x56, 0x38, 0x13, 0x93,\n\t\t0x05, 0xe2, 0xe9, 0xf1, 0xfa, 0x0a, 0xd1, 0xf1, 0xe7, 0x3e, 0x01, 0x63,\n\t\t0x99, 0xd3, 0xa9, 0x50, 0x38, 0xa3, 0x9b, 0x68, 0x7e, 0xef, 0xfc, 0xdb,\n\t\t0xe7, 0x6b, 0x28, 0x14, 0xe2, 0x59, 0xb9, 0x98, 0xc8, 0xdb, 0x33, 0xf1,\n\t\t0xb9, 0xca, 0xc1, 0xbd, 0xae, 0xac, 0xe4, 0xbf, 0x08, 0xde, 0x59, 0xa2,\n\t\t0x25, 0xe9, 0x2d, 0xcb, 0x8b, 0xea, 0xa0, 0x3a, 0x35, 0x39, 0x90, 0x7c,\n\t\t0x5a, 0xdd, 0xdc, 0x0b, 0x98, 0xd5, 0xa9, 0x93, 0xb8, 0x9c, 0x9f, 0x68,\n\t\t0x04, 0xde, 0x2c, 0x09, 0xce, 0x06, 0xfa, 0xe7, 0xb4, 0x6f, 0x19, 0xd2,\n\t\t0x8b, 0x2f, 0xb7, 0x4c, 0x60, 0xff, 0xea, 0xb6, 0x84, 0x29, 0xa7, 0xd8,\n\t\t0x06, 0x8d, 0x9b, 0x16, 0x24, 0xd5, 0x05, 0xad, 0x91, 0x9d, 0x69, 0xd2,\n\t\t0x21, 0xd6, 0x3a, 0x30, 0x5e, 0xd0, 0xe5, 0x15, 0xda, 0xb9, 0x3b, 0x38,\n\t\t0x30, 0x0f, 0xc6, 0x11, 0xa3, 0x59, 0x59, 0x59, 0x75, 0x1c, 0xcd, 0x4d,\n\t\t0x2e, 0x75, 0x78, 0x71, 0xfe, 0xcd, 0xe4, 0x2e, 0xc0, 0xbf, 0x3f, 0xfe,\n\t\t0xe4, 0x1f, 0x6b, 0x43, 0xb0, 0x86, 0x5d, 0xff, 0x29, 0x07, 0x8e, 0x62,\n\t\t0x7c, 0xe3, 0x69, 0x75, 0x1a, 0x1f, 0x06, 0x59, 0x79, 0x27, 0x23, 0xc1,\n\t\t0x49, 0x31, 0x5f, 0x65, 0x4f, 0xec, 0x48, 0x91, 0x5d, 0x84, 0x2c, 0x74,\n\t\t0x25, 0x8f, 0xd3, 0x68, 0x65, 0x35, 0x65, 0x63, 0x20, 0xca, 0x47, 0x5a,\n\t\t0x34, 0xff, 0xf7, 0x3b, 0x44, 0xfd, 0x11, 0xe9, 0xf4, 0xac, 0x68, 0x78,\n\t\t0x9a, 0x31, 0x9c, 0xc1, 0x58, 0x6e, 0xb6, 0x9d, 0xb5, 0xa7, 0x30, 0x2b,\n\t\t0x32, 0xc3, 0xaa, 0xbb, 0x7f, 0xa5, 0x57, 0x1c, 0xc9, 0x9e, 0x85, 0x51,\n\t\t0x83, 0x93, 0xae, 0x8e, 0x0e, 0x3a, 0x0e, 0x0e, 0xac, 0xbc, 0xbc, 0x7c,\n\t\t0xbd, 0xf9, 0x14, 0xa4, 0x63, 0x0b, 0x61, 0x69, 0x69, 0x29, 0x3c, 0x3c,\n\t\t0x3c, 0x28, 0x6a, 0x40, 0x44, 0x4e, 0xce, 0x42, 0x18, 0x27, 0x4d, 0xa6,\n\t\t0x18, 0xd1, 0xf7, 0x97, 0x54, 0x91, 0xfb, 0xdd, 0x09, 0xde, 0xf4, 0xcc,\n\t\t0x4c, 0x7c, 0x5a, 0x5a, 0xc4, 0xe2, 0xa2, 0x86, 0x24, 0x39, 0x46, 0x43,\n\t\t0x99, 0xb6, 0xd0, 0xf7, 0xdd, 0xca, 0x8f, 0x43, 0x09, 0x3b, 0xbf, 0x9c,\n\t\t0xc1, 0x5f, 0x4b, 0x76, 0x79, 0x4e, 0xbc, 0x8c, 0x07, 0xac, 0x62, 0x4b,\n\t\t0x0b, 0x33, 0x28, 0x43, 0x8c, 0x2b, 0x2a, 0x31, 0xd5, 0x3a, 0x2d, 0x90,\n\t\t0x68, 0x71, 0xa1, 0x66, 0xde, 0xc8, 0x11, 0xc1, 0xc1, 0xd0, 0x0d, 0xb5,\n\t\t0x71, 0x12, 0x7d, 0xf4, 0xe5, 0xbc, 0x0c, 0xf9, 0x54, 0x55, 0x6b, 0xb1,\n\t\t0x3d, 0x31, 0xcf, 0xb5, 0x34, 0x69, 0x32, 0x77, 0x5b, 0x98, 0x0c, 0x0b,\n\t\t0xfb, 0xc4, 0x2d, 0x7c, 0x4f, 0x11, 0x44, 0xaa, 0x64, 0x6c, 0x4a, 0xe1,\n\t\t0xa3, 0x1d, 0xf1, 0x5b, 0x5b, 0x57, 0x09, 0x97, 0x51, 0xb8, 0x39, 0xde,\n\t\t0x7d, 0x4c, 0xdc, 0xac, 0x8a, 0xc5, 0x49, 0xff, 0xfd, 0xec, 0xd4, 0x65,\n\t\t0xb6, 0x5b, 0xb6, 0xd7, 0x48, 0x55, 0x5d, 0xfb, 0x7c, 0xc4, 0x1e, 0x22,\n\t\t0x46, 0xfa, 0x72, 0x7b, 0x4e, 0x41, 0xc8, 0xe7, 0x82, 0xc7, 0xa8, 0xa7,\n\t\t0xa6, 0xcb, 0x35, 0x30, 0x3d, 0x8d, 0x01, 0xd8, 0xea, 0xee, 0x60, 0x04,\n\t\t0x4c, 0x40, 0x2e, 0xf3, 0xd9, 0x5f, 0x9d, 0x9c, 0x9c, 0x1c, 0x4e, 0x16,\n\t\t0x99, 0x09, 0x79, 0x9c, 0xe1, 0x87, 0xe2, 0x88, 0xd5, 0x8f, 0x73, 0x50,\n\t\t0x12, 0xa1, 0xbf, 0x84, 0xdc, 0x1f, 0x05, 0xa3, 0x15, 0x23, 0x87, 0x74,\n\t\t0xc4, 0xf8, 0xd2, 0x2c, 0xf0, 0x4b, 0x7b, 0x47, 0xc4, 0xd7, 0x75, 0x2a,\n\t\t0xc4, 0xc0, 0xa1, 0xe0, 0x07, 0x93, 0x49, 0xc4, 0x1e, 0x88, 0xa5, 0x0c,\n\t\t0xfa, 0x2b, 0x95, 0x06, 0x37, 0x35, 0x71, 0x66, 0xf3, 0x7d, 0x6d, 0x70,\n\t\t0x19, 0xf2, 0x7d, 0xc4, 0xa0, 0x4f, 0x5f, 0x3a, 0x50, 0x2c, 0x6f, 0x25,\n\t\t0x49, 0x1a, 0xfe, 0xd8, 0xde, 0x77, 0xb8, 0x95, 0x8b, 0x96, 0x12, 0x57,\n\t\t0x1c, 0x74, 0xc3, 0x1b, 0xe4, 0x00, 0x49, 0x7e, 0xa9, 0x72, 0x0b, 0x54,\n\t\t0x23, 0x81, 0xed, 0xf8, 0xb4, 0x75, 0xda, 0x11, 0xf6, 0xfa, 0x70, 0xb9,\n\t\t0x22, 0x98, 0x38, 0x32, 0x16, 0x5f, 0x6d, 0xc2, 0xa1, 0xb6, 0xf7, 0x70,\n\t\t0xd2, 0x17, 0x71, 0x40, 0xb4, 0xa1, 0x5c, 0xe9, 0xa5, 0x4b, 0x17, 0x6f,\n\t\t0x74, 0x1f, 0x50, 0xb7, 0xe8, 0x73, 0x61, 0x1d, 0x92, 0xbe, 0x2b, 0x34,\n\t\t0xfc, 0xb5, 0x5d, 0xb9, 0x44, 0xee, 0xe2, 0xee, 0x4e, 0x5c, 0x41, 0x01,\n\t\t0xbd, 0xd5, 0xed, 0x1c, 0x55, 0x59, 0x79, 0x46, 0x4a, 0x6d, 0x9a, 0x08,\n\t\t0x80, 0x29, 0x2a, 0xf9, 0xec, 0xfe, 0x1c, 0xbf, 0xb7, 0x08, 0x28, 0x38,\n\t\t0x54, 0x21, 0x4a, 0x5a, 0x59, 0x17, 0x4c, 0xc4, 0x07, 0x30, 0x7b, 0x0d,\n\t\t0x5c, 0x71, 0xf4, 0x89, 0xba, 0x09, 0x92, 0xb4, 0xae, 0xf0, 0x0c, 0x9b,\n\t\t0xc8, 0xba, 0x56, 0x70, 0x7b, 0xe0, 0x2f, 0x1a, 0x4b, 0x2c, 0xb1, 0xcd,\n\t\t0x81, 0x28, 0x5c, 0x7b, 0x67, 0xe7, 0x0a, 0x75, 0x7e, 0x7c, 0x24, 0x80,\n\t\t0x47, 0x45, 0x00, 0x26, 0x56, 0x31, 0x06, 0xb4, 0x37, 0x73, 0xed, 0x36,\n\t\t0x49, 0x58, 0x3d, 0xb2, 0x1c, 0xe1, 0xeb, 0xa1, 0x26, 0x98, 0x65, 0xbb,\n\t\t0x8e, 0x25, 0xfe, 0x1c, 0x94, 0x72, 0x7c, 0x95, 0xa6, 0x93, 0xfd, 0x20,\n\t\t0xc6, 0x5e, 0xfd, 0x09, 0xbe, 0xe1, 0xa3, 0x36, 0x58, 0x5e, 0x5e, 0x5c,\n\t\t0x49, 0x39, 0x5c, 0x87, 0x61, 0x8b, 0x58, 0x6c, 0x9e, 0xac, 0xd2, 0xaa,\n\t\t0x4b, 0x08, 0x7c, 0xb5, 0xf8, 0x71, 0xd7, 0xce, 0xfe, 0xce, 0xf9, 0x72,\n\t\t0xe9, 0xb5, 0x7c, 0x8e, 0x41, 0x13, 0x7c, 0x87, 0x30, 0x63, 0x58, 0x0f,\n\t\t0x51, 0x29, 0xce, 0x7e, 0x1e, 0xdd, 0x75, 0xac, 0xb5, 0x5e, 0x62, 0x39,\n\t\t0x59, 0x6d, 0xc3, 0xb5, 0xeb, 0xb8, 0xc5, 0xf1, 0xbc, 0x3b, 0x41, 0x40,\n\t\t0x43, 0x43, 0xcb, 0xe2, 0x3c, 0x77, 0xef, 0x68, 0x4a, 0x49, 0xc1, 0x15,\n\t\t0x8f, 0x25, 0x8c, 0xc0, 0x63, 0x35, 0xcd, 0xad, 0xa9, 0x41, 0x57, 0x54,\n\t\t0x54, 0xcc, 0xb5, 0xc0, 0x77, 0x0c, 0xc1, 0xb8, 0x27, 0xe6, 0x1f, 0x1a,\n\t\t0x8e, 0x6a, 0xda, 0xf8, 0x37, 0x88, 0x3d, 0x6e, 0x4d, 0xab, 0x46, 0x34,\n\t\t0x83, 0x0d, 0xc4, 0x3b, 0x1f, 0x44, 0x65, 0x49, 0x14, 0xed, 0xef, 0x0f,\n\t\t0xaa, 0x07, 0x4c, 0xd4, 0x9a, 0xb3, 0xb9, 0xcc, 0xc9, 0x4a, 0x0b, 0x26,\n\t\t0x2e, 0x83, 0x8e, 0x42, 0x8c, 0x76, 0x1b, 0xb7, 0x91, 0x46, 0x97, 0xed,\n\t\t0x93, 0xb2, 0xa4, 0x74, 0x6a, 0x1a, 0x7c, 0x7c, 0x5a, 0x42, 0xb5, 0xab,\n\t\t0x89, 0xd8, 0x8c, 0x18, 0x3f, 0x00, 0xee, 0x08, 0x52, 0x26, 0x8d, 0x67,\n\t\t0xff, 0x96, 0x3e, 0xa5, 0x23, 0xf7, 0xe7, 0x72, 0x92, 0xbe, 0xbc, 0xca,\n\t\t0xd7, 0x18, 0x1b, 0xed, 0x55, 0xa9, 0x53, 0x2b, 0xa9, 0xcc, 0xad, 0x8b,\n\t\t0xa3, 0xc2, 0x0f, 0xa6, 0x0f, 0xb0, 0x1a, 0xd8, 0x5a, 0xea, 0xec, 0x7a,\n\t\t0xb5, 0x3c, 0x8a, 0x2d, 0xde, 0x1c, 0x0b, 0x57, 0xac, 0xb6, 0x56, 0x4f,\n\t\t0x2b, 0x7b, 0xd8, 0xdb, 0x33, 0x7d, 0xec, 0x27, 0x0c, 0x27, 0x50, 0x05,\n\t\t0x8d, 0x56, 0xbe, 0xfd, 0xd5, 0x5d, 0x48, 0x4d, 0x4f, 0x07, 0xe6, 0x2a,\n\t\t0xe4, 0xf6, 0x60, 0xcc, 0x37, 0x60, 0xee, 0x64, 0x0b, 0xf8, 0x20, 0x82,\n\t\t0xa8, 0x31, 0x22, 0x1c, 0x6e, 0x4e, 0xd8, 0xed, 0x9b, 0x09, 0x1f, 0xbc,\n\t\t0x1a, 0x2a, 0x9a, 0x94, 0x75, 0xe5, 0x7c, 0x49, 0xaa, 0x56, 0x18, 0x5c,\n\t\t0x4a, 0xb4, 0xb4, 0xb4, 0x8c, 0x2e, 0x36, 0x7a, 0x6e, 0xff, 0xb8, 0x19,\n\t\t0x6f, 0x01, 0xa8, 0x93, 0x2a, 0xe0, 0xd3, 0x5a, 0x16, 0x5c, 0x15, 0x51,\n\t\t0x0b, 0x2a, 0xc7, 0x95, 0xb5, 0x62, 0x8b, 0xf1, 0x5f, 0x7e, 0xae, 0xef,\n\t\t0x05, 0x44, 0x45, 0x41, 0x81, 0xda, 0x93, 0xc2, 0x90, 0x3a, 0x1d, 0xc7,\n\t\t0x05, 0x4a, 0xeb, 0x05, 0x7a, 0x27, 0xa1, 0xb1, 0x0c, 0xba, 0x72, 0xb2,\n\t\t0xc6, 0x47, 0x33, 0x98, 0xa5, 0xb9, 0xe6, 0xd1, 0x7b, 0x9e, 0xa1, 0x94,\n\t\t0xcd, 0x77, 0xc5, 0x6a, 0x78, 0xb1, 0xa7, 0xa3, 0xe6, 0x20, 0x6b, 0xca,\n\t\t0xd2, 0x65, 0x68, 0xb4, 0x97, 0x09, 0xf9, 0xaf, 0x4e, 0x67, 0xd4, 0xbb,\n\t\t0xcd, 0x72, 0x50, 0xa0, 0x14, 0x72, 0x4b, 0x50, 0x10, 0x14, 0x2a, 0x11,\n\t\t0xdf, 0xef, 0x64, 0xf1, 0x1f, 0x92, 0x4c, 0xc8, 0x41, 0x40, 0xf5, 0x19,\n\t\t0xac, 0xb5, 0x7b, 0xb8, 0xbf, 0xb5, 0xd7, 0x4b, 0xb4, 0x14, 0xb5, 0x20,\n\t\t0x54, 0xd0, 0x8d, 0x31, 0x19, 0x6a, 0x80, 0x43, 0x6f, 0xe7, 0x4e, 0x11,\n\t\t0x18, 0x29, 0xe8, 0x09, 0x82, 0x8a, 0xfd, 0xca, 0x68, 0x2a, 0xb6, 0x4e,\n\t\t0x4e, 0xa2, 0x1f, 0x1e, 0x1e, 0x60, 0x95, 0x91, 0x07, 0x14, 0x16, 0xff,\n\t\t0x98, 0x20, 0x7d, 0x6c, 0x0e, 0xe0, 0xcb, 0x13, 0xae, 0x11, 0x20, 0x99,\n\t\t0x46, 0x57, 0xec, 0xc5, 0x84, 0x4a, 0x8c, 0xcd, 0x88, 0xca, 0x68, 0x36,\n\t\t0xa3, 0xfe, 0x61, 0xc1, 0x23, 0x25, 0x8c, 0xf5, 0x21, 0x17, 0xf3, 0x08,\n\t\t0x1e, 0xd9, 0x8d, 0x0f, 0xd5, 0x47, 0x8d, 0x33, 0xb8, 0x00, 0x80, 0x80,\n\t\t0xcc, 0x7f, 0xc0, 0xd1, 0x15, 0x16, 0x11, 0x8d, 0x16, 0xab, 0x74, 0x93,\n\t\t0xc2, 0x18, 0x47, 0xc0, 0xc3, 0x8e, 0xf0, 0x03, 0xb4, 0xa5, 0x8c, 0xe5,\n\t\t0x58, 0x91, 0x1b, 0xdf, 0x3d, 0x20, 0xcb, 0x39, 0xde, 0x51, 0x2d, 0x28,\n\t\t0x76, 0xd5, 0x83, 0x82, 0x82, 0x1c, 0x00, 0xc3, 0x17, 0x54, 0x25, 0x2f,\n\t\t0xa7, 0x88, 0x05, 0x0c, 0x69, 0x66, 0x9f, 0x27, 0x67, 0x60, 0x54, 0x12,\n\t\t0x70, 0xda, 0x0a, 0x95, 0xaa, 0x88, 0x90, 0x26, 0x91, 0x70, 0x76, 0xa1,\n\t\t0xe3, 0x56, 0x0b, 0x0a, 0x49, 0x9b, 0xc1, 0xd5, 0x3b, 0x5a, 0x54, 0xb1,\n\t\t0x7e, 0x1e, 0x93, 0x09, 0x6e, 0x76, 0xde, 0x0e, 0xa0, 0x59, 0xe7, 0x12,\n\t\t0x14, 0x24, 0xd6, 0x6d, 0x73, 0x0d, 0x69, 0x6b, 0x6b, 0xfb, 0x7b, 0x67,\n\t\t0x1d, 0xed, 0x7d, 0x39, 0x80, 0x5b, 0x66, 0xc0, 0x85, 0x23, 0xb6, 0x79,\n\t\t0xed, 0x91, 0xb0, 0x0e, 0x6e, 0x5e, 0x9a, 0xac, 0x69, 0x68, 0x04, 0x0d,\n\t\t0xe4, 0xdb, 0x6f, 0xbf, 0x19, 0x27, 0x45, 0x17, 0x47, 0x65, 0x7d, 0x95,\n\t\t0x8a, 0xef, 0x61, 0x0a, 0xe1, 0xbc, 0xf9, 0x8d, 0x9f, 0x17, 0x2f, 0x14,\n\t\t0xfb, 0x09, 0x85, 0x90, 0x8c, 0xec, 0x1d, 0x82, 0x2d, 0xcb, 0x33, 0xc3,\n\t\t0xd0, 0x31, 0x28, 0xe0, 0xd7, 0x97, 0xda, 0x24, 0xa4, 0x12, 0x23, 0x67,\n\t\t0xf7, 0x38, 0x9a, 0xd5, 0xbf, 0x03, 0x46, 0x08, 0x02, 0xcf, 0x7b, 0xea,\n\t\t0xd6, 0x6f, 0xa7, 0x0a, 0x21, 0xbf, 0xb2, 0x00, 0xdc, 0xfe, 0x78, 0xff,\n\t\t0xbf, 0x39, 0x82, 0x71, 0x40, 0x0e, 0x0e, 0xdf, 0x18, 0x73, 0x61, 0x64,\n\t\t0x64, 0x64, 0x6a, 0x1c, 0x77, 0xa5, 0x56, 0x3a, 0x7d, 0x08, 0x20, 0x20,\n\t\t0x20, 0x68, 0xb8, 0xfb, 0x98, 0x34, 0xde, 0x6e, 0xab, 0x9b, 0xed, 0x75,\n\t\t0x9b, 0x6c, 0x68, 0xbd, 0x12, 0x69, 0x93, 0x9e, 0x4f, 0x9b, 0xd6, 0x8f,\n\t\t0x9c, 0xbb, 0x06, 0xc5, 0x1d, 0x1d, 0x59, 0x62, 0x89, 0x05, 0xab, 0xf0,\n\t\t0x9b, 0x6c, 0xb6, 0x61, 0xd5, 0x25, 0xbc, 0xf8, 0x2d, 0x0b, 0x79, 0x29,\n\t\t0xe3, 0x0e, 0x82, 0x5c, 0xd7, 0x2c, 0xc5, 0xf0, 0x85, 0x67, 0x5a, 0xa4,\n\t\t0x63, 0xa2, 0x21, 0xd9, 0x69, 0x7f, 0xca, 0x7f, 0x49, 0x0c, 0x00, 0xdf,\n\t\t0xc0, 0x46, 0xd1, 0x72, 0x11, 0x96, 0x38, 0x28, 0x1d, 0x16, 0x7c, 0xf3,\n\t\t0x5f, 0x81, 0x05, 0x45, 0xc3, 0x88, 0x2f, 0xde, 0xcd, 0x79, 0x23, 0x1f,\n\t\t0xe0, 0x69, 0xec, 0x6a, 0x7b, 0xc0, 0x0c, 0xb8, 0xbb, 0x0d, 0xbb, 0x71,\n\t\t0x39, 0xee, 0x69, 0x85, 0x98, 0x01, 0x8f, 0x74, 0xbf, 0x39, 0xf8, 0xb4,\n\t\t0xe6, 0xb1, 0xff, 0xb9, 0x06, 0xa5, 0x90, 0x54, 0xdb, 0xe6, 0xe2, 0xf2,\n\t\t0xb2, 0x07, 0x30, 0x8d, 0x97, 0xb7, 0x0b, 0xfa, 0x7d, 0x8b, 0xcd, 0xe4,\n\t\t0xa6, 0x42, 0xa4, 0x49, 0x9b, 0xdb, 0xd5, 0x8d, 0x9b, 0x97, 0xd7, 0x3f,\n\t\t0xb2, 0x4e, 0x79, 0xbf, 0x90, 0xa3, 0x9f, 0xb0, 0x30, 0xdc, 0xd5, 0x99,\n\t\t0x4d, 0x90, 0xf2, 0xf2, 0x6a, 0x9b, 0x3d, 0xb3, 0x73, 0xb8, 0x9e, 0xaf,\n\t\t0x55, 0xce, 0xfb, 0xba, 0xca, 0x88, 0xca, 0xbf, 0x7e, 0x2d, 0x30, 0x6e,\n\t\t0x26, 0x44, 0x55, 0x63, 0x4c, 0x47, 0xb5, 0x42, 0x62, 0x4d, 0x8a, 0x36,\n\t\t0xec, 0x1f, 0x2f, 0x9c, 0xa6, 0x12, 0x3c, 0x56, 0xa4, 0x17, 0x21, 0xfb,\n\t\t0x08, 0x09, 0x3e, 0x67, 0x3d, 0x1b, 0xe9, 0xc7, 0xb9, 0x02, 0xf5, 0xaf,\n\t\t0x7b, 0xa6, 0xe8, 0x68, 0x24, 0xd0, 0x9e, 0x29, 0xe5, 0xc3, 0xe6, 0x28,\n\t\t0xf7, 0xc5, 0xe5, 0x6f, 0x1e, 0x5c, 0xbe, 0xea, 0x1a, 0x70, 0x5d, 0xb2,\n\t\t0x4d, 0x7f, 0xd0, 0xd0, 0x25, 0x76, 0xf6, 0xed, 0xc9, 0x12, 0x26, 0xe0,\n\t\t0x94, 0xc4, 0xa3, 0x70, 0xe8, 0x9d, 0x4b, 0xdc, 0xf9, 0xbb, 0xb7, 0x2f,\n\t\t0x99, 0xec, 0xd6, 0xf8, 0x56, 0xda, 0x3d, 0x30, 0xdf, 0xde, 0xde, 0x40,\n\t\t0xa0, 0x52, 0x95, 0xd8, 0xfb, 0x14, 0x9b, 0xde, 0x51, 0xe7, 0x55, 0xb0,\n\t\t0xe6, 0x3e, 0x8e, 0x2b, 0xfc, 0xf1, 0xbc, 0x1e, 0x7b, 0xf2, 0xe8, 0x2e,\n\t\t0x97, 0xcf, 0x53, 0xbd, 0xdc, 0x9d, 0xa5, 0xf5, 0x24, 0x5b, 0xcc, 0xb7,\n\t\t0x30, 0xd4, 0xd2, 0xc1, 0xbd, 0xe2, 0xc1, 0x83, 0x99, 0xca, 0x20, 0x22,\n\t\t0xf6, 0x69, 0x7e, 0x54, 0x57, 0xb5, 0xc5, 0x9a, 0x93, 0xcf, 0x0d, 0xf9,\n\t\t0x72, 0xc8, 0x09, 0xc4, 0x3d, 0xfb, 0x4d, 0x9e, 0xda, 0x71, 0x96, 0x9f,\n\t\t0xf0, 0x21, 0x80, 0xd6, 0x64, 0x6a, 0xef, 0x50, 0xa6, 0x4e, 0xa3, 0xf3,\n\t\t0xc0, 0x53, 0xe0, 0x82, 0x31, 0xa0, 0xce, 0x2d, 0x94, 0x5e, 0x4e, 0x66,\n\t\t0x14, 0x0c, 0xee, 0x52, 0x1f, 0xa5, 0x59, 0xa7, 0xa5, 0xc6, 0xd8, 0xec,\n\t\t0x90, 0xe7, 0xdc, 0x52, 0xa4, 0x98, 0x5b, 0x0b, 0x45, 0xc6, 0x0b, 0xdc,\n\t\t0x1e, 0x8a, 0xeb, 0xeb, 0xcd, 0x77, 0x10, 0xc5, 0x82, 0xf2, 0x07, 0xe4,\n\t\t0x83, 0x94, 0x8c, 0xec, 0x13, 0x06, 0x06, 0x24, 0xe8, 0xbf, 0x91, 0xf1,\n\t\t0xa1, 0xe9, 0x5b, 0xde, 0x59, 0xc8, 0x5f, 0xf5, 0xc3, 0x63, 0x0e, 0x50,\n\t\t0x3d, 0xa6, 0x29, 0x6f, 0x3c, 0x59, 0x7c, 0x1e, 0x4a, 0x54, 0xcf, 0x6c,\n\t\t0x1c, 0xbe, 0xef, 0xaf, 0x6e, 0x3a, 0x6d, 0x6a, 0x47, 0xf4, 0x47, 0xcb,\n\t\t0x53, 0x70, 0x3a, 0xb6, 0xdb, 0x8c, 0x06, 0x4b, 0x7f, 0xcb, 0xb1, 0xd7,\n\t\t0x72, 0x0a, 0x93, 0x51, 0x84, 0x87, 0x7f, 0x1c, 0xd2, 0xca, 0xca, 0xf4,\n\t\t0x12, 0x4c, 0x30, 0x92, 0xe4, 0xad, 0x59, 0xb8, 0xfb, 0xce, 0x51, 0xca,\n\t\t0xe9, 0xad, 0x05, 0x3c, 0x4a, 0xed, 0x8e, 0x26, 0x55, 0x0f, 0xfd, 0xff,\n\t\t0x9d, 0x38, 0x37, 0x76, 0x0a, 0x16, 0x6c, 0x44, 0x0a, 0x81, 0x97, 0x17,\n\t\t0x38, 0x80, 0xcf, 0xcb, 0x2f, 0x2a, 0xcc, 0x26, 0xb2, 0xb9, 0xdc, 0x2f,\n\t\t0xbe, 0x00, 0xc0, 0xed, 0x5c, 0x50, 0x43, 0xb4, 0x79, 0xe9, 0xfe, 0xb1,\n\t\t0xbd, 0xf8, 0xf6, 0x7c, 0x2e, 0x48, 0x4e, 0x41, 0x41, 0x42, 0xcf, 0x0a,\n\t\t0x77, 0xb8, 0xe4, 0x01, 0x7f, 0x78, 0x52, 0x72, 0x5b, 0xcf, 0x01, 0x2c,\n\t\t0x40, 0xa1, 0xe9, 0xce, 0x17, 0x0e, 0x06, 0x04, 0xd0, 0x07, 0xbe, 0xc8,\n\t\t0x64, 0xf1, 0x60, 0x53, 0x52, 0xc6, 0xd0, 0xd6, 0x48, 0x67, 0x84, 0x0f,\n\t\t0x18, 0x45, 0x83, 0x99, 0x21, 0x3d, 0x3c, 0x3c, 0x40, 0x52, 0x81, 0x84,\n\t\t0x29, 0x7e, 0x5c, 0x10, 0x77, 0x1c, 0xa1, 0x0b, 0xba, 0xf2, 0xb8, 0x0f,\n\t\t0x8d, 0xae, 0x7d, 0x59, 0x07, 0x25, 0x26, 0x7c, 0x12, 0x2c, 0x79, 0x4a,\n\t\t0x69, 0x54, 0x06, 0xe0, 0x29, 0x84, 0x0e, 0x1a, 0x71, 0xf3, 0x1a, 0xa0,\n\t\t0xff, 0xa0, 0x02, 0x07, 0x1c, 0xeb, 0xd4, 0x69, 0x94, 0xdf, 0xef, 0x5b,\n\t\t0x13, 0x69, 0x73, 0x86, 0x06, 0x42, 0xe5, 0xd7, 0x7d, 0x8c, 0x3b, 0x8e,\n\t\t0x4f, 0x9f, 0xe5, 0x7e, 0x8b, 0xcd, 0x77, 0x16, 0x03, 0xf6, 0x99, 0xcb,\n\t\t0x7e, 0x43, 0xa8, 0x80, 0x6d, 0xaf, 0x9a, 0x99, 0x9d, 0x7d, 0x40, 0xf0,\n\t\t0xfd, 0x05, 0x8a, 0x97, 0x97, 0x17, 0xd4, 0xbd, 0x39, 0xa3, 0x5e, 0xb3,\n\t\t0xcd, 0xb8, 0x9a, 0x99, 0x5d, 0x12, 0x4d, 0x67, 0xf3, 0x43, 0x5d, 0x41,\n\t\t0xc1, 0x1f, 0x10, 0x5c, 0x21, 0xcd, 0x62, 0x1e, 0xb0, 0x70, 0x96, 0xbe,\n\t\t0xdf, 0xab, 0x6a, 0xa5, 0xeb, 0x73, 0x8d, 0xef, 0xea, 0xe4, 0xfc, 0x8c,\n\t\t0xac, 0x1f, 0xe2, 0x1c, 0xab, 0x35, 0x07, 0x12, 0x2d, 0xae, 0x9c, 0xea,\n\t\t0x33, 0x64, 0x81, 0xca, 0x5e, 0x4c, 0x09, 0xb5, 0xfa, 0x6a, 0xb2, 0x1e,\n\t\t0x39, 0x9b, 0xd6, 0x7f, 0x08, 0x1d, 0x01, 0x93, 0x15, 0x4b, 0x9e, 0x64,\n\t\t0xf1, 0x07, 0x27, 0xc2, 0xe9, 0x0c, 0x37, 0x20, 0x29, 0xa5, 0x99, 0x79,\n\t\t0x6f, 0x3e, 0x28, 0xfe, 0xc0, 0xb2, 0x6a, 0xa9, 0x3b, 0x80, 0x45, 0x04,\n\t\t0x74, 0xbb, 0xa0, 0x10, 0x43, 0x5a, 0x0d, 0x2d, 0x16, 0xaa, 0x3e, 0xcb,\n\t\t0x65, 0xf1, 0xc0, 0x48, 0x8f, 0x0e, 0xfa, 0xe1, 0xb3, 0x30, 0x33, 0x0b,\n\t\t0x1b, 0x18, 0x7c, 0xf1, 0x7d, 0xbd, 0x55, 0x07, 0x75, 0x9f, 0xc2, 0xc9,\n\t\t0x4f, 0x56, 0x16, 0xa0, 0x9d, 0xd4, 0xeb, 0x40, 0xad, 0xad, 0xcc, 0x82,\n\t\t0x35, 0x5b, 0x60, 0xdc, 0x5f, 0xf8, 0xf0, 0x90, 0xfb, 0x36, 0x0e, 0x67,\n\t\t0x4a, 0x14, 0x68, 0x92, 0xe0, 0x51, 0x50, 0xe6, 0x8e, 0x04, 0x62, 0x02,\n\t\t0x1e, 0x1e, 0xdc, 0x3f, 0x4e, 0x9c, 0x54, 0x07, 0x53, 0xf2, 0xfd, 0x07,\n\t\t0xea, 0x06, 0xf3, 0xd3, 0x6c, 0xb6, 0xdf, 0x3d, 0xe8, 0xa2, 0x22, 0x14,\n\t\t0x40, 0xeb, 0xf3, 0x55, 0x5c, 0x8e, 0x77, 0x34, 0x52, 0x18, 0x72, 0xe6,\n\t\t0x24, 0x61, 0x7d, 0x25, 0xe6, 0xad, 0x0f, 0x15, 0x9d, 0x2e, 0x64, 0x6c,\n\t\t0x7c, 0xe1, 0xc2, 0x76, 0x20, 0x2e, 0xae, 0x0a, 0xdc, 0xc2, 0x22, 0x9f,\n\t\t0xc6, 0x2c, 0xc3, 0x2b, 0x32, 0x7f, 0x0c, 0xe3, 0x4e, 0xeb, 0xbf, 0xd0,\n\t\t0xc8, 0x27, 0xaa, 0x3e, 0x3d, 0x29, 0xf5, 0x63, 0x3a, 0x63, 0x5a, 0x8d,\n\t\t0xdf, 0xe7, 0xea, 0x9e, 0xd9, 0x03, 0x02, 0x02, 0xb8, 0x3c, 0xae, 0x7e,\n\t\t0x24, 0x58, 0xde, 0x1e, 0x1e, 0x1d, 0x45, 0x02, 0x40, 0xdc, 0x3f, 0x34,\n\t\t0x14, 0x64, 0x08, 0x5e, 0x89, 0xf3, 0xf9, 0xb8, 0x5f, 0xa6, 0xd5, 0x51,\n\t\t0x5d, 0x44, 0x8d, 0x48, 0x92, 0xf5, 0xd2, 0xbd, 0xeb, 0x68, 0xff, 0xaa,\n\t\t0xf7, 0x3d, 0xac, 0x12, 0xf8, 0xc4, 0xe2, 0xf2, 0x32, 0x29, 0x53, 0xcd,\n\t\t0xd1, 0x58, 0x50, 0x31, 0x6c, 0x1f, 0xd3, 0xc7, 0xc5, 0x81, 0xfc, 0x7c,\n\t\t0xa9, 0x69, 0x84, 0x47, 0x3e, 0x86, 0xe4, 0xf6, 0x77, 0x1c, 0x4f, 0x97,\n\t\t0xcb, 0x85, 0x3a, 0xd3, 0xa7, 0x9e, 0x9e, 0xbf, 0x88, 0x9c, 0x67, 0x82,\n\t\t0xc2, 0x96, 0xe2, 0x11, 0xc7, 0x59, 0xc5, 0x45, 0x6f, 0x74, 0xc9, 0xd7,\n\t\t0x72, 0xa1, 0xc3, 0xb4, 0xd3, 0x75, 0x96, 0xc1, 0xb0, 0xb0, 0xcc, 0x07,\n\t\t0xb0, 0x71, 0xb4, 0xfd, 0x5b, 0x48, 0xcf, 0x78, 0x94, 0x76, 0xb3, 0x56,\n\t\t0xc3, 0x15, 0x08, 0x9f, 0x52, 0x99, 0xea, 0x9f, 0x94, 0xf5, 0xd5, 0x6c,\n\t\t0x21, 0x4c, 0xbd, 0x5f, 0x5c, 0x42, 0xe4, 0x2c, 0x88, 0x88, 0x88, 0xb8,\n\t\t0xfc, 0xde, 0xf8, 0xac, 0xad, 0xf1, 0x6d, 0xe1, 0x68, 0x65, 0x2f, 0x2f,\n\t\t0x2e, 0xba, 0xef, 0x4e, 0xff, 0x41, 0x80, 0x5a, 0x1e, 0x43, 0xdc, 0xb1,\n\t\t0x52, 0x82, 0x05, 0x56, 0x79, 0xcd, 0xf9, 0xc5, 0x26, 0x46, 0x57, 0xf1,\n\t\t0xcc, 0xaa, 0x57, 0x54, 0xd9, 0x6d, 0xb8, 0x7d, 0x5f, 0xb8, 0x76, 0x1c,\n\t\t0xb9, 0x3d, 0x6f, 0x8f, 0xe6, 0x36, 0x08, 0x62, 0xcc, 0x83, 0xec, 0x3a,\n\t\t0x1f, 0x61, 0x01, 0x5d, 0x55, 0x89, 0xe9, 0xd2, 0x61, 0xc2, 0x0e, 0xf2,\n\t\t0x72, 0x9b, 0x2a, 0x10, 0x7f, 0x0a, 0x1b, 0x37, 0xdd, 0x5c, 0x49, 0xf2,\n\t\t0xaa, 0x16, 0x67, 0xcb, 0x19, 0xdf, 0xf3, 0x98, 0x76, 0xbe, 0x3c, 0xf7,\n\t\t0x54, 0x8d, 0x9c, 0xdc, 0xf8, 0x02, 0xbb, 0xda, 0xbd, 0x69, 0x1f, 0xbd,\n\t\t0x47, 0x9b, 0x74, 0xe8, 0xa4, 0x17, 0xd7, 0xd7, 0xda, 0x30, 0xb4, 0xa5,\n\t\t0x69, 0x5c, 0xce, 0x8e, 0x8c, 0x18, 0x82, 0x71, 0x4e, 0xff, 0x2f, 0x98,\n\t\t0xea, 0xf2, 0xa8, 0x65, 0x81, 0x83, 0x83, 0x03, 0xe8, 0x5f, 0xb6, 0xcc,\n\t\t0x2c, 0x02, 0xdb, 0xb8, 0xc3, 0xd6, 0x8d, 0xff, 0x79, 0x99, 0xb2, 0x33,\n\t\t0x9b, 0x04, 0x25, 0xd6, 0x4b, 0x72, 0x01, 0x98, 0x8e, 0xb6, 0x06, 0xf5,\n\t\t0x28, 0x85, 0x6a, 0x5a, 0x42, 0x54, 0x82, 0xcf, 0xff, 0x3c, 0x37, 0x66,\n\t\t0x07, 0xfe, 0x95, 0x51, 0x72, 0x7e, 0xd0, 0x83, 0xa5, 0x25, 0x0d, 0x2c,\n\t\t0x0a, 0xfe, 0xec, 0x8f, 0x18, 0x9e, 0x3e, 0xa6, 0x07, 0xa0, 0x13, 0x6a,\n\t\t0x0d, 0x7a, 0x20, 0x55, 0x85, 0x0b, 0xe2, 0xa1, 0xbc, 0x0c, 0x96, 0x7f,\n\t\t0xbf, 0x79, 0x9e, 0x5a, 0xd9, 0xc1, 0x37, 0xd7, 0xd7, 0x0c, 0x05, 0x60,\n\t\t0xa6, 0x90, 0x24, 0x27, 0x26, 0xba, 0x94, 0x58, 0xc4, 0xb7, 0xc5, 0x2b,\n\t\t0x2e, 0x08, 0x62, 0x45, 0x92, 0x2b, 0x4d, 0xfa, 0x2b, 0x18, 0x87, 0x0b,\n\t\t0x73, 0x1a, 0x68, 0xd0, 0x51, 0x49, 0x14, 0xb1, 0x5c, 0xdb, 0xf9, 0xef,\n\t\t0x41, 0xf8, 0x3b, 0x39, 0xf1, 0x5a, 0x3f, 0x79, 0x73, 0x44, 0xbb, 0xcf,\n\t\t0x71, 0x4a, 0x2e, 0xf9, 0xbd, 0x60, 0xdc, 0x11, 0x77, 0x15, 0x52, 0x5e,\n\t\t0x5f, 0x5d, 0xf5, 0x76, 0xbd, 0xbf, 0x21, 0xd9, 0xd9, 0xd9, 0xad, 0x7e,\n\t\t0xd5, 0x89, 0x23, 0xa7, 0xa4, 0xdc, 0x9a, 0x91, 0x17, 0x1c, 0x78, 0x79,\n\t\t0xbc, 0xbe, 0xbc, 0xd8, 0xfc, 0xc6, 0xe7, 0xfb, 0x02, 0x9e, 0x9a, 0x9a,\n\t\t0x92, 0x94, 0x91, 0xe9, 0x07, 0x54, 0x71, 0x63, 0x63, 0x43, 0xc1, 0x82,\n\t\t0xaa, 0x39, 0x37, 0xf7, 0xcb, 0x87, 0xf9, 0x36, 0x51, 0xc0, 0x50, 0x9e,\n\t\t0x36, 0x34, 0x36, 0x81, 0x05, 0x2a, 0x48, 0x6b, 0x6e, 0x62, 0xb9, 0x17,\n\t\t0x19, 0xf0, 0x61, 0x97, 0xe7, 0x21, 0x04, 0x65, 0x1d, 0xb6, 0xeb, 0x9d,\n\t\t0x28, 0xa8, 0x61, 0x05, 0xf3, 0xa4, 0xf5, 0xa5, 0x3f, 0x33, 0x32, 0xa2,\n\t\t0x14, 0x0b, 0xc4, 0x0d, 0x81, 0x21, 0x5f, 0xe6, 0x17, 0xb7, 0xf9, 0x1a,\n\t\t0x54, 0xbb, 0xd3, 0xe1, 0x60, 0x50, 0x9b, 0xde, 0xcc, 0x0e, 0xd7, 0x6d,\n\t\t0x58, 0x07, 0x00, 0x9c, 0x03, 0xab, 0x14, 0x76, 0xbb, 0x14, 0x73, 0x34,\n\t\t0x5d, 0x90, 0x61, 0x24, 0xe3, 0x91, 0x32, 0xa3, 0x48, 0x5f, 0xe0, 0x0b,\n\t\t0x25, 0x1e, 0xb5, 0x8e, 0x2d, 0x67, 0x9e, 0x12, 0xde, 0xe7, 0xef, 0x33,\n\t\t0x1e, 0xa7, 0x10, 0x42, 0xdd, 0xfb, 0x86, 0xfb, 0xa1, 0x71, 0x1b, 0x4b,\n\t\t0xd3, 0xa5, 0xcb, 0xf7, 0x58, 0x52, 0x14, 0xe2, 0x7f, 0x9f, 0x20, 0x11,\n\t\t0x86, 0x0f, 0x69, 0xd2, 0x32, 0x32, 0x08, 0x6c, 0x57, 0x5b, 0x61, 0x68,\n\t\t0xcb, 0x9f, 0xac, 0xe8, 0xcb, 0x90, 0x00, 0xc3, 0x3f, 0x9e, 0xc1, 0x59,\n\t\t0x6b, 0xd8, 0x07, 0xfb, 0x41, 0x97, 0x4a, 0x16, 0x73, 0xb2, 0x65, 0x74,\n\t\t0xf4, 0xf4, 0x53, 0x80, 0x61, 0xa5, 0xd3, 0xef, 0x24, 0xd4, 0xd3, 0xd3,\n\t\t0xb3, 0x2c, 0xd9, 0x72, 0xd8, 0x1e, 0xdc, 0x8c, 0x13, 0x7c, 0x53, 0x88,\n\t\t0x01, 0x9c, 0xb7, 0x83, 0xc1, 0x31, 0x62, 0x56, 0x66, 0x66, 0xd7, 0xeb,\n\t\t0x2e, 0xf1, 0xc9, 0x8a, 0x9f, 0x14, 0x7b, 0x31, 0x35, 0x62, 0x18, 0xea,\n\t\t0xe7, 0x8f, 0xe3, 0xc1, 0xf9, 0x7b, 0x16, 0x95, 0xab, 0xeb, 0xeb, 0x4f,\n\t\t0xf8, 0xf8, 0x91, 0x80, 0xc1, 0xff, 0xfd, 0xe3, 0xe3, 0xba, 0x46, 0x64,\n\t\t0x0b, 0xe6, 0x77, 0xcc, 0x0c, 0x96, 0xf0, 0x7e, 0x25, 0xe4, 0xb4, 0x16,\n\t\t0x9d, 0x39, 0x5c, 0xd0, 0x06, 0x4e, 0x7a, 0xfa, 0xdd, 0xcd, 0x57, 0x3a,\n\t\t0xbe, 0xac, 0x42, 0xf5, 0x01, 0x78, 0x14, 0xd8, 0xab, 0x7f, 0x3f, 0x72,\n\t\t0xa9, 0x93, 0xe2, 0x38, 0x3b, 0x39, 0xf6, 0xac, 0x71, 0x90, 0xac, 0x04,\n\t\t0xd2, 0x1e, 0xc5, 0x8d, 0x51, 0x41, 0x25, 0x0c, 0x6b, 0x6a, 0xac, 0x7b,\n\t\t0x38, 0x38, 0x38, 0x1f, 0x22, 0x12, 0xc4, 0xb9, 0xf7, 0x71, 0x6c, 0x22,\n\t\t0xe0, 0xcd, 0xc5, 0xe3, 0x72, 0x14, 0x0c, 0xb8, 0x2c, 0x55, 0xab, 0xb1,\n\t\t0x80, 0x5f, 0x98, 0x9b, 0x00, 0x5f, 0x22, 0x10, 0x13, 0x13, 0xdf, 0x00,\n\t\t0xa3, 0x41, 0xbd, 0x5a, 0x4f, 0x95, 0x5f, 0xbb, 0xdd, 0xbd, 0x76, 0x79,\n\t\t0x25, 0x78, 0xe7, 0x86, 0xe5, 0x3e, 0x65, 0xd9, 0x64, 0xaf, 0x39, 0xc0,\n\t\t0xde, 0x91, 0x9a, 0x7e, 0x66, 0x9c, 0x09, 0xd9, 0xf4, 0x6f, 0x66, 0x04,\n\t\t0x20, 0x90, 0x96, 0x6b, 0x96, 0x7c, 0xd4, 0x58, 0x88, 0x32, 0x69, 0x2c,\n\t\t0x62, 0xe3, 0xa9, 0x19, 0x69, 0x88, 0x97, 0x9b, 0xb3, 0x86, 0xfd, 0xa9,\n\t\t0x29, 0xdf, 0xa8, 0x37, 0xb6, 0xb7, 0x35, 0x8d, 0x47, 0x24, 0x77, 0x8a,\n\t\t0x07, 0x06, 0x9a, 0xd6, 0xe6, 0x32, 0x44, 0x82, 0x61, 0xe1, 0x1e, 0x63,\n\t\t0x58, 0x84, 0x9a, 0x75, 0x9a, 0xf2, 0xd8, 0xb2, 0x58, 0x6f, 0x6f, 0xdd,\n\t\t0xe7, 0xfb, 0xc3, 0x39, 0x8b, 0x4b, 0x20, 0xfc, 0x65, 0xaa, 0x7e, 0xff,\n\t\t0x34, 0x7e, 0x7d, 0xbd, 0x5f, 0x2f, 0x97, 0xca, 0xe5, 0x10, 0x05, 0x6a,\n\t\t0xdf, 0xf7, 0xf9, 0x94, 0xf3, 0xe1, 0xf1, 0x71, 0x73, 0xa3, 0x27, 0x08,\n\t\t0xbf, 0xd2, 0xe1, 0x72, 0x4b, 0x0c, 0x1a, 0x0e, 0xce, 0xf8, 0x78, 0xbe,\n\t\t0xd2, 0x00, 0x0c, 0xeb, 0xeb, 0xeb, 0x7b, 0x30, 0x5b, 0x9a, 0xb0, 0x9c,\n\t\t0x79, 0xfb, 0xef, 0x2d, 0xb0, 0xf0, 0x57, 0x95, 0x93, 0xcb, 0x80, 0x86,\n\t\t0x41, 0x30, 0xf6, 0x35, 0x65, 0x29, 0x5e, 0xf5, 0xcd, 0x8d, 0x33, 0x60,\n\t\t0x80, 0x49, 0xd9, 0xd9, 0x55, 0x8f, 0x9f, 0xf1, 0xf0, 0x01, 0xd2, 0xff,\n\t\t0x7d, 0xf1, 0x6e, 0xd3, 0x13, 0x1d, 0x5f, 0xd3, 0xc8, 0x56, 0xbe, 0x15,\n\t\t0x53, 0x2c, 0xab, 0xb1, 0x70, 0x67, 0xd9, 0x70, 0x62, 0xa1, 0xc5, 0x06,\n\t\t0x61, 0x4f, 0x91, 0x33, 0x13, 0x8c, 0x2f, 0xec, 0xab, 0x80, 0x8c, 0xcc,\n\t\t0x5a, 0x27, 0xf0, 0xd7, 0xd1, 0x63, 0x04, 0xc7, 0xdf, 0x14, 0x42, 0xc8,\n\t\t0xdd, 0xdc, 0x4c, 0xe6, 0xf3, 0x5c, 0xb5, 0xf8, 0xf9, 0x9b, 0xef, 0x03,\n\t\t0x5f, 0x36, 0x65, 0xe1, 0xef, 0x41, 0xe9, 0x14, 0x86, 0x01, 0x6d, 0xbb,\n\t\t0x8e, 0x22, 0x02, 0xb1, 0xe3, 0x00, 0xc0, 0xcc, 0x40, 0xc3, 0xc0, 0x18,\n\t\t0x5e, 0xed, 0x0c, 0x4b, 0xca, 0xcb, 0xfb, 0x5d, 0x23, 0xa9, 0x4e, 0x16,\n\t\t0x49, 0xe3, 0x52, 0x27, 0x49, 0x8d, 0xa5, 0xb3, 0x23, 0x01, 0x05, 0x09,\n\t\t0x2b, 0x3b, 0x93, 0xca, 0x6c, 0x1c, 0xba, 0x9c, 0x39, 0x1b, 0x4d, 0xf8,\n\t\t0xf2, 0x32, 0x74, 0x49, 0xa3, 0xf6, 0x9b, 0xe0, 0xb3, 0x0f, 0x7f, 0x8d,\n\t\t0xc5, 0xc0, 0xb3, 0xfd, 0xd7, 0x19, 0x61, 0x3a, 0x1e, 0x1e, 0x7c, 0x4c,\n\t\t0x2a, 0x39, 0x15, 0x2b, 0xa9, 0xe9, 0x45, 0x2e, 0xd7, 0x13, 0x30, 0x87,\n\t\t0xcd, 0x72, 0x21, 0x25, 0xc1, 0x5a, 0x97, 0x57, 0x42, 0x9c, 0x79, 0x35,\n\t\t0x2a, 0x60, 0xbe, 0xad, 0x5e, 0xbe, 0x5c, 0xa8, 0x38, 0xb0, 0x28, 0x99,\n\t\t0x71, 0x64, 0x90, 0x86, 0x20, 0xc3, 0xb3, 0x07, 0x42, 0x0f, 0xe0, 0x61,\n\t\t0x9d, 0xe9, 0x94, 0xde, 0x4c, 0x39, 0x08, 0x6d, 0x21, 0x80, 0x6c, 0xf8,\n\t\t0x75, 0x2f, 0xc7, 0xaf, 0x34, 0x37, 0x66, 0xbf, 0x54, 0x4a, 0x95, 0x16,\n\t\t0xd6, 0x3a, 0xbf, 0xa2, 0x62, 0xe1, 0x44, 0x41, 0x80, 0x36, 0x37, 0x37,\n\t\t0x17, 0x5b, 0x5d, 0xac, 0x82, 0x5c, 0xac, 0x88, 0x04, 0x7d, 0x09, 0x81,\n\t\t0xef, 0x2c, 0x93, 0xfa, 0xd9, 0x76, 0xef, 0xd7, 0xfd, 0xc2, 0x34, 0xe8,\n\t\t0x06, 0xfb, 0xc2, 0xd0, 0x1c, 0xae, 0xf7, 0x64, 0x53, 0x53, 0x53, 0x37,\n\t\t0x00, 0xb4, 0x19, 0xdc, 0x1b, 0xcf, 0x20, 0x89, 0x97, 0x54, 0xb9, 0x26,\n\t\t0x12, 0xf8, 0xde, 0xed, 0x9f, 0x2d, 0xcc, 0xc4, 0x8a, 0x3d, 0xef, 0x31,\n\t\t0x71, 0xc5, 0xc5, 0xd9, 0xd4, 0x37, 0x29, 0xa0, 0x1b, 0xff, 0x33, 0x33,\n\t\t0xe0, 0xa1, 0xf0, 0x57, 0x82, 0x87, 0xb7, 0x37, 0xdf, 0xd9, 0x7a, 0x57,\n\t\t0x5c, 0x78, 0x38, 0xfc, 0x85, 0x3b, 0x5f, 0xe5, 0x79, 0xa9, 0x7c, 0xec,\n\t\t0x67, 0xde, 0xd0, 0xa9, 0x02, 0x89, 0x6f, 0x0c, 0x29, 0xe5, 0x3f, 0x0a,\n\t\t0x7a, 0xbf, 0xd5, 0x38, 0xdf, 0x69, 0x1b, 0xb0, 0xdf, 0xfe, 0xbc, 0xe3,\n\t\t0x34, 0xe8, 0xdf, 0x27, 0xe1, 0x6d, 0x42, 0x47, 0xcb, 0x21, 0x6f, 0xff,\n\t\t0x35, 0x49, 0x27, 0xe4, 0x29, 0x94, 0xc3, 0xf3, 0x09, 0x1f, 0x16, 0xe5,\n\t\t0x7a, 0xa6, 0x33, 0xbe, 0xd7, 0x54, 0x5a, 0x1d, 0x62, 0x20, 0x0b, 0xe4,\n\t\t0x3f, 0xb4, 0xbb, 0xb1, 0xed, 0x36, 0x14, 0x38, 0x5a, 0xba, 0xe4, 0x56,\n\t\t0x35, 0x13, 0xdf, 0xa4, 0xca, 0x9e, 0xd7, 0xa2, 0xc3, 0xc0, 0x61, 0xbb,\n\t\t0xb2, 0xf8, 0x45, 0x3b, 0x17, 0x92, 0xc2, 0x65, 0x32, 0x0c, 0x85, 0x20,\n\t\t0x74, 0x65, 0x45, 0xa7, 0xb2, 0x82, 0xf3, 0xc7, 0x7f, 0xe8, 0xd1, 0xf8,\n\t\t0x45, 0x52, 0xdb, 0x43, 0x4d, 0xeb, 0xbe, 0x48, 0x0c, 0x29, 0x51, 0x97,\n\t\t0xdb, 0x43, 0xe5, 0xe3, 0x09, 0xc3, 0xd8, 0x8b, 0x4e, 0x92, 0x6e, 0x30,\n\t\t0xad, 0xd0, 0xe2, 0xde, 0x15, 0xba, 0x7c, 0x50, 0x09, 0xe2, 0x37, 0x8a,\n\t\t0x45, 0xc3, 0x9f, 0x05, 0xbc, 0xc1, 0x40, 0x2e, 0xad, 0xd9, 0x28, 0x8c,\n\t\t0x06, 0x8c, 0x98, 0x3f, 0x76, 0x85, 0x80, 0x68, 0xc3, 0x45, 0x49, 0x93,\n\t\t0x56, 0xa6, 0x7a, 0x70, 0xae, 0x8b, 0xd1, 0xa8, 0x06, 0xdb, 0x43, 0x65,\n\t\t0x18, 0xae, 0x59, 0x7b, 0x99, 0xa6, 0x37, 0xf9, 0xf4, 0xd4, 0x79, 0xf9,\n\t\t0xcb, 0x45, 0xcd, 0x41, 0xe8, 0x41, 0xb6, 0x5f, 0x6a, 0x96, 0xf4, 0xa0,\n\t\t0x12, 0x47, 0x12, 0x3d, 0xaa, 0x87, 0xce, 0x63, 0x89, 0xa1, 0xf5, 0xe5,\n\t\t0x17, 0xf0, 0x3b, 0xa4, 0x67, 0x90, 0x7d, 0x9f, 0xf7, 0xa3, 0x2d, 0xf9,\n\t\t0x6c, 0x57, 0xb8, 0xea, 0xad, 0x35, 0x5d, 0xf6, 0xd9, 0xbf, 0x99, 0x3d,\n\t\t0x5e, 0xed, 0xda, 0x21, 0x7b, 0x96, 0xa3, 0x70, 0x73, 0x73, 0x03, 0x73,\n\t\t0x3f, 0xd8, 0xf2, 0xe5, 0x6a, 0x57, 0x7a, 0xa5, 0xc3, 0x0b, 0xf7, 0xbc,\n\t\t0xe3, 0x5e, 0x0f, 0x06, 0x6d, 0x70, 0x8e, 0x37, 0xae, 0xbe, 0xd1, 0xce,\n\t\t0xa4, 0x66, 0x89, 0x6e, 0x2c, 0x47, 0x00, 0x52, 0x9f, 0x41, 0x21, 0x44,\n\t\t0x72, 0x03, 0x28, 0x55, 0xe0, 0xa3, 0xa2, 0x59, 0x55, 0xd8, 0xc8, 0x01,\n\t\t0xe5, 0xea, 0xd5, 0xbd, 0x13, 0x13, 0x68, 0xeb, 0xbe, 0xcf, 0x95, 0x34,\n\t\t0xec, 0x31, 0xa3, 0x86, 0x64, 0x15, 0xda, 0x5e, 0x1f, 0x27, 0x4d, 0x22,\n\t\t0x05, 0x91, 0x16, 0xc1, 0xc1, 0x23, 0x16, 0xa6, 0x56, 0x11, 0xb1, 0x36,\n\t\t0xda, 0x5d, 0xf8, 0xdf, 0x43, 0xa4, 0x4c, 0x4e, 0xaa, 0xd4, 0x2a, 0xd5,\n\t\t0x38, 0xd7, 0x8a, 0x91, 0xa0, 0x2b, 0x85, 0x90, 0x5b, 0x21, 0x36, 0x4e,\n\t\t0xf8, 0xfa, 0x32, 0x8b, 0x31, 0x9b, 0x20, 0xd9, 0x08, 0xa8, 0x4b, 0xd9,\n\t\t0x38, 0x1c, 0xdc, 0xcf, 0xf1, 0xbb, 0xfc, 0x9e, 0x37, 0x95, 0xfb, 0x13,\n\t\t0x2d, 0xa2, 0x9e, 0x36, 0xc3, 0x88, 0x2d, 0xf5, 0x87, 0x3d, 0x49, 0x19,\n\t\t0x18, 0x50, 0x9f, 0xef, 0x4e, 0x67, 0x1e, 0x05, 0xba, 0x5e, 0xae, 0x90,\n\t\t0xda, 0xdb, 0xdb, 0x27, 0x4b, 0xe4, 0x89, 0xd9, 0x3d, 0x1c, 0x2d, 0x61,\n\t\t0xaf, 0x90, 0xa2, 0x5c, 0x3a, 0xdf, 0xfd, 0xb3, 0x03, 0x52, 0x59, 0xfe,\n\t\t0xb0, 0x71, 0x7c, 0x1c, 0xba, 0x1f, 0x4c, 0x17, 0x21, 0xd9, 0xae, 0xb5,\n\t\t0x97, 0x5e, 0x77, 0x34, 0x7c, 0x57, 0x54, 0xfc, 0xf4, 0x71, 0xce, 0xac,\n\t\t0xaf, 0xaf, 0xef, 0x7c, 0x3c, 0x8f, 0x32, 0x91, 0xcd, 0x0f, 0x05, 0x02,\n\t\t0x23, 0xc5, 0x30, 0x99, 0xfc, 0xd0, 0x27, 0x7c, 0x7b, 0xf4, 0x5b, 0xac,\n\t\t0xb9, 0xf9, 0x5c, 0x5f, 0x63, 0xc7, 0x63, 0x12, 0xda, 0x00, 0x21, 0xa6,\n\t\t0x08, 0x7f, 0x3a, 0x2d, 0xc7, 0xae, 0x46, 0xe3, 0xf4, 0x44, 0x49, 0x69,\n\t\t0xab, 0x97, 0x27, 0x18, 0x03, 0x8f, 0x02, 0x61, 0x34, 0x89, 0xe2, 0x9f,\n\t\t0x98, 0x68, 0x2c, 0x0d, 0x16, 0xdf, 0x81, 0x06, 0x59, 0x73, 0x10, 0x48,\n\t\t0xaf, 0x11, 0xc3, 0x31, 0x94, 0x98, 0xb2, 0x0f, 0xe2, 0x85, 0xf6, 0xc8,\n\t\t0x77, 0x11, 0x2b, 0xc7, 0x74, 0x74, 0x74, 0x4c, 0xe5, 0x7d, 0x83, 0x5b,\n\t\t0xa5, 0xd6, 0x42, 0x7b, 0xb9, 0xe8, 0x43, 0xb3, 0xbc, 0xaf, 0x6a, 0x35,\n\t\t0x5a, 0xa8, 0xd2, 0xfd, 0x39, 0xfc, 0x03, 0x3b, 0x70, 0x1b, 0x4b, 0x0a,\n\t\t0x9f, 0x59, 0x5e, 0xff, 0xc0, 0xdb, 0x0f, 0x94, 0xca, 0x6a, 0x02, 0x4f,\n\t\t0x89, 0x8c, 0xa2, 0x1c, 0xb3, 0xbd, 0xbd, 0x3d, 0x55, 0xaa, 0x4c, 0xf5,\n\t\t0x41, 0x4c, 0x12, 0xb1, 0x84, 0x8a, 0x4e, 0x9a, 0x04, 0xa4, 0x40, 0xc2,\n\t\t0xe1, 0x11, 0x10, 0x7a, 0x7a, 0x43, 0x90, 0x3e, 0x7d, 0xfe, 0x8c, 0x12,\n\t\t0x6a, 0x68, 0x60, 0x4a, 0xda, 0x9f, 0xf9, 0xf5, 0x9b, 0xc3, 0xd6, 0xc2,\n\t\t0x5c, 0x2a, 0xaf, 0x0d, 0x17, 0xe1, 0x09, 0xbe, 0x6b, 0x6b, 0xa1, 0xc0,\n\t\t0xe1, 0xa7, 0x59, 0xb5, 0x4a, 0x8e, 0x40, 0x91, 0xf8, 0x3b, 0x88, 0x9c,\n\t\t0xf5, 0x58, 0x51, 0x2c, 0x8c, 0xb2, 0x60, 0xb0, 0x33, 0x7f, 0xdf, 0xae,\n\t\t0x67, 0xf3, 0xd7, 0xa4, 0x34, 0x1a, 0x75, 0x2f, 0xf3, 0x05, 0xd7, 0x86,\n\t\t0x32, 0x2d, 0x9c, 0x9c, 0xc4, 0xd0, 0x0c, 0x13, 0xad, 0x82, 0xbb, 0x63,\n\t\t0xf5, 0xba, 0x70, 0xf7, 0x6f, 0xa2, 0xa5, 0x2a, 0x5b, 0x0f, 0x0e, 0xab,\n\t\t0xa2, 0xe9, 0x29, 0x25, 0xff, 0x33, 0xa2, 0xf0, 0x68, 0x68, 0xd5, 0x93,\n\t\t0x85, 0x7b, 0x5d, 0xc7, 0x8a, 0xb7, 0xf9, 0x50, 0x51, 0x03, 0xbd, 0x81,\n\t\t0x69, 0x64, 0x97, 0x3d, 0x3b, 0x79, 0x1f, 0xc7, 0x33, 0x8b, 0x2d, 0x4e,\n\t\t0x54, 0xb0, 0x68, 0x44, 0xc8, 0xca, 0xca, 0xca, 0xce, 0x87, 0xd3, 0x30,\n\t\t0x40, 0xb2, 0x59, 0xc3, 0x79, 0x5d, 0x6b, 0x35, 0xa2, 0x01, 0x5e, 0xf8,\n\t\t0xb8, 0x32, 0x0a, 0x05, 0x8b, 0xec, 0x9f, 0x91, 0x91, 0xa1, 0xe5, 0xeb,\n\t\t0x91, 0xb3, 0x11, 0xcb, 0x75, 0x37, 0x9a, 0x92, 0xca, 0xd1, 0x2a, 0x28,\n\t\t0x13, 0x03, 0xe3, 0x39, 0x5b, 0xef, 0x30, 0xb9, 0xb2, 0x86, 0x0f, 0x41,\n\t\t0xd3, 0xc4, 0x0b, 0xa2, 0x0e, 0x66, 0x59, 0xaa, 0x53, 0xf5, 0x54, 0x0e,\n\t\t0x37, 0xb8, 0x40, 0x0f, 0xaa, 0x32, 0x33, 0xe7, 0xb9, 0x96, 0x16, 0xea,\n\t\t0x81, 0x91, 0xd2, 0x92, 0x8c, 0x25, 0xd0, 0x69, 0x83, 0x25, 0x6a, 0x22,\n\t\t0xe2, 0x53, 0x24, 0xe0, 0xdc, 0x69, 0xbb, 0x96, 0x88, 0x23, 0xda, 0x9c,\n\t\t0x22, 0x3b, 0x5d, 0x37, 0x24, 0xc0, 0xc3, 0x53, 0x7d, 0xb2, 0xc3, 0x27,\n\t\t0x26, 0x46, 0x0b, 0x10, 0xf2, 0x37, 0xec, 0x0b, 0x2d, 0x1d, 0x7e, 0x6f,\n\t\t0xf3, 0xd5, 0xa7, 0xe2, 0x3e, 0x4c, 0x12, 0x56, 0xc4, 0x2a, 0x8e, 0x3d,\n\t\t0x8a, 0x72, 0x1b, 0x42, 0x83, 0xec, 0xd2, 0xf9, 0xae, 0x9f, 0x5e, 0xec,\n\t\t0x70, 0xba, 0xcc, 0x1e, 0x8d, 0xc7, 0x0a, 0x0b, 0x50, 0xba, 0x46, 0x93,\n\t\t0xed, 0x67, 0x00, 0x91, 0x49, 0x70, 0xa2, 0x8e, 0xc5, 0x38, 0x73, 0x0b,\n\t\t0x99, 0xc6, 0x1e, 0xaf, 0xf7, 0x99, 0x3d, 0x6f, 0xcc, 0x3f, 0xb8, 0x86,\n\t\t0x8b, 0x0b, 0x2c, 0x9d, 0x4c, 0xd7, 0x13, 0x81, 0x49, 0xa5, 0xa0, 0xa0,\n\t\t0x00, 0xe2, 0x88, 0x0a, 0x21, 0xca, 0x7a, 0xa9, 0x39, 0x2d, 0x7f, 0xd4,\n\t\t0xa8, 0x73, 0x87, 0x95, 0x91, 0xad, 0xcf, 0x21, 0x99, 0x4c, 0x4c, 0xe3,\n\t\t0xf7, 0x08, 0xd7, 0xca, 0xf2, 0x0a, 0xfd, 0x04, 0x73, 0xfd, 0xd8, 0x49,\n\t\t0xf2, 0x34, 0x13, 0x6e, 0xf0, 0x1f, 0x10, 0xad, 0x44, 0xb0, 0x48, 0x8e,\n\t\t0x41, 0x11, 0x8b, 0xbe, 0x2a, 0xfe, 0x48, 0xb5, 0xac, 0xb4, 0xf3, 0x85,\n\t\t0x43, 0xf5, 0x1c, 0xfe, 0xe5, 0x77, 0x0b, 0xcb, 0xed, 0xf6, 0x76, 0xbe,\n\t\t0x53, 0xea, 0x12, 0x38, 0x3d, 0x38, 0x25, 0x0b, 0x28, 0x4e, 0x4e, 0x4e,\n\t\t0xeb, 0x7f, 0x8d, 0x28, 0x25, 0x72, 0x59, 0x22, 0xb6, 0xb6, 0x0c, 0x77,\n\t\t0xe7, 0xeb, 0xfa, 0x24, 0xa0, 0xb3, 0xb5, 0x8e, 0x5f, 0x47, 0xf6, 0x26,\n\t\t0x50, 0x7b, 0xfe, 0xbf, 0x32, 0x6f, 0xae, 0x1a, 0x2e, 0x5c, 0x10, 0x80,\n\t\t0xcc, 0xb6, 0x6d, 0xc3, 0x6d, 0x4e, 0x36, 0x4e, 0x5c, 0xfe, 0xd5, 0xde,\n\t\t0x64, 0xe2, 0x64, 0xaf, 0x62, 0xa2, 0x02, 0xa4, 0x10, 0x70, 0x1c, 0x22,\n\t\t0x80, 0x07, 0xaf, 0xa8, 0xa8, 0x40, 0x07, 0x83, 0xc3, 0x99, 0x8d, 0x07,\n\t\t0x0d, 0x0e, 0xa7, 0x8b, 0x9a, 0x5d, 0x8e, 0x93, 0xd5, 0xde, 0x4f, 0x81,\n\t\t0xd9, 0x39, 0x9a, 0xc2, 0xf8, 0x31, 0x3b, 0xeb, 0xad, 0x97, 0x30, 0xf2,\n\t\t0xf2, 0xf2, 0x1e, 0x8e, 0xab, 0xbb, 0x14, 0x74, 0x2a, 0x88, 0xb4, 0x27,\n\t\t0x1b, 0x0a, 0x38, 0xdf, 0x96, 0x5a, 0x21, 0x09, 0x04, 0xbd, 0xd0, 0x02,\n\t\t0x7c, 0x2b, 0xbf, 0x43, 0xb7, 0xa1, 0x5e, 0x58, 0x6d, 0x87, 0xda, 0x7e,\n\t\t0xf6, 0x19, 0x95, 0x34, 0x6f, 0x94, 0x49, 0xbe, 0xe1, 0xde, 0x28, 0x63,\n\t\t0x4c, 0x82, 0x87, 0x8d, 0xbe, 0x4b, 0x17, 0xc6, 0xb4, 0x14, 0x13, 0xea,\n\t\t0x46, 0xcb, 0xfc, 0xd7, 0x84, 0x6b, 0x07, 0x02, 0xab, 0xda, 0x6a, 0xbe,\n\t\t0xff, 0x5c, 0xbe, 0x1f, 0x53, 0xa3, 0x9e, 0xd5, 0xad, 0x5d, 0x96, 0xba,\n\t\t0x9d, 0x86, 0xfb, 0xfa, 0xf5, 0xab, 0x5d, 0xb6, 0x0a, 0x54, 0xb3, 0x0e,\n\t\t0x43, 0x95, 0x5e, 0x07, 0xa2, 0xd7, 0xf3, 0xb4, 0x08, 0x03, 0x20, 0x97,\n\t\t0x43, 0x35, 0x86, 0x7d, 0x17, 0x80, 0x7a, 0x96, 0xff, 0xa8, 0x5e, 0x5d,\n\t\t0x24, 0x21, 0x21, 0xa9, 0xa9, 0xaf, 0x57, 0x79, 0x6e, 0x6a, 0x7b, 0xdd,\n\t\t0x28, 0x5d, 0x7e, 0x75, 0xf5, 0x99, 0x1c, 0x9b, 0x47, 0xac, 0xa3, 0x14,\n\t\t0x35, 0x98, 0xed, 0x26, 0x5a, 0x6c, 0xbd, 0x07, 0xa3, 0x66, 0xb7, 0x42,\n\t\t0x7a, 0x50, 0x84, 0x98, 0x91, 0x63, 0x20, 0x00, 0x93, 0x3f, 0x44, 0xbb,\n\t\t0xc9, 0x16, 0x02, 0xa4, 0x56, 0xa9, 0x55, 0x54, 0xe6, 0xbb, 0xd0, 0xe9,\n\t\t0xe3, 0xf5, 0xd1, 0x64, 0xf4, 0x5a, 0xf5, 0xbf, 0x1d, 0xba, 0xbc, 0x5a,\n\t\t0x74, 0x62, 0x8f, 0x17, 0xaa, 0xb7, 0x01, 0x8e, 0x69, 0xf6, 0xbc, 0xa5,\n\t\t0xd1, 0x6b, 0x77, 0x0f, 0x38, 0x38, 0x38, 0xa0, 0xd9, 0xe7, 0xe5, 0x5e,\n\t\t0x34, 0x3a, 0xfa, 0xed, 0x0b, 0x5e, 0xae, 0x26, 0x60, 0xde, 0xe2, 0x09,\n\t\t0xcd, 0xa7, 0xf6, 0x16, 0xf0, 0x63, 0xa1, 0x1c, 0xd3, 0x8d, 0x01, 0x26,\n\t\t0x08, 0x08, 0xd4, 0xb7, 0x13, 0x06, 0x26, 0xe0, 0x8d, 0xa5, 0x65, 0x80,\n\t\t0xb5, 0xa8, 0x96, 0x52, 0x08, 0x02, 0x2a, 0xdc, 0xe1, 0xfe, 0x6c, 0x7f,\n\t\t0x1b, 0xaf, 0x58, 0xc8, 0xa4, 0x87, 0x9b, 0x90, 0xc3, 0xd3, 0xad, 0xda,\n\t\t0x87, 0x49, 0xdb, 0x33, 0xb9, 0x15, 0xc2, 0xcd, 0xc5, 0xa5, 0xb2, 0xce,\n\t\t0xf6, 0x29, 0xdf, 0xe3, 0x7a, 0x4f, 0x4b, 0x33, 0x6c, 0x68, 0xbb, 0x14,\n\t\t0xcf, 0x29, 0x77, 0x67, 0x36, 0x2d, 0xb9, 0xf8, 0x6c, 0xfc, 0xe2, 0x96,\n\t\t0x9e, 0xfb, 0x11, 0x1e, 0x1a, 0x52, 0x26, 0x9d, 0x0d, 0x61, 0xdd, 0xe7,\n\t\t0x3e, 0xeb, 0x68, 0xa9, 0xf2, 0xf7, 0xd0, 0x4f, 0xda, 0x44, 0xf6, 0x2a,\n\t\t0xa8, 0x5c, 0x59, 0xeb, 0x8a, 0xb1, 0x5a, 0x40, 0xcb, 0xc1, 0xd3, 0x25,\n\t\t0xb4, 0x6b, 0xba, 0x4f, 0x9f, 0x23, 0x45, 0xed, 0x5c, 0x6b, 0x25, 0xc4,\n\t\t0xc4, 0x48, 0x68, 0xca, 0x6e, 0xce, 0x72, 0x06, 0x8c, 0x02, 0x46, 0x77,\n\t\t0xf3, 0x01, 0xa3, 0x0e, 0x64, 0x40, 0x14, 0x50, 0x0e, 0xea, 0xc8, 0xc0,\n\t\t0x5a, 0x87, 0xc3, 0x43, 0x41, 0x6e, 0x6e, 0x3c, 0xc7, 0x16, 0xc2, 0x88,\n\t\t0x88, 0x08, 0x4b, 0x18, 0xd7, 0xb2, 0x5e, 0x51, 0xf3, 0x60, 0x46, 0x1c,\n\t\t0x19, 0xe1, 0x09, 0x39, 0x5f, 0x94, 0x46, 0x03, 0xc5, 0x6f, 0xfd, 0xcb,\n\t\t0xbd, 0x58, 0xe7, 0xf2, 0xf8, 0x81, 0xf2, 0x0b, 0xe7, 0x0a, 0xc3, 0x91,\n\t\t0x51, 0x39, 0x5e, 0x47, 0x8a, 0x14, 0x81, 0x01, 0x22, 0xc8, 0xad, 0x44,\n\t\t0x35, 0x0d, 0x59, 0x16, 0x89, 0x59, 0xaf, 0xcf, 0x29, 0x26, 0x26, 0x01,\n\t\t0xbe, 0xd9, 0x35, 0x0d, 0x2c, 0xd5, 0xb7, 0x5a, 0x45, 0x59, 0x69, 0x52,\n\t\t0xe6, 0xff, 0xb9, 0x1d, 0xb4, 0x9e, 0x60, 0x76, 0x1a, 0x0f, 0xa1, 0xea,\n\t\t0xb4, 0x38, 0x8a, 0xc9, 0xce, 0x97, 0xab, 0x33, 0xce, 0xe5, 0x00, 0xca,\n\t\t0x69, 0xd3, 0x30, 0x9f, 0xed, 0x2d, 0x80, 0x46, 0x48, 0x7f, 0x27, 0xb9,\n\t\t0x00, 0x08, 0xb5, 0x7a, 0x85, 0x16, 0x1b, 0x0a, 0x6d, 0xe7, 0x2b, 0x0a,\n\t\t0xb7, 0x47, 0x48, 0x83, 0x67, 0x4a, 0xb1, 0x85, 0x64, 0x91, 0x92, 0x4e,\n\t\t0x97, 0xaf, 0x2e, 0x6d, 0xab, 0x46, 0x6a, 0xda, 0xc7, 0x84, 0xf9, 0x5d,\n\t\t0xa4, 0xf4, 0xe9, 0x28, 0x6e, 0x6d, 0x75, 0xd9, 0xf8, 0x76, 0x6f, 0x5d,\n\t\t0x91, 0x8e, 0xe1, 0x71, 0x4b, 0x4c, 0x31, 0xd5, 0xdc, 0x12, 0xbf, 0xb1,\n\t\t0x2a, 0x77, 0xa3, 0xe2, 0xcc, 0x89, 0x0e, 0x01, 0x05, 0xd6, 0x68, 0xf2,\n\t\t0x56, 0x48, 0xee, 0x6f, 0x2d, 0x1e, 0x9b, 0xee, 0x8e, 0x86, 0xda, 0x7c,\n\t\t0x93, 0x84, 0x44, 0xcc, 0x3c, 0xcb, 0x57, 0x5c, 0xd9, 0x95, 0x45, 0xa9,\n\t\t0x70, 0xcb, 0x40, 0x51, 0x52, 0x61, 0x1d, 0x1d, 0x42, 0xad, 0x46, 0xeb,\n\t\t0x88, 0xde, 0x5e, 0x91, 0xfe, 0xfe, 0x7e, 0x83, 0xbf, 0x99, 0xdc, 0x96,\n\t\t0xf7, 0x63, 0xc0, 0x02, 0x2a, 0x5c, 0xc3, 0xbb, 0x7b, 0x79, 0xf5, 0x8d,\n\t\t0x8e, 0x22, 0x31, 0x33, 0x33, 0x53, 0x40, 0x9e, 0xea, 0x7e, 0x5f, 0x88,\n\t\t0x20, 0x12, 0xb6, 0xb9, 0x3c, 0x8f, 0x4d, 0x72, 0x7f, 0xe0, 0x82, 0x40,\n\t\t0x23, 0x1a, 0xfa, 0x46, 0x9a, 0xb0, 0xbd, 0xe3, 0xc7, 0x39, 0xc7, 0x73,\n\t\t0x64, 0x41, 0x80, 0x23, 0x56, 0xda, 0xa9, 0xd3, 0xc2, 0xc3, 0xfe, 0x0d,\n\t\t0x10, 0xa1, 0x54, 0x96, 0x7c, 0xc6, 0xe8, 0x90, 0xc2, 0xaa, 0x88, 0x4e,\n\t\t0xa6, 0xad, 0xeb, 0xc9, 0x96, 0x20, 0xdc, 0xbf, 0x7a, 0x9d, 0x48, 0x20,\n\t\t0x03, 0xb0, 0xc3, 0x68, 0x7e, 0x7e, 0x5b, 0x1d, 0x44, 0xc5, 0x54, 0xb5,\n\t\t0x29, 0xf4, 0xb7, 0x40, 0xf0, 0x8d, 0xa7, 0xf8, 0x17, 0xf8, 0x60, 0x51,\n\t\t0x8c, 0x02, 0xb5, 0xc7, 0x90, 0xd1, 0xcd, 0xdc, 0x38, 0xd8, 0x33, 0xd7,\n\t\t0xdc, 0xc2, 0x06, 0x4b, 0xcd, 0xe5, 0x06, 0xab, 0x66, 0x2a, 0xea, 0x3c,\n\t\t0x05, 0xde, 0x4f, 0xd3, 0x52, 0x45, 0x18, 0x67, 0x67, 0x73, 0x70, 0xb8,\n\t\t0x7b, 0x3b, 0x3b, 0xfe, 0xc5, 0x16, 0x0d, 0x57, 0xcd, 0x40, 0x53, 0xd0,\n\t\t0x04, 0x65, 0x67, 0xa9, 0xfb, 0x67, 0xb6, 0x8b, 0x04, 0x1d, 0x20, 0x9a,\n\t\t0x02, 0x93, 0xb8, 0xbb, 0x9a, 0x1d, 0xf2, 0x45, 0x4a, 0x29, 0xd5, 0x34,\n\t\t0xfa, 0x2c, 0xee, 0x7a, 0xe1, 0x6c, 0xbb, 0xb7, 0xe1, 0xb9, 0xd9, 0x97,\n\t\t0x11, 0x67, 0xa9, 0x05, 0xa6, 0x41, 0x2b, 0x2e, 0x9f, 0x5a, 0x01, 0x4b,\n\t\t0x28, 0x40, 0x24, 0x05, 0x75, 0xad, 0x86, 0x89, 0x13, 0x02, 0xf4, 0xe0,\n\t\t0xde, 0x9c, 0x2b, 0x0d, 0x67, 0xb7, 0xf8, 0x4f, 0x43, 0x48, 0xa8, 0xac,\n\t\t0x15, 0x8f, 0x70, 0x37, 0x88, 0x02, 0x4f, 0xfc, 0x8a, 0x68, 0xa3, 0x15,\n\t\t0x55, 0x32, 0xf7, 0xb6, 0x10, 0xa3, 0xa7, 0xfb, 0x0b, 0x6c, 0x47, 0xb6,\n\t\t0x22, 0x4d, 0xd4, 0x32, 0x4b, 0xb4, 0xe4, 0xf8, 0xf2, 0x43, 0x83, 0x43,\n\t\t0x50, 0x44, 0xcd, 0x9d, 0x47, 0x9b, 0x26, 0xf7, 0x63, 0x33, 0x2e, 0x66,\n\t\t0x09, 0x25, 0x2b, 0x33, 0x73, 0x69, 0x46, 0xa0, 0x67, 0xa1, 0xc9, 0x68,\n\t\t0xf2, 0xc1, 0x7a, 0x97, 0xa0, 0x5c, 0x26, 0x57, 0xde, 0x75, 0x07, 0x29,\n\t\t0x29, 0x29, 0xcd, 0x6c, 0x2b, 0x31, 0x97, 0xfd, 0x97, 0xce, 0xf7, 0x37,\n\t\t0x2f, 0x10, 0x85, 0xdb, 0x59, 0xc4, 0xd7, 0x43, 0x58, 0xc3, 0xc9, 0xd1,\n\t\t0xbe, 0x5d, 0xc7, 0x49, 0xce, 0x66, 0xb2, 0x27, 0x58, 0xb7, 0xe0, 0x5f,\n\t\t0xc5, 0xf1, 0xa9, 0xbf, 0x02, 0x16, 0xcd, 0x18, 0x15, 0xc8, 0x31, 0xb6,\n\t\t0x4d, 0x3c, 0x39, 0x1c, 0xaf, 0xa3, 0x0c, 0x2c, 0x6c, 0x21, 0xb5, 0x69,\n\t\t0x91, 0x34, 0x52, 0x09, 0xfa, 0x66, 0xc6, 0x11, 0x30, 0x4a, 0x91, 0x59,\n\t\t0x5a, 0x08, 0xe7, 0x93, 0x4d, 0x99, 0xd8, 0x71, 0x44, 0xa8, 0x37, 0x0a,\n\t\t0x34, 0xe8, 0x02, 0x92, 0x5a, 0xf0, 0x24, 0x75, 0xb4, 0xfb, 0xba, 0x35,\n\t\t0x72, 0xcf, 0x48, 0x0c, 0xc1, 0xf1, 0xac, 0x71, 0x25, 0x99, 0x0c, 0x09,\n\t\t0x86, 0x19, 0xd9, 0x2a, 0xa4, 0x60, 0x70, 0x7f, 0xee, 0x02, 0x2b, 0x8b,\n\t\t0xa6, 0xa3, 0xa8, 0x87, 0x9f, 0x6d, 0x58, 0x23, 0x11, 0x7e, 0x25, 0x76,\n\t\t0x4e, 0xa2, 0x9a, 0xdd, 0xe3, 0xf4, 0x2d, 0x30, 0xc1, 0xc0, 0x3c, 0xce,\n\t\t0xe6, 0x1d, 0x60, 0x67, 0x46, 0xc6, 0x6a, 0x44, 0x16, 0x79, 0xf9, 0x5b,\n\t\t0xae, 0x02, 0xde, 0xa9, 0x89, 0xc9, 0x1e, 0xf5, 0xba, 0x77, 0xce, 0x39,\n\t\t0x92, 0xf8, 0x91, 0x9f, 0x49, 0x09, 0x71, 0xa4, 0xf1, 0xe0, 0x5a, 0x87,\n\t\t0xe1, 0x70, 0xcf, 0x1b, 0xc2, 0x53, 0x6f, 0xad, 0x9e, 0xf5, 0x72, 0x0a,\n\t\t0x6b, 0xba, 0x71, 0xab, 0xdd, 0x65, 0xd3, 0x3a, 0x0d, 0xf3, 0xc3, 0x59,\n\t\t0x64, 0xfa, 0xac, 0xf4, 0x39, 0x2d, 0x34, 0x32, 0x81, 0x96, 0x6c, 0x0b,\n\t\t0xc9, 0xfa, 0x7b, 0x87, 0xa1, 0x2a, 0x28, 0xb3, 0xd9, 0x1f, 0x2c, 0x9a,\n\t\t0x83, 0x88, 0x98, 0x09, 0x3f, 0xbb, 0xa2, 0x22, 0xdf, 0x46, 0xa7, 0x12,\n\t\t0xb4, 0xa0, 0xa1, 0x3e, 0x56, 0xaf, 0x7f, 0xfc, 0xd4, 0xc7, 0x56, 0xa4,\n\t\t0x97, 0xf1, 0x3c, 0x59, 0x1e, 0xaf, 0xb1, 0xa9, 0x76, 0xd6, 0xbc, 0x63,\n\t\t0x68, 0x22, 0x61, 0x6e, 0xd0, 0xd5, 0xd5, 0x95, 0x89, 0xc5, 0x72, 0xf1,\n\t\t0x3e, 0xf3, 0x33, 0xaf, 0x6b, 0x70, 0x6d, 0xad, 0x43, 0x48, 0xa6, 0x99,\n\t\t0xcd, 0x4c, 0xab, 0xcb, 0x31, 0x22, 0x0b, 0x2d, 0xed, 0x2d, 0x4b, 0x51,\n\t\t0x83, 0x8b, 0x89, 0x3a, 0x9c, 0x2c, 0xeb, 0xc7, 0x12, 0x85, 0x4d, 0xe8,\n\t\t0xf4, 0x84, 0x58, 0x29, 0xa2, 0x4b, 0xcf, 0x66, 0x4c, 0xbc, 0x38, 0xb1,\n\t\t0x60, 0x08, 0x7d, 0x97, 0x68, 0x2c, 0x2d, 0x78, 0x32, 0x7a, 0x99, 0xac,\n\t\t0x41, 0xa4, 0x62, 0x11, 0x99, 0x29, 0x76, 0x82, 0x63, 0xd4, 0xd0, 0x4c,\n\t\t0x25, 0xa1, 0xaa, 0x3e, 0x99, 0x28, 0xaa, 0x6f, 0xd1, 0x78, 0xf9, 0x41,\n\t\t0xe8, 0x3f, 0xfe, 0x34, 0x1d, 0x65, 0xc0, 0xf5, 0x73, 0x25, 0xc1, 0x93,\n\t\t0x9c, 0xfb, 0x31, 0x58, 0xb0, 0x2f, 0x3c, 0x6b, 0x64, 0x84, 0x4f, 0x9b,\n\t\t0xc7, 0xc8, 0x3c, 0xa7, 0x0a, 0xbf, 0x52, 0x5d, 0x20, 0xeb, 0x3b, 0x1d,\n\t\t0x0e, 0x81, 0x68, 0xc4, 0x64, 0x2b, 0x3a, 0x3a, 0xba, 0x7f, 0xd7, 0xdb,\n\t\t0x93, 0x74, 0x89, 0x57, 0x73, 0x5b, 0x9b, 0xf1, 0xc3, 0xc5, 0x26, 0xf6,\n\t\t0x4e, 0x48, 0xc8, 0x51, 0xfc, 0xce, 0xae, 0x32, 0x24, 0xfb, 0xae, 0xb0,\n\t\t0x35, 0x9f, 0x29, 0xdd, 0x1b, 0x7e, 0x9d, 0xc0, 0x2b, 0xea, 0x10, 0xe3,\n\t\t0x4a, 0x85, 0xc1, 0xd8, 0x28, 0x69, 0xb2, 0xe4, 0x65, 0x5f, 0x15, 0x59,\n\t\t0x78, 0x6a, 0x27, 0xf2, 0xd0, 0x5f, 0xdd, 0x05, 0xcb, 0x1e, 0xb0, 0x48,\n\t\t0x9f, 0xb8, 0x79, 0xff, 0xd0, 0xc9, 0xf7, 0x20, 0xda, 0xff, 0x92, 0x46,\n\t\t0xbc, 0xa7, 0x1f, 0x43, 0x41, 0xfe, 0xc0, 0x3b, 0x8b, 0x95, 0x8e, 0x5d,\n\t\t0xd2, 0x32, 0x12, 0x60, 0x13, 0x41, 0xc6, 0x86, 0xb6, 0xfc, 0x6d, 0x79,\n\t\t0x14, 0xb3, 0xdc, 0x06, 0xfa, 0x66, 0x67, 0x87, 0xcd, 0x7b, 0xe2, 0x9f,\n\t\t0x3f, 0x04, 0x14, 0x60, 0x2b, 0x6f, 0xf6, 0x22, 0xf0, 0x3f, 0x4e, 0x29,\n\t\t0x81, 0xb7, 0x57, 0x39, 0x1a, 0xb6, 0xb7, 0xb7, 0xf7, 0x2f, 0x30, 0xb6,\n\t\t0xb8, 0x12, 0x56, 0xfb, 0x2c, 0x77, 0x20, 0x36, 0x60, 0x44, 0xd8, 0x65,\n\t\t0x8f, 0x69, 0xc7, 0xf8, 0x88, 0x93, 0x80, 0x53, 0x31, 0x90, 0x15, 0x26,\n\t\t0x6f, 0x75, 0xeb, 0x2b, 0xa7, 0x47, 0xf2, 0xb1, 0xc1, 0xa0, 0x6f, 0xbd,\n\t\t0x12, 0x63, 0x34, 0x95, 0xe1, 0xd4, 0x8f, 0x20, 0x1b, 0x14, 0xbe, 0x96,\n\t\t0x45, 0x5b, 0xd8, 0xa4, 0x84, 0x75, 0x1d, 0x20, 0xc4, 0xf4, 0x9f, 0xaa,\n\t\t0x20, 0xfe, 0x27, 0x64, 0x84, 0x2d, 0xc7, 0x6a, 0x09, 0x73, 0x2d, 0x7c,\n\t\t0x2d, 0x3d, 0xb5, 0x0c, 0x71, 0xba, 0xdd, 0x4b, 0xeb, 0x43, 0x0d, 0x61,\n\t\t0xd3, 0x83, 0xcf, 0xad, 0x96, 0x23, 0x80, 0x8f, 0x0a, 0x17, 0x0e, 0x82,\n\t\t0xb5, 0x70, 0x19, 0x07, 0xc0, 0x7a, 0x03, 0xf0, 0x30, 0xa5, 0x37, 0x6f,\n\t\t0x84, 0x20, 0x2e, 0x42, 0xd4, 0xc0, 0xc0, 0xc0, 0x9f, 0x99, 0x3a, 0x8e,\n\t\t0x49, 0x24, 0x95, 0x26, 0xde, 0x22, 0xc2, 0xf1, 0xf0, 0x1f, 0xf7, 0xe2,\n\t\t0xaf, 0xd5, 0xcf, 0x37, 0xdf, 0x0a, 0xf6, 0x5d, 0x62, 0xed, 0x0c, 0x40,\n\t\t0x84, 0x5c, 0x1e, 0x78, 0x69, 0xdc, 0x8f, 0x1f, 0x17, 0x53, 0xb2, 0xf6,\n\t\t0x0e, 0x31, 0xf1, 0x61, 0x75, 0x50, 0xe1, 0x5e, 0x45, 0x20, 0x6b, 0x9e,\n\t\t0xbb, 0x35, 0x3f, 0x36, 0xd6, 0x38, 0x30, 0xbe, 0xef, 0x68, 0x80, 0xf4,\n\t\t0x0f, 0xe5, 0x59, 0x03, 0x49, 0x84, 0xe4, 0x0e, 0x78, 0xfa, 0x27, 0xce,\n\t\t0x9b, 0x58, 0xc8, 0x70, 0x8d, 0x85, 0xf4, 0x7a, 0x44, 0xe6, 0x28, 0x9a,\n\t\t0x38, 0xc9, 0xda, 0x8c, 0x56, 0xef, 0xae, 0xb0, 0xa7, 0xf1, 0x69, 0x00,\n\t\t0xf6, 0x7e, 0x78, 0xdc, 0xcf, 0x31, 0x34, 0x2d, 0xce, 0xa2, 0xbe, 0x86,\n\t\t0x41, 0xc2, 0xd9, 0x38, 0x5b, 0x6d, 0x53, 0xc5, 0xbf, 0x1e, 0xa1, 0xc6,\n\t\t0x51, 0x3f, 0xc5, 0x67, 0x8c, 0x12, 0xc9, 0xeb, 0xef, 0x34, 0x7e, 0x37,\n\t\t0xfc, 0x6f, 0x6c, 0xf7, 0xe1, 0x68, 0x48, 0xd0, 0xfe, 0x55, 0xcf, 0xba,\n\t\t0x32, 0xa6, 0x45, 0xe8, 0x4b, 0x77, 0x3c, 0x99, 0x04, 0xcd, 0x6c, 0x12,\n\t\t0x9c, 0xff, 0x7f, 0x19, 0x68, 0x97, 0x17, 0xdf, 0x45, 0x2a, 0xe7, 0xc9,\n\t\t0xd8, 0xf4, 0x28, 0x51, 0x8f, 0x51, 0xe4, 0x5a, 0x90, 0x51, 0x22, 0x95,\n\t\t0x90, 0x27, 0x13, 0x78, 0x3e, 0xaa, 0xcc, 0xf9, 0xb3, 0xa1, 0xf5, 0xca,\n\t\t0x0c, 0x2d, 0xcd, 0xd1, 0xe9, 0x0c, 0x96, 0x89, 0x0a, 0xf2, 0x05, 0x69,\n\t\t0xc0, 0x2c, 0x81, 0xbf, 0xce, 0xb8, 0xfa, 0xe0, 0x66, 0x0d, 0xc9, 0xef,\n\t\t0x6f, 0x85, 0x0e, 0x26, 0x70, 0x8d, 0xd1, 0xd1, 0xc8, 0x31, 0x0b, 0xac,\n\t\t0x6c, 0xc5, 0xf2, 0x39, 0xb1, 0x07, 0x07, 0xe6, 0xde, 0x57, 0xc3, 0x54,\n\t\t0x35, 0x35, 0x35, 0x93, 0xe6, 0x28, 0x1c, 0x19, 0x31, 0xc4, 0x7e, 0x2f,\n\t\t0x1f, 0x7f, 0x7a, 0x53, 0xed, 0xd2, 0xfd, 0x25, 0xee, 0xd9, 0x14, 0x6e,\n\t\t0x7e, 0xbb, 0x99, 0x5c, 0x26, 0xf5, 0x1e, 0x5b, 0xcd, 0xe6, 0xad, 0xa3,\n\t\t0x17, 0x5b, 0xd2, 0xa6, 0xe6, 0xcf, 0x9f, 0xde, 0x5c, 0xe1, 0xa0, 0xee,\n\t\t0x4d, 0x95, 0xce, 0x7d, 0xbb, 0xf7, 0xcc, 0x52, 0x15, 0x39, 0x73, 0x4f,\n\t\t0x40, 0x1a, 0xf2, 0x93, 0xa2, 0x82, 0xd2, 0xa3, 0x8b, 0x29, 0x74, 0x41,\n\t\t0x29, 0xcb, 0x29, 0xe9, 0xe4, 0x6c, 0x34, 0xe1, 0xc2, 0x0b, 0x2c, 0x6f,\n\t\t0x6f, 0x68, 0x3d, 0xa6, 0x6d, 0xce, 0x18, 0x51, 0x76, 0xba, 0x90, 0xe4,\n\t\t0x1d, 0x78, 0xe2, 0xa4, 0xd0, 0x3f, 0x56, 0x41, 0x69, 0x6e, 0x8f, 0x2d,\n\t\t0x59, 0xcb, 0x1e, 0x3d, 0xe2, 0x41, 0x8e, 0xd5, 0xd5, 0x0e, 0x2e, 0x15,\n\t\t0xa9, 0x65, 0x85, 0xc7, 0x07, 0x17, 0x4f, 0x83, 0x53, 0x53, 0x9f, 0xca,\n\t\t0xd5, 0x2a, 0x7b, 0x13, 0xa8, 0xe4, 0x6b, 0xdc, 0x2f, 0x8d, 0xb8, 0x78,\n\t\t0x78, 0xe6, 0xff, 0xbb, 0x1d, 0xdb, 0xbf, 0x9e, 0xea, 0xf2, 0xf3, 0xcb,\n\t\t0xe4, 0xf7, 0xc2, 0x39, 0xef, 0x7c, 0xae, 0x12, 0xf7, 0xaa, 0x5b, 0x57,\n\t\t0x78, 0xba, 0x3d, 0xca, 0x02, 0xcb, 0xe8, 0x35, 0xa3, 0xd6, 0x3a, 0x7c,\n\t\t0xc7, 0xaf, 0x3c, 0xdf, 0xda, 0x0a, 0x24, 0xf6, 0x7d, 0x80, 0x00, 0x5d,\n\t\t0x00, 0xd8, 0x4d, 0xa7, 0x55, 0x0f, 0x1f, 0x86, 0x46, 0x5c, 0xe5, 0x7c,\n\t\t0x56, 0x44, 0xa0, 0xd8, 0xfc, 0x7e, 0xc0, 0x5d, 0xb5, 0xee, 0x15, 0xfc,\n\t\t0xd2, 0x6b, 0x44, 0x6d, 0xa1, 0x24, 0x5d, 0xf8, 0xb5, 0xce, 0x7d, 0xbe,\n\t\t0xd9, 0x51, 0xac, 0x08, 0x4b, 0x07, 0x47, 0x9a, 0x47, 0xd8, 0x0e, 0xf1,\n\t\t0x13, 0x32, 0xa4, 0x63, 0x98, 0x9e, 0x99, 0x0e, 0x09, 0xfa, 0x62, 0x43,\n\t\t0x82, 0x64, 0xb6, 0xb3, 0x01, 0x38, 0xc4, 0x41, 0x45, 0x65, 0x03, 0x3d,\n\t\t0x34, 0x3e, 0x04, 0xc2, 0x2e, 0x96, 0x03, 0xed, 0x1c, 0x5b, 0xa5, 0x24,\n\t\t0x8b, 0xb6, 0xed, 0x5b, 0xf5, 0xf7, 0x84, 0x98, 0xd0, 0xf0, 0xca, 0x4a,\n\t\t0x7a, 0xb5, 0x6a, 0xbd, 0x98, 0xb9, 0x72, 0x75, 0x32, 0x56, 0x56, 0x4c,\n\t\t0x80, 0x87, 0xfb, 0x76, 0x47, 0x53, 0x3e, 0xc8, 0xaa, 0x7f, 0x60, 0xa0,\n\t\t0x67, 0x78, 0x18, 0xc1, 0xd4, 0xd4, 0xd4, 0xfd, 0xf1, 0x8a, 0x02, 0x12,\n\t\t0x12, 0x92, 0xc9, 0xec, 0x2f, 0x61, 0x03, 0xa8, 0x29, 0x5d, 0x89, 0xa3,\n\t\t0xec, 0xc5, 0xc5, 0xad, 0x7c, 0x64, 0xef, 0xc5, 0xeb, 0x0d, 0x36, 0xd9,\n\t\t0xef, 0x9a, 0x36, 0x51, 0x6a, 0x1c, 0xa5, 0xbc, 0xae, 0xae, 0x8e, 0x46,\n\t\t0x35, 0xd6, 0x10, 0x5c, 0xa1, 0xdd, 0x54, 0x35, 0xd2, 0x82, 0x51, 0x4a,\n\t\t0x98, 0x80, 0x5b, 0x01, 0xa3, 0xf0, 0xab, 0xda, 0xce, 0xc4, 0x30, 0x72,\n\t\t0x6d, 0x95, 0xa7, 0xbb, 0xaf, 0x81, 0x9b, 0xf0, 0xa4, 0x92, 0x64, 0xe3,\n\t\t0x1a, 0x3d, 0x27, 0x33, 0x16, 0xf7, 0xeb, 0xa1, 0xa4, 0xcc, 0xb0, 0xff,\n\t\t0xa7, 0x9c, 0xb0, 0x03, 0x2a, 0x84, 0x9f, 0xc3, 0xd8, 0xf6, 0xb6, 0x86,\n\t\t0x61, 0x0c, 0x9f, 0xdb, 0xa7, 0x8a, 0x3a, 0x70, 0xdb, 0x57, 0xb2, 0xd8,\n\t\t0xe7, 0x53, 0x0c, 0xb8, 0xea, 0xef, 0x2d, 0x42, 0x04, 0x7a, 0x3e, 0x3b,\n\t\t0x6c, 0x75, 0x65, 0x00, 0x30, 0x1a, 0x0e, 0x17, 0x50, 0x58, 0xcd, 0x6e,\n\t\t0x01, 0xe4, 0x1e, 0xdd, 0xed, 0x9e, 0x42, 0x52, 0xee, 0xcd, 0xeb, 0xa7,\n\t\t0x4a, 0xfa, 0x1f, 0x1d, 0x3a, 0x39, 0x64, 0x10, 0x18, 0x11, 0x34, 0x62,\n\t\t0x8a, 0xd7, 0x21, 0xf0, 0x5d, 0x2d, 0xc9, 0x53, 0x65, 0x61, 0x79, 0x71,\n\t\t0x45, 0x6a, 0xa5, 0xae, 0xb4, 0xb4, 0xd4, 0x45, 0xab, 0x8e, 0xc4, 0xc0,\n\t\t0xca, 0x0a, 0x49, 0x5b, 0x5b, 0x1b, 0xa0, 0x57, 0xb1, 0xf2, 0xe3, 0x91,\n\t\t0x5d, 0x47, 0x9d, 0x4e, 0xef, 0x96, 0x31, 0x0d, 0x88, 0x08, 0x15, 0x54,\n\t\t0x32, 0x01, 0x75, 0x0a, 0x5a, 0x3a, 0x1c, 0xe3, 0xd1, 0x6c, 0xb2, 0x87,\n\t\t0xed, 0x8b, 0x10, 0x9e, 0x9c, 0x5f, 0x8c, 0xba, 0xad, 0xc1, 0xd2, 0x29,\n\t\t0x96, 0xeb, 0x6e, 0x59, 0x86, 0xe0, 0x1f, 0xfb, 0x38, 0x1b, 0x13, 0x05,\n\t\t0xb8, 0x96, 0x6c, 0x82, 0xfc, 0xb4, 0xb8, 0x9c, 0xe7, 0x82, 0x83, 0xc5,\n\t\t0x59, 0x70, 0x4c, 0xd4, 0xf5, 0xac, 0x94, 0x71, 0x07, 0x48, 0x6e, 0xea,\n\t\t0xa7, 0xce, 0x8d, 0x64, 0x07, 0x71, 0x67, 0x01, 0x9d, 0xbb, 0xc8, 0x9e,\n\t\t0x0e, 0xa9, 0x11, 0xdf, 0xf5, 0x4b, 0xf2, 0xf3, 0x95, 0xd3, 0x5b, 0xa2,\n\t\t0xe1, 0x51, 0x88, 0x8c, 0x26, 0xd9, 0xbb, 0xfb, 0x0b, 0xb3, 0xde, 0xaf,\n\t\t0xf7, 0xd7, 0xab, 0x8b, 0x0e, 0x7b, 0x3b, 0x77, 0xcb, 0x3b, 0xb9, 0xb9,\n\t\t0x17, 0x49, 0xff, 0xeb, 0x42, 0xf1, 0x74, 0xbd, 0x0c, 0xb3, 0xb3, 0xc2,\n\t\t0xad, 0xd1, 0xa0, 0xd3, 0xe9, 0xb8, 0x86, 0xf7, 0x42, 0xcb, 0xf9, 0x36,\n\t\t0x5b, 0xb0, 0x6f, 0xe9, 0x24, 0x2b, 0x7b, 0xa4, 0xd6, 0xc6, 0xc7, 0x2b,\n\t\t0xef, 0x15, 0x22, 0x0f, 0xdf, 0x3d, 0x53, 0x22, 0x3f, 0x67, 0x84, 0xee,\n\t\t0xad, 0xd5, 0xf6, 0x1b, 0xef, 0x1a, 0x99, 0x94, 0x3e, 0xe7, 0xff, 0xee,\n\t\t0x02, 0x00, 0x42, 0x5a, 0xbb, 0x31, 0x4a, 0x2f, 0x29, 0x37, 0x3a, 0x6d,\n\t\t0xfe, 0xba, 0xc0, 0x70, 0x07, 0x90, 0xec, 0x11, 0x45, 0xc7, 0x4f, 0x43,\n\t\t0x7f, 0x32, 0xb3, 0xea, 0xcd, 0x07, 0x3f, 0xce, 0x4f, 0x6b, 0xe5, 0x98,\n\t\t0x6b, 0x19, 0xe0, 0x3c, 0x07, 0x45, 0xb2, 0xc0, 0xb7, 0xd2, 0xc5, 0x2c,\n\t\t0xc5, 0x1e, 0xec, 0x88, 0xb3, 0x1b, 0x98, 0x1a, 0x5d, 0xe2, 0x27, 0xf4,\n\t\t0x1b, 0x34, 0xe6, 0x83, 0x86, 0xee, 0x31, 0xba, 0x60, 0x65, 0x0d, 0xf0,\n\t\t0xb3, 0x9c, 0xa2, 0xe2, 0x18, 0x8f, 0x50, 0xb1, 0x9a, 0xf7, 0xea, 0x70,\n\t\t0x0f, 0x0e, 0x92, 0x69, 0xac, 0xa8, 0x24, 0x55, 0x17, 0xa2, 0x5b, 0xfb,\n\t\t0xeb, 0x37, 0xc8, 0x8d, 0xdd, 0xb3, 0x60, 0x12, 0x56, 0x41, 0xe5, 0x61,\n\t\t0x80, 0x70, 0xac, 0xa2, 0x5a, 0xc5, 0x0a, 0x9b, 0x1c, 0x6d, 0x51, 0x19,\n\t\t0x52, 0xa0, 0x5a, 0x74, 0xf2, 0x7e, 0xed, 0xee, 0xaa, 0x46, 0x7b, 0x53,\n\t\t0xcd, 0x46, 0x37, 0x73, 0xdd, 0xb6, 0x3e, 0x98, 0x10, 0x24, 0x92, 0x97,\n\t\t0x98, 0x6e, 0x9d, 0xca, 0x77, 0x0a, 0xfb, 0xe6, 0xed, 0x31, 0x23, 0x6a,\n\t\t0x6a, 0x6a, 0x86, 0x47, 0x44, 0x40, 0xe4, 0x54, 0x67, 0x0d, 0x52, 0x11,\n\t\t0xa2, 0x12, 0x0c, 0x42, 0x92, 0xd5, 0x5b, 0xec, 0x42, 0x23, 0xd5, 0xfd,\n\t\t0x1a, 0xfc, 0xfc, 0x18, 0x32, 0x10, 0x1e, 0x23, 0x2d, 0x62, 0x18, 0xdf,\n\t\t0x2c, 0x85, 0x16, 0x08, 0x34, 0x7e, 0xde, 0x8c, 0xfa, 0xc7, 0x79, 0xc6,\n\t\t0xc7, 0xad, 0x47, 0xfc, 0xa4, 0x18, 0x8a, 0x83, 0x1c, 0x21, 0x41, 0x79,\n\t\t0x2e, 0xf6, 0x26, 0xb1, 0xe9, 0x51, 0x99, 0x8f, 0x33, 0x0e, 0x94, 0xea,\n\t\t0x47, 0x50, 0xde, 0x1a, 0x30, 0x72, 0xc5, 0x9b, 0x03, 0xfb, 0x98, 0x51,\n\t\t0xe8, 0x69, 0x5a, 0xaf, 0x31, 0xfb, 0xb0, 0x1a, 0x69, 0x9e, 0x0b, 0xfd,\n\t\t0x24, 0xbf, 0x0c, 0x8a, 0xdf, 0x88, 0xfe, 0xe3, 0xb0, 0xc5, 0xe6, 0xc9,\n\t\t0x49, 0x1a, 0x00, 0x62, 0x1f, 0xb7, 0xa6, 0x8f, 0x4f, 0xd6, 0x54, 0xf2,\n\t\t0x89, 0x36, 0x04, 0xf3, 0x49, 0x7b, 0x47, 0x7c, 0x41, 0x9a, 0xa0, 0x59,\n\t\t0xf7, 0xc0, 0x1c, 0x14, 0x21, 0x7b, 0xf0, 0x6a, 0xe8, 0xaf, 0xfc, 0x4d,\n\t\t0x45, 0xa3, 0x69, 0x5b, 0xe5, 0x5a, 0x96, 0xc1, 0xce, 0x0e, 0x40, 0xb4,\n\t\t0x59, 0x8e, 0x4f, 0x31, 0x65, 0x5d, 0x03, 0x4d, 0x44, 0x45, 0x89, 0x05,\n\t\t0xfe, 0x68, 0xd7, 0x63, 0xa5, 0xdc, 0x20, 0x21, 0x35, 0x82, 0xc6, 0xcb,\n\t\t0x41, 0x41, 0xdc, 0x51, 0x7d, 0x68, 0x56, 0x0c, 0x4c, 0x6b, 0xbd, 0x5d,\n\t\t0xd0, 0xdf, 0xd3, 0x8e, 0xc9, 0x91, 0x01, 0x88, 0x0a, 0x1a, 0x48, 0xe8,\n\t\t0x22, 0x16, 0xee, 0xfc, 0x1c, 0xf2, 0xad, 0xde, 0x06, 0x6a, 0x9d, 0x36,\n\t\t0x5c, 0xa4, 0xf4, 0x2a, 0xf7, 0xd3, 0x84, 0xf4, 0xf8, 0x98, 0x88, 0xeb,\n\t\t0xce, 0x5e, 0xce, 0x51, 0x53, 0x92, 0xff, 0xf4, 0xaf, 0x73, 0xbe, 0x05,\n\t\t0xfa, 0x1a, 0xd4, 0x52, 0x43, 0x37, 0xde, 0xaa, 0xb0, 0x1e, 0x80, 0xb0,\n\t\t0x7f, 0x73, 0x86, 0xc0, 0x7b, 0x86, 0x81, 0x6f, 0x38, 0xbb, 0xf7, 0xc3,\n\t\t0x16, 0x87, 0x77, 0xef, 0x39, 0xbe, 0x62, 0x45, 0x90, 0x41, 0x88, 0x9b,\n\t\t0xd4, 0x9e, 0xda, 0xd0, 0x5d, 0x4e, 0xf1, 0x16, 0x7c, 0x9a, 0x6f, 0xd0,\n\t\t0x8d, 0xc9, 0xaf, 0xd2, 0xa4, 0xc3, 0x09, 0x7c, 0xf9, 0xb7, 0x71, 0x91,\n\t\t0x56, 0x4e, 0xa3, 0xe9, 0x42, 0x21, 0x64, 0x15, 0xf9, 0xb3, 0xbe, 0x65,\n\t\t0x16, 0x31, 0x24, 0x24, 0x24, 0x3c, 0x36, 0x56, 0x2d, 0x21, 0xad, 0xf3,\n\t\t0x88, 0x9d, 0x18, 0x9b, 0x40, 0xff, 0x58, 0xca, 0x6e, 0x79, 0x70, 0x4c,\n\t\t0x34, 0xdc, 0x6d, 0x0d, 0xdf, 0x5f, 0xc8, 0x6f, 0x82, 0x26, 0xc6, 0x5d,\n\t\t0xf3, 0x81, 0x8f, 0x81, 0xe7, 0xa1, 0xb5, 0x20, 0xa8, 0x9a, 0x97, 0xe5,\n\t\t0xcf, 0x95, 0xfd, 0xd5, 0xb4, 0x4d, 0x66, 0x9b, 0x27, 0x71, 0x88, 0xd8,\n\t\t0xd1, 0x6e, 0x60, 0xd4, 0xff, 0xa3, 0xe9, 0xaa, 0xc3, 0xa2, 0x7e, 0xbe,\n\t\t0xee, 0x22, 0x21, 0x21, 0xdd, 0x1d, 0x02, 0x22, 0xdd, 0xdd, 0x12, 0xd2,\n\t\t0x48, 0x77, 0x77, 0x77, 0x97, 0x94, 0x74, 0x23, 0xdd, 0x20, 0x25, 0x25,\n\t\t0xdd, 0xd2, 0xdd, 0xcd, 0x92, 0x8b, 0x34, 0x2c, 0xdd, 0xf5, 0xee, 0x7e,\n\t\t0xdf, 0xe7, 0xf7, 0x3c, 0xfc, 0x39, 0xcc, 0xec, 0xdc, 0xb9, 0xf7, 0xdc,\n\t\t0x73, 0x26, 0xee, 0x47, 0x12, 0x8b, 0x11, 0x92, 0x2c, 0x7c, 0xbb, 0x9f,\n\t\t0x8a, 0xb1, 0xf0, 0x99, 0x7b, 0xa6, 0x33, 0x38, 0xff, 0xa0, 0xa3, 0xe5,\n\t\t0x75, 0x22, 0x87, 0x81, 0xdc, 0x31, 0xaa, 0xfd, 0x28, 0xd2, 0x88, 0x6d,\n\t\t0x3e, 0xa7, 0xe5, 0x7d, 0xdc, 0x3c, 0xc9, 0xa2, 0xa0, 0xb6, 0xaf, 0x22,\n\t\t0x6a, 0x59, 0xe3, 0x7e, 0x29, 0x99, 0x25, 0x46, 0xb7, 0xe2, 0x0f, 0x74,\n\t\t0xd3, 0x36, 0x15, 0xb6, 0x50, 0x56, 0x22, 0x59, 0x7e, 0x24, 0xf4, 0xf1,\n\t\t0xb4, 0x35, 0xac, 0x3c, 0xd2, 0xa7, 0x1d, 0x3c, 0x62, 0x52, 0x29, 0x61,\n\t\t0xf7, 0xce, 0x71, 0xb7, 0xdb, 0x15, 0x0f, 0xce, 0x6a, 0xf8, 0x9e, 0x91,\n\t\t0x41, 0xd8, 0xe6, 0x79, 0x66, 0x70, 0x58, 0x0f, 0x41, 0xe4, 0x63, 0x6d,\n\t\t0x62, 0x77, 0x48, 0x58, 0xd6, 0x82, 0x93, 0x0f, 0x0f, 0xe6, 0xab, 0x15,\n\t\t0x62, 0x63, 0xbc, 0xbd, 0x4f, 0xec, 0x18, 0x59, 0x9d, 0xb5, 0x08, 0xb8,\n\t\t0x03, 0x5f, 0x85, 0xc3, 0x6f, 0x8e, 0x91, 0x85, 0xe3, 0x2b, 0x6f, 0x05,\n\t\t0x39, 0x04, 0xd0, 0xaf, 0xba, 0xd7, 0xde, 0xd5, 0x15, 0x5f, 0xb8, 0x81,\n\t\t0x6d, 0xe9, 0x5b, 0x9a, 0x6a, 0xa5, 0xbf, 0x96, 0xfe, 0xc1, 0x2d, 0xd9,\n\t\t0xdd, 0x93, 0x35, 0x9f, 0x77, 0xe9, 0xfc, 0x2c, 0x31, 0xcd, 0xd0, 0x9f,\n\t\t0xaf, 0x19, 0x15, 0x8d, 0x29, 0xa9, 0x7d, 0x92, 0x30, 0x46, 0x4e, 0x0e,\n\t\t0xdf, 0xef, 0x61, 0x9e, 0x27, 0x4f, 0xb6, 0x82, 0x1f, 0x6d, 0x19, 0xfb,\n\t\t0x5d, 0x39, 0x44, 0x51, 0x6b, 0x57, 0x84, 0x75, 0x2c, 0xb0, 0xd6, 0xa6,\n\t\t0xf7, 0xe0, 0x9c, 0x6c, 0xa1, 0xed, 0x11, 0x89, 0xeb, 0x4b, 0x81, 0x32,\n\t\t0x05, 0x37, 0xb7, 0x86, 0xc2, 0xe2, 0xf8, 0x24, 0x32, 0x7b, 0xab, 0x38,\n\t\t0x53, 0x52, 0x4b, 0x17, 0xf4, 0x8d, 0xca, 0xec, 0xdd, 0x90, 0x4d, 0x09,\n\t\t0x4b, 0xbb, 0xf2, 0xdf, 0xa1, 0x7b, 0xca, 0xce, 0x5a, 0x97, 0x6d, 0xb3,\n\t\t0x06, 0x37, 0x0d, 0x16, 0xf9, 0x4b, 0x0a, 0x6e, 0xb2, 0xe8, 0xa5, 0xe7,\n\t\t0x0f, 0x99, 0xff, 0x9a, 0x79, 0x78, 0x9f, 0x57, 0x1b, 0x18, 0x3f, 0x25,\n\t\t0xfe, 0x38, 0x90, 0xc4, 0x0c, 0xde, 0xa0, 0xfc, 0x99, 0x4f, 0xe2, 0xe0,\n\t\t0x30, 0x16, 0xcb, 0x4b, 0x32, 0x63, 0x1c, 0x3e, 0x92, 0xf5, 0x8e, 0xb5,\n\t\t0xe2, 0x31, 0x8a, 0x11, 0x0f, 0xc5, 0xf5, 0x17, 0x5a, 0xdf, 0x5a, 0x79,\n\t\t0x1f, 0x67, 0x75, 0x39, 0x13, 0x4e, 0x59, 0xfb, 0x90, 0x24, 0xa8, 0x6d,\n\t\t0x3f, 0x46, 0x60, 0x59, 0x7b, 0xa9, 0x9c, 0x17, 0xb5, 0x00, 0x82, 0x03,\n\t\t0xcc, 0xdb, 0x10, 0x14, 0xac, 0x60, 0x93, 0xfc, 0x76, 0xb0, 0x38, 0xf3,\n\t\t0x3e, 0x30, 0xaf, 0xa5, 0xd8, 0x59, 0xcd, 0x57, 0xbf, 0xae, 0xbe, 0xe9,\n\t\t0x6f, 0x2f, 0x61, 0x5f, 0xe3, 0x46, 0xf3, 0xda, 0xc2, 0x0c, 0x59, 0x25,\n\t\t0xbe, 0x42, 0x4f, 0xd2, 0xdd, 0x50, 0xef, 0xaf, 0x71, 0xfc, 0xb0, 0xb7,\n\t\t0x6a, 0xe9, 0x6d, 0x88, 0xc3, 0x54, 0x81, 0x25, 0xa7, 0x85, 0x4e, 0xfd,\n\t\t0xd7, 0x16, 0x06, 0x39, 0x99, 0x38, 0x72, 0xb9, 0x15, 0xaa, 0xb5, 0x87,\n\t\t0x3e, 0x89, 0x87, 0x84, 0x13, 0x5c, 0xb3, 0x73, 0x3a, 0xbe, 0xe6, 0xba,\n\t\t0x8b, 0xf7, 0x7a, 0x0e, 0xe1, 0x44, 0x8d, 0x0b, 0x9b, 0xef, 0x82, 0xab,\n\t\t0x99, 0x6a, 0xfd, 0x4f, 0xdf, 0xc9, 0x13, 0x2f, 0xd4, 0x28, 0xa2, 0xb2,\n\t\t0xab, 0x70, 0xfc, 0x59, 0x18, 0xd4, 0xc0, 0x5b, 0x45, 0xfa, 0x7a, 0xba,\n\t\t0xd6, 0xd5, 0x20, 0xfc, 0xd0, 0xe9, 0x7b, 0xd7, 0xf0, 0xc7, 0x42, 0x75,\n\t\t0x67, 0xc9, 0x30, 0x50, 0x9d, 0xb8, 0xd9, 0xc5, 0x39, 0xc8, 0xd5, 0x55,\n\t\t0xf7, 0x44, 0xc8, 0x4b, 0x91, 0xe5, 0x11, 0x11, 0xde, 0x8f, 0x31, 0x9d,\n\t\t0xaf, 0xa3, 0x97, 0x2b, 0xb6, 0xc9, 0xa8, 0x5e, 0xeb, 0x60, 0x6b, 0x0e,\n\t\t0x39, 0xaf, 0x83, 0x47, 0x8a, 0x09, 0xcd, 0x74, 0xff, 0x55, 0x35, 0x5f,\n\t\t0x66, 0x6c, 0x11, 0x21, 0x2c, 0xad, 0x1d, 0x7b, 0x5c, 0x21, 0x76, 0xec,\n\t\t0x6b, 0x7f, 0x95, 0xe7, 0xd9, 0x2d, 0x59, 0x09, 0xd4, 0x37, 0x43, 0x08,\n\t\t0xae, 0x35, 0x9d, 0x5a, 0xd7, 0x43, 0x09, 0x09, 0x03, 0xf3, 0x2c, 0xd2,\n\t\t0xfd, 0x1a, 0xe3, 0xac, 0xc4, 0x4e, 0x57, 0x8d, 0x86, 0xda, 0xc2, 0xac,\n\t\t0xce, 0xd6, 0x2b, 0x2a, 0x34, 0x6d, 0xe1, 0x14, 0xe6, 0x22, 0x02, 0x13,\n\t\t0x7f, 0xd1, 0xce, 0x85, 0x13, 0xe3, 0x02, 0x20, 0xab, 0xf9, 0xeb, 0xf1,\n\t\t0xea, 0x3b, 0xec, 0x7b, 0x0a, 0xbc, 0xe8, 0xca, 0x0c, 0x05, 0x3a, 0xf4,\n\t\t0x3e, 0x56, 0x5e, 0x4f, 0xc5, 0x75, 0x27, 0x01, 0x9e, 0xe6, 0x2f, 0x8a,\n\t\t0x01, 0x98, 0x49, 0x73, 0xec, 0x95, 0x5e, 0x72, 0x9e, 0xe9, 0x59, 0x44,\n\t\t0xa6, 0x0f, 0xd9, 0x17, 0x56, 0xea, 0x93, 0x4c, 0xd5, 0x28, 0x7a, 0x3a,\n\t\t0xcb, 0xc6, 0xe3, 0xf9, 0x64, 0x15, 0xce, 0x6a, 0x27, 0xd0, 0x87, 0x59,\n\t\t0x33, 0x0f, 0x5d, 0x70, 0xa7, 0x3d, 0xbb, 0x4e, 0x10, 0x95, 0xea, 0x63,\n\t\t0x6e, 0x1d, 0x46, 0x75, 0xa5, 0xaa, 0x3a, 0x87, 0x31, 0x9b, 0x5b, 0x13,\n\t\t0x29, 0xf6, 0x81, 0x3f, 0xc8, 0xe3, 0x74, 0xf2, 0x8f, 0xd5, 0xe3, 0x21,\n\t\t0x5e, 0x18, 0x55, 0xa7, 0xbf, 0xf6, 0x43, 0xd9, 0x39, 0xc6, 0xf3, 0x7d,\n\t\t0x37, 0xba, 0xda, 0xcc, 0xa4, 0xfb, 0xb6, 0xb7, 0x0a, 0x11, 0x28, 0x59,\n\t\t0x0e, 0x95, 0x5f, 0xf2, 0xdb, 0x6e, 0x97, 0xba, 0x6d, 0x5c, 0xb7, 0x26,\n\t\t0x44, 0x70, 0x33, 0x39, 0xb7, 0xef, 0xfe, 0xfb, 0xb7, 0xd5, 0x1f, 0x89,\n\t\t0xad, 0xa3, 0xdd, 0x5c, 0xee, 0xf4, 0x74, 0x6b, 0x4f, 0x4d, 0x93, 0x8a,\n\t\t0xb7, 0xe4, 0xe2, 0x6a, 0x13, 0x8e, 0x5e, 0x8a, 0x16, 0x52, 0x5e, 0x07,\n\t\t0xf0, 0xcb, 0xf5, 0x58, 0x5f, 0x77, 0x0c, 0xee, 0x33, 0x36, 0xdd, 0x1e,\n\t\t0xdf, 0x76, 0xf2, 0x9c, 0xe9, 0x64, 0x0b, 0x54, 0xe8, 0x26, 0x23, 0xdd,\n\t\t0xde, 0x53, 0xd3, 0xc1, 0xde, 0x7e, 0x5e, 0x78, 0xba, 0x69, 0xe2, 0x11,\n\t\t0x13, 0xf8, 0x00, 0x9e, 0x53, 0xb7, 0x97, 0x9f, 0x7b, 0x10, 0x56, 0xb1,\n\t\t0x36, 0xf8, 0x24, 0x54, 0xfe, 0x65, 0x1a, 0xbb, 0x3f, 0x1f, 0xd6, 0xeb,\n\t\t0xdc, 0x68, 0x16, 0xab, 0x84, 0xdd, 0xd4, 0x44, 0x7b, 0xe5, 0xaf, 0x81,\n\t\t0xd8, 0xbd, 0xd9, 0xa2, 0x56, 0xed, 0xca, 0x6a, 0x6b, 0x14, 0x3b, 0x87,\n\t\t0x46, 0x0d, 0xb2, 0xa5, 0xb1, 0xc5, 0x6f, 0x8f, 0x40, 0x6d, 0x7c, 0xba,\n\t\t0xa8, 0xde, 0xe2, 0xed, 0x92, 0x66, 0x38, 0x62, 0x6e, 0xbb, 0xb2, 0x3f,\n\t\t0x6b, 0x8c, 0x62, 0xa4, 0xe1, 0xc6, 0xb5, 0x6e, 0x87, 0x2a, 0x0b, 0xcb,\n\t\t0x11, 0x53, 0x7d, 0x4a, 0x95, 0x7b, 0xbd, 0x25, 0x61, 0x42, 0x90, 0xe8,\n\t\t0x5c, 0x3b, 0xaa, 0x3b, 0x90, 0xe5, 0x20, 0x96, 0x63, 0xf4, 0x76, 0xb4,\n\t\t0xeb, 0x5c, 0xd2, 0xdd, 0x77, 0x5a, 0x26, 0xe0, 0xaa, 0xbd, 0x4e, 0x79,\n\t\t0x3d, 0x7b, 0x20, 0xa6, 0xe6, 0xad, 0xfe, 0x3e, 0xd3, 0xaa, 0x4f, 0x0c,\n\t\t0xc1, 0x44, 0x35, 0xa9, 0x5e, 0x51, 0x66, 0xa5, 0xdf, 0x82, 0xf6, 0x21,\n\t\t0xd3, 0x56, 0xd6, 0x97, 0x08, 0xfa, 0x74, 0xd7, 0x39, 0x15, 0x6a, 0xbf,\n\t\t0xaa, 0xe9, 0x18, 0xea, 0x21, 0x5e, 0x35, 0x7b, 0xb7, 0xf9, 0x2e, 0xba,\n\t\t0x44, 0x28, 0x5e, 0xfd, 0xa1, 0x42, 0xdf, 0x82, 0x76, 0xd0, 0xbd, 0x2d,\n\t\t0x9e, 0x45, 0x29, 0x5e, 0x31, 0xa0, 0x02, 0xfb, 0x0d, 0x9a, 0x8c, 0xf7,\n\t\t0x3e, 0x58, 0x37, 0x6b, 0x63, 0x43, 0x18, 0x5d, 0xa8, 0x6a, 0xa9, 0x62,\n\t\t0xf9, 0x20, 0x44, 0xf2, 0x1b, 0xdb, 0xea, 0xaf, 0x56, 0x34, 0xfa, 0xfd,\n\t\t0x4d, 0xac, 0x76, 0x72, 0xab, 0xed, 0xd1, 0x24, 0x57, 0x0a, 0x33, 0x24,\n\t\t0x5e, 0xf2, 0x59, 0xa9, 0x11, 0xa4, 0x1d, 0x2c, 0xd1, 0x26, 0x86, 0x28,\n\t\t0x0e, 0x5e, 0x6c, 0x6f, 0x4d, 0x16, 0x1f, 0x0c, 0xce, 0x90, 0x42, 0x3a,\n\t\t0x79, 0xb2, 0x99, 0xe6, 0xec, 0x14, 0x5a, 0x84, 0xce, 0xc8, 0x99, 0x62,\n\t\t0xd4, 0x36, 0xd1, 0x69, 0x87, 0x16, 0xad, 0x67, 0x2f, 0x62, 0xd1, 0x4a,\n\t\t0xd2, 0x3e, 0xcb, 0x38, 0x62, 0xad, 0xfd, 0xc1, 0xcf, 0xbb, 0x32, 0xf2,\n\t\t0x32, 0x9a, 0xc4, 0x59, 0x99, 0x56, 0x3c, 0xcb, 0x91, 0x10, 0xc5, 0x80,\n\t\t0xa3, 0x73, 0x64, 0xfc, 0x04, 0x6e, 0x3f, 0x1b, 0xfe, 0xfc, 0x82, 0xba,\n\t\t0xd6, 0xea, 0xfa, 0x3e, 0x1a, 0x8f, 0x49, 0x25, 0x39, 0xcc, 0x43, 0xbd,\n\t\t0xdd, 0x7d, 0xc6, 0x7b, 0x9b, 0x8c, 0x2c, 0x3e, 0x7a, 0x8b, 0xc2, 0x90,\n\t\t0x31, 0x4b, 0x48, 0xd1, 0x12, 0xc6, 0x29, 0xd3, 0x09, 0x4c, 0x8f, 0x54,\n\t\t0x6d, 0x67, 0x75, 0x8d, 0x0a, 0x86, 0x5e, 0x88, 0xae, 0x60, 0xeb, 0x8b,\n\t\t0x40, 0x40, 0x0a, 0x23, 0x3d, 0xd6, 0x30, 0xcc, 0x9c, 0xce, 0xb7, 0xfa,\n\t\t0x83, 0x90, 0x33, 0x66, 0x6f, 0x4a, 0x8f, 0x37, 0xe4, 0x37, 0xc6, 0x7a,\n\t\t0x74, 0x48, 0xaa, 0x87, 0x46, 0x0c, 0x49, 0x34, 0x0d, 0x5d, 0x86, 0x0f,\n\t\t0xb9, 0x2b, 0xb4, 0xe2, 0xa7, 0x81, 0x5e, 0xd2, 0xd7, 0xe0, 0xdf, 0x8f,\n\t\t0x57, 0x75, 0xa6, 0x43, 0xe7, 0x43, 0xe4, 0x81, 0x56, 0xfe, 0xf1, 0x83,\n\t\t0xc1, 0x5f, 0xa9, 0x7b, 0x8b, 0x65, 0x92, 0x29, 0x52, 0x7f, 0x6a, 0x1c,\n\t\t0xbb, 0xd6, 0xd6, 0xf7, 0xfe, 0x75, 0x61, 0xb2, 0x7f, 0xd0, 0x51, 0x24,\n\t\t0xf4, 0x45, 0x8d, 0x1f, 0xeb, 0x29, 0xfb, 0xde, 0xb3, 0xdc, 0xea, 0xb1,\n\t\t0xf1, 0xb6, 0xd2, 0x7e, 0x76, 0x4e, 0x37, 0x7a, 0x8a, 0xbe, 0xb5, 0xe9,\n\t\t0xd9, 0x54, 0x62, 0xe7, 0x23, 0x4e, 0x51, 0x00, 0xf1, 0x25, 0x4d, 0xeb,\n\t\t0xd9, 0x68, 0x3a, 0x64, 0x15, 0xbb, 0x7c, 0xcd, 0x56, 0x7a, 0xe4, 0xa3,\n\t\t0x29, 0x97, 0x1b, 0x1f, 0x75, 0x9c, 0xb1, 0x46, 0x3d, 0x16, 0xc9, 0x4e,\n\t\t0x6e, 0x1c, 0x78, 0x5c, 0x09, 0xb1, 0x4c, 0x0a, 0xd2, 0xe2, 0xaf, 0xe8,\n\t\t0x5c, 0x70, 0x88, 0xd4, 0xa2, 0x5f, 0xcf, 0xb2, 0x26, 0x16, 0x33, 0xee,\n\t\t0xee, 0xa4, 0xc7, 0x93, 0x98, 0xbe, 0xa7, 0x4c, 0x4c, 0x5a, 0xdc, 0xf9,\n\t\t0xe5, 0x0e, 0xed, 0xaf, 0x78, 0x5b, 0x7a, 0xec, 0x07, 0x51, 0x5a, 0x5a,\n\t\t0xee, 0xf9, 0x4f, 0xf5, 0x70, 0xa0, 0x6f, 0xee, 0x36, 0x21, 0x25, 0x81,\n\t\t0xff, 0xd8, 0x9f, 0xb1, 0x91, 0xf0, 0xb9, 0xbf, 0xee, 0xbd, 0xc7, 0xaa,\n\t\t0x29, 0x50, 0xa6, 0x3b, 0xff, 0x17, 0x83, 0x94, 0x2a, 0xf5, 0x3b, 0xea,\n\t\t0xcf, 0x9f, 0x68, 0x0e, 0x73, 0x94, 0x08, 0xaf, 0xec, 0x4d, 0x5a, 0xb7,\n\t\t0x6f, 0xe3, 0xaf, 0x88, 0xac, 0x3c, 0xae, 0x24, 0x67, 0x2b, 0xbb, 0x78,\n\t\t0xa1, 0x70, 0x4b, 0x55, 0x28, 0x3a, 0xee, 0x2d, 0x47, 0xe6, 0x06, 0x77,\n\t\t0x53, 0x76, 0xe1, 0x83, 0x6c, 0x89, 0x4d, 0xa7, 0xa9, 0x0c, 0x9a, 0x6d,\n\t\t0x2f, 0x24, 0x5d, 0xa0, 0x3e, 0x74, 0x11, 0x37, 0xfa, 0x9b, 0xc7, 0xf1,\n\t\t0x4d, 0x5a, 0x7e, 0xdc, 0xa7, 0x0c, 0x36, 0x6b, 0xea, 0x55, 0xda, 0xfe,\n\t\t0xf6, 0x9b, 0xb5, 0x89, 0x1d, 0x93, 0xf3, 0x49, 0x14, 0x74, 0xd3, 0x55,\n\t\t0xd2, 0x2f, 0xf9, 0x1e, 0x5f, 0x9c, 0x29, 0x3d, 0xe9, 0xe8, 0x99, 0x1b,\n\t\t0x81, 0x4d, 0x51, 0x26, 0x25, 0x2e, 0x85, 0xc5, 0x05, 0x04, 0x42, 0x65,\n\t\t0xf8, 0x20, 0x06, 0xfd, 0x12, 0x8e, 0x5f, 0x79, 0xa5, 0x0b, 0xb7, 0x84,\n\t\t0x2e, 0x21, 0xcd, 0x18, 0xe4, 0xa0, 0x34, 0x24, 0xfd, 0xa2, 0xc3, 0xc7,\n\t\t0x50, 0x6a, 0xdc, 0xd6, 0xe7, 0x3d, 0xfe, 0x1b, 0x8f, 0xa9, 0xe7, 0x93,\n\t\t0x25, 0x69, 0x36, 0x82, 0x41, 0x02, 0x84, 0xbb, 0x53, 0x13, 0xa0, 0x41,\n\t\t0xbb, 0x07, 0xd3, 0x62, 0x8d, 0xe1, 0xd9, 0xed, 0x15, 0xa7, 0x5b, 0x46,\n\t\t0x46, 0x86, 0x56, 0x83, 0x55, 0xe2, 0xfa, 0x72, 0xfe, 0x46, 0x0e, 0x9b,\n\t\t0x45, 0xc4, 0x55, 0x0e, 0x61, 0xa3, 0x6c, 0x24, 0x9e, 0x73, 0x6c, 0xf6,\n\t\t0xa0, 0xad, 0x2c, 0x06, 0xc1, 0xa3, 0x5b, 0x27, 0xbc, 0xa3, 0xf0, 0x13,\n\t\t0xc5, 0xeb, 0xd5, 0xa8, 0x7c, 0xbb, 0xf6, 0xee, 0x06, 0x05, 0xc7, 0x52,\n\t\t0xd7, 0x75, 0x33, 0x05, 0xab, 0xdb, 0xf1, 0x96, 0xd6, 0xf7, 0x18, 0x2f,\n\t\t0x81, 0x12, 0x95, 0xef, 0x23, 0x3b, 0x08, 0xc0, 0x26, 0xbe, 0x66, 0x44,\n\t\t0x1f, 0xff, 0x59, 0x35, 0xc2, 0x2f, 0x54, 0x64, 0xff, 0x7e, 0x4c, 0x68,\n\t\t0xeb, 0xf4, 0x9a, 0xb5, 0x9d, 0xa3, 0x07, 0x09, 0x4c, 0x7c, 0x8d, 0xfe,\n\t\t0x80, 0x5e, 0x27, 0x17, 0x01, 0x4e, 0xc9, 0x30, 0xdd, 0x7c, 0x6b, 0xeb,\n\t\t0xca, 0x9d, 0x88, 0x23, 0x98, 0x86, 0x15, 0x79, 0x6b, 0x22, 0x16, 0x7d,\n\t\t0xf8, 0x00, 0x7e, 0xb8, 0xda, 0xdf, 0x99, 0x14, 0x38, 0xfb, 0x9d, 0xe6,\n\t\t0xca, 0xa5, 0x36, 0x25, 0x74, 0x97, 0xad, 0x2f, 0x72, 0xb9, 0x95, 0x0f,\n\t\t0x78, 0xde, 0x89, 0x2c, 0x57, 0x4c, 0xc6, 0xe1, 0xdb, 0xd7, 0x6a, 0x3f,\n\t\t0x05, 0x78, 0x9c, 0x78, 0x06, 0xe4, 0x92, 0x90, 0x10, 0x00, 0xec, 0x9d,\n\t\t0x00, 0xb2, 0xb2, 0x63, 0x18, 0x38, 0xf9, 0x62, 0xc9, 0xcb, 0x74, 0xfd,\n\t\t0x52, 0x61, 0x7d, 0x76, 0x8d, 0x85, 0xea, 0xf5, 0x83, 0x56, 0x0b, 0xbf,\n\t\t0xd9, 0xd4, 0x64, 0xe1, 0x19, 0x35, 0x30, 0xe9, 0x53, 0xb1, 0xd8, 0x12,\n\t\t0x8d, 0x23, 0x10, 0xe7, 0x16, 0x9f, 0xf2, 0xaa, 0x9a, 0xd8, 0xff, 0x9c,\n\t\t0x46, 0x93, 0x49, 0x86, 0x86, 0x79, 0xf9, 0x8d, 0x90, 0x39, 0xc7, 0xf7,\n\t\t0xf8, 0xb7, 0x1b, 0x6d, 0x27, 0x19, 0x32, 0xc4, 0x96, 0xe9, 0x0c, 0xe3,\n\t\t0x7d, 0xb8, 0xa0, 0xeb, 0x96, 0x3b, 0xa0, 0x57, 0x57, 0xf6, 0x8d, 0x1e,\n\t\t0x48, 0xdf, 0xb2, 0xd9, 0x84, 0xf5, 0x8c, 0x0f, 0xd2, 0x51, 0x17, 0x09,\n\t\t0xa4, 0xc1, 0xba, 0x1b, 0x67, 0xcf, 0xef, 0x5a, 0x5f, 0xdd, 0x6e, 0x7a,\n\t\t0x5d, 0xaf, 0x7d, 0x12, 0x7d, 0xd0, 0x01, 0xe5, 0x08, 0x78, 0x82, 0x3a,\n\t\t0xef, 0x36, 0xfa, 0xc6, 0x58, 0xba, 0x4f, 0x12, 0xaf, 0x7c, 0xdb, 0xfb,\n\t\t0x7e, 0xa0, 0x03, 0x85, 0xa2, 0x94, 0xe9, 0xe0, 0x3a, 0x6e, 0xd6, 0xfa,\n\t\t0xac, 0xc0, 0x20, 0x7a, 0xbf, 0xe3, 0x0d, 0x89, 0x71, 0xdd, 0x96, 0xf9,\n\t\t0x6a, 0x17, 0x1d, 0xe5, 0x7c, 0x84, 0xc0, 0x2c, 0x41, 0xa2, 0x90, 0x47,\n\t\t0xb7, 0x60, 0xd9, 0xf2, 0x5a, 0x05, 0x41, 0xb7, 0xfd, 0x28, 0x78, 0xa5,\n\t\t0xfa, 0x28, 0xaa, 0xc9, 0xec, 0x6e, 0x3b, 0x1e, 0x8f, 0xa1, 0xf3, 0x57,\n\t\t0x07, 0xfd, 0x5d, 0x31, 0xc1, 0x52, 0x85, 0x68, 0xde, 0x06, 0x3b, 0xa2,\n\t\t0xe8, 0x86, 0xeb, 0xcb, 0xc8, 0x96, 0x6c, 0x62, 0x29, 0x38, 0xb8, 0xb5,\n\t\t0x5f, 0xac, 0x44, 0x9e, 0x73, 0x1c, 0x38, 0xe4, 0xfb, 0x9e, 0xcd, 0x6b,\n\t\t0x34, 0x9f, 0x1d, 0x49, 0xb6, 0x7c, 0x6e, 0xef, 0xd2, 0x7b, 0x3a, 0x8f,\n\t\t0x0e, 0xb3, 0x49, 0x96, 0xfe, 0x9c, 0xd4, 0x04, 0xf1, 0x37, 0x94, 0xe7,\n\t\t0xb1, 0x4c, 0x04, 0xff, 0x3d, 0x07, 0x47, 0xc7, 0x6f, 0xfd, 0x0c, 0x3d,\n\t\t0x9e, 0x3a, 0x30, 0xf4, 0xde, 0xc5, 0x25, 0xe1, 0x75, 0xca, 0x37, 0x98,\n\t\t0x5c, 0x4a, 0x80, 0x1e, 0xfb, 0x55, 0xb7, 0x83, 0xff, 0x54, 0xd5, 0x59,\n\t\t0xc4, 0x6c, 0x2f, 0xac, 0xa0, 0x1b, 0xdd, 0x07, 0x81, 0x15, 0x87, 0xf6,\n\t\t0xf0, 0x53, 0xb7, 0x3a, 0xa7, 0x7e, 0x02, 0x1f, 0x23, 0xd2, 0x6a, 0x6e,\n\t\t0xc8, 0xbf, 0xb3, 0x6c, 0x78, 0x13, 0xf5, 0x39, 0x9c, 0x22, 0xa7, 0xaa,\n\t\t0x18, 0x13, 0x3b, 0x0e, 0x8f, 0x64, 0xbb, 0xc6, 0x39, 0x06, 0xae, 0x84,\n\t\t0x77, 0xf4, 0x62, 0x01, 0xb5, 0xa2, 0xef, 0xa5, 0xd2, 0xbd, 0xcf, 0x78,\n\t\t0x09, 0x8b, 0xa8, 0xdc, 0xcd, 0x0d, 0xad, 0x06, 0xb1, 0xe8, 0x64, 0x24,\n\t\t0x73, 0xb5, 0x03, 0x65, 0xcc, 0x76, 0x3d, 0x91, 0xf4, 0x71, 0xa2, 0x8b,\n\t\t0xf4, 0x63, 0x39, 0x10, 0xe0, 0xda, 0x9d, 0xf7, 0x5a, 0x47, 0xec, 0x7a,\n\t\t0x16, 0x85, 0xa4, 0x2f, 0xae, 0x06, 0x45, 0xce, 0x0f, 0xe4, 0xc8, 0x8d,\n\t\t0xdf, 0x66, 0x8e, 0xb1, 0x6b, 0x09, 0x4c, 0xad, 0x56, 0xfb, 0xcd, 0x09,\n\t\t0x1c, 0x30, 0x49, 0xca, 0x7a, 0x18, 0x94, 0xd6, 0x2d, 0xe5, 0x38, 0xb3,\n\t\t0x5d, 0xe5, 0xf3, 0x84, 0x49, 0x97, 0xaa, 0x1f, 0x1c, 0x65, 0xa6, 0xea,\n\t\t0x2d, 0xa7, 0x4c, 0xae, 0x0f, 0x66, 0x86, 0xc7, 0xc7, 0x1b, 0x62, 0x85,\n\t\t0x38, 0xbd, 0x39, 0xc1, 0x64, 0x42, 0xd3, 0x87, 0xcb, 0xcf, 0x85, 0x58,\n\t\t0x82, 0x57, 0x7b, 0x96, 0x74, 0x74, 0xb3, 0x30, 0x74, 0x6f, 0x49, 0xd7,\n\t\t0xe7, 0xff, 0xbe, 0xa5, 0xb3, 0xfe, 0x11, 0x79, 0x07, 0xeb, 0xb7, 0xcf,\n\t\t0xdd, 0x40, 0x27, 0x7b, 0xef, 0xbc, 0xce, 0xfc, 0xdc, 0xf5, 0x14, 0xb1,\n\t\t0x7e, 0xdf, 0x6d, 0xb1, 0x79, 0xf6, 0xf3, 0x28, 0x42, 0x42, 0x58, 0xd5,\n\t\t0x81, 0x3c, 0x58, 0xd9, 0x7e, 0xe0, 0x9f, 0x01, 0x12, 0x9e, 0xdc, 0xaa,\n\t\t0x27, 0x25, 0x25, 0x8b, 0x6a, 0x1f, 0xde, 0x7f, 0xb6, 0xc2, 0x8d, 0xda,\n\t\t0x12, 0x2e, 0xb4, 0x72, 0x21, 0x8a, 0x8f, 0xfc, 0xd0, 0xcc, 0x50, 0xfd,\n\t\t0x0d, 0x7f, 0x80, 0x5f, 0x28, 0x37, 0xe0, 0x2a, 0x90, 0x37, 0xd1, 0x6d,\n\t\t0x66, 0x37, 0xa0, 0x51, 0x56, 0xfb, 0xec, 0x38, 0xab, 0xdd, 0xd3, 0x2e,\n\t\t0xd6, 0xf7, 0x8c, 0x24, 0x7c, 0xf7, 0x78, 0xd4, 0x36, 0xa5, 0xb4, 0xb8,\n\t\t0x78, 0x2b, 0xd7, 0x17, 0xdc, 0x53, 0xad, 0xdf, 0x8e, 0x81, 0xb1, 0xb5,\n\t\t0xc1, 0x75, 0xbb, 0x01, 0x3e, 0x59, 0xa9, 0x27, 0xe0, 0x73, 0xa1, 0xbe,\n\t\t0xbc, 0xac, 0xf6, 0x54, 0x68, 0x77, 0x95, 0x08, 0x14, 0x7c, 0x99, 0x5e,\n\t\t0x77, 0xea, 0x68, 0xd9, 0xf0, 0x3f, 0xa7, 0xde, 0xd0, 0xab, 0xfd, 0x00,\n\t\t0x3f, 0xc0, 0x0f, 0x5c, 0x86, 0xf5, 0x44, 0xed, 0xbb, 0x37, 0xf6, 0x17,\n\t\t0xc4, 0x75, 0xe8, 0xac, 0xd7, 0xfa, 0xad, 0x75, 0x39, 0xa6, 0x91, 0x2d,\n\t\t0xaf, 0x28, 0xf9, 0xb3, 0xcf, 0xac, 0x65, 0xcf, 0x39, 0x76, 0xba, 0xd2,\n\t\t0x55, 0x37, 0x83, 0xea, 0x23, 0x18, 0x0b, 0x8b, 0x24, 0x22, 0x60, 0x1d,\n\t\t0x68, 0x7a, 0xbc, 0x61, 0x0a, 0x00, 0x4c, 0x46, 0x3f, 0x65, 0xc8, 0x8b,\n\t\t0x8c, 0x23, 0xd4, 0x2a, 0x6f, 0x0c, 0x7f, 0xf5, 0xbf, 0xac, 0x64, 0xb8,\n\t\t0x0e, 0x0a, 0x0a, 0xb0, 0xf9, 0x36, 0xdf, 0x9a, 0x3d, 0x18, 0xb0, 0x19,\n\t\t0x6a, 0xac, 0xfc, 0xf9, 0xf8, 0xf6, 0x45, 0x0a, 0x44, 0xa2, 0x7b, 0x4b,\n\t\t0x32, 0xe0, 0xaf, 0xd4, 0xad, 0x6b, 0xce, 0xfe, 0x3e, 0xa8, 0xec, 0x5c,\n\t\t0x99, 0x2e, 0xf5, 0xe6, 0xcd, 0xdc, 0xfb, 0xb1, 0x1f, 0xd3, 0x63, 0xac,\n\t\t0x16, 0x8d, 0x4c, 0x30, 0x62, 0xa6, 0x48, 0xba, 0xa8, 0xac, 0xac, 0x6c,\n\t\t0x63, 0xea, 0x94, 0x29, 0x29, 0x39, 0x99, 0xcd, 0xe5, 0xdf, 0xd7, 0xf6,\n\t\t0xc5, 0x32, 0x26, 0x10, 0xf1, 0x76, 0x9e, 0xd2, 0xc6, 0xfe, 0x75, 0x8c,\n\t\t0xd7, 0x50, 0xde, 0xa7, 0xf3, 0x35, 0xdd, 0x3c, 0x20, 0xcd, 0x55, 0xf5,\n\t\t0x29, 0xb6, 0xd3, 0x90, 0xd3, 0x53, 0xe3, 0x21, 0x6a, 0xce, 0x0c, 0x64,\n\t\t0x95, 0x3a, 0x23, 0x15, 0x47, 0x04, 0x05, 0x39, 0x09, 0xde, 0x5e, 0x87,\n\t\t0x8a, 0x1c, 0x18, 0x3c, 0xe5, 0xff, 0xb9, 0xeb, 0xbe, 0x39, 0x78, 0x00,\n\t\t0xf1, 0xe4, 0x5e, 0x51, 0x44, 0xe5, 0xba, 0xdb, 0x23, 0xae, 0x3e, 0x05,\n\t\t0xa4, 0x4e, 0x4b, 0xd6, 0x15, 0xf3, 0x19, 0x39, 0x7b, 0x5b, 0xaf, 0xd5,\n\t\t0xc7, 0x69, 0xd2, 0x84, 0x0d, 0x94, 0xdc, 0xef, 0x3f, 0x19, 0xee, 0x90,\n\t\t0xbf, 0xbd, 0x8e, 0x5a, 0x0f, 0xd6, 0x16, 0x29, 0xf3, 0x70, 0x99, 0xb7,\n\t\t0x66, 0xb4, 0x2c, 0xd3, 0x09, 0x5e, 0xfc, 0x25, 0xf5, 0x30, 0xf5, 0xbd,\n\t\t0x3d, 0xe9, 0x69, 0x71, 0xde, 0xa9, 0xf5, 0xbe, 0xb2, 0xc8, 0xab, 0xa1,\n\t\t0x4e, 0xcb, 0xce, 0x8e, 0xc1, 0xfc, 0x28, 0xb5, 0x4c, 0xe3, 0x0a, 0xc1,\n\t\t0x89, 0x3b, 0x83, 0xcc, 0xc3, 0xf9, 0x2c, 0x83, 0x52, 0x96, 0xbe, 0xa7,\n\t\t0xbc, 0x9a, 0x5a, 0x86, 0x19, 0x60, 0x9b, 0x24, 0x49, 0x6e, 0x1e, 0xdf,\n\t\t0x88, 0x25, 0x56, 0x76, 0x8f, 0xd5, 0xe0, 0x6b, 0x91, 0xcc, 0xfd, 0x7d,\n\t\t0xbb, 0xbb, 0xe2, 0xdb, 0xd9, 0x02, 0x3d, 0x0d, 0x5e, 0xd7, 0x2b, 0x35,\n\t\t0xff, 0xba, 0x38, 0x76, 0xa1, 0xff, 0xc0, 0x39, 0xcc, 0x3a, 0x26, 0x31,\n\t\t0xa9, 0x31, 0x70, 0xaf, 0xe3, 0x77, 0xb9, 0x6c, 0x49, 0x3a, 0xb5, 0xe9,\n\t\t0xd7, 0xe2, 0xdc, 0x07, 0x75, 0xf1, 0x66, 0x9d, 0x68, 0xfd, 0x9f, 0x3b,\n\t\t0xc8, 0x1f, 0xa6, 0xe7, 0xcb, 0xa7, 0xe5, 0x0c, 0x8c, 0x91, 0x7e, 0x09,\n\t\t0xde, 0xe0, 0x71, 0xbf, 0x39, 0xff, 0xdb, 0x7b, 0x0f, 0x7b, 0x30, 0x77,\n\t\t0xfa, 0x53, 0x27, 0xaf, 0xf2, 0x17, 0x38, 0x8b, 0x75, 0xad, 0x9c, 0xec,\n\t\t0x01, 0xc2, 0x3b, 0x58, 0x3d, 0x4e, 0xb4, 0xc6, 0x73, 0x85, 0x80, 0xd5,\n\t\t0x2a, 0x99, 0x2c, 0x7c, 0x5e, 0xe7, 0x14, 0xe1, 0x68, 0xa4, 0x36, 0x69,\n\t\t0xe3, 0x30, 0x46, 0x7b, 0x9d, 0xcd, 0xed, 0x76, 0x01, 0x97, 0x57, 0x83,\n\t\t0x42, 0xc3, 0xd5, 0x6e, 0x03, 0x15, 0x2a, 0xf4, 0xe7, 0xcf, 0x45, 0xd8,\n\t\t0xeb, 0x06, 0xef, 0x96, 0xb1, 0xa9, 0x23, 0x8b, 0x8a, 0x1b, 0xc6, 0x9b,\n\t\t0xec, 0x9b, 0xb4, 0xea, 0xec, 0x0d, 0xa9, 0x2c, 0x3a, 0x6f, 0x91, 0x5e,\n\t\t0x9f, 0x6e, 0x6a, 0x78, 0x3d, 0xf8, 0x07, 0xc0, 0xf7, 0xe9, 0xc3, 0xac,\n\t\t0xe3, 0x81, 0xfe, 0x78, 0x6d, 0x0b, 0x75, 0x92, 0xac, 0x17, 0xcc, 0x62,\n\t\t0x30, 0xbb, 0xae, 0xd6, 0x70, 0xdb, 0x8f, 0x35, 0xde, 0x95, 0x5c, 0x53,\n\t\t0xde, 0x08, 0x74, 0x17, 0x84, 0x01, 0x1e, 0x4f, 0x03, 0xd3, 0x7d, 0x0b,\n\t\t0x56, 0x7a, 0x76, 0x38, 0xef, 0x8e, 0x94, 0x41, 0x57, 0x95, 0xb8, 0xc4,\n\t\t0x89, 0x9a, 0xca, 0x7a, 0xa7, 0x3b, 0x84, 0x82, 0x3c, 0x0c, 0xfc, 0xa2,\n\t\t0x45, 0xbd, 0xa5, 0x57, 0x7b, 0x5b, 0x2b, 0xde, 0x6f, 0x7d, 0x05, 0xd8,\n\t\t0xfb, 0x27, 0xb7, 0x2f, 0x67, 0x81, 0x6f, 0x5f, 0x54, 0x54, 0xb0, 0x34,\n\t\t0xaa, 0xf5, 0x22, 0xd3, 0xd3, 0x09, 0xe2, 0x07, 0xd4, 0x36, 0xf1, 0x58,\n\t\t0x0c, 0x62, 0xf8, 0x5c, 0xf7, 0xfe, 0x5a, 0x71, 0xae, 0xc6, 0x7a, 0x5a,\n\t\t0xe7, 0x05, 0xfd, 0xf8, 0x24, 0xc0, 0x5d, 0x4b, 0xd7, 0xfc, 0x52, 0x63,\n\t\t0x19, 0x8b, 0x8b, 0x70, 0x73, 0x18, 0x23, 0x35, 0xb3, 0xcd, 0x1c, 0x9f,\n\t\t0x4a, 0xbc, 0xbf, 0xe6, 0xd0, 0x6b, 0x6a, 0x9d, 0x81, 0x59, 0x48, 0xb7,\n\t\t0x0d, 0x4a, 0x95, 0xcf, 0xee, 0x74, 0x82, 0x8f, 0x94, 0xc1, 0x77, 0x7e,\n\t\t0xd0, 0x41, 0x33, 0x29, 0xea, 0xa3, 0x64, 0x0d, 0x2f, 0xc4, 0x12, 0xfa,\n\t\t0x40, 0x5b, 0x3f, 0xb7, 0x6f, 0xc5, 0x69, 0xd3, 0x71, 0xdd, 0xcf, 0xb9,\n\t\t0xc6, 0xd6, 0x61, 0xd8, 0xc9, 0xb4, 0x44, 0x7d, 0xd9, 0x56, 0x65, 0xa8,\n\t\t0x29, 0xe8, 0xb1, 0x79, 0x7a, 0xff, 0xfc, 0x03, 0x15, 0x00, 0x18, 0xfc,\n\t\t0xcd, 0xa1, 0xd3, 0x40, 0x17, 0xc0, 0xc5, 0xc4, 0x14, 0xb3, 0x7a, 0xf8,\n\t\t0x40, 0xd1, 0xfd, 0xa8, 0x39, 0x9e, 0x0e, 0xc2, 0xd3, 0xf4, 0xcc, 0x00,\n\t\t0x36, 0xfd, 0xf6, 0xb7, 0x9e, 0xba, 0x2a, 0x3f, 0xd4, 0x6a, 0xb4, 0x56,\n\t\t0x8a, 0xdd, 0x48, 0xd6, 0x0d, 0xf9, 0x77, 0x86, 0x26, 0xf6, 0x9d, 0xc8,\n\t\t0xef, 0x75, 0x92, 0x63, 0xb9, 0xf6, 0x85, 0x62, 0x8f, 0x59, 0xcb, 0xc6,\n\t\t0xb3, 0xdd, 0x7d, 0xa9, 0x5a, 0x1f, 0x1a, 0x15, 0x01, 0x0f, 0xbb, 0xf8,\n\t\t0x0d, 0xf6, 0xc0, 0xda, 0x4f, 0x5f, 0x08, 0x63, 0xa5, 0x3a, 0xae, 0x67,\n\t\t0xe5, 0x14, 0xd5, 0xb7, 0x82, 0x2e, 0x0b, 0xc5, 0xce, 0xba, 0x39, 0xeb,\n\t\t0x47, 0xfb, 0xd5, 0xf5, 0x2a, 0x9a, 0x3b, 0x2d, 0x3e, 0xb4, 0xf8, 0x5e,\n\t\t0x57, 0xdd, 0xe0, 0x59, 0xda, 0x3b, 0xa1, 0xe9, 0x8d, 0x4d, 0xf6, 0x7d,\n\t\t0xef, 0x37, 0xcb, 0xe6, 0x4f, 0x0b, 0xb7, 0xd5, 0x7e, 0x40, 0x44, 0x47,\n\t\t0x0a, 0x5e, 0xb1, 0x91, 0xd4, 0x50, 0x2c, 0x58, 0xd7, 0x79, 0x40, 0x5e,\n\t\t0xf1, 0xae, 0xde, 0x97, 0xb5, 0x9a, 0xa7, 0x8f, 0x21, 0x9c, 0x25, 0xbe,\n\t\t0xdb, 0xe4, 0x5a, 0x2b, 0xd8, 0xa5, 0xbd, 0x90, 0x8c, 0x57, 0x24, 0x8d,\n\t\t0x16, 0x89, 0xa7, 0xd9, 0xee, 0x5f, 0x91, 0x4b, 0xa0, 0xf6, 0xf7, 0xd3,\n\t\t0xd1, 0x19, 0x12, 0x06, 0xa0, 0x8d, 0x92, 0xe2, 0x3b, 0x8b, 0x74, 0xcb,\n\t\t0x1e, 0x64, 0x67, 0xe9, 0xfd, 0x94, 0xe7, 0xd0, 0xfd, 0xdd, 0xf8, 0xd8,\n\t\t0x31, 0xb6, 0xf4, 0x87, 0xcd, 0x12, 0xfc, 0x89, 0xab, 0xda, 0xbb, 0xea,\n\t\t0x9b, 0xef, 0x6b, 0x8d, 0x3e, 0x06, 0x9c, 0x3c, 0x81, 0x3b, 0x83, 0x3c,\n\t\t0x1e, 0xca, 0x6b, 0xfb, 0x3d, 0x3e, 0x41, 0xcc, 0x52, 0xcd, 0xb2, 0x62,\n\t\t0xae, 0x60, 0xa4, 0xc3, 0x7a, 0xdb, 0x36, 0x24, 0x7b, 0xf6, 0xff, 0xd6,\n\t\t0xae, 0x3f, 0x71, 0x98, 0xe1, 0x82, 0xcb, 0x76, 0xb5, 0x5b, 0x6f, 0xc3,\n\t\t0x9d, 0x12, 0xbc, 0xfa, 0x00, 0x89, 0x9e, 0x9c, 0x5b, 0x74, 0xf2, 0x69,\n\t\t0xd2, 0x9a, 0xc9, 0x00, 0x40, 0xe2, 0x36, 0x25, 0xf3, 0xa6, 0x23, 0x67,\n\t\t0x86, 0xbd, 0xdc, 0x3c, 0x80, 0xa2, 0xfa, 0x1b, 0x0e, 0x88, 0x48, 0xb2,\n\t\t0x4d, 0x70, 0x71, 0x2e, 0x86, 0x96, 0xa3, 0x09, 0xac, 0xd0, 0x0f, 0x71,\n\t\t0xd8, 0xaf, 0xad, 0xd9, 0xdf, 0x47, 0xbd, 0xdb, 0xcb, 0x8a, 0x1b, 0x8e,\n\t\t0x78, 0xda, 0xf2, 0x21, 0xee, 0x33, 0x58, 0xcf, 0xc1, 0x9a, 0xaf, 0x29,\n\t\t0x2d, 0x11, 0xda, 0xfa, 0xda, 0x4e, 0xd1, 0x25, 0x5d, 0xa2, 0x62, 0x72,\n\t\t0x9d, 0xb0, 0xc1, 0xeb, 0x7c, 0x8b, 0x05, 0x10, 0xc5, 0x70, 0xab, 0x69,\n\t\t0xb0, 0x6b, 0xbd, 0x74, 0x10, 0xe3, 0x9d, 0x54, 0x55, 0xd9, 0x48, 0xe5,\n\t\t0xe3, 0x07, 0x29, 0x06, 0xfc, 0x9c, 0x46, 0x75, 0x8e, 0x33, 0xc5, 0x34,\n\t\t0xd6, 0x49, 0x0b, 0x93, 0xac, 0xd8, 0x29, 0xbd, 0x69, 0xaf, 0xec, 0x40,\n\t\t0x6e, 0x4b, 0xfc, 0xeb, 0x63, 0xf0, 0xc7, 0xe3, 0x23, 0x14, 0xca, 0xd8,\n\t\t0xbe, 0xf8, 0xec, 0xc4, 0x87, 0x7c, 0xaa, 0x3b, 0x00, 0x72, 0x0d, 0x8f,\n\t\t0xb0, 0xc4, 0x6f, 0x1a, 0xb1, 0x1a, 0xdd, 0x9e, 0xac, 0x2c, 0xd7, 0x1a,\n\t\t0xc3, 0x76, 0xbd, 0xdc, 0xea, 0xf6, 0x0f, 0xfa, 0x68, 0x56, 0x5d, 0x54,\n\t\t0x14, 0xff, 0xfa, 0x05, 0x1a, 0xc0, 0x37, 0xec, 0x3f, 0x5a, 0xa8, 0xd4,\n\t\t0x57, 0xbc, 0x24, 0x16, 0x6a, 0xc1, 0xdf, 0x08, 0xd8, 0x76, 0xe4, 0xe9,\n\t\t0x28, 0xf1, 0xbb, 0xff, 0xe7, 0x9d, 0x42, 0x58, 0x3d, 0x45, 0xf3, 0xd5,\n\t\t0x6a, 0x51, 0xeb, 0xa7, 0x09, 0x5b, 0xb6, 0x2b, 0x0e, 0xce, 0xa1, 0xd3,\n\t\t0x3f, 0x35, 0x64, 0x15, 0x66, 0xc3, 0x10, 0x08, 0x44, 0x97, 0xff, 0xe3,\n\t\t0x3c, 0xb8, 0x46, 0x68, 0xf6, 0x7b, 0xfd, 0x07, 0xfc, 0x61, 0xe4, 0x57,\n\t\t0x82, 0xd7, 0xde, 0x1f, 0xb8, 0xb6, 0x58, 0xc3, 0x20, 0xfc, 0xea, 0x81,\n\t\t0x0a, 0x99, 0x22, 0xb5, 0x0c, 0x0f, 0x25, 0xd3, 0xe9, 0xd9, 0x4a, 0xd0,\n\t\t0x25, 0x39, 0xa0, 0x2b, 0x55, 0x80, 0x1b, 0x24, 0x1c, 0x90, 0x3c, 0xbd,\n\t\t0x70, 0x44, 0xc6, 0x34, 0xb1, 0x87, 0xad, 0x38, 0xd0, 0x90, 0x17, 0xe0,\n\t\t0x55, 0xa8, 0x4f, 0x7e, 0x91, 0xd9, 0x92, 0xf0, 0xd3, 0xa0, 0xf2, 0x6e,\n\t\t0xc4, 0xdf, 0x1d, 0xa7, 0x02, 0xb5, 0x97, 0xf4, 0xe3, 0x63, 0x91, 0xe7,\n\t\t0x92, 0x2e, 0xeb, 0x7e, 0xec, 0xdb, 0xb6, 0xf8, 0xd1, 0x8d, 0xc8, 0xd0,\n\t\t0x59, 0xf7, 0x5b, 0x1c, 0xc4, 0xd8, 0xc6, 0x33, 0x85, 0x92, 0xe9, 0xec,\n\t\t0xe6, 0x51, 0x4b, 0x1a, 0x62, 0x0c, 0xcc, 0xcc, 0x83, 0x4f, 0x67, 0xdd,\n\t\t0xf1, 0x61, 0x28, 0xf8, 0x85, 0xbf, 0x7f, 0x8f, 0x3b, 0xe4, 0xfd, 0x25,\n\t\t0xe0, 0x6f, 0xb0, 0xff, 0xde, 0xad, 0x40, 0x18, 0x82, 0x09, 0xdb, 0xb6,\n\t\t0x79, 0x3d, 0xb5, 0xc5, 0xfb, 0x56, 0x10, 0xf9, 0x41, 0x73, 0x9f, 0xef,\n\t\t0x61, 0x40, 0xab, 0x03, 0xe4, 0x49, 0x4d, 0xab, 0xff, 0xfb, 0xf6, 0x08,\n\t\t0x36, 0x55, 0x36, 0x2c, 0xe0, 0xe5, 0xd1, 0x18, 0xd4, 0x1f, 0x79, 0x30,\n\t\t0x5f, 0x8e, 0x9d, 0xc9, 0x6d, 0x1f, 0x45, 0x2a, 0xe0, 0xb1, 0x95, 0xaa,\n\t\t0x69, 0x20, 0x66, 0x5d, 0xfe, 0xb2, 0xe0, 0x0b, 0xfc, 0x79, 0xe1, 0xf5,\n\t\t0x7a, 0x96, 0x7c, 0xfc, 0xd1, 0x6d, 0x16, 0xc0, 0x69, 0x4f, 0x12, 0x7b,\n\t\t0xd1, 0xf7, 0xf4, 0x72, 0xe3, 0x95, 0xf0, 0x25, 0x29, 0xca, 0x94, 0x00,\n\t\t0xa5, 0x94, 0x06, 0x55, 0x78, 0xd0, 0x11, 0xcb, 0xc7, 0xeb, 0x9e, 0xa9,\n\t\t0x6d, 0x6d, 0x6d, 0x8e, 0x6a, 0x3f, 0x69, 0x9d, 0xa8, 0x78, 0x55, 0x31,\n\t\t0x7c, 0x27, 0x7b, 0x47, 0x56, 0xca, 0xa1, 0x6a, 0xf3, 0x18, 0x95, 0x68,\n\t\t0x48, 0xc2, 0x64, 0xe4, 0xfd, 0x94, 0xe9, 0xcd, 0x9e, 0xbf, 0x56, 0x93,\n\t\t0x4f, 0xe5, 0xe9, 0x4a, 0x80, 0x87, 0x07, 0xf7, 0x2f, 0x85, 0xac, 0xf0,\n\t\t0xb3, 0xae, 0x27, 0x34, 0xf2, 0xc0, 0x67, 0x36, 0x9d, 0xc6, 0xcb, 0xdc,\n\t\t0x6a, 0x5d, 0x1a, 0x1a, 0x9a, 0x7b, 0x50, 0x34, 0xcb, 0x79, 0xde, 0xdb,\n\t\t0xf3, 0x7b, 0x3e, 0x3e, 0x3e, 0xc5, 0x27, 0x75, 0x59, 0x9a, 0xd7, 0x97,\n\t\t0x78, 0x69, 0x36, 0x97, 0x84, 0xb1, 0x87, 0x78, 0xe6, 0xcf, 0x38, 0xb7,\n\t\t0xf1, 0x04, 0x44, 0x92, 0xad, 0xdd, 0xd8, 0x06, 0xea, 0x51, 0xb2, 0xb2,\n\t\t0x75, 0x0e, 0x40, 0x31, 0xbb, 0xd7, 0x1d, 0x3a, 0x79, 0x8b, 0x31, 0xd4,\n\t\t0xf8, 0xd3, 0xb5, 0x56, 0x0e, 0x70, 0xc7, 0x95, 0x62, 0x0c, 0xa9, 0x00,\n\t\t0x9e, 0x45, 0x3d, 0x21, 0x44, 0x8d, 0x49, 0x79, 0xb5, 0xbc, 0xf4, 0x77,\n\t\t0x2a, 0xe6, 0xf0, 0x43, 0x0b, 0x21, 0xa4, 0xf3, 0x3a, 0x53, 0x25, 0x25,\n\t\t0x25, 0xd9, 0xed, 0x68, 0x72, 0xb8, 0x26, 0xfa, 0x70, 0x55, 0x2a, 0x5e,\n\t\t0x49, 0x7e, 0xed, 0xe3, 0xf6, 0x1d, 0x84, 0x3b, 0x11, 0xf1, 0x19, 0x5c,\n\t\t0xa4, 0x8b, 0x72, 0x5d, 0x3f, 0x0e, 0xc6, 0x10, 0xae, 0x92, 0x49, 0xb6,\n\t\t0x14, 0x30, 0x68, 0xbf, 0x0d, 0xef, 0xe8, 0xc1, 0x6c, 0x3e, 0x8f, 0x85,\n\t\t0x6f, 0x5a, 0xc8, 0x5f, 0xca, 0x63, 0x63, 0xfd, 0x75, 0xfa, 0x21, 0x9d,\n\t\t0x5f, 0x93, 0x8c, 0x9c, 0xaf, 0xd6, 0xb2, 0x2a, 0x60, 0x84, 0x6d, 0x50,\n\t\t0x59, 0xaf, 0x70, 0xa8, 0x8e, 0xe3, 0x33, 0x8f, 0xc8, 0xf2, 0xf7, 0xea,\n\t\t0x86, 0x0f, 0x77, 0x31, 0xa4, 0x27, 0xb8, 0x9a, 0xdd, 0x36, 0x8d, 0xc8,\n\t\t0xeb, 0xfc, 0x0d, 0xbd, 0xe9, 0x94, 0x9d, 0x89, 0x1e, 0x5c, 0xc4, 0x9a,\n\t\t0xec, 0xd5, 0x9f, 0x46, 0x50, 0xf0, 0x99, 0xb7, 0xae, 0xa6, 0x44, 0x7e,\n\t\t0xf4, 0x18, 0x89, 0xfe, 0x40, 0x23, 0xcd, 0x5f, 0xb0, 0x31, 0x8f, 0x5e,\n\t\t0x31, 0x63, 0xdf, 0xae, 0xac, 0xe9, 0xea, 0xfd, 0x37, 0x92, 0x5c, 0x67,\n\t\t0x31, 0x41, 0x74, 0x70, 0xe3, 0xd3, 0xfe, 0x82, 0x1c, 0x16, 0x34, 0x13,\n\t\t0xe2, 0xbb, 0x7d, 0x53, 0x4a, 0x2e, 0xf1, 0x96, 0x4b, 0x6a, 0x73, 0xbd,\n\t\t0x62, 0x93, 0x8a, 0x2c, 0x62, 0xbf, 0x6c, 0x0e, 0x24, 0x5b, 0xae, 0xfc,\n\t\t0x98, 0x39, 0xb4, 0xd4, 0x69, 0x7e, 0x34, 0x41, 0x22, 0x18, 0x80, 0xe6,\n\t\t0xc8, 0xa4, 0x13, 0x37, 0xb7, 0x3f, 0x47, 0x11, 0xc5, 0x93, 0xeb, 0x46,\n\t\t0x42, 0x42, 0x12, 0x33, 0x57, 0xaa, 0x64, 0xfa, 0x7c, 0x7f, 0x61, 0x35,\n\t\t0x53, 0x08, 0x0f, 0x7d, 0xb0, 0x6b, 0x3e, 0xd0, 0x5d, 0x56, 0x46, 0x07,\n\t\t0x3d, 0x2e, 0xab, 0xd4, 0xac, 0x69, 0xc2, 0xc5, 0xfc, 0x13, 0x45, 0x85,\n\t\t0x46, 0x2a, 0xf2, 0x43, 0x40, 0xfa, 0xfa, 0x2e, 0x93, 0xec, 0xa4, 0xbf,\n\t\t0xfe, 0x1d, 0x2c, 0x27, 0x84, 0xa8, 0x56, 0x5d, 0x0b, 0x44, 0x73, 0x88,\n\t\t0x1a, 0x7d, 0xff, 0xfe, 0x22, 0x32, 0x7f, 0xfc, 0x96, 0xc0, 0xc5, 0x0d,\n\t\t0x22, 0x43, 0xb5, 0xbd, 0x55, 0x5d, 0xcf, 0x71, 0x22, 0x49, 0x28, 0x5e,\n\t\t0xad, 0xd9, 0xf0, 0xda, 0x02, 0x63, 0x42, 0xdc, 0xb9, 0x78, 0xf0, 0x4c,\n\t\t0xc0, 0xf3, 0x33, 0x69, 0x46, 0x2b, 0x3c, 0x8f, 0xc8, 0x74, 0x88, 0x49,\n\t\t0xd1, 0xc7, 0xf3, 0x8b, 0x2c, 0xa5, 0xed, 0x1c, 0xfc, 0xd7, 0xf0, 0xfb,\n\t\t0xc1, 0xa5, 0xe3, 0xf1, 0xac, 0x09, 0x8b, 0xe7, 0xa7, 0xcd, 0x37, 0xa9,\n\t\t0xb9, 0x5f, 0x0a, 0x6c, 0x10, 0xe8, 0x3f, 0xd9, 0xe8, 0x6c, 0x57, 0x0c,\n\t\t0xb4, 0x5c, 0xe8, 0xe1, 0xfb, 0x41, 0x17, 0xb5, 0xeb, 0x29, 0x56, 0xad,\n\t\t0xd7, 0x33, 0xa7, 0x24, 0x12, 0xbb, 0xbc, 0xac, 0x25, 0xf8, 0xf0, 0x2f,\n\t\t0x79, 0x78, 0x72, 0xb2, 0x49, 0x40, 0x83, 0x12, 0xb1, 0xc5, 0x76, 0x1e,\n\t\t0xf0, 0x7c, 0x3b, 0x21, 0xe0, 0xf5, 0xb6, 0x9b, 0x71, 0xb0, 0x56, 0x6d,\n\t\t0x1e, 0x3b, 0xb5, 0xcf, 0x5b, 0x5e, 0xe7, 0x52, 0xd2, 0xf2, 0xe8, 0x72,\n\t\t0x21, 0x8b, 0xb7, 0x17, 0xf8, 0xc2, 0x70, 0x8d, 0x50, 0x34, 0xd7, 0x05,\n\t\t0x99, 0x44, 0x69, 0x64, 0x24, 0x7d, 0x2a, 0x32, 0x25, 0xe5, 0x42, 0xa0,\n\t\t0xda, 0x5c, 0xb1, 0x0c, 0xb6, 0xdd, 0x46, 0x07, 0xa1, 0x42, 0xa6, 0xde,\n\t\t0xdb, 0x43, 0x87, 0x1f, 0x13, 0x71, 0x74, 0x97, 0xae, 0xea, 0x53, 0xbe,\n\t\t0x4c, 0x08, 0x8f, 0x8b, 0xb2, 0x52, 0xff, 0x80, 0xd4, 0x4a, 0x13, 0x1f,\n\t\t0x4b, 0xf4, 0xe4, 0xd8, 0x93, 0x99, 0xe9, 0xd5, 0x1e, 0xf9, 0x08, 0x4f,\n\t\t0xdd, 0x8f, 0x96, 0x58, 0x43, 0x1a, 0xb7, 0x41, 0x4e, 0x4b, 0xd2, 0xa1,\n\t\t0x24, 0x16, 0xfd, 0xaa, 0x9b, 0x7d, 0xc9, 0x50, 0xeb, 0xba, 0x83, 0xd8,\n\t\t0x4f, 0xb6, 0x5c, 0x23, 0x0a, 0x6d, 0x23, 0xb8, 0x19, 0x24, 0x04, 0xa6,\n\t\t0x04, 0x22, 0x1d, 0xe4, 0x1a, 0x01, 0x97, 0xf4, 0xe0, 0x6e, 0xdb, 0x16,\n\t\t0x7d, 0x6f, 0x9d, 0x49, 0xbe, 0x26, 0xbb, 0x95, 0xe0, 0x82, 0x2f, 0x3f,\n\t\t0x0a, 0x9d, 0x77, 0x06, 0xbd, 0xb6, 0xc3, 0xf0, 0x13, 0x92, 0x92, 0x40,\n\t\t0x3f, 0x87, 0xde, 0x27, 0x51, 0x17, 0x94, 0x95, 0x21, 0x0a, 0x78, 0x9c,\n\t\t0xfc, 0xcd, 0xe6, 0x73, 0x9d, 0x2e, 0x92, 0x46, 0x87, 0x7b, 0xff, 0xfe,\n\t\t0x23, 0x1d, 0x1d, 0x22, 0x93, 0x6e, 0x53, 0x3f, 0x44, 0xfb, 0xc4, 0x80,\n\t\t0x4c, 0x9e, 0xf6, 0xd7, 0x9c, 0x63, 0x0b, 0x59, 0x7d, 0x9c, 0x58, 0x18,\n\t\t0x03, 0xde, 0xf8, 0x3a, 0x2e, 0x4e, 0x3e, 0x70, 0xc6, 0x45, 0x96, 0x81,\n\t\t0xe6, 0x1c, 0xc1, 0x7a, 0x15, 0x2f, 0x7a, 0x88, 0x9e, 0x0a, 0xe2, 0x95,\n\t\t0x97, 0x7e, 0x69, 0xb3, 0x17, 0xb7, 0x43, 0x22, 0xbd, 0xf4, 0x06, 0x6f,\n\t\t0x54, 0x05, 0x6a, 0xf4, 0x17, 0x5b, 0x21, 0xe8, 0xa0, 0x29, 0x91, 0x37,\n\t\t0x09, 0x45, 0x45, 0x34, 0x28, 0x91, 0xf0, 0x7f, 0x74, 0x03, 0xbe, 0x16,\n\t\t0x16, 0x52, 0xd9, 0x2d, 0xd7, 0x16, 0x48, 0xed, 0x5b, 0x03, 0x9b, 0x98,\n\t\t0x7e, 0x32, 0x6a, 0x9b, 0xdc, 0xed, 0x6e, 0xed, 0x6f, 0xbe, 0xfe, 0x85,\n\t\t0x00, 0x20, 0x8f, 0x17, 0xfe, 0x85, 0xf9, 0xa9, 0x2e, 0x4f, 0xdf, 0xec,\n\t\t0x5b, 0x97, 0xd9, 0x52, 0x9f, 0x28, 0x0e, 0xca, 0x50, 0x49, 0x69, 0xb7,\n\t\t0x12, 0xee, 0x3f, 0xbf, 0xa0, 0xe7, 0x3b, 0x3f, 0xa1, 0xaf, 0x18, 0x26,\n\t\t0x8e, 0x69, 0xc5, 0x27, 0x9b, 0xf4, 0xf1, 0x37, 0xc7, 0x33, 0x30, 0x86,\n\t\t0x1d, 0x57, 0xf2, 0x39, 0xc2, 0x77, 0x40, 0xc3, 0x26, 0xa3, 0x1e, 0x9e,\n\t\t0x4a, 0xdb, 0xeb, 0xdc, 0x9b, 0xe8, 0x4d, 0xf1, 0x7a, 0xde, 0x33, 0xe6,\n\t\t0xbd, 0x24, 0x1f, 0x2e, 0x94, 0xe8, 0xae, 0x17, 0xdc, 0x76, 0xb4, 0x6c,\n\t\t0xb7, 0x8c, 0x16, 0x42, 0x08, 0x53, 0x6c, 0xf8, 0x0c, 0xc9, 0xd1, 0x51,\n\t\t0xcc, 0xfa, 0x6d, 0x41, 0xae, 0x71, 0x7f, 0xfe, 0xb0, 0x4b, 0x48, 0x48,\n\t\t0x6c, 0x1d, 0x2d, 0x5c, 0xb2, 0xc8, 0xe2, 0x45, 0xc3, 0x13, 0x12, 0x12,\n\t\t0x1e, 0x6c, 0x74, 0x0a, 0x10, 0xf1, 0x38, 0xd8, 0xb5, 0x9b, 0x08, 0x7a,\n\t\t0x82, 0x49, 0x54, 0x54, 0x54, 0x9c, 0x4e, 0x96, 0xd9, 0xb2, 0x85, 0x7c,\n\t\t0x17, 0x3f, 0x1b, 0x0b, 0xa8, 0x7c, 0xc6, 0x25, 0x98, 0x2f, 0xe5, 0x00,\n\t\t0x11, 0x4b, 0x17, 0x05, 0xc6, 0xc7, 0xb5, 0x34, 0x5a, 0xbe, 0xa7, 0x5b,\n\t\t0x6b, 0xe8, 0x70, 0x38, 0x5d, 0x7c, 0x49, 0x17, 0x08, 0x2c, 0xb7, 0x6f,\n\t\t0xf7, 0x4c, 0x6b, 0xf2, 0xf2, 0x5e, 0x54, 0x6b, 0xf6, 0x6b, 0x2a, 0xea,\n\t\t0xfb, 0x34, 0x69, 0xfa, 0xca, 0xd3, 0xbd, 0xca, 0x94, 0x4a, 0x22, 0xec,\n\t\t0xc7, 0x8b, 0xc7, 0xa4, 0x13, 0x0a, 0x09, 0xc7, 0x15, 0x52, 0x5b, 0x4e,\n\t\t0x22, 0xe8, 0xb3, 0xfc, 0xdf, 0xbf, 0x19, 0x01, 0x7f, 0x6b, 0x8d, 0xfb,\n\t\t0x6a, 0xfd, 0x9f, 0x6e, 0x89, 0x44, 0x6e, 0xbd, 0x6e, 0x16, 0x34, 0x2f,\n\t\t0x20, 0x02, 0x64, 0xb9, 0x09, 0xd8, 0x10, 0xd3, 0x77, 0x19, 0x56, 0x23,\n\t\t0x2a, 0x39, 0x60, 0xf6, 0xac, 0xa2, 0x18, 0xc0, 0x36, 0x28, 0x7c, 0xfd,\n\t\t0xa7, 0x8a, 0xcb, 0xa9, 0x35, 0xa8, 0x58, 0x2a, 0x76, 0xd0, 0x7d, 0x6c,\n\t\t0xe4, 0xa1, 0xd1, 0xc3, 0xd6, 0x2b, 0x52, 0xf3, 0xbc, 0x32, 0x70, 0x06,\n\t\t0x59, 0x52, 0xed, 0x0f, 0xf5, 0x6e, 0xbe, 0x8b, 0x88, 0x5b, 0x72, 0x34,\n\t\t0xb2, 0x0e, 0xd7, 0xcd, 0xb4, 0x50, 0x91, 0x11, 0xbb, 0xee, 0xc5, 0xca,\n\t\t0xdd, 0x71, 0x85, 0xbb, 0x20, 0x2c, 0xc6, 0x34, 0x60, 0xd5, 0x89, 0x96,\n\t\t0xd3, 0x36, 0xe6, 0xa1, 0x66, 0xa2, 0xb7, 0xeb, 0xa3, 0xe5, 0xf9, 0xed,\n\t\t0x27, 0x91, 0x65, 0xda, 0x39, 0xb5, 0xad, 0xec, 0x1d, 0x08, 0x98, 0x6b,\n\t\t0x41, 0xd6, 0x5d, 0x41, 0xe4, 0x38, 0xcd, 0x30, 0xa0, 0xfc, 0xd6, 0x1b,\n\t\t0x62, 0x13, 0x1c, 0x5c, 0x34, 0x88, 0x80, 0x4a, 0xd8, 0x12, 0xbd, 0x3e,\n\t\t0x5c, 0x44, 0xc3, 0x96, 0x46, 0x97, 0xa8, 0xdc, 0xe3, 0x0a, 0xec, 0xf8,\n\t\t0x46, 0xba, 0x5d, 0x70, 0x1b, 0x4d, 0xae, 0x48, 0x5b, 0x2a, 0x5e, 0xca,\n\t\t0xd3, 0xd2, 0x19, 0x66, 0x65, 0xa1, 0x08, 0x23, 0xfc, 0xea, 0x90, 0xc3,\n\t\t0x94, 0xf1, 0x23, 0x34, 0x74, 0xab, 0xfd, 0xac, 0xab, 0xaf, 0x3f, 0x12,\n\t\t0x5b, 0x9f, 0x8c, 0x1c, 0x03, 0x23, 0x08, 0x42, 0x29, 0xb6, 0x0c, 0xdf,\n\t\t0x1e, 0xf1, 0x01, 0x46, 0x77, 0xe0, 0x75, 0x08, 0xd3, 0x96, 0xd0, 0xcb,\n\t\t0x9e, 0x3b, 0x1a, 0x23, 0xf6, 0xd9, 0x89, 0xe5, 0x49, 0x48, 0x4c, 0xfc,\n\t\t0x4e, 0x23, 0xf7, 0x13, 0x00, 0x50, 0x99, 0x65, 0x3f, 0xef, 0x5b, 0x25,\n\t\t0x55, 0xd7, 0x98, 0xf8, 0xd8, 0x55, 0xf5, 0x4d, 0x8d, 0x80, 0xac, 0xcd,\n\t\t0x92, 0x33, 0x60, 0xb5, 0xb6, 0x72, 0xd6, 0x45, 0xc1, 0x74, 0xe8, 0xf9,\n\t\t0xb9, 0x8f, 0x05, 0xd6, 0x4b, 0x77, 0x72, 0xf9, 0xeb, 0xfa, 0xfd, 0x02,\n\t\t0xae, 0x4f, 0xb3, 0x03, 0x39, 0xe2, 0x27, 0xa5, 0x49, 0xb9, 0x9d, 0x8e,\n\t\t0x79, 0x0d, 0x32, 0xb9, 0x72, 0x35, 0xa3, 0x27, 0x74, 0x72, 0x8a, 0xdf,\n\t\t0x71, 0xa8, 0xaa, 0xbc, 0xfb, 0xf7, 0x5b, 0xd1, 0xa9, 0x5a, 0x5d, 0x0e,\n\t\t0xfb, 0x0a, 0xf1, 0xb8, 0x70, 0x30, 0xef, 0x97, 0x18, 0x2b, 0x5c, 0x3d,\n\t\t0x79, 0x94, 0xd8, 0x09, 0x14, 0xee, 0x03, 0x26, 0x3c, 0x18, 0x1f, 0xbc,\n\t\t0x51, 0x46, 0xf5, 0x04, 0xef, 0xaa, 0xa2, 0xcf, 0x95, 0x99, 0xc4, 0x1b,\n\t\t0xc4, 0x0e, 0x96, 0x7f, 0xf1, 0xb5, 0x41, 0xb8, 0xf7, 0x36, 0x6c, 0x5b,\n\t\t0xd1, 0x37, 0xb5, 0x96, 0x21, 0xda, 0x2d, 0x5c, 0x9c, 0x43, 0xd6, 0xbd,\n\t\t0x82, 0xc0, 0x5e, 0x95, 0xc3, 0x8a, 0x87, 0xc4, 0xcf, 0x45, 0xce, 0xed,\n\t\t0xc4, 0xba, 0xbf, 0x2c, 0x76, 0xf1, 0xb6, 0x62, 0xe1, 0x45, 0x28, 0x6a,\n\t\t0x6a, 0xe1, 0x44, 0x1f, 0x5c, 0x2f, 0x1b, 0x6d, 0x97, 0x4c, 0xb6, 0x44,\n\t\t0xf7, 0x03, 0x4e, 0x52, 0xcd, 0xcd, 0xcc, 0x28, 0x28, 0x29, 0x61, 0x20,\n\t\t0xa0, 0x0a, 0x89, 0xf6, 0xbe, 0x28, 0x5c, 0x06, 0x1b, 0xf7, 0xd7, 0xd9,\n\t\t0x59, 0x95, 0x06, 0x9b, 0x05, 0xe4, 0xd6, 0xd6, 0x5d, 0x06, 0x8e, 0x5e,\n\t\t0xf1, 0x90, 0x3a, 0xeb, 0x11, 0x01, 0x44, 0x64, 0x3b, 0xaf, 0xc6, 0xa3,\n\t\t0x48, 0xdf, 0x6c, 0xe1, 0xbc, 0xf0, 0xf7, 0x79, 0xfe, 0x35, 0x97, 0x18,\n\t\t0xf8, 0xa1, 0xe7, 0xa7, 0x05, 0x05, 0x2f, 0xb4, 0x38, 0xb8, 0xf6, 0xd5,\n\t\t0x9b, 0xfb, 0x8a, 0xc5, 0x06, 0xf7, 0x13, 0x8c, 0x9e, 0x80, 0xe1, 0xc9,\n\t\t0x8d, 0x51, 0x42, 0xd5, 0x75, 0x64, 0x2d, 0xbb, 0x3b, 0x6e, 0x9a, 0x48,\n\t\t0x53, 0x50, 0xfa, 0x77, 0x45, 0x4d, 0x6b, 0xae, 0x01, 0x82, 0x2f, 0x9b,\n\t\t0x0e, 0xa7, 0x75, 0x57, 0x53, 0x3b, 0x3c, 0x39, 0x6a, 0x03, 0x04, 0x7d,\n\t\t0x9b, 0x67, 0xa4, 0xfb, 0x4d, 0xba, 0x83, 0xb9, 0x90, 0x9c, 0x3f, 0x03,\n\t\t0x61, 0xf5, 0xf2, 0xa4, 0x22, 0x70, 0xb1, 0x85, 0xbd, 0xdf, 0x2a, 0x78,\n\t\t0x0a, 0x6b, 0xb5, 0x2c, 0x8f, 0x15, 0x7f, 0xa1, 0x22, 0x4b, 0x04, 0x49,\n\t\t0xa1, 0xd6, 0xef, 0x0e, 0xca, 0xd5, 0xe8, 0x70, 0xc7, 0x4a, 0x9e, 0x31,\n\t\t0x37, 0x53, 0x54, 0x3b, 0x7f, 0x08, 0x47, 0x3d, 0x88, 0x1b, 0x3a, 0x23,\n\t\t0x8e, 0x0f, 0x9c, 0xe8, 0x42, 0x47, 0x5f, 0xe3, 0x22, 0x29, 0x42, 0xb8,\n\t\t0x91, 0x48, 0xf3, 0x40, 0x9a, 0x46, 0x80, 0xf7, 0x71, 0xe3, 0xf6, 0x37,\n\t\t0x0a, 0x42, 0x28, 0xf1, 0x09, 0xa9, 0x4a, 0xc2, 0x03, 0x14, 0xeb, 0x4d,\n\t\t0xfe, 0x4d, 0xe8, 0xca, 0x59, 0x57, 0x81, 0xa3, 0xe3, 0x28, 0x05, 0x9c,\n\t\t0xbd, 0x3a, 0x96, 0x54, 0x45, 0x28, 0x95, 0x2a, 0xe6, 0xd4, 0x5a, 0x4e,\n\t\t0x91, 0xb9, 0x81, 0xd7, 0x1e, 0x68, 0xcf, 0x18, 0xbb, 0xa3, 0xba, 0x5d,\n\t\t0x76, 0x91, 0xa1, 0xf7, 0xc7, 0x3a, 0x3a, 0x04, 0x05, 0x2f, 0x87, 0x3f,\n\t\t0x22, 0x7e, 0xf8, 0xfd, 0x90, 0x03, 0xdb, 0xa8, 0x13, 0x6b, 0x31, 0x91,\n\t\t0x69, 0xbc, 0x50, 0xa1, 0x0e, 0x00, 0x24, 0x8f, 0x04, 0x07, 0x01, 0x50,\n\t\t0x6f, 0x84, 0xef, 0x4c, 0x35, 0xbe, 0xf5, 0xc7, 0xdb, 0x7a, 0xa8, 0x91,\n\t\t0x99, 0x64, 0x13, 0xeb, 0x6a, 0x57, 0xed, 0xb9, 0xc9, 0xd0, 0x97, 0x1b,\n\t\t0x94, 0x7e, 0x06, 0xa9, 0x3f, 0x1f, 0x21, 0x77, 0xea, 0xfd, 0x15, 0x08,\n\t\t0xba, 0x48, 0x1d, 0xfd, 0x48, 0xfe, 0x7c, 0x75, 0x46, 0x20, 0xd4, 0x92,\n\t\t0xa6, 0x2b, 0xfc, 0x32, 0x1e, 0x36, 0xe6, 0xb5, 0xdb, 0xe7, 0xe8, 0xc4,\n\t\t0x27, 0xd4, 0x3e, 0x6a, 0x4a, 0xd5, 0xf7, 0xa5, 0xf6, 0xf4, 0xe9, 0x8e,\n\t\t0x58, 0x2f, 0x52, 0x5d, 0xda, 0x27, 0x04, 0x53, 0xb3, 0x7a, 0x97, 0x82,\n\t\t0x8e, 0x15, 0xa0, 0x40, 0x2c, 0xfd, 0x05, 0x83, 0x80, 0xdd, 0x15, 0xd9,\n\t\t0x49, 0x98, 0x8b, 0x74, 0x9f, 0x39, 0x55, 0x89, 0xb3, 0x52, 0x6b, 0xdf,\n\t\t0x50, 0x59, 0x2d, 0xd8, 0xb8, 0xd9, 0x43, 0x3a, 0xed, 0x16, 0xc9, 0xe0,\n\t\t0x41, 0x52, 0xca, 0x91, 0x15, 0x94, 0xfb, 0x69, 0x8f, 0xb2, 0x72, 0xf6,\n\t\t0x28, 0xa4, 0xe0, 0xa5, 0xdd, 0xe4, 0xf6, 0x43, 0xda, 0x42, 0x70, 0xa5,\n\t\t0x24, 0x8e, 0xa4, 0xdd, 0x7a, 0x56, 0xc4, 0xd9, 0xd2, 0x49, 0xd0, 0x8c,\n\t\t0xda, 0xab, 0xe4, 0x27, 0x76, 0x76, 0xac, 0x4f, 0x4a, 0xb9, 0x12, 0x7e,\n\t\t0x7e, 0x37, 0x69, 0xb2, 0xb9, 0xc2, 0xfe, 0x44, 0xfa, 0x6d, 0x6e, 0x30,\n\t\t0x80, 0xf1, 0x1c, 0x01, 0x7c, 0xc7, 0x8e, 0x0b, 0xa9, 0x2a, 0xd3, 0x47,\n\t\t0x08, 0x8a, 0xc7, 0x0d, 0x44, 0xe3, 0xc3, 0xd2, 0xe5, 0xcd, 0x3f, 0x1c,\n\t\t0xe3, 0x3b, 0xce, 0x3f, 0x8c, 0x31, 0x5a, 0xa7, 0xf3, 0xee, 0x7b, 0xed,\n\t\t0x4d, 0x4c, 0x9d, 0x0f, 0x15, 0x24, 0xa3, 0xf9, 0xaa, 0x8d, 0xec, 0x5e,\n\t\t0xc5, 0xce, 0xaa, 0x9a, 0x23, 0xc5, 0xcc, 0x67, 0x6e, 0xd2, 0xb8, 0xa5,\n\t\t0x56, 0xac, 0x64, 0xe1, 0x8d, 0x2d, 0x2c, 0x31, 0xc4, 0x4f, 0xa4, 0x73,\n\t\t0x22, 0x4f, 0x4d, 0x74, 0x0c, 0xd9, 0xef, 0xb3, 0xea, 0x32, 0x2e, 0xbb,\n\t\t0x1e, 0x70, 0x5e, 0x23, 0x7c, 0xac, 0x36, 0xdf, 0xdd, 0xfe, 0xc1, 0x25,\n\t\t0xa0, 0xac, 0xe3, 0xf1, 0x82, 0xa6, 0x31, 0x35, 0x69, 0x7f, 0x31, 0xf1,\n\t\t0x7e, 0xaa, 0xfd, 0xd4, 0xaf, 0x5f, 0x08, 0x8d, 0x3a, 0x77, 0x20, 0xb9,\n\t\t0x86, 0xe9, 0x8f, 0x02, 0x1e, 0x16, 0x41, 0x9f, 0xee, 0xd4, 0x54, 0x99,\n\t\t0xba, 0xed, 0x7a, 0x3d, 0x7e, 0x0d, 0x28, 0x2b, 0x55, 0x37, 0xc1, 0x87,\n\t\t0x6b, 0xcc, 0xe1, 0x19, 0x4a, 0xb0, 0xde, 0x93, 0xfb, 0x29, 0xef, 0x4c,\n\t\t0xb5, 0x1f, 0x57, 0xb7, 0xd7, 0x3a, 0xac, 0xf3, 0x87, 0x42, 0xc2, 0xeb,\n\t\t0xef, 0x77, 0xd8, 0x83, 0xe5, 0x3a, 0xd3, 0x58, 0x11, 0x58, 0x3a, 0x16,\n\t\t0xa2, 0xf9, 0x0a, 0x75, 0x06, 0x5d, 0xf7, 0xce, 0x48, 0x53, 0x04, 0x13,\n\t\t0x30, 0xc7, 0x9c, 0xe3, 0x25, 0x33, 0xa8, 0xf2, 0xcf, 0x15, 0xb2, 0xf3,\n\t\t0xd4, 0x6f, 0x6f, 0x3a, 0x77, 0x9d, 0x15, 0x4c, 0x27, 0x36, 0xd6, 0x5a,\n\t\t0x5b, 0xcf, 0x90, 0x6d, 0xe5, 0x09, 0x22, 0x04, 0x0c, 0x6d, 0xef, 0xcd,\n\t\t0x12, 0x95, 0x4e, 0x94, 0xb7, 0x75, 0x67, 0xb3, 0x9d, 0xc9, 0x10, 0x66,\n\t\t0xa0, 0xdc, 0xe2, 0x4f, 0x9d, 0x92, 0xde, 0x88, 0xef, 0x42, 0xac, 0xc6,\n\t\t0xff, 0xaa, 0xd2, 0x6f, 0xb6, 0x72, 0x0e, 0xe6, 0xaa, 0x72, 0xd6, 0x5f,\n\t\t0x53, 0x1a, 0x6c, 0x9b, 0x74, 0x17, 0xfa, 0x7d, 0xaf, 0xcf, 0x66, 0x60,\n\t\t0xbe, 0x3c, 0x7a, 0x34, 0xda, 0xcb, 0x65, 0xef, 0x74, 0x4e, 0x69, 0x52,\n\t\t0x09, 0xd4, 0x9c, 0x23, 0x9c, 0xb9, 0x34, 0xbd, 0x1d, 0x68, 0x77, 0xb0,\n\t\t0xbd, 0xf9, 0x96, 0x9a, 0xa1, 0xa5, 0x4c, 0xa9, 0xd5, 0xc4, 0x7a, 0x6e,\n\t\t0xfa, 0xe3, 0x43, 0xf2, 0x12, 0x7f, 0x0e, 0x9a, 0xea, 0x2f, 0x79, 0x67,\n\t\t0x1b, 0x54, 0x5d, 0xfd, 0xba, 0xba, 0x3a, 0xaf, 0xa3, 0xf2, 0x52, 0x3b,\n\t\t0x20, 0xb1, 0x27, 0x99, 0xb8, 0x31, 0xdb, 0xcb, 0xe4, 0xad, 0x66, 0xdd,\n\t\t0x0c, 0x66, 0x3a, 0x9f, 0x7d, 0x76, 0xb4, 0xd0, 0xe0, 0x22, 0xed, 0x5c,\n\t\t0xea, 0x92, 0x20, 0x19, 0x46, 0x39, 0x76, 0xb7, 0xdc, 0x41, 0x5d, 0x5d,\n\t\t0x25, 0xfa, 0x3b, 0x18, 0x8f, 0x2a, 0xd8, 0x2b, 0x64, 0xb9, 0xf3, 0xa7,\n\t\t0xea, 0xbe, 0x1b, 0x8f, 0x49, 0x30, 0xa9, 0x2e, 0xd0, 0xbe, 0x72, 0x81,\n\t\t0xbe, 0xa6, 0x0c, 0x4b, 0x3a, 0x7b, 0x9d, 0xc3, 0x21, 0x61, 0xbd, 0xa9,\n\t\t0x7a, 0x3e, 0xa8, 0x26, 0x70, 0xd5, 0x65, 0x4e, 0xd6, 0x01, 0x60, 0x54,\n\t\t0xa7, 0x55, 0x77, 0xf7, 0x15, 0x4b, 0x58, 0xbb, 0xad, 0x6b, 0x94, 0xc5,\n\t\t0x4e, 0xb3, 0x5a, 0xaf, 0x5c, 0x5d, 0x2f, 0x87, 0xdf, 0xbd, 0x37, 0xe5,\n\t\t0xb3, 0x2a, 0x00, 0x20, 0x23, 0x23, 0xc3, 0xa5, 0xc3, 0xb5, 0x75, 0xb0,\n\t\t0xe1, 0x7b, 0xd6, 0xd8, 0xc9, 0x9d, 0xc1, 0x74, 0xef, 0x3e, 0xd6, 0xa5,\n\t\t0x13, 0x88, 0x67, 0x7d, 0x4f, 0xd6, 0xe2, 0xcb, 0xeb, 0x40, 0xbe, 0xb7,\n\t\t0x36, 0x25, 0x9e, 0xe4, 0x62, 0xa8, 0x4c, 0x07, 0x7a, 0x3f, 0x86, 0x81,\n\t\t0x55, 0x4e, 0xd3, 0x9d, 0x89, 0xf3, 0x1e, 0x40, 0x43, 0x43, 0xee, 0x5a,\n\t\t0xc2, 0xce, 0x2d, 0x91, 0xe4, 0x66, 0x4a, 0x1f, 0x5f, 0x6a, 0xb9, 0xbb,\n\t\t0x1d, 0xb7, 0xfd, 0xe2, 0xb0, 0x9c, 0x5a, 0xd9, 0xd4, 0xfb, 0xa5, 0xf1,\n\t\t0xde, 0xba, 0xcf, 0x01, 0xd8, 0xf4, 0x97, 0x80, 0x2c, 0x57, 0x10, 0x21,\n\t\t0x58, 0x54, 0x66, 0x1d, 0xc8, 0x69, 0x8f, 0x15, 0x12, 0x4c, 0x45, 0x3a,\n\t\t0x69, 0xd0, 0x62, 0x47, 0x3c, 0x36, 0xce, 0xf4, 0x77, 0x37, 0x86, 0xc4,\n\t\t0xcd, 0x6a, 0x8e, 0x44, 0x0c, 0x2d, 0xf9, 0x9f, 0xbc, 0x05, 0xca, 0x2d,\n\t\t0xa9, 0x4c, 0x6f, 0x73, 0x65, 0x93, 0xf1, 0x45, 0xd4, 0x66, 0xdd, 0x9b,\n\t\t0xd5, 0x2c, 0xea, 0x59, 0x97, 0x5e, 0x97, 0x1f, 0x61, 0xbd, 0xc5, 0x44,\n\t\t0x85, 0xba, 0x9d, 0xb3, 0xb3, 0xb3, 0xd6, 0x1f, 0x33, 0x24, 0xde, 0xfd,\n\t\t0x16, 0xaf, 0x0b, 0xaa, 0x5f, 0x4a, 0x79, 0x68, 0x8d, 0x6d, 0x7b, 0x63,\n\t\t0xe4, 0xc4, 0x3c, 0x0e, 0x31, 0x45, 0xd2, 0xf1, 0xa0, 0xe7, 0x87, 0x2b,\n\t\t0x40, 0x90, 0xea, 0xfe, 0x2c, 0xab, 0xf3, 0x89, 0xa8, 0x76, 0x3b, 0x00,\n\t\t0xeb, 0x81, 0x0e, 0x0e, 0xa6, 0xef, 0xbd, 0xdb, 0x50, 0xb9, 0x6b, 0x79,\n\t\t0x4b, 0xa6, 0x76, 0xab, 0x08, 0xbc, 0x65, 0xcc, 0xe7, 0x47, 0xe7, 0x8d,\n\t\t0x7b, 0xd7, 0xfc, 0x61, 0x01, 0x22, 0xe5, 0x04, 0xe2, 0xcb, 0xf6, 0x50,\n\t\t0x34, 0x40, 0xf0, 0xf4, 0x67, 0xb9, 0xa4, 0xd9, 0xbc, 0x2a, 0x41, 0x0d,\n\t\t0xad, 0xdf, 0x7d, 0x0b, 0xe3, 0x7a, 0xcd, 0x0a, 0x71, 0x95, 0x8c, 0x82,\n\t\t0x6a, 0xd1, 0xa7, 0x4f, 0x58, 0xf6, 0x42, 0xcd, 0xea, 0xf4, 0x34, 0xaf,\n\t\t0xdc, 0x61, 0x58, 0x6d, 0x3c, 0x10, 0xcf, 0x4a, 0xe8, 0xd2, 0xc7, 0xc0,\n\t\t0x26, 0x0c, 0xff, 0xf2, 0x69, 0x72, 0xa5, 0xa2, 0xd5, 0xdc, 0x6c, 0xdf,\n\t\t0xf4, 0x0a, 0xfc, 0xf1, 0xab, 0xcc, 0x98, 0xa8, 0x47, 0x00, 0x26, 0x96,\n\t\t0x92, 0x61, 0x3f, 0x38, 0xa4, 0xb4, 0xf6, 0xbe, 0x74, 0x62, 0xd9, 0xf5,\n\t\t0x9e, 0xd3, 0xe5, 0x32, 0x9a, 0x04, 0xd9, 0x1d, 0xc0, 0x04, 0x32, 0xbd,\n\t\t0x88, 0x1f, 0x2a, 0x2d, 0xd4, 0xaf, 0xfc, 0xc5, 0xeb, 0xf2, 0x47, 0xd0,\n\t\t0x7b, 0xef, 0xdf, 0x3f, 0xa3, 0xa3, 0xf9, 0xf2, 0x88, 0xc8, 0x72, 0xef,\n\t\t0x6f, 0x05, 0x90, 0x48, 0xdf, 0x1e, 0xcf, 0xe0, 0xf8, 0x2a, 0x2b, 0x2b,\n\t\t0x0e, 0xa1, 0xab, 0x31, 0x52, 0x1f, 0x07, 0x63, 0x08, 0x5d, 0xaf, 0x78,\n\t\t0xf8, 0x8d, 0x62, 0x0a, 0x14, 0xb2, 0xb8, 0x9b, 0x46, 0x9c, 0xf1, 0x2a,\n\t\t0x71, 0x29, 0x57, 0x29, 0xae, 0x8b, 0x09, 0xcf, 0x02, 0xa2, 0xd9, 0xc2,\n\t\t0x2d, 0x9c, 0xd9, 0x20, 0xba, 0x2d, 0x68, 0x7d, 0x8a, 0x6d, 0x7f, 0x90,\n\t\t0x60, 0x90, 0xe0, 0x7d, 0x4c, 0xbb, 0xe3, 0xb9, 0x07, 0x88, 0xe6, 0x19,\n\t\t0xfc, 0x53, 0x00, 0x00, 0x87, 0x10, 0xbe, 0x0b, 0x40, 0x2e, 0xbd, 0x51,\n\t\t0x07, 0xde, 0x91, 0xf6, 0x95, 0x30, 0x4c, 0x4e, 0x09, 0xad, 0x17, 0x5c,\n\t\t0xe2, 0x87, 0x6d, 0xe5, 0x03, 0x64, 0xf7, 0x0c, 0xc0, 0xb9, 0xce, 0x21,\n\t\t0x75, 0xce, 0x23, 0x02, 0x04, 0xcb, 0x4f, 0x3e, 0x37, 0xdc, 0xd1, 0xea,\n\t\t0xfd, 0x89, 0xaa, 0xf8, 0xb5, 0x7e, 0xeb, 0xcc, 0xcf, 0x6d, 0xe6, 0x22,\n\t\t0x1e, 0xe4, 0x82, 0x61, 0x49, 0x2a, 0x4f, 0x8b, 0x55, 0x31, 0x6c, 0x12,\n\t\t0x92, 0xa1, 0x26, 0xab, 0xa4, 0x5f, 0x2e, 0xfa, 0x82, 0xd3, 0xd8, 0x02,\n\t\t0xbc, 0x44, 0x04, 0xd9, 0xdd, 0x19, 0x21, 0xe8, 0xde, 0x64, 0xea, 0x71,\n\t\t0xba, 0xaa, 0x7e, 0xdc, 0x02, 0x7d, 0x9c, 0x03, 0x07, 0x9f, 0x1a, 0xb8,\n\t\t0x68, 0x99, 0xe7, 0x1f, 0x0e, 0xa1, 0xbf, 0x8b, 0x47, 0xae, 0x3e, 0x37,\n\t\t0x47, 0x61, 0x65, 0x65, 0xc7, 0x5c, 0x9d, 0x9e, 0x27, 0x22, 0x60, 0x2e,\n\t\t0x7d, 0x40, 0xa4, 0x60, 0x5b, 0x93, 0x63, 0x18, 0x26, 0xac, 0x2f, 0x7f,\n\t\t0xac, 0x6b, 0x75, 0xa0, 0x64, 0x89, 0x0d, 0x8f, 0x68, 0x78, 0xc2, 0x57,\n\t\t0xd4, 0x07, 0x73, 0xf1, 0xa5, 0x43, 0xee, 0x34, 0x36, 0x3c, 0xb7, 0x09,\n\t\t0x67, 0xbd, 0x24, 0x5e, 0x6e, 0x30, 0xff, 0xc1, 0x11, 0x93, 0x3b, 0xb7,\n\t\t0xf5, 0x09, 0x05, 0x1d, 0xee, 0x2e, 0x8f, 0x84, 0xcb, 0x55, 0xb4, 0x9d,\n\t\t0xe6, 0x71, 0xbf, 0xaf, 0x64, 0xf8, 0x0f, 0xa3, 0xed, 0xb5, 0x4f, 0x75,\n\t\t0x4e, 0x60, 0x55, 0x02, 0xae, 0x96, 0x25, 0x54, 0xb9, 0x12, 0xee, 0x78,\n\t\t0xdb, 0x50, 0xf3, 0x2b, 0xc3, 0x5e, 0x70, 0x9e, 0x70, 0xef, 0xcf, 0x92,\n\t\t0x33, 0xe8, 0x5e, 0x08, 0xca, 0xa9, 0x61, 0xea, 0x9e, 0x9a, 0x2c, 0x4d,\n\t\t0x5b, 0x83, 0x5c, 0x2d, 0xa9, 0xef, 0xc1, 0x74, 0x81, 0xce, 0xd0, 0x7c,\n\t\t0x93, 0xbd, 0xae, 0xe0, 0xeb, 0xfd, 0x0e, 0x60, 0x54, 0xae, 0x0f, 0x92,\n\t\t0xfe, 0x71, 0x11, 0xbe, 0x4c, 0xd8, 0x06, 0xd1, 0xe1, 0x20, 0x0b, 0x3e,\n\t\t0x9d, 0xdc, 0x64, 0xa9, 0xed, 0x33, 0xeb, 0xbb, 0x1f, 0xf7, 0x2b, 0xcf,\n\t\t0xb2, 0xde, 0x1c, 0xcc, 0x0f, 0x0e, 0x94, 0x69, 0xdb, 0xd7, 0x15, 0xbf,\n\t\t0x16, 0x2b, 0x37, 0x5c, 0x83, 0x75, 0x16, 0xfa, 0x45, 0xb0, 0xf9, 0x01,\n\t\t0xac, 0xbf, 0xbc, 0xc7, 0x16, 0xee, 0x2b, 0x14, 0x7c, 0x13, 0xb2, 0x02,\n\t\t0x77, 0xda, 0x40, 0x8d, 0x98, 0x84, 0x64, 0xef, 0x62, 0x7f, 0x75, 0xd8,\n\t\t0xd3, 0xec, 0x8b, 0x26, 0x2a, 0x06, 0x26, 0x7b, 0x62, 0x38, 0xe6, 0xab,\n\t\t0xd1, 0x39, 0xe9, 0x76, 0x33, 0xdf, 0x9f, 0xe7, 0x05, 0x0e, 0x81, 0x71,\n\t\t0xc9, 0x8d, 0x67, 0x88, 0x95, 0xb6, 0x9b, 0x02, 0xf4, 0x67, 0x18, 0x99,\n\t\t0x11, 0x20, 0xec, 0x6c, 0xba, 0x40, 0xc1, 0x55, 0x50, 0xc4, 0x95, 0x5d,\n\t\t0xc3, 0xef, 0x99, 0xc5, 0xcd, 0x3a, 0x2d, 0x48, 0xd9, 0x3e, 0x41, 0x35,\n\t\t0xd0, 0x1d, 0x40, 0x30, 0xdb, 0x1c, 0x7d, 0xea, 0x6e, 0x62, 0x62, 0x92,\n\t\t0x63, 0x92, 0x29, 0xe8, 0xfd, 0xe7, 0xd4, 0xdd, 0xc2, 0x82, 0x36, 0xe0,\n\t\t0xe9, 0xb4, 0x99, 0x98, 0x44, 0xbf, 0x31, 0x83, 0xc3, 0x72, 0xd5, 0x86,\n\t\t0x32, 0xa2, 0x30, 0xd4, 0xad, 0x7d, 0xbf, 0xb4, 0x9f, 0x5c, 0x01, 0x92,\n\t\t0x7b, 0x9a, 0xd1, 0x8f, 0x8f, 0x4d, 0xe2, 0x5b, 0x3f, 0x2b, 0x3f, 0xb7,\n\t\t0x0e, 0xc1, 0x52, 0x71, 0x81, 0xd2, 0xa6, 0xa6, 0x61, 0x44, 0x4b, 0x6c,\n\t\t0x3c, 0xc5, 0x31, 0xe6, 0xfd, 0xa9, 0xcb, 0x97, 0xc1, 0x3d, 0x05, 0x33,\n\t\t0x66, 0x52, 0xab, 0x8d, 0x76, 0x31, 0xed, 0x55, 0x2c, 0x6b, 0x7c, 0x98,\n\t\t0x9d, 0xe3, 0x46, 0xbd, 0xa0, 0x3c, 0xee, 0x95, 0x5c, 0xa5, 0x1b, 0x48,\n\t\t0xf2, 0xd5, 0xf0, 0x5f, 0x8e, 0xf4, 0x53, 0xa3, 0xa7, 0xd1, 0xe9, 0x1f,\n\t\t0x32, 0x59, 0x9b, 0x16, 0x6e, 0x09, 0xec, 0x75, 0x12, 0x74, 0xba, 0x43,\n\t\t0x94, 0x27, 0xe3, 0x21, 0x80, 0x28, 0x86, 0x36, 0xeb, 0xa2, 0x64, 0x88,\n\t\t0xe7, 0x68, 0xd5, 0x05, 0xe0, 0xff, 0x2e, 0x8c, 0x58, 0x5b, 0xd3, 0x83,\n\t\t0xda, 0x6a, 0xda, 0xc6, 0x56, 0x73, 0x9a, 0x46, 0x58, 0x98, 0x0c, 0x5a,\n\t\t0xff, 0x71, 0x38, 0xf1, 0xa3, 0xf3, 0xb3, 0xd7, 0x43, 0xd5, 0x65, 0xb9,\n\t\t0xaa, 0xed, 0x86, 0xbc, 0x54, 0xe5, 0x02, 0x68, 0xab, 0x27, 0xe4, 0xab,\n\t\t0xcc, 0xe7, 0xb3, 0xf8, 0x2a, 0x8d, 0x4a, 0xd6, 0x5a, 0xcd, 0xd2, 0xac,\n\t\t0x8e, 0xe8, 0x7b, 0xf6, 0x41, 0x02, 0x1d, 0x2e, 0xc7, 0xe0, 0x3c, 0x1e,\n\t\t0x70, 0xf8, 0x0e, 0x36, 0xc1, 0xa4, 0xc2, 0x29, 0x44, 0x49, 0x4a, 0x4b,\n\t\t0xb2, 0x1d, 0x77, 0x08, 0xce, 0x24, 0x66, 0x5d, 0x00, 0x19, 0xdc, 0xea,\n\t\t0xf9, 0xbe, 0xfd, 0xd1, 0x0a, 0x15, 0x20, 0x44, 0xf1, 0xd4, 0x79, 0xab,\n\t\t0xbf, 0x3b, 0xff, 0xfc, 0x7b, 0xfd, 0xb6, 0x54, 0x77, 0x0a, 0x9f, 0x04,\n\t\t0xc7, 0x88, 0xe7, 0x30, 0x62, 0xb1, 0xe0, 0x29, 0xad, 0x36, 0xc1, 0xc8,\n\t\t0xad, 0xad, 0x84, 0x26, 0xe8, 0xd2, 0xa3, 0x4e, 0xb7, 0xc9, 0xae, 0xfc,\n\t\t0xc6, 0x12, 0x29, 0x38, 0x48, 0x49, 0xe4, 0x05, 0x67, 0x4a, 0xe8, 0x8e,\n\t\t0x84, 0xea, 0xe3, 0xc7, 0x3a, 0xeb, 0x39, 0xda, 0x94, 0x9f, 0x8b, 0x0e,\n\t\t0x4c, 0x0f, 0xd3, 0x05, 0x5f, 0xec, 0x6b, 0xee, 0xc8, 0x84, 0xf5, 0x8f,\n\t\t0xd3, 0x23, 0xce, 0x20, 0x5a, 0x81, 0x60, 0x27, 0xbc, 0xad, 0x4d, 0x76,\n\t\t0x7f, 0xdc, 0x84, 0xaf, 0x99, 0x82, 0xb5, 0x36, 0x7e, 0x74, 0x47, 0x2c,\n\t\t0xd1, 0xe6, 0x02, 0x18, 0x6a, 0xc0, 0xac, 0x10, 0x15, 0x49, 0xf8, 0x4a,\n\t\t0x95, 0x5f, 0xd7, 0xfe, 0x36, 0xc1, 0x77, 0xbe, 0x58, 0x68, 0x0e, 0x25,\n\t\t0x27, 0xcd, 0x8a, 0x38, 0x44, 0x42, 0x07, 0x8f, 0xa1, 0xc9, 0x07, 0x11,\n\t\t0xca, 0xcd, 0xfe, 0xcc, 0xd6, 0x04, 0xfc, 0x4d, 0xd6, 0x0e, 0xbe, 0xfe,\n\t\t0x10, 0xdd, 0xc9, 0xef, 0xaf, 0x11, 0x4f, 0x26, 0x04, 0xbd, 0x98, 0xde,\n\t\t0x01, 0x11, 0x81, 0xd3, 0xc7, 0x37, 0x8d, 0x5d, 0xa7, 0x06, 0xad, 0xa0,\n\t\t0xec, 0xf6, 0x2c, 0x70, 0x42, 0xf8, 0x71, 0xf9, 0x21, 0x76, 0xfe, 0x37,\n\t\t0x81, 0x7d, 0xfb, 0xc9, 0x31, 0x9d, 0x2c, 0x79, 0x6b, 0xf4, 0x51, 0x08,\n\t\t0xac, 0x21, 0x88, 0x28, 0x1d, 0x88, 0x2a, 0x4e, 0x1e, 0x71, 0x0e, 0x06,\n\t\t0x0b, 0xbb, 0x91, 0xe0, 0x4b, 0x22, 0xbd, 0x3d, 0x5c, 0x5a, 0x76, 0x9c,\n\t\t0x83, 0x35, 0xa7, 0xdb, 0x0f, 0xf1, 0xd7, 0x97, 0x0b, 0xfc, 0x31, 0x30,\n\t\t0x35, 0x02, 0xb2, 0x6e, 0xc4, 0x33, 0xe7, 0xb2, 0x05, 0x41, 0x3b, 0x3a,\n\t\t0x9c, 0xb1, 0x8d, 0x9d, 0x1b, 0x1d, 0xde, 0xf5, 0xba, 0xc2, 0xae, 0x93,\n\t\t0xd9, 0x7c, 0x07, 0x0b, 0x95, 0x10, 0x19, 0xff, 0x64, 0xff, 0xb5, 0xb1,\n\t\t0xe5, 0x98, 0xc3, 0x08, 0xa0, 0x60, 0x40, 0x3b, 0x09, 0x32, 0x29, 0x72,\n\t\t0xda, 0x1f, 0xd6, 0xad, 0x5c, 0xae, 0x0c, 0xe4, 0xa0, 0x36, 0xd3, 0x5a,\n\t\t0x5f, 0x55, 0x4d, 0xf2, 0xd9, 0xbe, 0x43, 0x22, 0x05, 0xe0, 0x44, 0x0d,\n\t\t0xef, 0xaa, 0xa7, 0x36, 0x6e, 0x76, 0x9d, 0x11, 0x90, 0x3d, 0xed, 0xbf,\n\t\t0xd3, 0xeb, 0xd2, 0x70, 0xaf, 0x4f, 0x3d, 0x9a, 0x45, 0x80, 0x2f, 0x94,\n\t\t0x2e, 0xbd, 0x04, 0x82, 0xbd, 0xe1, 0x69, 0xdc, 0x5f, 0x05, 0x67, 0x6b,\n\t\t0xaf, 0x4f, 0xe6, 0x07, 0xb9, 0x59, 0x76, 0x20, 0x88, 0xd1, 0xe2, 0x76,\n\t\t0x38, 0xeb, 0xe0, 0x26, 0x5f, 0xf7, 0xbf, 0xbb, 0x00, 0xb1, 0x9b, 0xca,\n\t\t0xa8, 0xb4, 0xc9, 0x48, 0x17, 0x17, 0x17, 0xd0, 0xf7, 0x2b, 0x8b, 0x35,\n\t\t0x86, 0x86, 0x3b, 0x77, 0x79, 0x10, 0x36, 0x7d, 0xbb, 0x6a, 0xc4, 0x0e,\n\t\t0x5c, 0x5c, 0xc7, 0x66, 0xf7, 0x07, 0x7d, 0x4d, 0xc3, 0x65, 0xa2, 0x29,\n\t\t0xff, 0x9d, 0xd1, 0xe3, 0xe4, 0x91, 0xf4, 0x81, 0x32, 0x31, 0x2b, 0x3f,\n\t\t0x14, 0xcd, 0x68, 0x30, 0xe6, 0x1f, 0x0a, 0xb2, 0xa4, 0x44, 0x6a, 0x18,\n\t\t0xf6, 0x64, 0xb6, 0x52, 0x5f, 0xa7, 0xeb, 0x46, 0x0f, 0xbe, 0xc8, 0x2b,\n\t\t0x42, 0xf2, 0xc3, 0xe0, 0xa9, 0x98, 0x23, 0x6d, 0x77, 0xad, 0x1f, 0xc2,\n\t\t0x4b, 0x93, 0xff, 0x90, 0x51, 0xb1, 0xb9, 0x78, 0x40, 0x89, 0xfa, 0x15,\n\t\t0xed, 0xc1, 0x52, 0x67, 0x88, 0xfd, 0xd3, 0xd5, 0xd4, 0xb1, 0xb0, 0xf5,\n\t\t0x3d, 0x24, 0x2f, 0x0c, 0xb4, 0xb9, 0x1f, 0x03, 0x00, 0x35, 0xdd, 0xaf,\n\t\t0x8f, 0x0a, 0x71, 0x4d, 0x43, 0x7c, 0x43, 0xc1, 0xf0, 0x28, 0x76, 0x40,\n\t\t0x55, 0x07, 0x72, 0x13, 0x5d, 0x1d, 0x99, 0xaf, 0xd1, 0xf7, 0x52, 0x04,\n\t\t0x1e, 0xb6, 0x3c, 0x69, 0x4f, 0xbf, 0x17, 0x93, 0x7c, 0xf5, 0xc1, 0x14,\n\t\t0x7f, 0x0a, 0x43, 0xd1, 0xb6, 0xb2, 0x1c, 0xd5, 0xf4, 0x8a, 0x5a, 0x5d,\n\t\t0x89, 0x4c, 0x8d, 0xd5, 0x35, 0x0e, 0x59, 0x09, 0x26, 0xee, 0x4f, 0x9e,\n\t\t0x6e, 0x5a, 0xae, 0x66, 0x96, 0xce, 0xf3, 0x58, 0x02, 0x07, 0x77, 0x6d,\n\t\t0xf9, 0x1a, 0xf9, 0x35, 0xad, 0xb5, 0x1f, 0x4e, 0x9f, 0x6c, 0xb5, 0xbd,\n\t\t0x97, 0x1f, 0x2c, 0xd7, 0x73, 0x8b, 0x92, 0xc2, 0x2d, 0x95, 0x4b, 0xc4,\n\t\t0xb9, 0x0c, 0x03, 0x5f, 0xb8, 0x18, 0x79, 0x0e, 0xc9, 0x03, 0x39, 0x70,\n\t\t0x6f, 0xd6, 0x61, 0xb6, 0xe6, 0xcb, 0x55, 0x17, 0x02, 0xb8, 0xa7, 0xf8,\n\t\t0x86, 0xd0, 0x45, 0x9e, 0x8d, 0x8e, 0xe3, 0xab, 0x51, 0xd1, 0xfa, 0x7f,\n\t\t0xbf, 0x07, 0x97, 0xa9, 0x32, 0xf6, 0xdf, 0x8d, 0x07, 0x1c, 0x38, 0xa4,\n\t\t0x8d, 0xb1, 0xc2, 0xec, 0xf0, 0x36, 0xb6, 0xa9, 0x7a, 0xc6, 0xbf, 0x97,\n\t\t0x70, 0x88, 0xc0, 0x7a, 0x34, 0x1c, 0x1d, 0xed, 0x1a, 0xdb, 0x13, 0xf4,\n\t\t0x6b, 0x51, 0x21, 0xbc, 0x9b, 0x8b, 0x8d, 0x1b, 0x1b, 0x61, 0xe9, 0xbd,\n\t\t0xb3, 0x6d, 0xda, 0x01, 0x0f, 0xed, 0x81, 0xb6, 0xf1, 0x85, 0xfb, 0x37,\n\t\t0xfa, 0x4a, 0x6d, 0x39, 0x9d, 0xab, 0x5b, 0xfe, 0x3d, 0xda, 0xfd, 0x83,\n\t\t0xa8, 0x5f, 0x1b, 0x52, 0x16, 0xeb, 0xf4, 0xcc, 0x21, 0xc3, 0xc0, 0x38,\n\t\t0x03, 0x65, 0xe5, 0xa0, 0x1c, 0x01, 0xcf, 0xc5, 0xc3, 0x2b, 0x17, 0xd7,\n\t\t0x9a, 0x1a, 0xd2, 0xfd, 0xec, 0x22, 0xcf, 0xb3, 0x0d, 0x68, 0xb5, 0x05,\n\t\t0x88, 0xa8, 0x81, 0xcb, 0xa9, 0xee, 0xf0, 0x4a, 0x5c, 0xb0, 0x91, 0x84,\n\t\t0xc8, 0xac, 0xc9, 0x1c, 0x81, 0x1f, 0xbb, 0x63, 0x69, 0x3b, 0x13, 0x3c,\n\t\t0x9b, 0xfd, 0x10, 0x3e, 0x01, 0x95, 0x5c, 0x4e, 0x93, 0x33, 0x74, 0xf4,\n\t\t0x24, 0x67, 0x1d, 0xe7, 0x3c, 0x65, 0xfa, 0xf2, 0xc1, 0x54, 0xaf, 0x55,\n\t\t0xea, 0xf5, 0x83, 0x1e, 0xa4, 0x88, 0x35, 0xc9, 0xe9, 0x74, 0x16, 0xc2,\n\t\t0xbb, 0x26, 0xef, 0x13, 0x31, 0x17, 0xc8, 0xdd, 0x67, 0x93, 0x3e, 0xa7,\n\t\t0xfe, 0x92, 0xae, 0x5a, 0x0c, 0x5e, 0x82, 0x51, 0xad, 0x3f, 0xea, 0xd8,\n\t\t0x59, 0xcc, 0x25, 0xbd, 0xd8, 0xea, 0xc7, 0x3c, 0x00, 0x56, 0x91, 0xaa,\n\t\t0x8d, 0x56, 0x2c, 0x7d, 0xd4, 0x65, 0xd4, 0xf8, 0xd0, 0x79, 0x06, 0x7f,\n\t\t0xf0, 0xd6, 0x26, 0xdb, 0xed, 0xd8, 0xcb, 0x0a, 0xdd, 0x02, 0xbc, 0x0b,\n\t\t0x55, 0x20, 0x82, 0x4b, 0x5e, 0x09, 0x96, 0x89, 0xef, 0x8e, 0xb4, 0x5d,\n\t\t0xf1, 0x06, 0x04, 0x01, 0x1d, 0xbb, 0x3b, 0x17, 0x39, 0xe6, 0xbf, 0x5f,\n\t\t0x4e, 0xda, 0x42, 0x1f, 0x8e, 0x1e, 0x80, 0x56, 0x9a, 0x65, 0x4b, 0xc4,\n\t\t0xb3, 0xb8, 0xed, 0xa1, 0xcf, 0x79, 0x20, 0xc4, 0x32, 0xed, 0x8c, 0x7c,\n\t\t0xb6, 0x99, 0x61, 0x4f, 0x88, 0x07, 0x76, 0xbb, 0xa0, 0x51, 0x17, 0x5b,\n\t\t0xc9, 0x6f, 0x33, 0xb7, 0xaf, 0x94, 0xd5, 0x12, 0x5c, 0xca, 0x7c, 0x6b,\n\t\t0x15, 0x23, 0x6b, 0x7e, 0x6c, 0x55, 0xc9, 0x15, 0x59, 0x61, 0xe6, 0x8d,\n\t\t0xe4, 0x63, 0xb4, 0x57, 0x8c, 0x98, 0xa4, 0xe6, 0x23, 0x5f, 0xd9, 0x79,\n\t\t0x6c, 0x3b, 0xe8, 0x86, 0x27, 0xf3, 0x07, 0x0e, 0xf6, 0x37, 0x1b, 0xc5,\n\t\t0xd7, 0xa0, 0x7f, 0x97, 0x71, 0x52, 0x3e, 0x16, 0xcc, 0xdc, 0x60, 0xc1,\n\t\t0x50, 0xf2, 0xa5, 0x93, 0xbf, 0xb7, 0xfe, 0x43, 0x4e, 0xec, 0x7c, 0xb8,\n\t\t0x32, 0xf8, 0xb3, 0x09, 0xa9, 0xba, 0x11, 0x2d, 0xcb, 0x56, 0xc0, 0xcb,\n\t\t0xf8, 0x2b, 0xeb, 0x43, 0xad, 0x2e, 0xf0, 0x23, 0xae, 0x76, 0x19, 0x37,\n\t\t0xe2, 0xce, 0x0f, 0x81, 0x66, 0x26, 0xea, 0x2e, 0xb9, 0x72, 0xe5, 0x7c,\n\t\t0xfd, 0xe3, 0x5f, 0x5a, 0x77, 0x9a, 0x39, 0x21, 0xd1, 0xf8, 0x2c, 0xa0,\n\t\t0xae, 0x27, 0x70, 0x7d, 0x65, 0xa5, 0x01, 0x36, 0x1b, 0x1b, 0xdb, 0xf0,\n\t\t0xc8, 0x48, 0xcf, 0x76, 0xdf, 0xe4, 0x69, 0x20, 0x8d, 0x8c, 0xb8, 0x81,\n\t\t0x01, 0xd9, 0xe8, 0xe8, 0x68, 0xf6, 0xad, 0xa4, 0x74, 0xb8, 0xf1, 0x86,\n\t\t0x2b, 0xba, 0xe9, 0x62, 0x88, 0xa7, 0x4a, 0x1a, 0x97, 0xcb, 0x97, 0x8b,\n\t\t0xd8, 0xa2, 0xba, 0xa3, 0xbb, 0x4e, 0x56, 0x02, 0x05, 0x34, 0x5f, 0x89,\n\t\t0x12, 0xd9, 0x92, 0x4e, 0xba, 0x28, 0x49, 0x77, 0x06, 0xff, 0xaf, 0x6b,\n\t\t0xe1, 0x0e, 0xad, 0x9a, 0x05, 0x0d, 0x6e, 0xee, 0x91, 0x23, 0x29, 0xc2,\n\t\t0x69, 0xae, 0x5f, 0xf2, 0xda, 0xc1, 0xf4, 0x88, 0xa8, 0x28, 0x59, 0xc4,\n\t\t0xbf, 0x55, 0xd6, 0xd9, 0xc9, 0x10, 0x03, 0xbe, 0x16, 0x44, 0xf8, 0x93,\n\t\t0x21, 0x3a, 0x1d, 0x81, 0x0a, 0x79, 0x08, 0x12, 0x53, 0x5c, 0xe0, 0x6d,\n\t\t0x9b, 0xc1, 0x43, 0x9a, 0x0c, 0xdc, 0xdb, 0x37, 0x6f, 0x01, 0x3f, 0xca,\n\t\t0x95, 0x3a, 0xc3, 0x9e, 0x7b, 0x2f, 0x09, 0x4f, 0x81, 0x77, 0x2b, 0x6f,\n\t\t0x6b, 0x79, 0xed, 0x29, 0x60, 0xb5, 0xd8, 0xc8, 0xfb, 0x2e, 0x87, 0x53,\n\t\t0xdd, 0x15, 0xda, 0x3c, 0x99, 0xa4, 0x50, 0x5c, 0x06, 0x8d, 0xf9, 0xc3,\n\t\t0x2b, 0x04, 0x54, 0x22, 0xb7, 0xab, 0x90, 0xd7, 0x42, 0x8d, 0xcf, 0xce,\n\t\t0x77, 0x07, 0xdf, 0xb5, 0x1e, 0x46, 0x2a, 0x09, 0xf8, 0x6a, 0xdf, 0x73,\n\t\t0x21, 0x51, 0xf1, 0x94, 0xa8, 0xd1, 0xb1, 0x36, 0x04, 0xa6, 0x26, 0xef,\n\t\t0x50, 0x09, 0x91, 0xa0, 0xb5, 0xc2, 0xdc, 0xf1, 0xbc, 0xdd, 0x8a, 0xd9,\n\t\t0x2e, 0x85, 0xab, 0xad, 0xa9, 0xac, 0x22, 0x02, 0x0a, 0xcb, 0xa4, 0xfd,\n\t\t0x9e, 0xaf, 0x4b, 0xb4, 0xb5, 0x75, 0x2d, 0xa3, 0x4d, 0x7a, 0x28, 0x82,\n\t\t0x36, 0x11, 0xb4, 0xf4, 0x5e, 0xf5, 0x2d, 0xf6, 0x70, 0xb6, 0xe6, 0xcc,\n\t\t0x8f, 0x2f, 0xae, 0xfb, 0x3c, 0x7b, 0xec, 0x9a, 0x56, 0x4f, 0xc7, 0x58,\n\t\t0x18, 0x7b, 0x0e, 0xaf, 0xca, 0x3d, 0x62, 0x05, 0x22, 0xce, 0x54, 0xe9,\n\t\t0x71, 0xad, 0xc8, 0x36, 0x11, 0xd3, 0xaa, 0xcd, 0xde, 0x01, 0xf0, 0x18,\n\t\t0xb5, 0x82, 0x3e, 0xe5, 0xf9, 0x61, 0xcd, 0xcc, 0xcc, 0x34, 0x3e, 0x76,\n\t\t0x40, 0x0b, 0x99, 0xdc, 0x41, 0x72, 0x21, 0x05, 0x33, 0x37, 0xf2, 0x36,\n\t\t0xa5, 0xce, 0x87, 0x43, 0x20, 0x7c, 0x1f, 0x82, 0x9b, 0xb4, 0xbc, 0x99,\n\t\t0x56, 0xd5, 0xe4, 0x97, 0xe7, 0x25, 0x58, 0x4f, 0xf4, 0xa1, 0xa3, 0xcd,\n\t\t0x3b, 0xfe, 0x09, 0xfc, 0x24, 0x6a, 0xc5, 0x4d, 0xc4, 0x4e, 0xc4, 0x97,\n\t\t0x29, 0xa7, 0x90, 0xe1, 0xe1, 0x8b, 0x19, 0x49, 0xc9, 0x7d, 0x5d, 0x14,\n\t\t0xf1, 0x1e, 0xaf, 0x4a, 0x75, 0x4f, 0x01, 0xa3, 0x43, 0xf8, 0xe5, 0xb7,\n\t\t0x2d, 0x8e, 0x41, 0x3d, 0xc5, 0x5c, 0x5d, 0xde, 0x3b, 0x99, 0xb5, 0xc5,\n\t\t0xa9, 0x85, 0x62, 0x6c, 0xd0, 0xd8, 0x1e, 0xb3, 0x56, 0x54, 0xa3, 0xee,\n\t\t0x2d, 0xb0, 0x29, 0x2f, 0xe0, 0xd1, 0x9a, 0x51, 0xaf, 0xa5, 0x56, 0x2a,\n\t\t0x2f, 0x31, 0x3d, 0x3d, 0x02, 0x12, 0xc3, 0x44, 0xd0, 0x18, 0x8b, 0x19,\n\t\t0x3c, 0x1e, 0x88, 0x27, 0x30, 0x25, 0x58, 0x6e, 0xc7, 0x96, 0x42, 0x3d,\n\t\t0x8a, 0xac, 0x6b, 0xbe, 0x71, 0xd6, 0xbe, 0x88, 0x4e, 0xc8, 0x84, 0xa8,\n\t\t0xd9, 0x82, 0x7d, 0x91, 0xfe, 0x11, 0xb3, 0xa1, 0x55, 0xa4, 0x60, 0xc9,\n\t\t0xa2, 0xc3, 0xcd, 0x31, 0xb3, 0xd5, 0x40, 0xd9, 0x9f, 0x7f, 0x23, 0x48,\n\t\t0x65, 0x0f, 0x1c, 0x16, 0xff, 0x98, 0xb3, 0x8d, 0x4d, 0x92, 0xb1, 0x6e,\n\t\t0x58, 0x75, 0x08, 0xe6, 0xba, 0x5e, 0xe5, 0x04, 0x3d, 0x84, 0x93, 0x6a,\n\t\t0x75, 0xe5, 0xbd, 0xb1, 0xf3, 0x37, 0xdb, 0x1e, 0x16, 0x1c, 0x44, 0x34,\n\t\t0x7f, 0x95, 0x9b, 0x1a, 0xf4, 0x57, 0xea, 0xb6, 0xf5, 0x65, 0x2e, 0xd7,\n\t\t0xa8, 0x74, 0xbe, 0x39, 0x52, 0xe7, 0xb4, 0x99, 0x2f, 0x5b, 0xcd, 0x63,\n\t\t0xb3, 0x9a, 0xa6, 0x38, 0x01, 0x36, 0x4f, 0x39, 0xc8, 0x13, 0x93, 0x44,\n\t\t0x2c, 0xe5, 0x05, 0x60, 0x14, 0xbd, 0xbf, 0x73, 0xb1, 0xed, 0x08, 0xb5,\n\t\t0x03, 0xa6, 0x45, 0xe0, 0x6f, 0x3c, 0xf4, 0x5a, 0xeb, 0x15, 0x58, 0xb1,\n\t\t0xeb, 0xe2, 0x70, 0xe8, 0x4f, 0x64, 0x7e, 0x24, 0x93, 0x4a, 0x06, 0xad,\n\t\t0xfd, 0x2e, 0x3b, 0x10, 0xd2, 0xaa, 0x6a, 0xdd, 0x87, 0xb9, 0x72, 0xec,\n\t\t0xe9, 0xf1, 0x17, 0x4e, 0xa4, 0xbe, 0x40, 0xa6, 0xa0, 0x01, 0xfc, 0xd4,\n\t\t0xd2, 0x1c, 0x42, 0x07, 0x03, 0x09, 0x91, 0x26, 0x88, 0x7c, 0xf9, 0xe5,\n\t\t0xa9, 0xea, 0xa1, 0x8a, 0x34, 0x18, 0xd6, 0x1e, 0xf5, 0x9b, 0xc4, 0x37,\n\t\t0x09, 0x0d, 0x0d, 0x3c, 0x22, 0x08, 0x2d, 0xb4, 0x98, 0x70, 0xe8, 0x68,\n\t\t0x01, 0x41, 0x50, 0xf3, 0xfe, 0x7a, 0x4e, 0xa9, 0xce, 0x64, 0x00, 0xb9,\n\t\t0xdd, 0xa5, 0x06, 0xd6, 0xc7, 0xbd, 0xdf, 0xd2, 0x51, 0x24, 0xa4, 0xfa,\n\t\t0x54, 0x77, 0xc1, 0xf6, 0xa4, 0x5f, 0x84, 0x86, 0xd3, 0x31, 0xd8, 0xff,\n\t\t0x87, 0xd2, 0xc7, 0x4f, 0xdd, 0xc3, 0xce, 0x9a, 0x04, 0x46, 0xaf, 0x52,\n\t\t0x71, 0xe9, 0x11, 0x42, 0x6d, 0xe2, 0x77, 0x11, 0x3f, 0x19, 0x29, 0x44,\n\t\t0xb9, 0xe6, 0xcc, 0xda, 0x6e, 0xd1, 0x27, 0xc7, 0x56, 0xd5, 0x36, 0x38,\n\t\t0xf6, 0xb7, 0xdb, 0x2f, 0x0e, 0xe6, 0xeb, 0x5c, 0xe0, 0xa5, 0xcc, 0xcc,\n\t\t0xea, 0xb4, 0x2e, 0x96, 0x19, 0x50, 0x12, 0xbc, 0x68, 0x07, 0xb8, 0x07,\n\t\t0x09, 0xfa, 0x48, 0x3d, 0xd7, 0xbe, 0xff, 0x64, 0xd2, 0x2d, 0x34, 0x1d,\n\t\t0x8a, 0x4b, 0x17, 0xf4, 0x66, 0x17, 0xff, 0xf2, 0xc5, 0xf9, 0xfe, 0xdc,\n\t\t0x58, 0xaf, 0xcd, 0x0d, 0xc9, 0xd0, 0xef, 0x02, 0xfe, 0xf6, 0x6c, 0xd3,\n\t\t0xd1, 0xd7, 0x6f, 0xee, 0x8f, 0xb5, 0x29, 0x44, 0x0a, 0x90, 0xd9, 0xeb,\n\t\t0x0c, 0xee, 0x80, 0x67, 0x60, 0xcb, 0x66, 0x89, 0xcb, 0x35, 0x45, 0xec,\n\t\t0x97, 0xc3, 0x02, 0xdf, 0xa6, 0x9c, 0xb1, 0x4a, 0x29, 0xac, 0x39, 0x61,\n\t\t0x33, 0xd3, 0xe5, 0x7d, 0x6d, 0x35, 0xed, 0xa3, 0x5b, 0x50, 0x69, 0xdc,\n\t\t0xd0, 0x67, 0x6d, 0xde, 0xd3, 0x8d, 0xef, 0x05, 0x03, 0x19, 0x7f, 0x5e,\n\t\t0x07, 0x3a, 0x1b, 0xf0, 0x93, 0x00, 0xc0, 0x44, 0x5c, 0x00, 0xc7, 0xd7,\n\t\t0xcd, 0x0f, 0xad, 0x5f, 0x3e, 0xb2, 0x8f, 0x40, 0xbc, 0x09, 0x76, 0xaa,\n\t\t0xeb, 0xc7, 0xef, 0xb5, 0x77, 0x69, 0x4f, 0x5c, 0x44, 0xa8, 0x29, 0xb2,\n\t\t0x34, 0xd7, 0x8f, 0xc7, 0x72, 0xfe, 0x0b, 0xf4, 0x34, 0x83, 0x1f, 0x0e,\n\t\t0x63, 0x9f, 0xce, 0xc8, 0xe2, 0x3c, 0xaa, 0x32, 0xc5, 0x9c, 0xbe, 0x39,\n\t\t0x66, 0x25, 0x3c, 0xe6, 0xf3, 0x10, 0x38, 0x4f, 0x61, 0x3b, 0x52, 0x31,\n\t\t0x34, 0x4f, 0x1b, 0x2b, 0xed, 0xe4, 0x8a, 0xe2, 0x31, 0x19, 0x26, 0x13,\n\t\t0xfa, 0xe7, 0xdc, 0x51, 0xd4, 0x3f, 0xd0, 0xe3, 0x0f, 0x74, 0xa8, 0x95,\n\t\t0xfc, 0x99, 0x30, 0x96, 0x19, 0xcd, 0x82, 0x0f, 0xda, 0xc5, 0x4f, 0x55,\n\t\t0x5b, 0x81, 0xfb, 0x7e, 0xdf, 0x95, 0x2f, 0x8a, 0xda, 0xe6, 0x6e, 0x17,\n\t\t0x56, 0xe5, 0x1b, 0xdf, 0x63, 0x57, 0xc7, 0x7f, 0x8a, 0x2f, 0x39, 0xa3,\n\t\t0x41, 0xc6, 0x4d, 0xc5, 0x08, 0x87, 0xae, 0x48, 0xf2, 0xdd, 0x7b, 0x4a,\n\t\t0x28, 0x06, 0xa9, 0xc8, 0x41, 0x52, 0xde, 0x8c, 0xe0, 0x65, 0x0d, 0x23,\n\t\t0x5e, 0xa5, 0x32, 0x45, 0xb9, 0x52, 0x7d, 0xf9, 0x6a, 0xa9, 0xa8, 0x10,\n\t\t0x39, 0xe6, 0xf3, 0x78, 0x90, 0xb5, 0xaa, 0xbe, 0x88, 0x61, 0xd1, 0x21,\n\t\t0xf1, 0x5c, 0xd7, 0x8b, 0x9e, 0xaa, 0x03, 0xd8, 0x47, 0x67, 0x5a, 0x17,\n\t\t0xe5, 0x1a, 0x28, 0x4a, 0x1b, 0x13, 0x76, 0xb2, 0xaf, 0xe7, 0xc9, 0x00,\n\t\t0xf8, 0xfd, 0x70, 0xa9, 0xd0, 0x60, 0x77, 0x74, 0x89, 0x29, 0x70, 0x81,\n\t\t0x0d, 0x3d, 0x8c, 0xf2, 0xbf, 0x33, 0xb6, 0x03, 0xfa, 0x7e, 0x28, 0x9d,\n\t\t0x2a, 0xa5, 0x84, 0x28, 0x53, 0xfd, 0xd5, 0x4f, 0x14, 0x54, 0xf2, 0xd1,\n\t\t0xe9, 0x11, 0xac, 0x9c, 0x0e, 0x38, 0x50, 0x27, 0x0c, 0xe7, 0xa6, 0x53,\n\t\t0x06, 0x2b, 0x47, 0xe6, 0xcd, 0xa5, 0x11, 0xb2, 0xf9, 0x3c, 0x8e, 0xa1,\n\t\t0xd9, 0x97, 0x2c, 0xfc, 0x3c, 0x3f, 0x17, 0x3b, 0x8d, 0x8a, 0xf2, 0x28,\n\t\t0x7e, 0xf7, 0x77, 0xf3, 0xd5, 0x02, 0x8f, 0x9d, 0x63, 0x0c, 0x47, 0xc0,\n\t\t0x13, 0x2d, 0x8c, 0x3a, 0xd5, 0xbd, 0x49, 0xc7, 0xf5, 0x91, 0xe3, 0x17,\n\t\t0xa7, 0x0c, 0x96, 0xe2, 0xbb, 0x20, 0x71, 0xcc, 0x32, 0xcc, 0x81, 0x5e,\n\t\t0xee, 0xe0, 0x7c, 0x02, 0x66, 0x99, 0x5f, 0x8b, 0x41, 0x5c, 0x08, 0x46,\n\t\t0x62, 0x41, 0x04, 0xe8, 0x74, 0xb2, 0x80, 0xdc, 0x89, 0x74, 0x7a, 0x58,\n\t\t0x51, 0xa4, 0x7d, 0xc6, 0x6f, 0x05, 0x88, 0x42, 0x84, 0x58, 0xec, 0x66,\n\t\t0x9e, 0xdf, 0x66, 0x46, 0xfd, 0xf8, 0x5e, 0xc7, 0x51, 0xe1, 0x69, 0xdc,\n\t\t0x32, 0x10, 0xc5, 0x4f, 0xbc, 0x64, 0x46, 0x37, 0x00, 0x80, 0xab, 0x5c,\n\t\t0x5f, 0x44, 0xec, 0x8a, 0x13, 0x21, 0xf9, 0xe7, 0xd8, 0x11, 0xbb, 0xef,\n\t\t0x2a, 0x05, 0x65, 0x85, 0x9f, 0x11, 0x28, 0x2f, 0x7d, 0xff, 0x91, 0x93,\n\t\t0x6f, 0x2f, 0x1f, 0xa2, 0xa0, 0x15, 0xc9, 0x92, 0xfe, 0x55, 0x81, 0xa1,\n\t\t0x44, 0x4b, 0x78, 0x47, 0x80, 0x8d, 0x93, 0x1d, 0x0d, 0xf8, 0xed, 0xf0,\n\t\t0x80, 0x37, 0x9a, 0x3e, 0x48, 0x81, 0x38, 0x33, 0x25, 0x21, 0x21, 0xff,\n\t\t0x48, 0xcb, 0x72, 0x66, 0x7a, 0x74, 0x75, 0xfc, 0xee, 0x65, 0x30, 0x21,\n\t\t0x52, 0x6a, 0xee, 0xd9, 0x53, 0x34, 0x07, 0x09, 0x20, 0xad, 0xc4, 0xf7,\n\t\t0xda, 0x47, 0xf1, 0x2a, 0x5f, 0xa4, 0xf1, 0x8d, 0xfd, 0x93, 0xc1, 0xe9,\n\t\t0x24, 0xe6, 0x8b, 0x7e, 0x8c, 0xce, 0x17, 0x80, 0x9c, 0xe6, 0x5f, 0x1c,\n\t\t0x54, 0xad, 0x86, 0xec, 0xac, 0x77, 0xb6, 0x99, 0xe3, 0x84, 0xa6, 0xea,\n\t\t0xc2, 0x52, 0xa0, 0x35, 0x1c, 0xba, 0xa8, 0xa5, 0x2e, 0x46, 0xba, 0xfb,\n\t\t0x57, 0x89, 0xaf, 0xc3, 0xf9, 0x8b, 0x8d, 0x91, 0xc0, 0xa5, 0x19, 0xdc,\n\t\t0xb6, 0x18, 0x02, 0x14, 0x9d, 0x51, 0xef, 0x95, 0x6b, 0x40, 0x2c, 0x91,\n\t\t0xee, 0xcf, 0xce, 0x1f, 0x10, 0xae, 0xb9, 0x46, 0x89, 0x29, 0x3e, 0xac,\n\t\t0xa0, 0x2d, 0x89, 0x79, 0x27, 0xf2, 0xe2, 0x98, 0xad, 0xa4, 0x50, 0xb3,\n\t\t0x78, 0xa1, 0x53, 0x85, 0xb7, 0xde, 0xee, 0x29, 0x1d, 0x8d, 0xc7, 0x04,\n\t\t0x00, 0x4c, 0x64, 0xf1, 0x40, 0x6b, 0x75, 0xce, 0xd4, 0x99, 0x4a, 0xeb,\n\t\t0x92, 0x87, 0xb4, 0xb4, 0xf0, 0x96, 0xa9, 0xed, 0x4a, 0x26, 0xb8, 0xf1,\n\t\t0x93, 0xba, 0xb8, 0xb8, 0x38, 0xed, 0x8e, 0xe2, 0xda, 0x2d, 0xd7, 0xc2,\n\t\t0x40, 0xdc, 0x33, 0x6c, 0xbd, 0x5f, 0x59, 0x54, 0x3b, 0x5f, 0x59, 0xa2,\n\t\t0x8b, 0x29, 0x4a, 0xec, 0xea, 0x3b, 0xa7, 0xe7, 0xeb, 0x0c, 0x11, 0xa7,\n\t\t0xec, 0x01, 0xbb, 0x0a, 0x5d, 0xa6, 0x20, 0x63, 0x54, 0x86, 0x1c, 0x60,\n\t\t0xab, 0xbe, 0x39, 0x6f, 0xb0, 0x4a, 0x48, 0x60, 0x94, 0x14, 0x8b, 0x32,\n\t\t0x54, 0x6d, 0x4c, 0xda, 0xf0, 0x25, 0xd8, 0xbc, 0xdb, 0xa1, 0x9e, 0xb8,\n\t\t0xfd, 0xe5, 0x16, 0xc8, 0xe6, 0xb0, 0xc6, 0x2b, 0x9f, 0x2b, 0x48, 0x08,\n\t\t0x70, 0x82, 0x16, 0xe3, 0x7c, 0xff, 0xbe, 0xc8, 0x71, 0xb3, 0x6b, 0xda,\n\t\t0xca, 0x66, 0x13, 0x8e, 0x4e, 0x44, 0x84, 0xfc, 0xac, 0xeb, 0x89, 0x59,\n\t\t0xf8, 0xe9, 0x84, 0x83, 0xe0, 0x03, 0x02, 0xb0, 0x45, 0x6a, 0xce, 0x27,\n\t\t0x4c, 0x6a, 0xce, 0xc5, 0x47, 0x66, 0xc4, 0x63, 0x9f, 0xb0, 0x24, 0x20,\n\t\t0x02, 0xab, 0x2d, 0x06, 0x27, 0xca, 0x23, 0xb1, 0xd0, 0xeb, 0x33, 0x71,\n\t\t0x2d, 0x5d, 0x5e, 0x96, 0x37, 0xba, 0x85, 0x3c, 0x11, 0x8d, 0xe7, 0xd7,\n\t\t0x50, 0x0c, 0x15, 0xa6, 0x48, 0x4b, 0x95, 0xf3, 0xe1, 0xe8, 0xb7, 0x3a,\n\t\t0xdc, 0xd6, 0xb8, 0xb8, 0x38, 0x29, 0x45, 0x45, 0xc5, 0xce, 0xea, 0x8e,\n\t\t0xe1, 0x89, 0x89, 0x81, 0x5c, 0x21, 0xdf, 0xf3, 0xc7, 0xe3, 0x1a, 0x28,\n\t\t0x09, 0x02, 0x00, 0xc2, 0xa8, 0x3c, 0x92, 0xe9, 0x10, 0x14, 0x01, 0xb3,\n\t\t0xcf, 0xc2, 0xe5, 0x73, 0x21, 0xfc, 0x84, 0x91, 0xa0, 0xd6, 0x77, 0xa2,\n\t\t0xcb, 0xef, 0x01, 0x4f, 0x71, 0xd9, 0x89, 0x02, 0x24, 0xe2, 0x88, 0xe5,\n\t\t0x4d, 0x64, 0x39, 0xab, 0xf9, 0xea, 0xd1, 0xbc, 0xc0, 0xa6, 0x11, 0xb3,\n\t\t0xe0, 0x05, 0x9d, 0x6e, 0x3e, 0x2e, 0x5a, 0x5a, 0x84, 0x64, 0x5a, 0x85,\n\t\t0xde, 0x38, 0x52, 0x81, 0xe9, 0x5f, 0x0a, 0xde, 0xb1, 0xcc, 0xdf, 0xc6,\n\t\t0xc9, 0x3e, 0x21, 0xb6, 0xb5, 0xde, 0xf8, 0x80, 0x10, 0x82, 0xb1, 0xda,\n\t\t0xc6, 0x53, 0x46, 0xa7, 0x27, 0x00, 0x4e, 0xa0, 0x13, 0xc9, 0x94, 0x14,\n\t\t0xfe, 0xbb, 0x2a, 0xda, 0x50, 0x0c, 0x47, 0x2e, 0x1b, 0x65, 0x25, 0xa0,\n\t\t0x6d, 0x8e, 0xe2, 0x8f, 0x9b, 0xe3, 0x25, 0xdf, 0x7f, 0x1d, 0xb1, 0x44,\n\t\t0x5c, 0xbd, 0xbf, 0xb5, 0xeb, 0xed, 0x80, 0xd9, 0xc7, 0x79, 0xaa, 0x95,\n\t\t0xed, 0xf7, 0x2f, 0xd4, 0xd4, 0x10, 0x3b, 0x61, 0x0f, 0xe4, 0xe7, 0xc1,\n\t\t0x20, 0x14, 0x8d, 0x04, 0x77, 0x4a, 0x2b, 0x6e, 0x3e, 0xa3, 0x86, 0x62,\n\t\t0x80, 0x68, 0xc2, 0xd7, 0x57, 0xd7, 0x1d, 0x9e, 0x86, 0xc8, 0x03, 0xaf,\n\t\t0x97, 0x5b, 0x4b, 0x15, 0xb2, 0x10, 0x06, 0x0c, 0x4b, 0xe2, 0xf8, 0x78,\n\t\t0x10, 0xb4, 0xab, 0xbc, 0x55, 0x05, 0x3d, 0x5c, 0x58, 0x24, 0x91, 0xf4,\n\t\t0x2d, 0xb2, 0x0d, 0x15, 0x61, 0xd4, 0xf8, 0x00, 0xb5, 0xde, 0x77, 0x98,\n\t\t0xad, 0x7d, 0x94, 0xa1, 0x09, 0x36, 0xed, 0x34, 0x94, 0x1b, 0xd5, 0xad,\n\t\t0xf3, 0xe1, 0xa8, 0xc4, 0x24, 0x16, 0x45, 0x4b, 0x79, 0xf7, 0xf7, 0x5e,\n\t\t0x1f, 0x08, 0xd9, 0xfb, 0x9b, 0x26, 0x5a, 0xc1, 0x30, 0xf1, 0xd9, 0xcb,\n\t\t0xd1, 0xdf, 0xc4, 0xef, 0xde, 0x05, 0x63, 0x38, 0xc1, 0x01, 0xe2, 0xb2,\n\t\t0xf9, 0xd1, 0x93, 0x47, 0x18, 0x3d, 0x79, 0xa1, 0x96, 0x8a, 0x61, 0x8b,\n\t\t0x21, 0xf1, 0x7a, 0x69, 0x6a, 0x1f, 0x31, 0xeb, 0x1d, 0x8c, 0x25, 0x5e,\n\t\t0x0f, 0xc8, 0x85, 0x47, 0xc1, 0xcb, 0xf7, 0x7f, 0xba, 0x6d, 0x79, 0x7b,\n\t\t0x7d, 0xaa, 0x73, 0xd9, 0x95, 0xd5, 0x4d, 0xeb, 0x99, 0x29, 0x92, 0x06,\n\t\t0xc6, 0x6d, 0xaf, 0x09, 0xca, 0x57, 0x91, 0x29, 0x3f, 0x95, 0x5f, 0x0b,\n\t\t0x07, 0x61, 0xb5, 0xe1, 0x27, 0x50, 0xdb, 0xbd, 0x1b, 0x95, 0xa3, 0xcf,\n\t\t0xfd, 0xaa, 0x98, 0xfa, 0xff, 0xa6, 0x12, 0x90, 0xbe, 0xfd, 0x41, 0xa1,\n\t\t0xa7, 0x44, 0x03, 0x7d, 0x9a, 0x07, 0x9c, 0xaa, 0xb3, 0x07, 0x72, 0x67,\n\t\t0x43, 0x62, 0x6a, 0x2c, 0x8d, 0x65, 0xa8, 0xc1, 0x7a, 0x8e, 0xd5, 0x75,\n\t\t0x4f, 0x1e, 0x20, 0x5a, 0xa9, 0xe1, 0x51, 0x15, 0x4c, 0x33, 0x88, 0x13,\n\t\t0xa0, 0x0f, 0x9b, 0x9b, 0x59, 0xef, 0x05, 0x53, 0xf2, 0xa7, 0x5c, 0x3b,\n\t\t0x09, 0x39, 0x0f, 0x10, 0x54, 0x16, 0xa1, 0x0c, 0x81, 0x35, 0x31, 0x70,\n\t\t0x02, 0x22, 0x65, 0xb1, 0x8e, 0x78, 0xa3, 0x18, 0x6f, 0x82, 0xd7, 0xe2,\n\t\t0xe2, 0x77, 0x26, 0x2e, 0x2e, 0x5c, 0x4c, 0x4c, 0x4c, 0xe8, 0x5e, 0x6f,\n\t\t0x8a, 0x6c, 0x89, 0xee, 0x24, 0x9b, 0xcd, 0x3c, 0xdd, 0x81, 0x1b, 0x3f,\n\t\t0x09, 0x9f, 0xca, 0xab, 0xd6, 0xe5, 0xfd, 0xc5, 0x8e, 0xd5, 0x7c, 0x19,\n\t\t0xe6, 0xe5, 0xe5, 0x65, 0xad, 0xfb, 0xb1, 0x06, 0x20, 0x88, 0x22, 0xf4,\n\t\t0x77, 0x9d, 0xce, 0x14, 0x8b, 0xe7, 0x18, 0x12, 0x31, 0x9d, 0xec, 0x81,\n\t\t0x81, 0x68, 0x91, 0x75, 0x8e, 0x63, 0xe3, 0x9e, 0x08, 0x6a, 0x04, 0xcc,\n\t\t0xa1, 0xb6, 0x77, 0x3a, 0xff, 0x2b, 0x37, 0x5d, 0xea, 0x75, 0x77, 0x38,\n\t\t0x06, 0xe8, 0x85, 0xc0, 0x74, 0x3a, 0x95, 0xe8, 0x7c, 0xbf, 0x8e, 0x1a,\n\t\t0x10, 0x44, 0x2d, 0xb3, 0xdc, 0x60, 0x8d, 0xcd, 0x49, 0x14, 0xbb, 0xce,\n\t\t0x01, 0x6e, 0x83, 0x7e, 0x1e, 0x00, 0x8a, 0xc1, 0xae, 0xfb, 0x93, 0xdb,\n\t\t0xd7, 0x87, 0x97, 0x23, 0x7d, 0xc4, 0x3c, 0x0e, 0x0d, 0x34, 0x57, 0x2e,\n\t\t0xab, 0x9f, 0xbe, 0xff, 0x19, 0x73, 0xe0, 0x33, 0x86, 0x95, 0x6c, 0x5e,\n\t\t0xeb, 0x0c, 0xea, 0x71, 0xea, 0xa7, 0x42, 0x14, 0xb3, 0x85, 0xa1, 0xa8,\n\t\t0xc9, 0x27, 0xc8, 0x7a, 0xe3, 0xa5, 0xff, 0xcf, 0xdb, 0xec, 0xfb, 0x1c,\n\t\t0x4e, 0xf7, 0x38, 0xf1, 0xf0, 0xf0, 0xf6, 0x6e, 0xaf, 0xfc, 0xae, 0x67,\n\t\t0xa4, 0xa7, 0x6d, 0x1a, 0x21, 0xfc, 0xe8, 0x03, 0x91, 0xc2, 0x55, 0x88,\n\t\t0x83, 0x88, 0x31, 0xec, 0x17, 0xa4, 0x75, 0x39, 0x27, 0xb2, 0x96, 0xfc,\n\t\t0x42, 0xa7, 0xcd, 0x4c, 0xa6, 0x27, 0x8a, 0xa8, 0x79, 0xf9, 0x08, 0x8c,\n\t\t0x59, 0xd6, 0x7e, 0x89, 0xb0, 0x2f, 0xc4, 0x76, 0x9b, 0x3f, 0x76, 0x21,\n\t\t0x9c, 0xcf, 0x41, 0x44, 0x49, 0x4f, 0x8f, 0xc4, 0x62, 0x2a, 0xf7, 0x94,\n\t\t0x93, 0x19, 0x11, 0x86, 0x38, 0x76, 0xd0, 0x54, 0x0a, 0xdf, 0xf1, 0x82,\n\t\t0x21, 0x65, 0xba, 0x13, 0x6e, 0xff, 0x68, 0x27, 0x06, 0xbe, 0x14, 0x66,\n\t\t0x97, 0x06, 0x57, 0x44, 0xbb, 0x4d, 0x71, 0x2f, 0x02, 0x62, 0x21, 0x1f,\n\t\t0x4e, 0x1b, 0x5c, 0xb2, 0x16, 0xdb, 0x96, 0xf5, 0xe5, 0x29, 0x91, 0xb7,\n\t\t0x98, 0xe0, 0xe0, 0x77, 0xcd, 0x79, 0xc7, 0xad, 0xfb, 0xb9, 0x5f, 0x44,\n\t\t0x45, 0x83, 0xec, 0xb3, 0xea, 0x00, 0x21, 0xb2, 0x0b, 0xcf, 0xa8, 0xcd,\n\t\t0x79, 0x65, 0x30, 0x85, 0xa1, 0x60, 0xae, 0x59, 0x5e, 0xd3, 0xa3, 0x12,\n\t\t0x5c, 0xdd, 0x4a, 0xee, 0xd3, 0x82, 0x51, 0xe7, 0xd0, 0x04, 0x84, 0x22,\n\t\t0xfd, 0x4a, 0x0b, 0x0f, 0x20, 0x5e, 0x34, 0x7c, 0x46, 0x46, 0x06, 0x64,\n\t\t0x54, 0x79, 0xf9, 0x0f, 0xd0, 0xa3, 0x70, 0xe0, 0x9e, 0xde, 0x45, 0xc1,\n\t\t0x88, 0x5b, 0x54, 0x85, 0xcb, 0x77, 0xac, 0x36, 0x4d, 0x63, 0xc6, 0x23,\n\t\t0x55, 0x51, 0x63, 0x84, 0xa0, 0xa4, 0x59, 0xf6, 0x67, 0xc7, 0x0c, 0xcb,\n\t\t0x51, 0x3a, 0x2c, 0xf1, 0xaf, 0xfa, 0xee, 0x67, 0xcb, 0x44, 0xf4, 0xa9,\n\t\t0x2f, 0xbf, 0x6f, 0x0f, 0x0e, 0x0e, 0x7c, 0xf8, 0xd2, 0x56, 0xf4, 0x5a,\n\t\t0x0d, 0x7e, 0xa8, 0xa9, 0xb1, 0x7c, 0xb2, 0x0e, 0xa2, 0x2b, 0xf0, 0xc5,\n\t\t0xfc, 0xd6, 0x91, 0xf0, 0x11, 0x51, 0xec, 0x89, 0xbe, 0x49, 0xf3, 0xf7,\n\t\t0x66, 0x64, 0xe7, 0x8f, 0xc3, 0xe8, 0x4f, 0x94, 0xfd, 0x4f, 0x10, 0x12,\n\t\t0x92, 0xef, 0x6f, 0xfb, 0x54, 0x79, 0xdd, 0x68, 0xbb, 0xb4, 0x38, 0xd6,\n\t\t0xaa, 0xa2, 0xa2, 0x62, 0x57, 0xa3, 0x5e, 0x61, 0x61, 0x7d, 0xe3, 0x92,\n\t\t0x84, 0x00, 0x89, 0xdd, 0x25, 0x24, 0x6d, 0x3d, 0xef, 0xe3, 0x3e, 0x96,\n\t\t0xc0, 0xf0, 0x01, 0xd0, 0x9d, 0x3e, 0x0c, 0x12, 0x25, 0xea, 0xdf, 0xa0,\n\t\t0x5c, 0xd2, 0xd3, 0xa6, 0xb7, 0xfb, 0x1d, 0xf4, 0xe6, 0xbc, 0xa2, 0xda,\n\t\t0x5a, 0x0c, 0x3e, 0x3e, 0xbe, 0x40, 0xfb, 0x72, 0x89, 0xc6, 0xb6, 0x4d,\n\t\t0xb4, 0xe6, 0xbc, 0xe2, 0xef, 0x2e, 0x53, 0x15, 0x81, 0x20, 0x6e, 0x1b,\n\t\t0xf7, 0x1d, 0x75, 0x0b, 0xd7, 0x8b, 0xf7, 0x49, 0xc5, 0xf1, 0xef, 0x83,\n\t\t0xc6, 0x96, 0xfe, 0xd4, 0x79, 0x00, 0xf3, 0xd2, 0x05, 0x1d, 0x6a, 0xd7,\n\t\t0x0a, 0x20, 0x48, 0x86, 0xea, 0x6e, 0x9d, 0x66, 0xd4, 0x0c, 0xad, 0x00,\n\t\t0x0e, 0x02, 0x0d, 0x44, 0x4f, 0x5b, 0x71, 0x46, 0xc4, 0xc6, 0x4a, 0xee,\n\t\t0x4f, 0xe6, 0xcc, 0x54, 0xa8, 0x33, 0x40, 0x1f, 0xbc, 0xd5, 0xd5, 0xd5,\n\t\t0x35, 0xe1, 0x95, 0x71, 0x5d, 0x40, 0x2b, 0x28, 0x5b, 0x31, 0xe6, 0x4d,\n\t\t0x57, 0xab, 0x85, 0x3b, 0x2e, 0x1c, 0xa7, 0xe1, 0xb6, 0xd3, 0x78, 0x91,\n\t\t0x2b, 0x07, 0xe6, 0x1c, 0xc8, 0x54, 0x7d, 0xc6, 0x71, 0xbe, 0x8b, 0x30,\n\t\t0xd9, 0x9b, 0x02, 0x58, 0x02, 0xa6, 0x1b, 0x64, 0x3e, 0x2c, 0x06, 0x3c,\n\t\t0xd0, 0xe2, 0x20, 0xb7, 0x15, 0x88, 0x23, 0x5e, 0x18, 0x58, 0xaa, 0x56,\n\t\t0x6f, 0x75, 0x95, 0x6e, 0x56, 0x2d, 0xd6, 0x41, 0x62, 0x86, 0x54, 0x00,\n\t\t0xaf, 0xa6, 0xe3, 0x12, 0xd9, 0xa1, 0xf3, 0x46, 0x43, 0x77, 0xbf, 0xa1,\n\t\t0x22, 0xa2, 0x30, 0x22, 0x0c, 0x05, 0x1f, 0xb4, 0xa0, 0x69, 0x18, 0xd6,\n\t\t0x63, 0x04, 0xf8, 0xfb, 0x57, 0x2b, 0xd9, 0x20, 0xdb, 0x92, 0xc4, 0xf5,\n\t\t0xcb, 0x81, 0xf0, 0x77, 0xf6, 0x50, 0x7c, 0xac, 0x81, 0x18, 0x75, 0xd1,\n\t\t0xe9, 0x3f, 0x51, 0xa7, 0xd7, 0xe3, 0x7a, 0x24, 0x42, 0xee, 0x06, 0x93,\n\t\t0x10, 0x47, 0xff, 0xf7, 0x6b, 0xb5, 0xd1, 0x26, 0xea, 0x5c, 0x59, 0x33,\n\t\t0xcc, 0x30, 0xdb, 0x79, 0x12, 0xaa, 0x5e, 0x3f, 0x90, 0x09, 0x12, 0x40,\n\t\t0x04, 0xc3, 0xa0, 0x63, 0xf7, 0x4b, 0x38, 0x08, 0x64, 0xf2, 0x6f, 0x77,\n\t\t0xb7, 0xc7, 0xa6, 0xf3, 0x35, 0xbd, 0x2e, 0x3f, 0x1f, 0x70, 0xb5, 0x37,\n\t\t0xf1, 0x05, 0xd8, 0x64, 0x7f, 0xf1, 0x7c, 0x35, 0xf5, 0x96, 0x3a, 0x0e,\n\t\t0x09, 0x9c, 0xc3, 0xcc, 0x83, 0x03, 0xf8, 0x94, 0x71, 0x86, 0x02, 0x5d,\n\t\t0xb0, 0x81, 0x6c, 0x79, 0x8c, 0xae, 0x59, 0xe3, 0xaf, 0x71, 0xc0, 0xa8,\n\t\t0x2f, 0x2a, 0xe3, 0x8b, 0xbb, 0xc0, 0xa3, 0x87, 0x23, 0x8b, 0xab, 0x1a,\n\t\t0xc4, 0x2f, 0xb9, 0xc4, 0x30, 0xf2, 0x35, 0x16, 0x04, 0xab, 0xa8, 0x3f,\n\t\t0x7d, 0xda, 0x89, 0x13, 0x00, 0xd7, 0xda, 0xdb, 0x36, 0xea, 0x40, 0x1f,\n\t\t0x5d, 0xb6, 0xb6, 0xb6, 0x0e, 0x0f, 0x0f, 0x8b, 0x6a, 0x6b, 0xef, 0xd2,\n\t\t0x74, 0x54, 0x50, 0x89, 0x45, 0xf8, 0xfd, 0x32, 0x1f, 0x3b, 0x14, 0x29,\n\t\t0x2e, 0x96, 0x77, 0xff, 0x32, 0xdf, 0x15, 0x82, 0x1c, 0xee, 0x5b, 0x9e,\n\t\t0x90, 0xe0, 0xa0, 0x6d, 0xe1, 0x3a, 0xd9, 0x19, 0x44, 0x43, 0x44, 0xd7,\n\t\t0x2d, 0x7b, 0xb6, 0x59, 0xff, 0x91, 0x68, 0x48, 0x62, 0x98, 0x94, 0x08,\n\t\t0x02, 0xde, 0x87, 0x12, 0x97, 0x34, 0x7a, 0x6d, 0x26, 0xdd, 0xaf, 0x7a,\n\t\t0x05, 0xd3, 0x16, 0x80, 0xed, 0xb9, 0xa0, 0xb2, 0x56, 0x59, 0xf3, 0x2d,\n\t\t0xed, 0xc1, 0x14, 0xfa, 0xc9, 0x15, 0x0b, 0x51, 0xef, 0x08, 0x36, 0x05,\n\t\t0x4e, 0xa3, 0xba, 0xa7, 0x01, 0x0b, 0xee, 0xac, 0xc4, 0xdc, 0xdc, 0x38,\n\t\t0x88, 0x77, 0x6a, 0x31, 0xe2, 0x01, 0x79, 0x4d, 0x57, 0x3f, 0xda, 0xb8,\n\t\t0x2f, 0xb1, 0x69, 0x1c, 0x3f, 0xe4, 0xc0, 0xc3, 0xfb, 0x3e, 0xb7, 0xd5,\n\t\t0x67, 0x32, 0xb8, 0x8d, 0xad, 0xcb, 0xe1, 0xe2, 0x9f, 0xfd, 0x8b, 0x81,\n\t\t0x0f, 0xd4, 0xae, 0x63, 0x72, 0x8e, 0x6b, 0x16, 0x79, 0xc0, 0x4c, 0x92,\n\t\t0x10, 0xe9, 0x0b, 0xc5, 0x38, 0x4b, 0x9d, 0xe6, 0x5c, 0xb4, 0x96, 0x4f,\n\t\t0x32, 0x8a, 0x8a, 0xca, 0x6c, 0x83, 0x6f, 0x71, 0x99, 0xb1, 0x99, 0x78,\n\t\t0xd4, 0xc3, 0x89, 0x1e, 0x7c, 0x17, 0xbe, 0x12, 0xe4, 0xac, 0xe8, 0x75,\n\t\t0xff, 0xde, 0x3e, 0x75, 0x74, 0xf9, 0x53, 0xd0, 0x96, 0x42, 0xd0, 0x9f,\n\t\t0xfe, 0xd7, 0x9c, 0x18, 0xd8, 0xef, 0x69, 0x84, 0x28, 0x06, 0x55, 0x6a,\n\t\t0xdc, 0x81, 0x82, 0xf4, 0x36, 0xe3, 0x10, 0x4a, 0xa2, 0x1c, 0x35, 0x87,\n\t\t0x84, 0x08, 0x68, 0xdb, 0x05, 0x2f, 0x04, 0x07, 0xb7, 0x05, 0x54, 0x2f,\n\t\t0x91, 0xdf, 0x13, 0xef, 0x97, 0xe4, 0xc0, 0x6c, 0x89, 0xdb, 0xf0, 0x63,\n\t\t0x25, 0xab, 0x40, 0x6f, 0xe1, 0x40, 0x08, 0x50, 0x28, 0x46, 0xda, 0x3c,\n\t\t0x7d, 0xea, 0x1c, 0xc1, 0x7e, 0x09, 0xd2, 0xc0, 0x40, 0x96, 0xef, 0x3b,\n\t\t0xde, 0x93, 0x96, 0x9a, 0xda, 0xf3, 0xcf, 0x48, 0x7f, 0xf1, 0x01, 0x5d,\n\t\t0xca, 0x95, 0x02, 0x12, 0xef, 0x68, 0x92, 0xab, 0x34, 0xa2, 0x65, 0x4a,\n\t\t0x90, 0xdb, 0xf3, 0x17, 0x9a, 0x9a, 0xa2, 0x0a, 0x6f, 0x94, 0xbf, 0xcd,\n\t\t0x70, 0x6b, 0x55, 0xf9, 0xfc, 0xdb, 0xd5, 0x2f, 0x7f, 0x13, 0x11, 0x85,\n\t\t0x95, 0x42, 0x5a, 0x8f, 0x4e, 0xfd, 0xe9, 0xc0, 0xa0, 0x4a, 0x97, 0xf9,\n\t\t0xa6, 0x8a, 0x23, 0x67, 0x4f, 0xb3, 0xf3, 0xb3, 0x7a, 0x43, 0x0a, 0x29,\n\t\t0x07, 0x03, 0xd4, 0x58, 0xf8, 0x51, 0xdf, 0x53, 0xbb, 0x5e, 0xc7, 0x7d,\n\t\t0x62, 0x9b, 0xaa, 0x40, 0xd3, 0x82, 0x3b, 0x8f, 0x09, 0x70, 0x4e, 0x03,\n\t\t0x48, 0x97, 0xe7, 0x63, 0xcd, 0x60, 0x6e, 0x11, 0x12, 0x36, 0x94, 0x82,\n\t\t0x00, 0x89, 0x9e, 0xb2, 0xf2, 0x98, 0x42, 0xd0, 0x20, 0xf7, 0xc0, 0xcb,\n\t\t0xfc, 0x8a, 0x9c, 0x1b, 0x10, 0xfa, 0x5f, 0x26, 0x15, 0x5f, 0x0f, 0x62,\n\t\t0x52, 0x15, 0x6e, 0x9d, 0xe8, 0x02, 0x7e, 0x60, 0xb5, 0xa5, 0xcd, 0x1d,\n\t\t0xbe, 0x62, 0xe0, 0x46, 0xd5, 0xd2, 0xe0, 0x02, 0xe1, 0x07, 0xf8, 0xff,\n\t\t0xe1, 0x29, 0x93, 0xc2, 0x8b, 0x47, 0x78, 0x1e, 0xcd, 0x55, 0x91, 0xc2,\n\t\t0xf5, 0xb4, 0xf6, 0x47, 0x52, 0x1f, 0x9e, 0x21, 0xa1, 0xe6, 0x38, 0x45,\n\t\t0x7f, 0xa0, 0x7c, 0x40, 0x95, 0x3d, 0x40, 0x15, 0x75, 0xbb, 0xde, 0x9a,\n\t\t0x02, 0x28, 0x48, 0x0d, 0xdc, 0x46, 0xd6, 0xe3, 0xef, 0x7e, 0xf8, 0x81,\n\t\t0x21, 0x5e, 0xa1, 0xa6, 0x57, 0x58, 0x03, 0x62, 0x2e, 0x2c, 0x9b, 0x3d,\n\t\t0x7c, 0x25, 0xd8, 0xbe, 0x08, 0x7a, 0x46, 0xa4, 0xb9, 0x46, 0xa0, 0x10,\n\t\t0xf0, 0x55, 0x67, 0x33, 0x3d, 0x8a, 0x67, 0x68, 0xba, 0x23, 0xe1, 0xa7,\n\t\t0xb1, 0x84, 0xe2, 0x7f, 0xc9, 0xf9, 0xb4, 0x11, 0x9c, 0xd5, 0x3c, 0xf3,\n\t\t0x9d, 0x33, 0x73, 0x6b, 0x17, 0xb9, 0xd2, 0x5a, 0x30, 0x96, 0x0f, 0x2c,\n\t\t0x26, 0x4e, 0x4a, 0x2d, 0x99, 0x11, 0x16, 0xe0, 0x44, 0xe4, 0x27, 0x5c,\n\t\t0x67, 0x0f, 0x1d, 0x14, 0xe3, 0x40, 0x12, 0x55, 0x1a, 0x94, 0xec, 0x82,\n\t\t0xfd, 0xbb, 0xc2, 0x83, 0xf7, 0x56, 0xe8, 0x3f, 0x76, 0x34, 0xe9, 0x0a,\n\t\t0x78, 0x30, 0x7c, 0x5e, 0x46, 0x38, 0x62, 0xe0, 0xc9, 0xe1, 0x82, 0x9e,\n\t\t0x7b, 0xb1, 0xec, 0x96, 0x03, 0x94, 0xa1, 0xf8, 0xdd, 0x5f, 0xa2, 0x6c,\n\t\t0x5f, 0x3b, 0xe6, 0x3c, 0x79, 0xd3, 0x0c, 0x0f, 0x8f, 0x5a, 0xed, 0x2d,\n\t\t0x8d, 0xa7, 0xc2, 0x94, 0x32, 0x4d, 0x8c, 0x11, 0x46, 0x05, 0xba, 0x8a,\n\t\t0x5a, 0xaa, 0x0c, 0xdc, 0xfc, 0x68, 0x49, 0x07, 0x1d, 0x35, 0x31, 0xc4,\n\t\t0x47, 0xad, 0x4e, 0x1a, 0x2b, 0x45, 0x96, 0x41, 0x21, 0xa6, 0xf2, 0x13,\n\t\t0xb4, 0x45, 0xa5, 0x7a, 0x5d, 0x0a, 0xdb, 0xa9, 0x05, 0x60, 0x78, 0x82,\n\t\t0x25, 0x7c, 0xc4, 0xae, 0x75, 0x45, 0x17, 0xd2, 0xd7, 0x4e, 0x26, 0x77,\n\t\t0x5c, 0xb5, 0x8b, 0xa1, 0x8c, 0x0c, 0xad, 0xc2, 0xbb, 0x0a, 0x68, 0xab,\n\t\t0x14, 0x4e, 0xc0, 0x76, 0x3d, 0x4c, 0x58, 0x63, 0xbe, 0xd6, 0x0f, 0xdc,\n\t\t0x63, 0xcf, 0x11, 0x12, 0x74, 0xca, 0x50, 0x5e, 0xdb, 0x59, 0xba, 0x8a,\n\t\t0x51, 0xff, 0x60, 0x0a, 0x8f, 0x1b, 0x23, 0xba, 0x80, 0x30, 0xc8, 0xcf,\n\t\t0xef, 0xf3, 0xf6, 0x41, 0x36, 0xed, 0x21, 0x06, 0x18, 0xad, 0x1c, 0x55,\n\t\t0xd1, 0x2d, 0x10, 0xff, 0x43, 0x8b, 0xc4, 0x10, 0x3f, 0xe9, 0xe7, 0x89,\n\t\t0x43, 0x30, 0x9d, 0xb4, 0x9d, 0x81, 0x09, 0xba, 0xea, 0x45, 0x22, 0x43,\n\t\t0x1b, 0x72, 0x54, 0x16, 0x77, 0x0c, 0x22, 0x40, 0x31, 0x40, 0x04, 0x78,\n\t\t0x87, 0xd1, 0xdc, 0x9b, 0x3c, 0x38, 0xba, 0xfc, 0xf8, 0x82, 0x48, 0xe9,\n\t\t0x51, 0xf8, 0x51, 0x1c, 0x13, 0x97, 0xec, 0xc8, 0x85, 0x7c, 0x1f, 0x6f,\n\t\t0x1f, 0xcc, 0xd4, 0xcf, 0x04, 0x99, 0xa6, 0x68, 0x62, 0xa2, 0xea, 0x1d,\n\t\t0x1d, 0x8e, 0xf1, 0x3e, 0x8c, 0xd1, 0xc4, 0x9e, 0xff, 0x74, 0xda, 0x0c,\n\t\t0x16, 0x37, 0x64, 0x25, 0x08, 0x85, 0xf3, 0xdb, 0xc7, 0x9c, 0x07, 0x71,\n\t\t0xbe, 0x88, 0x8b, 0x83, 0x7f, 0x2d, 0xae, 0xdf, 0x04, 0xbd, 0xaa, 0x10,\n\t\t0xe7, 0xff, 0xf9, 0x13, 0x92, 0x5d, 0x37, 0x6c, 0x32, 0x29, 0xf7, 0x29,\n\t\t0x93, 0x49, 0x43, 0x42, 0x32, 0xb4, 0xd0, 0xf6, 0x09, 0xae, 0xb5, 0x8f,\n\t\t0x2a, 0x14, 0x23, 0x0b, 0x0a, 0x54, 0x6f, 0x5a, 0x49, 0xd1, 0x42, 0x3f,\n\t\t0x45, 0xeb, 0xf9, 0x3c, 0x51, 0x8c, 0x5a, 0x8e, 0x2e, 0xf2, 0xfd, 0x48,\n\t\t0xf4, 0x0b, 0x78, 0x94, 0x6d, 0xdc, 0x4f, 0x58, 0x82, 0x68, 0x89, 0x01,\n\t\t0x5d, 0x4f, 0xe6, 0x28, 0xa3, 0x31, 0xb4, 0xad, 0x5f, 0xa0, 0xcd, 0xff,\n\t\t0x02, 0x14, 0x52, 0x9f, 0xe0, 0xc4, 0x08, 0xf6, 0x7a, 0x94, 0x9f, 0x11,\n\t\t0x20, 0x0b, 0x37, 0x6a, 0x25, 0xe8, 0x60, 0xc4, 0xb8, 0xe5, 0x0f, 0x18,\n\t\t0x1e, 0x61, 0xe9, 0xbd, 0x6c, 0x14, 0xd8, 0x85, 0xce, 0xc9, 0xae, 0xa2,\n\t\t0x02, 0x4f, 0x73, 0x92, 0x75, 0xdd, 0xf4, 0xfb, 0x3d, 0x26, 0xc4, 0x07,\n\t\t0xb4, 0x8c, 0x8c, 0xce, 0xce, 0x60, 0x52, 0x61, 0x00, 0x3f, 0x5f, 0xda,\n\t\t0x70, 0x11, 0x8a, 0xb4, 0xc1, 0xff, 0x81, 0x0c, 0xf5, 0x08, 0xc1, 0x67,\n\t\t0xcf, 0x0f, 0x5d, 0x11, 0x10, 0xbb, 0x68, 0x68, 0x34, 0x09, 0xa5, 0xd5,\n\t\t0xfd, 0xad, 0x01, 0xe4, 0x97, 0x49, 0xc4, 0x37, 0xea, 0xde, 0x8d, 0x41,\n\t\t0xc9, 0x18, 0x00, 0x60, 0x52, 0xe4, 0x98, 0x52, 0x5f, 0xf2, 0x75, 0x10,\n\t\t0x04, 0xf4, 0x66, 0x24, 0x10, 0x11, 0x43, 0xea, 0xfc, 0x6e, 0xca, 0x78,\n\t\t0x69, 0x2a, 0x9a, 0x00, 0xd8, 0x1a, 0x6a, 0x04, 0x1a, 0xd7, 0x69, 0xfd,\n\t\t0x37, 0x56, 0x3e, 0x2a, 0xb2, 0x13, 0x91, 0x2d, 0xb0, 0xe9, 0xd4, 0xb0,\n\t\t0x86, 0x1a, 0x66, 0x5a, 0x95, 0x41, 0x9d, 0xa7, 0x28, 0x74, 0xe3, 0xaf,\n\t\t0x8c, 0x8a, 0x0e, 0x72, 0x7e, 0x0b, 0x00, 0xa0, 0xc9, 0xee, 0x52, 0xe7,\n\t\t0x76, 0xc3, 0xfd, 0xdf, 0x6f, 0x97, 0x08, 0xb5, 0xce, 0x89, 0x1a, 0x83,\n\t\t0xe4, 0x69, 0xa0, 0xed, 0xa4, 0x77, 0x57, 0xa9, 0xe9, 0xa5, 0x7b, 0xca,\n\t\t0xb4, 0x3f, 0x24, 0x3d, 0xaf, 0xea, 0xd4, 0x30, 0xe9, 0x77, 0xe2, 0x0e,\n\t\t0xf0, 0x77, 0x66, 0x6f, 0x63, 0x88, 0x23, 0x06, 0x87, 0xbc, 0xc3, 0xc4,\n\t\t0xb6, 0xde, 0x7c, 0x15, 0x64, 0x60, 0x18, 0xbb, 0xcd, 0x64, 0xdb, 0x58,\n\t\t0x9a, 0x63, 0x7b, 0xe0, 0x97, 0x3d, 0x10, 0x0e, 0x72, 0x5d, 0x00, 0x45,\n\t\t0x2d, 0x0d, 0xf0, 0x0b, 0x05, 0xe8, 0x49, 0x73, 0x6c, 0x20, 0x51, 0x5e,\n\t\t0x62, 0xc1, 0x85, 0x37, 0x21, 0x5d, 0xa8, 0x83, 0xf7, 0xd7, 0x96, 0x67,\n\t\t0x42, 0xb6, 0xef, 0xe1, 0x21, 0x6d, 0x44, 0x0b, 0x22, 0xee, 0x93, 0xeb,\n\t\t0x82, 0x66, 0xa3, 0x4e, 0xcf, 0x34, 0x1d, 0xbf, 0x18, 0x18, 0x47, 0x66,\n\t\t0x43, 0x58, 0x2c, 0xe2, 0x6a, 0xc3, 0x6f, 0xfe, 0x02, 0xd8, 0x77, 0xfa,\n\t\t0x05, 0xed, 0x84, 0x34, 0x6e, 0xe4, 0x46, 0x8d, 0xb9, 0x8d, 0xc8, 0xe2,\n\t\t0xd3, 0x97, 0x51, 0xf6, 0x9d, 0x3d, 0x11, 0xea, 0x59, 0x65, 0x86, 0xfc,\n\t\t0x94, 0xea, 0x75, 0x5a, 0x55, 0x74, 0x1c, 0x04, 0xc6, 0x75, 0x51, 0x00,\n\t\t0x40, 0xc8, 0x4c, 0x0c, 0x7b, 0x48, 0xe2, 0xcf, 0x80, 0xb6, 0x0c, 0x65,\n\t\t0xc9, 0x90, 0x9f, 0x2e, 0x1a, 0xfb, 0xda, 0xae, 0xc5, 0x8a, 0x0e, 0xd7,\n\t\t0xcd, 0x0a, 0x44, 0x09, 0x7f, 0xff, 0xe6, 0xd6, 0x21, 0xf4, 0x95, 0xcb,\n\t\t0x05, 0xd1, 0x20, 0x02, 0xde, 0xc1, 0xce, 0xdf, 0x07, 0xbc, 0x8e, 0x59,\n\t\t0xad, 0x53, 0x29, 0x82, 0xa7, 0x11, 0x2f, 0x5a, 0x5c, 0xf1, 0x6b, 0x40,\n\t\t0x4f, 0x5c, 0x10, 0xab, 0xfc, 0xac, 0x79, 0x1c, 0x66, 0xa0, 0x13, 0x93,\n\t\t0x52, 0x14, 0xce, 0xe4, 0x8a, 0x14, 0x0b, 0x92, 0x8a, 0x2d, 0x2a, 0x65,\n\t\t0x16, 0x75, 0x64, 0xa5, 0xa2, 0x53, 0x86, 0x8d, 0xd5, 0x09, 0x83, 0x64,\n\t\t0xce, 0x88, 0x42, 0xb8, 0x30, 0x71, 0xd1, 0x74, 0x6e, 0x02, 0x7b, 0x6c,\n\t\t0xd0, 0x4c, 0x97, 0x3b, 0x47, 0xe8, 0x0f, 0x1b, 0x36, 0x8b, 0xaf, 0x8e,\n\t\t0x9c, 0xd6, 0x12, 0x63, 0xbf, 0x6c, 0x4d, 0xa7, 0xb6, 0xe7, 0xd2, 0x39,\n\t\t0xee, 0x92, 0xe9, 0x6f, 0x91, 0xf5, 0x8a, 0x0e, 0x71, 0x6d, 0xd9, 0x49,\n\t\t0x27, 0x6f, 0xac, 0x94, 0x85, 0x63, 0xb0, 0xda, 0xd0, 0x8d, 0x19, 0xfd,\n\t\t0x84, 0xf7, 0x25, 0xa7, 0x34, 0xec, 0xee, 0x4e, 0xd6, 0xf0, 0xa2, 0x37,\n\t\t0x9f, 0x44, 0x10, 0xdf, 0xad, 0x47, 0x50, 0xbe, 0x16, 0xd5, 0xb6, 0xe0,\n\t\t0x24, 0xe7, 0x7a, 0xc1, 0x42, 0xf4, 0x0e, 0x8f, 0x48, 0x0b, 0xd1, 0xfc,\n\t\t0xff, 0x8b, 0x34, 0xe7, 0xbe, 0xc7, 0x42, 0xc7, 0x66, 0x0f, 0x65, 0xfa,\n\t\t0x32, 0x78, 0x29, 0xf7, 0xc3, 0xb1, 0x18, 0x02, 0x8f, 0x4d, 0x14, 0x56,\n\t\t0xcd, 0xba, 0x6c, 0x8d, 0x02, 0xab, 0x45, 0x43, 0x9c, 0x1a, 0x32, 0xb7,\n\t\t0xd6, 0xe4, 0x79, 0x82, 0x17, 0xb3, 0x47, 0x8c, 0xd4, 0x8a, 0x15, 0x78,\n\t\t0x19, 0xfa, 0x5c, 0x78, 0x27, 0x78, 0x80, 0xd9, 0x1e, 0x4e, 0xbe, 0xbd,\n\t\t0xb8, 0x6a, 0x83, 0xcd, 0x86, 0x04, 0x74, 0x4a, 0xe9, 0xa8, 0x40, 0x74,\n\t\t0xa3, 0xb1, 0xdc, 0x22, 0x87, 0x27, 0xc1, 0x6f, 0x49, 0xd0, 0xc3, 0xbc,\n\t\t0xee, 0x53, 0xde, 0x08, 0x08, 0x37, 0x97, 0x06, 0x65, 0xe0, 0x84, 0xfe,\n\t\t0x08, 0xcf, 0xd7, 0x4e, 0xae, 0xf0, 0x0d, 0x48, 0x76, 0xb1, 0x49, 0xc5,\n\t\t0xf2, 0x45, 0xcb, 0x13, 0xf7, 0x30, 0x48, 0x1c, 0x7b, 0x41, 0x96, 0xdc,\n\t\t0x89, 0xa7, 0xfe, 0x2c, 0x32, 0xd5, 0x67, 0xfc, 0xc0, 0x08, 0x59, 0x0d,\n\t\t0x89, 0x24, 0x64, 0x64, 0x42, 0x94, 0x43, 0xb8, 0x74, 0x7e, 0xcd, 0x98,\n\t\t0x12, 0x83, 0x89, 0xde, 0xf5, 0xa2, 0xf7, 0xe2, 0x05, 0xf9, 0x95, 0x6e,\n\t\t0x20, 0x72, 0x45, 0x5a, 0x43, 0xe8, 0xa9, 0x76, 0xf6, 0xe0, 0x82, 0x0d,\n\t\t0xd7, 0xbc, 0x0d, 0x57, 0x26, 0x8f, 0x63, 0x1c, 0xad, 0x42, 0x26, 0x05,\n\t\t0x84, 0x43, 0x43, 0x75, 0xc5, 0x54, 0xae, 0x10, 0x26, 0x01, 0x01, 0x62,\n\t\t0xd1, 0x0c, 0x62, 0xf2, 0xe1, 0xa0, 0x42, 0xdc, 0x6f, 0x0d, 0x4c, 0x4d,\n\t\t0x0e, 0x97, 0x3a, 0xe7, 0x7d, 0xb1, 0x13, 0x61, 0x2f, 0x64, 0x05, 0x22,\n\t\t0xc9, 0x42, 0xed, 0x64, 0xa9, 0xfc, 0x0e, 0x03, 0xae, 0x6f, 0xa0, 0xfb,\n\t\t0x9d, 0xe9, 0xcf, 0x69, 0x4f, 0xef, 0xde, 0xe9, 0x04, 0x3a, 0xd6, 0xe9,\n\t\t0xb5, 0xef, 0x6d, 0x27, 0xf8, 0xe1, 0xbd, 0x10, 0x3c, 0xa6, 0x27, 0x24,\n\t\t0x6c, 0xe8, 0xbb, 0xb5, 0x61, 0x4b, 0x03, 0xa2, 0xdb, 0x4c, 0x4e, 0x22,\n\t\t0xdf, 0x83, 0xff, 0x62, 0xa3, 0xaf, 0x51, 0x5a, 0x6a, 0x85, 0x7a, 0x8d,\n\t\t0xd7, 0xcd, 0xe1, 0x9f, 0x0f, 0x8b, 0x08, 0xbf, 0x03, 0x08, 0x5e, 0x4f,\n\t\t0x7f, 0x49, 0x17, 0xf6, 0xe7, 0x87, 0xa8, 0xe9, 0x99, 0x12, 0x39, 0x7c,\n\t\t0x38, 0x38, 0x35, 0x21, 0xf4, 0x31, 0x13, 0x48, 0x46, 0xcd, 0xff, 0xdb,\n\t\t0x94, 0x03, 0x49, 0x4f, 0x45, 0xd2, 0xf1, 0x26, 0x77, 0xe0, 0x75, 0x5e,\n\t\t0x67, 0x10, 0x5c, 0x52, 0x52, 0xd2, 0x5f, 0xbe, 0x66, 0x5f, 0x74, 0xd3,\n\t\t0x0f, 0x42, 0xfc, 0x8d, 0x3d, 0x27, 0x84, 0xd8, 0xd3, 0xf5, 0xae, 0xba,\n\t\t0x43, 0xf1, 0xd4, 0x00, 0x37, 0x1f, 0x58, 0xa9, 0xb5, 0xb7, 0xc2, 0x31,\n\t\t0x20, 0x38, 0x26, 0x4c, 0x68, 0xca, 0xfb, 0x22, 0xd0, 0x1c, 0x71, 0xec,\n\t\t0xd3, 0x8c, 0x79, 0x56, 0xfc, 0xcc, 0x61, 0x5c, 0x36, 0x56, 0x68, 0xbe,\n\t\t0x23, 0x7d, 0x3c, 0xd3, 0x83, 0x37, 0x07, 0xbb, 0x4b, 0x19, 0x1d, 0xf6,\n\t\t0x05, 0x7a, 0x92, 0x9b, 0xd0, 0x61, 0x1c, 0x11, 0x17, 0xf2, 0x47, 0xa9,\n\t\t0x18, 0xd1, 0x3c, 0x61, 0x7f, 0x87, 0xf4, 0x71, 0x18, 0xd1, 0x12, 0x15,\n\t\t0x4a, 0x6e, 0xee, 0xc5, 0x5b, 0xc3, 0x1a, 0x83, 0xce, 0xf3, 0x65, 0xd3,\n\t\t0xf8, 0xed, 0x1f, 0xe4, 0x01, 0x7f, 0x0f, 0xe7, 0x4a, 0x29, 0x65, 0xb0,\n\t\t0xb0, 0xb0, 0xb1, 0xd9, 0xbc, 0x2f, 0xcd, 0x80, 0xbe, 0xbc, 0xfb, 0xbc,\n\t\t0x1e, 0x8f, 0xef, 0xa0, 0xbb, 0xb7, 0x7e, 0xcd, 0x36, 0x95, 0xaa, 0xbd,\n\t\t0x9f, 0x44, 0xbf, 0x3a, 0x51, 0x10, 0x0d, 0xb5, 0xe4, 0xaa, 0x0d, 0xb7,\n\t\t0x7e, 0x6d, 0xac, 0x58, 0x87, 0xf0, 0x25, 0x74, 0x95, 0x72, 0xd0, 0xa6,\n\t\t0x25, 0xe3, 0x5f, 0x0d, 0xe6, 0x49, 0xb3, 0xa6, 0xad, 0x10, 0x16, 0x8d,\n\t\t0x59, 0x16, 0x62, 0x10, 0xbe, 0x0a, 0xb3, 0x61, 0x77, 0x48, 0x56, 0x42,\n\t\t0xc2, 0xd6, 0xe2, 0x14, 0x18, 0x42, 0x94, 0xa1, 0x97, 0x08, 0xfb, 0x7e,\n\t\t0xa0, 0x9b, 0x82, 0xfa, 0x23, 0x95, 0xcb, 0xd5, 0x00, 0x80, 0x4a, 0x3a,\n\t\t0x93, 0xd7, 0xa5, 0xca, 0xf3, 0x9b, 0xd1, 0x09, 0x07, 0xa1, 0xbc, 0x1a,\n\t\t0x65, 0xfa, 0x4a, 0x9f, 0xb6, 0x31, 0x57, 0x41, 0xa2, 0x88, 0xf8, 0xa2,\n\t\t0x50, 0x70, 0x88, 0xfc, 0xaf, 0xe2, 0x86, 0xfc, 0x7c, 0x34, 0x55, 0x98,\n\t\t0x9e, 0x5b, 0x51, 0xa7, 0xbb, 0xbc, 0x4f, 0x4e, 0xff, 0xfe, 0x79, 0xf3,\n\t\t0xf5, 0x51, 0x15, 0x6f, 0x38, 0x4f, 0x42, 0xbc, 0xb6, 0xb0, 0xa8, 0x68,\n\t\t0xa6, 0x54, 0x89, 0xbc, 0x39, 0x2f, 0x84, 0x2d, 0x7c, 0xa3, 0xd3, 0xd7,\n\t\t0xf4, 0xe6, 0x68, 0x01, 0x5a, 0x6a, 0xe9, 0x97, 0x7c, 0x86, 0x09, 0xf0,\n\t\t0x6e, 0xe5, 0xee, 0xd8, 0x89, 0x26, 0xc4, 0x25, 0xa5, 0x48, 0x17, 0x2b,\n\t\t0xb3, 0x8d, 0xc4, 0x52, 0xde, 0xbb, 0x68, 0x94, 0xa3, 0x38, 0x9c, 0xae,\n\t\t0xe0, 0x89, 0xae, 0x53, 0xd8, 0xb9, 0x48, 0x1c, 0xd3, 0xdc, 0x97, 0x7b,\n\t\t0x00, 0xc6, 0xef, 0x79, 0x5d, 0xe7, 0x6b, 0x12, 0xb5, 0xa9, 0x5a, 0xe8,\n\t\t0x7c, 0x77, 0xf2, 0x48, 0x39, 0x20, 0x48, 0xd8, 0xff, 0x71, 0xb9, 0x3a,\n\t\t0xff, 0x58, 0x6e, 0xec, 0x27, 0x13, 0x54, 0x5a, 0x74, 0xdc, 0xae, 0xda,\n\t\t0x02, 0x00, 0xdf, 0x52, 0xce, 0x57, 0xa5, 0x37, 0x7b, 0x1f, 0x35, 0x7b,\n\t\t0x88, 0x54, 0xaa, 0xb5, 0x93, 0xd3, 0xe9, 0x6f, 0xbf, 0x8a, 0x91, 0xa1,\n\t\t0xf6, 0x0f, 0x41, 0xe4, 0x8a, 0x71, 0x21, 0x81, 0x20, 0x3e, 0x62, 0x2d,\n\t\t0xae, 0x3d, 0x6f, 0x86, 0x1f, 0x12, 0xf0, 0x96, 0x66, 0x94, 0x10, 0x8b,\n\t\t0xf2, 0x86, 0xfe, 0x01, 0xa4, 0xae, 0x9d, 0x74, 0x98, 0xe5, 0xd8, 0x15,\n\t\t0x99, 0x66, 0x18, 0x40, 0x08, 0x95, 0x5b, 0x34, 0x8c, 0x2f, 0xa9, 0x6d,\n\t\t0x64, 0x1a, 0x8b, 0xbf, 0x4a, 0x8e, 0xdf, 0x69, 0x66, 0x67, 0x65, 0x79,\n\t\t0xf3, 0xe2, 0xe4, 0x41, 0xf2, 0x73, 0x69, 0x89, 0x76, 0xca, 0x68, 0xd9,\n\t\t0x14, 0x7d, 0xfc, 0xb3, 0xe7, 0x05, 0xcb, 0x7c, 0x6c, 0xec, 0x3d, 0x63,\n\t\t0xaa, 0xac, 0xb5, 0x6f, 0x4e, 0x62, 0xe2, 0x76, 0xdd, 0x15, 0xfb, 0xe0,\n\t\t0xf9, 0x20, 0xb1, 0xe3, 0x72, 0xee, 0x4a, 0xe0, 0xdd, 0x18, 0x1e, 0x0e,\n\t\t0xce, 0xa1, 0xc3, 0x25, 0xf3, 0x1b, 0x66, 0xfe, 0x37, 0xcd, 0x3a, 0x69,\n\t\t0x5c, 0xf0, 0x8c, 0xa8, 0x1f, 0x09, 0x04, 0x42, 0x96, 0xda, 0x6e, 0x6c,\n\t\t0x1d, 0x19, 0x70, 0x14, 0xba, 0xca, 0x96, 0x27, 0x47, 0x99, 0xfa, 0x3f,\n\t\t0xc9, 0x2d, 0x8d, 0x40, 0xc7, 0xa7, 0xe5, 0x79, 0xf3, 0x81, 0x49, 0x4e,\n\t\t0x4f, 0xaf, 0x70, 0xb8, 0x5a, 0x44, 0x8f, 0x95, 0x0a, 0x59, 0xa9, 0xb7,\n\t\t0x84, 0xa5, 0x3b, 0xf3, 0xe1, 0x75, 0x9c, 0xb9, 0xe3, 0xc4, 0xbc, 0x61,\n\t\t0xb1, 0xaf, 0xa0, 0x13, 0x9b, 0x48, 0xbf, 0x99, 0x4c, 0x4f, 0x3f, 0x54,\n\t\t0x9b, 0x5b, 0x57, 0x80, 0x98, 0xa4, 0xc5, 0x75, 0x3f, 0xb7, 0x56, 0x42,\n\t\t0x6a, 0x32, 0x40, 0x1c, 0xc3, 0xc4, 0x43, 0x3d, 0xa6, 0x0a, 0xd8, 0x46,\n\t\t0xfe, 0x00, 0xfd, 0x35, 0xf9, 0xbf, 0xd7, 0xc4, 0x81, 0xb6, 0xdf, 0x70,\n\t\t0x28, 0xa3, 0x72, 0x3b, 0x5f, 0x84, 0x5d, 0xfe, 0x7d, 0x05, 0x1e, 0xeb,\n\t\t0xbf, 0x57, 0xdc, 0xda, 0xba, 0x30, 0x8b, 0xcf, 0xdd, 0xd4, 0x1d, 0x18,\n\t\t0x90, 0x2a, 0xf8, 0x96, 0x72, 0x35, 0xc0, 0xbb, 0x3f, 0x18, 0xb4, 0xb6,\n\t\t0x26, 0x14, 0x6b, 0x86, 0x38, 0xf2, 0x09, 0x62, 0x12, 0xd8, 0xd6, 0xd6,\n\t\t0xb7, 0x60, 0x8a, 0x06, 0x1f, 0xb8, 0xe9, 0x83, 0xa0, 0x4b, 0x73, 0x3b,\n\t\t0x94, 0x9f, 0xcf, 0xb2, 0x9a, 0xe8, 0xfd, 0xfb, 0xd9, 0xf2, 0x5d, 0x66,\n\t\t0xbe, 0x9d, 0xae, 0xfb, 0x8a, 0xbf, 0x0d, 0xbb, 0x37, 0x8a, 0xf6, 0xcf,\n\t\t0xd6, 0x5a, 0x39, 0x56, 0x9b, 0x1d, 0x1d, 0x81, 0x06, 0xf5, 0xe6, 0xdd,\n\t\t0xd2, 0x53, 0x67, 0x55, 0x04, 0xa6, 0x88, 0xe8, 0x0b, 0xa3, 0xa4, 0xe1,\n\t\t0x53, 0x90, 0x75, 0xff, 0xf4, 0x7b, 0x31, 0xa4, 0x3c, 0x26, 0x4c, 0x10,\n\t\t0x8d, 0x15, 0x0d, 0x70, 0xdc, 0xfc, 0x12, 0x39, 0x11, 0x48, 0x92, 0x28,\n\t\t0xc0, 0x28, 0xbe, 0x56, 0x71, 0x89, 0xeb, 0x6c, 0x67, 0xc7, 0x28, 0x15,\n\t\t0x4b, 0xb4, 0x3b, 0x73, 0x85, 0x12, 0x0c, 0xad, 0x73, 0xb6, 0xdc, 0xe4,\n\t\t0x49, 0x2e, 0x08, 0x53, 0x34, 0x02, 0x9a, 0x21, 0xe8, 0x48, 0x95, 0xd2,\n\t\t0xef, 0x66, 0x40, 0x43, 0xa4, 0x71, 0xeb, 0xee, 0xf5, 0xde, 0x70, 0x09,\n\t\t0xa3, 0xf2, 0x51, 0x18, 0xb8, 0x7d, 0xae, 0xd1, 0x2c, 0x1a, 0xf7, 0xda,\n\t\t0x59, 0x5d, 0x08, 0xe5, 0xa4, 0xc6, 0x3d, 0x55, 0x81, 0xd9, 0xda, 0xf0,\n\t\t0x3d, 0x93, 0x74, 0x72, 0x72, 0xea, 0xcc, 0xb1, 0x5d, 0xa8, 0x50, 0x87,\n\t\t0x1e, 0x3d, 0xd7, 0x7a, 0x9e, 0x19, 0xb4, 0x5f, 0x20, 0x61, 0xd3, 0x2e,\n\t\t0x1b, 0x10, 0xc7, 0x58, 0x90, 0xf0, 0x8b, 0x35, 0xaf, 0xc3, 0x50, 0xf0,\n\t\t0xb3, 0xcf, 0xef, 0xb6, 0x88, 0x17, 0x94, 0xe8, 0x82, 0x1d, 0xc4, 0x91,\n\t\t0xd6, 0xa7, 0xca, 0x16, 0x72, 0xc8, 0xde, 0xbf, 0xab, 0x81, 0x11, 0xf5,\n\t\t0x30, 0xa0, 0x7c, 0x6d, 0xf7, 0x4a, 0x5d, 0xa3, 0xc4, 0x54, 0x61, 0x21,\n\t\t0xf3, 0x3b, 0xef, 0xf1, 0x79, 0x79, 0x4e, 0x48, 0xc0, 0xf0, 0x7b, 0x7b,\n\t\t0xb9, 0x23, 0xe0, 0xb6, 0x83, 0xfc, 0x2d, 0x1b, 0x11, 0x3b, 0x6e, 0x76,\n\t\t0x09, 0xf5, 0xf6, 0xf6, 0xda, 0x01, 0xd5, 0xb9, 0x68, 0x2f, 0x78, 0x62,\n\t\t0x0b, 0xa9, 0x2a, 0x96, 0x93, 0x85, 0x5b, 0xa3, 0x48, 0xff, 0x73, 0x3e,\n\t\t0xc2, 0x10, 0x63, 0xcd, 0x6a, 0x71, 0x4c, 0xb6, 0x76, 0xd0, 0xe2, 0x13,\n\t\t0x0b, 0xf1, 0xdb, 0xdf, 0x78, 0x5b, 0xcf, 0xd9, 0x2b, 0xb7, 0xd9, 0x2d,\n\t\t0xe7, 0xc9, 0x9e, 0xb7, 0x8a, 0x1d, 0x61, 0xb3, 0x61, 0x8c, 0xeb, 0xa3,\n\t\t0x85, 0x4a, 0x83, 0x29, 0x1e, 0x9f, 0x6b, 0x2b, 0xbf, 0x87, 0xdd, 0xb4,\n\t\t0x5a, 0x9d, 0x2a, 0xa8, 0xcc, 0x4d, 0xcc, 0xd6, 0x0b, 0xa0, 0xa9, 0x56,\n\t\t0xa6, 0x63, 0xb5, 0x9e, 0xa5, 0x06, 0x3a, 0xe3, 0xab, 0xcc, 0x1d, 0x73,\n\t\t0xc5, 0x85, 0x8b, 0x13, 0x93, 0x1c, 0xb8, 0xe8, 0x25, 0xc9, 0xc3, 0x0a,\n\t\t0x92, 0x44, 0x4d, 0x41, 0xa4, 0xd4, 0x0f, 0x09, 0x36, 0xd3, 0x58, 0x0a,\n\t\t0x3d, 0xc3, 0xbc, 0xd7, 0xed, 0x34, 0x86, 0xf2, 0xad, 0x0f, 0xd6, 0xe7,\n\t\t0x2e, 0x28, 0x51, 0x89, 0x86, 0x6a, 0x5d, 0x3e, 0x3b, 0xe5, 0xa5, 0xb9,\n\t\t0x97, 0x5f, 0x6b, 0x2e, 0xcb, 0x55, 0x4b, 0x0b, 0xa5, 0xe3, 0xc9, 0xa6,\n\t\t0x0f, 0xdd, 0xbc, 0x6e, 0x57, 0x2c, 0xed, 0x0d, 0x63, 0x18, 0x44, 0xda,\n\t\t0x95, 0x5a, 0xb3, 0xc5, 0x52, 0x77, 0x00, 0x0d, 0xb6, 0xbb, 0x6d, 0xcf,\n\t\t0x0c, 0xfb, 0x85, 0x83, 0x7d, 0x05, 0xf7, 0x10, 0xcc, 0x0c, 0xa0, 0xe7,\n\t\t0x7f, 0x1c, 0xb0, 0x5c, 0x38, 0xfa, 0xa5, 0xfb, 0xfd, 0x92, 0x21, 0xab,\n\t\t0x59, 0xf8, 0x75, 0xc3, 0x61, 0x04, 0x9d, 0x12, 0x75, 0xe2, 0x8f, 0x61,\n\t\t0xf3, 0x77, 0x57, 0x0a, 0x41, 0x41, 0x92, 0x9d, 0xa1, 0xf8, 0xbb, 0x61,\n\t\t0x3e, 0x42, 0x53, 0x02, 0x7e, 0x37, 0x3a, 0x00, 0xf4, 0x3b, 0x2a, 0xd0,\n\t\t0x8f, 0x51, 0x00, 0x96, 0xdd, 0x3d, 0xe6, 0xd2, 0x08, 0x13, 0x33, 0x74,\n\t\t0xb7, 0x8e, 0x4e, 0x03, 0x4a, 0x8e, 0x40, 0xec, 0x07, 0x24, 0x04, 0xbc,\n\t\t0x41, 0x16, 0xe3, 0xad, 0x30, 0x34, 0x6e, 0x22, 0xa9, 0xc9, 0x57, 0x49,\n\t\t0x03, 0x36, 0xa8, 0x2d, 0x28, 0xd3, 0xd9, 0xef, 0x83, 0xb0, 0xf4, 0x09,\n\t\t0xf1, 0xfc, 0xea, 0x75, 0xc0, 0xb5, 0x88, 0xe5, 0xa9, 0x72, 0x9a, 0xf5,\n\t\t0xb5, 0x26, 0xeb, 0x8a, 0x00, 0xd1, 0xee, 0x80, 0x97, 0x23, 0x77, 0xf6,\n\t\t0xec, 0x22, 0xeb, 0xb9, 0x5f, 0x2b, 0x06, 0x53, 0x79, 0x22, 0xe4, 0x10,\n\t\t0x85, 0x73, 0x78, 0x53, 0x39, 0x93, 0x3e, 0xcc, 0xca, 0x69, 0xfd, 0xaf,\n\t\t0xcd, 0xbf, 0x4c, 0xc4, 0x7a, 0xa1, 0x43, 0x06, 0xd7, 0xf7, 0xb7, 0x18,\n\t\t0x42, 0x9f, 0xfa, 0x12, 0xc7, 0xde, 0xd7, 0x58, 0x65, 0xf1, 0x3b, 0xd3,\n\t\t0xa4, 0x14, 0x93, 0x69, 0xab, 0xcc, 0x0e, 0xe4, 0x94, 0xcd, 0xcc, 0xb5,\n\t\t0xb6, 0x3b, 0x3a, 0xe6, 0x62, 0x83, 0xf6, 0x91, 0x76, 0xc4, 0x0b, 0xe6,\n\t\t0x47, 0xf6, 0x8f, 0x06, 0x01, 0x8e, 0x6c, 0x8c, 0x81, 0xeb, 0x8b, 0x0e,\n\t\t0xc0, 0xa6, 0x2a, 0xe9, 0xa9, 0xcd, 0x1a, 0x43, 0x91, 0x35, 0x0f, 0xa0,\n\t\t0x3d, 0x20, 0x48, 0x21, 0x8b, 0x7b, 0x3b, 0x59, 0x49, 0x18, 0x5a, 0x6b,\n\t\t0xc6, 0xfe, 0xc9, 0xd7, 0xb3, 0x13, 0x5e, 0x56, 0x52, 0xfd, 0xf4, 0xcb,\n\t\t0x8b, 0xb4, 0x5e, 0xd1, 0x57, 0x09, 0xc9, 0x96, 0x51, 0x20, 0x16, 0x5c,\n\t\t0x8f, 0xdb, 0x8f, 0x21, 0xd8, 0x4b, 0xb1, 0x94, 0xe9, 0x17, 0x3d, 0x23,\n\t\t0xa3, 0xac, 0x3c, 0x42, 0x14, 0xc3, 0x0f, 0x29, 0x9e, 0x51, 0x3e, 0xae,\n\t\t0x33, 0xec, 0xe9, 0xe3, 0x0d, 0x0e, 0x3f, 0x39, 0x49, 0xa0, 0xbb, 0x9a,\n\t\t0x57, 0xa9, 0xb4, 0xb9, 0x2f, 0xf7, 0x3b, 0xf1, 0xd3, 0xc7, 0x39, 0x4f,\n\t\t0xb8, 0x4e, 0x93, 0x89, 0xa9, 0xa9, 0xf0, 0x32, 0x49, 0xa3, 0x9f, 0xa6,\n\t\t0x5f, 0x6e, 0xf2, 0x04, 0xdc, 0x4e, 0x57, 0x71, 0x01, 0x14, 0x32, 0x58,\n\t\t0x7b, 0xe3, 0x19, 0x21, 0xe4, 0x01, 0xf7, 0x3d, 0x4d, 0x4a, 0x25, 0x6a,\n\t\t0x1a, 0x37, 0xdc, 0xdd, 0x54, 0x88, 0xef, 0x74, 0xb8, 0x63, 0xdd, 0x5b,\n\t\t0x95, 0x92, 0x62, 0xae, 0xe5, 0x86, 0x50, 0x0f, 0x3e, 0x4d, 0x4c, 0xe1,\n\t\t0xe2, 0xda, 0x7f, 0xd1, 0x5a, 0xfe, 0x6d, 0x19, 0x1d, 0x9d, 0x16, 0x03,\n\t\t0x88, 0x41, 0x2a, 0x9d, 0x2a, 0xd9, 0x0e, 0xf3, 0xec, 0xee, 0xf5, 0x65,\n\t\t0x11, 0x0a, 0xde, 0x12, 0xa5, 0xaf, 0x93, 0xef, 0xc8, 0xea, 0xb1, 0xea,\n\t\t0x3d, 0x6b, 0x3f, 0x45, 0xa1, 0xc6, 0xc5, 0xc1, 0x31, 0x82, 0x74, 0x08,\n\t\t0xbd, 0x60, 0xca, 0x6c, 0xd8, 0x15, 0xd3, 0xdb, 0x2b, 0x4e, 0x22, 0x12,\n\t\t0x40, 0xe2, 0xed, 0xed, 0x4d, 0xc7, 0xcc, 0x8c, 0x00, 0x08, 0x0d, 0x0b,\n\t\t0xa3, 0xa4, 0xa2, 0x7a, 0x07, 0x11, 0xa5, 0x56, 0x4b, 0xd5, 0xa4, 0x90,\n\t\t0x28, 0x09, 0xab, 0x33, 0x1d, 0x2a, 0xb4, 0x9c, 0xca, 0xf5, 0x90, 0x9b,\n\t\t0xac, 0xa8, 0xd4, 0x6d, 0x76, 0x50, 0x07, 0x57, 0xda, 0x78, 0x34, 0x8b,\n\t\t0x1c, 0xf9, 0xc9, 0xbd, 0x8b, 0xcb, 0x6d, 0xa3, 0xf0, 0x24, 0x10, 0xae,\n\t\t0x7c, 0x2d, 0xfd, 0x9e, 0x84, 0x20, 0x86, 0xd1, 0xbb, 0x99, 0x58, 0x5c,\n\t\t0xa8, 0x49, 0xdf, 0xa4, 0xcb, 0xe5, 0x18, 0x5c, 0xf3, 0xfa, 0x12, 0xa8,\n\t\t0xbe, 0x46, 0xf5, 0x51, 0x22, 0xa0, 0xf5, 0x61, 0x20, 0xfd, 0x66, 0x95,\n\t\t0xaa, 0xb8, 0xb8, 0xf5, 0x8c, 0xed, 0x5b, 0x34, 0x1e, 0xd3, 0xf9, 0x41,\n\t\t0x51, 0x3c, 0xe8, 0x61, 0x3f, 0x4f, 0x5a, 0x59, 0xf9, 0x46, 0xd7, 0x3d,\n\t\t0xf0, 0x66, 0x41, 0xd3, 0xeb, 0xa4, 0x6e, 0x28, 0x7b, 0x90, 0xd0, 0xf4,\n\t\t0x3e, 0xa0, 0x67, 0xec, 0x60, 0xbe, 0x29, 0x0c, 0x68, 0x62, 0x37, 0x3c,\n\t\t0x59, 0xfa, 0xcb, 0xf4, 0x48, 0xd5, 0x51, 0x20, 0x96, 0xe3, 0xd7, 0x0b,\n\t\t0xfa, 0x7e, 0x09, 0xcb, 0x28, 0x46, 0x92, 0x12, 0x44, 0x05, 0xc2, 0x01,\n\t\t0xf2, 0xd5, 0x06, 0x6b, 0x00, 0x70, 0xc0, 0xd5, 0x4c, 0x39, 0x4d, 0xf6,\n\t\t0x8b, 0xd9, 0xa7, 0xe8, 0x02, 0x16, 0x8e, 0x51, 0x42, 0x3c, 0x4a, 0x6e,\n\t\t0xc8, 0x42, 0x69, 0xd8, 0x41, 0xac, 0x59, 0xbe, 0x44, 0x11, 0x45, 0x65,\n\t\t0x90, 0xf7, 0xa6, 0x1f, 0x9b, 0xdc, 0xaa, 0x52, 0x2e, 0x0a, 0xe1, 0x2c,\n\t\t0xa1, 0x16, 0xb1, 0x94, 0x88, 0x93, 0xdd, 0xaf, 0xd0, 0xc9, 0x2e, 0x19,\n\t\t0x06, 0x92, 0xde, 0xad, 0x7b, 0x92, 0x8f, 0x5b, 0xb8, 0x36, 0x8a, 0x78,\n\t\t0xbe, 0x05, 0x2c, 0x71, 0x01, 0x7f, 0xac, 0xaf, 0xe6, 0x24, 0x79, 0xd3,\n\t\t0xd8, 0xeb, 0xf4, 0x53, 0x52, 0x31, 0xf6, 0x0f, 0x90, 0x29, 0x6a, 0xa2,\n\t\t0x39, 0x88, 0x6a, 0x1e, 0xf4, 0x4b, 0x61, 0xf4, 0x76, 0x27, 0x17, 0x17,\n\t\t0x12, 0xa6, 0x0e, 0x3d, 0xde, 0x1d, 0x04, 0x4d, 0x6d, 0x04, 0xac, 0x7e,\n\t\t0xb4, 0xf5, 0x41, 0x72, 0x2e, 0x81, 0x50, 0x94, 0xb1, 0x80, 0xf5, 0xf0,\n\t\t0x85, 0xee, 0x33, 0xc9, 0x6f, 0x32, 0x9f, 0x0d, 0x72, 0xae, 0x00, 0x93,\n\t\t0xd9, 0xdd, 0x31, 0x86, 0x3c, 0x69, 0x69, 0x7a, 0xea, 0xf4, 0xb8, 0x2d,\n\t\t0x77, 0x93, 0x05, 0x2d, 0x5e, 0x7c, 0xd8, 0x69, 0xd5, 0x66, 0xe2, 0x29,\n\t\t0xd4, 0x56, 0xf3, 0xf4, 0x70, 0x65, 0xea, 0x04, 0x6b, 0xcd, 0x28, 0xfc,\n\t\t0x0d, 0xd6, 0x71, 0x4d, 0x4c, 0x3b, 0x98, 0x44, 0x58, 0x31, 0x5b, 0xf9,\n\t\t0x00, 0xb8, 0xd7, 0x46, 0x3f, 0xfa, 0xee, 0x5a, 0xb8, 0xf7, 0x58, 0x53,\n\t\t0xa0, 0x76, 0x75, 0xdd, 0xd3, 0xdc, 0x1e, 0x4d, 0x68, 0xe8, 0x6b, 0x54,\n\t\t0xe9, 0x84, 0x45, 0x44, 0x54, 0xd0, 0x67, 0xa7, 0xee, 0x64, 0x7f, 0x14,\n\t\t0x16, 0x26, 0xcb, 0xc8, 0xc8, 0xf0, 0xd8, 0x39, 0xd5, 0xe1, 0x1a, 0xe8,\n\t\t0x6d, 0x55, 0x2a, 0x70, 0x1e, 0x8f, 0xdd, 0x3c, 0x73, 0x74, 0x78, 0x03,\n\t\t0x76, 0x27, 0x24, 0xe6, 0x38, 0xf2, 0x0c, 0x6a, 0x0d, 0xef, 0x67, 0x1f,\n\t\t0x5b, 0x8c, 0xe0, 0x24, 0x4d, 0xe5, 0x6f, 0xce, 0xf6, 0xd3, 0x52, 0x81,\n\t\t0x9c, 0xed, 0x8d, 0xb7, 0x9b, 0x9f, 0x60, 0x54, 0xd3, 0x46, 0x77, 0xde,\n\t\t0xbc, 0x77, 0xd9, 0x62, 0x48, 0xe6, 0x55, 0xab, 0x6b, 0x23, 0xc8, 0x19,\n\t\t0x3e, 0x33, 0xf5, 0xfd, 0xd3, 0xbe, 0x4a, 0xb8, 0xd2, 0xcc, 0xbb, 0x6a,\n\t\t0x97, 0x42, 0x0d, 0xa2, 0x96, 0xd1, 0xea, 0x7e, 0x01, 0x00, 0x44, 0x29,\n\t\t0x11, 0xbd, 0xf6, 0x07, 0xa4, 0x59, 0x6f, 0x9b, 0x36, 0x00, 0x46, 0x59,\n\t\t0xff, 0x34, 0x92, 0x59, 0xf2, 0xcd, 0x11, 0xb0, 0x0d, 0x1e, 0xce, 0x89,\n\t\t0x4f, 0xf8, 0x9d, 0x7a, 0xad, 0x0d, 0xfd, 0xfc, 0x04, 0xa1, 0x65, 0xb1,\n\t\t0x7e, 0x90, 0xf9, 0x20, 0x46, 0xd1, 0x5b, 0x54, 0xb0, 0x18, 0x76, 0x91,\n\t\t0xdc, 0x6d, 0x06, 0x76, 0xdb, 0x0b, 0xf0, 0xb3, 0x7f, 0x78, 0xcb, 0x76,\n\t\t0x67, 0x09, 0x47, 0x3f, 0x50, 0x34, 0x0c, 0xd5, 0x77, 0xca, 0x99, 0x86,\n\t\t0x9d, 0xed, 0xeb, 0x23, 0xb7, 0x52, 0xd7, 0xba, 0xe7, 0x52, 0x88, 0xab,\n\t\t0x84, 0x6d, 0xdb, 0x55, 0xb4, 0x43, 0x46, 0xe9, 0xa6, 0x53, 0xaf, 0xc4,\n\t\t0xce, 0x35, 0x96, 0xa7, 0x51, 0x27, 0x7b, 0x33, 0x3b, 0xe4, 0x27, 0x50,\n\t\t0x58, 0xe8, 0x7e, 0xf9, 0x1a, 0xd1, 0xfe, 0x7b, 0xe5, 0xcf, 0xe6, 0xcf,\n\t\t0xf1, 0xef, 0x97, 0x20, 0xea, 0x2c, 0x0f, 0x52, 0x04, 0xe5, 0xdc, 0x06,\n\t\t0x43, 0x5f, 0x9f, 0x36, 0xa6, 0x0c, 0xcd, 0x98, 0x05, 0xce, 0x48, 0x04,\n\t\t0x78, 0x9b, 0xf3, 0xcd, 0xa5, 0xdc, 0xbf, 0x02, 0x2c, 0xc2, 0xa0, 0x79,\n\t\t0xcc, 0x93, 0xd5, 0x46, 0x5b, 0xaf, 0xeb, 0x19, 0x69, 0xe8, 0x4b, 0xff,\n\t\t0xe7, 0xc7, 0xe3, 0x9a, 0xe1, 0x29, 0x16, 0x25, 0x09, 0x8b, 0x7a, 0xc2,\n\t\t0x52, 0xc5, 0x9c, 0xde, 0x0e, 0xef, 0xab, 0xf3, 0xf3, 0x3e, 0x74, 0x60,\n\t\t0x5c, 0x7c, 0x74, 0x6c, 0x6f, 0xf3, 0x9b, 0x37, 0xe6, 0x47, 0x84, 0xdb,\n\t\t0x7c, 0x33, 0x03, 0xd8, 0xec, 0xac, 0x4c, 0x3c, 0x3c, 0x87, 0x3b, 0xbd,\n\t\t0x0b, 0x00, 0xb9, 0xa4, 0x88, 0x73, 0x7f, 0xa4, 0x38, 0xe6, 0x5d, 0x26,\n\t\t0x9d, 0xc5, 0x78, 0xa5, 0x20, 0xb7, 0xf5, 0x89, 0x51, 0x07, 0xff, 0x7e,\n\t\t0x00, 0xe2, 0xb5, 0x5c, 0x94, 0x17, 0xe2, 0x3e, 0x09, 0x84, 0x62, 0x62,\n\t\t0x97, 0x6b, 0xd6, 0xeb, 0x81, 0x03, 0x6f, 0x13, 0x65, 0xbc, 0xbc, 0x2e,\n\t\t0xad, 0x9a, 0x73, 0x39, 0x3e, 0xef, 0x22, 0x77, 0xe9, 0x74, 0x61, 0xfa,\n\t\t0xa2, 0xe5, 0x04, 0xab, 0xbb, 0x31, 0x2f, 0x55, 0x28, 0xd3, 0x61, 0x60,\n\t\t0x62, 0x7e, 0xff, 0xf3, 0x87, 0x3d, 0x25, 0x35, 0x75, 0xe5, 0x34, 0x1a,\n\t\t0x19, 0x7d, 0x00, 0x74, 0x97, 0xf7, 0x45, 0xbc, 0x7e, 0xd0, 0x21, 0x76,\n\t\t0x64, 0xa9, 0xa5, 0x4d, 0x9c, 0x45, 0x49, 0x92, 0x89, 0x2a, 0xa8, 0x81,\n\t\t0x4a, 0xf3, 0x8c, 0x72, 0xe1, 0x0b, 0xc4, 0x5d, 0x64, 0x24, 0x24, 0x9a,\n\t\t0x1d, 0x01, 0xea, 0xd6, 0xbb, 0x75, 0x10, 0xcf, 0xe8, 0x09, 0xc4, 0xaf,\n\t\t0x29, 0xa4, 0x65, 0xee, 0x37, 0x55, 0x61, 0xb6, 0xa4, 0x98, 0x90, 0x64,\n\t\t0xc7, 0x87, 0x83, 0x61, 0x11, 0xe4, 0x86, 0x47, 0x5f, 0xdf, 0x79, 0x35,\n\t\t0xd8, 0x27, 0x05, 0x72, 0x0e, 0x3d, 0x43, 0x26, 0xba, 0x44, 0x2e, 0x18,\n\t\t0x8f, 0x77, 0x31, 0x69, 0xfb, 0x4b, 0xf2, 0x9b, 0x84, 0x81, 0x41, 0xae,\n\t\t0x3e, 0xfb, 0x12, 0x02, 0xbc, 0xc9, 0x63, 0x71, 0xa2, 0x56, 0xd3, 0x16,\n\t\t0x8d, 0xec, 0xde, 0x02, 0x06, 0xe6, 0x2f, 0x77, 0x3e, 0x66, 0x44, 0xc1,\n\t\t0x35, 0x08, 0x98, 0x92, 0xd0, 0x1b, 0x4a, 0x64, 0xa7, 0xa4, 0x96, 0x1c,\n\t\t0xe0, 0x44, 0xfd, 0x5a, 0xe2, 0x65, 0x69, 0x45, 0x49, 0x05, 0x83, 0x20,\n\t\t0xb9, 0x10, 0x6e, 0x90, 0xc0, 0xc7, 0xb3, 0x53, 0x72, 0xf0, 0x20, 0xa2,\n\t\t0x5b, 0xab, 0xc9, 0x87, 0x38, 0xee, 0x93, 0x7e, 0x03, 0xb1, 0x2a, 0xe2,\n\t\t0xbb, 0x8d, 0xe7, 0xee, 0x1f, 0xac, 0xbb, 0xb7, 0x3d, 0x37, 0x3e, 0x72,\n\t\t0xed, 0xce, 0xf2, 0x70, 0x60, 0x42, 0x1e, 0x44, 0xb6, 0x6f, 0x98, 0xc3,\n\t\t0x2c, 0xf4, 0xdf, 0xd5, 0x71, 0x30, 0x09, 0xf2, 0xa5, 0x82, 0xa4, 0xec,\n\t\t0x35, 0xbd, 0x0e, 0x9b, 0x5e, 0xd7, 0xcf, 0x57, 0x74, 0x5d, 0x59, 0x5d,\n\t\t0x8c, 0x94, 0x42, 0xe1, 0x34, 0x03, 0x33, 0xb2, 0x44, 0xe4, 0xe4, 0xa6,\n\t\t0x06, 0x47, 0xea, 0xd3, 0xb2, 0x07, 0xf9, 0x34, 0x59, 0xe0, 0x47, 0xf5,\n\t\t0x36, 0xe3, 0x28, 0x17, 0xc4, 0xc3, 0xcc, 0x23, 0xe4, 0x0a, 0xbd, 0xcc,\n\t\t0x3f, 0x9b, 0xae, 0xfa, 0xf2, 0xb2, 0xe4, 0x28, 0x7b, 0x3f, 0x8f, 0xed,\n\t\t0x76, 0x17, 0x48, 0x97, 0x72, 0x1f, 0x2c, 0x75, 0x76, 0xea, 0x15, 0x60,\n\t\t0x8a, 0x38, 0x71, 0x71, 0xe0, 0x57, 0x72, 0x9f, 0x86, 0x51, 0xb0, 0x0a,\n\t\t0xbe, 0xdd, 0x7d, 0x3e, 0x98, 0xad, 0xa6, 0x31, 0xf0, 0xba, 0x93, 0x83,\n\t\t0x5e, 0x8a, 0x01, 0x93, 0xcc, 0x4c, 0x7d, 0x64, 0x2b, 0x53, 0xa7, 0x87,\n\t\t0xde, 0x1a, 0x54, 0x1d, 0x42, 0x87, 0xd9, 0x07, 0x98, 0x06, 0x51, 0x3b,\n\t\t0xe3, 0xa4, 0xa6, 0x80, 0xfc, 0x6c, 0xf8, 0xd5, 0xe8, 0x69, 0xda, 0x3c,\n\t\t0xed, 0x50, 0xc3, 0xa2, 0x77, 0x1d, 0x8b, 0x6d, 0x0a, 0x74, 0x96, 0x0c,\n\t\t0xfd, 0x52, 0x46, 0x11, 0x43, 0x16, 0x32, 0x8f, 0xb7, 0xad, 0xfc, 0x50,\n\t\t0x84, 0x30, 0x68, 0xd4, 0x55, 0xca, 0xf9, 0xb9, 0xeb, 0xb4, 0x98, 0x69,\n\t\t0xdf, 0xd1, 0xb6, 0xfb, 0xc6, 0x6f, 0x17, 0xf4, 0xdc, 0x83, 0x8b, 0xd2,\n\t\t0xa6, 0xa9, 0xba, 0x12, 0x21, 0x83, 0x92, 0xff, 0x4c, 0x36, 0x0c, 0xfd,\n\t\t0xf4, 0xda, 0x88, 0x01, 0x59, 0xc3, 0xf3, 0xc7, 0xb9, 0x39, 0x36, 0x67,\n\t\t0x79, 0xef, 0x76, 0x3b, 0x19, 0x10, 0x06, 0xdc, 0x63, 0xea, 0xc2, 0xb4,\n\t\t0x7f, 0xb3, 0x0d, 0xc3, 0x5e, 0x60, 0xe7, 0xa8, 0xb1, 0x9a, 0xf9, 0xb4,\n\t\t0xcd, 0x7b, 0xe9, 0x9f, 0x3f, 0xc1, 0xf9, 0xbd, 0xf8, 0xee, 0xa2, 0x86,\n\t\t0x4c, 0x32, 0xc3, 0xed, 0x77, 0x28, 0xff, 0xbb, 0x0b, 0x90, 0xca, 0xf8,\n\t\t0xb3, 0x58, 0x5e, 0x0c, 0xf1, 0x61, 0xda, 0xb9, 0x03, 0x22, 0x13, 0xf7,\n\t\t0x37, 0x5e, 0xb3, 0x2d, 0xba, 0xb0, 0x9b, 0x19, 0xe8, 0x3f, 0x0f, 0x8c,\n\t\t0xa7, 0xed, 0xef, 0xcc, 0xa6, 0xca, 0x0b, 0xb2, 0x9b, 0x7f, 0x00, 0x93,\n\t\t0xf9, 0x57, 0xda, 0x93, 0xd3, 0xb8, 0x6e, 0x4e, 0xd7, 0x29, 0xb8, 0x96,\n\t\t0xb2, 0x89, 0x29, 0xff, 0x8c, 0x34, 0x29, 0x8f, 0x2e, 0x92, 0x51, 0x50,\n\t\t0x16, 0xff, 0xc4, 0x33, 0xff, 0x7b, 0x25, 0x85, 0x26, 0x88, 0x1e, 0xe8,\n\t\t0xfc, 0x0c, 0xda, 0xfd, 0xf0, 0xdc, 0x71, 0x81, 0xce, 0x27, 0x4e, 0x25,\n\t\t0x2c, 0x6f, 0x68, 0x21, 0x21, 0x3e, 0xa7, 0x25, 0xf8, 0x34, 0x4c, 0x2d,\n\t\t0xc8, 0x67, 0xfa, 0x8e, 0xe9, 0xe5, 0x52, 0x2c, 0x07, 0x48, 0x23, 0x7a,\n\t\t0x5a, 0x2b, 0xa8, 0x9c, 0xf4, 0xe1, 0x1b, 0xc2, 0x17, 0x9b, 0xf7, 0x19,\n\t\t0xe2, 0x97, 0x84, 0x9c, 0x9f, 0xe3, 0xd6, 0x94, 0x9d, 0x2f, 0x30, 0x43,\n\t\t0xc4, 0x31, 0x69, 0x5c, 0x0c, 0xb8, 0x07, 0x9d, 0x37, 0x23, 0xeb, 0xd3,\n\t\t0x58, 0x1d, 0xb4, 0xc8, 0x33, 0x3f, 0x48, 0xac, 0xd1, 0xaa, 0x11, 0x87,\n\t\t0x3a, 0x7f, 0x79, 0xca, 0xf7, 0x1d, 0x5a, 0x6c, 0x90, 0x98, 0x95, 0x2e,\n\t\t0x4f, 0x41, 0x3e, 0x11, 0xc9, 0x0c, 0xfd, 0xbd, 0x16, 0x2c, 0x5b, 0x34,\n\t\t0x3a, 0x3b, 0x3c, 0x6c, 0x5d, 0x43, 0xfc, 0x21, 0xd2, 0x6d, 0xac, 0x13,\n\t\t0xed, 0x00, 0x39, 0x67, 0x4d, 0xed, 0xe9, 0x56, 0xc9, 0x1f, 0xa1, 0xac,\n\t\t0x86, 0x37, 0x2e, 0x8d, 0x30, 0xc6, 0xeb, 0x72, 0x21, 0xfe, 0x9b, 0x72,\n\t\t0x71, 0xf2, 0x47, 0x46, 0xf1, 0xaf, 0xb0, 0xb8, 0x24, 0x66, 0x9b, 0x23,\n\t\t0xdf, 0x30, 0xde, 0xdd, 0xe1, 0xe0, 0xf8, 0x29, 0xd8, 0x4e, 0x1f, 0x47,\n\t\t0x60, 0xf1, 0xb7, 0x96, 0x73, 0x58, 0x6e, 0xb0, 0xb2, 0xe3, 0x35, 0x0d,\n\t\t0x2f, 0x74, 0x35, 0x5c, 0x33, 0xfa, 0xdd, 0xf6, 0xf9, 0x28, 0xfd, 0x90,\n\t\t0x40, 0xbc, 0xf8, 0x9c, 0xa9, 0xef, 0x22, 0xbd, 0x85, 0x42, 0x57, 0x90,\n\t\t0x6c, 0xf3, 0xad, 0x32, 0x8b, 0x19, 0x27, 0x74, 0x7a, 0xa7, 0xfa, 0xb6,\n\t\t0x6a, 0xa3, 0x01, 0x7f, 0x48, 0xb1, 0xd4, 0x8b, 0x9f, 0x5a, 0x3c, 0x22,\n\t\t0x7e, 0x6b, 0xad, 0x38, 0x51, 0x00, 0xc1, 0x50, 0x14, 0x29, 0x47, 0x2d,\n\t\t0x7a, 0x24, 0xc5, 0xca, 0x9c, 0x11, 0x8c, 0x34, 0xa8, 0xa6, 0x58, 0x02,\n\t\t0x92, 0x90, 0xe9, 0x8d, 0xba, 0x11, 0xd8, 0x45, 0x8c, 0xc6, 0x00, 0xc1,\n\t\t0xaa, 0x55, 0xe0, 0xf9, 0xee, 0xc6, 0xf5, 0xe0, 0x43, 0x4c, 0xb3, 0x40,\n\t\t0x1b, 0x35, 0xf2, 0xfe, 0x7b, 0xd9, 0x5b, 0xeb, 0x6a, 0xf3, 0xd3, 0x96,\n\t\t0x8c, 0xd9, 0x3e, 0xae, 0x0f, 0xb4, 0x17, 0x74, 0x8c, 0x81, 0x6c, 0x4a,\n\t\t0x97, 0xa1, 0xff, 0x06, 0x22, 0xfa, 0x56, 0x4e, 0xd4, 0x09, 0x80, 0xa3,\n\t\t0xe6, 0x8f, 0xcb, 0x1a, 0xc7, 0xf3, 0x7b, 0xed, 0x73, 0x74, 0x09, 0x95,\n\t\t0x40, 0xb4, 0xde, 0x92, 0xa8, 0xe3, 0x95, 0x00, 0x13, 0xf8, 0x41, 0xf2,\n\t\t0xbc, 0xca, 0x47, 0x8b, 0x2b, 0x99, 0x22, 0xa9, 0xb9, 0x13, 0x24, 0x51,\n\t\t0x27, 0x1b, 0xc9, 0x46, 0x07, 0x60, 0x80, 0x5e, 0xd7, 0xcf, 0x8f, 0xd2,\n\t\t0x5a, 0xa1, 0x09, 0x08, 0xa1, 0x3f, 0xdb, 0x16, 0xd1, 0x65, 0x0f, 0x8a,\n\t\t0x07, 0xe5, 0x7f, 0xa1, 0xfc, 0x48, 0x19, 0x5d, 0x36, 0x8f, 0xdb, 0x29,\n\t\t0xa4, 0x33, 0x7e, 0x12, 0x2e, 0x8d, 0xf6, 0x14, 0x47, 0xac, 0xc3, 0xae,\n\t\t0x40, 0x6d, 0x00, 0x5a, 0xc8, 0x63, 0x33, 0xa9, 0xd2, 0x09, 0x87, 0x61,\n\t\t0xf1, 0x97, 0xe3, 0x0e, 0xf6, 0xee, 0xb3, 0xfe, 0x72, 0xb7, 0xc9, 0x68,\n\t\t0x78, 0x88, 0xef, 0xc3, 0xa0, 0x91, 0x89, 0x4b, 0x40, 0xa4, 0x44, 0xc5,\n\t\t0xd9, 0x0f, 0x8f, 0x24, 0x9a, 0x30, 0xca, 0x3c, 0x34, 0x90, 0x4e, 0x99,\n\t\t0x96, 0xa9, 0xd2, 0x62, 0xb4, 0x94, 0x83, 0xb0, 0x94, 0x7a, 0x18, 0x0b,\n\t\t0x9e, 0xe3, 0x97, 0xb5, 0x12, 0x37, 0x3b, 0xa0, 0xaf, 0x7c, 0x75, 0x2d,\n\t\t0xa4, 0x1d, 0xd6, 0x98, 0xed, 0xe6, 0x2b, 0x47, 0xf2, 0xda, 0x37, 0x4e,\n\t\t0x37, 0x68, 0xbb, 0x0c, 0xf9, 0x91, 0x2c, 0xc0, 0x29, 0x4f, 0xdc, 0x8e,\n\t\t0x21, 0xf3, 0x26, 0xe2, 0xb7, 0xe2, 0x4a, 0x37, 0xf1, 0xaf, 0xee, 0xf0,\n\t\t0x01, 0x3e, 0x20, 0x09, 0xcb, 0xd6, 0x10, 0xab, 0x73, 0xc8, 0xb4, 0xf8,\n\t\t0xa3, 0x7c, 0xf0, 0x94, 0x77, 0x35, 0xc9, 0x5a, 0xbd, 0xf8, 0x60, 0x4b,\n\t\t0xa7, 0x4a, 0x47, 0x70, 0xd0, 0x29, 0x8b, 0x8d, 0x8d, 0x11, 0xd1, 0xc0,\n\t\t0x9d, 0x3a, 0x60, 0xba, 0xff, 0xa6, 0x25, 0x6d, 0x5d, 0x42, 0xaf, 0x3e,\n\t\t0x1e, 0x1f, 0x57, 0x14, 0x48, 0x26, 0x97, 0xf4, 0x91, 0x00, 0xb2, 0x50,\n\t\t0x4e, 0x34, 0x1f, 0x9b, 0x67, 0xf1, 0x76, 0x82, 0xca, 0xb5, 0x9a, 0x8c,\n\t\t0xfc, 0x20, 0xb4, 0x53, 0xc5, 0x12, 0x2f, 0xfa, 0x52, 0x9d, 0x62, 0xda,\n\t\t0xa1, 0x73, 0x75, 0x14, 0xb5, 0xbd, 0x80, 0xa5, 0x68, 0x50, 0x26, 0x14,\n\t\t0xc3, 0x37, 0xa9, 0x9f, 0x14, 0xbc, 0xc5, 0x76, 0x70, 0x73, 0x88, 0xd0,\n\t\t0x0a, 0xba, 0xa0, 0x49, 0x99, 0x8e, 0x24, 0xd6, 0xfb, 0x6c, 0xcc, 0x78,\n\t\t0x7e, 0x3c, 0xfa, 0x11, 0x7e, 0x80, 0xff, 0x84, 0xcf, 0x4f, 0xb6, 0x3a,\n\t\t0x08, 0x91, 0xd2, 0xa0, 0xa2, 0x58, 0x2d, 0x5e, 0xc5, 0x7f, 0xf7, 0x99,\n\t\t0x29, 0x1d, 0xf6, 0x1d, 0xd1, 0x4c, 0x31, 0x31, 0x4f, 0x7e, 0xa8, 0xe2,\n\t\t0x9a, 0x78, 0x25, 0xe9, 0x2d, 0x19, 0x86, 0xd9, 0x52, 0x81, 0xf9, 0xcd,\n\t\t0x9e, 0xff, 0xd6, 0x5a, 0xf9, 0xb5, 0x00, 0x65, 0x7f, 0x7c, 0xd8, 0x0f,\n\t\t0x9b, 0x19, 0x3a, 0xfe, 0x8e, 0xd9, 0x08, 0x50, 0xe1, 0x8c, 0xd7, 0x30,\n\t\t0xa3, 0xae, 0xa8, 0x70, 0x28, 0x16, 0xbf, 0x33, 0x4a, 0x8e, 0x83, 0x3a,\n\t\t0x92, 0xa9, 0x58, 0x8d, 0x3a, 0x99, 0x80, 0x9b, 0x20, 0xa1, 0xa5, 0x6a,\n\t\t0xf5, 0x28, 0x2e, 0x16, 0x65, 0xbf, 0x1c, 0x3c, 0xbc, 0x9a, 0x81, 0x0b,\n\t\t0xb3, 0x0a, 0x36, 0x22, 0x4f, 0x01, 0xa4, 0x3f, 0x5a, 0xde, 0xfb, 0xef,\n\t\t0x8d, 0xa2, 0xd3, 0xbb, 0xa3, 0xa6, 0xed, 0x68, 0x2d, 0x27, 0x2d, 0xb2,\n\t\t0x88, 0x94, 0x81, 0xdf, 0x24, 0x86, 0x49, 0xbf, 0xd7, 0x40, 0x07, 0xfb,\n\t\t0xd5, 0xe0, 0x56, 0x20, 0x56, 0xe5, 0x70, 0x21, 0xbf, 0x5b, 0x17, 0xdb,\n\t\t0x8e, 0xf6, 0xa5, 0x10, 0xba, 0x1b, 0x2f, 0x2b, 0x4f, 0x2b, 0x57, 0xc2,\n\t\t0x64, 0xeb, 0x95, 0xfa, 0x3e, 0x89, 0x08, 0xda, 0x41, 0x14, 0xdb, 0x84,\n\t\t0x63, 0x30, 0x86, 0x96, 0x72, 0x5d, 0x4e, 0x6e, 0x46, 0x34, 0x44, 0x30,\n\t\t0xb9, 0x84, 0x43, 0x9c, 0x90, 0x3d, 0xf8, 0x2f, 0xbd, 0xfd, 0xe7, 0x32,\n\t\t0xf1, 0xec, 0x2c, 0x88, 0x03, 0x39, 0x98, 0xb3, 0x93, 0x36, 0xbf, 0xeb,\n\t\t0x21, 0xd7, 0x20, 0x7b, 0x72, 0x3e, 0x45, 0x6b, 0xed, 0xa5, 0x0c, 0xf5,\n\t\t0x2a, 0x00, 0xe7, 0xe8, 0x68, 0xae, 0x26, 0xb1, 0x9b, 0xa1, 0xf4, 0x0f,\n\t\t0x41, 0x5b, 0xe0, 0x63, 0xce, 0xdc, 0x75, 0x07, 0x63, 0xf8, 0x14, 0x9a,\n\t\t0x3c, 0xfd, 0xbd, 0x30, 0xa3, 0x87, 0x97, 0x43, 0xac, 0xfb, 0x56, 0xa9,\n\t\t0xe6, 0xf2, 0x63, 0x2b, 0x99, 0xae, 0x00, 0xbb, 0x79, 0x6c, 0x6a, 0xd3,\n\t\t0x0a, 0x41, 0x7c, 0x5f, 0xc3, 0x2e, 0xed, 0xe0, 0x9a, 0xd7, 0x8d, 0x4a,\n\t\t0x1b, 0xba, 0x13, 0x6d, 0x40, 0xfd, 0xa9, 0xbb, 0xec, 0xd2, 0x22, 0x58,\n\t\t0xcf, 0xf9, 0x9e, 0x08, 0xe2, 0x3e, 0x06, 0x70, 0xef, 0x3f, 0xd9, 0xc1,\n\t\t0xcd, 0x37, 0xed, 0xd2, 0x45, 0x5a, 0xaa, 0x38, 0xb8, 0xf1, 0x52, 0xf6,\n\t\t0x3b, 0xd6, 0x05, 0x6d, 0x74, 0xe2, 0x33, 0xec, 0xc6, 0xf5, 0x42, 0x9d,\n\t\t0xf8, 0x46, 0xbc, 0x14, 0x68, 0x8a, 0x19, 0x1a, 0x74, 0x83, 0x0b, 0x14,\n\t\t0x78, 0x13, 0x14, 0x93, 0xb4, 0x40, 0xa4, 0xdc, 0xca, 0xfe, 0x78, 0x63,\n\t\t0xa3, 0x51, 0x82, 0xe9, 0xfa, 0xaf, 0x5c, 0xf5, 0xea, 0x2c, 0x85, 0x89,\n\t\t0x82, 0x5c, 0x1c, 0x29, 0x67, 0x9e, 0x78, 0x12, 0x36, 0x4d, 0xb3, 0x43,\n\t\t0x51, 0xa6, 0x3d, 0x1c, 0xc5, 0x9a, 0xf3, 0x2e, 0x0c, 0x23, 0x70, 0x88,\n\t\t0xe0, 0x4b, 0xf5, 0x0b, 0x93, 0x67, 0xfa, 0xc4, 0xe1, 0x84, 0x39, 0xf2,\n\t\t0x50, 0x29, 0xb4, 0x2f, 0xa9, 0xa2, 0x48, 0x20, 0x4c, 0xd9, 0x15, 0x4c,\n\t\t0x10, 0xac, 0xd7, 0xd1, 0x4d, 0xfc, 0x37, 0x15, 0x1d, 0x5a, 0xe8, 0xce,\n\t\t0x35, 0x1f, 0x6e, 0x6a, 0x4a, 0xaf, 0x0d, 0xee, 0xe9, 0x20, 0x2f, 0x0f,\n\t\t0x57, 0xf2, 0x67, 0x92, 0xbc, 0xff, 0x7a, 0x2b, 0x62, 0x9b, 0x19, 0x4f,\n\t\t0x9f, 0x6d, 0xb2, 0x50, 0xd0, 0xd4, 0x41, 0xf0, 0x28, 0xe2, 0xc1, 0x10,\n\t\t0xff, 0x3f, 0x9a, 0xbe, 0x3a, 0x20, 0xaa, 0xe7, 0x7b, 0x7b, 0x01, 0x69,\n\t\t0x84, 0xa5, 0x3b, 0x56, 0x52, 0xa5, 0xa5, 0xbb, 0xa4, 0x45, 0x96, 0x92,\n\t\t0x06, 0x59, 0x5a, 0xa4, 0x96, 0x96, 0x12, 0x97, 0x90, 0x0e, 0x49, 0x97,\n\t\t0x06, 0x91, 0x2e, 0xe9, 0xee, 0x92, 0x12, 0x90, 0x6e, 0x49, 0xe9, 0x96,\n\t\t0x7c, 0xef, 0x7e, 0xbe, 0xbf, 0x97, 0x7f, 0x77, 0x38, 0x73, 0xe6, 0x9c,\n\t\t0xe7, 0x3c, 0xf3, 0x9c, 0xb9, 0xbb, 0x77, 0x7c, 0x19, 0x60, 0x23, 0x6d,\n\t\t0x98, 0x64, 0xe1, 0x4c, 0x45, 0x14, 0x5b, 0x58, 0x00, 0x0c, 0x5b, 0x2c,\n\t\t0xd4, 0xe1, 0x3f, 0xd6, 0x6a, 0x14, 0x4b, 0xe5, 0x34, 0x35, 0x03, 0x51,\n\t\t0x87, 0x4c, 0x96, 0x14, 0x14, 0x24, 0x04, 0xf9, 0x5a, 0x6f, 0x85, 0xd9,\n\t\t0xc2, 0x43, 0xb4, 0x52, 0x3b, 0x8f, 0x9f, 0xa2, 0x06, 0xad, 0x19, 0x7b,\n\t\t0x67, 0xad, 0xb9, 0x57, 0x6a, 0xc4, 0xec, 0x19, 0xef, 0x76, 0xc9, 0x84,\n\t\t0xb5, 0x45, 0xe0, 0xe0, 0xbb, 0x50, 0xc5, 0xd9, 0x6a, 0x21, 0x69, 0x51,\n\t\t0xfe, 0x3c, 0xe3, 0xf8, 0xbe, 0x4f, 0x2d, 0xf3, 0xb6, 0x74, 0xa6, 0x35,\n\t\t0x2d, 0xf5, 0x39, 0xea, 0x80, 0x94, 0x67, 0xac, 0xc1, 0x44, 0x2d, 0x94,\n\t\t0x38, 0xce, 0xb1, 0xa1, 0x09, 0x05, 0xd3, 0xf2, 0xb3, 0xeb, 0x3b, 0xef,\n\t\t0xc0, 0x35, 0xb9, 0x9e, 0x8b, 0xfc, 0xe7, 0xa9, 0xae, 0x21, 0xf2, 0x38,\n\t\t0xc7, 0xe8, 0xe3, 0xc4, 0xd9, 0x1e, 0xf3, 0x41, 0x60, 0x24, 0xcf, 0xff,\n\t\t0x0a, 0xeb, 0x18, 0x94, 0x5d, 0xbf, 0x36, 0xb5, 0xd4, 0x55, 0xb0, 0x41,\n\t\t0x80, 0x00, 0xaf, 0x05, 0x8b, 0xd8, 0x34, 0xfd, 0xf9, 0x5f, 0xf1, 0x67,\n\t\t0xc4, 0xea, 0x1f, 0xaf, 0x6d, 0xef, 0xe0, 0x73, 0xbc, 0xd0, 0x84, 0xb3,\n\t\t0xca, 0xdd, 0x1a, 0xa8, 0x14, 0x76, 0x38, 0x7e, 0x85, 0xfb, 0x51, 0xa6,\n\t\t0xca, 0xa1, 0x1c, 0xfb, 0x8c, 0xcd, 0x6b, 0xd2, 0xf3, 0x3c, 0x77, 0x20,\n\t\t0xf2, 0x4e, 0x69, 0xb4, 0x9f, 0x9a, 0x00, 0xa2, 0x60, 0x2d, 0xd6, 0xa2,\n\t\t0x2d, 0x89, 0xb7, 0xfb, 0x7b, 0xed, 0xbf, 0xa5, 0x69, 0x73, 0xc8, 0x8d,\n\t\t0xe8, 0x2e, 0x99, 0xb6, 0xdd, 0xc9, 0xe8, 0x86, 0x92, 0xc8, 0xdd, 0xca,\n\t\t0x28, 0x3b, 0xc7, 0x2e, 0xd6, 0x6a, 0x51, 0xaf, 0x89, 0xec, 0xa7, 0x4f,\n\t\t0xa2, 0xb3, 0xba, 0xad, 0xa1, 0x15, 0x45, 0x24, 0xd6, 0x5d, 0xd0, 0x49,\n\t\t0x05, 0xff, 0x38, 0x73, 0x68, 0x08, 0x82, 0x20, 0xfa, 0x39, 0x75, 0x68,\n\t\t0x6d, 0xeb, 0x86, 0x1b, 0xdc, 0xb2, 0xc3, 0xe5, 0x55, 0x1e, 0xa3, 0x56,\n\t\t0xc6, 0xcd, 0x92, 0xb7, 0x0c, 0x95, 0x79, 0xdb, 0xd4, 0xc7, 0xa6, 0x42,\n\t\t0x37, 0x7f, 0x41, 0x9f, 0xf0, 0x02, 0x60, 0x1e, 0xca, 0x38, 0x16, 0x28,\n\t\t0xb3, 0x27, 0x41, 0x6b, 0x20, 0xc0, 0x07, 0x9e, 0x2f, 0x5f, 0x16, 0xab,\n\t\t0xa1, 0xe5, 0x2f, 0xfa, 0xd4, 0x00, 0xfd, 0xe0, 0x47, 0x85, 0xc5, 0x69,\n\t\t0x9c, 0x63, 0x35, 0xb6, 0xea, 0x29, 0xc0, 0x45, 0x58, 0xe6, 0xef, 0xd2,\n\t\t0xe5, 0x6c, 0x5f, 0x1d, 0xa5, 0x33, 0x4a, 0x65, 0x09, 0x05, 0x11, 0x63,\n\t\t0xef, 0xbf, 0x72, 0xbb, 0x82, 0x74, 0x92, 0x2f, 0x3d, 0x67, 0x71, 0x8e,\n\t\t0x95, 0x68, 0x6a, 0x60, 0x37, 0xf0, 0xb2, 0x91, 0xfe, 0x19, 0x65, 0xf7,\n\t\t0x6c, 0x14, 0x97, 0x1e, 0x83, 0x33, 0xf6, 0x44, 0xaa, 0x4e, 0x47, 0xd7,\n\t\t0x5d, 0x1f, 0xc9, 0xe1, 0xc4, 0x19, 0xc8, 0x56, 0xc2, 0x76, 0x3c, 0x56,\n\t\t0x9b, 0x3b, 0x2a, 0x62, 0x0c, 0xf9, 0x7e, 0x13, 0x03, 0x8e, 0x12, 0x07,\n\t\t0x65, 0x0d, 0xbb, 0xd2, 0xcd, 0xfb, 0x1d, 0xb1, 0x28, 0xa8, 0xc4, 0x33,\n\t\t0xd3, 0xc9, 0x85, 0x45, 0x12, 0x28, 0xf6, 0x19, 0x92, 0x2d, 0xec, 0x9e,\n\t\t0xc8, 0x68, 0x31, 0x03, 0x61, 0x50, 0xe2, 0xa5, 0x70, 0xed, 0x77, 0xd9,\n\t\t0x33, 0xd4, 0x63, 0xf0, 0x60, 0x14, 0x79, 0xaa, 0x04, 0x64, 0x80, 0x7a,\n\t\t0x83, 0x32, 0xa9, 0x9f, 0x3e, 0xe8, 0x75, 0x0e, 0x42, 0x43, 0x42, 0x8e,\n\t\t0xcc, 0x3b, 0xba, 0xf8, 0x78, 0xff, 0x86, 0xd4, 0xe4, 0x31, 0xa9, 0x9c,\n\t\t0xaf, 0x7e, 0x75, 0x3d, 0x55, 0xd3, 0xfb, 0x5e, 0xf4, 0xd1, 0x21, 0xb2,\n\t\t0xf0, 0xd7, 0x40, 0x01, 0x49, 0x3c, 0x61, 0xb3, 0x76, 0x66, 0xc8, 0x12,\n\t\t0x12, 0x8f, 0x66, 0x94, 0xf2, 0x26, 0x54, 0x4c, 0x98, 0xe0, 0x85, 0x74,\n\t\t0x2b, 0xb9, 0x8c, 0x40, 0xff, 0xdc, 0x12, 0xf8, 0xd5, 0x71, 0x76, 0x5c,\n\t\t0x51, 0xa9, 0x6e, 0x77, 0x33, 0xbb, 0xc2, 0x93, 0x53, 0x41, 0xab, 0x61,\n\t\t0xeb, 0x5e, 0x1a, 0xa6, 0xc4, 0x42, 0xfb, 0x62, 0x7b, 0xbb, 0x5c, 0x08,\n\t\t0x30, 0xa3, 0x8e, 0xa1, 0xb5, 0x5b, 0x65, 0x27, 0x6b, 0x20, 0x9e, 0x76,\n\t\t0x3d, 0x90, 0xe5, 0x35, 0xd9, 0xf8, 0x21, 0xec, 0xcd, 0x26, 0xc2, 0x8c,\n\t\t0x23, 0x37, 0x26, 0x04, 0x38, 0x95, 0xea, 0x95, 0x75, 0xc1, 0x40, 0x45,\n\t\t0x10, 0x93, 0xed, 0xff, 0x81, 0x96, 0xa1, 0x2b, 0x65, 0xee, 0x58, 0x8a,\n\t\t0x16, 0xb4, 0xb2, 0x17, 0xfc, 0x7c, 0x45, 0xc7, 0x32, 0x04, 0xdc, 0x06,\n\t\t0xce, 0x82, 0xca, 0x43, 0x66, 0x0a, 0x18, 0x7a, 0x83, 0x4c, 0x46, 0x2a,\n\t\t0x21, 0x82, 0xf2, 0xb8, 0xe9, 0x5e, 0x91, 0x86, 0x8b, 0x5e, 0x99, 0xc5,\n\t\t0xc7, 0xc8, 0xdb, 0x27, 0x45, 0xfb, 0x1a, 0x61, 0x99, 0x60, 0x2a, 0x0c,\n\t\t0xd8, 0x4f, 0x47, 0x75, 0xb2, 0xd3, 0xeb, 0x41, 0xb2, 0xe8, 0xff, 0x7c,\n\t\t0xed, 0xb5, 0x7f, 0xbc, 0x8c, 0xcd, 0x9b, 0x7c, 0x73, 0xc1, 0xa8, 0x76,\n\t\t0xe2, 0x2c, 0x00, 0x60, 0x9e, 0x4e, 0xd2, 0x0f, 0x4d, 0x0f, 0xea, 0x46,\n\t\t0x25, 0xf8, 0x3a, 0x91, 0x95, 0x8a, 0x11, 0x65, 0x43, 0xdd, 0xd6, 0x36,\n\t\t0x99, 0xa4, 0x17, 0x1d, 0xdf, 0x64, 0x5f, 0xad, 0x65, 0x57, 0xc7, 0x33,\n\t\t0x04, 0xbc, 0xf6, 0x29, 0xe8, 0x13, 0xf2, 0x79, 0x33, 0x3f, 0x45, 0x5e,\n\t\t0x02, 0x84, 0x2c, 0xf3, 0xbf, 0x21, 0x6f, 0x57, 0x49, 0x48, 0xb7, 0x3a,\n\t\t0xb7, 0xca, 0x2e, 0x4c, 0x94, 0x5f, 0x5d, 0xba, 0xa1, 0xc2, 0xe5, 0x76,\n\t\t0x38, 0x46, 0xf3, 0x2c, 0xd1, 0x8f, 0xcb, 0xb3, 0xa6, 0xb1, 0x6f, 0x9e,\n\t\t0x3f, 0x78, 0x5d, 0x1b, 0xa8, 0xfb, 0x18, 0xad, 0x67, 0xb0, 0xe9, 0x06,\n\t\t0x9a, 0xd7, 0x6a, 0xa3, 0x1e, 0x2e, 0xb4, 0xd1, 0xe0, 0xb5, 0x77, 0xbf,\n\t\t0xaa, 0x4f, 0xcc, 0x6b, 0xe6, 0xde, 0xf8, 0xd4, 0x18, 0x8e, 0x7a, 0xc4,\n\t\t0xff, 0xaf, 0xc2, 0xbc, 0xbe, 0x30, 0x3d, 0x62, 0xb4, 0xe6, 0xe4, 0x9d,\n\t\t0x70, 0x69, 0xd6, 0x2f, 0x50, 0xf2, 0x28, 0x1b, 0x6a, 0x3a, 0x06, 0x22,\n\t\t0xe3, 0xba, 0xe9, 0x4b, 0xb3, 0x47, 0x59, 0x83, 0x83, 0x83, 0xff, 0xb7,\n\t\t0x55, 0xbb, 0xcc, 0xcb, 0x17, 0x17, 0x08, 0x0f, 0x14, 0xd8, 0x82, 0xe2,\n\t\t0xe0, 0xb5, 0x0b, 0x53, 0xad, 0xdd, 0x79, 0x11, 0x19, 0x84, 0xa1, 0xe0,\n\t\t0xb5, 0xb7, 0xa9, 0xa2, 0x98, 0x84, 0xcc, 0x24, 0xe1, 0xe1, 0x24, 0xf3,\n\t\t0xfd, 0x24, 0x91, 0x31, 0xa8, 0xf5, 0x69, 0x64, 0x87, 0x39, 0x1b, 0x6c,\n\t\t0x1e, 0x2f, 0xf4, 0x14, 0x67, 0x10, 0x06, 0x03, 0x23, 0xde, 0xf0, 0xd3,\n\t\t0x25, 0x7f, 0x7f, 0x76, 0x86, 0x86, 0x56, 0x67, 0x1a, 0xff, 0x7f, 0xeb,\n\t\t0x43, 0xca, 0x11, 0x37, 0xd0, 0x6b, 0x8a, 0x9c, 0x4b, 0x49, 0xbd, 0x26,\n\t\t0x5d, 0xc7, 0x39, 0xb6, 0x8b, 0xef, 0x76, 0xd9, 0x53, 0x0f, 0xef, 0xb2,\n\t\t0x3d, 0xd2, 0x6a, 0xb9, 0xb7, 0xb9, 0xee, 0x3b, 0x04, 0x90, 0xff, 0xb9,\n\t\t0x2f, 0x75, 0xb8, 0xe0, 0x0c, 0xef, 0xe5, 0x36, 0x5b, 0xdf, 0xf1, 0xba,\n\t\t0x0a, 0x25, 0xaa, 0xa7, 0x21, 0x06, 0x98, 0x17, 0x63, 0xc4, 0xa4, 0x31,\n\t\t0xbc, 0x98, 0xba, 0xc1, 0x03, 0x16, 0x89, 0xeb, 0xf6, 0x6e, 0xe4, 0x15,\n\t\t0xb0, 0x44, 0x83, 0xb0, 0x9c, 0x13, 0xf9, 0x3e, 0xbe, 0x84, 0xd9, 0x20,\n\t\t0x85, 0x02, 0xa7, 0x43, 0x04, 0xd8, 0x0c, 0xaa, 0x55, 0xe4, 0x49, 0x05,\n\t\t0xa5, 0x22, 0x0f, 0x8f, 0x1e, 0xb2, 0xc4, 0xed, 0xc5, 0x86, 0xca, 0xb1,\n\t\t0xf3, 0xe3, 0x36, 0xae, 0x15, 0xd9, 0x2f, 0x64, 0x74, 0x15, 0x58, 0x86,\n\t\t0x01, 0x2e, 0xe1, 0x5a, 0x61, 0xf5, 0xe9, 0x0d, 0xa8, 0xe6, 0x4e, 0x35,\n\t\t0x66, 0x3a, 0xd6, 0x35, 0x01, 0x0b, 0x7b, 0x12, 0x11, 0x1b, 0x6b, 0xca,\n\t\t0x1a, 0x59, 0x98, 0x9e, 0x91, 0xeb, 0x74, 0xbf, 0xce, 0x41, 0xa0, 0x98,\n\t\t0x40, 0x07, 0x21, 0x96, 0xdb, 0x35, 0x78, 0x5b, 0x09, 0x93, 0x15, 0xe1,\n\t\t0xdb, 0xbb, 0xbf, 0x79, 0xac, 0x9a, 0x8c, 0x9d, 0x40, 0x93, 0x8b, 0xd0,\n\t\t0xb0, 0xcc, 0x9e, 0x28, 0xfd, 0x0d, 0x2f, 0xbb, 0x05, 0x62, 0xf5, 0x3d,\n\t\t0x8f, 0x0c, 0x68, 0x56, 0x50, 0x5e, 0xe5, 0x65, 0x6c, 0x50, 0x8a, 0xb2,\n\t\t0xb9, 0x75, 0x18, 0x6a, 0x9a, 0xeb, 0x01, 0x51, 0x20, 0x02, 0x00, 0x6b,\n\t\t0xd9, 0x95, 0xd2, 0x69, 0xc5, 0x7c, 0xc6, 0xdf, 0x28, 0xc7, 0xde, 0xcd,\n\t\t0xbe, 0xf1, 0x67, 0x9e, 0x32, 0xc6, 0x42, 0xdd, 0xfb, 0xcf, 0xe5, 0x72,\n\t\t0xd7, 0x36, 0x63, 0x33, 0x8a, 0xcf, 0xab, 0x56, 0x8d, 0x9b, 0x37, 0xed,\n\t\t0x17, 0x2c, 0xab, 0xbc, 0xc4, 0xc8, 0xe4, 0xc2, 0xb0, 0x45, 0x84, 0xde,\n\t\t0x5a, 0x70, 0xba, 0xb5, 0xa8, 0x67, 0x5f, 0xb1, 0xa8, 0x6e, 0x2b, 0x08,\n\t\t0xa9, 0x5a, 0xd5, 0x0f, 0x59, 0x90, 0xfc, 0x60, 0x48, 0x07, 0x2f, 0xbb,\n\t\t0xed, 0x84, 0xfb, 0x4d, 0xd9, 0x8c, 0x0c, 0xbb, 0xb9, 0x1f, 0x28, 0x02,\n\t\t0x51, 0x71, 0xa0, 0x9a, 0xc8, 0xf0, 0x10, 0x9c, 0xf0, 0xdb, 0xca, 0x64,\n\t\t0x37, 0x77, 0xb1, 0x5d, 0x92, 0xc1, 0x39, 0x96, 0x44, 0x26, 0xd7, 0x26,\n\t\t0x03, 0x52, 0x04, 0x48, 0x64, 0x3f, 0x1b, 0x53, 0xd6, 0x38, 0xab, 0x2c,\n\t\t0x8e, 0x6b, 0xe3, 0x7e, 0x46, 0xfa, 0x9b, 0xb0, 0x89, 0xad, 0x5f, 0x96,\n\t\t0x61, 0x61, 0x60, 0x2d, 0x33, 0x05, 0x95, 0xa0, 0x29, 0xfb, 0x65, 0x28,\n\t\t0x14, 0x1c, 0x94, 0x4e, 0x23, 0x18, 0x37, 0x87, 0x5a, 0x46, 0xee, 0xc4,\n\t\t0x7e, 0x1c, 0x8b, 0x8a, 0xf3, 0xac, 0x46, 0xcd, 0x8f, 0x9f, 0x2b, 0x3b,\n\t\t0xce, 0x38, 0x90, 0xf3, 0xef, 0x15, 0xfa, 0xd8, 0xe9, 0x4b, 0xfe, 0xf9,\n\t\t0x45, 0x2c, 0xb8, 0xf3, 0x00, 0xde, 0xd9, 0x81, 0xb0, 0x55, 0x59, 0x44,\n\t\t0x92, 0x37, 0xd1, 0x38, 0x91, 0x90, 0xee, 0xec, 0x68, 0x02, 0x23, 0xfa,\n\t\t0x6d, 0x05, 0xc4, 0x7f, 0xbc, 0xc2, 0x7c, 0x24, 0x5b, 0x9a, 0xc4, 0x4e,\n\t\t0xb3, 0xac, 0x00, 0xcc, 0xa7, 0xde, 0x32, 0x35, 0xf5, 0x5d, 0x4e, 0x45,\n\t\t0x4d, 0x1b, 0xf7, 0x98, 0xf5, 0x59, 0x3e, 0xc9, 0x4f, 0xbb, 0xc1, 0x48,\n\t\t0x41, 0x85, 0x68, 0x7d, 0x5f, 0x72, 0x20, 0xa4, 0xcf, 0x47, 0xa6, 0xa8,\n\t\t0xcb, 0x7a, 0xab, 0xe1, 0xf8, 0xa8, 0x8a, 0xa5, 0xf9, 0xfe, 0x89, 0x3d,\n\t\t0x9e, 0xbe, 0x6c, 0x4c, 0x70, 0xb3, 0xbf, 0xdf, 0xf4, 0xe6, 0x4f, 0x78,\n\t\t0x1f, 0x25, 0xca, 0x3c, 0x1e, 0xd1, 0x61, 0x3a, 0xda, 0xf7, 0xfa, 0xf5,\n\t\t0x7a, 0xc3, 0x7c, 0x14, 0x23, 0x28, 0x4b, 0x36, 0x78, 0xcd, 0xba, 0xdc,\n\t\t0x7f, 0xf5, 0x82, 0xf0, 0x1c, 0x5e, 0xd2, 0x19, 0x04, 0x1d, 0x43, 0x81,\n\t\t0x05, 0x97, 0x84, 0x87, 0xff, 0x4e, 0x04, 0xed, 0x45, 0xae, 0x7b, 0xa9,\n\t\t0x5b, 0xa6, 0xd0, 0x01, 0xdc, 0xbe, 0x3b, 0xd0, 0x9a, 0x1b, 0xfd, 0xf0,\n\t\t0x33, 0x58, 0xcb, 0x00, 0xfd, 0xf8, 0x2d, 0x30, 0x80, 0x12, 0x8c, 0x4c,\n\t\t0xfb, 0xf1, 0xe7, 0x0f, 0xe5, 0x00, 0x31, 0x0e, 0x24, 0x8f, 0xc1, 0x79,\n\t\t0x24, 0x2e, 0x35, 0xe1, 0x90, 0x77, 0x10, 0x79, 0xbf, 0x98, 0xd0, 0x08,\n\t\t0xa0, 0xb1, 0x39, 0x50, 0x70, 0xc9, 0x05, 0x91, 0x54, 0x4a, 0xbc, 0x26,\n\t\t0x5e, 0xa2, 0x47, 0x1c, 0xcf, 0x22, 0x1a, 0xa9, 0xda, 0x22, 0x98, 0x76,\n\t\t0x20, 0x30, 0xb4, 0x18, 0x05, 0x40, 0x67, 0x96, 0xef, 0x9b, 0x6b, 0x1a,\n\t\t0x9a, 0xe7, 0x3d, 0x49, 0x62, 0x00, 0x6b, 0xf7, 0x1b, 0xe3, 0x81, 0xfe,\n\t\t0x8f, 0x1d, 0xdb, 0x33, 0xf8, 0x8b, 0x24, 0x39, 0xe3, 0xdd, 0x2c, 0xfd,\n\t\t0x24, 0xb1, 0x31, 0xa8, 0x44, 0xf6, 0x89, 0x7a, 0x88, 0x45, 0x53, 0xab,\n\t\t0x47, 0x3f, 0x5c, 0xe1, 0x42, 0x1e, 0x27, 0xc2, 0xb4, 0x29, 0x40, 0xe6,\n\t\t0x9c, 0x2b, 0xae, 0x7f, 0x7f, 0xc3, 0x4c, 0x2e, 0xe0, 0x4c, 0x35, 0x28,\n\t\t0x34, 0xa3, 0x1d, 0xb8, 0x05, 0x33, 0xd0, 0x51, 0x31, 0x29, 0x31, 0x21,\n\t\t0x62, 0x7d, 0x2a, 0x2e, 0xfb, 0xed, 0x0a, 0xf8, 0x7a, 0x83, 0xfc, 0xd5,\n\t\t0xd4, 0x7d, 0x33, 0x0c, 0x9f, 0x37, 0x02, 0xd4, 0xf7, 0x44, 0xbc, 0x57,\n\t\t0x80, 0x35, 0x1a, 0x36, 0x67, 0xae, 0xba, 0x8d, 0xb8, 0x42, 0xff, 0x0c,\n\t\t0xdf, 0x13, 0xfd, 0x83, 0x1c, 0x63, 0x1d, 0xf0, 0x51, 0x0e, 0x71, 0xf6,\n\t\t0xa5, 0x41, 0x7d, 0x1c, 0xfc, 0xe4, 0xb6, 0x62, 0x7d, 0xa6, 0x63, 0x7d,\n\t\t0xeb, 0x0f, 0x0e, 0x80, 0x4e, 0xeb, 0xa7, 0x76, 0xd3, 0xb1, 0x66, 0x7f,\n\t\t0xce, 0xd2, 0xe9, 0x41, 0x9e, 0x06, 0x17, 0xa9, 0x93, 0x0c, 0xa8, 0x21,\n\t\t0xc5, 0xe4, 0x76, 0xd1, 0x30, 0xb6, 0x17, 0x92, 0xf2, 0xec, 0xdd, 0x94,\n\t\t0xc6, 0xad, 0x9b, 0x45, 0x1e, 0x91, 0xbf, 0x72, 0xc6, 0x7f, 0xa8, 0x9e,\n\t\t0x78, 0xf1, 0x4a, 0x45, 0x93, 0x88, 0xc5, 0x99, 0x68, 0x6a, 0xc2, 0xe9,\n\t\t0x99, 0x66, 0x74, 0x23, 0x26, 0xb0, 0x30, 0x07, 0xc9, 0x09, 0x21, 0xdd,\n\t\t0x51, 0x91, 0x8a, 0x09, 0x11, 0x50, 0x8f, 0x4e, 0x4b, 0x31, 0x97, 0xa5,\n\t\t0xf5, 0x8e, 0x2b, 0x11, 0x00, 0x55, 0x1e, 0x56, 0x56, 0x1f, 0xf0, 0xd0,\n\t\t0x3a, 0x1c, 0xe3, 0xec, 0xc3, 0x84, 0x94, 0xcb, 0x80, 0x94, 0x3b, 0xe6,\n\t\t0x4d, 0x88, 0x4f, 0x7f, 0x31, 0x57, 0x5f, 0xd7, 0xb7, 0x0a, 0x41, 0xb1,\n\t\t0xdf, 0x93, 0xa6, 0xf6, 0x76, 0xb4, 0xb8, 0x40, 0xcb, 0xcb, 0xea, 0x99,\n\t\t0x7f, 0x49, 0x14, 0xae, 0xc1, 0xf2, 0x38, 0x2e, 0xb9, 0x70, 0x6e, 0x7b,\n\t\t0x55, 0x5e, 0x8a, 0x2a, 0xf5, 0x10, 0x4d, 0xdf, 0xff, 0xfc, 0xf8, 0x04,\n\t\t0x91, 0xc7, 0x57, 0xf6, 0x88, 0x22, 0x17, 0xff, 0xe1, 0xc8, 0xfd, 0x06,\n\t\t0x20, 0x1d, 0xe1, 0x67, 0x2f, 0xa8, 0xe8, 0x15, 0xc9, 0x14, 0x65, 0xc7,\n\t\t0x18, 0x92, 0x81, 0xe2, 0x56, 0x02, 0x40, 0x11, 0xcd, 0x17, 0xdc, 0x25,\n\t\t0x24, 0x9f, 0x30, 0xc3, 0x91, 0x9a, 0x03, 0x41, 0xd4, 0x47, 0x8c, 0x5b,\n\t\t0xf6, 0x76, 0x90, 0x0e, 0x78, 0xc0, 0x82, 0xc0, 0xf7, 0xb5, 0x53, 0x3e,\n\t\t0x1d, 0x85, 0x10, 0xd2, 0x42, 0x71, 0x94, 0x37, 0x26, 0x8d, 0x3f, 0x5f,\n\t\t0x61, 0xeb, 0xd4, 0xb2, 0x72, 0x46, 0xf2, 0x3d, 0xc2, 0xd2, 0xfc, 0x6c,\n\t\t0x23, 0x47, 0xd3, 0x98, 0x87, 0x9f, 0x0c, 0xcd, 0xa9, 0x3e, 0xec, 0xe8,\n\t\t0x6c, 0x48, 0x75, 0x6c, 0x9b, 0x22, 0x45, 0x8d, 0x62, 0x7f, 0x3d, 0x12,\n\t\t0x4b, 0xa5, 0x3d, 0x3f, 0xd8, 0xe6, 0x3a, 0x02, 0x2d, 0xc9, 0x55, 0x54,\n\t\t0x47, 0x08, 0xb8, 0x51, 0xcf, 0x96, 0x6d, 0xb6, 0x16, 0xbe, 0xf6, 0x96,\n\t\t0x00, 0x4b, 0xcb, 0x02, 0xd1, 0xc7, 0x1c, 0xe1, 0xaa, 0xed, 0x29, 0x8a,\n\t\t0xe4, 0x43, 0x04, 0x8f, 0x71, 0x7a, 0x02, 0x46, 0xde, 0xdf, 0x90, 0xa4,\n\t\t0xf7, 0x52, 0x69, 0xe7, 0x79, 0x4b, 0x91, 0x3c, 0xc8, 0xa0, 0x3e, 0xef,\n\t\t0x25, 0xab, 0xb5, 0xdb, 0xff, 0x48, 0x23, 0xf8, 0xa8, 0x17, 0xa5, 0x69,\n\t\t0xf2, 0xd0, 0xea, 0xdd, 0x58, 0x27, 0xec, 0xd4, 0xe3, 0x39, 0x75, 0x20,\n\t\t0x65, 0x19, 0x40, 0x25, 0x9a, 0xca, 0xbd, 0x6d, 0x92, 0x73, 0x9a, 0xe0,\n\t\t0x27, 0xc4, 0x0b, 0x5e, 0x53, 0xc4, 0x26, 0x95, 0x6b, 0x36, 0x4e, 0x1d,\n\t\t0x47, 0x00, 0xec, 0x5d, 0xe0, 0x92, 0xf8, 0x6c, 0x49, 0x74, 0x88, 0xb4,\n\t\t0x0e, 0x10, 0x71, 0xcd, 0xe8, 0x5b, 0x7a, 0x46, 0xd4, 0xca, 0xd5, 0x3d,\n\t\t0xcf, 0x50, 0x0f, 0x31, 0x85, 0x45, 0x12, 0x91, 0x78, 0xb9, 0xda, 0xb4,\n\t\t0x96, 0xc1, 0x82, 0xbc, 0x15, 0x4f, 0x59, 0xcf, 0x7c, 0xe4, 0xfe, 0x9b,\n\t\t0xe6, 0x4b, 0xad, 0xbb, 0xbd, 0x5e, 0x31, 0xc7, 0x7f, 0x23, 0x9c, 0x4d,\n\t\t0x03, 0x08, 0x41, 0x83, 0xbf, 0xe2, 0xe3, 0x97, 0xcf, 0x19, 0x88, 0x7a,\n\t\t0x5f, 0xa3, 0xa6, 0x09, 0x9a, 0xc5, 0x93, 0xaa, 0x7b, 0x15, 0x96, 0xfc,\n\t\t0x02, 0x0c, 0x00, 0x1d, 0xca, 0x21, 0x10, 0x30, 0x48, 0xff, 0x89, 0x07,\n\t\t0x28, 0xc5, 0x66, 0x44, 0xa7, 0x1e, 0xe3, 0x89, 0xd7, 0xaf, 0x97, 0xca,\n\t\t0x24, 0x6d, 0xe3, 0x1d, 0x80, 0x9a, 0x0f, 0x83, 0xef, 0xdb, 0x37, 0xc0,\n\t\t0x8e, 0xac, 0x00, 0x6c, 0xbf, 0x01, 0x3f, 0xda, 0xdf, 0x09, 0x9f, 0x36,\n\t\t0x68, 0x08, 0x06, 0xb3, 0x36, 0xee, 0x6b, 0x28, 0xcb, 0x27, 0xa5, 0x6f,\n\t\t0x49, 0x40, 0x34, 0xc0, 0x64, 0x65, 0x07, 0x5d, 0xa4, 0x28, 0xe9, 0xd9,\n\t\t0x1c, 0xc4, 0x42, 0x2d, 0xf7, 0xcc, 0x14, 0x3e, 0x02, 0x35, 0x54, 0x7c,\n\t\t0x38, 0xc0, 0xb5, 0xfb, 0x2e, 0x82, 0xed, 0xbf, 0xec, 0x37, 0xd3, 0x93,\n\t\t0x91, 0x95, 0x00, 0xcc, 0x1b, 0x83, 0x9a, 0x57, 0x16, 0x8c, 0xf8, 0x4d,\n\t\t0x5e, 0x4e, 0x0d, 0x1b, 0xc3, 0xc2, 0xec, 0xa7, 0x26, 0x84, 0xe4, 0x11,\n\t\t0x72, 0x9b, 0x0d, 0xf5, 0x7e, 0xae, 0xa6, 0xa4, 0x57, 0x14, 0x4c, 0x86,\n\t\t0x59, 0x30, 0xa8, 0xbb, 0xfe, 0xc3, 0x5a, 0xa3, 0x40, 0xcd, 0x65, 0xce,\n\t\t0x69, 0xff, 0xa6, 0xe7, 0xdd, 0x88, 0xa8, 0xaa, 0xc9, 0x99, 0x26, 0x1b,\n\t\t0x42, 0x80, 0xe0, 0x26, 0x26, 0x03, 0xcd, 0x33, 0x05, 0xab, 0x2b, 0xe5,\n\t\t0x44, 0xc6, 0x7a, 0xf3, 0xdd, 0x0f, 0xb6, 0x1a, 0x06, 0x28, 0xca, 0x1c,\n\t\t0xd9, 0x50, 0xa4, 0x8c, 0xb7, 0xbb, 0xc8, 0x88, 0x28, 0xd0, 0x00, 0xe0,\n\t\t0xda, 0xc5, 0x8a, 0x6c, 0xcd, 0xf8, 0x8d, 0xed, 0x8c, 0x88, 0x11, 0x11,\n\t\t0xa8, 0xeb, 0x43, 0x94, 0x24, 0xee, 0x01, 0xd1, 0x7c, 0x8c, 0x17, 0x99,\n\t\t0xe8, 0x8e, 0x5d, 0x16, 0x90, 0x6f, 0x93, 0xf5, 0xab, 0x1c, 0x21, 0xa0,\n\t\t0xf0, 0x92, 0xd5, 0x87, 0x4e, 0xd4, 0x7b, 0xc9, 0x31, 0xb2, 0x32, 0x6b,\n\t\t0x6f, 0x6c, 0x8c, 0xfd, 0xf7, 0x00, 0x59, 0xfc, 0x72, 0xd6, 0xff, 0x7c,\n\t\t0x2f, 0xfc, 0xfd, 0x1c, 0x22, 0xb5, 0xb2, 0xd7, 0xf3, 0x1c, 0xcc, 0x3a,\n\t\t0xe0, 0x72, 0xa5, 0xaf, 0xf7, 0xdb, 0xa1, 0x40, 0x76, 0xcd, 0x14, 0x30,\n\t\t0x0c, 0x20, 0xe7, 0xd5, 0xdc, 0x14, 0x67, 0x01, 0xdf, 0x48, 0xf0, 0x22,\n\t\t0x3f, 0x62, 0xcd, 0x13, 0x28, 0xd6, 0xf2, 0xf6, 0x14, 0xfe, 0xaa, 0x93,\n\t\t0x5a, 0xc3, 0xd2, 0x2f, 0xcf, 0xc9, 0xe4, 0x94, 0xb9, 0x5c, 0x46, 0x2a,\n\t\t0xdf, 0xf6, 0xc9, 0x16, 0xb8, 0xf4, 0x7e, 0x61, 0xe5, 0x47, 0xac, 0xff,\n\t\t0x37, 0x80, 0x09, 0x87, 0xe6, 0xf4, 0x7c, 0x1a, 0xfd, 0x49, 0x97, 0xfc,\n\t\t0x7f, 0xea, 0x15, 0x3f, 0xf5, 0x27, 0x05, 0xb2, 0xc9, 0x6d, 0xaa, 0x87,\n\t\t0xe1, 0xe9, 0x4f, 0xa0, 0x06, 0x20, 0x80, 0x08, 0x78, 0xee, 0x5c, 0xb6,\n\t\t0x64, 0x74, 0x6c, 0x18, 0xcf, 0x82, 0x54, 0xd5, 0x48, 0x7c, 0x01, 0x50,\n\t\t0x0e, 0x97, 0x33, 0xe1, 0xd1, 0x83, 0xd3, 0xe1, 0x48, 0x6e, 0xee, 0xf7,\n\t\t0x5f, 0x6d, 0x1f, 0x03, 0x9c, 0x74, 0xcf, 0x97, 0x66, 0x95, 0x95, 0x71,\n\t\t0x3e, 0x82, 0x0d, 0xc8, 0xa8, 0x92, 0x64, 0xc1, 0x9a, 0xd8, 0xc6, 0x20,\n\t\t0x4c, 0x32, 0x6c, 0x1b, 0xf0, 0xa5, 0xcb, 0xa4, 0x0b, 0xdd, 0x42, 0x08,\n\t\t0x54, 0x13, 0xec, 0xe6, 0x6b, 0xa2, 0x49, 0x96, 0x9c, 0xd9, 0x25, 0x12,\n\t\t0x48, 0x10, 0xc4, 0xc1, 0xd1, 0x99, 0xf5, 0xc4, 0x36, 0x56, 0x12, 0xed,\n\t\t0x23, 0x02, 0x21, 0x43, 0xa2, 0x8c, 0x3e, 0xdb, 0xdf, 0x7a, 0xd8, 0x32,\n\t\t0xed, 0xf7, 0xc0, 0xf4, 0x79, 0x51, 0x85, 0x94, 0x29, 0x4f, 0x3b, 0x7d,\n\t\t0xe4, 0x54, 0x94, 0x7d, 0x2b, 0xef, 0xa0, 0x74, 0x63, 0x47, 0x2c, 0x9b,\n\t\t0xd1, 0x71, 0xca, 0x64, 0x41, 0x7d, 0xbe, 0x44, 0xeb, 0x25, 0xcb, 0x53,\n\t\t0xb0, 0x46, 0x1d, 0x8a, 0x39, 0x30, 0x55, 0xf0, 0x7e, 0xb4, 0x17, 0xda,\n\t\t0x34, 0x35, 0xb9, 0x7f, 0xc1, 0x85, 0x2c, 0x95, 0x66, 0xe5, 0xd1, 0xb9,\n\t\t0x46, 0xa0, 0x6d, 0x47, 0xee, 0xc4, 0x3f, 0x0e, 0x91, 0x1a, 0xc7, 0x0b,\n\t\t0x9e, 0x2c, 0x45, 0x25, 0xf0, 0x63, 0xdd, 0x15, 0x09, 0x2f, 0x8d, 0x1b,\n\t\t0xde, 0x4b, 0x39, 0x1c, 0xbb, 0xf2, 0xc8, 0x12, 0x09, 0xe1, 0xfc, 0x90,\n\t\t0xc4, 0xc4, 0x44, 0xe9, 0x09, 0x7b, 0xb5, 0xf4, 0x40, 0x54, 0xb0, 0x85,\n\t\t0x8c, 0xd2, 0x87, 0x68, 0x06, 0x04, 0x08, 0xd3, 0x63, 0xcb, 0xd8, 0x8b,\n\t\t0x75, 0x89, 0x3c, 0xb1, 0x3e, 0xad, 0x16, 0xc1, 0xc2, 0x1f, 0x4d, 0x3c,\n\t\t0xfe, 0x2f, 0x5d, 0x60, 0x85, 0xa8, 0xd3, 0xda, 0x45, 0xd9, 0xe2, 0x52,\n\t\t0xe2, 0x5f, 0x89, 0xce, 0x23, 0xc4, 0xb4, 0x99, 0x6b, 0x5a, 0x6c, 0xe1,\n\t\t0x1d, 0xcb, 0x67, 0x87, 0x0f, 0x9c, 0xa5, 0x1f, 0x97, 0x54, 0x80, 0xb0,\n\t\t0xf1, 0x40, 0xc5, 0x07, 0xbd, 0xbf, 0xd5, 0x57, 0x85, 0xdb, 0x63, 0xc2,\n\t\t0x20, 0x08, 0xe3, 0xb2, 0xb3, 0x12, 0xdf, 0x3c, 0x6b, 0x4b, 0xf1, 0x44,\n\t\t0xde, 0x32, 0xbd, 0xcb, 0x80, 0xbf, 0xdd, 0x9f, 0xa5, 0x9f, 0x92, 0x6b,\n\t\t0xfd, 0xcf, 0x5b, 0x03, 0xc7, 0xb1, 0xe7, 0xf4, 0x18, 0x90, 0xbc, 0x3b,\n\t\t0xc2, 0x5e, 0xf6, 0x26, 0xce, 0xfe, 0xce, 0x14, 0xbe, 0x1e, 0x4b, 0x31,\n\t\t0xd5, 0x96, 0x79, 0x71, 0x94, 0xbe, 0x23, 0x7f, 0x24, 0x2b, 0xb9, 0xe0,\n\t\t0x2d, 0xde, 0x56, 0x6f, 0x5c, 0x08, 0x6c, 0x16, 0xfb, 0xb1, 0x71, 0x26,\n\t\t0x63, 0x39, 0x88, 0xf1, 0x3d, 0xe7, 0xf4, 0x48, 0x94, 0x93, 0x55, 0xc6,\n\t\t0xd3, 0x13, 0xde, 0xe2, 0x63, 0xcb, 0xdf, 0x75, 0x38, 0x10, 0xb1, 0x43,\n\t\t0xdd, 0xa2, 0x4a, 0xae, 0x86, 0x7a, 0x11, 0xfc, 0x7b, 0x50, 0x0e, 0xa4,\n\t\t0x63, 0x04, 0xf0, 0x39, 0x49, 0x50, 0xdb, 0xa9, 0x9e, 0xfb, 0xfb, 0xbb,\n\t\t0x60, 0x0f, 0x16, 0x84, 0x17, 0xb5, 0xc1, 0x26, 0x07, 0x67, 0xa9, 0xf3,\n\t\t0x53, 0x98, 0x3a, 0xe5, 0x42, 0xf9, 0x32, 0x7a, 0xf0, 0x93, 0xdd, 0x0c,\n\t\t0xdb, 0x4e, 0x87, 0x35, 0x2e, 0x45, 0x51, 0xa7, 0x3f, 0xe4, 0x49, 0xcf,\n\t\t0xc8, 0xb1, 0x21, 0x7f, 0xf8, 0xd3, 0xc5, 0x12, 0xf0, 0x9b, 0x16, 0xdd,\n\t\t0x2d, 0xf1, 0xb6, 0x58, 0x8b, 0x5d, 0xe1, 0xd2, 0xfe, 0xa9, 0x7c, 0x5d,\n\t\t0x68, 0x32, 0xea, 0xd6, 0xea, 0x89, 0xa3, 0x29, 0x42, 0x31, 0x7c, 0x0f,\n\t\t0x2c, 0x4d, 0x77, 0x64, 0xe7, 0x3e, 0xe7, 0x20, 0x20, 0xe5, 0xf8, 0x0a,\n\t\t0x68, 0x1c, 0x91, 0x9a, 0x62, 0x78, 0x72, 0xca, 0x37, 0x7b, 0x91, 0x2e,\n\t\t0xc2, 0x93, 0xc8, 0x4f, 0xa7, 0x21, 0x1c, 0xc8, 0x07, 0xec, 0x83, 0xc9,\n\t\t0xb7, 0x65, 0x63, 0x1d, 0x29, 0x07, 0x64, 0x4c, 0xf4, 0x5f, 0xf2, 0xda,\n\t\t0x4d, 0xb0, 0xba, 0x86, 0xe7, 0x8b, 0x8a, 0x7e, 0x1b, 0x89, 0xb1, 0x6b,\n\t\t0x2d, 0x2b, 0xe2, 0xa6, 0x73, 0x68, 0xe4, 0xe2, 0xee, 0x58, 0x55, 0xfe,\n\t\t0xa1, 0xfa, 0x12, 0xfd, 0x09, 0xec, 0xfa, 0xef, 0x59, 0xd1, 0xbb, 0xca,\n\t\t0x8d, 0x82, 0x94, 0xcd, 0xfd, 0x8f, 0x18, 0xd8, 0x16, 0xd7, 0x67, 0x3b,\n\t\t0x38, 0x44, 0x44, 0xa1, 0x7a, 0xc5, 0x2f, 0x4d, 0x4d, 0x19, 0xf8, 0xf9,\n\t\t0xf9, 0x9d, 0x0f, 0x16, 0x44, 0x59, 0xd8, 0xd8, 0xd0, 0x63, 0x5f, 0x8e,\n\t\t0xbc, 0xea, 0x02, 0x11, 0x54, 0xcf, 0xda, 0x67, 0x96, 0x14, 0x5d, 0x37,\n\t\t0x12, 0x8c, 0xd1, 0xc5, 0xe7, 0x05, 0xc2, 0x90, 0x37, 0xa5, 0xae, 0x22,\n\t\t0x23, 0xb5, 0xa6, 0x01, 0x89, 0xc6, 0x24, 0x00, 0xa3, 0xb9, 0xe8, 0xbd,\n\t\t0x7b, 0x4b, 0xd5, 0x6e, 0xf2, 0x2d, 0xa4, 0x7a, 0xd6, 0xce, 0x82, 0x5a,\n\t\t0xae, 0x31, 0x48, 0xf0, 0x6b, 0x0e, 0x74, 0xd9, 0xdc, 0x71, 0xc9, 0xb4,\n\t\t0xca, 0x12, 0xf7, 0xa0, 0x61, 0x8b, 0xa1, 0xee, 0xe6, 0xdb, 0xb7, 0x6f,\n\t\t0x16, 0x5b, 0x23, 0xe9, 0xca, 0xca, 0xca, 0xed, 0xc7, 0xeb, 0x7d, 0x2e,\n\t\t0x17, 0x7b, 0x06, 0x02, 0x02, 0x02, 0x08, 0x50, 0xfd, 0x90, 0x23, 0x4f,\n\t\t0x03, 0x3e, 0x87, 0x59, 0x9e, 0xd6, 0x4b, 0x07, 0x0f, 0x11, 0xb9, 0x8c,\n\t\t0xc4, 0x8d, 0x3c, 0xbc, 0x3a, 0x76, 0x08, 0x25, 0xb0, 0x11, 0x7b, 0x7d,\n\t\t0x0c, 0x81, 0x72, 0xa9, 0x85, 0xab, 0xee, 0x2c, 0xf3, 0x43, 0x96, 0x0e,\n\t\t0x1c, 0x34, 0xd0, 0x84, 0xfc, 0x0f, 0xe7, 0x52, 0xfd, 0x6e, 0xaf, 0x8e,\n\t\t0x29, 0x17, 0x02, 0xb6, 0xc7, 0xb2, 0x51, 0xef, 0xed, 0x3d, 0x05, 0xf8,\n\t\t0x9f, 0x75, 0x73, 0x24, 0x3d, 0x62, 0x54, 0xfa, 0xa1, 0xb9, 0xb2, 0x3b,\n\t\t0xbb, 0x76, 0xf6, 0x84, 0x11, 0x34, 0xe8, 0x5f, 0x30, 0x1e, 0x99, 0xf6,\n\t\t0xbe, 0x92, 0xa5, 0xd6, 0xd4, 0x38, 0xdd, 0x18, 0x7c, 0xee, 0xca, 0x6e,\n\t\t0x1a, 0x58, 0x97, 0xa6, 0xf3, 0xed, 0x3b, 0x50, 0xc6, 0x80, 0xa5, 0xa1,\n\t\t0xc3, 0x8b, 0xf6, 0xd5, 0xd8, 0xaf, 0x75, 0xcc, 0x4f, 0x9e, 0x8c, 0x35,\n\t\t0x79, 0x1e, 0xaa, 0x49, 0x49, 0x71, 0x70, 0xe0, 0xbc, 0x9b, 0x2e, 0xeb,\n\t\t0x59, 0xed, 0x0a, 0x75, 0xf9, 0x5b, 0x5a, 0x27, 0x36, 0xa5, 0xff, 0x84,\n\t\t0x2b, 0x89, 0xf4, 0x46, 0xb7, 0xa8, 0x3f, 0x5f, 0x3e, 0xd4, 0x1f, 0xe2,\n\t\t0x61, 0xde, 0x2f, 0x15, 0x45, 0x22, 0x06, 0xa5, 0xdb, 0xda, 0xac, 0xd0,\n\t\t0xb3, 0x5a, 0x29, 0xd5, 0x33, 0x67, 0x46, 0x78, 0xc5, 0x84, 0xef, 0x1a,\n\t\t0x3a, 0x2c, 0xaf, 0xcf, 0x05, 0x66, 0x48, 0x07, 0x48, 0x29, 0x1c, 0x9f,\n\t\t0x9c, 0xf0, 0xc0, 0x08, 0xd6, 0x7b, 0xa3, 0xba, 0xca, 0x4c, 0x9a, 0x9c,\n\t\t0x57, 0xda, 0xd1, 0xce, 0x76, 0x26, 0x0a, 0x2a, 0x7b, 0xb3, 0x2b, 0x67,\n\t\t0x5d, 0xcd, 0xd4, 0x5f, 0x07, 0xd8, 0xf9, 0x63, 0x07, 0xef, 0x9d, 0xa2,\n\t\t0x8a, 0x59, 0xc7, 0x64, 0x1e, 0x94, 0x30, 0x5b, 0xe4, 0x46, 0x85, 0x88,\n\t\t0xc5, 0x9f, 0xf1, 0xe3, 0x25, 0xa6, 0x28, 0x2e, 0xf5, 0x9e, 0x37, 0xe7,\n\t\t0x5d, 0x59, 0x0d, 0x65, 0x74, 0xbc, 0xfc, 0x47, 0x05, 0x4b, 0xe1, 0x7d,\n\t\t0x8b, 0x6e, 0x01, 0x83, 0xf1, 0x01, 0x36, 0x36, 0x5d, 0x9b, 0x5a, 0x6c,\n\t\t0xd1, 0xc0, 0xae, 0xfb, 0xe4, 0x98, 0xf3, 0xa8, 0x83, 0xa8, 0x70, 0x98,\n\t\t0xba, 0xd1, 0xef, 0xaa, 0x48, 0xb8, 0x7d, 0x36, 0xe9, 0x5a, 0x29, 0x40,\n\t\t0x50, 0xe4, 0x5f, 0x57, 0xb4, 0x84, 0xfc, 0x6f, 0xbd, 0xce, 0xb6, 0xc7,\n\t\t0xd7, 0xc3, 0x47, 0x17, 0xcb, 0xcd, 0xa4, 0xf7, 0x66, 0xab, 0xb1, 0xa1,\n\t\t0x50, 0x68, 0x14, 0x6b, 0x34, 0x28, 0xeb, 0x02, 0x3b, 0x6b, 0x34, 0x31,\n\t\t0x73, 0xa1, 0x0f, 0x28, 0x97, 0xf0, 0xf5, 0x05, 0xc3, 0xf9, 0x2a, 0x87,\n\t\t0xb5, 0x99, 0xd5, 0xb1, 0xbf, 0x02, 0x07, 0x1e, 0xec, 0x08, 0x8e, 0x3d,\n\t\t0x7d, 0x57, 0xac, 0x68, 0x3a, 0xe9, 0x7d, 0x2d, 0x21, 0xf8, 0xe6, 0x4f,\n\t\t0x42, 0xf1, 0x80, 0xe5, 0x56, 0x3f, 0xd4, 0x0d, 0xed, 0x0a, 0x8a, 0x8a,\n\t\t0x42, 0x49, 0xfa, 0x9d, 0x1f, 0xab, 0xd2, 0x65, 0xc8, 0xfc, 0x9e, 0xfe,\n\t\t0xf8, 0x08, 0x40, 0x58, 0x4c, 0x38, 0xf2, 0xfe, 0xb1, 0x94, 0xfe, 0xad,\n\t\t0x30, 0x6f, 0x2f, 0x77, 0xeb, 0x0b, 0x48, 0x9e, 0x36, 0x40, 0x50, 0x17,\n\t\t0x5f, 0xd3, 0xb9, 0xad, 0x14, 0x73, 0x89, 0x89, 0x24, 0x8e, 0x64, 0x42,\n\t\t0x4d, 0x6d, 0xfa, 0x63, 0x21, 0xca, 0x2a, 0x2a, 0x1d, 0xb9, 0x31, 0x52,\n\t\t0x73, 0xfa, 0x16, 0x0c, 0xc3, 0xfa, 0x3b, 0x8e, 0xa5, 0x1e, 0xb7, 0x59,\n\t\t0x84, 0x2d, 0xb1, 0x44, 0x28, 0x2a, 0xd7, 0x80, 0xda, 0x61, 0xa6, 0xc8,\n\t\t0x0c, 0x20, 0xc1, 0x4e, 0x64, 0x9e, 0x4f, 0xe8, 0x2b, 0x8f, 0x07, 0xb8,\n\t\t0xad, 0x5e, 0x4b, 0x9e, 0xeb, 0x84, 0x4a, 0x38, 0x3a, 0x0d, 0xd8, 0x0a,\n\t\t0x58, 0x9c, 0xef, 0x4e, 0xa5, 0x88, 0xb9, 0x3f, 0x03, 0x05, 0x9e, 0x5e,\n\t\t0xd3, 0x96, 0xfe, 0xfe, 0xc2, 0x2c, 0xb6, 0x78, 0xe5, 0x4f, 0xef, 0xcf,\n\t\t0xc7, 0x08, 0xec, 0x71, 0x1c, 0xd1, 0x7c, 0x85, 0x85, 0x46, 0xcf, 0x7f,\n\t\t0xd0, 0x08, 0x5a, 0x2f, 0x79, 0x30, 0x73, 0xa4, 0x93, 0xae, 0xa5, 0xb7,\n\t\t0xce, 0xd5, 0x4e, 0x5b, 0x19, 0xe5, 0x8e, 0x9b, 0x1f, 0x2c, 0x34, 0x30,\n\t\t0x34, 0x65, 0x30, 0xe1, 0xe8, 0x57, 0xac, 0x4c, 0xbf, 0x34, 0xb5, 0x6c,\n\t\t0x10, 0xea, 0xb7, 0x50, 0xb9, 0x69, 0xea, 0xe3, 0x9e, 0x09, 0x46, 0xd1,\n\t\t0x43, 0xa0, 0x70, 0x0c, 0x7c, 0x67, 0xaa, 0x1a, 0xfb, 0xfe, 0x2c, 0x74,\n\t\t0xe0, 0xac, 0x3e, 0x1d, 0xcc, 0xf3, 0xc5, 0x87, 0x8d, 0xf2, 0x86, 0x28,\n\t\t0xd3, 0xf9, 0xe9, 0x87, 0x95, 0x8f, 0xd8, 0x60, 0x06, 0x86, 0x83, 0xf1,\n\t\t0xbf, 0x1a, 0x48, 0x91, 0x71, 0x2b, 0xa4, 0xd8, 0xd6, 0xef, 0x26, 0x09,\n\t\t0x9f, 0x0e, 0xee, 0x70, 0x60, 0xa9, 0xe8, 0x69, 0xeb, 0xaa, 0x4a, 0x32,\n\t\t0x38, 0x76, 0xf3, 0xff, 0x3c, 0xb7, 0xc6, 0x9d, 0xfb, 0xdb, 0x34, 0x58,\n\t\t0x98, 0xc3, 0x9f, 0x6c, 0x0e, 0x7f, 0xdd, 0x3a, 0x7e, 0xf7, 0xa2, 0xb7,\n\t\t0xc2, 0x61, 0x96, 0x5f, 0x39, 0x7e, 0x92, 0x2a, 0xa2, 0xc1, 0x4c, 0xa6,\n\t\t0x9d, 0xfe, 0xc7, 0xbd, 0x3c, 0x3e, 0xb0, 0xb9, 0xac, 0x89, 0x08, 0xb3,\n\t\t0x3d, 0x43, 0x51, 0xc7, 0xfb, 0x59, 0xef, 0x9e, 0x99, 0x1b, 0xb5, 0x78,\n\t\t0xb5, 0xd9, 0xe5, 0x87, 0x7b, 0xcf, 0xe4, 0x42, 0x63, 0x71, 0x2d, 0x7f,\n\t\t0x7f, 0x29, 0xb6, 0xd7, 0x19, 0x91, 0x01, 0xb7, 0xeb, 0x8c, 0xb1, 0x56,\n\t\t0xd4, 0xb9, 0x8a, 0x51, 0x9d, 0xe9, 0x9e, 0x4b, 0xb3, 0xfa, 0x7f, 0x63,\n\t\t0xed, 0xed, 0xe3, 0xcb, 0x4e, 0xfa, 0x83, 0x9b, 0x78, 0x51, 0x65, 0x13,\n\t\t0x79, 0x27, 0xa6, 0x6d, 0x2c, 0xeb, 0x42, 0xad, 0x6e, 0x6d, 0xa8, 0x12,\n\t\t0x07, 0x76, 0xb2, 0xa8, 0x9c, 0xab, 0xf0, 0x9a, 0xb5, 0xa9, 0x98, 0xdd,\n\t\t0x1f, 0xb6, 0x32, 0x2c, 0xa5, 0x88, 0xa0, 0xe4, 0xb9, 0x98, 0x11, 0x5c,\n\t\t0xfe, 0x70, 0x28, 0xb9, 0xb7, 0xd4, 0x42, 0xcb, 0xe8, 0x77, 0x46, 0x7c,\n\t\t0x71, 0xb8, 0x4c, 0x04, 0xc2, 0x21, 0x24, 0x74, 0x2c, 0xdb, 0x6a, 0xde,\n\t\t0xa4, 0x88, 0x31, 0x69, 0x8e, 0x00, 0xc4, 0x1c, 0x59, 0x5f, 0x43, 0x83,\n\t\t0x37, 0xb7, 0x67, 0xf1, 0x70, 0x74, 0x75, 0x43, 0xb0, 0x2a, 0xd0, 0xc4,\n\t\t0xbb, 0x74, 0x8a, 0xf6, 0x35, 0x3d, 0x17, 0x86, 0xb0, 0x32, 0xf7, 0xe5,\n\t\t0xfb, 0xce, 0x54, 0xbc, 0xc5, 0xc1, 0xc3, 0x3b, 0x99, 0x71, 0x4f, 0x2f,\n\t\t0x88, 0x35, 0x69, 0x74, 0x7b, 0x1a, 0x78, 0x0a, 0xef, 0x11, 0x26, 0x7e,\n\t\t0x24, 0xb1, 0x5d, 0x19, 0xe1, 0x89, 0x92, 0xa2, 0x6b, 0x8f, 0x64, 0xc9,\n\t\t0xb7, 0x9b, 0xfd, 0xca, 0x2a, 0x74, 0x50, 0x0c, 0xc7, 0xe5, 0x70, 0xeb,\n\t\t0xcf, 0x53, 0x7b, 0x4b, 0x05, 0x3f, 0xa6, 0x17, 0xd7, 0xf7, 0xf6, 0xf6,\n\t\t0x3e, 0x3d, 0x14, 0xf7, 0x3c, 0x50, 0x50, 0x57, 0x27, 0xc0, 0xc3, 0xc3,\n\t\t0x4b, 0x1b, 0xb2, 0x6c, 0x80, 0x74, 0x2e, 0xba, 0x2c, 0x52, 0xb3, 0xba,\n\t\t0xe5, 0x88, 0xf4, 0x4e, 0x72, 0x27, 0xd4, 0x66, 0xda, 0x8f, 0x93, 0x30,\n\t\t0x21, 0x38, 0xd6, 0xdb, 0xc7, 0x2d, 0x9b, 0xdb, 0x7c, 0xaa, 0xe7, 0x1b,\n\t\t0x11, 0x88, 0x47, 0x48, 0x11, 0x97, 0xce, 0xf7, 0x26, 0x4a, 0xce, 0x8e,\n\t\t0x77, 0xf0, 0x11, 0x97, 0x89, 0x57, 0xc2, 0x6f, 0x81, 0x1c, 0x0f, 0x5b,\n\t\t0x45, 0x16, 0xee, 0x44, 0xe4, 0x60, 0xfe, 0xb7, 0x66, 0xcc, 0x6e, 0xf4,\n\t\t0xf8, 0x5c, 0xbb, 0xa6, 0xbc, 0x66, 0xc3, 0x01, 0x40, 0xaf, 0x81, 0x06,\n\t\t0x8b, 0xed, 0x2b, 0xb6, 0x5b, 0x1e, 0x1a, 0x39, 0x63, 0x76, 0xd5, 0x93,\n\t\t0xac, 0x9a, 0x1f, 0xee, 0x6f, 0x18, 0x8c, 0xe0, 0xab, 0xc1, 0x94, 0xa6,\n\t\t0xb6, 0x89, 0x93, 0x46, 0xfd, 0x47, 0xa8, 0x50, 0x19, 0xda, 0x24, 0x71,\n\t\t0x68, 0x24, 0xa9, 0x95, 0x46, 0xda, 0x15, 0xa0, 0xd7, 0xb6, 0x82, 0x9c,\n\t\t0xe7, 0xbb, 0xf9, 0xa8, 0x24, 0x91, 0xd6, 0x9e, 0x2c, 0x0a, 0x4f, 0x91,\n\t\t0xf0, 0xdb, 0xd3, 0xdc, 0x73, 0x11, 0x77, 0xb6, 0xba, 0xe1, 0xbb, 0xf8,\n\t\t0xf8, 0xf8, 0xd8, 0xb8, 0x38, 0x34, 0x69, 0x69, 0x69, 0xa4, 0x84, 0x37,\n\t\t0x09, 0xe0, 0xfd, 0xf7, 0xb2, 0xb2, 0x10, 0xbd, 0xe2, 0x60, 0xbd, 0xe2,\n\t\t0x96, 0x9c, 0x7f, 0x2c, 0xb7, 0x77, 0x77, 0xc4, 0x0c, 0x0c, 0xd1, 0x4e,\n\t\t0x6d, 0x77, 0x17, 0xe8, 0x1f, 0x6c, 0xa5, 0x30, 0x4a, 0x94, 0xb8, 0x35,\n\t\t0x67, 0xb9, 0xc6, 0xf7, 0xe8, 0xbb, 0x9f, 0x87, 0x59, 0xc4, 0xe4, 0x13,\n\t\t0x2a, 0xf5, 0x44, 0x80, 0x8e, 0xfa, 0xec, 0x48, 0x8f, 0x06, 0xab, 0x27,\n\t\t0x97, 0x83, 0xc1, 0xf9, 0xbe, 0x77, 0x5d, 0xfe, 0xcd, 0x77, 0x03, 0xbd,\n\t\t0xf8, 0x93, 0xe1, 0xd6, 0x81, 0xba, 0x20, 0x1c, 0x6c, 0x4b, 0xac, 0x7a,\n\t\t0xa7, 0x0e, 0x22, 0x7a, 0x31, 0xb2, 0x6a, 0x9b, 0xd1, 0xde, 0x66, 0xef,\n\t\t0x53, 0x73, 0xde, 0x1f, 0x4e, 0xfd, 0xf5, 0x3d, 0x16, 0xb2, 0xe5, 0xa6,\n\t\t0x2d, 0x9a, 0xba, 0xba, 0x53, 0x45, 0x1a, 0xe0, 0x4e, 0xa7, 0xc4, 0x8d,\n\t\t0xce, 0x16, 0x47, 0xc2, 0xbf, 0xb5, 0xdb, 0x71, 0xe2, 0xc7, 0x24, 0x68,\n\t\t0x4d, 0x69, 0xfe, 0x43, 0x62, 0x4a, 0x2d, 0x0b, 0xb8, 0xd0, 0xc1, 0x54,\n\t\t0x24, 0xba, 0x6f, 0xb3, 0x47, 0xf1, 0x57, 0x9a, 0x0e, 0x4e, 0x1c, 0xc9,\n\t\t0x65, 0x8b, 0x12, 0xa7, 0x43, 0x68, 0xae, 0x87, 0xe2, 0x23, 0xcc, 0xe1,\n\t\t0xc8, 0x31, 0xdb, 0x6f, 0xd8, 0xf8, 0x72, 0xe5, 0xa2, 0x91, 0xff, 0x7a,\n\t\t0x40, 0x41, 0xc3, 0xde, 0x87, 0x93, 0x93, 0x3a, 0xa8, 0xaf, 0x12, 0x50,\n\t\t0x49, 0xfa, 0x08, 0xf0, 0xbf, 0x78, 0x31, 0x4f, 0x1e, 0xa1, 0x98, 0x2b,\n\t\t0xab, 0xaf, 0x9f, 0x32, 0x2f, 0xa6, 0xf2, 0xcb, 0x68, 0x51, 0xcf, 0x0d,\n\t\t0x86, 0x92, 0x35, 0xce, 0x22, 0xf6, 0x69, 0x66, 0x48, 0xca, 0x44, 0x9d,\n\t\t0x67, 0xd4, 0x78, 0x90, 0x45, 0xbd, 0xf7, 0x2d, 0xb8, 0xa3, 0x6d, 0x95,\n\t\t0xe8, 0xe7, 0x8f, 0x37, 0x29, 0x04, 0xd5, 0x29, 0x10, 0x15, 0x4a, 0x96,\n\t\t0x0d, 0x6e, 0x7c, 0x5b, 0xb3, 0x89, 0x9f, 0x3f, 0xd7, 0xe5, 0x54, 0xb9,\n\t\t0xc2, 0xb3, 0x7b, 0x4e, 0xe4, 0x83, 0x39, 0x29, 0x4b, 0x57, 0x9a, 0x3d,\n\t\t0x72, 0x0c, 0x25, 0x2d, 0x85, 0x98, 0x52, 0x0d, 0x33, 0x5e, 0x70, 0x71,\n\t\t0x3d, 0x46, 0xfd, 0xae, 0x7a, 0x27, 0xdb, 0xbf, 0x50, 0x64, 0xeb, 0x7b,\n\t\t0xe9, 0xfb, 0x9a, 0x46, 0x7e, 0xaa, 0x17, 0x79, 0x6a, 0x5a, 0xa3, 0xb9,\n\t\t0xc9, 0x7e, 0x72, 0x28, 0xcd, 0xeb, 0x85, 0xf9, 0xe9, 0xad, 0x3a, 0x1a,\n\t\t0xd3, 0xec, 0xc7, 0xd3, 0x74, 0x97, 0x12, 0xbd, 0xf9, 0x1e, 0x42, 0x08,\n\t\t0xc2, 0x8d, 0x09, 0x40, 0x19, 0xa6, 0xda, 0x43, 0xc4, 0x42, 0x50, 0x3c,\n\t\t0x85, 0x60, 0xe4, 0x5f, 0xb7, 0x36, 0x6f, 0xed, 0x24, 0x7c, 0xe1, 0x1a,\n\t\t0xef, 0x66, 0xc1, 0x0d, 0x23, 0x95, 0xdd, 0x4b, 0x71, 0x99, 0xf9, 0xa2,\n\t\t0x6a, 0x43, 0x6b, 0x6b, 0x36, 0x06, 0xdf, 0x23, 0xd9, 0x99, 0x74, 0xb6,\n\t\t0x6f, 0x0d, 0x64, 0xac, 0xac, 0xac, 0x1c, 0xcf, 0x9e, 0xb9, 0x46, 0x85,\n\t\t0x60, 0xf2, 0x3c, 0x7e, 0x9c, 0xee, 0x63, 0x22, 0xdf, 0xf5, 0xf6, 0x3a,\n\t\t0xde, 0xf6, 0xa3, 0x58, 0x0f, 0x71, 0xb9, 0x79, 0x75, 0x7a, 0xe9, 0x5b,\n\t\t0x75, 0x69, 0xbc, 0x0a, 0x42, 0x17, 0x11, 0xcb, 0x05, 0x11, 0x6b, 0x2a,\n\t\t0x9f, 0xf3, 0xbd, 0xab, 0x0d, 0x2a, 0x5c, 0x48, 0xe9, 0x40, 0x55, 0xe4,\n\t\t0x1b, 0x69, 0xe3, 0x50, 0xc9, 0x50, 0xc3, 0x91, 0x4e, 0x4e, 0x99, 0x72,\n\t\t0xc6, 0x5a, 0xcb, 0xb1, 0x2c, 0xef, 0x72, 0x0a, 0x4a, 0xb3, 0xef, 0xf0,\n\t\t0xb4, 0x53, 0xef, 0x67, 0xf8, 0x77, 0xb7, 0xa6, 0xc6, 0xfb, 0xce, 0x7f,\n\t\t0x36, 0x31, 0x92, 0x96, 0xd1, 0x3c, 0xde, 0x6b, 0x9b, 0x78, 0x78, 0x08,\n\t\t0xd1, 0x11, 0x62, 0xb3, 0xbd, 0x4a, 0x73, 0x1b, 0x70, 0x19, 0x4e, 0x17,\n\t\t0xa7, 0xc4, 0xc5, 0xc5, 0xd5, 0x60, 0x4d, 0x5b, 0x97, 0x39, 0xda, 0xbb,\n\t\t0xbe, 0x36, 0xb3, 0x15, 0x53, 0x11, 0xfe, 0x1e, 0xac, 0xd1, 0x8c, 0xb5,\n\t\t0xd5, 0xe8, 0xfe, 0xaa, 0x8d, 0x51, 0x5c, 0x85, 0x59, 0x0b, 0x67, 0x87,\n\t\t0x00, 0x09, 0x6f, 0xae, 0xb3, 0x7f, 0xe1, 0xb1, 0xe7, 0xee, 0x17, 0x34,\n\t\t0x9c, 0xc2, 0x52, 0xac, 0x13, 0xf7, 0x5a, 0xf1, 0xe5, 0xdd, 0x8f, 0x2b,\n\t\t0x40, 0x19, 0x98, 0x9d, 0xfc, 0xb3, 0x7f, 0x97, 0x9c, 0x42, 0x17, 0x8d,\n\t\t0x7c, 0xa0, 0x22, 0x98, 0xc0, 0xc2, 0x93, 0x5b, 0xe1, 0xdb, 0x6a, 0xbc,\n\t\t0x5c, 0x0e, 0x60, 0x54, 0x51, 0x51, 0xa1, 0x14, 0x9b, 0x7c, 0x69, 0x67,\n\t\t0xf7, 0xf4, 0x77, 0x99, 0xc9, 0x5f, 0xad, 0x6f, 0xe3, 0x67, 0x06, 0x8f,\n\t\t0x2d, 0x3f, 0x58, 0x23, 0x91, 0x44, 0x28, 0xe1, 0x17, 0xe6, 0x5c, 0xbb,\n\t\t0x53, 0xa7, 0x93, 0x66, 0x1c, 0x02, 0x8e, 0x59, 0x47, 0xc2, 0xa6, 0x7a,\n\t\t0x19, 0x2b, 0x8f, 0x6f, 0x24, 0xb9, 0xec, 0x1f, 0x71, 0xab, 0xc4, 0xbd,\n\t\t0x9e, 0x77, 0x98, 0x2d, 0xd6, 0xd2, 0x9e, 0x17, 0x86, 0x18, 0x99, 0x2c,\n\t\t0xfe, 0xe6, 0x97, 0x6e, 0xdb, 0xa9, 0xc3, 0x97, 0x6b, 0xff, 0xf8, 0x8d,\n\t\t0x3f, 0xa2, 0x27, 0x88, 0x3d, 0xc3, 0x0b, 0xbd, 0x6a, 0xaf, 0xd5, 0xa6,\n\t\t0xb9, 0x7a, 0x7b, 0xdb, 0x56, 0x84, 0x6e, 0x78, 0x42, 0x3b, 0xb0, 0x32,\n\t\t0x50, 0x24, 0xa2, 0xe7, 0x38, 0xd3, 0x03, 0x73, 0x02, 0xc5, 0xfb, 0xa6,\n\t\t0xf2, 0x05, 0x11, 0x25, 0xf6, 0x3e, 0xf8, 0x6e, 0x1c, 0x10, 0x4c, 0x3d,\n\t\t0xda, 0x96, 0x27, 0xcc, 0xdd, 0xda, 0x22, 0x5b, 0xfa, 0x0d, 0x2e, 0xd8,\n\t\t0xf7, 0xa7, 0x3d, 0x97, 0x80, 0x7d, 0x47, 0x5e, 0x82, 0x80, 0x09, 0xeb,\n\t\t0x21, 0x63, 0x97, 0xfc, 0xe9, 0xef, 0x65, 0x4b, 0x9a, 0xdc, 0x43, 0xb2,\n\t\t0x13, 0x68, 0xc3, 0x03, 0xdf, 0xaa, 0xea, 0xeb, 0x45, 0x9a, 0x4f, 0x06,\n\t\t0x9f, 0xbf, 0x67, 0x48, 0x8e, 0x8d, 0x0d, 0xdc, 0xca, 0x0c, 0x58, 0x2a,\n\t\t0x54, 0xd0, 0x2e, 0xd4, 0x32, 0x39, 0xc5, 0x66, 0xba, 0x59, 0x7b, 0x20,\n\t\t0xdd, 0xee, 0x45, 0x6d, 0x47, 0x7c, 0x5e, 0x47, 0xbf, 0x24, 0x64, 0x54,\n\t\t0x31, 0x41, 0xd5, 0x3d, 0xe1, 0x73, 0x8d, 0x7a, 0xf4, 0xd6, 0xb8, 0x10,\n\t\t0xfa, 0x76, 0x47, 0xcf, 0x95, 0x8d, 0xcb, 0xdf, 0xe6, 0x3d, 0x94, 0xf3,\n\t\t0x86, 0x93, 0xb6, 0xbb, 0x98, 0x90, 0xbd, 0xd7, 0x71, 0x71, 0xf3, 0x66,\n\t\t0xfb, 0xf5, 0xc5, 0x56, 0xd3, 0xef, 0x6a, 0xb4, 0xfd, 0x89, 0x6c, 0xd7,\n\t\t0xbf, 0xaa, 0x26, 0x71, 0x1a, 0x04, 0x25, 0x9b, 0xf9, 0xcf, 0xe6, 0x63,\n\t\t0x12, 0x22, 0x0f, 0x1f, 0x5d, 0x2e, 0xc0, 0x47, 0x57, 0xaf, 0xff, 0x96,\n\t\t0x2b, 0xd9, 0xd9, 0x4d, 0xa4, 0x11, 0xc6, 0x97, 0xe8, 0x99, 0x9d, 0x46,\n\t\t0x4e, 0xf9, 0x08, 0x94, 0xaf, 0x5b, 0x9c, 0xbc, 0x9a, 0x7c, 0x1a, 0xed,\n\t\t0x15, 0x95, 0x93, 0xe3, 0x6e, 0xae, 0xfe, 0x02, 0xab, 0x22, 0x0a, 0x3d,\n\t\t0xb0, 0x03, 0xe3, 0xda, 0x62, 0x4c, 0xf7, 0xc7, 0x3d, 0x3a, 0x84, 0x7e,\n\t\t0x00, 0x32, 0xa4, 0x7f, 0x72, 0x58, 0x5e, 0xf1, 0x7e, 0x9a, 0x87, 0xcb,\n\t\t0xfe, 0xec, 0x69, 0x64, 0xf0, 0x42, 0xa7, 0x77, 0x47, 0x6b, 0x55, 0x15,\n\t\t0x91, 0xd8, 0x59, 0x9a, 0xc7, 0x07, 0x1f, 0x5d, 0xe7, 0x23, 0x7a, 0xda,\n\t\t0xfd, 0x8b, 0xb4, 0xe5, 0x01, 0x57, 0x13, 0x69, 0x50, 0x58, 0x54, 0x54,\n\t\t0x0f, 0xb0, 0x49, 0x8d, 0xb5, 0x05, 0x04, 0xe8, 0xbc, 0x79, 0x03, 0x9b,\n\t\t0xaf, 0x7d, 0x9f, 0x22, 0xf9, 0x41, 0xe8, 0x62, 0x6f, 0x76, 0xfd, 0xcb,\n\t\t0xb6, 0x20, 0xab, 0xd8, 0x62, 0x2c, 0x3b, 0xb0, 0x67, 0xd3, 0x8a, 0x09,\n\t\t0x30, 0x31, 0xbe, 0x7c, 0x01, 0x60, 0x2b, 0x67, 0x22, 0x2a, 0xc5, 0x8e,\n\t\t0x3f, 0x7d, 0x06, 0x0f, 0x74, 0x39, 0x5a, 0x8f, 0xc9, 0x33, 0xdc, 0xf0,\n\t\t0x66, 0x27, 0x16, 0xe7, 0x98, 0x5a, 0x57, 0xd0, 0xdd, 0xeb, 0x6e, 0x9d,\n\t\t0xa7, 0x62, 0x6b, 0xec, 0x98, 0x42, 0x70, 0x97, 0x80, 0xc9, 0x4d, 0x22,\n\t\t0xf6, 0xcd, 0xea, 0xc0, 0xdf, 0xcb, 0xfd, 0x9b, 0xe6, 0xca, 0x8a, 0xa3,\n\t\t0x21, 0x2e, 0x8f, 0x0f, 0xc7, 0xef, 0xdf, 0x1f, 0x16, 0x16, 0x59, 0x94,\n\t\t0xf4, 0xd1, 0x8c, 0xb8, 0x97, 0xa3, 0xcd, 0x96, 0x62, 0xe7, 0x90, 0xd6,\n\t\t0xa1, 0xf4, 0x24, 0x29, 0x26, 0x53, 0x39, 0x55, 0x45, 0x68, 0xc8, 0x19,\n\t\t0x4e, 0x7b, 0xcc, 0xbb, 0x64, 0x19, 0xd6, 0xf1, 0x4f, 0x2c, 0x72, 0x65,\n\t\t0x3a, 0xb2, 0x2e, 0xa2, 0x9b, 0xcd, 0x27, 0x7c, 0xae, 0x27, 0xe1, 0x26,\n\t\t0x83, 0xd4, 0x13, 0x94, 0x8f, 0x1e, 0xa9, 0xa7, 0x41, 0x75, 0x6b, 0xb8,\n\t\t0x56, 0xd1, 0x43, 0x3d, 0xbe, 0x7f, 0xff, 0x6e, 0x5f, 0x99, 0x65, 0x3e,\n\t\t0xb9, 0xfc, 0xbe, 0xb6, 0x33, 0x18, 0xf9, 0x55, 0x0e, 0xf9, 0xf7, 0x51,\n\t\t0x87, 0xb4, 0x69, 0xd2, 0x3f, 0x9a, 0xf6, 0x07, 0x38, 0x53, 0x5b, 0xeb,\n\t\t0x8b, 0xff, 0x9d, 0xef, 0x53, 0xfe, 0x62, 0xc0, 0xfc, 0x39, 0x8d, 0xd6,\n\t\t0x1e, 0x24, 0x7a, 0xf9, 0xf6, 0x82, 0x5e, 0x58, 0x16, 0xbc, 0xfd, 0x3a,\n\t\t0x31, 0xf6, 0xe2, 0x19, 0x77, 0x71, 0xe7, 0x3a, 0x4f, 0x4b, 0x4c, 0x73,\n\t\t0xe7, 0x2f, 0x0a, 0xc1, 0x34, 0x85, 0x28, 0xeb, 0x5b, 0x81, 0x08, 0xab,\n\t\t0x80, 0xca, 0x79, 0x0c, 0x49, 0xdb, 0xed, 0xb1, 0x37, 0x6e, 0x76, 0x76,\n\t\t0x0f, 0xf4, 0x5b, 0xce, 0x93, 0x34, 0x68, 0x32, 0xc5, 0xf4, 0xb1, 0x05,\n\t\t0x13, 0x92, 0xfe, 0x39, 0x55, 0x27, 0x06, 0xbb, 0x57, 0xbf, 0x35, 0xce,\n\t\t0xb8, 0x54, 0x9a, 0xa3, 0x39, 0xb0, 0xde, 0x3b, 0x8b, 0x3c, 0x3b, 0x74,\n\t\t0x9a, 0xf3, 0xbf, 0x88, 0x4b, 0xf5, 0xba, 0x5d, 0x2a, 0x54, 0x0d, 0x51,\n\t\t0x50, 0x4e, 0xd6, 0x35, 0x31, 0x8a, 0x61, 0xa7, 0xf0, 0x0f, 0x3b, 0xfb,\n\t\t0x99, 0xe4, 0x37, 0x28, 0x40, 0x6d, 0x7f, 0x7e, 0xd5, 0x54, 0xf2, 0xfb,\n\t\t0xae, 0x80, 0x1c, 0x37, 0xd2, 0x4d, 0x64, 0x77, 0x43, 0xa3, 0x99, 0x10,\n\t\t0x26, 0x9b, 0x29, 0xea, 0xd4, 0xd7, 0x9d, 0xde, 0x3c, 0x56, 0x86, 0x88,\n\t\t0x15, 0x22, 0x4b, 0xd2, 0x5b, 0x1b, 0xf7, 0x1e, 0x32, 0x64, 0x83, 0x73,\n\t\t0xab, 0x64, 0xdf, 0xdc, 0xdd, 0x39, 0x51, 0x29, 0x0d, 0x2c, 0xd4, 0xa1,\n\t\t0xe0, 0xd8, 0x37, 0xea, 0xd4, 0x3e, 0x1a, 0x28, 0x54, 0x66, 0xd7, 0x94,\n\t\t0x55, 0x4f, 0x87, 0x9c, 0xf8, 0xa3, 0x89, 0x30, 0x8e, 0x0e, 0x8a, 0xc7,\n\t\t0x93, 0xa8, 0x5c, 0xc1, 0xb0, 0x6c, 0x2c, 0x31, 0xed, 0xaf, 0x67, 0x3a,\n\t\t0xbb, 0xb5, 0x71, 0x3e, 0x42, 0x18, 0xbd, 0xb3, 0xbf, 0xf8, 0xf5, 0x4c,\n\t\t0x59, 0x2a, 0xc4, 0x87, 0x96, 0xb8, 0x1c, 0x26, 0x64, 0x23, 0x47, 0x86,\n\t\t0x71, 0x8e, 0x14, 0x56, 0xc7, 0x0c, 0xc4, 0xaa, 0xc6, 0x84, 0x29, 0x11,\n\t\t0x2a, 0x7a, 0x71, 0x0c, 0xef, 0x6b, 0xf4, 0xe7, 0x8b, 0x7c, 0x35, 0x0a,\n\t\t0x13, 0x8d, 0xb8, 0x27, 0xfa, 0xf7, 0xd2, 0x4a, 0x23, 0x3f, 0xc8, 0x04,\n\t\t0xdc, 0x49, 0x31, 0xe8, 0x3a, 0x30, 0x7f, 0x7e, 0x5e, 0xb0, 0x1d, 0xd0,\n\t\t0x2f, 0x15, 0x66, 0xb8, 0xdd, 0xad, 0xf6, 0xcf, 0x8f, 0x88, 0x97, 0x10,\n\t\t0x99, 0x39, 0xbe, 0x9b, 0xa0, 0x47, 0x6a, 0x0e, 0x96, 0x5b, 0x50, 0xd1,\n\t\t0x18, 0xed, 0x5d, 0xe7, 0x69, 0x8d, 0x09, 0x5a, 0x73, 0x2d, 0xd0, 0x2a,\n\t\t0x54, 0x20, 0xbb, 0x19, 0x89, 0xdd, 0xc8, 0xb9, 0x24, 0xc3, 0x8f, 0xf4,\n\t\t0xa2, 0x03, 0x14, 0x7b, 0x22, 0x5d, 0x74, 0x09, 0xa7, 0x4c, 0xe2, 0xfc,\n\t\t0x0f, 0x3f, 0x89, 0x73, 0x02, 0xd5, 0xa1, 0xe2, 0x2f, 0x04, 0x9f, 0xc1,\n\t\t0xe5, 0xbd, 0xa2, 0x7d, 0xb5, 0x8b, 0x4a, 0x47, 0x57, 0x11, 0x87, 0xb9,\n\t\t0x45, 0xdf, 0x46, 0x0a, 0x15, 0x93, 0xa9, 0xc9, 0x04, 0xbc, 0xe3, 0xbb,\n\t\t0xe2, 0x4e, 0x13, 0x2c, 0x3a, 0xe2, 0x34, 0x64, 0x63, 0x16, 0x3e, 0x53,\n\t\t0x92, 0x32, 0x60, 0xfe, 0xe1, 0x05, 0xc5, 0x5a, 0x11, 0xca, 0x82, 0x9d,\n\t\t0xef, 0x6a, 0xe4, 0xbf, 0x10, 0x86, 0x83, 0xcb, 0xd7, 0x9d, 0xfb, 0xf5,\n\t\t0x9b, 0x36, 0x6c, 0x9a, 0x9b, 0xd6, 0xde, 0xcd, 0xec, 0x8f, 0xe0, 0xa7,\n\t\t0x5d, 0xed, 0x5f, 0x9e, 0x36, 0x59, 0x19, 0xba, 0x9f, 0x47, 0x73, 0x62,\n\t\t0x76, 0x31, 0xa7, 0x23, 0x00, 0xef, 0x9e, 0xab, 0xfc, 0x0a, 0x84, 0x04,\n\t\t0x76, 0xb1, 0x7e, 0x08, 0xf8, 0xb7, 0xef, 0x98, 0x37, 0xf6, 0xcc, 0x01,\n\t\t0x51, 0xaf, 0xac, 0x2e, 0xfa, 0x29, 0x34, 0xd3, 0x2c, 0x3c, 0x46, 0x7a,\n\t\t0x7e, 0xf7, 0x47, 0x78, 0x6a, 0xff, 0x4b, 0xbe, 0xb5, 0xc7, 0xb9, 0xc7,\n\t\t0x85, 0x4f, 0x6b, 0x6a, 0xa4, 0xdd, 0xae, 0xa9, 0xe0, 0x39, 0x04, 0x80,\n\t\t0x82, 0x2b, 0x67, 0xc6, 0xf1, 0x2b, 0xc7, 0x1c, 0x0c, 0xf8, 0xb3, 0x40,\n\t\t0xb2, 0x6d, 0xcc, 0x0d, 0x8f, 0x0e, 0x2f, 0x32, 0x54, 0x6f, 0xd9, 0x11,\n\t\t0xcb, 0x97, 0x63, 0xee, 0x2e, 0xf6, 0xad, 0x79, 0xcf, 0x48, 0xc1, 0x69,\n\t\t0x12, 0x15, 0xcf, 0xbf, 0x35, 0x0d, 0x0d, 0x32, 0x29, 0x67, 0xbc, 0x27,\n\t\t0x2a, 0x16, 0x84, 0x15, 0x4e, 0xf9, 0xc4, 0xb2, 0xd9, 0xed, 0x28, 0xb2,\n\t\t0xe4, 0x63, 0x30, 0x75, 0xa7, 0xaa, 0x0a, 0x9a, 0x87, 0x0f, 0x27, 0xd5,\n\t\t0xd0, 0xc7, 0xea, 0x1e, 0xec, 0x12, 0xf5, 0xb2, 0x33, 0xb7, 0xd5, 0x13,\n\t\t0x10, 0xbf, 0x85, 0x1c, 0x14, 0xe1, 0x1e, 0x7b, 0x23, 0xe1, 0xdd, 0xdd,\n\t\t0xac, 0xb0, 0xe1, 0x6f, 0x99, 0xce, 0x12, 0xe7, 0x25, 0x6a, 0xf4, 0xb0,\n\t\t0x39, 0xad, 0x9a, 0xeb, 0xb4, 0xd9, 0xc7, 0x8f, 0x55, 0x6e, 0xbe, 0x7c,\n\t\t0x8e, 0xe6, 0xf8, 0x0c, 0xf8, 0xfc, 0x8e, 0x80, 0xfe, 0xba, 0x56, 0xc7,\n\t\t0xf0, 0x7a, 0x62, 0x1a, 0x69, 0x74, 0x2d, 0x90, 0xc8, 0xd7, 0x9b, 0x35,\n\t\t0x65, 0xff, 0xb6, 0x6e, 0x1e, 0x0d, 0x19, 0x90, 0x5c, 0x36, 0x61, 0xcf,\n\t\t0x7b, 0x50, 0xf7, 0x89, 0x3c, 0x22, 0x01, 0x9c, 0xaf, 0xf3, 0x7b, 0xf2,\n\t\t0xed, 0x4e, 0x78, 0xf9, 0xf1, 0x78, 0xda, 0x43, 0xf6, 0xf7, 0x49, 0x77,\n\t\t0x2a, 0x51, 0x58, 0xaf, 0x97, 0x0a, 0x0d, 0xef, 0x94, 0xbd, 0x64, 0xdc,\n\t\t0x77, 0x4d, 0x2f, 0x85, 0xb7, 0x67, 0x84, 0xe9, 0x5e, 0x51, 0x67, 0x67,\n\t\t0xe4, 0xd5, 0x96, 0x0d, 0x17, 0x73, 0xdf, 0xf6, 0x2b, 0x2a, 0x78, 0x15,\n\t\t0x94, 0x94, 0x72, 0x1b, 0x1b, 0x69, 0xaa, 0xad, 0x87, 0xed, 0x97, 0x9c,\n\t\t0xfa, 0x96, 0x98, 0x2b, 0xf4, 0x4b, 0xc2, 0xbb, 0x95, 0xc3, 0xb4, 0x08,\n\t\t0x19, 0xd4, 0x3a, 0x4a, 0x44, 0xcb, 0xd7, 0xe7, 0xd3, 0x43, 0x57, 0xc4,\n\t\t0x46, 0xe3, 0x39, 0xd4, 0xb4, 0x66, 0xd2, 0xc2, 0xc2, 0xb6, 0x1c, 0x6b,\n\t\t0x67, 0x35, 0xac, 0x9f, 0x91, 0x33, 0x42, 0x19, 0x86, 0x01, 0x00, 0x2a,\n\t\t0x7c, 0x69, 0xd7, 0x77, 0x91, 0xd8, 0xfa, 0x06, 0x05, 0xf1, 0x5a, 0x0d,\n\t\t0x92, 0xa1, 0x5e, 0x42, 0x85, 0xba, 0x59, 0x34, 0x70, 0x61, 0xc1, 0x38,\n\t\t0x92, 0x4e, 0x94, 0x44, 0x57, 0x77, 0x6b, 0x99, 0x5c, 0xea, 0x21, 0xd9,\n\t\t0xe0, 0x6a, 0x82, 0x91, 0xed, 0x39, 0x25, 0x37, 0x24, 0xbd, 0xfb, 0xc0,\n\t\t0x79, 0xe5, 0xf4, 0x61, 0xbf, 0xf3, 0xc4, 0x7d, 0x59, 0x2e, 0xc9, 0x64,\n\t\t0xeb, 0x13, 0xf1, 0xa3, 0x07, 0x33, 0x2a, 0xfc, 0xaf, 0xeb, 0xce, 0x96,\n\t\t0x2c, 0x4f, 0xc9, 0x18, 0x8e, 0x9f, 0xfc, 0x77, 0xd2, 0x80, 0x28, 0xce,\n\t\t0x88, 0xdd, 0x28, 0xd1, 0x05, 0x81, 0xc9, 0xc9, 0x83, 0xaf, 0xae, 0xbc,\n\t\t0x1e, 0x61, 0x63, 0x37, 0xed, 0x9d, 0x76, 0x11, 0x49, 0x9b, 0xf7, 0x46,\n\t\t0x52, 0x83, 0x02, 0x57, 0x64, 0x02, 0xf6, 0xf4, 0x6f, 0x28, 0x04, 0xec,\n\t\t0xeb, 0xca, 0xe7, 0x70, 0x77, 0x4e, 0x44, 0xb6, 0xc2, 0xc4, 0xe3, 0xa2,\n\t\t0xad, 0x32, 0xfd, 0xd7, 0xad, 0xdf, 0x92, 0x0f, 0x7c, 0xd3, 0x0a, 0xe6,\n\t\t0xa9, 0x9e, 0xed, 0xee, 0x91, 0x11, 0x72, 0xf7, 0x65, 0x06, 0x6d, 0xd3,\n\t\t0x03, 0x0a, 0xb1, 0xe5, 0xc3, 0xf2, 0x72, 0x6e, 0xd9, 0xc1, 0x0c, 0xe1,\n\t\t0xc8, 0x7b, 0x1a, 0x10, 0xea, 0xd5, 0x69, 0xbc, 0xae, 0x7f, 0xfa, 0xf5,\n\t\t0x6e, 0x1e, 0xd3, 0x08, 0xe0, 0x18, 0x18, 0x18, 0x28, 0xab, 0xaa, 0x06,\n\t\t0x0d, 0x38, 0xc8, 0xb6, 0x85, 0xf1, 0x1a, 0x4f, 0xb4, 0xbd, 0x2e, 0xbe,\n\t\t0xc3, 0xd9, 0xd9, 0x2d, 0xb2, 0xdf, 0xad, 0xb4, 0x9d, 0xb5, 0xb9, 0x9a,\n\t\t0x6e, 0x2c, 0xe5, 0x28, 0x2f, 0xb1, 0x83, 0x16, 0x8b, 0x16, 0x6b, 0x3d,\n\t\t0x6e, 0x5c, 0xb4, 0x16, 0xbf, 0xc1, 0xd4, 0x7c, 0xa9, 0x5d, 0x1f, 0x6f,\n\t\t0x3d, 0x09, 0xc8, 0x73, 0x52, 0x44, 0xac, 0x41, 0x95, 0xf1, 0xc5, 0x63,\n\t\t0xd0, 0xcf, 0xd4, 0x17, 0xd8, 0x99, 0xbe, 0x27, 0x03, 0x98, 0x97, 0xef,\n\t\t0x6d, 0x6d, 0x51, 0x77, 0x4f, 0xc7, 0x02, 0xcc, 0x0d, 0xf8, 0xe8, 0x60,\n\t\t0x72, 0x4e, 0x73, 0x1b, 0x75, 0xad, 0x11, 0x91, 0x08, 0x7e, 0xbd, 0x86,\n\t\t0x84, 0x5d, 0x66, 0xaf, 0x7b, 0x39, 0x6d, 0xb0, 0x91, 0x25, 0xd7, 0x18,\n\t\t0x8b, 0x07, 0xbb, 0xc8, 0xe2, 0x2c, 0x32, 0xe1, 0x40, 0x47, 0x67, 0xf6,\n\t\t0x95, 0x6c, 0xe7, 0x14, 0x7e, 0xe1, 0xa1, 0xa4, 0x19, 0x74, 0x4f, 0x70,\n\t\t0x62, 0x95, 0x63, 0x8e, 0x86, 0x86, 0x26, 0xbc, 0xa4, 0x84, 0x73, 0xfb,\n\t\t0xfc, 0x3d, 0xfb, 0x36, 0xa0, 0xcb, 0x22, 0x19, 0x24, 0x69, 0x40, 0x47,\n\t\t0x63, 0x8b, 0x09, 0x7c, 0x87, 0x9f, 0x0d, 0xde, 0x1f, 0xbc, 0x56, 0x7e,\n\t\t0x13, 0x9b, 0xfe, 0x06, 0x61, 0x95, 0xe9, 0xa8, 0xe8, 0x60, 0xec, 0x5a,\n\t\t0x2c, 0x26, 0xcb, 0xfb, 0xed, 0x9d, 0x00, 0x46, 0x86, 0x70, 0x6a, 0x7c,\n\t\t0xed, 0x73, 0x30, 0xcd, 0xce, 0x13, 0x5b, 0x3a, 0x31, 0x28, 0xb2, 0x2b,\n\t\t0x5b, 0xed, 0x51, 0xe0, 0xd8, 0xd8, 0x58, 0x04, 0x1b, 0x7c, 0xe5, 0x36,\n\t\t0xd7, 0x53, 0x25, 0xde, 0xbc, 0x6e, 0xbe, 0x72, 0x75, 0x7e, 0x91, 0x4a,\n\t\t0xf8, 0x84, 0x46, 0x9d, 0x4a, 0x7c, 0x61, 0xdd, 0x85, 0x64, 0x0d, 0x17,\n\t\t0x10, 0xbf, 0x57, 0x87, 0xd3, 0xd2, 0x6b, 0x7d, 0x7e, 0x2e, 0x15, 0xe2,\n\t\t0x74, 0x5c, 0xf6, 0x53, 0xd6, 0x32, 0x6d, 0xed, 0xb6, 0xcd, 0x17, 0xd2,\n\t\t0x82, 0x82, 0x1f, 0x6c, 0x6d, 0xb1, 0xed, 0x48, 0x6b, 0x00, 0x95, 0xc9,\n\t\t0x62, 0xd7, 0x4e, 0xd5, 0x74, 0xe7, 0x80, 0xd4, 0x28, 0x90, 0x37, 0x30,\n\t\t0x98, 0x65, 0x65, 0x3d, 0xef, 0xf8, 0x84, 0xcd, 0x0c, 0x48, 0x10, 0x10,\n\t\t0x98, 0x82, 0x04, 0x51, 0x9e, 0xcc, 0x23, 0x97, 0xd5, 0x36, 0x3e, 0x91,\n\t\t0x4d, 0xf2, 0xeb, 0xed, 0xe0, 0xf3, 0x77, 0x47, 0x07, 0x45, 0x4e, 0x15,\n\t\t0xe2, 0x17, 0x54, 0x7b, 0xd1, 0xbf, 0xef, 0xe6, 0x1e, 0x75, 0xa4, 0x0c,\n\t\t0x36, 0x3c, 0xb4, 0x20, 0x29, 0x7f, 0x38, 0x56, 0x91, 0xae, 0x61, 0x45,\n\t\t0xc9, 0xb3, 0x87, 0xe3, 0xe3, 0xd4, 0x73, 0x91, 0x6a, 0x7e, 0x55, 0x67,\n\t\t0x23, 0x45, 0x5d, 0x61, 0x91, 0x92, 0x92, 0x22, 0x74, 0x19, 0x13, 0x11,\n\t\t0x21, 0xaf, 0x31, 0x52, 0x0e, 0x6f, 0xa4, 0x4c, 0xd6, 0x5d, 0x1b, 0x3d,\n\t\t0x4d, 0x82, 0x70, 0x9d, 0x22, 0x0b, 0xe4, 0x59, 0xff, 0x84, 0x0b, 0xda,\n\t\t0x4b, 0x74, 0x83, 0x40, 0xc4, 0x43, 0xa8, 0xef, 0x02, 0xe8, 0x4e, 0xff,\n\t\t0x5e, 0xcf, 0x15, 0x7c, 0xe8, 0x3a, 0x7c, 0xb8, 0x7e, 0xad, 0x70, 0x18,\n\t\t0x03, 0x4f, 0xf8, 0xc9, 0x5a, 0xcc, 0xa1, 0xc8, 0x3d, 0x6e, 0x8b, 0x15,\n\t\t0x93, 0x63, 0xa9, 0xc1, 0x8d, 0x0d, 0x34, 0x8a, 0xe1, 0x2f, 0x52, 0xd7,\n\t\t0x5e, 0xe5, 0xcc, 0x34, 0x25, 0x9d, 0xce, 0xd9, 0x89, 0x8a, 0xce, 0xea,\n\t\t0xb7, 0xf9, 0x4b, 0xda, 0xdb, 0xdb, 0xaf, 0x1c, 0x1e, 0x12, 0x45, 0xf4,\n\t\t0xa0, 0x1b, 0x24, 0x41, 0x54, 0x48, 0x44, 0xfe, 0xbb, 0xde, 0x1f, 0xd5,\n\t\t0xd3, 0xea, 0x73, 0x52, 0x24, 0xc3, 0x75, 0xa6, 0x26, 0xb3, 0x73, 0x8a,\n\t\t0x28, 0xea, 0x5e, 0xd3, 0xe5, 0x8e, 0x15, 0x30, 0xe5, 0xbd, 0x7f, 0xa5,\n\t\t0x5d, 0x7b, 0xff, 0x7e, 0xfc, 0x61, 0xd5, 0x79, 0xed, 0xa9, 0xfe, 0xfb,\n\t\t0x0b, 0xbd, 0x9b, 0x30, 0x0b, 0x19, 0x3a, 0xb0, 0xc8, 0xab, 0xa4, 0xd3,\n\t\t0xb6, 0xda, 0x79, 0x7c, 0x43, 0xa9, 0x00, 0xf6, 0xbc, 0x57, 0x67, 0xfd,\n\t\t0xe9, 0x5e, 0xc1, 0xd0, 0xdc, 0x8b, 0x8a, 0x3f, 0x7f, 0xfa, 0xcc, 0x6a,\n\t\t0x80, 0x0e, 0x11, 0x93, 0xae, 0x34, 0x83, 0x6e, 0xe7, 0xdc, 0x87, 0xb7,\n\t\t0x57, 0xd3, 0xcc, 0x2c, 0xa0, 0x03, 0x4e, 0x75, 0x2e, 0xe6, 0xf0, 0xb0,\n\t\t0xf7, 0xea, 0xd1, 0x15, 0xb5, 0x04, 0xcd, 0x73, 0x48, 0x72, 0x71, 0x87,\n\t\t0x65, 0xc7, 0x7c, 0xa6, 0x43, 0x37, 0xd1, 0x87, 0xe8, 0x40, 0xb8, 0x27,\n\t\t0xf3, 0xf0, 0x19, 0x66, 0x10, 0xf8, 0xa4, 0xa4, 0xed, 0x61, 0xca, 0xa8,\n\t\t0xb8, 0xc8, 0x63, 0x5c, 0x53, 0xe0, 0x17, 0x37, 0x0a, 0xea, 0xc4, 0x88,\n\t\t0x30, 0xf1, 0xc0, 0xa2, 0xf3, 0x2a, 0x63, 0xc6, 0xc9, 0x8c, 0x75, 0x9b,\n\t\t0x65, 0x6f, 0x52, 0x8a, 0x91, 0x06, 0xa2, 0xc8, 0xf1, 0x4c, 0x21, 0x68,\n\t\t0x86, 0x7c, 0x52, 0xa5, 0xe0, 0x35, 0x93, 0xd4, 0x62, 0x7d, 0xd7, 0x30,\n\t\t0xaf, 0x00, 0x08, 0xfc, 0x2a, 0x87, 0xaa, 0xfe, 0x97, 0x2d, 0xf2, 0x4c,\n\t\t0xd1, 0xfd, 0xfc, 0x5b, 0xb8, 0x06, 0x51, 0xec, 0x15, 0xd9, 0xf5, 0x6f,\n\t\t0x66, 0x53, 0x76, 0xde, 0x23, 0x62, 0xf9, 0xf7, 0xef, 0xcf, 0x72, 0xab,\n\t\t0x8c, 0x4f, 0x95, 0x46, 0xe8, 0x73, 0xd1, 0x42, 0xa1, 0xe0, 0x1f, 0xec,\n\t\t0xa2, 0xd3, 0x25, 0x30, 0xf5, 0xc4, 0x27, 0x43, 0xd6, 0xd5, 0x4c, 0xb6,\n\t\t0x04, 0x55, 0xc6, 0xb4, 0x78, 0xa0, 0xa0, 0xac, 0x74, 0xae, 0x21, 0xf2,\n\t\t0x89, 0xb4, 0xe8, 0xb6, 0x87, 0x32, 0x23, 0xbe, 0x87, 0xf2, 0x4b, 0x19,\n\t\t0xf0, 0xf6, 0xe8, 0x57, 0x8e, 0x82, 0x92, 0x2a, 0x9a, 0x72, 0xbf, 0x1f,\n\t\t0x4b, 0xfb, 0xc0, 0x0c, 0xe6, 0x3f, 0x9d, 0x0d, 0xc9, 0x3e, 0x2c, 0xdb,\n\t\t0xd4, 0x4d, 0xfc, 0x28, 0xcd, 0x83, 0x8d, 0x09, 0x33, 0x1c, 0xdb, 0x63,\n\t\t0x75, 0x0d, 0xc7, 0xf7, 0x68, 0x3d, 0x7b, 0x4c, 0x2f, 0xb6, 0xec, 0xbb,\n\t\t0xd6, 0x9d, 0xb9, 0x78, 0xf0, 0xc2, 0x79, 0x85, 0xd6, 0xc2, 0x7a, 0x13,\n\t\t0xdb, 0x6c, 0xc0, 0xd5, 0xea, 0x34, 0xf0, 0x6c, 0x7a, 0x53, 0x2a, 0x32,\n\t\t0xb5, 0x6e, 0x71, 0xc6, 0xe0, 0x2d, 0xc9, 0xaf, 0x92, 0xb2, 0x25, 0xc4,\n\t\t0xa8, 0x90, 0xd2, 0x7a, 0xf1, 0xe1, 0x65, 0xf6, 0x92, 0xa5, 0x23, 0x74,\n\t\t0xc8, 0xb2, 0xbd, 0x5e, 0x3e, 0x1f, 0xef, 0x4a, 0x2b, 0x7f, 0xb7, 0x3a,\n\t\t0x3f, 0x7b, 0xb5, 0xe2, 0x55, 0x1c, 0xd3, 0x67, 0xd4, 0xe3, 0x33, 0x5f,\n\t\t0x39, 0xe5, 0xfe, 0xc9, 0xd8, 0xaa, 0x2a, 0xc9, 0x3e, 0xd0, 0x3b, 0x16,\n\t\t0xd0, 0xf6, 0x0f, 0x9a, 0x12, 0x9f, 0x0f, 0xdc, 0x21, 0x66, 0xf0, 0xc4,\n\t\t0x5f, 0xd9, 0x71, 0x8e, 0x81, 0xf0, 0x68, 0xe6, 0xbe, 0xd7, 0xeb, 0x4d,\n\t\t0x99, 0x44, 0xab, 0x63, 0x95, 0x3a, 0x3a, 0xd3, 0xb5, 0x07, 0x7f, 0x21,\n\t\t0x38, 0xbd, 0x4f, 0x64, 0x71, 0x7c, 0x07, 0x1d, 0x47, 0xe7, 0x8b, 0x64,\n\t\t0xc2, 0xf2, 0x68, 0x01, 0xd1, 0xe6, 0x1b, 0xa2, 0x27, 0xbe, 0x26, 0x14,\n\t\t0xc1, 0xba, 0x8f, 0x3d, 0xc2, 0xf5, 0x0c, 0xb4, 0x3d, 0xcb, 0x0c, 0xfa,\n\t\t0x7a, 0x7f, 0x87, 0x17, 0x84, 0x6e, 0xeb, 0x2b, 0x76, 0x8c, 0x1c, 0xdc,\n\t\t0x3d, 0x7d, 0xf7, 0xe5, 0xe1, 0x87, 0xf4, 0x01, 0xd0, 0x2e, 0x0c, 0x61,\n\t\t0xca, 0xb6, 0x19, 0x17, 0xb7, 0xdc, 0x2c, 0x86, 0x84, 0x3c, 0x08, 0xb9,\n\t\t0xd9, 0x3b, 0xe7, 0x19, 0x65, 0xbf, 0x7d, 0xd7, 0x6d, 0x33, 0xb3, 0xdf,\n\t\t0x63, 0x73, 0x77, 0xdb, 0x9b, 0x37, 0xe3, 0x60, 0xe5, 0x89, 0x41, 0x58,\n\t\t0xd9, 0x61, 0x29, 0xfb, 0xca, 0x04, 0xc3, 0x91, 0x46, 0x18, 0x29, 0x36,\n\t\t0x10, 0x47, 0xf8, 0xc6, 0x10, 0x1a, 0x25, 0xf8, 0xd5, 0xbf, 0xb3, 0x98,\n\t\t0xb1, 0x44, 0x5e, 0xd5, 0xa7, 0xf6, 0xab, 0xe4, 0xe4, 0x96, 0x02, 0xdf,\n\t\t0x9f, 0x4c, 0xfb, 0x73, 0x5d, 0xa2, 0xd9, 0x7d, 0x83, 0x26, 0x87, 0x5a,\n\t\t0x05, 0x9f, 0x66, 0x0d, 0x89, 0xf0, 0xd6, 0x8d, 0xb0, 0x51, 0xe2, 0x9e,\n\t\t0xa3, 0x1b, 0xba, 0xe8, 0x9c, 0xc7, 0x20, 0x1b, 0x50, 0xc5, 0x4a, 0xe1,\n\t\t0x8d, 0xf3, 0x72, 0xba, 0xf0, 0x73, 0x3a, 0xf2, 0x63, 0x4c, 0x24, 0x3c,\n\t\t0xcf, 0x66, 0x03, 0x76, 0x1a, 0x8d, 0x31, 0xd3, 0x7a, 0xc9, 0x41, 0x63,\n\t\t0xd8, 0xc2, 0x8c, 0x0d, 0xd2, 0x8d, 0x62, 0x7a, 0xe4, 0x4b, 0x43, 0x26,\n\t\t0x60, 0x6f, 0xe7, 0xfd, 0x6f, 0x34, 0x3f, 0x9d, 0x81, 0x65, 0xa7, 0x16,\n\t\t0x90, 0x27, 0x99, 0x2c, 0x38, 0x92, 0xd2, 0x49, 0x1b, 0xbf, 0x6c, 0xd0,\n\t\t0x64, 0xc8, 0x30, 0x9b, 0xef, 0x6f, 0x73, 0xeb, 0xd7, 0x93, 0xfe, 0x7e,\n\t\t0x21, 0x8c, 0x70, 0x83, 0x9e, 0x3f, 0xb6, 0xa6, 0x0b, 0x13, 0xff, 0x7c,\n\t\t0xe8, 0xc1, 0xd0, 0x19, 0xb7, 0x5e, 0xb0, 0xe2, 0xc1, 0x21, 0xaa, 0xd3,\n\t\t0x10, 0x04, 0xbe, 0x62, 0x54, 0xd9, 0x6d, 0xf8, 0x65, 0xff, 0xca, 0x5d,\n\t\t0x58, 0x31, 0x0a, 0x8c, 0x7a, 0x22, 0xe0, 0xab, 0xf3, 0x85, 0x05, 0xc7,\n\t\t0x2a, 0xd4, 0xaa, 0xc1, 0x51, 0x00, 0xa4, 0x1c, 0x1f, 0x26, 0x78, 0x38,\n\t\t0xd2, 0x15, 0xd6, 0x31, 0xa9, 0x12, 0x6d, 0x4c, 0x03, 0x28, 0xfe, 0x6d,\n\t\t0x8c, 0xe3, 0x99, 0xca, 0x4b, 0x0e, 0x12, 0xed, 0x91, 0x76, 0x87, 0x86,\n\t\t0xb1, 0x39, 0x0e, 0xad, 0x16, 0xa6, 0x47, 0x7e, 0xdf, 0x27, 0x4c, 0x1e,\n\t\t0xa0, 0x7e, 0x77, 0x97, 0x1b, 0xe9, 0x34, 0x2c, 0x10, 0x0d, 0x94, 0x0f,\n\t\t0x3d, 0xfa, 0x57, 0x4c, 0xbd, 0xf6, 0x24, 0x96, 0x0d, 0x4b, 0x38, 0xa0,\n\t\t0x7b, 0x7f, 0x2c, 0xdf, 0xab, 0x41, 0xba, 0x48, 0x06, 0x21, 0xcd, 0x9d,\n\t\t0xb1, 0x30, 0xca, 0xe7, 0x9c, 0x85, 0xed, 0x49, 0x99, 0x16, 0x47, 0xeb,\n\t\t0xad, 0x22, 0x7f, 0x28, 0x13, 0x6b, 0x2a, 0x0b, 0x98, 0xd4, 0xb4, 0x34,\n\t\t0x39, 0xb7, 0x56, 0x03, 0xdc, 0x45, 0xe2, 0x27, 0xc4, 0xb8, 0x64, 0xe4,\n\t\t0xb8, 0x51, 0xa7, 0x7e, 0x76, 0xcf, 0xa6, 0x2a, 0xde, 0xed, 0x5f, 0xfc,\n\t\t0xe4, 0x42, 0x0a, 0x2b, 0xa0, 0x6d, 0x85, 0x56, 0x73, 0x05, 0xdc, 0x51,\n\t\t0x03, 0x16, 0x94, 0x57, 0xfb, 0xc3, 0xea, 0x44, 0x13, 0xb4, 0x03, 0x13,\n\t\t0x69, 0x6b, 0x61, 0x0f, 0xab, 0x2c, 0x75, 0xa7, 0x25, 0x0f, 0xe1, 0x2e,\n\t\t0x50, 0x82, 0x05, 0xcc, 0xb3, 0x7f, 0xa1, 0x5d, 0x2e, 0xfc, 0xf9, 0x13,\n\t\t0xe8, 0x2c, 0x7f, 0x9e, 0xa0, 0x3c, 0x28, 0x98, 0xba, 0xe7, 0xeb, 0xb7,\n\t\t0x8e, 0x30, 0x58, 0x77, 0xfe, 0xf2, 0xf3, 0x11, 0x28, 0x20, 0x97, 0xc1,\n\t\t0xec, 0x7e, 0x59, 0xee, 0xec, 0xf1, 0x61, 0xa1, 0x9b, 0xad, 0xc2, 0x5b,\n\t\t0x24, 0xdc, 0x72, 0x8b, 0x12, 0xb6, 0x91, 0x3c, 0x7f, 0x0c, 0xdf, 0xe3,\n\t\t0x13, 0x59, 0xe0, 0x84, 0xcd, 0x21, 0xf8, 0xde, 0x3f, 0xde, 0xfa, 0x85,\n\t\t0x97, 0x58, 0x34, 0xca, 0xf6, 0x75, 0xff, 0xac, 0x52, 0x83, 0x20, 0x21,\n\t\t0x56, 0x4d, 0x0e, 0x37, 0xdd, 0x0d, 0x9f, 0x59, 0xd1, 0x97, 0x9b, 0x95,\n\t\t0x5d, 0xba, 0x4d, 0x37, 0x69, 0xe8, 0xe0, 0x51, 0xa0, 0xa9, 0xe4, 0x87,\n\t\t0x95, 0xae, 0x37, 0x0f, 0x21, 0x10, 0x8c, 0x27, 0x89, 0x84, 0x51, 0x1c,\n\t\t0x2c, 0xe2, 0xe5, 0x54, 0xb4, 0x75, 0xfb, 0x3d, 0x49, 0xf4, 0x7c, 0x15,\n\t\t0xe2, 0x0b, 0xdc, 0x0e, 0xbd, 0xd4, 0x13, 0x5b, 0x38, 0x41, 0x62, 0x23,\n\t\t0xab, 0x9a, 0xa5, 0xb8, 0xf8, 0x4d, 0x9e, 0x66, 0x2e, 0xc7, 0xae, 0x9e,\n\t\t0x8b, 0x73, 0xb8, 0xc7, 0x78, 0x5f, 0xc6, 0x54, 0xea, 0xb2, 0xf5, 0x5e,\n\t\t0xef, 0xda, 0xd5, 0x31, 0x4a, 0xb2, 0x0d, 0xd5, 0xf8, 0xa1, 0xb5, 0x67,\n\t\t0x4d, 0xaf, 0xb5, 0x04, 0x07, 0xf4, 0x3c, 0xce, 0x0d, 0x7d, 0x46, 0x4f,\n\t\t0xb3, 0xf3, 0x08, 0x09, 0x47, 0x3e, 0xe7, 0xec, 0xb9, 0x90, 0x54, 0x02,\n\t\t0xfb, 0xad, 0x50, 0xb9, 0x9e, 0x46, 0x40, 0x9a, 0x0e, 0xcb, 0x08, 0x65,\n\t\t0x78, 0x23, 0x2c, 0xba, 0xbf, 0x2a, 0xae, 0x23, 0xf2, 0xa7, 0xa6, 0x68,\n\t\t0xe7, 0x7c, 0xee, 0x35, 0xc2, 0xa6, 0x01, 0xa4, 0x36, 0x26, 0xb6, 0xb7,\n\t\t0x37, 0x85, 0xe8, 0xe8, 0xee, 0x2f, 0xe0, 0xa5, 0x94, 0xa3, 0x81, 0x54,\n\t\t0xc8, 0xf8, 0xde, 0xee, 0xf1, 0x4a, 0x08, 0x7d, 0x78, 0xf6, 0x8a, 0xf4,\n\t\t0x6f, 0x2e, 0x5e, 0xf8, 0x50, 0xa5, 0xdf, 0x28, 0x31, 0x9d, 0x44, 0x52,\n\t\t0x10, 0x69, 0x41, 0x35, 0xd3, 0x10, 0xa5, 0x7f, 0x09, 0x21, 0x28, 0x68,\n\t\t0x25, 0xf9, 0xbb, 0x9e, 0x92, 0x84, 0xb5, 0x50, 0xa6, 0xd4, 0x92, 0x0a,\n\t\t0x84, 0xe4, 0x17, 0x84, 0x23, 0x3b, 0xc1, 0x91, 0x5d, 0xe0, 0xac, 0x75,\n\t\t0xc9, 0xca, 0x6a, 0x5c, 0x7a, 0xd0, 0x75, 0x23, 0xec, 0x1b, 0x3f, 0x94,\n\t\t0xec, 0xe8, 0xe6, 0xa9, 0xb0, 0xf9, 0x01, 0x2c, 0x20, 0xb0, 0x0d, 0x5a,\n\t\t0x6e, 0xe9, 0x95, 0x87, 0x91, 0xc2, 0xa5, 0x77, 0xfb, 0x43, 0x9a, 0x41,\n\t\t0x9c, 0xa8, 0x9b, 0xf9, 0x40, 0x81, 0xc6, 0xc1, 0xa3, 0x2e, 0x66, 0xd2,\n\t\t0x04, 0x27, 0x28, 0x3b, 0x05, 0xbe, 0x98, 0x73, 0x74, 0x44, 0x9d, 0x49,\n\t\t0x49, 0xe6, 0xab, 0x58, 0xdd, 0x18, 0xc7, 0x1d, 0x4a, 0x22, 0xb6, 0x93,\n\t\t0x74, 0x76, 0xed, 0xe2, 0x2f, 0x64, 0x34, 0x12, 0x23, 0x64, 0x14, 0x37,\n\t\t0x14, 0xef, 0xe0, 0xf7, 0xe1, 0xb2, 0xfb, 0x26, 0xe2, 0x3e, 0xa4, 0xb8,\n\t\t0x3c, 0x5c, 0xf3, 0x99, 0xc0, 0x2f, 0x0d, 0x8f, 0x26, 0x8c, 0xcf, 0x85,\n\t\t0x36, 0xc4, 0x7e, 0x4c, 0x0c, 0x4d, 0x44, 0x6c, 0x39, 0x55, 0x8d, 0x17,\n\t\t0x24, 0xd1, 0x24, 0x96, 0xb2, 0x63, 0xf4, 0x36, 0x3f, 0x9d, 0xf2, 0x59,\n\t\t0xce, 0x0d, 0x9d, 0x2a, 0xe9, 0x84, 0xbd, 0x25, 0x34, 0xe5, 0x24, 0x10,\n\t\t0x80, 0xa9, 0xda, 0xeb, 0xb3, 0x7f, 0x01, 0xf7, 0x98, 0x98, 0x8c, 0xfe,\n\t\t0x6c, 0x43, 0xba, 0x01, 0xce, 0xdc, 0xd3, 0xf6, 0x93, 0xfa, 0xbc, 0x5b,\n\t\t0x52, 0xb7, 0xfe, 0x83, 0xe7, 0x02, 0xd8, 0xcd, 0xc9, 0xeb, 0xc8, 0xdc,\n\t\t0xef, 0x3f, 0xd0, 0xe7, 0x3d, 0x18, 0x3b, 0x1e, 0xfc, 0xc3, 0x5f, 0x42,\n\t\t0xed, 0x7a, 0x58, 0xe9, 0x7a, 0x44, 0xb2, 0xd4, 0x48, 0x5e, 0x76, 0x11,\n\t\t0x8e, 0xd4, 0xfc, 0xb5, 0xfc, 0x67, 0xdc, 0xd8, 0x87, 0xc1, 0x9a, 0x47,\n\t\t0x3a, 0x56, 0x47, 0xbe, 0xb3, 0x99, 0xc3, 0xa2, 0xc2, 0xff, 0x72, 0x7e,\n\t\t0xbf, 0xa7, 0xae, 0xb6, 0x24, 0xd5, 0xff, 0x54, 0x5f, 0xe2, 0xae, 0xff,\n\t\t0x90, 0x98, 0x98, 0xa2, 0x44, 0xc1, 0x3c, 0xef, 0x71, 0x30, 0x2b, 0xf9,\n\t\t0x0c, 0x8d, 0x1f, 0xf8, 0x43, 0x80, 0x68, 0xf4, 0x0b, 0xd1, 0x7f, 0x94,\n\t\t0x29, 0xe1, 0x53, 0x98, 0xd8, 0x3f, 0xfe, 0x45, 0xda, 0xb5, 0xc5, 0xe5,\n\t\t0x99, 0x66, 0xce, 0x3b, 0x9c, 0xf9, 0x23, 0xaf, 0x18, 0x54, 0xb7, 0xf3,\n\t\t0xe6, 0x23, 0x22, 0x91, 0x5b, 0xc9, 0xc9, 0x75, 0x1e, 0xf2, 0x13, 0xb1,\n\t\t0x42, 0x36, 0x41, 0x4c, 0xe6, 0xbd, 0x79, 0xc7, 0x5e, 0xf7, 0x3c, 0x01,\n\t\t0x0a, 0x81, 0x99, 0xab, 0xe1, 0x65, 0xda, 0x86, 0xa6, 0xc1, 0x66, 0x24,\n\t\t0xaf, 0xb3, 0x9b, 0xab, 0xb0, 0x40, 0xed, 0x54, 0x5d, 0x82, 0x40, 0x3b,\n\t\t0xf3, 0xf3, 0xa8, 0x38, 0x3b, 0xde, 0x76, 0xb5, 0x2b, 0x62, 0x15, 0xb9,\n\t\t0x7e, 0x36, 0x0b, 0x9f, 0xa9, 0xbd, 0xe1, 0x15, 0x3a, 0x14, 0x71, 0x8e,\n\t\t0x1b, 0x30, 0x4b, 0xfb, 0x6e, 0x0f, 0x10, 0x87, 0x19, 0xd8, 0xc7, 0xcf,\n\t\t0xa1, 0xae, 0xe0, 0x6e, 0xef, 0x98, 0x09, 0x17, 0x0a, 0x66, 0x75, 0x93,\n\t\t0x03, 0x81, 0xa0, 0xe0, 0x47, 0x13, 0x0e, 0x23, 0xef, 0xa4, 0x37, 0x9a,\n\t\t0x3b, 0xda, 0xac, 0xde, 0xeb, 0x8f, 0x32, 0x35, 0x9f, 0x77, 0xe6, 0x52,\n\t\t0xbd, 0x58, 0xdb, 0x55, 0x93, 0x82, 0x79, 0x5b, 0x3d, 0x8e, 0xd7, 0xb0,\n\t\t0x5a, 0xb3, 0x34, 0xa4, 0x20, 0x89, 0x7f, 0x11, 0x8b, 0xcc, 0xd8, 0xf7,\n\t\t0x58, 0x8b, 0xbf, 0x8f, 0x5b, 0xd5, 0xe7, 0x7f, 0xe0, 0x23, 0x60, 0x18,\n\t\t0xbb, 0x1c, 0x94, 0x0a, 0x22, 0xaa, 0x9a, 0xdd, 0x53, 0x1e, 0xfa, 0xd9,\n\t\t0xc5, 0xf3, 0xb9, 0x00, 0x0c, 0xc4, 0xd7, 0xa6, 0xea, 0x94, 0xe7, 0x58,\n\t\t0xd9, 0xbd, 0x52, 0x95, 0xfc, 0x24, 0x69, 0xf8, 0x9b, 0x29, 0xa6, 0xa5,\n\t\t0x91, 0x04, 0x50, 0x92, 0xa6, 0x41, 0x24, 0x62, 0x10, 0x0d, 0x05, 0x97,\n\t\t0x76, 0xf3, 0x2c, 0xb7, 0xe4, 0x2e, 0xe8, 0x44, 0xd1, 0x1b, 0x24, 0x07,\n\t\t0x5e, 0x8a, 0xa0, 0xdf, 0x93, 0x4d, 0x09, 0x2f, 0x76, 0xf4, 0xbb, 0x28,\n\t\t0x4a, 0x89, 0xd0, 0x01, 0x87, 0x8e, 0xb6, 0x69, 0xa7, 0xae, 0x37, 0xf3,\n\t\t0x17, 0x9d, 0xfe, 0xb8, 0x2d, 0xc5, 0x68, 0xed, 0xa3, 0x59, 0x7d, 0xe2,\n\t\t0x3c, 0x92, 0xd1, 0xb4, 0x8a, 0x44, 0xfb, 0x17, 0x87, 0xfb, 0xb4, 0xea,\n\t\t0xd6, 0x7b, 0xe2, 0xbe, 0xe8, 0xd2, 0x7d, 0x6c, 0x4c, 0x00, 0x16, 0x76,\n\t\t0x77, 0x79, 0x0a, 0x32, 0xd3, 0xe6, 0xf2, 0xb4, 0x82, 0xef, 0xd4, 0x92,\n\t\t0x6a, 0xca, 0xc5, 0xe9, 0xa8, 0xcf, 0x19, 0xf0, 0xe3, 0xc1, 0x3c, 0x93,\n\t\t0x2d, 0x6d, 0xa2, 0x38, 0x2e, 0xcc, 0x22, 0x5e, 0xbd, 0x53, 0xba, 0xba,\n\t\t0xd8, 0x17, 0x62, 0x74, 0x53, 0x2d, 0x8b, 0x53, 0xd8, 0x98, 0x57, 0xab,\n\t\t0x1d, 0xa9, 0x09, 0x47, 0x47, 0x8b, 0x09, 0x59, 0xd0, 0xe2, 0xb4, 0x21,\n\t\t0x51, 0x6c, 0x8f, 0xde, 0x6e, 0x60, 0xf3, 0x35, 0x82, 0xea, 0xbb, 0xfe,\n\t\t0x8b, 0x70, 0xe4, 0xc3, 0x5a, 0x90, 0x3a, 0x16, 0xfb, 0x19, 0x70, 0xc2,\n\t\t0xf0, 0x08, 0xbb, 0xd6, 0x47, 0x79, 0x65, 0x02, 0x90, 0x5e, 0xa2, 0x69,\n\t\t0x91, 0x28, 0x9e, 0x09, 0x60, 0xc1, 0x75, 0x7f, 0x9c, 0x2c, 0x0e, 0xf9,\n\t\t0xda, 0xa8, 0x49, 0x86, 0xf1, 0x1b, 0xfd, 0x9e, 0x51, 0x84, 0xce, 0x66,\n\t\t0xde, 0x10, 0x1a, 0x0c, 0xce, 0x7c, 0x89, 0x9b, 0x0e, 0x16, 0x26, 0x08,\n\t\t0xd9, 0x69, 0xa1, 0xa5, 0x21, 0x6c, 0xf9, 0xe9, 0x3d, 0xbc, 0x1e, 0x58,\n\t\t0xe2, 0x5e, 0x37, 0x2a, 0xe9, 0xb9, 0x80, 0x78, 0xf9, 0x7a, 0x99, 0x08,\n\t\t0xc4, 0x9b, 0x5a, 0xea, 0x75, 0x9c, 0xfe, 0x9a, 0x18, 0x7e, 0x66, 0x09,\n\t\t0xf7, 0x5b, 0x6e, 0xf5, 0x43, 0xbd, 0x29, 0x55, 0x39, 0x1e, 0x21, 0xfb,\n\t\t0x09, 0x2b, 0xdb, 0x69, 0xf9, 0x34, 0x66, 0xf2, 0xdd, 0xbb, 0x77, 0xc4,\n\t\t0xb4, 0xb4, 0x11, 0x3f, 0x7f, 0xaa, 0xe7, 0xe5, 0xe5, 0xb5, 0x8f, 0x5b,\n\t\t0xcc, 0x8d, 0x33, 0x7c, 0xf4, 0xf7, 0x3a, 0x1e, 0xf8, 0xc0, 0x67, 0xd5,\n\t\t0x59, 0x03, 0xc6, 0xec, 0xd0, 0x66, 0x84, 0xba, 0xe8, 0x15, 0x3f, 0x0e,\n\t\t0x8d, 0xc9, 0xec, 0x3d, 0xf8, 0xf4, 0x59, 0x24, 0x09, 0xf9, 0x11, 0xe8,\n\t\t0xbe, 0x86, 0xc4, 0x32, 0xf8, 0x12, 0x09, 0x6c, 0x3d, 0x78, 0x37, 0xeb,\n\t\t0xd4, 0x73, 0x77, 0xe0, 0xed, 0x96, 0xe1, 0x4d, 0x5e, 0xd3, 0x22, 0x72,\n\t\t0xbe, 0x54, 0x40, 0x16, 0xe7, 0xb2, 0xa6, 0x63, 0x5a, 0x17, 0x2d, 0x55,\n\t\t0xef, 0xe2, 0xe1, 0xda, 0xc5, 0x65, 0x07, 0x1d, 0xb2, 0xf7, 0x5e, 0x4e,\n\t\t0xab, 0xa4, 0x54, 0xfc, 0x15, 0x8c, 0x52, 0xf3, 0x74, 0x51, 0xba, 0xb4,\n\t\t0xb5, 0xc2, 0xd3, 0x5c, 0x46, 0xb5, 0x04, 0xf0, 0xad, 0x91, 0x60, 0x8e,\n\t\t0xda, 0xc5, 0xd9, 0xd2, 0xac, 0x2c, 0x10, 0xea, 0xf7, 0xe3, 0xa1, 0x8c,\n\t\t0xfe, 0x38, 0xd5, 0xb3, 0x35, 0xba, 0x73, 0xd2, 0xfc, 0x74, 0x9e, 0x0b,\n\t\t0x62, 0x84, 0x01, 0x48, 0x31, 0xb4, 0x8f, 0xf7, 0x6f, 0x7e, 0x43, 0x46,\n\t\t0x69, 0x75, 0xf4, 0xa6, 0x01, 0x31, 0x81, 0x55, 0x30, 0x92, 0xd1, 0xc5,\n\t\t0x83, 0x5b, 0x18, 0xf6, 0x59, 0x4d, 0xf1, 0xd5, 0xfe, 0x86, 0x04, 0xb9,\n\t\t0x8d, 0xb9, 0x7a, 0x32, 0xd6, 0x77, 0x61, 0x17, 0xee, 0xbb, 0x3f, 0x5b,\n\t\t0x97, 0x5f, 0x4b, 0xe6, 0xe6, 0xee, 0x82, 0x19, 0xf0, 0x53, 0x62, 0xb9,\n\t\t0x43, 0x80, 0x04, 0x53, 0x66, 0x4f, 0x98, 0xd0, 0x5a, 0x56, 0x93, 0x4b,\n\t\t0xaf, 0x38, 0xeb, 0x2c, 0xa3, 0xcf, 0x14, 0xb8, 0x38, 0x7a, 0xa4, 0xaa,\n\t\t0x6a, 0x98, 0xff, 0xb4, 0xd2, 0x70, 0x86, 0x92, 0xc5, 0xa5, 0xa6, 0x7e,\n\t\t0xee, 0xef, 0x57, 0x33, 0xbb, 0x62, 0x85, 0x40, 0xd0, 0xea, 0x96, 0xfd,\n\t\t0xc5, 0x07, 0x07, 0x0d, 0xa5, 0xb9, 0x2e, 0x84, 0x77, 0x8f, 0x3b, 0x49,\n\t\t0xab, 0x9d, 0xa7, 0xff, 0x94, 0x09, 0x73, 0xb7, 0x36, 0xd6, 0x32, 0xcc,\n\t\t0x5f, 0xd2, 0xc9, 0xca, 0x0d, 0x52, 0xef, 0x89, 0x23, 0xdd, 0x06, 0xfc,\n\t\t0xf0, 0x46, 0x60, 0x74, 0x9a, 0x6f, 0xd0, 0x25, 0xa0, 0xf1, 0xb7, 0xa3,\n\t\t0x22, 0x74, 0xbb, 0x53, 0x68, 0x68, 0xf2, 0x31, 0xba, 0xba, 0xfb, 0x39,\n\t\t0x49, 0x22, 0x10, 0x47, 0xb7, 0x52, 0x27, 0x6c, 0x39, 0x32, 0x0a, 0x32,\n\t\t0x37, 0xb8, 0x8e, 0xae, 0xee, 0x9a, 0xdc, 0xc8, 0x30, 0x11, 0x1a, 0x45,\n\t\t0x1d, 0xbc, 0x5b, 0xea, 0xdf, 0x9f, 0x04, 0xfd, 0x4a, 0x8b, 0x1e, 0xab,\n\t\t0x4c, 0x71, 0x76, 0x76, 0xec, 0x4c, 0xff, 0xeb, 0xa7, 0x1e, 0x7b, 0x33,\n\t\t0x1f, 0xbb, 0xbb, 0xbb, 0xf5, 0xce, 0x3d, 0x97, 0xef, 0xc5, 0x39, 0x91,\n\t\t0x70, 0x9e, 0x49, 0x8d, 0xc3, 0xfd, 0x96, 0x38, 0x4e, 0x78, 0x5e, 0xc6,\n\t\t0x40, 0xc7, 0x68, 0x25, 0xee, 0x95, 0xd0, 0x35, 0x53, 0x11, 0x4f, 0x31,\n\t\t0x39, 0x21, 0x88, 0x86, 0x14, 0x96, 0xf6, 0xfa, 0x63, 0x20, 0x39, 0x32,\n\t\t0x53, 0x7c, 0x23, 0x8e, 0x09, 0xf7, 0x58, 0x16, 0xf5, 0xfc, 0x2d, 0xb4,\n\t\t0xbd, 0x1d, 0xfb, 0x8e, 0x96, 0x26, 0x5a, 0xbd, 0xce, 0x10, 0x9e, 0x84,\n\t\t0x5e, 0xbb, 0xf9, 0x4d, 0x04, 0x46, 0x80, 0xba, 0x81, 0x9a, 0xd7, 0x5c,\n\t\t0xa6, 0x69, 0x74, 0x58, 0xb4, 0x4f, 0x78, 0xd9, 0xf7, 0x93, 0x4d, 0x86,\n\t\t0x37, 0x56, 0x7e, 0x7e, 0xd9, 0x61, 0xe2, 0x4d, 0xc8, 0x65, 0x37, 0x32,\n\t\t0xd4, 0xda, 0x7c, 0x6e, 0x78, 0xda, 0x5b, 0xf7, 0x5d, 0x0b, 0x20, 0x1e,\n\t\t0xae, 0x12, 0x76, 0x44, 0x5c, 0x6f, 0x05, 0x08, 0xe9, 0x24, 0x3f, 0xdf,\n\t\t0xe6, 0xa8, 0x1d, 0x26, 0xf7, 0xa6, 0x40, 0xa2, 0xe0, 0xf3, 0x2a, 0x32,\n\t\t0x08, 0x96, 0x7f, 0x8c, 0x98, 0x41, 0x6f, 0xe6, 0xf7, 0x0b, 0x13, 0x19,\n\t\t0x08, 0x92, 0xc1, 0x99, 0x7f, 0x24, 0x97, 0x71, 0x10, 0x6e, 0x2a, 0x1d,\n\t\t0x13, 0x81, 0x27, 0xf4, 0xaf, 0x8c, 0x84, 0x97, 0xbc, 0x98, 0x2d, 0x60,\n\t\t0x30, 0xf1, 0x3f, 0x3f, 0x05, 0x05, 0x05, 0xbd, 0xb6, 0xd2, 0x3d, 0x8f,\n\t\t0x0e, 0x9a, 0x0e, 0x6b, 0x77, 0x45, 0x2e, 0xbb, 0xef, 0x3c, 0x57, 0x0a,\n\t\t0x43, 0x0f, 0x74, 0x38, 0x0b, 0xa7, 0x85, 0x53, 0xe2, 0xcc, 0x8c, 0x43,\n\t\t0xcc, 0x48, 0x34, 0x20, 0x42, 0x07, 0x2c, 0x1a, 0xdf, 0xac, 0xba, 0x1c,\n\t\t0x2a, 0x4d, 0x7f, 0x8b, 0x52, 0x4d, 0x6c, 0x28, 0x6b, 0x1d, 0x3d, 0xa9,\n\t\t0x11, 0x73, 0x85, 0xf9, 0xdd, 0x65, 0xd7, 0x26, 0xcb, 0x30, 0x23, 0x8c,\n\t\t0xc9, 0x00, 0x80, 0x94, 0x05, 0x32, 0x21, 0xa4, 0x9f, 0x0e, 0x05, 0x0f,\n\t\t0x8f, 0x4e, 0xb7, 0x5d, 0xef, 0x3e, 0x5f, 0xf8, 0x70, 0xd8, 0x42, 0xef,\n\t\t0x13, 0xe5, 0x77, 0x73, 0xb1, 0x5a, 0xd9, 0xc7, 0x20, 0xaf, 0xa7, 0x97,\n\t\t0xa4, 0xf6, 0x8f, 0xb9, 0xda, 0xb1, 0x8b, 0xf4, 0x52, 0xe3, 0xd3, 0x78,\n\t\t0xd6, 0xdf, 0xb1, 0xbf, 0xa2, 0xeb, 0x51, 0x7e, 0x18, 0x45, 0xef, 0xfe,\n\t\t0x02, 0x10, 0x66, 0xb1, 0x58, 0xd7, 0x8e, 0x35, 0xd2, 0x0c, 0x7a, 0x21,\n\t\t0x8a, 0x59, 0x61, 0xf2, 0x4b, 0xfd, 0x7d, 0x59, 0x01, 0x86, 0x00, 0xc0,\n\t\t0x54, 0xc2, 0x85, 0x3a, 0xb2, 0xd2, 0xf8, 0x72, 0x47, 0x8e, 0xd5, 0xff,\n\t\t0xa8, 0x4a, 0xed, 0x15, 0x95, 0xb1, 0xb3, 0x11, 0x1a, 0xca, 0xe2, 0xd4,\n\t\t0x51, 0xc2, 0xaa, 0xee, 0xee, 0x7d, 0x1a, 0x68, 0x9b, 0x1f, 0x41, 0x47,\n\t\t0xf3, 0xcb, 0xf7, 0x14, 0xb8, 0xb8, 0xb8, 0x0c, 0x76, 0x82, 0xc9, 0x5f,\n\t\t0xbe, 0xac, 0x34, 0xfe, 0x2d, 0x93, 0x77, 0x74, 0x2c, 0x53, 0xfb, 0x37,\n\t\t0x13, 0x37, 0x6d, 0xbe, 0x11, 0xdf, 0x40, 0xd9, 0xc2, 0xb6, 0x45, 0xe7,\n\t\t0x1d, 0x6c, 0x05, 0x34, 0x3a, 0x58, 0xb9, 0x4b, 0xee, 0x64, 0xa6, 0xfe,\n\t\t0x2a, 0x98, 0x27, 0xb4, 0xa1, 0x91, 0xe7, 0x78, 0xfb, 0x2e, 0xfe, 0x53,\n\t\t0x55, 0x5f, 0x5e, 0x70, 0x70, 0x16, 0x06, 0x4e, 0x59, 0x2b, 0xd9, 0x79,\n\t\t0x93, 0x5b, 0x8e, 0x7c, 0x4d, 0xf8, 0x30, 0xaf, 0x23, 0x18, 0x49, 0x5d,\n\t\t0x0b, 0x77, 0x1c, 0xb9, 0xad, 0x51, 0x47, 0x30, 0x6d, 0xbf, 0x98, 0xdc,\n\t\t0x95, 0x52, 0xb1, 0x86, 0x3f, 0x19, 0xce, 0xd6, 0x08, 0x0b, 0x55, 0x56,\n\t\t0xc5, 0x96, 0x51, 0x7e, 0x33, 0x35, 0x16, 0x7b, 0xaf, 0xa9, 0xcd, 0x8f,\n\t\t0x1d, 0xa8, 0xc4, 0xe0, 0xdd, 0x0d, 0x8b, 0x69, 0x97, 0x97, 0x97, 0x3f,\n\t\t0xde, 0xab, 0x1e, 0xb5, 0xb8, 0xbf, 0xfd, 0xc7, 0xbd, 0x71, 0xcc, 0x3e,\n\t\t0x11, 0x97, 0x60, 0x86, 0x0e, 0x25, 0x8b, 0x35, 0xd3, 0xf9, 0x2d, 0xd1,\n\t\t0xd6, 0xb0, 0x78, 0xd0, 0xbe, 0xda, 0xad, 0x3d, 0xe3, 0xce, 0x8b, 0x46,\n\t\t0xf1, 0xf7, 0x9f, 0x62, 0xc5, 0xac, 0x43, 0xb0, 0xfc, 0xc1, 0x36, 0xfb,\n\t\t0x7c, 0x8e, 0x09, 0xd8, 0x4d, 0xc9, 0xca, 0xe0, 0x5e, 0x83, 0xec, 0xbc,\n\t\t0x07, 0x0d, 0x6d, 0xfa, 0xe0, 0xfb, 0xf7, 0x99, 0x59, 0x7b, 0x99, 0x06,\n\t\t0xce, 0xe9, 0x2e, 0x87, 0xd6, 0x66, 0x97, 0x4d, 0x04, 0x58, 0x4e, 0x99,\n\t\t0x3d, 0x8c, 0x84, 0xea, 0x45, 0x1e, 0xda, 0x0a, 0xa8, 0xbe, 0xad, 0x4d,\n\t\t0x9a, 0x87, 0x9b, 0x7b, 0x33, 0x43, 0xc7, 0xc4, 0x64, 0xd8, 0x5d, 0x8c,\n\t\t0xde, 0xa9, 0xd1, 0x7a, 0x82, 0x08, 0x66, 0xab, 0xbb, 0xd9, 0xc0, 0x38,\n\t\t0x80, 0x65, 0x1b, 0x13, 0x61, 0x31, 0x26, 0xc6, 0xe4, 0xfc, 0x4d, 0x43,\n\t\t0x98, 0xbb, 0xfb, 0xf4, 0x32, 0x0d, 0x2c, 0x87, 0x73, 0x0c, 0x8e, 0xda,\n\t\t0xdc, 0xad, 0x74, 0x56, 0x75, 0x8b, 0xa0, 0xe0, 0x3a, 0xb1, 0xe5, 0x77,\n\t\t0xe2, 0xf7, 0xbd, 0x3a, 0xd2, 0x50, 0x5f, 0x1a, 0x56, 0x59, 0x60, 0xc1,\n\t\t0xf1, 0xe7, 0x8b, 0xc4, 0x94, 0x7c, 0x82, 0xf3, 0x09, 0x5d, 0x6c, 0xf5,\n\t\t0x82, 0x44, 0x6e, 0xee, 0x23, 0x43, 0x03, 0xe9, 0x2f, 0x42, 0x21, 0xa3,\n\t\t0x9d, 0x92, 0x6f, 0xcb, 0x1f, 0xce, 0xb6, 0x3f, 0x6e, 0x65, 0x7c, 0x18,\n\t\t0x59, 0x9f, 0x96, 0xf8, 0x70, 0xc1, 0xa9, 0xa5, 0xad, 0xbd, 0x38, 0xf9,\n\t\t0x1d, 0x0e, 0xfa, 0x82, 0x1e, 0x86, 0x6e, 0xc9, 0x6c, 0xee, 0xe9, 0xa3,\n\t\t0x52, 0x56, 0x0b, 0x9a, 0xc1, 0xce, 0x4a, 0xe3, 0x73, 0x47, 0xdb, 0x12,\n\t\t0xc2, 0x87, 0x59, 0x48, 0x07, 0x12, 0x6d, 0x2d, 0x50, 0x60, 0x85, 0x11,\n\t\t0xf6, 0x22, 0x2c, 0x03, 0x37, 0xd0, 0x8a, 0x2c, 0x47, 0xde, 0xd7, 0x80,\n\t\t0x98, 0x70, 0x7a, 0xe5, 0x64, 0x71, 0xfa, 0x6b, 0xe7, 0x5f, 0x7d, 0x8b,\n\t\t0x8d, 0xa5, 0x3d, 0x1d, 0x1a, 0x6c, 0x75, 0x04, 0x81, 0x46, 0xec, 0x04,\n\t\t0xa8, 0x21, 0x08, 0x70, 0x66, 0x8e, 0x8a, 0x0c, 0x0c, 0xdf, 0x63, 0x63,\n\t\t0x30, 0x91, 0xc1, 0x29, 0x75, 0xa8, 0xea, 0xa7, 0xcd, 0x68, 0xc6, 0xfe,\n\t\t0xb7, 0xf3, 0x92, 0x1b, 0xcc, 0xed, 0x69, 0x64, 0x3b, 0x06, 0xfa, 0x37,\n\t\t0xda, 0x8f, 0x15, 0x71, 0x41, 0x63, 0x7f, 0x85, 0xa0, 0x91, 0x34, 0xf3,\n\t\t0xd5, 0x5b, 0x99, 0xb7, 0x5f, 0x1a, 0xa4, 0x81, 0x30, 0x84, 0x25, 0x4f,\n\t\t0xfc, 0x55, 0x52, 0x07, 0xa5, 0xd0, 0x83, 0x50, 0xb7, 0x67, 0xd6, 0x19,\n\t\t0x96, 0x32, 0xbc, 0xde, 0xfe, 0xfb, 0xbb, 0x14, 0xe8, 0x64, 0x5e, 0x56,\n\t\t0x77, 0xf0, 0xfa, 0xa7, 0xe4, 0x08, 0x7f, 0x02, 0x96, 0xbc, 0x13, 0x8e,\n\t\t0x8e, 0xce, 0xf6, 0x39, 0x72, 0x67, 0x7d, 0x2c, 0x45, 0xa7, 0xce, 0x71,\n\t\t0x71, 0xf7, 0xd8, 0xd2, 0x54, 0x53, 0xb3, 0x1d, 0x03, 0x03, 0xc3, 0x88,\n\t\t0xd5, 0x4d, 0x16, 0xc7, 0xcf, 0x68, 0xe0, 0x83, 0x2c, 0x0e, 0x04, 0xe1,\n\t\t0x66, 0x10, 0x4f, 0xf6, 0x8f, 0x84, 0x86, 0x74, 0x77, 0xa6, 0x12, 0xd6,\n\t\t0xc0, 0x39, 0xc4, 0xf0, 0x6a, 0xb3, 0x8a, 0xf3, 0xb4, 0xed, 0x76, 0x83,\n\t\t0xc7, 0x31, 0xde, 0x5b, 0xd3, 0x57, 0xa6, 0xdd, 0xb2, 0x0e, 0x3e, 0x40,\n\t\t0x2a, 0x87, 0x03, 0xc9, 0x7b, 0x1c, 0x79, 0x4e, 0x84, 0xad, 0xe3, 0x0e,\n\t\t0xaa, 0x67, 0xc2, 0x91, 0x10, 0x12, 0xfa, 0xbd, 0x3e, 0x70, 0x3b, 0x2c,\n\t\t0xbc, 0xec, 0x90, 0xf8, 0xf3, 0x25, 0x1f, 0x6f, 0x66, 0x65, 0x71, 0x27,\n\t\t0x59, 0x0b, 0x35, 0x2a, 0x41, 0x6f, 0x26, 0xcb, 0xcd, 0xf2, 0xdb, 0xf5,\n\t\t0x57, 0x3c, 0x6d, 0xd5, 0x8b, 0x88, 0x24, 0xcf, 0x62, 0x95, 0x12, 0x44,\n\t\t0xb7, 0x90, 0x6d, 0x27, 0x83, 0xcf, 0x1d, 0x97, 0xbe, 0x16, 0x0f, 0xd6,\n\t\t0xcc, 0xbd, 0x7d, 0xf3, 0xdc, 0x9b, 0x07, 0x98, 0x36, 0x96, 0x5b, 0xad,\n\t\t0x78, 0xff, 0x01, 0x87, 0x26, 0xc1, 0x5e, 0x46, 0x06, 0x34, 0x3a, 0x3c,\n\t\t0x7c, 0x6e, 0xcb, 0x6f, 0x56, 0x63, 0x9f, 0xf8, 0xd5, 0x92, 0x5b, 0x9f,\n\t\t0xa5, 0xf0, 0x41, 0x80, 0xf5, 0x10, 0x03, 0x88, 0xce, 0x2f, 0x2b, 0xbb,\n\t\t0x9a, 0xe9, 0x5d, 0xaa, 0x09, 0xf2, 0x2c, 0xbe, 0x4a, 0xc7, 0x99, 0x8a,\n\t\t0x8e, 0xdc, 0x81, 0xe6, 0xbc, 0x3c, 0xc4, 0xcd, 0xbf, 0x7f, 0xa2, 0x2d,\n\t\t0x3c, 0xc2, 0x3a, 0x20, 0xb4, 0x00, 0x2c, 0x39, 0xc5, 0x67, 0x3e, 0xcc,\n\t\t0x28, 0x73, 0x65, 0xea, 0x64, 0xb9, 0xf7, 0xe1, 0xbd, 0x7f, 0x7c, 0x96,\n\t\t0xfd, 0x2e, 0xbd, 0x05, 0x52, 0x8d, 0x4a, 0xf5, 0xa4, 0x60, 0xbd, 0x04,\n\t\t0x5b, 0x06, 0x73, 0x83, 0x18, 0xe8, 0x8e, 0x0c, 0xb9, 0x7b, 0xf4, 0x4c,\n\t\t0x80, 0x77, 0x8d, 0x22, 0x35, 0xd7, 0x21, 0xad, 0xaf, 0x4a, 0xe1, 0x50,\n\t\t0x32, 0x6f, 0x6b, 0xeb, 0x6f, 0x4a, 0xa4, 0xd7, 0x7f, 0xcb, 0xdb, 0x0e,\n\t\t0xf8, 0x47, 0x8c, 0xcb, 0x19, 0xfd, 0x9a, 0x3a, 0xeb, 0x02, 0x51, 0x41,\n\t\t0x9b, 0x53, 0x8c, 0x56, 0x0f, 0x61, 0x7a, 0xb4, 0xa7, 0x08, 0x0b, 0x4a,\n\t\t0x97, 0xf0, 0xae, 0x52, 0x4a, 0x00, 0x46, 0xb2, 0x4d, 0xdb, 0xd7, 0x68,\n\t\t0x44, 0x94, 0x9d, 0xa5, 0x2c, 0x7b, 0x20, 0x00, 0x33, 0x38, 0x0d, 0x1c,\n\t\t0xb2, 0xf5, 0xd7, 0x58, 0x32, 0xb6, 0x1a, 0x15, 0x46, 0xb5, 0x0e, 0xc7,\n\t\t0xb6, 0x72, 0x01, 0xeb, 0x51, 0xc2, 0xc8, 0xf8, 0x06, 0xb3, 0xde, 0x30,\n\t\t0x62, 0xa7, 0x9d, 0x2f, 0x2d, 0x18, 0xa8, 0x40, 0x50, 0x0a, 0x5b, 0x74,\n\t\t0xab, 0xc8, 0x92, 0x61, 0xc4, 0xe4, 0xf2, 0x75, 0x28, 0x2a, 0x28, 0x38,\n\t\t0x7f, 0x1d, 0xde, 0x1c, 0x47, 0x48, 0xb9, 0xac, 0x29, 0x14, 0x20, 0x1c,\n\t\t0x7d, 0xe5, 0x67, 0xc5, 0x65, 0x00, 0xaf, 0xaf, 0x40, 0x2a, 0x34, 0xce,\n\t\t0xf4, 0xc8, 0x90, 0x48, 0x2e, 0xd3, 0xe6, 0x99, 0xdc, 0x81, 0x05, 0x8b,\n\t\t0xca, 0x7a, 0xf5, 0xc3, 0xa2, 0x71, 0x82, 0xb4, 0xbc, 0xed, 0xc7, 0x28,\n\t\t0x7f, 0x7d, 0xd1, 0x60, 0x68, 0x6a, 0xe3, 0x29, 0xc6, 0x1f, 0x2e, 0x0f,\n\t\t0x86, 0xff, 0xee, 0xee, 0x4a, 0xa4, 0x8d, 0x25, 0xf3, 0x98, 0x1d, 0x4c,\n\t\t0x52, 0x6b, 0xc0, 0xd9, 0x78, 0x9d, 0xf9, 0xb5, 0x2f, 0x08, 0x01, 0x5f,\n\t\t0x20, 0x26, 0x48, 0xc5, 0xd3, 0xaf, 0x4b, 0x91, 0x76, 0xea, 0xb6, 0xea,\n\t\t0x15, 0xa7, 0x5b, 0xa3, 0x9e, 0x2a, 0xad, 0x40, 0x02, 0x0b, 0x32, 0x7c,\n\t\t0xc2, 0x63, 0x68, 0x85, 0xa3, 0x9d, 0xe6, 0x7e, 0xec, 0x84, 0x27, 0x78,\n\t\t0x6b, 0x68, 0x10, 0x5e, 0x5e, 0x5e, 0x7a, 0xfa, 0x07, 0xb4, 0x2a, 0xfc,\n\t\t0xff, 0x99, 0xa1, 0x04, 0xa9, 0xf8, 0x05, 0x7d, 0xfb, 0x4d, 0x1e, 0xfb,\n\t\t0xae, 0x2a, 0xed, 0xa1, 0x84, 0xf4, 0xf6, 0x65, 0x13, 0x7f, 0xcf, 0x9b,\n\t\t0xb3, 0xb2, 0xb2, 0x16, 0x07, 0x8c, 0x93, 0xac, 0xfc, 0x2f, 0x17, 0x3d,\n\t\t0xc5, 0x89, 0x74, 0xab, 0x1f, 0x61, 0x69, 0x50, 0xe7, 0xac, 0xf4, 0xb1,\n\t\t0xa3, 0x9c, 0xc1, 0x80, 0x85, 0x38, 0x8d, 0x4b, 0xa8, 0x7d, 0x1d, 0xb3,\n\t\t0x6f, 0x39, 0x0d, 0xc6, 0xa7, 0x6c, 0x54, 0x1f, 0x68, 0xf4, 0xfd, 0x77,\n\t\t0xe2, 0xc1, 0x7e, 0x36, 0x51, 0xf0, 0x1a, 0xde, 0x9b, 0x02, 0xb7, 0xa9,\n\t\t0x1f, 0x25, 0xbf, 0xdd, 0x06, 0x32, 0xab, 0xae, 0x29, 0x06, 0x92, 0x6b,\n\t\t0x7e, 0xbc, 0xf5, 0x3b, 0xeb, 0xdb, 0xb2, 0x95, 0x81, 0xa2, 0x8b, 0x4b,\n\t\t0xa5, 0xda, 0x5d, 0xc5, 0xdb, 0x2e, 0xe3, 0xda, 0xcb, 0xfd, 0xf9, 0xe9,\n\t\t0x83, 0x77, 0xa5, 0x06, 0xd5, 0x58, 0xc8, 0xd3, 0x5e, 0x2e, 0xac, 0xc4,\n\t\t0xa2, 0xcb, 0xe4, 0x7d, 0x29, 0x54, 0x19, 0xc8, 0x21, 0x77, 0x96, 0x03,\n\t\t0xb5, 0xf1, 0x5b, 0x5a, 0x5b, 0x97, 0xf2, 0x75, 0x4d, 0x74, 0x74, 0xba,\n\t\t0x05, 0x69, 0x5e, 0xc1, 0x8b, 0xe7, 0x6c, 0x05, 0x4e, 0xc2, 0xc3, 0xc3,\n\t\t0x87, 0x1c, 0xd3, 0x0b, 0x0a, 0x0a, 0xe0, 0x35, 0x86, 0xfb, 0x93, 0x62,\n\t\t0xd3, 0x99, 0xe1, 0xe1, 0x45, 0xdf, 0x46, 0x9c, 0x11, 0xb1, 0x1e, 0xd9,\n\t\t0x14, 0x62, 0x90, 0xd2, 0xf4, 0xf7, 0xd7, 0xc1, 0xf0, 0xe8, 0xb4, 0x34,\n\t\t0x9a, 0xe4, 0xc1, 0x8a, 0x0a, 0xde, 0x48, 0x1a, 0xc1, 0x22, 0xef, 0xa6,\n\t\t0xb2, 0x32, 0xc2, 0xe7, 0x6f, 0xca, 0x9a, 0x4b, 0xf0, 0x9d, 0x47, 0x50,\n\t\t0x6f, 0xb6, 0x6e, 0xb7, 0xaf, 0x11, 0x4a, 0xc6, 0x0d, 0x82, 0x48, 0x89,\n\t\t0x8b, 0x07, 0xd6, 0xb9, 0x50, 0xa1, 0x66, 0xe3, 0x4e, 0x54, 0x9d, 0x7a,\n\t\t0x10, 0x12, 0x69, 0x61, 0x0e, 0x58, 0x0d, 0xa6, 0x34, 0xac, 0x29, 0x63,\n\t\t0xfc, 0xb0, 0xc7, 0x97, 0x7c, 0xb9, 0x2d, 0x2b, 0x2b, 0x9b, 0x2c, 0xf8,\n\t\t0x83, 0x4b, 0x50, 0x30, 0x11, 0x3f, 0x68, 0x45, 0x42, 0xa7, 0x74, 0x64,\n\t\t0xf4, 0xb0, 0xd1, 0x7f, 0xd0, 0xcf, 0x1e, 0x08, 0x72, 0x77, 0x9f, 0x82,\n\t\t0x82, 0xc4, 0x1e, 0xf6, 0x77, 0xfb, 0xd5, 0xc9, 0x04, 0x49, 0x71, 0xf1,\n\t\t0x26, 0x5d, 0x39, 0xbd, 0x42, 0x9d, 0xfd, 0x5d, 0x3a, 0xcf, 0xcd, 0x9f,\n\t\t0xd4, 0x52, 0xe6, 0xed, 0xa0, 0x64, 0x18, 0x35, 0xfe, 0x6d, 0x9d, 0x6b,\n\t\t0x66, 0x0a, 0x8a, 0x6a, 0xa0, 0xf1, 0x93, 0x36, 0x0c, 0x48, 0x12, 0xc7,\n\t\t0xa1, 0xca, 0x6d, 0x24, 0xfc, 0x7e, 0x01, 0x3e, 0xda, 0xc0, 0xb2, 0x41,\n\t\t0xcc, 0xac, 0x68, 0x2c, 0x90, 0xda, 0xd7, 0xdd, 0x7d, 0xb4, 0xb2, 0x62,\n\t\t0x9e, 0xbc, 0x0e, 0xea, 0xc8, 0xd6, 0x8b, 0xa1, 0xcf, 0x9b, 0x09, 0x65,\n\t\t0x45, 0x45, 0x56, 0xd7, 0xd2, 0x32, 0xa3, 0x3d, 0xc5, 0x8c, 0x86, 0x26,\n\t\t0xa1, 0x4c, 0xaf, 0x78, 0xe3, 0xc3, 0xc5, 0x9e, 0x8b, 0xca, 0x48, 0x7e,\n\t\t0x7e, 0x7e, 0x33, 0xc0, 0x06, 0xdc, 0x03, 0xde, 0x77, 0xd7, 0xe7, 0xa5,\n\t\t0xf1, 0xf5, 0x3d, 0x16, 0xab, 0xa9, 0xa9, 0xa9, 0xb7, 0xf9, 0xc9, 0xa6,\n\t\t0xae, 0x3b, 0x8f, 0x42, 0x37, 0x7f, 0x37, 0x70, 0x9b, 0x54, 0x12, 0xa9,\n\t\t0xa2, 0x52, 0x29, 0x96, 0x68, 0xdf, 0xcd, 0xd2, 0x4b, 0xf0, 0xd2, 0x36,\n\t\t0xc3, 0xcc, 0xa4, 0x0b, 0xf8, 0x97, 0x61, 0xcf, 0xfd, 0xb9, 0x29, 0x09,\n\t\t0xa1, 0xbb, 0x9d, 0x82, 0x4c, 0x0f, 0x95, 0x11, 0xc3, 0xd2, 0x24, 0x1e,\n\t\t0x93, 0xc6, 0x2f, 0x01, 0x40, 0x42, 0x6f, 0x9b, 0x0e, 0x5b, 0xd7, 0x1f,\n\t\t0xae, 0xa7, 0xdb, 0xbc, 0x14, 0x14, 0x14, 0x8a, 0x59, 0x0e, 0x6e, 0x99,\n\t\t0x55, 0xb2, 0x0f, 0x9f, 0x9e, 0xe2, 0xe2, 0x02, 0xf5, 0xe3, 0xc8, 0xac,\n\t\t0x5a, 0xaa, 0xf5, 0xb2, 0x15, 0x2f, 0x6c, 0xf8, 0x70, 0x72, 0x5c, 0x44,\n\t\t0x87, 0x8b, 0x85, 0x05, 0x11, 0x91, 0x33, 0x63, 0x5d, 0xd5, 0x7a, 0x15,\n\t\t0xf3, 0xd6, 0xc8, 0x7c, 0xc5, 0xc8, 0x3f, 0xfd, 0xae, 0x10, 0x55, 0x67,\n\t\t0x8e, 0x2a, 0xe0, 0x27, 0xbd, 0xbc, 0xd6, 0x0e, 0xa6, 0x1a, 0x35, 0x30,\n\t\t0x7f, 0x01, 0x1b, 0x05, 0x17, 0x30, 0x2b, 0x1c, 0xc5, 0x0e, 0x2f, 0x80,\n\t\t0xdd, 0x87, 0x3f, 0x6a, 0xb3, 0x0e, 0x06, 0x5a, 0xff, 0x1a, 0x64, 0xfe,\n\t\t0x13, 0x1b, 0x19, 0x9a, 0xce, 0x47, 0x68, 0x1b, 0x0e, 0xd2, 0x95, 0xc8,\n\t\t0x2a, 0x92, 0xa7, 0xfd, 0x8c, 0xe4, 0x33, 0x11, 0x85, 0xc9, 0xe2, 0x9f,\n\t\t0x5d, 0x1f, 0x43, 0xc2, 0xfd, 0xa8, 0x80, 0x7f, 0x40, 0x80, 0xa0, 0xd0,\n\t\t0x88, 0x97, 0x4c, 0xcf, 0x34, 0xf3, 0x69, 0x04, 0x54, 0xc1, 0x9d, 0x07,\n\t\t0x60, 0xc4, 0x7d, 0x0b, 0xf3, 0x93, 0x0c, 0x0a, 0xda, 0x77, 0xee, 0xf1,\n\t\t0x64, 0xe7, 0x22, 0xb0, 0x10, 0xf2, 0x40, 0x1f, 0x71, 0xd8, 0x1c, 0x3c,\n\t\t0xd0, 0x12, 0xdd, 0xcd, 0x20, 0xf2, 0x5c, 0x9f, 0x8c, 0x4c, 0x40, 0x54,\n\t\t0x67, 0x76, 0x1b, 0x17, 0x95, 0x3e, 0x1c, 0x88, 0xe9, 0xce, 0x03, 0x06,\n\t\t0xa9, 0xbf, 0x33, 0x86, 0xa4, 0x12, 0x51, 0x3d, 0x08, 0xf8, 0x53, 0x79,\n\t\t0xa9, 0xa1, 0x50, 0x26, 0x67, 0x1e, 0xf4, 0xff, 0x02, 0x00, 0x00, 0xff,\n\t\t0xff, 0x93, 0x8b, 0x92, 0x0e, 0x50, 0xb2, 0x00, 0x00,\n\t}))\n\n\tif err != nil {\n\t\tpanic(\"Decompression failed: \" + err.Error())\n\t}\n\n\tvar b bytes.Buffer\n\tio.Copy(&b, gz)\n\tgz.Close()\n\n\treturn b.Bytes()\n}\n"
  },
  {
    "path": "icccm/doc.go",
    "content": "/*\nPackage icccm provides an API for a portion of the ICCCM, namely, getters\nand setters for many of the properties specified in the ICCCM. There is also a\nsmattering of support for other protocols specified by ICCCM. For example, to\nsatisfy the WM_DELETE_WINDOW protocol, package icccm provides 'IsDeleteProtocol'\nwhich returns whether a ClientMessage event satisfies the WM_DELETE_WINDOW\nprotocol.\n\nIf a property has values that aren't simple strings or integers, struct types\nare provided to organize the data. In particular, WM_NORMAL_HINTS and WM_HINTS.\n\nAlso note that properties like WM_NORMAL_HINTS and WM_HINTS contain a 'Flags'\nfield (a bit mask) that specifies which values are \"active\". This is of\nimportance when setting and reading WM_NORMAL_HINTS and WM_HINTS; one must make\nsure the appropriate bit is set in Flags.\n\nFor example, you might want to check if a window has specified a resize\nincrement in the WM_NORMAL_HINTS property. The values in the corresponding\nNormalHints struct are WidthInc and HeightInc. So to check if such values exist\n*and* should be used:\n\n\tnormalHints, err := icccm.WmNormalHintsGet(XUtilValue, window-id)\n\tif err != nil {\n\t\t// handle error\n\t}\n\tif normalHints.Flags&icccm.SizeHintPResizeInc > 0 {\n\t\t// Use normalHints.WidthInc and normalHints.HeightInc\n\t}\n\nWhen you should use icccm\n\nAlthough the ICCCM is extremely old, a lot of it is still used. In fact, the\nEWMH spec itself specifically states that the ICCCM should still be used unless\notherwise noted by the EWMH. For example, WM_HINTS and WM_NORMAL_HINTS are\nstill used, but _NET_WM_NAME replaces WM_NAME.\n\nWith that said, many applications (like xterm or LibreOffice) have not been\nupdated to be fully EWMH compliant. Therefore, code that finds a window's name\noften looks like this:\n\n\twinName, err := ewmh.WmNameGet(XUtilValue, window-id)\n\tif err != nil || winName == \"\" {\n\t\twinName, err = icccm.WmNameGet(XUtilValue, window-id)\n\t\tif err != nill || winName == \"\" {\n\t\t\twinName = \"N/A\"\n\t\t}\n\t}\n\nSomething similar can be said for the _NET_WM_ICON and the IconPixmap field\nin WM_HINTS.\n\nNaming scheme\n\nThe naming scheme is precisely the same as the one found in the ewmh package.\nThe documentation for the ewmh package describes the naming scheme in more\ndetail. The only difference (currently) is that the icccm package only contains\nfunctions ending in \"Get\" and \"Set\". It is planned to add \"Req\" functions. (An\nexample of a Req function would be to send a ClientMessage implementing the\nWM_DELETE_WINDOW protocol to a client window.)\n*/\npackage icccm\n"
  },
  {
    "path": "icccm/icccm.go",
    "content": "package icccm\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xprop\"\n)\n\nconst (\n\tHintInput = (1 << iota)\n\tHintState\n\tHintIconPixmap\n\tHintIconWindow\n\tHintIconPosition\n\tHintIconMask\n\tHintWindowGroup\n\tHintMessage\n\tHintUrgency\n)\n\nconst (\n\tSizeHintUSPosition = (1 << iota)\n\tSizeHintUSSize\n\tSizeHintPPosition\n\tSizeHintPSize\n\tSizeHintPMinSize\n\tSizeHintPMaxSize\n\tSizeHintPResizeInc\n\tSizeHintPAspect\n\tSizeHintPBaseSize\n\tSizeHintPWinGravity\n)\n\nconst (\n\tStateWithdrawn = iota\n\tStateNormal\n\tStateZoomed\n\tStateIconic\n\tStateInactive\n)\n\n// WM_NAME get\nfunc WmNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win, \"WM_NAME\"))\n}\n\n// WM_NAME set\nfunc WmNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {\n\treturn xprop.ChangeProp(xu, win, 8, \"WM_NAME\", \"STRING\", ([]byte)(name))\n}\n\n// WM_ICON_NAME get\nfunc WmIconNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win, \"WM_ICON_NAME\"))\n}\n\n// WM_ICON_NAME set\nfunc WmIconNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {\n\treturn xprop.ChangeProp(xu, win, 8, \"WM_ICON_NAME\", \"STRING\",\n\t\t([]byte)(name))\n}\n\n// NormalHints is a struct that organizes the information related to the\n// WM_NORMAL_HINTS property. Please see the ICCCM spec for more details.\ntype NormalHints struct {\n\tFlags                                                   uint\n\tX, Y                                                    int\n\tWidth, Height, MinWidth, MinHeight, MaxWidth, MaxHeight uint\n\tWidthInc, HeightInc                                     uint\n\tMinAspectNum, MinAspectDen, MaxAspectNum, MaxAspectDen  uint\n\tBaseWidth, BaseHeight, WinGravity                       uint\n}\n\n// WM_NORMAL_HINTS get\nfunc WmNormalHintsGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (nh *NormalHints, err error) {\n\n\tlenExpect := 18\n\thints, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"WM_NORMAL_HINTS\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(hints) != lenExpect {\n\t\treturn nil,\n\t\t\tfmt.Errorf(\"WmNormalHint: There are %d fields in WM_NORMAL_HINTS, \"+\n\t\t\t\t\"but xgbutil expects %d.\", len(hints), lenExpect)\n\t}\n\n\tnh = &NormalHints{}\n\tnh.Flags = hints[0]\n\tnh.X = int(hints[1])\n\tnh.Y = int(hints[2])\n\tnh.Width = hints[3]\n\tnh.Height = hints[4]\n\tnh.MinWidth = hints[5]\n\tnh.MinHeight = hints[6]\n\tnh.MaxWidth = hints[7]\n\tnh.MaxHeight = hints[8]\n\tnh.WidthInc = hints[9]\n\tnh.HeightInc = hints[10]\n\tnh.MinAspectNum = hints[11]\n\tnh.MinAspectDen = hints[12]\n\tnh.MaxAspectNum = hints[13]\n\tnh.MaxAspectDen = hints[14]\n\tnh.BaseWidth = hints[15]\n\tnh.BaseHeight = hints[16]\n\tnh.WinGravity = hints[17]\n\n\tif nh.WinGravity <= 0 {\n\t\tnh.WinGravity = xproto.GravityNorthWest\n\t}\n\n\treturn nh, nil\n}\n\n// WM_NORMAL_HINTS set\n// Make sure to set the flags in the NormalHints struct correctly!\nfunc WmNormalHintsSet(xu *xgbutil.XUtil, win xproto.Window,\n\tnh *NormalHints) error {\n\n\traw := []uint{\n\t\tnh.Flags,\n\t\tuint(nh.X), uint(nh.Y), nh.Width, nh.Height,\n\t\tnh.MinWidth, nh.MinHeight,\n\t\tnh.MaxWidth, nh.MaxHeight,\n\t\tnh.WidthInc, nh.HeightInc,\n\t\tnh.MinAspectNum, nh.MinAspectDen,\n\t\tnh.MaxAspectNum, nh.MaxAspectDen,\n\t\tnh.BaseWidth, nh.BaseHeight,\n\t\tnh.WinGravity,\n\t}\n\treturn xprop.ChangeProp32(xu, win, \"WM_NORMAL_HINTS\", \"WM_SIZE_HINTS\",\n\t\traw...)\n}\n\n// Hints is a struct that organizes information related to the WM_HINTS\n// property. Once again, I refer you to the ICCCM spec for documentation.\ntype Hints struct {\n\tFlags                   uint\n\tInput, InitialState     uint\n\tIconX, IconY            int\n\tIconPixmap, IconMask    xproto.Pixmap\n\tWindowGroup, IconWindow xproto.Window\n}\n\n// WM_HINTS get\nfunc WmHintsGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (hints *Hints, err error) {\n\n\tlenExpect := 9\n\traw, err := xprop.PropValNums(xprop.GetProperty(xu, win, \"WM_HINTS\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(raw) != lenExpect {\n\t\treturn nil,\n\t\t\tfmt.Errorf(\"WmHints: There are %d fields in \"+\n\t\t\t\t\"WM_HINTS, but xgbutil expects %d.\", len(raw), lenExpect)\n\t}\n\n\thints = &Hints{}\n\thints.Flags = raw[0]\n\thints.Input = raw[1]\n\thints.InitialState = raw[2]\n\thints.IconPixmap = xproto.Pixmap(raw[3])\n\thints.IconWindow = xproto.Window(raw[4])\n\thints.IconX = int(raw[5])\n\thints.IconY = int(raw[6])\n\thints.IconMask = xproto.Pixmap(raw[7])\n\thints.WindowGroup = xproto.Window(raw[8])\n\n\treturn hints, nil\n}\n\n// WM_HINTS set\n// Make sure to set the flags in the Hints struct correctly!\nfunc WmHintsSet(xu *xgbutil.XUtil, win xproto.Window, hints *Hints) error {\n\traw := []uint{\n\t\thints.Flags, hints.Input, hints.InitialState,\n\t\tuint(hints.IconPixmap), uint(hints.IconWindow),\n\t\tuint(hints.IconX), uint(hints.IconY),\n\t\tuint(hints.IconMask),\n\t\tuint(hints.WindowGroup),\n\t}\n\treturn xprop.ChangeProp32(xu, win, \"WM_HINTS\", \"WM_HINTS\", raw...)\n}\n\n// WmClass struct contains two data points:\n// the instance and a class of a window.\ntype WmClass struct {\n\tInstance, Class string\n}\n\n// WM_CLASS get\nfunc WmClassGet(xu *xgbutil.XUtil, win xproto.Window) (*WmClass, error) {\n\traw, err := xprop.PropValStrs(xprop.GetProperty(xu, win, \"WM_CLASS\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(raw) != 2 {\n\t\treturn nil,\n\t\t\tfmt.Errorf(\"WmClass: Two string make up WM_CLASS, but \"+\n\t\t\t\t\"xgbutil found %d in '%v'.\", len(raw), raw)\n\t}\n\n\treturn &WmClass{\n\t\tInstance: raw[0],\n\t\tClass:    raw[1],\n\t}, nil\n}\n\n// WM_CLASS set\nfunc WmClassSet(xu *xgbutil.XUtil, win xproto.Window, class *WmClass) error {\n\traw := make([]byte, len(class.Instance)+len(class.Class)+2)\n\tcopy(raw, class.Instance)\n\tcopy(raw[(len(class.Instance)+1):], class.Class)\n\n\treturn xprop.ChangeProp(xu, win, 8, \"WM_CLASS\", \"STRING\", raw)\n}\n\n// WM_TRANSIENT_FOR get\nfunc WmTransientForGet(xu *xgbutil.XUtil,\n\twin xproto.Window) (xproto.Window, error) {\n\n\treturn xprop.PropValWindow(xprop.GetProperty(xu, win, \"WM_TRANSIENT_FOR\"))\n}\n\n// WM_TRANSIENT_FOR set\nfunc WmTransientForSet(xu *xgbutil.XUtil, win xproto.Window,\n\ttransient xproto.Window) error {\n\n\treturn xprop.ChangeProp32(xu, win, \"WM_TRANSIENT_FOR\", \"WINDOW\",\n\t\tuint(transient))\n}\n\n// WM_PROTOCOLS get\nfunc WmProtocolsGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, error) {\n\traw, err := xprop.GetProperty(xu, win, \"WM_PROTOCOLS\")\n\treturn xprop.PropValAtoms(xu, raw, err)\n}\n\n// WM_PROTOCOLS set\nfunc WmProtocolsSet(xu *xgbutil.XUtil, win xproto.Window,\n\tatomNames []string) error {\n\n\tatoms, err := xprop.StrToAtoms(xu, atomNames)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn xprop.ChangeProp32(xu, win, \"WM_PROTOCOLS\", \"ATOM\", atoms...)\n}\n\n// WM_COLORMAP_WINDOWS get\nfunc WmColormapWindowsGet(xu *xgbutil.XUtil,\n\twin xproto.Window) ([]xproto.Window, error) {\n\n\treturn xprop.PropValWindows(xprop.GetProperty(xu, win,\n\t\t\"WM_COLORMAP_WINDOWS\"))\n}\n\n// WM_COLORMAP_WINDOWS set\nfunc WmColormapWindowsSet(xu *xgbutil.XUtil, win xproto.Window,\n\twindows []xproto.Window) error {\n\n\treturn xprop.ChangeProp32(xu, win, \"WM_COLORMAP_WINDOWS\", \"WINDOW\",\n\t\txprop.WindowToInt(windows)...)\n}\n\n// WM_CLIENT_MACHINE get\nfunc WmClientMachineGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {\n\treturn xprop.PropValStr(xprop.GetProperty(xu, win, \"WM_CLIENT_MACHINE\"))\n}\n\n// WM_CLIENT_MACHINE set\nfunc WmClientMachineSet(xu *xgbutil.XUtil, win xproto.Window,\n\tclient string) error {\n\n\treturn xprop.ChangeProp(xu, win, 8, \"WM_CLIENT_MACHINE\", \"STRING\",\n\t\t([]byte)(client))\n}\n\n// WmState is a struct that organizes information related to the WM_STATE\n// property. Namely, the state (corresponding to a State* constant in this file)\n// and the icon window (probably not used).\ntype WmState struct {\n\tState uint\n\tIcon  xproto.Window\n}\n\n// WM_STATE get\nfunc WmStateGet(xu *xgbutil.XUtil, win xproto.Window) (*WmState, error) {\n\traw, err := xprop.PropValNums(xprop.GetProperty(xu, win, \"WM_STATE\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(raw) != 2 {\n\t\treturn nil,\n\t\t\tfmt.Errorf(\"WmState: Expected two integers in WM_STATE property \"+\n\t\t\t\t\"but xgbutil found %d in '%v'.\", len(raw), raw)\n\t}\n\n\treturn &WmState{\n\t\tState: raw[0],\n\t\tIcon:  xproto.Window(raw[1]),\n\t}, nil\n}\n\n// WM_STATE set\nfunc WmStateSet(xu *xgbutil.XUtil, win xproto.Window, state *WmState) error {\n\traw := []uint{\n\t\tstate.State,\n\t\tuint(state.Icon),\n\t}\n\n\treturn xprop.ChangeProp32(xu, win, \"WM_STATE\", \"WM_STATE\", raw...)\n}\n\n// IconSize is a struct the organizes information related to the WM_ICON_SIZE\n// property. Mostly info about its dimensions.\ntype IconSize struct {\n\tMinWidth, MinHeight, MaxWidth, MaxHeight, WidthInc, HeightInc uint\n}\n\n// WM_ICON_SIZE get\nfunc WmIconSizeGet(xu *xgbutil.XUtil, win xproto.Window) (*IconSize, error) {\n\traw, err := xprop.PropValNums(xprop.GetProperty(xu, win, \"WM_ICON_SIZE\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(raw) != 6 {\n\t\treturn nil,\n\t\t\tfmt.Errorf(\"WmIconSize: Expected six integers in WM_ICON_SIZE \"+\n\t\t\t\t\"property, but xgbutil found \"+\"%d in '%v'.\", len(raw), raw)\n\t}\n\n\treturn &IconSize{\n\t\tMinWidth: raw[0], MinHeight: raw[1],\n\t\tMaxWidth: raw[2], MaxHeight: raw[3],\n\t\tWidthInc: raw[4], HeightInc: raw[5],\n\t}, nil\n}\n\n// WM_ICON_SIZE set\nfunc WmIconSizeSet(xu *xgbutil.XUtil, win xproto.Window,\n\ticondim *IconSize) error {\n\n\traw := []uint{\n\t\ticondim.MinWidth, icondim.MinHeight,\n\t\ticondim.MaxWidth, icondim.MaxHeight,\n\t\ticondim.WidthInc, icondim.HeightInc,\n\t}\n\n\treturn xprop.ChangeProp32(xu, win, \"WM_ICON_SIZE\", \"WM_ICON_SIZE\", raw...)\n}\n"
  },
  {
    "path": "icccm/protocols.go",
    "content": "package icccm\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xprop\"\n)\n\n// IsDeleteProtocol checks whether a ClientMessage event satisfies the\n// WM_DELETE_WINDOW protocol. Namely, the format must be 32, the type must\n// be the WM_PROTOCOLS atom, and the first data item must be the atom\n// WM_DELETE_WINDOW.\n//\n// Note that if you're using the xwindow package, you should use the\n// WMGracefulClose method instead of directly using IsDeleteProtocol.\nfunc IsDeleteProtocol(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) bool {\n\t// Make sure the Format is 32. (Meaning that each data item is\n\t// 32 bits.)\n\tif ev.Format != 32 {\n\t\treturn false\n\t}\n\n\t// Check to make sure the Type atom is WM_PROTOCOLS.\n\ttypeName, err := xprop.AtomName(X, ev.Type)\n\tif err != nil || typeName != \"WM_PROTOCOLS\" { // not what we want\n\t\treturn false\n\t}\n\n\t// Check to make sure the first data item is WM_DELETE_WINDOW.\n\tprotocolType, err := xprop.AtomName(X,\n\t\txproto.Atom(ev.Data.Data32[0]))\n\tif err != nil || protocolType != \"WM_DELETE_WINDOW\" {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// IsFocusProtocol checks whether a ClientMessage event satisfies the\n// WM_TAKE_FOCUS protocol.\nfunc IsFocusProtocol(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) bool {\n\t// Make sure the Format is 32. (Meaning that each data item is\n\t// 32 bits.)\n\tif ev.Format != 32 {\n\t\treturn false\n\t}\n\n\t// Check to make sure the Type atom is WM_PROTOCOLS.\n\ttypeName, err := xprop.AtomName(X, ev.Type)\n\tif err != nil || typeName != \"WM_PROTOCOLS\" { // not what we want\n\t\treturn false\n\t}\n\n\t// Check to make sure the first data item is WM_TAKE_FOCUS.\n\tprotocolType, err := xprop.AtomName(X,\n\t\txproto.Atom(ev.Data.Data32[0]))\n\tif err != nil || protocolType != \"WM_TAKE_FOCUS\" {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"
  },
  {
    "path": "keybind/callback.go",
    "content": "package keybind\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\n// connect is essentially 'Connect' for either KeyPress or KeyRelease events.\n// Namely, it parses the key string, issues a grab request if necessary,\n// sets up the appropriate event handlers for the main event loop, and attaches\n// the callback to the keybinding state.\nfunc connect(xu *xgbutil.XUtil, callback xgbutil.CallbackKey,\n\tevtype int, win xproto.Window, keyStr string, grab, reconnect bool) error {\n\n\t// Get the mods/key first\n\tmods, keycodes, err := ParseString(xu, keyStr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Only do the grab if we haven't yet on this window.\n\tfor _, keycode := range keycodes {\n\t\tif grab && keyBindGrabs(xu, evtype, win, mods, keycode) == 0 {\n\t\t\tif err := GrabChecked(xu, win, mods, keycode); err != nil {\n\t\t\t\t// If a bad access, let's be nice and give a good error message.\n\t\t\t\tswitch err.(type) {\n\t\t\t\tcase xproto.AccessError:\n\t\t\t\t\treturn fmt.Errorf(\"Got a bad access error when trying to \"+\n\t\t\t\t\t\t\"bind '%s'. This usually means another client has \"+\n\t\t\t\t\t\t\"already grabbed this keybinding.\", keyStr)\n\t\t\t\tdefault:\n\t\t\t\t\treturn fmt.Errorf(\"Could not bind '%s' because: %s\",\n\t\t\t\t\t\tkeyStr, err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If we've never grabbed anything on this window before, we need to\n\t\t// make sure we can respond to it in the main event loop.\n\t\t// Never do this if we're reconnecting.\n\t\tif !reconnect {\n\t\t\tvar allCb xgbutil.Callback\n\t\t\tif evtype == xevent.KeyPress {\n\t\t\t\tallCb = xevent.KeyPressFun(runKeyPressCallbacks)\n\t\t\t} else {\n\t\t\t\tallCb = xevent.KeyReleaseFun(runKeyReleaseCallbacks)\n\t\t\t}\n\n\t\t\t// If this is the first Key{Press|Release}Event on this window,\n\t\t\t// then we need to listen to Key{Press|Release} events in the main\n\t\t\t// loop.\n\t\t\tif !connectedKeyBind(xu, evtype, win) {\n\t\t\t\tallCb.Connect(xu, win)\n\t\t\t}\n\t\t}\n\n\t\t// Finally, attach the callback.\n\t\tattachKeyBindCallback(xu, evtype, win, mods, keycode, callback)\n\t}\n\n\t// Keep track of all unique key connections.\n\tif !reconnect {\n\t\taddKeyString(xu, callback, evtype, win, keyStr, grab)\n\t}\n\n\treturn nil\n}\n\n// DeduceKeyInfo AND's the \"ignored modifiers\" out of the state returned by\n// a Key{Press,Release} event. This is useful to connect a (state, keycode)\n// tuple from an event with a tuple specified by the user.\nfunc DeduceKeyInfo(state uint16,\n\tdetail xproto.Keycode) (uint16, xproto.Keycode) {\n\n\tmods, kc := state, detail\n\tfor _, m := range xevent.IgnoreMods {\n\t\tmods &= ^m\n\t}\n\treturn mods, kc\n}\n\n// KeyPressFun represents a function that is called when a particular key\n// binding is fired.\ntype KeyPressFun xevent.KeyPressFun\n\nfunc (callback KeyPressFun) Connect(xu *xgbutil.XUtil, win xproto.Window,\n\tkeyStr string, grab bool) error {\n\n\treturn connect(xu, callback, xevent.KeyPress, win, keyStr, grab, false)\n}\n\nfunc (callback KeyPressFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(xevent.KeyPressEvent))\n}\n\n// KeyReleaseFun represents a function that is called when a particular key\n// binding is fired.\ntype KeyReleaseFun xevent.KeyReleaseFun\n\nfunc (callback KeyReleaseFun) Connect(xu *xgbutil.XUtil, win xproto.Window,\n\tkeyStr string, grab bool) error {\n\n\treturn connect(xu, callback, xevent.KeyRelease, win, keyStr, grab, false)\n}\n\nfunc (callback KeyReleaseFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(xevent.KeyReleaseEvent))\n}\n\n// runKeyPressCallbacks infers the window, keycode and modifiers from a\n// KeyPressEvent and runs the corresponding callbacks.\nfunc runKeyPressCallbacks(xu *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\tmods, kc := DeduceKeyInfo(ev.State, ev.Detail)\n\n\trunKeyBindCallbacks(xu, ev, xevent.KeyPress, ev.Event, mods, kc)\n}\n\n// runKeyReleaseCallbacks infers the window, keycode and modifiers from a\n// KeyPressEvent and runs the corresponding callbacks.\nfunc runKeyReleaseCallbacks(xu *xgbutil.XUtil, ev xevent.KeyReleaseEvent) {\n\tmods, kc := DeduceKeyInfo(ev.State, ev.Detail)\n\n\trunKeyBindCallbacks(xu, ev, xevent.KeyRelease, ev.Event, mods, kc)\n}\n\n// Detach removes all handlers for all key events for the provided window id.\n// This should be called whenever a window is no longer receiving events to make\n// sure the garbage collector can release memory used to store the handler info.\nfunc Detach(xu *xgbutil.XUtil, win xproto.Window) {\n\tdetach(xu, xevent.KeyPress, win)\n\tdetach(xu, xevent.KeyRelease, win)\n}\n\n// DetachPress is the same as Detach, except it only removes handlers for\n// key *press* events.\nfunc DetachPress(xu *xgbutil.XUtil, win xproto.Window) {\n\tdetach(xu, xevent.KeyPress, win)\n}\n\n// DetachRelease is the same as Detach, except it only removes handlers for\n// key *release* events.\nfunc DetachRelease(xu *xgbutil.XUtil, win xproto.Window) {\n\tdetach(xu, xevent.KeyRelease, win)\n}\n\n// detach removes all handlers for the provided window and event type\n// combination. This will also issue an ungrab request for each grab that\n// drops to zero.\nfunc detach(xu *xgbutil.XUtil, evtype int, win xproto.Window) {\n\tmkeys := keyKeys(xu)\n\tdetachKeyBindWindow(xu, evtype, win)\n\tfor _, key := range mkeys {\n\t\tif keyBindGrabs(xu, key.Evtype, key.Win, key.Mod, key.Code) == 0 {\n\t\t\tUngrab(xu, key.Win, key.Mod, key.Code)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "keybind/doc.go",
    "content": "/*\nPackage keybind provides an easy to use interface to assign callback functions\nto human readable key sequences.\n\nWorking with the X keyboard encoding is not an easy task, and the keybind\npackage attempts to encapsulate much of the complexity. Namely, the keybind\npackage exports two function types: KeyPressFun and KeyReleaseFun. Values of\nthese types are functions, and have a method called 'Connect' that attaches\nan event handler to be run when a particular key press is issued.\n\nThis is virtually identical to the way calbacks are attached using the xevent\npackage, but the Connect method in the keybind package has a couple extra\nparameters that are specific to key bindings. Namely, the key sequence to\nrespond to (which is a combination of zero or more modifiers and exactly one\nkey) and whether to establish a passive grab. One can still attach callbacks\nto Key{Press,Release} events using xevent, but it will be run for *all*\nKey{Press,Release} events. (This is typically what one might do when setting up\nan active grab.)\n\nInitialization\n\nBefore using the keybind package, you should *always* make a single call to\nkeybind.Initialize for each X connection you're working with.\n\nKey sequence format\n\nKey sequences are human readable strings made up of zero or more modifiers and\nexactly one key. Namely:\n\n\t[Mod[-Mod[...]]-]KEY\n\nWhere 'Mod' can be one of: shift, lock, control, mod1, mod2, mod3, mod4, mod5,\nor any. You can view which keys activate each modifier using the 'xmodmap'\nprogram. (If you don't have 'xmodmap', you could also run the 'xmodmap' example\nin the examples directory.)\n\nKEY must correspond to a valid keysym. Keysyms can be found by pressing keys\nusing the 'xev' program. Alternatively, you may inspect the 'keysyms' map in\nxgbutil/keybind/keysymdef.go.\n\nAn example key sequence might look like 'Mod4-Control-Shift-t'. The keybinding\nfor that key sequence is activated when all three modifiers---mod4, control and\nshift---are pressed along with the 't' key.\n\nWhen to issue a passive grab\n\nOne of the parameters of the 'Connect' method is whether to issue a passive\ngrab or not. A passive grab is useful when you need to respond to a key press\non some parent window (like the root window) without actually focusing that\nwindow. Not using a passive grab is useful when you only need to read key\npresses when the window is focused.\n\nFor more information on the semantics of passive grabs, please see\nhttp://tronche.com/gui/x/xlib/input/XGrabKey.html.\n\nAlso, by default, when issuing a grab on a particular (modifiers, keycode)\ntuple, several grabs are actually made. In particular, for each grab requested,\nanother grab is made with the \"num lock\" mask, another grab is made with the\n\"caps lock\" mask, and another grab is made with both the \"num lock\" and \"caps\nlocks\" masks. This allows key events to be reported regardless of whether\ncaps lock or num lock is enabled.\n\nThe extra masks added can be modified by changing the xevent.IgnoreMods slice.\nIf you modify xevent.IgnoreMods, it should be modified once on program startup\n(i.e., before any key or mouse bindings are established) and never modified\nagain.\n\nKey bindings on the root window example\n\nTo run a particular function whenever the 'Mod4-Control-Shift-t' key\ncombination is pressed (mod4 is typically the 'super' or 'windows' key, but can\nvary based on your system), use something like:\n\n\tkeybind.Initialize(XUtilValue) // call once before using keybind package\n\tkeybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\t// do something when key is pressed\n\t\t}).Connect(XUtilValue, XUtilValue.RootWin(),\n\t\t\t\"Mod4-Control-Shift-t\", true)\n\nNote that we issue a passive grab because Key{Press,Release} events on the root\nwindow will only be reported when the root window has focus if no grab exists.\n\nKey bindings on a window you create example\n\nThis code snippet attaches an event handler to some window you've created\nwithout using a grab. Thus, the function will only be activated when the key\nsequence is pressed and your window has focus.\n\n\tkeybind.Initialize(XUtilValue) // call once before using keybind package\n\tkeybind.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\t// do something when key is pressed\n\t\t}).Connect(XUtilValue, your-window-id, \"Mod4-t\", false)\n\nRun a function on all key press events example\n\nThis code snippet actually does *not* use the keybind package, but illustrates\nhow the Key{Press,Release} event handlers in the xevent package can still be\nuseful. Namely, the keybind package discriminates among events depending upon\nthe key sequences pressed, whereas the xevent package is more general: it can\nonly discriminate at the event level.\n\n\txevent.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\t// do something when any key is pressed\n\t\t}).Connect(XUtilValue, your-window-id)\n\nThis is the kind of handler you might use to capture all key press events.\n(i.e., if you have a text box for a user to type in.) Additionally, if you're\nusing this sort of event handler, keybind.LookupString will probably be of some\nuse. Its contract is that given a (modifiers, keycode) tuple\n(information found in all Key{Press,Release} events) it will return a string\nrepresentation of the key pressed. We can modify the above example slightly to\necho the key pressed:\n\n\txevent.KeyPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {\n\t\t\tfmt.Println(\"Key pressed:\",\n\t\t\t\tkeybind.LookupString(X, ev.State, ev.Detail))\n\t\t}).Connect(XUtilValue, your-window-id)\n\nMore examples\n\nComplete working examples can be found in the examples directory of xgbutil. Of\nparticular interest are probably 'keypress-english' and 'simple-keybinding'.\n\n*/\npackage keybind\n"
  },
  {
    "path": "keybind/encoding.go",
    "content": "package keybind\n\n/*\nThis file contains the logic to implement X's Keyboard Encoding\ndescribed here: http://goo.gl/qum9q\n\nEssentially, LookupString is analogous to Xlib's XLookupString. It's useful\nin determining the english string representation of modifiers + keycode.\n\nIt is not for the faint of heart.\n*/\n\nimport (\n\t\"strings\"\n\t\"unicode\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// LookupString attempts to convert a (modifiers, keycode) to an english string.\n// It essentially implements the rules described at http://goo.gl/qum9q\n// Namely, the bulleted list that describes how key syms should be interpreted\n// when various modifiers are pressed.\n// Note that we ignore the logic that asks us to check if particular key codes\n// are mapped to particular modifiers (i.e., \"XK_Caps_Lock\" to \"Lock\" modifier).\n// We just check if the modifiers are activated. That's good enough for me.\n// XXX: We ignore num lock stuff.\n// XXX: We ignore MODE SWITCH stuff. (i.e., we don't use group 2 key syms.)\nfunc LookupString(xu *xgbutil.XUtil, mods uint16,\n\tkeycode xproto.Keycode) string {\n\n\tk1, k2, _, _ := interpretSymList(xu, keycode)\n\n\tshift := mods&xproto.ModMaskShift > 0\n\tlock := mods&xproto.ModMaskLock > 0\n\tswitch {\n\tcase !shift && !lock:\n\t\treturn k1\n\tcase !shift && lock:\n\t\tif len(k1) == 1 && unicode.IsLower(rune(k1[0])) {\n\t\t\treturn k2\n\t\t} else {\n\t\t\treturn k1\n\t\t}\n\tcase shift && lock:\n\t\tif len(k2) == 1 && unicode.IsLower(rune(k2[0])) {\n\t\t\treturn string(unicode.ToUpper(rune(k2[0])))\n\t\t} else {\n\t\t\treturn k2\n\t\t}\n\tcase shift:\n\t\treturn k2\n\t}\n\n\treturn \"\"\n}\n\n// ModifierString takes in a keyboard state and returns a string of all\n// modifiers in the state.\nfunc ModifierString(mods uint16) string {\n\tmodStrs := make([]string, 0, 3)\n\tfor i, mod := range Modifiers {\n\t\tif mod&mods > 0 && len(NiceModifiers[i]) > 0 {\n\t\t\tmodStrs = append(modStrs, NiceModifiers[i])\n\t\t}\n\t}\n\treturn strings.Join(modStrs, \"-\")\n}\n\n// KeyMatch returns true if a string representation of a key can\n// be matched (case insensitive) to the (modifiers, keycode) tuple provided.\n// String representations can be found in keybind/keysymdef.go\nfunc KeyMatch(xu *xgbutil.XUtil,\n\tkeyStr string, mods uint16, keycode xproto.Keycode) bool {\n\n\tguess := LookupString(xu, mods, keycode)\n\treturn strings.ToLower(guess) == strings.ToLower(keyStr)\n}\n\n// interpretSymList interprets the keysym list for a particular keycode as\n// described in the third and fourth paragraphs of http://goo.gl/qum9q\nfunc interpretSymList(xu *xgbutil.XUtil, keycode xproto.Keycode) (\n\tk1 string, k2 string, k3 string, k4 string) {\n\n\tks1 := KeysymGet(xu, keycode, 0)\n\tks2 := KeysymGet(xu, keycode, 1)\n\tks3 := KeysymGet(xu, keycode, 2)\n\tks4 := KeysymGet(xu, keycode, 3)\n\n\t// follow the rules, third paragraph\n\tswitch {\n\tcase ks2 == 0 && ks3 == 0 && ks4 == 0:\n\t\tks3 = ks1\n\tcase ks3 == 0 && ks4 == 0:\n\t\tks3 = ks1\n\t\tks4 = ks2\n\tcase ks4 == 0:\n\t\tks4 = 0\n\t}\n\n\t// Now convert keysyms to strings, so we can do alphabetic shit.\n\tk1 = KeysymToStr(ks1)\n\tk2 = KeysymToStr(ks2)\n\tk3 = KeysymToStr(ks3)\n\tk4 = KeysymToStr(ks4)\n\n\t// follow the rules, fourth paragraph\n\tif k2 == \"\" {\n\t\tif len(k1) == 1 && unicode.IsLetter(rune(k1[0])) {\n\t\t\tk1 = string(unicode.ToLower(rune(k1[0])))\n\t\t\tk2 = string(unicode.ToUpper(rune(k1[0])))\n\t\t} else {\n\t\t\tk2 = k1\n\t\t}\n\t}\n\tif k4 == \"\" {\n\t\tif len(k3) == 1 && unicode.IsLetter(rune(k3[0])) {\n\t\t\tk3 = string(unicode.ToLower(rune(k3[0])))\n\t\t\tk4 = string(unicode.ToUpper(rune(k4[0])))\n\t\t} else {\n\t\t\tk4 = k3\n\t\t}\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "keybind/keybind.go",
    "content": "package keybind\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\nvar (\n\tModifiers []uint16 = []uint16{ // order matters!\n\t\txproto.ModMaskShift, xproto.ModMaskLock, xproto.ModMaskControl,\n\t\txproto.ModMask1, xproto.ModMask2, xproto.ModMask3,\n\t\txproto.ModMask4, xproto.ModMask5,\n\t\txproto.ModMaskAny,\n\t}\n\n\tNiceModifiers = []string{\n\t\t\"shift\", \"lock\", \"control\", \"mod1\", \"mod2\", \"mod3\", \"mod4\", \"mod5\", \"\",\n\t}\n)\n\n// Initialize attaches the appropriate callbacks to make key bindings easier.\n// i.e., update state of the world on a MappingNotify.\nfunc Initialize(xu *xgbutil.XUtil) {\n\t// Listen to mapping notify events\n\txevent.MappingNotifyFun(updateMaps).Connect(xu, xevent.NoWindow)\n\n\t// Give us an initial mapping state...\n\tkeyMap, modMap := MapsGet(xu)\n\tKeyMapSet(xu, keyMap)\n\tModMapSet(xu, modMap)\n}\n\n// updateMaps runs in response to MappingNotify events.\n// It is responsible for making sure our view of the world's keyboard\n// and modifier maps is correct. (Pointer mappings should be handled in\n// a similar callback in the mousebind package.)\nfunc updateMaps(xu *xgbutil.XUtil, e xevent.MappingNotifyEvent) {\n\tkeyMap, modMap := MapsGet(xu)\n\n\t// So we used to go through the old mapping and the new mapping and pick\n\t// out precisely where there are changes. But after allowing for a\n\t// one-to-many mapping from keysym to keycodes, this process became too\n\t// complex. So we're going to bust out our hammer and rebind everything\n\t// based on the initial key strings.\n\tif e.Request == xproto.MappingKeyboard {\n\t\t// We must ungrab everything first, in case two keys are being swapped.\n\t\tkeys := keyKeys(xu)\n\t\tfor _, key := range keys {\n\t\t\tUngrab(xu, key.Win, key.Mod, key.Code)\n\t\t\tdetach(xu, key.Evtype, key.Win)\n\t\t}\n\n\t\t// Wipe the slate clean.\n\t\txu.KeybindsLck.Lock()\n\t\txu.Keybinds = make(map[xgbutil.KeyKey][]xgbutil.CallbackKey, len(keys))\n\t\txu.Keygrabs = make(map[xgbutil.KeyKey]int, len(keys))\n\t\tkeyStrs := xu.Keystrings\n\t\txu.KeybindsLck.Unlock()\n\n\t\t// Update our mappings before rebinding.\n\t\tKeyMapSet(xu, keyMap)\n\t\tModMapSet(xu, modMap)\n\n\t\t// Now rebind everything in Keystrings\n\t\tfor _, ks := range keyStrs {\n\t\t\terr := connect(xu,\n\t\t\t\tks.Callback, ks.Evtype, ks.Win, ks.Str, ks.Grab, true)\n\t\t\tif err != nil {\n\t\t\t\txgbutil.Logger.Println(err)\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// We don't have to do something with MappingModifier like we do with\n\t\t// MappingKeyboard. This is due to us requiring that key strings use\n\t\t// modifier names built into X. (i.e., the names seen in the output of\n\t\t// `xmodmap`.) This means that the modifier mappings happen on the X\n\t\t// server side, so we don't *typically* have to care what key is\n\t\t// actually being pressed to trigger a modifier. (There are some\n\t\t// exceptional cases, and when that happens, we simply query on-demand\n\t\t// which keys are modifiers. See the RunKey{Press,Release}Callbacks\n\t\t// functions in keybind/callback.go for the deets.)\n\t\tKeyMapSet(xu, keyMap)\n\t\tModMapSet(xu, modMap)\n\t}\n}\n\n// minMaxKeycodeGet a simple accessor to the X setup info to return the\n// minimum and maximum keycodes. They are typically 8 and 255, respectively.\nfunc minMaxKeycodeGet(xu *xgbutil.XUtil) (xproto.Keycode, xproto.Keycode) {\n\treturn xu.Setup().MinKeycode, xu.Setup().MaxKeycode\n}\n\n// A convenience function to grab the KeyboardMapping and ModifierMapping\n// from X. We need to do this on startup (see Initialize) and whenever we\n// get a MappingNotify event.\nfunc MapsGet(xu *xgbutil.XUtil) (*xproto.GetKeyboardMappingReply,\n\t*xproto.GetModifierMappingReply) {\n\n\tmin, max := minMaxKeycodeGet(xu)\n\tnewKeymap, keyErr := xproto.GetKeyboardMapping(xu.Conn(), min,\n\t\tbyte(max-min+1)).Reply()\n\tnewModmap, modErr := xproto.GetModifierMapping(xu.Conn()).Reply()\n\n\t// If there are errors, we really need to panic. We just can't do\n\t// any key binding without a mapping from the server.\n\tif keyErr != nil {\n\t\tpanic(fmt.Sprintf(\"COULD NOT GET KEYBOARD MAPPING: %v\\n\"+\n\t\t\t\"THIS IS AN UNRECOVERABLE ERROR.\\n\",\n\t\t\tkeyErr))\n\t}\n\tif modErr != nil {\n\t\tpanic(fmt.Sprintf(\"COULD NOT GET MODIFIER MAPPING: %v\\n\"+\n\t\t\t\"THIS IS AN UNRECOVERABLE ERROR.\\n\",\n\t\t\tkeyErr))\n\t}\n\n\treturn newKeymap, newModmap\n}\n\n// ParseString takes a string of the format '[Mod[-Mod[...]]]-KEY',\n// i.e., 'Mod4-j', and returns a modifiers/keycode combo.\n// An error is returned if the string is malformed, or if no valid KEY can\n// be found.\n// Valid values of KEY should include almost anything returned by pressing\n// keys with the 'xev' program. Alternatively, you may reference the keys\n// of the 'keysyms' map defined in keybind/keysymdef.go.\nfunc ParseString(\n\txu *xgbutil.XUtil, s string) (uint16, []xproto.Keycode, error) {\n\n\tmods, kcs := uint16(0), []xproto.Keycode{}\n\tfor _, part := range strings.Split(s, \"-\") {\n\t\tswitch strings.ToLower(part) {\n\t\tcase \"shift\":\n\t\t\tmods |= xproto.ModMaskShift\n\t\tcase \"lock\":\n\t\t\tmods |= xproto.ModMaskLock\n\t\tcase \"control\":\n\t\t\tmods |= xproto.ModMaskControl\n\t\tcase \"mod1\":\n\t\t\tmods |= xproto.ModMask1\n\t\tcase \"mod2\":\n\t\t\tmods |= xproto.ModMask2\n\t\tcase \"mod3\":\n\t\t\tmods |= xproto.ModMask3\n\t\tcase \"mod4\":\n\t\t\tmods |= xproto.ModMask4\n\t\tcase \"mod5\":\n\t\t\tmods |= xproto.ModMask5\n\t\tcase \"any\":\n\t\t\tmods |= xproto.ModMaskAny\n\t\tdefault: // a key code!\n\t\t\tif len(kcs) == 0 { // only accept the first keycode we see\n\t\t\t\tkcs = StrToKeycodes(xu, part)\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(kcs) == 0 {\n\t\treturn 0, nil, fmt.Errorf(\"Could not find a valid keycode in the \"+\n\t\t\t\"string '%s'. Key binding failed.\", s)\n\t}\n\n\treturn mods, kcs, nil\n}\n\n// StrToKeycodes is a wrapper around keycodesGet meant to make our search\n// a bit more flexible if needed. (i.e., case-insensitive)\nfunc StrToKeycodes(xu *xgbutil.XUtil, str string) []xproto.Keycode {\n\t// Do some fancy case stuff before we give up.\n\tsym, ok := keysyms[str]\n\tif !ok {\n\t\tsym, ok = keysyms[strings.Title(str)]\n\t}\n\tif !ok {\n\t\tsym, ok = keysyms[strings.ToLower(str)]\n\t}\n\tif !ok {\n\t\tsym, ok = keysyms[strings.ToUpper(str)]\n\t}\n\n\t// If we don't know what 'str' is, return 0.\n\t// There will probably be a bad access. We should do better than that...\n\tif !ok {\n\t\treturn []xproto.Keycode{}\n\t}\n\treturn keycodesGet(xu, sym)\n}\n\n// keysymsPer gets the number of keysyms per keycode for the current key map.\nfunc keysymsPer(xu *xgbutil.XUtil) int {\n\treturn int(KeyMapGet(xu).KeysymsPerKeycode)\n}\n\n// Given a keysym, find all keycodes mapped to it in the current X environment.\n// keybind.Initialize MUST have been called before using this function.\nfunc keycodesGet(xu *xgbutil.XUtil, keysym xproto.Keysym) []xproto.Keycode {\n\tmin, max := minMaxKeycodeGet(xu)\n\tkeyMap := KeyMapGet(xu)\n\tif keyMap == nil {\n\t\tpanic(\"keybind.Initialize must be called before using the keybind \" +\n\t\t\t\"package.\")\n\t}\n\n\tvar c byte\n\tvar keycode xproto.Keycode\n\tkeycodes := make([]xproto.Keycode, 0)\n\tset := make(map[xproto.Keycode]bool, 0)\n\n\tfor kc := int(min); kc <= int(max); kc++ {\n\t\tkeycode = xproto.Keycode(kc)\n\t\tfor c = 0; c < keyMap.KeysymsPerKeycode; c++ {\n\t\t\tif keysym == KeysymGet(xu, keycode, c) && !set[keycode] {\n\t\t\t\tkeycodes = append(keycodes, keycode)\n\t\t\t\tset[keycode] = true\n\t\t\t}\n\t\t}\n\t}\n\treturn keycodes\n}\n\n// KeysymToStr converts a keysym to a string if one is available.\n// If one is found, KeysymToStr also checks the 'weirdKeysyms' map, which\n// contains a map from multi-character strings to single character\n// representations (i.e., 'braceleft' to '{').\n// If no match is found initially, an empty string is returned.\nfunc KeysymToStr(keysym xproto.Keysym) string {\n\tsymStr, ok := strKeysyms[keysym]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\tshortSymStr, ok := weirdKeysyms[symStr]\n\tif ok {\n\t\treturn string(shortSymStr)\n\t}\n\n\treturn symStr\n}\n\n// KeysymGet is a shortcut alias for 'KeysymGetWithMap' using the current\n// keymap stored in XUtil.\n// keybind.Initialize MUST have been called before using this function.\nfunc KeysymGet(xu *xgbutil.XUtil, keycode xproto.Keycode,\n\tcolumn byte) xproto.Keysym {\n\n\treturn KeysymGetWithMap(xu, KeyMapGet(xu), keycode, column)\n}\n\n// KeysymGetWithMap uses the given key map and finds a keysym associated\n// with the given keycode in the current X environment.\nfunc KeysymGetWithMap(xu *xgbutil.XUtil, keyMap *xgbutil.KeyboardMapping,\n\tkeycode xproto.Keycode, column byte) xproto.Keysym {\n\n\tmin, _ := minMaxKeycodeGet(xu)\n\ti := (int(keycode)-int(min))*int(keyMap.KeysymsPerKeycode) + int(column)\n\n\treturn keyMap.Keysyms[i]\n}\n\n// ModGet finds the modifier currently associated with a given keycode.\n// If a modifier doesn't exist for this keycode, then 0 is returned.\nfunc ModGet(xu *xgbutil.XUtil, keycode xproto.Keycode) uint16 {\n\tmodMap := ModMapGet(xu)\n\n\tvar i byte\n\tfor i = 0; int(i) < len(modMap.Keycodes); i++ {\n\t\tif modMap.Keycodes[i] == keycode {\n\t\t\treturn Modifiers[i/modMap.KeycodesPerModifier]\n\t\t}\n\t}\n\treturn 0\n}\n\n// Grab grabs a key with mods on a particular window.\n// This will also grab all combinations of modifiers found in xevent.IgnoreMods.\nfunc Grab(xu *xgbutil.XUtil, win xproto.Window,\n\tmods uint16, key xproto.Keycode) {\n\n\tfor _, m := range xevent.IgnoreMods {\n\t\txproto.GrabKey(xu.Conn(), true, win, mods|m, key,\n\t\t\txproto.GrabModeAsync, xproto.GrabModeAsync)\n\t}\n}\n\n// GrabChecked Grabs a key with mods on a particular window.\n// This is the same as Grab, except that it issue a checked request.\n// Which means that an error could be returned and handled on the spot.\n// (Checked requests are slower than unchecked requests.)\n// This will also grab all combinations of modifiers found in xevent.IgnoreMods.\nfunc GrabChecked(xu *xgbutil.XUtil, win xproto.Window,\n\tmods uint16, key xproto.Keycode) error {\n\n\tvar err error\n\tfor _, m := range xevent.IgnoreMods {\n\t\terr = xproto.GrabKeyChecked(xu.Conn(), true, win, mods|m, key,\n\t\t\txproto.GrabModeAsync, xproto.GrabModeAsync).Check()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Ungrab undoes Grab. It will handle all combinations od modifiers found\n// in xevent.IgnoreMods.\nfunc Ungrab(xu *xgbutil.XUtil, win xproto.Window,\n\tmods uint16, key xproto.Keycode) {\n\n\tfor _, m := range xevent.IgnoreMods {\n\t\txproto.UngrabKeyChecked(xu.Conn(), key, win, mods|m).Check()\n\t}\n}\n\n// GrabKeyboard grabs the entire keyboard.\n// Returns whether GrabStatus is successful and an error if one is reported by\n// XGB. It is possible to not get an error and the grab to be unsuccessful.\n// The purpose of 'win' is that after a grab is successful, ALL Key*Events will\n// be sent to that window. Make sure you have a callback attached :-)\nfunc GrabKeyboard(xu *xgbutil.XUtil, win xproto.Window) error {\n\treply, err := xproto.GrabKeyboard(xu.Conn(), false, win, 0,\n\t\txproto.GrabModeAsync, xproto.GrabModeAsync).Reply()\n\tif err != nil {\n\t\treturn fmt.Errorf(\"GrabKeyboard: Error grabbing keyboard on \"+\n\t\t\t\"window '%x': %s\", win, err)\n\t}\n\n\tswitch reply.Status {\n\tcase xproto.GrabStatusSuccess:\n\t\t// all is well\n\tcase xproto.GrabStatusAlreadyGrabbed:\n\t\treturn fmt.Errorf(\"GrabKeyboard: Could not grab keyboard. \" +\n\t\t\t\"Status: AlreadyGrabbed.\")\n\tcase xproto.GrabStatusInvalidTime:\n\t\treturn fmt.Errorf(\"GrabKeyboard: Could not grab keyboard. \" +\n\t\t\t\"Status: InvalidTime.\")\n\tcase xproto.GrabStatusNotViewable:\n\t\treturn fmt.Errorf(\"GrabKeyboard: Could not grab keyboard. \" +\n\t\t\t\"Status: NotViewable.\")\n\tcase xproto.GrabStatusFrozen:\n\t\treturn fmt.Errorf(\"GrabKeyboard: Could not grab keyboard. \" +\n\t\t\t\"Status: Frozen.\")\n\t}\n\treturn nil\n}\n\n// UngrabKeyboard undoes GrabKeyboard.\nfunc UngrabKeyboard(xu *xgbutil.XUtil) {\n\txproto.UngrabKeyboard(xu.Conn(), 0)\n}\n\n// SmartGrab grabs the keyboard for the given window, and redirects all\n// key events in the xevent main event loop to avoid races.\nfunc SmartGrab(xu *xgbutil.XUtil, win xproto.Window) error {\n\terr := GrabKeyboard(xu, win)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"SmartGrab: %s\", err)\n\t}\n\n\t// Now redirect all key events to the dummy window to prevent races\n\txevent.RedirectKeyEvents(xu, win)\n\n\treturn nil\n}\n\n// SmartUngrab reverses SmartGrab and stops redirecting all key events.\nfunc SmartUngrab(xu *xgbutil.XUtil) {\n\tUngrabKeyboard(xu)\n\n\t// Stop redirecting all key events\n\txevent.RedirectKeyEvents(xu, 0)\n}\n\n// DummyGrab grabs the keyboard and sends all key events to the dummy window.\nfunc DummyGrab(xu *xgbutil.XUtil) error {\n\treturn SmartGrab(xu, xu.Dummy())\n}\n\n// DummyUngrab ungrabs the keyboard from the dummy window.\nfunc DummyUngrab(xu *xgbutil.XUtil) {\n\tSmartUngrab(xu)\n}\n"
  },
  {
    "path": "keybind/keysymdef.go",
    "content": "package keybind\n\n/*\nThis file contains the keysym definitions from X.\nTaken from X11/keysymdef.h\n\nIt also contains the \"XFree86 vendor specific keysyms\" taken from\nX11/XF86keysym.h.\n\nWe store this as a map because we need to be able to do reverse lookups.\n\nkeysyms is a mapping from english strings to key symbols.\nstrKeysyms is a mapping from key symbols to english strings.\n*/\n\nimport \"github.com/BurntSushi/xgb/xproto\"\n\nfunc init() {\n\tstrKeysyms = make(map[xproto.Keysym]string, len(keysyms))\n\tfor kstr, keysym := range keysyms {\n\t\t// If we already have this keysym as a key, skip it.\n\t\t// (Prefer the first. This may be bad.)\n\t\tif _, ok := strKeysyms[keysym]; !ok {\n\t\t\tstrKeysyms[keysym] = kstr\n\t\t}\n\t}\n}\n\n// weirdKeysyms is a feeble attempt to map english words to single\n// characters. i.e., \"bracketleft\" -> [ and \"exclam\" to !\nvar weirdKeysyms = map[string]rune{\n\t\"space\":        ' ',\n\t\"exclam\":       '!',\n\t\"at\":           '@',\n\t\"numbersign\":   '#',\n\t\"dollar\":       '$',\n\t\"percent\":      '%',\n\t\"asciicircum\":  '^',\n\t\"ampersand\":    '&',\n\t\"asterisk\":     '*',\n\t\"parenleft\":    '(',\n\t\"parenright\":   ')',\n\t\"bracketleft\":  '[',\n\t\"bracketright\": ']',\n\t\"braceleft\":    '{',\n\t\"braceright\":   '}',\n\t\"minus\":        '-',\n\t\"underscore\":   '_',\n\t\"equal\":        '=',\n\t\"plus\":         '+',\n\t\"backslash\":    '\\\\',\n\t\"bar\":          '|',\n\t\"semicolon\":    ';',\n\t\"colon\":        ':',\n\t\"apostrophe\":   '\\'',\n\t\"quoteright\":   '\\'',\n\t\"quotedbl\":     '\"',\n\t\"less\":         '<',\n\t\"greater\":      '>',\n\t\"comma\":        ',',\n\t\"period\":       '.',\n\t\"slash\":        '/',\n\t\"question\":     '?',\n\t\"grave\":        '`',\n\t\"quoteleft\":    '`',\n\t\"asciitilde\":   '~',\n\t\"KP_Multiply\":  '*',\n\t\"KP_Divide\":    '/',\n\t\"KP_Subtract\":  '-',\n\t\"KP_Add\":       '+',\n\t\"KP_Decimal\":   '.',\n\t\"KP_0\":         '0',\n\t\"KP_1\":         '1',\n\t\"KP_2\":         '2',\n\t\"KP_3\":         '3',\n\t\"KP_4\":         '4',\n\t\"KP_5\":         '5',\n\t\"KP_6\":         '6',\n\t\"KP_7\":         '7',\n\t\"KP_8\":         '8',\n\t\"KP_9\":         '9',\n}\n\n// strKeysyms is the reverse of keysyms. It is built upon initialization.\n// TODO: Hard code the reverse map to be faster.\nvar strKeysyms map[xproto.Keysym]string\n\nvar keysyms map[string]xproto.Keysym = map[string]xproto.Keysym{\n\t\"VoidSymbol\":                  0xffffff,\n\t\"BackSpace\":                   0xff08,\n\t\"Tab\":                         0xff09,\n\t\"Linefeed\":                    0xff0a,\n\t\"Clear\":                       0xff0b,\n\t\"Return\":                      0xff0d,\n\t\"Pause\":                       0xff13,\n\t\"Scroll_Lock\":                 0xff14,\n\t\"Sys_Req\":                     0xff15,\n\t\"Escape\":                      0xff1b,\n\t\"Delete\":                      0xffff,\n\t\"Multi_key\":                   0xff20,\n\t\"Codeinput\":                   0xff37,\n\t\"SingleCandidate\":             0xff3c,\n\t\"MultipleCandidate\":           0xff3d,\n\t\"PreviousCandidate\":           0xff3e,\n\t\"Kanji\":                       0xff21,\n\t\"Muhenkan\":                    0xff22,\n\t\"Henkan_Mode\":                 0xff23,\n\t\"Henkan\":                      0xff23,\n\t\"Romaji\":                      0xff24,\n\t\"Hiragana\":                    0xff25,\n\t\"Katakana\":                    0xff26,\n\t\"Hiragana_Katakana\":           0xff27,\n\t\"Zenkaku\":                     0xff28,\n\t\"Hankaku\":                     0xff29,\n\t\"Zenkaku_Hankaku\":             0xff2a,\n\t\"Touroku\":                     0xff2b,\n\t\"Massyo\":                      0xff2c,\n\t\"Kana_Lock\":                   0xff2d,\n\t\"Kana_Shift\":                  0xff2e,\n\t\"Eisu_Shift\":                  0xff2f,\n\t\"Eisu_toggle\":                 0xff30,\n\t\"Kanji_Bangou\":                0xff37,\n\t\"Zen_Koho\":                    0xff3d,\n\t\"Mae_Koho\":                    0xff3e,\n\t\"Home\":                        0xff50,\n\t\"Left\":                        0xff51,\n\t\"Up\":                          0xff52,\n\t\"Right\":                       0xff53,\n\t\"Down\":                        0xff54,\n\t\"Prior\":                       0xff55,\n\t\"Page_Up\":                     0xff55,\n\t\"Next\":                        0xff56,\n\t\"Page_Down\":                   0xff56,\n\t\"End\":                         0xff57,\n\t\"Begin\":                       0xff58,\n\t\"Select\":                      0xff60,\n\t\"Print\":                       0xff61,\n\t\"Execute\":                     0xff62,\n\t\"Insert\":                      0xff63,\n\t\"Undo\":                        0xff65,\n\t\"Redo\":                        0xff66,\n\t\"Menu\":                        0xff67,\n\t\"Find\":                        0xff68,\n\t\"Cancel\":                      0xff69,\n\t\"Help\":                        0xff6a,\n\t\"Break\":                       0xff6b,\n\t\"Mode_switch\":                 0xff7e,\n\t\"script_switch\":               0xff7e,\n\t\"Num_Lock\":                    0xff7f,\n\t\"KP_Space\":                    0xff80,\n\t\"KP_Tab\":                      0xff89,\n\t\"KP_Enter\":                    0xff8d,\n\t\"KP_F1\":                       0xff91,\n\t\"KP_F2\":                       0xff92,\n\t\"KP_F3\":                       0xff93,\n\t\"KP_F4\":                       0xff94,\n\t\"KP_Home\":                     0xff95,\n\t\"KP_Left\":                     0xff96,\n\t\"KP_Up\":                       0xff97,\n\t\"KP_Right\":                    0xff98,\n\t\"KP_Down\":                     0xff99,\n\t\"KP_Prior\":                    0xff9a,\n\t\"KP_Page_Up\":                  0xff9a,\n\t\"KP_Next\":                     0xff9b,\n\t\"KP_Page_Down\":                0xff9b,\n\t\"KP_End\":                      0xff9c,\n\t\"KP_Begin\":                    0xff9d,\n\t\"KP_Insert\":                   0xff9e,\n\t\"KP_Delete\":                   0xff9f,\n\t\"KP_Equal\":                    0xffbd,\n\t\"KP_Multiply\":                 0xffaa,\n\t\"KP_Add\":                      0xffab,\n\t\"KP_Separator\":                0xffac,\n\t\"KP_Subtract\":                 0xffad,\n\t\"KP_Decimal\":                  0xffae,\n\t\"KP_Divide\":                   0xffaf,\n\t\"KP_0\":                        0xffb0,\n\t\"KP_1\":                        0xffb1,\n\t\"KP_2\":                        0xffb2,\n\t\"KP_3\":                        0xffb3,\n\t\"KP_4\":                        0xffb4,\n\t\"KP_5\":                        0xffb5,\n\t\"KP_6\":                        0xffb6,\n\t\"KP_7\":                        0xffb7,\n\t\"KP_8\":                        0xffb8,\n\t\"KP_9\":                        0xffb9,\n\t\"F1\":                          0xffbe,\n\t\"F2\":                          0xffbf,\n\t\"F3\":                          0xffc0,\n\t\"F4\":                          0xffc1,\n\t\"F5\":                          0xffc2,\n\t\"F6\":                          0xffc3,\n\t\"F7\":                          0xffc4,\n\t\"F8\":                          0xffc5,\n\t\"F9\":                          0xffc6,\n\t\"F10\":                         0xffc7,\n\t\"F11\":                         0xffc8,\n\t\"L1\":                          0xffc8,\n\t\"F12\":                         0xffc9,\n\t\"L2\":                          0xffc9,\n\t\"F13\":                         0xffca,\n\t\"L3\":                          0xffca,\n\t\"F14\":                         0xffcb,\n\t\"L4\":                          0xffcb,\n\t\"F15\":                         0xffcc,\n\t\"L5\":                          0xffcc,\n\t\"F16\":                         0xffcd,\n\t\"L6\":                          0xffcd,\n\t\"F17\":                         0xffce,\n\t\"L7\":                          0xffce,\n\t\"F18\":                         0xffcf,\n\t\"L8\":                          0xffcf,\n\t\"F19\":                         0xffd0,\n\t\"L9\":                          0xffd0,\n\t\"F20\":                         0xffd1,\n\t\"L10\":                         0xffd1,\n\t\"F21\":                         0xffd2,\n\t\"R1\":                          0xffd2,\n\t\"F22\":                         0xffd3,\n\t\"R2\":                          0xffd3,\n\t\"F23\":                         0xffd4,\n\t\"R3\":                          0xffd4,\n\t\"F24\":                         0xffd5,\n\t\"R4\":                          0xffd5,\n\t\"F25\":                         0xffd6,\n\t\"R5\":                          0xffd6,\n\t\"F26\":                         0xffd7,\n\t\"R6\":                          0xffd7,\n\t\"F27\":                         0xffd8,\n\t\"R7\":                          0xffd8,\n\t\"F28\":                         0xffd9,\n\t\"R8\":                          0xffd9,\n\t\"F29\":                         0xffda,\n\t\"R9\":                          0xffda,\n\t\"F30\":                         0xffdb,\n\t\"R10\":                         0xffdb,\n\t\"F31\":                         0xffdc,\n\t\"R11\":                         0xffdc,\n\t\"F32\":                         0xffdd,\n\t\"R12\":                         0xffdd,\n\t\"F33\":                         0xffde,\n\t\"R13\":                         0xffde,\n\t\"F34\":                         0xffdf,\n\t\"R14\":                         0xffdf,\n\t\"F35\":                         0xffe0,\n\t\"R15\":                         0xffe0,\n\t\"Shift_L\":                     0xffe1,\n\t\"Shift_R\":                     0xffe2,\n\t\"Control_L\":                   0xffe3,\n\t\"Control_R\":                   0xffe4,\n\t\"Caps_Lock\":                   0xffe5,\n\t\"Shift_Lock\":                  0xffe6,\n\t\"Meta_L\":                      0xffe7,\n\t\"Meta_R\":                      0xffe8,\n\t\"Alt_L\":                       0xffe9,\n\t\"Alt_R\":                       0xffea,\n\t\"Super_L\":                     0xffeb,\n\t\"Super_R\":                     0xffec,\n\t\"Hyper_L\":                     0xffed,\n\t\"Hyper_R\":                     0xffee,\n\t\"ISO_Lock\":                    0xfe01,\n\t\"ISO_Level2_Latch\":            0xfe02,\n\t\"ISO_Level3_Shift\":            0xfe03,\n\t\"ISO_Level3_Latch\":            0xfe04,\n\t\"ISO_Level3_Lock\":             0xfe05,\n\t\"ISO_Level5_Shift\":            0xfe11,\n\t\"ISO_Level5_Latch\":            0xfe12,\n\t\"ISO_Level5_Lock\":             0xfe13,\n\t\"ISO_Group_Shift\":             0xff7e,\n\t\"ISO_Group_Latch\":             0xfe06,\n\t\"ISO_Group_Lock\":              0xfe07,\n\t\"ISO_Next_Group\":              0xfe08,\n\t\"ISO_Next_Group_Lock\":         0xfe09,\n\t\"ISO_Prev_Group\":              0xfe0a,\n\t\"ISO_Prev_Group_Lock\":         0xfe0b,\n\t\"ISO_First_Group\":             0xfe0c,\n\t\"ISO_First_Group_Lock\":        0xfe0d,\n\t\"ISO_Last_Group\":              0xfe0e,\n\t\"ISO_Last_Group_Lock\":         0xfe0f,\n\t\"ISO_Left_Tab\":                0xfe20,\n\t\"ISO_Move_Line_Up\":            0xfe21,\n\t\"ISO_Move_Line_Down\":          0xfe22,\n\t\"ISO_Partial_Line_Up\":         0xfe23,\n\t\"ISO_Partial_Line_Down\":       0xfe24,\n\t\"ISO_Partial_Space_Left\":      0xfe25,\n\t\"ISO_Partial_Space_Right\":     0xfe26,\n\t\"ISO_Set_Margin_Left\":         0xfe27,\n\t\"ISO_Set_Margin_Right\":        0xfe28,\n\t\"ISO_Release_Margin_Left\":     0xfe29,\n\t\"ISO_Release_Margin_Right\":    0xfe2a,\n\t\"ISO_Release_Both_Margins\":    0xfe2b,\n\t\"ISO_Fast_Cursor_Left\":        0xfe2c,\n\t\"ISO_Fast_Cursor_Right\":       0xfe2d,\n\t\"ISO_Fast_Cursor_Up\":          0xfe2e,\n\t\"ISO_Fast_Cursor_Down\":        0xfe2f,\n\t\"ISO_Continuous_Underline\":    0xfe30,\n\t\"ISO_Discontinuous_Underline\": 0xfe31,\n\t\"ISO_Emphasize\":               0xfe32,\n\t\"ISO_Center_Object\":           0xfe33,\n\t\"ISO_Enter\":                   0xfe34,\n\t\"dead_grave\":                  0xfe50,\n\t\"dead_acute\":                  0xfe51,\n\t\"dead_circumflex\":             0xfe52,\n\t\"dead_tilde\":                  0xfe53,\n\t\"dead_perispomeni\":            0xfe53,\n\t\"dead_macron\":                 0xfe54,\n\t\"dead_breve\":                  0xfe55,\n\t\"dead_abovedot\":               0xfe56,\n\t\"dead_diaeresis\":              0xfe57,\n\t\"dead_abovering\":              0xfe58,\n\t\"dead_doubleacute\":            0xfe59,\n\t\"dead_caron\":                  0xfe5a,\n\t\"dead_cedilla\":                0xfe5b,\n\t\"dead_ogonek\":                 0xfe5c,\n\t\"dead_iota\":                   0xfe5d,\n\t\"dead_voiced_sound\":           0xfe5e,\n\t\"dead_semivoiced_sound\":       0xfe5f,\n\t\"dead_belowdot\":               0xfe60,\n\t\"dead_hook\":                   0xfe61,\n\t\"dead_horn\":                   0xfe62,\n\t\"dead_stroke\":                 0xfe63,\n\t\"dead_abovecomma\":             0xfe64,\n\t\"dead_psili\":                  0xfe64,\n\t\"dead_abovereversedcomma\":     0xfe65,\n\t\"dead_dasia\":                  0xfe65,\n\t\"dead_doublegrave\":            0xfe66,\n\t\"dead_belowring\":              0xfe67,\n\t\"dead_belowmacron\":            0xfe68,\n\t\"dead_belowcircumflex\":        0xfe69,\n\t\"dead_belowtilde\":             0xfe6a,\n\t\"dead_belowbreve\":             0xfe6b,\n\t\"dead_belowdiaeresis\":         0xfe6c,\n\t\"dead_invertedbreve\":          0xfe6d,\n\t\"dead_belowcomma\":             0xfe6e,\n\t\"dead_currency\":               0xfe6f,\n\t\"dead_a\":                      0xfe80,\n\t\"dead_A\":                      0xfe81,\n\t\"dead_e\":                      0xfe82,\n\t\"dead_E\":                      0xfe83,\n\t\"dead_i\":                      0xfe84,\n\t\"dead_I\":                      0xfe85,\n\t\"dead_o\":                      0xfe86,\n\t\"dead_O\":                      0xfe87,\n\t\"dead_u\":                      0xfe88,\n\t\"dead_U\":                      0xfe89,\n\t\"dead_small_schwa\":            0xfe8a,\n\t\"dead_capital_schwa\":          0xfe8b,\n\t\"First_Virtual_Screen\":        0xfed0,\n\t\"Prev_Virtual_Screen\":         0xfed1,\n\t\"Next_Virtual_Screen\":         0xfed2,\n\t\"Last_Virtual_Screen\":         0xfed4,\n\t\"Terminate_Server\":            0xfed5,\n\t\"AccessX_Enable\":              0xfe70,\n\t\"AccessX_Feedback_Enable\":     0xfe71,\n\t\"RepeatKeys_Enable\":           0xfe72,\n\t\"SlowKeys_Enable\":             0xfe73,\n\t\"BounceKeys_Enable\":           0xfe74,\n\t\"StickyKeys_Enable\":           0xfe75,\n\t\"MouseKeys_Enable\":            0xfe76,\n\t\"MouseKeys_Accel_Enable\":      0xfe77,\n\t\"Overlay1_Enable\":             0xfe78,\n\t\"Overlay2_Enable\":             0xfe79,\n\t\"AudibleBell_Enable\":          0xfe7a,\n\t\"Pointer_Left\":                0xfee0,\n\t\"Pointer_Right\":               0xfee1,\n\t\"Pointer_Up\":                  0xfee2,\n\t\"Pointer_Down\":                0xfee3,\n\t\"Pointer_UpLeft\":              0xfee4,\n\t\"Pointer_UpRight\":             0xfee5,\n\t\"Pointer_DownLeft\":            0xfee6,\n\t\"Pointer_DownRight\":           0xfee7,\n\t\"Pointer_Button_Dflt\":         0xfee8,\n\t\"Pointer_Button1\":             0xfee9,\n\t\"Pointer_Button2\":             0xfeea,\n\t\"Pointer_Button3\":             0xfeeb,\n\t\"Pointer_Button4\":             0xfeec,\n\t\"Pointer_Button5\":             0xfeed,\n\t\"Pointer_DblClick_Dflt\":       0xfeee,\n\t\"Pointer_DblClick1\":           0xfeef,\n\t\"Pointer_DblClick2\":           0xfef0,\n\t\"Pointer_DblClick3\":           0xfef1,\n\t\"Pointer_DblClick4\":           0xfef2,\n\t\"Pointer_DblClick5\":           0xfef3,\n\t\"Pointer_Drag_Dflt\":           0xfef4,\n\t\"Pointer_Drag1\":               0xfef5,\n\t\"Pointer_Drag2\":               0xfef6,\n\t\"Pointer_Drag3\":               0xfef7,\n\t\"Pointer_Drag4\":               0xfef8,\n\t\"Pointer_Drag5\":               0xfefd,\n\t\"Pointer_EnableKeys\":          0xfef9,\n\t\"Pointer_Accelerate\":          0xfefa,\n\t\"Pointer_DfltBtnNext\":         0xfefb,\n\t\"Pointer_DfltBtnPrev\":         0xfefc,\n\t\"3270_Duplicate\":              0xfd01,\n\t\"3270_FieldMark\":              0xfd02,\n\t\"3270_Right2\":                 0xfd03,\n\t\"3270_Left2\":                  0xfd04,\n\t\"3270_BackTab\":                0xfd05,\n\t\"3270_EraseEOF\":               0xfd06,\n\t\"3270_EraseInput\":             0xfd07,\n\t\"3270_Reset\":                  0xfd08,\n\t\"3270_Quit\":                   0xfd09,\n\t\"3270_PA1\":                    0xfd0a,\n\t\"3270_PA2\":                    0xfd0b,\n\t\"3270_PA3\":                    0xfd0c,\n\t\"3270_Test\":                   0xfd0d,\n\t\"3270_Attn\":                   0xfd0e,\n\t\"3270_CursorBlink\":            0xfd0f,\n\t\"3270_AltCursor\":              0xfd10,\n\t\"3270_KeyClick\":               0xfd11,\n\t\"3270_Jump\":                   0xfd12,\n\t\"3270_Ident\":                  0xfd13,\n\t\"3270_Rule\":                   0xfd14,\n\t\"3270_Copy\":                   0xfd15,\n\t\"3270_Play\":                   0xfd16,\n\t\"3270_Setup\":                  0xfd17,\n\t\"3270_Record\":                 0xfd18,\n\t\"3270_ChangeScreen\":           0xfd19,\n\t\"3270_DeleteWord\":             0xfd1a,\n\t\"3270_ExSelect\":               0xfd1b,\n\t\"3270_CursorSelect\":           0xfd1c,\n\t\"3270_PrintScreen\":            0xfd1d,\n\t\"3270_Enter\":                  0xfd1e,\n\t\"space\":                       0x0020,\n\t\"exclam\":                      0x0021,\n\t\"quotedbl\":                    0x0022,\n\t\"numbersign\":                  0x0023,\n\t\"dollar\":                      0x0024,\n\t\"percent\":                     0x0025,\n\t\"ampersand\":                   0x0026,\n\t\"apostrophe\":                  0x0027,\n\t\"quoteright\":                  0x0027,\n\t\"parenleft\":                   0x0028,\n\t\"parenright\":                  0x0029,\n\t\"asterisk\":                    0x002a,\n\t\"plus\":                        0x002b,\n\t\"comma\":                       0x002c,\n\t\"minus\":                       0x002d,\n\t\"period\":                      0x002e,\n\t\"slash\":                       0x002f,\n\t\"0\":                           0x0030,\n\t\"1\":                           0x0031,\n\t\"2\":                           0x0032,\n\t\"3\":                           0x0033,\n\t\"4\":                           0x0034,\n\t\"5\":                           0x0035,\n\t\"6\":                           0x0036,\n\t\"7\":                           0x0037,\n\t\"8\":                           0x0038,\n\t\"9\":                           0x0039,\n\t\"colon\":                       0x003a,\n\t\"semicolon\":                   0x003b,\n\t\"less\":                        0x003c,\n\t\"equal\":                       0x003d,\n\t\"greater\":                     0x003e,\n\t\"question\":                    0x003f,\n\t\"at\":                          0x0040,\n\t\"A\":                           0x0041,\n\t\"B\":                           0x0042,\n\t\"C\":                           0x0043,\n\t\"D\":                           0x0044,\n\t\"E\":                           0x0045,\n\t\"F\":                           0x0046,\n\t\"G\":                           0x0047,\n\t\"H\":                           0x0048,\n\t\"I\":                           0x0049,\n\t\"J\":                           0x004a,\n\t\"K\":                           0x004b,\n\t\"L\":                           0x004c,\n\t\"M\":                           0x004d,\n\t\"N\":                           0x004e,\n\t\"O\":                           0x004f,\n\t\"P\":                           0x0050,\n\t\"Q\":                           0x0051,\n\t\"R\":                           0x0052,\n\t\"S\":                           0x0053,\n\t\"T\":                           0x0054,\n\t\"U\":                           0x0055,\n\t\"V\":                           0x0056,\n\t\"W\":                           0x0057,\n\t\"X\":                           0x0058,\n\t\"Y\":                           0x0059,\n\t\"Z\":                           0x005a,\n\t\"bracketleft\":                 0x005b,\n\t\"backslash\":                   0x005c,\n\t\"bracketright\":                0x005d,\n\t\"asciicircum\":                 0x005e,\n\t\"underscore\":                  0x005f,\n\t\"grave\":                       0x0060,\n\t\"quoteleft\":                   0x0060,\n\t\"a\":                           0x0061,\n\t\"b\":                           0x0062,\n\t\"c\":                           0x0063,\n\t\"d\":                           0x0064,\n\t\"e\":                           0x0065,\n\t\"f\":                           0x0066,\n\t\"g\":                           0x0067,\n\t\"h\":                           0x0068,\n\t\"i\":                           0x0069,\n\t\"j\":                           0x006a,\n\t\"k\":                           0x006b,\n\t\"l\":                           0x006c,\n\t\"m\":                           0x006d,\n\t\"n\":                           0x006e,\n\t\"o\":                           0x006f,\n\t\"p\":                           0x0070,\n\t\"q\":                           0x0071,\n\t\"r\":                           0x0072,\n\t\"s\":                           0x0073,\n\t\"t\":                           0x0074,\n\t\"u\":                           0x0075,\n\t\"v\":                           0x0076,\n\t\"w\":                           0x0077,\n\t\"x\":                           0x0078,\n\t\"y\":                           0x0079,\n\t\"z\":                           0x007a,\n\t\"braceleft\":                   0x007b,\n\t\"bar\":                         0x007c,\n\t\"braceright\":                  0x007d,\n\t\"asciitilde\":                  0x007e,\n\t\"nobreakspace\":                0x00a0,\n\t\"exclamdown\":                  0x00a1,\n\t\"cent\":                        0x00a2,\n\t\"sterling\":                    0x00a3,\n\t\"currency\":                    0x00a4,\n\t\"yen\":                         0x00a5,\n\t\"brokenbar\":                   0x00a6,\n\t\"section\":                     0x00a7,\n\t\"diaeresis\":                   0x00a8,\n\t\"copyright\":                   0x00a9,\n\t\"ordfeminine\":                 0x00aa,\n\t\"guillemotleft\":               0x00ab,\n\t\"notsign\":                     0x00ac,\n\t\"hyphen\":                      0x00ad,\n\t\"registered\":                  0x00ae,\n\t\"macron\":                      0x00af,\n\t\"degree\":                      0x00b0,\n\t\"plusminus\":                   0x00b1,\n\t\"twosuperior\":                 0x00b2,\n\t\"threesuperior\":               0x00b3,\n\t\"acute\":                       0x00b4,\n\t\"mu\":                          0x00b5,\n\t\"paragraph\":                   0x00b6,\n\t\"periodcentered\":              0x00b7,\n\t\"cedilla\":                     0x00b8,\n\t\"onesuperior\":                 0x00b9,\n\t\"masculine\":                   0x00ba,\n\t\"guillemotright\":              0x00bb,\n\t\"onequarter\":                  0x00bc,\n\t\"onehalf\":                     0x00bd,\n\t\"threequarters\":               0x00be,\n\t\"questiondown\":                0x00bf,\n\t\"Agrave\":                      0x00c0,\n\t\"Aacute\":                      0x00c1,\n\t\"Acircumflex\":                 0x00c2,\n\t\"Atilde\":                      0x00c3,\n\t\"Adiaeresis\":                  0x00c4,\n\t\"Aring\":                       0x00c5,\n\t\"AE\":                          0x00c6,\n\t\"Ccedilla\":                    0x00c7,\n\t\"Egrave\":                      0x00c8,\n\t\"Eacute\":                      0x00c9,\n\t\"Ecircumflex\":                 0x00ca,\n\t\"Ediaeresis\":                  0x00cb,\n\t\"Igrave\":                      0x00cc,\n\t\"Iacute\":                      0x00cd,\n\t\"Icircumflex\":                 0x00ce,\n\t\"Idiaeresis\":                  0x00cf,\n\t\"ETH\":                         0x00d0,\n\t\"Eth\":                         0x00d0,\n\t\"Ntilde\":                      0x00d1,\n\t\"Ograve\":                      0x00d2,\n\t\"Oacute\":                      0x00d3,\n\t\"Ocircumflex\":                 0x00d4,\n\t\"Otilde\":                      0x00d5,\n\t\"Odiaeresis\":                  0x00d6,\n\t\"multiply\":                    0x00d7,\n\t\"Oslash\":                      0x00d8,\n\t\"Ooblique\":                    0x00d8,\n\t\"Ugrave\":                      0x00d9,\n\t\"Uacute\":                      0x00da,\n\t\"Ucircumflex\":                 0x00db,\n\t\"Udiaeresis\":                  0x00dc,\n\t\"Yacute\":                      0x00dd,\n\t\"THORN\":                       0x00de,\n\t\"Thorn\":                       0x00de,\n\t\"ssharp\":                      0x00df,\n\t\"agrave\":                      0x00e0,\n\t\"aacute\":                      0x00e1,\n\t\"acircumflex\":                 0x00e2,\n\t\"atilde\":                      0x00e3,\n\t\"adiaeresis\":                  0x00e4,\n\t\"aring\":                       0x00e5,\n\t\"ae\":                          0x00e6,\n\t\"ccedilla\":                    0x00e7,\n\t\"egrave\":                      0x00e8,\n\t\"eacute\":                      0x00e9,\n\t\"ecircumflex\":                 0x00ea,\n\t\"ediaeresis\":                  0x00eb,\n\t\"igrave\":                      0x00ec,\n\t\"iacute\":                      0x00ed,\n\t\"icircumflex\":                 0x00ee,\n\t\"idiaeresis\":                  0x00ef,\n\t\"eth\":                         0x00f0,\n\t\"ntilde\":                      0x00f1,\n\t\"ograve\":                      0x00f2,\n\t\"oacute\":                      0x00f3,\n\t\"ocircumflex\":                 0x00f4,\n\t\"otilde\":                      0x00f5,\n\t\"odiaeresis\":                  0x00f6,\n\t\"division\":                    0x00f7,\n\t\"oslash\":                      0x00f8,\n\t\"ooblique\":                    0x00f8,\n\t\"ugrave\":                      0x00f9,\n\t\"uacute\":                      0x00fa,\n\t\"ucircumflex\":                 0x00fb,\n\t\"udiaeresis\":                  0x00fc,\n\t\"yacute\":                      0x00fd,\n\t\"thorn\":                       0x00fe,\n\t\"ydiaeresis\":                  0x00ff,\n\t\"Aogonek\":                     0x01a1,\n\t\"breve\":                       0x01a2,\n\t\"Lstroke\":                     0x01a3,\n\t\"Lcaron\":                      0x01a5,\n\t\"Sacute\":                      0x01a6,\n\t\"Scaron\":                      0x01a9,\n\t\"Scedilla\":                    0x01aa,\n\t\"Tcaron\":                      0x01ab,\n\t\"Zacute\":                      0x01ac,\n\t\"Zcaron\":                      0x01ae,\n\t\"Zabovedot\":                   0x01af,\n\t\"aogonek\":                     0x01b1,\n\t\"ogonek\":                      0x01b2,\n\t\"lstroke\":                     0x01b3,\n\t\"lcaron\":                      0x01b5,\n\t\"sacute\":                      0x01b6,\n\t\"caron\":                       0x01b7,\n\t\"scaron\":                      0x01b9,\n\t\"scedilla\":                    0x01ba,\n\t\"tcaron\":                      0x01bb,\n\t\"zacute\":                      0x01bc,\n\t\"doubleacute\":                 0x01bd,\n\t\"zcaron\":                      0x01be,\n\t\"zabovedot\":                   0x01bf,\n\t\"Racute\":                      0x01c0,\n\t\"Abreve\":                      0x01c3,\n\t\"Lacute\":                      0x01c5,\n\t\"Cacute\":                      0x01c6,\n\t\"Ccaron\":                      0x01c8,\n\t\"Eogonek\":                     0x01ca,\n\t\"Ecaron\":                      0x01cc,\n\t\"Dcaron\":                      0x01cf,\n\t\"Dstroke\":                     0x01d0,\n\t\"Nacute\":                      0x01d1,\n\t\"Ncaron\":                      0x01d2,\n\t\"Odoubleacute\":                0x01d5,\n\t\"Rcaron\":                      0x01d8,\n\t\"Uring\":                       0x01d9,\n\t\"Udoubleacute\":                0x01db,\n\t\"Tcedilla\":                    0x01de,\n\t\"racute\":                      0x01e0,\n\t\"abreve\":                      0x01e3,\n\t\"lacute\":                      0x01e5,\n\t\"cacute\":                      0x01e6,\n\t\"ccaron\":                      0x01e8,\n\t\"eogonek\":                     0x01ea,\n\t\"ecaron\":                      0x01ec,\n\t\"dcaron\":                      0x01ef,\n\t\"dstroke\":                     0x01f0,\n\t\"nacute\":                      0x01f1,\n\t\"ncaron\":                      0x01f2,\n\t\"odoubleacute\":                0x01f5,\n\t\"udoubleacute\":                0x01fb,\n\t\"rcaron\":                      0x01f8,\n\t\"uring\":                       0x01f9,\n\t\"tcedilla\":                    0x01fe,\n\t\"abovedot\":                    0x01ff,\n\t\"Hstroke\":                     0x02a1,\n\t\"Hcircumflex\":                 0x02a6,\n\t\"Iabovedot\":                   0x02a9,\n\t\"Gbreve\":                      0x02ab,\n\t\"Jcircumflex\":                 0x02ac,\n\t\"hstroke\":                     0x02b1,\n\t\"hcircumflex\":                 0x02b6,\n\t\"idotless\":                    0x02b9,\n\t\"gbreve\":                      0x02bb,\n\t\"jcircumflex\":                 0x02bc,\n\t\"Cabovedot\":                   0x02c5,\n\t\"Ccircumflex\":                 0x02c6,\n\t\"Gabovedot\":                   0x02d5,\n\t\"Gcircumflex\":                 0x02d8,\n\t\"Ubreve\":                      0x02dd,\n\t\"Scircumflex\":                 0x02de,\n\t\"cabovedot\":                   0x02e5,\n\t\"ccircumflex\":                 0x02e6,\n\t\"gabovedot\":                   0x02f5,\n\t\"gcircumflex\":                 0x02f8,\n\t\"ubreve\":                      0x02fd,\n\t\"scircumflex\":                 0x02fe,\n\t\"kra\":                         0x03a2,\n\t\"kappa\":                       0x03a2,\n\t\"Rcedilla\":                    0x03a3,\n\t\"Itilde\":                      0x03a5,\n\t\"Lcedilla\":                    0x03a6,\n\t\"Emacron\":                     0x03aa,\n\t\"Gcedilla\":                    0x03ab,\n\t\"Tslash\":                      0x03ac,\n\t\"rcedilla\":                    0x03b3,\n\t\"itilde\":                      0x03b5,\n\t\"lcedilla\":                    0x03b6,\n\t\"emacron\":                     0x03ba,\n\t\"gcedilla\":                    0x03bb,\n\t\"tslash\":                      0x03bc,\n\t\"ENG\":                         0x03bd,\n\t\"eng\":                         0x03bf,\n\t\"Amacron\":                     0x03c0,\n\t\"Iogonek\":                     0x03c7,\n\t\"Eabovedot\":                   0x03cc,\n\t\"Imacron\":                     0x03cf,\n\t\"Ncedilla\":                    0x03d1,\n\t\"Omacron\":                     0x03d2,\n\t\"Kcedilla\":                    0x03d3,\n\t\"Uogonek\":                     0x03d9,\n\t\"Utilde\":                      0x03dd,\n\t\"Umacron\":                     0x03de,\n\t\"amacron\":                     0x03e0,\n\t\"iogonek\":                     0x03e7,\n\t\"eabovedot\":                   0x03ec,\n\t\"imacron\":                     0x03ef,\n\t\"ncedilla\":                    0x03f1,\n\t\"omacron\":                     0x03f2,\n\t\"kcedilla\":                    0x03f3,\n\t\"uogonek\":                     0x03f9,\n\t\"utilde\":                      0x03fd,\n\t\"umacron\":                     0x03fe,\n\t\"Babovedot\":                   0x1001e02,\n\t\"babovedot\":                   0x1001e03,\n\t\"Dabovedot\":                   0x1001e0a,\n\t\"Wgrave\":                      0x1001e80,\n\t\"Wacute\":                      0x1001e82,\n\t\"dabovedot\":                   0x1001e0b,\n\t\"Ygrave\":                      0x1001ef2,\n\t\"Fabovedot\":                   0x1001e1e,\n\t\"fabovedot\":                   0x1001e1f,\n\t\"Mabovedot\":                   0x1001e40,\n\t\"mabovedot\":                   0x1001e41,\n\t\"Pabovedot\":                   0x1001e56,\n\t\"wgrave\":                      0x1001e81,\n\t\"pabovedot\":                   0x1001e57,\n\t\"wacute\":                      0x1001e83,\n\t\"Sabovedot\":                   0x1001e60,\n\t\"ygrave\":                      0x1001ef3,\n\t\"Wdiaeresis\":                  0x1001e84,\n\t\"wdiaeresis\":                  0x1001e85,\n\t\"sabovedot\":                   0x1001e61,\n\t\"Wcircumflex\":                 0x1000174,\n\t\"Tabovedot\":                   0x1001e6a,\n\t\"Ycircumflex\":                 0x1000176,\n\t\"wcircumflex\":                 0x1000175,\n\t\"tabovedot\":                   0x1001e6b,\n\t\"ycircumflex\":                 0x1000177,\n\t\"OE\":                          0x13bc,\n\t\"oe\":                          0x13bd,\n\t\"Ydiaeresis\":                  0x13be,\n\t\"overline\":                    0x047e,\n\t\"kana_fullstop\":               0x04a1,\n\t\"kana_openingbracket\":         0x04a2,\n\t\"kana_closingbracket\":         0x04a3,\n\t\"kana_comma\":                  0x04a4,\n\t\"kana_conjunctive\":            0x04a5,\n\t\"kana_middledot\":              0x04a5,\n\t\"kana_WO\":                     0x04a6,\n\t\"kana_a\":                      0x04a7,\n\t\"kana_i\":                      0x04a8,\n\t\"kana_u\":                      0x04a9,\n\t\"kana_e\":                      0x04aa,\n\t\"kana_o\":                      0x04ab,\n\t\"kana_ya\":                     0x04ac,\n\t\"kana_yu\":                     0x04ad,\n\t\"kana_yo\":                     0x04ae,\n\t\"kana_tsu\":                    0x04af,\n\t\"kana_tu\":                     0x04af,\n\t\"prolongedsound\":              0x04b0,\n\t\"kana_A\":                      0x04b1,\n\t\"kana_I\":                      0x04b2,\n\t\"kana_U\":                      0x04b3,\n\t\"kana_E\":                      0x04b4,\n\t\"kana_O\":                      0x04b5,\n\t\"kana_KA\":                     0x04b6,\n\t\"kana_KI\":                     0x04b7,\n\t\"kana_KU\":                     0x04b8,\n\t\"kana_KE\":                     0x04b9,\n\t\"kana_KO\":                     0x04ba,\n\t\"kana_SA\":                     0x04bb,\n\t\"kana_SHI\":                    0x04bc,\n\t\"kana_SU\":                     0x04bd,\n\t\"kana_SE\":                     0x04be,\n\t\"kana_SO\":                     0x04bf,\n\t\"kana_TA\":                     0x04c0,\n\t\"kana_CHI\":                    0x04c1,\n\t\"kana_TI\":                     0x04c1,\n\t\"kana_TSU\":                    0x04c2,\n\t\"kana_TU\":                     0x04c2,\n\t\"kana_TE\":                     0x04c3,\n\t\"kana_TO\":                     0x04c4,\n\t\"kana_NA\":                     0x04c5,\n\t\"kana_NI\":                     0x04c6,\n\t\"kana_NU\":                     0x04c7,\n\t\"kana_NE\":                     0x04c8,\n\t\"kana_NO\":                     0x04c9,\n\t\"kana_HA\":                     0x04ca,\n\t\"kana_HI\":                     0x04cb,\n\t\"kana_FU\":                     0x04cc,\n\t\"kana_HU\":                     0x04cc,\n\t\"kana_HE\":                     0x04cd,\n\t\"kana_HO\":                     0x04ce,\n\t\"kana_MA\":                     0x04cf,\n\t\"kana_MI\":                     0x04d0,\n\t\"kana_MU\":                     0x04d1,\n\t\"kana_ME\":                     0x04d2,\n\t\"kana_MO\":                     0x04d3,\n\t\"kana_YA\":                     0x04d4,\n\t\"kana_YU\":                     0x04d5,\n\t\"kana_YO\":                     0x04d6,\n\t\"kana_RA\":                     0x04d7,\n\t\"kana_RI\":                     0x04d8,\n\t\"kana_RU\":                     0x04d9,\n\t\"kana_RE\":                     0x04da,\n\t\"kana_RO\":                     0x04db,\n\t\"kana_WA\":                     0x04dc,\n\t\"kana_N\":                      0x04dd,\n\t\"voicedsound\":                 0x04de,\n\t\"semivoicedsound\":             0x04df,\n\t\"kana_switch\":                 0xff7e,\n\t\"Farsi_0\":                     0x10006f0,\n\t\"Farsi_1\":                     0x10006f1,\n\t\"Farsi_2\":                     0x10006f2,\n\t\"Farsi_3\":                     0x10006f3,\n\t\"Farsi_4\":                     0x10006f4,\n\t\"Farsi_5\":                     0x10006f5,\n\t\"Farsi_6\":                     0x10006f6,\n\t\"Farsi_7\":                     0x10006f7,\n\t\"Farsi_8\":                     0x10006f8,\n\t\"Farsi_9\":                     0x10006f9,\n\t\"Arabic_percent\":              0x100066a,\n\t\"Arabic_superscript_alef\":     0x1000670,\n\t\"Arabic_tteh\":                 0x1000679,\n\t\"Arabic_peh\":                  0x100067e,\n\t\"Arabic_tcheh\":                0x1000686,\n\t\"Arabic_ddal\":                 0x1000688,\n\t\"Arabic_rreh\":                 0x1000691,\n\t\"Arabic_comma\":                0x05ac,\n\t\"Arabic_fullstop\":             0x10006d4,\n\t\"Arabic_0\":                    0x1000660,\n\t\"Arabic_1\":                    0x1000661,\n\t\"Arabic_2\":                    0x1000662,\n\t\"Arabic_3\":                    0x1000663,\n\t\"Arabic_4\":                    0x1000664,\n\t\"Arabic_5\":                    0x1000665,\n\t\"Arabic_6\":                    0x1000666,\n\t\"Arabic_7\":                    0x1000667,\n\t\"Arabic_8\":                    0x1000668,\n\t\"Arabic_9\":                    0x1000669,\n\t\"Arabic_semicolon\":            0x05bb,\n\t\"Arabic_question_mark\":        0x05bf,\n\t\"Arabic_hamza\":                0x05c1,\n\t\"Arabic_maddaonalef\":          0x05c2,\n\t\"Arabic_hamzaonalef\":          0x05c3,\n\t\"Arabic_hamzaonwaw\":           0x05c4,\n\t\"Arabic_hamzaunderalef\":       0x05c5,\n\t\"Arabic_hamzaonyeh\":           0x05c6,\n\t\"Arabic_alef\":                 0x05c7,\n\t\"Arabic_beh\":                  0x05c8,\n\t\"Arabic_tehmarbuta\":           0x05c9,\n\t\"Arabic_teh\":                  0x05ca,\n\t\"Arabic_theh\":                 0x05cb,\n\t\"Arabic_jeem\":                 0x05cc,\n\t\"Arabic_hah\":                  0x05cd,\n\t\"Arabic_khah\":                 0x05ce,\n\t\"Arabic_dal\":                  0x05cf,\n\t\"Arabic_thal\":                 0x05d0,\n\t\"Arabic_ra\":                   0x05d1,\n\t\"Arabic_zain\":                 0x05d2,\n\t\"Arabic_seen\":                 0x05d3,\n\t\"Arabic_sheen\":                0x05d4,\n\t\"Arabic_sad\":                  0x05d5,\n\t\"Arabic_dad\":                  0x05d6,\n\t\"Arabic_tah\":                  0x05d7,\n\t\"Arabic_zah\":                  0x05d8,\n\t\"Arabic_ain\":                  0x05d9,\n\t\"Arabic_ghain\":                0x05da,\n\t\"Arabic_tatweel\":              0x05e0,\n\t\"Arabic_feh\":                  0x05e1,\n\t\"Arabic_qaf\":                  0x05e2,\n\t\"Arabic_kaf\":                  0x05e3,\n\t\"Arabic_lam\":                  0x05e4,\n\t\"Arabic_meem\":                 0x05e5,\n\t\"Arabic_noon\":                 0x05e6,\n\t\"Arabic_ha\":                   0x05e7,\n\t\"Arabic_heh\":                  0x05e7,\n\t\"Arabic_waw\":                  0x05e8,\n\t\"Arabic_alefmaksura\":          0x05e9,\n\t\"Arabic_yeh\":                  0x05ea,\n\t\"Arabic_fathatan\":             0x05eb,\n\t\"Arabic_dammatan\":             0x05ec,\n\t\"Arabic_kasratan\":             0x05ed,\n\t\"Arabic_fatha\":                0x05ee,\n\t\"Arabic_damma\":                0x05ef,\n\t\"Arabic_kasra\":                0x05f0,\n\t\"Arabic_shadda\":               0x05f1,\n\t\"Arabic_sukun\":                0x05f2,\n\t\"Arabic_madda_above\":          0x1000653,\n\t\"Arabic_hamza_above\":          0x1000654,\n\t\"Arabic_hamza_below\":          0x1000655,\n\t\"Arabic_jeh\":                  0x1000698,\n\t\"Arabic_veh\":                  0x10006a4,\n\t\"Arabic_keheh\":                0x10006a9,\n\t\"Arabic_gaf\":                  0x10006af,\n\t\"Arabic_noon_ghunna\":          0x10006ba,\n\t\"Arabic_heh_doachashmee\":      0x10006be,\n\t\"Farsi_yeh\":                   0x10006cc,\n\t\"Arabic_farsi_yeh\":            0x10006cc,\n\t\"Arabic_yeh_baree\":            0x10006d2,\n\t\"Arabic_heh_goal\":             0x10006c1,\n\t\"Arabic_switch\":               0xff7e,\n\t\"Cyrillic_GHE_bar\":            0x1000492,\n\t\"Cyrillic_ghe_bar\":            0x1000493,\n\t\"Cyrillic_ZHE_descender\":      0x1000496,\n\t\"Cyrillic_zhe_descender\":      0x1000497,\n\t\"Cyrillic_KA_descender\":       0x100049a,\n\t\"Cyrillic_ka_descender\":       0x100049b,\n\t\"Cyrillic_KA_vertstroke\":      0x100049c,\n\t\"Cyrillic_ka_vertstroke\":      0x100049d,\n\t\"Cyrillic_EN_descender\":       0x10004a2,\n\t\"Cyrillic_en_descender\":       0x10004a3,\n\t\"Cyrillic_U_straight\":         0x10004ae,\n\t\"Cyrillic_u_straight\":         0x10004af,\n\t\"Cyrillic_U_straight_bar\":     0x10004b0,\n\t\"Cyrillic_u_straight_bar\":     0x10004b1,\n\t\"Cyrillic_HA_descender\":       0x10004b2,\n\t\"Cyrillic_ha_descender\":       0x10004b3,\n\t\"Cyrillic_CHE_descender\":      0x10004b6,\n\t\"Cyrillic_che_descender\":      0x10004b7,\n\t\"Cyrillic_CHE_vertstroke\":     0x10004b8,\n\t\"Cyrillic_che_vertstroke\":     0x10004b9,\n\t\"Cyrillic_SHHA\":               0x10004ba,\n\t\"Cyrillic_shha\":               0x10004bb,\n\t\"Cyrillic_SCHWA\":              0x10004d8,\n\t\"Cyrillic_schwa\":              0x10004d9,\n\t\"Cyrillic_I_macron\":           0x10004e2,\n\t\"Cyrillic_i_macron\":           0x10004e3,\n\t\"Cyrillic_O_bar\":              0x10004e8,\n\t\"Cyrillic_o_bar\":              0x10004e9,\n\t\"Cyrillic_U_macron\":           0x10004ee,\n\t\"Cyrillic_u_macron\":           0x10004ef,\n\t\"Serbian_dje\":                 0x06a1,\n\t\"Macedonia_gje\":               0x06a2,\n\t\"Cyrillic_io\":                 0x06a3,\n\t\"Ukrainian_ie\":                0x06a4,\n\t\"Ukranian_je\":                 0x06a4,\n\t\"Macedonia_dse\":               0x06a5,\n\t\"Ukrainian_i\":                 0x06a6,\n\t\"Ukranian_i\":                  0x06a6,\n\t\"Ukrainian_yi\":                0x06a7,\n\t\"Ukranian_yi\":                 0x06a7,\n\t\"Cyrillic_je\":                 0x06a8,\n\t\"Serbian_je\":                  0x06a8,\n\t\"Cyrillic_lje\":                0x06a9,\n\t\"Serbian_lje\":                 0x06a9,\n\t\"Cyrillic_nje\":                0x06aa,\n\t\"Serbian_nje\":                 0x06aa,\n\t\"Serbian_tshe\":                0x06ab,\n\t\"Macedonia_kje\":               0x06ac,\n\t\"Ukrainian_ghe_with_upturn\":   0x06ad,\n\t\"Byelorussian_shortu\":         0x06ae,\n\t\"Cyrillic_dzhe\":               0x06af,\n\t\"Serbian_dze\":                 0x06af,\n\t\"numerosign\":                  0x06b0,\n\t\"Serbian_DJE\":                 0x06b1,\n\t\"Macedonia_GJE\":               0x06b2,\n\t\"Cyrillic_IO\":                 0x06b3,\n\t\"Ukrainian_IE\":                0x06b4,\n\t\"Ukranian_JE\":                 0x06b4,\n\t\"Macedonia_DSE\":               0x06b5,\n\t\"Ukrainian_I\":                 0x06b6,\n\t\"Ukranian_I\":                  0x06b6,\n\t\"Ukrainian_YI\":                0x06b7,\n\t\"Ukranian_YI\":                 0x06b7,\n\t\"Cyrillic_JE\":                 0x06b8,\n\t\"Serbian_JE\":                  0x06b8,\n\t\"Cyrillic_LJE\":                0x06b9,\n\t\"Serbian_LJE\":                 0x06b9,\n\t\"Cyrillic_NJE\":                0x06ba,\n\t\"Serbian_NJE\":                 0x06ba,\n\t\"Serbian_TSHE\":                0x06bb,\n\t\"Macedonia_KJE\":               0x06bc,\n\t\"Ukrainian_GHE_WITH_UPTURN\":   0x06bd,\n\t\"Byelorussian_SHORTU\":         0x06be,\n\t\"Cyrillic_DZHE\":               0x06bf,\n\t\"Serbian_DZE\":                 0x06bf,\n\t\"Cyrillic_yu\":                 0x06c0,\n\t\"Cyrillic_a\":                  0x06c1,\n\t\"Cyrillic_be\":                 0x06c2,\n\t\"Cyrillic_tse\":                0x06c3,\n\t\"Cyrillic_de\":                 0x06c4,\n\t\"Cyrillic_ie\":                 0x06c5,\n\t\"Cyrillic_ef\":                 0x06c6,\n\t\"Cyrillic_ghe\":                0x06c7,\n\t\"Cyrillic_ha\":                 0x06c8,\n\t\"Cyrillic_i\":                  0x06c9,\n\t\"Cyrillic_shorti\":             0x06ca,\n\t\"Cyrillic_ka\":                 0x06cb,\n\t\"Cyrillic_el\":                 0x06cc,\n\t\"Cyrillic_em\":                 0x06cd,\n\t\"Cyrillic_en\":                 0x06ce,\n\t\"Cyrillic_o\":                  0x06cf,\n\t\"Cyrillic_pe\":                 0x06d0,\n\t\"Cyrillic_ya\":                 0x06d1,\n\t\"Cyrillic_er\":                 0x06d2,\n\t\"Cyrillic_es\":                 0x06d3,\n\t\"Cyrillic_te\":                 0x06d4,\n\t\"Cyrillic_u\":                  0x06d5,\n\t\"Cyrillic_zhe\":                0x06d6,\n\t\"Cyrillic_ve\":                 0x06d7,\n\t\"Cyrillic_softsign\":           0x06d8,\n\t\"Cyrillic_yeru\":               0x06d9,\n\t\"Cyrillic_ze\":                 0x06da,\n\t\"Cyrillic_sha\":                0x06db,\n\t\"Cyrillic_e\":                  0x06dc,\n\t\"Cyrillic_shcha\":              0x06dd,\n\t\"Cyrillic_che\":                0x06de,\n\t\"Cyrillic_hardsign\":           0x06df,\n\t\"Cyrillic_YU\":                 0x06e0,\n\t\"Cyrillic_A\":                  0x06e1,\n\t\"Cyrillic_BE\":                 0x06e2,\n\t\"Cyrillic_TSE\":                0x06e3,\n\t\"Cyrillic_DE\":                 0x06e4,\n\t\"Cyrillic_IE\":                 0x06e5,\n\t\"Cyrillic_EF\":                 0x06e6,\n\t\"Cyrillic_GHE\":                0x06e7,\n\t\"Cyrillic_HA\":                 0x06e8,\n\t\"Cyrillic_I\":                  0x06e9,\n\t\"Cyrillic_SHORTI\":             0x06ea,\n\t\"Cyrillic_KA\":                 0x06eb,\n\t\"Cyrillic_EL\":                 0x06ec,\n\t\"Cyrillic_EM\":                 0x06ed,\n\t\"Cyrillic_EN\":                 0x06ee,\n\t\"Cyrillic_O\":                  0x06ef,\n\t\"Cyrillic_PE\":                 0x06f0,\n\t\"Cyrillic_YA\":                 0x06f1,\n\t\"Cyrillic_ER\":                 0x06f2,\n\t\"Cyrillic_ES\":                 0x06f3,\n\t\"Cyrillic_TE\":                 0x06f4,\n\t\"Cyrillic_U\":                  0x06f5,\n\t\"Cyrillic_ZHE\":                0x06f6,\n\t\"Cyrillic_VE\":                 0x06f7,\n\t\"Cyrillic_SOFTSIGN\":           0x06f8,\n\t\"Cyrillic_YERU\":               0x06f9,\n\t\"Cyrillic_ZE\":                 0x06fa,\n\t\"Cyrillic_SHA\":                0x06fb,\n\t\"Cyrillic_E\":                  0x06fc,\n\t\"Cyrillic_SHCHA\":              0x06fd,\n\t\"Cyrillic_CHE\":                0x06fe,\n\t\"Cyrillic_HARDSIGN\":           0x06ff,\n\t\"Greek_ALPHAaccent\":           0x07a1,\n\t\"Greek_EPSILONaccent\":         0x07a2,\n\t\"Greek_ETAaccent\":             0x07a3,\n\t\"Greek_IOTAaccent\":            0x07a4,\n\t\"Greek_IOTAdieresis\":          0x07a5,\n\t\"Greek_IOTAdiaeresis\":         0x07a5,\n\t\"Greek_OMICRONaccent\":         0x07a7,\n\t\"Greek_UPSILONaccent\":         0x07a8,\n\t\"Greek_UPSILONdieresis\":       0x07a9,\n\t\"Greek_OMEGAaccent\":           0x07ab,\n\t\"Greek_accentdieresis\":        0x07ae,\n\t\"Greek_horizbar\":              0x07af,\n\t\"Greek_alphaaccent\":           0x07b1,\n\t\"Greek_epsilonaccent\":         0x07b2,\n\t\"Greek_etaaccent\":             0x07b3,\n\t\"Greek_iotaaccent\":            0x07b4,\n\t\"Greek_iotadieresis\":          0x07b5,\n\t\"Greek_iotaaccentdieresis\":    0x07b6,\n\t\"Greek_omicronaccent\":         0x07b7,\n\t\"Greek_upsilonaccent\":         0x07b8,\n\t\"Greek_upsilondieresis\":       0x07b9,\n\t\"Greek_upsilonaccentdieresis\": 0x07ba,\n\t\"Greek_omegaaccent\":           0x07bb,\n\t\"Greek_ALPHA\":                 0x07c1,\n\t\"Greek_BETA\":                  0x07c2,\n\t\"Greek_GAMMA\":                 0x07c3,\n\t\"Greek_DELTA\":                 0x07c4,\n\t\"Greek_EPSILON\":               0x07c5,\n\t\"Greek_ZETA\":                  0x07c6,\n\t\"Greek_ETA\":                   0x07c7,\n\t\"Greek_THETA\":                 0x07c8,\n\t\"Greek_IOTA\":                  0x07c9,\n\t\"Greek_KAPPA\":                 0x07ca,\n\t\"Greek_LAMDA\":                 0x07cb,\n\t\"Greek_LAMBDA\":                0x07cb,\n\t\"Greek_MU\":                    0x07cc,\n\t\"Greek_NU\":                    0x07cd,\n\t\"Greek_XI\":                    0x07ce,\n\t\"Greek_OMICRON\":               0x07cf,\n\t\"Greek_PI\":                    0x07d0,\n\t\"Greek_RHO\":                   0x07d1,\n\t\"Greek_SIGMA\":                 0x07d2,\n\t\"Greek_TAU\":                   0x07d4,\n\t\"Greek_UPSILON\":               0x07d5,\n\t\"Greek_PHI\":                   0x07d6,\n\t\"Greek_CHI\":                   0x07d7,\n\t\"Greek_PSI\":                   0x07d8,\n\t\"Greek_OMEGA\":                 0x07d9,\n\t\"Greek_alpha\":                 0x07e1,\n\t\"Greek_beta\":                  0x07e2,\n\t\"Greek_gamma\":                 0x07e3,\n\t\"Greek_delta\":                 0x07e4,\n\t\"Greek_epsilon\":               0x07e5,\n\t\"Greek_zeta\":                  0x07e6,\n\t\"Greek_eta\":                   0x07e7,\n\t\"Greek_theta\":                 0x07e8,\n\t\"Greek_iota\":                  0x07e9,\n\t\"Greek_kappa\":                 0x07ea,\n\t\"Greek_lamda\":                 0x07eb,\n\t\"Greek_lambda\":                0x07eb,\n\t\"Greek_mu\":                    0x07ec,\n\t\"Greek_nu\":                    0x07ed,\n\t\"Greek_xi\":                    0x07ee,\n\t\"Greek_omicron\":               0x07ef,\n\t\"Greek_pi\":                    0x07f0,\n\t\"Greek_rho\":                   0x07f1,\n\t\"Greek_sigma\":                 0x07f2,\n\t\"Greek_finalsmallsigma\":       0x07f3,\n\t\"Greek_tau\":                   0x07f4,\n\t\"Greek_upsilon\":               0x07f5,\n\t\"Greek_phi\":                   0x07f6,\n\t\"Greek_chi\":                   0x07f7,\n\t\"Greek_psi\":                   0x07f8,\n\t\"Greek_omega\":                 0x07f9,\n\t\"Greek_switch\":                0xff7e,\n\t\"leftradical\":                 0x08a1,\n\t\"topleftradical\":              0x08a2,\n\t\"horizconnector\":              0x08a3,\n\t\"topintegral\":                 0x08a4,\n\t\"botintegral\":                 0x08a5,\n\t\"vertconnector\":               0x08a6,\n\t\"topleftsqbracket\":            0x08a7,\n\t\"botleftsqbracket\":            0x08a8,\n\t\"toprightsqbracket\":           0x08a9,\n\t\"botrightsqbracket\":           0x08aa,\n\t\"topleftparens\":               0x08ab,\n\t\"botleftparens\":               0x08ac,\n\t\"toprightparens\":              0x08ad,\n\t\"botrightparens\":              0x08ae,\n\t\"leftmiddlecurlybrace\":        0x08af,\n\t\"rightmiddlecurlybrace\":       0x08b0,\n\t\"topleftsummation\":            0x08b1,\n\t\"botleftsummation\":            0x08b2,\n\t\"topvertsummationconnector\":   0x08b3,\n\t\"botvertsummationconnector\":   0x08b4,\n\t\"toprightsummation\":           0x08b5,\n\t\"botrightsummation\":           0x08b6,\n\t\"rightmiddlesummation\":        0x08b7,\n\t\"lessthanequal\":               0x08bc,\n\t\"notequal\":                    0x08bd,\n\t\"greaterthanequal\":            0x08be,\n\t\"integral\":                    0x08bf,\n\t\"therefore\":                   0x08c0,\n\t\"variation\":                   0x08c1,\n\t\"infinity\":                    0x08c2,\n\t\"nabla\":                       0x08c5,\n\t\"approximate\":                 0x08c8,\n\t\"similarequal\":                0x08c9,\n\t\"ifonlyif\":                    0x08cd,\n\t\"implies\":                     0x08ce,\n\t\"identical\":                   0x08cf,\n\t\"radical\":                     0x08d6,\n\t\"includedin\":                  0x08da,\n\t\"includes\":                    0x08db,\n\t\"intersection\":                0x08dc,\n\t\"union\":                       0x08dd,\n\t\"logicaland\":                  0x08de,\n\t\"logicalor\":                   0x08df,\n\t\"partialderivative\":           0x08ef,\n\t\"function\":                    0x08f6,\n\t\"leftarrow\":                   0x08fb,\n\t\"uparrow\":                     0x08fc,\n\t\"rightarrow\":                  0x08fd,\n\t\"downarrow\":                   0x08fe,\n\t\"blank\":                       0x09df,\n\t\"soliddiamond\":                0x09e0,\n\t\"checkerboard\":                0x09e1,\n\t\"ht\":                          0x09e2,\n\t\"ff\":                          0x09e3,\n\t\"cr\":                          0x09e4,\n\t\"lf\":                          0x09e5,\n\t\"nl\":                          0x09e8,\n\t\"vt\":                          0x09e9,\n\t\"lowrightcorner\":              0x09ea,\n\t\"uprightcorner\":               0x09eb,\n\t\"upleftcorner\":                0x09ec,\n\t\"lowleftcorner\":               0x09ed,\n\t\"crossinglines\":               0x09ee,\n\t\"horizlinescan1\":              0x09ef,\n\t\"horizlinescan3\":              0x09f0,\n\t\"horizlinescan5\":              0x09f1,\n\t\"horizlinescan7\":              0x09f2,\n\t\"horizlinescan9\":              0x09f3,\n\t\"leftt\":                       0x09f4,\n\t\"rightt\":                      0x09f5,\n\t\"bott\":                        0x09f6,\n\t\"topt\":                        0x09f7,\n\t\"vertbar\":                     0x09f8,\n\t\"emspace\":                     0x0aa1,\n\t\"enspace\":                     0x0aa2,\n\t\"em3space\":                    0x0aa3,\n\t\"em4space\":                    0x0aa4,\n\t\"digitspace\":                  0x0aa5,\n\t\"punctspace\":                  0x0aa6,\n\t\"thinspace\":                   0x0aa7,\n\t\"hairspace\":                   0x0aa8,\n\t\"emdash\":                      0x0aa9,\n\t\"endash\":                      0x0aaa,\n\t\"signifblank\":                 0x0aac,\n\t\"ellipsis\":                    0x0aae,\n\t\"doubbaselinedot\":             0x0aaf,\n\t\"onethird\":                    0x0ab0,\n\t\"twothirds\":                   0x0ab1,\n\t\"onefifth\":                    0x0ab2,\n\t\"twofifths\":                   0x0ab3,\n\t\"threefifths\":                 0x0ab4,\n\t\"fourfifths\":                  0x0ab5,\n\t\"onesixth\":                    0x0ab6,\n\t\"fivesixths\":                  0x0ab7,\n\t\"careof\":                      0x0ab8,\n\t\"figdash\":                     0x0abb,\n\t\"leftanglebracket\":            0x0abc,\n\t\"decimalpoint\":                0x0abd,\n\t\"rightanglebracket\":           0x0abe,\n\t\"marker\":                      0x0abf,\n\t\"oneeighth\":                   0x0ac3,\n\t\"threeeighths\":                0x0ac4,\n\t\"fiveeighths\":                 0x0ac5,\n\t\"seveneighths\":                0x0ac6,\n\t\"trademark\":                   0x0ac9,\n\t\"signaturemark\":               0x0aca,\n\t\"trademarkincircle\":           0x0acb,\n\t\"leftopentriangle\":            0x0acc,\n\t\"rightopentriangle\":           0x0acd,\n\t\"emopencircle\":                0x0ace,\n\t\"emopenrectangle\":             0x0acf,\n\t\"leftsinglequotemark\":         0x0ad0,\n\t\"rightsinglequotemark\":        0x0ad1,\n\t\"leftdoublequotemark\":         0x0ad2,\n\t\"rightdoublequotemark\":        0x0ad3,\n\t\"prescription\":                0x0ad4,\n\t\"minutes\":                     0x0ad6,\n\t\"seconds\":                     0x0ad7,\n\t\"latincross\":                  0x0ad9,\n\t\"hexagram\":                    0x0ada,\n\t\"filledrectbullet\":            0x0adb,\n\t\"filledlefttribullet\":         0x0adc,\n\t\"filledrighttribullet\":        0x0add,\n\t\"emfilledcircle\":              0x0ade,\n\t\"emfilledrect\":                0x0adf,\n\t\"enopencircbullet\":            0x0ae0,\n\t\"enopensquarebullet\":          0x0ae1,\n\t\"openrectbullet\":              0x0ae2,\n\t\"opentribulletup\":             0x0ae3,\n\t\"opentribulletdown\":           0x0ae4,\n\t\"openstar\":                    0x0ae5,\n\t\"enfilledcircbullet\":          0x0ae6,\n\t\"enfilledsqbullet\":            0x0ae7,\n\t\"filledtribulletup\":           0x0ae8,\n\t\"filledtribulletdown\":         0x0ae9,\n\t\"leftpointer\":                 0x0aea,\n\t\"rightpointer\":                0x0aeb,\n\t\"club\":                        0x0aec,\n\t\"diamond\":                     0x0aed,\n\t\"heart\":                       0x0aee,\n\t\"maltesecross\":                0x0af0,\n\t\"dagger\":                      0x0af1,\n\t\"doubledagger\":                0x0af2,\n\t\"checkmark\":                   0x0af3,\n\t\"ballotcross\":                 0x0af4,\n\t\"musicalsharp\":                0x0af5,\n\t\"musicalflat\":                 0x0af6,\n\t\"malesymbol\":                  0x0af7,\n\t\"femalesymbol\":                0x0af8,\n\t\"telephone\":                   0x0af9,\n\t\"telephonerecorder\":           0x0afa,\n\t\"phonographcopyright\":         0x0afb,\n\t\"caret\":                       0x0afc,\n\t\"singlelowquotemark\":          0x0afd,\n\t\"doublelowquotemark\":          0x0afe,\n\t\"cursor\":                      0x0aff,\n\t\"leftcaret\":                   0x0ba3,\n\t\"rightcaret\":                  0x0ba6,\n\t\"downcaret\":                   0x0ba8,\n\t\"upcaret\":                     0x0ba9,\n\t\"overbar\":                     0x0bc0,\n\t\"downtack\":                    0x0bc2,\n\t\"upshoe\":                      0x0bc3,\n\t\"downstile\":                   0x0bc4,\n\t\"underbar\":                    0x0bc6,\n\t\"jot\":                         0x0bca,\n\t\"quad\":                        0x0bcc,\n\t\"uptack\":                      0x0bce,\n\t\"circle\":                      0x0bcf,\n\t\"upstile\":                     0x0bd3,\n\t\"downshoe\":                    0x0bd6,\n\t\"rightshoe\":                   0x0bd8,\n\t\"leftshoe\":                    0x0bda,\n\t\"lefttack\":                    0x0bdc,\n\t\"righttack\":                   0x0bfc,\n\t\"hebrew_doublelowline\":        0x0cdf,\n\t\"hebrew_aleph\":                0x0ce0,\n\t\"hebrew_bet\":                  0x0ce1,\n\t\"hebrew_beth\":                 0x0ce1,\n\t\"hebrew_gimel\":                0x0ce2,\n\t\"hebrew_gimmel\":               0x0ce2,\n\t\"hebrew_dalet\":                0x0ce3,\n\t\"hebrew_daleth\":               0x0ce3,\n\t\"hebrew_he\":                   0x0ce4,\n\t\"hebrew_waw\":                  0x0ce5,\n\t\"hebrew_zain\":                 0x0ce6,\n\t\"hebrew_zayin\":                0x0ce6,\n\t\"hebrew_chet\":                 0x0ce7,\n\t\"hebrew_het\":                  0x0ce7,\n\t\"hebrew_tet\":                  0x0ce8,\n\t\"hebrew_teth\":                 0x0ce8,\n\t\"hebrew_yod\":                  0x0ce9,\n\t\"hebrew_finalkaph\":            0x0cea,\n\t\"hebrew_kaph\":                 0x0ceb,\n\t\"hebrew_lamed\":                0x0cec,\n\t\"hebrew_finalmem\":             0x0ced,\n\t\"hebrew_mem\":                  0x0cee,\n\t\"hebrew_finalnun\":             0x0cef,\n\t\"hebrew_nun\":                  0x0cf0,\n\t\"hebrew_samech\":               0x0cf1,\n\t\"hebrew_samekh\":               0x0cf1,\n\t\"hebrew_ayin\":                 0x0cf2,\n\t\"hebrew_finalpe\":              0x0cf3,\n\t\"hebrew_pe\":                   0x0cf4,\n\t\"hebrew_finalzade\":            0x0cf5,\n\t\"hebrew_finalzadi\":            0x0cf5,\n\t\"hebrew_zade\":                 0x0cf6,\n\t\"hebrew_zadi\":                 0x0cf6,\n\t\"hebrew_qoph\":                 0x0cf7,\n\t\"hebrew_kuf\":                  0x0cf7,\n\t\"hebrew_resh\":                 0x0cf8,\n\t\"hebrew_shin\":                 0x0cf9,\n\t\"hebrew_taw\":                  0x0cfa,\n\t\"hebrew_taf\":                  0x0cfa,\n\t\"Hebrew_switch\":               0xff7e,\n\t\"Thai_kokai\":                  0x0da1,\n\t\"Thai_khokhai\":                0x0da2,\n\t\"Thai_khokhuat\":               0x0da3,\n\t\"Thai_khokhwai\":               0x0da4,\n\t\"Thai_khokhon\":                0x0da5,\n\t\"Thai_khorakhang\":             0x0da6,\n\t\"Thai_ngongu\":                 0x0da7,\n\t\"Thai_chochan\":                0x0da8,\n\t\"Thai_choching\":               0x0da9,\n\t\"Thai_chochang\":               0x0daa,\n\t\"Thai_soso\":                   0x0dab,\n\t\"Thai_chochoe\":                0x0dac,\n\t\"Thai_yoying\":                 0x0dad,\n\t\"Thai_dochada\":                0x0dae,\n\t\"Thai_topatak\":                0x0daf,\n\t\"Thai_thothan\":                0x0db0,\n\t\"Thai_thonangmontho\":          0x0db1,\n\t\"Thai_thophuthao\":             0x0db2,\n\t\"Thai_nonen\":                  0x0db3,\n\t\"Thai_dodek\":                  0x0db4,\n\t\"Thai_totao\":                  0x0db5,\n\t\"Thai_thothung\":               0x0db6,\n\t\"Thai_thothahan\":              0x0db7,\n\t\"Thai_thothong\":               0x0db8,\n\t\"Thai_nonu\":                   0x0db9,\n\t\"Thai_bobaimai\":               0x0dba,\n\t\"Thai_popla\":                  0x0dbb,\n\t\"Thai_phophung\":               0x0dbc,\n\t\"Thai_fofa\":                   0x0dbd,\n\t\"Thai_phophan\":                0x0dbe,\n\t\"Thai_fofan\":                  0x0dbf,\n\t\"Thai_phosamphao\":             0x0dc0,\n\t\"Thai_moma\":                   0x0dc1,\n\t\"Thai_yoyak\":                  0x0dc2,\n\t\"Thai_rorua\":                  0x0dc3,\n\t\"Thai_ru\":                     0x0dc4,\n\t\"Thai_loling\":                 0x0dc5,\n\t\"Thai_lu\":                     0x0dc6,\n\t\"Thai_wowaen\":                 0x0dc7,\n\t\"Thai_sosala\":                 0x0dc8,\n\t\"Thai_sorusi\":                 0x0dc9,\n\t\"Thai_sosua\":                  0x0dca,\n\t\"Thai_hohip\":                  0x0dcb,\n\t\"Thai_lochula\":                0x0dcc,\n\t\"Thai_oang\":                   0x0dcd,\n\t\"Thai_honokhuk\":               0x0dce,\n\t\"Thai_paiyannoi\":              0x0dcf,\n\t\"Thai_saraa\":                  0x0dd0,\n\t\"Thai_maihanakat\":             0x0dd1,\n\t\"Thai_saraaa\":                 0x0dd2,\n\t\"Thai_saraam\":                 0x0dd3,\n\t\"Thai_sarai\":                  0x0dd4,\n\t\"Thai_saraii\":                 0x0dd5,\n\t\"Thai_saraue\":                 0x0dd6,\n\t\"Thai_sarauee\":                0x0dd7,\n\t\"Thai_sarau\":                  0x0dd8,\n\t\"Thai_sarauu\":                 0x0dd9,\n\t\"Thai_phinthu\":                0x0dda,\n\t\"Thai_maihanakat_maitho\":      0x0dde,\n\t\"Thai_baht\":                   0x0ddf,\n\t\"Thai_sarae\":                  0x0de0,\n\t\"Thai_saraae\":                 0x0de1,\n\t\"Thai_sarao\":                  0x0de2,\n\t\"Thai_saraaimaimuan\":          0x0de3,\n\t\"Thai_saraaimaimalai\":         0x0de4,\n\t\"Thai_lakkhangyao\":            0x0de5,\n\t\"Thai_maiyamok\":               0x0de6,\n\t\"Thai_maitaikhu\":              0x0de7,\n\t\"Thai_maiek\":                  0x0de8,\n\t\"Thai_maitho\":                 0x0de9,\n\t\"Thai_maitri\":                 0x0dea,\n\t\"Thai_maichattawa\":            0x0deb,\n\t\"Thai_thanthakhat\":            0x0dec,\n\t\"Thai_nikhahit\":               0x0ded,\n\t\"Thai_leksun\":                 0x0df0,\n\t\"Thai_leknung\":                0x0df1,\n\t\"Thai_leksong\":                0x0df2,\n\t\"Thai_leksam\":                 0x0df3,\n\t\"Thai_leksi\":                  0x0df4,\n\t\"Thai_lekha\":                  0x0df5,\n\t\"Thai_lekhok\":                 0x0df6,\n\t\"Thai_lekchet\":                0x0df7,\n\t\"Thai_lekpaet\":                0x0df8,\n\t\"Thai_lekkao\":                 0x0df9,\n\t\"Hangul\":                      0xff31,\n\t\"Hangul_Start\":                0xff32,\n\t\"Hangul_End\":                  0xff33,\n\t\"Hangul_Hanja\":                0xff34,\n\t\"Hangul_Jamo\":                 0xff35,\n\t\"Hangul_Romaja\":               0xff36,\n\t\"Hangul_Codeinput\":            0xff37,\n\t\"Hangul_Jeonja\":               0xff38,\n\t\"Hangul_Banja\":                0xff39,\n\t\"Hangul_PreHanja\":             0xff3a,\n\t\"Hangul_PostHanja\":            0xff3b,\n\t\"Hangul_SingleCandidate\":      0xff3c,\n\t\"Hangul_MultipleCandidate\":    0xff3d,\n\t\"Hangul_PreviousCandidate\":    0xff3e,\n\t\"Hangul_Special\":              0xff3f,\n\t\"Hangul_switch\":               0xff7e,\n\t\"Hangul_Kiyeog\":               0x0ea1,\n\t\"Hangul_SsangKiyeog\":          0x0ea2,\n\t\"Hangul_KiyeogSios\":           0x0ea3,\n\t\"Hangul_Nieun\":                0x0ea4,\n\t\"Hangul_NieunJieuj\":           0x0ea5,\n\t\"Hangul_NieunHieuh\":           0x0ea6,\n\t\"Hangul_Dikeud\":               0x0ea7,\n\t\"Hangul_SsangDikeud\":          0x0ea8,\n\t\"Hangul_Rieul\":                0x0ea9,\n\t\"Hangul_RieulKiyeog\":          0x0eaa,\n\t\"Hangul_RieulMieum\":           0x0eab,\n\t\"Hangul_RieulPieub\":           0x0eac,\n\t\"Hangul_RieulSios\":            0x0ead,\n\t\"Hangul_RieulTieut\":           0x0eae,\n\t\"Hangul_RieulPhieuf\":          0x0eaf,\n\t\"Hangul_RieulHieuh\":           0x0eb0,\n\t\"Hangul_Mieum\":                0x0eb1,\n\t\"Hangul_Pieub\":                0x0eb2,\n\t\"Hangul_SsangPieub\":           0x0eb3,\n\t\"Hangul_PieubSios\":            0x0eb4,\n\t\"Hangul_Sios\":                 0x0eb5,\n\t\"Hangul_SsangSios\":            0x0eb6,\n\t\"Hangul_Ieung\":                0x0eb7,\n\t\"Hangul_Jieuj\":                0x0eb8,\n\t\"Hangul_SsangJieuj\":           0x0eb9,\n\t\"Hangul_Cieuc\":                0x0eba,\n\t\"Hangul_Khieuq\":               0x0ebb,\n\t\"Hangul_Tieut\":                0x0ebc,\n\t\"Hangul_Phieuf\":               0x0ebd,\n\t\"Hangul_Hieuh\":                0x0ebe,\n\t\"Hangul_A\":                    0x0ebf,\n\t\"Hangul_AE\":                   0x0ec0,\n\t\"Hangul_YA\":                   0x0ec1,\n\t\"Hangul_YAE\":                  0x0ec2,\n\t\"Hangul_EO\":                   0x0ec3,\n\t\"Hangul_E\":                    0x0ec4,\n\t\"Hangul_YEO\":                  0x0ec5,\n\t\"Hangul_YE\":                   0x0ec6,\n\t\"Hangul_O\":                    0x0ec7,\n\t\"Hangul_WA\":                   0x0ec8,\n\t\"Hangul_WAE\":                  0x0ec9,\n\t\"Hangul_OE\":                   0x0eca,\n\t\"Hangul_YO\":                   0x0ecb,\n\t\"Hangul_U\":                    0x0ecc,\n\t\"Hangul_WEO\":                  0x0ecd,\n\t\"Hangul_WE\":                   0x0ece,\n\t\"Hangul_WI\":                   0x0ecf,\n\t\"Hangul_YU\":                   0x0ed0,\n\t\"Hangul_EU\":                   0x0ed1,\n\t\"Hangul_YI\":                   0x0ed2,\n\t\"Hangul_I\":                    0x0ed3,\n\t\"Hangul_J_Kiyeog\":             0x0ed4,\n\t\"Hangul_J_SsangKiyeog\":        0x0ed5,\n\t\"Hangul_J_KiyeogSios\":         0x0ed6,\n\t\"Hangul_J_Nieun\":              0x0ed7,\n\t\"Hangul_J_NieunJieuj\":         0x0ed8,\n\t\"Hangul_J_NieunHieuh\":         0x0ed9,\n\t\"Hangul_J_Dikeud\":             0x0eda,\n\t\"Hangul_J_Rieul\":              0x0edb,\n\t\"Hangul_J_RieulKiyeog\":        0x0edc,\n\t\"Hangul_J_RieulMieum\":         0x0edd,\n\t\"Hangul_J_RieulPieub\":         0x0ede,\n\t\"Hangul_J_RieulSios\":          0x0edf,\n\t\"Hangul_J_RieulTieut\":         0x0ee0,\n\t\"Hangul_J_RieulPhieuf\":        0x0ee1,\n\t\"Hangul_J_RieulHieuh\":         0x0ee2,\n\t\"Hangul_J_Mieum\":              0x0ee3,\n\t\"Hangul_J_Pieub\":              0x0ee4,\n\t\"Hangul_J_PieubSios\":          0x0ee5,\n\t\"Hangul_J_Sios\":               0x0ee6,\n\t\"Hangul_J_SsangSios\":          0x0ee7,\n\t\"Hangul_J_Ieung\":              0x0ee8,\n\t\"Hangul_J_Jieuj\":              0x0ee9,\n\t\"Hangul_J_Cieuc\":              0x0eea,\n\t\"Hangul_J_Khieuq\":             0x0eeb,\n\t\"Hangul_J_Tieut\":              0x0eec,\n\t\"Hangul_J_Phieuf\":             0x0eed,\n\t\"Hangul_J_Hieuh\":              0x0eee,\n\t\"Hangul_RieulYeorinHieuh\":     0x0eef,\n\t\"Hangul_SunkyeongeumMieum\":    0x0ef0,\n\t\"Hangul_SunkyeongeumPieub\":    0x0ef1,\n\t\"Hangul_PanSios\":              0x0ef2,\n\t\"Hangul_KkogjiDalrinIeung\":    0x0ef3,\n\t\"Hangul_SunkyeongeumPhieuf\":   0x0ef4,\n\t\"Hangul_YeorinHieuh\":          0x0ef5,\n\t\"Hangul_AraeA\":                0x0ef6,\n\t\"Hangul_AraeAE\":               0x0ef7,\n\t\"Hangul_J_PanSios\":            0x0ef8,\n\t\"Hangul_J_KkogjiDalrinIeung\":  0x0ef9,\n\t\"Hangul_J_YeorinHieuh\":        0x0efa,\n\t\"Korean_Won\":                  0x0eff,\n\t\"Armenian_ligature_ew\":        0x1000587,\n\t\"Armenian_full_stop\":          0x1000589,\n\t\"Armenian_verjaket\":           0x1000589,\n\t\"Armenian_separation_mark\":    0x100055d,\n\t\"Armenian_but\":                0x100055d,\n\t\"Armenian_hyphen\":             0x100058a,\n\t\"Armenian_yentamna\":           0x100058a,\n\t\"Armenian_exclam\":             0x100055c,\n\t\"Armenian_amanak\":             0x100055c,\n\t\"Armenian_accent\":             0x100055b,\n\t\"Armenian_shesht\":             0x100055b,\n\t\"Armenian_question\":           0x100055e,\n\t\"Armenian_paruyk\":             0x100055e,\n\t\"Armenian_AYB\":                0x1000531,\n\t\"Armenian_ayb\":                0x1000561,\n\t\"Armenian_BEN\":                0x1000532,\n\t\"Armenian_ben\":                0x1000562,\n\t\"Armenian_GIM\":                0x1000533,\n\t\"Armenian_gim\":                0x1000563,\n\t\"Armenian_DA\":                 0x1000534,\n\t\"Armenian_da\":                 0x1000564,\n\t\"Armenian_YECH\":               0x1000535,\n\t\"Armenian_yech\":               0x1000565,\n\t\"Armenian_ZA\":                 0x1000536,\n\t\"Armenian_za\":                 0x1000566,\n\t\"Armenian_E\":                  0x1000537,\n\t\"Armenian_e\":                  0x1000567,\n\t\"Armenian_AT\":                 0x1000538,\n\t\"Armenian_at\":                 0x1000568,\n\t\"Armenian_TO\":                 0x1000539,\n\t\"Armenian_to\":                 0x1000569,\n\t\"Armenian_ZHE\":                0x100053a,\n\t\"Armenian_zhe\":                0x100056a,\n\t\"Armenian_INI\":                0x100053b,\n\t\"Armenian_ini\":                0x100056b,\n\t\"Armenian_LYUN\":               0x100053c,\n\t\"Armenian_lyun\":               0x100056c,\n\t\"Armenian_KHE\":                0x100053d,\n\t\"Armenian_khe\":                0x100056d,\n\t\"Armenian_TSA\":                0x100053e,\n\t\"Armenian_tsa\":                0x100056e,\n\t\"Armenian_KEN\":                0x100053f,\n\t\"Armenian_ken\":                0x100056f,\n\t\"Armenian_HO\":                 0x1000540,\n\t\"Armenian_ho\":                 0x1000570,\n\t\"Armenian_DZA\":                0x1000541,\n\t\"Armenian_dza\":                0x1000571,\n\t\"Armenian_GHAT\":               0x1000542,\n\t\"Armenian_ghat\":               0x1000572,\n\t\"Armenian_TCHE\":               0x1000543,\n\t\"Armenian_tche\":               0x1000573,\n\t\"Armenian_MEN\":                0x1000544,\n\t\"Armenian_men\":                0x1000574,\n\t\"Armenian_HI\":                 0x1000545,\n\t\"Armenian_hi\":                 0x1000575,\n\t\"Armenian_NU\":                 0x1000546,\n\t\"Armenian_nu\":                 0x1000576,\n\t\"Armenian_SHA\":                0x1000547,\n\t\"Armenian_sha\":                0x1000577,\n\t\"Armenian_VO\":                 0x1000548,\n\t\"Armenian_vo\":                 0x1000578,\n\t\"Armenian_CHA\":                0x1000549,\n\t\"Armenian_cha\":                0x1000579,\n\t\"Armenian_PE\":                 0x100054a,\n\t\"Armenian_pe\":                 0x100057a,\n\t\"Armenian_JE\":                 0x100054b,\n\t\"Armenian_je\":                 0x100057b,\n\t\"Armenian_RA\":                 0x100054c,\n\t\"Armenian_ra\":                 0x100057c,\n\t\"Armenian_SE\":                 0x100054d,\n\t\"Armenian_se\":                 0x100057d,\n\t\"Armenian_VEV\":                0x100054e,\n\t\"Armenian_vev\":                0x100057e,\n\t\"Armenian_TYUN\":               0x100054f,\n\t\"Armenian_tyun\":               0x100057f,\n\t\"Armenian_RE\":                 0x1000550,\n\t\"Armenian_re\":                 0x1000580,\n\t\"Armenian_TSO\":                0x1000551,\n\t\"Armenian_tso\":                0x1000581,\n\t\"Armenian_VYUN\":               0x1000552,\n\t\"Armenian_vyun\":               0x1000582,\n\t\"Armenian_PYUR\":               0x1000553,\n\t\"Armenian_pyur\":               0x1000583,\n\t\"Armenian_KE\":                 0x1000554,\n\t\"Armenian_ke\":                 0x1000584,\n\t\"Armenian_O\":                  0x1000555,\n\t\"Armenian_o\":                  0x1000585,\n\t\"Armenian_FE\":                 0x1000556,\n\t\"Armenian_fe\":                 0x1000586,\n\t\"Armenian_apostrophe\":         0x100055a,\n\t\"Georgian_an\":                 0x10010d0,\n\t\"Georgian_ban\":                0x10010d1,\n\t\"Georgian_gan\":                0x10010d2,\n\t\"Georgian_don\":                0x10010d3,\n\t\"Georgian_en\":                 0x10010d4,\n\t\"Georgian_vin\":                0x10010d5,\n\t\"Georgian_zen\":                0x10010d6,\n\t\"Georgian_tan\":                0x10010d7,\n\t\"Georgian_in\":                 0x10010d8,\n\t\"Georgian_kan\":                0x10010d9,\n\t\"Georgian_las\":                0x10010da,\n\t\"Georgian_man\":                0x10010db,\n\t\"Georgian_nar\":                0x10010dc,\n\t\"Georgian_on\":                 0x10010dd,\n\t\"Georgian_par\":                0x10010de,\n\t\"Georgian_zhar\":               0x10010df,\n\t\"Georgian_rae\":                0x10010e0,\n\t\"Georgian_san\":                0x10010e1,\n\t\"Georgian_tar\":                0x10010e2,\n\t\"Georgian_un\":                 0x10010e3,\n\t\"Georgian_phar\":               0x10010e4,\n\t\"Georgian_khar\":               0x10010e5,\n\t\"Georgian_ghan\":               0x10010e6,\n\t\"Georgian_qar\":                0x10010e7,\n\t\"Georgian_shin\":               0x10010e8,\n\t\"Georgian_chin\":               0x10010e9,\n\t\"Georgian_can\":                0x10010ea,\n\t\"Georgian_jil\":                0x10010eb,\n\t\"Georgian_cil\":                0x10010ec,\n\t\"Georgian_char\":               0x10010ed,\n\t\"Georgian_xan\":                0x10010ee,\n\t\"Georgian_jhan\":               0x10010ef,\n\t\"Georgian_hae\":                0x10010f0,\n\t\"Georgian_he\":                 0x10010f1,\n\t\"Georgian_hie\":                0x10010f2,\n\t\"Georgian_we\":                 0x10010f3,\n\t\"Georgian_har\":                0x10010f4,\n\t\"Georgian_hoe\":                0x10010f5,\n\t\"Georgian_fi\":                 0x10010f6,\n\t\"Xabovedot\":                   0x1001e8a,\n\t\"Ibreve\":                      0x100012c,\n\t\"Zstroke\":                     0x10001b5,\n\t\"Gcaron\":                      0x10001e6,\n\t\"Ocaron\":                      0x10001d1,\n\t\"Obarred\":                     0x100019f,\n\t\"xabovedot\":                   0x1001e8b,\n\t\"ibreve\":                      0x100012d,\n\t\"zstroke\":                     0x10001b6,\n\t\"gcaron\":                      0x10001e7,\n\t\"ocaron\":                      0x10001d2,\n\t\"obarred\":                     0x1000275,\n\t\"SCHWA\":                       0x100018f,\n\t\"schwa\":                       0x1000259,\n\t\"Lbelowdot\":                   0x1001e36,\n\t\"lbelowdot\":                   0x1001e37,\n\t\"Abelowdot\":                   0x1001ea0,\n\t\"abelowdot\":                   0x1001ea1,\n\t\"Ahook\":                       0x1001ea2,\n\t\"ahook\":                       0x1001ea3,\n\t\"Acircumflexacute\":            0x1001ea4,\n\t\"acircumflexacute\":            0x1001ea5,\n\t\"Acircumflexgrave\":            0x1001ea6,\n\t\"acircumflexgrave\":            0x1001ea7,\n\t\"Acircumflexhook\":             0x1001ea8,\n\t\"acircumflexhook\":             0x1001ea9,\n\t\"Acircumflextilde\":            0x1001eaa,\n\t\"acircumflextilde\":            0x1001eab,\n\t\"Acircumflexbelowdot\":         0x1001eac,\n\t\"acircumflexbelowdot\":         0x1001ead,\n\t\"Abreveacute\":                 0x1001eae,\n\t\"abreveacute\":                 0x1001eaf,\n\t\"Abrevegrave\":                 0x1001eb0,\n\t\"abrevegrave\":                 0x1001eb1,\n\t\"Abrevehook\":                  0x1001eb2,\n\t\"abrevehook\":                  0x1001eb3,\n\t\"Abrevetilde\":                 0x1001eb4,\n\t\"abrevetilde\":                 0x1001eb5,\n\t\"Abrevebelowdot\":              0x1001eb6,\n\t\"abrevebelowdot\":              0x1001eb7,\n\t\"Ebelowdot\":                   0x1001eb8,\n\t\"ebelowdot\":                   0x1001eb9,\n\t\"Ehook\":                       0x1001eba,\n\t\"ehook\":                       0x1001ebb,\n\t\"Etilde\":                      0x1001ebc,\n\t\"etilde\":                      0x1001ebd,\n\t\"Ecircumflexacute\":            0x1001ebe,\n\t\"ecircumflexacute\":            0x1001ebf,\n\t\"Ecircumflexgrave\":            0x1001ec0,\n\t\"ecircumflexgrave\":            0x1001ec1,\n\t\"Ecircumflexhook\":             0x1001ec2,\n\t\"ecircumflexhook\":             0x1001ec3,\n\t\"Ecircumflextilde\":            0x1001ec4,\n\t\"ecircumflextilde\":            0x1001ec5,\n\t\"Ecircumflexbelowdot\":         0x1001ec6,\n\t\"ecircumflexbelowdot\":         0x1001ec7,\n\t\"Ihook\":                       0x1001ec8,\n\t\"ihook\":                       0x1001ec9,\n\t\"Ibelowdot\":                   0x1001eca,\n\t\"ibelowdot\":                   0x1001ecb,\n\t\"Obelowdot\":                   0x1001ecc,\n\t\"obelowdot\":                   0x1001ecd,\n\t\"Ohook\":                       0x1001ece,\n\t\"ohook\":                       0x1001ecf,\n\t\"Ocircumflexacute\":            0x1001ed0,\n\t\"ocircumflexacute\":            0x1001ed1,\n\t\"Ocircumflexgrave\":            0x1001ed2,\n\t\"ocircumflexgrave\":            0x1001ed3,\n\t\"Ocircumflexhook\":             0x1001ed4,\n\t\"ocircumflexhook\":             0x1001ed5,\n\t\"Ocircumflextilde\":            0x1001ed6,\n\t\"ocircumflextilde\":            0x1001ed7,\n\t\"Ocircumflexbelowdot\":         0x1001ed8,\n\t\"ocircumflexbelowdot\":         0x1001ed9,\n\t\"Ohornacute\":                  0x1001eda,\n\t\"ohornacute\":                  0x1001edb,\n\t\"Ohorngrave\":                  0x1001edc,\n\t\"ohorngrave\":                  0x1001edd,\n\t\"Ohornhook\":                   0x1001ede,\n\t\"ohornhook\":                   0x1001edf,\n\t\"Ohorntilde\":                  0x1001ee0,\n\t\"ohorntilde\":                  0x1001ee1,\n\t\"Ohornbelowdot\":               0x1001ee2,\n\t\"ohornbelowdot\":               0x1001ee3,\n\t\"Ubelowdot\":                   0x1001ee4,\n\t\"ubelowdot\":                   0x1001ee5,\n\t\"Uhook\":                       0x1001ee6,\n\t\"uhook\":                       0x1001ee7,\n\t\"Uhornacute\":                  0x1001ee8,\n\t\"uhornacute\":                  0x1001ee9,\n\t\"Uhorngrave\":                  0x1001eea,\n\t\"uhorngrave\":                  0x1001eeb,\n\t\"Uhornhook\":                   0x1001eec,\n\t\"uhornhook\":                   0x1001eed,\n\t\"Uhorntilde\":                  0x1001eee,\n\t\"uhorntilde\":                  0x1001eef,\n\t\"Uhornbelowdot\":               0x1001ef0,\n\t\"uhornbelowdot\":               0x1001ef1,\n\t\"Ybelowdot\":                   0x1001ef4,\n\t\"ybelowdot\":                   0x1001ef5,\n\t\"Yhook\":                       0x1001ef6,\n\t\"yhook\":                       0x1001ef7,\n\t\"Ytilde\":                      0x1001ef8,\n\t\"ytilde\":                      0x1001ef9,\n\t\"Ohorn\":                       0x10001a0,\n\t\"ohorn\":                       0x10001a1,\n\t\"Uhorn\":                       0x10001af,\n\t\"uhorn\":                       0x10001b0,\n\t\"EcuSign\":                     0x10020a0,\n\t\"ColonSign\":                   0x10020a1,\n\t\"CruzeiroSign\":                0x10020a2,\n\t\"FFrancSign\":                  0x10020a3,\n\t\"LiraSign\":                    0x10020a4,\n\t\"MillSign\":                    0x10020a5,\n\t\"NairaSign\":                   0x10020a6,\n\t\"PesetaSign\":                  0x10020a7,\n\t\"RupeeSign\":                   0x10020a8,\n\t\"WonSign\":                     0x10020a9,\n\t\"NewSheqelSign\":               0x10020aa,\n\t\"DongSign\":                    0x10020ab,\n\t\"EuroSign\":                    0x20ac,\n\t\"zerosuperior\":                0x1002070,\n\t\"foursuperior\":                0x1002074,\n\t\"fivesuperior\":                0x1002075,\n\t\"sixsuperior\":                 0x1002076,\n\t\"sevensuperior\":               0x1002077,\n\t\"eightsuperior\":               0x1002078,\n\t\"ninesuperior\":                0x1002079,\n\t\"zerosubscript\":               0x1002080,\n\t\"onesubscript\":                0x1002081,\n\t\"twosubscript\":                0x1002082,\n\t\"threesubscript\":              0x1002083,\n\t\"foursubscript\":               0x1002084,\n\t\"fivesubscript\":               0x1002085,\n\t\"sixsubscript\":                0x1002086,\n\t\"sevensubscript\":              0x1002087,\n\t\"eightsubscript\":              0x1002088,\n\t\"ninesubscript\":               0x1002089,\n\t\"partdifferential\":            0x1002202,\n\t\"emptyset\":                    0x1002205,\n\t\"elementof\":                   0x1002208,\n\t\"notelementof\":                0x1002209,\n\t\"containsas\":                  0x100220B,\n\t\"squareroot\":                  0x100221A,\n\t\"cuberoot\":                    0x100221B,\n\t\"fourthroot\":                  0x100221C,\n\t\"dintegral\":                   0x100222C,\n\t\"tintegral\":                   0x100222D,\n\t\"because\":                     0x1002235,\n\t\"approxeq\":                    0x1002248,\n\t\"notapproxeq\":                 0x1002247,\n\t\"notidentical\":                0x1002262,\n\t\"stricteq\":                    0x1002263,\n\t\"braille_dot_1\":               0xfff1,\n\t\"braille_dot_2\":               0xfff2,\n\t\"braille_dot_3\":               0xfff3,\n\t\"braille_dot_4\":               0xfff4,\n\t\"braille_dot_5\":               0xfff5,\n\t\"braille_dot_6\":               0xfff6,\n\t\"braille_dot_7\":               0xfff7,\n\t\"braille_dot_8\":               0xfff8,\n\t\"braille_dot_9\":               0xfff9,\n\t\"braille_dot_10\":              0xfffa,\n\t\"braille_blank\":               0x1002800,\n\t\"braille_dots_1\":              0x1002801,\n\t\"braille_dots_2\":              0x1002802,\n\t\"braille_dots_12\":             0x1002803,\n\t\"braille_dots_3\":              0x1002804,\n\t\"braille_dots_13\":             0x1002805,\n\t\"braille_dots_23\":             0x1002806,\n\t\"braille_dots_123\":            0x1002807,\n\t\"braille_dots_4\":              0x1002808,\n\t\"braille_dots_14\":             0x1002809,\n\t\"braille_dots_24\":             0x100280a,\n\t\"braille_dots_124\":            0x100280b,\n\t\"braille_dots_34\":             0x100280c,\n\t\"braille_dots_134\":            0x100280d,\n\t\"braille_dots_234\":            0x100280e,\n\t\"braille_dots_1234\":           0x100280f,\n\t\"braille_dots_5\":              0x1002810,\n\t\"braille_dots_15\":             0x1002811,\n\t\"braille_dots_25\":             0x1002812,\n\t\"braille_dots_125\":            0x1002813,\n\t\"braille_dots_35\":             0x1002814,\n\t\"braille_dots_135\":            0x1002815,\n\t\"braille_dots_235\":            0x1002816,\n\t\"braille_dots_1235\":           0x1002817,\n\t\"braille_dots_45\":             0x1002818,\n\t\"braille_dots_145\":            0x1002819,\n\t\"braille_dots_245\":            0x100281a,\n\t\"braille_dots_1245\":           0x100281b,\n\t\"braille_dots_345\":            0x100281c,\n\t\"braille_dots_1345\":           0x100281d,\n\t\"braille_dots_2345\":           0x100281e,\n\t\"braille_dots_12345\":          0x100281f,\n\t\"braille_dots_6\":              0x1002820,\n\t\"braille_dots_16\":             0x1002821,\n\t\"braille_dots_26\":             0x1002822,\n\t\"braille_dots_126\":            0x1002823,\n\t\"braille_dots_36\":             0x1002824,\n\t\"braille_dots_136\":            0x1002825,\n\t\"braille_dots_236\":            0x1002826,\n\t\"braille_dots_1236\":           0x1002827,\n\t\"braille_dots_46\":             0x1002828,\n\t\"braille_dots_146\":            0x1002829,\n\t\"braille_dots_246\":            0x100282a,\n\t\"braille_dots_1246\":           0x100282b,\n\t\"braille_dots_346\":            0x100282c,\n\t\"braille_dots_1346\":           0x100282d,\n\t\"braille_dots_2346\":           0x100282e,\n\t\"braille_dots_12346\":          0x100282f,\n\t\"braille_dots_56\":             0x1002830,\n\t\"braille_dots_156\":            0x1002831,\n\t\"braille_dots_256\":            0x1002832,\n\t\"braille_dots_1256\":           0x1002833,\n\t\"braille_dots_356\":            0x1002834,\n\t\"braille_dots_1356\":           0x1002835,\n\t\"braille_dots_2356\":           0x1002836,\n\t\"braille_dots_12356\":          0x1002837,\n\t\"braille_dots_456\":            0x1002838,\n\t\"braille_dots_1456\":           0x1002839,\n\t\"braille_dots_2456\":           0x100283a,\n\t\"braille_dots_12456\":          0x100283b,\n\t\"braille_dots_3456\":           0x100283c,\n\t\"braille_dots_13456\":          0x100283d,\n\t\"braille_dots_23456\":          0x100283e,\n\t\"braille_dots_123456\":         0x100283f,\n\t\"braille_dots_7\":              0x1002840,\n\t\"braille_dots_17\":             0x1002841,\n\t\"braille_dots_27\":             0x1002842,\n\t\"braille_dots_127\":            0x1002843,\n\t\"braille_dots_37\":             0x1002844,\n\t\"braille_dots_137\":            0x1002845,\n\t\"braille_dots_237\":            0x1002846,\n\t\"braille_dots_1237\":           0x1002847,\n\t\"braille_dots_47\":             0x1002848,\n\t\"braille_dots_147\":            0x1002849,\n\t\"braille_dots_247\":            0x100284a,\n\t\"braille_dots_1247\":           0x100284b,\n\t\"braille_dots_347\":            0x100284c,\n\t\"braille_dots_1347\":           0x100284d,\n\t\"braille_dots_2347\":           0x100284e,\n\t\"braille_dots_12347\":          0x100284f,\n\t\"braille_dots_57\":             0x1002850,\n\t\"braille_dots_157\":            0x1002851,\n\t\"braille_dots_257\":            0x1002852,\n\t\"braille_dots_1257\":           0x1002853,\n\t\"braille_dots_357\":            0x1002854,\n\t\"braille_dots_1357\":           0x1002855,\n\t\"braille_dots_2357\":           0x1002856,\n\t\"braille_dots_12357\":          0x1002857,\n\t\"braille_dots_457\":            0x1002858,\n\t\"braille_dots_1457\":           0x1002859,\n\t\"braille_dots_2457\":           0x100285a,\n\t\"braille_dots_12457\":          0x100285b,\n\t\"braille_dots_3457\":           0x100285c,\n\t\"braille_dots_13457\":          0x100285d,\n\t\"braille_dots_23457\":          0x100285e,\n\t\"braille_dots_123457\":         0x100285f,\n\t\"braille_dots_67\":             0x1002860,\n\t\"braille_dots_167\":            0x1002861,\n\t\"braille_dots_267\":            0x1002862,\n\t\"braille_dots_1267\":           0x1002863,\n\t\"braille_dots_367\":            0x1002864,\n\t\"braille_dots_1367\":           0x1002865,\n\t\"braille_dots_2367\":           0x1002866,\n\t\"braille_dots_12367\":          0x1002867,\n\t\"braille_dots_467\":            0x1002868,\n\t\"braille_dots_1467\":           0x1002869,\n\t\"braille_dots_2467\":           0x100286a,\n\t\"braille_dots_12467\":          0x100286b,\n\t\"braille_dots_3467\":           0x100286c,\n\t\"braille_dots_13467\":          0x100286d,\n\t\"braille_dots_23467\":          0x100286e,\n\t\"braille_dots_123467\":         0x100286f,\n\t\"braille_dots_567\":            0x1002870,\n\t\"braille_dots_1567\":           0x1002871,\n\t\"braille_dots_2567\":           0x1002872,\n\t\"braille_dots_12567\":          0x1002873,\n\t\"braille_dots_3567\":           0x1002874,\n\t\"braille_dots_13567\":          0x1002875,\n\t\"braille_dots_23567\":          0x1002876,\n\t\"braille_dots_123567\":         0x1002877,\n\t\"braille_dots_4567\":           0x1002878,\n\t\"braille_dots_14567\":          0x1002879,\n\t\"braille_dots_24567\":          0x100287a,\n\t\"braille_dots_124567\":         0x100287b,\n\t\"braille_dots_34567\":          0x100287c,\n\t\"braille_dots_134567\":         0x100287d,\n\t\"braille_dots_234567\":         0x100287e,\n\t\"braille_dots_1234567\":        0x100287f,\n\t\"braille_dots_8\":              0x1002880,\n\t\"braille_dots_18\":             0x1002881,\n\t\"braille_dots_28\":             0x1002882,\n\t\"braille_dots_128\":            0x1002883,\n\t\"braille_dots_38\":             0x1002884,\n\t\"braille_dots_138\":            0x1002885,\n\t\"braille_dots_238\":            0x1002886,\n\t\"braille_dots_1238\":           0x1002887,\n\t\"braille_dots_48\":             0x1002888,\n\t\"braille_dots_148\":            0x1002889,\n\t\"braille_dots_248\":            0x100288a,\n\t\"braille_dots_1248\":           0x100288b,\n\t\"braille_dots_348\":            0x100288c,\n\t\"braille_dots_1348\":           0x100288d,\n\t\"braille_dots_2348\":           0x100288e,\n\t\"braille_dots_12348\":          0x100288f,\n\t\"braille_dots_58\":             0x1002890,\n\t\"braille_dots_158\":            0x1002891,\n\t\"braille_dots_258\":            0x1002892,\n\t\"braille_dots_1258\":           0x1002893,\n\t\"braille_dots_358\":            0x1002894,\n\t\"braille_dots_1358\":           0x1002895,\n\t\"braille_dots_2358\":           0x1002896,\n\t\"braille_dots_12358\":          0x1002897,\n\t\"braille_dots_458\":            0x1002898,\n\t\"braille_dots_1458\":           0x1002899,\n\t\"braille_dots_2458\":           0x100289a,\n\t\"braille_dots_12458\":          0x100289b,\n\t\"braille_dots_3458\":           0x100289c,\n\t\"braille_dots_13458\":          0x100289d,\n\t\"braille_dots_23458\":          0x100289e,\n\t\"braille_dots_123458\":         0x100289f,\n\t\"braille_dots_68\":             0x10028a0,\n\t\"braille_dots_168\":            0x10028a1,\n\t\"braille_dots_268\":            0x10028a2,\n\t\"braille_dots_1268\":           0x10028a3,\n\t\"braille_dots_368\":            0x10028a4,\n\t\"braille_dots_1368\":           0x10028a5,\n\t\"braille_dots_2368\":           0x10028a6,\n\t\"braille_dots_12368\":          0x10028a7,\n\t\"braille_dots_468\":            0x10028a8,\n\t\"braille_dots_1468\":           0x10028a9,\n\t\"braille_dots_2468\":           0x10028aa,\n\t\"braille_dots_12468\":          0x10028ab,\n\t\"braille_dots_3468\":           0x10028ac,\n\t\"braille_dots_13468\":          0x10028ad,\n\t\"braille_dots_23468\":          0x10028ae,\n\t\"braille_dots_123468\":         0x10028af,\n\t\"braille_dots_568\":            0x10028b0,\n\t\"braille_dots_1568\":           0x10028b1,\n\t\"braille_dots_2568\":           0x10028b2,\n\t\"braille_dots_12568\":          0x10028b3,\n\t\"braille_dots_3568\":           0x10028b4,\n\t\"braille_dots_13568\":          0x10028b5,\n\t\"braille_dots_23568\":          0x10028b6,\n\t\"braille_dots_123568\":         0x10028b7,\n\t\"braille_dots_4568\":           0x10028b8,\n\t\"braille_dots_14568\":          0x10028b9,\n\t\"braille_dots_24568\":          0x10028ba,\n\t\"braille_dots_124568\":         0x10028bb,\n\t\"braille_dots_34568\":          0x10028bc,\n\t\"braille_dots_134568\":         0x10028bd,\n\t\"braille_dots_234568\":         0x10028be,\n\t\"braille_dots_1234568\":        0x10028bf,\n\t\"braille_dots_78\":             0x10028c0,\n\t\"braille_dots_178\":            0x10028c1,\n\t\"braille_dots_278\":            0x10028c2,\n\t\"braille_dots_1278\":           0x10028c3,\n\t\"braille_dots_378\":            0x10028c4,\n\t\"braille_dots_1378\":           0x10028c5,\n\t\"braille_dots_2378\":           0x10028c6,\n\t\"braille_dots_12378\":          0x10028c7,\n\t\"braille_dots_478\":            0x10028c8,\n\t\"braille_dots_1478\":           0x10028c9,\n\t\"braille_dots_2478\":           0x10028ca,\n\t\"braille_dots_12478\":          0x10028cb,\n\t\"braille_dots_3478\":           0x10028cc,\n\t\"braille_dots_13478\":          0x10028cd,\n\t\"braille_dots_23478\":          0x10028ce,\n\t\"braille_dots_123478\":         0x10028cf,\n\t\"braille_dots_578\":            0x10028d0,\n\t\"braille_dots_1578\":           0x10028d1,\n\t\"braille_dots_2578\":           0x10028d2,\n\t\"braille_dots_12578\":          0x10028d3,\n\t\"braille_dots_3578\":           0x10028d4,\n\t\"braille_dots_13578\":          0x10028d5,\n\t\"braille_dots_23578\":          0x10028d6,\n\t\"braille_dots_123578\":         0x10028d7,\n\t\"braille_dots_4578\":           0x10028d8,\n\t\"braille_dots_14578\":          0x10028d9,\n\t\"braille_dots_24578\":          0x10028da,\n\t\"braille_dots_124578\":         0x10028db,\n\t\"braille_dots_34578\":          0x10028dc,\n\t\"braille_dots_134578\":         0x10028dd,\n\t\"braille_dots_234578\":         0x10028de,\n\t\"braille_dots_1234578\":        0x10028df,\n\t\"braille_dots_678\":            0x10028e0,\n\t\"braille_dots_1678\":           0x10028e1,\n\t\"braille_dots_2678\":           0x10028e2,\n\t\"braille_dots_12678\":          0x10028e3,\n\t\"braille_dots_3678\":           0x10028e4,\n\t\"braille_dots_13678\":          0x10028e5,\n\t\"braille_dots_23678\":          0x10028e6,\n\t\"braille_dots_123678\":         0x10028e7,\n\t\"braille_dots_4678\":           0x10028e8,\n\t\"braille_dots_14678\":          0x10028e9,\n\t\"braille_dots_24678\":          0x10028ea,\n\t\"braille_dots_124678\":         0x10028eb,\n\t\"braille_dots_34678\":          0x10028ec,\n\t\"braille_dots_134678\":         0x10028ed,\n\t\"braille_dots_234678\":         0x10028ee,\n\t\"braille_dots_1234678\":        0x10028ef,\n\t\"braille_dots_5678\":           0x10028f0,\n\t\"braille_dots_15678\":          0x10028f1,\n\t\"braille_dots_25678\":          0x10028f2,\n\t\"braille_dots_125678\":         0x10028f3,\n\t\"braille_dots_35678\":          0x10028f4,\n\t\"braille_dots_135678\":         0x10028f5,\n\t\"braille_dots_235678\":         0x10028f6,\n\t\"braille_dots_1235678\":        0x10028f7,\n\t\"braille_dots_45678\":          0x10028f8,\n\t\"braille_dots_145678\":         0x10028f9,\n\t\"braille_dots_245678\":         0x10028fa,\n\t\"braille_dots_1245678\":        0x10028fb,\n\t\"braille_dots_345678\":         0x10028fc,\n\t\"braille_dots_1345678\":        0x10028fd,\n\t\"braille_dots_2345678\":        0x10028fe,\n\t\"braille_dots_12345678\":       0x10028ff,\n\n\t\"XF86ModeLock\":          0x1008FF01,\n\t\"XF86MonBrightnessUp\":   0x1008FF02,\n\t\"XF86MonBrightnessDown\": 0x1008FF03,\n\t\"XF86KbdLightOnOff\":     0x1008FF04,\n\t\"XF86KbdBrightnessUp\":   0x1008FF05,\n\t\"XF86KbdBrightnessDown\": 0x1008FF06,\n\t\"XF86Standby\":           0x1008FF10,\n\t\"XF86AudioLowerVolume\":  0x1008FF11,\n\t\"XF86AudioMute\":         0x1008FF12,\n\t\"XF86AudioRaiseVolume\":  0x1008FF13,\n\t\"XF86AudioPlay\":         0x1008FF14,\n\t\"XF86AudioStop\":         0x1008FF15,\n\t\"XF86AudioPrev\":         0x1008FF16,\n\t\"XF86AudioNext\":         0x1008FF17,\n\t\"XF86HomePage\":          0x1008FF18,\n\t\"XF86Mail\":              0x1008FF19,\n\t\"XF86Start\":             0x1008FF1A,\n\t\"XF86Search\":            0x1008FF1B,\n\t\"XF86AudioRecord\":       0x1008FF1C,\n\t\"XF86Calculator\":        0x1008FF1D,\n\t\"XF86Memo\":              0x1008FF1E,\n\t\"XF86ToDoList\":          0x1008FF1F,\n\t\"XF86Calendar\":          0x1008FF20,\n\t\"XF86PowerDown\":         0x1008FF21,\n\t\"XF86ContrastAdjust\":    0x1008FF22,\n\t\"XF86RockerUp\":          0x1008FF23,\n\t\"XF86RockerDown\":        0x1008FF24,\n\t\"XF86RockerEnter\":       0x1008FF25,\n\t\"XF86Back\":              0x1008FF26,\n\t\"XF86Forward\":           0x1008FF27,\n\t\"XF86Stop\":              0x1008FF28,\n\t\"XF86Refresh\":           0x1008FF29,\n\t\"XF86PowerOff\":          0x1008FF2A,\n\t\"XF86WakeUp\":            0x1008FF2B,\n\t\"XF86Eject\":             0x1008FF2C,\n\t\"XF86ScreenSaver\":       0x1008FF2D,\n\t\"XF86WWW\":               0x1008FF2E,\n\t\"XF86Sleep\":             0x1008FF2F,\n\t\"XF86Favorites\":         0x1008FF30,\n\t\"XF86AudioPause\":        0x1008FF31,\n\t\"XF86AudioMedia\":        0x1008FF32,\n\t\"XF86MyComputer\":        0x1008FF33,\n\t\"XF86VendorHome\":        0x1008FF34,\n\t\"XF86LightBulb\":         0x1008FF35,\n\t\"XF86Shop\":              0x1008FF36,\n\t\"XF86History\":           0x1008FF37,\n\t\"XF86OpenURL\":           0x1008FF38,\n\t\"XF86AddFavorite\":       0x1008FF39,\n\t\"XF86HotLinks\":          0x1008FF3A,\n\t\"XF86BrightnessAdjust\":  0x1008FF3B,\n\t\"XF86Finance\":           0x1008FF3C,\n\t\"XF86Community\":         0x1008FF3D,\n\t\"XF86AudioRewind\":       0x1008FF3E,\n\t\"XF86BackForward\":       0x1008FF3F,\n\t\"XF86Launch0\":           0x1008FF40,\n\t\"XF86Launch1\":           0x1008FF41,\n\t\"XF86Launch2\":           0x1008FF42,\n\t\"XF86Launch3\":           0x1008FF43,\n\t\"XF86Launch4\":           0x1008FF44,\n\t\"XF86Launch5\":           0x1008FF45,\n\t\"XF86Launch6\":           0x1008FF46,\n\t\"XF86Launch7\":           0x1008FF47,\n\t\"XF86Launch8\":           0x1008FF48,\n\t\"XF86Launch9\":           0x1008FF49,\n\t\"XF86LaunchA\":           0x1008FF4A,\n\t\"XF86LaunchB\":           0x1008FF4B,\n\t\"XF86LaunchC\":           0x1008FF4C,\n\t\"XF86LaunchD\":           0x1008FF4D,\n\t\"XF86LaunchE\":           0x1008FF4E,\n\t\"XF86LaunchF\":           0x1008FF4F,\n\t\"XF86ApplicationLeft\":   0x1008FF50,\n\t\"XF86ApplicationRight\":  0x1008FF51,\n\t\"XF86Book\":              0x1008FF52,\n\t\"XF86CD\":                0x1008FF53,\n\t\"XF86Calculater\":        0x1008FF54,\n\t\"XF86Clear\":             0x1008FF55,\n\t\"XF86Close\":             0x1008FF56,\n\t\"XF86Copy\":              0x1008FF57,\n\t\"XF86Cut\":               0x1008FF58,\n\t\"XF86Display\":           0x1008FF59,\n\t\"XF86DOS\":               0x1008FF5A,\n\t\"XF86Documents\":         0x1008FF5B,\n\t\"XF86Excel\":             0x1008FF5C,\n\t\"XF86Explorer\":          0x1008FF5D,\n\t\"XF86Game\":              0x1008FF5E,\n\t\"XF86Go\":                0x1008FF5F,\n\t\"XF86iTouch\":            0x1008FF60,\n\t\"XF86LogOff\":            0x1008FF61,\n\t\"XF86Market\":            0x1008FF62,\n\t\"XF86Meeting\":           0x1008FF63,\n\t\"XF86MenuKB\":            0x1008FF65,\n\t\"XF86MenuPB\":            0x1008FF66,\n\t\"XF86MySites\":           0x1008FF67,\n\t\"XF86New\":               0x1008FF68,\n\t\"XF86News\":              0x1008FF69,\n\t\"XF86OfficeHome\":        0x1008FF6A,\n\t\"XF86Open\":              0x1008FF6B,\n\t\"XF86Option\":            0x1008FF6C,\n\t\"XF86Paste\":             0x1008FF6D,\n\t\"XF86Phone\":             0x1008FF6E,\n\t\"XF86Q\":                 0x1008FF70,\n\t\"XF86Reply\":             0x1008FF72,\n\t\"XF86Reload\":            0x1008FF73,\n\t\"XF86RotateWindows\":     0x1008FF74,\n\t\"XF86RotationPB\":        0x1008FF75,\n\t\"XF86RotationKB\":        0x1008FF76,\n\t\"XF86Save\":              0x1008FF77,\n\t\"XF86ScrollUp\":          0x1008FF78,\n\t\"XF86ScrollDown\":        0x1008FF79,\n\t\"XF86ScrollClick\":       0x1008FF7A,\n\t\"XF86Send\":              0x1008FF7B,\n\t\"XF86Spell\":             0x1008FF7C,\n\t\"XF86SplitScreen\":       0x1008FF7D,\n\t\"XF86Support\":           0x1008FF7E,\n\t\"XF86TaskPane\":          0x1008FF7F,\n\t\"XF86Terminal\":          0x1008FF80,\n\t\"XF86Tools\":             0x1008FF81,\n\t\"XF86Travel\":            0x1008FF82,\n\t\"XF86UserPB\":            0x1008FF84,\n\t\"XF86User1KB\":           0x1008FF85,\n\t\"XF86User2KB\":           0x1008FF86,\n\t\"XF86Video\":             0x1008FF87,\n\t\"XF86WheelButton\":       0x1008FF88,\n\t\"XF86Word\":              0x1008FF89,\n\t\"XF86Xfer\":              0x1008FF8A,\n\t\"XF86ZoomIn\":            0x1008FF8B,\n\t\"XF86ZoomOut\":           0x1008FF8C,\n\t\"XF86Away\":              0x1008FF8D,\n\t\"XF86Messenger\":         0x1008FF8E,\n\t\"XF86WebCam\":            0x1008FF8F,\n\t\"XF86MailForward\":       0x1008FF90,\n\t\"XF86Pictures\":          0x1008FF91,\n\t\"XF86Music\":             0x1008FF92,\n\t\"XF86Battery\":           0x1008FF93,\n\t\"XF86Bluetooth\":         0x1008FF94,\n\t\"XF86WLAN\":              0x1008FF95,\n\t\"XF86UWB\":               0x1008FF96,\n\t\"XF86AudioForward\":      0x1008FF97,\n\t\"XF86AudioRepeat\":       0x1008FF98,\n\t\"XF86AudioRandomPlay\":   0x1008FF99,\n\t\"XF86Subtitle\":          0x1008FF9A,\n\t\"XF86AudioCycleTrack\":   0x1008FF9B,\n\t\"XF86CycleAngle\":        0x1008FF9C,\n\t\"XF86FrameBack\":         0x1008FF9D,\n\t\"XF86FrameForward\":      0x1008FF9E,\n\t\"XF86Time\":              0x1008FF9F,\n\t\"XF86Select\":            0x1008FFA0,\n\t\"XF86View\":              0x1008FFA1,\n\t\"XF86TopMenu\":           0x1008FFA2,\n\t\"XF86Red\":               0x1008FFA3,\n\t\"XF86Green\":             0x1008FFA4,\n\t\"XF86Yellow\":            0x1008FFA5,\n\t\"XF86Blue\":              0x1008FFA6,\n\t\"XF86Suspend\":           0x1008FFA7,\n\t\"XF86Hibernate\":         0x1008FFA8,\n\t\"XF86TouchpadToggle\":    0x1008FFA9,\n\t\"XF86TouchpadOn\":        0x1008FFB0,\n\t\"XF86TouchpadOff\":       0x1008FFB1,\n\t\"XF86AudioMicMute\":      0x1008FFB2,\n\t\"XF86Switch_VT_1\":       0x1008FE01,\n\t\"XF86Switch_VT_2\":       0x1008FE02,\n\t\"XF86Switch_VT_3\":       0x1008FE03,\n\t\"XF86Switch_VT_4\":       0x1008FE04,\n\t\"XF86Switch_VT_5\":       0x1008FE05,\n\t\"XF86Switch_VT_6\":       0x1008FE06,\n\t\"XF86Switch_VT_7\":       0x1008FE07,\n\t\"XF86Switch_VT_8\":       0x1008FE08,\n\t\"XF86Switch_VT_9\":       0x1008FE09,\n\t\"XF86Switch_VT_10\":      0x1008FE0A,\n\t\"XF86Switch_VT_11\":      0x1008FE0B,\n\t\"XF86Switch_VT_12\":      0x1008FE0C,\n\t\"XF86Ungrab\":            0x1008FE20,\n\t\"XF86ClearGrab\":         0x1008FE21,\n\t\"XF86Next_VMode\":        0x1008FE22,\n\t\"XF86Prev_VMode\":        0x1008FE23,\n\t\"XF86LogWindowTree\":     0x1008FE24,\n\t\"XF86LogGrabInfo\":       0x1008FE25,\n}\n"
  },
  {
    "path": "keybind/xutil.go",
    "content": "package keybind\n\n/*\nkeybind/xutil.go contains a collection of functions that modify the\nKeybinds and Keygrabs state of an XUtil value.\n\nThey could have been placed inside the core xgbutil package, but they would\nhave to be exported for use by the keybind package. In which case, the API\nwould become cluttered with functions that should not be used.\n*/\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// attachKeyBindCallback associates an (event, window, mods, keycode)\n// with a callback.\n// This is exported for use in the keybind package. It should not be used.\nfunc attachKeyBindCallback(xu *xgbutil.XUtil, evtype int, win xproto.Window,\n\tmods uint16, keycode xproto.Keycode, fun xgbutil.CallbackKey) {\n\n\txu.KeybindsLck.Lock()\n\tdefer xu.KeybindsLck.Unlock()\n\n\t// Create key\n\tkey := xgbutil.KeyKey{evtype, win, mods, keycode}\n\n\t// Do we need to allocate?\n\tif _, ok := xu.Keybinds[key]; !ok {\n\t\txu.Keybinds[key] = make([]xgbutil.CallbackKey, 0)\n\t}\n\n\txu.Keybinds[key] = append(xu.Keybinds[key], fun)\n\txu.Keygrabs[key] += 1\n}\n\n// addKeyString adds a new key binding string to XUtil.Keystrings.\n// The invariant is that each key string appears once and only once.\nfunc addKeyString(xu *xgbutil.XUtil, callback xgbutil.CallbackKey,\n\tevtype int, win xproto.Window, keyStr string, grab bool) {\n\n\txu.KeybindsLck.Lock()\n\tdefer xu.KeybindsLck.Unlock()\n\n\tk := xgbutil.KeyString{\n\t\tStr:      keyStr,\n\t\tCallback: callback,\n\t\tEvtype:   evtype,\n\t\tWin:      win,\n\t\tGrab:     grab,\n\t}\n\txu.Keystrings = append(xu.Keystrings, k)\n}\n\n// keyBindKeys returns a copy of all the keys in the 'keybinds' map.\nfunc keyKeys(xu *xgbutil.XUtil) []xgbutil.KeyKey {\n\txu.KeybindsLck.RLock()\n\tdefer xu.KeybindsLck.RUnlock()\n\n\tkeys := make([]xgbutil.KeyKey, len(xu.Keybinds))\n\ti := 0\n\tfor key, _ := range xu.Keybinds {\n\t\tkeys[i] = key\n\t\ti++\n\t}\n\treturn keys\n}\n\n// runKeyBindCallbacks executes every callback corresponding to a\n// particular event/window/mod/key tuple.\n// This is exported for use in the keybind package. It should not be used.\nfunc runKeyBindCallbacks(xu *xgbutil.XUtil, event interface{}, evtype int,\n\twin xproto.Window, mods uint16, keycode xproto.Keycode) {\n\n\tkey := xgbutil.KeyKey{evtype, win, mods, keycode}\n\tfor _, cb := range keyCallbacks(xu, key) {\n\t\tcb.Run(xu, event)\n\t}\n}\n\n// keyBindCallbacks returns a slice of callbacks for a particular key.\nfunc keyCallbacks(xu *xgbutil.XUtil,\n\tkey xgbutil.KeyKey) []xgbutil.CallbackKey {\n\n\txu.KeybindsLck.RLock()\n\tdefer xu.KeybindsLck.RUnlock()\n\n\tcbs := make([]xgbutil.CallbackKey, len(xu.Keybinds[key]))\n\tcopy(cbs, xu.Keybinds[key])\n\treturn cbs\n}\n\n// ConnectedKeyBind checks to see if there are any key binds for a particular\n// event type already in play.\nfunc connectedKeyBind(xu *xgbutil.XUtil, evtype int, win xproto.Window) bool {\n\txu.KeybindsLck.RLock()\n\tdefer xu.KeybindsLck.RUnlock()\n\n\t// Since we can't create a full key, loop through all key binds\n\t// and check if evtype and window match.\n\tfor key, _ := range xu.Keybinds {\n\t\tif key.Evtype == evtype && key.Win == win {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// detachKeyBindWindow removes all callbacks associated with a particular\n// window and event type (either KeyPress or KeyRelease)\n// Also decrements the counter in the corresponding 'keygrabs' map\n// appropriately.\n// This is exported for use in the keybind package. It should not be used.\n// To detach a window from a key binding callbacks, please use keybind.Detach.\n// (This method will issue an Ungrab requests, while keybind.Detach will.)\nfunc detachKeyBindWindow(xu *xgbutil.XUtil, evtype int, win xproto.Window) {\n\txu.KeybindsLck.Lock()\n\tdefer xu.KeybindsLck.Unlock()\n\n\t// Since we can't create a full key, loop through all key binds\n\t// and check if evtype and window match.\n\tfor key, _ := range xu.Keybinds {\n\t\tif key.Evtype == evtype && key.Win == win {\n\t\t\txu.Keygrabs[key] -= len(xu.Keybinds[key])\n\t\t\tdelete(xu.Keybinds, key)\n\t\t}\n\t}\n}\n\n// keyBindGrabs returns the number of grabs on a particular\n// event/window/mods/keycode combination. Namely, this combination\n// uniquely identifies a grab. If it's repeated, we get BadAccess.\n// The idea is that if there are 0 grabs on a particular (modifiers, keycode)\n// tuple, then we issue a grab request. Otherwise, we don't.\n// This is exported for use in the keybind package. It should not be used.\nfunc keyBindGrabs(xu *xgbutil.XUtil, evtype int, win xproto.Window, mods uint16,\n\tkeycode xproto.Keycode) int {\n\n\txu.KeybindsLck.RLock()\n\tdefer xu.KeybindsLck.RUnlock()\n\n\tkey := xgbutil.KeyKey{evtype, win, mods, keycode}\n\treturn xu.Keygrabs[key] // returns 0 if key does not exist\n}\n\n// KeyMapGet accessor.\nfunc KeyMapGet(xu *xgbutil.XUtil) *xgbutil.KeyboardMapping {\n\treturn xu.Keymap\n}\n\n// KeyMapSet updates XUtil.keymap.\n// This is exported for use in the keybind package. You probably shouldn't\n// use this. (You may need to use this if you're rolling your own event loop,\n// and still want to use the keybind package.)\nfunc KeyMapSet(xu *xgbutil.XUtil, keyMapReply *xproto.GetKeyboardMappingReply) {\n\txu.Keymap = &xgbutil.KeyboardMapping{keyMapReply}\n}\n\n// ModMapGet accessor.\nfunc ModMapGet(xu *xgbutil.XUtil) *xgbutil.ModifierMapping {\n\treturn xu.Modmap\n}\n\n// ModMapSet updates XUtil.modmap.\n// This is exported for use in the keybind package. You probably shouldn't\n// use this. (You may need to use this if you're rolling your own event loop,\n// and still want to use the keybind package.)\nfunc ModMapSet(xu *xgbutil.XUtil, modMapReply *xproto.GetModifierMappingReply) {\n\txu.Modmap = &xgbutil.ModifierMapping{modMapReply}\n}\n"
  },
  {
    "path": "motif/motif.go",
    "content": "/*\nPackage motif has a few functions to allow easy access to Motif related\nproperties.\n\nThe main purpose here is that some applications communicate \"no window\ndecorations\" to the window manager using _MOTIF_WM_HINTS. (Like Google\nChrome.) I haven't seen Motif stuff used for other purposes in the wild for\na long time.\n\nAs a result, only the useful bits are implemented here. More may be added\non an on-demand basis, but don't count on it.\n\nTry not to bash your head against your desk too hard:\nhttp://www.opengroup.org/openmotif/hardcopydocs.html\n\nExample\n\nTo test if a window wants decorations or not:\n\n\tmh, err := motif.WmHintsGet(XUtilValue, window-id)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t} else {\n\t\tlog.Println(\"Decorations? \", motif.Decor(mh))\n\t}\n\n*/\npackage motif\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xprop\"\n)\n\nconst (\n\tHintFunctions = (1 << iota)\n\tHintDecorations\n\tHintInputMode\n\tHintStatus\n)\n\nconst (\n\tFunctionAll = (1 << iota)\n\tFunctionResize\n\tFunctionMove\n\tFunctionMinimize\n\tFunctionMaximize\n\tFunctionClose\n\tFunctionNone = 0\n)\n\nconst (\n\tDecorationAll = (1 << iota)\n\tDecorationBorder\n\tDecorationResizeH\n\tDecorationTitle\n\tDecorationMenu\n\tDecorationMinimize\n\tDecorationMaximize\n\tDecorationNone = 0\n)\n\nconst (\n\tInputPrimaryApplicationModal = (1 << iota)\n\tInputSystemModal\n\tInputFullApplicationModal\n\tInputModeless = 0\n)\n\nconst StatusTearoffWindow = 1\n\n// Decor checks a Hints value for whether or not the client has requested\n// that the window manager paint decorations.\n// That is, Decor returns false when the hints provided indicate no\n// decorations and true otherwise.\nfunc Decor(mh *Hints) bool {\n\tif mh.Flags&HintDecorations > 0 {\n\t\tnoDecor := mh.Decoration == DecorationNone ||\n\t\t\t(mh.Decoration&DecorationAll == 0 &&\n\t\t\t\tmh.Decoration&DecorationTitle == 0 &&\n\t\t\t\tmh.Decoration&DecorationResizeH == 0)\n\t\treturn !noDecor\n\t}\n\treturn true\n}\n\n// Hints is a struct that organizes the information related to the\n// WM_NORMAL_HINTS property.\ntype Hints struct {\n\tFlags                               uint\n\tFunction, Decoration, Input, Status uint\n}\n\n// _MOTIF_WM_HINTS get\nfunc WmHintsGet(xu *xgbutil.XUtil, win xproto.Window) (mh *Hints, err error) {\n\tlenExpect := 5\n\thints, err := xprop.PropValNums(xprop.GetProperty(xu, win,\n\t\t\"_MOTIF_WM_HINTS\"))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif len(hints) != lenExpect {\n\t\treturn nil,\n\t\t\tfmt.Errorf(\"motif.WmHintsGet: There are %d fields in \"+\n\t\t\t\t\"_MOTIF_WM_HINTS, but xgbutil expects %d.\",\n\t\t\t\tlen(hints), lenExpect)\n\t}\n\n\tmh = &Hints{}\n\tmh.Flags = hints[0]\n\tmh.Function = hints[1]\n\tmh.Decoration = hints[2]\n\tmh.Input = hints[3]\n\tmh.Status = hints[4]\n\n\treturn\n}\n\n// _MOTIF_WM_HINTS set\nfunc WmHintsSet(xu *xgbutil.XUtil, win xproto.Window, mh *Hints) error {\n\traw := []uint{mh.Flags, mh.Function, mh.Decoration, mh.Input, mh.Status}\n\treturn xprop.ChangeProp32(xu, win, \"_MOTIF_WM_HINTS\", \"_MOTIF_WM_HINTS\",\n\t\traw...)\n}\n"
  },
  {
    "path": "mousebind/callback.go",
    "content": "package mousebind\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\n// connect is essentially 'Connect' for either ButtonPress or\n// ButtonRelease events.\nfunc connect(xu *xgbutil.XUtil, callback xgbutil.CallbackMouse, evtype int,\n\twin xproto.Window, buttonStr string, sync bool, grab bool) error {\n\n\t// Get the mods/button first\n\tmods, button, err := ParseString(xu, buttonStr)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Only do the grab if we haven't yet on this window.\n\t// And if we WANT a grab...\n\tif grab && mouseBindGrabs(xu, evtype, win, mods, button) == 0 {\n\t\terr := GrabChecked(xu, win, mods, button, sync)\n\t\tif err != nil {\n\t\t\t// If a bad access, let's be nice and give a good error message.\n\t\t\tswitch err.(type) {\n\t\t\tcase xproto.AccessError:\n\t\t\t\treturn fmt.Errorf(\"Got a bad access error when trying to bind \"+\n\t\t\t\t\t\"'%s'. This usually means another client has already \"+\n\t\t\t\t\t\"grabbed this mouse binding.\", buttonStr)\n\t\t\tdefault:\n\t\t\t\treturn fmt.Errorf(\"Could not bind '%s' because: %s\",\n\t\t\t\t\tbuttonStr, err)\n\t\t\t}\n\t\t}\n\t}\n\n\t// If we've never grabbed anything on this window before, we need to\n\t// make sure we can respond to it in the main event loop.\n\tvar allCb xgbutil.Callback\n\tif evtype == xevent.ButtonPress {\n\t\tallCb = xevent.ButtonPressFun(runButtonPressCallbacks)\n\t} else {\n\t\tallCb = xevent.ButtonReleaseFun(runButtonReleaseCallbacks)\n\t}\n\n\t// If this is the first Button{Press|Release}Event on this window,\n\t// then we need to listen to Button{Press|Release} events in the main loop.\n\tif !connectedMouseBind(xu, evtype, win) {\n\t\tallCb.Connect(xu, win)\n\t}\n\n\t// Finally, attach the callback.\n\tattachMouseBindCallback(xu, evtype, win, mods, button, callback)\n\n\treturn nil\n}\n\n// DeduceButtonInfo takes a (modifiers, button) tuple and returns the relevant\n// modifiers that were activated. This accounts for modifiers in\n// xevent.IgnoreMods and the the button mask of the button that is pressed.\nfunc DeduceButtonInfo(state uint16,\n\tdetail xproto.Button) (uint16, xproto.Button) {\n\n\tmods, button := state, detail\n\tfor _, m := range xevent.IgnoreMods {\n\t\tmods &= ^m\n\t}\n\n\t// We also need to mask out the button that has been pressed/released,\n\t// since it is also typically a modifier.\n\tmodsTemp := int32(mods)\n\tswitch button {\n\tcase 1:\n\t\tmodsTemp &= ^xproto.ButtonMask1\n\tcase 2:\n\t\tmodsTemp &= ^xproto.ButtonMask2\n\tcase 3:\n\t\tmodsTemp &= ^xproto.ButtonMask3\n\tcase 4:\n\t\tmodsTemp &= ^xproto.ButtonMask4\n\tcase 5:\n\t\tmodsTemp &= ^xproto.ButtonMask5\n\t}\n\n\treturn uint16(modsTemp), button\n}\n\n// ButtonPressFun represents a function that is called when a particular mouse\n// binding is fired.\ntype ButtonPressFun xevent.ButtonPressFun\n\n// If 'sync' is True, then no further events can be processed until the\n// grabbing client allows them to be. (Which is done via AllowEvents. Thus,\n// if sync is True, you *must* make some call to AllowEvents at some\n// point, or else your client will lock.)\nfunc (callback ButtonPressFun) Connect(xu *xgbutil.XUtil, win xproto.Window,\n\tbuttonStr string, sync bool, grab bool) error {\n\n\treturn connect(xu, callback, xevent.ButtonPress, win, buttonStr, sync, grab)\n}\n\nfunc (callback ButtonPressFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(xevent.ButtonPressEvent))\n}\n\n// ButtonReleaseFun represents a function that is called when a particular mouse\n// binding is fired.\ntype ButtonReleaseFun xevent.ButtonReleaseFun\n\n// If 'sync' is True, then no further events can be processed until the\n// grabbing client allows them to be. (Which is done via AllowEvents. Thus,\n// if sync is True, you *must* make some call to AllowEvents at some\n// point, or else your client will lock.)\nfunc (callback ButtonReleaseFun) Connect(xu *xgbutil.XUtil, win xproto.Window,\n\tbuttonStr string, sync bool, grab bool) error {\n\n\treturn connect(xu, callback, xevent.ButtonRelease, win, buttonStr,\n\t\tsync, grab)\n}\n\nfunc (callback ButtonReleaseFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(xevent.ButtonReleaseEvent))\n}\n\n// runButtonPressCallbacks infers the window, button and modifiers from a\n// ButtonPressEvent and runs the corresponding callbacks.\nfunc runButtonPressCallbacks(xu *xgbutil.XUtil, ev xevent.ButtonPressEvent) {\n\tmods, button := DeduceButtonInfo(ev.State, ev.Detail)\n\n\trunMouseBindCallbacks(xu, ev, xevent.ButtonPress, ev.Event, mods, button)\n}\n\n// runButtonReleaseCallbacks infers the window, keycode and modifiers from a\n// ButtonPressEvent and runs the corresponding callbacks.\nfunc runButtonReleaseCallbacks(xu *xgbutil.XUtil,\n\tev xevent.ButtonReleaseEvent) {\n\n\tmods, button := DeduceButtonInfo(ev.State, ev.Detail)\n\n\trunMouseBindCallbacks(xu, ev, xevent.ButtonRelease, ev.Event, mods, button)\n}\n\n// Detach removes all handlers for all mouse events for the provided window id.\n// This should be called whenever a window is no longer receiving events to make\n// sure the garbage collector can release memory used to store the handler info.\nfunc Detach(xu *xgbutil.XUtil, win xproto.Window) {\n\tdetach(xu, xevent.ButtonPress, win)\n\tdetach(xu, xevent.ButtonRelease, win)\n}\n\n// DetachPress is the same as Detach, except it only removes handlers for\n// button *press* events.\nfunc DetachPress(xu *xgbutil.XUtil, win xproto.Window) {\n\tdetach(xu, xevent.ButtonPress, win)\n}\n\n// DetachRelease is the same as Detach, except it only removes handlers for\n// mouse *release* events.\nfunc DetachRelease(xu *xgbutil.XUtil, win xproto.Window) {\n\tdetach(xu, xevent.ButtonRelease, win)\n}\n\n// detach removes all handlers for the provided window and event type\n// combination. This will also issue an ungrab request for each grab that\n// drops to zero.\nfunc detach(xu *xgbutil.XUtil, evtype int, win xproto.Window) {\n\tmkeys := mouseKeys(xu)\n\tdetachMouseBindWindow(xu, evtype, win)\n\tfor _, key := range mkeys {\n\t\tif mouseBindGrabs(xu, key.Evtype, key.Win, key.Mod, key.Button) == 0 {\n\t\t\tUngrab(xu, key.Win, key.Mod, key.Button)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "mousebind/doc.go",
    "content": "/*\nPackage mousebind provides an easy to use interface to assign callback functions\nto human readable button sequences.\n\nNamely, the mousebind package exports two function types: ButtonPressFun and\nButtonReleaseFun. Values of these types are functions, and have a method called\n'Connect' that attaches an event handler to be run when a particular button\npress is issued.\n\nThis is virtually identical to the way calbacks are attached using the xevent\npackage, but the Connect method in the mousebind package has a couple extra\nparameters that are specific to mouse bindings. Namely, the button sequence to\nrespond to (which is a combination of zero or more modifiers and exactly one\nbutton), whether to establish a passive grab and whether to make the grab\nsynchronous or not. One can still attach callbacks to Button{Press,Release}\nevents using xevent, but it will be run for *all* Button{Press,Release} events.\n(This is typically what one might do when setting up an active grab.)\n\nInitialization\n\nBefore using the mousebind package, you should *always* make a single call to\nmousebind.Initialize for each X connection you're working with.\n\nButton sequence format\n\nButton sequences are human readable strings made up of zero or more modifiers\nand exactly one button. Namely:\n\n\t[Mod[-Mod[...]]-]BUTTONNUMBER\n\nWhere 'Mod' can be one of: shift, lock, control, mod1, mod2, mod3, mod4, mod5,\nbutton1, button2, button3, button4, button5 or any. You can view which keys\nactivate each modifier using the 'xmodmap' program. (If you don't have\n'xmodmap', you could also run the 'xmodmap' example in the examples directory.)\nThe 'button[1-5]' modifiers correspond to the button number in the name. (This\nimplies that buttons 1 through 5 can act as both a button number and a\nmodifier.)\n\nBUTTONNUMER must correspond to a valid button number on your mouse. The best\nway to determine the numbers of each button on your mouse is to launch the xev\nprogram in a terminal, click the corresponding button in the new window that\nopens, and read the event output in the terminal that launched xev. Usually a\nleft click is button 1, a right click is button 3 and a middle click is button\n2.\n\nAn example button sequence might look like 'Mod4-Control-Shift-1'. The\nmouse binding for that button sequence is activated when all three\nmodifiers---mod4, control and shift---are pressed along with the '1' button on\nyour mouse.\n\nWhen to issue a passive grab\n\nOne of the parameters of the 'Connect' method is whether to issue a passive\ngrab or not. A passive grab is useful when you need to respond to a button press\non some parent window (like the root window) without actually focusing that\nwindow. Not using a passive grab is useful when you only need to read button\npresses when the window is focused.\n\nFor more information on the semantics of passive grabs, please see\nhttp://tronche.com/gui/x/xlib/input/XGrabButton.html.\n\nAlso, by default, when issuing a grab on a particular (modifiers, button)\ntuple, several grabs are actually made. In particular, for each grab requested,\nanother grab is made with the \"num lock\" mask, another grab is made with the\n\"caps lock\" mask, and another grab is made with both the \"num lock\" and \"caps\nlocks\" masks. This allows button events to be reported regardless of whether\ncaps lock or num lock is enabled.\n\nThe extra masks added can be modified by changing the xevent.IgnoreMods slice.\nIf you modify xevent.IgnoreMods, it should be modified once on program startup\n(i.e., before any key or mouse bindings are established) and never modified\nagain.\n\nWhen to use a synchronous binding\n\nIn the vast majority of cases, 'sync' in the 'Connect' method should be set to\nfalse, which indicates that a passive grab should be asynchronous. (The value\nof sync is irrelevant if 'grab' is false.) This implies that any events\ngenerated by the grab are sent to the grabbing window (the second parameter of\nthe 'Connect' method) and only the grabbing window.\n\nSometimes, however, you might want button events to cascade down the window\ntree. That is, a button press on a parent window is grabbed, but then that\nbutton press should be sent to any children windows. With an asynchronous grab,\nthis is impossible. With a synchronous grab, however, the button event can be\n'replayed' to all child windows. For example:\n\n\tmousebind.Initialize(XUtilValue) // call once before using mousebind package\n\tmousebind.ButtonPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ButtonPressEvent) {\n\t\t\t// do something when button is pressed\n\t\t\t// And now replay the pointer event that fired this handler to all\n\t\t\t// child windows. All event processing is stopped on the\n\t\t\t// X server until this is called.\n\t\t\txproto.AllowEvents(X.Conn(), xproto.AllowReplayPointer, 0)\n\t\t}).Connect(XUtilValue, some-window-id,\n\t\t\t\"Mod4-Control-Shift-1\", true, true)\n\nThis sort of example is precisely how reparenting window managers allow one to\nclick on a window and have it be activated or \"raised\" *and* have the button\npress sent to the client window as well.\n\nNote that with a synchronous grab, all event processing will be halted by the X\nserver until *some* call to xproto.AllowEvents is made.\n\nMouse bindings on the root window example\n\nTo run a particular function whenever the 'Mod4-Control-Shift-1' button\ncombination is pressed (mod4 is typically the 'super' or 'windows' key, but can\nvary based on your system), use something like:\n\n\tmousebind.Initialize(XUtilValue) // call once before using mousebind package\n\tmousebind.ButtonPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ButtonPressEvent) {\n\t\t\t// do something when button is pressed\n\t\t}).Connect(XUtilValue, XUtilValue.RootWin(),\n\t\t\t\"Mod4-Control-Shift-1\", false, true)\n\nNote that we issue a passive grab because Button{Press,Release} events on the\nroot window will only be reported when the root window has focus if no grab\nexists.\n\nMouse bindings on a window you create example\n\nThis code snippet attaches an event handler to some window you've created\nwithout using a grab. Thus, the function will only be activated when the button\nsequence is pressed and your window has focus.\n\n\tmousebind.Initialize(XUtilValue) // call once before using mousebind package\n\tmousebind.ButtonPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ButtonPressEvent) {\n\t\t\t// do something when button is pressed\n\t\t}).Connect(XUtilValue, your-window-id, \"Mod4-t\", false, false)\n\nRun a function on all button press events example\n\nThis code snippet actually does *not* use the mousebind package, but illustrates\nhow the Button{Press,Release} event handlers in the xevent package can still be\nuseful. Namely, the mousebind package discriminates among events depending upon\nthe button sequences pressed, whereas the xevent package is more general: it\ncan only discriminate at the event level.\n\n\txevent.ButtonPressFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ButtonPressEvent) {\n\t\t\t// do something when any button is pressed\n\t\t}).Connect(XUtilValue, your-window-id)\n\nThis is the kind of handler you might use to capture all button press events.\n\nMore examples\n\nA complete working example using the mousebind package can be found in\n'simple-mousebinding' in the examples directory of the xgbutil package.\n\n*/\npackage mousebind\n"
  },
  {
    "path": "mousebind/drag.go",
    "content": "package mousebind\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\n// Drag is the public interface that will make the appropriate connections\n// to register a drag event for three functions: the begin function, the\n// step function and the end function.\n// The 'grabwin' is the window that the grab is placed on (and therefore the\n// window where all button events are redirected to after the drag has started),\n// and the 'win' is the window that the initial 'begin' callback is set on.\n// In typical use cases, these windows should be the same.\n// If 'grab' is false, then no pointer grab is issued.\nfunc Drag(xu *xgbutil.XUtil, grabwin xproto.Window, win xproto.Window,\n\tbuttonStr string, grab bool,\n\tbegin xgbutil.MouseDragBeginFun, step xgbutil.MouseDragFun,\n\tend xgbutil.MouseDragFun) {\n\n\tButtonPressFun(\n\t\tfunc(xu *xgbutil.XUtil, ev xevent.ButtonPressEvent) {\n\t\t\tDragBegin(xu, ev, grabwin, win, begin, step, end)\n\t\t}).Connect(xu, win, buttonStr, false, grab)\n\n\t// If the grab win isn't the dummy, then setup event handlers for the\n\t// grab window.\n\tif grabwin != xu.Dummy() {\n\t\txevent.MotionNotifyFun(dragStep).Connect(xu, grabwin)\n\t\txevent.ButtonReleaseFun(DragEnd).Connect(xu, grabwin)\n\t}\n}\n\n// dragGrab is a shortcut for grabbing the pointer for a drag.\nfunc dragGrab(xu *xgbutil.XUtil, grabwin xproto.Window, win xproto.Window,\n\tcursor xproto.Cursor) bool {\n\n\tstatus, err := GrabPointer(xu, grabwin, xu.RootWin(), cursor)\n\tif err != nil {\n\t\txgbutil.Logger.Printf(\"Mouse dragging was unsuccessful because: %v\",\n\t\t\terr)\n\t\treturn false\n\t}\n\tif !status {\n\t\txgbutil.Logger.Println(\"Mouse dragging was unsuccessful because \" +\n\t\t\t\"we could not establish a pointer grab.\")\n\t\treturn false\n\t}\n\n\tmouseDragSet(xu, true)\n\treturn true\n}\n\n// dragUngrab is a shortcut for ungrabbing the pointer for a drag.\nfunc dragUngrab(xu *xgbutil.XUtil) {\n\tUngrabPointer(xu)\n\tmouseDragSet(xu, false)\n}\n\n// DragBegin executes the \"begin\" function registered for the current drag.\n// It also initiates the grab with the cursor id return by the begin callback.\n//\n// N.B. This function is automatically called in the Drag convenience function.\n// This should be used when the drag can be started from a source other than\n// a button press handled by the WM. If you use this function, then there\n// should also be a call to DragEnd when the drag is done. (This is\n// automatically done for you if you use Drag.)\nfunc DragBegin(xu *xgbutil.XUtil, ev xevent.ButtonPressEvent,\n\tgrabwin xproto.Window, win xproto.Window,\n\tbegin xgbutil.MouseDragBeginFun, step xgbutil.MouseDragFun,\n\tend xgbutil.MouseDragFun) {\n\n\t// don't start a drag if one is already in progress\n\tif mouseDrag(xu) {\n\t\treturn\n\t}\n\n\t// Run begin first. It may tell us to cancel the grab.\n\t// It can also tell us which cursor to use when grabbing.\n\tgrab, cursor := begin(xu, int(ev.RootX), int(ev.RootY),\n\t\tint(ev.EventX), int(ev.EventY))\n\n\t// if we couldn't establish a grab, quit\n\t// Or quit if 'begin' tells us to.\n\tif !grab || !dragGrab(xu, grabwin, win, cursor) {\n\t\treturn\n\t}\n\n\t// we're committed. set the drag state and start the 'begin' function\n\tmouseDragStepSet(xu, step)\n\tmouseDragEndSet(xu, end)\n}\n\n// dragStep executes the \"step\" function registered for the current drag.\n// It also compresses the MotionNotify events.\nfunc dragStep(xu *xgbutil.XUtil, ev xevent.MotionNotifyEvent) {\n\t// If for whatever reason we don't have any *piece* of a grab,\n\t// we've gotta back out.\n\tif !mouseDrag(xu) || mouseDragStep(xu) == nil || mouseDragEnd(xu) == nil {\n\t\tdragUngrab(xu)\n\t\tmouseDragStepSet(xu, nil)\n\t\tmouseDragEndSet(xu, nil)\n\t\treturn\n\t}\n\n\t// The most recent MotionNotify event that we'll end up returning.\n\tlaste := ev\n\n\t// We force a round trip request so that we make sure to read all\n\t// available events.\n\txu.Sync()\n\txevent.Read(xu, false)\n\n\t// Compress MotionNotify events.\n\tfor i, ee := range xevent.Peek(xu) {\n\t\tif ee.Err != nil { // This is an error, skip it.\n\t\t\tcontinue\n\t\t}\n\n\t\t// Use type assertion to make sure this is a MotionNotify event.\n\t\tif mn, ok := ee.Event.(xproto.MotionNotifyEvent); ok {\n\t\t\t// Now make sure all appropriate fields are equivalent.\n\t\t\tif ev.Event == mn.Event && ev.Child == mn.Child &&\n\t\t\t\tev.Detail == mn.Detail && ev.State == mn.State &&\n\t\t\t\tev.Root == mn.Root && ev.SameScreen == mn.SameScreen {\n\n\t\t\t\t// Set the most recent/valid motion notify event.\n\t\t\t\tlaste = xevent.MotionNotifyEvent{&mn}\n\n\t\t\t\t// We cheat and use the stack semantics of defer to dequeue\n\t\t\t\t// most recent motion notify events first, so that the indices\n\t\t\t\t// don't become invalid. (If we dequeued oldest first, we'd\n\t\t\t\t// have to account for all future events shifting to the left\n\t\t\t\t// by one.)\n\t\t\t\tdefer func(i int) { xevent.DequeueAt(xu, i) }(i)\n\t\t\t}\n\t\t}\n\t}\n\txu.TimeSet(laste.Time)\n\n\t// now actually run the step\n\tmouseDragStep(xu)(xu, int(laste.RootX), int(laste.RootY),\n\t\tint(laste.EventX), int(laste.EventY))\n}\n\n// DragEnd executes the \"end\" function registered for the current drag.\n// This must be called at some point if DragStart has been called.\nfunc DragEnd(xu *xgbutil.XUtil, ev xevent.ButtonReleaseEvent) {\n\tif mouseDragEnd(xu) != nil {\n\t\tmouseDragEnd(xu)(xu, int(ev.RootX), int(ev.RootY),\n\t\t\tint(ev.EventX), int(ev.EventY))\n\t}\n\n\tdragUngrab(xu)\n\tmouseDragStepSet(xu, nil)\n\tmouseDragEndSet(xu, nil)\n}\n"
  },
  {
    "path": "mousebind/mousebind.go",
    "content": "package mousebind\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\nvar modifiers []uint16 = []uint16{ // order matters!\n\txproto.ModMaskShift, xproto.ModMaskLock, xproto.ModMaskControl,\n\txproto.ModMask1, xproto.ModMask2, xproto.ModMask3,\n\txproto.ModMask4, xproto.ModMask5,\n\txproto.ButtonMask1, xproto.ButtonMask2, xproto.ButtonMask3,\n\txproto.ButtonMask4, xproto.ButtonMask5,\n\txproto.ButtonMaskAny,\n}\n\nvar pointerMasks uint16 = xproto.EventMaskPointerMotion |\n\txproto.EventMaskButtonRelease |\n\txproto.EventMaskButtonPress\n\n// Initialize attaches the appropriate callbacks to make mouse bindings easier.\n// i.e., prep the dummy window to handle mouse dragging events\nfunc Initialize(xu *xgbutil.XUtil) {\n\txevent.MotionNotifyFun(dragStep).Connect(xu, xu.Dummy())\n\txevent.ButtonReleaseFun(DragEnd).Connect(xu, xu.Dummy())\n}\n\n// ParseString takes a string of the format '[Mod[-Mod[...]]]-BUTTONNUMBER',\n// i.e., 'Mod4-1', and returns a modifiers/button combination.\n// \"Mod\" could also be one of {button1, button2, button3, button4, button5}.\n// An error is returned if the string is malformed or if no BUTTONNUMBER\n// could be found.\nfunc ParseString(xu *xgbutil.XUtil, str string) (uint16, xproto.Button, error) {\n\tmods, button := uint16(0), xproto.Button(0)\n\tfor _, part := range strings.Split(str, \"-\") {\n\t\tswitch strings.ToLower(part) {\n\t\tcase \"shift\":\n\t\t\tmods |= xproto.ModMaskShift\n\t\tcase \"lock\":\n\t\t\tmods |= xproto.ModMaskLock\n\t\tcase \"control\":\n\t\t\tmods |= xproto.ModMaskControl\n\t\tcase \"mod1\":\n\t\t\tmods |= xproto.ModMask1\n\t\tcase \"mod2\":\n\t\t\tmods |= xproto.ModMask2\n\t\tcase \"mod3\":\n\t\t\tmods |= xproto.ModMask3\n\t\tcase \"mod4\":\n\t\t\tmods |= xproto.ModMask4\n\t\tcase \"mod5\":\n\t\t\tmods |= xproto.ModMask5\n\t\tcase \"button1\":\n\t\t\tmods |= xproto.ButtonMask1\n\t\tcase \"button2\":\n\t\t\tmods |= xproto.ButtonMask2\n\t\tcase \"button3\":\n\t\t\tmods |= xproto.ButtonMask3\n\t\tcase \"button4\":\n\t\t\tmods |= xproto.ButtonMask4\n\t\tcase \"button5\":\n\t\t\tmods |= xproto.ButtonMask5\n\t\tcase \"any\":\n\t\t\tmods |= xproto.ButtonMaskAny\n\t\tdefault: // a button!\n\t\t\tif button == 0 { // only accept the first button we see\n\t\t\t\tpossible, err := strconv.ParseUint(part, 10, 8)\n\t\t\t\tif err == nil {\n\t\t\t\t\tbutton = xproto.Button(possible)\n\t\t\t\t} else {\n\t\t\t\t\treturn 0, 0, fmt.Errorf(\"Could not convert '%s' to a \"+\n\t\t\t\t\t\t\"valid 8-bit integer.\", part)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif button == 0 {\n\t\treturn 0, 0, fmt.Errorf(\"Could not find a valid button in the \"+\n\t\t\t\"string '%s'. Mouse binding failed.\", str)\n\t}\n\n\treturn mods, button, nil\n}\n\n// Grab grabs a button with mods on a particular window.\n// Will also grab all combinations of modifiers found in xevent.IgnoreMods\n// If 'sync' is True, then no further events can be processed until the\n// grabbing client allows them to be. (Which is done via AllowEvents. Thus,\n// if sync is True, you *must* make some call to AllowEvents at some\n// point, or else your client will lock.)\nfunc Grab(xu *xgbutil.XUtil, win xproto.Window, mods uint16,\n\tbutton xproto.Button, sync bool) {\n\n\tvar pSync byte = xproto.GrabModeAsync\n\tif sync {\n\t\tpSync = xproto.GrabModeSync\n\t}\n\n\tfor _, m := range xevent.IgnoreMods {\n\t\txproto.GrabButton(xu.Conn(), true, win, pointerMasks, pSync,\n\t\t\txproto.GrabModeAsync, 0, 0, byte(button), mods|m)\n\t}\n}\n\n// GrabChecked grabs a button with mods on a particular window. It does the\n// same thing as Grab, but issues a checked request and returns an error\n// on failure.\n// Will also grab all combinations of modifiers found in xevent.IgnoreMods\n// If 'sync' is True, then no further events can be processed until the\n// grabbing client allows them to be. (Which is done via AllowEvents. Thus,\n// if sync is True, you *must* make some call to AllowEvents at some\n// point, or else your client will lock.)\nfunc GrabChecked(xu *xgbutil.XUtil, win xproto.Window, mods uint16,\n\tbutton xproto.Button, sync bool) error {\n\n\tvar pSync byte = xproto.GrabModeAsync\n\tif sync {\n\t\tpSync = xproto.GrabModeSync\n\t}\n\n\tvar err error\n\tfor _, m := range xevent.IgnoreMods {\n\t\terr = xproto.GrabButtonChecked(xu.Conn(), true, win, pointerMasks,\n\t\t\tpSync, xproto.GrabModeAsync, 0, 0, byte(button), mods|m).Check()\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Ungrab undoes Grab. It will handle all combinations of modifiers found\n// in xevent.IgnoreMods.\nfunc Ungrab(xu *xgbutil.XUtil, win xproto.Window, mods uint16,\n\tbutton xproto.Button) {\n\n\tfor _, m := range xevent.IgnoreMods {\n\t\txproto.UngrabButtonChecked(xu.Conn(), byte(button), win, mods|m).Check()\n\t}\n}\n\n// GrabPointer grabs the entire pointer.\n// Returns whether GrabStatus is successful and an error if one is reported by\n// XGB. It is possible to not get an error and the grab to be unsuccessful.\n// The purpose of 'win' is that after a grab is successful, ALL Button*Events\n// will be sent to that window. Make sure you have a callback attached :-)\nfunc GrabPointer(xu *xgbutil.XUtil, win xproto.Window, confine xproto.Window,\n\tcursor xproto.Cursor) (bool, error) {\n\n\treply, err := xproto.GrabPointer(xu.Conn(), false, win, pointerMasks,\n\t\txproto.GrabModeAsync, xproto.GrabModeAsync,\n\t\tconfine, cursor, 0).Reply()\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"GrabPointer: Error grabbing pointer on \"+\n\t\t\t\"window '%x': %s\", win, err)\n\t}\n\n\treturn reply.Status == xproto.GrabStatusSuccess, nil\n}\n\n// UngrabPointer undoes GrabPointer.\nfunc UngrabPointer(xu *xgbutil.XUtil) {\n\txproto.UngrabPointer(xu.Conn(), 0)\n}\n"
  },
  {
    "path": "mousebind/xutil.go",
    "content": "package mousebind\n\n/*\nmousebind/xutil.go contains a collection of functions that modify the\nMousebinds and Mousegrabs state of an XUtil value.\n\nThey could have been placed inside the core xgbutil package, but they would\nhave to be exported for use by the mousebind package. In which case, the API\nwould become cluttered with functions that should not be used.\n*/\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// attachMouseBindCallback associates an (event, window, mods, button)\n// with a callback.\nfunc attachMouseBindCallback(xu *xgbutil.XUtil, evtype int, win xproto.Window,\n\tmods uint16, button xproto.Button, fun xgbutil.CallbackMouse) {\n\n\txu.MousebindsLck.Lock()\n\tdefer xu.MousebindsLck.Unlock()\n\n\t// Create key\n\tkey := xgbutil.MouseKey{evtype, win, mods, button}\n\n\t// Do we need to allocate?\n\tif _, ok := xu.Mousebinds[key]; !ok {\n\t\txu.Mousebinds[key] = make([]xgbutil.CallbackMouse, 0)\n\t}\n\n\txu.Mousebinds[key] = append(xu.Mousebinds[key], fun)\n\txu.Mousegrabs[key] += 1\n}\n\n// mouseKeys returns a copy of all the keys in the 'Mousebinds' map.\nfunc mouseKeys(xu *xgbutil.XUtil) []xgbutil.MouseKey {\n\txu.MousebindsLck.RLock()\n\tdefer xu.MousebindsLck.RUnlock()\n\n\tkeys := make([]xgbutil.MouseKey, len(xu.Mousebinds))\n\ti := 0\n\tfor key, _ := range xu.Mousebinds {\n\t\tkeys[i] = key\n\t\ti++\n\t}\n\treturn keys\n}\n\n// mouseBindCallbacks returns a slice of callbacks for a particular key.\nfunc mouseCallbacks(xu *xgbutil.XUtil,\n\tkey xgbutil.MouseKey) []xgbutil.CallbackMouse {\n\n\txu.MousebindsLck.RLock()\n\tdefer xu.MousebindsLck.RUnlock()\n\n\tcbs := make([]xgbutil.CallbackMouse, len(xu.Mousebinds[key]))\n\tcopy(cbs, xu.Mousebinds[key])\n\treturn cbs\n}\n\n// runMouseBindCallbacks executes every callback corresponding to a\n// particular event/window/mod/button tuple.\nfunc runMouseBindCallbacks(xu *xgbutil.XUtil, event interface{}, evtype int,\n\twin xproto.Window, mods uint16, button xproto.Button) {\n\n\tkey := xgbutil.MouseKey{evtype, win, mods, button}\n\tfor _, cb := range mouseCallbacks(xu, key) {\n\t\tcb.Run(xu, event)\n\t}\n}\n\n// connectedMouseBind checks to see if there are any key binds for a particular\n// event type already in play. This is to work around comparing function\n// pointers (not allowed in Go), which would be used in 'Connected'.\nfunc connectedMouseBind(xu *xgbutil.XUtil, evtype int, win xproto.Window) bool {\n\txu.MousebindsLck.RLock()\n\tdefer xu.MousebindsLck.RUnlock()\n\n\t// Since we can't create a full key, loop through all mouse binds\n\t// and check if evtype and window match.\n\tfor key, _ := range xu.Mousebinds {\n\t\tif key.Evtype == evtype && key.Win == win {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// detachMouseBindWindow removes all callbacks associated with a particular\n// window and event type (either ButtonPress or ButtonRelease)\n// Also decrements the counter in the corresponding 'Mousegrabs' map\n// appropriately.\nfunc detachMouseBindWindow(xu *xgbutil.XUtil, evtype int, win xproto.Window) {\n\txu.MousebindsLck.Lock()\n\tdefer xu.MousebindsLck.Unlock()\n\n\t// Since we can't create a full key, loop through all mouse binds\n\t// and check if evtype and window match.\n\tfor key, _ := range xu.Mousebinds {\n\t\tif key.Evtype == evtype && key.Win == win {\n\t\t\txu.Mousegrabs[key] -= len(xu.Mousebinds[key])\n\t\t\tdelete(xu.Mousebinds, key)\n\t\t}\n\t}\n}\n\n// mouseBindGrabs returns the number of grabs on a particular\n// event/window/mods/button combination. Namely, this combination\n// uniquely identifies a grab. If it's repeated, we get BadAccess.\nfunc mouseBindGrabs(xu *xgbutil.XUtil, evtype int, win xproto.Window,\n\tmods uint16, button xproto.Button) int {\n\n\txu.MousebindsLck.RLock()\n\tdefer xu.MousebindsLck.RUnlock()\n\n\tkey := xgbutil.MouseKey{evtype, win, mods, button}\n\treturn xu.Mousegrabs[key] // returns 0 if key does not exist\n}\n\n// mouseDrag true when a mouse drag is in progress.\nfunc mouseDrag(xu *xgbutil.XUtil) bool {\n\treturn xu.InMouseDrag\n}\n\n// mouseDragSet sets whether a mouse drag is in progress.\nfunc mouseDragSet(xu *xgbutil.XUtil, dragging bool) {\n\txu.InMouseDrag = dragging\n}\n\n// mouseDragStep returns the function currently associated with each\n// step of a mouse drag.\nfunc mouseDragStep(xu *xgbutil.XUtil) xgbutil.MouseDragFun {\n\treturn xu.MouseDragStepFun\n}\n\n// mouseDragStepSet sets the function associated with the step of a drag.\nfunc mouseDragStepSet(xu *xgbutil.XUtil, f xgbutil.MouseDragFun) {\n\txu.MouseDragStepFun = f\n}\n\n// mouseDragEnd returns the function currently associated with the\n// end of a mouse drag.\nfunc mouseDragEnd(xu *xgbutil.XUtil) xgbutil.MouseDragFun {\n\treturn xu.MouseDragEndFun\n}\n\n// mouseDragEndSet sets the function associated with the end of a drag.\nfunc mouseDragEndSet(xu *xgbutil.XUtil, f xgbutil.MouseDragFun) {\n\txu.MouseDragEndFun = f\n}\n"
  },
  {
    "path": "scripts/README",
    "content": "The 'scripts' directory contains small programs that facilitate the development\nof xgbutil.\n\nCurrently, there is only one script: 'write-events'.\n\nwrite-events\n============\nwrite-events is a short Python program that can automatically generates two\nGo source files in the 'xevent' package. Namely, the 'types_auto.go' and\n'callbacks.go' files. Both files contain a lot of boiler plate related to\ndefinitions of each X event in the core protocol.\n\nIf and when xgbutil adds support for other extensions (i.e., RandR), more\nevents will need to be added.\n\n'write-events' is run in when calling 'make' in the xgbutil root directory.\n"
  },
  {
    "path": "scripts/write-events",
    "content": "#!/usr/bin/env python2.7\n\nimport sys\n\nevents = [\n    ('xproto', 'KeyPressEvent'),\n    ('xproto', 'KeyReleaseEvent'),\n    ('xproto', 'ButtonPressEvent'),\n    ('xproto', 'ButtonReleaseEvent'),\n    ('xproto', 'MotionNotifyEvent'),\n    ('xproto', 'EnterNotifyEvent'),\n    ('xproto', 'LeaveNotifyEvent'),\n    ('xproto', 'FocusInEvent'),\n    ('xproto', 'FocusOutEvent'),\n    ('xproto', 'KeymapNotifyEvent'),\n    ('xproto', 'ExposeEvent'),\n    ('xproto', 'GraphicsExposureEvent'),\n    ('xproto', 'NoExposureEvent'),\n    ('xproto', 'VisibilityNotifyEvent'),\n    ('xproto', 'CreateNotifyEvent'),\n    ('xproto', 'DestroyNotifyEvent'),\n    ('xproto', 'UnmapNotifyEvent'),\n    ('xproto', 'MapNotifyEvent'),\n    ('xproto', 'MapRequestEvent'),\n    ('xproto', 'ReparentNotifyEvent'),\n    ('xproto', 'ConfigureNotifyEvent'),\n    ('xproto', 'ConfigureRequestEvent'),\n    ('xproto', 'GravityNotifyEvent'),\n    ('xproto', 'ResizeRequestEvent'),\n    ('xproto', 'CirculateNotifyEvent'),\n    ('xproto', 'CirculateRequestEvent'),\n    ('xproto', 'PropertyNotifyEvent'),\n    ('xproto', 'SelectionClearEvent'),\n    ('xproto', 'SelectionRequestEvent'),\n    ('xproto', 'SelectionNotifyEvent'),\n    ('xproto', 'ColormapNotifyEvent'),\n    ('xproto', 'ClientMessageEvent'),\n    ('xproto', 'MappingNotifyEvent'),\n\n    # X Shape extension events\n    ('shape', 'NotifyEvent'),\n]\n\nassert len(sys.argv) == 2\n\nif sys.argv[1] == 'evtypes':\n    print 'package xevent'\n    print '''/*\n    Defines event types and their associated methods automatically.\n    \n    This file is automatically generated using `scripts/write-events evtypes`.\n\n    Edit it at your peril.\n*/'''\n    print\n    print 'import ('\n    print '\\t\"fmt\"'\n    print\n    print '\\t\"github.com/BurntSushi/xgb/shape\"'\n    print '\\t\"github.com/BurntSushi/xgb/xproto\"'\n    print ')'\n    print\n\n    for ext, e in events:\n        # Skip ClientMessageEvent and ConfigureNotifyEvent\n        # We define these manually in xevents/types_manual.go\n        if e in ('ClientMessageEvent', 'ConfigureNotifyEvent'):\n            continue\n\n        if ext == 'xproto':\n            print 'type %s struct {' % e\n            print '    *%s.%s' % (ext, e)\n            print '}'\n            print\n            print 'const %s = %s.%s' % (e[:-5], ext, e[:-5])\n            print\n            print 'func (ev %s) String() string {' % e\n            print '    return fmt.Sprintf(\"%%v\", ev.%s)' % e\n            print '}'\n            print\n        else:\n            print 'type %s%s struct {' % (ext.title(), e)\n            print '    *%s.%s' % (ext, e)\n            print '}'\n            print\n            print 'const %s%s = %s.%s' % (ext.title(), e[:-5], ext, e[:-5])\n            print\n            print 'func (ev %s%s) String() string {' % (ext.title(), e)\n            print '    return fmt.Sprintf(\"%%v\", ev.%s)' % e\n            print '}'\n            print\nelif sys.argv[1] == 'callbacks':\n    print 'package xevent'\n    print '''/*\n    Does all the plumbing to allow a simple callback interface for users.\n\n    This file is automatically generated using `scripts/write-events callbacks`.\n\n    Edit it at your peril.\n*/'''\n    print\n    print 'import ('\n    print '\\t\"github.com/BurntSushi/xgb/xproto\"'\n    print\n    print '\\t\"github.com/BurntSushi/xgbutil\"'\n    print ')'\n    print\n\n    for ext, e in events:\n        e = e[:-5]\n        if ext != 'xproto':\n            e = '%s%s' % (ext.title(), e)\n        print 'type %sFun func(xu *xgbutil.XUtil, event %sEvent)' % (e, e)\n        print\n        print 'func (callback %sFun) '\\\n                'Connect(xu *xgbutil.XUtil,\\nwin xproto.Window) {' % e\n        print '    attachCallback(xu, %s, win, callback)' % e\n        print '}'\n        print\n        print 'func (callback %sFun) ' \\\n                'Run(xu *xgbutil.XUtil, event interface{}) {' % e\n        print '    callback(xu, event.(%sEvent))' % e\n        print '}'\n        print\n\n"
  },
  {
    "path": "session.vim",
    "content": "au BufWritePost *.go silent!make tags > /dev/null 2>&1\n"
  },
  {
    "path": "types.go",
    "content": "package xgbutil\n\n/*\ntypes.go contains several types used in the XUtil structure. In an ideal world,\nthey would be defined in their appropriate packages, but must be defined here\n(and exported) for use in some sub-packages. (Namely, xevent, keybind and\nmousebind.)\n*/\n\nimport (\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n)\n\n// Callback is an interface that should be implemented by event callback\n// functions. Namely, to assign a function to a particular event/window\n// combination, simply define a function with type 'SomeEventFun' (pre-defined\n// in xevent/callback.go), and call the 'Connect' method.\n// The 'Run' method is used inside the Main event loop, and shouldn't be used\n// by the user.\n// Also, it is perfectly legitimate to connect to events that don't specify\n// a window (like MappingNotify and KeymapNotify). In this case, simply\n// use 'xgbutil.NoWindow' as the window id.\n//\n// Example to respond to ConfigureNotify events on window 0x1\n//\n//\txevent.ConfigureNotifyFun(\n//\t\tfunc(X *xgbutil.XUtil, e xevent.ConfigureNotifyEvent) {\n//\t\t\tfmt.Printf(\"(%d, %d) %dx%d\\n\", e.X, e.Y, e.Width, e.Height)\n//\t\t}).Connect(X, 0x1)\ntype Callback interface {\n\t// Connect modifies XUtil's state to attach an event handler to a\n\t// particular event.\n\tConnect(xu *XUtil, win xproto.Window)\n\n\t// Run is exported for use in the xevent package but should not be\n\t// used by the user. (It is used to run the callback function in the\n\t// main event loop.)\n\tRun(xu *XUtil, ev interface{})\n}\n\n// CallbackHook works similarly to the more general Callback, but it is\n// for hooks into the main xevent loop. As such it does not get attached\n// to a window.\ntype CallbackHook interface {\n\t// Connect connects this hook to the main loop of the passed XUtil\n\t// instance.\n\tConnect(xu *XUtil)\n\n\t// Run is exported for use in the xevent package, but should not be\n\t// used by the user.  It should return true if it's ok to process\n\t// the event as usual, or false if it should be suppressed.\n\tRun(xu *XUtil, ev interface{}) bool\n}\n\n// CallbackKey works similarly to the more general Callback, but it adds\n// parameters specific to key bindings.\ntype CallbackKey interface {\n\t// Connect modifies XUtil's state to attach an event handler to a\n\t// particular key press. If grab is true, connect will request a passive\n\t// grab.\n\tConnect(xu *XUtil, win xproto.Window, keyStr string, grab bool) error\n\n\t// Run is exported for use in the keybind package but should not be\n\t// used by the user. (It is used to run the callback function in the\n\t// main event loop.\n\tRun(xu *XUtil, ev interface{})\n}\n\n// CallbackMouse works similarly to the more general Callback, but it adds\n// parameters specific to mouse bindings.\ntype CallbackMouse interface {\n\t// Connect modifies XUtil's state to attach an event handler to a\n\t// particular button press.\n\t// If sync is true, the grab will be synchronous. (This will require a\n\t// call to xproto.AllowEvents in response, otherwise no further events\n\t// will be processed and your program will lock.)\n\t// If grab is true, connect will request a passive grab.\n\tConnect(xu *XUtil, win xproto.Window, buttonStr string,\n\t\tsync bool, grab bool) error\n\n\t// Run is exported for use in the mousebind package but should not be\n\t// used by the user. (It is used to run the callback function in the\n\t// main event loop.)\n\tRun(xu *XUtil, ev interface{})\n}\n\n// KeyKey is the type of the key in the map of keybindings.\n// It essentially represents the tuple\n// (event type, window id, modifier, keycode).\n// It is exported for use in the keybind package. It should not be used.\ntype KeyKey struct {\n\tEvtype int\n\tWin    xproto.Window\n\tMod    uint16\n\tCode   xproto.Keycode\n}\n\n// KeyString is the type of a key binding string used to connect to particular\n// key combinations. A list of all such key strings is maintained in order to\n// rebind keys when the keyboard mapping has been changed.\ntype KeyString struct {\n\tStr      string\n\tCallback CallbackKey\n\tEvtype   int\n\tWin      xproto.Window\n\tGrab     bool\n}\n\n// MouseKey is the type of the key in the map of mouse bindings.\n// It essentially represents the tuple\n// (event type, window id, modifier, button).\n// It is exported for use in the mousebind package. It should not be used.\ntype MouseKey struct {\n\tEvtype int\n\tWin    xproto.Window\n\tMod    uint16\n\tButton xproto.Button\n}\n\n// KeyboardMapping embeds a keyboard mapping reply from XGB.\n// It should be retrieved using keybind.KeyMapGet, if necessary.\n// xgbutil tries quite hard to absolve you from ever having to use this.\n// A keyboard mapping is a table that maps keycodes to one or more keysyms.\ntype KeyboardMapping struct {\n\t*xproto.GetKeyboardMappingReply\n}\n\n// ModifierMapping embeds a modifier mapping reply from XGB.\n// It should be retrieved using keybind.ModMapGet, if necessary.\n// xgbutil tries quite hard to absolve you from ever having to use this.\n// A modifier mapping is a table that maps modifiers to one or more keycodes.\ntype ModifierMapping struct {\n\t*xproto.GetModifierMappingReply\n}\n\n// ErrorHandlerFun is the type of function required to handle errors that\n// come in through the main event loop.\n// For example, to set a new error handler, use:\n//\n//\txevent.ErrorHandlerSet(xgbutil.ErrorHandlerFun(\n//\t\tfunc(err xgb.Error) {\n//\t\t\t// do something with err\n//\t\t}))\ntype ErrorHandlerFun func(err xgb.Error)\n\n// EventOrError is a struct that contains either an event value or an error\n// value. It is an error to contain both. Containing neither indicates an\n// error too.\n// This is exported for use in the xevent package. You shouldn't have any\n// direct contact with values of this type, unless you need to inspect the\n// queue directly with xevent.Peek.\ntype EventOrError struct {\n\tEvent xgb.Event\n\tErr   xgb.Error\n}\n\n// MouseDragFun is the kind of function used on each dragging step\n// and at the end of a drag.\ntype MouseDragFun func(xu *XUtil, rootX, rootY, eventX, eventY int)\n\n// MouseDragBeginFun is the kind of function used to initialize a drag.\n// The difference between this and MouseDragFun is that the begin function\n// returns a bool (of whether or not to cancel the drag) and an X resource\n// identifier corresponding to a cursor.\ntype MouseDragBeginFun func(xu *XUtil, rootX, rootY,\n\teventX, eventY int) (bool, xproto.Cursor)\n"
  },
  {
    "path": "xcursor/cursordef.go",
    "content": "package xcursor\n\nconst (\n\tXCursor           = 0\n\tArrow             = 2\n\tBasedArrowDown    = 4\n\tBasedArrowUp      = 6\n\tBoat              = 8\n\tBogosity          = 10\n\tBottomLeftCorner  = 12\n\tBottomRightCorner = 14\n\tBottomSide        = 16\n\tBottomTee         = 18\n\tBoxSpiral         = 20\n\tCenterPtr         = 22\n\tCircle            = 24\n\tClock             = 26\n\tCoffeeMug         = 28\n\tCross             = 30\n\tCrossReverse      = 32\n\tCrosshair         = 34\n\tDiamondCross      = 36\n\tDot               = 38\n\tDotBoxMask        = 40\n\tDoubleArrow       = 42\n\tDraftLarge        = 44\n\tDraftSmall        = 46\n\tDrapedBox         = 48\n\tExchange          = 50\n\tFleur             = 52\n\tGobbler           = 54\n\tGumby             = 56\n\tHand1             = 58\n\tHand2             = 60\n\tHeart             = 62\n\tIcon              = 64\n\tIronCross         = 66\n\tLeftPtr           = 68\n\tLeftSide          = 70\n\tLeftTee           = 72\n\tLeftButton        = 74\n\tLLAngle           = 76\n\tLRAngle           = 78\n\tMan               = 80\n\tMiddleButton      = 82\n\tMouse             = 84\n\tPencil            = 86\n\tPirate            = 88\n\tPlus              = 90\n\tQuestionArrow     = 92\n\tRightPtr          = 94\n\tRightSide         = 96\n\tRightTee          = 98\n\tRightButton       = 100\n\tRtlLogo           = 102\n\tSailboat          = 104\n\tSBDownArrow       = 106\n\tSBHDoubleArrow    = 108\n\tSBLeftArrow       = 110\n\tSBRightArrow      = 112\n\tSBUpArrow         = 114\n\tSBVDoubleArrow    = 116\n\tShuttle           = 118\n\tSizing            = 120\n\tSpider            = 122\n\tSpraycan          = 124\n\tStar              = 126\n\tTarget            = 128\n\tTCross            = 130\n\tTopLeftArrow      = 132\n\tTopLeftCorner     = 134\n\tTopRightCorner    = 136\n\tTopSide           = 138\n\tTopTee            = 140\n\tTrek              = 142\n\tULAngle           = 144\n\tUmbrella          = 146\n\tURAngle           = 148\n\tWatch             = 150\n\tXTerm             = 152\n)\n"
  },
  {
    "path": "xcursor/doc.go",
    "content": "/*\nPackage xcursor provides a small interface for using cursors that are\npredefined in the X 'cursor' font.\n\nAll available cursors are predefined in cursordef.go.\n\nPlease see the 'change-cursor' example in the examples directory of the xgbutil\npackage for an example of how to change the cursor when it enters a particular\nwindow.\n*/\npackage xcursor\n"
  },
  {
    "path": "xcursor/xcursor.go",
    "content": "package xcursor\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// CreateCursor sets some default colors for nice and easy cursor creation.\n// Just supply a cursor constant from 'xcursor/cursordef.go'.\nfunc CreateCursor(xu *xgbutil.XUtil, cursor uint16) (xproto.Cursor, error) {\n\treturn CreateCursorExtra(xu, cursor, 0, 0, 0, 0xffff, 0xffff, 0xffff)\n}\n\n// CreateCursorExtra features all available parameters to creating a cursor.\n// It will return an error if there is a problem with any of the requests\n// made to create the cursor.\n// (This implies each request is a checked request. The performance loss is\n// probably acceptable since cursors should be created once and reused.)\nfunc CreateCursorExtra(xu *xgbutil.XUtil, cursor, foreRed, foreGreen,\n\tforeBlue, backRed, backGreen, backBlue uint16) (xproto.Cursor, error) {\n\n\tfontId, err := xproto.NewFontId(xu.Conn())\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tcursorId, err := xproto.NewCursorId(xu.Conn())\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\terr = xproto.OpenFontChecked(xu.Conn(), fontId,\n\t\tuint16(len(\"cursor\")), \"cursor\").Check()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\terr = xproto.CreateGlyphCursorChecked(xu.Conn(), cursorId, fontId, fontId,\n\t\tcursor, cursor+1,\n\t\tforeRed, foreGreen, foreBlue,\n\t\tbackRed, backGreen, backBlue).Check()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\terr = xproto.CloseFontChecked(xu.Conn(), fontId).Check()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn cursorId, nil\n}\n"
  },
  {
    "path": "xevent/callback.go",
    "content": "package xevent\n\n/*\n   Does all the plumbing to allow a simple callback interface for users.\n\n   This file is automatically generated using `scripts/write-events callbacks`.\n\n   Edit it at your peril.\n*/\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\ntype KeyPressFun func(xu *xgbutil.XUtil, event KeyPressEvent)\n\nfunc (callback KeyPressFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, KeyPress, win, callback)\n}\n\nfunc (callback KeyPressFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(KeyPressEvent))\n}\n\ntype KeyReleaseFun func(xu *xgbutil.XUtil, event KeyReleaseEvent)\n\nfunc (callback KeyReleaseFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, KeyRelease, win, callback)\n}\n\nfunc (callback KeyReleaseFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(KeyReleaseEvent))\n}\n\ntype ButtonPressFun func(xu *xgbutil.XUtil, event ButtonPressEvent)\n\nfunc (callback ButtonPressFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ButtonPress, win, callback)\n}\n\nfunc (callback ButtonPressFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ButtonPressEvent))\n}\n\ntype ButtonReleaseFun func(xu *xgbutil.XUtil, event ButtonReleaseEvent)\n\nfunc (callback ButtonReleaseFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ButtonRelease, win, callback)\n}\n\nfunc (callback ButtonReleaseFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ButtonReleaseEvent))\n}\n\ntype MotionNotifyFun func(xu *xgbutil.XUtil, event MotionNotifyEvent)\n\nfunc (callback MotionNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, MotionNotify, win, callback)\n}\n\nfunc (callback MotionNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(MotionNotifyEvent))\n}\n\ntype EnterNotifyFun func(xu *xgbutil.XUtil, event EnterNotifyEvent)\n\nfunc (callback EnterNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, EnterNotify, win, callback)\n}\n\nfunc (callback EnterNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(EnterNotifyEvent))\n}\n\ntype LeaveNotifyFun func(xu *xgbutil.XUtil, event LeaveNotifyEvent)\n\nfunc (callback LeaveNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, LeaveNotify, win, callback)\n}\n\nfunc (callback LeaveNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(LeaveNotifyEvent))\n}\n\ntype FocusInFun func(xu *xgbutil.XUtil, event FocusInEvent)\n\nfunc (callback FocusInFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, FocusIn, win, callback)\n}\n\nfunc (callback FocusInFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(FocusInEvent))\n}\n\ntype FocusOutFun func(xu *xgbutil.XUtil, event FocusOutEvent)\n\nfunc (callback FocusOutFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, FocusOut, win, callback)\n}\n\nfunc (callback FocusOutFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(FocusOutEvent))\n}\n\ntype KeymapNotifyFun func(xu *xgbutil.XUtil, event KeymapNotifyEvent)\n\nfunc (callback KeymapNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, KeymapNotify, win, callback)\n}\n\nfunc (callback KeymapNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(KeymapNotifyEvent))\n}\n\ntype ExposeFun func(xu *xgbutil.XUtil, event ExposeEvent)\n\nfunc (callback ExposeFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, Expose, win, callback)\n}\n\nfunc (callback ExposeFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ExposeEvent))\n}\n\ntype GraphicsExposureFun func(xu *xgbutil.XUtil, event GraphicsExposureEvent)\n\nfunc (callback GraphicsExposureFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, GraphicsExposure, win, callback)\n}\n\nfunc (callback GraphicsExposureFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(GraphicsExposureEvent))\n}\n\ntype NoExposureFun func(xu *xgbutil.XUtil, event NoExposureEvent)\n\nfunc (callback NoExposureFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, NoExposure, win, callback)\n}\n\nfunc (callback NoExposureFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(NoExposureEvent))\n}\n\ntype VisibilityNotifyFun func(xu *xgbutil.XUtil, event VisibilityNotifyEvent)\n\nfunc (callback VisibilityNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, VisibilityNotify, win, callback)\n}\n\nfunc (callback VisibilityNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(VisibilityNotifyEvent))\n}\n\ntype CreateNotifyFun func(xu *xgbutil.XUtil, event CreateNotifyEvent)\n\nfunc (callback CreateNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, CreateNotify, win, callback)\n}\n\nfunc (callback CreateNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(CreateNotifyEvent))\n}\n\ntype DestroyNotifyFun func(xu *xgbutil.XUtil, event DestroyNotifyEvent)\n\nfunc (callback DestroyNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, DestroyNotify, win, callback)\n}\n\nfunc (callback DestroyNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(DestroyNotifyEvent))\n}\n\ntype UnmapNotifyFun func(xu *xgbutil.XUtil, event UnmapNotifyEvent)\n\nfunc (callback UnmapNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, UnmapNotify, win, callback)\n}\n\nfunc (callback UnmapNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(UnmapNotifyEvent))\n}\n\ntype MapNotifyFun func(xu *xgbutil.XUtil, event MapNotifyEvent)\n\nfunc (callback MapNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, MapNotify, win, callback)\n}\n\nfunc (callback MapNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(MapNotifyEvent))\n}\n\ntype MapRequestFun func(xu *xgbutil.XUtil, event MapRequestEvent)\n\nfunc (callback MapRequestFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, MapRequest, win, callback)\n}\n\nfunc (callback MapRequestFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(MapRequestEvent))\n}\n\ntype ReparentNotifyFun func(xu *xgbutil.XUtil, event ReparentNotifyEvent)\n\nfunc (callback ReparentNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ReparentNotify, win, callback)\n}\n\nfunc (callback ReparentNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ReparentNotifyEvent))\n}\n\ntype ConfigureNotifyFun func(xu *xgbutil.XUtil, event ConfigureNotifyEvent)\n\nfunc (callback ConfigureNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ConfigureNotify, win, callback)\n}\n\nfunc (callback ConfigureNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ConfigureNotifyEvent))\n}\n\ntype ConfigureRequestFun func(xu *xgbutil.XUtil, event ConfigureRequestEvent)\n\nfunc (callback ConfigureRequestFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ConfigureRequest, win, callback)\n}\n\nfunc (callback ConfigureRequestFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ConfigureRequestEvent))\n}\n\ntype GravityNotifyFun func(xu *xgbutil.XUtil, event GravityNotifyEvent)\n\nfunc (callback GravityNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, GravityNotify, win, callback)\n}\n\nfunc (callback GravityNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(GravityNotifyEvent))\n}\n\ntype ResizeRequestFun func(xu *xgbutil.XUtil, event ResizeRequestEvent)\n\nfunc (callback ResizeRequestFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ResizeRequest, win, callback)\n}\n\nfunc (callback ResizeRequestFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ResizeRequestEvent))\n}\n\ntype CirculateNotifyFun func(xu *xgbutil.XUtil, event CirculateNotifyEvent)\n\nfunc (callback CirculateNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, CirculateNotify, win, callback)\n}\n\nfunc (callback CirculateNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(CirculateNotifyEvent))\n}\n\ntype CirculateRequestFun func(xu *xgbutil.XUtil, event CirculateRequestEvent)\n\nfunc (callback CirculateRequestFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, CirculateRequest, win, callback)\n}\n\nfunc (callback CirculateRequestFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(CirculateRequestEvent))\n}\n\ntype PropertyNotifyFun func(xu *xgbutil.XUtil, event PropertyNotifyEvent)\n\nfunc (callback PropertyNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, PropertyNotify, win, callback)\n}\n\nfunc (callback PropertyNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(PropertyNotifyEvent))\n}\n\ntype SelectionClearFun func(xu *xgbutil.XUtil, event SelectionClearEvent)\n\nfunc (callback SelectionClearFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, SelectionClear, win, callback)\n}\n\nfunc (callback SelectionClearFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(SelectionClearEvent))\n}\n\ntype SelectionRequestFun func(xu *xgbutil.XUtil, event SelectionRequestEvent)\n\nfunc (callback SelectionRequestFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, SelectionRequest, win, callback)\n}\n\nfunc (callback SelectionRequestFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(SelectionRequestEvent))\n}\n\ntype SelectionNotifyFun func(xu *xgbutil.XUtil, event SelectionNotifyEvent)\n\nfunc (callback SelectionNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, SelectionNotify, win, callback)\n}\n\nfunc (callback SelectionNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(SelectionNotifyEvent))\n}\n\ntype ColormapNotifyFun func(xu *xgbutil.XUtil, event ColormapNotifyEvent)\n\nfunc (callback ColormapNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ColormapNotify, win, callback)\n}\n\nfunc (callback ColormapNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ColormapNotifyEvent))\n}\n\ntype ClientMessageFun func(xu *xgbutil.XUtil, event ClientMessageEvent)\n\nfunc (callback ClientMessageFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ClientMessage, win, callback)\n}\n\nfunc (callback ClientMessageFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ClientMessageEvent))\n}\n\ntype MappingNotifyFun func(xu *xgbutil.XUtil, event MappingNotifyEvent)\n\nfunc (callback MappingNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, MappingNotify, win, callback)\n}\n\nfunc (callback MappingNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(MappingNotifyEvent))\n}\n\ntype ShapeNotifyFun func(xu *xgbutil.XUtil, event ShapeNotifyEvent)\n\nfunc (callback ShapeNotifyFun) Connect(xu *xgbutil.XUtil,\n\twin xproto.Window) {\n\tattachCallback(xu, ShapeNotify, win, callback)\n}\n\nfunc (callback ShapeNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {\n\tcallback(xu, event.(ShapeNotifyEvent))\n}\n"
  },
  {
    "path": "xevent/doc.go",
    "content": "/*\nPackage xevent provides an event handler interface for attaching callback\nfunctions to X events, and an implementation of an X event loop.\n\nThe X event loop\n\nOne of the biggest conveniences offered by xgbutil is its event handler system.\nThat is, the ability to attach an arbitrary callback function to any X event.\nIn order for such things to work, xgbutil needs to control the main X event\nloop and act as a dispatcher for all event handlers created by you.\n\nTo run the X event loop, use xevent.Main or xevent.MainPing. The former\nruns a normal event loop in the current goroutine and processes events. The\nlatter runs the event loop in a new goroutine and returns a pingBefore and\na pingAfter channel. The pingBefore channel is sent a benign value right before\nan event is dequeued, and the pingAfter channel is sent a benign value right\nafter after all callbacks for that event have finished execution. These\nsynchronization points in the main event loop can be combined with a 'select'\nstatement to process data from other input sources. An example of this is given\nin the documentation for the MainPing function. A complete example called\nmultiple-source-event-loop can also be found in the examples directory of the\nxgbutil package.\n\nTo quit the main event loop, you may use xevent.Quit, but there is nothing\ninherently wrong with stopping dead using os.Exit. xevent.Quit is provided for\nyour convenience should you need to run any clean-up code after the main event\nloop returns.\n\nThe X event queue\n\nxgbutil's event queue contains values that are either events or errors. (Never\nboth and never neither.) Namely, errors are received in the event loop from\nunchecked requests. (Errors generated by checked requests are guaranteed to be\nreturned to the caller and are never received in the event loop.) Also, a\ndefault error handler function can be set with xevent.ErrorHandlerSet.\n\nTo this end, xgbutil's event queue can be inspected. This is advantageous when\ninformation about what events will be processed in the future could be helpful\n(i.e., if there is an UnmapNotify event waiting to be processed.) The event\nqueue can also be manipulated to facilitate event compression. (Two events that\nare common candidates for compression are ConfigureNotify and MotionNotify.)\n\nDetach events\n\nWhenever a window can no longer receive events (i.e., when it is destroyed),\nall event handlers related to that window should be detached. (If this is\nomitted, then Go's garbage collector will not be able to reuse memory occupied\nby the now-unused event handlers for that window.) Moreover, its possible that\na window id can be reused after it has been discarded, which could result in\nodd behavior in your application.\n\nTo detach a window from all event handlers in the xevent package, use\nxevent.Detach. If you're also using the keybind and mousebind packages, you'll\nneed to call keybind.Detach and mousebind.Detach too. So to detach your window\nfrom all possible event handlers in xgbutil, use something like:\n\n\txevent.Detach(XUtilValue, your-window-id)\n\tkeybind.Detach(XUtilValue, your-window-id)\n\tmousebind.Detach(XUtilValue, your-window-id)\n\nQuick example\n\nA small example that shows how to respond to ConfigureNotify events sent to\nyour-window-id.\n\n\txevent.ConfigureNotifyFun(\n\t\tfunc(X *xgbutil.XUtil, e xevent.ConfigureNotifyEvent) {\n\t\t\tfmt.Printf(\"(%d, %d) %dx%d\\n\", e.X, e.Y, e.Width, e.Height)\n\t\t}).Connect(XUtilValue, your-window-id)\n\nMore examples\n\nThe xevent package is used in several of the examples in the examples directory\nin the xgbutil package.\n*/\npackage xevent\n"
  },
  {
    "path": "xevent/eventloop.go",
    "content": "package xevent\n\n/*\nxevent/eventloop.go contains code that implements a main X event loop.\n\nNamely, it provides facilities to read new events into xevent's event queue,\nrun a normal main event loop and run a main event loop that pings a channel\neach time an event is about to be dequeued. The latter facility allows one to\neasily include other input sources for processing in a program's main event\nloop.\n*/\n\nimport (\n\t\"github.com/BurntSushi/xgb/shape\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// Read reads one or more events and queues them in XUtil.\n// If 'block' is True, then call 'WaitForEvent' before sucking up\n// all events that have been queued by XGB.\nfunc Read(xu *xgbutil.XUtil, block bool) {\n\tif block {\n\t\tev, err := xu.Conn().WaitForEvent()\n\t\tif ev == nil && err == nil {\n\t\t\txgbutil.Logger.Fatal(\"BUG: Could not read an event or an error.\")\n\t\t}\n\t\tEnqueue(xu, ev, err)\n\t}\n\n\t// Clean up anything that's in the queue\n\tfor {\n\t\tev, err := xu.Conn().PollForEvent()\n\n\t\t// No events left...\n\t\tif ev == nil && err == nil {\n\t\t\tbreak\n\t\t}\n\n\t\t// We're good, queue it up\n\t\tEnqueue(xu, ev, err)\n\t}\n}\n\n// Main starts the main X event loop. It will read events and call appropriate\n// callback functions.\n// N.B. If you have multiple X connections in the same program, you should be\n// able to run this in different goroutines concurrently. However, only\n// *one* of these should run for *each* connection.\nfunc Main(xu *xgbutil.XUtil) {\n\tmainEventLoop(xu, nil, nil, nil)\n}\n\n// MainPing starts the main X event loop, and returns three \"ping\" channels:\n// the first is pinged before an event is dequeued, the second is pinged\n// after all callbacks for a particular event have been called and the last\n// is pinged when the event loop stops (e.g., after a call to xevent.Quit).\n// pingAfter channel.\n//\n// This is useful if your event loop needs to draw from other sources. e.g.,\n//\n//\tpingBefore, pingAfter, pingQuit := xevent.MainPing()\n//\tfor {\n//\t\tselect {\n//\t\tcase <-pingBefore:\n//\t\t\t// Wait for event processing to finish.\n//\t\t\t<-pingAfter\n//\t\tcase val <- someOtherChannel:\n//\t\t\t// do some work with val\n//\t\tcase <-pingQuit:\n//\t\t\tfmt.Printf(\"xevent loop has quit\")\n//\t\t\treturn\n//\t\t}\n//\t}\n//\n// Note that an unbuffered channel is returned, which implies that any work\n// done with 'val' will delay further X event processing.\n//\n// A complete example using MainPing can be found in the examples directory in\n// the xgbutil package under the name multiple-source-event-loop.\nfunc MainPing(xu *xgbutil.XUtil) (chan struct{}, chan struct{}, chan struct{}) {\n\tpingBefore := make(chan struct{}, 0)\n\tpingAfter := make(chan struct{}, 0)\n\tpingQuit := make(chan struct{}, 0)\n\tgo func() {\n\t\tmainEventLoop(xu, pingBefore, pingAfter, pingQuit)\n\t}()\n\treturn pingBefore, pingAfter, pingQuit\n}\n\n// mainEventLoop runs the main event loop with an optional ping channel.\nfunc mainEventLoop(xu *xgbutil.XUtil,\n\tpingBefore, pingAfter, pingQuit chan struct{}) {\n\tfor {\n\t\tif Quitting(xu) {\n\t\t\tif pingQuit != nil {\n\t\t\t\tpingQuit <- struct{}{}\n\t\t\t}\n\t\t\tbreak\n\t\t}\n\n\t\t// Gobble up as many events as possible (into the queue).\n\t\t// If there are no events, we block.\n\t\tRead(xu, true)\n\n\t\t// Now process every event/error in the queue.\n\t\tprocessEventQueue(xu, pingBefore, pingAfter)\n\t}\n}\n\n// processEventQueue processes every item in the event/error queue.\nfunc processEventQueue(xu *xgbutil.XUtil, pingBefore, pingAfter chan struct{}) {\n\tfor !Empty(xu) {\n\t\tif Quitting(xu) {\n\t\t\treturn\n\t\t}\n\n\t\t// We send the ping *before* the next event is dequeued.\n\t\t// This is so the queue doesn't present a misrepresentation of which\n\t\t// events haven't been processed yet.\n\t\tif pingBefore != nil && pingAfter != nil {\n\t\t\tpingBefore <- struct{}{}\n\t\t}\n\t\tev, err := Dequeue(xu)\n\n\t\t// If we gobbled up an error, send it to the error event handler\n\t\t// and move on the next event/error.\n\t\tif err != nil {\n\t\t\tErrorHandlerGet(xu)(err)\n\t\t\tif pingBefore != nil && pingAfter != nil {\n\t\t\t\tpingAfter <- struct{}{}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t// We know there isn't an error. If there isn't an event either,\n\t\t// then there's a bug somewhere.\n\t\tif ev == nil {\n\t\t\txgbutil.Logger.Fatal(\"BUG: Expected an event but got nil.\")\n\t\t}\n\n\t\thooks := getHooks(xu)\n\t\tfor _, hook := range hooks {\n\t\t\tif !hook.Run(xu, ev) {\n\t\t\t\tgoto END\n\t\t\t}\n\t\t}\n\n\t\tswitch event := ev.(type) {\n\t\tcase xproto.KeyPressEvent:\n\t\t\te := KeyPressEvent{&event}\n\n\t\t\t// If we're redirecting key events, this is the place to do it!\n\t\t\tif wid := RedirectKeyGet(xu); wid > 0 {\n\t\t\t\te.Event = wid\n\t\t\t}\n\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, KeyPress, e.Event)\n\t\tcase xproto.KeyReleaseEvent:\n\t\t\te := KeyReleaseEvent{&event}\n\n\t\t\t// If we're redirecting key events, this is the place to do it!\n\t\t\tif wid := RedirectKeyGet(xu); wid > 0 {\n\t\t\t\te.Event = wid\n\t\t\t}\n\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, KeyRelease, e.Event)\n\t\tcase xproto.ButtonPressEvent:\n\t\t\te := ButtonPressEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, ButtonPress, e.Event)\n\t\tcase xproto.ButtonReleaseEvent:\n\t\t\te := ButtonReleaseEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, ButtonRelease, e.Event)\n\t\tcase xproto.MotionNotifyEvent:\n\t\t\te := MotionNotifyEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, MotionNotify, e.Event)\n\t\tcase xproto.EnterNotifyEvent:\n\t\t\te := EnterNotifyEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, EnterNotify, e.Event)\n\t\tcase xproto.LeaveNotifyEvent:\n\t\t\te := LeaveNotifyEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, LeaveNotify, e.Event)\n\t\tcase xproto.FocusInEvent:\n\t\t\te := FocusInEvent{&event}\n\t\t\trunCallbacks(xu, e, FocusIn, e.Event)\n\t\tcase xproto.FocusOutEvent:\n\t\t\te := FocusOutEvent{&event}\n\t\t\trunCallbacks(xu, e, FocusOut, e.Event)\n\t\tcase xproto.KeymapNotifyEvent:\n\t\t\te := KeymapNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, KeymapNotify, NoWindow)\n\t\tcase xproto.ExposeEvent:\n\t\t\te := ExposeEvent{&event}\n\t\t\trunCallbacks(xu, e, Expose, e.Window)\n\t\tcase xproto.GraphicsExposureEvent:\n\t\t\te := GraphicsExposureEvent{&event}\n\t\t\trunCallbacks(xu, e, GraphicsExposure, xproto.Window(e.Drawable))\n\t\tcase xproto.NoExposureEvent:\n\t\t\te := NoExposureEvent{&event}\n\t\t\trunCallbacks(xu, e, NoExposure, xproto.Window(e.Drawable))\n\t\tcase xproto.VisibilityNotifyEvent:\n\t\t\te := VisibilityNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, VisibilityNotify, e.Window)\n\t\tcase xproto.CreateNotifyEvent:\n\t\t\te := CreateNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, CreateNotify, e.Parent)\n\t\tcase xproto.DestroyNotifyEvent:\n\t\t\te := DestroyNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, DestroyNotify, e.Window)\n\t\tcase xproto.UnmapNotifyEvent:\n\t\t\te := UnmapNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, UnmapNotify, e.Window)\n\t\tcase xproto.MapNotifyEvent:\n\t\t\te := MapNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, MapNotify, e.Event)\n\t\tcase xproto.MapRequestEvent:\n\t\t\te := MapRequestEvent{&event}\n\t\t\trunCallbacks(xu, e, MapRequest, e.Window)\n\t\t\trunCallbacks(xu, e, MapRequest, e.Parent)\n\t\tcase xproto.ReparentNotifyEvent:\n\t\t\te := ReparentNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, ReparentNotify, e.Window)\n\t\tcase xproto.ConfigureNotifyEvent:\n\t\t\te := ConfigureNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, ConfigureNotify, e.Window)\n\t\tcase xproto.ConfigureRequestEvent:\n\t\t\te := ConfigureRequestEvent{&event}\n\t\t\trunCallbacks(xu, e, ConfigureRequest, e.Window)\n\t\t\trunCallbacks(xu, e, ConfigureRequest, e.Parent)\n\t\tcase xproto.GravityNotifyEvent:\n\t\t\te := GravityNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, GravityNotify, e.Window)\n\t\tcase xproto.ResizeRequestEvent:\n\t\t\te := ResizeRequestEvent{&event}\n\t\t\trunCallbacks(xu, e, ResizeRequest, e.Window)\n\t\tcase xproto.CirculateNotifyEvent:\n\t\t\te := CirculateNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, CirculateNotify, e.Window)\n\t\tcase xproto.CirculateRequestEvent:\n\t\t\te := CirculateRequestEvent{&event}\n\t\t\trunCallbacks(xu, e, CirculateRequest, e.Window)\n\t\tcase xproto.PropertyNotifyEvent:\n\t\t\te := PropertyNotifyEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, PropertyNotify, e.Window)\n\t\tcase xproto.SelectionClearEvent:\n\t\t\te := SelectionClearEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, SelectionClear, e.Owner)\n\t\tcase xproto.SelectionRequestEvent:\n\t\t\te := SelectionRequestEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, SelectionRequest, e.Requestor)\n\t\tcase xproto.SelectionNotifyEvent:\n\t\t\te := SelectionNotifyEvent{&event}\n\t\t\txu.TimeSet(e.Time)\n\t\t\trunCallbacks(xu, e, SelectionNotify, e.Requestor)\n\t\tcase xproto.ColormapNotifyEvent:\n\t\t\te := ColormapNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, ColormapNotify, e.Window)\n\t\tcase xproto.ClientMessageEvent:\n\t\t\te := ClientMessageEvent{&event}\n\t\t\trunCallbacks(xu, e, ClientMessage, e.Window)\n\t\tcase xproto.MappingNotifyEvent:\n\t\t\te := MappingNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, MappingNotify, NoWindow)\n\t\tcase shape.NotifyEvent:\n\t\t\te := ShapeNotifyEvent{&event}\n\t\t\trunCallbacks(xu, e, ShapeNotify, e.AffectedWindow)\n\t\tdefault:\n\t\t\tif event != nil {\n\t\t\t\txgbutil.Logger.Printf(\"ERROR: UNSUPPORTED EVENT TYPE: %T\",\n\t\t\t\t\tevent)\n\t\t\t}\n\t\t}\n\n\tEND:\n\n\t\tif pingBefore != nil && pingAfter != nil {\n\t\t\tpingAfter <- struct{}{}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "xevent/types_auto.go",
    "content": "package xevent\n\n/*\n   Defines event types and their associated methods automatically.\n\n   This file is automatically generated using `scripts/write-events evtypes`.\n\n   Edit it at your peril.\n*/\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/shape\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n)\n\ntype KeyPressEvent struct {\n\t*xproto.KeyPressEvent\n}\n\nconst KeyPress = xproto.KeyPress\n\nfunc (ev KeyPressEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.KeyPressEvent)\n}\n\ntype KeyReleaseEvent struct {\n\t*xproto.KeyReleaseEvent\n}\n\nconst KeyRelease = xproto.KeyRelease\n\nfunc (ev KeyReleaseEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.KeyReleaseEvent)\n}\n\ntype ButtonPressEvent struct {\n\t*xproto.ButtonPressEvent\n}\n\nconst ButtonPress = xproto.ButtonPress\n\nfunc (ev ButtonPressEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ButtonPressEvent)\n}\n\ntype ButtonReleaseEvent struct {\n\t*xproto.ButtonReleaseEvent\n}\n\nconst ButtonRelease = xproto.ButtonRelease\n\nfunc (ev ButtonReleaseEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ButtonReleaseEvent)\n}\n\ntype MotionNotifyEvent struct {\n\t*xproto.MotionNotifyEvent\n}\n\nconst MotionNotify = xproto.MotionNotify\n\nfunc (ev MotionNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.MotionNotifyEvent)\n}\n\ntype EnterNotifyEvent struct {\n\t*xproto.EnterNotifyEvent\n}\n\nconst EnterNotify = xproto.EnterNotify\n\nfunc (ev EnterNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.EnterNotifyEvent)\n}\n\ntype LeaveNotifyEvent struct {\n\t*xproto.LeaveNotifyEvent\n}\n\nconst LeaveNotify = xproto.LeaveNotify\n\nfunc (ev LeaveNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.LeaveNotifyEvent)\n}\n\ntype FocusInEvent struct {\n\t*xproto.FocusInEvent\n}\n\nconst FocusIn = xproto.FocusIn\n\nfunc (ev FocusInEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.FocusInEvent)\n}\n\ntype FocusOutEvent struct {\n\t*xproto.FocusOutEvent\n}\n\nconst FocusOut = xproto.FocusOut\n\nfunc (ev FocusOutEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.FocusOutEvent)\n}\n\ntype KeymapNotifyEvent struct {\n\t*xproto.KeymapNotifyEvent\n}\n\nconst KeymapNotify = xproto.KeymapNotify\n\nfunc (ev KeymapNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.KeymapNotifyEvent)\n}\n\ntype ExposeEvent struct {\n\t*xproto.ExposeEvent\n}\n\nconst Expose = xproto.Expose\n\nfunc (ev ExposeEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ExposeEvent)\n}\n\ntype GraphicsExposureEvent struct {\n\t*xproto.GraphicsExposureEvent\n}\n\nconst GraphicsExposure = xproto.GraphicsExposure\n\nfunc (ev GraphicsExposureEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.GraphicsExposureEvent)\n}\n\ntype NoExposureEvent struct {\n\t*xproto.NoExposureEvent\n}\n\nconst NoExposure = xproto.NoExposure\n\nfunc (ev NoExposureEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.NoExposureEvent)\n}\n\ntype VisibilityNotifyEvent struct {\n\t*xproto.VisibilityNotifyEvent\n}\n\nconst VisibilityNotify = xproto.VisibilityNotify\n\nfunc (ev VisibilityNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.VisibilityNotifyEvent)\n}\n\ntype CreateNotifyEvent struct {\n\t*xproto.CreateNotifyEvent\n}\n\nconst CreateNotify = xproto.CreateNotify\n\nfunc (ev CreateNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.CreateNotifyEvent)\n}\n\ntype DestroyNotifyEvent struct {\n\t*xproto.DestroyNotifyEvent\n}\n\nconst DestroyNotify = xproto.DestroyNotify\n\nfunc (ev DestroyNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.DestroyNotifyEvent)\n}\n\ntype UnmapNotifyEvent struct {\n\t*xproto.UnmapNotifyEvent\n}\n\nconst UnmapNotify = xproto.UnmapNotify\n\nfunc (ev UnmapNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.UnmapNotifyEvent)\n}\n\ntype MapNotifyEvent struct {\n\t*xproto.MapNotifyEvent\n}\n\nconst MapNotify = xproto.MapNotify\n\nfunc (ev MapNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.MapNotifyEvent)\n}\n\ntype MapRequestEvent struct {\n\t*xproto.MapRequestEvent\n}\n\nconst MapRequest = xproto.MapRequest\n\nfunc (ev MapRequestEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.MapRequestEvent)\n}\n\ntype ReparentNotifyEvent struct {\n\t*xproto.ReparentNotifyEvent\n}\n\nconst ReparentNotify = xproto.ReparentNotify\n\nfunc (ev ReparentNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ReparentNotifyEvent)\n}\n\ntype ConfigureRequestEvent struct {\n\t*xproto.ConfigureRequestEvent\n}\n\nconst ConfigureRequest = xproto.ConfigureRequest\n\nfunc (ev ConfigureRequestEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ConfigureRequestEvent)\n}\n\ntype GravityNotifyEvent struct {\n\t*xproto.GravityNotifyEvent\n}\n\nconst GravityNotify = xproto.GravityNotify\n\nfunc (ev GravityNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.GravityNotifyEvent)\n}\n\ntype ResizeRequestEvent struct {\n\t*xproto.ResizeRequestEvent\n}\n\nconst ResizeRequest = xproto.ResizeRequest\n\nfunc (ev ResizeRequestEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ResizeRequestEvent)\n}\n\ntype CirculateNotifyEvent struct {\n\t*xproto.CirculateNotifyEvent\n}\n\nconst CirculateNotify = xproto.CirculateNotify\n\nfunc (ev CirculateNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.CirculateNotifyEvent)\n}\n\ntype CirculateRequestEvent struct {\n\t*xproto.CirculateRequestEvent\n}\n\nconst CirculateRequest = xproto.CirculateRequest\n\nfunc (ev CirculateRequestEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.CirculateRequestEvent)\n}\n\ntype PropertyNotifyEvent struct {\n\t*xproto.PropertyNotifyEvent\n}\n\nconst PropertyNotify = xproto.PropertyNotify\n\nfunc (ev PropertyNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.PropertyNotifyEvent)\n}\n\ntype SelectionClearEvent struct {\n\t*xproto.SelectionClearEvent\n}\n\nconst SelectionClear = xproto.SelectionClear\n\nfunc (ev SelectionClearEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.SelectionClearEvent)\n}\n\ntype SelectionRequestEvent struct {\n\t*xproto.SelectionRequestEvent\n}\n\nconst SelectionRequest = xproto.SelectionRequest\n\nfunc (ev SelectionRequestEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.SelectionRequestEvent)\n}\n\ntype SelectionNotifyEvent struct {\n\t*xproto.SelectionNotifyEvent\n}\n\nconst SelectionNotify = xproto.SelectionNotify\n\nfunc (ev SelectionNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.SelectionNotifyEvent)\n}\n\ntype ColormapNotifyEvent struct {\n\t*xproto.ColormapNotifyEvent\n}\n\nconst ColormapNotify = xproto.ColormapNotify\n\nfunc (ev ColormapNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.ColormapNotifyEvent)\n}\n\ntype MappingNotifyEvent struct {\n\t*xproto.MappingNotifyEvent\n}\n\nconst MappingNotify = xproto.MappingNotify\n\nfunc (ev MappingNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.MappingNotifyEvent)\n}\n\ntype ShapeNotifyEvent struct {\n\t*shape.NotifyEvent\n}\n\nconst ShapeNotify = shape.Notify\n\nfunc (ev ShapeNotifyEvent) String() string {\n\treturn fmt.Sprintf(\"%v\", ev.NotifyEvent)\n}\n"
  },
  {
    "path": "xevent/types_manual.go",
    "content": "package xevent\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n)\n\n// ClientMessageEvent embeds the struct by the same name from the xgb library.\ntype ClientMessageEvent struct {\n\t*xproto.ClientMessageEvent\n}\n\nconst ClientMessage = xproto.ClientMessage\n\n// NewClientMessage takes all arguments required to build a ClientMessageEvent\n// struct and hides the messy details.\n// The variadic parameters coincide with the \"data\" part of a client message.\n// The type of the variadic parameters depends upon the value of Format.\n// If Format is 8, 'data' should have type byte.\n// If Format is 16, 'data' should have type int16.\n// If Format is 32, 'data' should have type int.\n// Any other value of Format returns an error.\nfunc NewClientMessage(Format byte, Window xproto.Window, Type xproto.Atom,\n\tdata ...interface{}) (*ClientMessageEvent, error) {\n\n\t// Create the client data list first\n\tvar clientData xproto.ClientMessageDataUnion\n\n\t// Don't support formats 8 or 16 yet. They aren't used in EWMH anyway.\n\tswitch Format {\n\tcase 8:\n\t\tbuf := make([]byte, 20)\n\t\tfor i := 0; i < 20; i++ {\n\t\t\tif i >= len(data) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbuf[i] = data[i].(byte)\n\t\t}\n\t\tclientData = xproto.ClientMessageDataUnionData8New(buf)\n\tcase 16:\n\t\tbuf := make([]uint16, 10)\n\t\tfor i := 0; i < 10; i++ {\n\t\t\tif i >= len(data) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbuf[i] = uint16(data[i].(int16))\n\t\t}\n\t\tclientData = xproto.ClientMessageDataUnionData16New(buf)\n\tcase 32:\n\t\tbuf := make([]uint32, 5)\n\t\tfor i := 0; i < 5; i++ {\n\t\t\tif i >= len(data) {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tbuf[i] = uint32(data[i].(int))\n\t\t}\n\t\tclientData = xproto.ClientMessageDataUnionData32New(buf)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"NewClientMessage: Unsupported format '%d'.\",\n\t\t\tFormat)\n\t}\n\n\treturn &ClientMessageEvent{&xproto.ClientMessageEvent{\n\t\tFormat: Format,\n\t\tWindow: Window,\n\t\tType:   Type,\n\t\tData:   clientData,\n\t}}, nil\n}\n\n// ConfigureNotifyEvent embeds the struct by the same name in XGB.\ntype ConfigureNotifyEvent struct {\n\t*xproto.ConfigureNotifyEvent\n}\n\nconst ConfigureNotify = xproto.ConfigureNotify\n\n// NewConfigureNotify takes all arguments required to build a\n// ConfigureNotifyEvent struct and returns a ConfigureNotifyEvent value.\nfunc NewConfigureNotify(Event, Window, AboveSibling xproto.Window,\n\tX, Y, Width, Height int, BorderWidth uint16,\n\tOverrideRedirect bool) *ConfigureNotifyEvent {\n\n\treturn &ConfigureNotifyEvent{&xproto.ConfigureNotifyEvent{\n\t\tEvent: Event, Window: Window, AboveSibling: AboveSibling,\n\t\tX: int16(X), Y: int16(Y), Width: uint16(Width), Height: uint16(Height),\n\t\tBorderWidth: BorderWidth, OverrideRedirect: OverrideRedirect,\n\t}}\n}\n"
  },
  {
    "path": "xevent/xevent.go",
    "content": "package xevent\n\nimport (\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// Sometimes we need to specify NO WINDOW when a window is typically\n// expected. (Like connecting to MappingNotify or KeymapNotify events.)\n// Use this value to do that.\nvar NoWindow xproto.Window = 0\n\n// IgnoreMods is a list of X modifiers that we don't want interfering\n// with our mouse or key bindings. In particular, for each mouse or key binding\n// issued, there is a seperate mouse or key binding made for each of the\n// modifiers specified.\n//\n// You may modify this slice to add (or remove) modifiers, but it should be\n// done before *any* key or mouse bindings are attached with the keybind and\n// mousebind packages. It should not be modified afterwards.\n//\n// TODO: We're assuming numlock is in the 'mod2' modifier, which is a pretty\n// common setup, but by no means guaranteed. This should be modified to actually\n// inspect the modifiers table and look for the special Num_Lock keysym.\nvar IgnoreMods []uint16 = []uint16{\n\t0,\n\txproto.ModMaskLock,                   // Caps lock\n\txproto.ModMask2,                      // Num lock\n\txproto.ModMaskLock | xproto.ModMask2, // Caps and Num lock\n}\n\n// Enqueue queues up an event read from X.\n// Note that an event read may return an error, in which case, this queue\n// entry will be an error and not an event.\n//\n//\tev, err := XUtilValue.Conn().WaitForEvent()\n//\txevent.Enqueue(XUtilValue, ev, err)\n//\n// You probably shouldn't have to enqueue events yourself. This is done\n// automatically if you're using xevent.Main{Ping} and/or xevent.Read.\nfunc Enqueue(xu *xgbutil.XUtil, ev xgb.Event, err xgb.Error) {\n\txu.EvqueueLck.Lock()\n\tdefer xu.EvqueueLck.Unlock()\n\n\txu.Evqueue = append(xu.Evqueue, xgbutil.EventOrError{\n\t\tEvent: ev,\n\t\tErr:   err,\n\t})\n}\n\n// Dequeue pops an event/error from the queue and returns it.\n// The queue item is unwrapped and returned as multiple return values.\n// Only one of the return values can be nil.\nfunc Dequeue(xu *xgbutil.XUtil) (xgb.Event, xgb.Error) {\n\txu.EvqueueLck.Lock()\n\tdefer xu.EvqueueLck.Unlock()\n\n\teverr := xu.Evqueue[0]\n\txu.Evqueue = xu.Evqueue[1:]\n\treturn everr.Event, everr.Err\n}\n\n// DequeueAt removes a particular item from the queue.\n// This is primarily useful when attempting to compress events.\nfunc DequeueAt(xu *xgbutil.XUtil, i int) {\n\txu.EvqueueLck.Lock()\n\tdefer xu.EvqueueLck.Unlock()\n\n\txu.Evqueue = append(xu.Evqueue[:i], xu.Evqueue[i+1:]...)\n}\n\n// Empty returns whether the event queue is empty or not.\nfunc Empty(xu *xgbutil.XUtil) bool {\n\txu.EvqueueLck.RLock()\n\tdefer xu.EvqueueLck.RUnlock()\n\n\treturn len(xu.Evqueue) == 0\n}\n\n// Peek returns a *copy* of the current queue so we can examine it.\n// This can be useful when trying to determine if a particular kind of\n// event will be processed in the future.\nfunc Peek(xu *xgbutil.XUtil) []xgbutil.EventOrError {\n\txu.EvqueueLck.RLock()\n\tdefer xu.EvqueueLck.RUnlock()\n\n\tcpy := make([]xgbutil.EventOrError, len(xu.Evqueue))\n\tcopy(cpy, xu.Evqueue)\n\treturn cpy\n}\n\n// ErrorHandlerSet sets the default error handler for errors that come\n// into the main event loop. (This may be removed in the future in favor\n// of a particular callback interface like events, but these sorts of errors\n// aren't handled often in practice, so maybe not.)\n// This is only called for errors returned from unchecked (asynchronous error\n// handling) requests.\n// The default error handler just emits them to stderr.\nfunc ErrorHandlerSet(xu *xgbutil.XUtil, fun xgbutil.ErrorHandlerFun) {\n\txu.ErrorHandler = fun\n}\n\n// ErrorHandlerGet retrieves the default error handler.\nfunc ErrorHandlerGet(xu *xgbutil.XUtil) xgbutil.ErrorHandlerFun {\n\treturn xu.ErrorHandler\n}\n\ntype HookFun func(xu *xgbutil.XUtil, event interface{}) bool\n\nfunc (callback HookFun) Connect(xu *xgbutil.XUtil) {\n\txu.HooksLck.Lock()\n\tdefer xu.HooksLck.Unlock()\n\n\t// COW\n\tnewHooks := make([]xgbutil.CallbackHook, len(xu.Hooks))\n\tcopy(newHooks, xu.Hooks)\n\tnewHooks = append(newHooks, callback)\n\n\txu.Hooks = newHooks\n}\n\nfunc (callback HookFun) Run(xu *xgbutil.XUtil, event interface{}) bool {\n\treturn callback(xu, event)\n}\n\nfunc getHooks(xu *xgbutil.XUtil) []xgbutil.CallbackHook {\n\txu.HooksLck.RLock()\n\tdefer xu.HooksLck.RUnlock()\n\n\treturn xu.Hooks\n}\n\n// RedirectKeyEvents, when set to a window id (greater than 0), will force\n// *all* Key{Press,Release} to callbacks attached to the specified window.\n// This is close to emulating a Keyboard grab without the racing.\n// To stop redirecting key events, use window identifier '0'.\nfunc RedirectKeyEvents(xu *xgbutil.XUtil, wid xproto.Window) {\n\txu.KeyRedirect = wid\n}\n\n// RedirectKeyGet gets the window that key events are being redirected to.\n// If 0, then no redirection occurs.\nfunc RedirectKeyGet(xu *xgbutil.XUtil) xproto.Window {\n\treturn xu.KeyRedirect\n}\n\n// Quit elegantly exits out of the main event loop.\n// \"Elegantly\" in this case means that it finishes processing the current\n// event, and breaks out of the loop afterwards.\n// There is no particular reason to use this instead of something like os.Exit\n// other than you might have code to run after the main event loop exits to\n// \"clean up.\"\nfunc Quit(xu *xgbutil.XUtil) {\n\txu.Quit = true\n}\n\n// Quitting returns whether it's time to quit.\n// This is only used in the main event loop in xevent.\nfunc Quitting(xu *xgbutil.XUtil) bool {\n\treturn xu.Quit\n}\n\n// attachCallback associates a (event, window) tuple with an event.\n// Use copy on write since we run callbacks *a lot* more than attaching them.\n// (The copy on write only applies to the slice of callbacks rather than\n// the map itself, since the initial allocation is guaranteed to come before\n// any use of it.)\nfunc attachCallback(xu *xgbutil.XUtil, evtype int, win xproto.Window,\n\tfun xgbutil.Callback) {\n\n\txu.CallbacksLck.Lock()\n\tdefer xu.CallbacksLck.Unlock()\n\n\tif _, ok := xu.Callbacks[evtype]; !ok {\n\t\txu.Callbacks[evtype] = make(map[xproto.Window][]xgbutil.Callback, 20)\n\t}\n\tif _, ok := xu.Callbacks[evtype][win]; !ok {\n\t\txu.Callbacks[evtype][win] = make([]xgbutil.Callback, 0)\n\t}\n\n\t// COW\n\tnewCallbacks := make([]xgbutil.Callback, len(xu.Callbacks[evtype][win]))\n\tcopy(newCallbacks, xu.Callbacks[evtype][win])\n\tnewCallbacks = append(newCallbacks, fun)\n\txu.Callbacks[evtype][win] = newCallbacks\n}\n\n// runCallbacks executes every callback corresponding to a\n// particular event/window tuple.\nfunc runCallbacks(xu *xgbutil.XUtil, event interface{}, evtype int,\n\twin xproto.Window) {\n\n\t// The callback slice for a particular (event type, window) tuple uses\n\t// copy on write. So just take a pointer to whatever is there and use that.\n\t// We can be sure that the slice won't change from underneathe us.\n\txu.CallbacksLck.RLock()\n\tcbs := xu.Callbacks[evtype][win]\n\txu.CallbacksLck.RUnlock()\n\n\tfor _, cb := range cbs {\n\t\tcb.Run(xu, event)\n\t}\n}\n\n// Detach removes all callbacks associated with a particular window.\n// Note that if you're also using the keybind and mousebind packages, a complete\n// detachment should look like:\n//\n//\tkeybind.Detach(XUtilValue, window-id)\n//\tmousebind.Detach(XUtilValue, window-id)\n//\txevent.Detach(XUtilValue, window-id)\n//\n// If a window is no longer receiving events, these methods should be called.\n// Otherwise, the memory used to store the handler info for that window will\n// never be released.\nfunc Detach(xu *xgbutil.XUtil, win xproto.Window) {\n\txu.CallbacksLck.Lock()\n\tdefer xu.CallbacksLck.Unlock()\n\n\tfor evtype, _ := range xu.Callbacks {\n\t\tdelete(xu.Callbacks[evtype], win)\n\t}\n}\n\n// SendRootEvent takes a type implementing the xgb.Event interface, converts it\n// to raw X bytes, and sends it to the root window using the SendEvent request.\nfunc SendRootEvent(xu *xgbutil.XUtil, ev xgb.Event, evMask uint32) error {\n\treturn xproto.SendEventChecked(xu.Conn(), false, xu.RootWin(), evMask,\n\t\tstring(ev.Bytes())).Check()\n}\n\n// ReplayPointer is a quick alias to AllowEvents with 'ReplayPointer' mode.\nfunc ReplayPointer(xu *xgbutil.XUtil) {\n\txproto.AllowEvents(xu.Conn(), xproto.AllowReplayPointer, 0)\n}\n"
  },
  {
    "path": "xgbutil.go",
    "content": "package xgbutil\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xinerama\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n)\n\n// Logger is used through xgbutil when messages need to be emitted to stderr.\nvar Logger = log.New(os.Stderr, \"[xgbutil] \", log.Lshortfile)\n\n// The current maximum request size. I think we can expand this with\n// BigReq, but it probably isn't worth it at the moment.\nconst MaxReqSize = (1 << 16) * 4\n\n// An XUtil represents the state of xgbutil. It keeps track of the current\n// X connection, the root window, event callbacks, key/mouse bindings, etc.\n// Regrettably, many of the members are exported, even though they should not\n// be used directly by the user. They are exported for use in sub-packages.\n// (Namely, xevent, keybind and mousebind.) In fact, there should *never*\n// be a reason to access any members of an XUtil value directly. Any\n// interaction with an XUtil value should be through its methods.\ntype XUtil struct {\n\t// conn is the XGB connection object used to issue protocol requests.\n\tconn *xgb.Conn\n\n\t// Quit can be set to true, and the main event loop will finish processing\n\t// the current event, and gracefully quit afterwards.\n\t// This is exported for use in the xevent package. Please us xevent.Quit\n\t// to set this value.\n\tQuit bool // when true, the main event loop will stop gracefully\n\n\t// setup contains all the setup information retrieved at connection time.\n\tsetup *xproto.SetupInfo\n\n\t// screen is a simple alias to the default screen info.\n\tscreen *xproto.ScreenInfo\n\n\t// root is an alias to the default root window.\n\troot xproto.Window\n\n\t// Atoms is a cache of atom names to resource identifiers. This minimizes\n\t// round trips to the X server, since atom identifiers never change.\n\t// It is exported for use in the xprop package. It should not be used.\n\tAtoms    map[string]xproto.Atom\n\tAtomsLck *sync.RWMutex\n\n\t// AtomNames is a cache just like 'atoms', but in the reverse direction.\n\t// It is exported for use in the xprop package. It should not be used.\n\tAtomNames    map[xproto.Atom]string\n\tAtomNamesLck *sync.RWMutex\n\n\t// Evqueue is the queue that stores the results of xgb.WaitForEvent.\n\t// Namely, each value is either an Event *or* an Error.\n\t// It is exported for use in the xevent package. Do not use it.\n\t// If you need to interact with the event queue, please use the functions\n\t// available in the xevent package: Dequeue, DequeueAt, QueueEmpty\n\t// and QueuePeek.\n\tEvqueue    []EventOrError\n\tEvqueueLck *sync.RWMutex\n\n\t// Callbacks is a map of event numbers to a map of window identifiers\n\t// to callback functions.\n\t// This is the data structure that stores all callback functions, where\n\t// a callback function is always attached to a (event, window) tuple.\n\t// It is exported for use in the xevent package. Do not use it.\n\tCallbacks    map[int]map[xproto.Window][]Callback\n\tCallbacksLck *sync.RWMutex\n\n\t// Hooks are called by the XEvent main loop before processing the event\n\t// itself. These are meant for instances when it's not possible / easy\n\t// to use the normal Hook system. You should not modify this yourself.\n\tHooks    []CallbackHook\n\tHooksLck *sync.RWMutex\n\n\t// eventTime is the last time recorded by an event. It is automatically\n\t// updated if xgbutil's main event loop is used.\n\teventTime xproto.Timestamp\n\n\t// Keymap corresponds to xgbutil's current conception of the keyboard\n\t// mapping. It is automatically kept up-to-date if xgbutil's event loop\n\t// is used.\n\t// It is exported for use in the keybind package. It should not be\n\t// accessed directly. Instead, use keybind.KeyMapGet.\n\tKeymap *KeyboardMapping\n\n\t// Modmap corresponds to xgbutil's current conception of the modifier key\n\t// mapping. It is automatically kept up-to-date if xgbutil's event loop\n\t// is used.\n\t// It is exported for use in the keybind package. It should not be\n\t// accessed directly. Instead, use keybind.ModMapGet.\n\tModmap *ModifierMapping\n\n\t// KeyRedirect corresponds to a window identifier that, when set,\n\t// automatically receives *all* keyboard events. This is a sort-of\n\t// synthetic grab and is helpful in avoiding race conditions.\n\t// It is exported for use in the xevent and keybind packages. Do not use\n\t// it directly. To redirect key events, please use xevent.RedirectKeyEvents.\n\tKeyRedirect xproto.Window\n\n\t// Keybinds is the data structure storing all callbacks for key bindings.\n\t// This is extremely similar to the general notion of event callbacks,\n\t// but adds extra support to make handling key bindings easier. (Like\n\t// specifying human readable key sequences to bind to.)\n\t// KeyBindKey is a struct representing the 4-tuple\n\t// (event-type, window-id, modifiers, keycode).\n\t// It is exported for use in the keybind package. Do not access it directly.\n\tKeybinds    map[KeyKey][]CallbackKey\n\tKeybindsLck *sync.RWMutex\n\n\t// Keygrabs is a frequency count of the number of callbacks associated\n\t// with a particular KeyBindKey. This is necessary because we can only\n\t// grab a particular key *once*, but we may want to attach several callbacks\n\t// to a single keypress.\n\t// It is exported for use in the keybind package. Do not access it directly.\n\tKeygrabs map[KeyKey]int\n\n\t// Keystrings is a list of all key strings used to connect keybindings.\n\t// They are used to rebuild key grabs when the keyboard mapping is updated.\n\t// It is exported for use in the keybind package. Do not access it directly.\n\tKeystrings []KeyString\n\n\t// Mousebinds is the data structure storing all callbacks for mouse\n\t// bindings.This is extremely similar to the general notion of event\n\t// callbacks,but adds extra support to make handling mouse bindings easier.\n\t// (Like specifying human readable mouse sequences to bind to.)\n\t// MouseBindKey is a struct representing the 4-tuple\n\t// (event-type, window-id, modifiers, button).\n\t// It is exported for use in the mousebind package. Do not use it.\n\tMousebinds    map[MouseKey][]CallbackMouse\n\tMousebindsLck *sync.RWMutex\n\n\t// Mousegrabs is a frequency count of the number of callbacks associated\n\t// with a particular MouseBindKey. This is necessary because we can only\n\t// grab a particular mouse button *once*, but we may want to attach\n\t// several callbacks to a single button press.\n\t// It is exported for use in the mousebind package. Do not use it.\n\tMousegrabs map[MouseKey]int\n\n\t// InMouseDrag is true if a drag is currently in progress.\n\t// It is exported for use in the mousebind package. Do not use it.\n\tInMouseDrag bool\n\n\t// MouseDragStep is the function executed for each step (i.e., pointer\n\t// movement) in the current mouse drag. Note that this is nil when a drag\n\t// is not in progress.\n\t// It is exported for use in the mousebind package. Do not use it.\n\tMouseDragStepFun MouseDragFun\n\n\t// MouseDragEnd is the function executed at the end of the current\n\t// mouse drag. This is nil when a drag is not in progress.\n\t// It is exported for use in the mousebind package. Do not use it.\n\tMouseDragEndFun MouseDragFun\n\n\t// gc is a general purpose graphics context; used to paint images.\n\t// Since we don't do any real X drawing, we don't really care about the\n\t// particulars of our graphics context.\n\tgc xproto.Gcontext\n\n\t// dummy is a dummy window used for mouse/key GRABs.\n\t// Basically, whenever a grab is instituted, mouse and key events are\n\t// redirected to the dummy the window.\n\tdummy xproto.Window\n\n\t// ErrorHandler is the function that handles errors *in the event loop*.\n\t// By default, it simply emits them to stderr.\n\t// It is exported for use in the xevent package. To set the default error\n\t// handler, please use xevent.ErrorHandlerSet.\n\tErrorHandler ErrorHandlerFun\n}\n\n// NewConn connects to the X server using the DISPLAY environment variable\n// and creates a new XUtil. Most environments have the DISPLAY environment\n// variable set, so this is probably what you want to use to connect to X.\nfunc NewConn() (*XUtil, error) {\n\treturn NewConnDisplay(\"\")\n}\n\n// NewConnDisplay connects to the X server and creates a new XUtil.\n// If 'display' is empty, the DISPLAY environment variable is used. Otherwise\n// there are several different display formats supported:\n//\n//\tNewConn(\":1\") -> net.Dial(\"unix\", \"\", \"/tmp/.X11-unix/X1\")\n//\tNewConn(\"/tmp/launch-12/:0\") -> net.Dial(\"unix\", \"\", \"/tmp/launch-12/:0\")\n//\tNewConn(\"hostname:2.1\") -> net.Dial(\"tcp\", \"\", \"hostname:6002\")\n//\tNewConn(\"tcp/hostname:1.0\") -> net.Dial(\"tcp\", \"\", \"hostname:6001\")\nfunc NewConnDisplay(display string) (*XUtil, error) {\n\tc, err := xgb.NewConnDisplay(display)\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn NewConnXgb(c)\n\n}\n\n// NewConnXgb use the specific xgb.Conn to create a new XUtil.\n//\n//  NewConn, NewConnDisplay are wrapper of this function.\nfunc NewConnXgb(c *xgb.Conn) (*XUtil, error) {\n\tsetup := xproto.Setup(c)\n\tscreen := setup.DefaultScreen(c)\n\n\t// Initialize our central struct that stores everything.\n\txu := &XUtil{\n\t\tconn:             c,\n\t\tQuit:             false,\n\t\tEvqueue:          make([]EventOrError, 0, 1000),\n\t\tEvqueueLck:       &sync.RWMutex{},\n\t\tsetup:            setup,\n\t\tscreen:           screen,\n\t\troot:             screen.Root,\n\t\teventTime:        xproto.Timestamp(0), // last event time\n\t\tAtoms:            make(map[string]xproto.Atom, 50),\n\t\tAtomsLck:         &sync.RWMutex{},\n\t\tAtomNames:        make(map[xproto.Atom]string, 50),\n\t\tAtomNamesLck:     &sync.RWMutex{},\n\t\tCallbacks:        make(map[int]map[xproto.Window][]Callback, 33),\n\t\tCallbacksLck:     &sync.RWMutex{},\n\t\tHooks:            make([]CallbackHook, 0),\n\t\tHooksLck:         &sync.RWMutex{},\n\t\tKeymap:           nil, // we don't have anything yet\n\t\tModmap:           nil,\n\t\tKeyRedirect:      0,\n\t\tKeybinds:         make(map[KeyKey][]CallbackKey, 10),\n\t\tKeybindsLck:      &sync.RWMutex{},\n\t\tKeygrabs:         make(map[KeyKey]int, 10),\n\t\tKeystrings:       make([]KeyString, 0, 10),\n\t\tMousebinds:       make(map[MouseKey][]CallbackMouse, 10),\n\t\tMousebindsLck:    &sync.RWMutex{},\n\t\tMousegrabs:       make(map[MouseKey]int, 10),\n\t\tInMouseDrag:      false,\n\t\tMouseDragStepFun: nil,\n\t\tMouseDragEndFun:  nil,\n\t\tErrorHandler:     func(err xgb.Error) { Logger.Println(err) },\n\t}\n\n\tvar err error = nil\n\t// Create a general purpose graphics context\n\txu.gc, err = xproto.NewGcontextId(xu.conn)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\txproto.CreateGC(xu.conn, xu.gc, xproto.Drawable(xu.root),\n\t\txproto.GcForeground, []uint32{xu.screen.WhitePixel})\n\n\t// Create a dummy window\n\txu.dummy, err = xproto.NewWindowId(xu.conn)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\txproto.CreateWindow(xu.conn, xu.Screen().RootDepth, xu.dummy, xu.RootWin(),\n\t\t-1000, -1000, 1, 1, 0,\n\t\txproto.WindowClassInputOutput, xu.Screen().RootVisual,\n\t\txproto.CwEventMask|xproto.CwOverrideRedirect,\n\t\t[]uint32{1, xproto.EventMaskPropertyChange})\n\txproto.MapWindow(xu.conn, xu.dummy)\n\n\t// Register the Xinerama extension... because it doesn't cost much.\n\terr = xinerama.Init(xu.conn)\n\n\t// If we can't register Xinerama, that's okay. Output something\n\t// and move on.\n\tif err != nil {\n\t\tLogger.Printf(\"WARNING: %s\\n\", err)\n\t\tLogger.Printf(\"MESSAGE: The 'xinerama' package cannot be used \" +\n\t\t\t\"because the XINERAMA extension could not be loaded.\")\n\t}\n\n\treturn xu, nil\n}\n\n// Conn returns the xgb connection object.\nfunc (xu *XUtil) Conn() *xgb.Conn {\n\treturn xu.conn\n}\n\n// ExtInitialized returns true if an extension has been initialized.\n// This is useful for determining whether an extension is available or not.\nfunc (xu *XUtil) ExtInitialized(extName string) bool {\n\t_, ok := xu.Conn().Extensions[extName]\n\treturn ok\n}\n\n// Sync forces XGB to catch up with all events/requests and synchronize.\n// This is done by issuing a benign round trip request to X.\nfunc (xu *XUtil) Sync() {\n\txproto.GetInputFocus(xu.Conn()).Reply()\n}\n\n// Setup returns the setup information retrieved during connection time.\nfunc (xu *XUtil) Setup() *xproto.SetupInfo {\n\treturn xu.setup\n}\n\n// Screen returns the default screen\nfunc (xu *XUtil) Screen() *xproto.ScreenInfo {\n\treturn xu.screen\n}\n\n// RootWin returns the current root window.\nfunc (xu *XUtil) RootWin() xproto.Window {\n\treturn xu.root\n}\n\n// RootWinSet will change the current root window to the one provided.\n// N.B. This probably shouldn't be used unless you're desperately trying\n// to support multiple X screens. (This is *not* the same as Xinerama/RandR or\n// TwinView. All of those have a single root window.)\nfunc (xu *XUtil) RootWinSet(root xproto.Window) {\n\txu.root = root\n}\n\n// TimeGet gets the most recent time seen by an event.\nfunc (xu *XUtil) TimeGet() xproto.Timestamp {\n\treturn xu.eventTime\n}\n\n// TimeSet sets the most recent time seen by an event.\nfunc (xu *XUtil) TimeSet(t xproto.Timestamp) {\n\txu.eventTime = t\n}\n\n// GC gets a general purpose graphics context that is typically used to simply\n// paint images.\nfunc (xu *XUtil) GC() xproto.Gcontext {\n\treturn xu.gc\n}\n\n// Dummy gets the id of the dummy window.\nfunc (xu *XUtil) Dummy() xproto.Window {\n\treturn xu.dummy\n}\n\n// Grabs the server. Everything becomes synchronous.\nfunc (xu *XUtil) Grab() {\n\txproto.GrabServer(xu.Conn())\n}\n\n// Ungrabs the server.\nfunc (xu *XUtil) Ungrab() {\n\txproto.UngrabServer(xu.Conn())\n}\n"
  },
  {
    "path": "xgraphics/convert.go",
    "content": "package xgraphics\n\n/*\nA set of conversion functions for some image types defined in the Go standard\nlibrary. They can be up to 80% faster because the inner loop doesn't use\ninterfaces. Wow.\n\nNote that these functions assume that the source and destination are precisely\nthe same size.\n*/\n\nimport (\n\t\"image\"\n\t\"image/color\"\n)\n\n// convertImage converts any image implementing the image.Image interface to\n// an xgraphics.Image type. This is *slow*.\nfunc convertImage(dest *Image, src image.Image) {\n\tvar r, g, b, a uint32\n\tvar x, y, i int\n\n\tfor x = dest.Rect.Min.X; x < dest.Rect.Max.X; x++ {\n\t\tfor y = dest.Rect.Min.Y; y < dest.Rect.Max.Y; y++ {\n\t\t\tr, g, b, a = src.At(x, y).RGBA()\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\tdest.Pix[i+0] = uint8(b >> 8)\n\t\t\tdest.Pix[i+1] = uint8(g >> 8)\n\t\t\tdest.Pix[i+2] = uint8(r >> 8)\n\t\t\tdest.Pix[i+3] = uint8(a >> 8)\n\t\t}\n\t}\n}\n\nfunc convertXImage(dest *Image, src *Image) {\n\tcopy(dest.Pix, src.Pix)\n}\n\nfunc convertYCbCr(dest *Image, src *image.YCbCr) {\n\tvar r, g, b uint8\n\tvar x, y, i, yi, ci int\n\n\tfor x = dest.Rect.Min.X; x < dest.Rect.Max.X; x++ {\n\t\tfor y = dest.Rect.Min.Y; y < dest.Rect.Max.Y; y++ {\n\t\t\tyi, ci = src.YOffset(x, y), src.COffset(x, y)\n\t\t\tr, g, b = color.YCbCrToRGB(src.Y[yi], src.Cb[ci], src.Cr[ci])\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\tdest.Pix[i+0] = b\n\t\t\tdest.Pix[i+1] = g\n\t\t\tdest.Pix[i+2] = r\n\t\t\tdest.Pix[i+3] = 0xff\n\t\t}\n\t}\n}\n\nfunc convertRGBA(dest *Image, src *image.RGBA) {\n\tvar x, y, i, si int\n\n\tfor x = dest.Rect.Min.X; x < dest.Rect.Max.X; x++ {\n\t\tfor y = dest.Rect.Min.Y; y < dest.Rect.Max.Y; y++ {\n\t\t\tsi = src.PixOffset(x, y)\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\tdest.Pix[i+0] = src.Pix[si+2]\n\t\t\tdest.Pix[i+1] = src.Pix[si+1]\n\t\t\tdest.Pix[i+2] = src.Pix[si+0]\n\t\t\tdest.Pix[i+3] = src.Pix[si+3]\n\t\t}\n\t}\n}\n\nfunc convertRGBA64(dest *Image, src *image.RGBA64) {\n\tvar x, y, i, si int\n\n\tfor x = dest.Rect.Min.X; x < dest.Rect.Max.X; x++ {\n\t\tfor y = dest.Rect.Min.Y; y < dest.Rect.Max.Y; y++ {\n\t\t\tsi = src.PixOffset(x, y)\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\tdest.Pix[i+0] = src.Pix[si+4]\n\t\t\tdest.Pix[i+1] = src.Pix[si+2]\n\t\t\tdest.Pix[i+2] = src.Pix[si+0]\n\t\t\tdest.Pix[i+3] = src.Pix[si+6]\n\t\t}\n\t}\n}\n\nfunc convertNRGBA(dest *Image, src *image.NRGBA) {\n\tvar x, y, i, si int\n\tvar a uint16\n\n\tfor x = dest.Rect.Min.X; x < dest.Rect.Max.X; x++ {\n\t\tfor y = dest.Rect.Min.Y; y < dest.Rect.Max.Y; y++ {\n\t\t\tsi = src.PixOffset(x, y)\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\ta = uint16(src.Pix[si+3])\n\n\t\t\tdest.Pix[i+0] = uint8((uint16(src.Pix[si+2]) * a) / 0xff)\n\t\t\tdest.Pix[i+1] = uint8((uint16(src.Pix[si+1]) * a) / 0xff)\n\t\t\tdest.Pix[i+2] = uint8((uint16(src.Pix[si+0]) * a) / 0xff)\n\t\t\tdest.Pix[i+3] = src.Pix[si+3]\n\t\t}\n\t}\n}\n\nfunc convertNRGBA64(dest *Image, src *image.NRGBA64) {\n\tvar x, y, i, si int\n\tvar a uint16\n\n\tfor x = dest.Rect.Min.X; x < dest.Rect.Max.X; x++ {\n\t\tfor y = dest.Rect.Min.Y; y < dest.Rect.Max.Y; y++ {\n\t\t\tsi = src.PixOffset(x, y)\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\ta = uint16(src.Pix[si+6])\n\n\t\t\tdest.Pix[i+0] = uint8((uint16(src.Pix[si+4]) * a) / 0xff)\n\t\t\tdest.Pix[i+1] = uint8((uint16(src.Pix[si+2]) * a) / 0xff)\n\t\t\tdest.Pix[i+2] = uint8((uint16(src.Pix[si+0]) * a) / 0xff)\n\t\t\tdest.Pix[i+3] = src.Pix[si+6]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "xgraphics/doc.go",
    "content": "/*\nPackage xgraphics defines an X image type and provides convenience functions\nfor reading and writing X pixmaps and bitmaps. It is a work-in-progress, and\nwhile it works for some common X server configurations, it does not work for\nall X server configurations. Package xgraphics also provides some support for\ndrawing text on to images using freetype-go, scaling images using graphics-go,\nsimple alpha blending, finding EWMH and ICCCM window icons and efficiently\ndrawing any image into an X pixmap. (Where \"efficient\" means being able to\nspecify sub-regions of images to draw, so that the entire image isn't sent to\nX.) If more elaborate image routines are required, I recommend using draw2d.\n(The xgraphics.Image type satisfies the draw.Image interface, which allows it\nto work with draw2d.)\n\nIn general, xgraphics paints pixmaps to windows using using the BackPixmap\napproach. (Setting the background pixmap of the window to the pixmap containing\nyour image, and clearing the window's background when the pixmap is updated.)\nIt also provides experimental support for another mechanism: copying the\ncontents of your image's pixmap directly to the window. (This requires\nresponding to expose events to redraw the pixmap.) The former approach requires\nless book-keeping, but supposedly has some issues with some video cards. The\nlatter approach is probably more reliable, but requires more book-keeping.\n\nNote that while text drawing functions are provided, it is not necessary to use\nthem to write text on images. Namely, there is nothing X specific about them.\nThey are strictly for convenience.\n\nA quick example\n\nThis is a simple example the converts any value satisfying the image.Image\ninterface into an *xgraphics.Image value, and creates a new window with that\nimage painted in the window. (The XShow function probably doesn't have any\npractical applications outside serving as an example, but can be useful for\ndebugging what an image looks like.)\n\n\timgFile, err := os.Open(imgPath)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\timg, _, err := image.Decode(imgFile)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\n\tximg := xgraphics.NewConvert(XUtilValue, img)\n\tximg.XShow()\n\nA complete working example named 'show-image' that's similar to this can be\nfound in the examples directory of the xgbutil package. More involved examples,\n'show-window-icons' and 'pointer-painting', are also provided.\n\nPortability\n\nThe xgraphics package *assumes* a particular kind of X server configuration.\nNamely, this configuration specifies bits per pixel, image byte order, bitmap\nbit order, scanline padding and unit length, image depth and so on. Handling\nall of the possible values for each configuration option will greatly inflate\nthe code, but is on the TODO list.\n\nI am undecided (perhaps because I haven't thought about it too much) about\nwhether to hide these configuration details behind multiple xgraphics.Image\ntypes or hiding everything inside one xgraphics.Image type. I lean toward the\nlatter because the former requires a large number of types (and therefore a lot\nof code duplication). One design decision that I've already made is that images\nshould be converted to the format used by the X server (xgraphics currently\nassumes this is BGRx) once when the image is created. Without this, an\nxgraphics.Image type wouldn't be required, and images would have to be\nconverted to the X image format every time an image is drawn into a pixmap.\nThis results in a lot of overhead. Moreover, Go's interfaces allow an\nxgraphics.Image type to work anywhere that an image.Image or a draw.Image value\nis expected.\n\nThe obvious down-side to this approach is that optimizations made in image\ndrawing routines in other libraries won't be able to apply to xgraphics.Image\nvalues (since the optimizations are probably hard-coded for image types\ndeclared in Go's standard library). This isn't well suited to the process of\ncreating some canvas to draw on, and using another library to draw on the\ncanvas. (At least, it won't be as fast as possible.) I can't think of any way\naround this, other than having the library add an optimization step\nspecifically for xgraphics.Image values. Of course, the other approach is to\nconvert image formats only when drawing to X and completely subvert the\nxgraphics.Image type, but this seems worse than unoptimized image drawing\nroutines. (Unfortunately, both things need to be fast.)\n\nIf your X server is not configured to what the xgraphics package expects,\nmessages will be emitted to stderr when a new xgraphics.Image value is created.\nIf you see any of these messages, please report them to xgbutil's project page:\nhttps://github.com/BurntSushi/xgbutil.\n*/\npackage xgraphics\n"
  },
  {
    "path": "xgraphics/image.go",
    "content": "package xgraphics\n\n/*\nxgraphics/image.go contains an implementation of the draw.Image interface.\n\nRGBA could feasibly be used, but the representation of image data is dependent\nupon the configuration of the X server.\n\nFor the time being, I'm hard-coding a lot of that configuration for the common\ncase. Namely:\n\nByte order: least significant byte first\nDepth: 24\nBits per pixel: 32\n\nThis will have to be fixed for this to be truly compatible with any X server.\n\nMost of the code is based heavily on the implementation of common images in\nthe Go standard library.\n\nManipulating images isn't something I've had much experience with, so if it\nseems like I'm doing something stupid, I probably am.\n*/\n\nimport (\n\t\"image\"\n\t\"image/color\"\n\t\"image/png\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/BurntSushi/graphics-go/graphics\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\n// Model for the BGRA color type.\nvar BGRAModel color.Model = color.ModelFunc(bgraModel)\n\ntype Image struct {\n\t// X images must be tied to an X connection.\n\tX *xgbutil.XUtil\n\n\t// X images must also be tied to a pixmap (its drawing surface).\n\t// Calls to 'XDraw' will draw data to this pixmap.\n\t// Calls to 'XPaint' will tell X to show the pixmap on some window.\n\tPixmap xproto.Pixmap\n\n\t// Pix holds the image's pixels in BGRA order, so that they don't need\n\t// to be swapped for every PutImage request.\n\tPix []uint8\n\n\t// Stride corresponds to the number of elements in Pix between two pixels\n\t// that are vertically adjacent.\n\tStride int\n\n\t// The geometry of the image.\n\tRect image.Rectangle\n\n\t// Whether this is a sub-image or not.\n\t// This is useful to know when sending data or setting surfaces.\n\t// Namely, sub-images cannot be set as surfaces and sub-images, when\n\t// being drawn, only have its pixels sent to X instead of the whole image.\n\tSubimg bool\n}\n\n// New returns a new instance of Image with colors initialized to black\n// for the geometry given.\n// New will also create an X pixmap. When you are no longer using this\n// image, you should call Destroy so that the X pixmap can be freed on the\n// X server.\n// If 'X' is nil, then a new connection will be made. This is usually a bad\n// idea, particularly if you're making a lot of small images, but can be\n// used to achieve true parallelism. (Particularly useful when painting large\n// images.)\nfunc New(X *xgbutil.XUtil, r image.Rectangle) *Image {\n\tvar err error\n\tif X == nil {\n\t\tX, err = xgbutil.NewConn()\n\t\tif err != nil {\n\t\t\txgbutil.Logger.Panicf(\"Could not create a new connection when \"+\n\t\t\t\t\"creating a new xgraphics.Image value because: %s\", err)\n\t\t}\n\t}\n\n\treturn &Image{\n\t\tX:      X,\n\t\tPixmap: 0,\n\t\tPix:    make([]uint8, 4*r.Dx()*r.Dy()),\n\t\tStride: 4 * r.Dx(),\n\t\tRect:   r,\n\t\tSubimg: false,\n\t}\n}\n\n// Destroy frees the pixmap resource being used by this image.\n// It should be called whenever the image will no longer be drawn or painted.\nfunc (im *Image) Destroy() {\n\tif im.Pixmap != 0 {\n\t\txproto.FreePixmap(im.X.Conn(), im.Pixmap)\n\t\tim.Pixmap = 0\n\t}\n}\n\n// Scale will scale the image to the size provided.\n// Note that this will destroy the current pixmap associated with this image.\n// After scaling, XSurfaceSet will need to be called for each window that\n// this image is painted to. (And obviously, XDraw and XPaint will need to\n// be called again.)\nfunc (im *Image) Scale(width, height int) *Image {\n\tdimg := New(im.X, image.Rect(0, 0, width, height))\n\tgraphics.Scale(dimg, im)\n\tim.Destroy()\n\n\treturn dimg\n}\n\n// WritePng encodes the image to w as a png.\nfunc (im *Image) WritePng(w io.Writer) error {\n\treturn png.Encode(w, im)\n}\n\n// SavePng writes the Image to a file with name as a png.\nfunc (im *Image) SavePng(name string) error {\n\tfile, err := os.Create(name)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn im.WritePng(file)\n}\n\n// ColorModel returns the color.Model used by the Image struct.\nfunc (im *Image) ColorModel() color.Model {\n\treturn BGRAModel\n}\n\n// Bounds returns the rectangle representing the geometry of Image.\nfunc (im *Image) Bounds() image.Rectangle {\n\treturn im.Rect\n}\n\n// At returns the color at the specified pixel.\nfunc (im *Image) At(x, y int) color.Color {\n\tif !(image.Point{x, y}.In(im.Rect)) {\n\t\treturn BGRA{}\n\t}\n\ti := im.PixOffset(x, y)\n\treturn BGRA{\n\t\tB: im.Pix[i],\n\t\tG: im.Pix[i+1],\n\t\tR: im.Pix[i+2],\n\t\tA: im.Pix[i+3],\n\t}\n}\n\n// Set satisfies the draw.Image interface by allowing the color of a pixel\n// at (x, y) to be changed.\nfunc (im *Image) Set(x, y int, c color.Color) {\n\tif !(image.Point{x, y}.In(im.Rect)) {\n\t\treturn\n\t}\n\n\ti := im.PixOffset(x, y)\n\tcc := BGRAModel.Convert(c).(BGRA)\n\tim.Pix[i] = cc.B\n\tim.Pix[i+1] = cc.G\n\tim.Pix[i+2] = cc.R\n\tim.Pix[i+3] = cc.A\n}\n\n// SetBGRA is like set, but without the type assertion.\nfunc (im *Image) SetBGRA(x, y int, c BGRA) {\n\tif !(image.Point{x, y}.In(im.Rect)) {\n\t\treturn\n\t}\n\n\ti := im.PixOffset(x, y)\n\tim.Pix[i] = c.B\n\tim.Pix[i+1] = c.G\n\tim.Pix[i+2] = c.R\n\tim.Pix[i+3] = c.A\n}\n\n// For transforms every pixel color to the color returned by 'each' given\n// an (x, y) position.\nfunc (im *Image) For(each func(x, y int) BGRA) {\n\tfor x := im.Rect.Min.X; x < im.Rect.Max.X; x++ {\n\t\tfor y := im.Rect.Min.Y; y < im.Rect.Max.Y; y++ {\n\t\t\tim.SetBGRA(x, y, each(x, y))\n\t\t}\n\t}\n}\n\n// ForExp is like For, but bypasses image.Color types.\n// (So it should be faster.)\nfunc (im *Image) ForExp(each func(x, y int) (r, g, b, a uint8)) {\n\tvar x, y, i int\n\tvar r, g, b, a uint8\n\tfor x = im.Rect.Min.X; x < im.Rect.Max.X; x++ {\n\t\tfor y = im.Rect.Min.Y; y < im.Rect.Max.Y; y++ {\n\t\t\ti = im.PixOffset(x, y)\n\t\t\tr, g, b, a = each(x, y)\n\n\t\t\tim.Pix[i+0] = b\n\t\t\tim.Pix[i+1] = g\n\t\t\tim.Pix[i+2] = r\n\t\t\tim.Pix[i+3] = a\n\t\t}\n\t}\n}\n\n// SubImage provides a sub image of Image without copying image data.\n// N.B. The standard library defines a similar function, but returns an\n// image.Image. Here, we return xgraphics.Image so that we can use the extra\n// methods defined by xgraphics on it.\n//\n// This method is cheap to call. It should be used to update only specific\n// regions of an X pixmap to avoid sending an entire image to the X server when\n// only a piece of it is updated.\n//\n// Note that if the intersection of `r` and `im` is empty, `nil` is returned.\nfunc (im *Image) SubImage(r image.Rectangle) image.Image {\n\tr = r.Intersect(im.Rect)\n\tif r.Empty() {\n\t\treturn nil\n\t}\n\n\ti := im.PixOffset(r.Min.X, r.Min.Y)\n\treturn &Image{\n\t\tX:      im.X,\n\t\tPixmap: im.Pixmap,\n\t\tPix:    im.Pix[i:],\n\t\tStride: im.Stride,\n\t\tRect:   r,\n\t\tSubimg: true,\n\t}\n}\n\n// PixOffset returns the index of the frst element of the Pix data that\n// corresponds to the pixel at (x, y).\nfunc (im *Image) PixOffset(x, y int) int {\n\treturn (y-im.Rect.Min.Y)*im.Stride + (x-im.Rect.Min.X)*4\n}\n\n// Window is a convenience function for painting the provided\n// Image value to a new window, destroying the pixmap created by that image,\n// and returning the window value.\n// The window is sized to the dimensions of the image.\nfunc (im *Image) Window(parent xproto.Window) *xwindow.Window {\n\twin := xwindow.Must(xwindow.Create(im.X, parent))\n\twin.Resize(im.Bounds().Dx(), im.Bounds().Dy())\n\n\tim.XSurfaceSet(win.Id)\n\tim.XDraw()\n\tim.XPaint(win.Id)\n\tim.Destroy()\n\n\treturn win\n}\n\n// BGRA is the representation of color for each pixel in an X pixmap.\n// BUG(burntsushi): This is hard-coded when it shouldn't be.\ntype BGRA struct {\n\tB, G, R, A uint8\n}\n\n// RGBA satisfies the color.Color interface.\nfunc (c BGRA) RGBA() (r, g, b, a uint32) {\n\tr = uint32(c.R)\n\tr |= r << 8\n\n\tg = uint32(c.G)\n\tg |= g << 8\n\n\tb = uint32(c.B)\n\tb |= b << 8\n\n\ta = uint32(c.A)\n\ta |= a << 8\n\n\treturn\n}\n\n// bgraModel converts from any color to a BGRA color type.\nfunc bgraModel(c color.Color) color.Color {\n\tif _, ok := c.(BGRA); ok {\n\t\treturn c\n\t}\n\n\tr, g, b, a := c.RGBA()\n\treturn BGRA{\n\t\tB: uint8(b >> 8),\n\t\tG: uint8(g >> 8),\n\t\tR: uint8(r >> 8),\n\t\tA: uint8(a >> 8),\n\t}\n}\n"
  },
  {
    "path": "xgraphics/new.go",
    "content": "package xgraphics\n\n/*\nxgraphics/new.go contains a few additional constructors for creating an\nxgraphics.Image.\n*/\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"image\"\n\t_ \"image/gif\"\n\t_ \"image/jpeg\"\n\t_ \"image/png\"\n\t\"os\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\n// NewConvert converts any image satisfying the image.Image interface to an\n// xgraphics.Image type.\n// If 'img' is an xgraphics.Image, it will be copied and a new image will\n// be returned.\n// Also, NewConvert attempts to optimize image conversion for some image\n// formats. (i.e., *image.RGBA.)\nfunc NewConvert(X *xgbutil.XUtil, img image.Image) *Image {\n\tximg := New(X, img.Bounds())\n\n\t// I've attempted to optimize this loop.\n\t// It actually takes more time to convert an image than to send the bytes\n\t// over the wire. (I suspect 'copy' is super fast, which can be used in\n\t// XDraw, whereas computing each pixel is super slow.)\n\t// But how is image decoding so much faster than this? I'll have to\n\t// investigate... Maybe the Color interface being used here is the real\n\t// slow down.\n\tswitch concrete := img.(type) {\n\tcase *image.NRGBA:\n\t\tconvertNRGBA(ximg, concrete)\n\tcase *image.NRGBA64:\n\t\tconvertNRGBA64(ximg, concrete)\n\tcase *image.RGBA:\n\t\tconvertRGBA(ximg, concrete)\n\tcase *image.RGBA64:\n\t\tconvertRGBA64(ximg, concrete)\n\tcase *image.YCbCr:\n\t\tconvertYCbCr(ximg, concrete)\n\tcase *Image:\n\t\tconvertXImage(ximg, concrete)\n\tdefault:\n\t\txgbutil.Logger.Printf(\"Converting image type %T the slow way. \"+\n\t\t\t\"Optimization for this image type hasn't been added yet.\", img)\n\t\tconvertImage(ximg, img)\n\t}\n\treturn ximg\n}\n\n// NewFileName uses the image package's decoder and converts a file specified\n// by fileName to an xgraphics.Image value.\n// Opening a file or decoding an image can cause an error.\nfunc NewFileName(X *xgbutil.XUtil, fileName string) (*Image, error) {\n\tsrcReader, err := os.Open(fileName)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer srcReader.Close()\n\n\timg, _, err := image.Decode(srcReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewConvert(X, img), nil\n}\n\n// NewBytes uses the image package's decoder to convert the bytes given to\n// an xgraphics.Imag value.\n// Decoding an image can cause an error.\nfunc NewBytes(X *xgbutil.XUtil, bs []byte) (*Image, error) {\n\timg, _, err := image.Decode(bytes.NewReader(bs))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn NewConvert(X, img), nil\n}\n\n// NewEwmhIcon converts EWMH icon data (ARGB) to an xgraphics.Image type.\n// You should probably use xgraphics.FindIcon instead of this directly.\nfunc NewEwmhIcon(X *xgbutil.XUtil, icon *ewmh.WmIcon) *Image {\n\tximg := New(X, image.Rect(0, 0, int(icon.Width), int(icon.Height)))\n\tr := ximg.Rect\n\twidth := r.Dx()\n\n\tvar argb, x, y int\n\tfor x = r.Min.X; x < r.Max.X; x++ {\n\t\tfor y = r.Min.Y; y < r.Max.Y; y++ {\n\t\t\targb = int(icon.Data[x+(y*width)])\n\t\t\tximg.SetBGRA(x, y, BGRA{\n\t\t\t\tB: uint8(argb & 0x000000ff),\n\t\t\t\tG: uint8((argb & 0x0000ff00) >> 8),\n\t\t\t\tR: uint8((argb & 0x00ff0000) >> 16),\n\t\t\t\tA: uint8(argb >> 24),\n\t\t\t})\n\t\t}\n\t}\n\treturn ximg\n}\n\n// NewIcccmIcon converts two pixmap ids (icon_pixmap and icon_mask in the\n// WM_HINTS properts) to a single xgraphics.Image.\n// It is okay for one of iconPixmap or iconMask to be 0, but not both.\n// You should probably use xgraphics.FindIcon instead of this directly.\nfunc NewIcccmIcon(X *xgbutil.XUtil, iconPixmap,\n\ticonMask xproto.Pixmap) (*Image, error) {\n\n\tif iconPixmap == 0 && iconMask == 0 {\n\t\treturn nil, fmt.Errorf(\"NewIcccmIcon: At least one of iconPixmap or \" +\n\t\t\t\"iconMask must be non-zero, but both are 0.\")\n\t}\n\n\tvar pximg, mximg *Image\n\tvar err error\n\n\t// Get the xgraphics.Image for iconPixmap.\n\tif iconPixmap != 0 {\n\t\tpximg, err = NewDrawable(X, xproto.Drawable(iconPixmap))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Now get the xgraphics.Image for iconMask.\n\tif iconMask != 0 {\n\t\tmximg, err = NewDrawable(X, xproto.Drawable(iconMask))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\n\t// Now merge them together if both were specified.\n\tswitch {\n\tcase pximg != nil && mximg != nil:\n\t\tr := pximg.Bounds()\n\n\t\tvar x, y int\n\t\tvar bgra, maskBgra BGRA\n\t\tfor x = r.Min.X; x < r.Max.X; x++ {\n\t\t\tfor y = r.Min.Y; y < r.Max.Y; y++ {\n\t\t\t\tmaskBgra = mximg.At(x, y).(BGRA)\n\t\t\t\tbgra = pximg.At(x, y).(BGRA)\n\t\t\t\tif maskBgra.A == 0 {\n\t\t\t\t\tpximg.SetBGRA(x, y, BGRA{\n\t\t\t\t\t\tB: bgra.B,\n\t\t\t\t\t\tG: bgra.G,\n\t\t\t\t\t\tR: bgra.R,\n\t\t\t\t\t\tA: 0,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn pximg, nil\n\tcase pximg != nil:\n\t\treturn pximg, nil\n\tcase mximg != nil:\n\t\treturn mximg, nil\n\t}\n\n\tpanic(\"unreachable\")\n}\n\n// NewDrawable converts an X drawable into a xgraphics.Image.\n// This is used in NewIcccmIcon.\nfunc NewDrawable(X *xgbutil.XUtil, did xproto.Drawable) (*Image, error) {\n\t// Get the geometry of the pixmap for use in the GetImage request.\n\tpgeom, err := xwindow.RawGeometry(X, xproto.Drawable(did))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Get the image data for each pixmap.\n\tpixmapData, err := xproto.GetImage(X.Conn(), xproto.ImageFormatZPixmap,\n\t\tdid,\n\t\t0, 0, uint16(pgeom.Width()), uint16(pgeom.Height()),\n\t\t(1<<32)-1).Reply()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Now create the xgraphics.Image and populate it with data from\n\t// pixmapData and maskData.\n\tximg := New(X, image.Rect(0, 0, pgeom.Width(), pgeom.Height()))\n\n\t// We'll try to be a little flexible with the image format returned,\n\t// but not completely flexible.\n\terr = readDrawableData(X, ximg, did, pixmapData,\n\t\tpgeom.Width(), pgeom.Height())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn ximg, nil\n}\n\n// readDrawableData uses Format information to read data from an X pixmap\n// into an xgraphics.Image.\n// readPixmapData does not take into account all information possible to read\n// X pixmaps and bitmaps. Of particular note is bit order/byte order.\nfunc readDrawableData(X *xgbutil.XUtil, ximg *Image, did xproto.Drawable,\n\timgData *xproto.GetImageReply, width, height int) error {\n\n\tformat := GetFormat(X, imgData.Depth)\n\tif format == nil {\n\t\treturn fmt.Errorf(\"Could not find valid format for pixmap %d \"+\n\t\t\t\"with depth %d\", did, imgData.Depth)\n\t}\n\n\tswitch format.Depth {\n\tcase 1: // We read bitmaps in as alpha masks.\n\t\tif format.BitsPerPixel != 1 {\n\t\t\treturn fmt.Errorf(\"The image returned for pixmap id %d with \"+\n\t\t\t\t\"depth %d has an unsupported value for bits-per-pixel: %d\",\n\t\t\t\tdid, format.Depth, format.BitsPerPixel)\n\t\t}\n\n\t\t// Calculate the padded width of our image data.\n\t\tpad := int(X.Setup().BitmapFormatScanlinePad)\n\t\tpaddedWidth := width\n\t\tif width%pad != 0 {\n\t\t\tpaddedWidth = width + pad - (width % pad)\n\t\t}\n\n\t\t// Process one scanline at a time. Each 'y' represents a\n\t\t// single scanline.\n\t\tfor y := 0; y < height; y++ {\n\t\t\t// Each scanline has length 'width' padded to\n\t\t\t// BitmapFormatScanlinePad, which is found in the X setup info.\n\t\t\t// 'i' is the index to the starting byte of the yth scanline.\n\t\t\ti := y * paddedWidth / 8\n\t\t\tfor x := 0; x < width; x++ {\n\t\t\t\tb := imgData.Data[i+x/8] >> uint(x%8)\n\t\t\t\tif b&1 > 0 { // opaque\n\t\t\t\t\tximg.Set(x, y, BGRA{0x0, 0x0, 0x0, 0xff})\n\t\t\t\t} else { // transparent\n\t\t\t\t\tximg.Set(x, y, BGRA{0xff, 0xff, 0xff, 0x0})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\tcase 24, 32:\n\t\tswitch format.BitsPerPixel {\n\t\tcase 24:\n\t\t\tbytesPer := int(format.BitsPerPixel) / 8\n\t\t\tvar i int\n\t\t\tximg.For(func(x, y int) BGRA {\n\t\t\t\ti = y*width*bytesPer + x*bytesPer\n\t\t\t\treturn BGRA{\n\t\t\t\t\tB: imgData.Data[i],\n\t\t\t\t\tG: imgData.Data[i+1],\n\t\t\t\t\tR: imgData.Data[i+2],\n\t\t\t\t\tA: 0xff,\n\t\t\t\t}\n\t\t\t})\n\t\tcase 32:\n\t\t\tbytesPer := int(format.BitsPerPixel) / 8\n\t\t\tvar i int\n\t\t\tximg.For(func(x, y int) BGRA {\n\t\t\t\ti = y*width*bytesPer + x*bytesPer\n\t\t\t\treturn BGRA{\n\t\t\t\t\tB: imgData.Data[i],\n\t\t\t\t\tG: imgData.Data[i+1],\n\t\t\t\t\tR: imgData.Data[i+2],\n\t\t\t\t\tA: imgData.Data[i+3],\n\t\t\t\t}\n\t\t\t})\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"The image returned for pixmap id %d has \"+\n\t\t\t\t\"an unsupported value for bits-per-pixel: %d\",\n\t\t\t\tdid, format.BitsPerPixel)\n\t\t}\n\n\tdefault:\n\t\treturn fmt.Errorf(\"The image returned for pixmap id %d has an \"+\n\t\t\t\"unsupported value for depth: %d\", did, format.Depth)\n\t}\n\n\treturn nil\n}\n\n// GetFormat searches SetupInfo for a Format matching the depth provided.\nfunc GetFormat(X *xgbutil.XUtil, depth byte) *xproto.Format {\n\tfor _, pixForm := range X.Setup().PixmapFormats {\n\t\tif pixForm.Depth == depth {\n\t\t\treturn &pixForm\n\t\t}\n\t}\n\treturn nil\n}\n\n// getVisualInfo searches SetupInfo for a VisualInfo value matching\n// the depth provided.\n// XXX: This isn't used (yet).\nfunc getVisualInfo(X *xgbutil.XUtil, depth byte,\n\tvisualid xproto.Visualid) *xproto.VisualInfo {\n\n\tfor _, depthInfo := range X.Screen().AllowedDepths {\n\t\tfmt.Printf(\"%#v\\n\", depthInfo)\n\t\t// fmt.Printf(\"%#v\\n\", depthInfo.Visuals)\n\t\tfmt.Println(\"------------\")\n\t\tif depthInfo.Depth == depth {\n\t\t\tfor _, visual := range depthInfo.Visuals {\n\t\t\t\tif visual.VisualId == visualid {\n\t\t\t\t\treturn &visual\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "xgraphics/text.go",
    "content": "package xgraphics\n\nimport (\n\t\"image\"\n\t\"image/color\"\n\t\"io\"\n\t\"io/ioutil\"\n\n\t\"github.com/BurntSushi/freetype-go/freetype\"\n\t\"github.com/BurntSushi/freetype-go/freetype/truetype\"\n)\n\n// Text takes an image and, using the freetype package, writes text in the\n// position specified on to the image. A color.Color, a font size and a font\n// must also be specified.\n// Finally, the (x, y) coordinate advanced by the text extents is returned.\n//\n// Note that the ParseFont helper function can be used to get a *truetype.Font\n// value without having to import freetype-go directly.\n//\n// If you need more control over the 'context' used to draw text (like the DPI),\n// then you'll need to ignore this convenience method and use your own.\nfunc (im *Image) Text(x, y int, clr color.Color, fontSize float64,\n\tfont *truetype.Font, text string) (int, int, error) {\n\n\t// Create a solid color image\n\ttextClr := image.NewUniform(clr)\n\n\t// Set up the freetype context... mostly boiler plate\n\tc := ftContext(font, fontSize)\n\tc.SetClip(im.Bounds())\n\tc.SetDst(im)\n\tc.SetSrc(textClr)\n\n\t// Now let's actually draw the text...\n\tpt := freetype.Pt(x, y+int(c.PointToFix32(fontSize)>>8))\n\tnewpt, err := c.DrawString(text, pt)\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\treturn int(newpt.X / 256), int(newpt.Y / 256), nil\n}\n\n// Extents returns the *correct* max width and height extents of a string\n// given a font. See freetype.MeasureString for the deets.\nfunc Extents(font *truetype.Font, fontSize float64, text string) (int, int) {\n\tc := ftContext(font, fontSize)\n\tw, h, err := c.MeasureString(text)\n\tif err != nil {\n\t\treturn 0, 0\n\t}\n\treturn int(w / 256), int(h / 256)\n}\n\n// Returns the max width and height extents of a string given a font.\n// This is calculated by determining the number of pixels in an \"em\" unit\n// for the given font, and multiplying by the number of characters in 'text'.\n// Since a particular character may be smaller than one \"em\" unit, this has\n// a tendency to overestimate the extents.\n// It is provided because I do not know how to calculate the precise extents\n// using freetype-go.\n// TODO: This does not currently account for multiple lines. It may never do so.\nfunc TextMaxExtents(font *truetype.Font, fontSize float64,\n\ttext string) (width int, height int) {\n\n\tc := ftContext(font, fontSize)\n\temSquarePix := int(c.PointToFix32(fontSize) >> 8)\n\treturn len(text) * emSquarePix, emSquarePix\n}\n\n// ftContext does the boiler plate to create a freetype context\nfunc ftContext(font *truetype.Font, fontSize float64) *freetype.Context {\n\tc := freetype.NewContext()\n\tc.SetDPI(72)\n\tc.SetFont(font)\n\tc.SetFontSize(fontSize)\n\n\treturn c\n}\n\n// ParseFont reads a font file and creates a freetype.Font type\nfunc ParseFont(fontReader io.Reader) (*truetype.Font, error) {\n\tfontBytes, err := ioutil.ReadAll(fontReader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tfont, err := freetype.ParseFont(fontBytes)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn font, nil\n}\n\n// MustFont panics if err is not nil or if the font is nil.\nfunc MustFont(font *truetype.Font, err error) *truetype.Font {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif font == nil {\n\t\tpanic(\"font is nil\")\n\t}\n\treturn font\n}\n"
  },
  {
    "path": "xgraphics/util.go",
    "content": "package xgraphics\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"image/color\"\n\t\"image/draw\"\n\t\"math\"\n\n\t\"github.com/BurntSushi/graphics-go/graphics\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/icccm\"\n)\n\n/*\nxgraphics/util.go contains a variety of image manipulation functions that\nare not specific to xgraphics.Image.\n*/\n\n// Scale is a simple wrapper around graphics.Scale.\nfunc Scale(img image.Image, width, height int) draw.Image {\n\tdimg := image.NewRGBA(image.Rect(0, 0, width, height))\n\tgraphics.Scale(dimg, img)\n\n\treturn dimg\n}\n\n// Alpha will modify the alpha channel of the image such that:\n// existingAlpha = existingAlpha * (givenAlpha / 100.0)\nfunc Alpha(dest *Image, alpha int) {\n\tr := dest.Bounds()\n\n\tvar a, x, y, i int\n\tfor x = r.Min.X; x < r.Max.X; x++ {\n\t\tfor y = r.Min.Y; y < r.Max.Y; y++ {\n\t\t\ti = dest.PixOffset(x, y)\n\t\t\ta = int(dest.Pix[i+3])\n\t\t\tdest.Pix[i+3] = uint8((a * alpha) / 100)\n\t\t}\n\t}\n}\n\n// Blend alpha blends the src image (starting at the spt Point) into the\n// dest image.\n// If you're blending into a solid background color, use BlendBgColor\n// instead. (It's more efficient.)\n// Blend does not (currently) blend with the destination's alpha channel,\n// only the source's alpha channel.\nfunc Blend(dest *Image, src image.Image, sp image.Point) {\n\trsrc, dsrc := src.Bounds(), dest.Bounds()\n\t_, smxx, _, smxy := rsrc.Min.X, rsrc.Max.X, rsrc.Min.Y, rsrc.Max.Y\n\tdmnx, dmxx, dmny, dmxy := dsrc.Min.X, dsrc.Max.X, dsrc.Min.Y, dsrc.Max.Y\n\n\tvar sx, dx, sy, dy int\n\tvar sr, sg, sb, sa uint32\n\tvar bgra BGRA\n\tvar alpha float64\n\tfor sx, dx = sp.X, dmnx; sx < smxx && dx < dmxx; sx, dx = sx+1, dx+1 {\n\t\tfor sy, dy = sp.Y, dmny; sy < smxy && dy < dmxy; sy, dy = sy+1, dy+1 {\n\t\t\tsr, sg, sb, sa = src.At(sx, sy).RGBA()\n\t\t\tbgra = dest.At(dx, dy).(BGRA)\n\t\t\talpha = float64(uint8(sa)) / 255.0\n\n\t\t\tdest.SetBGRA(dx, dy, BGRA{\n\t\t\t\tblend(uint8(bgra.B), uint8(sb), alpha),\n\t\t\t\tblend(uint8(bgra.G), uint8(sg), alpha),\n\t\t\t\tblend(uint8(bgra.R), uint8(sr), alpha),\n\t\t\t\t0xff,\n\t\t\t})\n\t\t}\n\t}\n}\n\n// BlendBgColor blends the Image (receiver) into the background color\n// specified. This is more efficient than creating a background image and\n// blending with Blend.\nfunc BlendBgColor(dest *Image, c color.Color) {\n\tr := dest.Bounds()\n\tcr32, cg32, cb32, _ := c.RGBA()\n\tcr, cg, cb := uint8(cr32), uint8(cg32), uint8(cb32)\n\n\tvar bgra BGRA\n\tvar alpha float64\n\tfor x := r.Min.X; x < r.Max.X; x++ {\n\t\tfor y := r.Min.Y; y < r.Max.Y; y++ {\n\t\t\tbgra = dest.At(x, y).(BGRA)\n\t\t\talpha = float64(bgra.A) / 255.0\n\t\t\tdest.SetBGRA(x, y, BGRA{\n\t\t\t\tB: blend(cb, bgra.B, alpha),\n\t\t\t\tG: blend(cg, bgra.G, alpha),\n\t\t\t\tR: blend(cr, bgra.R, alpha),\n\t\t\t\tA: 0xff,\n\t\t\t})\n\t\t}\n\t}\n}\n\n// Blend returns the blended alpha color for src and dest colors.\n// This assumes that the destination has alpha = 1.\nfunc BlendBGRA(dest, src BGRA) BGRA {\n\talpha := float64(src.A) / 255.0\n\treturn BGRA{\n\t\tB: blend(dest.B, src.B, alpha),\n\t\tG: blend(dest.G, src.G, alpha),\n\t\tR: blend(dest.R, src.R, alpha),\n\t\tA: 0xff,\n\t}\n}\n\n// blend calculates the value of a color given some alpha value in [0, 1]\n// and a source and destination color. Note that this assumes that the\n// destination is fully opaque (has an alpha value of 1).\nfunc blend(d, s uint8, alpha float64) uint8 {\n\treturn uint8(float64(s)*alpha + float64(d)*(1-alpha))\n}\n\n// FreePixmap is a convenience function for destroying a pixmap resource\n// on the X server.\n// If you're using an xgraphics.Image value, then its Destroy method will call\n// this for you.\nfunc FreePixmap(X *xgbutil.XUtil, pixid xproto.Pixmap) {\n\txproto.FreePixmap(X.Conn(), pixid)\n}\n\n// FindIcon takes a window id and attempts to return an xgraphics.Image of\n// that window's icon.\n// It will first try to look for an icon in _NET_WM_ICON that is closest to\n// the size specified.\n// If there are no icons in _NET_WM_ICON, then WM_HINTS will be checked for\n// an icon.\n// If an icon is found from either one and doesn't match the size\n// specified, it will be scaled to that size.\n// If the width and height are 0, then the largest icon will be returned with\n// no scaling.\n// If an icon is not found, an error is returned.\nfunc FindIcon(X *xgbutil.XUtil, wid xproto.Window,\n\twidth, height int) (*Image, error) {\n\n\tvar ewmhErr, icccmErr error\n\n\t// First try to get a EWMH style icon.\n\ticon, ewmhErr := findIconEwmh(X, wid, width, height)\n\tif ewmhErr != nil { // now look for an icccm-style icon\n\t\ticon, icccmErr = findIconIcccm(X, wid)\n\t\tif icccmErr != nil {\n\t\t\treturn nil, fmt.Errorf(\"Neither a EWMH-style or ICCCM-style icon \"+\n\t\t\t\t\"could be found for window id %x because: %s *AND* %s\",\n\t\t\t\twid, ewmhErr, icccmErr)\n\t\t}\n\t}\n\n\t// We should have a valid xgraphics.Image if we're here.\n\t// If the size doesn't match what's preferred, scale it.\n\tif width != 0 && height != 0 {\n\t\tif icon.Bounds().Dx() != width || icon.Bounds().Dy() != height {\n\t\t\ticon = icon.Scale(width, height)\n\t\t}\n\t}\n\treturn icon, nil\n}\n\n// findIconEwmh helps FindIcon by trying to return an ewmh-style icon that is\n// closest to the preferred size specified.\nfunc findIconEwmh(X *xgbutil.XUtil, wid xproto.Window,\n\twidth, height int) (*Image, error) {\n\n\ticons, err := ewmh.WmIconGet(X, wid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\ticon := FindBestEwmhIcon(width, height, icons)\n\tif icon == nil {\n\t\treturn nil, fmt.Errorf(\"Could not find any _NET_WM_ICON icon.\")\n\t}\n\n\treturn NewEwmhIcon(X, icon), nil\n}\n\n// findIconIcccm helps FindIcon by trying to return an icccm-style icon.\nfunc findIconIcccm(X *xgbutil.XUtil, wid xproto.Window) (*Image, error) {\n\thints, err := icccm.WmHintsGet(X, wid)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\t// Only continue if the WM_HINTS flags say an icon is specified and\n\t// if at least one of icon pixmap or icon mask is non-zero.\n\tif hints.Flags&icccm.HintIconPixmap == 0 ||\n\t\t(hints.IconPixmap == 0 && hints.IconMask == 0) {\n\n\t\treturn nil, fmt.Errorf(\"No icon found in WM_HINTS.\")\n\t}\n\n\treturn NewIcccmIcon(X, hints.IconPixmap, hints.IconMask)\n}\n\n// FindBestEwmhIcon takes width/height dimensions and a slice of *ewmh.WmIcon\n// and finds the best matching icon of the bunch. We always prefer bigger.\n// If no icons are bigger than the preferred dimensions, use the biggest\n// available. Otherwise, use the smallest icon that is greater than or equal\n// to the preferred dimensions. The preferred dimensions is essentially\n// what you'll likely scale the resulting icon to.\n// If width and height are 0, then the largest icon found will be returned.\nfunc FindBestEwmhIcon(width, height int, icons []ewmh.WmIcon) *ewmh.WmIcon {\n\t// nada nada limonada\n\tif len(icons) == 0 {\n\t\treturn nil\n\t}\n\n\tparea := width * height // preferred size\n\tbest := -1\n\n\t// If zero area, set it to the largest possible.\n\tif parea == 0 {\n\t\tparea = math.MaxInt32\n\t}\n\n\tvar bestArea, iconArea int\n\n\tfor i, icon := range icons {\n\t\t// the first valid icon we've seen; use it!\n\t\tif best == -1 {\n\t\t\tbest = i\n\t\t\tcontinue\n\t\t}\n\n\t\t// load areas for comparison\n\t\tbestArea = int(icons[best].Width * icons[best].Height)\n\t\ticonArea = int(icon.Width * icon.Height)\n\n\t\t// We don't always want to accept bigger icons if our best is\n\t\t// already bigger. But we always want something bigger if our best\n\t\t// is insufficient.\n\t\tif (iconArea >= parea && iconArea <= bestArea) ||\n\t\t\t(bestArea < parea && iconArea > bestArea) {\n\t\t\tbest = i\n\t\t}\n\t}\n\n\tif best > -1 {\n\t\treturn &icons[best]\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "xgraphics/xsurface.go",
    "content": "package xgraphics\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/icccm\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/mousebind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xwindow\"\n)\n\n/*\nxgraphics/xsurface.go contains methods for the Image type that perform X\nrelated requests. Namely, methods that send image data start with 'X'.\n*/\n\n// XSurfaceSet will set the given window's background to this image's pixmap.\n// Note that an image can have multiple surfaces, which is why the window\n// id still needs to be passed to XPaint. A call to XSurfaceSet simply tells\n// X that the window specified should use the pixmap in Image as its\n// background image.\n// Note that XSurfaceSet cannot be called on a sub-image. (An error will be\n// returned if you do.)\n// XSurfaceSet will also allocate an X pixmap if one hasn't been created for\n// this image yet.\n// (Generating a pixmap id can cause an error, so this call could return\n// an error.)\nfunc (im *Image) XSurfaceSet(wid xproto.Window) error {\n\tif im.Subimg {\n\t\treturn fmt.Errorf(\"XSurfaceSet cannot be called on sub-images.\" +\n\t\t\t\"Please set the surface using the original parent image.\")\n\t}\n\tif im.Pixmap == 0 {\n\t\tif err := im.CreatePixmap(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Tell the surface (window) to use this pixmap.\n\txproto.ChangeWindowAttributes(im.X.Conn(), wid,\n\t\txproto.CwBackPixmap, []uint32{uint32(im.Pixmap)})\n\treturn nil\n}\n\n// CreatePixmap allocates an X resource identifier for a pixmap. (It does not\n// do any drawing.) You only need to call this if you're using XDraw/XExpPaint.\n// If you're using XSurfaceSet/XDraw/XPaint, then CreatePixmap is called for\n// you automatically.\nfunc (im *Image) CreatePixmap() error {\n\t// Generate the pixmap id.\n\tpid, err := xproto.NewPixmapId(im.X.Conn())\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Now actually create the pixmap.\n\terr = xproto.CreatePixmapChecked(im.X.Conn(), im.X.Screen().RootDepth,\n\t\tpid, xproto.Drawable(im.X.RootWin()),\n\t\tuint16(im.Bounds().Dx()), uint16(im.Bounds().Dy())).Check()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Now give it to the image.\n\tim.Pixmap = pid\n\treturn nil\n}\n\n// XPaint will write the contents of the pixmap to a window.\n// Note that painting will do nothing if XDraw hasn't been called.\n// XPaint is what switches the buffer (drawn to using XDraw) into the window\n// to be visible. That is, multiple calls to XDraw can be made, and the screen\n// will only be updated once with a call to XPaint.\nfunc (im *Image) XPaint(wid xproto.Window) {\n\t// We clear the whole window here because sometimes we rely on the tiling\n\t// of a background pixmap. If anyone knows if this is a significant\n\t// performance problem, please let me know. (It seems like the whole area\n\t// of the window is cleared when it is resized anyway.)\n\txproto.ClearArea(im.X.Conn(), false, wid, 0, 0, 0, 0)\n}\n\n// XExpPaint achieves a similar result as XPaint and XSurfaceSet, but\n// uses CopyArea instead of setting a background pixmap and using ClearArea.\n// CreatePixmap must be called before using XExpPaint.\n// XExpPaint can be called on sub-images.\n// x and y correspond to the destination x and y to copy the image to.\n//\n// This should not be used on the same image with XSurfaceSet and XPaint.\nfunc (im *Image) XExpPaint(wid xproto.Window, x, y int) {\n\tif im.Pixmap == 0 {\n\t\treturn\n\t}\n\txproto.CopyArea(im.X.Conn(),\n\t\txproto.Drawable(im.Pixmap), xproto.Drawable(wid), im.X.GC(),\n\t\tint16(im.Rect.Min.X), int16(im.Rect.Min.Y),\n\t\tint16(x), int16(y),\n\t\tuint16(im.Rect.Dx()), uint16(im.Rect.Dy()))\n}\n\n// XPaintRects is a convenience function for issuing XDraw requests on\n// each sub-image generated by the rects in the slice provided, and then\n// painting the updated pixmap all at once to the window provided.\n// This is efficient because no pixels are copied when taking a SubImage,\n// and each XDraw call on a sub-image updates the pixels represented by that\n// sub-image and only that sub-image.\nfunc (im *Image) XPaintRects(wid xproto.Window, rects ...image.Rectangle) {\n\tfor _, rect := range rects {\n\t\tif si := im.SubImage(rect).(*Image); si != nil {\n\t\t\tsi.XDraw()\n\t\t}\n\t}\n\tim.XPaint(wid)\n}\n\n// XDraw will write the contents of Image to a pixmap.\n// Note that this is more like a buffer. Drawing does not put the contents\n// on the screen.\n// After drawing, it is necessary to call XPaint to put the contents somewhere.\n// Draw may return an X error if something has gone horribly wrong.\n//\n// XSurfaceSet should be called before XDraw. (If not, X will yell at you.)\n// More specifically, CreatePixmap needs to be called before XDraw, but it is\n// done automatically in XSurfaceSet.\n//\n// If you're using sub-images to update a particular region of the image, XDraw\n// is where you'll see the performance benefit (not XPaint).\nfunc (im *Image) XDraw() {\n\tim.xdraw(false)\n}\n\n// XDrawChecked is the same as XDraw, but issues PutImageChecked requests\n// instead. This should *only* be used for debugging purposes, as each\n// PutImageChecked request blocks for a round trip to the X server.\nfunc (im *Image) XDrawChecked() error {\n\treturn im.xdraw(true)\n}\n\nfunc (im *Image) xdraw(checked bool) error {\n\twidth, height := im.Rect.Dx(), im.Rect.Dy()\n\n\t// Put the raw image data into its own slice.\n\t// If this isn't a sub-image, then skip because it isn't necessary.\n\tvar data []uint8\n\tif !im.Subimg {\n\t\tdata = im.Pix\n\t} else {\n\t\tdata = make([]uint8, width*height*4)\n\t\tfor y := im.Rect.Min.Y; y < im.Rect.Max.Y; y++ {\n\t\t\ti := (y - im.Rect.Min.Y) * width * 4\n\t\t\tcopy(data[i:i+4*width], im.Pix[im.PixOffset(im.Rect.Min.X, y):])\n\t\t}\n\t}\n\n\t// X's max request size (by default) is (2^16) * 4 = 262144 bytes, which\n\t// corresponds precisely to a 256x256 sized image with 32 bits per pixel.\n\t// Thus, we check the size of the image data and calculate the number of\n\t// rows of the image we'll send in each request. If a single row of an\n\t// image exceeds the max request length, we're in trouble.  N.B. The\n\t// constant 28 comes from the fixed size part of a PutImage request.\n\trowsPer := (xgbutil.MaxReqSize - 28) / (width * 4)\n\tbytesPer := rowsPer * width * 4\n\n\t// The start x position of what we're sending. Doesn't change.\n\txpos := im.Rect.Min.X\n\n\t// The start y position of what we're sending. Increases based on the\n\t// number of rows of the image we send in each request.\n\typos := im.Rect.Min.Y\n\n\t// The height of each PutImage request. It's always rowsPer, unless its\n\t// the last request and we're not sending the maximum number of bytes.\n\theightPer := 0\n\n\t// The start and end positions of the raw bytes being sent.\n\tstart, end := 0, 0\n\n\t// The sliced data we're sending, for convenience.\n\tvar toSend []byte\n\n\tfor end < len(data) {\n\t\tend = start + bytesPer\n\t\tif end > len(data) { // make sure end doesn't extend beyond data\n\t\t\tend = len(data)\n\t\t}\n\n\t\ttoSend = data[start:end]\n\t\theightPer = len(toSend) / 4 / width\n\n\t\tif checked {\n\t\t\terr := xproto.PutImageChecked(\n\t\t\t\tim.X.Conn(), xproto.ImageFormatZPixmap,\n\t\t\t\txproto.Drawable(im.Pixmap), im.X.GC(),\n\t\t\t\tuint16(width), uint16(heightPer), int16(xpos), int16(ypos),\n\t\t\t\t0, 24, toSend).Check()\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t} else {\n\t\t\txproto.PutImage(im.X.Conn(), xproto.ImageFormatZPixmap,\n\t\t\t\txproto.Drawable(im.Pixmap), im.X.GC(),\n\t\t\t\tuint16(width), uint16(heightPer), int16(xpos), int16(ypos),\n\t\t\t\t0, 24, toSend)\n\t\t}\n\t\tstart = end\n\t\typos += rowsPer\n\t}\n\n\treturn nil\n}\n\n// XShow creates a new window and paints the image to the window.\n// This is useful for debugging, or if you're creating an image viewer.\n// XShow also returns the xwindow.Window value, in case you want to do\n// further processing. (Like attach event handlers.)\nfunc (im *Image) XShow() *xwindow.Window {\n\treturn im.XShowExtra(\"\", false)\n}\n\n// XShowName is just like XShow, except it sets the name of the window to the\n// name provided, and will quit the current event loop if 'quit' is true when\n// the window is closed.\n// If name is empty and quit is false, then the behavior is precisely the same\n// as XShow.\nfunc (im *Image) XShowExtra(name string, quit bool) *xwindow.Window {\n\tif len(name) == 0 {\n\t\tname = \"xgbutil Image Window\"\n\t}\n\tw, h := im.Rect.Dx(), im.Rect.Dy()\n\n\twin, err := xwindow.Generate(im.X)\n\tif err != nil {\n\t\txgbutil.Logger.Printf(\"Could not generate new window id: %s\", err)\n\t\treturn nil\n\t}\n\n\t// Create a very simple window with dimensions equal to the image.\n\twin.Create(im.X.RootWin(), 0, 0, w, h, 0)\n\n\t// Make this window close gracefully.\n\twin.WMGracefulClose(func(w *xwindow.Window) {\n\t\txevent.Detach(w.X, w.Id)\n\t\tkeybind.Detach(w.X, w.Id)\n\t\tmousebind.Detach(w.X, w.Id)\n\t\tw.Destroy()\n\n\t\tif quit {\n\t\t\txevent.Quit(w.X)\n\t\t}\n\t})\n\n\t// Set WM_STATE so it is interpreted as a top-level window.\n\terr = icccm.WmStateSet(im.X, win.Id, &icccm.WmState{\n\t\tState: icccm.StateNormal,\n\t})\n\tif err != nil { // not a fatal error\n\t\txgbutil.Logger.Printf(\"Could not set WM_STATE: %s\", err)\n\t}\n\n\t// Set WM_NORMAL_HINTS so the window can't be resized.\n\terr = icccm.WmNormalHintsSet(im.X, win.Id, &icccm.NormalHints{\n\t\tFlags:     icccm.SizeHintPMinSize | icccm.SizeHintPMaxSize,\n\t\tMinWidth:  uint(w),\n\t\tMinHeight: uint(h),\n\t\tMaxWidth:  uint(w),\n\t\tMaxHeight: uint(h),\n\t})\n\tif err != nil { // not a fatal error\n\t\txgbutil.Logger.Printf(\"Could not set WM_NORMAL_HINTS: %s\", err)\n\t}\n\n\t// Set _NET_WM_NAME so it looks nice.\n\terr = ewmh.WmNameSet(im.X, win.Id, name)\n\tif err != nil { // not a fatal error\n\t\txgbutil.Logger.Printf(\"Could not set _NET_WM_NAME: %s\", err)\n\t}\n\n\t// Paint our image before mapping.\n\tim.XSurfaceSet(win.Id)\n\tim.XDraw()\n\tim.XPaint(win.Id)\n\n\t// Now we can map, since we've set all our properties.\n\t// (The initial map is when the window manager starts managing.)\n\twin.Map()\n\n\treturn win\n}\n"
  },
  {
    "path": "xinerama/doc.go",
    "content": "/*\nPackage xinerama provides a convenience function to retrieve the geometry of\nall active heads sorted in order from left to right and then top to bottom.\nWhile Xinerama is an old extension that isn't often used in lieu of RandR and\nTwinView, it can still be used to query for information about all active heads.\nThat is, even if TwinView or RandR is being used, Xinerama will still report\nthe correct geometry of each head.\n*/\npackage xinerama\n"
  },
  {
    "path": "xinerama/xinerama.go",
    "content": "package xinerama\n\nimport \"sort\"\n\nimport (\n\t\"github.com/BurntSushi/xgb/xinerama\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/xrect\"\n)\n\n// Alias so we use it as a receiver to satisfy sort.Interface\ntype Heads []xrect.Rect\n\n// Len satisfies 'Len' in sort.Interface.\nfunc (hds Heads) Len() int {\n\treturn len(hds)\n}\n\n// Less satisfies 'Less' in sort.Interface.\nfunc (hds Heads) Less(i int, j int) bool {\n\treturn hds[i].X() < hds[j].X() || (hds[i].X() == hds[j].X() &&\n\t\thds[i].Y() < hds[j].Y())\n}\n\n// Swap does just that. Nothing to see here...\nfunc (hds Heads) Swap(i int, j int) {\n\thds[i], hds[j] = hds[j], hds[i]\n}\n\n// PhyiscalHeads returns the list of heads in a physical ordering.\n// Namely, left to right then top to bottom. (Defined by (X, Y).)\n// Xinerama must have been initialized, otherwise the xinerama.QueryScreens\n// request will panic.\n// PhysicalHeads also checks to make sure each rectangle has a unique (x, y)\n// tuple, so as not to return the geometry of cloned displays.\n// (At present moment, xgbutil initializes Xinerama automatically during\n// initial connection.)\nfunc PhysicalHeads(xu *xgbutil.XUtil) (Heads, error) {\n\txinfo, err := xinerama.QueryScreens(xu.Conn()).Reply()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\thds := make(Heads, 0)\n\tfor _, info := range xinfo.ScreenInfo {\n\t\thead := xrect.New(int(info.XOrg), int(info.YOrg),\n\t\t\tint(info.Width), int(info.Height))\n\n\t\t// Maybe Xinerama is enabled, but we have cloned displays...\n\t\tunique := true\n\t\tfor _, h := range hds {\n\t\t\tif h.X() == head.X() && h.Y() == head.Y() {\n\t\t\t\tunique = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tif unique {\n\t\t\thds = append(hds, head)\n\t\t}\n\t}\n\n\tsort.Sort(hds)\n\treturn hds, nil\n}\n"
  },
  {
    "path": "xprop/atom.go",
    "content": "package xprop\n\n/*\nxprop/atom.go contains functions related to interning atoms and retrieving\natom names from an atom identifier.\n\nIt also manages an atom cache so that once an atom is interned from the X\nserver, all future atom interns use that value. (So that one and only one\nrequest is sent for interning each atom.)\n*/\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// Atm is a short alias for Atom in the common case of interning an atom.\n// Namely, interning the atom always succeeds. (If the atom does not already\n// exist, a new one is created.)\nfunc Atm(xu *xgbutil.XUtil, name string) (xproto.Atom, error) {\n\taid, err := Atom(xu, name, false)\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif aid == 0 {\n\t\treturn 0, fmt.Errorf(\"Atm: '%s' returned an identifier of 0.\", name)\n\t}\n\n\treturn aid, err\n}\n\n// Atom interns an atom and panics if there is any error.\nfunc Atom(xu *xgbutil.XUtil, name string,\n\tonlyIfExists bool) (xproto.Atom, error) {\n\n\t// Check the cache first\n\tif aid, ok := atomGet(xu, name); ok {\n\t\treturn aid, nil\n\t}\n\n\treply, err := xproto.InternAtom(xu.Conn(), onlyIfExists,\n\t\tuint16(len(name)), name).Reply()\n\tif err != nil {\n\t\treturn 0, fmt.Errorf(\"Atom: Error interning atom '%s': %s\", name, err)\n\t}\n\n\t// If we're here, it means we didn't have this atom cached. So cache it!\n\tcacheAtom(xu, name, reply.Atom)\n\n\treturn reply.Atom, nil\n}\n\n// AtomName fetches a string representation of an ATOM given its integer id.\nfunc AtomName(xu *xgbutil.XUtil, aid xproto.Atom) (string, error) {\n\t// Check the cache first\n\tif atomName, ok := atomNameGet(xu, aid); ok {\n\t\treturn string(atomName), nil\n\t}\n\n\treply, err := xproto.GetAtomName(xu.Conn(), aid).Reply()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"AtomName: Error fetching name for ATOM \"+\n\t\t\t\"id '%d': %s\", aid, err)\n\t}\n\n\t// If we're here, it means we didn't have ths ATOM id cached. So cache it.\n\tatomName := string(reply.Name)\n\tcacheAtom(xu, atomName, aid)\n\n\treturn atomName, nil\n}\n\n// atomGet retrieves an atom identifier from a cache if it exists.\nfunc atomGet(xu *xgbutil.XUtil, name string) (xproto.Atom, bool) {\n\txu.AtomsLck.RLock()\n\tdefer xu.AtomsLck.RUnlock()\n\n\taid, ok := xu.Atoms[name]\n\treturn aid, ok\n}\n\n// atomNameGet retrieves an atom name from a cache if it exists.\nfunc atomNameGet(xu *xgbutil.XUtil, aid xproto.Atom) (string, bool) {\n\txu.AtomNamesLck.RLock()\n\tdefer xu.AtomNamesLck.RUnlock()\n\n\tname, ok := xu.AtomNames[aid]\n\treturn name, ok\n}\n\n// cacheAtom puts an atom into the cache.\nfunc cacheAtom(xu *xgbutil.XUtil, name string, aid xproto.Atom) {\n\txu.AtomsLck.Lock()\n\txu.AtomNamesLck.Lock()\n\tdefer xu.AtomsLck.Unlock()\n\tdefer xu.AtomNamesLck.Unlock()\n\n\txu.Atoms[name] = aid\n\txu.AtomNames[aid] = name\n}\n"
  },
  {
    "path": "xprop/doc.go",
    "content": "/*\nPackage xprop provides a cache for interning atoms and helper functions for\ndealing with GetProperty and ChangeProperty X requests.\n\nAtoms\n\nAtoms in X are interned, meaning that strings are assigned unique integer\nidentifiers. This minimizes the amount of data transmitted over an X connection.\n\nOnce atoms have been interned, they are never changed while the X server is\nrunning. xgbutil takes advantage of this invariant and will only issue an\nintern atom request once and cache the result.\n\nTo use the xprop package to intern an atom, use Atom:\n\n\tatom, err := xprop.Atom(XUtilValue, \"THE_ATOM_NAME\", false)\n\tif err == nil {\n\t\tprintln(\"The atom number: \", atom.Atom)\n\t}\n\nThe 'false' parameter corresponds to the 'only_if_exists' parameter of the\nX InternAtom request. When it's false, the atom being interned always returns\na non-zero atom number---even if the string being interned hasn't been interned\nbefore. If 'only_if_exists' is true, the atom being interned will return a 0\natom number if it hasn't already been interned.\n\nThe typical case is to set 'only_if_exists' to false. To this end, xprop.Atm is\nan alias that always sets this value to false.\n\nThe reverse can also be done: getting an atom string if you have an atom\nnumber. This can be done with the xprop.AtomName function.\n\nProperties\n\nThe other facility of xprop is to help with the use of GetProperty and\nChangeProperty. Please see the source code of the ewmh package for plenty of\nexamples.\n\n*/\npackage xprop\n"
  },
  {
    "path": "xprop/xprop.go",
    "content": "package xprop\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// GetProperty abstracts the messiness of calling xgb.GetProperty.\nfunc GetProperty(xu *xgbutil.XUtil, win xproto.Window, atom string) (\n\t*xproto.GetPropertyReply, error) {\n\n\tatomId, err := Atm(xu, atom)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treply, err := xproto.GetProperty(xu.Conn(), false, win, atomId,\n\t\txproto.GetPropertyTypeAny, 0, (1<<32)-1).Reply()\n\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"GetProperty: Error retrieving property '%s' \"+\n\t\t\t\"on window %x: %s\", atom, win, err)\n\t}\n\n\tif reply.Format == 0 {\n\t\treturn nil, fmt.Errorf(\"GetProperty: No such property '%s' on \"+\n\t\t\t\"window %x.\", atom, win)\n\t}\n\n\treturn reply, nil\n}\n\n// ChangeProperty abstracts the semi-nastiness of xgb.ChangeProperty.\nfunc ChangeProp(xu *xgbutil.XUtil, win xproto.Window, format byte, prop string,\n\ttyp string, data []byte) error {\n\n\tpropAtom, err := Atm(xu, prop)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ttypAtom, err := Atm(xu, typ)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn xproto.ChangePropertyChecked(xu.Conn(), xproto.PropModeReplace, win,\n\t\tpropAtom, typAtom, format,\n\t\tuint32(len(data)/(int(format)/8)), data).Check()\n}\n\n// ChangeProperty32 makes changing 32 bit formatted properties easier\n// by constructing the raw X data for you.\nfunc ChangeProp32(xu *xgbutil.XUtil, win xproto.Window, prop string, typ string,\n\tdata ...uint) error {\n\n\tbuf := make([]byte, len(data)*4)\n\tfor i, datum := range data {\n\t\txgb.Put32(buf[(i*4):], uint32(datum))\n\t}\n\n\treturn ChangeProp(xu, win, 32, prop, typ, buf)\n}\n\n// WindowToUint is a covenience function for converting []xproto.Window\n// to []uint.\nfunc WindowToInt(ids []xproto.Window) []uint {\n\tids32 := make([]uint, len(ids))\n\tfor i, v := range ids {\n\t\tids32[i] = uint(v)\n\t}\n\treturn ids32\n}\n\n// AtomToInt is a covenience function for converting []xproto.Atom\n// to []uint.\nfunc AtomToUint(ids []xproto.Atom) []uint {\n\tids32 := make([]uint, len(ids))\n\tfor i, v := range ids {\n\t\tids32[i] = uint(v)\n\t}\n\treturn ids32\n}\n\n// StrToAtoms is a convenience function for converting\n// []string to []uint32 atoms.\n// NOTE: If an atom name in the list doesn't exist, it will be created.\nfunc StrToAtoms(xu *xgbutil.XUtil, atomNames []string) ([]uint, error) {\n\tvar err error\n\tatoms := make([]uint, len(atomNames))\n\tfor i, atomName := range atomNames {\n\t\ta, err := Atom(xu, atomName, false)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tatoms[i] = uint(a)\n\t}\n\treturn atoms, err\n}\n\n// PropValAtom transforms a GetPropertyReply struct into an ATOM name.\n// The property reply must be in 32 bit format.\nfunc PropValAtom(xu *xgbutil.XUtil, reply *xproto.GetPropertyReply,\n\terr error) (string, error) {\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif reply.Format != 32 {\n\t\treturn \"\", fmt.Errorf(\"PropValAtom: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\n\treturn AtomName(xu, xproto.Atom(xgb.Get32(reply.Value)))\n}\n\n// PropValAtoms is the same as PropValAtom, except that it returns a slice\n// of atom names. Also must be 32 bit format.\n// This is a method of an XUtil struct, unlike the other 'PropVal...' functions.\nfunc PropValAtoms(xu *xgbutil.XUtil, reply *xproto.GetPropertyReply,\n\terr error) ([]string, error) {\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif reply.Format != 32 {\n\t\treturn nil, fmt.Errorf(\"PropValAtoms: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\n\tids := make([]string, reply.ValueLen)\n\tvals := reply.Value\n\tfor i := 0; len(vals) >= 4; i++ {\n\t\tids[i], err = AtomName(xu, xproto.Atom(xgb.Get32(vals)))\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tvals = vals[4:]\n\t}\n\treturn ids, nil\n}\n\n// PropValWindow transforms a GetPropertyReply struct into an X resource\n// window identifier.\n// The property reply must be in 32 bit format.\nfunc PropValWindow(reply *xproto.GetPropertyReply,\n\terr error) (xproto.Window, error) {\n\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif reply.Format != 32 {\n\t\treturn 0, fmt.Errorf(\"PropValId: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\treturn xproto.Window(xgb.Get32(reply.Value)), nil\n}\n\n// PropValWindows is the same as PropValWindow, except that it returns a slice\n// of identifiers. Also must be 32 bit format.\nfunc PropValWindows(reply *xproto.GetPropertyReply,\n\terr error) ([]xproto.Window, error) {\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif reply.Format != 32 {\n\t\treturn nil, fmt.Errorf(\"PropValIds: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\n\tids := make([]xproto.Window, reply.ValueLen)\n\tvals := reply.Value\n\tfor i := 0; len(vals) >= 4; i++ {\n\t\tids[i] = xproto.Window(xgb.Get32(vals))\n\t\tvals = vals[4:]\n\t}\n\treturn ids, nil\n}\n\n// PropValNum transforms a GetPropertyReply struct into an unsigned\n// integer. Useful when the property value is a single integer.\nfunc PropValNum(reply *xproto.GetPropertyReply, err error) (uint, error) {\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif reply.Format != 32 {\n\t\treturn 0, fmt.Errorf(\"PropValNum: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\treturn uint(xgb.Get32(reply.Value)), nil\n}\n\n// PropValNums is the same as PropValNum, except that it returns a slice\n// of integers. Also must be 32 bit format.\nfunc PropValNums(reply *xproto.GetPropertyReply, err error) ([]uint, error) {\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif reply.Format != 32 {\n\t\treturn nil, fmt.Errorf(\"PropValIds: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\n\tnums := make([]uint, reply.ValueLen)\n\tvals := reply.Value\n\tfor i := 0; len(vals) >= 4; i++ {\n\t\tnums[i] = uint(xgb.Get32(vals))\n\t\tvals = vals[4:]\n\t}\n\treturn nums, nil\n}\n\n// PropValNum64 transforms a GetPropertyReply struct into a 64 bit\n// integer. Useful when the property value is a single integer.\nfunc PropValNum64(reply *xproto.GetPropertyReply, err error) (int64, error) {\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\tif reply.Format != 32 {\n\t\treturn 0, fmt.Errorf(\"PropValNum: Expected format 32 but got %d\",\n\t\t\treply.Format)\n\t}\n\treturn int64(xgb.Get32(reply.Value)), nil\n}\n\n// PropValStr transforms a GetPropertyReply struct into a string.\n// Useful when the property value is a null terminated string represented\n// by integers. Also must be 8 bit format.\nfunc PropValStr(reply *xproto.GetPropertyReply, err error) (string, error) {\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\tif reply.Format != 8 {\n\t\treturn \"\", fmt.Errorf(\"PropValStr: Expected format 8 but got %d\",\n\t\t\treply.Format)\n\t}\n\treturn string(reply.Value), nil\n}\n\n// PropValStrs is the same as PropValStr, except that it returns a slice\n// of strings. The raw byte string is a sequence of null terminated strings,\n// which is translated into a slice of strings.\nfunc PropValStrs(reply *xproto.GetPropertyReply, err error) ([]string, error) {\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tif reply.Format != 8 {\n\t\treturn nil, fmt.Errorf(\"PropValStrs: Expected format 8 but got %d\",\n\t\t\treply.Format)\n\t}\n\n\tvar strs []string\n\tsstart := 0\n\tfor i, c := range reply.Value {\n\t\tif c == 0 {\n\t\t\tstrs = append(strs, string(reply.Value[sstart:i]))\n\t\t\tsstart = i + 1\n\t\t}\n\t}\n\tif sstart < int(reply.ValueLen) {\n\t\tstrs = append(strs, string(reply.Value[sstart:]))\n\t}\n\treturn strs, nil\n}\n"
  },
  {
    "path": "xrect/doc.go",
    "content": "/*\nPackage xrect defines a Rect interface and an XRect type implementing the Rect\ninterface for working with X rectangles. Namely, X rectangles are specified by\nthe 4-tuple (x, y, width, height) where the origin is the top-left corner and\nthe width and height *must* be non-zero.\n\nSome of the main features of this package include finding the area of\nintersection of two rectangles, finding the largest overlap between some\nrectangle and a set of rectangles, applying partial struts to rectangles\nrepresenting all active heads, and a function to subtract two rectangles.\n*/\npackage xrect\n"
  },
  {
    "path": "xrect/xrect.go",
    "content": "package xrect\n\nimport \"fmt\"\n\n// Define a base and simple Rect interface.\ntype Rect interface {\n\tX() int\n\tY() int\n\tWidth() int\n\tHeight() int\n\tXSet(x int)\n\tYSet(y int)\n\tWidthSet(width int)\n\tHeightSet(height int)\n\tPieces() (int, int, int, int)\n}\n\n// RectPieces just returns a four-tuple of x, y, width and height\nfunc RectPieces(xr Rect) (int, int, int, int) {\n\treturn xr.X(), xr.Y(), xr.Width(), xr.Height()\n}\nfunc Pieces(xr Rect) (int, int, int, int) {\n\treturn RectPieces(xr)\n}\n\n// Provide a simple implementation of a rect.\n// Maybe this will be all we need?\ntype XRect struct {\n\tx, y          int\n\twidth, height int\n}\n\n// Provide the ability to construct an XRect.\nfunc New(x, y, w, h int) *XRect {\n\treturn &XRect{x, y, w, h}\n}\n\nfunc (r *XRect) String() string {\n\treturn fmt.Sprintf(\"[(%d, %d) %dx%d]\", r.x, r.y, r.width, r.height)\n}\n\n// Satisfy the Rect interface\nfunc (r *XRect) X() int {\n\treturn r.x\n}\n\nfunc (r *XRect) Y() int {\n\treturn r.y\n}\n\nfunc (r *XRect) Width() int {\n\treturn r.width\n}\n\nfunc (r *XRect) Height() int {\n\treturn r.height\n}\n\nfunc (r *XRect) XSet(x int) {\n\tr.x = x\n}\n\nfunc (r *XRect) YSet(y int) {\n\tr.y = y\n}\n\nfunc (r *XRect) WidthSet(width int) {\n\tr.width = width\n}\n\nfunc (r *XRect) HeightSet(height int) {\n\tr.height = height\n}\n\n// Pieces just returns a four-tuple of x, y, width and height\nfunc (r *XRect) Pieces() (int, int, int, int) {\n\treturn r.X(), r.Y(), r.Width(), r.Height()\n}\n\n// Valid returns whether a rectangle is valid or not. i.e., a width AND height\n// not equal to zero.\nfunc Valid(r Rect) bool {\n\treturn r.Width() != 0 && r.Height() != 0\n}\n\n// Subtract subtracts r2 from r1 and returns the result as a\n// new slice of Rects.\n// Basically, rectangle subtraction works by cutting r2 out of r1, and returning\n// the resulting rectangles.\n// If r1 does not overlap r2, then only one rectangle is returned and is\n// equivalent to r1.\n// If r2 covers r1, then no rectangles are returned.\n// If r1 covers r2, then four rectangles are returned.\n// If r2 partially overlaps r1, then one, two or three rectangles are returned.\nfunc Subtract(r1 Rect, r2 Rect) []Rect {\n\tr1x1, r1y1, r1w, r1h := r1.Pieces()\n\tr2x1, r2y1, r2w, r2h := r2.Pieces()\n\n\tr1x2, r1y2 := r1x1+r1w, r1y1+r1h\n\tr2x2, r2y2 := r2x1+r2w, r2y1+r2h\n\n\t// No intersection; return r1.\n\tif r2x1 >= r1x2 || r1x1 >= r2x2 || r2y1 >= r1y2 || r1y1 >= r2y2 {\n\t\treturn []Rect{New(r1x1, r1y1, r1w, r1h)}\n\t}\n\n\t// r2 covers r1; so subtraction yields no rectangles.\n\tif r1x1 >= r2x1 && r1y1 >= r2y1 && r1x2 <= r2x2 && r1y2 <= r2y2 {\n\t\treturn []Rect{}\n\t}\n\n\t// Now generate each of the four possible rectangles and add them only\n\t// if they are valid (i.e., width/height >= 1)\n\tresult := make([]Rect, 0, 4)\n\n\trect1 := New(r1x1, r1y1, r1w, r2y1-r1y1)\n\trect2 := New(r1x1, r1y1, r2x1-r1x1, r1h)\n\trect3 := New(r1x1, r2y2, r1w, r1h-((r2y1-r1y1)+r2h))\n\trect4 := New(r2x2, r1y1, r1w-((r2x1-r1x1)+r2w), r1h)\n\n\tif Valid(rect1) {\n\t\tresult = append(result, rect1)\n\t}\n\tif Valid(rect2) {\n\t\tresult = append(result, rect2)\n\t}\n\tif Valid(rect3) {\n\t\tresult = append(result, rect3)\n\t}\n\tif Valid(rect4) {\n\t\tresult = append(result, rect4)\n\t}\n\n\treturn result\n}\n\n// IntersectArea takes two rectangles satisfying the Rect interface and\n// returns the area of their intersection. If there is no intersection, return\n// 0 area.\nfunc IntersectArea(r1 Rect, r2 Rect) int {\n\tx1, y1, w1, h1 := RectPieces(r1)\n\tx2, y2, w2, h2 := RectPieces(r2)\n\tif x2 < x1+w1 && x2+w2 > x1 && y2 < y1+h1 && y2+h2 > y1 {\n\t\tiw := min(x1+w1-1, x2+w2-1) - max(x1, x2) + 1\n\t\tih := min(y1+h1-1, y2+h2-1) - max(y1, y2) + 1\n\t\treturn iw * ih\n\t}\n\n\treturn 0\n}\n\n// LargestOverlap returns the index of the rectangle in 'haystack' that has the\n// largest overlap with the rectangle 'needle'.\n// This is commonly used to find which monitor a window should belong on.\n// (Since it can technically be partially displayed on more than one monitor\n// at a time.)\n// Be careful, the return value can be -1 if there is no overlap.\nfunc LargestOverlap(needle Rect, haystack []Rect) int {\n\tbiggestArea := 0\n\treti := -1\n\n\tvar area int\n\tfor i, possible := range haystack {\n\t\tarea = IntersectArea(needle, possible)\n\t\tif area > biggestArea {\n\t\t\tbiggestArea = area\n\t\t\treti = i\n\t\t}\n\t}\n\treturn reti\n}\n\n// ApplyStrut takes a list of Rects (typically the rectangles that represent\n// each physical head in this case), the root window geometry,\n// and a set of parameters representing a\n// strut, and modifies the list of Rects to account for that strut.\n// That is, it shrinks each rect.\n// Note that if struts overlap, the *most restrictive* one is used. This seems\n// like the most sensible response to a weird scenario.\n// (If you don't have a partial strut, just use '0' for the extra fields.)\n// See xgbutil/examples/workarea-struts for an example of how to use this to\n// get accurate workarea for each physical head.\nfunc ApplyStrut(rects []Rect, rootWidth, rootHeight uint,\n\tleft, right, top, bottom,\n\tleft_start_y, left_end_y, right_start_y, right_end_y,\n\ttop_start_x, top_end_x, bottom_start_x, bottom_end_x uint) {\n\n\tvar nx, ny uint // 'n*' are new values that may or may not be used\n\tvar nw, nh uint\n\tvar x_, y_, w_, h_ int\n\tvar x, y, w, h uint\n\tvar bt, tp, lt, rt bool\n\trWidth, rHeight := rootWidth, rootHeight\n\n\t// The essential idea of struts, and particularly partial struts, is that\n\t// one piece of a border of the screen can be \"reserved\" for some\n\t// special windows like docks, panels, taskbars and system trays.\n\t// Since we assume that one window can only reserve one piece of a border\n\t// (either top, left, right or bottom), we iterate through each rect\n\t// in our list and check if that rect is affected by the given strut.\n\t// If it is, we modify the current rect appropriately.\n\t// TODO: Fix this so old school _NET_WM_STRUT can work too. It actually\n\t// should be pretty simple: change conditions like 'if tp' to\n\t// 'if tp || (top_start_x == 0 && top_end_x == 0 && top != 0)'.\n\t// Thus, we would end up changing every rect, which is what old school\n\t// struts should do. We may also make a conscious choice to ignore them\n\t// when 'rects' has more than one rect, since the old school struts will\n\t// typically result in undesirable behavior.\n\tfor _, rect := range rects {\n\t\tx_, y_, w_, h_ = RectPieces(rect)\n\t\tx, y, w, h = uint(x_), uint(y_), uint(w_), uint(h_)\n\n\t\tbt = bottom_start_x != bottom_end_x &&\n\t\t\t(xInRect(bottom_start_x, rect) || xInRect(bottom_end_x, rect))\n\t\ttp = top_start_x != top_end_x &&\n\t\t\t(xInRect(top_start_x, rect) || xInRect(top_end_x, rect))\n\t\tlt = left_start_y != left_end_y &&\n\t\t\t(yInRect(left_start_y, rect) || yInRect(left_end_y, rect))\n\t\trt = right_start_y != right_end_y &&\n\t\t\t(yInRect(right_start_y, rect) || yInRect(right_end_y, rect))\n\n\t\tif bt {\n\t\t\tnh = h - (bottom - ((rHeight - h) - y))\n\t\t\tif nh < uint(rect.Height()) {\n\t\t\t\trect.HeightSet(int(nh))\n\t\t\t}\n\t\t} else if tp {\n\t\t\tnh = h - (top - y)\n\t\t\tif nh < uint(rect.Height()) {\n\t\t\t\trect.HeightSet(int(nh))\n\t\t\t}\n\n\t\t\tny = top\n\t\t\tif ny > uint(rect.Y()) {\n\t\t\t\trect.YSet(int(ny))\n\t\t\t}\n\t\t} else if rt {\n\t\t\tnw = w - (right - ((rWidth - w) - x))\n\t\t\tif nw < uint(rect.Width()) {\n\t\t\t\trect.WidthSet(int(nw))\n\t\t\t}\n\t\t} else if lt {\n\t\t\tnw = w - (left - x)\n\t\t\tif nw < uint(rect.Width()) {\n\t\t\t\trect.WidthSet(int(nw))\n\t\t\t}\n\n\t\t\tnx = left\n\t\t\tif nx > uint(rect.X()) {\n\t\t\t\trect.XSet(int(nx))\n\t\t\t}\n\t\t}\n\t}\n}\n\n// xInRect is whether a particular x-coordinate is vertically constrained by\n// a rectangle.\nfunc xInRect(xtest uint, rect Rect) bool {\n\tx, _, w, _ := RectPieces(rect)\n\treturn int(xtest) >= x && int(xtest) < (x+w)\n}\n\n// yInRect is whether a particular y-coordinate is horizontally constrained by\n// a rectangle.\nfunc yInRect(ytest uint, rect Rect) bool {\n\t_, y, _, h := RectPieces(rect)\n\treturn int(ytest) >= y && int(ytest) < (y+h)\n}\n\nfunc min(a, b int) int {\n\tif a < b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc max(a, b int) int {\n\tif a > b {\n\t\treturn a\n\t}\n\treturn b\n}\n"
  },
  {
    "path": "xwindow/doc.go",
    "content": "/*\nPackage xwindow defines a window type that provides easy access to common\nwindow operations while hiding many of the more obscure X parameters. Examples\nof such window operations include, but are not limited to, creating a window,\nmapping a window, moving/resizing a window and getting the geometry of a\ntop-level client window including the window manager's decorations.\n\nNew and Generate functions are provided as constructors. New should be used\nwhen you already have a window id, and it cannot fail. Generate should be used\nwhen you need to allocate a new window identifier. Since allocating a new\nwindow identifier can fail, an error could be returned.\n\nNote that methods starting with 'WM' should only be used with a window manager\nrunning that supports the EWMH specification. You should otherwise try to use\nthe corresponding methods without the 'WM' prefix.\n\nA quick example\n\nTo create a window with a blue background that is 500 pixels wide and 200\npixels tall and map the window, use something like:\n\n\twin, err := xwindow.Generate(X)\n\tif err != nil {\n\t\tlog.Fatal(err)\n\t}\n\twin.Create(X.RootWin(), 0, 0, 500, 200, xproto.CwBackPixel, 0x0000ff)\n\twin.Map()\n\nYou may also want to use CreateChecked instead of Create if you want to see if\nthere was an error when creating a window.\n\nMore examples\n\nThe xwindow package is used in many of the examples in the examples directory\nof the xgbutil package. Of particular interest is window-name-sizes, which\nprints the name and size of each top-level client window. (The geometry of the\nwindow is found using DecorGeometry.)\n*/\npackage xwindow\n"
  },
  {
    "path": "xwindow/ewmh.go",
    "content": "package xwindow\n\n/*\nxwindow/ewmh.go contains several methods that rely on EWMH support in\nthe currently running window manager.\n*/\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/ewmh\"\n\t\"github.com/BurntSushi/xgbutil/xrect\"\n)\n\n// DecorGeometry retrieves the client's width and height including decorations.\n// This can be tricky. In a non-parenting window manager, the width/height of\n// a client can be found by inspecting the client directly. In a reparenting\n// window manager like Openbox, the parent of the client reflects the true\n// width/height. Still yet, in KWin, it's the parent of the parent of the\n// client that reflects the true width/height.\n// The idea then is to traverse up the tree until we hit the root window.\n// Therefore, we're at a top-level window which should accurately reflect\n// the width/height.\nfunc (w *Window) DecorGeometry() (xrect.Rect, error) {\n\tparent := w\n\tfor {\n\t\ttempParent, err := parent.Parent()\n\t\tif err != nil || tempParent.Id == w.X.RootWin() {\n\t\t\tbreak\n\t\t}\n\t\tparent = tempParent\n\t}\n\treturn RawGeometry(w.X, xproto.Drawable(parent.Id))\n}\n\n// WMMoveResize is an accurate means of resizing a window, accounting for\n// decorations. Usually, the x,y coordinates are fine---we just need to\n// adjust the width and height.\n// This should be used when moving/resizing top-level client windows with\n// reparenting window managers that support EWMH.\nfunc (w *Window) WMMoveResize(x, y, width, height int) error {\n\tneww, newh, err := adjustSize(w.X, w.Id, width, height)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ewmh.MoveresizeWindowExtra(w.X, w.Id, x, y, neww, newh,\n\t\txproto.GravityBitForget, 2, true, true)\n}\n\n// WMMove changes the position of a window without touching the size.\n// This should be used when moving a top-level client window with\n// reparenting winow managers that support EWMH.\nfunc (w *Window) WMMove(x, y int) error {\n\treturn ewmh.MoveWindow(w.X, w.Id, x, y)\n}\n\n// WMResize changes the size of a window without touching the position.\n// This should be used when resizing a top-level client window with\n// reparenting window managers that support EWMH.\nfunc (w *Window) WMResize(width, height int) error {\n\tneww, newh, err := adjustSize(w.X, w.Id, width, height)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn ewmh.ResizeWindow(w.X, w.Id, neww, newh)\n}\n\n// adjustSize takes a client and dimensions, and adjust them so that they'll\n// account for window decorations. For example, if you want a window to be\n// 200 pixels wide, a window manager will typically determine that as\n// you wanting the *client* to be 200 pixels wide. The end result is that\n// the client plus decorations ends up being\n// (200 + left decor width + right decor width) pixels wide. Which is probably\n// not what you want. Therefore, transform 200 into\n// 200 - decoration window width - client window width.\n// Similarly for height.\nfunc adjustSize(xu *xgbutil.XUtil, win xproto.Window,\n\tw, h int) (int, int, error) {\n\n\t// raw client geometry\n\tcGeom, err := RawGeometry(xu, xproto.Drawable(win))\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\t// geometry with decorations\n\tpGeom, err := RawGeometry(xu, xproto.Drawable(win))\n\tif err != nil {\n\t\treturn 0, 0, err\n\t}\n\n\tneww := w - (pGeom.Width() - cGeom.Width())\n\tnewh := h - (pGeom.Height() - cGeom.Height())\n\tif neww < 1 {\n\t\tneww = 1\n\t}\n\tif newh < 1 {\n\t\tnewh = 1\n\t}\n\treturn neww, newh, nil\n}\n"
  },
  {
    "path": "xwindow/icccm.go",
    "content": "package xwindow\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/icccm\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n)\n\n// WMGracefulClose will do all the necessary setup to implement the\n// WM_DELETE_WINDOW protocol. This will prevent well-behaving window managers\n// from killing your client whenever one of your windows is closed. (Killing\n// a client is bad because it will destroy your X connection and any other\n// clients you have open.)\n// You must provide a callback function that is called when the window manager\n// asks you to close your window. (You may provide some means of confirmation\n// to the user, i.e., \"Do you really want to quit?\", but you should probably\n// just wrap things up and call DestroyWindow.)\nfunc (w *Window) WMGracefulClose(cb func(w *Window)) {\n\t// Get the current protocols so we don't overwrite anything.\n\tprots, _ := icccm.WmProtocolsGet(w.X, w.Id)\n\n\t// If WM_DELETE_WINDOW isn't here, add it. Otherwise, move on.\n\twmdelete := false\n\tfor _, prot := range prots {\n\t\tif prot == \"WM_DELETE_WINDOW\" {\n\t\t\twmdelete = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !wmdelete {\n\t\ticccm.WmProtocolsSet(w.X, w.Id, append(prots, \"WM_DELETE_WINDOW\"))\n\t}\n\n\t// Attach a ClientMessage event handler. It will determine whether the\n\t// ClientMessage is a 'close' request, and if so, run the callback 'cb'\n\t// provided.\n\txevent.ClientMessageFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) {\n\t\t\tif icccm.IsDeleteProtocol(X, ev) {\n\t\t\t\tcb(w)\n\t\t\t}\n\t\t}).Connect(w.X, w.Id)\n}\n\n// WMTakeFocus will do all the necessary setup to support the WM_TAKE_FOCUS\n// protocol using the \"LocallyActive\" input model described in Section 4.1.7\n// of the ICCCM. Namely, listening to ClientMessage events and running the\n// callback function provided when a WM_TAKE_FOCUS ClientMessage has been\n// received.\n//\n// Typically, the callback function should include a call to SetInputFocus\n// with the \"Parent\" InputFocus type, the sub-window id of the window that\n// should have focus, and the 'tstamp' timestamp.\nfunc (w *Window) WMTakeFocus(cb func(w *Window, tstamp xproto.Timestamp)) {\n\t// Make sure the Input flag is set to true in WM_HINTS. We first\n\t// must retrieve the current WM_HINTS, so we don't overwrite the flags.\n\tcurFlags := uint(0)\n\tif hints, err := icccm.WmHintsGet(w.X, w.Id); err == nil {\n\t\tcurFlags = hints.Flags\n\t}\n\ticccm.WmHintsSet(w.X, w.Id, &icccm.Hints{\n\t\tFlags: curFlags | icccm.HintInput,\n\t\tInput: 1,\n\t})\n\n\t// Get the current protocols so we don't overwrite anything.\n\tprots, _ := icccm.WmProtocolsGet(w.X, w.Id)\n\n\t// If WM_TAKE_FOCUS isn't here, add it. Otherwise, move on.\n\twmfocus := false\n\tfor _, prot := range prots {\n\t\tif prot == \"WM_TAKE_FOCUS\" {\n\t\t\twmfocus = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !wmfocus {\n\t\ticccm.WmProtocolsSet(w.X, w.Id, append(prots, \"WM_TAKE_FOCUS\"))\n\t}\n\n\t// Attach a ClientMessage event handler. It will determine whether the\n\t// ClientMessage is a 'focus' request, and if so, run the callback 'cb'\n\t// provided.\n\txevent.ClientMessageFun(\n\t\tfunc(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) {\n\t\t\tif icccm.IsFocusProtocol(X, ev) {\n\t\t\t\tcb(w, xproto.Timestamp(ev.Data.Data32[1]))\n\t\t\t}\n\t\t}).Connect(w.X, w.Id)\n}\n"
  },
  {
    "path": "xwindow/xwindow.go",
    "content": "package xwindow\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgbutil/keybind\"\n\t\"github.com/BurntSushi/xgbutil/mousebind\"\n\t\"github.com/BurntSushi/xgbutil/xevent\"\n\t\"github.com/BurntSushi/xgbutil/xrect\"\n)\n\n// Window represents an X window. It contains an XUtilValue to simplfy the\n// parameter lists for methods declared on the Window type.\n// Geom is updated whenever Geometry is called, or when Move, Resize or\n// MoveResize are called.\ntype Window struct {\n\tX         *xgbutil.XUtil\n\tId        xproto.Window\n\tGeom      xrect.Rect\n\tDestroyed bool\n}\n\n// New creates a new window value from a window id and an XUtil type.\n// Geom is initialized to zero values. Use Window.Geometry to load it.\n// Note that the geometry is the size of this particular window and nothing\n// else. If you want the geometry of a client window including decorations,\n// please use Window.DecorGeometry.\nfunc New(xu *xgbutil.XUtil, win xproto.Window) *Window {\n\treturn &Window{\n\t\tX:         xu,\n\t\tId:        win,\n\t\tGeom:      xrect.New(0, 0, 1, 1),\n\t\tDestroyed: false,\n\t}\n}\n\n// Generate is just like New, but generates a new X resource id for you.\n// Geom is initialized to (0, 0) 1x1.\n// It is possible for id generation to return an error, in which case, an\n// error is returned here.\nfunc Generate(xu *xgbutil.XUtil) (*Window, error) {\n\twid, err := xproto.NewWindowId(xu.Conn())\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn New(xu, wid), nil\n}\n\n// Create is a convenience constructor that will generate a new window id (with\n// the Generate constructor) and make a bare-bones call to CreateChecked (with\n// geometry (0, 0) 1x1). An error can be generated from Generate or\n// CreateChecked.\nfunc Create(xu *xgbutil.XUtil, parent xproto.Window) (*Window, error) {\n\twin, err := Generate(xu)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\terr = win.CreateChecked(parent, 0, 0, 1, 1, 0)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn win, nil\n}\n\n// Must panics if err is non-nil or if win is nil. Otherwise, win is returned.\nfunc Must(win *Window, err error) *Window {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tif win == nil {\n\t\tpanic(\"win and err are nil\")\n\t}\n\treturn win\n}\n\n// Create issues a CreateWindow request for Window.\n// Its purpose is to omit several boiler-plate parameters to CreateWindow\n// and expose the commonly useful ones.\n// The value mask describes which values are present in valueList.\n// Value masks can be found in xgb/xproto with the prefix 'Cw'.\n// The value list must contain values in the same order as the constants\n// are defined in xgb/xproto.\n//\n// For example, the following creates a window positioned at (20, 50) with\n// width 500 and height 700 with a background color of white.\n//\n//\tw, err := xwindow.Generate(X)\n//\tif err != nil {\n//\t\tlog.Fatalf(\"Could not generate a new resource identifier: %s\", err)\n//\t}\n//\tw.Create(X.RootWin(), 20, 50, 500, 700,\n//\t\txproto.CwBackPixel, 0xffffff)\nfunc (w *Window) Create(parent xproto.Window, x, y, width, height,\n\tvalueMask int, valueList ...uint32) {\n\n\ts := w.X.Screen()\n\txproto.CreateWindow(w.X.Conn(),\n\t\txproto.WindowClassCopyFromParent, w.Id, parent,\n\t\tint16(x), int16(y), uint16(width), uint16(height), 0,\n\t\txproto.WindowClassInputOutput, s.RootVisual,\n\t\tuint32(valueMask), valueList)\n}\n\n// CreateChecked issues a CreateWindow checked request for Window.\n// A checked request is a synchronous request. Meaning that if the request\n// fails, you can get the error returned to you. However, it also forced your\n// program to block for a round trip to the X server, so it is slower.\n// See the docs for Create for more info.\nfunc (w *Window) CreateChecked(parent xproto.Window, x, y, width, height,\n\tvalueMask int, valueList ...uint32) error {\n\n\ts := w.X.Screen()\n\treturn xproto.CreateWindowChecked(w.X.Conn(),\n\t\ts.RootDepth, w.Id, parent,\n\t\tint16(x), int16(y), uint16(width), uint16(height), 0,\n\t\txproto.WindowClassInputOutput, s.RootVisual,\n\t\tuint32(valueMask), valueList).Check()\n}\n\n// Change issues a ChangeWindowAttributes request with the provided mask\n// and value list. Please see Window.Create for an example on how to use\n// the mask and value list.\nfunc (w *Window) Change(valueMask int, valueList ...uint32) {\n\txproto.ChangeWindowAttributes(w.X.Conn(), w.Id,\n\t\tuint32(valueMask), valueList)\n}\n\n// Listen will tell X to report events corresponding to the event masks\n// provided for the given window. If a call to Listen is omitted, you will\n// not receive the events you desire.\n// Event masks are constants declare in the xgb/xproto package starting with the\n// EventMask prefix.\nfunc (w *Window) Listen(evMasks ...int) error {\n\tevMask := 0\n\tfor _, mask := range evMasks {\n\t\tevMask |= mask\n\t}\n\treturn xproto.ChangeWindowAttributesChecked(w.X.Conn(), w.Id,\n\t\txproto.CwEventMask, []uint32{uint32(evMask)}).Check()\n}\n\n// Geometry retrieves an up-to-date version of the this window's geometry.\n// It also loads the geometry into the Geom member of Window.\nfunc (w *Window) Geometry() (xrect.Rect, error) {\n\tgeom, err := RawGeometry(w.X, xproto.Drawable(w.Id))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tw.Geom = geom\n\treturn geom, err\n}\n\n// RawGeometry isn't smart. It just queries the window given for geometry.\nfunc RawGeometry(xu *xgbutil.XUtil, win xproto.Drawable) (xrect.Rect, error) {\n\txgeom, err := xproto.GetGeometry(xu.Conn(), win).Reply()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn xrect.New(int(xgeom.X), int(xgeom.Y),\n\t\tint(xgeom.Width), int(xgeom.Height)), nil\n}\n\n// RootGeometry gets the geometry of the root window. It will panic on failure.\nfunc RootGeometry(xu *xgbutil.XUtil) xrect.Rect {\n\tgeom, err := RawGeometry(xu, xproto.Drawable(xu.RootWin()))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn geom\n}\n\n// Configure issues a raw Configure request with the parameters given and\n// updates the geometry of the window.\n// This should probably only be used when passing along ConfigureNotify events\n// (from the perspective of the window manager). In other cases, one should\n// opt for [WM][Move][Resize] or Stack[Sibling].\nfunc (win *Window) Configure(flags, x, y, w, h int,\n\tsibling xproto.Window, stackMode byte) {\n\n\tif win == nil {\n\t\treturn\n\t}\n\n\tvals := []uint32{}\n\n\tif xproto.ConfigWindowX&flags > 0 {\n\t\tvals = append(vals, uint32(x))\n\t\twin.Geom.XSet(x)\n\t}\n\tif xproto.ConfigWindowY&flags > 0 {\n\t\tvals = append(vals, uint32(y))\n\t\twin.Geom.YSet(y)\n\t}\n\tif xproto.ConfigWindowWidth&flags > 0 {\n\t\tif int16(w) <= 0 {\n\t\t\tw = 1\n\t\t}\n\t\tvals = append(vals, uint32(w))\n\t\twin.Geom.WidthSet(w)\n\t}\n\tif xproto.ConfigWindowHeight&flags > 0 {\n\t\tif int16(h) <= 0 {\n\t\t\th = 1\n\t\t}\n\t\tvals = append(vals, uint32(h))\n\t\twin.Geom.HeightSet(h)\n\t}\n\tif xproto.ConfigWindowSibling&flags > 0 {\n\t\tvals = append(vals, uint32(sibling))\n\t}\n\tif xproto.ConfigWindowStackMode&flags > 0 {\n\t\tvals = append(vals, uint32(stackMode))\n\t}\n\n\t// Nobody should be setting border widths any more.\n\t// We toss it out since `vals` must have length equal to the number\n\t// of bits set in `flags`.\n\tflags &= ^xproto.ConfigWindowBorderWidth\n\txproto.ConfigureWindow(win.X.Conn(), win.Id, uint16(flags), vals)\n}\n\n// MROpt is like MoveResize, but exposes the X value mask so that any\n// combination of x/y/width/height can be set. It's a strictly convenience\n// function. (i.e., when you need to set 'y' and 'height' but not 'x' or\n// 'width'.)\nfunc (w *Window) MROpt(flags, x, y, width, height int) {\n\t// Make sure only x/y/width/height are used.\n\tflags &= xproto.ConfigWindowX | xproto.ConfigWindowY |\n\t\txproto.ConfigWindowWidth | xproto.ConfigWindowHeight\n\tw.Configure(flags, x, y, width, height, 0, 0)\n}\n\n// MoveResize issues a ConfigureRequest for this window with the provided\n// x, y, width and height. Note that if width or height is 0, X will stomp\n// all over you. Really hard. Don't do it.\n// If you're trying to move/resize a top-level window in a window manager that\n// supports EWMH, please use WMMoveResize instead.\nfunc (w *Window) MoveResize(x, y, width, height int) {\n\tw.Configure(xproto.ConfigWindowX|xproto.ConfigWindowY|\n\t\txproto.ConfigWindowWidth|xproto.ConfigWindowHeight, x, y, width, height,\n\t\t0, 0)\n}\n\n// Move issues a ConfigureRequest for this window with the provided\n// x and y positions.\n// If you're trying to move a top-level window in a window manager that\n// supports EWMH, please use WMMove instead.\nfunc (w *Window) Move(x, y int) {\n\tw.Configure(xproto.ConfigWindowX|xproto.ConfigWindowY, x, y, 0, 0, 0, 0)\n}\n\n// Resize issues a ConfigureRequest for this window with the provided\n// width and height. Note that if width or height is 0, X will stomp\n// all over you. Really hard. Don't do it.\n// If you're trying to resize a top-level window in a window manager that\n// supports EWMH, please use WMResize instead.\nfunc (w *Window) Resize(width, height int) {\n\tw.Configure(xproto.ConfigWindowWidth|xproto.ConfigWindowHeight, 0, 0,\n\t\twidth, height, 0, 0)\n}\n\n// Stack issues a configure request to change the stack mode of Window.\n// If you're using a window manager that supports EWMH, you may want to try\n// and use ewmh.RestackWindow instead. Although this should still work.\n// 'mode' values can be found as constants in xgb/xproto with the prefix\n// StackMode.\n// A value of xproto.StackModeAbove will put the window to the top of the stack,\n// while a value of xproto.StackMoveBelow will put the window to the\n// bottom of the stack.\n// Remember that stacking is at the discretion of the window manager, and\n// therefore may not always work as one would expect.\nfunc (w *Window) Stack(mode byte) {\n\txproto.ConfigureWindow(w.X.Conn(), w.Id,\n\t\txproto.ConfigWindowStackMode, []uint32{uint32(mode)})\n}\n\n// StackSibling issues a configure request to change the sibling and stack mode\n// of Window.\n// If you're using a window manager that supports EWMH, you may want to try\n// and use ewmh.RestackWindowExtra instead. Although this should still work.\n// 'mode' values can be found as constants in xgb/xproto with the prefix\n// StackMode.\n// 'sibling' refers to the sibling window in the stacking order through which\n// 'mode' is interpreted. Note that 'sibling' should be taken literally. A\n// window can only be stacked with respect to a *sibling* in the window tree.\n// This means that a client window that has been wrapped in decorations cannot\n// be stacked with respect to another client window. (This is why you should\n// use ewmh.RestackWindowExtra instead.)\nfunc (w *Window) StackSibling(sibling xproto.Window, mode byte) {\n\txproto.ConfigureWindow(w.X.Conn(), w.Id,\n\t\txproto.ConfigWindowSibling|xproto.ConfigWindowStackMode,\n\t\t[]uint32{uint32(sibling), uint32(mode)})\n}\n\n// Map is a simple alias to map the window.\nfunc (w *Window) Map() {\n\tif w == nil {\n\t\treturn\n\t}\n\n\txproto.MapWindow(w.X.Conn(), w.Id)\n}\n\n// Unmap is a simple alias to unmap the window.\nfunc (w *Window) Unmap() {\n\tif w == nil {\n\t\treturn\n\t}\n\n\txproto.UnmapWindow(w.X.Conn(), w.Id)\n}\n\n// Destroy is a simple alias to destroy a window. You should use this when\n// you no longer intend to use this window. (It will free the X resource\n// identifier for use in other places.)\nfunc (w *Window) Destroy() {\n\tif !w.Destroyed {\n\t\tw.Detach()\n\t\terr := xproto.DestroyWindowChecked(w.X.Conn(), w.Id).Check()\n\t\tif err != nil {\n\t\t\txgbutil.Logger.Println(err)\n\t\t}\n\n\t\tw.Destroyed = true\n\t}\n}\n\n// Detach will detach this window's event handlers from all xevent, keybind\n// and mousebind callbacks.\nfunc (w *Window) Detach() {\n\tkeybind.Detach(w.X, w.Id)\n\tmousebind.Detach(w.X, w.Id)\n\txevent.Detach(w.X, w.Id)\n}\n\n// Focus tries to issue a SetInputFocus to get the focus.\n// If you're trying to change the top-level active window, please use\n// ewmh.ActiveWindowReq instead.\nfunc (w *Window) Focus() {\n\tmode := byte(xproto.InputFocusPointerRoot)\n\terr := xproto.SetInputFocusChecked(w.X.Conn(), mode, w.Id, 0).Check()\n\tif err != nil {\n\t\txgbutil.Logger.Println(err)\n\t}\n}\n\n// FocusParent is just like Focus, except it sets the \"revert-to\" mode to\n// Parent. This should be used when setting focus to a sub-window.\nfunc (w *Window) FocusParent(tstamp xproto.Timestamp) {\n\tmode := byte(xproto.InputFocusParent)\n\terr := xproto.SetInputFocusChecked(w.X.Conn(), mode, w.Id, tstamp).Check()\n\tif err != nil {\n\t\txgbutil.Logger.Println(err)\n\t}\n}\n\n// Kill forcefully destroys a client. It is almost never what you want, and if\n// you do it to one your clients, you'll lose your connection.\n// (This is typically used in a special client like `xkill` or in a window\n// manager.)\nfunc (w *Window) Kill() {\n\txproto.KillClient(w.X.Conn(), uint32(w.Id))\n}\n\n// Clear paints the region of the window specified with the corresponding\n// background pixmap. If the window doesn't have a background pixmap,\n// this has no effect.\n// If width/height is 0, then it is set to the width/height of the background\n// pixmap minus x/y.\nfunc (w *Window) Clear(x, y, width, height int) {\n\txproto.ClearArea(w.X.Conn(), false, w.Id,\n\t\tint16(x), int16(y), uint16(width), uint16(height))\n}\n\n// ClearAll is the same as Clear, but does it for the entire background pixmap.\nfunc (w *Window) ClearAll() {\n\txproto.ClearArea(w.X.Conn(), false, w.Id, 0, 0, 0, 0)\n}\n\n// Parent queries the QueryTree and finds the parent window.\nfunc (w *Window) Parent() (*Window, error) {\n\ttree, err := xproto.QueryTree(w.X.Conn(), w.Id).Reply()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"ParentWindow: Error retrieving parent window \"+\n\t\t\t\"for %x: %s\", w.Id, err)\n\t}\n\treturn New(w.X, tree.Parent), nil\n}\n"
  }
]