   * Fix 2835316, Getting Error #2160: The TextLine is INVALID and cannot be used to access the current state of the TextBlock. double-clicking to select-all text in a TextArea
   * Fix 2841799, When lineBreak="toFit" the contentBounds width does not include the trailing whitespace
        - note: Add one global setting alwaysCalculateWhitespaceBounds to enable/disable calculate whitespace.
   * Fix 2819924, Error #1009 in flashx.textLayout.container::ContainerController::updateGraphics() 
	* Fix unreported crash that happens when composeToController is followed by updateToController.
	* Fix 2819924, a crash using floats. Also fixed a bug where an inline graphic was stopped, but not removed from the display list.
Build 232
   * Fix 2793943, "RTE with delayUpdates on, and no controllers". Null pointer exception when delayUpdates flag is on, and the TextFlow has no controllers.
Build 231
   * Fix for 2792266, "RTE on mouse down & drag from one column to another, or on shift-arrow-up/down to extend selection across columns". 
   Add better checks for null to workaround the bug.
Build 230
   * Fix for 2791491, "Setting the font in an empty RichEditableText fails for all but the first attempt (SDK-29143)". Clear the pointFormat
   when applying a leaf format to a caret selection in an empty paragraph.
   * Fix 2790764, "NeedsSoftKeyboard not set if containers are added after interactionManager".
Build 229
   * Fix 2785924 and 2785919, bugs in the delayUpdate feature. Make sure there is one per EditManager and check for null flowComposer in the redraw handler.
Build 228
   * Fix for 2783360, "Inlines are positioned incorrectly in vertical text when using the factory". There is a positioning adjustment applied to 
   TextLines and floats in the factory, to transform them since they assume the right hand edge (the top of the text) is at 0. This positioning 
   adjustment was incorrectly being applied to inlines, which are children of the TextLine, and the net effect was that the inlines were appearing 
   offset to the right by the size of the container. 
Build 225
   * Fix 2775253, "Error returns when copying and pasting a text flow with Floats repeatedly." This turned out to be a number of separate problems. 
   First, the error should have been an assert. Second, if the float was not loaded the first time through composition, and we had to remove it 
   from the line and retry, and if there was a following float that had already loaded, then it was throwing. Third, when it got to the redraw phase, 
   it was sometimes trying to add the float to the container at an illegal z-order position (past the last child location). Fourth, if the float 
   appeared within the range of visible text, but was not itself visible, and it was after a partial compose, then all floats disappeared 
   (were removed from the display list). Fifth, sometimes during composition the backout was failing if the line was the first line in the container, 
   and we were composing from the start.
Build 223
   * Fix 2774250, "If a skew &  rotate matrix is applied to the container, the cursor scales."
Build 220
   * Fix 2759026, "Remove Deprecated method EditManager/IEditManager.delayedOperations". The latest version of Flex Hero no longer calls the old API, 
   so it can be removed. If you have any problems, please pick up the latest Flex SDK.
   * Fix for 2772554, "Inlines (not just floats) turn off vertical justification". Now checks to see if graphics are floats before disabling vertical 
   justification. 
Build 219
   * Fix 2769562, "RTE adding text before stacked floats". Problem happens because the line (including the floats) isn't big enough to fit any text, 
   but the line sits above the floats, and so when it just has floats in it with 0 height it doesn't intersect the floats. Solution is to extend the 
   knockout for the floats to include the space from the previous line's descenders to the previous line baseline. Then the top of the knockout 
   coincides with the top of the line of text.
Build 216
    * Fix 2769670, "Content bounds includes only columns that were composed". Error in content bounds generating when starting composition 
    from the middle of the container -- the content bounds was including only the parcels (columns) that were in composed area, 
    not all the parcels in the container. Now assume that previous parcels/columns must be full. Not an ideal solution, since it will be
    wrong if previous columns weren't full, but should be much much cheaper computationally.
Build 215
    * Fix 2762393, "reported contentWidth doesn't seem correct with embedded image and float attribute". This turned into a set of issues with floats larger than the column width. 
    It was generating incorrect content bounds, and also sometimes not displaying floats when it should.
Build 214
    * Fix 2768598 AutoSized ILGs with padding are incorrectly positioned on first compose
Build 212
    * Fix 2761685 "MouseWheelEnabled is broken for TLF TCM Text."
    * Fix 2766823 "RTE: Inserting text next to floated inline on first line when link is applied"
Build 211
   * Fix 2765114, "[SDK-28671] Changing textFlow's interaction manager can result in RTE if there is a delayedUpdates redrawHandler active".
   * Fix 2765464, Compose With no ContainerControllers loses track of pending InlineGraphicElements
   - note: manipulating TextFlow.flowComposer and removing/adding ContainerControllers can create situations in which inlinegraphics are loaded when its not intended or not loaded when it is intended.  TLF errs on the side of keeping loaded graphics loaded but that may not always be the desired result.  For example a call to textFlow.flowComposer.removeAllControllers is ambiguous about the disposition of the ILGs.  Two tlf_internal methods can be used to resolve these situations.  TextFlow.unloadGraphics unloads all loaded graphics.  TextFlow.prepareGraphicsForLoad queues graphics so that on the next call to updateAllControllers they will be loaded.
   * Fix 2765462 Docs only: The FlowElementMouseEvent docs and examples refers to MouseEvent strings not FlowElementMouseEvent strings
   * tlf_internal method getEventMirror now returns an IEventDispatcher instead of an EventDispatcher.
Build 210
   * Fix new SpanElement().deepCopy RTE
Build 206
   * Fix 2761051, "Pasted plain text not picking up attributes of paragraph in flow." Flow is now automatically assuming plain text if the format 
   imported from the clipboard is PLAIN_TEXT_FORMAT, and automatically assuming formatted text if the format is TEXT_LAYOUT_FORMAT. All other 
   formats are considered "unknown" and we will inspect the text, as before, for attributes to determine if it is plain. Flows with ListElements, 
   LinkElements, GroupElements, or DivElements are also considered to be formatted.
   * Fix null pointer RTE caused by inline that has not loaded correctly.
   * Fix 2738009 Hitting return in nested list content proliferates list elements
   * Fix 2662563, "Can't delete nested lists from UI." Now if you select all and delete, it will delete the final terminator of a list at the end of a flow. 
   * Fix 2761816 ReadOnly TextContainerManager Ignores Scroll Wheel
Build 205
   * Fix 2760281 InlineGraphicElements in Vertical Chinese Text Are Incorrectly Positioned
   * Doc fix:  add class name before default value in TextLayoutFormat and TabStopFormat formats.
Build 204
   * Fix 2758147, "When inputting text to a tlf container with overflow and small leading, the container doesn't scroll smoothly as text is input." 
   * Resolve issue: TLF 2.0 is not working with the Flex Hero 17689 and 17855 - added IEditManager.delayedOperations back in - will remove it when hero posts a new build without that API
   * Fix 2758434, "Undo/Redo multiple levels of delete & insert not returning to correct state".
   * Fix 2759135 (SDK-28559), turn delayUpdates on and hold down the backspace key generates an RTE. Force updates to be handled before processing key events.
   * Fix RTE in TextLayoutFormat.removeClashing and removeMatching when userstyles where used.
   * Fix 2758274 "SelectionManager::getCommonCharacterFormat() can return 'null' or 'undefined' value in an attribute for an insertion point where the attribute 
   is different on either side of the insertion point". Now if you make an ElementRange for a point (absoluteStart == absoluteEnd) the startLeaf and endLeaf will 
   always be the same. 
    * Fix 2758165 TextContainerManager.setTextFlow when textFlow has elements with eventListeners attached uses Factory when it should switch to flowcomposer
    - FlowLeafElements, SubParagraphGroupElements, TCYElements and LinkElements have a tlf_internal getEventMirror call.  This can be used to attach event handlers to any of these elements.  This changelist fixes various bugs with that mechanism.  Note that adding or removing an event listener is a model change and requires a call to updateAllControllers to instantiate the change.
   * Fix 2759997, "Attributes applied to insertion point are not applied to pasted unformatted text". Added test case to OperationTest.copyPasteUndoRedo.
   * Add a "delist" button to the ListProperty panel.  Add the ListProperty panel to TextLayoutEditor.
Build 203
    * Fix 2758185 Unhandled securityerror in InlineGraphicElement Loader.load call
Build 202
    * Fix 2732785 backgroundColor on list marker not shown
    - to use specify the backgroundColor in the listMarkerFormat property
    - when computing the background color rectangle height the list marker is not considered part of the text line.
Build 201
    * Fix unreported issue.  Changing TextFlow.flowComposer to null wasn't stopping or unloading inlinegraphicelements
    - improve performance TextFlow now tracks how many interctiveObjects and InlineGraphicElements it has
    - enables switching flowComposer logic to no longer scan for ILGs to shutdown or startup unless they are present
    - enables TextContainerManager to more efficiently determine if a TextFlow can use the factory
    - improves fix to 2754799 Textflow link element doesn't work after append to an existed textflow
    * Made InlineGraphicElement.stop(okToUnloadGraphics:Boolean) a tlf_internal methods.  Clients can use this to stop a graphic specified by class or URI from loading and/or to drereference the graphic.  Next compose will reload it. 
    * Added tlf_internal method FlowElement.applyFunctionToElements(func:Function).  Recursively descends calling  func on each element until func returns true.  Example calling stop on every InlineGraphicElement:
	textFlow.applyFunctionToElements(function (elem:FlowElement):Boolean{ if (elem is InlineGraphicElement) (elem as InlineGraphicElement).stop(true); return false; });
Build 200
    * Fix 2754698, "Exception in Cursor Navigation". We were getting an exception when the selection was in overset text, 
    where the overset couldn't be composed because a large image earlier in the flow could not be placed in a narrow column. 
    previousLine and nextLine expect composed text. Instead, now we back the cursor up to the last composed position.
    * Fixed unreported bug in treatment of inline graphics, where they were getting directly attached to the GraphicElement.
    * Fix 2754799 Textflow link element doesn't work after append to an existed textflow
Build 199
    * Fix 2603455 applyLink can't remove selected text's link if selected text begins with no linkElement
    * Enable ListItemElements to have a DivElement as the first child.  
    - The first Paragraph in the ListItemElement can have a chain of DivElement parents before the ListItemElement.  If there is a ListElement in the chain then a Paragraph will be inserted as the first child of the ListItemElement by normalize.
Build 198
    * Rename static method TextConverter.initialize to TextConverter.setFormatsTodefault and make it tlf_internal
    * Make static array TextConverter._descriptors tlf_internal
    * getCommonParagraphFormat API now returns common locale and padding settings on paragraphs
    - underlying change is to enable internal Property metadata objects to include multiple categories for the property.
    * Fixes for soft keyboard.
Build 197
    * Fix 2714716 [Flex TLF Ingeration] - missing metadata for float attribute causing minor issues
    * Fix 2683832 TextFlow isnt code hinting any enums in Builder
Build 196 
    * Fix Additional issues with 2559275 "TextFieldHTMLImporter: <textformat> tag inside <p> tag ignores leading property; TextField doesn't"
    - The explicit paragraph and implicit paragraph cases are now inconsistent.
    - A TextFormat as the first XML element in a paragraph formats the containing paragraph
    * Fix 2751036 TextFieldHTMLImporter Should Set typeName when creating an element of a different type
    - when a span is converted to <g> it is now set with typeName="span"
    - for consistency convert all typeName strings to lower case in the TextFieldHTMLImporter
    * Fix 2620719 SelectionManager.getCommonContainerFormat() returns only first container's format - now uses range like other getCommon APIs
    * Fix 2750420 Fully specified legal values in ASDocs for format properties should include class name and property name only (doc changes only)
    * ClearFormatOperation now clears user styles.
    * Fix "CCJK IMEs: Duplicate characters is input into spark TextInput component after call setStyle method to change the font size.". IME text
    from previous edits wasn't removed after a direct model change, and text was left underlined as if IME session still active.
Build 195
    * API Changes: imageSourceResolver in IHTMLImporter and ITextLayoutImporter renamed to imageSourceResolveFunction. 
    importBodyElement in IHTMLImporter renamed to preserveBodyElement and importHTMLElement renamed to preserveHTMLElement. 
    IHTMLImporter, ITextLayoutImporter interfaces now extend ITextImporter. IPlainTextExporter now extends ITextExporter. 
    TextConverter decorateForClipboard renamed to useClipboardAnnotations. textFlow is now accessible as a new public property on TextScrap.
    * API Changes: 
    CreateListElement - remove listMarkerFormat parameter (use listFormat.listMarkerFormat), rename listparent to parent, rename listElement to newListElement
    CreateSubParagraphGroupOperation - rename listParent to parent, reorder constructor, rename listElement to newListElement
    CreateDivOperation - rename newparent to parent, reorder constructor, rename divElement to newDivElement
    MoveChildrenOperation - fix documentation, add getters and setters for constructor parameters
    SplitElementOperation - rename constructor parameter target to targetElement
    ApplyElementTypeNameOperation - rename constructor parameter newTypeName to typeName, rename newTypeName getter/setter to typeName
    TCYOperation - rename tcyElement to newTCYElement
    ApplyLinkOperation - rename linkElement to newLinkElement
    InsertInlineGraphicOperation - rename inlineGraphicElement to newInlineGraphicElement
    IEditManager/EditManager changes
      createDiv - reorder parameters
      createList - reorder parameters; remove markerFormat use format.listMarkerFormat
      createSubParagraphGroup - reorder parameters
      applyFormatToElement - add new parameters relativeStart, relativeEnd to apply format to split the element and apply the format to a sub-range
    * Fix 2746688, "The color of the text is incorrect, which is pasted from clipboard with PlainTextImporter". When plain text was pasted 
    into an empty paragraph it wasn't picking up the attributes of the context it was being pasted into.
    * Fix 2751088 bullets get incorrectly positioned after scrolling
Build 194
    * Fix 2748900 [SDK-19063] TCM that contains hyperlinks out of scroll view don't work when scrolled to
Build 193
    * Deprecate classes ApplyElementStyleNameOperation and ApplyElementUserStyleOperation - use ApplyFormatToElementOperation
    * Deprecate IEditManager/EditManager changeStyleName - use applyFormatToElement
Build 192
    * Cleanup pass on Fix 2742951 Merge UserStyles into TextLayoutFormat
	- add linkNormalFormat, linkHoverFormat, linkActiveFormat and listMarkerFormat as explicit style properties on TextLayoutFormat.
	- add properties styles, coreStyles and userStyles to TextlayoutFormat
	- add getStyle to ITabStopFormat and TabStopFormat.  add setStyle to TabStopFormat
Build 191
    * Fix for unreported recent injection in custom clipboard copy/paste, failed to continue to try importers after the first one returned null.
    * Fix 2742951 Merge UserStyles into TextLayoutFormat
      User styles and the styleName property are now stored in the TextLayoutFormat object attached to the FlowElement.  Previously they were assigned
      in a separate object and not copied with the format property.  Several API changes go along with this.
	TextLayoutFormt class - add getStyle/setStyle; add styleName as a property
	ITextLayoutFormat interface - add getStyle and styleName property
	FlowElement/ContainerController - get styles API added to return an object containing all styles as properties.
    * Consolidated tlf_internal BuildInfo class into TextLayoutVersion. BuildInfo.kBuildNumber renamed TextLayoutVersion.BUILD_NUMBER, and BuildInfo.kBranch 
	renamed to BRANCH. Client code that needs VERSION changed to call TextLayoutVersion.getVersionString(TextLayoutVersion.CURRENT_VERSION).
Build 190
    * Another attempt at fixing the regression that causes inlines to disappear when converted to floats. 
    Previous fix fixed some cases, but there were still ways to trigger the bug.
Build 189
    * Fix regression that caused inlines that are changed from Float.NONE to another value of Float to disappear. 
    Problem was that they would be added as a child of the container, and then immediately removed.
Build 188
    * Fix 2740300 AIR Only: Lines of text with underline or strikethrough style disappear when the text is scrolled.
    * Fix 2742233, "RTE adding text after link if link is at end of textflow". Second try at this -- there were multiple 
    ways of getting to this RTE. Normalization code updated so that a terminator in its own span at the end of a paragraph 
    is merged with the previous span even if the previous span is a descendant of a sibling, and not an actual sibling. 
    This latter fix was necessary because otherwise we register failure on undo of insert at the end of a paragraph after 
    a link because the trailing span was left. However, this is equivalent to leaving the span off, and letting the terminator 
    go in the link. With this change there is a single representation for this situation.
    * Adjustments to how unformatted pasted text picks up the format from the surrounding text. Previous, it would always 
    pick up the format from the previous or next sibling. Now its adjusted slightly so that a leaf element (e.g., a span) 
    always picks up the accumulated format of the previous sibling down to the span level. This allows a span pasted next 
    to a link to pick up the fontFamily applied to the link's last leaf. Fixes the problem where the link's span overrides 
    the fontFamily, but this is not picked up by the span pasted next to it.
    * API CHANGE: Renamed TLFVersion to TextLayoutVersion. getVersionString is now tlf_internal. Added constants for VERSION_1_0
    and VERSION_1_1.
    * 	API CHANGES: ConverterDescriptor class renamed to FormatDescriptor. TextConverter.getConverterDescriptorAt renamed 
    to getFormatDescriptorAt. TextConverter properties moved out into new filter-specific interfaces: IPlainTextExporter, 
    IHTMLImporter, and ITLFImporter. TextConverter.PASTE_MERGE_TO_PREVIOUS and PASTE_MERGE_TO_NEXT moved to ConverterBase 
    class and renamed to MERGE_TO_PREVIOUS_ON_PASTE and MERGE_TO_NEXT_ON_PASTE. Removed ITextImporter and ITextExporter 
    getProperty/setProperty functions (they're replaced by new interfaces).
    * Fix for 2651039, "Pasting into an empty paragraph should override paragraph properties". Now TLF explicitly checks for 
    empty paragraphs in the PasteOperation class. 
Build 185
    * Fix 2741297, "InsertTextOperation.doInternal changed so if the text to insert is "" there is an RTE in applyPointFormat because span=null". Now check for null span in InsertTextOperation.
    * Fix 2600932, "Cursoring from a long line to a short line can sometimes not scroll to show cursor context". The automatic scroll to keep a range of text in view now changed so that it 
    attempts to center the range in the logical horizontal direction.
    * Fix 2617150 Allow user-defined tags to remain in the HTML so they can be used by the IFormatResolver
    - This feature addition has has several pieces.
    - FlowElement now has a public typeName get/set API.  Normally this returns the same value as the tlf_internal API defaultTypeName.  This can be set to any string.
    - typeName (when different from defaultTypeName) is exported by TEXT_LAYOUT_FORMAT TextConverter.  It is also handled by the importer.
    - TextFlow has a new API getElementsByTypeName.
    - TEXT_FIELD_HTML_FORMAT will now tag elements with typeName when an unknown tag is used.  The importer pushes the typeName down to the lowest level possible and avoids 
        creating extra elements while preserving information for roundtripping.  For example:
        HTML --> TLFMarkup
        <foo><p>my text</p></foo> --> <p typeName="FOO"><span>my text</span></p>
        <foo><p>p1</p><p>p2</p></foo> --> <div typeName="FOO"><p><span>p1</span><p><p><span>p2</span><p></div>
    - The TEXT_FIELD_HTML_FORMAT importer always convert user-defined tags to upper case
    - The TEXT_FIELD_HTML_FORMAT importer has two new boolean properties (accessed by the IFormatImporter setProperty API).  These both default to false
        IMPORT_HTML_TAG - sets the typeName of the imported TextFlow to HTML and imports any nested HTML elements as a user defined type
        IMPORT_HTML_BODY_TAG - imports the body element as a user defined tag.  Otherwise it is skipped
    * Add ApplyElementTypeNameOperation and changeTypeName to IEditmanager and EditManager
    * Padding properties (paddingLeft, paddingTop, paddingRight, paddingBottom) categories changed from Container to Paragraph, since these can now be applied to paragraph.
    * Fix 2742233, "RTE adding text after link if link is at end of textflow".
    * Fix 2741416 Select-All ENTER Doesn't Create new Paragraph
    * Fix 2546631, "Plain text does not take on selection formatting when pasted". Detect when a text scrap is unformatted, and have each element when it is 
    pasted get the format of its (new) preceding sibling, or if there is no preceding sibling, the following sibling. I don't know yet whether this is the best 
    approach; one alternative would be to code it specifically for leaf elements and paragraphs, and ignore other elements.
Build 184
    * Fix 2739866, "ContainerManager::removeInlineGrahicElement() doesn't seem to get called.". 
    * Fix [SDK-28210] "SpanElement.normalizeRange() should not combine spans if the span is bindable". 
    * Fix 2739996, "Flow scrolls incorrectly right after an inline moves off the end of the container".
    * Performance improvement.  FlowLeafElement now always holds text in _text.  Removes some overrides and other tests
    * Fix 2700108, "Changing font color shifts characters noticeably within the last linked container if it has overset text." 
    ScrollToRange was scrolling inconsistently when the range extended both above and below the visible area. Now it no longer 
    scrolls in that case. since the visible area is already showing the range.
Build 183
    * Fix 2559275 TextFieldHTMLImporter: <textformat> tag inside <p> tag ignores leading property; TextField doesn't
    * Fix 2617284 Request: StrikeThrough Support in HTML importer, support <s> tag
    * Fix 2730934, "Editing of Measured Container with Floats can double up lines". Bug happens when composing from the middle of the container
    when we are measuring text that contains floats. 
    * Fix 2562965 Preserve id and class attributes through import and export
    - preserved on p,span,a,img,ul,ol,li elements on import.  Not for user defined tags - will be done as part of that bug fix.
    * Fix 2733620, "Padding on intermediate elements computes incorrect bounds when measuring with the factory." Added checks to 
    finalParcelAdjust to take padding on parent chain into consideration when generated bounds.
Build 182
    * Call disposeXML everywhere where XML objects are explicitly allocated, and we don't them back to the client. This should help with garbage collection. 
    Client code that receives XML from TLF is advised to also call flash.system.System.disposeXML when it is completely done with the XML object.
    * Behavior change when editing links. If you select and type, (thus replacing what was selected with what you typed) the inserted text will now pick up 
    the link attributes from the start of the range being deleted if it contains a link. As you continue typing, the link will be extended to include the 
    new characters. In order to type plain text (drop the link attributes) you have to change the selection. This can be done in any way (e.g., click somewhere 
    else, use the arrow key, programmatically). Note that if you "change" the selection to the value it already has, it will have no effect (i.e., link 
    attributes won't be dropped). Therefore clicking back on the same caret location won't drop the link attributes. If you select, delete, and then type, 
    although the other attributes from the deleted text are applied to the newly inserted text, link attributes are not.
    * Fixing bugs in the custom clipboard code to enable same clipboard format, multiple TextConverter formats. This enables multiple filters to all try and 
    handle air:text, for example. API CHANGE for new TextConverter addFormatAt function, which now takes a String clipboardFormat in place of the previous Boolean.
    * Normalize the flow when the interactionManager is set to non-null. This reduces the chance that users will get errors due to executing operations on 
    un-normalized TextFlows. Fix for 2589714, "EditManager functions assert if called on a flow with no controllers". Does not fix all possible cases of this, 
    but should address many.
    * Fix [SDK-26295] losing fontStyle and fontWeight with TLF when importing XML into TextFlow
    - in some cases the formatting was ignored.
Build 181
    * Fix 2736125, "Undo in nested list/list item situation doesn't get you back to initial state". 
    Undo was being skipped if the textFlow was the same length after the delete as it was before, but 
    this is wrong because it can happen even if the textFlow has changed.
    * Fix 2630565 TLF cursor is transformed with container instead of maintaining a pixel's width
    cursor size calculation now takes scaling of Sprite into account
    * Rename HtmlImporter to TextFieldHtmlImporter and HtmlExporter to TextFieldHtmlExporter.  These are internal classes not exposed outside of the textLayout swc
Build 180
    * Fix 2699246, "Cut isn't consistent with delete when typing afterwards". Delete was setting the pointFormat differently from Cut; now they use the same code for that.
    * Fix for 2716695, "Apply format changes immediately to empty paragraphs". When applying a leaf format to an empty paragraph (contains only a terminator) 
    apply the leaf format to the terminator immediately. Retains previous behavior of delaying the format change to apply to next insert if the paragraph has any content.
    * Fix 2693210 Movies as inlines continue playing (sound) after they are deleted
    * Fix 2696786 Document the event: syntax for LinkElement
    * Fix 2724144, "Inline graphic disappears when it would be partially obscured by the edge of the container". Inlines were disappearing if the text of the line they were 
    in was not visible. This is obvious when you have a line with a tall graphic that is scrolled so the text of the line is scrolled off, but you should be able to see the graphic.
    * Fix 2523634 [SDK-24957] TextContainerManager doesnt show blinky text insertion cursor or highlighted text correctly when z-index is specified
    - second go round on this.  Revert original fix.  Issue is don't use DIFFERENCE blendMode on the SelectionFormat when setting z on the sprite.  Player acts as if the sprite has no background.
    * Fix unreported bug Model Changes (e.g. replaceChildren) that make the selection go beyond the end of the TextFlow causes assertions when the selection is highlighted
    * Fix unreported bug SelectionFormat with blinkRate of zero for the point selection would never draw
Build 179
    * Fix 2730683 SplitElement and undo errors caught in OpHammer with end-of-list (or div?) selection
    * Fix 2721916, "A text flow that has no interactionManager doesn't support scrolling with the scroll wheel." Scrolling with the mouse wheel 
    should now work in a TextFlow that is read-only (has a null interactionManager).
    * User styles are now propagated through insertion and deletion. Created a new tlf_internal class for the SelectionManager pointFormat, 
    that can (optionally) hold more information than just a TextLayoutFormat. You can set the userStyles on this new PointFormat object, and 
    they will applied as part of the next insertion, same as if you applied bold and then inserted text. Also, if you are replacing a range of
    text that has userStyles applied to it, the userStyles in the deleted text will be applied to the inserted text, unless the insertion overrides
    the point format. Added same capabilities for TCY and links; this part is still under construction.
    * Fix 2735762 Links do not work with Vertical text.
    * Fix for Watson 2512062, styleName attribute from left-side span not propagated to inline graphic elements inserted right after the span. 
Build 177
    * Fix 2563434 Importers resolve relative image paths from the swf, not the HTML file
    - add new importer property IMG_SOURCE_FILTER_FUNCTION
    * move HtmlImporter property string defintions from HtmlImporter to TextConverter
    - moved PARAGRAPH_SEPARATOR_PROPERTY 
    - and  STRIP_DISCRETIONARY_HYPHENS_PROPERTY 
    * Fix 2734227 listStylePosition of 'inside' causes RTE if listStyleType='none'
Build 176
   * Fix issues with "inside" list markers; positioning in measured content, content Bounds calculations.
   * Fix 2732842 Bad line heights after turning on measure height with list content
   - marker TextLine was recording a TextLayoutFormat that was later modified
Build 175
   * Fix a number of paste problems involving lists. Also fixed a bug that was causing paste attributes to leak into the TextFlow 
   after a paste of a partial link element.
   * Fix 2683918 [SDK-27255] Spark RichEditableText not measuring text properly when using TLF 2.0 lists
   - list markers now included in contentbounds 
   * Fix 2694381 TextContainerManager doesn't draw text using the initial format
   -  the initial format from TCM configuration was ignored when drawing after a setText call
   * Fix 2732785 backgroundColor on list marker causes RTE
   - but backgroundColor on list marker does not display
   * Fix 2730723, "Text insert not undone when replacing selection in list item containing more structure". 
   * Fix 2730028, "Links added to sub-elements inside another link should throw". 
Build 172
   * Fix paste of plain text copied in external application and pasted into TLF.
Build 171
   * List markers now line up independent of the paragraph's textAlign property
   * Fix issues vertical text and measurement
   - containercontroller would not add lines after the first one
   - tcm would set the clip incorrectly when not measuring in the non bp direction
   * Raising maximum & lowering minumum limits for padding size, also updated min/max of paragraphSpaceBefore, 
   paragraphSpaceAfter,paragraphStartIndent, paragraphEndIndent to match. 
   * API and MARKUP change: Updating the new minimum, optimum, and maximum word spacing properties to be a single 
   compound "wordSpacing" property. This was necessary so that checks for correctness of values can be done 
   atomically, since the values are interdepedent. Added a new SpacingLimit property handler for new compound 
   value.
   * TextContainerManager.  Make _composedLines tlf_internal.  Add tlf_internal API factoryUpdateContainerChildren
   * Fix measured text (NaN for composition dim in bp direction) and restart of editing issues with gaps on left and right and alignment
   - floats were not accounted for,  now when measuring and there are floats recompose starts from the beginnig
   - padding on divs/paragraphs/list/listitems is now accounted for
   - fix mismatch between restart and normal compose on handling of the textIndent property
   - fix issues with restart and placement of the list markers
Build 170
   * ITextImporter & ITextExporter getProperty and setProperty functions added back into the public API (necessary for custom clipboard formats). 
   Also added back in PlainTextExporter string constants for stripDiscretionaryHyphens and paragraphSeparator properties.
   * Revert selection at end of line change made earlier in this release to original behavior
   * Add a new leading model (LeadingModel.BOX) based on the CSS inline formatting model. 
Build 169
   * Support for installable clipboard formats. It's now possible to programmatically install a new text conversion format that is used
   by clipboard on copy and paste, such that the new format is posted to the clipboard on copy, and used on paste when fetching data
   back from the clipboard. See new APIs in TextConverter class. Also now possible for a flow operation event listener to examine the
   text being pasted -- textFlow is exposed in TextScrap class.
   * Added new formatting properties -- minimumSpacing, optimumSpacing and maximumSpacing. minimumSpacing and maximumSpacing control how 
   the extra space is spread out when justifying text. When textJustify is "distribute", justification space is apportioned to the spaces
   in the line up to the maximum amount allowed by maximumSpacing, and any further spacing is distributed via letterspacing (letters are
   spaced apart). If text is being compressed to fit into the justified space, the same principle applies; spaces will be compressed first,
   until the minimumSpacing value is reach, and any additional compression will appear as letterspacing. optimumSpacing applies to all text
   regardless of the textJustify value, and effectively resizes the space character by the percentage supplied. This feature requires the
   10.1 (Argo) player or later.
Build 168
   * Cleanup CreateDivOperation
   * Fix 2716535 RTE scrolling a list in a spark TextArea
   * Fix 2622500 Can't import multi-column list with no column gap
   - issue was with handling of situations in which composer created no parcels
Build 167
   * Fix 2685268 lose list items when crossing containers (list markers not appearing in some multi container cases)
   * Fix unreported bug - "inside" list markers disappear during scrolling
   * Fix 2676298 (again!) "Deleting a float causes another float to disappear". Improved the validation code in the deelteAtStart test to check that the 
   deleted float is *not* in the display list, and that the other float *is* in the display list.
Build 166
   * Fix bug 2719488, "RTE in Float Selection Code". Block selection that contains an inline graphic with float = none that hasn't loaded yet was crashing. 
   * Fix 2679666 list with <img> can't be displayed correctly after scroll down or up
   * Fix 2717620, "Got 'null reference..' RTE when running importTest in VellumUnit for this particular html file". Problem was with link elements that 
   start in the composed area and extend beyond it, it was crashing trying to generate the bounding boxes of elements that weren't fully composed. 
   Now it generates bounding boxes only for that portion of the element that has been composed.
   * Fix 2719286 Missing List Marker When afterContent has tabs In Player 10.0
   - tabs set in listMarkerFormat were being ignored
   - originally reported on forum: http://forums.adobe.com/message/3135638#3135638
   * Fix 2629705 Documentation for ContainerController.setCompositionSize should reference NaN and describe its autosize behavior.
Build 165
   * Fix bug 2720860 Adornment display is lost after scrolling away and back
   * Fix bugs in undoing applyLink and applyTCY.
   * API Changes: TextConverter.addConverter and removeConverter renamed to addFormat and removeFormat and are now tlf_internal. 
   Removed getProperty and setProperty functions from ITextExport claer and ITextImporter, and made them tlf_internal in ConverterBase. 
   clear and reportError functions in ConverterBase are now tlf_internal as well.
   * Fix 2720514 "inside" listItems incorrectly positioned next to floats
   * API Change: Renamed IEditManager.delayedOperations to allowDelayedOperations. Renamed IEditManager.delayedUpdate to delayUpdates. 
   Renamed IEditManager.createSPGE to createSubParagraphGroup, and reordered parameters. Renamed CreateSPGEOperation to CreateSubParagraphGroupOperation, 
   and reordered parameters. Reordered parameters to IEditManager.createList.
   * API Change: ISelectionManager functions getCommonCharacterFormat, getCommonParagraphFormat and getCommonContainerFormat now return a 
   TextLayoutFormat instead of an ITextLayoutFormat. This change is backwards compatible with current code because TextLayoutFormat 
   implements ITextLayoutFormat.
   * API Update:  new overridable TCM methods added in 164 are now all tlf_internal.
   * API Change: IEditManager.splitParagraph now returns the new ParagraphElement that was created. 
   * Fix bug 2719547 where inline graphics either disappear or appear in the wrong place if you scroll away and then back.
   * Fix unreported bug - using TextContainerManager with a TextFlow and all images already loaded and floats (it goes through the factory) would not display all the content
   * Fix 2724129 Vertical text which has a Inline graphic with Tate Chu Yoko applied throws an RTE
Build 164
   * Add overridable TextContainerManager methods to override for adding objects to Container.  These are the same as the ContainerController mehods
   - add new ContainerController method removeBackgroundShape - also in TCM
   - these methods aren't yet connected when TCM is using the factory
   * Flex request: Remove Configuration.listAutoPadding and add it to TextLayoutFormat.listAutoPadding.
   * Fix a number of problems in undo of delete text range, mostly related to incorrect undo results with hierarchal text (including divs or lists).
   * Fixed a problem where the textLength of a ContainerController was not updated correctly in response to a model change if there are more than 
   one linked containers, and the second and subsequent containers are empty due to a previous text deletion.
   * SpanElement.getText now handles the default parameter of relativeEnd correctly -- it was returning an empty string instead of the entire contents of the span.
Build 162
   * Fix 2720504 [Flex TLF 2.0 Integration] - List enter key adds new item but remains on current line
Build 161
   * Make TextContainerManager functions clearComposedLines and clearContainerChildren tlf_internal
Build 160
  * Adding new values for ClearFloats: "start" and "end". These are relative to the element's own direction setting.
  * Initial implementation of CreateDivOperation
Build 159
  * API CHANGE: rename [I]Configuration.autoListElementStartPadding to listAutoPadding
  * API CHANGE: change markup for SubPargraphGroupElement from <spge> to <g>
Build 158
  * API CHANGE: ContainerController addFloat/removeFloat renamed to addInlineGraphicElement/removeInlineGraphicElement, 
  which takes a new parameter for the DisplayObject parent, and is now called for both floats and non-float graphics. Non-float
  (regular inlines) are always parented to a TextLine. This allows the client to control when the inline graphics are added and removed.
Build 157
  * Fix 2695659 FlowGroupElement.replaceChildren can insert unexpected terminator
  * Add IEditManager.createSPGE and CreateSPGEOperation for creating SubParagraphGroupElements (still in progress)
Build 156
  * Cleanup/debug SplitElementOperation.  This operation is the base class for SplitPargraphOperation and is also publicly available.  It has some limitations.
    - only usable on FlowGroupElements but not on SubParagraphElements.  Issue is that they merge during normalize
    - will delete a specified range - if the the range includes the element it will be deleted and not split.
  * API and MARKUP CHANGE: Rename "clear" property of ITextLayoutFormat to "clearFloats". This also changes the XML "clear" property in TLF markup format to "clearFloats".
Build 154
  * Fix 2636875 [SDK-26472] RTE in TLF (RTE was gone - minor cleanup for containers with no lines)
Build 153
  * API CHANGE: BaseSubParagraphGroupElement renamed to SubParagraphGroupElementBase. Added  more comments to ListElement 
  and ListItemElement, and added @private to tlf_internal members of ListElement.
  * API CHANGE: Renamed protected function addFloatChild/removeFloatChild to addFloat/removeFloat.
  * Fix 2679603 A marker should ignore the link formatting when the first span in the paragraph is in a link
Build 152
  * Fix 2709600 Stack overflow composing a line with two spans with backgroundColor and backgroundAlpha set
  - fix general problem with recursive calls to getTextLine
  * Fix 2563165 BackgroundColor should be supported by the StringTextLineFactory
  * Fix 2689668 TLF list with decimalLeadingZero listStyleType shouldnt prefix things outside of the -9 to +9 range
Build 144
  * Fix a number of bugs relating to copy & paste.
Build 142
 * Implement SubParagraphGroupElement (<spge> tag in markup) as a valid FlowElement for grouping of elements that are children of Paragraphs.  The base class of LinkElement, TCYElement and SubParagraphGroupElement is a new class BaseSubParagraphGroupElement.  This allows grouping of FlowLeafElements and BaseSubParagraphGroupElements into a parent in the model.  For example: <p>before<spge>text<a>link</a>text</spge>after</p>. The naming of this class and the <spge> name in markup are tentative and likely to change.
Build 140
 * remove marginLeft, marginRight, marginTop and marginBottom properties - not implemented in 2.0
 * add "auto" as a legal value for paddingLeft, paddingRight, paddingTop and paddingBottom
 * add new IConfiguration/Configuration property autoListElementStartPadding.  This property is the padding used for ListElement on a lists's start side when the start side padding value is "auto".
  * Fix unreported bug in ApplyFormatOperation.  new formats weren't applied to any containers when the selection was a point selection at position 0.
  * Update the UI to allow setting "auto" the padding propertiesremove the margin properties.
  * Minor performance cleanup in LocaleUtil
  * Minor formatting fixes in TabStopFormat/TextLayoutFormat as generated by the script
Build 139
  * Remove TextContainerManager.delayedOperations property added earlier.  Instead clients will override createEditManager and supply their own values as needed.
  * API CHANGE -- Fix 2449209, "EditManager creation methods should return FlowElements". IEditManager applyLink, applyTCY. createList, insertInlineGraphic now 
  all return the FlowElement that was created. These functions were void before. In addition, the operations now each have a public getter method to return the 
  FlowElement created.
Build 136
  * Fix 2610219, "TextFlow paddingLeft not working when using RTL and dynamic width".
  * Fix unreported bug in floats where with measurement on floats should default to inlines, 
  but were disappearing instead. Added test to FloatTest, measureWidth, to catch this error in future.
Build 134
  * Fix 2683689, "Need ability to override setting the mouse cursor". Added new protected function to SelectionManager that 
  bottlenecks where the mouse cursor is set in the SelectionManager.
  * Fix SDK-27234, RTE in empty controller (compositionWidth & height 0). 
Build 133
  * Fix for SDK-27304, RTE when a TextFlow that was set into one TextContainerManager is applied to another. Now make sure the new TextFlow is 
  removed from its previous textContainerManager before applying it to the new one.
  * Fix 2661625, "Can't scroll to show floats nearly column-width that have been pushed to a scrollable column". Two separate problems. In the first, the content bounds 
  was not taking into account the leading float where the text is pushed below the float. In the second, the text below the float goes overset, sending the float with 
  it, and the result is the float and the text disappear even though the container is scrollable. Added tests for both these cases.
  * TextContainerManager.updateContainer now returns a boolean.  true if anything changed.
  * add TextContainerManager.delayedOperations property.  This sets the value into the EditManager when TCM is editing.
  * Fix 2647149, "Drag-selecting past the end on the last line of a paragraph should select the terminator". Hit test at the end of the line now returns the 
  position *after* the paragraph terminator, or (if it's not the last line) including the space at the end of the line. 
Build 132
  * Return selection behavior back to what it was for 1.1 -- now no longer possible to select the last character. Fix 2676318.
  * Fix bug that causes links not to click events.
  * Fix 2679595, deleting float causes another float to disappear
Build 129
  * Fix 2523634 [SDK-24957] TextContainerManager doesnt show blinky text insertion cursor or highlighted text correctly when z-index is specified
  - note: selection must be updated via refreshSelection when z-index is changed.
  * Fix 2661617, "Text indent lost for paragraph pushed below float that is almost column width". Text indent was being treated same as left/right 
  margin, so text was not indented from the float if the float was bigger than the indent. Now indent is from the edge of the wrapped text, 
  not from the edge of the container.
  * Fix bug in Configuration.clone(), where it wasn't cloning the compatibilityVersion.
Build 128
  * Fix 2676352 Links aren't working except in the first paragraph
Build 127
  * Partial Fix 2545628 RTE on selection click with certain combination of text properties (SDK-24988)
  - FTE is returning odd values when unicode ligature code points are used.  TLF was using atomIndexes when it should have used characterIndexes.
  - Final fix will be based on what player does to fix 2676467.  Current fix prevents the crash
  * Fix 2607156 TCM can overwrite changes to container's contextMenu
  - if TCM.createContextMenu override returns null TCM assumes client is managing the menu and doesn't clear it.  TCM will still attach event listener for MENU_SELECT events and handle cut/copy/paste/select all
  * Fix 2654126 Leaks caused by TCM Globals
  - TCM in normal operation does a better job of releasing references
  - added new static tlf_internal API TextContainerManager.releaseReferences to release static reusable objects TCM holds on to for performance purposes.
Build 126
  * Fix 2632249, "Redoing inserting a paragraph return puts the cursor in the wrong paragraph". Redo of SplitParagraph was returning the original selection state, 
  now leaves it unchanged since it is left in the correct state by notifyInsertAndDelete. Added new case to undoSplitParagraph to test for this, and added new checks 
  to undoHelper in OperationTest to find other selection problems with undo/redo.
  Also started changes to make copy/paste of hierarchy above paragraphs (e.g. lists & divs) work correctly.
  * Fix 2606414 TextContainerManager doesn't initially draw text if given a configuration
Build 125
  * Fix unreported crashes with displaying TextFlow containing floating graphics and backgroundColor in TextContainerManager and the TextFlowTextLineFactory
  * Fix unreported bug in estimated contentHeight when scrolling enabled and multiple columns.  Results weren't properly scaled when there were multiple columns.
  - One column case returns the same contentBounds - >1 will return a larger value scaled by ratio of the uncomposed content length amount and the content in length the last column
  * Minor perf. improvement in TCM - when in flowComposer state updateContainer would call compose and then updateAllControllers.  The first compose was redundant.
  - Side effect is that fewer events are generated
Build 124
  * Fix unreported bug in undo of delete, apply links, and apply tcy where undo doesn't restore the format of the second paragraph in the range correctly. 
  Added two mementos, one for deleteText, and one for operations that just want to save & restore a text range. DeleteTextOperation, ApplyLinkOperation, 
  and ApplyTCYOperation rewritten to use the mementos. 
  * Fix 2647227 TextContainerManager API to return total number of lines - numLines just returns composed lines.
  - added as tlf_internal function TextContainerManager.getActualNumLines
  * Another fix for undo of delete, to remove extra paragraph that appears on undo at the end of the TextFlow.
  * Fix 2486027 Version of SelectionManager.getCommon*Format methods that don't require an interaction manager.  (See new methods in ElementRange class)
  * Fix 2661645, 2655061, 2665047, all of them are the same bug that undo doesn't restore correctly to the previous state. Paste now is more careful about 
  how it works with respect to paragraph ends, so that undo/redo and cut/paste will work better. Many cases fixed, some still remain.
Build 122
  * Fix 2522343 [SDK-24814] RTE in TLF FlowTextOperation constructor debug assertion
  * Fix 2663346 Markup import fails when there is space before <listStyleType> in content = "counters(ordered,"String",<listStyleType>)"
  * Fix 2665403 "Delete" doesn't regenerate Marker number correctly when deleting listitems
  * Fix 2665820 Setting BackgroundColor causes an empty Shape to be added into TextLines
Build 121
  * Implemented "enter twice" to exit list editing mode, made list editing operations do undo/redo properly using mementos.
  * Add import/export of lists and listitems to HTMLImporter/HTMLExporter - <ol> maps to decimal; <ul> maps to bullet
  * Rework HTMLExporter to be a recursive descent 
  * Change private members of HTMLExporter/HTMLImporter to be public/protected/tlf_internal
  * Performance work in all importers/exporters to remove linear searches and replace with object lookups
  * Cleanup all exporters so that export to string and export to XML use the same global XML settings and have the same throw behaviors
  * Initial support for backspacing to move a paragraph higher in the model.  Canonical example is to backspace at the beginning of a list to move the first list item outside the list.
  The feature also allows moving a paragraph out of a div by backspacing at the beginning of the div.
  * Fix 2634350 Duplicate "find the atom" code should be refactored in NavigationUtils.as
  * Fix 2650129, "FlowElementMouseEventManager continues to dispatch events to TextFlow no longer in container". This happens when a container is 
  reusued across two TextFlows that have links. Fix is to stop links hittesting when the container is removed. Note: clients must call 
  flowComposer.removeAllController to force this to happen. Also did a performance improvement on update to make the FlowElementMouseEventManager 
  take the text range that is being updated from the ContainerController so it doesn't have to figure it out. Should help scrolling on flows with lots of links.
  * Fix unreported bug - factory composer would recycle lines that were passed back to the callback when they weren't visible.  Factory composer now never recycles lines that it has passed back to the callback.
Build 120
  * Fix 2652021, "Lines are not added to a container resized from a no-line state". ContainerController.invalidateContents now always invalidates at least one character, even if the container is empty. 
Build 119
  * Fix unreported bug in FlowElement.compareUserStyles - wasn't comparing a TextLayoutFormat used as a userStyle.  This would give incorrect results with linkNormalFormat, linActiveFormat, linkHoverFormat settings and listMarkerFormat properties.
  * Fix unreported bug in FlowGroupElement.replaceChildren - fixes possible exception when already parented elements were being added to the receiver 
  * Fix unreported bug in ListItemElement optimization to rememeber current list number.  -1 was used as don't know the number but now that's a valid number.
  * Fix unreported bug when recomposing and the "none" list type was in use.
  * CreateListOperation - complete rewrite using a memento based strategy to capture all the sub-operations for undo and redo.  There are still some bugs to work out.  Possibly use the new memento strategy for other operations - for now its internal to CreateListOperation.
Build 116
  * Fixing unreported selection highlight bug with floats. If the float comes as a URL, so it is loaded on a delay, and is selected in the initial redraw 
  before the float has been loaded, then although the float is included in the selected range it was not being highlighted. To fix this, I changed the 
  highlight algorithm to use the (x,y) composed float position and the element width and height from the InlineGraphicElement to figure out the rectangle 
  to highlight instead of looking directly at the DisplayObject and getting the bounds, as was done previously. This means that it will highlight correctly 
  even before it is loaded.
  * Fix unreported bug that cause floatrs to redraw incorrectly when a controller was removed and then added back into the IFlowComposer. It now clears the 
  float composition data when that happens. 
  * Fix 2651156, "preventDefault for EditHandler". EditHandler now sets preventDefault on the event after handling it. Also check isDefaultPrevented() before 
  handling it.
Build 115
  * Fix 2493174 Separate BaseCompose from StandardFlowComposer
  * Fix 2651926 listStyleTyle cjkEarthlyStem should be changed to cjkHeavenlyStem to match CSS3 names
  * Big generalization of TextFlowEdit.deleteRange() and paragraph merge logic.  Should fix deletion across div boundaries, deletion across list items, and generally any delete across non-sibling paragraphs
Build 114
  * Fix 2606243 [SDK-26244] LinkElement throws TypeError when mouse hovers over changed textflow
Build 113
  * Fix a number of different floats bugs. A float that is wider than the container or column, and is on a line by itself, will be composed into the container 
  instead of going overset. A float that is in scrollable container, should fit for height (was going overset as it would in a non-scrollable container if the 
  height didn't fit). 
  * Fix a hang in composition with floats.
  * Fix an assert on recycling a line in use by the BackgrounMgr. Now release lines from the BackgrounMgr before recycling.
  * HTML import for floats. align="left" on an <img> element is now interpreted as float = "left" and align="right" is interpreted as float right. All other 
  values ignored. Note that TextField implemented HTML float, which always go below, and TLF implemented CSS floats which go at the same level if possible. 
  Therefore it will not look the same. 
  * Added comment to documentation of ITextLayoutFormat properties marginTop, marginLeft, marginRight, and marginBottom to reflect the fact that at the moment
  these properties are merely placeholders and should not be used (and may be removed in future).
  * Fixed bug in ContainerController.mouseUpHandler. Now it checks for null event before dereferencing.
Build 109
   * Add more list functionality by subsetting html counter functionality.  New properties in listMarkerFormat
   - counterReset "none"|"ordered"|"ordered <integer>". Default is none
   - counterIncrement "none"|"ordered"|"ordered <integer>". Default is "ordered 1"
   - content "none"|"counter(ordered)"|"counter(ordered,ListStyleType)"|"counters(ordered)"|"counters(ordered,"suffix")"|"counters(ordered,"suffix",ListStyleType)". Default is "counter(ordered)"
   * Fix Fix 2642078, red box behind IME when editing on the debug build. Byproduct of some debug code, now commented out.
Build 108
   * Fix 2639982, "Assert changing a float to an inline". 
   * Added delayedOperation flag to IEditManager so clients can turn off the delayed execution of insertText.
   * Fix 2609350, "Cursoring up to a float anchor position moves the cursor to the float graphic". Cursor is now positioned next to the anchor point. If it is a block selection, we still highlight the float. 
Build 107
   * Fix 2636066 where an inline earlier in the line with a float following results in assertions and missing floats. 
   * Fix a bug where text goes overset because of padding settings, which forces text at the end to be invalid (its overset) which crashes when you nextLine to it.
   * Fix bug in incremental composition where the top padding was added in for elements that are composed from the middle, so the space is added in twice (once on original compose, again on incremental compose).
   * Fix 2636894 -- a number of bugs relating to use floats of in TextLineFactories.
   * Fix 2637162, Mouse cursor not updated on switch to read-only mode. Relates to forum discussion at http://forums.adobe.com/thread/652908?tstart=0.
   * Fix 2636122, "Text isn't aligned correctly if you change vertical alignment on text that contains a float". 
Build 106
   * Fix 2635111, "Floats with absolute lineHeight affect leading for the line containing them". Also fixed unreported bug with multiple containers and floats, where the float is hoisted and it is smaller than the text, so the float fits in the container but the text does not.
Build 105
   * fix issues with downcasting NativeMenu to ContextMenu
Build 104
   * Modify selection limits.  Previously block selections could not extend beyond TextFlow.textLength-1.  The cap on block selections is now TextFlow.textLength.  point selections are unchanged.
   * Disable undo in CreateListOperation in release builds.  Still in development and prevents crashes if you do try it out.
Build 103
   * Change how linkNormalFormat, linkHoverFormat and linkActiveFormat are stored in the model.  They are now converted to TextLayoutFormat by setStyle
   - fixes bugs in which setStyle will accept formats for these but not find error settings till much later.
   - simplify getStyle of these properties so they can assume its a ITextLayoutFormat
   * Change how listMarkerFormat is stored in model.  It is now converted to ListMarkerFormat by setStyle
   - simplify getStyle of listMarkerFormat so callers can assume its a IListMarkerFormat
   * fix bug in which importing <linkActiveFormat><TextLayoutFormat/></linkActiveFormat> would incorrectly throw an exception
   * fix list marker formatting bug - the line with the number didn't take the marker lines ascent into account
   * add static function TextLayoutFormat.createTextLayoutFormat to create a new TextLayoutFormat from an ITextLayoutFormat or a Object/Dictionary used as key-value pairs.
   * override methods in TextLayoutFormat in ListMarkerFormat
   * add static function ListMarkerFormat.createListMarkerFormat to create a new ListMarkerFormat from an IListMarkerFormat or a Object/Dictionary used as key-value pairs.
   * fixes to the List UI controls
Build 100
   * Initial version of CreateListOperation
   * Loosen rules so that ListElement can have children other than ListItemElement
   * Fix 2632358. Allow mid-line floats to be "hoisted" so they appear at the same level as the line. Floats whose anchor would otherwise go out of the line are not hoisted. 
   * redo() broadcasts a FLOW_OPERATION_COMPLETE with a pseudo event for redo, not the event about to be redone. Also skips the broadcast if we're in an IME session.
Build 99
   * Fix 2606420, "Vertical text does not scroll when adding empty paragraphs". ScrollToRange is now a little more aggressive about composing ahead.
   * Add customized ScrollEvent so client code can tell how much was scrolled. The new event inherits from TextLayoutEvent, so it should be compatible for client code currently listening for scroll events as TextLayoutEvents.
Build 98
   * Enter key now splits the current ListItem (and not the paragraph) if in a listitem.  shift-enter splits the paragraph
   * Write a new operation SplitElementOperation that given an element splits it
   * SplitParagraphOperation now subclasses SplitElementOperation
   * Fix 2629735, "Formatting not removed on undo after adding paragraph formatting to an empty paragraph". 
Build 97
   * create new property Category LIST and put listStyleType and listStylePosition in that category
Build 96
   * Roman numerals in lists now more closely match the CSS3 lists spec.  See comments for differences
   * Fix roman numerals - suffix was being drawn twice
   * Fix 2629730 Mouse Events Generate Two "selectionChange" events.
   * Fix 2629731, "Display does not update deleting empty paragraphs through container boundary". Problem was that the flowComposer was not damaging back far enough to pull the text into the previous container.
Build 93
   * Fix for various floats bugs, especially what happens when a float gets pushed to the next container or column. 
   * Fix for redraw bug, where consecutive incremental composes without intervening updates would result in incorrect update when it finally gets called at the end.
   * Implement support for the remaining listStyleType values.
   * Add a suffix property to ListMarkerFormat.  It can be "none" or "auto".  Auto gives the default html behavior of adding a ".".
Build 91
   * Removed whole-line optimization for selection.  The main effect of this is that the spaces at the end of each line are now generally included in the selection.  This breaks 20+ snapshots as well.
Build 89
   * Fix for RTE in ContainerController.validateLines() importing text in a two-container setup. Problem was that updating the first container was recycling lines that had been in the first container and were being pushed to the next. Fix is to make update never recycle lines that aren't still in the container.
   * Extended padding attributes to work on all block level elements, and on images (either inline or as floats). Padding may now be negative. Also, as part of this, 
   inlines are now attached to the TextLine in ContainerController.updateCompositionShapes, instead of this happening in composition inside the Player in calls to createTextLine.
   * Changed setFocus in SelectionManager so it is possible to set the focus without having an active selection. Previously, there was an ordering dependency between calls to 
   setFocus() and selectRange() -- calling setFocus first didn't work, and resulted in bugs that were hard to find. There is still the issue that setFocus will do nothing if the 
   container's stage variable is not already set up; nothing we can do about that. Best workaround when using Flex is to do callLater(setFocus());
Build 82
    * Add first version of floats. Floats can be start, end, left or right, and there is also the clear property, which can be both, none, left, or right.
Build 78
    * Version 0.1 of lists.  TLF markup supports ul, ol, li tags.  Nested lists supported.  Simple formatting and numbering.
Build 65
    * Fix 2476646 "FormField scrolling jumps at times it does not need to", scrolling up/down between different sized lines was scrolling unnecessarily in the horizontal direction.
    * Fix 2594609 Poor text delete performance when pasting large blocks of code, selecting all, and deleting
Build 62
    * Fix for 2583969. The problem is that lines are incorrectly removed from the display list when a scroll happens in updateCompositionShapes() as a result of an edit that came during a partial composition. 
    * Fix for 2545307, "ContainerController.mouseWheelHandler() should be checking if the default behavior is prevented before it acts on the event." Now most event handlers check isDefaultPrevented() before handling the event.
Build 61
    * Fix SDK-25999 Specifying tabStops on a RichText component does not look correct after integration of TLF 1.1
    * Added a delayedUpdate setting to the EditManager to allow clients to defer recomposition and redraw until the next enterFrame event. You can force immediate 
    recomposition and container update by calling updateAllControllers().
Build 58
    * Eliminated use of WeakRef in TextFlowLine to reduce per-line memory allocations.
Build 55
    * Fix 2568628 assigned SWFContext not used on Argo in all scenarios
    * Fix 2568438 [SDK-25693] TextLineRecycler change for Build543 increased size of Flex's Hello World app using FTE and TextLineRecycler by 250k
    * Fix 2571205 [SDK-25734] TLF: src attribute in <img> tag converts to lower case when using TextConverter.importToFlow with TEXT_FIELD_HTML_FORMAT format
    * Fix 2582917 Security sandbox violation in LinkElement.stageMouseMoveHandler
    * Fix 2565658 Security sandbox violation in ContainerController.getContainerController
    * Fix 2565639 Security sandbox violation in SelectionManager.checkForDisplayed()
Build 54
    * Allow removal of link either by passing the empty string, "", or by passing null. Previously the link element would be removed by passing the empty string,
    but null would be set as the link value if you passed null. However, the document stated that null should remove the link. Fixed the code to match the 
    documentation.
    * More optimizations. Recycling of line is more aggressive now. While composing, recycle lines in paragraphs that are not currently in view, and not going to be in view 
    on next update (i.e., when updating with the results of this compose). When updating the container in ContainerController.updateCompositionShapes, recycle lines in
    paragraphs that are removed from view. In both cases, when lines are recycled, the corresponding TextBlocks are also released to allow memory to be reclaimed. 
    Increases speed of composing and scrolling through long documents.
Build 51
    * Optimizations for long flows. Composition can start from the middle of a container, so it doesn't have to look at undamaged text at the start of the container. Also 
    composition now gathers up the visible lines, and hands them off to the ContainerController. This will help in later optimizations.
Build 38
    * Fix 2559210, content bounds generated incorrectly (too large) via the TextLineFactory with textIndent applied.
Build 3
    * Fix 2525017 - added range checking to IMEClient getTextBounds to avoid exceptions caused by invalid ranges.  Returns empty rectangle in bad range case.
Build 2
    * Fix 2508070 Underline/strikethru cause unnecessary TextLines and 2509326 Underline/strikethru apply alpha twice.
