܆       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~               ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p qrstuvwxyz{|}~NoneHB An attribute map which maps  values to  values.9An attribute name. Attribute names are hierarchical; use  (<>) to assemble them. Hierarchy in an attribute name is used to represent increasing levels of specificity in referring to the attribute you want to use for a visual element, with names to the left being general and names to the right being more specific. For example: J"window" <> "border" "window" <> "title" "header" <> "clock" <> "seconds" 'Create an attribute name from a string.(Get the components of an attribute name.Create an attribute map.HCreate an attribute map in which all lookups map to the same attribute.Given an attribute and a map, merge the attribute with the map's default attribute. If the map is forcing all lookups to a specific attribute, the forced attribute is returned without merging it with the one specified here. Otherwise the attribute given here is merged with the attribute map's default attribute in that any aspect of the specified attribute that is not provided falls back to the map default. For example, 1mergeWithDefault (fg blue) $ attrMap (bg red) [] returns blue `on` red Look up the specified attribute name in the map. Map lookups proceed as follows. If the attribute map is forcing all lookups to a specific attribute, that attribute is returned. If the attribute name is empty, the map's default attribute is returned. If the attribute name is non-empty, very subsequence of names from the specified name are used to perform a lookup, and the results are combined as in H, with more specific results taking precedence over less specific ones. For example: attrMapLookup ("foo" <> "bar") (attrMap a []) == a attrMapLookup ("foo" <> "bar") (attrMap (bg blue) [("foo" <> "bar", fg red)]) == red `on` blue attrMapLookup ("foo" <> "bar") (attrMap (bg blue) [("foo" <> "bar", red on cyan)]) == red `on` cyan attrMapLookup ("foo" <> "bar") (attrMap (bg blue) [("foo" <> "bar", fg red), ("foo", bg cyan)]) == red `on` cyan attrMapLookup ("foo" <> "bar") (attrMap (bg blue) [("foo", fg red)]) == red `on` blue 4Set the default attribute value in an attribute map. 4Get the default attribute value in an attribute map. 7Insert a set of attribute mappings to an attribute map. .Update an attribute map such that a lookup of ontoName+ returns the attribute value specified by fromName. This is useful for composite widgets with specific attribute names mapping those names to the sub-widget's expected name when calling that sub-widget's rendering function. See the ProgressBarDemo for an example usage, and  overrideAttr for an alternate syntax. XMap several attributes to return the value associated with an alternate name. Applies   across a list of mappings.The map's default attribute to be returned when a name lookup fails, and the attribute that will be merged with successful lookups.The map's initial contents.    SafeNBChan9 is an abstract type representing a bounded FIFO channel.%Builds and returns a new instance of BChan.Writes a value to a BChan ; blocks if the channel is full.Reads the next value from the BChan; blocks if necessary.!Reads the next value from either BChan, prioritizing the first BChan; blocks if necessary./maximum number of elements the channel can holdNoneS_A template haskell function to build lenses for a record type. This function differs from the i function in that it does not require the record fields to be prefixed with underscores and it adds an L= suffix to lens names to make it clear that they are lenses.None3>?U:A terminal screen location. (Column, Row) The origin (upper-left corner). !"#$ %&'( !"#None6N{w)A theme provides a set of default attribute mappings, a default attribute, and a set of customizations for the default mapping and default attribute. The idea here is that the application will always need to provide a complete specification of its attribute mapping, but if the user wants to customize any aspect of that default mapping, it can be contained here and then built into an  (see N). We keep the defaults separate from customizations to permit users to serialize themes and their customizations to, say, disk files.+The default attribute to use.,%The default attribute mapping to use.-0Customization for the theme's default attribute..Customizations for individual entries of the default mapping. Note that this will only affect entries in the default mapping; any attributes named here that are not present in the default mapping will not be considered./'Documentation for a theme's attributes.1zThe per-attribute documentation for a theme so e.g. documentation for theme customization can be generated mechanically.2SAn attribute customization can specify which aspects of an attribute to customize.4"The customized foreground, if any.5"The customized background, if any.6The customized style, if any.MvCreate a new theme with the specified default attribute and attribute mapping. The theme will have no customizations.N Build an  from a )3. This applies all customizations in the returned .OApply customizations using a custom lookup function. Customizations are obtained for each attribute name in the theme. Any customizations already set are lost.PLoad an INI file containing theme customizations. Use the specified theme to determine which customizations to load. Return the specified theme with customizations set. See the module documentation for the theme file format.QSave an INI file containing theme customizations. Use the specified theme to determine which customizations to save. See the module documentation for the theme file format.RSave an INI file containing all attributes from the specified theme. Customized attributes are saved, but if an attribute is not customized, its default is saved instead. The file can later be re-loaded as a customization file.O=An optional customization for the theme's default attribute.BA function to obtain a customization for the specified attribute.The theme to customize.)*+,-./0123456EFGHIJKLMNOPQR23456FEG)*+,-.MJKIH/01LNOPQR)*+,-./0123456Safe~SYA border style for use in any widget that needs to render borders in a consistent style.UTop-left corner characterVTop-right corner characterWBottom-right corner characterXBottom-left corner characterYFull intersection (cross)Z<Left side of a horizontal border intersecting a vertical one[=Right side of a horizontal border intersecting a vertical one\6Top of a vertical border intersecting a horizontal one]9Bottom of a vertical border intersecting a horizontal one^Horizontal border character_Vertical border charactera=Make a border style using the specified character everywhere.b6An ASCII border style which will work in any terminal.cDA unicode border style with real corner and intersection characters.d*A unicode border style in a bold typeface.e,A unicode border style with rounded corners.STUVWXYZ[\]^_`abcdeSTUVWXYZ[\]^_abcde`S TUVWXYZ[\]^_Safe3 iRun n a represents n copies of the value a.mSemantically, m and   are identical; but mZ is more efficient when large sequences of contiguous keys are mapped to the same value.n This function is unsafe because ms that compare equal may split their runs into different chunks; consumers must promise that they do not treat run boundaries specially.tGiven a range of keys (as specified by a starting key and a length for consistency with other functions in this module), restrict the map to keys in that range. restrict k r m is equivalent to ,intersectionWith const m (insert k r empty) but potentially more efficient.v splitLE n m produces a tuple (le, gt) where le has all the associations of m where the keys are <= n and gt has all the associations of m where the keys are > n.w6Increment all keys by the given amount. This is like  /, but restricted to partially-applied addition.{ This function is unsafe because ms that compare equal may split their runs into different chunks; consumers must promise that they do not treat run boundaries specially.|lThis function is unsafe because it assumes there is no overlap between its arguments. That is, in the call unsafeUnion a b%, the caller must guarantee that if lookup k a = Just v then lookup k b = Nothing and vice versa. Zippy: '( *g)' combines values at equal keys, discarding any values whose key is in only one of its two arguments.ijklmnopqrstuvwxyz{|mijklopqrstuvxyw|zn{ijklm  None3>?0A  BorderMap a is like a Map Location a., except that there is a rectangle, and only 5s on the border of this rectangle are retained. The  can be queried for the position and size of the rectangle. There are also efficient bulk query and bulk update operations for adjacent positions on the border.Internal use only.qGiven a rectangle (specified as the coordinates of the top, left, bottom, and right sides), initialize an empty . An empty " that only tracks the point (0,0).A R that tracks only the given the point (and initially maps it to the given value).KThe positions of the edges of the rectangle whose border is retained in a . For example, if coordinates m = e$, then the top border contains the  s on row eTop e and between columns eLeft e to eRight e inclusive.WA complementary way to query the edges of the rectangle whose border is retained in a . For example, if  bounds m = b , then a  'Location'\'s column must be between  fst (eTop b) and  snd (eTop b) to be retained. See also 6, which is in most cases a more natural border query.\Maps giving the values along each edge. Corner values are replicated in all relevant edges.4Bulk insertion of horizontally-adjacent values. The ! gives the start point, and the i+ extends in the "larger columns" direction.2Bulk insertion of vertically-adjacent values. The ! gives the start point, and the i( extends in the "larger rows" direction.,Insert a single value at the given location.'Look up all values on a given row. The m" returned maps columns to values.*Look up all values on a given column. The m returned maps rows to values.1Bulk lookup of horizontally-adjacent values. The $ gives the starting point, and the i1 extends in the "larger columns" direction. The m! returned maps columns to values./Bulk lookup of vertically-adjacent values. The $ gives the starting point, and the i. extends in the "larger rows" direction. The m returned maps rows to values.Look up a single position.(Set the rectangle being tracked by this B, throwing away any values that do not lie on this new rectangle.0Ensure that the rectangle being tracked by this ( extends no farther than the given one.0Ensure that the rectangle being tracked by this + extends at least as far as the given one.Move a  by adding the given  to all keys in the map.Assumes the two Zs are tracking the same rectangles, but have disjoint keys. This property is not checked. !"#%&'( !"#(%'&None3>?%A border character has four segments, one extending in each direction (horizontally and vertically) from the center of the character.QWould this segment be willing to be drawn if a neighbor wanted to connect to it?2Does this segment want to connect to its neighbor?,Should this segment be represented visually?@A cursor location. These are returned by the rendering process. The location3The name of the widget associated with the location7The class of types that behave like terminal locations.Get the column out of the valueGet the row out of the valueScrolling direction.Up/left Down/right@The type of actions to take upon completion of an event handler.:An extent of a named area: its size, location, and origin.YThe type of viewports that indicates the direction(s) in which a viewport is scrollable.6Viewports of this type are scrollable only vertically.8Viewports of this type are scrollable only horizontally.BViewports of this type are scrollable vertically and horizontally.NDescribes the state of a viewport as it appears as its most recent rendering./The column offset of left side of the viewport.*The row offset of the top of the viewport.The size of the viewport.kInformation about how to redraw a dynamic border character when it abuts another dynamic border character.The fs to use when redrawing the border. Also used to filter connections: only dynamic borders with equal Ss will connect to each other.What j to use to redraw the border character. Also used to filter connections: only dynamic borders with equal s will connect to each other.The type of result returned by a widget's rendering function. The result provides the image, cursor positions, and visibility requests that resulted from the rendering process.%The final rendered image for a widgetIThe list of reported cursor positions for the application to choose fromfThe list of visibility requests made by widgets rendered while rendering this one (used by viewports)`Places where we may rewrite the edge of the image when placing this widget next to another one.The rendering context. This tells widgets how to render: how much space they have in which to render, which attribute they should use to render, which bordering style should be used, and the attribute map available for rendering.The type of events.The event was a Vty event.#The event was an application event.>A mouse-down event on the specified region was received. The n8 value is the resource name of the clicked widget (see  clickable).<A mouse-up event on the specified region was received. The n8 value is the resource name of the clicked widget (see  clickable). !"#$ %&'( !"#$%&'()*+,-./0123456789 !" #$%&'()*+,-./01234NoneGiven a minimum value and a maximum value, clamp a value to that range (values less than the minimum map to the minimum and values greater than the maximum map to the maximum). clamp 1 10 1110 clamp 1 10 22 clamp 5 10 15^Build an attribute from a foreground color and a background color. Intended to be used infix.aCreate an attribute from the specified foreground color (the background color is the "default").aCreate an attribute from the specified background color (the background color is the "default").Add a  offset to the specified .The minimum valueThe maximum valueThe value to clampThe foreground colorThe background colorNoneKQVThe type of the rendering monad. This monad is used by the library's rendering routines to manage rendering state and communicate rendering parameters to widgets' rendering functions.The type of widgets.&This widget's horizontal growth policy$This widget's vertical growth policy This widget's rendering functionWidget growth policies. These policies communicate to layout algorithms how a widget uses space when being rendered. These policies influence rendering order and space allocation in the box layout algorithm._Fixed widgets take up the same amount of space no matter how much they are given (non-greedy).4Greedy widgets take up all the space they are given.uThe monad in which event handlers run. Although it may be tempting to dig into the reader value yourself, just use .The type of padding./Pad by the specified number of rows or columns.2Pad up to the number of available rows or columns.A convenience function for handling events intended for values that are targets of lenses in your application state. This function obtains the target value of the specified lens, invokes  handleEventV on it, and stores the resulting transformed value back in the state using the lens."Get the current rendering context.2The rendering context's current drawing attribute.pGiven an attribute name, obtain the attribute for the attribute name by consulting the context's attribute map.The state value.>The lens to use to extract and store the target of the event.The event handler.The event to handle.x !"#$%&'(x$ !"#(%'&None!hAfter rendering the specified widget, crop its result image to the dimensions in the rendering context.:;< None ;=>?FNQTV8=The process of rendering widgets in a box layout is exactly the same except for the dimension under consideration (width vs. height), in which case all of the same operations that consider one dimension in the layout algorithm need to be switched to consider the other. Because of this we fill a BoxRenderer with all of the functions needed to consider the "primary" dimension (e.g. vertical if the box layout is vertical) as well as the "secondary" dimension (e.g. horizontal if the box layout is vertical). Doing this permits us to have one implementation for box layout and parameterizing on the orientation of all of the operations.6The class of types that store interface element names.$Get the name of the specified value.RThe class of text types that have widths measured in terminal columns. NEVER use >r etc. to measure the length of a string if you need to compute how much screen space it will occupy; always use .^When rendering the specified widget, use the specified border style for any border rendering.~When rendering the specified widget, create borders that respond dynamically to their neighbors to form seamless connections.When rendering the specified widget, use static borders. This may be marginally faster, but will introduce a small gap between neighboring orthogonal borders.0This is the default for backwards compatibility.After the specified widget has been rendered, freeze its borders. A frozen border will not be affected by neighbors, nor will it affect neighbors. Compared to , K will not affect whether borders connect internally to a widget (whereas  prevents them from connecting). Frozen borders cannot be thawed. The empty widget.!+Add an offset to all cursor locations, visbility requests, and extents in the specified rendering result. This function is critical for maintaining correctness in the rendering results as they are processed successively by box layouts and other wrapping combinators, since calls to this function result in converting from widget-local coordinates to (ultimately) terminal-global ones so they can be used by other combinators. You should call this any time you render something and then translate it or otherwise offset it from its original origin."`Render the specified widget and record its rendering extent using the specified name (see also  lookupExtent).#3Request mouse click events on the specified widget.?Take a substring capable of fitting into the number of specified columns. This function takes character column widths into consideration.$Make a widget from a string, but wrap the words in the input's lines at the available width using the default wrapping settings.%Make a widget from a string, but wrap the words in the input's lines at the available width using the specified wrapping settings.&}Make a widget from text, but wrap the words in the input's lines at the available width using the default wrapping settings.'Make a widget from text, but wrap the words in the input's lines at the available width using the specified wrapping settings.(Build a widget from a @W. Breaks newlines up and space-pads short lines out to the length of the longest line.The input string must not contain tab characters. If it does, interface corruption will result since the terminal will likely render it as taking up more than a single column. The caller should replace tabs with the appropriate number of spaces as desired.)Build a widget from a A value. Behaves the same as () when the input contains multiple lines.The input string must not contain tab characters. If it does, interface corruption will result since the terminal will likely render it as taking up more than a single column. The caller should replace tabs with the appropriate number of spaces as desired.*Hyperlink the given widget to the specified URL. Not all terminal emulators support this. In those that don't, this should have no discernible effect.+Pad the specified widget on the left. If max padding is used, this grows greedily horizontally; otherwise it defers to the padded widget.,Pad the specified widget on the right. If max padding is used, this grows greedily horizontally; otherwise it defers to the padded widget.-Pad the specified widget on the top. If max padding is used, this grows greedily vertically; otherwise it defers to the padded widget..Pad the specified widget on the bottom. If max padding is used, this grows greedily vertically; otherwise it defers to the padded widget./SPad a widget on the left and right. Defers to the padded widget for growth policy.0SPad a widget on the top and bottom. Defers to the padded widget for growth policy.1JPad a widget on all sides. Defers to the padded widget for growth policy.2_Fill all available space with the specified character. Grows both horizontally and vertically.3Vertical box layout: put the specified widgets one above the other in the specified order (uppermost first). Defers growth policies to the growth policies of the contained widgets (if any are greedy, so is the box).4Horizontal box layout: put the specified widgets next to each other in the specified order (leftmost first). Defers growth policies to the growth policies of the contained widgets (if any are greedy, so is the box).B>Render a series of widgets in a box layout in the order given. The growth policy of a box layout is the most unrestricted of the growth policies of the widgets it contains, so to determine the hSize and vSize of the box we just take the maximum (using the Ord instance for Size) of all of the widgets to be rendered in the box.Then the box layout algorithm proceeds as follows. We'll use the vertical case to concretely describe the algorithm, but the horizontal case can be envisioned just by exchanging all "vertical""horizontal" and "rows"%"columns", etc., in the description.,The growth policies of the child widgets determine the order in which they are rendered, i.e., the order in which space in the box is allocated to widgets as the algorithm proceeds. This is because order matters: if we render greedy widgets first, there will be no space left for non-greedy ones.#So we render all widgets with size  in the vertical dimension first. Each is rendered with as much room as the overall box has, but we assume that they will not be greedy and use it all. If they do, maybe it's because the terminal is small and there just isn't enough room to render everything.JThen the remaining height is distributed evenly amongst all remaining (greedy) widgets and they are rendered in sub-boxes that are as high as this even slice of rows and as wide as the box is permitted to be. We only do this step at all if rendering the non-greedy widgets left us any space, i.e., if there were any rows left. After rendering the non-greedy and then greedy widgets, their images are sorted so that they are stored in the order the original widgets were given. All cursor locations and visibility requests in each sub-widget are translated according to the position of the sub-widget in the box.All images are padded to be as wide as the widest sub-widget to prevent attribute over-runs. Without this step the attribute used by a sub-widget may continue on in an undesirable fashion until it hits something with a different attribute. To prevent this and to behave in the least surprising way, we pad the image on the right with whitespace using the context's current attribute.Finally, the padded images are concatenated together vertically and returned along with the translated cursor positions and visibility requests.C%Given borders that should be placed next to each other (the first argument on the right or bottom, and the second argument on the left or top), compute new borders and the rewrites that should be done along the edges of the two images to keep the image in synch with the border information.KThe input borders are assumed to be disjoint. This property is not checked.DfGiven a direction to concatenate borders in, and the border information itself (which list is assumed to be already shifted so that borders do not overlap and are strictly increasing in the primary direction), produce: a list of rewrites for the lo and hi directions of each border, respectively, and the borders describing the fully concatenated object.5Limit the space available to the specified widget to the specified number of columns. This is important for constraining the horizontal growth of otherwise-greedy widgets. This is non-greedy horizontally and defers to the limited widget vertically.6Limit the space available to the specified widget to the specified number of rows. This is important for constraining the vertical growth of otherwise-greedy widgets. This is non-greedy vertically and defers to the limited widget horizontally.7Set the rendering context height and width for this widget. This is useful for relaxing the rendering size constraints on e.g. layer widgets where cropping to the screen size is undesirable.8When drawing the specified widget, set the current attribute used for drawing to the one with the specified name. Note that the widget may use further calls to 8< to override this; if you really want to prevent that, use <. Attributes used this way still get merged hierarchically and still fall back to the attribute map's default attribute. If you want to change the default attribute, use :.9Update the attribute map while rendering the specified widget: set its new default attribute to the one that we get by looking up the specified attribute name in the map and then modifying it with the specified function.:Update the attribute map while rendering the specified widget: set its new default attribute to the one that we get by looking up the specified attribute name in the map.;aWhen rendering the specified widget, update the attribute map with the specified transformation.<When rendering the specified widget, force all attribute lookups in the attribute map to use the value currently assigned to the specified attribute name.=Override the lookup of  targetName0 to return the attribute value associated with fromName0 when rendering the specified widget. See also  .>-Build a widget directly from a raw Vty image.?rTranslate the specified widget by the specified offset amount. Defers to the translated widget for growth policy.@zCrop the specified widget on the left by the specified number of columns. Defers to the cropped widget for growth policy.A{Crop the specified widget on the right by the specified number of columns. Defers to the cropped widget for growth policy.BvCrop the specified widget on the top by the specified number of rows. Defers to the cropped widget for growth policy.CyCrop the specified widget on the bottom by the specified number of rows. Defers to the cropped widget for growth policy.DwWhen rendering the specified widget, also register a cursor positioning request using the specified name and location.ERender the specified widget. If the widget has an entry in the rendering cache using the specified name as the cache key, use the rendered version from the cache instead. If not, render the widget and update the cache. See also invalidateCacheEntry.FRender the specified widget in a named viewport with the specified type. This permits widgets to be scrolled without being scrolling-aware. To make the most use of viewports, the specified widget should use the H combinator to make a "visibility request". This viewport combinator will then translate the resulting rendering to make the requested region visible. In addition, the L monad provides primitives to scroll viewports created by this function if H is not what you want.If a viewport receives more than one visibility request, then the visibility requests are merged with the inner visibility request taking preference. If a viewport receives more than one scrolling request from ;, all are honored in the order in which they are received.GLGiven a name, obtain the viewport for that name by consulting the viewport map in the rendering monad. NOTE! Some care must be taken when calling this function, since it only returns useful values after the viewport in question has been rendered. If you call this function during rendering before a viewport has been rendered, you may get nothing or you may get a stale version of the viewport. This is because viewports are updated during rendering and the one you are interested in may not have been rendered yet. So if you want to use this, be sure you know what you are doing.H;Request that the specified widget be made visible when it is rendered inside a viewport. This permits widgets (whose sizes and positions cannot be known due to being embedded in arbitrary layouts) to make a request for a parent viewport to locate them and scroll enough to put them in view. This, together with F, is what makes the text editor and list widgets possible without making them deal with the details of scrolling state management.0This does nothing if not rendered in a viewport.I Similar to H-, request that a region (with the specified  as its origin and EJ as its size) be made visible when it is rendered inside a viewport. The D is relative to the specified widget's upper-left corner of (0, 0).0This does nothing if not rendered in a viewport.JHorizontal box layout: put the specified widgets next to each other in the specified order. Defers growth policies to the growth policies of both widgets. This operator is a binary version of 4.KVertical box layout: put the specified widgets one above the other in the specified order. Defers growth policies to the growth policies of both widgets. This operator is a binary version of 3.FKThe name of the viewport (must be unique and stable for reliable behavior)CThe type of viewport (indicates the permitted scrolling direction)4The widget to be rendered in the scrollable viewportJLeftRightKTopBottom5 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJK5 >)&'($%2*+,-./01KJ43567:98<=;D?@ABC"#FHIGE!=FGHIJKLMNOPQRSTUVWXYZ[\ NoneN;The attribute of the completed portion of the progress bar.O<The attribute of the incomplete portion of the progress bar.PDraw a progress bar with the specified (optional) label and progress value. This fills available horizontal space and is one row high.PJThe label. If specified, this is shown in the center of the progress bar.8The progress value. Should be between 0 and 1 inclusive.NOPPNO None;=>? Q?Editor state. Editors support the following events by default:Ctrl-a: go to beginning of lineCtrl-e: go to end of line0Ctrl-d, Del: delete character at cursor position4Backspace: delete character prior to cursor position-Ctrl-k: delete all from cursor to end of line3Ctrl-u: delete all from cursor to beginning of lineArrow keys: move cursor4Enter: break the current line at the cursor positionRThe contents of the editorSThe name of the editorVConstruct an editor over Text valuesWConstruct an editor over @ valuesXApply an editing operation to the editor's contents. Bear in mind that you should only apply zipper operations that operate on the current line; the editor will only ever render the first line of text.YAThe attribute assigned to the editor when it does not have focus.ZAThe attribute assigned to the editor when it has focus. Extends Y.[Get the contents of the editor.\Turn an editor state value into a widget. This uses the editor's name for its scrollable viewport handle and the name is also used to report mouse events.V"The editor's name (must be unique)0The limit on the number of lines in the editor (] means no limit)The initial contentW"The editor's name (must be unique)0The limit on the number of lines in the editor (] means no limit)The initial contentXThe  editing transformation to apply\The content drawing function\Whether the editor has focus. It will report a cursor position if and only if it has focus. The editor. QRSTUVWXYZ[\ QRSWV[UXT\YZQ^RS None=4 _SCenter the specified widget horizontally. Consumes all available horizontal space.`-Center the specified widget horizontally using a Vty image translation. Consumes all available horizontal space. Unlike hCenter, this does not fill the surrounding space so it is suitable for use as a layer. Layers underneath this widget will be visible in regions surrounding the centered widget.aCenter the specified widget horizontally. Consumes all available horizontal space. Uses the specified character to fill in the space to either side of the centered widget (defaults to space).b9Center a widget vertically. Consumes all vertical space.c)Center the specified widget vertically using a Vty image translation. Consumes all available vertical space. Unlike vCenter, this does not fill the surrounding space so it is suitable for use as a layer. Layers underneath this widget will be visible in regions surrounding the centered widget.dCenter a widget vertically. Consumes all vertical space. Uses the specified character to fill in the space above and below the centered widget (defaults to space).ehCenter a widget both vertically and horizontally. Consumes all available vertical and horizontal space.fCenter a widget both vertically and horizontally. Consumes all available vertical and horizontal space. Uses the specified character to fill in the space around the centered widget (defaults to space).gOCenter a widget both vertically and horizontally using a Vty image translation. Consumes all available vertical and horizontal space. Unlike center, this does not fill in the surrounding space with a character so it is usable as a layer. Any widget underneath this one will be visible in the region surrounding the centered widget.hJCenter the widget horizontally and vertically about the specified origin. _`abcdefgh _a`bdcefgh NoneW/ i$The top-level border attribute name.jGDraw the specified border element using the active border style using i.xDoes not participate in dynamic borders (due to the difficulty of introspecting on the first argument); consider using p instead.k)Put a border around the specified widget.l|Put a border around the specified widget with the specified label widget placed in the middle of the top horizontal border.Note that a border will wrap its child widget as tightly as possible, which means that if the child widget is narrower than the label widget, the label widget will be truncated. If you want to avoid this behavior, add a 2 or other space-filling wrapper to the bordered widget so that it takes up enough room to make the border horizontally able to avoid truncating the label.m1A horizontal border. Fills all horizontal space.naA horizontal border with a label placed in the center of the border. Fills all horizontal space.o-A vertical border. Fills all vertical space._ Initialize a  . It will be n and ~ing in the given directions to begin with, and accept join offers from all directions. We consult the context to choose the  and .mThis is likely to be useful only for custom widgets that need more complicated dynamic border behavior than k, o, or m offer.` Replace the  'Result'\'_s dynamic borders with the given one, provided the context says to use dynamic borders at all.pxA single-character dynamic border that will react to neighboring borders, initially connecting in the given directions.lThe label widget!The widget to put a border aroundnThe label widgetijklmnopklmnojipNonej$ qDialogs present a window with a title (optional), a body, and buttons (optional). Dialog buttons are labeled with strings and map to values of type a, which you choose.GDialogs handle the following events by default with handleDialogEvent:*Tab or Right Arrow: select the next button3Shift-tab or Left Arrow: select the previous buttonrThe dialog titles#The dialog button labels and valuest3The currently selected dialog button index (if any)uThe maximum width of the dialog{Create a dialog.|#The default attribute of the dialog},The default attribute for all dialog buttons~6The attribute for the selected dialog button (extends |)Render a dialog with the specified body widget. This renders the dialog as a layer, which makes this suitable as a top-level layer in your rendering function to be rendered on top of the rest of your interface.Obtain the value associated with the dialog's currently-selected button, if any. This function is probably what you want when someone presses Enter in a dialog.{The dialog title_The currently-selected button index (starting at zero) and the button labels and values to useThe maximum width of the dialogqutsrvwxyz{|}~qrsturstu{z|}~vwyxqarstuNoneg \A focus ring containing a sequence of resource names to focus and a currently-focused name.7Construct a focus ring from the list of resource names.,Advance focus to the next value in the ring.0Advance focus to the previous value in the ring.~This function is a convenience function to look up a widget state value's resource name in a focus ring and set its focus setting according to the focus ring's state. This function determines whether a given widget state value is the focus of the ring and passes the resulting boolean to a rendering function, along with the state value (a), to produce whatever comes next (b).^Focus-aware widgets have rendering functions that should be usable with this combinator; see  and   .UGet the currently-focused resource name from the ring. If the ring is emtpy, return ].}Set the currently-focused resource name in the ring, provided the name is in the ring. Otherwise return the ring unmodified.Modify the internal circular list structure of a focus ring directly. This function permits modification of the circular list using the rich Data.CircularList API.5Cursor selection convenience function for use as an ! value.3The focus ring to use as the source of focus state.2A function that takes a value and its focus state.6The wiget state value that we need to check for focus.The rest of the computation.GThe function used to get the focus ring out of your application state.Your application state.'The list of available cursor positions.VThe cursor position, if any, that matches the resource name currently focused by the .  bNoneܮ%HA viewport scrolling handle for managing the scroll state of viewports.cDThe name of the viewport to be controlled by this scrolling handle.IScroll the viewport horizontally by one page in the specified direction.{Scroll the viewport horizontally by the specified number of rows or columns depending on the orientation of the viewport.6Scroll horizontally to the beginning of the viewport./Scroll horizontally to the end of the viewport.GScroll the viewport vertically by one page in the specified direction.yScroll the viewport vertically by the specified number of rows or columns depending on the orientation of the viewport.3Scroll vertically to the beginning of the viewport.-Scroll vertically to the end of the viewport.'Set the top row offset of the viewport.+Set the left column offset of the viewport.The library application abstraction. Your application's operations are represented here and passed to one of the various main functions in this module. An application is in terms of an application state type s, an application event type e, and a resource name type n. In the simplest case e^ is unused (left polymorphic or set to '()'), but you may define your own event type and use  to provide custom events. The state type is the type of application state to be provided by you and iteratively modified by event handlers. The resource name type is the type of names you can assign to rendering resources such as viewports and cursor locations.nThis function turns your application state into a list of widget layers. The layers are listed topmost first.This function chooses which of the zero or more cursor locations reported by the rendering process should be selected as the one to use to place the cursor. If this returns ], no cursor is placed. The rationale here is that many widgets may request a cursor placement but your application state is what you probably want to use to decide which one wins.This function takes the current application state and an event and returns an action to be taken and a corresponding transformed application state. Possible options are , , and .This function gets called once just prior to the first drawing of your application. Here is where you can make initial scrolling requests, for example.7The attribute map that should be used during rendering.xThe default main entry point which takes an application and an initial state and returns the final state returned by a  operation.A simple main entry point which takes a widget and renders it. This event loop terminates when the user presses any key, but terminal resize events cause redraws.KA simple application with reasonable defaults to be overridden as desired:Draws only the specified widget%Quits on any event other than resizesHas no start event handlerProvides no attribute mapNever shows any cursorsAn event-handling function which continues execution of the event loop only when resize events occur; all other types of events trigger a halt. This is a convenience function useful as an * value for simple applications using the d= type that do not need to get more sophisticated user input.\The custom event loop entry point to use when the simpler ones don't permit enough control.oGiven a viewport name, get the viewport's size and offset information from the most recent rendering. Returns ]y if no such state could be found, either because the name was invalid or because no rendering has occurred (e.g. in an  handler).RDid the specified mouse coordinates (column, row) intersect the specified extent?SGiven a resource name, get the most recent rendering extent for the name (if any).WGiven a mouse click location, return the extents intersected by the click. The returned extents are sorted such that the first extent in the list is the most specific extent and the last extent is the most generic (top-level). So if two extents A and B both intersected the mouse click but A contains B, then they would be returned [B, A].$Get the Vty handle currently in use.GInvalidate the rendering cache entry with the specified resource name.&Invalidate the entire rendering cache.wIgnore all requested cursor positions returned by the rendering process. This is a convenience function useful as an E value when a simple application has no need to position the cursor.wAlways show the first cursor, if any, returned by the rendering process. This is a convenience function useful as an X value when a simple program has zero or more widgets that advertise a cursor position._Show the cursor with the specified resource name, if such a cursor location has been reported.CBuild a viewport scroller for the viewport with the specified name.FContinue running the event loop with the specified application state.YHalt the event loop and return the specified application state as the final state value.Suspend the event loop, save the terminal state, and run the specified action. When it returns an application state value, restore the terminal state, redraw the application from the new state, and resume the event loop.The application.The initial application state.The widget to draw.An IO action to build a Vty handle. This is used to build a Vty handle whenever the event loop begins or is resumed after suspension.An event channel for sending custom events to the event loop (you write to this channel, the event loop reads from it). Provide ]- if you don't plan on sending custom events.The application.The initial application state.%/ ecfghNone 345;=>?N ^'List state. Lists have an element type eU that is the data stored by the list. Lists handle the following events by default:0Up/down arrow keys: move cursor of selected itemtPage up / page down keys: move cursor of selected item by one page at a time (based on the number of items shown)JHome/end keys: move cursor of selected item to beginning or end of listEnable list movement with the vi keys with a fallback if none match. Use (handleListEventVi handleListEvent) in place of handleListEvent to add the vi keys bindings to the standard ones. Movements handled include:Up (k)Down (j)Page Up (Ctrl-b)Page Down (Ctrl-f)Half Page Up (Ctrl-u)Half Page Down (Ctrl-d)Top (g)Bottom (G)1The top-level attribute used for the entire list.iThe attribute used only for the currently-selected list item when the list does not have focus. Extends ._The attribute used only for the currently-selected list item when the list has focus. Extends .-Construct a list in terms of an element type e.FTurn a list state value into a widget given an item drawing function.5Insert an item into a list at the specified position.8Remove an element from a list at the specified position.Replace the contents of a list with a new set of elements and update the new selected index. If the list is empty, empty selection is used instead. Otherwise, if the specified selected index (via i3) is not in the list bounds, zero is used instead.]Move the list selected index up by one. (Moves the cursor up, subtracts one from the index.),Move the list selected index up by one page.ZMove the list selected index down by one. (Moves the cursor down, adds one to the index.).Move the list selected index down by one page.BMove the list selected index by some (fractional) number of pages.MMove the list selected index by the specified amount, subject to validation.QSet the selected index for a list to the specified index, subject to validation.)Return a list's selected element, if any.:Remove all elements from the list and clear the selection.\Reverse the list. The element selected before the reversal will again be the selected one.^Apply a function to the selected element. If no element is selected the list is not modified.<Fallback event handler to use if none of the vi keys match.The list name (must be unique)The initial list contentsGThe list item height in rows (all list item widgets must be this high)1Rendering function, True for the selected elementWhether the list has focusThe List to be renderedrendered widget0The position at which to insert (0 <= i <= size)The element to insert:The position at which to remove an element (0 <= i < size)j"None   !"#$%&'( !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKNone&'QV fA form: a sequence of input fields that manipulate the fields of an underlying state that you choose.Type variables are as follows:sc - the data type of your choosing containing the values manipulated by the fields in this form.e - your application's event typen( - your application's resource name typeJThe focus ring for the form, indicating which form field has input focus.9The current state of the form. Forms guarantee that only valid inputs ever get stored in the state, and that after each input event on a form field, if that field contains a valid state value then the value is immediately saved to its corresponding field in this state value using the form field's lens over s.A form field state accompanied by the fields that manipulate that state. The idea is that some record field in your form state has one or more form fields that manipulate that value. This data type maps that state field (using a lens into your state) to the form input fields responsible for managing that state field, along with a current value for that state field and an optional function to control how the form inputs are rendered.Most form fields will just have one input, such as text editors, but others, such as radio button collections, will have many, which is why this type supports more than one input corresponding to a state field.Type variables are as follows:sK - the data type containing the value manipulated by these form fields.e - your application's event typen( - your application's resource name typeThe current state value associated with the field collection. Note that this type is existential. All form fields in the collection must validate to this type.\A lens to extract and store a successfully-validated form input back into your form state.\The form fields, in order, that the user will interact with to manipulate this state value.A helper function to augment the rendered representation of this collection of form fields. It receives the default representation and can augment it, for example, by adding a label on the left.A form field. This represents an interactive input field in the form. Its user input is validated and thus converted into a type of your choosing.Type variables are as follows:aK - the type of the field in your form state that this field manipulatesb' - the form field's internal state typee - your application's event typen( - your application's resource name type%The name identifying this form field.TA validation function converting this field's state into a value of your choosing. NothingG indicates a validation failure. For example, this might validate an QD state value by parsing its text contents s aan integer and return k lX. This is for pure avalue validation; if additional validation is required a(e.g. via mL), use this field's state value in an aexternal validation routine and use ) to afeed the result back into the form.aWhether the field is valid according to an external validation source. Defaults to always being n and can be set with 8. The value of this field also affects the behavior of  and o.{A function to render this form field. Parameters are whether the field is currently focused, followed by the field state.mAn event handler for this field. This receives the event and the field state and returns a new field state.Compose a new rendering augmentation function with the one in the form field collection. For example, we might put a label on the left side of a form field: F(str "Please check: " <+>) @@= checkboxField alive AliveField "Alive?"JThis can also be used to add multiple augmentations and associates right: h(withDefAttr someAttribute) @@= (str "Please check: " <+>) @@= checkboxField alive AliveField "Alive?"Create a new form with the specified input fields and an initial form state. The fields are initialized from the state using their state lenses and the first form input is focused initially.@A form field for manipulating a boolean value. This represents n as  [X] label and p as  [ ] label.This field responds to Space8 keypresses to toggle the checkbox and to mouse clicks.A form field for selecting a single choice from a set of possible choices. Each choice has an associated value and text label.This field responds to SpaceA keypresses to select a radio button option and to mouse clicks.A form field for using an editor to edit the text representation of a value. The other editing fields in this module are special cases of this function.-This field responds to all events handled by W, including mouse events.4A form field using a single-line editor to edit the q0 representation of a state field value of type a. This automatically uses its r instance to validate the input. This field is mostly useful in cases where the user-facing representation of a value matches the q& representation exactly, such as with l.-This field responds to all events handled by W, including mouse events.jA form field using an editor to edit a text value. Since the value is free-form text, it is always valid.-This field responds to all events handled by W, including mouse events.A form field using a single-line editor to edit a free-form text value represented as a password. The value is always considered valid and is always represented with one asterisk per password character.-This field responds to all events handled by W, including mouse events.,The namespace for the other form attributes.8The attribute for form input fields with invalid values.8The attribute for form input fields that have the focus.Returns whether all form fields in the form currently have valid values according to the fields' validation functions. This is useful when we need to decide whether the form state is up to date with respect to the form input fields.Returns the resource names associated with all form input fields that currently have invalid inputs. This is useful when we need to force the user to repair invalid inputs before moving on from a form editing session.Manually indicate that a field has invalid contents. This can be useful in situations where validation beyond the form element's validator needs to be performed and the result of that validation needs to be fed back into the form state.Render a form.dFor each form field, each input for the field is rendered using the implementation provided by its 4. The inputs are then vertically concatenated with 3Q and then augmented using the form field's rendering augmentation function (see t). Fields with invalid inputs (either due to built-in validator failure or due to external validation failure via ) will be displayed using the  attribute.4The augmented field renderings are then placed in a 3 and returned.xDispatch an event to the appropriate form field and return a new form. This handles the following events in this order:On TabE keypresses, this changes the focus to the next field in the form.On  Shift-TabI keypresses, this changes the focus to the previous field in the form.On mouse button presses (regardless of button or modifier), the focus is changed to the clicked form field and the event is forwarded to the event handler for the clicked form field.On Left or Up, if the currently-focused field is part of a collection (e.g. radio buttons), the previous entry in the collection is focused.On Right or Down, if the currently-focused field is part of a collection (e.g. radio buttons), the next entry in the collection is focused.CAll other events are forwarded to the currently focused form field.In all cases where an event is forwarded to a form field, validation of the field's input state is performed immediately after the event has been handled. If the form field's input state succeeds validation using the field's validator function, its value is immediately stored in the form state using the form field's state lens. The external validation flag is ignored during this step to ensure that external validators have a chance to get the intermediate validated value.tThe form field constructors. This is intended to be populated using the various field constructors in this module.3The initial form state used to populate the fields.The state lens for this value.&The resource name for the input field.4The label for the check box, to appear at its right.The initial form state.The state lens for this value.BThe available choices, in order. Each choice has a value of type a$, a resource name, and a text label.The initial form state.The state lens for this value.&The resource name for the input field.,The optional line limit for the editor (see W).The initialization function that turns your value into the editor's initial contents. The resulting text may contain newlines.WThe validation function that converts the editors contents into a valid value of type a.7The rendering function for the editor's contents (see \).WA rendering augmentation function to adjust the representation of the rendered editor.The initial form state.The state lens for this value.&The resource name for the input field.The initial form state.The state lens for this value.&The resource name for the input field.,The optional line limit for the editor (see W).The initial form state.The state lens for this value.&The resource name for the input field.The initial form state.&Whether the field is considered valid./The name of the form field to set as (in)valid.The form to modify. "st5SafeuMarkup with metadata type a assigned to each character.aBuild a piece of markup; assign the specified metadata to every character in the specified text.1Build markup from text with the default metadata.=Extract the text from markup, discarding the markup metadata.ySet the metadata for a range of character positions in a piece of markup. This is useful for, e.g., syntax highlighting.Convert markup to a list of lines. Each line is represented by a list of pairs in which each pair contains the longest subsequence of characters having the same metadata.6Convert a list of text and metadata pairs into markup.uNone~A type class for types that provide access to an attribute in the rendering monad. You probably won't need to instance this.7Where to get the attribute for this attribute metadata.Build a piece of markup from text with an assigned attribute name. When the markup is rendered, the attribute name will be looked up in the rendering context's ; to determine the attribute to use for this piece of text.Build a widget from markup.v#$%&'()*+,-./0123456789:;<=>>?@@ABCDEFGHIJJKLMNOOPQQRSTUVWXYZ[\]^_`abcdefghijklmnopqqrstuvwxyz{|}~       !"#$%& ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ !     #$8 !!"#$%&'()*+,-./0123456789:;<=>?@ABCDE FGH IJKLM N O P QR F S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g hi ` j kl mnopqrstuvwxyz{|}~!brick-0.36-9WRIgjKiggNH431YewBIw6 Brick.AttrMap Brick.BChan Brick.TypesBrick.BorderMap Brick.ThemesBrick.Widgets.Border.Style Data.IMap Brick.UtilBrick.Widgets.CoreBrick.Widgets.ProgressBarBrick.Widgets.EditBrick.Widgets.CenterBrick.Widgets.BorderBrick.Widgets.Dialog Brick.Focus Brick.MainBrick.Widgets.List Brick.FormsData.Text.Markup Brick.MarkupBrick.Types.TH Control.Lens makeLensesBrick.Types.CommonBrick.Types.InternallookupViewportBrick.Widgets.InternalEventM Data.TextZipperListEditappChooseCursorBrickAttrMapAttrNameattrNameattrNameComponentsattrMap forceAttrMapmergeWithDefault attrMapLookupsetDefaultAttrgetDefaultAttrapplyAttrMappings mapAttrName mapAttrNames$fIsStringAttrName$fMonoidAttrName$fSemigroupAttrName$fShowAttrName$fReadAttrName $fEqAttrName $fOrdAttrName $fShowAttrMapBChannewBChan writeBChan readBChan readBChan2 suffixLensesLocationlocEdgeseTopeBottomeLefteRightlocLeBottomLeLeftLeRightLeTopLThemethemeDefaultAttrthemeDefaultMappingthemeCustomDefaultAttrthemeCustomMappingThemeDocumentationthemeDescriptions CustomAttrcustomFgcustomBg customStyle$fMonoidCustomAttr$fSemigroupCustomAttr$fEqCustomAttr$fReadCustomAttr$fShowCustomAttr$fGenericCustomAttr$fEqThemeDocumentation$fReadThemeDocumentation$fShowThemeDocumentation$fGenericThemeDocumentation $fEqTheme $fReadTheme $fShowTheme$fGenericTheme customBgL customFgL customStyleLthemeCustomDefaultAttrLthemeCustomMappingLthemeDefaultAttrLthemeDefaultMappingLthemeDescriptionsLnewThemethemeToAttrMapapplyCustomizationsloadCustomizationssaveCustomizations saveTheme BorderStyle bsCornerTL bsCornerTR bsCornerBR bsCornerBLbsIntersectFull bsIntersectL bsIntersectR bsIntersectT bsIntersectB bsHorizontal bsVerticaldefaultBorderStyleborderStyleFromCharasciiunicode unicodeBoldunicodeRounded$fShowBorderStyle$fReadBorderStyle$fEqBorderStyleRunlenvalIMap unsafeRunsemptynull singletoninsertdeleterestrictlookupsplitLE addToKeysintersectionWithmapMaybefromListunsafeToAscList unsafeUnion$fTraversableRun $fFoldableRun$fApplicativeIMap $fOrdIMap$fEqIMap$fEqRun$fOrdRun $fReadRun $fShowRun $fFunctorRun $fShowIMap $fFunctorIMap BorderMapemptyCoordinates coordinatesboundsvaluesinsertHinsertV lookupRow lookupCollookupHlookupVsetCoordinatescropexpand translate $fEqBorderMap$fOrdBorderMap$fShowBorderMap$fFunctorBorderMap BorderSegmentbsAcceptbsOfferbsDrawCursorLocationcursorLocationcursorLocationNameTerminalLocationlocationColumnLlocationColumn locationRowL locationRow DirectionUpDownNextExtent extentNameextentUpperLeft extentSize extentOffset ViewportTypeVertical HorizontalBothViewportVP_vpLeft_vpTop_vpSizeVisibilityRequestVR vrPositionvrSize DynBorderdbStyledbAttr dbSegments bsAcceptLbsDrawLbsOfferLResultimagecursorsvisibilityRequestsextentsbordersdbAttrL dbSegmentsLdbStyleLContext ctxAttrName availWidth availHeightctxBorderStyle ctxAttrMap ctxDynBorders BrickEventVtyEventAppEvent MouseDownMouseUpbordersLcursorsLextentsLimageLvisibilityRequestsL emptyResult vrPositionLvrSizeLcursorLocationLcursorLocationNameLvpLeftvpSizevpTopclamponfgbgclOffsetRenderMWidgethSizevSizerenderSizeFixedGreedy runEventMPaddingPadMaxhandleEventLensed getContext$fFunctorEventM$fApplicativeEventM $fMonadEventM$fMonadIOEventM $fShowSize$fEqSize $fOrdSize availHeightL availWidthL ctxAttrMapL ctxAttrNameLctxBorderStyleLctxDynBordersLattrLlookupAttrName $fTerminalLocationCursorLocation cropToContextNamedgetName TextWidth textWidthwithBorderStyle joinBordersseparateBorders freezeBorders emptyWidgetaddResultOffset reportExtent clickablestrWrap strWrapWithtxtWrap txtWrapWithstrtxt hyperlinkpadLeftpadRightpadTop padBottom padLeftRight padTopBottompadAllfillvBoxhBoxhLimitvLimitsetAvailableSizewithAttr modifyDefAttr withDefAttr updateAttrMap forceAttr overrideAttrraw translateBy cropLeftBy cropRightBy cropTopBy cropBottomBy showCursorcachedviewportunsafeLookupViewportvisible visibleRegion<+><=> $fTextWidthf$fTextWidthTextprogressCompleteAttrprogressIncompleteAttr progressBarEditor editContents editorName editContentsLhandleEditorEvent editorTexteditor applyEditeditAttreditFocusedAttrgetEditContents renderEditor$fNamedEditorn $fShowEditorhCenter hCenterLayer hCenterWithvCenter vCenterLayer vCenterWithcenter centerWith centerLayer centerAbout borderAttr borderElemborderborderWithLabelhBorderhBorderWithLabelvBorderjoinableBorderDialog dialogTitle dialogButtonsdialogSelectedIndex dialogWidthdialogButtonsLdialogSelectedIndexL dialogTitleL dialogWidthLhandleDialogEventdialog dialogAttr buttonAttrbuttonSelectedAttr renderDialogdialogSelection FocusRing focusRing focusNext focusPrev withFocusRingfocusGetCurrentfocusSetCurrentfocusRingModifyfocusRingCursorViewportScroll hScrollPage hScrollByhScrollToBeginning hScrollToEnd vScrollPage vScrollByvScrollToBeginning vScrollToEndsetTopsetLeftAppappDrawappHandleEvent appStartEvent appAttrMap defaultMain simpleMain simpleApp resizeOrQuit customMain clickedExtent lookupExtentfindClickedExtents getVtyHandleinvalidateCacheEntryinvalidateCacheneverShowCursorshowFirstCursorshowCursorNamedviewportScrollcontinuehaltsuspendAndResume listElements listSelectedlistNamelistItemHeight $fFunctorList$fFoldableList$fTraversableList $fShowList listElementsLlistItemHeightL listNameL listSelectedLhandleListEventhandleListEventVilistAttrlistSelectedAttrlistSelectedFocusedAttrlist renderList listInsert listRemove listReplace listMoveUplistMovePageUp listMoveDownlistMovePageDownlistMoveByPages listMoveBy listMoveTolistSelectedElement listClear listReverse listModify $fNamedListnForm formFocus formStateFormFieldStateformFieldState formFieldLens formFieldsformFieldRenderHelper FormField formFieldNameformFieldValidateformFieldExternallyValidformFieldRenderformFieldHandleEvent@@=newForm checkboxField radioField editFieldeditShowableField editTextFieldeditPasswordFieldformAttrinvalidFormInputAttrfocusedFormInputAttrallFieldsValid invalidFields setFieldValid renderFormhandleFormEventMarkup@@fromTexttoText markupSet markupToList$fIsStringMarkup$fMonoidMarkup$fSemigroupMarkup $fShowMarkupGetAttrgetAttr@?markup$fGetAttrAttrName $fGetAttrAttrvty-5.21-Fv2db9Qjht86MWhUXxpiqCGraphics.Vty.AttributesAttrbaseGHC.Basemappend ForceAttrorigincontainers-0.5.10.2Data.IntMap.InternalIntMapmapKeysMonotonic_runs neighbors _coordinates_valuesghc-prim GHC.TypesCharContinueSuspendAndResumeHaltEventROeventViewportMapeventVtyHandle latestExtents EventStateESesScrollRequestscacheInvalidateRequestsCacheInvalidateRequestInvalidateSingleInvalidateEntire ScrollRequest HScrollBy HScrollPageHScrollToBeginning HScrollToEnd VScrollBy VScrollPageVScrollToBeginning VScrollToEndSetTopSetLeft RenderStateRS viewportMaprsScrollRequests observedNames renderCacheclickableNamesclickableNamesLobservedNamesL renderCacheLrsScrollRequestsL viewportMapL renderFinalcropResultToContextrenderDynBorder BoxRenderer Data.Foldablelength takeColumnsString#text-1.2.2.2-EakMpasry3jA6OIwSZhq9MData.Text.InternalText renderBox catBorders catAllBordersGraphics.Vty.Image DisplayRegioncontextPrimarycontextSecondary imagePrimaryimageSecondary limitPrimarylimitSecondaryprimaryWidgetSizeconcatenatePrimaryconcatenateSecondarylocationFromOffsetpadImageSecondary loPrimary hiPrimary loSecondary hiSecondarylocationFromPrimarySecondarysplitLoPrimarysplitHiPrimarysplitLoSecondarysplitHiSecondary lookupPrimaryinsertSecondaryNothingdynBorderFromDirections setDynBorders viewportNameGraphics.Vty.Input.EventsEvent InternalNextInternalSuspendAndResume InternalHaltJustMaybeIntIOTruegetInvalidFieldsFalseGHC.ShowShowGHC.ReadReadformFieldStates