diff options
Diffstat (limited to 'documentation/datamodel')
-rw-r--r-- | documentation/datamodel/chapter-datamodel.asciidoc | 20 | ||||
-rw-r--r-- | documentation/datamodel/datamodel-container.asciidoc | 834 | ||||
-rw-r--r-- | documentation/datamodel/datamodel-itembinding.asciidoc | 377 | ||||
-rw-r--r-- | documentation/datamodel/datamodel-items.asciidoc | 194 | ||||
-rw-r--r-- | documentation/datamodel/datamodel-overview.asciidoc | 75 | ||||
-rw-r--r-- | documentation/datamodel/datamodel-properties.asciidoc | 399 | ||||
-rw-r--r-- | documentation/datamodel/img/beanitem-nested-beans.png | bin | 0 -> 3142 bytes | |||
-rw-r--r-- | documentation/datamodel/img/beanitemcontainer-nested-beans.png | bin | 0 -> 18032 bytes | |||
-rw-r--r-- | documentation/datamodel/img/datamodel-interfaces-hi.png | bin | 0 -> 170869 bytes | |||
-rw-r--r-- | documentation/datamodel/img/datamodel-interfaces-lo.png | bin | 0 -> 41890 bytes | |||
-rw-r--r-- | documentation/datamodel/original-drawings/beanitem-doublebinding.svg | 1026 | ||||
-rw-r--r-- | documentation/datamodel/original-drawings/datamodel-interfaces.svg | 1321 |
12 files changed, 4246 insertions, 0 deletions
diff --git a/documentation/datamodel/chapter-datamodel.asciidoc b/documentation/datamodel/chapter-datamodel.asciidoc new file mode 100644 index 0000000000..c28e5b716b --- /dev/null +++ b/documentation/datamodel/chapter-datamodel.asciidoc @@ -0,0 +1,20 @@ +[[datamodel]] +== Binding Components to Data + +((("Vaadin Data Model", id="term.datamodel", range="startofrange"))) + + +This chapter describes the Vaadin Data Model and shows how you can use it to +bind components directly to data sources, such as database queries. + + +include::datamodel-overview.asciidoc[leveloffset=+2] + +include::datamodel-properties.asciidoc[leveloffset=+2] + +include::datamodel-items.asciidoc[leveloffset=+2] + +include::datamodel-itembinding.asciidoc[leveloffset=+2] + +include::datamodel-container.asciidoc[leveloffset=+2] +(((range="endofrange", startref="term.datamodel"))) diff --git a/documentation/datamodel/datamodel-container.asciidoc b/documentation/datamodel/datamodel-container.asciidoc new file mode 100644 index 0000000000..8f88e7c8bf --- /dev/null +++ b/documentation/datamodel/datamodel-container.asciidoc @@ -0,0 +1,834 @@ +--- +title: Collecting Items in Containers +order: 5 +layout: page +--- + +[[datamodel.container]] += Collecting Items in Containers + +((("[classname]#Container#", id="term.datamodel.container", range="startofrange"))) + + +The [classname]#Container# interface is the highest containment level of the +Vaadin data model, for containing items (rows) which in turn contain properties +(columns). Containers can therefore represent tabular data, which can be viewed +in a [classname]#Table# or some other selection component, as well as +hierarchical data. + +The items contained in a container are identified by an __item identifier__ or +__IID__, and the properties by a __property identifier__ or __PID__. + +[[datamodel.container.intro]] +== Basic Use of Containers + +The basic use of containers involves creating one, adding items to it, and +binding it as a container data source of a component. + +[[datamodel.container.intro.default]] +=== Default Containers and Delegation + +Before saying anything about creation of containers, it should be noted that all +components that can be bound to a container data source are by default bound to +a default container. For example, [classname]#Table# is bound to a +[classname]#IndexedContainer#, [classname]#Tree# to a +[classname]#HierarchicalContainer#, and so forth. + +All of the user interface components using containers also implement the +relevant container interfaces themselves, so that the access to the underlying +data source is delegated through the component. + + +---- +// Create a table with one column +Table table = new Table("My Table"); +table.addContainerProperty("col1", String.class, null); + +// Access items and properties through the component +table.addItem("row1"); // Create item by explicit ID +Item item1 = table.getItem("row1"); +Property property1 = item1.getItemProperty("col1"); +property1.setValue("some given value"); + +// Equivalent access through the container +Container container = table.getContainerDataSource(); +container.addItem("row2"); +Item item2 = container.getItem("row2"); +Property property2 = item2.getItemProperty("col1"); +property2.setValue("another given value"); +---- + + +[[datamodel.container.intro.creating]] +=== Creating and Binding a Container + +A container is created and bound to a component as follows: + + +---- +// Create a container of some type +Container container = new IndexedContainer(); + +// Initialize the container as required by the container type +container.addContainerProperty("name", String.class, "none"); +container.addContainerProperty("volume", Double.class, 0.0); + +... add items ... + +// Bind it to a component +Table table = new Table("My Table"); +table.setContainerDataSource(container); +---- + +Most components that can be bound to a container allow passing it also in the +constructor, in addition to using [methodname]#setContainerDataSource()#. +Creation of the container depends on its type. For some containers, such as the +[classname]#IndexedContainer#, you need to define the contained properties +(columns) as was done above, while some others determine them otherwise. The +definition of a property with [methodname]#addContainerProperty()# requires a +unique property ID, type, and a default value. You can also give +[parameter]#null#. + +Vaadin has a several built-in in-memory container implementations, such as +[classname]#IndexedContainer# and [classname]#BeanItemContainer#, which are easy +to use for setting up nonpersistent data storages. For persistent data, either +the built-in [classname]#SQLContainer# or the [classname]#JPAContainer# add-on +container can be used. + + +[[datamodel.container.intro.adding]] +=== Adding Items and Accessing Properties + +Items can be added to a container with the [methodname]#addItem()# method. The +parameterless version of the method automatically generates the item ID. + + +---- +// Create an item +Object itemId = container.addItem(); +---- + +Properties can be requested from container by first requesting an item with +[methodname]#getItem()# and then getting the properties from the item with +[methodname]#getItemProperty()#. + + +---- +// Get the item object +Item item = container.getItem(itemId); + +// Access a property in the item +Property<String> nameProperty = + item.getItemProperty("name"); + +// Do something with the property +nameProperty.setValue("box"); +---- + +You can also get a property directly by the item and property ids with +[methodname]#getContainerProperty()#. + + +---- +container.getContainerProperty(itemId, "volume").setValue(5.0); +---- + + +[[datamodel.container.intro.givenid]] +=== Adding Items by Given ID + +Some containers, such as [classname]#IndexedContainer# and +[classname]#HierarchicalContainer#, allow adding items by a given ID, which can +be any [classname]#Object#. + + +---- +Item item = container.addItem("agivenid"); +item.getItemProperty("name").setValue("barrel"); +Item.getItemProperty("volume").setValue(119.2); +---- + +Notice that the actual item __is not__ given as a parameter to the method, only +its ID, as the interface assumes that the container itself creates all the items +it contains. Some container implementations can provide methods to add +externally created items, and they can even assume that the item ID object is +also the item itself. Lazy containers might not create the item immediately, but +lazily when it is accessed by its ID. + + + +[[datamodel.container.inner]] +== Container Subinterfaces + +The [classname]#Container# interface contains inner interfaces that container +implementations can implement to fulfill different features required by +components that present container data. + +[interfacename]#Container.Filterable#:: Filterable containers allow filtering the contained items by filters, as +described in <<datamodel.container.filtered>>. + +[interfacename]#Container.Hierarchical#:: Hierarchical containers allow representing hierarchical relationships between +items and are required by the [classname]#Tree# and [classname]#TreeTable# +components. The [classname]#HierarchicalContainer# is a built-in in-memory +container for hierarchical data, and is used as the default container for the +tree components. The [classname]#FilesystemContainer# provides access to +browsing the content of a file system. Also [classname]#JPAContainer# is +hierarchical, as described in +<<dummy/../../../framework/jpacontainer/jpacontainer-usage#jpacontainer.usage.hierarchical,"Hierarchical +Container">>. + +[interfacename]#Container.Indexed#:: An indexed container allows accessing items by an index number, not just their +item ID. This feature is required by some components, especially +[classname]#Table#, which needs to provide lazy access to large containers. The +[classname]#IndexedContainer# is a basic in-memory implementation, as described +in <<datamodel.container.indexedcontainer>>. + +[interfacename]#Container.Ordered#:: An ordered container allows traversing the items in successive order in either +direction. Most built-in containers are ordered. + +[interfacename]#Container.SimpleFilterable#:: This interface enables filtering a container by string matching with +[methodname]#addContainerFilter()#. The filtering is done by either searching +the given string anywhere in a property value, or as its prefix. + +[interfacename]#Container.Sortable#:: A sortable container is required by some components that allow sorting the +content, such as [classname]#Table#, where the user can click a column header to +sort the table by the column. Some other components, such as +[classname]#Calendar#, may require that the content is sorted to be able to +display it properly. Depending on the implementation, sorting can be done only +when the [methodname]#sort()# method is called, or the container is +automatically kept in order according to the last call of the method. + + + +See the API documentation for a detailed description of the interfaces. + + +[[datamodel.container.indexedcontainer]] +== [classname]#IndexedContainer# + +The [classname]#IndexedContainer# is an in-memory container that implements the +[interfacename]#Indexed# interface to allow referencing the items by an index. +[classname]#IndexedContainer# is used as the default container in most selection +components in Vaadin. + +The properties need to be defined with [methodname]#addContainerProperty()#, +which takes the property ID, type, and a default value. This must be done before +any items are added to the container. + + +---- +// Create the container +IndexedContainer container = new IndexedContainer(); + +// Define the properties (columns) +container.addContainerProperty("name", String.class, "noname"); +container.addContainerProperty("volume", Double.class, -1.0d); + +// Add some items +Object content[][] = { {"jar", 2.0}, {"bottle", 0.75}, + {"can", 1.5}}; +for (Object[] row: content) { + Item newItem = container.getItem(container.addItem()); + newItem.getItemProperty("name").setValue(row[0]); + newItem.getItemProperty("volume").setValue(row[1]); +} +---- + +New items are added with [methodname]#addItem()#, which returns the item ID of +the new item, or by giving the item ID as a parameter as was described earlier. +Note that the [classname]#Table# component, which has +[classname]#IndexedContainer# as its default container, has a conveniency +[methodname]#addItem()# method that allows adding items as object vectors +containing the property values. + +The container implements the [interfacename]#Container.Indexed# feature to allow +accessing the item IDs by their index number, with [methodname]#getIdByIndex()#, +etc. The feature is required mainly for internal purposes of some components, +such as [classname]#Table#, which uses it to enable lazy transmission of table +data to the client-side. + + +[[datamodel.container.beancontainer]] +== [classname]#BeanContainer# + +The [classname]#BeanContainer# is an in-memory container for JavaBean objects. +Each contained bean is wrapped inside a [classname]#BeanItem# wrapper. The item +properties are determined automatically by inspecting the getter and setter +methods of the class. This requires that the bean class has public visibility, +local classes for example are not allowed. Only beans of the same type can be +added to the container. + +The generic has two parameters: a bean type and an item identifier type. The +item identifiers can be obtained by defining a custom resolver, using a specific +item property for the IDs, or by giving item IDs explicitly. As such, it is more +general than the [classname]#BeanItemContainer#, which uses the bean object +itself as the item identifier, making the use usually simpler. Managing the item +IDs makes [classname]#BeanContainer# more complex to use, but it is necessary in +some cases where the [methodname]#equals()# or [methodname]#hashCode()# methods +have been reimplemented in the bean. + + +---- +// Here is a JavaBean +public class Bean implements Serializable { + String name; + double energy; // Energy content in kJ/100g + + public Bean(String name, double energy) { + this.name = name; + this.energy = energy; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getEnergy() { + return energy; + } + + public void setEnergy(double energy) { + this.energy = energy; + } +} + +void basic(VerticalLayout layout) { + // Create a container for such beans with + // strings as item IDs. + BeanContainer<String, Bean> beans = + new BeanContainer<String, Bean>(Bean.class); + + // Use the name property as the item ID of the bean + beans.setBeanIdProperty("name"); + + // Add some beans to it + beans.addBean(new Bean("Mung bean", 1452.0)); + beans.addBean(new Bean("Chickpea", 686.0)); + beans.addBean(new Bean("Lentil", 1477.0)); + beans.addBean(new Bean("Common bean", 129.0)); + beans.addBean(new Bean("Soybean", 1866.0)); + + // Bind a table to it + Table table = new Table("Beans of All Sorts", beans); + layout.addComponent(table); +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beancontainer.basic[on-line example, window="_blank"]. + +To use explicit item IDs, use the methods [methodname]#addItem(Object, Object)#, +[methodname]#addItemAfter(Object, Object, Object)#, and +[methodname]#addItemAt(int, Object, Object)#. + +It is not possible to add additional properties to the container, except +properties in a nested bean. + +[[datamodel.container.beancontainer.nestedproperties]] +=== Nested Properties + +((("nested bean properties", id="term.datamodel.container.beancontainer.nestedproperties", range="startofrange"))) + + +If you have a nested bean with an 1:1 relationship inside a bean type contained +in a [classname]#BeanContainer# or [classname]#BeanItemContainer#, you can add +its properties to the container by specifying them with +[methodname]#addNestedContainerProperty()#. The feature is defined at the level +of [classname]#AbstractBeanContainer#. +((("[methodname]#addNestedContainerProperty()#"))) + +As with the bean in a bean container, also a nested bean must have public +visibility or otherwise an access exception is thrown. An intermediate reference +from a bean in the bean container to a nested bean may have a null value. + +For example, let us assume that we have the following two beans with the first +one nested inside the second one. + + +---- +/** Bean to be nested */ +public class EqCoord implements Serializable { + double rightAscension; /* In angle hours */ + double declination; /* In degrees */ + + ... setters and getters for the properties ... +} + +/** Bean referencing a nested bean */ +public class Star implements Serializable { + String name; + EqCoord equatorial; /* Nested bean */ + + ... setters and getters for the properties ... +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.nestedbean[on-line example, window="_blank"]. + +After creating the container, you can declare the nested properties by +specifying their property identifiers with the +[methodname]#addNestedContainerProperty()# in dot notation. + + +---- +// Create a container for beans +BeanItemContainer<Star> stars = + new BeanItemContainer<Star>(Star.class); + +// Declare the nested properties to be used in the container +stars.addNestedContainerProperty("equatorial.rightAscension"); +stars.addNestedContainerProperty("equatorial.declination"); + +// Add some items +stars.addBean(new Star("Sirius", new EqCoord(6.75, 16.71611))); +stars.addBean(new Star("Polaris", new EqCoord(2.52, 89.26417))); + +// Here the nested bean reference is null +stars.addBean(new Star("Vega", null)); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.nestedbean[on-line example, window="_blank"]. + +If you bind such a container to a [classname]#Table#, you probably also need to +set the column headers. Notice that the entire nested bean itself is still a +property in the container and would be displayed in its own column. The +[methodname]#toString()# method is used for obtaining the displayed value, which +is by default an object reference. You normally do not want this, so you can +hide the column with [methodname]#setVisibleColumns()#. +((("[methodname]#setVisibleColumns()#"))) + + +---- +// Put them in a table +Table table = new Table("Stars", stars); +table.setColumnHeader("equatorial.rightAscension", "RA"); +table.setColumnHeader("equatorial.declination", "Decl"); +table.setPageLength(table.size()); + +// Have to set explicitly to hide the "equatorial" property +table.setVisibleColumns("name", + "equatorial.rightAscension", "equatorial.declination"); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.nestedbean[on-line example, window="_blank"]. + +The resulting table is shown in +<<figure.datamodel.container.beancontainer.nestedproperties>>. + +[[figure.datamodel.container.beancontainer.nestedproperties]] +.[classname]#Table# Bound to a [classname]#BeanContainer# with Nested Properties +image::img/beanitemcontainer-nested-beans.png[] + +The bean binding in [classname]#AbstractBeanContainer# normally uses the +[classname]#MethodProperty# implementation of the [classname]#Property# +interface to access the bean properties using the setter and getter methods. For +nested properties, the [classname]#NestedMethodProperty# implementation is used. +((("[classname]#MethodProperty#"))) +((("[classname]#NestedMethodProperty#"))) + +(((range="endofrange", startref="term.datamodel.container.beancontainer.nestedproperties"))) + +ifdef::web[] +[[datamodel.container.beancontainer.idresolver]] +=== Defining a Bean ID Resolver + +If a bean ID resolver is set using [methodname]#setBeanIdResolver()# or +[methodname]#setBeanIdProperty()#, the methods [methodname]#addBean()#, +[methodname]#addBeanAfter()#, [methodname]#addBeanAt()# and +[methodname]#addAll()# can be used to add items to the container. If one of +these methods is called, the resolver is used to generate an identifier for the +item (must not return [parameter]#null#). + +Note that explicit item identifiers can also be used when a resolver has been +set by calling the [methodname]#addItem*()# methods - the resolver is only used +when adding beans using the [methodname]#addBean*()# or +[methodname]#addAll(Collection)# methods. + +endif::web[] + + +[[datamodel.container.beanitemcontainer]] +== [classname]#BeanItemContainer# + +[classname]#BeanItemContainer# is a container for JavaBean objects where each +bean is wrapped inside a [classname]#BeanItem# wrapper. The item properties are +determined automatically by inspecting the getter and setter methods of the +class. This requires that the bean class has public visibility, local classes +for example are not allowed. Only beans of the same type can be added to the +container. + +[classname]#BeanItemContainer# is a specialized version of the +[classname]#BeanContainer# described in <<datamodel.container.beancontainer>>. +It uses the bean itself as the item identifier, which makes it a bit easier to +use than [classname]#BeanContainer# in many cases. The latter is, however, +needed if the bean has reimplemented the [methodname]#equals()# or +[methodname]#hashCode()# methods. + +Let us revisit the example given in <<datamodel.container.beancontainer>> using +the [classname]#BeanItemContainer#. + + +---- +// Create a container for the beans +BeanItemContainer<Bean> beans = + new BeanItemContainer<Bean>(Bean.class); + +// Add some beans to it +beans.addBean(new Bean("Mung bean", 1452.0)); +beans.addBean(new Bean("Chickpea", 686.0)); +beans.addBean(new Bean("Lentil", 1477.0)); +beans.addBean(new Bean("Common bean", 129.0)); +beans.addBean(new Bean("Soybean", 1866.0)); + +// Bind a table to it +Table table = new Table("Beans of All Sorts", beans); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.beanitemcontainer.basic[on-line example, window="_blank"]. + +It is not possible to add additional properties to a +[classname]#BeanItemContainer#, except properties in a nested bean, as described +in <<datamodel.container.beancontainer>>. ((("nested bean +properties"))) + + +ifdef::web[] +[[datamodel.container.iterating]] +== Iterating Over a Container + +As the items in a [classname]#Container# are not necessarily indexed, iterating +over the items has to be done using an [classname]#Iterator#. The +[methodname]#getItemIds()# method of [classname]#Container# returns a +[classname]#Collection# of item identifiers over which you can iterate. The +following example demonstrates a typical case where you iterate over the values +of check boxes in a column of a [classname]#Table# component. The context of the +example is the example used in +<<dummy/../../../framework/components/components-table#components.table,"Table">>. + + +---- +// Collect the results of the iteration into this string. +String items = ""; + +// Iterate over the item identifiers of the table. +for (Iterator i = table.getItemIds().iterator(); i.hasNext();) { + // Get the current item identifier, which is an integer. + int iid = (Integer) i.next(); + + // Now get the actual item from the table. + Item item = table.getItem(iid); + + // And now we can get to the actual checkbox object. + Button button = (Button) + (item.getItemProperty("ismember").getValue()); + + // If the checkbox is selected. + if ((Boolean)button.getValue() == true) { + // Do something with the selected item; collect the + // first names in a string. + items += item.getItemProperty("First Name") + .getValue() + " "; + } +} + +// Do something with the results; display the selected items. +layout.addComponent (new Label("Selected items: " + items)); +---- + +Notice that the [methodname]#getItemIds()# returns an __unmodifiable +collection__, so the [classname]#Container# may not be modified during +iteration. You can not, for example, remove items from the +[classname]#Container# during iteration. The modification includes modification +in another thread. If the [classname]#Container# is modified during iteration, a +[classname]#ConcurrentModificationException# is thrown and the iterator may be +left in an undefined state. + +endif::web[] + +[[datamodel.container.gpc]] +== [classname]#GeneratedPropertyContainer# + +[classname]#GeneratedPropertyContainer# is a container wrapper that allows +defining generated values for properties (columns). The generated properties can +shadow properties with the same IDs in the wrapped container. Removing a +property from the wrapper hides it. + +The container is especially useful with [classname]#Grid#, which does not +support generated columns or hiding columns like [classname]#Table# does. + +[[datamodel.container.gpc.wrapping]] +=== Wrapping a Container + +A container to be wrapped must be a [interfacename]#Container.Indexed#. It can +optionally also implement [interfacename]#Container.Sortable# or +[interfacename]#Container.Filterable# to enable sorting and filtering the +container, respectively. + +For example, let us consider the following container with some regular columns: + + +---- +IndexedContainer container = new IndexedContainer(); +container.addContainerProperty("firstname", String.class, null); +container.addContainerProperty("lastname", String.class, null); +container.addContainerProperty("born", Integer.class, null); +container.addContainerProperty("died", Integer.class, null); + +// Wrap it +GeneratedPropertyContainer gpcontainer = + new GeneratedPropertyContainer(container); +---- + + +[[datamodel.container.gpc.properties]] +=== Generated Properties + +Now, you can add generated properties in the container with +[methodname]#addGeneratedProperty()# by specifying a property ID and a +[interfacename]#PropertyValueGenerator#. The method takes the ID of the +generated property as first parameter; you can use a same ID as in the wrapped +container to shadow its properties. + +You need to implement [methodname]#getType()#, which must return the class +object of the value type of the property, and [methodname]#getValue()#, which +returns the property value for the given item. The item ID and the property ID +of the generated property are also given in case they are needed. You can access +other properties of the item to compute the property value. + + +---- +gpcontainer.addGeneratedProperty("lived", + new PropertyValueGenerator<Integer>() { + @Override + public Integer getValue(Item item, Object itemId, + Object propertyId) { + int born = (Integer) + item.getItemProperty("born").getValue(); + int died = (Integer) + item.getItemProperty("died").getValue(); + return Integer.valueOf(died - born); + } + + @Override + public Class<Integer> getType() { + return Integer.class; + } +}); +---- + +You can access other items in the container, also their generated properties, +although you should beware of accidental recursion. + + +[[datamodel.container.gpc.using]] +=== Using [classname]#GeneratedPropertyContainer# + +Finally, you need to bind the [classname]#GeneratedPropertyContainer# to the +component instead of the wrapped container. + + +---- +Grid grid = new Grid(gpcontainer); +---- + +When using [classname]#GeneratedPropertyContainer# in [classname]#Grid#, notice +that generated columns are read-only, so you can not add grid rows with +[methodname]#addRow()#. In editable mode, editor fields are not generated for +generated columns. + + +[[datamodel.container.gpc.sorting]] +=== Sorting + +Even though the [classname]#GeneratedPropertyContainer# implements +[interfacename]#Container.Sortable#, the wrapped container must also support it +or otherwise sorting is disabled. Also, the generated properties are not +normally sortable, but require special handling to enable sorting. + + + +[[datamodel.container.filtered]] +== [classname]#Filterable# Containers + +((("Container", "Filterable", id="term.datamodel.container.filtered.filterable", range="startofrange"))) + + +((("[classname]#Filter# (in [classname]#Container#)", id="term.datamodel.container.filtered.filters", range="startofrange"))) + + +Containers that implement the [classname]#Container.Filterable# interface can be +filtered. For example, the built-in [classname]#IndexedContainer# and the bean +item containers implement it. Filtering is typically used for filtering the +content of a [classname]#Table#. +((("[classname]#IndexedContainer#"))) +((("[classname]#Table#"))) + +Filters implement the [classname]#Filter# interface and you add them to a +filterable container with the [methodname]#addContainerFilter()# method. +Container items that pass the filter condition are kept and shown in the +filterable component. +((("[methodname]#addContainerFilter()#"))) + + +---- +Filter filter = new SimpleStringFilter("name", + "Douglas", true, false); +table.addContainerFilter(filter); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.basic[on-line example, window="_blank"]. + +If multiple filters are added to a container, they are evaluated using the +logical AND operator so that only items that are passed by all the filters are +kept. + +[[datamodel.container.filtered.composite]] +=== Atomic and Composite Filters + +Filters can be classified as __atomic__ and __composite__. Atomic filters, such +as [classname]#SimpleStringFilter#, define a single condition, usually for a +specific container property. Composite filters make filtering decisions based on +the result of one or more other filters. The built-in composite filters +implement the logical operators AND, OR, or NOT. + +For example, the following composite filter would filter out items where the +[literal]#++name++# property contains the name "Douglas" somewhere __or__ where +the [literal]#++age++# property has value less than 42. The properties must have +[classname]#String# and [classname]#Integer# types, respectively. + + +---- + +filter = new Or(new SimpleStringFilter("name", + "Douglas", true, false), + new Compare.Less("age", 42)); +---- + + +[[datamodel.container.filtered.builtin]] +=== Built-In Filter Types + +The built-in filter types are the following: + +[classname]#SimpleStringFilter#:: ((("[classname]#SimpleStringFilter#"))) ++ +Passes items where the specified property, that must be of [classname]#String# +type, contains the given [parameter]#filterString# as a substring. If +[parameter]#ignoreCase# is [parameter]#true#, the search is case insensitive. If +the [parameter]#onlyMatchPrefix# is [parameter]#true#, the substring may only be +in the beginning of the string, otherwise it may be elsewhere as well. + +[classname]#IsNull#:: ((("[classname]#IsNull# (filter)"))) ++ +Passes items where the specified property has null value. For in-memory +filtering, a simple [literal]#++==++# check is performed. For other containers, +the comparison implementation is container dependent, but should correspond to +the in-memory null check. + +[classname]#Equal#,[classname]#Greater#, + [classname]#Less#, + [classname]#GreaterOrEqual#, and[classname]#LessOrEqual#:: ((("[classname]#Equal# (filter)"))) +((("[classname]#Greater# (filter)"))) +((("[classname]#Less# (filter)"))) +((("[classname]#GreaterOrEqual# (filter)"))) +((("[classname]#LessOrEqual# (filter)"))) ++ +The comparison filter implementations compare the specified property value to +the given constant and pass items for which the comparison result is true. The +comparison operators are included in the abstract [classname]#Compare# class. + ++ +For the [classname]#Equal# filter, the [methodname]#equals()# method for the +property is used in built-in in-memory containers. In other types of containers, +the comparison is container dependent and may use, for example, database +comparison operations. + ++ +For the other filters, the property value type must implement the +[classname]#Comparable# interface to work with the built-in in-memory +containers. Again for the other types of containers, the comparison is container +dependent. + +[classname]#And#and[classname]#Or#:: ((("[classname]#And# (filter)"))) +((("[classname]#Or# (filter)"))) ++ +These logical operator filters are composite filters that combine multiple other +filters. + +[classname]#Not#:: ((("[classname]#Not# (filter)"))) ++ +The logical unary operator filter negates which items are passed by the filter +given as the parameter. + + + + +[[datamodel.container.filtered.custom]] +=== Implementing Custom Filters + +A custom filter needs to implement the [classname]#Container.Filter# interface. + +A filter can use a single or multiple properties for the filtering logic. The +properties used by the filter must be returned with the +[methodname]#appliesToProperty()# method. If the filter applies to a +user-defined property or properties, it is customary to give the properties as +the first argument for the constructor of the filter. + + +---- +class MyCustomFilter implements Container.Filter { + protected String propertyId; + protected String regex; + + public MyCustomFilter(String propertyId, String regex) { + this.propertyId = propertyId; + this.regex = regex; + } + + /** Tells if this filter works on the given property. */ + @Override + public boolean appliesToProperty(Object propertyId) { + return propertyId != null && + propertyId.equals(this.propertyId); + } +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.custom[on-line example, window="_blank"]. + +The actual filtering logic is done in the [methodname]#passesFilter()# method, +which simply returns [literal]#++true++# if the item should pass the filter and +[literal]#++false++# if it should be filtered out. + + +---- + /** Apply the filter on an item to check if it passes. */ + @Override + public boolean passesFilter(Object itemId, Item item) + throws UnsupportedOperationException { + // Acquire the relevant property from the item object + Property p = item.getItemProperty(propertyId); + + // Should always check validity + if (p == null || !p.getType().equals(String.class)) + return false; + String value = (String) p.getValue(); + + // The actual filter logic + return value.matches(regex); + } +} +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.custom[on-line example, window="_blank"]. + +You can use such a custom filter just like any other: + + +---- +c.addContainerFilter( + new MyCustomFilter("Name", (String) tf.getValue())); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.container.filter.custom[on-line example, window="_blank"]. + + +(((range="endofrange", startref="term.datamodel.container.filtered.filters"))) +(((range="endofrange", startref="term.datamodel.container.filtered.filterable"))) + +(((range="endofrange", startref="term.datamodel.container"))) + + diff --git a/documentation/datamodel/datamodel-itembinding.asciidoc b/documentation/datamodel/datamodel-itembinding.asciidoc new file mode 100644 index 0000000000..fd21b72267 --- /dev/null +++ b/documentation/datamodel/datamodel-itembinding.asciidoc @@ -0,0 +1,377 @@ +--- +title: Creating Forms by Binding Fields to Items +order: 4 +layout: page +--- + +[[datamodel.itembinding]] += Creating Forms by Binding Fields to Items + +Most applications in existence have forms of some sort. Forms contain fields, +which you want to bind to a data source, an item in the Vaadin data model. +[classname]#FieldGroup# provides an easy way to bind fields to the properties of +an item. You can use it by first creating a layout with some fields, and then +call it to bind the fields to the data source. You can also let the +[classname]#FieldGroup# create the fields using a field factory. It can also +handle commits. Notice that [classname]#FieldGroup# is not a user interface +component, so you can not add it to a layout. + +[[datamodel.itembinding.simple]] +== Simple Binding + +Let us start with a data model that has an item with a couple of properties. The +item could be any item type, as described earlier. + + +---- +// Have an item +PropertysetItem item = new PropertysetItem(); +item.addItemProperty("name", new ObjectProperty<String>("Zaphod")); +item.addItemProperty("age", new ObjectProperty<Integer>(42)); +---- + +Next, you would design a form for editing the data. The [classname]#FormLayout# +( +<<dummy/../../../framework/layout/layout-formlayout#layout.formlayout,"FormLayout">> +is ideal for forms, but you could use any other layout as well. + + +---- +// Have some layout and create the fields +FormLayout form = new FormLayout(); + +TextField nameField = new TextField("Name"); +form.addComponent(nameField); + +TextField ageField = new TextField("Age"); +form.addComponent(ageField); +---- + +Then, we can bind the fields to the data as follows: + + +---- +// Now create the binder and bind the fields +FieldGroup binder = new FieldGroup(item); +binder.bind(nameField, "name"); +binder.bind(ageField, "age"); +---- + +The above way of binding is not different from simply calling +[methodname]#setPropertyDataSource()# for the fields. It does, however, register +the fields in the field group, which for example enables buffering or validation +of the fields using the field group, as described in +<<datamodel.itembinding.buffering>>. + +Next, we consider more practical uses for a [classname]#FieldGroup#. + + +[[datamodel.itembinding.fieldfactory]] +== Using a [interfacename]#FieldFactory# to Build and Bind Fields + +Using the [methodname]#buildAndBind()# methods, [classname]#FieldGroup# can +create fields for you using a [interfacename]#FieldGroupFieldFactory#, but you +still have to add them to the correct position in your layout. + + +---- +// Have some layout +FormLayout form = new FormLayout(); + +// Now create a binder that can also create the fields +// using the default field factory +FieldGroup binder = new FieldGroup(item); +form.addComponent(binder.buildAndBind("Name", "name")); +form.addComponent(binder.buildAndBind("Age", "age")); +---- + + +[[datamodel.itembinding.formclass]] +== Binding Member Fields + +The [methodname]#bindMemberFields()# method in [classname]#FieldGroup# uses +reflection to bind the properties of an item to field components that are member +variables of a class. Hence, if you implement a form as a class with the fields +stored as member variables, you can use this method to bind them super-easy. + +The item properties are mapped to the members by the property ID and the name of +the member variable. If you want to map a property with a different ID to a +member, you can use the [literal]#++@PropertyId++# annotation for the member, +with the property ID as the parameter. + +For example: + + +---- +// Have an item +PropertysetItem item = new PropertysetItem(); +item.addItemProperty("name", new ObjectProperty<String>("Zaphod")); +item.addItemProperty("age", new ObjectProperty<Integer>(42)); + +// Define a form as a class that extends some layout +class MyForm extends FormLayout { + // Member that will bind to the "name" property + TextField name = new TextField("Name"); + + // Member that will bind to the "age" property + @PropertyId("age") + TextField ageField = new TextField("Age"); + + public MyForm() { + // Customize the layout a bit + setSpacing(true); + + // Add the fields + addComponent(name); + addComponent(ageField); + } +} + +// Create one +MyForm form = new MyForm(); + +// Now create a binder that can also creates the fields +// using the default field factory +FieldGroup binder = new FieldGroup(item); +binder.bindMemberFields(form); + +// And the form can be used in an higher-level layout +layout.addComponent(form); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.itembinding.formclass.extended[on-line example, window="_blank"]. + +[[datamodel.itembinding.formclass.customcomponent]] +=== Encapsulating in [classname]#CustomComponent# + +Using a [classname]#CustomComponent# can be better for hiding the implementation +details than extending a layout. Also, the use of the [classname]#FieldGroup# +can be encapsulated in the form class. + +Consider the following as an alternative for the form implementation presented +earlier: + + +---- +// A form component that allows editing an item +class MyForm extends CustomComponent { + // Member that will bind to the "name" property + TextField name = new TextField("Name"); + + // Member that will bind to the "age" property + @PropertyId("age") + TextField ageField = new TextField("Age"); + + public MyForm(Item item) { + FormLayout layout = new FormLayout(); + layout.addComponent(name); + layout.addComponent(ageField); + + // Now use a binder to bind the members + FieldGroup binder = new FieldGroup(item); + binder.bindMemberFields(this); + + setCompositionRoot(layout); + } +} + +// And the form can be used as a component +layout.addComponent(new MyForm(item)); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.itembinding.formclass.customcomponent[on-line example, window="_blank"]. + + + +[[datamodel.itembinding.buffering]] +== Buffering Forms + +Just like for individual fields, as described in +<<dummy/../../../framework/components/components-fields#components.fields.buffering,"Field +Buffering">>, a [classname]#FieldGroup# can handle buffering the form content so +that it is written to the item data source only when [methodname]#commit()# is +called for the group. It runs validation for all fields in the group and writes +their values to the item data source only if all fields pass the validation. +Edits can be discarded, so that the field values are reloaded from the data +source, by calling [methodname]#discard()#. Buffering is enabled by default, but +can be disabled by calling [methodname]#setBuffered(false)# for the +[classname]#FieldGroup#. + + +---- +// Have an item of some sort +final PropertysetItem item = new PropertysetItem(); +item.addItemProperty("name", new ObjectProperty<String>("Q")); +item.addItemProperty("age", new ObjectProperty<Integer>(42)); + +// Have some layout and create the fields +Panel form = new Panel("Buffered Form"); +form.setContent(new FormLayout()); + +// Build and bind the fields using the default field factory +final FieldGroup binder = new FieldGroup(item); +form.addComponent(binder.buildAndBind("Name", "name")); +form.addComponent(binder.buildAndBind("Age", "age")); + +// Enable buffering (actually enabled by default) +binder.setBuffered(true); + +// A button to commit the buffer +form.addComponent(new Button("OK", new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + try { + binder.commit(); + Notification.show("Thanks!"); + } catch (CommitException e) { + Notification.show("You fail!"); + } + } +})); + +// A button to discard the buffer +form.addComponent(new Button("Discard", new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + binder.discard(); + Notification.show("Discarded!"); + } +})); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.itembinding.formclass.customcomponent[on-line example, window="_blank"]. + + +[[datamodel.itembinding.beans]] +== Binding Fields to a Bean + +The [classname]#BeanFieldGroup# makes it easier to bind fields to a bean. It +also handles binding to nested beans properties. The build a field bound to a +nested bean property, identify the property with dot notation. For example, if a +[classname]#Person# bean has a [literal]#++address++# property with an +[classname]#Address# type, which in turn has a [literal]#++street++# property, +you could build a field bound to the property with +[methodname]#buildAndBind("Street", "address.street")#. + +The input to fields bound to a bean can be validated using the Java Bean +Validation API, as described in <<datamodel.itembinding.beanvalidation>>. The +[classname]#BeanFieldGroup# automatically adds a [classname]#BeanValidator# to +every field if a bean validation implementation is included in the classpath. + + +[[datamodel.itembinding.beanvalidation]] +== Bean Validation + +Vaadin allows using the Java Bean Validation API 1.0 (JSR-303) for validating +input from fields bound to bean properties before the values are committed to +the bean. The validation is done based on annotations on the bean properties, +which are used for creating the actual validators automatically. See +<<dummy/../../../framework/components/components-fields#components.fields.validation,"Field +Validation">> for general information about validation. + +Using bean validation requires an implementation of the Bean Validation API, +such as Hibernate Validator ( [filename]#hibernate-validator-4.2.0.Final.jar# or +later) or Apache Bean Validation. The implementation JAR must be included in the +project classpath when using the bean validation, or otherwise an internal error +is thrown. + +Bean validation is especially useful when persisting entity beans with the +Vaadin JPAContainer, described in +<<dummy/../../../framework/jpacontainer/jpacontainer-overview.asciidoc#jpacontainer.overview,"Vaadin +JPAContainer">>. + +[[datamodel.itembinding.beanvalidation.annotations]] +=== Annotations + +The validation constraints are defined as annotations. For example, consider the +following bean: + + +---- +// Here is a bean +public class Person implements Serializable { + @NotNull + @javax.validation.constraints.Size(min=2, max=10) + String name; + + @Min(1) + @Max(130) + int age; + + // ... setters and getters ... +} +---- + +For a complete list of allowed constraints for different data types, please see +the link:http://docs.oracle.com/javaee/6/tutorial/doc/gircz.html[Bean Validation +API documentation]. + + +[[datamodel.itembinding.beanvalidation.validating]] +=== Validating the Beans + +Validating a bean is done with a [classname]#BeanValidator#, which you +initialize with the name of the bean property it should validate and add it the +the editor field. + +In the following example, we validate a single unbuffered field: + + +---- +Person bean = new Person("Mung bean", 100); +BeanItem<Person> item = new BeanItem<Person> (bean); + +// Create an editor bound to a bean field +TextField firstName = new TextField("First Name", + item.getItemProperty("name")); + +// Add the bean validator +firstName.addValidator(new BeanValidator(Person.class, "name")); + +firstName.setImmediate(true); +layout.addComponent(firstName); +---- + +In this case, the validation is done immediately after focus leaves the field. +You could do the same for the other field as well. + +Bean validators are automatically created when using a +[classname]#BeanFieldGroup#. + + +---- +// Have a bean +Person bean = new Person("Mung bean", 100); + +// Form for editing the bean +final BeanFieldGroup<Person> binder = + new BeanFieldGroup<Person>(Person.class); +binder.setItemDataSource(bean); +layout.addComponent(binder.buildAndBind("Name", "name")); +layout.addComponent(binder.buildAndBind("Age", "age")); + +// Buffer the form content +binder.setBuffered(true); +layout.addComponent(new Button("OK", new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + try { + binder.commit(); + } catch (CommitException e) { + } + } +})); +---- + + +[[datamodel.itembinding.beanvalidation.locale]] +=== Locale Setting for Bean Validation + +The validation error messages are defined in the bean validation implementation, +in a [filename]#ValidationMessages.properties# file. The message is shown in the +language specified with the locale setting for the form. The default language is +English, but for example Hibernate Validator contains translations of the +messages for a number of languages. If other languages are needed, you need to +provide a translation of the properties file. + + + + + diff --git a/documentation/datamodel/datamodel-items.asciidoc b/documentation/datamodel/datamodel-items.asciidoc new file mode 100644 index 0000000000..75a7c1ecf8 --- /dev/null +++ b/documentation/datamodel/datamodel-items.asciidoc @@ -0,0 +1,194 @@ +--- +title: Holding properties in Items +order: 3 +layout: page +--- + +[[datamodel.items]] += Holding properties in Items + +The [classname]#Item# interface provides access to a set of named properties. +Each property is identified by a __property identifier__ (PID) and a reference +to such a property can be queried from an [classname]#Item# with +[methodname]#getItemProperty()# using the identifier. + +Examples on the use of items include rows in a [classname]#Table#, with the +properties corresponding to table columns, nodes in a [classname]#Tree#, and the +the data bound to a [classname]#Form#, with item's properties bound to +individual form fields. + +Items are generally equivalent to objects in the object-oriented model, but with +the exception that they are configurable and provide an event handling +mechanism. The simplest way to utilize [classname]#Item# interface is to use +existing implementations. Provided utility classes include a configurable +property set ( [classname]#PropertysetItem#) and a bean-to-item adapter ( +[classname]#BeanItem#). Also, a [classname]#Form# implements the interface and +can therefore be used directly as an item. + +In addition to being used indirectly by many user interface components, items +provide the basic data model underlying the [classname]#Form# component. In +simple cases, forms can even be generated automatically from items. The +properties of the item correspond to the fields of the form. + +The [classname]#Item# interface defines inner interfaces for maintaining the +item property set and listening changes made to it. +[classname]#PropertySetChangeEvent# events can be emitted by a class +implementing the [classname]#PropertySetChangeNotifier# interface. They can be +received through the [classname]#PropertySetChangeListener# interface. + +ifdef::web[] +[[datamodel.items.propertysetitem]] +== The [classname]#PropertysetItem# Implementation + +The [classname]#PropertysetItem# is a generic implementation of the +[classname]#Item# interface that allows storing properties. The properties are +added with [methodname]#addItemProperty()#, which takes a name and the property +as parameters. + +The following example demonstrates a typical case of collecting +[classname]#ObjectProperty# properties in an item: + + +---- +PropertysetItem item = new PropertysetItem(); +item.addItemProperty("name", new ObjectProperty("Zaphod")); +item.addItemProperty("age", new ObjectProperty(42)); + +// Bind it to a component +Form form = new Form(); +form.setItemDataSource(item); +---- + +endif::web[] + +[[datamodel.items.beanitem]] +== Wrapping a Bean in a [classname]#BeanItem# + +The [classname]#BeanItem# implementation of the [classname]#Item# interface is a +wrapper for Java Bean objects. In fact, only the setters and getters are +required while serialization and other bean features are not, so you can wrap +almost any POJOs with minimal requirements. + + +---- +// Here is a bean (or more exactly a POJO) +class Person { + String name; + int age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age.intValue(); + } +} + +// Create an instance of the bean +Person bean = new Person(); + +// Wrap it in a BeanItem +BeanItem<Person> item = new BeanItem<Person>(bean); + +// Bind it to a component +Form form = new Form(); +form.setItemDataSource(item); +---- + +You can use the [methodname]#getBean()# method to get a reference to the +underlying bean. + +[[datamodel.items.beanitem.nested]] +=== Nested Beans + +You may often have composite classes where one class "has a" another class. For +example, consider the following [classname]#Planet# class which "has a" +discoverer: + + +---- +// Here is a bean with two nested beans +public class Planet implements Serializable { + String name; + Person discoverer; + + public Planet(String name, Person discoverer) { + this.name = name; + this.discoverer = discoverer; + } + + ... getters and setters ... +} + +... +// Create an instance of the bean +Planet planet = new Planet("Uranus", + new Person("William Herschel", 1738)); +---- + +When shown in a [classname]#Form#, for example, you would want to list the +properties of the nested bean along the properties of the composite bean. You +can do that by binding the properties of the nested bean individually with a +[classname]#MethodProperty# or [classname]#NestedMethodProperty#. You should +usually hide the nested bean from binding as a property by listing only the +bound properties in the constructor. + + +---- +// Wrap it in a BeanItem and hide the nested bean property +BeanItem<Planet> item = new BeanItem<Planet>(planet, + new String[]{"name"}); + +// Bind the nested properties. +// Use NestedMethodProperty to bind using dot notation. +item.addItemProperty("discoverername", + new NestedMethodProperty(planet, "discoverer.name")); + +// The other way is to use regular MethodProperty. +item.addItemProperty("discovererborn", + new MethodProperty<Person>(planet.getDiscoverer(), + "born")); +---- + +The difference is that [classname]#NestedMethodProperty# does not access the +nested bean immediately but only when accessing the property values, while when +using [classname]#MethodProperty# the nested bean is accessed when creating the +method property. The difference is only significant if the nested bean can be +null or be changed later. + +You can use such a bean item for example in a [classname]#Form# as follows: + + +---- +// Bind it to a component +Form form = new Form(); +form.setItemDataSource(item); + +// Nicer captions +form.getField("discoverername").setCaption("Discoverer"); +form.getField("discovererborn").setCaption("Born"); +---- + +[[figure.datamodel.items.beanitem.nested]] +.A [classname]#Form# with Nested Bean Properties +image::img/beanitem-nested-beans.png[] + +The [classname]#BeanContainer# and [classname]#BeanItemContainer# allow easy +definition of nested bean properties with +[methodname]#addNestedContainerProperty()#, as described in +<<dummy/../../../framework/datamodel/datamodel-container#datamodel.container.beancontainer.nestedproperties,"Nested +Properties">>. + + + + + diff --git a/documentation/datamodel/datamodel-overview.asciidoc b/documentation/datamodel/datamodel-overview.asciidoc new file mode 100644 index 0000000000..e053400776 --- /dev/null +++ b/documentation/datamodel/datamodel-overview.asciidoc @@ -0,0 +1,75 @@ +--- +title: Overview +order: 1 +layout: page +--- + +[[datamodel.overview]] += Overview + +The Vaadin Data Model is one of the core concepts of the library. To allow the +view (user interface components) to access the data model of an application +directly, we have introduced a standard data interface. + +The model allows binding user interface components directly to the data that +they display and possibly allow to edit. There are three nested levels of +hierarchy in the data model: __property__, __item__, and __container__. Using a +spreadsheet application as an analogy, these would correspond to a cell, a row, +and a table, respectively. + +.Vaadin Data Model +image::img/datamodel-whitebg.png[] + +The Data Model is realized as a set of interfaces in the +[classname]#com.vaadin.data# package. The package contains the +[classname]#Property#, [classname]#Item#, and [classname]#Container# interfaces, +along with a number of more specialized interfaces and classes. + +Notice that the Data Model does not define data representation, but only +interfaces. This leaves the representation fully to the implementation of the +containers. The representation can be almost anything, such as a plain old Java +object (POJO) structure, a filesystem, or a database query. + +The Data Model is used heavily in the core user interface components of Vaadin, +especially the field components, that is, components that implement the +[classname]#Field# interface or more typically extend +[classname]#AbstractField#, which defines many common features. A key feature of +all the built-in field components is that they can either maintain their data by +themselves or be bound to an external data source. The value of a field is +always available through the [classname]#Property# interface. As more than one +component can be bound to the same data source, it is easy to implement various +viewer-editor patterns. + +The relationships of the various interfaces are shown in +<<figure.datamodel.overview.relationships>>; the value change event and listener +interfaces are shown only for the [classname]#Property# interface, while the +notifier interfaces are omitted altogether. + +[[figure.datamodel.overview.relationships]] +.Interface Relationships in Vaadin Data Model +image::img/datamodel-interfaces-hi.png[] + +The Data Model has many important and useful features, such as support for +change notification. Especially containers have many helper interfaces, +including ones that allow indexing, ordering, sorting, and filtering the data. +Also [classname]#Field# components provide a number of features involving the +data model, such as buffering, validation, and lazy loading. + +Vaadin provides a number of built-in implementations of the data model +interfaces. The built-in implementations are used as the default data models in +many field components. + +In addition to the built-in implementations, many data model implementations, +such as containers, are available as add-ons, either from the Vaadin Directory +or from independent sources. Both commercial and free implementations exist. The +JPAContainer, described in +<<dummy/../../../framework/jpacontainer/jpacontainer-overview.asciidoc#jpacontainer.overview,"Vaadin +JPAContainer">>, is the most often used conmmercial container add-on. The +installation of add-ons is described in +<<dummy/../../../framework/addons/addons-overview.asciidoc#addons.overview,"Using +Vaadin Add-ons">>. Notice that unlike with most regular add-on components, you +do not need to compile a widget set for add-ons that include just data model +implementations. + + + diff --git a/documentation/datamodel/datamodel-properties.asciidoc b/documentation/datamodel/datamodel-properties.asciidoc new file mode 100644 index 0000000000..d5d0d3e39d --- /dev/null +++ b/documentation/datamodel/datamodel-properties.asciidoc @@ -0,0 +1,399 @@ +--- +title: Properties +order: 2 +layout: page +--- + +[[datamodel.properties]] += Properties + +The [interfacename]#Property# interface is the base of the Vaadin Data Model. It +provides a standardized API for a single data value object that can be read +(get) and written (set). A property is always typed, but can optionally support +data type conversions. The type of a property can be any Java class. Optionally, +properties can provide value change events for following their changes. + +You can set the value of a property with [methodname]#setValue()# and read with +[methodname]#getValue()#. + +In the following, we set and read the property value from a +[classname]#TextField# component, which implements the [interfacename]#Property# +interface to allow accessing the field value. + + +---- +final TextField tf = new TextField("Name"); + +// Set the value +tf.setValue("The text field value"); + +// When the field value is edited by the user +tf.addValueChangeListener( + new Property.ValueChangeListener() { + public void valueChange(ValueChangeEvent event) { + // Do something with the new value + layout.addComponent(new Label(tf.getValue())); + } +}); +---- +See the http://demo.vaadin.com/book-examples-vaadin7/book#datamodel.properties.basic[on-line example, window="_blank"]. + +Changes in the property value usually fire a [classname]#ValueChangeEvent#, +which can be handled with a [classname]#ValueChangeListener#. The event object +provides reference to the property with [methodname]#getProperty()#. Note that +its [methodname]#getValue()# method returns the value with [classname]#Object# +type, so you need to cast it to the proper type. + +Properties are in themselves unnamed. They are collected in __items__, which +associate the properties with names: the __Property Identifiers__ or __PID__s. +Items can be further contained in containers and are identified with __Item +Identifiers__ or __IID__s. In the spreadsheet analogy, __Property Identifiers__ +would correspond to column names and __Item Identifiers__ to row names. The +identifiers can be arbitrary objects, but must implement the +[methodname]#equals(Object)# and [methodname]#hashCode()# methods so that they +can be used in any standard Java [classname]#Collection#. + +The [classname]#Property# interface can be utilized either by implementing the +interface or by using some of the built-in property implementations. Vaadin +includes a [classname]#Property# interface implementation for arbitrary function +pairs and bean properties, with the [classname]#MethodProperty# class, and for +simple object properties, with the [classname]#ObjectProperty# class, as +described later. + +In addition to the simple components, selection components provide their current +selection as the property value. In single selection mode, the property is a +single item identifier, while in multiple selection mode it is a set of item +identifiers. See the documentation of the selection components for further +details. + +Components that can be bound to a property have an internal default data source +object, typically a [classname]#ObjectProperty#, which is described later. As +all such components are viewers or editors, also described later, so you can +rebind a component to any data source with +[methodname]#setPropertyDataSource()#. + +[[datamodel.properties.viewers]] +== Property Viewers and Editors + +The most important function of the [classname]#Property# as well as of the other +data model interfaces is to connect classes implementing the interface directly +to editor and viewer classes. This means connecting a data source (model) to a +user interface component (views) to allow editing or viewing the data model. + +A property can be bound to a component implementing the [classname]#Viewer# +interface with [methodname]#setPropertyDataSource()#. + + +---- +// Have a data model +ObjectProperty property = + new ObjectProperty("Hello", String.class); + +// Have a component that implements Viewer +Label viewer = new Label(); + +// Bind it to the data +viewer.setPropertyDataSource(property); +---- + +You can use the same method in the [classname]#Editor# interface to bind a +component that allows editing a particular property type to a property. + + +---- +// Have a data model +ObjectProperty property = + new ObjectProperty("Hello", String.class); + +// Have a component that implements Viewer +TextField editor = new TextField("Edit Greeting"); + +// Bind it to the data +editor.setPropertyDataSource(property); + +---- + +As all field components implement the [classname]#Property# interface, you can +bind any component implementing the [classname]#Viewer# interface to any field, +assuming that the viewer is able the view the object type of the field. +Continuing from the above example, we can bind a [classname]#Label# to the +[classname]#TextField# value: + + +---- +Label viewer = new Label(); +viewer.setPropertyDataSource(editor); + +// The value shown in the viewer is updated immediately +// after editing the value in the editor (once it +// loses the focus) +editor.setImmediate(true); +---- + +If a field has validators, as described in +<<dummy/../../../framework/components/components-fields#components.fields.validation,"Field +Validation">>, the validators are executed before writing the value to the +property data source, or by calling the [methodname]#validate()# or +[methodname]#commit()# for the field. + + +[[datamodel.properties.objectproperty]] +== [classname]#ObjectProperty# Implementation + +The [classname]#ObjectProperty# class is a simple implementation of the +[classname]#Property# interface that allows storing an arbitrary Java object. + + +---- +// Have a component that implements Viewer interface +final TextField tf = new TextField("Name"); + +// Have a data model with some data +String myObject = "Hello"; + +// Wrap it in an ObjectProperty +ObjectProperty property = + new ObjectProperty(myObject, String.class); + +// Bind the property to the component +tf.setPropertyDataSource(property); +---- + + +[[datamodel.properties.converter]] +== Converting Between Property Type and Representation + +Fields allow editing a certain type, such as a [classname]#String# or +[classname]#Date#. The bound property, on the other hand, could have some +entirely different type. Conversion between a representation edited by the field +and the model defined in the property is handler with a converter that +implements the [interfacename]#Converter# interface. + +Most common type conversions, such as between string and integer, are handled by +the default converters. They are created in a converter factory global in the +application. + +[[datamodel.properties.converter.basic]] +=== Basic Use of Converters + +The [methodname]#setConverter([interfacename]#Converter#)# method sets the +converter for a field. The method is defined in [classname]#AbstractField#. + + +---- +// Have an integer property +final ObjectProperty<Integer> property = + new ObjectProperty<Integer>(42); + +// Create a TextField, which edits Strings +final TextField tf = new TextField("Name"); + +// Use a converter between String and Integer +tf.setConverter(new StringToIntegerConverter()); + +// And bind the field +tf.setPropertyDataSource(property); +---- + +The built-in converters are the following: + +[[datamodel.properties.converter.basic.built-in]] +.Built-in Converters +[options="header"] +|=============== +|Converter|Representation|Model +|[classname]#StringToIntegerConverter#|[classname]#String#|[classname]#Integer# +|[classname]#StringToDoubleConverter#|[classname]#String#|[classname]#Double# +|[classname]#StringToNumberConverter#|[classname]#String#|[classname]#Number# +|[classname]#StringToBooleanConverter#|[classname]#String#|[classname]#Boolean# +|[classname]#StringToDateConverter#|[classname]#String#|[classname]#Date# +|[classname]#DateToLongConverter#|[classname]#Date#|[classname]#Long# + +|=============== + + + +In addition, there is a [classname]#ReverseConverter# that takes a converter as +a parameter and reverses the conversion direction. + +If a converter already exists for a type, the +[methodname]#setConverter([interfacename]#Class#)# retrieves the converter for +the given type from the converter factory, and then sets it for the field. This +method is used implicitly when binding field to a property data source. + + +[[datamodel.properties.converter.custom]] +=== Implementing a Converter + +A conversion always occurs between a __representation type__, edited by the +field component, and a __model type__, that is, the type of the property data +source. Converters implement the [interfacename]#Converter# interface defined in +the [package]#com.vaadin.data.util.converter# package. + +For example, let us assume that we have a simple [classname]#Complex# type for +storing complex values. + + +---- +public class ComplexConverter + implements Converter<String, Complex> { + @Override + public Complex convertToModel(String value, Locale locale) + throws ConversionException { + String parts[] = + value.replaceAll("[\\(\\)]", "").split(","); + if (parts.length != 2) + throw new ConversionException( + "Unable to parse String to Complex"); + return new Complex(Double.parseDouble(parts[0]), + Double.parseDouble(parts[1])); + } + + @Override + public String convertToPresentation(Complex value, + Locale locale) + throws ConversionException { + return "("+value.getReal()+","+value.getImag()+")"; + } + + @Override + public Class<Complex> getModelType() { + return Complex.class; + } + + @Override + public Class<String> getPresentationType() { + return String.class; + } +} +---- + +The conversion methods get the locale for the conversion as a parameter. + + +[[datamodel.properties.converter.converterfactory]] +=== Converter Factory + +If a field does not directly allow editing a property type, a default converter +is attempted to create using an application-global converter factory. If you +define your own converters that you wish to include in the converter factory, +you need to implement one yourself. While you could implement the +[interfacename]#ConverterFactory# interface, it is usually easier to just extend +[classname]#DefaultConverterFactory#. + + +---- +class MyConverterFactory extends DefaultConverterFactory { + @Override + public <PRESENTATION, MODEL> Converter<PRESENTATION, MODEL> + createConverter(Class<PRESENTATION> presentationType, + Class<MODEL> modelType) { + // Handle one particular type conversion + if (String.class == presentationType && + Complex.class == modelType) + return (Converter<PRESENTATION, MODEL>) + new ComplexConverter(); + + // Default to the supertype + return super.createConverter(presentationType, + modelType); + } +} + +// Use the factory globally in the application +Application.getCurrentApplication().setConverterFactory( + new MyConverterFactory()); +---- + + + +ifdef::web[] +[[datamodel.properties.implementing]] +== Implementing the [classname]#Property# Interface + +Implementation of the [classname]#Property# interface requires defining setters +and getters for the value and the __read-only__ mode. Only a getter is needed +for the property type, as the type is often fixed in property implementations. + +The following example shows a simple implementation of the [classname]#Property# +interface: + + +---- +class MyProperty implements Property { + Integer data = 0; + boolean readOnly = false; + + // Return the data type of the model + public Class<?> getType() { + return Integer.class; + } + + public Object getValue() { + return data; + } + + // Override the default implementation in Object + @Override + public String toString() { + return Integer.toHexString(data); + } + + public boolean isReadOnly() { + return readOnly; + } + + public void setReadOnly(boolean newStatus) { + readOnly = newStatus; + } + + public void setValue(Object newValue) + throws ReadOnlyException, ConversionException { + if (readOnly) + throw new ReadOnlyException(); + + // Already the same type as the internal representation + if (newValue instanceof Integer) + data = (Integer) newValue; + + // Conversion from a string is required + else if (newValue instanceof String) + try { + data = Integer.parseInt((String) newValue, 16); + } catch (NumberFormatException e) { + throw new ConversionException(); + } + else + // Don't know how to convert any other types + throw new ConversionException(); + + // Reverse decode the hexadecimal value + } +} + +// Instantiate the property and set its data +MyProperty property = new MyProperty(); +property.setValue(42); + +// Bind it to a component +final TextField tf = new TextField("Name", property); +---- + +The components get the displayed value by the [methodname]#toString()# method, +so it is necessary to override it. To allow editing the value, value returned in +the [methodname]#toString()# must be in a format that is accepted by the +[methodname]#setValue()# method, unless the property is read-only. The +[methodname]#toString()# can perform any type conversion necessary to make the +internal type a string, and the [methodname]#setValue()# must be able to make a +reverse conversion. + +The implementation example does not notify about changes in the property value +or in the read-only mode. You should normally also implement at least the +[classname]#Property.ValueChangeNotifier# and +[classname]#Property.ReadOnlyStatusChangeNotifier#. See the +[classname]#ObjectProperty# class for an example of the implementation. + +endif::web[] + + + diff --git a/documentation/datamodel/img/beanitem-nested-beans.png b/documentation/datamodel/img/beanitem-nested-beans.png Binary files differnew file mode 100644 index 0000000000..ea8c51ccd4 --- /dev/null +++ b/documentation/datamodel/img/beanitem-nested-beans.png diff --git a/documentation/datamodel/img/beanitemcontainer-nested-beans.png b/documentation/datamodel/img/beanitemcontainer-nested-beans.png Binary files differnew file mode 100644 index 0000000000..fbd5fa155a --- /dev/null +++ b/documentation/datamodel/img/beanitemcontainer-nested-beans.png diff --git a/documentation/datamodel/img/datamodel-interfaces-hi.png b/documentation/datamodel/img/datamodel-interfaces-hi.png Binary files differnew file mode 100644 index 0000000000..9bebdb0ac0 --- /dev/null +++ b/documentation/datamodel/img/datamodel-interfaces-hi.png diff --git a/documentation/datamodel/img/datamodel-interfaces-lo.png b/documentation/datamodel/img/datamodel-interfaces-lo.png Binary files differnew file mode 100644 index 0000000000..2139cf9f08 --- /dev/null +++ b/documentation/datamodel/img/datamodel-interfaces-lo.png diff --git a/documentation/datamodel/original-drawings/beanitem-doublebinding.svg b/documentation/datamodel/original-drawings/beanitem-doublebinding.svg new file mode 100644 index 0000000000..509013ab07 --- /dev/null +++ b/documentation/datamodel/original-drawings/beanitem-doublebinding.svg @@ -0,0 +1,1026 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2475"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docname="beanitem-doublebinding.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
+ inkscape:export-xdpi="300.01001"
+ inkscape:export-ydpi="300.01001"
+ version="1.0">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="4"
+ objecttolerance="4"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.2"
+ inkscape:cx="458.26878"
+ inkscape:cy="757.29383"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1680"
+ inkscape:window-height="1026"
+ inkscape:window-x="1280"
+ inkscape:window-y="0"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ units="mm"
+ inkscape:snap-global="true"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ snapvisiblegridlinesonly="true"
+ dotted="false"
+ type="xygrid"
+ id="grid4674"
+ visible="true"
+ enabled="true"
+ units="mm"
+ empspacing="5"
+ spacingx="1mm"
+ spacingy="1mm" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2477">
+ <marker
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path5210" />
+ </marker>
+ <marker
+ inkscape:stockid="DotS"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotS"
+ style="overflow:visible">
+ <path
+ id="path3636"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path3717" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect2503"
+ prop_scale="1"
+ pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
+ copytype="single_stretched" />
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect2499"
+ prop_scale="1" />
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect2497"
+ prop_scale="1"
+ pattern="M 432.28346,272.83462 L 403.93701,216.14171"
+ pattern-nodetypes="cc" />
+ <marker
+ inkscape:stockid="Arrow1Send"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Send"
+ style="overflow:visible">
+ <path
+ id="path3641"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path3629"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective3487"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow2Sendp"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Sendp"
+ style="overflow:visible">
+ <path
+ id="path28139"
+ style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSK"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSK"
+ style="overflow:visible">
+ <path
+ id="path36611"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSH"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSH"
+ style="overflow:visible">
+ <path
+ id="path36614"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSA"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSA"
+ style="overflow:visible">
+ <path
+ id="path36617"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSKF"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSKF"
+ style="overflow:visible">
+ <path
+ id="path36620"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS9"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS9"
+ style="overflow:visible">
+ <path
+ id="path36623"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2SendpA"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2SendpA"
+ style="overflow:visible">
+ <path
+ id="path3396"
+ style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Sendpg"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Sendpg"
+ style="overflow:visible">
+ <path
+ id="path3360"
+ style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)" />
+ </marker>
+ <filter
+ height="1.1"
+ width="1.1"
+ inkscape:label="White Halo"
+ id="filter2780">
+ <feMorphology
+ result="result0"
+ radius="3"
+ operator="dilate"
+ id="feMorphology2782" />
+ <feFlood
+ result="result3"
+ in="result0"
+ flood-opacity="1"
+ flood-color="rgb(255,255,255)"
+ id="feFlood2786" />
+ <feComposite
+ result="result4"
+ operator="in"
+ in2="result0"
+ in="result3"
+ id="feComposite2623" />
+ <feMerge
+ id="feMerge2629">
+ <feMergeNode
+ in="result4"
+ id="feMergeNode2631"
+ inkscape:collect="always" />
+ <feMergeNode
+ in="SourceGraphic"
+ id="feMergeNode2633"
+ inkscape:collect="always" />
+ </feMerge>
+ </filter>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSn"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSn">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4441" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS9F"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS9F">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4444" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSI"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSI">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4447" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSO"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSO">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4450" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSW"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSW">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4453" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSB"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSB">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4456" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSZ"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSZ">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path4459" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSq"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSq"
+ style="overflow:visible">
+ <path
+ id="path5853"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSBO"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSBO">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path7501" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSu"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSu"
+ style="overflow:visible">
+ <path
+ id="path9463"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <filter
+ id="filter10694"
+ inkscape:label="Black Halo"
+ width="1.1"
+ height="1.1">
+ <feMorphology
+ id="feMorphology10696"
+ operator="dilate"
+ radius="3"
+ result="result0" />
+ <feFlood
+ id="feFlood10698"
+ flood-color="rgb(0,0,0)"
+ flood-opacity="1"
+ in="result0"
+ result="result3" />
+ <feComposite
+ id="feComposite10700"
+ in="result3"
+ in2="result0"
+ operator="in"
+ result="result4" />
+ <feMerge
+ id="feMerge10702">
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode10704"
+ in="result4" />
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode10706"
+ in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSu"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSu">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8127" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSI8"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSI8">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8130" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSr"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSr">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8133" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSM"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSM">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8136" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSb"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSb">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path8139" />
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450776"
+ orient="auto"
+ id="marker18095">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)"
+ id="g11064">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path11050"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path11035"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297355"
+ markerHeight="5.7450781"
+ orient="auto"
+ id="marker44971">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g18059">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path18061"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path18063"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.7450786"
+ orient="auto"
+ id="marker52016">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g52010">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path52012"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path52014"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297255"
+ markerHeight="5.745079"
+ orient="auto"
+ id="marker64887">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g64855">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path64857"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path64859"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.6297302"
+ markerHeight="5.745079"
+ orient="auto"
+ id="marker4057">
+ <g
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)"
+ id="g51986">
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ id="path51988"
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc" />
+ <path
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ id="path51990"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </g>
+ </marker>
+ <marker
+ markerWidth="4.0334239"
+ markerHeight="4.5568175"
+ orient="auto"
+ id="marker72805">
+ <path
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
+ id="path18057"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </marker>
+ <marker
+ markerWidth="4.0334177"
+ markerHeight="4.5568123"
+ orient="auto"
+ id="marker72808">
+ <path
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
+ id="path72801"
+ sodipodi:nodetypes="cccscccsssssssscccsccc" />
+ </marker>
+ <marker
+ inkscape:stockid="DotSuN"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSuN"
+ style="overflow:visible">
+ <path
+ id="path81580"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ id="perspective3071" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ id="perspective3071-3" />
+ <marker
+ inkscape:stockid="DotSqn"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotSqn"
+ style="overflow:visible">
+ <path
+ id="path3825"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ style="marker-end:none;fill-rule:evenodd;marker-start:none;stroke:#49c2f1;stroke-width:1pt;fill:#49c2f1"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata2480">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <flowRoot
+ transform="translate(-0.8858472,0)"
+ xml:space="preserve"
+ id="flowRoot2485"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"><flowRegion
+ id="flowRegion2487"><rect
+ id="rect2489"
+ width="184.28572"
+ height="120"
+ x="262.85715"
+ y="238.07646"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold" /></flowRegion><flowPara
+ id="flowPara2491" /></flowRoot> <g
+ id="g3178"
+ transform="translate(-4.4572759,23.214286)" />
+ <flowRoot
+ transform="translate(-0.8858472,0)"
+ xml:space="preserve"
+ id="flowRoot8724"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"><flowRegion
+ id="flowRegion8726"><rect
+ id="rect8728"
+ width="29.904507"
+ height="22.868153"
+ x="39.286312"
+ y="752.14441"
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light" /></flowRegion><flowPara
+ id="flowPara8730" /></flowRoot> <g
+ id="g18053"
+ transform="matrix(0.5,0,0,0.5,102.45714,0.7940752)" />
+ <g
+ transform="translate(-166.83345,55.50466)"
+ id="g2630">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect2632"
+ width="134.64566"
+ height="35.433067"
+ x="205.84985"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot2634"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion2636" /><flowPara
+ id="flowPara2638">BeanItem<DaBean></flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4306"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-214.12137,-46.769087)"
+ sodipodi:open="true" />
+ </g>
+ <g
+ transform="translate(-165.25597,-21.834568)"
+ id="g3696">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3698"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot3700"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3702" /><flowPara
+ id="flowPara3704">DaBean</flowPara></flowRoot> </g>
+ <g
+ transform="translate(-208.41219,126.37676)"
+ id="g3706">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect3708"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot3710"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3712" /><flowPara
+ id="flowPara3714">Form</flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4287"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-215.0244,-46.226947)"
+ sodipodi:open="true" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 97.827294,272.83462 L 63.779528,308.26769"
+ id="path4290"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g2630" />
+ <g
+ transform="translate(-123.81342,126.37858)"
+ id="g4292">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4294"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot4296"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4298" /><flowPara
+ id="flowPara4300">Form</flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4302"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-215.0244,-46.226947)"
+ sodipodi:open="true" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 114.83517,272.83462 L 148.8189,308.26769"
+ id="path3716"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g2630" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 106.66359,195.49539 L 106.29921,237.40155"
+ id="path4304"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g3696" />
+ <g
+ transform="translate(24.465107,55.919946)"
+ id="g4308">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4310"
+ width="134.64566"
+ height="35.433067"
+ x="205.84985"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot4312"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4314" /><flowPara
+ id="flowPara4316">BeanItem<DaBean></flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4318"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-214.12137,-46.769087)"
+ sodipodi:open="true" />
+ </g>
+ <g
+ transform="translate(96.43882,-21.681466)"
+ id="g4320">
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#49c2f1;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4322"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot4324"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4326" /><flowPara
+ id="flowPara4328">DaBean</flowPara></flowRoot> </g>
+ <g
+ transform="translate(25.457474,125.80388)"
+ id="g4330">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4332"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="182.48613"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot4334"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4336" /><flowPara
+ id="flowPara4338">Form</flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4340"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-215.0244,-46.226947)"
+ sodipodi:open="true" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 297.63779,273.24991 L 297.6378,308.26769"
+ id="path4342"
+ inkscape:connector-type="polyline" />
+ <g
+ transform="translate(167.18976,126.38479)"
+ id="g4344">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4346"
+ width="74.409447"
+ height="35.43306"
+ x="234.86888"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot4348"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4350" /><flowPara
+ id="flowPara4352">Form</flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4354"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-215.0244,-46.226947)"
+ sodipodi:open="true" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 439.37007,273.24991 L 439.37008,308.26769"
+ id="path4356"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g4360" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 345.76938,197.14849 L 297.63779,237.81684"
+ id="path4358"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g4320" />
+ <g
+ transform="translate(166.19738,55.91995)"
+ id="g4360">
+ <rect
+ style="opacity:1;fill:#49c2f1;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect4362"
+ width="134.64566"
+ height="35.433067"
+ x="205.84985"
+ y="181.8969"
+ ry="3.7880721" />
+ <flowRoot
+ transform="translate(273.91267,204.25271)"
+ id="flowRoot4364"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><flowRegion
+ id="flowRegion4366" /><flowPara
+ id="flowPara4368">BeanItem<DaBean></flowPara></flowRoot> <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4370"
+ sodipodi:cx="487.20471"
+ sodipodi:cy="228.54329"
+ sodipodi:rx="7.0740213"
+ sodipodi:ry="7.0907817"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:start="0"
+ sodipodi:end="6.2827149"
+ transform="translate(-214.12137,-46.769087)"
+ sodipodi:open="true" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSqn);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ d="M 391.25002,197.14849 L 439.37007,237.81684"
+ id="path4372"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g4320" />
+ </g>
+</svg>
diff --git a/documentation/datamodel/original-drawings/datamodel-interfaces.svg b/documentation/datamodel/original-drawings/datamodel-interfaces.svg new file mode 100644 index 0000000000..051f60c48d --- /dev/null +++ b/documentation/datamodel/original-drawings/datamodel-interfaces.svg @@ -0,0 +1,1321 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2475"
+ sodipodi:version="0.32"
+ inkscape:version="0.47pre4 r22446"
+ sodipodi:docname="datamodel-interfaces.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ inkscape:export-filename="/home/magi/itmill/doc/cheatsheet/vaadin-cheatsheet.png"
+ inkscape:export-xdpi="300.01001"
+ inkscape:export-ydpi="300.01001"
+ version="1.0">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ gridtolerance="10000"
+ guidetolerance="4"
+ objecttolerance="4"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.6970563"
+ inkscape:cx="429.28864"
+ inkscape:cy="730.78696"
+ inkscape:document-units="mm"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:window-width="1680"
+ inkscape:window-height="1030"
+ inkscape:window-x="-4"
+ inkscape:window-y="-3"
+ inkscape:snap-nodes="true"
+ inkscape:snap-bbox="true"
+ units="mm"
+ inkscape:snap-global="true"
+ inkscape:window-maximized="1">
+ <inkscape:grid
+ spacingy="1mm"
+ spacingx="1mm"
+ empspacing="5"
+ units="mm"
+ enabled="true"
+ visible="true"
+ id="grid4674"
+ type="xygrid"
+ dotted="false"
+ snapvisiblegridlinesonly="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2477">
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5210"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotS"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotS">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path3636" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS"
+ style="overflow:visible">
+ <path
+ id="path3717"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <inkscape:path-effect
+ copytype="single_stretched"
+ pattern="M 349.202,225.086 L 405.895,331.386 L 370.462,338.472 "
+ prop_scale="1"
+ id="path-effect2503"
+ effect="skeletal" />
+ <inkscape:path-effect
+ prop_scale="1"
+ id="path-effect2499"
+ effect="skeletal" />
+ <inkscape:path-effect
+ pattern-nodetypes="cc"
+ pattern="M 432.28346,272.83462 L 403.93701,216.14171"
+ prop_scale="1"
+ id="path-effect2497"
+ effect="skeletal" />
+ <marker
+ style="overflow:visible"
+ id="Arrow1Send"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path3641" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Lend"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z"
+ id="path3629" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3487" />
+ <marker
+ style="overflow:visible"
+ id="Arrow2Sendp"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Sendp">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ style="font-size:12px;fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:0.625;stroke-linejoin:round"
+ id="path28139" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSK"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSK">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36611" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSH"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSH">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36614" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSA"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSA">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36617" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutSKF"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutSKF">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36620" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleOutS9"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="TriangleOutS9">
+ <path
+ transform="scale(0.2,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ id="path36623" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2SendpA"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2SendpA">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ style="font-size:12px;fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:0.625;stroke-linejoin:round"
+ id="path3396" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow2Sendpg"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="Arrow2Sendpg">
+ <path
+ transform="matrix(-0.3,0,0,-0.3,0.69,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.97309,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z"
+ style="font-size:12px;fill:#fcc988;fill-rule:evenodd;stroke:#fcc988;stroke-width:0.625;stroke-linejoin:round"
+ id="path3360" />
+ </marker>
+ <filter
+ id="filter2780"
+ inkscape:label="White Halo"
+ width="1.1"
+ height="1.1">
+ <feMorphology
+ id="feMorphology2782"
+ operator="dilate"
+ radius="3"
+ result="result0" />
+ <feFlood
+ id="feFlood2786"
+ flood-color="rgb(255,255,255)"
+ flood-opacity="1"
+ in="result0"
+ result="result3" />
+ <feComposite
+ id="feComposite2623"
+ in="result3"
+ in2="result0"
+ operator="in"
+ result="result4" />
+ <feMerge
+ id="feMerge2629">
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode2631"
+ in="result4" />
+ <feMergeNode
+ inkscape:collect="always"
+ id="feMergeNode2633"
+ in="SourceGraphic" />
+ </feMerge>
+ </filter>
+ <marker
+ inkscape:stockid="TriangleOutSn"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSn"
+ style="overflow:visible">
+ <path
+ id="path4441"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutS9F"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutS9F"
+ style="overflow:visible">
+ <path
+ id="path4444"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSI"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSI"
+ style="overflow:visible">
+ <path
+ id="path4447"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSO"
+ style="overflow:visible">
+ <path
+ id="path4450"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSW"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSW"
+ style="overflow:visible">
+ <path
+ id="path4453"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSB"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSB"
+ style="overflow:visible">
+ <path
+ id="path4456"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSZ"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSZ"
+ style="overflow:visible">
+ <path
+ id="path4459"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSq"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSq">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#d9d9cd;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path5853" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSBO"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSBO"
+ style="overflow:visible">
+ <path
+ id="path7501"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSu"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSu">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path9463" />
+ </marker>
+ <filter
+ height="1.1"
+ width="1.1"
+ inkscape:label="Black Halo"
+ id="filter10694">
+ <feMorphology
+ result="result0"
+ radius="3"
+ operator="dilate"
+ id="feMorphology10696" />
+ <feFlood
+ result="result3"
+ in="result0"
+ flood-opacity="1"
+ flood-color="rgb(0,0,0)"
+ id="feFlood10698" />
+ <feComposite
+ result="result4"
+ operator="in"
+ in2="result0"
+ in="result3"
+ id="feComposite10700" />
+ <feMerge
+ id="feMerge10702">
+ <feMergeNode
+ in="result4"
+ id="feMergeNode10704"
+ inkscape:collect="always" />
+ <feMergeNode
+ in="SourceGraphic"
+ id="feMergeNode10706"
+ inkscape:collect="always" />
+ </feMerge>
+ </filter>
+ <marker
+ inkscape:stockid="TriangleOutSu"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSu"
+ style="overflow:visible">
+ <path
+ id="path8127"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSI8"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSI8"
+ style="overflow:visible">
+ <path
+ id="path8130"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSr"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSr"
+ style="overflow:visible">
+ <path
+ id="path8133"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSM"
+ style="overflow:visible">
+ <path
+ id="path8136"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutSb"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="TriangleOutSb"
+ style="overflow:visible">
+ <path
+ id="path8139"
+ d="M 5.77,0 L -2.88,5 L -2.88,-5 L 5.77,0 z"
+ style="fill:#49c2f1;fill-rule:evenodd;stroke:#49c2f1;stroke-width:1pt;marker-start:none"
+ transform="scale(0.2,0.2)" />
+ </marker>
+ <marker
+ id="marker18095"
+ orient="auto"
+ markerHeight="5.7450776"
+ markerWidth="4.6297302">
+ <g
+ id="g11064"
+ transform="matrix(0.5,0,0,0.5,-185.64298,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path11050"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path11035"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker44971"
+ orient="auto"
+ markerHeight="5.7450781"
+ markerWidth="4.6297355">
+ <g
+ id="g18059"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path18061"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path18063"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker52016"
+ orient="auto"
+ markerHeight="5.7450786"
+ markerWidth="4.6297302">
+ <g
+ id="g52010"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path52012"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path52014"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker64887"
+ orient="auto"
+ markerHeight="5.745079"
+ markerWidth="4.6297255">
+ <g
+ id="g64855"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path64857"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path64859"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker4057"
+ orient="auto"
+ markerHeight="5.745079"
+ markerWidth="4.6297302">
+ <g
+ id="g51986"
+ transform="matrix(0.5,0,0,0.5,-185.64299,-257.19655)">
+ <path
+ sodipodi:nodetypes="csccccccsccssssssssssssssccc"
+ id="path51988"
+ d="M 370,508.65625 C 369.13933,508.715 368.39056,509.27755 368.09375,510.09375 C 367.82399,510.83551 368.03605,511.62868 368.53125,512.21875 L 366.78125,512.21875 C 366.73884,512.21408 366.69882,512.22093 366.65625,512.21875 L 366.65625,516.59375 L 366.78125,516.59375 L 368.53125,516.59375 C 367.85229,517.45345 367.83424,518.70924 368.625,519.5 C 369.47591,520.35091 370.89909,520.35091 371.75,519.5 L 375.09375,516.125 C 375.12672,516.09552 375.15802,516.06422 375.1875,516.03125 C 375.21972,516.01191 375.25101,515.99105 375.28125,515.96875 C 375.28162,515.96839 375.49976,515.68796 375.5,515.6875 C 375.50005,515.68741 375.49338,515.64282 375.5,515.625 C 375.5011,515.62203 375.53002,515.62832 375.53125,515.625 C 375.57039,515.57293 375.58228,515.57321 375.625,515.5 C 375.76199,515.26524 375.79184,515.12809 375.78125,515.15625 C 375.81807,515.06473 375.79977,515.04374 375.8125,515 C 375.82311,514.98978 375.83353,514.97936 375.84375,514.96875 C 375.90379,514.74477 375.93181,514.45186 375.90625,514.1875 C 375.89266,513.98387 375.84739,513.88985 375.84375,513.875 C 375.84389,513.86458 375.84389,513.85417 375.84375,513.84375 C 375.86975,513.94071 375.85901,513.85978 375.75,513.59375 C 375.69753,513.46336 375.66014,513.37439 375.625,513.3125 C 375.57262,513.22275 375.49154,513.05015 375.28125,512.84375 L 371.75,509.3125 C 371.29355,508.82579 370.66491,508.60087 370,508.65625 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path51990"
+ d="M 366.65625,515.40625 L 371.28125,515.40625 L 369.46875,517.21875 C 369.0718,517.6157 369.0718,518.2593 369.46875,518.65625 C 369.8657,519.0532 370.5093,519.0532 370.90625,518.65625 L 374.34375,515.1875 L 374.4375,515.125 C 374.44343,515.11918 374.43171,515.09972 374.4375,515.09375 C 374.49291,515.03659 374.5526,514.97676 374.59375,514.90625 C 374.62239,514.85717 374.63663,514.80216 374.65625,514.75 C 374.66861,514.71928 374.67831,514.68783 374.6875,514.65625 C 374.71862,514.54015 374.73024,514.43132 374.71875,514.3125 C 374.71489,514.25466 374.70138,514.21285 374.6875,514.15625 C 374.6766,514.1156 374.67237,514.07059 374.65625,514.03125 C 374.63982,513.99042 374.61578,513.94505 374.59375,513.90625 C 374.5483,513.82838 374.50015,513.74899 374.4375,513.6875 L 370.90625,510.15625 C 370.69734,509.93349 370.39809,509.8184 370.09375,509.84375 C 369.69897,509.8707 369.35398,510.12813 369.21875,510.5 C 369.08351,510.87187 369.18349,511.28826 369.46875,511.5625 L 371.34375,513.40625 L 366.65625,513.40625"
+ style="fill:#49c2f1;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ </marker>
+ <marker
+ id="marker72805"
+ orient="auto"
+ markerHeight="4.5568175"
+ markerWidth="4.0334239">
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path18057"
+ d="M -2.0167119,0.50456824 L 0.29578813,0.50456824 L -0.61046187,1.4108182 C -0.80893187,1.6092982 -0.80893187,1.9310982 -0.61046187,2.1295682 C -0.41198187,2.3280482 -0.090181874,2.3280482 0.10828813,2.1295682 L 1.8270381,0.39519824 L 1.8739181,0.36394824 C 1.8768781,0.36103824 1.8710181,0.35130824 1.8739181,0.34831824 C 1.9016181,0.31973824 1.9314681,0.28982824 1.9520381,0.25456824 C 1.9663581,0.23002824 1.9734781,0.20252824 1.9832881,0.17644824 C 1.9894681,0.16108824 1.9943181,0.14535824 1.9989181,0.12956824 C 2.0144781,0.07151824 2.0202881,0.01710824 2.0145381,-0.04230176 C 2.0126081,-0.07122176 2.0058581,-0.09213176 1.9989181,-0.12043176 C 1.9934681,-0.14075176 1.9913481,-0.16326176 1.9832881,-0.18293176 C 1.9750781,-0.20334176 1.9630581,-0.22603176 1.9520381,-0.24543176 C 1.9293181,-0.28436176 1.9052381,-0.32406176 1.8739181,-0.35480176 L 0.10828813,-2.1204318 C 0.003838126,-2.2318118 -0.14579187,-2.2893518 -0.29796187,-2.2766818 C -0.49535187,-2.2632018 -0.66784187,-2.1344918 -0.73546187,-1.9485518 C -0.80308187,-1.7626218 -0.75309187,-1.5544218 -0.61046187,-1.4173018 L 0.32703813,-0.49543176 L -2.0167119,-0.49543176"
+ style="fill:#f39300;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </marker>
+ <marker
+ id="marker72808"
+ orient="auto"
+ markerHeight="4.5568123"
+ markerWidth="4.0334177">
+ <path
+ sodipodi:nodetypes="cccscccsssssssscccsccc"
+ id="path72801"
+ d="M -2.016709,0.50457301 L 0.29579105,0.50457301 L -0.61045895,1.410823 C -0.80893895,1.609293 -0.80893895,1.931093 -0.61045895,2.129573 C -0.41198895,2.328043 -0.090188953,2.328043 0.10829105,2.129573 L 1.827041,0.39519301 L 1.873911,0.36394301 C 1.876881,0.36103301 1.871021,0.35130301 1.873911,0.34832301 C 1.901621,0.31974301 1.931461,0.28982301 1.952041,0.25457301 C 1.966361,0.23003301 1.973481,0.20252301 1.983291,0.17644301 C 1.989471,0.16108301 1.994321,0.14536301 1.998911,0.12957301 C 2.014471,0.071523013 2.020281,0.017103013 2.014541,-0.042306987 C 2.012611,-0.071226987 2.005851,-0.092126987 1.998911,-0.12042699 C 1.993461,-0.14075699 1.991351,-0.16325699 1.983291,-0.18292699 C 1.975071,-0.20334699 1.963051,-0.22602699 1.952041,-0.24542699 C 1.929311,-0.28436699 1.905241,-0.32405699 1.873911,-0.35480699 L 0.10829105,-2.120427 C 0.003831047,-2.231807 -0.14578895,-2.289357 -0.29795895,-2.276677 C -0.49534895,-2.263207 -0.66784895,-2.134487 -0.73545895,-1.948557 C -0.80307895,-1.762617 -0.75308895,-1.554427 -0.61045895,-1.417307 L 0.32704105,-0.49542699 L -2.016709,-0.49542699"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="DotSuN"
+ refX="0"
+ refY="0"
+ orient="auto"
+ inkscape:stockid="DotSuN">
+ <path
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ style="fill:#f39300;fill-rule:evenodd;stroke:#f39300;stroke-width:1pt;marker-start:none;marker-end:none"
+ d="M -2.5,-1 C -2.5,1.76 -4.74,4 -7.5,4 C -10.26,4 -12.5,1.76 -12.5,-1 C -12.5,-3.76 -10.26,-6 -7.5,-6 C -4.74,-6 -2.5,-3.76 -2.5,-1 z"
+ id="path81580" />
+ </marker>
+ <inkscape:perspective
+ id="perspective3071"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective3071-3"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <metadata
+ id="metadata2480">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;stroke:none"
+ id="rect3139"
+ width="393.30707"
+ height="322.44095"
+ x="322.44095"
+ y="134.64565"
+ ry="3.7880721" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.77165353;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="rect6642"
+ width="387.10629"
+ height="205.51181"
+ x="325.09842"
+ y="138.18895"
+ ry="3.7880721" />
+ <g
+ id="g2870"
+ transform="translate(176.19402,101.81896)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="205.84985"
+ height="35.433067"
+ width="99.212601"
+ id="rect2872"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot2874"
+ transform="translate(255.02722,204.55399)"><flowRegion
+ id="flowRegion2876" /><flowPara
+ id="flowPara2880">Property</flowPara></flowRoot> </g>
+ <g
+ id="g5098"
+ transform="translate(175.94148,45.126049)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="205.84985"
+ height="35.433067"
+ width="99.212601"
+ id="rect5100"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5102"
+ transform="translate(254.32934,203.83604)"><flowRegion
+ id="flowRegion5104" /><flowPara
+ id="flowPara5108">Item</flowPara></flowRoot> </g>
+ <g
+ id="g3740"
+ transform="translate(291.4357,78.274004)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716536"
+ width="102.75591"
+ id="rect3742"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot3744"
+ transform="translate(234.16765,246.96275)"><flowRegion
+ id="flowRegion3746" /><flowPara
+ id="flowPara3750">ValueChangeListener</flowPara></flowRoot> </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path3776"
+ d="M 410.32826,365.0986 371.52155,332.46732"
+ style="fill:none;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ inkscape:connection-start="#g2854" />
+ <flowRoot
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot2485"
+ xml:space="preserve"
+ transform="translate(-0.8858472,0)"><flowRegion
+ id="flowRegion2487"><rect
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ y="238.07646"
+ x="262.85715"
+ height="120"
+ width="184.28572"
+ id="rect2489" /></flowRegion><flowPara
+ id="flowPara2491" /></flowRoot> <g
+ transform="translate(-4.4572759,23.214286)"
+ id="g3178" />
+ <path
+ inkscape:connection-end="#g2870"
+ inkscape:connector-type="polyline"
+ id="path2882"
+ d="m 431.4526,365.0986 0.1426,-45.94968"
+ style="fill:none;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline"
+ inkscape:connection-start="#g2854" />
+ <path
+ inkscape:connection-start="#g2854"
+ inkscape:connection-end="#g3740"
+ inkscape:connector-type="polyline"
+ id="path5048"
+ d="m 459.0809,365.0986 52.37273,-33.5171"
+ style="fill:none;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker44971);display:inline" />
+ <g
+ id="g2854"
+ transform="translate(222.75553,132.03305)">
+ <rect
+ ry="3.7880721"
+ y="233.06555"
+ x="166.12241"
+ height="35.433075"
+ width="85.039375"
+ id="rect2856"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot2858"
+ transform="translate(207.58709,255.55638)"><flowRegion
+ id="flowRegion2860" /><flowPara
+ id="flowPara2864">Field</flowPara></flowRoot> </g>
+ <path
+ inkscape:connection-end="#g2854"
+ inkscape:connection-start="#g2802"
+ inkscape:connector-type="polyline"
+ id="path2868"
+ d="m 431.37248,418.96375 0.0128,-18.43207"
+ style="fill:none;stroke:#f39300;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-mid:none;marker-end:url(#marker52016);display:inline" />
+ <g
+ id="g3752"
+ transform="translate(291.4357,58.754809)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716536"
+ width="102.75591"
+ id="rect3754"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot3756"
+ transform="translate(233.81083,246.99763)"><flowRegion
+ id="flowRegion3758" /><flowPara
+ id="flowPara3762">ValueChangeEvent</flowPara></flowRoot> </g>
+ <g
+ transform="translate(203.72084,210.41373)"
+ id="g2802">
+ <rect
+ ry="3.7880721"
+ y="208.55002"
+ x="172.42705"
+ height="35.93816"
+ width="110.42418"
+ id="rect2804"
+ style="fill:#f39300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ transform="translate(226.79094,230.27406)"
+ id="flowRoot2806"
+ style="font-size:12px;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold Italic"
+ xml:space="preserve"><flowRegion
+ id="flowRegion2808" /><flowPara
+ id="flowPara2812">AbstractField</flowPara></flowRoot> </g>
+ <g
+ id="g5110"
+ transform="translate(176.19402,-15.110183)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="205.84985"
+ height="35.433067"
+ width="99.212601"
+ id="rect5112"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5114"
+ transform="translate(255.50671,204.20613)"><flowRegion
+ id="flowRegion5116" /><flowPara
+ id="flowPara5120">Container</flowPara></flowRoot> </g>
+ <g
+ id="g5146"
+ transform="translate(152.8407,-40.751695)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect5148"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5150"
+ transform="translate(205.92958,247.90652)"><flowRegion
+ id="flowRegion5152" /><flowPara
+ id="flowPara5156">Editor</flowPara></flowRoot> </g>
+ <g
+ id="g5158"
+ transform="translate(152.8407,-60.67148)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect5160"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5162"
+ transform="translate(205.46539,247.16347)"><flowRegion
+ id="flowRegion5164" /><flowPara
+ id="flowPara5168">Viewer</flowPara></flowRoot> </g>
+ <flowRoot
+ transform="translate(31.312673,-134.1482)"
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6644"
+ xml:space="preserve"><flowRegion
+ id="flowRegion6646"><rect
+ style="font-size:16px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:end;line-height:125%;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ y="280.93362"
+ x="202.85715"
+ height="99.581009"
+ width="204.28046"
+ id="rect6648" /></flowRegion><flowPara
+ id="flowPara6650">Data Model</flowPara></flowRoot> <path
+ inkscape:connector-type="polyline"
+ id="path6692"
+ d="M 491.6841,213.79089 L 491.89141,158.02434"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path6694"
+ d="M 502.26376,185.75889 L 481.25647,185.38534"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connection-end="#g5110"
+ inkscape:connection-start="#g6678" />
+ <g
+ id="g6618"
+ transform="translate(319.78215,-86.772082)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect6620"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6622"
+ transform="translate(207.97695,247.32124)"><flowRegion
+ id="flowRegion6624" /><flowPara
+ id="flowPara6628">Ordered</flowPara></flowRoot> </g>
+ <g
+ id="g6666"
+ transform="translate(318.4375,-30.492633)">
+ <rect
+ ry="3.7880721"
+ y="236.25572"
+ x="183.82626"
+ height="17.716536"
+ width="58.037571"
+ id="rect6668"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6670"
+ transform="translate(213.13426,248.56061)"><flowRegion
+ id="flowRegion6672" /><flowPara
+ id="flowPara6676">Hierarchical</flowPara></flowRoot> </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path6664"
+ d="M 587.09005,157.43667 L 551.87006,157.57777"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc"
+ inkscape:connection-end="#g6618"
+ inkscape:connection-start="#g6606" />
+ <g
+ id="g6594"
+ transform="translate(404.82152,-58.425625)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect6596"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6598"
+ transform="translate(206.96566,247.31617)"><flowRegion
+ id="flowRegion6600" /><flowPara
+ id="flowPara6604">Sortable</flowPara></flowRoot> </g>
+ <g
+ id="g6606"
+ transform="translate(404.60844,-87.111921)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect6608"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6610"
+ transform="translate(207.61263,247.53033)"><flowRegion
+ id="flowRegion6612" /><flowPara
+ id="flowPara6616">Indexed</flowPara></flowRoot> </g>
+ <g
+ id="g6678"
+ transform="translate(318.4375,-58.83909)">
+ <rect
+ ry="3.7880721"
+ y="236.25572"
+ x="183.82626"
+ height="17.716536"
+ width="58.037571"
+ id="rect6680"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot6682"
+ transform="translate(212.17928,248.64068)"><flowRegion
+ id="flowRegion6684" /><flowPara
+ id="flowPara6688">Filterable</flowPara></flowRoot> </g>
+ <path
+ inkscape:connection-end="#g6594"
+ inkscape:connector-type="polyline"
+ id="path8412"
+ d="M 654.63021,185.80396 L 636.90943,185.89549"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connection-end="#g6606"
+ inkscape:connector-type="polyline"
+ id="path8414"
+ d="M 654.63021,156.98779 L 636.69635,157.13446"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connection-end="#g6666"
+ inkscape:connector-type="polyline"
+ id="path8416"
+ d="M 570.52478,251.85959 L 540.61753,223.47962"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connection-end="#g6678"
+ inkscape:connection-start="#g8396"
+ inkscape:connector-type="polyline"
+ id="path8418"
+ d="M 591.82037,209.3064 L 554.56632,195.13317"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g8396"
+ transform="translate(374.07349,27.409503)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="205.84985"
+ height="35.433071"
+ width="116.92914"
+ id="rect8398"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text8408"
+ y="203.15674"
+ x="265.04974"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="203.15674"
+ x="265.04974"
+ id="tspan8410"
+ sodipodi:role="line">IndexedContainer</tspan></text>
+ </g>
+ <path
+ inkscape:connection-start="#g8420"
+ inkscape:connection-end="#g8396"
+ inkscape:connector-type="polyline"
+ id="path8430"
+ d="M 638.55893,251.82608 L 638.51007,244.73947"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#marker44971);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
+ <g
+ id="g8420"
+ transform="translate(452.31943,69.929187)">
+ <rect
+ ry="3.7880721"
+ y="181.8969"
+ x="117.26717"
+ height="35.433071"
+ width="138.18898"
+ id="rect8422"
+ style="opacity:1;fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text8424"
+ y="203.15674"
+ x="185.59758"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ xml:space="preserve"><tspan
+ y="203.15674"
+ x="185.59758"
+ id="tspan8426"
+ sodipodi:role="line">HierarchicalContainer</tspan></text>
+ </g>
+ <flowRoot
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ id="flowRoot8724"
+ xml:space="preserve"
+ transform="translate(-0.8858472,0)"><flowRegion
+ id="flowRegion8726"><rect
+ style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ y="752.14441"
+ x="39.286312"
+ height="22.868153"
+ width="29.904507"
+ id="rect8728" /></flowRegion><flowPara
+ id="flowPara8730" /></flowRoot> <path
+ sodipodi:open="true"
+ transform="translate(-55.807094,-1.7674908)"
+ sodipodi:end="6.2827149"
+ sodipodi:start="0"
+ d="M 494.29133,228.54329 A 7.0866146,7.0907812 0 1 1 494.29133,228.53995"
+ sodipodi:ry="7.0907812"
+ sodipodi:rx="7.0866146"
+ sodipodi:cy="228.54329"
+ sodipodi:cx="487.20471"
+ id="path54937"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path5172"
+ d="M 431.5759,202.21978 L 431.47191,227.02295"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSq);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ inkscape:connection-start="#g5110"
+ inkscape:connection-end="#g5098" />
+ <path
+ sodipodi:open="true"
+ transform="translate(-55.612376,55.132734)"
+ sodipodi:end="6.2827149"
+ sodipodi:start="0"
+ d="M 494.27873,228.54329 A 7.0740213,7.0907817 0 1 1 494.27873,228.53995"
+ sodipodi:ry="7.0907817"
+ sodipodi:rx="7.0740213"
+ sodipodi:cy="228.54329"
+ sodipodi:cx="487.20471"
+ id="path54939"
+ style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.12598419;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:2.12598425, 2.12598425;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path6576"
+ d="M 431.47655,262.45601 L 431.57126,283.71586"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:url(#DotSq);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ inkscape:connection-start="#g5098"
+ inkscape:connection-end="#g2870" />
+ <path
+ inkscape:connection-start="#g6618"
+ inkscape:connector-type="polyline"
+ id="path55678"
+ d="M 502.26376,157.92341 L 492.09872,158.02434"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connection-start="#g6666"
+ inkscape:connector-type="polyline"
+ id="path55680"
+ d="M 502.26376,213.86481 L 491.47679,213.58358"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path55688"
+ d="M 587.30314,184.25195 L 576.67322,184.25195 L 576.67322,155.90549"
+ style="fill:none;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path55690"
+ d="M 654.62597,209.0551 L 654.62597,155.90549"
+ style="fill:none;fill-rule:evenodd;stroke:#d9d9cd;stroke-width:2.83464575;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#d9d9cd;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot59412"
+ transform="translate(439.65072,221.68981)"><flowRegion
+ id="flowRegion59414" /><flowPara
+ id="flowPara59418">n</flowPara></flowRoot> <flowRoot
+ xml:space="preserve"
+ style="font-size:12px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#d9d9cd;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot59420"
+ transform="translate(439.65072,278.97199)"><flowRegion
+ id="flowRegion59422" /><flowPara
+ id="flowPara59426">n</flowPara></flowRoot> <g
+ transform="matrix(0.5,0,0,0.5,102.45714,0.7940752)"
+ id="g18053" />
+ <text
+ id="text80346"
+ y="324.81149"
+ x="393.58478"
+ style="font-size:6px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"><tspan
+ id="tspan80354"
+ y="324.81149"
+ x="393.58478"
+ sodipodi:role="line">setValue()</tspan><tspan
+ id="tspan80365"
+ y="332.31149"
+ x="393.58478"
+ sodipodi:role="line">getValue()</tspan></text>
+ <text
+ id="text116490"
+ y="209.0551"
+ x="439.94095"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="209.0551"
+ x="439.94095"
+ id="tspan116492"
+ sodipodi:role="line"
+ style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:FreeSans;-inkscape-font-specification:FreeSans Oblique">addItem()</tspan></text>
+ <text
+ id="text116494"
+ y="269.43359"
+ x="440.29276"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="269.43359"
+ x="440.29276"
+ id="tspan116496"
+ sodipodi:role="line"
+ style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:FreeSans;-inkscape-font-specification:FreeSans Oblique">addItemProperty()</tspan></text>
+ <text
+ id="text5081"
+ y="337.70709"
+ x="523.63373"
+ style="font-size:8px;font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica LT Std;-inkscape-font-specification:Helvetica LT Std Light"
+ xml:space="preserve"
+ sodipodi:linespacing="125%"><tspan
+ y="337.70709"
+ x="523.63373"
+ id="tspan5083"
+ sodipodi:role="line"
+ style="font-size:8px;font-style:oblique;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:FreeSans;-inkscape-font-specification:FreeSans Oblique">valueChange()</tspan></text>
+ <g
+ id="g5146-3"
+ transform="translate(152.8407,19.844568)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect5148-7"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5150-4"
+ transform="translate(205.92958,247.90652)"><flowRegion
+ id="flowRegion5152-5" /><flowPara
+ id="flowPara5156-2">Editor</flowPara></flowRoot> </g>
+ <g
+ id="g5158-5"
+ transform="translate(152.8407,-0.0752115)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect5160-4"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5162-7"
+ transform="translate(205.46539,247.16347)"><flowRegion
+ id="flowRegion5164-4" /><flowPara
+ id="flowPara5168-4">Viewer</flowPara></flowRoot> </g>
+ <g
+ id="g5146-0"
+ transform="translate(152.8407,79.657004)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect5148-78"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5150-6"
+ transform="translate(205.92958,247.90652)"><flowRegion
+ id="flowRegion5152-8" /><flowPara
+ id="flowPara5156-8">Editor</flowPara></flowRoot> </g>
+ <g
+ id="g5158-4"
+ transform="translate(152.8407,59.737224)">
+ <rect
+ ry="3.7880721"
+ y="235.59096"
+ x="182.48161"
+ height="17.716534"
+ width="49.6063"
+ id="rect5160-3"
+ style="fill:#d9d9cd;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <flowRoot
+ xml:space="preserve"
+ style="font-size:9px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Helvetica Rounded LT Std;-inkscape-font-specification:Helvetica Rounded LT Std Bold"
+ id="flowRoot5162-1"
+ transform="translate(205.46539,247.16347)"><flowRegion
+ id="flowRegion5164-49" /><flowPara
+ id="flowPara5168-2">Viewer</flowPara></flowRoot> </g>
+ </g>
+</svg>
|