r1269 - in trunk: . img/icons src/main/java/cc/kune/chat/client src/main/java/cc/kune/client src/main/java/cc/kune/common/client/actions/ui src/main/java/cc/kune/common/client/actions/ui/descrip src/main/java/cc/kune/core/client src/main/java/cc/kune/core/client/resources src/main/java/cc/kune/core/client/sn src/main/java/cc/kune/core/client/sn/actions src/main/java/cc/kune/core/client/sn/actions/conditions src/main/java/cc/kune/core/client/sn/actions/registry src/main/java/cc/kune/core/clien
Author: vjrj_ Date: 2011-03-07 18:08:07 +0100 (Mon, 07 Mar 2011) New Revision: 1269 Added: trunk/img/icons/group-def-new.png trunk/src/main/java/cc/kune/chat/client/StartChatWithThisBuddieAction.java trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPresenter.java trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java trunk/src/main/java/cc/kune/core/client/sn/GroupSNPresenter.java trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java trunk/src/main/java/cc/kune/core/client/sn/UserSNPresenter.java trunk/src/main/java/cc/kune/core/client/sn/actions/AddNewBuddiesAction.java trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityAction.java trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityMenuItem.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersConfActions.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNAdminsMenuItemsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNBottomActionsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNCollabsMenuItemsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNPendingsMenuItemsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNBottomActionsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNConfActions.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java trunk/src/main/java/cc/kune/core/public/images/group-def-icon.png trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java.txt Removed: trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPanel.java trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPresenter.java trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPanel.java trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPresenter.java trunk/src/main/java/cc/kune/core/client/sn/actions/GroupMembersConfActions.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersActionsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNAdminsMenuItemsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNCollabsMenuItemsRegistry.java trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNPendingsMenuItemsRegistry.java trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java trunk/src/main/java/cc/kune/wave/server/WaveStarter.java Modified: trunk/.classpath trunk/.project trunk/img/icons/from-private-to-public.svg trunk/img/icons/person.svg trunk/img/icons/unknown-gen.png trunk/pom.xml trunk/src/main/java/cc/kune/chat/client/ChatParts.java trunk/src/main/java/cc/kune/chat/client/StartChatWithMemberAction.java trunk/src/main/java/cc/kune/chat/client/StartChatWithUserAction.java trunk/src/main/java/cc/kune/client/KuneGinjector.java trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuItemDescriptor.java trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuTitleItemDescriptor.java trunk/src/main/java/cc/kune/core/client/CoreGinModule.java trunk/src/main/java/cc/kune/core/client/CoreParts.java trunk/src/main/java/cc/kune/core/client/resources/CoreMessages.java trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsGroupCondition.java trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsPersonCondition.java trunk/src/main/java/cc/kune/core/client/state/HistoryWrapperDefault.java trunk/src/main/java/cc/kune/core/public/images/group-def-icon.gif trunk/src/main/java/cc/kune/core/public/images/unknown.jpg trunk/src/main/java/cc/kune/core/shared/dto/SocialNetworkDataDTO.java trunk/src/main/java/cc/kune/wave/KuneWave.gwt.xml trunk/src/main/java/cc/kune/wave/client/WaveClientSimpleAuthenticator.java trunk/src/main/java/cc/kune/wave/client/WebClient.java trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml trunk/src/main/java/cc/kune/wave/server/CustomAuthenticationServlet.java trunk/src/main/java/cc/kune/wave/server/CustomUserRegistrationServlet.java trunk/src/main/java/cc/kune/wave/server/CustomWaveClientServlet.java trunk/src/main/java/cc/kune/wave/server/WaveMain.java trunk/src/main/java/org/ourproject/kune/platf/server/i18n/I18nTranslationServiceDefault.java trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java trunk/src/main/java/org/ourproject/kune/platf/server/rpc/UserRPC.java trunk/src/main/java/org/ourproject/kune/rack/RackServletFilter.java trunk/src/main/resources/wave-server.properties trunk/src/test/java/org/ourproject/kune/platf/server/mapper/MapperTest.java Log: SN updated, WIAB integration updated Modified: trunk/.classpath =================================================================== --- trunk/.classpath 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/.classpath 2011-03-07 17:08:07 UTC (rev 1269) @@ -93,7 +93,7 @@ <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar" sourcepath="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/proto-gwt/0.3.1/proto-gwt-0.3.1.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/proto-gwt/0.3.7/proto-gwt-0.3.7.jar"/> <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar" sourcepath="M2_REPO/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/jivesoftware/smack/smack/3.0.4/smack-3.0.4.jar"/> @@ -101,7 +101,7 @@ <classpathentry kind="var" path="M2_REPO/org/jivesoftware/smackx/debugger/smackx-debugger/3.0.4/smackx-debugger-3.0.4.jar"/> <classpathentry kind="var" path="M2_REPO/stax/stax-api/1.0.1/stax-api-1.0.1.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/waveinabox-server-custom/0.3.6/waveinabox-server-custom-0.3.6.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/waveinabox-server-custom/0.3.7/waveinabox-server-custom-0.3.7.jar"/> <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar" sourcepath="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2-sources.jar"/> <classpathentry kind="var" path="M2_REPO/xpp3/xpp3_min/1.1.3.4.O/xpp3_min-1.1.3.4.O.jar"/> <classpathentry kind="var" path="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2.jar" sourcepath="M2_REPO/com/thoughtworks/xstream/xstream/1.2.2/xstream-1.2.2-sources.jar"/> Modified: trunk/.project =================================================================== --- trunk/.project 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/.project 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,48 +1,34 @@ -<?xml version="1.0" encoding="UTF-8"?> <projectDescription> - <name>kune</name> - <comment>kune free/open/libre collaboration platform. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>com.google.gdt.eclipse.core.webAppProjectValidator</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>com.google.gwt.eclipse.core.gwtProjectValidator</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.wst.common.project.facet.core.builder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.wst.validation.validationbuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.wst.common.project.facet.core.nature</nature> - <nature>org.eclipse.jdt.core.javanature</nature> - <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> - <nature>org.eclipse.jem.workbench.JavaEMFNature</nature> - <nature>org.eclipse.ajdt.ui.ajnature</nature> - <nature>com.google.gwt.eclipse.core.gwtNature</nature> - <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature> - </natures> -</projectDescription> + <name>kune</name> + <comment>kune free/open/libre collaboration platform. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment> + <projects/> + <buildSpec> + <buildCommand> + <name>com.google.gdt.eclipse.core.webAppProjectValidator</name> + </buildCommand> + <buildCommand> + <name>com.google.gwt.eclipse.core.gwtProjectValidator</name> + </buildCommand> + <buildCommand> + <name>org.eclipse.wst.common.project.facet.core.builder</name> + </buildCommand> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + </buildCommand> + <buildCommand> + <name>org.eclipse.wst.validation.validationbuilder</name> + </buildCommand> + <buildCommand> + <name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.wst.common.project.facet.core.nature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> + <nature>org.eclipse.jem.workbench.JavaEMFNature</nature> + <nature>org.eclipse.ajdt.ui.ajnature</nature> + <nature>com.google.gwt.eclipse.core.gwtNature</nature> + <nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature> + </natures> +</projectDescription> \ No newline at end of file Modified: trunk/img/icons/from-private-to-public.svg =================================================================== --- trunk/img/icons/from-private-to-public.svg 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/img/icons/from-private-to-public.svg 2011-03-07 17:08:07 UTC (rev 1269) @@ -7,6 +7,7 @@ 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:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="210mm" @@ -24,16 +25,16 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="3.1190476" - inkscape:cx="74.064362" + inkscape:zoom="1" + inkscape:cx="-59.935638" inkscape:cy="1024" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1280" - inkscape:window-height="747" + inkscape:window-height="975" inkscape:window-x="0" - inkscape:window-y="1024" + inkscape:window-y="21" inkscape:window-maximized="1" showguides="true" inkscape:guide-bbox="true" @@ -509,5 +510,122 @@ inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/src/main/java/cc/kune/wspace/client/resources/homeSpaceEnabled.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" /> + <g + id="g32861" + transform="translate(-41,-38.175573)" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/grop-def-new.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + inkscape:transform-center-x="2.1800737" + transform="matrix(4.71003,1.6779794,-1.6779794,4.71003,-33.10757,48.018455)" + inkscape:transform-center-y="-0.21689042" + d="m 35,17.362183 -4.755283,-3.454915 1.816357,-5.5901703 5.877852,-10e-8 1.816357,5.5901694 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="2.1991149" + sodipodi:arg1="1.5707963" + sodipodi:r2="4.045085" + sodipodi:r1="5" + sodipodi:cy="12.362183" + sodipodi:cx="35" + sodipodi:sides="5" + id="path32845" + style="color:#000000;fill:none;stroke:#28220b;stroke-width:1;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" + sodipodi:type="star" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/from-private-to-public.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#800000;stroke-width:1.48864591;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" + id="path32847" + sodipodi:cx="90" + sodipodi:cy="32.362183" + sodipodi:rx="20" + sodipodi:ry="10" + d="m 110,32.362183 c 0,5.522847 -8.95431,10 -20,10 -11.045695,0 -20,-4.477153 -20,-10 0,-5.522848 8.954305,-10 20,-10 11.04569,0 20,4.477152 20,10 z" + transform="matrix(2.375,0,0,4.7499998,-102.75,10.817397)" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/src/main/java/cc/kune/wspace/client/resources/groupSpaceEnabled.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#dd8a3d;fill-opacity:1;stroke:#dd8a3d;stroke-width:0.5;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" + id="path32849" + sodipodi:cx="15" + sodipodi:cy="16.362183" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 16,16.362183 c 0,0.552284 -0.447715,1 -1,1 -0.552285,0 -1,-0.447716 -1,-1 0,-0.552285 0.447715,-1 1,-1 0.552285,0 1,0.447715 1,1 z" + transform="matrix(9.4200602,3.355959,-3.355959,9.4200602,45.524372,-53.39817)" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/from-private-to-public.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + transform="matrix(9.4200602,3.355959,-3.355959,9.4200602,18.680548,-64.20388)" + d="m 16,16.362183 c 0,0.552284 -0.447715,1 -1,1 -0.552285,0 -1,-0.447716 -1,-1 0,-0.552285 0.447715,-1 1,-1 0.552285,0 1,0.447715 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="16.362183" + sodipodi:cx="15" + id="path32851" + style="color:#000000;fill:#69312f;fill-opacity:1;stroke:#69312f;stroke-width:0.5;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" + sodipodi:type="arc" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/from-private-to-public.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#28220b;fill-opacity:1;stroke:#28220b;stroke-width:0.5;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" + id="path32853" + sodipodi:cx="15" + sodipodi:cy="16.362183" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 16,16.362183 c 0,0.552284 -0.447715,1 -1,1 -0.552285,0 -1,-0.447716 -1,-1 0,-0.552285 0.447715,-1 1,-1 0.552285,0 1,0.447715 1,1 z" + transform="matrix(9.4200602,3.355959,-3.355959,9.4200602,43.935022,-24.026857)" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/from-private-to-public.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + transform="matrix(9.4200602,3.355959,-3.355959,9.4200602,16.336633,-16.494463)" + d="m 16,16.362183 c 0,0.552284 -0.447715,1 -1,1 -0.552285,0 -1,-0.447716 -1,-1 0,-0.552285 0.447715,-1 1,-1 0.552285,0 1,0.447715 1,1 z" + sodipodi:ry="1" + sodipodi:rx="1" + sodipodi:cy="16.362183" + sodipodi:cx="15" + id="path32855" + style="color:#000000;fill:#cc6633;fill-opacity:1;stroke:#cc6633;stroke-width:0.5;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" + sodipodi:type="arc" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/from-private-to-public.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + sodipodi:type="arc" + style="color:#000000;fill:#ffdb6b;fill-opacity:1;stroke:#dd8a3d;stroke-width:0.1;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" + id="path32857" + sodipodi:cx="15" + sodipodi:cy="16.362183" + sodipodi:rx="1" + sodipodi:ry="1" + d="m 16,16.362183 c 0,0.552284 -0.447715,1 -1,1 -0.552285,0 -1,-0.447716 -1,-1 0,-0.552285 0.447715,-1 1,-1 0.552285,0 1,0.447715 1,1 z" + transform="matrix(11.211448,3.9941526,-3.9941526,11.211448,-16.590722,-79.68006)" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/from-private-to-public.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + </g> + <use + x="0" + y="0" + xlink:href="#g32861" + id="use32889" + transform="matrix(0.22,0,0,0.22,167.6,120.5625)" + width="744.09448" + height="1052.3622" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/group-def-new.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> </g> </svg> Added: trunk/img/icons/group-def-new.png =================================================================== (Binary files differ) Property changes on: trunk/img/icons/group-def-new.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/img/icons/person.svg =================================================================== --- trunk/img/icons/person.svg 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/img/icons/person.svg 2011-03-07 17:08:07 UTC (rev 1269) @@ -43,8 +43,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1" - inkscape:cx="578.54963" - inkscape:cy="375.39768" + inkscape:cx="1018.0008" + inkscape:cy="187.75619" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -737,39 +737,7 @@ y="428.36218" x="11" id="image3279" - xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a -HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy -MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA -AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA -AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 -ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm -p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA -AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx -BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK -U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 -uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii -gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 -t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 -bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi -SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v -A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig -AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT -/GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx -XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo -3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 -JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 -5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g -ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT -gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC -nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy -GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 -by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx -xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA -ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT -3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka -5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p -jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= -" + xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iii gAooooAKY7rGpZ2Cj1JxWZqmqfZAYoQDLjknoo9ff6Vzsksksu+RmdiTgk5IH9KuMG9SHNJ2OxS7 t5DtSeJm9A4JqeuAkQFeeTn86bZ67d6VMAXMttnDRk5x9Cen8v5hunbYFPueg0VXtbmK8to7iFw0 bjKkVYrMsKKKKACiiigAooooASmSyLFE8jfdVST9AKkqjqr+Xpk59QB+ZA/rQtxM5WSVppXlc5Zi SeeB7e1M5ySSDx+VAIx1PToKDyTxj6iuowGuODxkkevSsm+HBHBPt2rWkPB4zwayb08Ec/lQxo3v A98xe50+RjgASxg9hnDfqR+tdrXmXhCUp4ngUDiRXQ8+ik/j0Fem1zzWprHYKKKKkoKKKKACiiig AqnqieZps6+ilvy5/pVymSIJI2RujAgj60LRiZw579h/OgnoScDHAFDApIyMCHUkN7GkJGB06+vT /GuowGSnCEDIH0rFvXySMkjPY9K0rqXg9ck81hXMm44BwPek2M2fBsYl8SRt/wA80duvTIx/WvSx XDeAbbMt5dEYAVY1Prnk/wAh+ddzWE3qax2CiiipKCiiigAooooAKKKKAOL8QQGx1IygHy58sMDo 3cf1/Gsh7sADnt0B6V3er2UF9p8sNwwRfvCQn7hHQ15XK7xyFCc4OMjoa3hLQyktSzc3OSew+tZ5 JcjHJz6fp70E5JyMn3NdH4MsbS81NpZ5EMkADRxHALH+97gfzIP1G7K4Ja2Ox8OaadL0aGCQYmb9 5J/vHt+AwPwrXNFJWD1NRaKKKACiiigAoo7VSvr9LKIMRuduFUd6EribLbMEUsxAA6knisu71y3g ysX71/Y4X8+/4ZrBub2e7YtMxIB4UHAH4f1qD19cdMVtGn3Ic+xLfXlxfZEj/KOQo+6P8awbu0yT gcVs4Bzkkk+9RtGrk9CMHv1rSySsiLtnLNAwONpwT370+CGVZQ6MyuDlShIII7gjp9a3mtFJJwMC nR2ip2ANKwGxpPiK4WNYr8GUY/1q8MPqOn+e9dJb3cF2m6CVXHcA4I+o6iuLVAFHtTGDKwdGZWBy GU4I+hFQ6aexam+p6BRXH6X4meKZbfUG3RkgLMeCp/2vUe/866+smmty077C0UUUhiZwMnpXHX10 by6eTtnCj2H8v/r10uqS+Tp0zDqV2/mcVyJOBwCTjsela0l1M5voB4AGMnPbvQAc4GRkY5/zxSYx xwCBSnggDk/yrYzADgdScdh0oPAPTpQc4POKOAcZJP8AKgAI5PA6dqTqAegzwAOv+NL256+nrRwA ACSfYUABxk8frTWAK46nH+fpTiMEdc5/KkY/KcZJx2PSgDKvkwDwM57d66zwhqZvNOa1kJMtsQuT 3U9PywR+ArlrwYUjjIHNS+ErkweJI4x92ZGRvbjI/UD86zmrouL1PSaKKKwNTK14/wCgKPWQA/ka 5odvpRRW9LYxnuIOh/GjFFFaEinv9f6U0nCgiiigBcdKF+YjNFFAAOWx7Udh9KKKAM27+4341U0p jHr9gV4JuIx+bYooqHsyo7nrFFFFc5sf/9k= " height="100" width="100" /> <g @@ -1602,8 +1570,8 @@ sodipodi:sides="3" sodipodi:cx="595" sodipodi:cy="701.36218" - sodipodi:r1="41.012193" - sodipodi:r2="20.506097" + sodipodi:r1="41.012192" + sodipodi:r2="20.506098" sodipodi:arg1="1.5464109" sodipodi:arg2="2.5936085" inkscape:flatsided="true" @@ -1611,7 +1579,8 @@ inkscape:randomized="0" d="m 596,742.36218 -37.00704,-60.63397 71.01408,-1.73205 z" inkscape:transform-center-x="0.5" - inkscape:transform-center-y="9.8169873" /> + inkscape:transform-center-y="9.8169873" + transform="translate(554,-32)" /> <g inkscape:export-ydpi="90" inkscape:export-xdpi="90" @@ -1786,5 +1755,853 @@ id="path4525" inkscape:connector-curvature="0" /> </g> + <g + inkscape:export-ydpi="90" + inkscape:export-xdpi="90" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + id="g32891" + transform="translate(350,0)"> + <path + inkscape:connector-curvature="0" + id="path32893" + d="m 552.51419,862.96792 c 0.0102,-5.30143 1.60593,-10.6248 3.78149,-15.43929 4.32123,-8.8444 14.216,-12.22658 22.33805,-16.5859 4.68059,-1.37584 9.07114,-5.52844 4.7426,-10.02046 -6.39489,-12.22902 -8.7729,-27.8219 -2.10653,-40.43961 3.65467,-7.37162 12.38903,-12.01132 20.49326,-9.67176 7.28637,1.44287 13.14475,7.15895 15.34035,14.18101 4.51436,13.20733 1.2153,28.11579 -6.53662,39.43979 -1.32968,3.95225 5.89572,5.24121 8.44,7.53545 5.40393,3.00388 11.60589,4.85759 15.86832,9.59775 5.12248,5.30858 9.79259,12.48585 8.66416,20.18284 -2.66598,2.93451 -8.40865,1.41927 -12.30136,2.20861 -23.95296,0.89934 -47.95935,1.13829 -71.90915,0.0384 -2.25654,-0.26203 -4.73152,-0.0739 -6.81457,-1.02681 z" + style="fill:#dce2e8" /> + <path + inkscape:connector-curvature="0" + id="path32895" + d="m 552.86191,863.98091 c -0.3001,-10.49202 6.03728,-20.13978 14.66257,-25.69496 5.51969,-4.0779 12.40955,-5.84192 17.80822,-10.06232 2.84965,-4.01312 -2.37245,-8.04948 -3.34535,-11.96125 -5.17334,-11.94737 -5.914,-27.08139 2.25625,-37.90341 5.89413,-8.20878 18.85242,-9.23957 26.20711,-2.50691 7.92198,7.8665 8.99588,20.23178 7.07876,30.70563 -1.07732,6.52092 -4.2598,12.37274 -7.80043,17.84376 -0.63942,4.72644 5.99701,6.29571 9.15658,8.71794 5.67067,3.14875 12.42699,4.70876 16.62391,10.05061 4.55195,5.13638 7.7383,11.97169 7.26449,18.94209 -3.42877,3.13676 -9.17326,1.57453 -13.56039,2.19728 -25.14284,0.17847 -50.29403,0.26439 -75.43326,-0.23791 l -0.91846,-0.0906 0,0 z" + style="fill:#d4dbe2" /> + <path + inkscape:connector-curvature="0" + id="path32897" + d="m 597.40625,773.21875 c -2.08437,0.0218 -4.06879,0.82425 -5.78008,1.97408 -1.79052,1.15879 -3.40619,2.56842 -5.10341,3.85771 -2.07314,1.7046 -4.13064,3.52243 -5.54313,5.83208 -1.4246,2.63374 -2.01431,5.62903 -2.3241,8.58199 -0.33035,2.74853 -0.32823,5.52241 -0.43678,8.28539 -0.005,3.82444 -0.15351,7.64782 -0.13884,11.4717 0.0859,5.10181 0.52206,10.19115 0.63884,15.29078 -0.0171,1.6471 0.0169,3.30988 -0.14185,4.94514 -0.24522,0.76103 -0.56607,2.26102 0.57466,2.38613 1.06002,-0.019 1.23511,-1.39535 1.15554,-2.21222 0.22952,-1.68105 1.32505,-3.13394 2.6304,-4.16278 0.85251,-0.49875 1.97306,-0.491 2.84375,-0.0625 1.32761,1.06993 2.37232,2.46316 3.74962,3.48406 1.78793,1.52488 3.51798,3.13357 5.27748,4.67984 0.9866,0.7019 2.27026,0.71795 3.42985,0.66919 1.06796,-0.16832 2.13534,-0.35487 3.21952,-0.36775 0.89406,0.16109 2.32802,-0.70942 1.38603,-1.62159 -0.8042,-0.70337 -1.88743,-0.23431 -2.83365,-0.39781 -1.84267,-0.0672 -3.62098,-1.11476 -4.59764,-2.66893 -1.00336,-1.75997 -1.59857,-3.7098 -2.42704,-5.55243 -1.66116,-3.95349 -2.91032,-8.07322 -3.85039,-12.25354 -0.4782,-2.16238 -0.94931,-4.33361 -1.04039,-6.55414 -0.44284,-5.17654 -0.0164,-10.36675 0.21786,-15.5419 0.43161,-2.80874 0.93864,-5.71235 2.52365,-8.13079 1.40946,-2.34955 3.21165,-4.47033 5.33501,-6.20561 1.34968,-1.17749 2.79007,-2.24805 4.17259,-3.38235 0.65717,-0.78426 0.12822,-2.21425 -0.93003,-2.28177 -0.66037,-0.14562 -1.33846,-0.0725 -2.00747,-0.062 z" + style="fill:#a9b6c7;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32899" + d="m 595.0625,771.09375 c -3.49998,0.58518 -6.82593,1.96099 -9.87152,3.75664 -1.46593,0.9392 -2.89772,1.9504 -4.10149,3.21637 -2.26374,2.18699 -4.05772,4.84626 -5.3102,7.72931 -1.72442,4.45631 -3.18147,9.00923 -4.54622,13.58674 -1.17863,3.81878 -2.29249,7.66048 -3.58633,11.44147 -0.98068,2.31904 -2.25569,4.50522 -3.14674,6.86322 -0.0717,0.83217 -0.52076,1.71408 -0.15625,2.53125 0.34391,0.63556 0.61295,-0.72716 0.90409,-1.00196 0.70785,-1.17012 1.67865,-2.15857 2.50216,-3.24804 2.02564,-2.4413 4.09249,-4.85803 6.34375,-7.09375 0.89228,-0.67775 1.93115,-1.14621 3,-1.46875 0.9592,-0.27381 2.04572,-0.0942 2.7855,0.6034 0.79827,0.68845 1.05228,1.81659 0.92648,2.82928 -0.069,2.24614 -0.62186,4.43634 -0.94161,6.65146 -0.37717,1.50747 -0.59603,3.04826 -0.89537,4.57211 -0.0187,0.88489 0.803,1.89802 1.75,1.65625 1.2052,-0.41761 1.68611,-1.71186 2.01212,-2.83444 1.08092,-3.47552 1.16417,-7.147 1.31178,-10.75426 0.25256,-3.87574 0.43014,-7.76125 0.90064,-11.61815 0.52097,-3.65166 1.24649,-7.28074 2.27546,-10.8244 0.50779,-1.47275 1.28525,-2.82251 2.13241,-4.12255 1.04514,-1.54481 2.4259,-2.97532 4.21134,-3.62745 3.77193,-1.53211 7.85601,-2.03477 11.71875,-3.28125 0.85611,-0.41385 1.66942,-1.37746 1.34375,-2.375 -0.36579,-1.12201 -1.57323,-1.602 -2.61278,-1.89568 -2.30278,-0.66163 -4.68142,-1.03339 -7.06477,-1.2496 -0.62852,-0.0212 -1.25644,-0.11142 -1.88495,-0.0422 z" + style="fill:#b6c5d8;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32901" + d="m 553.31861,862.68392 c 2.03973,-6.75845 2.62673,-14.59993 8.28246,-19.57905 6.86653,-6.55449 16.49277,-8.81781 23.9521,-14.46458 3.64474,-4.45932 -2.81051,-9.08083 -3.56202,-13.60484 -4.14323,-11.16786 -4.98166,-24.68811 1.49566,-35.15189 5.68463,-8.73332 19.85553,-10.9347 27.19403,-3.0481 8.41394,8.94249 8.77611,22.65299 5.27347,33.81426 -1.49442,5.581 -4.99844,10.28747 -7.0924,15.6006 2.76177,3.52771 7.14927,5.48724 10.93492,7.7964 6.119,3.22073 13.58338,5.02515 17.48348,11.27477 2.96987,4.63969 4.42192,10.08731 5.80917,15.35231 -1.50165,4.96315 -8.81816,2.91096 -12.85889,3.69351 -22.80335,0.12179 -45.61168,0.15756 -68.41429,-0.11428 -2.31171,-0.50334 -7.53241,0.74503 -8.49769,-1.56911 z" + style="fill:#c9cfd7" /> + <path + inkscape:connector-curvature="0" + id="path32903" + d="m 554.235,862.68169 c 2.05635,-7.41778 3.349,-16.08468 10.1767,-20.8097 6.61828,-5.16685 15.1606,-7.20405 21.59504,-12.59203 3.54453,-4.88336 -2.47561,-9.88767 -3.35341,-14.75239 -3.47406,-10.8555 -4.1294,-23.33186 0.8597,-33.82801 1.72632,-3.59701 5.23944,-6.62494 9.42916,-6.35645 4.19219,-1.15696 8.52724,-4.11292 12.93873,-1.76941 7.46152,3.81566 10.06429,12.7832 10.99601,20.5469 1.16372,10.51462 -1.47428,21.3696 -7.47449,30.09882 -3.05921,4.5826 3.82783,7.04871 6.59279,9.43949 4.45298,3.31782 9.92768,4.58376 14.70417,7.25683 7.68513,4.50047 10.74405,13.62794 11.74428,22.00374 -2.9167,3.42132 -8.87906,1.6959 -13.0442,2.37973 -23.01389,0.17734 -46.03587,0.29901 -69.04708,-0.12448 -1.47707,-0.46732 -5.78821,0.53078 -6.1174,-1.49304 z" + style="fill:#b6c5d8" /> + <path + inkscape:connector-curvature="0" + id="path32905" + d="m 605.41576,831.51882 c -6.51092,-0.17414 1.89613,-8.32488 2.10973,-2.13677 0.25514,1.05824 -0.90992,3.45218 -2.10973,2.13677 z m -9.19222,-2.58713 c -5.03005,-3.26087 3.80688,-5.55701 3.71501,-0.9855 -0.33166,1.64802 -2.69765,2.53253 -3.71501,0.9855 z m 8.27957,-8.19213 c 5.41236,-4.28675 4.18648,-12.49507 9.14189,-17.11237 0.29556,5.93898 -0.81537,13.05465 -6.06482,16.64412 -0.94557,0.45813 -2.03685,0.66185 -3.07707,0.46825 z" + style="fill:#89929e" /> + <path + inkscape:connector-curvature="0" + id="path32907" + d="m 555.48691,863.63394 c -0.70857,-2.12774 2.22704,-4.3804 1.34135,-0.66819 0.10193,0.98814 -0.65203,2.27111 -1.34135,0.66819 z m 37.375,-0.1401 c 1.38595,-2.43696 5.53173,0.89636 1.42887,0.91541 -0.49532,-0.004 -1.42499,-0.23332 -1.42887,-0.91541 z m 7.69692,-0.45528 c -1.76626,-3.1746 2.23873,-3.26451 1.11193,0.0649 -0.32817,2.3234 -0.6929,0.92535 -1.11193,-0.0649 z m 26.80308,-0.60687 c -0.14118,-3.37799 -6.35613,-0.78227 -3.14715,-4.41577 3.46144,-3.84128 -0.91256,-6.50536 0.32867,-10.70489 -1.35343,-4.87174 -4.44598,3.58742 -6.3126,-0.95498 -2.28645,-0.76047 -6.14616,-2.25962 -7.84378,-1.85811 1.7928,4.16671 -5.07612,3.88297 -4.6571,8.23859 -2.87822,4.77401 -4.21355,-5.23107 0.41677,-4.75641 3.01773,-1.66128 2.63528,-6.07232 -1.10546,-3.24125 -4.1035,2.38594 -8.10134,0.13188 -10.98005,-2.65973 -1.57462,1.027 -7.19053,5.94236 -6.22979,1.16697 3.10847,-2.66186 -0.58671,-8.92294 -4.2926,-8.18935 -5.10673,-0.52325 2.44631,-4.85414 3.57641,-6.66771 1.85925,-4.36472 -3.17296,-7.83742 -3.70804,-12.04941 -1.26507,-5.08051 -2.83005,-10.57026 -1.53095,-15.77259 2.64643,-1.80932 -6.03903,-6.34583 -0.12744,-6.57829 2.97426,2.18718 10.86096,-0.73904 8.66403,-4.74784 1.43269,-4.1299 6.02584,3.62463 2.18105,5.45085 -2.59742,0.10573 -7.4936,3.34663 -3.62767,5.54395 1.64345,-0.82217 6.49317,-5.71297 6.67294,-2.49044 -2.78532,3.31115 -8.67094,4.59991 -5.95043,10.09851 -0.14706,1.93717 2.22289,5.8417 2.38345,1.69036 -0.29174,-2.60942 -0.27466,-9.86038 3.64824,-6.05741 -1.55047,2.76367 1.65839,4.017 1.46611,0.70751 1.23126,-3.60319 4.16329,-6.90216 1.96148,-10.6292 1.08569,-3.44275 2.47527,-8.92278 -1.1456,-10.9983 -0.27587,-2.38485 4.39556,-5.73004 -0.72382,-6.12506 -5.30946,-0.90828 1.67648,-3.69288 4.04177,-2.6646 4.32549,0.22232 9.16923,1.37034 11.4584,5.44637 6.2849,9.7073 5.68438,22.38166 2.17074,32.98508 -0.92944,4.64278 -5.22217,8.12432 -5.20477,12.92114 1.20847,6.56432 8.01624,9.99242 13.78201,11.95844 5.17953,1.02044 10.13826,3.62424 13.03186,8.19359 3.20397,4.79647 5.21645,10.49318 5.73671,16.22196 -2.35585,3.8145 -7.90047,3.87439 -11.89521,3.17059 -1.22451,-0.32543 -2.60284,-0.92802 -3.03818,-2.23257 z m -6.09078,-20.1003 c -1.41893,-3.47946 -9.20211,-2.51084 -5.13746,1.1248 1.04916,0.55257 8.14925,1.55777 5.13746,-1.1248 z m -35.40922,-40.45872 c -2.16266,-4.30335 -2.56624,5.59099 0,0 z m -10.77214,57.4647 c 0.9739,-2.58634 6.2446,-4.23216 3.35785,-0.21672 -0.93252,2.57294 -7.05087,4.43368 -3.35785,0.21672 z m 15.26777,1.08726 c -0.46155,-3.123 5.92769,-1.79651 2.3333,0.70108 -0.7844,0.59532 -1.93502,0.11193 -2.3333,-0.70108 z m 17.19822,0.36758 c -1.40203,-3.70988 5.69463,-2.0316 1.50018,0.56139 l -0.7246,-0.0276 -0.77558,-0.53379 z m -46.69385,-2.34909 c 0.2511,-3.17228 6.70537,-7.64119 4.5997,-1.5241 -0.30291,1.59959 -3.88314,3.82735 -4.5997,1.5241 z m 56,-0.51143 c 2.51293,-5.65641 2.40656,5.5417 0,0 z m -47.8,-2.7 c -4.0511,-2.74409 2.86178,-11.29262 3.00074,-4.49156 -2.27342,1.19476 -2.94972,4.14273 0.2778,3.98531 0.44919,2.1979 -2.50337,1.86609 -3.27854,0.50625 z m 17.04379,-0.05 c 1.31653,-2.24916 8.58375,-2.15975 3.4328,0.33832 -0.75747,0.55533 -3.95209,1.81288 -3.4328,-0.33832 z m 28.41342,-2.29909 c 1.98887,-3.91758 6.85421,2.62004 1.31167,1.52967 -0.84991,0.0565 -1.92843,-0.52139 -1.31167,-1.52967 z m -56.65721,-0.39189 c 1.68789,-4.90927 2.99691,2.75221 0.0789,0.36537 l -0.0789,-0.36537 z m 16.64757,-4.24293 c -1.89148,-2.61234 0.84049,-5.75092 1.68838,-1.54504 0.84852,1.72586 -0.70234,5.1602 -1.68838,1.54504 z m 4.5919,-1.82793 c 1.60255,-1.85967 3.66348,-1.43607 5.26053,-2.98816 3.96262,1.46685 -2.62956,3.48646 -3.72862,4.9303 -1.99518,0.50428 -2.92151,-0.26884 -1.53191,-1.94214 z m -9.23947,-3.57149 c 0.59993,-5.93389 4.17587,2.63959 0.61172,2.37949 -0.52277,-0.66971 -0.58181,-1.56896 -0.61172,-2.37949 z m -5.42997,0.69664 c -0.36608,-3.22691 5.22742,-3.96176 2.51439,-0.12486 -0.51631,1.26584 -1.79625,1.28548 -2.51439,0.12486 z m 16.42997,-54.05429 c -0.30675,-2.8402 2.78573,-3.62344 2.3713,-0.3321 1.77753,2.89278 -2.53827,3.01913 -2.3713,0.3321 z m 7,-4.85902 c -0.4203,-5.12456 8.43626,-1.94337 4.35831,0.72111 -1.36922,0.0212 -3.34407,0.40232 -4.35831,-0.72111 z m -1,-5.82423 c 0.17102,-4.09108 9.38834,-5.68544 7.35975,-0.21811 -2.21937,0.24293 -4.55297,-2.11058 -6.7961,0.31894 l -0.41224,0.0536 -0.15141,-0.1544 0,0 z" + style="fill:#b4c3d5" /> + <path + inkscape:connector-curvature="0" + id="path32909" + d="m 628.86191,861.63169 c -0.6243,-3.55935 -2.69727,-6.3569 -0.72148,-9.98987 0.12528,-5.45244 -2.79115,-10.65923 -7.09669,-13.89447 -1.2068,-2.85452 5.32777,0.70573 6.92377,1.01004 7.6726,3.41307 13.86355,11.22205 14.0998,19.78329 0.20205,5.97005 -6.54891,6.42322 -10.9269,5.80556 -1.73227,0.15131 -2.58324,-1.0909 -2.2785,-2.71455 z m -32.0895,-20.80784 c -4.43403,-1.14416 -6.64242,-4.93813 -9.61832,-8.11599 -5.8032,-0.96373 3.57616,-5.23189 -0.12424,-8.64226 -1.28875,-3.82859 -5.19745,-7.73842 -3.91246,-11.88366 3.57632,0.77406 7.98145,4.56157 11.43042,0.4736 4.54424,-4.37751 7.17602,-10.57138 8.26123,-16.71192 0.40261,-6.44762 0.58793,-13.17942 -1.38634,-19.39442 -3.68525,-5.04182 5.4099,-3.08901 7.46282,-1.22179 7.18838,5.3533 8.70986,15.22614 8.49736,23.6257 -0.24925,8.4967 -3.14336,16.73146 -7.72751,23.84074 -2.88991,4.70712 3.78023,7.4172 6.17011,10.48571 2.37199,1.75978 2.7988,3.59039 -0.47087,3.94333 -4.93227,3.54041 -11.38158,5.84263 -17.44005,4.36937 l -0.65495,-0.33776 -0.48717,-0.43065 -3e-5,0 z" + style="fill:#b3bcc9" /> + <path + inkscape:connector-curvature="0" + id="path32911" + d="m 629.67696,857.68169 c 0.69544,-5.83229 -1.1934,-11.42869 -3.06233,-16.84619 1.70492,-4.06189 7.7076,2.15936 9.08169,4.7283 3.47472,5.23289 5.9898,11.23822 6.74935,17.4968 -2.74907,2.48603 -8.71268,1.53936 -12.25687,0.52734 -1.14099,-1.73296 -0.47804,-3.96643 -0.51184,-5.90625 z m -35.07897,-19.01192 c -4.35373,-1.9881 -8.73775,-7.05736 -6.26711,-11.96771 0.37899,-3.87987 -6.19721,-8.74866 -2.61552,-11.649 3.81737,-0.0455 7.92323,-0.57969 10.70088,-3.51648 7.53861,-7.6238 9.37318,-19.29758 8.11009,-29.5788 -0.29347,-2.73658 -3.48318,-10.05061 2.13834,-6.90166 5.59048,2.86145 9.3559,8.5583 9.95363,14.79053 1.45238,11.54814 -0.99935,23.83469 -7.78522,33.40876 -3.2246,5.24149 5.70344,6.58552 5.5499,11.37054 -1.14464,5.117 -7.75884,5.97682 -12.15638,5.8855 -2.62827,-0.12443 -5.23793,-0.7377 -7.62861,-1.84168 z" + style="fill:#a9b6c7" /> + <path + inkscape:connector-curvature="0" + id="path32913" + d="m 631.86191,856.01273 c 0.17627,-4.74944 -0.35601,-9.57132 -2.75943,-13.74195 1.4975,-4.03011 6.82738,2.83782 8.07858,5.41566 2.90201,4.84584 4.29026,10.45516 5.38214,15.90906 -3.35146,1.42092 -11.5911,2.28284 -10.66459,-3.67955 -0.043,-1.30058 -0.0346,-2.60214 -0.0367,-3.90322 z m -32,-17.72887 c -5.84776,-1.14965 -11.42672,-6.22518 -11.15451,-12.52353 -1.5003,-2.03434 -5.71528,-8.53816 -0.0642,-7.68024 6.73246,0.44741 11.31314,-5.91275 13.97222,-11.28778 4.52892,-9.55307 5.82631,-20.85993 2.53341,-31.00041 2.18117,-2.95131 6.79462,3.62386 8.51281,5.81939 4.3355,6.99236 3.55623,15.74508 2.3456,23.52395 -1.04534,6.26492 -3.43738,12.23617 -6.89396,17.55368 -4.11636,5.37273 4.86346,7.17375 5.40003,11.35344 -3.34598,2.78013 -7.84307,4.85802 -12.30072,4.56282 -0.78868,-0.0649 -1.57191,-0.18321 -2.35071,-0.32132 z" + style="fill:#a5aeba" /> + <path + inkscape:connector-curvature="0" + id="path32915" + d="m 634.44264,862.18169 c -1.18835,-6.44151 -0.7153,-13.29528 -3.22346,-19.40763 5.2155,1.71368 7.21913,7.68437 8.61488,12.50189 0.46756,3.74753 5.9571,10.77397 -1.54689,9.15113 -1.59711,0.0659 -3.7451,-0.21664 -3.84453,-2.24539 z M 597.36191,836.4722 c -5.21371,-2.6559 -8.38811,-8.12562 -9.45075,-13.73768 -3.02381,-5.26702 5.32539,-2.26568 7.46203,-5.22634 8.49017,-5.8936 12.46598,-16.48626 13.51852,-26.43011 1.08258,-4.83991 -1.47198,-10.13976 -0.95483,-14.48335 7.03021,4.3261 9.10897,13.3759 8.64448,21.14239 -0.4724,9.88319 -4.21327,19.33825 -9.42908,27.6489 0.19598,3.60522 8.59405,7.29794 2.21847,10.91971 -3.64557,2.02664 -8.25272,1.70657 -12.00884,0.16648 z" + style="fill:#99a5b4" /> + <path + inkscape:connector-curvature="0" + id="path32917" + d="m 597.625,771.4375 c -3.21749,0.80995 -6.35889,1.89093 -9.49855,2.95674 -0.97154,0.37142 -1.85289,0.9729 -2.5952,1.69951 -0.85286,0.75372 -1.5183,1.68678 -2.24295,2.5579 -1.43359,1.82026 -2.70936,3.75542 -4.06955,5.6296 -0.88196,1.49498 -1.70097,3.03188 -2.28734,4.66945 -0.773,1.87386 -1.3796,3.81126 -2.03693,5.7276 -1.48856,4.58577 -2.86664,9.20755 -4.15527,13.85304 -0.38084,1.5389 -0.8175,3.06718 -1.11421,4.62491 -0.0983,1.32482 0.42765,2.57219 0.8125,3.8125 0.65443,1.89642 1.24797,3.81318 1.875,5.71875 0.4387,1.03708 1.53192,1.69185 2.625,1.8125 1.24203,-0.0193 2.52075,0.0375 3.71875,-0.34375 1.02063,-0.39402 1.60505,-1.36074 1.86562,-2.3781 0.73273,-2.56005 1.01952,-5.21766 1.50049,-7.83083 0.4005,-2.37627 0.77571,-4.75672 1.16514,-7.13482 0.60941,-2.21748 1.28797,-4.41783 2.03973,-6.59038 0.78279,-2.02938 1.71569,-3.99664 2.55402,-6.00337 0.89003,-1.89943 1.86665,-3.76562 3.01491,-5.52201 1.40777,-2.01133 3.33858,-3.57662 5.32812,-4.9803 1.23992,-0.75485 2.42213,-1.59957 3.68923,-2.3108 1.42795,-0.88217 2.95575,-1.58776 4.46774,-2.31189 0.99896,-0.30772 1.95269,-0.81445 2.99484,-0.95052 0.94868,-0.0968 1.93298,0.0577 2.84891,-0.26823 0.92455,-0.56794 0.73006,-1.98773 -0.15625,-2.5 -0.80724,-0.63096 -1.7434,-1.0782 -2.63346,-1.5793 -1.68129,-0.84475 -3.47432,-1.44213 -5.30345,-1.87163 -1.35714,-0.28247 -2.73917,-0.47084 -4.12559,-0.51782 l -0.18169,0.0202 -0.0996,0.0111 z" + style="fill:#99a5b4;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32919" + d="m 637.65036,862.68169 c -2.12222,-4.15541 -2.62958,-9.16791 -2.11037,-13.77435 2.73632,-0.59646 3.48937,6.19672 4.61588,8.71136 0.50969,2.43464 4.44929,8.54497 -0.88647,6.29893 l -0.88201,-0.55645 -0.73703,-0.67949 0,0 z m -43.75608,-31 c -2.94588,-2.28349 -7.18933,-8.93795 -1.36293,-10.29495 8.07323,-2.18725 12.69247,-10.20871 15.48792,-17.52164 2.75397,-7.08868 3.00962,-14.78608 2.34575,-22.27209 0.57168,-3.73359 4.26846,3.25102 4.56293,4.83879 2.8335,10.0499 1.08542,21.07617 -3.26319,30.43572 -1.47318,3.78479 -7.24627,8.22354 -2.8605,12.027 4.90812,2.55146 1.57086,6.14222 -2.55813,6.40295 -4.41484,1.02741 -9.15214,-0.44638 -12.35185,-3.61578 z" + style="fill:#929ca9" /> + <path + inkscape:connector-curvature="0" + id="path32921" + d="m 604.07679,778.57601 c -2.07993,0.18622 -4.16688,0.39931 -6.19063,0.93582 -1.96265,0.5268 -3.86859,1.26151 -5.67823,2.18771 -1.2785,0.72607 -2.59489,1.40817 -3.73224,2.35094 -1.87066,1.41739 -3.50157,3.11504 -5.0864,4.83803 -0.8029,1.1366 -1.66147,2.24315 -2.35815,3.44834 -1.04606,1.93489 -1.92687,3.96033 -2.55709,6.06935 -1.02826,3.17356 -1.89607,6.39655 -2.77337,9.61433 -0.79085,2.99079 -1.58802,5.98101 -2.3162,8.9875 -0.72532,3.0427 -1.21047,6.14099 -1.45053,9.25973 -0.0808,1.12348 -0.27816,2.24516 -0.13834,3.37206 0.0627,1.15775 0.14707,2.31618 0.28118,3.46744 0.0295,0.43529 0.64114,0.88693 0.8125,0.28125 0.43782,-0.93637 0.98489,-1.88776 2.03125,-2.21875 0.77048,-0.37522 1.64462,-0.58501 2.49468,-0.42232 0.99503,0.20928 2.02353,0.51766 2.87283,1.09107 1.15247,0.76152 2.17094,1.75918 2.82587,2.98452 0.67432,0.79355 0.86715,1.92774 1.49412,2.69048 0.55618,0.0517 0.46735,-0.84631 0.60893,-1.24468 0.20794,-1.87479 -0.22577,-3.73167 -0.54643,-5.56782 -0.32562,-1.64053 -0.80423,-3.25041 -0.99895,-4.91491 -0.27135,-1.81202 -0.60341,-3.6237 -0.59359,-5.46277 -0.0577,-1.99807 -0.16648,-3.99431 -0.14423,-5.99405 -0.0352,-1.23626 -10e-4,-2.47036 0.11341,-3.70195 0.24423,-2.90098 0.56334,-5.79741 0.99836,-8.67632 0.6275,-2.95685 1.33887,-5.92442 2.64286,-8.66725 0.61629,-1.36529 1.23898,-2.73456 1.95854,-4.04735 0.72079,-1.14986 1.59611,-2.22584 2.73697,-2.98238 1.71322,-1.17297 3.55581,-2.14034 5.44826,-2.98937 1.80419,-0.81317 3.6119,-1.62339 5.33837,-2.5949 0.82255,-0.40084 1.88367,-0.6713 2.3005,-1.56976 0.12731,-0.30615 0.0397,-0.72575 -0.39425,-0.52399 z" + style="fill:#8a95a3;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32923" + d="m 638.56908,861.68169 c -1.01336,-1.80767 1.28793,-7.15927 1.24215,-2.50022 0.42403,2.21568 -0.44461,7.79222 -1.24215,2.50022 l 0,0 z m -43.0654,-31 c -2.9868,-1.67058 -7.00655,-6.75545 -1.26272,-7.50408 4.83247,-2.49559 9.8284,-5.69893 12.52164,-10.55778 1.11545,-4.62828 4.11893,-8.61975 4.84147,-13.41654 0.98527,-4.74585 2.52559,-9.7007 1.45289,-14.54866 3.4059,4.0618 2.72684,9.97803 2.40567,14.94875 -0.99576,8.63373 -3.58356,17.28503 -8.78479,24.35117 -2.28719,3.74841 7.19829,8.26089 -0.21265,9.84972 -3.91814,1.46539 -7.97066,-0.66912 -10.96151,-3.12258 z" + style="fill:#8a95a3" /> + </g> + <path + inkscape:connector-curvature="0" + id="path32959" + d="m 902.51419,862.96792 c 0.0102,-5.30143 1.60593,-10.6248 3.78149,-15.43929 4.32123,-8.8444 14.216,-12.22658 22.33805,-16.5859 4.68059,-1.37584 9.07114,-5.52844 4.7426,-10.02046 -6.39489,-12.22902 -8.7729,-27.8219 -2.10653,-40.43961 3.65467,-7.37162 12.38903,-12.01132 20.49326,-9.67176 7.28637,1.44287 13.14475,7.15895 15.34035,14.18101 4.51436,13.20733 1.2153,28.11579 -6.53662,39.43979 -1.32968,3.95225 5.89572,5.24121 8.44,7.53545 5.40393,3.00388 11.60589,4.85759 15.86832,9.59775 5.12248,5.30858 9.79259,12.48585 8.66416,20.18284 -2.66598,2.93451 -8.40865,1.41927 -12.30136,2.20861 -23.95296,0.89934 -47.95935,1.13829 -71.90915,0.0384 -2.25654,-0.26203 -4.73152,-0.0739 -6.81457,-1.02681 z" + style="fill:#dce2e8" /> + <path + inkscape:connector-curvature="0" + id="path32961" + d="m 902.86191,863.98091 c -0.3001,-10.49202 6.03728,-20.13978 14.66257,-25.69496 5.51969,-4.0779 12.40955,-5.84192 17.80822,-10.06232 2.84965,-4.01312 -2.37245,-8.04948 -3.34535,-11.96125 -5.17334,-11.94737 -5.914,-27.08139 2.25625,-37.90341 5.89413,-8.20878 18.85242,-9.23957 26.20711,-2.50691 7.92198,7.8665 8.99588,20.23178 7.07876,30.70563 -1.07732,6.52092 -4.2598,12.37274 -7.80043,17.84376 -0.63942,4.72644 5.99701,6.29571 9.15658,8.71794 5.67067,3.14875 12.42699,4.70876 16.62391,10.05061 4.55195,5.13638 7.7383,11.97169 7.26449,18.94209 -3.42877,3.13676 -9.17326,1.57453 -13.56039,2.19728 -25.14284,0.17847 -50.29403,0.26439 -75.43326,-0.23791 l -0.91846,-0.0906 0,0 z" + style="fill:#d4dbe2" /> + <path + inkscape:connector-curvature="0" + id="path32963" + d="m 947.40625,773.21875 c -2.08437,0.0218 -4.06879,0.82425 -5.78008,1.97408 -1.79052,1.15879 -3.40619,2.56842 -5.10341,3.85771 -2.07314,1.7046 -4.13064,3.52243 -5.54313,5.83208 -1.4246,2.63374 -2.01431,5.62903 -2.3241,8.58199 -0.33035,2.74853 -0.32823,5.52241 -0.43678,8.28539 -0.005,3.82444 -0.15351,7.64782 -0.13884,11.4717 0.0859,5.10181 0.52206,10.19115 0.63884,15.29078 -0.0171,1.6471 0.0169,3.30988 -0.14185,4.94514 -0.24522,0.76103 -0.56607,2.26102 0.57466,2.38613 1.06002,-0.019 1.23511,-1.39535 1.15554,-2.21222 0.22952,-1.68105 1.32505,-3.13394 2.6304,-4.16278 0.85251,-0.49875 1.97306,-0.491 2.84375,-0.0625 1.32761,1.06993 2.37232,2.46316 3.74962,3.48406 1.78793,1.52488 3.51798,3.13357 5.27748,4.67984 0.9866,0.7019 2.27026,0.71795 3.42985,0.66919 1.06796,-0.16832 2.13534,-0.35487 3.21952,-0.36775 0.89406,0.16109 2.32802,-0.70942 1.38603,-1.62159 -0.8042,-0.70337 -1.88743,-0.23431 -2.83365,-0.39781 -1.84267,-0.0672 -3.62098,-1.11476 -4.59764,-2.66893 -1.00336,-1.75997 -1.59857,-3.7098 -2.42704,-5.55243 -1.66116,-3.95349 -2.91032,-8.07322 -3.85039,-12.25354 -0.4782,-2.16238 -0.94931,-4.33361 -1.04039,-6.55414 -0.44284,-5.17654 -0.0164,-10.36675 0.21786,-15.5419 0.43161,-2.80874 0.93864,-5.71235 2.52365,-8.13079 1.40946,-2.34955 3.21165,-4.47033 5.33501,-6.20561 1.34968,-1.17749 2.79007,-2.24805 4.17259,-3.38235 0.65717,-0.78426 0.12822,-2.21425 -0.93003,-2.28177 -0.66037,-0.14562 -1.33846,-0.0725 -2.00747,-0.062 z" + style="fill:#a9b6c7;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32965" + d="m 945.0625,771.09375 c -3.49998,0.58518 -6.82593,1.96099 -9.87152,3.75664 -1.46593,0.9392 -2.89772,1.9504 -4.10149,3.21637 -2.26374,2.18699 -4.05772,4.84626 -5.3102,7.72931 -1.72442,4.45631 -3.18147,9.00923 -4.54622,13.58674 -1.17863,3.81878 -2.29249,7.66048 -3.58633,11.44147 -0.98068,2.31904 -2.25569,4.50522 -3.14674,6.86322 -0.0717,0.83217 -0.52076,1.71408 -0.15625,2.53125 0.34391,0.63556 0.61295,-0.72716 0.90409,-1.00196 0.70785,-1.17012 1.67865,-2.15857 2.50216,-3.24804 2.02564,-2.4413 4.09249,-4.85803 6.34375,-7.09375 0.89228,-0.67775 1.93115,-1.14621 3,-1.46875 0.9592,-0.27381 2.04572,-0.0942 2.7855,0.6034 0.79827,0.68845 1.05228,1.81659 0.92648,2.82928 -0.069,2.24614 -0.62186,4.43634 -0.94161,6.65146 -0.37717,1.50747 -0.59603,3.04826 -0.89537,4.57211 -0.0187,0.88489 0.803,1.89802 1.75,1.65625 1.2052,-0.41761 1.68611,-1.71186 2.01212,-2.83444 1.08092,-3.47552 1.16417,-7.147 1.31178,-10.75426 0.25256,-3.87574 0.43014,-7.76125 0.90064,-11.61815 0.52097,-3.65166 1.24649,-7.28074 2.27546,-10.8244 0.50779,-1.47275 1.28525,-2.82251 2.13241,-4.12255 1.04514,-1.54481 2.4259,-2.97532 4.21134,-3.62745 3.77193,-1.53211 7.85601,-2.03477 11.71875,-3.28125 0.85611,-0.41385 1.66942,-1.37746 1.34375,-2.375 -0.36579,-1.12201 -1.57323,-1.602 -2.61278,-1.89568 -2.30278,-0.66163 -4.68142,-1.03339 -7.06477,-1.2496 -0.62852,-0.0212 -1.25644,-0.11142 -1.88495,-0.0422 z" + style="fill:#b6c5d8;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32967" + d="m 903.31861,862.68392 c 2.03973,-6.75845 2.62673,-14.59993 8.28246,-19.57905 6.86653,-6.55449 16.49277,-8.81781 23.9521,-14.46458 3.64474,-4.45932 -2.81051,-9.08083 -3.56202,-13.60484 -4.14323,-11.16786 -4.98166,-24.68811 1.49566,-35.15189 5.68463,-8.73332 19.85553,-10.9347 27.19403,-3.0481 8.41394,8.94249 8.77611,22.65299 5.27347,33.81426 -1.49442,5.581 -4.99844,10.28747 -7.0924,15.6006 2.76177,3.52771 7.14927,5.48724 10.93492,7.7964 6.119,3.22073 13.58338,5.02515 17.48348,11.27477 2.96987,4.63969 4.42192,10.08731 5.80917,15.35231 -1.50165,4.96315 -8.81816,2.91096 -12.85889,3.69351 -22.80335,0.12179 -45.61168,0.15756 -68.41429,-0.11428 -2.31171,-0.50334 -7.53241,0.74503 -8.49769,-1.56911 z" + style="fill:#c9cfd7" /> + <path + inkscape:connector-curvature="0" + id="path32969" + d="m 904.235,862.68169 c 2.05635,-7.41778 3.349,-16.08468 10.1767,-20.8097 6.61828,-5.16685 15.1606,-7.20405 21.59504,-12.59203 3.54453,-4.88336 -2.47561,-9.88767 -3.35341,-14.75239 -3.47406,-10.8555 -4.1294,-23.33186 0.8597,-33.82801 1.72632,-3.59701 5.23944,-6.62494 9.42916,-6.35645 4.19219,-1.15696 8.52724,-4.11292 12.93873,-1.76941 7.46152,3.81566 10.06429,12.7832 10.99601,20.5469 1.16372,10.51462 -1.47428,21.3696 -7.47449,30.09882 -3.05921,4.5826 3.82783,7.04871 6.59279,9.43949 4.45298,3.31782 9.92768,4.58376 14.70417,7.25683 7.68513,4.50047 10.74405,13.62794 11.74428,22.00374 -2.9167,3.42132 -8.87906,1.6959 -13.0442,2.37973 -23.01389,0.17734 -46.03587,0.29901 -69.04708,-0.12448 -1.47707,-0.46732 -5.78821,0.53078 -6.1174,-1.49304 z" + style="fill:#b6c5d8" /> + <path + inkscape:connector-curvature="0" + id="path32971" + d="m 955.41576,831.51882 c -6.51092,-0.17414 1.89613,-8.32488 2.10973,-2.13677 0.25514,1.05824 -0.90992,3.45218 -2.10973,2.13677 z m -9.19222,-2.58713 c -5.03005,-3.26087 3.80688,-5.55701 3.71501,-0.9855 -0.33166,1.64802 -2.69765,2.53253 -3.71501,0.9855 z m 8.27957,-8.19213 c 5.41236,-4.28675 4.18648,-12.49507 9.14189,-17.11237 0.29556,5.93898 -0.81537,13.05465 -6.06482,16.64412 -0.94557,0.45813 -2.03685,0.66185 -3.07707,0.46825 z" + style="fill:#89929e" /> + <path + inkscape:connector-curvature="0" + id="path32973" + d="m 905.48691,863.63394 c -0.70857,-2.12774 2.22704,-4.3804 1.34135,-0.66819 0.10193,0.98814 -0.65203,2.27111 -1.34135,0.66819 z m 37.375,-0.1401 c 1.38595,-2.43696 5.53173,0.89636 1.42887,0.91541 -0.49532,-0.004 -1.42499,-0.23332 -1.42887,-0.91541 z m 7.69692,-0.45528 c -1.76626,-3.1746 2.23873,-3.26451 1.11193,0.0649 -0.32817,2.3234 -0.6929,0.92535 -1.11193,-0.0649 z m 26.80308,-0.60687 c -0.14118,-3.37799 -6.35613,-0.78227 -3.14715,-4.41577 3.46144,-3.84128 -0.91256,-6.50536 0.32867,-10.70489 -1.35343,-4.87174 -4.44598,3.58742 -6.3126,-0.95498 -2.28645,-0.76047 -6.14616,-2.25962 -7.84378,-1.85811 1.7928,4.16671 -5.07612,3.88297 -4.6571,8.23859 -2.87822,4.77401 -4.21355,-5.23107 0.41677,-4.75641 3.01773,-1.66128 2.63528,-6.07232 -1.10546,-3.24125 -4.1035,2.38594 -8.10134,0.13188 -10.98005,-2.65973 -1.57462,1.027 -7.19053,5.94236 -6.22979,1.16697 3.10847,-2.66186 -0.58671,-8.92294 -4.2926,-8.18935 -5.10673,-0.52325 2.44631,-4.85414 3.57641,-6.66771 1.85925,-4.36472 -3.17296,-7.83742 -3.70804,-12.04941 -1.26507,-5.08051 -2.83005,-10.57026 -1.53095,-15.77259 2.64643,-1.80932 -6.03903,-6.34583 -0.12744,-6.57829 2.97426,2.18718 10.86096,-0.73904 8.66403,-4.74784 1.43269,-4.1299 6.02584,3.62463 2.18105,5.45085 -2.59742,0.10573 -7.4936,3.34663 -3.62767,5.54395 1.64345,-0.82217 6.49317,-5.71297 6.67294,-2.49044 -2.78532,3.31115 -8.67094,4.59991 -5.95043,10.09851 -0.14706,1.93717 2.22289,5.8417 2.38345,1.69036 -0.29174,-2.60942 -0.27466,-9.86038 3.64824,-6.05741 -1.55047,2.76367 1.65839,4.017 1.46611,0.70751 1.23126,-3.60319 4.16329,-6.90216 1.96148,-10.6292 1.08569,-3.44275 2.47527,-8.92278 -1.1456,-10.9983 -0.27587,-2.38485 4.39556,-5.73004 -0.72382,-6.12506 -5.30946,-0.90828 1.67648,-3.69288 4.04177,-2.6646 4.32549,0.22232 9.16923,1.37034 11.4584,5.44637 6.2849,9.7073 5.68438,22.38166 2.17074,32.98508 -0.92944,4.64278 -5.22217,8.12432 -5.20477,12.92114 1.20847,6.56432 8.01624,9.99242 13.78201,11.95844 5.17953,1.02044 10.13826,3.62424 13.03186,8.19359 3.20397,4.79647 5.21645,10.49318 5.73671,16.22196 -2.35585,3.8145 -7.90047,3.87439 -11.89521,3.17059 -1.22451,-0.32543 -2.60284,-0.92802 -3.03818,-2.23257 z m -6.09078,-20.1003 c -1.41893,-3.47946 -9.20211,-2.51084 -5.13746,1.1248 1.04916,0.55257 8.14925,1.55777 5.13746,-1.1248 z m -35.40922,-40.45872 c -2.16266,-4.30335 -2.56624,5.59099 0,0 z m -10.77214,57.4647 c 0.9739,-2.58634 6.2446,-4.23216 3.35785,-0.21672 -0.93252,2.57294 -7.05087,4.43368 -3.35785,0.21672 z m 15.26777,1.08726 c -0.46155,-3.123 5.92769,-1.79651 2.3333,0.70108 -0.7844,0.59532 -1.93502,0.11193 -2.3333,-0.70108 z m 17.19822,0.36758 c -1.40203,-3.70988 5.69463,-2.0316 1.50018,0.56139 l -0.7246,-0.0276 -0.77558,-0.53379 z m -46.69385,-2.34909 c 0.2511,-3.17228 6.70537,-7.64119 4.5997,-1.5241 -0.30291,1.59959 -3.88314,3.82735 -4.5997,1.5241 z m 56,-0.51143 c 2.51293,-5.65641 2.40656,5.5417 0,0 z m -47.8,-2.7 c -4.0511,-2.74409 2.86178,-11.29262 3.00074,-4.49156 -2.27342,1.19476 -2.94972,4.14273 0.2778,3.98531 0.44919,2.1979 -2.50337,1.86609 -3.27854,0.50625 z m 17.04379,-0.05 c 1.31653,-2.24916 8.58375,-2.15975 3.4328,0.33832 -0.75747,0.55533 -3.95209,1.81288 -3.4328,-0.33832 z m 28.41342,-2.29909 c 1.98887,-3.91758 6.85421,2.62004 1.31167,1.52967 -0.84991,0.0565 -1.92843,-0.52139 -1.31167,-1.52967 z m -56.65721,-0.39189 c 1.68789,-4.90927 2.99691,2.75221 0.0789,0.36537 l -0.0789,-0.36537 z m 16.64757,-4.24293 c -1.89148,-2.61234 0.84049,-5.75092 1.68838,-1.54504 0.84852,1.72586 -0.70234,5.1602 -1.68838,1.54504 z m 4.5919,-1.82793 c 1.60255,-1.85967 3.66348,-1.43607 5.26053,-2.98816 3.96262,1.46685 -2.62956,3.48646 -3.72862,4.9303 -1.99518,0.50428 -2.92151,-0.26884 -1.53191,-1.94214 z m -9.23947,-3.57149 c 0.59993,-5.93389 4.17587,2.63959 0.61172,2.37949 -0.52277,-0.66971 -0.58181,-1.56896 -0.61172,-2.37949 z m -5.42997,0.69664 c -0.36608,-3.22691 5.22742,-3.96176 2.51439,-0.12486 -0.51631,1.26584 -1.79625,1.28548 -2.51439,0.12486 z m 16.42997,-54.05429 c -0.30675,-2.8402 2.78573,-3.62344 2.3713,-0.3321 1.77753,2.89278 -2.53827,3.01913 -2.3713,0.3321 z m 7,-4.85902 c -0.4203,-5.12456 8.43626,-1.94337 4.35831,0.72111 -1.36922,0.0212 -3.34407,0.40232 -4.35831,-0.72111 z m -1,-5.82423 c 0.17102,-4.09108 9.38834,-5.68544 7.35975,-0.21811 -2.21937,0.24293 -4.55297,-2.11058 -6.7961,0.31894 l -0.41224,0.0536 -0.15141,-0.1544 0,0 z" + style="fill:#b4c3d5" /> + <path + inkscape:connector-curvature="0" + id="path32975" + d="m 978.86191,861.63169 c -0.6243,-3.55935 -2.69727,-6.3569 -0.72148,-9.98987 0.12528,-5.45244 -2.79115,-10.65923 -7.09669,-13.89447 -1.2068,-2.85452 5.32777,0.70573 6.92377,1.01004 7.6726,3.41307 13.86355,11.22205 14.0998,19.78329 0.20205,5.97005 -6.54891,6.42322 -10.9269,5.80556 -1.73227,0.15131 -2.58324,-1.0909 -2.2785,-2.71455 z m -32.0895,-20.80784 c -4.43403,-1.14416 -6.64242,-4.93813 -9.61832,-8.11599 -5.8032,-0.96373 3.57616,-5.23189 -0.12424,-8.64226 -1.28875,-3.82859 -5.19745,-7.73842 -3.91246,-11.88366 3.57632,0.77406 7.98145,4.56157 11.43042,0.4736 4.54424,-4.37751 7.17602,-10.57138 8.26123,-16.71192 0.40261,-6.44762 0.58793,-13.17942 -1.38634,-19.39442 -3.68525,-5.04182 5.4099,-3.08901 7.46282,-1.22179 7.18838,5.3533 8.70986,15.22614 8.49736,23.6257 -0.24925,8.4967 -3.14336,16.73146 -7.72751,23.84074 -2.88991,4.70712 3.78023,7.4172 6.17011,10.48571 2.37199,1.75978 2.7988,3.59039 -0.47087,3.94333 -4.93227,3.54041 -11.38158,5.84263 -17.44005,4.36937 l -0.65495,-0.33776 -0.48717,-0.43065 -3e-5,0 z" + style="fill:#b3bcc9" /> + <path + inkscape:connector-curvature="0" + id="path32977" + d="m 979.67696,857.68169 c 0.69544,-5.83229 -1.1934,-11.42869 -3.06233,-16.84619 1.70492,-4.06189 7.7076,2.15936 9.08169,4.7283 3.47472,5.23289 5.9898,11.23822 6.74935,17.4968 -2.74907,2.48603 -8.71268,1.53936 -12.25687,0.52734 -1.14099,-1.73296 -0.47804,-3.96643 -0.51184,-5.90625 z m -35.07897,-19.01192 c -4.35373,-1.9881 -8.73775,-7.05736 -6.26711,-11.96771 0.37899,-3.87987 -6.19721,-8.74866 -2.61552,-11.649 3.81737,-0.0455 7.92323,-0.57969 10.70088,-3.51648 7.53861,-7.6238 9.37318,-19.29758 8.11009,-29.5788 -0.29347,-2.73658 -3.48318,-10.05061 2.13834,-6.90166 5.59048,2.86145 9.3559,8.5583 9.95363,14.79053 1.45238,11.54814 -0.99935,23.83469 -7.78522,33.40876 -3.2246,5.24149 5.70344,6.58552 5.5499,11.37054 -1.14464,5.117 -7.75884,5.97682 -12.15638,5.8855 -2.62827,-0.12443 -5.23793,-0.7377 -7.62861,-1.84168 z" + style="fill:#a9b6c7" /> + <path + inkscape:connector-curvature="0" + id="path32979" + d="m 981.86191,856.01273 c 0.17627,-4.74944 -0.35601,-9.57132 -2.75943,-13.74195 1.4975,-4.03011 6.82738,2.83782 8.07858,5.41566 2.90201,4.84584 4.29026,10.45516 5.38214,15.90906 -3.35146,1.42092 -11.5911,2.28284 -10.66459,-3.67955 -0.043,-1.30058 -0.0346,-2.60214 -0.0367,-3.90322 z m -32,-17.72887 c -5.84776,-1.14965 -11.42672,-6.22518 -11.15451,-12.52353 -1.5003,-2.03434 -5.71528,-8.53816 -0.0642,-7.68024 6.73246,0.44741 11.31314,-5.91275 13.97222,-11.28778 4.52892,-9.55307 5.82631,-20.85993 2.53341,-31.00041 2.18117,-2.95131 6.79462,3.62386 8.51281,5.81939 4.3355,6.99236 3.55623,15.74508 2.3456,23.52395 -1.04534,6.26492 -3.43738,12.23617 -6.89396,17.55368 -4.11636,5.37273 4.86346,7.17375 5.40003,11.35344 -3.34598,2.78013 -7.84307,4.85802 -12.30072,4.56282 -0.78868,-0.0649 -1.57191,-0.18321 -2.35071,-0.32132 z" + style="fill:#a5aeba" /> + <path + inkscape:connector-curvature="0" + id="path32981" + d="m 984.44264,862.18169 c -1.18835,-6.44151 -0.7153,-13.29528 -3.22346,-19.40763 5.2155,1.71368 7.21913,7.68437 8.61488,12.50189 0.46756,3.74753 5.9571,10.77397 -1.54689,9.15113 -1.59711,0.0659 -3.7451,-0.21664 -3.84453,-2.24539 z M 947.36191,836.4722 c -5.21371,-2.6559 -8.38811,-8.12562 -9.45075,-13.73768 -3.02381,-5.26702 5.32539,-2.26568 7.46203,-5.22634 8.49017,-5.8936 12.46598,-16.48626 13.51852,-26.43011 1.08258,-4.83991 -1.47198,-10.13976 -0.95483,-14.48335 7.03021,4.3261 9.10897,13.3759 8.64448,21.14239 -0.4724,9.88319 -4.21327,19.33825 -9.42908,27.6489 0.19598,3.60522 8.59405,7.29794 2.21847,10.91971 -3.64557,2.02664 -8.25272,1.70657 -12.00884,0.16648 z" + style="fill:#99a5b4" /> + <path + inkscape:connector-curvature="0" + id="path32985" + d="m 987.65036,862.68169 c -2.12222,-4.15541 -2.62958,-9.16791 -2.11037,-13.77435 2.73632,-0.59646 3.48937,6.19672 4.61588,8.71136 0.50969,2.43464 4.44929,8.54497 -0.88647,6.29893 l -0.88201,-0.55645 -0.73703,-0.67949 0,0 z m -43.75608,-31 c -2.94588,-2.28349 -7.18933,-8.93795 -1.36293,-10.29495 8.07323,-2.18725 12.69247,-10.20871 15.48792,-17.52164 2.75397,-7.08868 3.00962,-14.78608 2.34575,-22.27209 0.57168,-3.73359 4.26846,3.25102 4.56293,4.83879 2.8335,10.0499 1.08542,21.07617 -3.26319,30.43572 -1.47318,3.78479 -7.24627,8.22354 -2.8605,12.027 4.90812,2.55146 1.57086,6.14222 -2.55813,6.40295 -4.41484,1.02741 -9.15214,-0.44638 -12.35185,-3.61578 z" + style="fill:#929ca9" /> + <path + inkscape:connector-curvature="0" + id="path32989" + d="m 988.56908,861.68169 c -1.01336,-1.80767 1.28793,-7.15927 1.24215,-2.50022 0.42403,2.21568 -0.44461,7.79222 -1.24215,2.50022 l 0,0 z m -43.0654,-31 c -2.9868,-1.67058 -7.00655,-6.75545 -1.26272,-7.50408 4.83247,-2.49559 9.8284,-5.69893 12.52164,-10.55778 1.11545,-4.62828 4.11893,-8.61975 4.84147,-13.41654 0.98527,-4.74585 2.52559,-9.7007 1.45289,-14.54866 3.4059,4.0618 2.72684,9.97803 2.40567,14.94875 -0.99576,8.63373 -3.58356,17.28503 -8.78479,24.35117 -2.28719,3.74841 7.19829,8.26089 -0.21265,9.84972 -3.91814,1.46539 -7.97066,-0.66912 -10.96151,-3.12258 z" + style="fill:#8a95a3" /> + <path + inkscape:connector-curvature="0" + id="path32987" + d="m 954.07679,778.57601 c -2.07993,0.18622 -4.16688,0.39931 -6.19063,0.93582 -1.96265,0.5268 -3.86859,1.26151 -5.67823,2.18771 -1.2785,0.72607 -2.59489,1.40817 -3.73224,2.35094 -1.87066,1.41739 -3.50157,3.11504 -5.0864,4.83803 -0.8029,1.1366 -1.66147,2.24315 -2.35815,3.44834 -1.04606,1.93489 -1.92687,3.96033 -2.55709,6.06935 -1.02826,3.17356 -1.89607,6.39655 -2.77337,9.61433 -0.79085,2.99079 -1.58802,5.98101 -2.3162,8.9875 -0.72532,3.0427 -1.21047,6.14099 -1.45053,9.25973 -0.0808,1.12348 -0.27816,2.24516 -0.13834,3.37206 0.0627,1.15775 0.14707,2.31618 0.28118,3.46744 0.0295,0.43529 0.64114,0.88693 0.8125,0.28125 0.43782,-0.93637 0.98489,-1.88776 2.03125,-2.21875 0.77048,-0.37522 1.64462,-0.58501 2.49468,-0.42232 0.99503,0.20928 2.02353,0.51766 2.87283,1.09107 1.15247,0.76152 2.17094,1.75918 2.82587,2.98452 0.67432,0.79355 0.86715,1.92774 1.49412,2.69048 0.55618,0.0517 0.46735,-0.84631 0.60893,-1.24468 0.20794,-1.87479 -0.22577,-3.73167 -0.54643,-5.56782 -0.32562,-1.64053 -0.80423,-3.25041 -0.99895,-4.91491 -0.27135,-1.81202 -0.60341,-3.6237 -0.59359,-5.46277 -0.0577,-1.99807 -0.16648,-3.99431 -0.14423,-5.99405 -0.0352,-1.23626 -10e-4,-2.47036 0.11341,-3.70195 0.24423,-2.90098 0.56334,-5.79741 0.99836,-8.67632 0.6275,-2.95685 1.33887,-5.92442 2.64286,-8.66725 0.61629,-1.36529 1.23898,-2.73456 1.95854,-4.04735 0.72079,-1.14986 1.59611,-2.22584 2.73697,-2.98238 1.71322,-1.17297 3.55581,-2.14034 5.44826,-2.98937 1.80419,-0.81317 3.6119,-1.62339 5.33837,-2.5949 0.82255,-0.40084 1.88367,-0.6713 2.3005,-1.56976 0.12731,-0.30615 0.0397,-0.72575 -0.39425,-0.52399 z" + style="fill:#8a95a3;fill-opacity:1" /> + <path + inkscape:connector-curvature="0" + id="path32983" + d="M 946.9375 772.125 C 937.37035 773.87339 929.68293 781.76987 926.96875 790.9375 C 922.13998 801.82267 919.89821 813.96996 921.35039 825.83894 C 921.3702 826.9122 921.49629 827.99688 921.3125 829.0625 C 925.06442 824.55868 925.115 818.39094 927.2936 813.16564 C 930.66518 802.48404 936.08714 791.99145 944.96875 784.875 C 949.33478 781.19151 954.446 778.4942 959.6875 776.28125 C 960.40964 774.46268 958.21168 773.03627 956.59375 773.15625 C 953.47654 772.23318 950.17742 771.92625 946.9375 772.125 z " + style="fill:#99a5b4;fill-opacity:1" + sodipodi:nodetypes="cccccccccccccccccccccccccccccc" /> + <g + transform="matrix(0.24124111,0,0,0.24124111,797.29989,735.99371)" + id="g33007" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <path + style="fill:#dce2e8" + d="m 552.51419,862.96792 c 0.0102,-5.30143 1.60593,-10.6248 3.78149,-15.43929 4.32123,-8.8444 14.216,-12.22658 22.33805,-16.5859 4.68059,-1.37584 9.07114,-5.52844 4.7426,-10.02046 -6.39489,-12.22902 -8.7729,-27.8219 -2.10653,-40.43961 3.65467,-7.37162 12.38903,-12.01132 20.49326,-9.67176 7.28637,1.44287 13.14475,7.15895 15.34035,14.18101 4.51436,13.20733 1.2153,28.11579 -6.53662,39.43979 -1.32968,3.95225 5.89572,5.24121 8.44,7.53545 5.40393,3.00388 11.60589,4.85759 15.86832,9.59775 5.12248,5.30858 9.79259,12.48585 8.66416,20.18284 -2.66598,2.93451 -8.40865,1.41927 -12.30136,2.20861 -23.95296,0.89934 -47.95935,1.13829 -71.90915,0.0384 -2.25654,-0.26203 -4.73152,-0.0739 -6.81457,-1.02681 z" + id="path33009" + inkscape:connector-curvature="0" /> + <path + style="fill:#d4dbe2" + d="m 552.86191,863.98091 c -0.3001,-10.49202 6.03728,-20.13978 14.66257,-25.69496 5.51969,-4.0779 12.40955,-5.84192 17.80822,-10.06232 2.84965,-4.01312 -2.37245,-8.04948 -3.34535,-11.96125 -5.17334,-11.94737 -5.914,-27.08139 2.25625,-37.90341 5.89413,-8.20878 18.85242,-9.23957 26.20711,-2.50691 7.92198,7.8665 8.99588,20.23178 7.07876,30.70563 -1.07732,6.52092 -4.2598,12.37274 -7.80043,17.84376 -0.63942,4.72644 5.99701,6.29571 9.15658,8.71794 5.67067,3.14875 12.42699,4.70876 16.62391,10.05061 4.55195,5.13638 7.7383,11.97169 7.26449,18.94209 -3.42877,3.13676 -9.17326,1.57453 -13.56039,2.19728 -25.14284,0.17847 -50.29403,0.26439 -75.43326,-0.23791 l -0.91846,-0.0906 0,0 z" + id="path33011" + inkscape:connector-curvature="0" /> + <path + style="fill:#a9b6c7;fill-opacity:1" + d="m 597.40625,773.21875 c -2.08437,0.0218 -4.06879,0.82425 -5.78008,1.97408 -1.79052,1.15879 -3.40619,2.56842 -5.10341,3.85771 -2.07314,1.7046 -4.13064,3.52243 -5.54313,5.83208 -1.4246,2.63374 -2.01431,5.62903 -2.3241,8.58199 -0.33035,2.74853 -0.32823,5.52241 -0.43678,8.28539 -0.005,3.82444 -0.15351,7.64782 -0.13884,11.4717 0.0859,5.10181 0.52206,10.19115 0.63884,15.29078 -0.0171,1.6471 0.0169,3.30988 -0.14185,4.94514 -0.24522,0.76103 -0.56607,2.26102 0.57466,2.38613 1.06002,-0.019 1.23511,-1.39535 1.15554,-2.21222 0.22952,-1.68105 1.32505,-3.13394 2.6304,-4.16278 0.85251,-0.49875 1.97306,-0.491 2.84375,-0.0625 1.32761,1.06993 2.37232,2.46316 3.74962,3.48406 1.78793,1.52488 3.51798,3.13357 5.27748,4.67984 0.9866,0.7019 2.27026,0.71795 3.42985,0.66919 1.06796,-0.16832 2.13534,-0.35487 3.21952,-0.36775 0.89406,0.16109 2.32802,-0.70942 1.38603,-1.62159 -0.8042,-0.70337 -1.88743,-0.23431 -2.83365,-0.39781 -1.84267,-0.0672 -3.62098,-1.11476 -4.59764,-2.66893 -1.00336,-1.75997 -1.59857,-3.7098 -2.42704,-5.55243 -1.66116,-3.95349 -2.91032,-8.07322 -3.85039,-12.25354 -0.4782,-2.16238 -0.94931,-4.33361 -1.04039,-6.55414 -0.44284,-5.17654 -0.0164,-10.36675 0.21786,-15.5419 0.43161,-2.80874 0.93864,-5.71235 2.52365,-8.13079 1.40946,-2.34955 3.21165,-4.47033 5.33501,-6.20561 1.34968,-1.17749 2.79007,-2.24805 4.17259,-3.38235 0.65717,-0.78426 0.12822,-2.21425 -0.93003,-2.28177 -0.66037,-0.14562 -1.33846,-0.0725 -2.00747,-0.062 z" + id="path33013" + inkscape:connector-curvature="0" /> + <path + style="fill:#b6c5d8;fill-opacity:1" + d="m 595.0625,771.09375 c -3.49998,0.58518 -6.82593,1.96099 -9.87152,3.75664 -1.46593,0.9392 -2.89772,1.9504 -4.10149,3.21637 -2.26374,2.18699 -4.05772,4.84626 -5.3102,7.72931 -1.72442,4.45631 -3.18147,9.00923 -4.54622,13.58674 -1.17863,3.81878 -2.29249,7.66048 -3.58633,11.44147 -0.98068,2.31904 -2.25569,4.50522 -3.14674,6.86322 -0.0717,0.83217 -0.52076,1.71408 -0.15625,2.53125 0.34391,0.63556 0.61295,-0.72716 0.90409,-1.00196 0.70785,-1.17012 1.67865,-2.15857 2.50216,-3.24804 2.02564,-2.4413 4.09249,-4.85803 6.34375,-7.09375 0.89228,-0.67775 1.93115,-1.14621 3,-1.46875 0.9592,-0.27381 2.04572,-0.0942 2.7855,0.6034 0.79827,0.68845 1.05228,1.81659 0.92648,2.82928 -0.069,2.24614 -0.62186,4.43634 -0.94161,6.65146 -0.37717,1.50747 -0.59603,3.04826 -0.89537,4.57211 -0.0187,0.88489 0.803,1.89802 1.75,1.65625 1.2052,-0.41761 1.68611,-1.71186 2.01212,-2.83444 1.08092,-3.47552 1.16417,-7.147 1.31178,-10.75426 0.25256,-3.87574 0.43014,-7.76125 0.90064,-11.61815 0.52097,-3.65166 1.24649,-7.28074 2.27546,-10.8244 0.50779,-1.47275 1.28525,-2.82251 2.13241,-4.12255 1.04514,-1.54481 2.4259,-2.97532 4.21134,-3.62745 3.77193,-1.53211 7.85601,-2.03477 11.71875,-3.28125 0.85611,-0.41385 1.66942,-1.37746 1.34375,-2.375 -0.36579,-1.12201 -1.57323,-1.602 -2.61278,-1.89568 -2.30278,-0.66163 -4.68142,-1.03339 -7.06477,-1.2496 -0.62852,-0.0212 -1.25644,-0.11142 -1.88495,-0.0422 z" + id="path33015" + inkscape:connector-curvature="0" /> + <path + style="fill:#c9cfd7" + d="m 553.31861,862.68392 c 2.03973,-6.75845 2.62673,-14.59993 8.28246,-19.57905 6.86653,-6.55449 16.49277,-8.81781 23.9521,-14.46458 3.64474,-4.45932 -2.81051,-9.08083 -3.56202,-13.60484 -4.14323,-11.16786 -4.98166,-24.68811 1.49566,-35.15189 5.68463,-8.73332 19.85553,-10.9347 27.19403,-3.0481 8.41394,8.94249 8.77611,22.65299 5.27347,33.81426 -1.49442,5.581 -4.99844,10.28747 -7.0924,15.6006 2.76177,3.52771 7.14927,5.48724 10.93492,7.7964 6.119,3.22073 13.58338,5.02515 17.48348,11.27477 2.96987,4.63969 4.42192,10.08731 5.80917,15.35231 -1.50165,4.96315 -8.81816,2.91096 -12.85889,3.69351 -22.80335,0.12179 -45.61168,0.15756 -68.41429,-0.11428 -2.31171,-0.50334 -7.53241,0.74503 -8.49769,-1.56911 z" + id="path33017" + inkscape:connector-curvature="0" /> + <path + style="fill:#b6c5d8" + d="m 554.235,862.68169 c 2.05635,-7.41778 3.349,-16.08468 10.1767,-20.8097 6.61828,-5.16685 15.1606,-7.20405 21.59504,-12.59203 3.54453,-4.88336 -2.47561,-9.88767 -3.35341,-14.75239 -3.47406,-10.8555 -4.1294,-23.33186 0.8597,-33.82801 1.72632,-3.59701 5.23944,-6.62494 9.42916,-6.35645 4.19219,-1.15696 8.52724,-4.11292 12.93873,-1.76941 7.46152,3.81566 10.06429,12.7832 10.99601,20.5469 1.16372,10.51462 -1.47428,21.3696 -7.47449,30.09882 -3.05921,4.5826 3.82783,7.04871 6.59279,9.43949 4.45298,3.31782 9.92768,4.58376 14.70417,7.25683 7.68513,4.50047 10.74405,13.62794 11.74428,22.00374 -2.9167,3.42132 -8.87906,1.6959 -13.0442,2.37973 -23.01389,0.17734 -46.03587,0.29901 -69.04708,-0.12448 -1.47707,-0.46732 -5.78821,0.53078 -6.1174,-1.49304 z" + id="path33019" + inkscape:connector-curvature="0" /> + <path + style="fill:#89929e" + d="m 605.41576,831.51882 c -6.51092,-0.17414 1.89613,-8.32488 2.10973,-2.13677 0.25514,1.05824 -0.90992,3.45218 -2.10973,2.13677 z m -9.19222,-2.58713 c -5.03005,-3.26087 3.80688,-5.55701 3.71501,-0.9855 -0.33166,1.64802 -2.69765,2.53253 -3.71501,0.9855 z m 8.27957,-8.19213 c 5.41236,-4.28675 4.18648,-12.49507 9.14189,-17.11237 0.29556,5.93898 -0.81537,13.05465 -6.06482,16.64412 -0.94557,0.45813 -2.03685,0.66185 -3.07707,0.46825 z" + id="path33021" + inkscape:connector-curvature="0" /> + <path + style="fill:#b4c3d5" + d="m 555.48691,863.63394 c -0.70857,-2.12774 2.22704,-4.3804 1.34135,-0.66819 0.10193,0.98814 -0.65203,2.27111 -1.34135,0.66819 z m 37.375,-0.1401 c 1.38595,-2.43696 5.53173,0.89636 1.42887,0.91541 -0.49532,-0.004 -1.42499,-0.23332 -1.42887,-0.91541 z m 7.69692,-0.45528 c -1.76626,-3.1746 2.23873,-3.26451 1.11193,0.0649 -0.32817,2.3234 -0.6929,0.92535 -1.11193,-0.0649 z m 26.80308,-0.60687 c -0.14118,-3.37799 -6.35613,-0.78227 -3.14715,-4.41577 3.46144,-3.84128 -0.91256,-6.50536 0.32867,-10.70489 -1.35343,-4.87174 -4.44598,3.58742 -6.3126,-0.95498 -2.28645,-0.76047 -6.14616,-2.25962 -7.84378,-1.85811 1.7928,4.16671 -5.07612,3.88297 -4.6571,8.23859 -2.87822,4.77401 -4.21355,-5.23107 0.41677,-4.75641 3.01773,-1.66128 2.63528,-6.07232 -1.10546,-3.24125 -4.1035,2.38594 -8.10134,0.13188 -10.98005,-2.65973 -1.57462,1.027 -7.19053,5.94236 -6.22979,1.16697 3.10847,-2.66186 -0.58671,-8.92294 -4.2926,-8.18935 -5.10673,-0.52325 2.44631,-4.85414 3.57641,-6.66771 1.85925,-4.36472 -3.17296,-7.83742 -3.70804,-12.04941 -1.26507,-5.08051 -2.83005,-10.57026 -1.53095,-15.77259 2.64643,-1.80932 -6.03903,-6.34583 -0.12744,-6.57829 2.97426,2.18718 10.86096,-0.73904 8.66403,-4.74784 1.43269,-4.1299 6.02584,3.62463 2.18105,5.45085 -2.59742,0.10573 -7.4936,3.34663 -3.62767,5.54395 1.64345,-0.82217 6.49317,-5.71297 6.67294,-2.49044 -2.78532,3.31115 -8.67094,4.59991 -5.95043,10.09851 -0.14706,1.93717 2.22289,5.8417 2.38345,1.69036 -0.29174,-2.60942 -0.27466,-9.86038 3.64824,-6.05741 -1.55047,2.76367 1.65839,4.017 1.46611,0.70751 1.23126,-3.60319 4.16329,-6.90216 1.96148,-10.6292 1.08569,-3.44275 2.47527,-8.92278 -1.1456,-10.9983 -0.27587,-2.38485 4.39556,-5.73004 -0.72382,-6.12506 -5.30946,-0.90828 1.67648,-3.69288 4.04177,-2.6646 4.32549,0.22232 9.16923,1.37034 11.4584,5.44637 6.2849,9.7073 5.68438,22.38166 2.17074,32.98508 -0.92944,4.64278 -5.22217,8.12432 -5.20477,12.92114 1.20847,6.56432 8.01624,9.99242 13.78201,11.95844 5.17953,1.02044 10.13826,3.62424 13.03186,8.19359 3.20397,4.79647 5.21645,10.49318 5.73671,16.22196 -2.35585,3.8145 -7.90047,3.87439 -11.89521,3.17059 -1.22451,-0.32543 -2.60284,-0.92802 -3.03818,-2.23257 z m -6.09078,-20.1003 c -1.41893,-3.47946 -9.20211,-2.51084 -5.13746,1.1248 1.04916,0.55257 8.14925,1.55777 5.13746,-1.1248 z m -35.40922,-40.45872 c -2.16266,-4.30335 -2.56624,5.59099 0,0 z m -10.77214,57.4647 c 0.9739,-2.58634 6.2446,-4.23216 3.35785,-0.21672 -0.93252,2.57294 -7.05087,4.43368 -3.35785,0.21672 z m 15.26777,1.08726 c -0.46155,-3.123 5.92769,-1.79651 2.3333,0.70108 -0.7844,0.59532 -1.93502,0.11193 -2.3333,-0.70108 z m 17.19822,0.36758 c -1.40203,-3.70988 5.69463,-2.0316 1.50018,0.56139 l -0.7246,-0.0276 -0.77558,-0.53379 z m -46.69385,-2.34909 c 0.2511,-3.17228 6.70537,-7.64119 4.5997,-1.5241 -0.30291,1.59959 -3.88314,3.82735 -4.5997,1.5241 z m 56,-0.51143 c 2.51293,-5.65641 2.40656,5.5417 0,0 z m -47.8,-2.7 c -4.0511,-2.74409 2.86178,-11.29262 3.00074,-4.49156 -2.27342,1.19476 -2.94972,4.14273 0.2778,3.98531 0.44919,2.1979 -2.50337,1.86609 -3.27854,0.50625 z m 17.04379,-0.05 c 1.31653,-2.24916 8.58375,-2.15975 3.4328,0.33832 -0.75747,0.55533 -3.95209,1.81288 -3.4328,-0.33832 z m 28.41342,-2.29909 c 1.98887,-3.91758 6.85421,2.62004 1.31167,1.52967 -0.84991,0.0565 -1.92843,-0.52139 -1.31167,-1.52967 z m -56.65721,-0.39189 c 1.68789,-4.90927 2.99691,2.75221 0.0789,0.36537 l -0.0789,-0.36537 z m 16.64757,-4.24293 c -1.89148,-2.61234 0.84049,-5.75092 1.68838,-1.54504 0.84852,1.72586 -0.70234,5.1602 -1.68838,1.54504 z m 4.5919,-1.82793 c 1.60255,-1.85967 3.66348,-1.43607 5.26053,-2.98816 3.96262,1.46685 -2.62956,3.48646 -3.72862,4.9303 -1.99518,0.50428 -2.92151,-0.26884 -1.53191,-1.94214 z m -9.23947,-3.57149 c 0.59993,-5.93389 4.17587,2.63959 0.61172,2.37949 -0.52277,-0.66971 -0.58181,-1.56896 -0.61172,-2.37949 z m -5.42997,0.69664 c -0.36608,-3.22691 5.22742,-3.96176 2.51439,-0.12486 -0.51631,1.26584 -1.79625,1.28548 -2.51439,0.12486 z m 16.42997,-54.05429 c -0.30675,-2.8402 2.78573,-3.62344 2.3713,-0.3321 1.77753,2.89278 -2.53827,3.01913 -2.3713,0.3321 z m 7,-4.85902 c -0.4203,-5.12456 8.43626,-1.94337 4.35831,0.72111 -1.36922,0.0212 -3.34407,0.40232 -4.35831,-0.72111 z m -1,-5.82423 c 0.17102,-4.09108 9.38834,-5.68544 7.35975,-0.21811 -2.21937,0.24293 -4.55297,-2.11058 -6.7961,0.31894 l -0.41224,0.0536 -0.15141,-0.1544 0,0 z" + id="path33023" + inkscape:connector-curvature="0" /> + <path + style="fill:#b3bcc9" + d="m 628.86191,861.63169 c -0.6243,-3.55935 -2.69727,-6.3569 -0.72148,-9.98987 0.12528,-5.45244 -2.79115,-10.65923 -7.09669,-13.89447 -1.2068,-2.85452 5.32777,0.70573 6.92377,1.01004 7.6726,3.41307 13.86355,11.22205 14.0998,19.78329 0.20205,5.97005 -6.54891,6.42322 -10.9269,5.80556 -1.73227,0.15131 -2.58324,-1.0909 -2.2785,-2.71455 z m -32.0895,-20.80784 c -4.43403,-1.14416 -6.64242,-4.93813 -9.61832,-8.11599 -5.8032,-0.96373 3.57616,-5.23189 -0.12424,-8.64226 -1.28875,-3.82859 -5.19745,-7.73842 -3.91246,-11.88366 3.57632,0.77406 7.98145,4.56157 11.43042,0.4736 4.54424,-4.37751 7.17602,-10.57138 8.26123,-16.71192 0.40261,-6.44762 0.58793,-13.17942 -1.38634,-19.39442 -3.68525,-5.04182 5.4099,-3.08901 7.46282,-1.22179 7.18838,5.3533 8.70986,15.22614 8.49736,23.6257 -0.24925,8.4967 -3.14336,16.73146 -7.72751,23.84074 -2.88991,4.70712 3.78023,7.4172 6.17011,10.48571 2.37199,1.75978 2.7988,3.59039 -0.47087,3.94333 -4.93227,3.54041 -11.38158,5.84263 -17.44005,4.36937 l -0.65495,-0.33776 -0.48717,-0.43065 -3e-5,0 z" + id="path33025" + inkscape:connector-curvature="0" /> + <path + style="fill:#a9b6c7" + d="m 629.67696,857.68169 c 0.69544,-5.83229 -1.1934,-11.42869 -3.06233,-16.84619 1.70492,-4.06189 7.7076,2.15936 9.08169,4.7283 3.47472,5.23289 5.9898,11.23822 6.74935,17.4968 -2.74907,2.48603 -8.71268,1.53936 -12.25687,0.52734 -1.14099,-1.73296 -0.47804,-3.96643 -0.51184,-5.90625 z m -35.07897,-19.01192 c -4.35373,-1.9881 -8.73775,-7.05736 -6.26711,-11.96771 0.37899,-3.87987 -6.19721,-8.74866 -2.61552,-11.649 3.81737,-0.0455 7.92323,-0.57969 10.70088,-3.51648 7.53861,-7.6238 9.37318,-19.29758 8.11009,-29.5788 -0.29347,-2.73658 -3.48318,-10.05061 2.13834,-6.90166 5.59048,2.86145 9.3559,8.5583 9.95363,14.79053 1.45238,11.54814 -0.99935,23.83469 -7.78522,33.40876 -3.2246,5.24149 5.70344,6.58552 5.5499,11.37054 -1.14464,5.117 -7.75884,5.97682 -12.15638,5.8855 -2.62827,-0.12443 -5.23793,-0.7377 -7.62861,-1.84168 z" + id="path33027" + inkscape:connector-curvature="0" /> + <path + style="fill:#a5aeba" + d="m 631.86191,856.01273 c 0.17627,-4.74944 -0.35601,-9.57132 -2.75943,-13.74195 1.4975,-4.03011 6.82738,2.83782 8.07858,5.41566 2.90201,4.84584 4.29026,10.45516 5.38214,15.90906 -3.35146,1.42092 -11.5911,2.28284 -10.66459,-3.67955 -0.043,-1.30058 -0.0346,-2.60214 -0.0367,-3.90322 z m -32,-17.72887 c -5.84776,-1.14965 -11.42672,-6.22518 -11.15451,-12.52353 -1.5003,-2.03434 -5.71528,-8.53816 -0.0642,-7.68024 6.73246,0.44741 11.31314,-5.91275 13.97222,-11.28778 4.52892,-9.55307 5.82631,-20.85993 2.53341,-31.00041 2.18117,-2.95131 6.79462,3.62386 8.51281,5.81939 4.3355,6.99236 3.55623,15.74508 2.3456,23.52395 -1.04534,6.26492 -3.43738,12.23617 -6.89396,17.55368 -4.11636,5.37273 4.86346,7.17375 5.40003,11.35344 -3.34598,2.78013 -7.84307,4.85802 -12.30072,4.56282 -0.78868,-0.0649 -1.57191,-0.18321 -2.35071,-0.32132 z" + id="path33029" + inkscape:connector-curvature="0" /> + <path + style="fill:#99a5b4" + d="m 634.44264,862.18169 c -1.18835,-6.44151 -0.7153,-13.29528 -3.22346,-19.40763 5.2155,1.71368 7.21913,7.68437 8.61488,12.50189 0.46756,3.74753 5.9571,10.77397 -1.54689,9.15113 -1.59711,0.0659 -3.7451,-0.21664 -3.84453,-2.24539 z M 597.36191,836.4722 c -5.21371,-2.6559 -8.38811,-8.12562 -9.45075,-13.73768 -3.02381,-5.26702 5.32539,-2.26568 7.46203,-5.22634 8.49017,-5.8936 12.46598,-16.48626 13.51852,-26.43011 1.08258,-4.83991 -1.47198,-10.13976 -0.95483,-14.48335 7.03021,4.3261 9.10897,13.3759 8.64448,21.14239 -0.4724,9.88319 -4.21327,19.33825 -9.42908,27.6489 0.19598,3.60522 8.59405,7.29794 2.21847,10.91971 -3.64557,2.02664 -8.25272,1.70657 -12.00884,0.16648 z" + id="path33031" + inkscape:connector-curvature="0" /> + <path + style="fill:#99a5b4;fill-opacity:1" + d="m 597.625,771.4375 c -3.21749,0.80995 -6.35889,1.89093 -9.49855,2.95674 -0.97154,0.37142 -1.85289,0.9729 -2.5952,1.69951 -0.85286,0.75372 -1.5183,1.68678 -2.24295,2.5579 -1.43359,1.82026 -2.70936,3.75542 -4.06955,5.6296 -0.88196,1.49498 -1.70097,3.03188 -2.28734,4.66945 -0.773,1.87386 -1.3796,3.81126 -2.03693,5.7276 -1.48856,4.58577 -2.86664,9.20755 -4.15527,13.85304 -0.38084,1.5389 -0.8175,3.06718 -1.11421,4.62491 -0.0983,1.32482 0.42765,2.57219 0.8125,3.8125 0.65443,1.89642 1.24797,3.81318 1.875,5.71875 0.4387,1.03708 1.53192,1.69185 2.625,1.8125 1.24203,-0.0193 2.52075,0.0375 3.71875,-0.34375 1.02063,-0.39402 1.60505,-1.36074 1.86562,-2.3781 0.73273,-2.56005 1.01952,-5.21766 1.50049,-7.83083 0.4005,-2.37627 0.77571,-4.75672 1.16514,-7.13482 0.60941,-2.21748 1.28797,-4.41783 2.03973,-6.59038 0.78279,-2.02938 1.71569,-3.99664 2.55402,-6.00337 0.89003,-1.89943 1.86665,-3.76562 3.01491,-5.52201 1.40777,-2.01133 3.33858,-3.57662 5.32812,-4.9803 1.23992,-0.75485 2.42213,-1.59957 3.68923,-2.3108 1.42795,-0.88217 2.95575,-1.58776 4.46774,-2.31189 0.99896,-0.30772 1.95269,-0.81445 2.99484,-0.95052 0.94868,-0.0968 1.93298,0.0577 2.84891,-0.26823 0.92455,-0.56794 0.73006,-1.98773 -0.15625,-2.5 -0.80724,-0.63096 -1.7434,-1.0782 -2.63346,-1.5793 -1.68129,-0.84475 -3.47432,-1.44213 -5.30345,-1.87163 -1.35714,-0.28247 -2.73917,-0.47084 -4.12559,-0.51782 l -0.18169,0.0202 -0.0996,0.0111 z" + id="path33033" + inkscape:connector-curvature="0" /> + <path + style="fill:#929ca9" + d="m 637.65036,862.68169 c -2.12222,-4.15541 -2.62958,-9.16791 -2.11037,-13.77435 2.73632,-0.59646 3.48937,6.19672 4.61588,8.71136 0.50969,2.43464 4.44929,8.54497 -0.88647,6.29893 l -0.88201,-0.55645 -0.73703,-0.67949 0,0 z m -43.75608,-31 c -2.94588,-2.28349 -7.18933,-8.93795 -1.36293,-10.29495 8.07323,-2.18725 12.69247,-10.20871 15.48792,-17.52164 2.75397,-7.08868 3.00962,-14.78608 2.34575,-22.27209 0.57168,-3.73359 4.26846,3.25102 4.56293,4.83879 2.8335,10.0499 1.08542,21.07617 -3.26319,30.43572 -1.47318,3.78479 -7.24627,8.22354 -2.8605,12.027 4.90812,2.55146 1.57086,6.14222 -2.55813,6.40295 -4.41484,1.02741 -9.15214,-0.44638 -12.35185,-3.61578 z" + id="path33035" + inkscape:connector-curvature="0" /> + <path + style="fill:#8a95a3;fill-opacity:1" + d="m 604.07679,778.57601 c -2.07993,0.18622 -4.16688,0.39931 -6.19063,0.93582 -1.96265,0.5268 -3.86859,1.26151 -5.67823,2.18771 -1.2785,0.72607 -2.59489,1.40817 -3.73224,2.35094 -1.87066,1.41739 -3.50157,3.11504 -5.0864,4.83803 -0.8029,1.1366 -1.66147,2.24315 -2.35815,3.44834 -1.04606,1.93489 -1.92687,3.96033 -2.55709,6.06935 -1.02826,3.17356 -1.89607,6.39655 -2.77337,9.61433 -0.79085,2.99079 -1.58802,5.98101 -2.3162,8.9875 -0.72532,3.0427 -1.21047,6.14099 -1.45053,9.25973 -0.0808,1.12348 -0.27816,2.24516 -0.13834,3.37206 0.0627,1.15775 0.14707,2.31618 0.28118,3.46744 0.0295,0.43529 0.64114,0.88693 0.8125,0.28125 0.43782,-0.93637 0.98489,-1.88776 2.03125,-2.21875 0.77048,-0.37522 1.64462,-0.58501 2.49468,-0.42232 0.99503,0.20928 2.02353,0.51766 2.87283,1.09107 1.15247,0.76152 2.17094,1.75918 2.82587,2.98452 0.67432,0.79355 0.86715,1.92774 1.49412,2.69048 0.55618,0.0517 0.46735,-0.84631 0.60893,-1.24468 0.20794,-1.87479 -0.22577,-3.73167 -0.54643,-5.56782 -0.32562,-1.64053 -0.80423,-3.25041 -0.99895,-4.91491 -0.27135,-1.81202 -0.60341,-3.6237 -0.59359,-5.46277 -0.0577,-1.99807 -0.16648,-3.99431 -0.14423,-5.99405 -0.0352,-1.23626 -10e-4,-2.47036 0.11341,-3.70195 0.24423,-2.90098 0.56334,-5.79741 0.99836,-8.67632 0.6275,-2.95685 1.33887,-5.92442 2.64286,-8.66725 0.61629,-1.36529 1.23898,-2.73456 1.95854,-4.04735 0.72079,-1.14986 1.59611,-2.22584 2.73697,-2.98238 1.71322,-1.17297 3.55581,-2.14034 5.44826,-2.98937 1.80419,-0.81317 3.6119,-1.62339 5.33837,-2.5949 0.82255,-0.40084 1.88367,-0.6713 2.3005,-1.56976 0.12731,-0.30615 0.0397,-0.72575 -0.39425,-0.52399 z" + id="path33037" + inkscape:connector-curvature="0" /> + <path + style="fill:#8a95a3" + d="m 638.56908,861.68169 c -1.01336,-1.80767 1.28793,-7.15927 1.24215,-2.50022 0.42403,2.21568 -0.44461,7.79222 -1.24215,2.50022 l 0,0 z m -43.0654,-31 c -2.9868,-1.67058 -7.00655,-6.75545 -1.26272,-7.50408 4.83247,-2.49559 9.8284,-5.69893 12.52164,-10.55778 1.11545,-4.62828 4.11893,-8.61975 4.84147,-13.41654 0.98527,-4.74585 2.52559,-9.7007 1.45289,-14.54866 3.4059,4.0618 2.72684,9.97803 2.40567,14.94875 -0.99576,8.63373 -3.58356,17.28503 -8.78479,24.35117 -2.28719,3.74841 7.19829,8.26089 -0.21265,9.84972 -3.91814,1.46539 -7.97066,-0.66912 -10.96151,-3.12258 z" + id="path33039" + inkscape:connector-curvature="0" /> + </g> + <path + style="fill:#dce2e8" + d="m 930.58903,944.17704 c 0.002,-1.27891 0.38742,-2.56313 0.91225,-3.72458 1.04246,-2.13363 3.42948,-2.94956 5.38886,-4.0012 1.12915,-0.33191 2.18833,-1.33369 1.14411,-2.41735 -1.54271,-2.95014 -2.11639,-6.71179 -0.50818,-9.7557 0.88165,-1.77833 2.98874,-2.89762 4.94381,-2.33322 1.75777,0.34808 3.17106,1.72703 3.70073,3.42104 1.08904,3.18615 0.29318,6.78268 -1.57691,9.5145 -0.32077,0.95344 1.42229,1.26439 2.03608,1.81786 1.30365,0.72466 2.79982,1.17185 3.82809,2.31537 1.23575,1.28065 2.36238,3.01211 2.09015,4.86892 -0.64314,0.70795 -2.02851,0.3424 -2.96759,0.53283 -5.77844,0.21695 -11.56977,0.27458 -17.34745,0.009 -0.54437,-0.0632 -1.14143,-0.0178 -1.64395,-0.24773 z" + id="path33041" + inkscape:connector-curvature="0" /> + <path + style="fill:#d4dbe2" + d="m 930.67291,944.42142 c -0.0724,-2.5311 1.45644,-4.85854 3.53722,-6.19868 1.33158,-0.98375 2.99369,-1.40931 4.29607,-2.42744 0.68746,-0.96813 -0.57233,-1.94187 -0.80703,-2.88555 -1.24802,-2.88219 -1.4267,-6.53314 0.5443,-9.14386 1.4219,-1.98029 4.54798,-2.22896 6.32223,-0.60477 1.91111,1.89773 2.17018,4.88074 1.70769,7.40746 -0.2599,1.57312 -1.02764,2.98482 -1.88179,4.30465 -0.15425,1.14021 1.44673,1.51879 2.20895,2.10313 1.368,0.75961 2.9979,1.13594 4.01037,2.42462 1.09812,1.2391 1.86679,2.88806 1.75249,4.56961 -0.82716,0.75673 -2.21297,0.37983 -3.27132,0.53008 -6.06549,0.043 -12.13299,0.0638 -18.19761,-0.0574 l -0.22157,-0.0219 0,0 z" + id="path33043" + inkscape:connector-curvature="0" /> + <path + style="fill:#a9b6c7;fill-opacity:1" + d="m 941.41884,922.52586 c -0.50284,0.005 -0.98156,0.19884 -1.39439,0.47623 -0.43195,0.27955 -0.82172,0.61961 -1.23115,0.93064 -0.50013,0.41122 -0.99648,0.84975 -1.33724,1.40694 -0.34367,0.63536 -0.48593,1.35795 -0.56066,2.07032 -0.0797,0.66306 -0.0792,1.33224 -0.10537,1.99878 -10e-4,0.92261 -0.037,1.84497 -0.0335,2.76745 0.0207,1.23076 0.12595,2.45852 0.15412,3.68876 -0.004,0.39735 0.004,0.79848 -0.0342,1.19297 -0.0592,0.18359 -0.13656,0.54545 0.13863,0.57563 0.25572,-0.005 0.29796,-0.33661 0.27876,-0.53367 0.0554,-0.40554 0.31966,-0.75604 0.63456,-1.00424 0.20566,-0.12032 0.47599,-0.11845 0.68603,-0.0151 0.32028,0.25811 0.5723,0.59421 0.90457,0.84049 0.43132,0.36787 0.84868,0.75595 1.27314,1.12897 0.23801,0.16933 0.54768,0.1732 0.82742,0.16144 0.25764,-0.0406 0.51513,-0.0856 0.77668,-0.0887 0.21569,0.0389 0.56162,-0.17114 0.33437,-0.39119 -0.19401,-0.16968 -0.45533,-0.0565 -0.68359,-0.096 -0.44453,-0.0162 -0.87353,-0.26893 -1.10914,-0.64385 -0.24206,-0.42458 -0.38564,-0.89496 -0.58551,-1.33948 -0.40074,-0.95374 -0.70208,-1.94759 -0.92887,-2.95606 -0.11536,-0.52165 -0.22901,-1.04544 -0.25098,-1.58112 -0.10683,-1.2488 -0.004,-2.50089 0.0525,-3.74935 0.10413,-0.67758 0.22644,-1.37805 0.60881,-1.96148 0.34002,-0.56681 0.77478,-1.07843 1.28703,-1.49705 0.32559,-0.28406 0.67308,-0.54232 1.0066,-0.81596 0.15853,-0.1892 0.0309,-0.53417 -0.22437,-0.55046 -0.1593,-0.0351 -0.32289,-0.0175 -0.48428,-0.0149 z" + id="path33045" + inkscape:connector-curvature="0" /> + <path + style="fill:#b6c5d8;fill-opacity:1" + d="m 940.85343,922.01322 c -0.84434,0.14117 -1.64669,0.47307 -2.38141,0.90626 -0.35365,0.22657 -0.69905,0.47052 -0.98945,0.77592 -0.54611,0.52759 -0.97889,1.16912 -1.28104,1.86463 -0.416,1.07504 -0.7675,2.17339 -1.09674,3.27768 -0.28433,0.92124 -0.55304,1.84802 -0.86517,2.76015 -0.23658,0.55945 -0.54416,1.08684 -0.75912,1.65569 -0.0173,0.20075 -0.12563,0.41351 -0.0377,0.61064 0.083,0.15333 0.14786,-0.17542 0.2181,-0.24171 0.17076,-0.28228 0.40496,-0.52074 0.60362,-0.78356 0.48867,-0.58894 0.98728,-1.17196 1.53038,-1.71131 0.21525,-0.1635 0.46587,-0.27651 0.72372,-0.35432 0.2314,-0.0661 0.49351,-0.0227 0.67198,0.14557 0.19257,0.16608 0.25385,0.43823 0.2235,0.68253 -0.0166,0.54187 -0.15002,1.07023 -0.22715,1.60461 -0.091,0.36366 -0.14379,0.73537 -0.216,1.10298 -0.005,0.21347 0.19371,0.45788 0.42217,0.39956 0.29074,-0.10075 0.40676,-0.41297 0.48541,-0.68379 0.26076,-0.83844 0.28084,-1.72415 0.31645,-2.59437 0.0609,-0.93498 0.10377,-1.87233 0.21727,-2.80277 0.12568,-0.88093 0.30071,-1.75642 0.54894,-2.61129 0.1225,-0.35529 0.31005,-0.68091 0.51442,-0.99453 0.25213,-0.37267 0.58523,-0.71777 1.01595,-0.87509 0.90994,-0.36961 1.89519,-0.49087 2.82704,-0.79157 0.20653,-0.0998 0.40274,-0.3323 0.32417,-0.57295 -0.0882,-0.27068 -0.37953,-0.38647 -0.63031,-0.45732 -0.55552,-0.15961 -1.12935,-0.24929 -1.70431,-0.30145 -0.15163,-0.005 -0.30311,-0.0269 -0.45473,-0.0102 z" + id="path33047" + inkscape:connector-curvature="0" /> + <path + style="fill:#c9cfd7" + d="m 930.78309,944.10853 c 0.49207,-1.6304 0.63367,-3.5221 1.99807,-4.72326 1.65649,-1.58122 3.97873,-2.12722 5.77823,-3.48946 0.87926,-1.07577 -0.67801,-2.19067 -0.85931,-3.28204 -0.99951,-2.69415 -1.20178,-5.95579 0.36082,-8.48008 1.37137,-2.10684 4.78997,-2.6379 6.56032,-0.73533 2.02979,2.1573 2.11716,5.46483 1.27218,8.15739 -0.36052,1.34637 -1.20583,2.48176 -1.71098,3.76351 0.66625,0.85102 1.72469,1.32374 2.63795,1.88081 1.47615,0.77697 3.27687,1.21227 4.21773,2.71994 0.71646,1.11928 1.06675,2.43347 1.40141,3.7036 -0.36226,1.19731 -2.1273,0.70226 -3.10209,0.89103 -5.5011,0.0294 -11.00341,0.038 -16.50434,-0.0276 -0.55768,-0.12141 -1.81713,0.17975 -2.04999,-0.37853 z" + id="path33049" + inkscape:connector-curvature="0" /> + <path + style="fill:#b6c5d8" + d="m 931.00416,944.108 c 0.49608,-1.78948 0.80792,-3.88029 2.45504,-5.02016 1.5966,-1.24645 3.65736,-1.73791 5.20961,-3.03771 0.85509,-1.17807 -0.59722,-2.38531 -0.80898,-3.55888 -0.83809,-2.6188 -0.99618,-5.62861 0.20739,-8.16071 0.41646,-0.86775 1.26397,-1.59821 2.27471,-1.53344 1.01132,-0.2791 2.05712,-0.9922 3.12135,-0.42685 1.80002,0.92049 2.42792,3.08383 2.65269,4.95675 0.28074,2.53656 -0.35566,5.15523 -1.80316,7.26108 -0.738,1.10551 0.92343,1.70044 1.59046,2.27719 1.07424,0.8004 2.39496,1.10579 3.54725,1.75065 1.85397,1.08569 2.5919,3.28762 2.8332,5.30821 -0.70363,0.82536 -2.14199,0.40912 -3.1468,0.57408 -5.55189,0.0428 -11.10574,0.0721 -16.65699,-0.03 -0.35633,-0.11273 -1.39636,0.12806 -1.47577,-0.36017 z" + id="path33051" + inkscape:connector-curvature="0" /> + <path + style="fill:#89929e" + d="m 943.35106,936.59023 c -1.5707,-0.042 0.45743,-2.0083 0.50896,-0.51547 0.0616,0.25529 -0.21951,0.8328 -0.50896,0.51547 z m -2.21754,-0.62412 c -1.21345,-0.78665 0.91838,-1.34058 0.89622,-0.23774 -0.08,0.39757 -0.65079,0.61095 -0.89622,0.23774 z m 1.99737,-1.97628 c 1.30569,-1.03414 1.00996,-3.01432 2.2054,-4.1282 0.0713,1.43272 -0.1967,3.14931 -1.46308,4.01524 -0.22811,0.11052 -0.49137,0.15967 -0.74232,0.11296 z" + id="path33053" + inkscape:connector-curvature="0" /> + <path + style="fill:#b4c3d5" + d="m 931.30617,944.33771 c -0.17093,-0.51329 0.53726,-1.05673 0.32359,-0.16117 0.0246,0.23837 -0.1573,0.54788 -0.32359,0.16117 z m 9.01639,-0.0338 c 0.33435,-0.58788 1.33448,0.21625 0.3447,0.22086 -0.11949,0 -0.34377,-0.0563 -0.3447,-0.22086 z m 1.85681,-0.10981 c -0.42609,-0.76584 0.54008,-0.78753 0.26825,0.0157 -0.0792,0.5605 -0.16716,0.22322 -0.26825,-0.0157 z m 6.46601,-0.14641 c -0.0341,-0.81491 -1.53336,-0.18872 -0.75922,-1.06527 0.83504,-0.92668 -0.22015,-1.56935 0.0793,-2.58246 -0.3265,-1.17526 -1.07255,0.86545 -1.52285,-0.23038 -0.55159,-0.18345 -1.48271,-0.54511 -1.89225,-0.44825 0.4325,1.00518 -1.22457,0.93673 -1.12348,1.98748 -0.69435,1.15169 -1.01648,-1.26194 0.10054,-1.14743 0.728,-0.40077 0.63574,-1.4649 -0.26668,-0.78193 -0.98993,0.57559 -1.95438,0.0318 -2.64884,-0.64163 -0.37986,0.24775 -1.73465,1.43354 -1.50288,0.28152 0.74989,-0.64215 -0.14154,-2.15258 -1.03555,-1.97561 -1.23196,-0.12623 0.59015,-1.17102 0.86277,-1.60853 0.44853,-1.05295 -0.76544,-1.8907 -0.89453,-2.90681 -0.30519,-1.22563 -0.68272,-2.54998 -0.36933,-3.805 0.63843,-0.43648 -1.45686,-1.53087 -0.0307,-1.58695 0.71751,0.52764 2.62011,-0.17829 2.09012,-1.14537 0.34562,-0.99631 1.45368,0.87441 0.52616,1.31497 -0.62661,0.0255 -1.80777,0.80734 -0.87514,1.33742 0.39646,-0.19834 1.56642,-1.3782 1.60978,-0.60079 -0.67193,0.79878 -2.09178,1.10968 -1.43548,2.43617 -0.0355,0.46733 0.53625,1.40926 0.57498,0.40779 -0.0704,-0.6295 -0.0663,-2.37873 0.88011,-1.4613 -0.37404,0.66671 0.40007,0.96907 0.35368,0.17068 0.29703,-0.86924 1.00436,-1.66508 0.47319,-2.5642 0.26192,-0.83053 0.59714,-2.15254 -0.27636,-2.65324 -0.0666,-0.57532 1.06039,-1.38232 -0.17462,-1.47762 -1.28086,-0.21911 0.40444,-0.89087 0.97504,-0.64281 1.04349,0.0536 2.212,0.33058 2.76424,1.31389 1.51618,2.3418 1.37131,5.39938 0.52367,7.95736 -0.22422,1.12003 -1.2598,1.95992 -1.2556,3.11711 0.29153,1.58358 1.93384,2.41058 3.32478,2.88487 1.24952,0.24617 2.44577,0.87431 3.14382,1.97663 0.77293,1.15711 1.25843,2.53139 1.38393,3.91341 -0.56832,0.92021 -1.90591,0.93466 -2.86961,0.76488 -0.2954,-0.0785 -0.62791,-0.2239 -0.73293,-0.5386 z m -1.46935,-4.84902 c -0.3423,-0.83939 -2.21993,-0.60572 -1.23937,0.27135 0.2531,0.1333 1.96594,0.3758 1.23937,-0.27135 z m -8.54216,-9.76031 c -0.52172,-1.03814 -0.61908,1.34878 0,0 z m -2.59868,13.86286 c 0.23494,-0.62395 1.50645,-1.02098 0.81005,-0.0523 -0.22496,0.62069 -1.70096,1.06957 -0.81005,0.0523 z m 3.68321,0.26228 c -0.11134,-0.7534 1.43,-0.43339 0.56289,0.16913 -0.18923,0.14361 -0.46681,0.027 -0.56289,-0.16913 z m 4.14892,0.0887 c -0.33823,-0.89498 1.37378,-0.49011 0.3619,0.13543 l -0.1748,-0.007 -0.1871,-0.12877 z m -11.26448,-0.5667 c 0.0606,-0.76529 1.61761,-1.84337 1.10964,-0.36768 -0.0731,0.38589 -0.93677,0.92333 -1.10964,0.36768 z m 13.50951,-0.12337 c 0.60622,-1.36456 0.58056,1.33688 0,0 z m -11.53133,-0.65135 c -0.97729,-0.66199 0.69038,-2.72425 0.7239,-1.08356 -0.54844,0.28823 -0.71159,0.99941 0.067,0.96142 0.10836,0.53022 -0.60392,0.45018 -0.79092,0.12214 z m 4.11166,-0.0121 c 0.3176,-0.5426 2.07076,-0.52103 0.82814,0.0816 -0.18274,0.13396 -0.95341,0.43734 -0.82814,-0.0816 z m 6.85449,-0.55463 c 0.4798,-0.94509 1.65352,0.63205 0.31643,0.36902 -0.20504,0.0138 -0.46522,-0.12578 -0.31643,-0.36902 z m -13.66805,-0.0946 c 0.40719,-1.18431 0.72298,0.66395 0.019,0.0882 l -0.019,-0.0882 z m 4.01608,-1.02356 c -0.4563,-0.63021 0.20276,-1.38736 0.4073,-0.37273 0.2047,0.41635 -0.16943,1.24484 -0.4073,0.37273 z m 1.10775,-0.44098 c 0.3866,-0.44862 0.88379,-0.34643 1.26906,-0.72086 0.95595,0.35386 -0.63436,0.84108 -0.8995,1.18939 -0.48132,0.12165 -0.70479,-0.0649 -0.36956,-0.46853 z m -2.22894,-0.86159 c 0.14473,-1.43149 1.00739,0.63678 0.14758,0.57404 -0.12612,-0.16157 -0.14036,-0.3785 -0.14758,-0.57404 z m -1.30993,0.16806 c -0.0883,-0.77846 1.26107,-0.95574 0.60658,-0.0301 -0.12456,0.30537 -0.43333,0.31011 -0.60658,0.0301 z m 3.96359,-13.04011 c -0.074,-0.68518 0.67203,-0.87413 0.57205,-0.0801 0.42881,0.69786 -0.61233,0.72834 -0.57205,0.0801 z m 1.68868,-1.1722 c -0.10139,-1.23625 2.03518,-0.46882 1.05141,0.17396 -0.33032,0.005 -0.80673,0.0971 -1.05141,-0.17396 z m -0.24124,-1.40504 c 0.0413,-0.98694 2.26486,-1.37157 1.77548,-0.0526 -0.53541,0.0586 -1.09837,-0.50916 -1.6395,0.0769 l -0.0994,0.0129 -0.0365,-0.0372 0,0 z" + id="path33055" + inkscape:connector-curvature="0" /> + <path + style="fill:#b3bcc9" + d="m 949.00724,943.8547 c -0.15061,-0.85868 -0.65069,-1.53355 -0.17405,-2.40998 0.0302,-1.31534 -0.67334,-2.57144 -1.71202,-3.35191 -0.29112,-0.68863 1.28528,0.17025 1.6703,0.24366 1.85095,0.82338 3.34446,2.70722 3.40145,4.77255 0.0488,1.44021 -1.57986,1.54954 -2.63601,1.40053 -0.4179,0.0365 -0.62319,-0.26317 -0.54967,-0.65485 z m -7.74131,-5.01971 c -1.06967,-0.27602 -1.60242,-1.19128 -2.32033,-1.95791 -1.39997,-0.23249 0.86271,-1.26215 -0.03,-2.08487 -0.3109,-0.92361 -1.25384,-1.86682 -0.94385,-2.86683 0.86276,0.18674 1.92545,1.10044 2.75749,0.11426 1.09625,-1.05604 1.73115,-2.55026 1.99295,-4.03161 0.0971,-1.55543 0.14183,-3.17941 -0.33445,-4.67873 -0.88903,-1.21629 1.30509,-0.74519 1.80034,-0.29474 1.73414,1.29143 2.10118,3.67317 2.04991,5.69949 -0.0601,2.04975 -0.7583,4.03631 -1.86419,5.75136 -0.69716,1.13555 0.91195,1.78934 1.48849,2.52959 0.57222,0.42453 0.67518,0.86615 -0.1136,0.95129 -1.18986,0.85409 -2.7457,1.40948 -4.20725,1.05407 l -0.15801,-0.0815 -0.11752,-0.10389 -10e-6,0 z" + id="path33057" + inkscape:connector-curvature="0" /> + <path + style="fill:#a9b6c7" + d="m 949.20386,942.9018 c 0.16777,-1.40699 -0.28789,-2.75708 -0.73876,-4.064 0.4113,-0.97989 1.85939,0.52093 2.19088,1.14066 0.83824,1.26239 1.44499,2.71112 1.62822,4.22095 -0.66319,0.59972 -2.10186,0.37136 -2.95686,0.1272 -0.27525,-0.41804 -0.11532,-0.95685 -0.12348,-1.42481 z m -8.46249,-4.58646 c -1.0503,-0.47961 -2.1079,-1.70253 -1.51188,-2.88711 0.0914,-0.93598 -1.49502,-2.11053 -0.63097,-2.81021 0.9209,-0.011 1.91141,-0.13985 2.58149,-0.84832 1.81862,-1.83918 2.2612,-4.65537 1.95649,-7.13563 -0.0708,-0.66017 -0.84029,-2.42462 0.51585,-1.66496 1.34866,0.6903 2.25703,2.06461 2.40123,3.56808 0.35037,2.78589 -0.24109,5.74991 -1.87812,8.05957 -0.7779,1.26446 1.37591,1.5887 1.33887,2.74304 -0.27614,1.23443 -1.87176,1.44186 -2.93262,1.41983 -0.63405,-0.03 -1.26361,-0.17797 -1.84034,-0.44429 z" + id="path33059" + inkscape:connector-curvature="0" /> + <path + style="fill:#a5aeba" + d="m 949.73096,942.49916 c 0.0425,-1.14575 -0.0859,-2.30898 -0.66569,-3.31511 0.36126,-0.97223 1.64705,0.6846 1.94889,1.30648 0.70008,1.16902 1.03499,2.52221 1.29839,3.83792 -0.80851,0.34278 -2.79625,0.5507 -2.57273,-0.88765 -0.0104,-0.31376 -0.008,-0.62776 -0.009,-0.94164 z m -7.71971,-4.27692 c -1.41072,-0.27734 -2.7566,-1.50177 -2.69093,-3.02119 -0.36193,-0.49077 -1.37876,-2.05976 -0.0155,-1.85279 1.62415,0.10793 2.7292,-1.4264 3.37068,-2.72308 1.09256,-2.30459 1.40554,-5.03227 0.61116,-7.47857 0.52619,-0.71198 1.63914,0.87422 2.05364,1.40388 1.0459,1.68684 0.85791,3.79836 0.56585,5.67494 -0.25217,1.51136 -0.82923,2.95187 -1.6631,4.23467 -0.99304,1.29612 1.17326,1.7306 1.30271,2.73892 -0.80719,0.67068 -1.89207,1.17195 -2.96744,1.10074 -0.19026,-0.0157 -0.37921,-0.0442 -0.56709,-0.0775 z" + id="path33061" + inkscape:connector-curvature="0" /> + <path + style="fill:#99a5b4" + d="m 950.35354,943.98738 c -0.28668,-1.55395 -0.17256,-3.20737 -0.77763,-4.68192 1.25819,0.41341 1.74155,1.85378 2.07826,3.01596 0.1128,0.90407 1.4371,2.59913 -0.37317,2.20764 -0.38529,0.0159 -0.90347,-0.0523 -0.92746,-0.54168 z m -8.9454,-6.20219 c -1.25776,-0.64071 -2.02355,-1.96023 -2.27991,-3.31409 -0.72946,-1.27062 1.28471,-0.54658 1.80015,-1.26081 2.04818,-1.42178 3.00731,-3.97716 3.26123,-6.37603 0.26116,-1.16758 -0.35511,-2.44612 -0.23035,-3.49398 1.69598,1.04364 2.19746,3.22682 2.08541,5.10042 -0.11397,2.38423 -1.01642,4.66518 -2.27469,6.67005 0.0473,0.86973 2.07324,1.76056 0.53519,2.63428 -0.87946,0.48891 -1.9909,0.4117 -2.89703,0.0402 z" + id="path33063" + inkscape:connector-curvature="0" /> + <path + style="fill:#929ca9" + d="m 951.12737,944.108 c -0.51196,-1.00245 -0.63436,-2.21167 -0.5091,-3.32294 0.66011,-0.14389 0.84178,1.49491 1.11354,2.10154 0.12295,0.58732 1.07335,2.0614 -0.21386,1.51955 l -0.21277,-0.13422 -0.17781,-0.16393 0,0 z m -10.55576,-7.47848 c -0.71067,-0.55087 -1.73436,-2.1562 -0.3288,-2.48356 1.9476,-0.52766 3.06195,-2.46276 3.73633,-4.22694 0.66437,-1.71008 0.72604,-3.56701 0.56589,-5.37294 0.13791,-0.9007 1.02973,0.78428 1.10076,1.16731 0.68356,2.42445 0.26185,5.08444 -0.78721,7.34235 -0.35539,0.91304 -1.7481,1.98385 -0.69007,2.9014 1.18404,0.61552 0.37896,1.48176 -0.61713,1.54466 -1.06504,0.24785 -2.20787,-0.10769 -2.97977,-0.87228 z" + id="path33065" + inkscape:connector-curvature="0" /> + <path + style="fill:#8a95a3" + d="m 951.34901,943.86676 c -0.24447,-0.43609 0.3107,-1.72712 0.29966,-0.60315 0.10229,0.53449 -0.10726,1.8798 -0.29966,0.60315 l 0,0 z m -10.38915,-7.47848 c -0.72054,-0.40301 -1.69027,-1.62969 -0.30462,-1.81029 1.16579,-0.60204 2.37102,-1.37482 3.02074,-2.54697 0.26909,-1.11653 0.99365,-2.07944 1.16796,-3.23662 0.23769,-1.14489 0.60927,-2.34021 0.3505,-3.50974 0.82164,0.97988 0.65782,2.40712 0.58034,3.60626 -0.24022,2.08281 -0.8645,4.16986 -2.11925,5.8745 -0.55177,0.90427 1.73652,1.99287 -0.0513,2.37616 -0.94522,0.35351 -1.92285,-0.16142 -2.64437,-0.7533 z" + id="path33067" + inkscape:connector-curvature="0" /> + <path + style="fill:#8a95a3;fill-opacity:1" + d="m 943.02805,923.81825 c -0.50177,0.0449 -1.00522,0.0963 -1.49344,0.22576 -0.47347,0.12709 -0.93326,0.30433 -1.36982,0.52777 -0.30842,0.17515 -0.62599,0.3397 -0.90037,0.56714 -0.45128,0.34193 -0.84472,0.75147 -1.22705,1.16713 -0.19369,0.2742 -0.40081,0.54114 -0.56888,0.83188 -0.25235,0.46678 -0.46484,0.9554 -0.61687,1.46418 -0.24806,0.76559 -0.45741,1.54311 -0.66906,2.31937 -0.19078,0.7215 -0.38309,1.44287 -0.55876,2.16815 -0.17498,0.73403 -0.29201,1.48146 -0.34993,2.23383 -0.0195,0.27103 -0.0671,0.54163 -0.0334,0.81348 0.0151,0.2793 0.0355,0.55876 0.0678,0.83649 0.007,0.10501 0.15467,0.21396 0.19601,0.0679 0.10562,-0.22589 0.2376,-0.45541 0.49002,-0.53525 0.18587,-0.0905 0.39675,-0.14113 0.60182,-0.10188 0.24004,0.0505 0.48816,0.12488 0.69305,0.26321 0.27802,0.18371 0.52372,0.42438 0.68171,0.71999 0.16268,0.19143 0.2092,0.46505 0.36045,0.64905 0.13417,0.0125 0.11274,-0.20417 0.1469,-0.30027 0.0502,-0.45227 -0.0545,-0.90023 -0.13183,-1.34319 -0.0785,-0.39576 -0.19401,-0.78413 -0.24098,-1.18567 -0.0655,-0.43714 -0.14557,-0.87419 -0.1432,-1.31785 -0.0139,-0.48202 -0.0402,-0.96359 -0.0348,-1.44601 -0.008,-0.29824 -2.4e-4,-0.59595 0.0274,-0.89306 0.0589,-0.69984 0.1359,-1.39858 0.24085,-2.09309 0.15138,-0.71331 0.32299,-1.42921 0.63756,-2.09089 0.14868,-0.32937 0.2989,-0.65969 0.47248,-0.97639 0.17389,-0.2774 0.38505,-0.53697 0.66027,-0.71947 0.4133,-0.28297 0.85781,-0.51634 1.31435,-0.72116 0.43524,-0.19617 0.87134,-0.39163 1.28783,-0.626 0.19844,-0.0967 0.45442,-0.16195 0.55498,-0.37869 0.0307,-0.0739 0.01,-0.17508 -0.0951,-0.12641 z" + id="path33069" + inkscape:connector-curvature="0" /> + <path + sodipodi:nodetypes="cccccccccccccccccccccccccccccc" + style="fill:#99a5b4;fill-opacity:1" + d="m 941.30576,922.262 c -2.30799,0.42179 -4.16251,2.32674 -4.81728,4.53835 -1.1649,2.62595 -1.70571,5.55638 -1.35538,8.41966 0.005,0.25892 0.0352,0.52059 -0.009,0.77766 0.90512,-1.08651 0.91732,-2.57442 1.44289,-3.83498 0.81336,-2.57684 2.12136,-5.10808 4.26397,-6.82486 1.05327,-0.88861 2.28631,-1.53931 3.55077,-2.07317 0.17421,-0.43871 -0.35603,-0.78282 -0.74634,-0.75388 -0.752,-0.22268 -1.54788,-0.29672 -2.32948,-0.24878 z" + id="path33071" + inkscape:connector-curvature="0" /> + <path + style="fill:#dce2e8" + d="m 1092.5142,862.96792 c 0.01,-5.30143 1.6059,-10.6248 3.7815,-15.43929 4.3212,-8.8444 14.216,-12.22658 22.338,-16.5859 4.6806,-1.37584 9.0712,-5.52844 4.7426,-10.02046 -6.3949,-12.22902 -8.7729,-27.8219 -2.1065,-40.43961 3.6547,-7.37162 12.389,-12.01132 20.4933,-9.67176 7.2863,1.44287 13.1447,7.15895 15.3403,14.18101 4.5144,13.20733 1.2153,28.11579 -6.5366,39.43979 -1.3297,3.95225 5.8957,5.24121 8.44,7.53545 5.4039,3.00388 11.6059,4.85759 15.8683,9.59775 5.1225,5.30858 9.7926,12.48585 8.6642,20.18284 -2.666,2.93451 -8.4087,1.41927 -12.3014,2.20861 -23.9529,0.89934 -47.9593,1.13829 -71.9091,0.0384 -2.2566,-0.26203 -4.7316,-0.0739 -6.8146,-1.02681 z" + id="path33075" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#d4dbe2" + d="m 1092.8619,863.98091 c -0.3001,-10.49202 6.0373,-20.13978 14.6626,-25.69496 5.5197,-4.0779 12.4095,-5.84192 17.8082,-10.06232 2.8497,-4.01312 -2.3724,-8.04948 -3.3454,-11.96125 -5.1733,-11.94737 -5.914,-27.08139 2.2563,-37.90341 5.8941,-8.20878 18.8524,-9.23957 26.2071,-2.50691 7.922,7.8665 8.9959,20.23178 7.0788,30.70563 -1.0774,6.52092 -4.2598,12.37274 -7.8005,17.84376 -0.6394,4.72644 5.997,6.29571 9.1566,8.71794 5.6707,3.14875 12.427,4.70876 16.6239,10.05061 4.552,5.13638 7.7383,11.97169 7.2645,18.94209 -3.4288,3.13676 -9.1732,1.57453 -13.5604,2.19728 -25.1428,0.17847 -50.294,0.26439 -75.4332,-0.23791 l -0.9185,-0.0906 0,0 z" + id="path33077" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#a9b6c7;fill-opacity:1" + d="m 1137.4063,773.21875 c -2.0844,0.0218 -4.0688,0.82425 -5.7801,1.97408 -1.7905,1.15879 -3.4062,2.56842 -5.1034,3.85771 -2.0732,1.7046 -4.1307,3.52243 -5.5432,5.83208 -1.4246,2.63374 -2.0143,5.62903 -2.3241,8.58199 -0.3303,2.74853 -0.3282,5.52241 -0.4367,8.28539 -0.01,3.82444 -0.1536,7.64782 -0.1389,11.4717 0.086,5.10181 0.5221,10.19115 0.6389,15.29078 -0.017,1.6471 0.017,3.30988 -0.1419,4.94514 -0.2452,0.76103 -0.5661,2.26102 0.5747,2.38613 1.06,-0.019 1.2351,-1.39535 1.1555,-2.21222 0.2295,-1.68105 1.3251,-3.13394 2.6304,-4.16278 0.8525,-0.49875 1.9731,-0.491 2.8438,-0.0625 1.3276,1.06993 2.3723,2.46316 3.7496,3.48406 1.7879,1.52488 3.518,3.13357 5.2774,4.67984 0.9867,0.7019 2.2703,0.71795 3.4299,0.66919 1.068,-0.16832 2.1353,-0.35487 3.2195,-0.36775 0.8941,0.16109 2.328,-0.70942 1.3861,-1.62159 -0.8042,-0.70337 -1.8875,-0.23431 -2.8337,-0.39781 -1.8427,-0.0672 -3.621,-1.11476 -4.5976,-2.66893 -1.0034,-1.75997 -1.5986,-3.7098 -2.4271,-5.55243 -1.6611,-3.95349 -2.9103,-8.07322 -3.8504,-12.25354 -0.4782,-2.16238 -0.9493,-4.33361 -1.0404,-6.55414 -0.4428,-5.17654 -0.016,-10.36675 0.2179,-15.5419 0.4316,-2.80874 0.9386,-5.71235 2.5236,-8.13079 1.4095,-2.34955 3.2117,-4.47033 5.3351,-6.20561 1.3496,-1.17749 2.79,-2.24805 4.1726,-3.38235 0.6571,-0.78426 0.1282,-2.21425 -0.9301,-2.28177 -0.6603,-0.14562 -1.3384,-0.0725 -2.0074,-0.062 z" + id="path33079" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#b6c5d8;fill-opacity:1" + d="m 1135.0625,771.09375 c -3.5,0.58518 -6.8259,1.96099 -9.8715,3.75664 -1.4659,0.9392 -2.8977,1.9504 -4.1015,3.21637 -2.2637,2.18699 -4.0577,4.84626 -5.3102,7.72931 -1.7244,4.45631 -3.1815,9.00923 -4.5462,13.58674 -1.1787,3.81878 -2.2925,7.66048 -3.5864,11.44147 -0.9806,2.31904 -2.2556,4.50522 -3.1467,6.86322 -0.072,0.83217 -0.5208,1.71408 -0.1562,2.53125 0.3439,0.63556 0.6129,-0.72716 0.904,-1.00196 0.7079,-1.17012 1.6787,-2.15857 2.5022,-3.24804 2.0256,-2.4413 4.0925,-4.85803 6.3438,-7.09375 0.8922,-0.67775 1.9311,-1.14621 3,-1.46875 0.9592,-0.27381 2.0457,-0.0942 2.7855,0.6034 0.7982,0.68845 1.0522,1.81659 0.9264,2.82928 -0.069,2.24614 -0.6218,4.43634 -0.9416,6.65146 -0.3771,1.50747 -0.596,3.04826 -0.8953,4.57211 -0.019,0.88489 0.8029,1.89802 1.75,1.65625 1.2051,-0.41761 1.6861,-1.71186 2.0121,-2.83444 1.0809,-3.47552 1.1641,-7.147 1.3117,-10.75426 0.2526,-3.87574 0.4302,-7.76125 0.9007,-11.61815 0.521,-3.65166 1.2465,-7.28074 2.2755,-10.8244 0.5077,-1.47275 1.2852,-2.82251 2.1324,-4.12255 1.0451,-1.54481 2.4259,-2.97532 4.2113,-3.62745 3.7719,-1.53211 7.856,-2.03477 11.7188,-3.28125 0.8561,-0.41385 1.6694,-1.37746 1.3437,-2.375 -0.3658,-1.12201 -1.5732,-1.602 -2.6128,-1.89568 -2.3028,-0.66163 -4.6814,-1.03339 -7.0648,-1.2496 -0.6285,-0.0212 -1.2564,-0.11142 -1.8849,-0.0422 z" + id="path33081" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#c9cfd7" + d="m 1093.3186,862.68392 c 2.0397,-6.75845 2.6267,-14.59993 8.2825,-19.57905 6.8665,-6.55449 16.4927,-8.81781 23.9521,-14.46458 3.6447,-4.45932 -2.8105,-9.08083 -3.562,-13.60484 -4.1433,-11.16786 -4.9817,-24.68811 1.4956,-35.15189 5.6846,-8.73332 19.8555,-10.9347 27.194,-3.0481 8.414,8.94249 8.7762,22.65299 5.2735,33.81426 -1.4944,5.581 -4.9984,10.28747 -7.0924,15.6006 2.7618,3.52771 7.1493,5.48724 10.9349,7.7964 6.119,3.22073 13.5834,5.02515 17.4835,11.27477 2.9699,4.63969 4.4219,10.08731 5.8092,15.35231 -1.5017,4.96315 -8.8182,2.91096 -12.8589,3.69351 -22.8034,0.12179 -45.6117,0.15756 -68.4143,-0.11428 -2.3117,-0.50334 -7.5324,0.74503 -8.4977,-1.56911 z" + id="path33083" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#b6c5d8" + d="m 1094.235,862.68169 c 2.0564,-7.41778 3.349,-16.08468 10.1767,-20.8097 6.6183,-5.16685 15.1606,-7.20405 21.595,-12.59203 3.5446,-4.88336 -2.4756,-9.88767 -3.3534,-14.75239 -3.474,-10.8555 -4.1294,-23.33186 0.8597,-33.82801 1.7263,-3.59701 5.2395,-6.62494 9.4292,-6.35645 4.1922,-1.15696 8.5272,-4.11292 12.9387,-1.76941 7.4615,3.81566 10.0643,12.7832 10.996,20.5469 1.1638,10.51462 -1.4742,21.3696 -7.4745,30.09882 -3.0592,4.5826 3.8279,7.04871 6.5928,9.43949 4.453,3.31782 9.9277,4.58376 14.7042,7.25683 7.6851,4.50047 10.7441,13.62794 11.7443,22.00374 -2.9167,3.42132 -8.8791,1.6959 -13.0442,2.37973 -23.0139,0.17734 -46.0359,0.29901 -69.0471,-0.12448 -1.4771,-0.46732 -5.7882,0.53078 -6.1174,-1.49304 z" + id="path33085" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#89929e" + d="m 1145.4158,831.51882 c -6.511,-0.17414 1.8961,-8.32488 2.1097,-2.13677 0.2551,1.05824 -0.9099,3.45218 -2.1097,2.13677 z m -9.1923,-2.58713 c -5.03,-3.26087 3.8069,-5.55701 3.715,-0.9855 -0.3316,1.64802 -2.6976,2.53253 -3.715,0.9855 z m 8.2796,-8.19213 c 5.4124,-4.28675 4.1865,-12.49507 9.1419,-17.11237 0.2956,5.93898 -0.8154,13.05465 -6.0648,16.64412 -0.9456,0.45813 -2.0369,0.66185 -3.0771,0.46825 z" + id="path33087" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#b4c3d5" + d="m 1095.4869,863.63394 c -0.7086,-2.12774 2.227,-4.3804 1.3414,-0.66819 0.1019,0.98814 -0.6521,2.27111 -1.3414,0.66819 z m 37.375,-0.1401 c 1.386,-2.43696 5.5317,0.89636 1.4289,0.91541 -0.4953,-0.004 -1.425,-0.23332 -1.4289,-0.91541 z m 7.6969,-0.45528 c -1.7662,-3.1746 2.2388,-3.26451 1.112,0.0649 -0.3282,2.3234 -0.6929,0.92535 -1.112,-0.0649 z m 26.8031,-0.60687 c -0.1412,-3.37799 -6.3561,-0.78227 -3.1471,-4.41577 3.4614,-3.84128 -0.9126,-6.50536 0.3286,-10.70489 -1.3534,-4.87174 -4.4459,3.58742 -6.3126,-0.95498 -2.2864,-0.76047 -6.1461,-2.25962 -7.8438,-1.85811 1.7929,4.16671 -5.0761,3.88297 -4.657,8.23859 -2.8783,4.77401 -4.2136,-5.23107 0.4167,-4.75641 3.0178,-1.66128 2.6353,-6.07232 -1.1054,-3.24125 -4.1035,2.38594 -8.1014,0.13188 -10.9801,-2.65973 -1.5746,1.027 -7.1905,5.94236 -6.2298,1.16697 3.1085,-2.66186 -0.5867,-8.92294 -4.2926,-8.18935 -5.1067,-0.52325 2.4463,-4.85414 3.5764,-6.66771 1.8593,-4.36472 -3.1729,-7.83742 -3.708,-12.04941 -1.2651,-5.08051 -2.8301,-10.57026 -1.531,-15.77259 2.6465,-1.80932 -6.039,-6.34583 -0.1274,-6.57829 2.9743,2.18718 10.861,-0.73904 8.664,-4.74784 1.4327,-4.1299 6.0259,3.62463 2.1811,5.45085 -2.5974,0.10573 -7.4936,3.34663 -3.6277,5.54395 1.6435,-0.82217 6.4932,-5.71297 6.673,-2.49044 -2.7854,3.31115 -8.671,4.59991 -5.9505,10.09851 -0.147,1.93717 2.2229,5.8417 2.3835,1.69036 -0.2918,-2.60942 -0.2747,-9.86038 3.6482,-6.05741 -1.5505,2.76367 1.6584,4.017 1.4661,0.70751 1.2313,-3.60319 4.1633,-6.90216 1.9615,-10.6292 1.0857,-3.44275 2.4753,-8.92278 -1.1456,-10.9983 -0.2759,-2.38485 4.3956,-5.73004 -0.7238,-6.12506 -5.3095,-0.90828 1.6765,-3.69288 4.0418,-2.6646 4.3254,0.22232 9.1692,1.37034 11.4584,5.44637 6.2849,9.7073 5.6843,22.38166 2.1707,32.98508 -0.9294,4.64278 -5.2222,8.12432 -5.2048,12.92114 1.2085,6.56432 8.0163,9.99242 13.782,11.95844 5.1796,1.02044 10.1383,3.62424 13.0319,8.19359 3.204,4.79647 5.2164,10.49318 5.7367,16.22196 -2.3558,3.8145 -7.9005,3.87439 -11.8952,3.17059 -1.2245,-0.32543 -2.6028,-0.92802 -3.0382,-2.23257 z m -6.0908,-20.1003 c -1.4189,-3.47946 -9.2021,-2.51084 -5.1374,1.1248 1.0491,0.55257 8.1492,1.55777 5.1374,-1.1248 z m -35.4092,-40.45872 c -2.1626,-4.30335 -2.5662,5.59099 0,0 z m -10.7721,57.4647 c 0.9739,-2.58634 6.2446,-4.23216 3.3578,-0.21672 -0.9325,2.57294 -7.0509,4.43368 -3.3578,0.21672 z m 15.2677,1.08726 c -0.4615,-3.123 5.9277,-1.79651 2.3333,0.70108 -0.7844,0.59532 -1.935,0.11193 -2.3333,-0.70108 z m 17.1983,0.36758 c -1.4021,-3.70988 5.6946,-2.0316 1.5001,0.56139 l -0.7246,-0.0276 -0.7755,-0.53379 z m -46.6939,-2.34909 c 0.2511,-3.17228 6.7054,-7.64119 4.5997,-1.5241 -0.3029,1.59959 -3.8831,3.82735 -4.5997,1.5241 z m 56,-0.51143 c 2.5129,-5.65641 2.4066,5.5417 0,0 z m -47.8,-2.7 c -4.0511,-2.74409 2.8618,-11.29262 3.0007,-4.49156 -2.2734,1.19476 -2.9497,4.14273 0.2779,3.98531 0.4491,2.1979 -2.5034,1.86609 -3.2786,0.50625 z m 17.0438,-0.05 c 1.3165,-2.24916 8.5838,-2.15975 3.4328,0.33832 -0.7575,0.55533 -3.9521,1.81288 -3.4328,-0.33832 z m 28.4134,-2.29909 c 1.9889,-3.91758 6.8542,2.62004 1.3117,1.52967 -0.8499,0.0565 -1.9284,-0.52139 -1.3117,-1.52967 z m -56.6572,-0.39189 c 1.6879,-4.90927 2.9969,2.75221 0.079,0.36537 l -0.079,-0.36537 z m 16.6476,-4.24293 c -1.8915,-2.61234 0.8405,-5.75092 1.6884,-1.54504 0.8485,1.72586 -0.7024,5.1602 -1.6884,1.54504 z m 4.5919,-1.82793 c 1.6025,-1.85967 3.6635,-1.43607 5.2605,-2.98816 3.9626,1.46685 -2.6295,3.48646 -3.7286,4.9303 -1.9952,0.50428 -2.9215,-0.26884 -1.5319,-1.94214 z m -9.2395,-3.57149 c 0.5999,-5.93389 4.1759,2.63959 0.6117,2.37949 -0.5227,-0.66971 -0.5818,-1.56896 -0.6117,-2.37949 z m -5.43,0.69664 c -0.366,-3.22691 5.2275,-3.96176 2.5144,-0.12486 -0.5163,1.26584 -1.7962,1.28548 -2.5144,0.12486 z m 16.43,-54.05429 c -0.3067,-2.8402 2.7857,-3.62344 2.3713,-0.3321 1.7775,2.89278 -2.5383,3.01913 -2.3713,0.3321 z m 7,-4.85902 c -0.4203,-5.12456 8.4363,-1.94337 4.3583,0.72111 -1.3692,0.0212 -3.344,0.40232 -4.3583,-0.72111 z m -1,-5.82423 c 0.171,-4.09108 9.3884,-5.68544 7.3598,-0.21811 -2.2194,0.24293 -4.553,-2.11058 -6.7961,0.31894 l -0.4123,0.0536 -0.1514,-0.1544 0,0 z" + id="path33089" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#b3bcc9" + d="m 1168.8619,861.63169 c -0.6243,-3.55935 -2.6973,-6.3569 -0.7215,-9.98987 0.1253,-5.45244 -2.7911,-10.65923 -7.0967,-13.89447 -1.2068,-2.85452 5.3278,0.70573 6.9238,1.01004 7.6726,3.41307 13.8636,11.22205 14.0998,19.78329 0.2021,5.97005 -6.5489,6.42322 -10.9269,5.80556 -1.7323,0.15131 -2.5832,-1.0909 -2.2785,-2.71455 z m -32.0895,-20.80784 c -4.434,-1.14416 -6.6424,-4.93813 -9.6183,-8.11599 -5.8032,-0.96373 3.5761,-5.23189 -0.1243,-8.64226 -1.2887,-3.82859 -5.1974,-7.73842 -3.9124,-11.88366 3.5763,0.77406 7.9814,4.56157 11.4304,0.4736 4.5442,-4.37751 7.176,-10.57138 8.2612,-16.71192 0.4026,-6.44762 0.588,-13.17942 -1.3863,-19.39442 -3.6853,-5.04182 5.4099,-3.08901 7.4628,-1.22179 7.1884,5.3533 8.7099,15.22614 8.4974,23.6257 -0.2493,8.4967 -3.1434,16.73146 -7.7275,23.84074 -2.8899,4.70712 3.7802,7.4172 6.1701,10.48571 2.372,1.75978 2.7988,3.59039 -0.4709,3.94333 -4.9323,3.54041 -11.3816,5.84263 -17.44,4.36937 l -0.655,-0.33776 -0.4872,-0.43065 0,0 z" + id="path33091" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#a9b6c7" + d="m 1169.677,857.68169 c 0.6954,-5.83229 -1.1934,-11.42869 -3.0624,-16.84619 1.705,-4.06189 7.7076,2.15936 9.0817,4.7283 3.4747,5.23289 5.9898,11.23822 6.7494,17.4968 -2.7491,2.48603 -8.7127,1.53936 -12.2569,0.52734 -1.141,-1.73296 -0.478,-3.96643 -0.5118,-5.90625 z m -35.079,-19.01192 c -4.3537,-1.9881 -8.7378,-7.05736 -6.2671,-11.96771 0.379,-3.87987 -6.1972,-8.74866 -2.6155,-11.649 3.8173,-0.0455 7.9232,-0.57969 10.7008,-3.51648 7.5387,-7.6238 9.3732,-19.29758 8.1101,-29.5788 -0.2934,-2.73658 -3.4831,-10.05061 2.1384,-6.90166 5.5905,2.86145 9.3559,8.5583 9.9536,14.79053 1.4524,11.54814 -0.9993,23.83469 -7.7852,33.40876 -3.2246,5.24149 5.7034,6.58552 5.5499,11.37054 -1.1447,5.117 -7.7589,5.97682 -12.1564,5.8855 -2.6283,-0.12443 -5.2379,-0.7377 -7.6286,-1.84168 z" + id="path33093" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#a5aeba" + d="m 1171.8619,856.01273 c 0.1763,-4.74944 -0.356,-9.57132 -2.7594,-13.74195 1.4975,-4.03011 6.8274,2.83782 8.0786,5.41566 2.902,4.84584 4.2902,10.45516 5.3821,15.90906 -3.3515,1.42092 -11.5911,2.28284 -10.6646,-3.67955 -0.043,-1.30058 -0.035,-2.60214 -0.037,-3.90322 z m -32,-17.72887 c -5.8477,-1.14965 -11.4267,-6.22518 -11.1545,-12.52353 -1.5003,-2.03434 -5.7153,-8.53816 -0.064,-7.68024 6.7325,0.44741 11.3131,-5.91275 13.9722,-11.28778 4.5289,-9.55307 5.8263,-20.85993 2.5334,-31.00041 2.1812,-2.95131 6.7947,3.62386 8.5128,5.81939 4.3355,6.99236 3.5563,15.74508 2.3456,23.52395 -1.0453,6.26492 -3.4373,12.23617 -6.8939,17.55368 -4.1164,5.37273 4.8634,7.17375 5.4,11.35344 -3.346,2.78013 -7.8431,4.85802 -12.3007,4.56282 -0.7887,-0.0649 -1.5719,-0.18321 -2.3507,-0.32132 z" + id="path33095" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#99a5b4" + d="m 1174.4426,862.18169 c -1.1883,-6.44151 -0.7153,-13.29528 -3.2234,-19.40763 5.2155,1.71368 7.2191,7.68437 8.6149,12.50189 0.4675,3.74753 5.9571,10.77397 -1.5469,9.15113 -1.5971,0.0659 -3.7451,-0.21664 -3.8446,-2.24539 z m -37.0807,-25.70949 c -5.2137,-2.6559 -8.3881,-8.12562 -9.4507,-13.73768 -3.0238,-5.26702 5.3254,-2.26568 7.462,-5.22634 8.4902,-5.8936 12.466,-16.48626 13.5185,-26.43011 1.0826,-4.83991 -1.472,-10.13976 -0.9548,-14.48335 7.0302,4.3261 9.109,13.3759 8.6445,21.14239 -0.4724,9.88319 -4.2133,19.33825 -9.4291,27.6489 0.196,3.60522 8.594,7.29794 2.2185,10.91971 -3.6456,2.02664 -8.2528,1.70657 -12.0089,0.16648 z" + id="path33097" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#99a5b4;fill-opacity:1" + d="m 1137.625,771.4375 c -3.2175,0.80995 -6.3589,1.89093 -9.4985,2.95674 -0.9716,0.37142 -1.8529,0.9729 -2.5952,1.69951 -0.8529,0.75372 -1.5183,1.68678 -2.243,2.5579 -1.4336,1.82026 -2.7094,3.75542 -4.0695,5.6296 -0.882,1.49498 -1.701,3.03188 -2.2874,4.66945 -0.773,1.87386 -1.3796,3.81126 -2.0369,5.7276 -1.4886,4.58577 -2.8667,9.20755 -4.1553,13.85304 -0.3808,1.5389 -0.8175,3.06718 -1.1142,4.62491 -0.098,1.32482 0.4277,2.57219 0.8125,3.8125 0.6544,1.89642 1.248,3.81318 1.875,5.71875 0.4387,1.03708 1.5319,1.69185 2.625,1.8125 1.242,-0.0193 2.5208,0.0375 3.7188,-0.34375 1.0206,-0.39402 1.605,-1.36074 1.8656,-2.3781 0.7327,-2.56005 1.0195,-5.21766 1.5005,-7.83083 0.4005,-2.37627 0.7757,-4.75672 1.1651,-7.13482 0.6094,-2.21748 1.288,-4.41783 2.0397,-6.59038 0.7828,-2.02938 1.7157,-3.99664 2.5541,-6.00337 0.89,-1.89943 1.8666,-3.76562 3.0149,-5.52201 1.4077,-2.01133 3.3385,-3.57662 5.3281,-4.9803 1.2399,-0.75485 2.4221,-1.59957 3.6892,-2.3108 1.428,-0.88217 2.9558,-1.58776 4.4678,-2.31189 0.9989,-0.30772 1.9526,-0.81445 2.9948,-0.95052 0.9487,-0.0968 1.933,0.0577 2.8489,-0.26823 0.9246,-0.56794 0.7301,-1.98773 -0.1562,-2.5 -0.8073,-0.63096 -1.7434,-1.0782 -2.6335,-1.5793 -1.6813,-0.84475 -3.4743,-1.44213 -5.3035,-1.87163 -1.3571,-0.28247 -2.7391,-0.47084 -4.1255,-0.51782 l -0.1817,0.0202 -0.1,0.0111 z" + id="path33099" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#929ca9" + d="m 1177.6504,862.68169 c -2.1223,-4.15541 -2.6296,-9.16791 -2.1104,-13.77435 2.7363,-0.59646 3.4894,6.19672 4.6159,8.71136 0.5097,2.43464 4.4493,8.54497 -0.8865,6.29893 l -0.882,-0.55645 -0.737,-0.67949 0,0 z m -43.7561,-31 c -2.9459,-2.28349 -7.1894,-8.93795 -1.3629,-10.29495 8.0732,-2.18725 12.6924,-10.20871 15.4879,-17.52164 2.7539,-7.08868 3.0096,-14.78608 2.3457,-22.27209 0.5717,-3.73359 4.2685,3.25102 4.563,4.83879 2.8335,10.0499 1.0854,21.07617 -3.2632,30.43572 -1.4732,3.78479 -7.2463,8.22354 -2.8605,12.027 4.9081,2.55146 1.5708,6.14222 -2.5582,6.40295 -4.4148,1.02741 -9.1521,-0.44638 -12.3518,-3.61578 z" + id="path33101" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#8a95a3;fill-opacity:1" + d="m 1144.0768,778.57601 c -2.0799,0.18622 -4.1669,0.39931 -6.1906,0.93582 -1.9627,0.5268 -3.8686,1.26151 -5.6783,2.18771 -1.2785,0.72607 -2.5949,1.40817 -3.7322,2.35094 -1.8707,1.41739 -3.5016,3.11504 -5.0864,4.83803 -0.8029,1.1366 -1.6615,2.24315 -2.3582,3.44834 -1.046,1.93489 -1.9268,3.96033 -2.5571,6.06935 -1.0282,3.17356 -1.896,6.39655 -2.7733,9.61433 -0.7909,2.99079 -1.588,5.98101 -2.3162,8.9875 -0.7253,3.0427 -1.2105,6.14099 -1.4506,9.25973 -0.081,1.12348 -0.2781,2.24516 -0.1383,3.37206 0.063,1.15775 0.1471,2.31618 0.2812,3.46744 0.029,0.43529 0.6411,0.88693 0.8125,0.28125 0.4378,-0.93637 0.9849,-1.88776 2.0312,-2.21875 0.7705,-0.37522 1.6447,-0.58501 2.4947,-0.42232 0.9951,0.20928 2.0235,0.51766 2.8728,1.09107 1.1525,0.76152 2.171,1.75918 2.8259,2.98452 0.6743,0.79355 0.8672,1.92774 1.4941,2.69048 0.5562,0.0517 0.4674,-0.84631 0.609,-1.24468 0.2079,-1.87479 -0.2258,-3.73167 -0.5465,-5.56782 -0.3256,-1.64053 -0.8042,-3.25041 -0.9989,-4.91491 -0.2714,-1.81202 -0.6034,-3.6237 -0.5936,-5.46277 -0.058,-1.99807 -0.1665,-3.99431 -0.1442,-5.99405 -0.035,-1.23626 -10e-4,-2.47036 0.1134,-3.70195 0.2442,-2.90098 0.5633,-5.79741 0.9983,-8.67632 0.6275,-2.95685 1.3389,-5.92442 2.6429,-8.66725 0.6163,-1.36529 1.239,-2.73456 1.9585,-4.04735 0.7208,-1.14986 1.5962,-2.22584 2.737,-2.98238 1.7132,-1.17297 3.5558,-2.14034 5.4483,-2.98937 1.8042,-0.81317 3.6119,-1.62339 5.3383,-2.5949 0.8226,-0.40084 1.8837,-0.6713 2.3005,-1.56976 0.1274,-0.30615 0.04,-0.72575 -0.3942,-0.52399 z" + id="path33103" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#8a95a3" + d="m 1178.5691,861.68169 c -1.0134,-1.80767 1.2879,-7.15927 1.2421,-2.50022 0.4241,2.21568 -0.4446,7.79222 -1.2421,2.50022 l 0,0 z m -43.0654,-31 c -2.9868,-1.67058 -7.0066,-6.75545 -1.2627,-7.50408 4.8324,-2.49559 9.8284,-5.69893 12.5216,-10.55778 1.1155,-4.62828 4.1189,-8.61975 4.8415,-13.41654 0.9852,-4.74585 2.5256,-9.7007 1.4529,-14.54866 3.4059,4.0618 2.7268,9.97803 2.4056,14.94875 -0.9957,8.63373 -3.5835,17.28503 -8.7848,24.35117 -2.2871,3.74841 7.1983,8.26089 -0.2126,9.84972 -3.9181,1.46539 -7.9707,-0.66912 -10.9615,-3.12258 z" + id="path33105" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33141" + d="m 1092.5142,862.96792 c 0.01,-5.30143 1.6059,-10.6248 3.7815,-15.43929 4.3212,-8.8444 14.216,-12.22658 22.338,-16.5859 4.6806,-1.37584 9.0712,-5.52844 4.7426,-10.02046 -6.3949,-12.22902 -8.7729,-27.8219 -2.1065,-40.43961 3.6547,-7.37162 12.389,-12.01132 20.4933,-9.67176 7.2863,1.44287 13.1447,7.15895 15.3403,14.18101 4.5144,13.20733 1.2153,28.11579 -6.5366,39.43979 -1.3297,3.95225 5.8957,5.24121 8.44,7.53545 5.4039,3.00388 11.6059,4.85759 15.8683,9.59775 5.1225,5.30858 9.7926,12.48585 8.6642,20.18284 -2.666,2.93451 -8.4087,1.41927 -12.3014,2.20861 -23.9529,0.89934 -47.9593,1.13829 -71.9091,0.0384 -2.2566,-0.26203 -4.7316,-0.0739 -6.8146,-1.02681 z" + style="fill:#dce2e8" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33143" + d="m 1092.8619,863.98091 c -0.3001,-10.49202 6.0373,-20.13978 14.6626,-25.69496 5.5197,-4.0779 12.4095,-5.84192 17.8082,-10.06232 2.8497,-4.01312 -2.3724,-8.04948 -3.3454,-11.96125 -5.1733,-11.94737 -5.914,-27.08139 2.2563,-37.90341 5.8941,-8.20878 18.8524,-9.23957 26.2071,-2.50691 7.922,7.8665 8.9959,20.23178 7.0788,30.70563 -1.0774,6.52092 -4.2598,12.37274 -7.8005,17.84376 -0.6394,4.72644 5.997,6.29571 9.1566,8.71794 5.6707,3.14875 12.427,4.70876 16.6239,10.05061 4.552,5.13638 7.7383,11.97169 7.2645,18.94209 -3.4288,3.13676 -9.1732,1.57453 -13.5604,2.19728 -25.1428,0.17847 -50.294,0.26439 -75.4332,-0.23791 l -0.9185,-0.0906 0,0 z" + style="fill:#d4dbe2" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33145" + d="m 1137.4063,773.21875 c -2.0844,0.0218 -4.0688,0.82425 -5.7801,1.97408 -1.7905,1.15879 -3.4062,2.56842 -5.1034,3.85771 -2.0732,1.7046 -4.1307,3.52243 -5.5432,5.83208 -1.4246,2.63374 -2.0143,5.62903 -2.3241,8.58199 -0.3303,2.74853 -0.3282,5.52241 -0.4367,8.28539 -0.01,3.82444 -0.1536,7.64782 -0.1389,11.4717 0.086,5.10181 0.5221,10.19115 0.6389,15.29078 -0.017,1.6471 0.017,3.30988 -0.1419,4.94514 -0.2452,0.76103 -0.5661,2.26102 0.5747,2.38613 1.06,-0.019 1.2351,-1.39535 1.1555,-2.21222 0.2295,-1.68105 1.3251,-3.13394 2.6304,-4.16278 0.8525,-0.49875 1.9731,-0.491 2.8438,-0.0625 1.3276,1.06993 2.3723,2.46316 3.7496,3.48406 1.7879,1.52488 3.518,3.13357 5.2774,4.67984 0.9867,0.7019 2.2703,0.71795 3.4299,0.66919 1.068,-0.16832 2.1353,-0.35487 3.2195,-0.36775 0.8941,0.16109 2.328,-0.70942 1.3861,-1.62159 -0.8042,-0.70337 -1.8875,-0.23431 -2.8337,-0.39781 -1.8427,-0.0672 -3.621,-1.11476 -4.5976,-2.66893 -1.0034,-1.75997 -1.5986,-3.7098 -2.4271,-5.55243 -1.6611,-3.95349 -2.9103,-8.07322 -3.8504,-12.25354 -0.4782,-2.16238 -0.9493,-4.33361 -1.0404,-6.55414 -0.4428,-5.17654 -0.016,-10.36675 0.2179,-15.5419 0.4316,-2.80874 0.9386,-5.71235 2.5236,-8.13079 1.4095,-2.34955 3.2117,-4.47033 5.3351,-6.20561 1.3496,-1.17749 2.79,-2.24805 4.1726,-3.38235 0.6571,-0.78426 0.1282,-2.21425 -0.9301,-2.28177 -0.6603,-0.14562 -1.3384,-0.0725 -2.0074,-0.062 z" + style="fill:#a9b6c7;fill-opacity:1" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33147" + d="m 1135.0625,771.09375 c -3.5,0.58518 -6.8259,1.96099 -9.8715,3.75664 -1.4659,0.9392 -2.8977,1.9504 -4.1015,3.21637 -2.2637,2.18699 -4.0577,4.84626 -5.3102,7.72931 -1.7244,4.45631 -3.1815,9.00923 -4.5462,13.58674 -1.1787,3.81878 -2.2925,7.66048 -3.5864,11.44147 -0.9806,2.31904 -2.2556,4.50522 -3.1467,6.86322 -0.072,0.83217 -0.5208,1.71408 -0.1562,2.53125 0.3439,0.63556 0.6129,-0.72716 0.904,-1.00196 0.7079,-1.17012 1.6787,-2.15857 2.5022,-3.24804 2.0256,-2.4413 4.0925,-4.85803 6.3438,-7.09375 0.8922,-0.67775 1.9311,-1.14621 3,-1.46875 0.9592,-0.27381 2.0457,-0.0942 2.7855,0.6034 0.7982,0.68845 1.0522,1.81659 0.9264,2.82928 -0.069,2.24614 -0.6218,4.43634 -0.9416,6.65146 -0.3771,1.50747 -0.596,3.04826 -0.8953,4.57211 -0.019,0.88489 0.8029,1.89802 1.75,1.65625 1.2051,-0.41761 1.6861,-1.71186 2.0121,-2.83444 1.0809,-3.47552 1.1641,-7.147 1.3117,-10.75426 0.2526,-3.87574 0.4302,-7.76125 0.9007,-11.61815 0.521,-3.65166 1.2465,-7.28074 2.2755,-10.8244 0.5077,-1.47275 1.2852,-2.82251 2.1324,-4.12255 1.0451,-1.54481 2.4259,-2.97532 4.2113,-3.62745 3.7719,-1.53211 7.856,-2.03477 11.7188,-3.28125 0.8561,-0.41385 1.6694,-1.37746 1.3437,-2.375 -0.3658,-1.12201 -1.5732,-1.602 -2.6128,-1.89568 -2.3028,-0.66163 -4.6814,-1.03339 -7.0648,-1.2496 -0.6285,-0.0212 -1.2564,-0.11142 -1.8849,-0.0422 z" + style="fill:#8a95a3;fill-opacity:1" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33149" + d="m 1093.3186,862.68392 c 2.0397,-6.75845 2.6267,-14.59993 8.2825,-19.57905 6.8665,-6.55449 16.4927,-8.81781 23.9521,-14.46458 3.6447,-4.45932 -2.8105,-9.08083 -3.562,-13.60484 -4.1433,-11.16786 -4.9817,-24.68811 1.4956,-35.15189 5.6846,-8.73332 19.8555,-10.9347 27.194,-3.0481 8.414,8.94249 8.7762,22.65299 5.2735,33.81426 -1.4944,5.581 -4.9984,10.28747 -7.0924,15.6006 2.7618,3.52771 7.1493,5.48724 10.9349,7.7964 6.119,3.22073 13.5834,5.02515 17.4835,11.27477 2.9699,4.63969 4.4219,10.08731 5.8092,15.35231 -1.5017,4.96315 -8.8182,2.91096 -12.8589,3.69351 -22.8034,0.12179 -45.6117,0.15756 -68.4143,-0.11428 -2.3117,-0.50334 -7.5324,0.74503 -8.4977,-1.56911 z" + style="fill:#c9cfd7" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33151" + d="m 1094.235,862.68169 c 2.0564,-7.41778 3.349,-16.08468 10.1767,-20.8097 6.6183,-5.16685 15.1606,-7.20405 21.595,-12.59203 3.5446,-4.88336 -2.4756,-9.88767 -3.3534,-14.75239 -3.474,-10.8555 -4.1294,-23.33186 0.8597,-33.82801 1.7263,-3.59701 5.2395,-6.62494 9.4292,-6.35645 4.1922,-1.15696 8.5272,-4.11292 12.9387,-1.76941 7.4615,3.81566 10.0643,12.7832 10.996,20.5469 1.1638,10.51462 -1.4742,21.3696 -7.4745,30.09882 -3.0592,4.5826 3.8279,7.04871 6.5928,9.43949 4.453,3.31782 9.9277,4.58376 14.7042,7.25683 7.6851,4.50047 10.7441,13.62794 11.7443,22.00374 -2.9167,3.42132 -8.8791,1.6959 -13.0442,2.37973 -23.0139,0.17734 -46.0359,0.29901 -69.0471,-0.12448 -1.4771,-0.46732 -5.7882,0.53078 -6.1174,-1.49304 z" + style="fill:#b6c5d8" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33153" + d="m 1145.4158,831.51882 c -6.511,-0.17414 1.8961,-8.32488 2.1097,-2.13677 0.2551,1.05824 -0.9099,3.45218 -2.1097,2.13677 z m -9.1923,-2.58713 c -5.03,-3.26087 3.8069,-5.55701 3.715,-0.9855 -0.3316,1.64802 -2.6976,2.53253 -3.715,0.9855 z m 8.2796,-8.19213 c 5.4124,-4.28675 4.1865,-12.49507 9.1419,-17.11237 0.2956,5.93898 -0.8154,13.05465 -6.0648,16.64412 -0.9456,0.45813 -2.0369,0.66185 -3.0771,0.46825 z" + style="fill:#89929e" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33155" + d="m 1095.4869,863.63394 c -0.7086,-2.12774 2.227,-4.3804 1.3414,-0.66819 0.1019,0.98814 -0.6521,2.27111 -1.3414,0.66819 z m 37.375,-0.1401 c 1.386,-2.43696 5.5317,0.89636 1.4289,0.91541 -0.4953,-0.004 -1.425,-0.23332 -1.4289,-0.91541 z m 7.6969,-0.45528 c -1.7662,-3.1746 2.2388,-3.26451 1.112,0.0649 -0.3282,2.3234 -0.6929,0.92535 -1.112,-0.0649 z m 26.8031,-0.60687 c -0.1412,-3.37799 -6.3561,-0.78227 -3.1471,-4.41577 3.4614,-3.84128 -0.9126,-6.50536 0.3286,-10.70489 -1.3534,-4.87174 -4.4459,3.58742 -6.3126,-0.95498 -2.2864,-0.76047 -6.1461,-2.25962 -7.8438,-1.85811 1.7929,4.16671 -5.0761,3.88297 -4.657,8.23859 -2.8783,4.77401 -4.2136,-5.23107 0.4167,-4.75641 3.0178,-1.66128 2.6353,-6.07232 -1.1054,-3.24125 -4.1035,2.38594 -8.1014,0.13188 -10.9801,-2.65973 -1.5746,1.027 -7.1905,5.94236 -6.2298,1.16697 3.1085,-2.66186 -0.5867,-8.92294 -4.2926,-8.18935 -5.1067,-0.52325 2.4463,-4.85414 3.5764,-6.66771 1.8593,-4.36472 -3.1729,-7.83742 -3.708,-12.04941 -1.2651,-5.08051 -2.8301,-10.57026 -1.531,-15.77259 2.6465,-1.80932 -6.039,-6.34583 -0.1274,-6.57829 2.9743,2.18718 10.861,-0.73904 8.664,-4.74784 1.4327,-4.1299 6.0259,3.62463 2.1811,5.45085 -2.5974,0.10573 -7.4936,3.34663 -3.6277,5.54395 1.6435,-0.82217 6.4932,-5.71297 6.673,-2.49044 -2.7854,3.31115 -8.671,4.59991 -5.9505,10.09851 -0.147,1.93717 2.2229,5.8417 2.3835,1.69036 -0.2918,-2.60942 -0.2747,-9.86038 3.6482,-6.05741 -1.5505,2.76367 1.6584,4.017 1.4661,0.70751 1.2313,-3.60319 4.1633,-6.90216 1.9615,-10.6292 1.0857,-3.44275 2.4753,-8.92278 -1.1456,-10.9983 -0.2759,-2.38485 4.3956,-5.73004 -0.7238,-6.12506 -5.3095,-0.90828 1.6765,-3.69288 4.0418,-2.6646 4.3254,0.22232 9.1692,1.37034 11.4584,5.44637 6.2849,9.7073 5.6843,22.38166 2.1707,32.98508 -0.9294,4.64278 -5.2222,8.12432 -5.2048,12.92114 1.2085,6.56432 8.0163,9.99242 13.782,11.95844 5.1796,1.02044 10.1383,3.62424 13.0319,8.19359 3.204,4.79647 5.2164,10.49318 5.7367,16.22196 -2.3558,3.8145 -7.9005,3.87439 -11.8952,3.17059 -1.2245,-0.32543 -2.6028,-0.92802 -3.0382,-2.23257 z m -6.0908,-20.1003 c -1.4189,-3.47946 -9.2021,-2.51084 -5.1374,1.1248 1.0491,0.55257 8.1492,1.55777 5.1374,-1.1248 z m -35.4092,-40.45872 c -2.1626,-4.30335 -2.5662,5.59099 0,0 z m -10.7721,57.4647 c 0.9739,-2.58634 6.2446,-4.23216 3.3578,-0.21672 -0.9325,2.57294 -7.0509,4.43368 -3.3578,0.21672 z m 15.2677,1.08726 c -0.4615,-3.123 5.9277,-1.79651 2.3333,0.70108 -0.7844,0.59532 -1.935,0.11193 -2.3333,-0.70108 z m 17.1983,0.36758 c -1.4021,-3.70988 5.6946,-2.0316 1.5001,0.56139 l -0.7246,-0.0276 -0.7755,-0.53379 z m -46.6939,-2.34909 c 0.2511,-3.17228 6.7054,-7.64119 4.5997,-1.5241 -0.3029,1.59959 -3.8831,3.82735 -4.5997,1.5241 z m 56,-0.51143 c 2.5129,-5.65641 2.4066,5.5417 0,0 z m -47.8,-2.7 c -4.0511,-2.74409 2.8618,-11.29262 3.0007,-4.49156 -2.2734,1.19476 -2.9497,4.14273 0.2779,3.98531 0.4491,2.1979 -2.5034,1.86609 -3.2786,0.50625 z m 17.0438,-0.05 c 1.3165,-2.24916 8.5838,-2.15975 3.4328,0.33832 -0.7575,0.55533 -3.9521,1.81288 -3.4328,-0.33832 z m 28.4134,-2.29909 c 1.9889,-3.91758 6.8542,2.62004 1.3117,1.52967 -0.8499,0.0565 -1.9284,-0.52139 -1.3117,-1.52967 z m -56.6572,-0.39189 c 1.6879,-4.90927 2.9969,2.75221 0.079,0.36537 l -0.079,-0.36537 z m 16.6476,-4.24293 c -1.8915,-2.61234 0.8405,-5.75092 1.6884,-1.54504 0.8485,1.72586 -0.7024,5.1602 -1.6884,1.54504 z m 4.5919,-1.82793 c 1.6025,-1.85967 3.6635,-1.43607 5.2605,-2.98816 3.9626,1.46685 -2.6295,3.48646 -3.7286,4.9303 -1.9952,0.50428 -2.9215,-0.26884 -1.5319,-1.94214 z m -9.2395,-3.57149 c 0.5999,-5.93389 4.1759,2.63959 0.6117,2.37949 -0.5227,-0.66971 -0.5818,-1.56896 -0.6117,-2.37949 z m -5.43,0.69664 c -0.366,-3.22691 5.2275,-3.96176 2.5144,-0.12486 -0.5163,1.26584 -1.7962,1.28548 -2.5144,0.12486 z m 16.43,-54.05429 c -0.3067,-2.8402 2.7857,-3.62344 2.3713,-0.3321 1.7775,2.89278 -2.5383,3.01913 -2.3713,0.3321 z m 7,-4.85902 c -0.4203,-5.12456 8.4363,-1.94337 4.3583,0.72111 -1.3692,0.0212 -3.344,0.40232 -4.3583,-0.72111 z m -1,-5.82423 c 0.171,-4.09108 9.3884,-5.68544 7.3598,-0.21811 -2.2194,0.24293 -4.553,-2.11058 -6.7961,0.31894 l -0.4123,0.0536 -0.1514,-0.1544 0,0 z" + style="fill:#b4c3d5" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33157" + d="m 1168.8619,861.63169 c -0.6243,-3.55935 -2.6973,-6.3569 -0.7215,-9.98987 0.1253,-5.45244 -2.7911,-10.65923 -7.0967,-13.89447 -1.2068,-2.85452 5.3278,0.70573 6.9238,1.01004 7.6726,3.41307 13.8636,11.22205 14.0998,19.78329 0.2021,5.97005 -6.5489,6.42322 -10.9269,5.80556 -1.7323,0.15131 -2.5832,-1.0909 -2.2785,-2.71455 z m -32.0895,-20.80784 c -4.434,-1.14416 -6.6424,-4.93813 -9.6183,-8.11599 -5.8032,-0.96373 3.5761,-5.23189 -0.1243,-8.64226 -1.2887,-3.82859 -5.1974,-7.73842 -3.9124,-11.88366 3.5763,0.77406 7.9814,4.56157 11.4304,0.4736 4.5442,-4.37751 7.176,-10.57138 8.2612,-16.71192 0.4026,-6.44762 0.588,-13.17942 -1.3863,-19.39442 -3.6853,-5.04182 5.4099,-3.08901 7.4628,-1.22179 7.1884,5.3533 8.7099,15.22614 8.4974,23.6257 -0.2493,8.4967 -3.1434,16.73146 -7.7275,23.84074 -2.8899,4.70712 3.7802,7.4172 6.1701,10.48571 2.372,1.75978 2.7988,3.59039 -0.4709,3.94333 -4.9323,3.54041 -11.3816,5.84263 -17.44,4.36937 l -0.655,-0.33776 -0.4872,-0.43065 0,0 z" + style="fill:#b3bcc9" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33159" + d="m 1169.677,857.68169 c 0.6954,-5.83229 -1.1934,-11.42869 -3.0624,-16.84619 1.705,-4.06189 7.7076,2.15936 9.0817,4.7283 3.4747,5.23289 5.9898,11.23822 6.7494,17.4968 -2.7491,2.48603 -8.7127,1.53936 -12.2569,0.52734 -1.141,-1.73296 -0.478,-3.96643 -0.5118,-5.90625 z m -35.079,-19.01192 c -4.3537,-1.9881 -8.7378,-7.05736 -6.2671,-11.96771 0.379,-3.87987 -6.1972,-8.74866 -2.6155,-11.649 3.8173,-0.0455 7.9232,-0.57969 10.7008,-3.51648 7.5387,-7.6238 9.3732,-19.29758 8.1101,-29.5788 -0.2934,-2.73658 -3.4831,-10.05061 2.1384,-6.90166 5.5905,2.86145 9.3559,8.5583 9.9536,14.79053 1.4524,11.54814 -0.9993,23.83469 -7.7852,33.40876 -3.2246,5.24149 5.7034,6.58552 5.5499,11.37054 -1.1447,5.117 -7.7589,5.97682 -12.1564,5.8855 -2.6283,-0.12443 -5.2379,-0.7377 -7.6286,-1.84168 z" + style="fill:#a9b6c7" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33161" + d="m 1171.8619,856.01273 c 0.1763,-4.74944 -0.356,-9.57132 -2.7594,-13.74195 1.4975,-4.03011 6.8274,2.83782 8.0786,5.41566 2.902,4.84584 4.2902,10.45516 5.3821,15.90906 -3.3515,1.42092 -11.5911,2.28284 -10.6646,-3.67955 -0.043,-1.30058 -0.035,-2.60214 -0.037,-3.90322 z m -32,-17.72887 c -5.8477,-1.14965 -11.4267,-6.22518 -11.1545,-12.52353 -1.5003,-2.03434 -5.7153,-8.53816 -0.064,-7.68024 6.7325,0.44741 11.3131,-5.91275 13.9722,-11.28778 4.5289,-9.55307 5.8263,-20.85993 2.5334,-31.00041 2.1812,-2.95131 6.7947,3.62386 8.5128,5.81939 4.3355,6.99236 3.5563,15.74508 2.3456,23.52395 -1.0453,6.26492 -3.4373,12.23617 -6.8939,17.55368 -4.1164,5.37273 4.8634,7.17375 5.4,11.35344 -3.346,2.78013 -7.8431,4.85802 -12.3007,4.56282 -0.7887,-0.0649 -1.5719,-0.18321 -2.3507,-0.32132 z" + style="fill:#a5aeba" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33163" + d="m 1174.4426,862.18169 c -1.1883,-6.44151 -0.7153,-13.29528 -3.2234,-19.40763 5.2155,1.71368 7.2191,7.68437 8.6149,12.50189 0.4675,3.74753 5.9571,10.77397 -1.5469,9.15113 -1.5971,0.0659 -3.7451,-0.21664 -3.8446,-2.24539 z m -37.0807,-25.70949 c -5.2137,-2.6559 -8.3881,-8.12562 -9.4507,-13.73768 -3.0238,-5.26702 5.3254,-2.26568 7.462,-5.22634 8.4902,-5.8936 12.466,-16.48626 13.5185,-26.43011 1.0826,-4.83991 -1.472,-10.13976 -0.9548,-14.48335 7.0302,4.3261 9.109,13.3759 8.6445,21.14239 -0.4724,9.88319 -4.2133,19.33825 -9.4291,27.6489 0.196,3.60522 8.594,7.29794 2.2185,10.91971 -3.6456,2.02664 -8.2528,1.70657 -12.0089,0.16648 z" + style="fill:#99a5b4" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + style="fill:#a5aeba;fill-opacity:1" + d="m 1137.625,771.4375 c -3.6671,1.06383 -7.4523,1.96161 -10.8672,3.68958 -3.3601,2.52275 -5.3983,6.30741 -7.8225,9.64449 -3.2743,5.92464 -4.7689,12.59418 -6.8342,18.98785 -0.8946,3.19887 -1.9543,6.39515 -2.4616,9.67244 0.274,3.22935 1.9063,6.12977 2.634,9.24893 1.556,2.56144 6.3235,2.61939 7.8721,0.001 1.1858,-2.35978 1.0134,-5.10166 1.7006,-7.61029 0.7858,-5.21212 1.5444,-10.48577 3.6263,-15.37326 1.7541,-4.33647 3.4935,-8.8399 6.5285,-12.46053 3.3879,-3.5886 7.8318,-5.96537 12.2205,-8.10315 1.8391,-1.62624 5.7259,0.0661 6.4438,-2.51986 -1.0379,-2.43936 -3.9525,-3.05083 -6.1812,-3.99677 -2.2038,-0.75251 -4.5258,-1.19495 -6.8591,-1.1805 z" + id="path33165" + inkscape:connector-curvature="0" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33167" + d="m 1177.6504,862.68169 c -2.1223,-4.15541 -2.6296,-9.16791 -2.1104,-13.77435 2.7363,-0.59646 3.4894,6.19672 4.6159,8.71136 0.5097,2.43464 4.4493,8.54497 -0.8865,6.29893 l -0.882,-0.55645 -0.737,-0.67949 0,0 z m -43.7561,-31 c -2.9459,-2.28349 -7.1894,-8.93795 -1.3629,-10.29495 8.0732,-2.18725 12.6924,-10.20871 15.4879,-17.52164 2.7539,-7.08868 3.0096,-14.78608 2.3457,-22.27209 0.5717,-3.73359 4.2685,3.25102 4.563,4.83879 2.8335,10.0499 1.0854,21.07617 -3.2632,30.43572 -1.4732,3.78479 -7.2463,8.22354 -2.8605,12.027 4.9081,2.55146 1.5708,6.14222 -2.5582,6.40295 -4.4148,1.02741 -9.1521,-0.44638 -12.3518,-3.61578 z" + style="fill:#929ca9" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33169" + d="m 1145.9405,777.3343 c -2.0799,0.18884 -4.1669,0.40492 -6.1906,0.94896 -1.9627,0.5342 -3.8686,1.27922 -5.6783,2.21843 -1.2785,0.73626 -2.5949,1.42794 -3.7322,2.38395 -1.8707,1.43729 -3.5016,3.15878 -5.0864,4.90596 -0.8029,1.15256 -1.6615,2.27465 -2.3582,3.49676 -1.046,1.96206 -1.9268,4.01594 -2.5571,6.15457 -1.0282,3.21812 -1.896,6.48637 -2.7733,9.74933 -0.7909,3.03279 -1.588,6.06499 -2.3162,9.1137 -0.7253,3.08542 -1.2105,6.22721 -1.4506,9.38975 -0.081,1.13925 -0.2781,2.27668 -0.1383,3.4194 0.063,1.17401 0.1471,2.34871 0.2812,3.51613 0.029,0.4414 0.6411,0.89938 0.8125,0.2852 0.4378,-0.94952 0.9849,-1.91427 2.0312,-2.2499 0.7705,-0.38049 1.6447,-0.59323 2.4947,-0.42825 0.9951,0.21221 2.0235,0.52492 2.8728,1.10639 1.1525,0.77221 2.171,1.78388 2.8259,3.02642 0.6743,0.80469 0.8672,1.95481 1.4941,2.72826 0.5562,0.0524 0.4674,-0.85819 0.609,-1.26216 0.2079,-1.90111 -0.2258,-3.78406 -0.5465,-5.646 -0.3256,-1.66356 -0.8042,-3.29605 -0.9989,-4.98392 -0.2714,-1.83746 -0.6034,-3.67458 -0.5936,-5.53947 -0.058,-2.02613 -0.1665,-4.0504 -0.1442,-6.07822 -0.035,-1.25362 -10e-4,-2.50504 0.1134,-3.75393 0.2442,-2.94171 0.5633,-5.87881 0.9983,-8.79814 0.6275,-2.99837 1.3389,-6.00761 2.6429,-8.78895 0.6163,-1.38446 1.239,-2.77296 1.9585,-4.10418 0.7208,-1.16601 1.5962,-2.2571 2.737,-3.02426 1.7132,-1.18944 3.5558,-2.17039 5.4483,-3.03134 1.8042,-0.82459 3.6119,-1.64619 5.3383,-2.63134 0.8226,-0.40647 1.8837,-0.68073 2.3005,-1.5918 0.1274,-0.31045 0.04,-0.73594 -0.3942,-0.53135 z" + style="fill:#929daa;fill-opacity:1" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <path + inkscape:connector-curvature="0" + id="path33171" + d="m 1178.5691,861.68169 c -1.0134,-1.80767 1.2879,-7.15927 1.2421,-2.50022 0.4241,2.21568 -0.4446,7.79222 -1.2421,2.50022 l 0,0 z m -43.0654,-31 c -2.9868,-1.67058 -7.0066,-6.75545 -1.2627,-7.50408 4.8324,-2.49559 9.8284,-5.69893 12.5216,-10.55778 1.1155,-4.62828 4.1189,-8.61975 4.8415,-13.41654 0.9852,-4.74585 2.5256,-9.7007 1.4529,-14.54866 3.4059,4.0618 2.7268,9.97803 2.4056,14.94875 -0.9957,8.63373 -3.5835,17.28503 -8.7848,24.35117 -2.2871,3.74841 7.1983,8.26089 -0.2126,9.84972 -3.9181,1.46539 -7.9707,-0.66912 -10.9615,-3.12258 z" + style="fill:#8a95a3" + inkscape:export-filename="/home/vjrj/proyectos/dev/kune/trunk/img/icons/unknown-gen.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" /> + <use + x="0" + y="0" + xlink:href="#path33075" + id="use33273" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33077" + id="use33275" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33079" + id="use33277" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33081" + id="use33279" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33083" + id="use33281" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33085" + id="use33283" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33087" + id="use33285" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33089" + id="use33287" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33091" + id="use33289" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33093" + id="use33291" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33095" + id="use33293" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33097" + id="use33295" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33099" + id="use33297" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33101" + id="use33299" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33103" + id="use33301" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33105" + id="use33303" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33141" + id="use33305" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33143" + id="use33307" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33145" + id="use33309" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33147" + id="use33311" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33149" + id="use33313" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33151" + id="use33315" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33153" + id="use33317" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33155" + id="use33319" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33157" + id="use33321" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33159" + id="use33323" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33161" + id="use33325" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33163" + id="use33327" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33165" + id="use33329" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33167" + id="use33331" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33169" + id="use33333" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> + <use + x="0" + y="0" + xlink:href="#path33171" + id="use33335" + transform="matrix(0.24124108,0,0,0.24124108,859.95489,750.3348)" + width="744.09448" + height="1052.3622" /> </g> </svg> Modified: trunk/img/icons/unknown-gen.png =================================================================== (Binary files differ) Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/pom.xml 2011-03-07 17:08:07 UTC (rev 1269) @@ -542,12 +542,12 @@ <dependency> <groupId>org.waveprotocol</groupId> <artifactId>waveinabox-server-custom</artifactId> - <version>0.3.6</version> + <version>0.3.7</version> </dependency> <dependency> <groupId>org.waveprotocol</groupId> <artifactId>proto-gwt</artifactId> - <version>0.3.1</version> + <version>0.3.7</version> </dependency> <dependency> <groupId>org.waveprotocol</groupId> Modified: trunk/src/main/java/cc/kune/chat/client/ChatParts.java =================================================================== --- trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/chat/client/ChatParts.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -6,9 +6,10 @@ import cc.kune.core.client.sn.actions.conditions.IsLoggedCondition; import cc.kune.core.client.sn.actions.conditions.IsNotMeCondition; import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; -import cc.kune.core.client.sn.actions.registry.SNAdminsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNCollabsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNPendingsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNAdminsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNCollabsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNPendingsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.UserSNMenuItemsRegistry; import cc.kune.core.client.state.Session; import com.google.inject.Inject; @@ -19,12 +20,14 @@ @Inject public ChatParts(final Session session, final Provider<ChatSitebarActions> chatActionsProvider, final Provider<AddAsBuddieHeaderButton> buddieButton, - final Provider<SNAdminsMenuItemsRegistry> snAdminsRegistry, - final Provider<SNCollabsMenuItemsRegistry> snCollabsItemsRegistry, - final Provider<SNPendingsMenuItemsRegistry> snPendingItemsRegistry, final IsNotMeCondition isNotMe, + final Provider<GroupSNAdminsMenuItemsRegistry> snAdminsRegistry, + final Provider<GroupSNCollabsMenuItemsRegistry> snCollabsItemsRegistry, + final Provider<GroupSNPendingsMenuItemsRegistry> snPendingItemsRegistry, + final Provider<UserSNMenuItemsRegistry> userItemsRegistry, final IsNotMeCondition isNotMe, final IsPersonCondition isPersonCondition, final Provider<StartChatWithMemberAction> startChatWithMemberAction, final IsLoggedCondition isLogged, - final Provider<StartChatWithUserAction> startChatWithUserAction) { + final Provider<StartChatWithUserAction> startChatWithUserAction, + final Provider<StartChatWithThisBuddieAction> startChatWithBuddieAction) { session.onInitDataReceived(true, new AppStartHandler() { @Override public void onAppStart(final AppStartEvent event) { @@ -39,6 +42,15 @@ return item; } }; + final Provider<MenuItemDescriptor> startChatWithBuddieItem = new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(startChatWithBuddieAction.get()); + item.add(isLogged); + item.add(isPersonCondition); + return item; + } + }; final Provider<MenuItemDescriptor> startChatWithUserItem = new Provider<MenuItemDescriptor>() { @Override public MenuItemDescriptor get() { @@ -52,6 +64,7 @@ snAdminsRegistry.get().add(startChatWithMemberItem); snCollabsItemsRegistry.get().add(startChatWithMemberItem); snPendingItemsRegistry.get().add(startChatWithUserItem); + userItemsRegistry.get().add(startChatWithBuddieItem); buddieButton.get(); } }); Modified: trunk/src/main/java/cc/kune/chat/client/StartChatWithMemberAction.java =================================================================== --- trunk/src/main/java/cc/kune/chat/client/StartChatWithMemberAction.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/chat/client/StartChatWithMemberAction.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -21,7 +21,7 @@ final Provider<ChatClient> chatClient) { this.i18n = i18n; this.chatClient = chatClient; - putValue(NAME, i18n.t("Start a chat with this member")); + putValue(NAME, i18n.t("Chat with this member")); putValue(Action.SMALL_ICON, res.newChat()); } Added: trunk/src/main/java/cc/kune/chat/client/StartChatWithThisBuddieAction.java =================================================================== --- trunk/src/main/java/cc/kune/chat/client/StartChatWithThisBuddieAction.java (rev 0) +++ trunk/src/main/java/cc/kune/chat/client/StartChatWithThisBuddieAction.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,16 @@ +package cc.kune.chat.client; + +import cc.kune.core.client.resources.CoreResources; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class StartChatWithThisBuddieAction extends StartChatWithMemberAction { + @Inject + public StartChatWithThisBuddieAction(final I18nTranslationService i18n, final CoreResources res, + final Provider<ChatClient> chatClient) { + super(i18n, res, chatClient); + putValue(NAME, i18n.t("Chat with your buddie")); + } +} Modified: trunk/src/main/java/cc/kune/chat/client/StartChatWithUserAction.java =================================================================== --- trunk/src/main/java/cc/kune/chat/client/StartChatWithUserAction.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/chat/client/StartChatWithUserAction.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -11,6 +11,6 @@ public StartChatWithUserAction(final I18nTranslationService i18n, final CoreResources res, final Provider<ChatClient> chatClient) { super(i18n, res, chatClient); - putValue(NAME, i18n.t("Start a chat with this person")); + putValue(NAME, i18n.t("Chat with this person")); } } Modified: trunk/src/main/java/cc/kune/client/KuneGinjector.java =================================================================== --- trunk/src/main/java/cc/kune/client/KuneGinjector.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/client/KuneGinjector.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -40,8 +40,8 @@ import cc.kune.core.client.sitebar.SitebarActionsPresenter; import cc.kune.core.client.sitebar.logo.SiteLogoPresenter; import cc.kune.core.client.sitebar.spaces.SpaceSelectorPresenter; -import cc.kune.core.client.sn.BuddiesAndParticipationPresenter; -import cc.kune.core.client.sn.GroupMembersPresenter; +import cc.kune.core.client.sn.UserSNPresenter; +import cc.kune.core.client.sn.GroupSNPresenter; import cc.kune.core.client.state.SiteTokenListeners; import cc.kune.core.client.state.StateManager; import cc.kune.core.client.ui.footer.license.EntityLicensePresenter; @@ -66,7 +66,7 @@ * see the GWTPlatform doc */ - AsyncProvider<BuddiesAndParticipationPresenter> getBuddiesAndParticipationPresenter(); + AsyncProvider<UserSNPresenter> getBuddiesAndParticipationPresenter(); ChatClient getChatClient(); @@ -90,7 +90,7 @@ GlobalShortcutRegister getGlobalShortcutRegister(); - AsyncProvider<GroupMembersPresenter> getGroupMembersPresenter(); + AsyncProvider<GroupSNPresenter> getGroupMembersPresenter(); GuiProvider getGuiProvider(); Modified: trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java =================================================================== --- trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/common/client/actions/ui/AbstractGuiItem.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -47,11 +47,13 @@ } protected void addStyle(final String style) { - super.addStyleName(style); + if (super.isOrWasAttached()) { + super.addStyleName(style); + } } protected void clearStyles() { - if (super.isAttached()) { + if (super.isOrWasAttached()) { super.setStyleName(""); } } Modified: trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuItemDescriptor.java =================================================================== --- trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuItemDescriptor.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuItemDescriptor.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -20,15 +20,31 @@ package cc.kune.common.client.actions.ui.descrip; import cc.kune.common.client.actions.AbstractAction; -import cc.kune.common.client.log.Log; public class MenuItemDescriptor extends AbstractGuiActionDescrip { + /** + * A simple menu item definition. + * + * You must define a menu item with its parent menu. Only use this + * constructor if you'll set the parent menu in the future (before render) + * + * @param action + */ public MenuItemDescriptor(final AbstractAction action) { super(action); - Log.debug("You must define a menu item with its parent menu"); } + /** + * + * A simple menu item definition. + * + * This is the preferred and more common used constructor. + * + * @param parent + * menu + * @param action + */ public MenuItemDescriptor(final MenuDescriptor parent, final AbstractAction action) { super(action); setParent(parent); Modified: trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuTitleItemDescriptor.java =================================================================== --- trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuTitleItemDescriptor.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/common/client/actions/ui/descrip/MenuTitleItemDescriptor.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -24,16 +24,30 @@ public class MenuTitleItemDescriptor extends MenuItemDescriptor { - public MenuTitleItemDescriptor(final MenuDescriptor parent) { + /** + * This GUI element only show a title (or header) in the menu, in the + * position you add it to the menu. Useful before a radio group, etc This is + * the preferred and more common used constructor. + * + * @param parent + * menu + * @param title + * the menu title + */ + public MenuTitleItemDescriptor(final MenuDescriptor parent, final String title) { super(AbstractAction.NO_ACTION); - setParent(parent); - } - - public MenuTitleItemDescriptor(final MenuDescriptor parent, final String title) { - this(parent); putValue(Action.NAME, title); } + /** + * This GUI element only show a title (or header) in the menu, in the + * position you add it to the menu. Useful before a radio group, etc You + * must define a menu item with its parent menu. Only use this constructor + * if you'll set the parent menu in the future (before render) + * + * @param title + * the menu title + */ public MenuTitleItemDescriptor(final String title) { super(AbstractAction.NO_ACTION); putValue(Action.NAME, title); Modified: trunk/src/main/java/cc/kune/core/client/CoreGinModule.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/CoreGinModule.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/CoreGinModule.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -68,14 +68,16 @@ import cc.kune.core.client.sitebar.logo.SiteLogoViewImpl; import cc.kune.core.client.sitebar.spaces.SpaceSelectorPresenter; import cc.kune.core.client.sitebar.spaces.SpaceSelectorViewImpl; -import cc.kune.core.client.sn.BuddiesAndParticipationPanel; -import cc.kune.core.client.sn.BuddiesAndParticipationPresenter; -import cc.kune.core.client.sn.GroupMembersPanel; -import cc.kune.core.client.sn.GroupMembersPresenter; -import cc.kune.core.client.sn.actions.registry.GroupMembersActionsRegistry; -import cc.kune.core.client.sn.actions.registry.SNAdminsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNCollabsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNPendingsMenuItemsRegistry; +import cc.kune.core.client.sn.GroupSNPanel; +import cc.kune.core.client.sn.GroupSNPresenter; +import cc.kune.core.client.sn.UserSNPanel; +import cc.kune.core.client.sn.UserSNPresenter; +import cc.kune.core.client.sn.actions.registry.GroupSNAdminsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNBottomActionsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNCollabsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNPendingsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.UserSNBottomActionsRegistry; +import cc.kune.core.client.sn.actions.registry.UserSNMenuItemsRegistry; import cc.kune.core.client.state.AccessRightsClientManager; import cc.kune.core.client.state.ContentProvider; import cc.kune.core.client.state.ContentProviderDefault; @@ -141,11 +143,10 @@ SitebarActionsPanel.class, SitebarActionsPresenter.SitebarActionsProxy.class); bindPresenter(NewGroupPresenter.class, NewGroupView.class, NewGroupPanel.class, NewGroupPresenter.NewGroupProxy.class); - bindPresenter(GroupMembersPresenter.class, GroupMembersPresenter.GroupMembersView.class, - GroupMembersPanel.class, GroupMembersPresenter.GroupMembersProxy.class); - bindPresenter(BuddiesAndParticipationPresenter.class, - BuddiesAndParticipationPresenter.BuddiesAndParticipationView.class, BuddiesAndParticipationPanel.class, - BuddiesAndParticipationPresenter.BuddiesAndParticipationProxy.class); + bindPresenter(GroupSNPresenter.class, GroupSNPresenter.GroupSNView.class, GroupSNPanel.class, + GroupSNPresenter.GroupSNProxy.class); + bindPresenter(UserSNPresenter.class, UserSNPresenter.UserSNView.class, UserSNPanel.class, + UserSNPresenter.UserSNProxy.class); bindPresenter(EntityLicensePresenter.class, EntityLicensePresenter.EntityLicenseView.class, EntityLicensePanel.class, EntityLicensePresenter.EntityLicenseProxy.class); bindPresenter(EntityHeaderPresenter.class, EntityHeaderPresenter.EntityHeaderView.class, @@ -192,16 +193,17 @@ bind(CoreParts.class).asEagerSingleton(); // SN - bind(SNAdminsMenuItemsRegistry.class).in(Singleton.class); - bind(SNCollabsMenuItemsRegistry.class).in(Singleton.class); - bind(SNPendingsMenuItemsRegistry.class).in(Singleton.class); - bind(GroupMembersActionsRegistry.class).in(Singleton.class); + bind(GroupSNAdminsMenuItemsRegistry.class).in(Singleton.class); + bind(GroupSNCollabsMenuItemsRegistry.class).in(Singleton.class); + bind(GroupSNPendingsMenuItemsRegistry.class).in(Singleton.class); + bind(GroupSNBottomActionsRegistry.class).in(Singleton.class); + bind(UserSNBottomActionsRegistry.class).in(Singleton.class); + bind(UserSNMenuItemsRegistry.class).in(Singleton.class); bind(SiteUserOptionsPresenter.class).in(Singleton.class); bind(SiteUserOptions.class).to(SiteUserOptionsPresenter.class).in(Singleton.class); bind(SitebarNewGroupLink.class).in(Singleton.class); bind(SitebarSignInLink.class).in(Singleton.class); bind(SitebarSignOutLink.class).in(Singleton.class); - } } Modified: trunk/src/main/java/cc/kune/core/client/CoreParts.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/CoreParts.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/CoreParts.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -3,9 +3,10 @@ import cc.kune.core.client.init.AppStartEvent; import cc.kune.core.client.init.AppStartEvent.AppStartHandler; import cc.kune.core.client.sitebar.SiteUserOptionsPresenter; -import cc.kune.core.client.sn.BuddiesAndParticipationPresenter; -import cc.kune.core.client.sn.GroupMembersPresenter; -import cc.kune.core.client.sn.actions.GroupMembersConfActions; +import cc.kune.core.client.sn.UserSNPresenter; +import cc.kune.core.client.sn.GroupSNPresenter; +import cc.kune.core.client.sn.actions.registry.GroupMembersConfActions; +import cc.kune.core.client.sn.actions.registry.UserSNConfActions; import cc.kune.core.client.state.Session; import cc.kune.core.client.ui.footer.license.EntityLicensePresenter; @@ -15,14 +16,16 @@ public class CoreParts { @Inject - public CoreParts(final Session session, final Provider<GroupMembersPresenter> groupMembersPresenter, - final Provider<BuddiesAndParticipationPresenter> buddiesAndParticipationPresenter, + public CoreParts(final Session session, final Provider<GroupSNPresenter> groupMembersPresenter, + final Provider<UserSNPresenter> buddiesAndParticipationPresenter, final Provider<GroupMembersConfActions> groupMembersConfActions, - final Provider<SiteUserOptionsPresenter> userOptions, final Provider<EntityLicensePresenter> licenseFooter) { + final Provider<UserSNConfActions> userSNConfActions, final Provider<SiteUserOptionsPresenter> userOptions, + final Provider<EntityLicensePresenter> licenseFooter) { session.onInitDataReceived(true, new AppStartHandler() { @Override public void onAppStart(final AppStartEvent event) { groupMembersConfActions.get(); + userSNConfActions.get(); groupMembersPresenter.get(); buddiesAndParticipationPresenter.get(); userOptions.get(); Modified: trunk/src/main/java/cc/kune/core/client/resources/CoreMessages.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/resources/CoreMessages.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/resources/CoreMessages.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -20,7 +20,7 @@ package cc.kune.core.client.resources; public final class CoreMessages { - public final static String BUDDIES_NOT_PUBLIC = "The buddies of this user are not public"; + public final static String BUDDIES_NOT_PUBLIC = "The buddies and group participation of this user are not public"; public final static String EMAIL_IN_USE = "This email address is being used by another user. Please, try with another one"; public final static String ENT_LOGO_SELECTOR_NORMAL_TITLE = "Logo"; public final static String ENT_LOGO_SELECTOR_PERSON_TITLE = "Avatar"; Modified: trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -9,7 +9,6 @@ import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip; import cc.kune.common.client.actions.ui.descrip.MenuDescriptor; import cc.kune.common.client.ui.BasicThumb; -import cc.kune.core.shared.dto.GroupDTO; import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.gspace.client.WsArmor; @@ -50,6 +49,8 @@ @UiField Label firstCategoryLabel; @UiField + DockLayoutPanel firstCategoryPanel; + @UiField Label firstDeckLabel; @UiField FlowPanel mainPanel; @@ -97,9 +98,9 @@ actions.clear(); } - public BasicThumb createThumb(final GroupDTO group, final String avatarUrl, final String tooltip, + public BasicThumb createThumb(final String text, final String avatarUrl, final String tooltip, final String tooltipTitle, final GuiActionDescCollection menuitems) { - final BasicThumb thumb = new BasicThumb(avatarUrl, AVATARSIZE, group.getShortName(), AVATARLABELMAXSIZE, false); + final BasicThumb thumb = new BasicThumb(avatarUrl, AVATARSIZE, text, AVATARLABELMAXSIZE, false); final MenuDescriptor menu = new MenuDescriptor(); menu.setStandalone(true); menu.putValue(AbstractGxtMenuGui.MENU_POSITION, AbstractGxtMenuGui.MenuPosition.bl); Modified: trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPanel.ui.xml 2011-03-07 17:08:07 UTC (rev 1269) @@ -14,7 +14,7 @@ <g:Label ui:field="firstDeckLabel" addStyleNames="k-sn-novisible-label" /> <g:Label ui:field="sndDeckLabel" addStyleNames="k-sn-orphan-label" /> <g:FlowPanel width="100%" ui:field="categoriesFlow"> - <g:DockLayoutPanel unit="EM" width="100%" + <g:DockLayoutPanel unit="EM" width="100%" ui:field="firstCategoryPanel" addStyleNames="k-sn-adminspanel" height="80px"> <g:north size="1.2"> <g:FlowPanel> Added: trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPresenter.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/AbstractSNPresenter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,44 @@ +package cc.kune.core.client.sn; + +import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; +import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; +import cc.kune.common.client.actions.ui.descrip.MenuTitleItemDescriptor; +import cc.kune.core.client.services.FileDownloadUtils; +import cc.kune.core.client.sn.actions.registry.AbstractSNMembersActionsRegistry; +import cc.kune.core.shared.dto.GroupDTO; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Provider; +import com.gwtplatform.mvp.client.Presenter; +import com.gwtplatform.mvp.client.View; +import com.gwtplatform.mvp.client.proxy.Proxy; + +public abstract class AbstractSNPresenter<V extends View, Proxy_ extends Proxy<?>> extends Presenter<View, Proxy<?>> { + protected static final String GROUP_NO_AVATAR_IMAGE = "images/group-def-icon.png"; + protected static final String PERSON_NO_AVATAR_IMAGE = "images/unknown.jpg"; + protected final Provider<FileDownloadUtils> downloadProvider; + + public AbstractSNPresenter(final EventBus eventBus, final View view, final Proxy<?> proxy, + final Provider<FileDownloadUtils> downloadProvider) { + super(eventBus, view, proxy); + this.downloadProvider = downloadProvider; + } + + protected GuiActionDescCollection createMenuItems(final Object target, + final AbstractSNMembersActionsRegistry registry, final String title) { + final GuiActionDescCollection items = new GuiActionDescCollection(); + items.add(new MenuTitleItemDescriptor(title)); + for (final Provider<MenuItemDescriptor> provider : registry) { + final MenuItemDescriptor menuItem = provider.get(); + menuItem.setTarget(target); + items.add(menuItem); + } + return items; + } + + protected String getAvatar(final GroupDTO group) { + return group.hasLogo() ? downloadProvider.get().getLogoImageUrl(group.getStateToken()) + : group.isPersonal() ? PERSON_NO_AVATAR_IMAGE : GROUP_NO_AVATAR_IMAGE; + } + +} Deleted: trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPanel.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPanel.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPanel.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,84 +0,0 @@ -package cc.kune.core.client.sn; - -import cc.kune.common.client.actions.ui.ActionFlowPanel; -import cc.kune.common.client.actions.ui.bind.GuiProvider; -import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; -import cc.kune.common.client.ui.BasicThumb; -import cc.kune.core.client.resources.CoreMessages; -import cc.kune.core.client.sn.BuddiesAndParticipationPresenter.BuddiesAndParticipationView; -import cc.kune.core.shared.dto.GroupDTO; -import cc.kune.core.shared.i18n.I18nTranslationService; -import cc.kune.gspace.client.WsArmor; - -import com.google.inject.Inject; - -public class BuddiesAndParticipationPanel extends AbstractSNPanel implements BuddiesAndParticipationView { - - @Inject - public BuddiesAndParticipationPanel(final I18nTranslationService i18n, final GuiProvider guiProvider, - final WsArmor armor) { - super(i18n, guiProvider, armor); - setVisible(false); - mainTitle.setText(i18n.t("His/her Net:")); - mainTitle.setTitle(i18n.t("This user buddies and groups where participes")); - firstCategoryLabel.setText(i18n.t("Buddies")); - firstCategoryLabel.setTitle(i18n.t("This user buddies")); - sndCategoryLabel.setText(i18n.t("and participates in")); - sndCategoryLabel.setTitle(i18n.t("Groups in which this user participates")); - firstDeckLabel.setText(i18n.t(CoreMessages.BUDDIES_NOT_PUBLIC)); - trdCategoryLabel.setText("NOT USED"); - trdCategoryLabel.setTitle("NOT USED"); - trdCategoryPanel.setVisible(false); - sndDeckLabel.setText("NOT USED"); - bottomActionsToolbar = new ActionFlowPanel(guiProvider); - bottomPanel.add(bottomActionsToolbar); - bottomActionsToolbar.setStyleName("k-sn-bottomPanel-actions"); - armor.getEntityToolsNorth().add(widget); - deck.showWidget(2); - } - - @Override - public void addBuddie(final GroupDTO group, final String avatarUrl, final String tooltip, - final String tooltipTitle, final GuiActionDescCollection menu) { - final BasicThumb thumb = createThumb(group, avatarUrl, tooltip, tooltipTitle, menu); - firstCategoryFlow.add(thumb); - } - - @Override - public void addParticipation(final GroupDTO group, final String avatarUrl, final String tooltip, - final String tooltipTitle, final GuiActionDescCollection menu) { - final BasicThumb thumb = createThumb(group, avatarUrl, tooltip, tooltipTitle, menu); - sndCategoryFlow.add(thumb); - } - - @Override - public void setBuddiesCount(final int count) { - firstCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); - } - - @Override - public void setParticipationCount(final int count) { - sndCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); - } - - @Override - public void setParticipationVisible(final boolean visible) { - sndCategoryPanel.setVisible(visible); - } - - @Override - public void setVisible(final boolean visible) { - mainPanel.setVisible(visible); - } - - @Override - public void showBuddies() { - deck.showWidget(2); - } - - @Override - public void showBuddiesNotPublic() { - deck.showWidget(0); - } - -} Deleted: trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPresenter.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPresenter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,220 +0,0 @@ -package cc.kune.core.client.sn; - -import java.util.List; - -import cc.kune.common.client.actions.ui.IsActionExtensible; -import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; -import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; -import cc.kune.core.client.services.FileDownloadUtils; -import cc.kune.core.client.sn.actions.registry.AbstractSNMembersActionsRegistry; -import cc.kune.core.client.sn.actions.registry.GroupMembersActionsRegistry; -import cc.kune.core.client.sn.actions.registry.SNAdminsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNCollabsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNPendingsMenuItemsRegistry; -import cc.kune.core.client.state.Session; -import cc.kune.core.client.state.SocialNetworkChangedEvent; -import cc.kune.core.client.state.StateChangedEvent; -import cc.kune.core.client.state.StateManager; -import cc.kune.core.shared.domain.utils.AccessRights; -import cc.kune.core.shared.dto.GroupDTO; -import cc.kune.core.shared.dto.ParticipationDataDTO; -import cc.kune.core.shared.dto.StateAbstractDTO; - -import com.google.gwt.event.shared.EventBus; -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.gwtplatform.mvp.client.Presenter; -import com.gwtplatform.mvp.client.View; -import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit; -import com.gwtplatform.mvp.client.proxy.Proxy; -import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent; - -public class BuddiesAndParticipationPresenter - extends - Presenter<BuddiesAndParticipationPresenter.BuddiesAndParticipationView, BuddiesAndParticipationPresenter.BuddiesAndParticipationProxy> { - - @ProxyCodeSplit - public interface BuddiesAndParticipationProxy extends Proxy<BuddiesAndParticipationPresenter> { - } - - public interface BuddiesAndParticipationView extends View { - - void addBuddie(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, - GuiActionDescCollection menu); - - void addParticipation(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, - GuiActionDescCollection menu); - - void clear(); - - IsActionExtensible getBottomToolbar(); - - void setBuddiesCount(int count); - - void setParticipationCount(int count); - - void setParticipationVisible(boolean visible); - - void setVisible(boolean visible); - - void showBuddies(); - - void showBuddiesNotPublic(); - } - - private final GroupMembersActionsRegistry actionsRegistry; - private final SNAdminsMenuItemsRegistry adminsMenuItemsRegistry; - private final SNCollabsMenuItemsRegistry collabsMenuItemsRegistry; - private final Provider<FileDownloadUtils> downloadProvider; - private final SNPendingsMenuItemsRegistry pendingsMenuItemsRegistry; - - @Inject - public BuddiesAndParticipationPresenter(final EventBus eventBus, final BuddiesAndParticipationView view, - final BuddiesAndParticipationProxy proxy, final StateManager stateManager, final Session session, - final Provider<FileDownloadUtils> downloadProvider, - final SNAdminsMenuItemsRegistry adminsMenuItemsRegistry, - final SNCollabsMenuItemsRegistry collabsMenuItemsRegistry, - final SNPendingsMenuItemsRegistry pendingsMenuItemsRegistry, - final GroupMembersActionsRegistry actionsRegistry) { - super(eventBus, view, proxy); - this.downloadProvider = downloadProvider; - this.adminsMenuItemsRegistry = adminsMenuItemsRegistry; - this.collabsMenuItemsRegistry = collabsMenuItemsRegistry; - this.pendingsMenuItemsRegistry = pendingsMenuItemsRegistry; - this.actionsRegistry = actionsRegistry; - stateManager.onStateChanged(true, new StateChangedEvent.StateChangedHandler() { - @Override - public void onStateChanged(final StateChangedEvent event) { - BuddiesAndParticipationPresenter.this.onStateChanged(event.getState()); - } - }); - stateManager.onSocialNetworkChanged(true, new SocialNetworkChangedEvent.SocialNetworkChangedHandler() { - - @Override - public void onSocialNetworkChanged(final SocialNetworkChangedEvent event) { - BuddiesAndParticipationPresenter.this.onStateChanged(event.getState()); - } - }); - createActions(); - } - - private void createActions() { - getView().getBottomToolbar().addActions(actionsRegistry); - } - - private GuiActionDescCollection createMenuItems(final GroupDTO group, - final AbstractSNMembersActionsRegistry registry) { - final GuiActionDescCollection items = new GuiActionDescCollection(); - for (final Provider<MenuItemDescriptor> provider : registry) { - final MenuItemDescriptor menuItem = provider.get(); - menuItem.setTarget(group); - items.add(menuItem); - } - return items; - } - - private String getAvatar(final GroupDTO admin) { - return admin.hasLogo() ? downloadProvider.get().getLogoImageUrl(admin.getStateToken()) : "images/unknown.jpg"; - } - - private void onStateChanged(final StateAbstractDTO state) { - if (state.getGroup().isNotPersonal()) { - getView().setVisible(false); - } else { - setParticipationState(state); - if (state.getSocialNetworkData().isBuddiesVisible()) { - getView().clear(); - // setGroupMembers(state.getGroupMembers(), - // state.getGroupRights()); - } else { - getView().clear(); - getView().showBuddiesNotPublic(); - } - getView().setVisible(true); - } - } - - @Override - protected void revealInParent() { - RevealRootContentEvent.fire(this, this); - } - - // private void setGroupMembers(final SocialNetworkDTO socialNetwork, final - // AccessRights rights) { - // final AccessListsDTO accessLists = socialNetwork.getAccessLists(); - // - // final List<GroupDTO> adminsList = accessLists.getAdmins().getList(); - // final List<GroupDTO> collabList = accessLists.getEditors().getList(); - // final List<GroupDTO> pendingCollabsList = - // socialNetwork.getPendingCollaborators().getList(); - // - // final int numAdmins = adminsList.size(); - // final int numCollabs = collabList.size(); - // final int numPendings = pendingCollabsList.size(); - // - // getView().setAdminsCount(numAdmins); - // getView().setCollabsCount(numCollabs); - // getView().setPendingsCount(numPendings); - // - // if ((numAdmins + numCollabs) == 0) { - // getView().showOrphan(); - // } else { - // final boolean userIsAdmin = rights.isAdministrable(); - // final boolean userCanView = rights.isVisible(); - // - // if (userCanView) { - // for (final GroupDTO admin : adminsList) { - // final String avatar = getAvatar(admin); - // getView().addAdmin(admin, avatar, admin.getLongName(), "", - // createMenuItems(admin, adminsMenuItemsRegistry)); - // } - // getView().setCollabsVisible(numCollabs > 0); - // for (final GroupDTO collab : collabList) { - // final String avatar = getAvatar(collab); - // getView().addCollab(collab, avatar, collab.getLongName(), "", - // createMenuItems(collab, collabsMenuItemsRegistry)); - // } - // if (userIsAdmin) { - // getView().setPendingVisible(numPendings > 0); - // for (final GroupDTO pendingCollab : pendingCollabsList) { - // final String avatar = getAvatar(pendingCollab); - // getView().addPending(pendingCollab, avatar, pendingCollab.getLongName(), - // "", - // createMenuItems(pendingCollab, pendingsMenuItemsRegistry)); - // } - // } else { - // getView().setPendingVisible(false); - // } - // getView().showMembers(); - // } - // } - // getView().setVisible(true); - // } - - private void setParticipationState(final StateAbstractDTO state) { - final ParticipationDataDTO participation = state.getParticipation(); - final AccessRights rights = state.getGroupRights(); - getView().clear(); - final List<GroupDTO> groupsIsAdmin = participation.getGroupsIsAdmin(); - final List<GroupDTO> groupsIsCollab = participation.getGroupsIsCollab(); - final int numAdmins = groupsIsAdmin.size(); - final int numCollaborators = groupsIsCollab.size(); - for (final GroupDTO group : groupsIsAdmin) { - // getView().addParticipation(group, null, null, null, - // actionsRegistry); - // view.addItem(createGridItem(adminCategory, group, rights, - // unJoinMenuItem)); - } - for (final GroupDTO group : groupsIsCollab) { - // view.addItem(createGridItem(collabCategory, group, rights, - // unJoinMenuItem)); - } - final int totalGroups = numAdmins + numCollaborators; - if (totalGroups > 0) { - getView().setParticipationCount(totalGroups); - getView().setParticipationVisible(true); - } else { - getView().setParticipationVisible(false); - } - } -} \ No newline at end of file Deleted: trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPanel.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPanel.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPanel.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,103 +0,0 @@ -package cc.kune.core.client.sn; - -import cc.kune.common.client.actions.ui.ActionFlowPanel; -import cc.kune.common.client.actions.ui.bind.GuiProvider; -import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; -import cc.kune.common.client.ui.BasicThumb; -import cc.kune.core.client.sn.GroupMembersPresenter.GroupMembersView; -import cc.kune.core.shared.dto.GroupDTO; -import cc.kune.core.shared.i18n.I18nTranslationService; -import cc.kune.gspace.client.WsArmor; - -import com.google.inject.Inject; - -public class GroupMembersPanel extends AbstractSNPanel implements GroupMembersView { - - @Inject - public GroupMembersPanel(final I18nTranslationService i18n, final GuiProvider guiProvider, final WsArmor armor) { - super(i18n, guiProvider, armor); - setVisible(false); - mainTitle.setText(i18n.t("Group members")); - mainTitle.setTitle(i18n.t("People and groups collaborating in this group")); - firstCategoryLabel.setText(i18n.t("Admins")); - firstCategoryLabel.setTitle(i18n.t("People that can admin this group")); - sndCategoryLabel.setText(i18n.t("Collaborators")); - sndCategoryLabel.setTitle(i18n.t("Other people that collaborate with this group")); - trdCategoryLabel.setText(i18n.t("Pending")); - trdCategoryLabel.setTitle(i18n.t("People pending to be accepted in this group by the admins")); - sndDeckLabel.setText(i18n.t("This is an orphaned project, if you are interested please request to join to work on it")); - firstDeckLabel.setText(i18n.t("The members of this group are not public")); - bottomActionsToolbar = new ActionFlowPanel(guiProvider); - bottomPanel.add(bottomActionsToolbar); - bottomActionsToolbar.setStyleName("k-sn-bottomPanel-actions"); - armor.getEntityToolsNorth().add(widget); - deck.showWidget(2); - } - - @Override - public void addAdmin(final GroupDTO group, final String avatarUrl, final String tooltip, final String tooltipTitle, - final GuiActionDescCollection menu) { - final BasicThumb thumb = createThumb(group, avatarUrl, tooltip, tooltipTitle, menu); - firstCategoryFlow.add(thumb); - } - - @Override - public void addCollab(final GroupDTO group, final String avatarUrl, final String tooltip, - final String tooltipTitle, final GuiActionDescCollection menu) { - final BasicThumb thumb = createThumb(group, avatarUrl, tooltip, tooltipTitle, menu); - sndCategoryFlow.add(thumb); - } - - @Override - public void addPending(final GroupDTO group, final String avatarUrl, final String tooltip, - final String tooltipTitle, final GuiActionDescCollection menu) { - final BasicThumb thumb = createThumb(group, avatarUrl, tooltip, tooltipTitle, menu); - trdCategoryFlow.add(thumb); - } - - @Override - public void setAdminsCount(final int count) { - firstCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); - } - - @Override - public void setCollabsCount(final int count) { - sndCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); - } - - @Override - public void setCollabsVisible(final boolean visible) { - sndCategoryPanel.setVisible(visible); - } - - @Override - public void setPendingsCount(final int count) { - trdCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); - } - - @Override - public void setPendingVisible(final boolean visible) { - trdCategoryPanel.setVisible(visible); - } - - @Override - public void setVisible(final boolean visible) { - mainPanel.setVisible(visible); - } - - @Override - public void showMemberNotPublic() { - deck.showWidget(0); - } - - @Override - public void showMembers() { - deck.showWidget(2); - } - - @Override - public void showOrphan() { - deck.showWidget(1); - } - -} Deleted: trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPresenter.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPresenter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,198 +0,0 @@ -package cc.kune.core.client.sn; - -import java.util.List; - -import cc.kune.common.client.actions.ui.IsActionExtensible; -import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; -import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; -import cc.kune.common.client.actions.ui.descrip.MenuTitleItemDescriptor; -import cc.kune.core.client.services.FileDownloadUtils; -import cc.kune.core.client.sn.actions.registry.AbstractSNMembersActionsRegistry; -import cc.kune.core.client.sn.actions.registry.GroupMembersActionsRegistry; -import cc.kune.core.client.sn.actions.registry.SNAdminsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNCollabsMenuItemsRegistry; -import cc.kune.core.client.sn.actions.registry.SNPendingsMenuItemsRegistry; -import cc.kune.core.client.state.Session; -import cc.kune.core.client.state.SocialNetworkChangedEvent; -import cc.kune.core.client.state.StateChangedEvent; -import cc.kune.core.client.state.StateManager; -import cc.kune.core.shared.domain.utils.AccessRights; -import cc.kune.core.shared.dto.AccessListsDTO; -import cc.kune.core.shared.dto.GroupDTO; -import cc.kune.core.shared.dto.SocialNetworkDTO; -import cc.kune.core.shared.dto.StateAbstractDTO; - -import com.google.gwt.event.shared.EventBus; -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.gwtplatform.mvp.client.Presenter; -import com.gwtplatform.mvp.client.View; -import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit; -import com.gwtplatform.mvp.client.proxy.Proxy; -import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent; - -public class GroupMembersPresenter extends - Presenter<GroupMembersPresenter.GroupMembersView, GroupMembersPresenter.GroupMembersProxy> { - - @ProxyCodeSplit - public interface GroupMembersProxy extends Proxy<GroupMembersPresenter> { - } - - public interface GroupMembersView extends View { - - void addAdmin(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, - GuiActionDescCollection menu); - - void addCollab(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, - GuiActionDescCollection menu); - - void addPending(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, - GuiActionDescCollection menu); - - void clear(); - - IsActionExtensible getBottomToolbar(); - - void setAdminsCount(int count); - - void setCollabsCount(int count); - - void setCollabsVisible(boolean visible); - - void setPendingsCount(int count); - - void setPendingVisible(boolean visible); - - void setVisible(boolean visible); - - void showMemberNotPublic(); - - void showMembers(); - - void showOrphan(); - } - - private final GroupMembersActionsRegistry actionsRegistry; - private final SNAdminsMenuItemsRegistry adminsMenuItemsRegistry; - private final SNCollabsMenuItemsRegistry collabsMenuItemsRegistry; - private final Provider<FileDownloadUtils> downloadProvider; - private final SNPendingsMenuItemsRegistry pendingsMenuItemsRegistry; - - @Inject - public GroupMembersPresenter(final EventBus eventBus, final GroupMembersView view, final GroupMembersProxy proxy, - final StateManager stateManager, final Session session, final Provider<FileDownloadUtils> downloadProvider, - final SNAdminsMenuItemsRegistry adminsMenuItemsRegistry, - final SNCollabsMenuItemsRegistry collabsMenuItemsRegistry, - final SNPendingsMenuItemsRegistry pendingsMenuItemsRegistry, - final GroupMembersActionsRegistry actionsRegistry) { - super(eventBus, view, proxy); - this.downloadProvider = downloadProvider; - this.adminsMenuItemsRegistry = adminsMenuItemsRegistry; - this.collabsMenuItemsRegistry = collabsMenuItemsRegistry; - this.pendingsMenuItemsRegistry = pendingsMenuItemsRegistry; - this.actionsRegistry = actionsRegistry; - stateManager.onStateChanged(true, new StateChangedEvent.StateChangedHandler() { - @Override - public void onStateChanged(final StateChangedEvent event) { - GroupMembersPresenter.this.onStateChanged(event.getState()); - } - }); - stateManager.onSocialNetworkChanged(true, new SocialNetworkChangedEvent.SocialNetworkChangedHandler() { - - @Override - public void onSocialNetworkChanged(final SocialNetworkChangedEvent event) { - GroupMembersPresenter.this.onStateChanged(event.getState()); - } - }); - createActions(); - } - - private void createActions() { - getView().getBottomToolbar().addActions(actionsRegistry); - } - - private GuiActionDescCollection createMenuItems(final GroupDTO group, - final AbstractSNMembersActionsRegistry registry) { - final GuiActionDescCollection items = new GuiActionDescCollection(); - items.add(new MenuTitleItemDescriptor(group.getLongName())); - for (final Provider<MenuItemDescriptor> provider : registry) { - final MenuItemDescriptor menuItem = provider.get(); - menuItem.setTarget(group); - items.add(menuItem); - } - return items; - } - - private String getAvatar(final GroupDTO admin) { - return admin.hasLogo() ? downloadProvider.get().getLogoImageUrl(admin.getStateToken()) : "images/unknown.jpg"; - } - - private void onStateChanged(final StateAbstractDTO state) { - if (state.getGroup().isPersonal()) { - getView().setVisible(false); - } else { - if (state.getSocialNetworkData().isMembersVisible()) { - getView().clear(); - setGroupMembers(state.getGroupMembers(), state.getGroupRights()); - } else { - getView().clear(); - getView().showMemberNotPublic(); - getView().setVisible(true); - } - } - } - - @Override - protected void revealInParent() { - RevealRootContentEvent.fire(this, this); - } - - private void setGroupMembers(final SocialNetworkDTO socialNetwork, final AccessRights rights) { - final AccessListsDTO accessLists = socialNetwork.getAccessLists(); - - final List<GroupDTO> adminsList = accessLists.getAdmins().getList(); - final List<GroupDTO> collabList = accessLists.getEditors().getList(); - final List<GroupDTO> pendingCollabsList = socialNetwork.getPendingCollaborators().getList(); - - final int numAdmins = adminsList.size(); - final int numCollabs = collabList.size(); - final int numPendings = pendingCollabsList.size(); - - getView().setAdminsCount(numAdmins); - getView().setCollabsCount(numCollabs); - getView().setPendingsCount(numPendings); - - if ((numAdmins + numCollabs) == 0) { - getView().showOrphan(); - } else { - final boolean userIsAdmin = rights.isAdministrable(); - final boolean userCanView = rights.isVisible(); - - if (userCanView) { - for (final GroupDTO admin : adminsList) { - final String avatar = getAvatar(admin); - getView().addAdmin(admin, avatar, admin.getLongName(), "", - createMenuItems(admin, adminsMenuItemsRegistry)); - } - getView().setCollabsVisible(numCollabs > 0); - for (final GroupDTO collab : collabList) { - final String avatar = getAvatar(collab); - getView().addCollab(collab, avatar, collab.getLongName(), "", - createMenuItems(collab, collabsMenuItemsRegistry)); - } - if (userIsAdmin) { - getView().setPendingVisible(numPendings > 0); - for (final GroupDTO pendingCollab : pendingCollabsList) { - final String avatar = getAvatar(pendingCollab); - getView().addPending(pendingCollab, avatar, pendingCollab.getLongName(), "", - createMenuItems(pendingCollab, pendingsMenuItemsRegistry)); - } - } else { - getView().setPendingVisible(false); - } - getView().showMembers(); - } - } - getView().setVisible(true); - } -} \ No newline at end of file Copied: trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java (from rev 1267, trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPanel.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,103 @@ +package cc.kune.core.client.sn; + +import cc.kune.common.client.actions.ui.ActionFlowPanel; +import cc.kune.common.client.actions.ui.bind.GuiProvider; +import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; +import cc.kune.common.client.ui.BasicThumb; +import cc.kune.core.client.sn.GroupSNPresenter.GroupSNView; +import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; +import cc.kune.gspace.client.WsArmor; + +import com.google.inject.Inject; + +public class GroupSNPanel extends AbstractSNPanel implements GroupSNView { + + @Inject + public GroupSNPanel(final I18nTranslationService i18n, final GuiProvider guiProvider, final WsArmor armor) { + super(i18n, guiProvider, armor); + setVisible(false); + mainTitle.setText(i18n.t("Group members")); + mainTitle.setTitle(i18n.t("People and groups collaborating in this group")); + firstCategoryLabel.setText(i18n.t("Admins")); + firstCategoryPanel.setTitle(i18n.t("People that can admin this group")); + sndCategoryLabel.setText(i18n.t("Collaborators")); + sndCategoryPanel.setTitle(i18n.t("Other people that collaborate with this group")); + trdCategoryLabel.setText(i18n.t("Pending")); + trdCategoryPanel.setTitle(i18n.t("People pending to be accepted in this group by the admins")); + sndDeckLabel.setText(i18n.t("This is an orphaned project, if you are interested please request to join to work on it")); + firstDeckLabel.setText(i18n.t("The members of this group are not public")); + bottomActionsToolbar = new ActionFlowPanel(guiProvider); + bottomPanel.add(bottomActionsToolbar); + bottomActionsToolbar.setStyleName("k-sn-bottomPanel-actions"); + armor.getEntityToolsNorth().add(widget); + deck.showWidget(2); + } + + @Override + public void addAdmin(final GroupDTO group, final String avatarUrl, final String tooltip, final String tooltipTitle, + final GuiActionDescCollection menu) { + final BasicThumb thumb = createThumb(group.getShortName(), avatarUrl, tooltip, tooltipTitle, menu); + firstCategoryFlow.add(thumb); + } + + @Override + public void addCollab(final GroupDTO group, final String avatarUrl, final String tooltip, + final String tooltipTitle, final GuiActionDescCollection menu) { + final BasicThumb thumb = createThumb(group.getShortName(), avatarUrl, tooltip, tooltipTitle, menu); + sndCategoryFlow.add(thumb); + } + + @Override + public void addPending(final GroupDTO group, final String avatarUrl, final String tooltip, + final String tooltipTitle, final GuiActionDescCollection menu) { + final BasicThumb thumb = createThumb(group.getShortName(), avatarUrl, tooltip, tooltipTitle, menu); + trdCategoryFlow.add(thumb); + } + + @Override + public void setAdminsCount(final int count) { + firstCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); + } + + @Override + public void setCollabsCount(final int count) { + sndCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); + } + + @Override + public void setCollabsVisible(final boolean visible) { + sndCategoryPanel.setVisible(visible); + } + + @Override + public void setPendingsCount(final int count) { + trdCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); + } + + @Override + public void setPendingVisible(final boolean visible) { + trdCategoryPanel.setVisible(visible); + } + + @Override + public void setVisible(final boolean visible) { + mainPanel.setVisible(visible); + } + + @Override + public void showMemberNotPublic() { + deck.showWidget(0); + } + + @Override + public void showMembers() { + deck.showWidget(2); + } + + @Override + public void showOrphan() { + deck.showWidget(1); + } + +} Property changes on: trunk/src/main/java/cc/kune/core/client/sn/GroupSNPanel.java ___________________________________________________________________ Name: svn:mime-type + text/plain Copied: trunk/src/main/java/cc/kune/core/client/sn/GroupSNPresenter.java (from rev 1268, trunk/src/main/java/cc/kune/core/client/sn/GroupMembersPresenter.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/GroupSNPresenter.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/GroupSNPresenter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,203 @@ +package cc.kune.core.client.sn; + +import java.util.List; + +import cc.kune.common.client.actions.ui.IsActionExtensible; +import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; +import cc.kune.core.client.services.FileDownloadUtils; +import cc.kune.core.client.sn.actions.registry.GroupSNAdminsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNBottomActionsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNCollabsMenuItemsRegistry; +import cc.kune.core.client.sn.actions.registry.GroupSNPendingsMenuItemsRegistry; +import cc.kune.core.client.state.Session; +import cc.kune.core.client.state.SocialNetworkChangedEvent; +import cc.kune.core.client.state.StateChangedEvent; +import cc.kune.core.client.state.StateManager; +import cc.kune.core.client.state.UserSignInEvent; +import cc.kune.core.client.state.UserSignInEvent.UserSignInHandler; +import cc.kune.core.client.state.UserSignOutEvent; +import cc.kune.core.client.state.UserSignOutEvent.UserSignOutHandler; +import cc.kune.core.shared.domain.utils.AccessRights; +import cc.kune.core.shared.dto.AccessListsDTO; +import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.SocialNetworkDTO; +import cc.kune.core.shared.dto.StateAbstractDTO; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.gwtplatform.mvp.client.View; +import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit; +import com.gwtplatform.mvp.client.proxy.Proxy; +import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent; + +public class GroupSNPresenter extends AbstractSNPresenter<GroupSNPresenter.GroupSNView, GroupSNPresenter.GroupSNProxy> { + + @ProxyCodeSplit + public interface GroupSNProxy extends Proxy<GroupSNPresenter> { + } + + public interface GroupSNView extends View { + + void addAdmin(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, + GuiActionDescCollection menu); + + void addCollab(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, + GuiActionDescCollection menu); + + void addPending(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, + GuiActionDescCollection menu); + + void clear(); + + IsActionExtensible getBottomToolbar(); + + void setAdminsCount(int count); + + void setCollabsCount(int count); + + void setCollabsVisible(boolean visible); + + void setPendingsCount(int count); + + void setPendingVisible(boolean visible); + + void setVisible(boolean visible); + + void showMemberNotPublic(); + + void showMembers(); + + void showOrphan(); + } + + private final GroupSNBottomActionsRegistry actionsRegistry; + private final GroupSNAdminsMenuItemsRegistry adminsMenuItemsRegistry; + private final GroupSNCollabsMenuItemsRegistry collabsMenuItemsRegistry; + private final GroupSNPendingsMenuItemsRegistry pendingsMenuItemsRegistry; + + @Inject + public GroupSNPresenter(final EventBus eventBus, final GroupSNView view, final GroupSNProxy proxy, + final StateManager stateManager, final Session session, final Provider<FileDownloadUtils> downloadProvider, + final GroupSNAdminsMenuItemsRegistry adminsMenuItemsRegistry, + final GroupSNCollabsMenuItemsRegistry collabsMenuItemsRegistry, + final GroupSNPendingsMenuItemsRegistry pendingsMenuItemsRegistry, + final GroupSNBottomActionsRegistry actionsRegistry) { + super(eventBus, view, proxy, downloadProvider); + this.adminsMenuItemsRegistry = adminsMenuItemsRegistry; + this.collabsMenuItemsRegistry = collabsMenuItemsRegistry; + this.pendingsMenuItemsRegistry = pendingsMenuItemsRegistry; + this.actionsRegistry = actionsRegistry; + stateManager.onStateChanged(true, new StateChangedEvent.StateChangedHandler() { + @Override + public void onStateChanged(final StateChangedEvent event) { + GroupSNPresenter.this.onStateChanged(event.getState()); + } + }); + stateManager.onSocialNetworkChanged(true, new SocialNetworkChangedEvent.SocialNetworkChangedHandler() { + @Override + public void onSocialNetworkChanged(final SocialNetworkChangedEvent event) { + GroupSNPresenter.this.onStateChanged(event.getState()); + } + }); + session.onUserSignIn(true, new UserSignInHandler() { + @Override + public void onUserSignIn(final UserSignInEvent event) { + refreshOnSignInSignOut(session); + } + }); + session.onUserSignOut(true, new UserSignOutHandler() { + @Override + public void onUserSignOut(final UserSignOutEvent event) { + refreshOnSignInSignOut(session); + } + + }); + createActions(); + } + + private void createActions() { + getView().getBottomToolbar().addActions(actionsRegistry); + } + + @Override + public GroupSNView getView() { + return (GroupSNView) super.getView(); + } + + private void onStateChanged(final StateAbstractDTO state) { + if (state.getGroup().isPersonal()) { + getView().setVisible(false); + } else { + if (state.getSocialNetworkData().isMembersVisible()) { + getView().clear(); + setGroupMembers(state.getGroupMembers(), state.getGroupRights()); + } else { + getView().clear(); + getView().showMemberNotPublic(); + getView().setVisible(true); + } + } + } + + private void refreshOnSignInSignOut(final Session session) { + final StateAbstractDTO currentState = session.getCurrentState(); + if (currentState != null) { + GroupSNPresenter.this.onStateChanged(currentState); + } + } + + @Override + protected void revealInParent() { + RevealRootContentEvent.fire(this, this); + } + + private void setGroupMembers(final SocialNetworkDTO socialNetwork, final AccessRights rights) { + final AccessListsDTO accessLists = socialNetwork.getAccessLists(); + + final List<GroupDTO> adminsList = accessLists.getAdmins().getList(); + final List<GroupDTO> collabList = accessLists.getEditors().getList(); + final List<GroupDTO> pendingCollabsList = socialNetwork.getPendingCollaborators().getList(); + + final int numAdmins = adminsList.size(); + final int numCollabs = collabList.size(); + final int numPendings = pendingCollabsList.size(); + + getView().setAdminsCount(numAdmins); + getView().setCollabsCount(numCollabs); + getView().setPendingsCount(numPendings); + + if ((numAdmins + numCollabs) == 0) { + getView().showOrphan(); + } else { + final boolean userIsAdmin = rights.isAdministrable(); + final boolean userCanView = rights.isVisible(); + + if (userCanView) { + for (final GroupDTO admin : adminsList) { + final String avatar = getAvatar(admin); + getView().addAdmin(admin, avatar, admin.getLongName(), "", + createMenuItems(admin, adminsMenuItemsRegistry, admin.getLongName())); + } + getView().setCollabsVisible(numCollabs > 0); + for (final GroupDTO collab : collabList) { + final String avatar = getAvatar(collab); + getView().addCollab(collab, avatar, collab.getLongName(), "", + createMenuItems(collab, collabsMenuItemsRegistry, collab.getLongName())); + } + if (userIsAdmin) { + getView().setPendingVisible(numPendings > 0); + for (final GroupDTO pendingCollab : pendingCollabsList) { + final String avatar = getAvatar(pendingCollab); + getView().addPending(pendingCollab, avatar, pendingCollab.getLongName(), "", + createMenuItems(pendingCollab, pendingsMenuItemsRegistry, pendingCollab.getLongName())); + } + } else { + getView().setPendingVisible(false); + } + getView().showMembers(); + } + } + getView().setVisible(true); + } +} \ No newline at end of file Property changes on: trunk/src/main/java/cc/kune/core/client/sn/GroupSNPresenter.java ___________________________________________________________________ Name: svn:mime-type + text/plain Copied: trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java (from rev 1267, trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPanel.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/UserSNPanel.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,92 @@ +package cc.kune.core.client.sn; + +import cc.kune.common.client.actions.ui.ActionFlowPanel; +import cc.kune.common.client.actions.ui.bind.GuiProvider; +import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; +import cc.kune.core.client.resources.CoreMessages; +import cc.kune.core.client.sn.UserSNPresenter.UserSNView; +import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.UserSimpleDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; +import cc.kune.gspace.client.WsArmor; + +import com.google.gwt.user.client.ui.Label; +import com.google.inject.Inject; + +public class UserSNPanel extends AbstractSNPanel implements UserSNView { + + @Inject + public UserSNPanel(final I18nTranslationService i18n, final GuiProvider guiProvider, final WsArmor armor) { + super(i18n, guiProvider, armor); + setVisible(false); + mainTitle.setText(i18n.t("His/her network:")); + mainTitle.setTitle(i18n.t("This user buddies and groups where participes")); + firstCategoryLabel.setText(i18n.t("Buddies")); + firstCategoryPanel.setTitle(i18n.t("This user buddies")); + sndCategoryLabel.setText(i18n.t("and participates in")); + sndCategoryPanel.setTitle(i18n.t("Groups in which this user participates")); + firstDeckLabel.setText(i18n.t(CoreMessages.BUDDIES_NOT_PUBLIC)); + trdCategoryLabel.setText("NOT USED"); + trdCategoryLabel.setTitle("NOT USED"); + trdCategoryPanel.setVisible(false); + sndDeckLabel.setText("NOT USED"); + bottomActionsToolbar = new ActionFlowPanel(guiProvider); + bottomPanel.add(bottomActionsToolbar); + bottomActionsToolbar.setStyleName("k-sn-bottomPanel-actions"); + armor.getEntityToolsNorth().add(widget); + deck.showWidget(2); + } + + @Override + public void addBuddie(final UserSimpleDTO user, final String avatarUrl, final String tooltip, + final String tooltipTitle, final GuiActionDescCollection menu) { + firstCategoryFlow.add(createThumb(user.getShortName(), avatarUrl, tooltip, tooltipTitle, menu)); + } + + @Override + public void addParticipation(final GroupDTO group, final String avatarUrl, final String tooltip, + final String tooltipTitle, final GuiActionDescCollection menu) { + sndCategoryFlow.add(createThumb(group.getShortName(), avatarUrl, tooltip, tooltipTitle, menu)); + } + + @Override + public void addTextToBuddieList(final String text) { + firstCategoryFlow.add(new Label(text)); + } + + @Override + public void setBuddiesCount(final int count) { + firstCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); + } + + @Override + public void setBuddiesVisible(final boolean visible) { + firstCategoryPanel.setVisible(visible); + } + + @Override + public void setParticipationCount(final int count) { + sndCategoryCount.setText(new StringBuffer("(").append(count).append(")").toString()); + } + + @Override + public void setParticipationVisible(final boolean visible) { + sndCategoryPanel.setVisible(visible); + } + + @Override + public void setVisible(final boolean visible) { + mainPanel.setVisible(visible); + } + + @Override + public void showBuddies() { + deck.showWidget(2); + } + + @Override + public void showBuddiesNotPublic() { + deck.showWidget(0); + } + +} Copied: trunk/src/main/java/cc/kune/core/client/sn/UserSNPresenter.java (from rev 1267, trunk/src/main/java/cc/kune/core/client/sn/BuddiesAndParticipationPresenter.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/UserSNPresenter.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/UserSNPresenter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,194 @@ +package cc.kune.core.client.sn; + +import java.util.List; + +import cc.kune.common.client.actions.ui.IsActionExtensible; +import cc.kune.common.client.actions.ui.descrip.GuiActionDescCollection; +import cc.kune.core.client.services.FileDownloadUtils; +import cc.kune.core.client.sn.UserSNPresenter.UserSNProxy; +import cc.kune.core.client.sn.UserSNPresenter.UserSNView; +import cc.kune.core.client.sn.actions.registry.UserSNBottomActionsRegistry; +import cc.kune.core.client.sn.actions.registry.UserSNMenuItemsRegistry; +import cc.kune.core.client.state.Session; +import cc.kune.core.client.state.SocialNetworkChangedEvent; +import cc.kune.core.client.state.StateChangedEvent; +import cc.kune.core.client.state.StateManager; +import cc.kune.core.client.state.UserSignInEvent; +import cc.kune.core.client.state.UserSignInEvent.UserSignInHandler; +import cc.kune.core.client.state.UserSignOutEvent; +import cc.kune.core.client.state.UserSignOutEvent.UserSignOutHandler; +import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.ParticipationDataDTO; +import cc.kune.core.shared.dto.StateAbstractDTO; +import cc.kune.core.shared.dto.UserBuddiesDataDTO; +import cc.kune.core.shared.dto.UserSimpleDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.gwt.event.shared.EventBus; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.gwtplatform.mvp.client.View; +import com.gwtplatform.mvp.client.annotations.ProxyCodeSplit; +import com.gwtplatform.mvp.client.proxy.Proxy; +import com.gwtplatform.mvp.client.proxy.RevealRootContentEvent; + +public class UserSNPresenter extends AbstractSNPresenter<UserSNView, UserSNProxy> { + + @ProxyCodeSplit + public interface UserSNProxy extends Proxy<UserSNPresenter> { + } + + public interface UserSNView extends View { + + void addBuddie(UserSimpleDTO user, String avatarUrl, String tooltip, String tooltipTitle, + GuiActionDescCollection menu); + + void addParticipation(GroupDTO group, String avatarUrl, String tooltip, String tooltipTitle, + GuiActionDescCollection menu); + + void addTextToBuddieList(String text); + + void clear(); + + IsActionExtensible getBottomToolbar(); + + void setBuddiesCount(int count); + + void setBuddiesVisible(boolean visible); + + void setParticipationCount(int count); + + void setParticipationVisible(boolean visible); + + void setVisible(boolean visible); + + void showBuddies(); + + void showBuddiesNotPublic(); + } + + private final UserSNBottomActionsRegistry actionsRegistry; + private final I18nTranslationService i18n; + private final UserSNMenuItemsRegistry userMenuItemsRegistry; + + @Inject + public UserSNPresenter(final EventBus eventBus, final UserSNView view, final UserSNProxy proxy, + final I18nTranslationService i18n, final StateManager stateManager, final Session session, + final Provider<FileDownloadUtils> downloadProvider, final UserSNMenuItemsRegistry userMenuItemsRegistry, + final UserSNBottomActionsRegistry actionsRegistry) { + super(eventBus, view, proxy, downloadProvider); + this.i18n = i18n; + this.userMenuItemsRegistry = userMenuItemsRegistry; + this.actionsRegistry = actionsRegistry; + stateManager.onStateChanged(true, new StateChangedEvent.StateChangedHandler() { + @Override + public void onStateChanged(final StateChangedEvent event) { + UserSNPresenter.this.onStateChanged(event.getState()); + } + }); + session.onUserSignIn(true, new UserSignInHandler() { + @Override + public void onUserSignIn(final UserSignInEvent event) { + refreshOnSignInSignOut(session); + } + }); + session.onUserSignOut(true, new UserSignOutHandler() { + @Override + public void onUserSignOut(final UserSignOutEvent event) { + refreshOnSignInSignOut(session); + } + }); + stateManager.onSocialNetworkChanged(true, new SocialNetworkChangedEvent.SocialNetworkChangedHandler() { + @Override + public void onSocialNetworkChanged(final SocialNetworkChangedEvent event) { + UserSNPresenter.this.onStateChanged(event.getState()); + } + }); + createActions(); + } + + private void createActions() { + getView().getBottomToolbar().addActions(actionsRegistry); + } + + @Override + public UserSNView getView() { + return (UserSNView) super.getView(); + } + + private void onStateChanged(final StateAbstractDTO state) { + if (state.getGroup().isNotPersonal()) { + getView().setVisible(false); + } else { + getView().clear(); + if (state.getSocialNetworkData().isBuddiesVisible()) { + setBuddiesState(state); + setParticipationState(state); + } else { + getView().showBuddiesNotPublic(); + } + getView().setVisible(true); + } + } + + private void refreshOnSignInSignOut(final Session session) { + final StateAbstractDTO currentState = session.getCurrentState(); + if (currentState != null) { + UserSNPresenter.this.onStateChanged(currentState); + } + } + + @Override + protected void revealInParent() { + RevealRootContentEvent.fire(this, this); + } + + private void setBuddiesState(final StateAbstractDTO state) { + final UserBuddiesDataDTO userBuddiesData = state.getUserBuddies(); + final List<UserSimpleDTO> buddies = userBuddiesData.getBuddies(); + for (final UserSimpleDTO user : buddies) { + final String avatarUrl = user.hasLogo() ? downloadProvider.get().getLogoImageUrl(user.getStateToken()) + : PERSON_NO_AVATAR_IMAGE; + getView().addBuddie(user, avatarUrl, user.getName(), "", + createMenuItems(user, userMenuItemsRegistry, user.getName())); + } + getView().setBuddiesVisible(buddies.size() > 0); + final boolean hasLocalBuddies = buddies.size() > 0; + final int numExtBuddies = userBuddiesData.getOtherExtBuddies(); + if (numExtBuddies > 0) { + if (hasLocalBuddies) { + // i18n: plural + getView().addTextToBuddieList( + i18n.t(numExtBuddies == 1 ? "and [%d] external user" : "and [%d] external users", numExtBuddies)); + } else { + getView().addTextToBuddieList( + i18n.t(numExtBuddies == 1 ? "[%d] external user" : "[%d] external users", numExtBuddies)); + } + } else { + // if (hasLocalBuddies) { + // view.clearOtherUsers(); + // } else { + // view.setNoBuddies(); + // } + } + } + + private void setParticipationState(final StateAbstractDTO state) { + final ParticipationDataDTO participation = state.getParticipation(); + final List<GroupDTO> groupsIsAdmin = participation.getGroupsIsAdmin(); + final List<GroupDTO> groupsIsCollab = participation.getGroupsIsCollab(); + final int numAdmins = groupsIsAdmin.size(); + final int numCollaborators = groupsIsCollab.size(); + for (final GroupDTO group : groupsIsAdmin) { + getView().addParticipation(group, getAvatar(group), group.getLongName(), "", + createMenuItems(group, userMenuItemsRegistry, group.getLongName())); + } + for (final GroupDTO group : groupsIsCollab) { + getView().addParticipation(group, getAvatar(group), group.getLongName(), "", + createMenuItems(group, userMenuItemsRegistry, group.getLongName())); + } + final int totalGroups = numAdmins + numCollaborators; + // getView().setParticipationCount(totalGroups); + getView().setParticipationVisible(totalGroups > 0); + } +} \ No newline at end of file Added: trunk/src/main/java/cc/kune/core/client/sn/actions/AddNewBuddiesAction.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/AddNewBuddiesAction.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/AddNewBuddiesAction.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,29 @@ +package cc.kune.core.client.sn.actions; + +import cc.kune.common.client.actions.AbstractExtendedAction; +import cc.kune.common.client.actions.Action; +import cc.kune.common.client.actions.ActionEvent; +import cc.kune.common.client.noti.NotifyUser; +import cc.kune.common.client.utils.TextUtils; +import cc.kune.core.client.resources.CoreResources; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.inject.Inject; + +public class AddNewBuddiesAction extends AbstractExtendedAction { + + private final I18nTranslationService i18n; + + @Inject + public AddNewBuddiesAction(final I18nTranslationService i18n, final CoreResources res) { + this.i18n = i18n; + putValue(Action.NAME, i18n.t("Add a new buddy")); + putValue(Action.SMALL_ICON, res.addGreen()); + } + + @Override + public void actionPerformed(final ActionEvent event) { + NotifyUser.info(i18n.t(TextUtils.IN_DEVELOPMENT)); + } + +} Deleted: trunk/src/main/java/cc/kune/core/client/sn/actions/GroupMembersConfActions.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/GroupMembersConfActions.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/GroupMembersConfActions.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,95 +0,0 @@ -package cc.kune.core.client.sn.actions; - -import cc.kune.common.client.actions.ui.descrip.ButtonDescriptor; -import cc.kune.common.client.actions.ui.descrip.MenuDescriptor; -import cc.kune.common.client.actions.ui.descrip.MenuRadioItemDescriptor; -import cc.kune.common.client.actions.ui.descrip.SubMenuDescriptor; -import cc.kune.core.client.resources.CoreResources; -import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; -import cc.kune.core.client.sn.actions.registry.GroupMembersActionsRegistry; -import cc.kune.core.client.state.StateChangedEvent; -import cc.kune.core.client.state.StateChangedEvent.StateChangedHandler; -import cc.kune.core.client.state.StateManager; -import cc.kune.core.shared.domain.AdmissionType; -import cc.kune.core.shared.domain.SocialNetworkVisibility; -import cc.kune.core.shared.dto.GroupDTO; -import cc.kune.core.shared.dto.StateAbstractDTO; -import cc.kune.core.shared.i18n.I18nTranslationService; - -import com.google.inject.Inject; -import com.google.inject.Provider; - -public class GroupMembersConfActions { - - public static final SubMenuDescriptor MODERATION_SUBMENU = new SubMenuDescriptor(); - public static final MenuDescriptor OPTIONS_MENU = new MenuDescriptor(); - public static final SubMenuDescriptor VISIBILITY_SUBMENU = new SubMenuDescriptor(); - - @Inject - public GroupMembersConfActions(final StateManager stateManager, final I18nTranslationService i18n, - final GroupMembersActionsRegistry registry, final Provider<MembersVisibilityMenuItem> membersVisibility, - final Provider<MembersModerationMenuItem> membersModeration, final CoreResources res, - final JoinGroupAction joinGroupAction, final IsGroupCondition isGroupCondition, - final UnJoinGroupAction unJoinGroupAction) { - OPTIONS_MENU.withText(i18n.t("Options")).withIcon(res.arrowDownSitebar()).withStyles("k-sn-options-menu"); - final MenuRadioItemDescriptor anyoneItem = membersVisibility.get().withVisibility( - SocialNetworkVisibility.anyone); - final MenuRadioItemDescriptor onlyMembersItem = membersVisibility.get().withVisibility( - SocialNetworkVisibility.onlymembers); - final MenuRadioItemDescriptor onlyAdminsItem = membersVisibility.get().withVisibility( - SocialNetworkVisibility.onlyadmins); - final MenuRadioItemDescriptor closedItem = membersModeration.get().withModeration(AdmissionType.Closed); - final MenuRadioItemDescriptor moderatedItem = membersModeration.get().withModeration(AdmissionType.Moderated); - final MenuRadioItemDescriptor openItem = membersModeration.get().withModeration(AdmissionType.Open); - registry.add(OPTIONS_MENU); - registry.add(VISIBILITY_SUBMENU.withText(i18n.t("Those who can view this member list")).withParent(OPTIONS_MENU)); - registry.add(MODERATION_SUBMENU.withText(i18n.t("New members policy")).withParent(OPTIONS_MENU)); - registry.add(anyoneItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("anyone"))); - registry.add(onlyMembersItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only members"))); - registry.add(onlyAdminsItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only admins"))); - registry.add(moderatedItem.withParent(MODERATION_SUBMENU).withText(i18n.t("moderate request to join"))); - registry.add(openItem.withParent(MODERATION_SUBMENU).withText(i18n.t("auto accept request to join"))); - // registry.add(closedItem.withParent(MODERATION_SUBMENU).withText( - // i18n.t("closed for new members"))); - - final ButtonDescriptor joinBtn = new ButtonDescriptor(joinGroupAction); - final ButtonDescriptor unJoinBtn = new ButtonDescriptor(unJoinGroupAction); - registry.add(joinBtn.withStyles("k-no-backimage")); - registry.add(unJoinBtn.withStyles("k-no-backimage")); - - stateManager.onStateChanged(true, new StateChangedHandler() { - @Override - public void onStateChanged(final StateChangedEvent event) { - final boolean administrable = event.getState().getGroupRights().isAdministrable(); - OPTIONS_MENU.setVisible(administrable); - OPTIONS_MENU.setEnabled(administrable); - final StateAbstractDTO state = event.getState(); - final GroupDTO currentGroup = state.getGroup(); - if (currentGroup.isNotPersonal()) { - switch (state.getSocialNetworkData().getSocialNetworkVisibility()) { - case anyone: - anyoneItem.setChecked(true); - break; - case onlyadmins: - onlyAdminsItem.setChecked(true); - break; - case onlymembers: - onlyMembersItem.setChecked(true); - break; - } - } - switch (currentGroup.getAdmissionType()) { - case Moderated: - moderatedItem.setChecked(true); - break; - case Open: - openItem.setChecked(true); - break; - case Closed: - closedItem.setChecked(true); - break; - } - } - }); - } -} Added: trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityAction.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityAction.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityAction.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,50 @@ +package cc.kune.core.client.sn.actions; + +import cc.kune.common.client.actions.AbstractExtendedAction; +import cc.kune.common.client.actions.ActionEvent; +import cc.kune.common.client.noti.NotifyUser; +import cc.kune.core.client.rpcservices.AsyncCallbackSimple; +import cc.kune.core.client.rpcservices.UserServiceAsync; +import cc.kune.core.client.state.Session; +import cc.kune.core.client.state.StateManager; +import cc.kune.core.shared.domain.UserBuddiesVisibility; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class UserSNVisibilityAction extends AbstractExtendedAction { + private final I18nTranslationService i18n; + private final Session session; + private final StateManager stateManager; + private final Provider<UserServiceAsync> userServiceAsync; + private UserBuddiesVisibility visibility; + + @Inject + public UserSNVisibilityAction(final Session session, final StateManager stateManager, + final I18nTranslationService i18n, final Provider<UserServiceAsync> userServiceProvider) { + this.session = session; + this.stateManager = stateManager; + this.i18n = i18n; + this.userServiceAsync = userServiceProvider; + } + + @Override + public void actionPerformed(final ActionEvent event) { + userServiceAsync.get().setBuddiesVisibility(session.getUserHash(), + session.getCurrentState().getGroup().getStateToken(), visibility, new AsyncCallbackSimple<Void>() { + @Override + public void onSuccess(final Void result) { + NotifyUser.info(i18n.t("Visibility of your network changed to " + visibility.toString())); + // NotifyUser.info(i18n.t("Visibility of your network changed")); + stateManager.reload(); + } + }); + + } + + public void setVisibility(final UserBuddiesVisibility visibility) { + this.visibility = visibility; + } + +} Added: trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityMenuItem.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityMenuItem.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/UserSNVisibilityMenuItem.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,23 @@ +package cc.kune.core.client.sn.actions; + +import cc.kune.common.client.actions.ui.descrip.MenuDescriptor; +import cc.kune.common.client.actions.ui.descrip.MenuRadioItemDescriptor; +import cc.kune.core.shared.domain.UserBuddiesVisibility; + +import com.google.inject.Inject; + +public class UserSNVisibilityMenuItem extends MenuRadioItemDescriptor { + + private static final String USER_BUDDIES_VISIBILITY_GROUP = "k-sn-userbuddies-vis"; + + @Inject + public UserSNVisibilityMenuItem(final MenuDescriptor parent, final UserSNVisibilityAction action) { + super(parent, action, USER_BUDDIES_VISIBILITY_GROUP); + } + + public MenuRadioItemDescriptor withVisibility(final UserBuddiesVisibility visibility) { + ((UserSNVisibilityAction) getAction()).setVisibility(visibility); + return this; + } + +} \ No newline at end of file Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsGroupCondition.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsGroupCondition.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsGroupCondition.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -3,6 +3,7 @@ import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip; import cc.kune.common.client.actions.ui.descrip.GuiAddCondition; import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.UserSimpleDTO; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -16,6 +17,10 @@ @Override public boolean mustBeAdded(final GuiActionDescrip descr) { - return (!((GroupDTO) descr.getTarget()).isPersonal()); + final Object target = descr.getTarget(); + if (target instanceof UserSimpleDTO) { + return false; + } + return (!((GroupDTO) target).isPersonal()); } } Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsNotMeCondition.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -4,6 +4,7 @@ import cc.kune.common.client.actions.ui.descrip.GuiAddCondition; import cc.kune.core.client.state.Session; import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.UserSimpleDTO; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -18,9 +19,20 @@ this.session = session; } + private boolean isNotThisGroup(final GuiActionDescrip descr) { + return descr.getTarget() instanceof GroupDTO + && !session.getCurrentUser().getShortName().equals(((GroupDTO) descr.getTarget()).getShortName()); + } + + private boolean isNotThisPerson(final GuiActionDescrip descr) { + return (!session.getCurrentUser().getShortName().equals(((UserSimpleDTO) descr.getTarget()).getShortName())); + } + @Override public boolean mustBeAdded(final GuiActionDescrip descr) { - return (session.isNotLogged() || (session.isLogged() && !session.getCurrentUser().getShortName().equals( - ((GroupDTO) descr.getTarget()).getShortName()))); + if (descr.getTarget() instanceof UserSimpleDTO) { + return isNotThisPerson(descr); + } + return (session.isNotLogged() || (session.isLogged() && isNotThisGroup(descr))); } } Modified: trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsPersonCondition.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsPersonCondition.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/conditions/IsPersonCondition.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -3,6 +3,7 @@ import cc.kune.common.client.actions.ui.descrip.GuiActionDescrip; import cc.kune.common.client.actions.ui.descrip.GuiAddCondition; import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.UserSimpleDTO; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -16,6 +17,11 @@ @Override public boolean mustBeAdded(final GuiActionDescrip descr) { - return (((GroupDTO) descr.getTarget()).isPersonal()); + + final Object target = descr.getTarget(); + if (target instanceof UserSimpleDTO) { + return true; + } + return (((GroupDTO) target).isPersonal()); } } Deleted: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersActionsRegistry.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersActionsRegistry.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersActionsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,6 +0,0 @@ -package cc.kune.core.client.sn.actions.registry; - - -public class GroupMembersActionsRegistry extends AbstractSNActionsRegistry { - -} Copied: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersConfActions.java (from rev 1267, trunk/src/main/java/cc/kune/core/client/sn/actions/GroupMembersConfActions.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersConfActions.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersConfActions.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,98 @@ +package cc.kune.core.client.sn.actions.registry; + +import cc.kune.common.client.actions.ui.descrip.ButtonDescriptor; +import cc.kune.common.client.actions.ui.descrip.MenuDescriptor; +import cc.kune.common.client.actions.ui.descrip.MenuRadioItemDescriptor; +import cc.kune.common.client.actions.ui.descrip.SubMenuDescriptor; +import cc.kune.core.client.resources.CoreResources; +import cc.kune.core.client.sn.actions.JoinGroupAction; +import cc.kune.core.client.sn.actions.MembersModerationMenuItem; +import cc.kune.core.client.sn.actions.MembersVisibilityMenuItem; +import cc.kune.core.client.sn.actions.UnJoinGroupAction; +import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; +import cc.kune.core.client.state.StateChangedEvent; +import cc.kune.core.client.state.StateChangedEvent.StateChangedHandler; +import cc.kune.core.client.state.StateManager; +import cc.kune.core.shared.domain.AdmissionType; +import cc.kune.core.shared.domain.SocialNetworkVisibility; +import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.StateAbstractDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class GroupMembersConfActions { + + public static final SubMenuDescriptor MODERATION_SUBMENU = new SubMenuDescriptor(); + public static final MenuDescriptor OPTIONS_MENU = new MenuDescriptor(); + public static final SubMenuDescriptor VISIBILITY_SUBMENU = new SubMenuDescriptor(); + + @Inject + public GroupMembersConfActions(final StateManager stateManager, final I18nTranslationService i18n, + final GroupSNBottomActionsRegistry registry, final Provider<MembersVisibilityMenuItem> membersVisibility, + final Provider<MembersModerationMenuItem> membersModeration, final CoreResources res, + final JoinGroupAction joinGroupAction, final IsGroupCondition isGroupCondition, + final UnJoinGroupAction unJoinGroupAction) { + OPTIONS_MENU.withToolTip(i18n.t("Options")).withIcon(res.arrowDownSitebar()).withStyles("k-sn-options-menu"); + final MenuRadioItemDescriptor anyoneItem = membersVisibility.get().withVisibility( + SocialNetworkVisibility.anyone); + final MenuRadioItemDescriptor onlyMembersItem = membersVisibility.get().withVisibility( + SocialNetworkVisibility.onlymembers); + final MenuRadioItemDescriptor onlyAdminsItem = membersVisibility.get().withVisibility( + SocialNetworkVisibility.onlyadmins); + final MenuRadioItemDescriptor closedItem = membersModeration.get().withModeration(AdmissionType.Closed); + final MenuRadioItemDescriptor moderatedItem = membersModeration.get().withModeration(AdmissionType.Moderated); + final MenuRadioItemDescriptor openItem = membersModeration.get().withModeration(AdmissionType.Open); + registry.add(OPTIONS_MENU); + registry.add(VISIBILITY_SUBMENU.withText(i18n.t("Those who can view this member list")).withParent(OPTIONS_MENU)); + registry.add(MODERATION_SUBMENU.withText(i18n.t("New members policy")).withParent(OPTIONS_MENU)); + registry.add(anyoneItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("anyone"))); + registry.add(onlyMembersItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only members"))); + registry.add(onlyAdminsItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only admins"))); + registry.add(moderatedItem.withParent(MODERATION_SUBMENU).withText(i18n.t("moderate request to join"))); + registry.add(openItem.withParent(MODERATION_SUBMENU).withText(i18n.t("auto accept request to join"))); + // registry.add(closedItem.withParent(MODERATION_SUBMENU).withText( + // i18n.t("closed for new members"))); + + final ButtonDescriptor joinBtn = new ButtonDescriptor(joinGroupAction); + final ButtonDescriptor unJoinBtn = new ButtonDescriptor(unJoinGroupAction); + registry.add(joinBtn.withStyles("k-no-backimage")); + registry.add(unJoinBtn.withStyles("k-no-backimage")); + + stateManager.onStateChanged(true, new StateChangedHandler() { + @Override + public void onStateChanged(final StateChangedEvent event) { + final boolean administrable = event.getState().getGroupRights().isAdministrable(); + OPTIONS_MENU.setVisible(administrable); + OPTIONS_MENU.setEnabled(administrable); + final StateAbstractDTO state = event.getState(); + final GroupDTO currentGroup = state.getGroup(); + if (currentGroup.isNotPersonal()) { + switch (state.getSocialNetworkData().getSocialNetworkVisibility()) { + case anyone: + anyoneItem.setChecked(true); + break; + case onlyadmins: + onlyAdminsItem.setChecked(true); + break; + case onlymembers: + onlyMembersItem.setChecked(true); + break; + } + } + switch (currentGroup.getAdmissionType()) { + case Moderated: + moderatedItem.setChecked(true); + break; + case Open: + openItem.setChecked(true); + break; + case Closed: + closedItem.setChecked(true); + break; + } + } + }); + } +} Copied: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNAdminsMenuItemsRegistry.java (from rev 1267, trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNAdminsMenuItemsRegistry.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNAdminsMenuItemsRegistry.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNAdminsMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,81 @@ +package cc.kune.core.client.sn.actions.registry; + +import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; +import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; +import cc.kune.core.client.sn.actions.ChangeToAdminAction; +import cc.kune.core.client.sn.actions.ChangeToCollabAction; +import cc.kune.core.client.sn.actions.DenyJoinGroupAction; +import cc.kune.core.client.sn.actions.GotoGroupAction; +import cc.kune.core.client.sn.actions.GotoMemberAction; +import cc.kune.core.client.sn.actions.GotoYourHomePageAction; +import cc.kune.core.client.sn.actions.RemoveMemberAction; +import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; +import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; +import cc.kune.core.client.sn.actions.conditions.IsLoggedCondition; +import cc.kune.core.client.sn.actions.conditions.IsMeCondition; +import cc.kune.core.client.sn.actions.conditions.IsNotMeCondition; +import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; +import cc.kune.core.client.state.Session; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class GroupSNAdminsMenuItemsRegistry extends AbstractSNMembersActionsRegistry { + + @Inject + public GroupSNAdminsMenuItemsRegistry(final Session session, final IsLoggedCondition isLogged, + final IsAdministrableCondition isAdministrableCondition, final IsPersonCondition isPersonCondition, + final IsGroupCondition isGroupCondition, final IsMeCondition isMe, final IsNotMeCondition isNotMe, + final ChangeToCollabAction changeToCollabAction, final ChangeToAdminAction changeToAdminAction, + final RemoveMemberAction removeMemberAction, final AcceptJoinGroupAction acceptJoinGroupAction, + final DenyJoinGroupAction denyJoinGroupAction, final GotoGroupAction gotoGroupAction, + final GotoMemberAction gotoMemberAction, final GotoYourHomePageAction gotoYourHomePageAction) { + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(changeToCollabAction); + item.add(isAdministrableCondition); + item.add(isNotMe); + item.add(isLogged); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(removeMemberAction); + item.add(isAdministrableCondition); + item.add(isNotMe); + item.add(isLogged); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoMemberAction); + item.add(isPersonCondition); + item.add(isNotMe); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoYourHomePageAction); + item.add(isPersonCondition); + item.add(isMe); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); + item.add(isGroupCondition); + return item; + } + }); + } + +} Property changes on: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNAdminsMenuItemsRegistry.java ___________________________________________________________________ Name: svn:mime-type + text/plain Copied: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNBottomActionsRegistry.java (from rev 1262, trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupMembersActionsRegistry.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNBottomActionsRegistry.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNBottomActionsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,6 @@ +package cc.kune.core.client.sn.actions.registry; + + +public class GroupSNBottomActionsRegistry extends AbstractSNActionsRegistry { + +} Property changes on: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNBottomActionsRegistry.java ___________________________________________________________________ Name: svn:mime-type + text/plain Copied: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNCollabsMenuItemsRegistry.java (from rev 1268, trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNCollabsMenuItemsRegistry.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNCollabsMenuItemsRegistry.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNCollabsMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,77 @@ +package cc.kune.core.client.sn.actions.registry; + +import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; +import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; +import cc.kune.core.client.sn.actions.ChangeToAdminAction; +import cc.kune.core.client.sn.actions.ChangeToCollabAction; +import cc.kune.core.client.sn.actions.DenyJoinGroupAction; +import cc.kune.core.client.sn.actions.GotoGroupAction; +import cc.kune.core.client.sn.actions.GotoMemberAction; +import cc.kune.core.client.sn.actions.GotoYourHomePageAction; +import cc.kune.core.client.sn.actions.RemoveMemberAction; +import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; +import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; +import cc.kune.core.client.sn.actions.conditions.IsMeCondition; +import cc.kune.core.client.sn.actions.conditions.IsNotMeCondition; +import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; +import cc.kune.core.client.state.Session; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class GroupSNCollabsMenuItemsRegistry extends AbstractSNMembersActionsRegistry { + + @Inject + public GroupSNCollabsMenuItemsRegistry(final Session session, final IsAdministrableCondition isAdministrableCondition, + final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition, + final IsMeCondition isMe, final IsNotMeCondition isNotMe, final ChangeToCollabAction changeToCollabAction, + final ChangeToAdminAction changeToAdminAction, final RemoveMemberAction removeMemberAction, + final AcceptJoinGroupAction acceptJoinGroupAction, final DenyJoinGroupAction denyJoinGroupAction, + final GotoGroupAction gotoGroupAction, final GotoMemberAction gotoMemberAction, + final GotoYourHomePageAction gotoYourHomePageAction) { + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(changeToAdminAction); + item.add(isAdministrableCondition); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(removeMemberAction); + item.add(isAdministrableCondition); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoMemberAction); + item.add(isPersonCondition); + item.add(isNotMe); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoYourHomePageAction); + item.add(isPersonCondition); + item.add(isMe); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); + item.add(isGroupCondition); + return item; + } + }); + + } + +} Property changes on: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNCollabsMenuItemsRegistry.java ___________________________________________________________________ Name: svn:mime-type + text/plain Copied: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNPendingsMenuItemsRegistry.java (from rev 1262, trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNPendingsMenuItemsRegistry.java) =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNPendingsMenuItemsRegistry.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNPendingsMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,62 @@ +package cc.kune.core.client.sn.actions.registry; + +import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; +import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; +import cc.kune.core.client.sn.actions.ChangeToAdminAction; +import cc.kune.core.client.sn.actions.ChangeToCollabAction; +import cc.kune.core.client.sn.actions.DenyJoinGroupAction; +import cc.kune.core.client.sn.actions.GotoGroupAction; +import cc.kune.core.client.sn.actions.GotoPersonAction; +import cc.kune.core.client.sn.actions.RemoveMemberAction; +import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; +import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; +import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; +import cc.kune.core.client.state.Session; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class GroupSNPendingsMenuItemsRegistry extends AbstractSNMembersActionsRegistry { + + @Inject + public GroupSNPendingsMenuItemsRegistry(final Session session, final IsAdministrableCondition isAdministrableCondition, + final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition, + final ChangeToCollabAction changeToCollabAction, final ChangeToAdminAction changeToAdminAction, + final RemoveMemberAction removeMemberAction, final AcceptJoinGroupAction acceptJoinGroupAction, + final DenyJoinGroupAction denyJoinGroupAction, final GotoGroupAction gotoGroupAction, + final GotoPersonAction gotoPersonAction) { + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(acceptJoinGroupAction); + item.add(isAdministrableCondition); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(denyJoinGroupAction); + item.add(isAdministrableCondition); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoPersonAction); + item.add(isPersonCondition); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); + item.add(isGroupCondition); + return item; + } + }); + } + +} Property changes on: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/GroupSNPendingsMenuItemsRegistry.java ___________________________________________________________________ Name: svn:mime-type + text/plain Deleted: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNAdminsMenuItemsRegistry.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNAdminsMenuItemsRegistry.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNAdminsMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,81 +0,0 @@ -package cc.kune.core.client.sn.actions.registry; - -import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; -import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; -import cc.kune.core.client.sn.actions.ChangeToAdminAction; -import cc.kune.core.client.sn.actions.ChangeToCollabAction; -import cc.kune.core.client.sn.actions.DenyJoinGroupAction; -import cc.kune.core.client.sn.actions.GotoGroupAction; -import cc.kune.core.client.sn.actions.GotoMemberAction; -import cc.kune.core.client.sn.actions.GotoYourHomePageAction; -import cc.kune.core.client.sn.actions.RemoveMemberAction; -import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; -import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; -import cc.kune.core.client.sn.actions.conditions.IsLoggedCondition; -import cc.kune.core.client.sn.actions.conditions.IsMeCondition; -import cc.kune.core.client.sn.actions.conditions.IsNotMeCondition; -import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; -import cc.kune.core.client.state.Session; - -import com.google.inject.Inject; -import com.google.inject.Provider; - -public class SNAdminsMenuItemsRegistry extends AbstractSNMembersActionsRegistry { - - @Inject - public SNAdminsMenuItemsRegistry(final Session session, final IsLoggedCondition isLogged, - final IsAdministrableCondition isAdministrableCondition, final IsPersonCondition isPersonCondition, - final IsGroupCondition isGroupCondition, final IsMeCondition isMe, final IsNotMeCondition isNotMe, - final ChangeToCollabAction changeToCollabAction, final ChangeToAdminAction changeToAdminAction, - final RemoveMemberAction removeMemberAction, final AcceptJoinGroupAction acceptJoinGroupAction, - final DenyJoinGroupAction denyJoinGroupAction, final GotoGroupAction gotoGroupAction, - final GotoMemberAction gotoMemberAction, final GotoYourHomePageAction gotoYourHomePageAction) { - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(changeToCollabAction); - item.add(isAdministrableCondition); - item.add(isNotMe); - item.add(isLogged); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(removeMemberAction); - item.add(isAdministrableCondition); - item.add(isNotMe); - item.add(isLogged); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoMemberAction); - item.add(isPersonCondition); - item.add(isNotMe); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoYourHomePageAction); - item.add(isPersonCondition); - item.add(isMe); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); - item.add(isGroupCondition); - return item; - } - }); - } - -} Deleted: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNCollabsMenuItemsRegistry.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNCollabsMenuItemsRegistry.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNCollabsMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,77 +0,0 @@ -package cc.kune.core.client.sn.actions.registry; - -import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; -import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; -import cc.kune.core.client.sn.actions.ChangeToAdminAction; -import cc.kune.core.client.sn.actions.ChangeToCollabAction; -import cc.kune.core.client.sn.actions.DenyJoinGroupAction; -import cc.kune.core.client.sn.actions.GotoGroupAction; -import cc.kune.core.client.sn.actions.GotoMemberAction; -import cc.kune.core.client.sn.actions.GotoYourHomePageAction; -import cc.kune.core.client.sn.actions.RemoveMemberAction; -import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; -import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; -import cc.kune.core.client.sn.actions.conditions.IsMeCondition; -import cc.kune.core.client.sn.actions.conditions.IsNotMeCondition; -import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; -import cc.kune.core.client.state.Session; - -import com.google.inject.Inject; -import com.google.inject.Provider; - -public class SNCollabsMenuItemsRegistry extends AbstractSNMembersActionsRegistry { - - @Inject - public SNCollabsMenuItemsRegistry(final Session session, final IsAdministrableCondition isAdministrableCondition, - final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition, - final IsMeCondition isMe, final IsNotMeCondition isNotMe, final ChangeToCollabAction changeToCollabAction, - final ChangeToAdminAction changeToAdminAction, final RemoveMemberAction removeMemberAction, - final AcceptJoinGroupAction acceptJoinGroupAction, final DenyJoinGroupAction denyJoinGroupAction, - final GotoGroupAction gotoGroupAction, final GotoMemberAction gotoMemberAction, - final GotoYourHomePageAction gotoYourHomePageAction) { - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(changeToAdminAction); - item.add(isAdministrableCondition); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(removeMemberAction); - item.add(isAdministrableCondition); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoMemberAction); - item.add(isPersonCondition); - item.add(isNotMe); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoYourHomePageAction); - item.add(isPersonCondition); - item.add(isMe); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); - item.add(isGroupCondition); - return item; - } - }); - - } - -} Deleted: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNPendingsMenuItemsRegistry.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNPendingsMenuItemsRegistry.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/SNPendingsMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,62 +0,0 @@ -package cc.kune.core.client.sn.actions.registry; - -import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; -import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; -import cc.kune.core.client.sn.actions.ChangeToAdminAction; -import cc.kune.core.client.sn.actions.ChangeToCollabAction; -import cc.kune.core.client.sn.actions.DenyJoinGroupAction; -import cc.kune.core.client.sn.actions.GotoGroupAction; -import cc.kune.core.client.sn.actions.GotoPersonAction; -import cc.kune.core.client.sn.actions.RemoveMemberAction; -import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; -import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; -import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; -import cc.kune.core.client.state.Session; - -import com.google.inject.Inject; -import com.google.inject.Provider; - -public class SNPendingsMenuItemsRegistry extends AbstractSNMembersActionsRegistry { - - @Inject - public SNPendingsMenuItemsRegistry(final Session session, final IsAdministrableCondition isAdministrableCondition, - final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition, - final ChangeToCollabAction changeToCollabAction, final ChangeToAdminAction changeToAdminAction, - final RemoveMemberAction removeMemberAction, final AcceptJoinGroupAction acceptJoinGroupAction, - final DenyJoinGroupAction denyJoinGroupAction, final GotoGroupAction gotoGroupAction, - final GotoPersonAction gotoPersonAction) { - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(acceptJoinGroupAction); - item.add(isAdministrableCondition); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(denyJoinGroupAction); - item.add(isAdministrableCondition); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoPersonAction); - item.add(isPersonCondition); - return item; - } - }); - add(new Provider<MenuItemDescriptor>() { - @Override - public MenuItemDescriptor get() { - final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); - item.add(isGroupCondition); - return item; - } - }); - } - -} Added: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNBottomActionsRegistry.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNBottomActionsRegistry.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNBottomActionsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,6 @@ +package cc.kune.core.client.sn.actions.registry; + + +public class UserSNBottomActionsRegistry extends AbstractSNActionsRegistry { + +} Added: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNConfActions.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNConfActions.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNConfActions.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,82 @@ +package cc.kune.core.client.sn.actions.registry; + +import cc.kune.common.client.actions.ui.descrip.ButtonDescriptor; +import cc.kune.common.client.actions.ui.descrip.MenuDescriptor; +import cc.kune.common.client.actions.ui.descrip.MenuRadioItemDescriptor; +import cc.kune.common.client.actions.ui.descrip.SubMenuDescriptor; +import cc.kune.common.client.noti.NotifyUser; +import cc.kune.core.client.resources.CoreResources; +import cc.kune.core.client.sn.actions.AddNewBuddiesAction; +import cc.kune.core.client.sn.actions.UserSNVisibilityMenuItem; +import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; +import cc.kune.core.client.state.Session; +import cc.kune.core.client.state.StateChangedEvent; +import cc.kune.core.client.state.StateChangedEvent.StateChangedHandler; +import cc.kune.core.client.state.StateManager; +import cc.kune.core.shared.domain.UserBuddiesVisibility; +import cc.kune.core.shared.dto.GroupDTO; +import cc.kune.core.shared.dto.StateAbstractDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class UserSNConfActions { + + public static final MenuDescriptor OPTIONS_MENU = new MenuDescriptor(); + public static final SubMenuDescriptor VISIBILITY_SUBMENU = new SubMenuDescriptor(); + + @Inject + public UserSNConfActions(final Session session, final StateManager stateManager, final I18nTranslationService i18n, + final UserSNBottomActionsRegistry registry, final Provider<UserSNVisibilityMenuItem> userBuddiesVisibility, + final CoreResources res, final IsGroupCondition isGroupCondition, + final AddNewBuddiesAction addNewBuddiesAction) { + OPTIONS_MENU.withToolTip(i18n.t("Options")).withIcon(res.arrowDownSitebar()).withStyles("k-sn-options-menu"); + + final MenuRadioItemDescriptor anyoneItem = userBuddiesVisibility.get().withVisibility( + UserBuddiesVisibility.anyone); + final MenuRadioItemDescriptor onlyYourBuddiesItem = userBuddiesVisibility.get().withVisibility( + UserBuddiesVisibility.yourbuddies); + final MenuRadioItemDescriptor onlyYou = userBuddiesVisibility.get().withVisibility( + UserBuddiesVisibility.onlyyou); + assert anyoneItem.getAction() != onlyYourBuddiesItem.getAction(); + assert anyoneItem.getAction() != onlyYou.getAction(); + registry.add(OPTIONS_MENU); + registry.add(VISIBILITY_SUBMENU.withText(i18n.t("Those who can view your network")).withParent(OPTIONS_MENU)); + registry.add(anyoneItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("anyone"))); + registry.add(onlyYourBuddiesItem.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only your buddies"))); + registry.add(onlyYou.withParent(VISIBILITY_SUBMENU).withText(i18n.t("only you"))); + + final ButtonDescriptor addBuddieBtn = new ButtonDescriptor(addNewBuddiesAction); + + registry.add(addBuddieBtn.withStyles("k-no-backimage")); + + stateManager.onStateChanged(true, new StateChangedHandler() { + @Override + public void onStateChanged(final StateChangedEvent event) { + final StateAbstractDTO state = event.getState(); + final boolean administrable = state.getGroupRights().isAdministrable(); + OPTIONS_MENU.setVisible(administrable); + OPTIONS_MENU.setEnabled(administrable); + final GroupDTO currentGroup = state.getGroup(); + if (currentGroup.isPersonal()) { + final UserBuddiesVisibility visibility = state.getSocialNetworkData().getUserBuddiesVisibility(); + switch (visibility) { + case anyone: + anyoneItem.setChecked(true); + break; + case yourbuddies: + onlyYourBuddiesItem.setChecked(true); + break; + case onlyyou: + onlyYou.setChecked(true); + break; + } + NotifyUser.info(i18n.t("Visibility of your network is " + visibility.toString())); + } + addBuddieBtn.setVisible(session.isLogged() && currentGroup.isPersonal() + && session.getCurrentUser().getShortName().equals(currentGroup.getShortName())); + } + }); + } +} Added: trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java (rev 0) +++ trunk/src/main/java/cc/kune/core/client/sn/actions/registry/UserSNMenuItemsRegistry.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,60 @@ +package cc.kune.core.client.sn.actions.registry; + +import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; +import cc.kune.core.client.sn.actions.AcceptJoinGroupAction; +import cc.kune.core.client.sn.actions.ChangeToAdminAction; +import cc.kune.core.client.sn.actions.ChangeToCollabAction; +import cc.kune.core.client.sn.actions.DenyJoinGroupAction; +import cc.kune.core.client.sn.actions.GotoGroupAction; +import cc.kune.core.client.sn.actions.GotoMemberAction; +import cc.kune.core.client.sn.actions.GotoYourHomePageAction; +import cc.kune.core.client.sn.actions.RemoveMemberAction; +import cc.kune.core.client.sn.actions.UnJoinGroupAction; +import cc.kune.core.client.sn.actions.conditions.IsAdministrableCondition; +import cc.kune.core.client.sn.actions.conditions.IsGroupCondition; +import cc.kune.core.client.sn.actions.conditions.IsMeCondition; +import cc.kune.core.client.sn.actions.conditions.IsNotMeCondition; +import cc.kune.core.client.sn.actions.conditions.IsPersonCondition; +import cc.kune.core.client.state.Session; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +@SuppressWarnings("serial") +public class UserSNMenuItemsRegistry extends AbstractSNMembersActionsRegistry { + + @Inject + public UserSNMenuItemsRegistry(final Session session, final IsAdministrableCondition isAdministrableCondition, + final IsPersonCondition isPersonCondition, final IsGroupCondition isGroupCondition, + final IsMeCondition isMe, final IsNotMeCondition isNotMe, final ChangeToCollabAction changeToCollabAction, + final ChangeToAdminAction changeToAdminAction, final RemoveMemberAction removeMemberAction, + final AcceptJoinGroupAction acceptJoinGroupAction, final DenyJoinGroupAction denyJoinGroupAction, + final GotoGroupAction gotoGroupAction, final GotoMemberAction gotoMemberAction, + final UnJoinGroupAction unjoinAction, final GotoYourHomePageAction gotoYourHomePageAction) { + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(unjoinAction); + item.add(isGroupCondition); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoMemberAction); + item.add(isPersonCondition); + item.add(isNotMe); + return item; + } + }); + add(new Provider<MenuItemDescriptor>() { + @Override + public MenuItemDescriptor get() { + final MenuItemDescriptor item = new MenuItemDescriptor(gotoGroupAction); + item.add(isGroupCondition); + return item; + } + }); + } +} Modified: trunk/src/main/java/cc/kune/core/client/state/HistoryWrapperDefault.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/state/HistoryWrapperDefault.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/client/state/HistoryWrapperDefault.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -23,11 +23,14 @@ public class HistoryWrapperDefault implements HistoryWrapper { + @Override public String getToken() { return History.getToken(); } + @Override public void newItem(final String historyToken) { + // NotifyUser.info("New history token: " + historyToken); History.newItem(historyToken); } Modified: trunk/src/main/java/cc/kune/core/public/images/group-def-icon.gif =================================================================== (Binary files differ) Added: trunk/src/main/java/cc/kune/core/public/images/group-def-icon.png =================================================================== (Binary files differ) Property changes on: trunk/src/main/java/cc/kune/core/public/images/group-def-icon.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/src/main/java/cc/kune/core/public/images/unknown.jpg =================================================================== (Binary files differ) Modified: trunk/src/main/java/cc/kune/core/shared/dto/SocialNetworkDataDTO.java =================================================================== --- trunk/src/main/java/cc/kune/core/shared/dto/SocialNetworkDataDTO.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/core/shared/dto/SocialNetworkDataDTO.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -27,14 +27,14 @@ public class SocialNetworkDataDTO implements IsSerializable { - private SocialNetworkVisibility socialNetworkVisibility; private SocialNetworkDTO groupMembers; - private ParticipationDataDTO userParticipation; - private UserBuddiesVisibility userBuddiesVisibility; - private UserBuddiesDataDTO userBuddies; private AccessRights groupRights; private boolean isBuddiesVisible; private boolean isMembersVisible; + private SocialNetworkVisibility socialNetworkVisibility; + private UserBuddiesDataDTO userBuddies; + private UserBuddiesVisibility userBuddiesVisibility; + private ParticipationDataDTO userParticipation; public SocialNetworkDataDTO() { this(null, null, null, null, null, null, false, false); @@ -43,7 +43,7 @@ public SocialNetworkDataDTO(final SocialNetworkVisibility socialNetworkVisibility, final SocialNetworkDTO groupMembers, final ParticipationDataDTO userParticipation, final UserBuddiesVisibility userBuddiesVisibility, final UserBuddiesDataDTO userBuddies, - final AccessRights groupRights, final boolean isBuddiesVisible, final boolean isMembersVisible) { + final AccessRights groupRights, final boolean isBuddiesVisible, final boolean isMembersVisible) { this.socialNetworkVisibility = socialNetworkVisibility; this.groupMembers = groupMembers; this.userParticipation = userParticipation; @@ -58,7 +58,7 @@ return groupMembers; } - public AccessRights getGroupRights() { + public AccessRights getGroupRights() { return groupRights; } @@ -136,6 +136,7 @@ @Override public String toString() { - return "SocialNetworkResultDTO[members: " + groupMembers + "; participation: " + userParticipation + "]"; + return "SocialNetworkResultDTO[members: " + groupMembers + "; participation: " + userParticipation + + "; buddiesvisibility: " + userBuddiesVisibility + "]"; } } Modified: trunk/src/main/java/cc/kune/wave/KuneWave.gwt.xml =================================================================== --- trunk/src/main/java/cc/kune/wave/KuneWave.gwt.xml 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/KuneWave.gwt.xml 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,13 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.1.1//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.1.1/distro-source/core/src/gwt-module.dtd"> <module> - <inherits name="com.google.gwt.user.User" /> <source path="client" /> <public path="public" /> + <inherits name="com.google.common.base.Base" /> <inherits name='com.google.gwt.user.User' /> <inherits name="com.google.gwt.event.EventBase" /> + <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome' /> --> + <inherits name='com.glines.socketio.client.Client' /> <inherits name='com.google.gwt.json.JSON' /> <inherits name='com.google.gwt.websockets.WebSockets' /> @@ -16,29 +18,26 @@ <inherits name='org.waveprotocol.wave.client.editor.Editor' /> <inherits name='org.waveprotocol.wave.client.gadget.Gadget' /> <inherits name='org.waveprotocol.wave.client.util.ClientFlags' /> - <inherits name='org.waveprotocol.wave.model.Model' /> <inherits name="org.waveprotocol.wave.model.account.Account" /> <inherits name='org.waveprotocol.wave.model.conversation.Conversation' /> <inherits name="org.waveprotocol.box.common.Common" /> <inherits name='org.waveprotocol.box.common.comms.WaveClientRpc' /> + <inherits name='org.waveprotocol.box.search.SearchProto' /> <inherits name='org.waveprotocol.box.webclient.common.communication.Communication' /> + <!-- TODO(hearnden): delete webclient.common. It's not common to anything. --> + <inherits name='org.waveprotocol.box.webclient.common.Common' /> + <inherits name='org.waveprotocol.box.webclient.search.Search' /> <inherits name='org.waveprotocol.box.webclient.util.Util' /> - - <inherits name='org.waveprotocol.box.webclient.waveclient.common.Common' /> - + <inherits name='org.waveprotocol.box.webclient.search.Search' /> <inherits name='org.waveprotocol.box.webclient.widget.error.Error' /> - <inherits name="org.waveprotocol.box.webclient.WebClientDev" /> -<!-- Added from errors --> - <inherits name='org.waveprotocol.wave.client.common.safehtml.SafeHtml' /> - <inherits name='org.waveprotocol.wave.client.common.util.Util' /> - <inherits name='org.waveprotocol.wave.client.debug.logger.Logger' /> - <inherits name='org.waveprotocol.wave.client.widget.common.Common' /> - <inherits name='org.waveprotocol.wave.concurrencycontrol.Channel' /> - <inherits name='org.waveprotocol.wave.concurrencycontrol.Common' /> - <inherits name='org.waveprotocol.wave.concurrencycontrol.Wave' /> + <!-- Specify the app entry point class. --> +<!-- <entry-point class='org.waveprotocol.box.webclient.client.WebClient' />--> + <set-configuration-property name="CssResource.obfuscationPrefix" + value="SWC" /> + </module> \ No newline at end of file Modified: trunk/src/main/java/cc/kune/wave/client/WaveClientSimpleAuthenticator.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WaveClientSimpleAuthenticator.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/client/WaveClientSimpleAuthenticator.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -43,6 +43,7 @@ @Override public void onResponseReceived(final Request request, final Response response) { callback.onSuccess(null); + // Only for testing: // final ForIsWidget userSpace = wsArmor.getUserSpace(); // if (userSpace.getWidgetCount() > 0) { // userSpace.remove(0); Modified: trunk/src/main/java/cc/kune/wave/client/WebClient.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WebClient.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/client/WebClient.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,3 +1,4 @@ +// @formatter:off /** * Copyright 2010 Google Inc. * @@ -17,41 +18,42 @@ package cc.kune.wave.client; + + + + + import org.waveprotocol.box.webclient.client.ClientEvents; +import org.waveprotocol.box.webclient.client.ClientIdGenerator; import org.waveprotocol.box.webclient.client.DebugMessagePanel; import org.waveprotocol.box.webclient.client.HistorySupport; import org.waveprotocol.box.webclient.client.RemoteViewServiceMultiplexer; import org.waveprotocol.box.webclient.client.Session; -import org.waveprotocol.box.webclient.client.SimpleCcDocumentFactory; +import org.waveprotocol.box.webclient.client.SimpleWaveStore; import org.waveprotocol.box.webclient.client.StagesProvider; -import org.waveprotocol.box.webclient.client.WaveView; import org.waveprotocol.box.webclient.client.WaveWebSocketClient; import org.waveprotocol.box.webclient.client.events.NetworkStatusEvent; -import org.waveprotocol.box.webclient.client.events.NetworkStatusEvent.ConnectionStatus; import org.waveprotocol.box.webclient.client.events.NetworkStatusEventHandler; import org.waveprotocol.box.webclient.client.events.WaveCreationEvent; import org.waveprotocol.box.webclient.client.events.WaveCreationEventHandler; -import org.waveprotocol.box.webclient.client.events.WaveIndexUpdatedEvent; import org.waveprotocol.box.webclient.client.events.WaveSelectionEvent; import org.waveprotocol.box.webclient.client.events.WaveSelectionEventHandler; -import org.waveprotocol.box.webclient.client.events.WaveUpdatedEvent; +import org.waveprotocol.box.webclient.search.RemoteSearchService; +import org.waveprotocol.box.webclient.search.Search; +import org.waveprotocol.box.webclient.search.SearchPanelRenderer; +import org.waveprotocol.box.webclient.search.SearchPanelWidget; +import org.waveprotocol.box.webclient.search.SearchPresenter; +import org.waveprotocol.box.webclient.search.SimpleSearch; +import org.waveprotocol.box.webclient.search.WaveStore; import org.waveprotocol.box.webclient.util.Log; -import org.waveprotocol.box.webclient.waveclient.common.ClientIdGenerator; -import org.waveprotocol.box.webclient.waveclient.common.WaveViewServiceImpl; -import org.waveprotocol.box.webclient.waveclient.common.WebClientBackend; -import org.waveprotocol.box.webclient.waveclient.common.WebClientUtils; import org.waveprotocol.box.webclient.widget.error.ErrorIndicatorPresenter; +import org.waveprotocol.wave.client.account.ProfileManager; +import org.waveprotocol.wave.client.account.impl.ProfileManagerImpl; import org.waveprotocol.wave.client.common.safehtml.SafeHtml; import org.waveprotocol.wave.client.common.safehtml.SafeHtmlBuilder; import org.waveprotocol.wave.client.common.util.AsyncHolder.Accessor; import org.waveprotocol.wave.client.debug.logger.LogLevel; -import org.waveprotocol.wave.client.util.ClientFlags; import org.waveprotocol.wave.client.widget.common.ImplPanel; -import org.waveprotocol.wave.concurrencycontrol.channel.WaveViewService; -import org.waveprotocol.wave.concurrencycontrol.common.ChannelException; -import org.waveprotocol.wave.concurrencycontrol.wave.CcBasedWavelet; -import org.waveprotocol.wave.model.conversation.ObservableConversation; -import org.waveprotocol.wave.model.id.IdFilters; import org.waveprotocol.wave.model.id.IdGenerator; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.wave.ParticipantId; @@ -76,348 +78,300 @@ * Entry point classes define <code>onModuleLoad()</code>. */ public class WebClient extends Composite { - interface Binder extends UiBinder<DockLayoutPanel, WebClient> { - } + interface Binder extends UiBinder<DockLayoutPanel, WebClient> { + } - /** - * An exception handler that reports exceptions using a - * <em>shiny banner</em> (an alert placed on the top of the screen). Once - * the stack trace is prepared, it is revealed in the banner via a link. - */ - static class ErrorHandler implements UncaughtExceptionHandler { - public static void install() { - GWT.setUncaughtExceptionHandler(new ErrorHandler(GWT.getUncaughtExceptionHandler())); - } + interface Style extends CssResource { + String subPanel(); + String waveView(); + } - private static String maybe(final int value, final String otherwise) { - return value != -1 ? String.valueOf(value) : otherwise; - } + private static final Binder BINDER = GWT.create(Binder.class); - private static String maybe(final String value, final String otherwise) { - return value != null ? value : otherwise; - } + static Log LOG = Log.get(WebClient.class); - /** - * Indicates whether an error has already been reported (at most one - * error is ever reported by this handler). - */ - private boolean hasFired; + private final ProfileManager profiles = new ProfileManagerImpl(); - /** Next handler in the handler chain. */ - private final UncaughtExceptionHandler next; + @UiField + SplitLayoutPanel splitPanel; - private ErrorHandler(final UncaughtExceptionHandler next) { - this.next = next; - } + @UiField + Style style; - private void getStackTraceAsync(final Throwable t, final Accessor<SafeHtml> whenReady) { - // TODO: Request stack-trace de-obfuscation. For now, just use the - // javascript stack trace. - // - // Use minimal services here, in order to avoid the chance that - // reporting - // the error produces more errors. In particular, do not use - // Scheduler. - // Also, this code could potentially be put behind a runAsync - // boundary, to - // save whatever dependencies it uses from the initial download. - DeferredCommand.addCommand(new Command() { - @Override - public void execute() { - final SafeHtmlBuilder stack = new SafeHtmlBuilder(); + @UiField + ImplPanel contentPanel; - Throwable error = t; - while (error != null) { - stack.appendEscaped(String.valueOf(error.getMessage())).appendHtmlConstant("<br>"); - for (final StackTraceElement elt : error.getStackTrace()) { - stack.appendHtmlConstant(" ").appendEscaped(maybe(elt.getClassName(), "??")).appendHtmlConstant( - ".") // - .appendEscaped(maybe(elt.getMethodName(), "??")).appendHtmlConstant(" (") // - .appendEscaped(maybe(elt.getFileName(), "??")).appendHtmlConstant(":") // - .appendEscaped(maybe(elt.getLineNumber(), "??")).appendHtmlConstant(")") // - .appendHtmlConstant("<br>"); - } - error = error.getCause(); - if (error != null) { - stack.appendHtmlConstant("Caused by: "); - } - } + @UiField(provided = true) + SearchPanelWidget searchPanel = new SearchPanelWidget(new SearchPanelRenderer(profiles)); - whenReady.use(stack.toSafeHtml()); - } - }); - } + @UiField + DebugMessagePanel logPanel; - @Override - public void onUncaughtException(final Throwable e) { - if (!hasFired) { - hasFired = true; - final ErrorIndicatorPresenter error = ErrorIndicatorPresenter.create(RootPanel.get("banner")); - getStackTraceAsync(e, new Accessor<SafeHtml>() { - @Override - public void use(final SafeHtml stack) { - error.addDetail(stack, null); - } - }); - } + /** The wave panel, if a wave is open. */ + private StagesProvider wave; - if (next != null) { - next.onUncaughtException(e); - } - } - } + private final WaveStore waveStore = new SimpleWaveStore(); - interface Style extends CssResource { - String subPanel(); + /** + * Create a remote websocket to talk to the server-side FedOne service. + */ + private WaveWebSocketClient websocket; - String waveView(); - } + private ParticipantId loggedInUser; - private static final Binder BINDER = GWT.create(Binder.class); + private IdGenerator idGenerator; - static Log LOG = Log.get(WebClient.class); // NOPMD by vjrj on 18/01/11 - // 15:52 + private RemoteViewServiceMultiplexer channel; - private WebClientBackend backend = null; + /** + * This is the entry point method. + */ + public WebClient() { - private RemoteViewServiceMultiplexer channel; + ErrorHandler.install(); - @UiField - ImplPanel contentPanel; + ClientEvents.get().addWaveCreationEventHandler( + new WaveCreationEventHandler() { - private IdGenerator idGenerator; + @Override + public void onCreateRequest(WaveCreationEvent event) { + LOG.info("WaveCreationEvent received"); + if (channel == null) { + throw new RuntimeException("Spaghetti attack. Create occured before login"); + } - private ParticipantId loggedInUser; + openWave(WaveRef.of(idGenerator.newWaveId()), true); + } + }); - @UiField - DebugMessagePanel logPanel; + setupConnectionIndicator(); - @UiField - SplitLayoutPanel splitPanel; + HistorySupport.init(); - @UiField - Style style; + websocket = new WaveWebSocketClient(useSocketIO(), getWebSocketBaseUrl(GWT.getModuleBaseURL())); + websocket.connect(); - /** The wave panel, if a wave is open. */ - private StagesProvider wave; + if (Session.get().isLoggedIn()) { + loggedInUser = new ParticipantId(Session.get().getAddress()); + idGenerator = ClientIdGenerator.create(); + loginToServer(); + } - /** The old wave panel */ - private WaveView waveView = null; + setupUi(); - /** - * Create a remote websocket to talk to the server-side FedOne service. - */ - private final WaveWebSocketClient websocket; + History.fireCurrentHistoryState(); + LOG.info("SimpleWebClient.onModuleLoad() done"); + } - public WebClient() { + private void setupUi() { + // Set up UI + DockLayoutPanel self = BINDER.createAndBindUi(this); + // kune-patch + // RootPanel.get("app").add(self); + initWidget(self); + // DockLayoutPanel forcibly conflicts with sensible layout control, and + // sticks inline styles on elements without permission. They must be + // cleared. + self.getElement().getStyle().clearPosition(); + splitPanel.setWidgetMinSize(searchPanel, 300); + splitPanel.setWidgetMinSize(contentPanel, 450); - ErrorHandler.install(); + if (LogLevel.showDebug()) { + logPanel.enable(); + } else { + logPanel.removeFromParent(); + } - // Set up UI - final DockLayoutPanel self = BINDER.createAndBindUi(this); - initWidget(self); - // RootPanel.get("app").add(self); - // DockLayoutPanel forcibly conflicts with sensible layout control, and - // sticks inline styles on elements without permission. They must be - // cleared. - self.getElement().getStyle().clearPosition(); + setupSearchPanel(); + setupWavePanel(); + } - if (LogLevel.showDebug()) { - logPanel.enable(); - } else { - logPanel.removeFromParent(); - } + private void setupSearchPanel() { + // On wave selection, fire an event. + SearchPresenter.WaveSelectionHandler selectHandler = + new SearchPresenter.WaveSelectionHandler() { + @Override + public void onWaveSelected(WaveId id) { + ClientEvents.get().fireEvent(new WaveSelectionEvent(WaveRef.of(id))); + } + }; + Search search = SimpleSearch.create(RemoteSearchService.create(), waveStore); + SearchPresenter searchUi = SearchPresenter.create(search, searchPanel, selectHandler); + } - if (ClientFlags.get().enableWavePanelHarness()) { - // For handling the opening of wave using the new wave panel - ClientEvents.get().addWaveSelectionEventHandler(new WaveSelectionEventHandler() { - @Override - public void onSelection(final WaveRef waveRef) { - openWave(waveRef, false); - } - }); - waveView = null; - } else { - waveView = new WaveView(); - contentPanel.add(waveView); + private void setupWavePanel() { + // Handles opening waves. + ClientEvents.get().addWaveSelectionEventHandler(new WaveSelectionEventHandler() { + @Override + public void onSelection(WaveRef waveRef) { + openWave(waveRef, false); + } + }); + } - // DockLayoutPanel manually set position relative. We need to clear - // it. - waveView.getElement().getStyle().clearPosition(); + private void setupConnectionIndicator() { + ClientEvents.get().addNetworkStatusEventHandler(new NetworkStatusEventHandler() { + @Override + public void onNetworkStatus(NetworkStatusEvent event) { + Element element = Document.get().getElementById("netstatus"); + if (element != null) { + switch (event.getStatus()) { + case CONNECTED: + case RECONNECTED: + element.setInnerText("Online"); + element.setClassName("online"); + break; + case DISCONNECTED: + element.setInnerText("Offline"); + element.setClassName("offline"); + break; + case RECONNECTING: + element.setInnerText("Connecting..."); + element.setClassName("connecting"); + break; + } } + } + }); + } - ClientEvents.get().addWaveCreationEventHandler(new WaveCreationEventHandler() { + /** + * Returns <code>ws://yourhost[:port]/</code>. + */ + // XXX check formatting wrt GPE + private native String getWebSocketBaseUrl(String moduleBase) /*-{ + return "ws" + /:\/\/[^\/]+/.exec(moduleBase)[0] + "/"; +}-*/; - @Override - public void onCreateRequest(final WaveCreationEvent event) { - LOG.info("WaveCreationEvent received"); - if (channel == null) { - throw new RuntimeException("Spaghetti attack. Create occured before login"); // NOPMD - // by - // vjrj - // on - // 18/01/11 - // 15:52 - } + private native boolean useSocketIO() /*-{ + return !!$wnd.__useSocketIO +}-*/; - if (ClientFlags.get().enableWavePanelHarness()) { - final WaveId newWaveId = idGenerator.newWaveId(); - openWave(WaveRef.of(newWaveId), true); - } else { - final WaveId newWaveId = idGenerator.newWaveId(); - ClientEvents.get().fireEvent(new WaveSelectionEvent(WaveRef.of(newWaveId))); - final ObservableConversation convo = waveView.getConversationView().createRoot(); - final CcBasedWavelet rootWavelet = waveView.getCcStackManager().getView().getRoot(); - rootWavelet.addParticipant(loggedInUser); - LOG.info("created conversation: " + convo); - convo.getRootThread().appendBlip(); - } - } - }); + /** + */ + private void loginToServer() { + assert loggedInUser != null; + channel = new RemoteViewServiceMultiplexer(websocket, loggedInUser.getAddress()); + } - configureConnectionIndicator(); + /** + * Shows a wave in a wave panel. + * + * @param waveRef wave id to open + * @param isNewWave whether the wave is being created by this client session. + */ + private void openWave(WaveRef waveRef, boolean isNewWave) { + LOG.info("WebClient.openWave()"); - HistorySupport.init(); - - websocket = new WaveWebSocketClient(useSocketIO(), getWebSocketBaseUrl(GWT.getModuleBaseURL())); - websocket.connect(); - - if (Session.get().isLoggedIn()) { - loggedInUser = new ParticipantId(Session.get().getAddress()); - idGenerator = ClientIdGenerator.create(); - loginToServer(); - } - History.fireCurrentHistoryState(); - LOG.info("SimpleWebClient.onModuleLoad() done"); + if (wave != null) { + wave.destroy(); + wave = null; } - private void configureConnectionIndicator() { - ClientEvents.get().addNetworkStatusEventHandler(new NetworkStatusEventHandler() { - @Override - public void onNetworkStatus(final NetworkStatusEvent event) { - final Element element = Document.get().getElementById("netstatus"); - if (element != null) { - switch (event.getStatus()) { - case CONNECTED: - case RECONNECTED: - element.setInnerText("Online"); - element.setClassName("online"); - break; - case DISCONNECTED: - element.setInnerText("Offline"); - element.setClassName("offline"); - break; - case RECONNECTING: - element.setInnerText("Connecting..."); - element.setClassName("connecting"); - break; - } - } - } - }); + Element holder = contentPanel.getElement().appendChild(Document.get().createDivElement()); + final StagesProvider wave = new StagesProvider(holder, + contentPanel, waveRef, channel, idGenerator, profiles, waveStore, isNewWave); + this.wave = wave; + wave.load(null); + String encodedToken = History.getToken(); + if (encodedToken != null && !encodedToken.isEmpty()) { + WaveRef fromWaveRef = HistorySupport.waveRefFromHistoryToken(encodedToken); + if (waveRef == null) { + LOG.info("History token contains invalid path: " + encodedToken); + return; + } + if (fromWaveRef.getWaveId().equals(waveRef.getWaveId())) { + // History change was caused by clicking on a link, it's already + // updated by browser. + return; + } } + History.newItem(HistorySupport.historyTokenFromWaveref(waveRef), false); + } - private native String getBaseUrl() /*-{ - return !!$wnd.__baseUrl - }-*/; + /** + * An exception handler that reports exceptions using a <em>shiny banner</em> + * (an alert placed on the top of the screen). Once the stack trace is + * prepared, it is revealed in the banner via a link. + */ + static class ErrorHandler implements UncaughtExceptionHandler { + /** Next handler in the handler chain. */ + private final UncaughtExceptionHandler next; /** - * Returns <code>ws://yourhost[:port]/</code>. + * Indicates whether an error has already been reported (at most one error + * is ever reported by this handler). */ - // XXX check formatting wrt GPE - private native String getWebSocketBaseUrl(String moduleBase) /*-{ - return "ws" + /:\/\/[^\/]+/.exec(moduleBase)[0] + "/"; - }-*/; + private boolean hasFired; - /** - */ - private void loginToServer() { - assert loggedInUser != null; - backend = new WebClientBackend(loggedInUser, websocket); - channel = new RemoteViewServiceMultiplexer(websocket, loggedInUser.getAddress()); + private ErrorHandler(UncaughtExceptionHandler next) { + this.next = next; + } - websocket.attachLegacy(backend); - if (!ClientFlags.get().enableWavePanelHarness()) { - waveView.setLegacy(backend, idGenerator); - } + public static void install() { + GWT.setUncaughtExceptionHandler(new ErrorHandler(GWT.getUncaughtExceptionHandler())); + } - ClientEvents.get().addNetworkStatusEventHandler(new NetworkStatusEventHandler() { - @Override - public void onNetworkStatus(final NetworkStatusEvent event) { - if (event.getStatus() == ConnectionStatus.CONNECTED) { - openIndexWave(); - } - } + @Override + public void onUncaughtException(Throwable e) { + if (!hasFired) { + hasFired = true; + final ErrorIndicatorPresenter error = + ErrorIndicatorPresenter.create(RootPanel.get("banner")); + getStackTraceAsync(e, new Accessor<SafeHtml>() { + @Override + public void use(SafeHtml stack) { + error.addDetail(stack, null); + } }); + } + + if (next != null) { + next.onUncaughtException(e); + } } - private void openIndexWave() { - final SimpleCcDocumentFactory docFactory = new SimpleCcDocumentFactory(); - final WaveViewServiceImpl indexWave = (WaveViewServiceImpl) backend.getIndexWave(docFactory); - indexWave.viewOpen(IdFilters.ALL_IDS, null, new WaveViewService.OpenCallback() { + private void getStackTraceAsync(final Throwable t, final Accessor<SafeHtml> whenReady) { + // TODO: Request stack-trace de-obfuscation. For now, just use the + // javascript stack trace. + // + // Use minimal services here, in order to avoid the chance that reporting + // the error produces more errors. In particular, do not use Scheduler. + // Also, this code could potentially be put behind a runAsync boundary, to + // save whatever dependencies it uses from the initial download. + DeferredCommand.addCommand(new Command() { + @Override + public void execute() { + SafeHtmlBuilder stack = new SafeHtmlBuilder(); - @Override - public void onException(final ChannelException e) { - LOG.severe("ChannelException opening index wave", e); + Throwable error = t; + while (error != null) { + stack.appendEscaped(String.valueOf(error.getMessage())).appendHtmlConstant("<br>"); + for (StackTraceElement elt : error.getStackTrace()) { + stack.appendHtmlConstant(" ") + .appendEscaped(maybe(elt.getClassName(), "??")).appendHtmlConstant(".") // + .appendEscaped(maybe(elt.getMethodName(), "??")).appendHtmlConstant(" (") // + .appendEscaped(maybe(elt.getFileName(), "??")).appendHtmlConstant(":") // + .appendEscaped(maybe(elt.getLineNumber(), "??")).appendHtmlConstant(")") // + .appendHtmlConstant("<br>"); } - - @Override - public void onFailure(final String reason) { - LOG.info("Failure for index wave " + reason); + error = error.getCause(); + if (error != null) { + stack.appendHtmlConstant("Caused by: "); } + } - @Override - public void onSuccess(final String response) { - LOG.info("Success for index wave subscription"); - } - - @Override - public void onUpdate(final WaveViewService.WaveViewServiceUpdate update) { - LOG.info("IndexWave update received hasDeltas=" + update.hasDeltas() + " hasWaveletSnapshot=" - + update.hasWaveletSnapshot()); - ClientEvents.get().fireEvent( - new WaveUpdatedEvent(indexWave, update.getChannelId(), update.getWaveletId())); - ClientEvents.get().fireEvent(new WaveIndexUpdatedEvent(WebClientUtils.getIndexEntries(indexWave))); - } - }); + whenReady.use(stack.toSafeHtml()); + } + }); } - /** - * Shows a wave in a wave panel. - * - * @param waveRef - * wave id to open - * @param isNewWave - * whether the wave is being created by this client session. - */ - private void openWave(final WaveRef waveRef, final boolean isNewWave) { - LOG.info("WebClient.openWave()"); - - if (wave != null) { - wave.destroy(); - wave = null; - } - - wave = new StagesProvider(contentPanel.getElement().appendChild(Document.get().createDivElement()), - contentPanel, waveRef, channel, idGenerator, isNewWave); - wave.load(null); - final String encodedToken = History.getToken(); - if (encodedToken != null && !encodedToken.isEmpty()) { - final WaveRef fromWaveRef = HistorySupport.waveRefFromHistoryToken(encodedToken); - if (waveRef == null) { - LOG.info("History token contains invalid path: " + encodedToken); - return; - } - if (fromWaveRef.getWaveId().equals(waveRef.getWaveId())) { - // History change was caused by clicking on a link, it's already - // updated by browser. - return; - } - } - History.newItem(HistorySupport.historyTokenFromWaveref(waveRef), false); + private static String maybe(String value, String otherwise) { + return value != null ? value : otherwise; } - private native boolean useSocketIO() /*-{ - return !!$wnd.__useSocketIO - }-*/; + private static String maybe(int value, String otherwise) { + return value != -1 ? String.valueOf(value) : otherwise; + } + } } Modified: trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/client/WebClient.ui.xml 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,9 +1,9 @@ <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g='urn:import:com.google.gwt.user.client.ui' - xmlns:s='urn:import:org.waveprotocol.box.webclient.client' - xmlns:w='urn:import:org.waveprotocol.wave.client.widget.common' - xmlns:n='urn:import:org.waveprotocol.box.webclient.client.wavelist'> + xmlns:d='urn:import:org.waveprotocol.box.webclient.client' + xmlns:s='urn:import:org.waveprotocol.box.webclient.search' + xmlns:w='urn:import:org.waveprotocol.wave.client.widget.common'> <ui:style type="cc.kune.wave.client.WebClient.Style"> @def rootBackground #f0f0ff; @def gap 5px; @@ -55,15 +55,15 @@ <g:center> <g:SplitLayoutPanel ui:field="splitPanel" stylePrimaryName="{style.splitPanel}"> <g:south size="200"> - <s:DebugMessagePanel ui:field="logPanel" styleName="{style.subPanel} {style.debugPanel}" /> + <d:DebugMessagePanel ui:field="logPanel" addStyleNames="{style.subPanel} {style.debugPanel}" /> </g:south> <g:west size="400"> - <n:WaveListPanel ui:field="listPanel" styleName="{style.waveList}" /> + <s:SearchPanelWidget ui:field="searchPanel"/> </g:west> <g:center> - <w:ImplPanel ui:field="contentPanel"></w:ImplPanel> + <w:ImplPanel ui:field="contentPanel"/> </g:center> </g:SplitLayoutPanel> </g:center> </g:DockLayoutPanel> -</ui:UiBinder> +</ui:UiBinder> \ No newline at end of file Modified: trunk/src/main/java/cc/kune/wave/server/CustomAuthenticationServlet.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/CustomAuthenticationServlet.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/server/CustomAuthenticationServlet.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -31,7 +31,6 @@ import org.waveprotocol.box.server.authentication.ParticipantPrincipal; import org.waveprotocol.box.server.authentication.SessionManager; import org.waveprotocol.box.server.gxp.AuthenticationPage; -import org.waveprotocol.box.server.rpc.BaseUrlHelper; import org.waveprotocol.wave.model.wave.InvalidParticipantAddress; import org.waveprotocol.wave.model.wave.ParticipantId; import org.waveprotocol.wave.util.logging.Log; @@ -45,203 +44,203 @@ /** * A servlet for authenticating a user's password and giving them a token via a * cookie. - * + * * @author [email protected] (Joseph Gentle) */ public class CustomAuthenticationServlet extends HttpServlet { - private static final String DEFAULT_REDIRECT_URL = "/"; - public static final String RESPONSE_STATUS_NONE = "NONE"; - public static final String RESPONSE_STATUS_FAILED = "FAILED"; - public static final String RESPONSE_STATUS_SUCCESS = "SUCCESS"; + private static final String DEFAULT_REDIRECT_URL = "/"; + private static final Log LOG = Log.get(CustomAuthenticationServlet.class); + public static final String RESPONSE_STATUS_FAILED = "FAILED"; + public static final String RESPONSE_STATUS_NONE = "NONE"; - private static final Log LOG = Log.get(CustomAuthenticationServlet.class); + public static final String RESPONSE_STATUS_SUCCESS = "SUCCESS"; - private final Configuration configuration; - private final SessionManager sessionManager; - private final String domain; - private final String baseUrl; + private final Configuration configuration; + private final String domain; + private final SessionManager sessionManager; - @Inject - public CustomAuthenticationServlet(Configuration configuration, SessionManager sessionManager, - @Named(CoreSettings.WAVE_SERVER_DOMAIN) String domain, @Named(CoreSettings.HTTP_BASE_URL) String baseUrl) { - Preconditions.checkNotNull(configuration, "Configuration is null"); - Preconditions.checkNotNull(sessionManager, "Session manager is null"); - this.configuration = configuration; - this.sessionManager = sessionManager; - this.domain = domain.toLowerCase(); - this.baseUrl = BaseUrlHelper.removeLastSlash(baseUrl); - } + @Inject + public CustomAuthenticationServlet(final Configuration configuration, final SessionManager sessionManager, + @Named(CoreSettings.WAVE_SERVER_DOMAIN) final String domain) { + Preconditions.checkNotNull(configuration, "Configuration is null"); + Preconditions.checkNotNull(sessionManager, "Session manager is null"); + this.configuration = configuration; + this.sessionManager = sessionManager; + this.domain = domain.toLowerCase(); + } - @SuppressWarnings("unchecked") - public LoginContext login(BufferedReader body) throws IOException, LoginException { - try { - Subject subject = new Subject(); + /** + * On GET, present a login form if the user isn't authenticated. + */ + @Override + protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException { + // If the user is already logged in, we'll try to redirect them + // immediately. + resp.setCharacterEncoding("UTF-8"); + req.setCharacterEncoding("UTF-8"); + final HttpSession session = req.getSession(false); + final ParticipantId user = sessionManager.getLoggedInUser(session); - String parametersLine = body.readLine(); - // Throws UnsupportedEncodingException. - byte[] utf8Bytes = parametersLine.getBytes("UTF-8"); + if (user != null) { + redirectLoggedInUser(req, resp); + } else { + resp.setStatus(HttpServletResponse.SC_OK); + resp.setContentType("text/html;charset=utf-8"); + AuthenticationPage.write(resp.getWriter(), new GxpContext(req.getLocale()), domain, "", + RESPONSE_STATUS_NONE); + } + } - CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder(); - utf8Decoder.onMalformedInput(CodingErrorAction.IGNORE); - utf8Decoder.onUnmappableCharacter(CodingErrorAction.IGNORE); + /** + * The POST request should have all the fields required for authentication. + */ + @Override + protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws IOException { + req.setCharacterEncoding("UTF-8"); + LoginContext context; + try { + context = login(req.getReader()); + } catch (final LoginException e) { + final String message = "The username or password you entered is incorrect."; + final String responseType = RESPONSE_STATUS_FAILED; + LOG.info("User authentication failed: " + e.getLocalizedMessage()); + resp.setStatus(HttpServletResponse.SC_FORBIDDEN); + AuthenticationPage.write(resp.getWriter(), new GxpContext(req.getLocale()), domain, message, responseType); + return; + } - // Throws CharacterCodingException. - CharBuffer parsed = utf8Decoder.decode(ByteBuffer.wrap(utf8Bytes)); - parametersLine = parsed.toString(); + final Subject subject = context.getSubject(); - MultiMap<String> parameters = new UrlEncoded(parametersLine); - CallbackHandler callbackHandler = new HttpRequestBasedCallbackHandler(parameters); + ParticipantId loggedInAddress; + try { + loggedInAddress = getLoggedInUser(subject); + } catch (final InvalidParticipantAddress e1) { + throw new IllegalStateException("The user provided valid authentication information, but the username" + + " isn't a valid user address."); + } - LoginContext context = new LoginContext("Wave", subject, callbackHandler, configuration); + if (loggedInAddress == null) { + try { + context.logout(); + } catch (final LoginException e) { + // Logout failed. Absorb the error, since we're about to throw + // an + // illegal state exception anyway. + } + throw new IllegalStateException("The user provided valid authentication information, but we don't " + + "know how to map their identity to a wave user address."); + } - // If authentication fails, login() will throw a LoginException. - context.login(); - return context; - } catch (CharacterCodingException cce) { - throw new LoginException("Character coding exception (not utf-8): " - + cce.getLocalizedMessage()); - } catch (UnsupportedEncodingException uee) { - throw new LoginException("ad character encoding specification: " + uee.getLocalizedMessage()); - } - } + final HttpSession session = req.getSession(true); + sessionManager.setLoggedInUser(session, loggedInAddress); + // The context needs to be notified when the user logs out. + session.setAttribute("context", context); + LOG.info("Authenticated user " + loggedInAddress); - /** - * The POST request should have all the fields required for authentication. - */ - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { - req.setCharacterEncoding("UTF-8"); - LoginContext context; - try { - context = login(req.getReader()); - } catch (LoginException e) { - String message = "The username or password you entered is incorrect."; - String responseType = RESPONSE_STATUS_FAILED; - LOG.info("User authentication failed: " + e.getLocalizedMessage()); - resp.setStatus(HttpServletResponse.SC_FORBIDDEN); - AuthenticationPage.write(resp.getWriter(), new GxpContext(req.getLocale()), domain, baseUrl, message, - responseType); - return; + redirectLoggedInUser(req, resp); } - Subject subject = context.getSubject(); + /** + * Get the participant id of the given subject. + * + * The subject is searched for compatible principals. When other + * authentication types are added, this method will need to be updated to + * support their principal types. + * + * @throws InvalidParticipantAddress + * The subject's address is invalid + */ + private ParticipantId getLoggedInUser(final Subject subject) throws InvalidParticipantAddress { + String address = null; - ParticipantId loggedInAddress; - try { - loggedInAddress = getLoggedInUser(subject); - } catch (InvalidParticipantAddress e1) { - throw new IllegalStateException( - "The user provided valid authentication information, but the username" - + " isn't a valid user address."); - } + for (final Principal p : subject.getPrincipals()) { + // TODO(josephg): When we support other authentication types (LDAP, + // etc), + // this method will need to read the address portion out of the + // other principal types. + if (p instanceof ParticipantPrincipal) { + address = ((ParticipantPrincipal) p).getName(); + break; + } + } - if (loggedInAddress == null) { - try { - context.logout(); - } catch (LoginException e) { - // Logout failed. Absorb the error, since we're about to throw an - // illegal state exception anyway. - } - throw new IllegalStateException( - "The user provided valid authentication information, but we don't " - + "know how to map their identity to a wave user address."); + return address == null ? null : ParticipantId.of(address); } - HttpSession session = req.getSession(true); - sessionManager.setLoggedInUser(session, loggedInAddress); - // The context needs to be notified when the user logs out. - session.setAttribute("context", context); - LOG.info("Authenticated user " + loggedInAddress); + @SuppressWarnings("unchecked") + public LoginContext login(final BufferedReader body) throws IOException, LoginException { + try { + final Subject subject = new Subject(); - redirectLoggedInUser(req, resp); - } + String parametersLine = body.readLine(); + // Throws UnsupportedEncodingException. + final byte[] utf8Bytes = parametersLine.getBytes("UTF-8"); - /** - * Get the participant id of the given subject. - * - * The subject is searched for compatible principals. When other - * authentication types are added, this method will need to be updated to - * support their principal types. - * - * @throws InvalidParticipantAddress The subject's address is invalid - */ - private ParticipantId getLoggedInUser(Subject subject) throws InvalidParticipantAddress { - String address = null; + final CharsetDecoder utf8Decoder = Charset.forName("UTF-8").newDecoder(); + utf8Decoder.onMalformedInput(CodingErrorAction.IGNORE); + utf8Decoder.onUnmappableCharacter(CodingErrorAction.IGNORE); - for (Principal p : subject.getPrincipals()) { - // TODO(josephg): When we support other authentication types (LDAP, etc), - // this method will need to read the address portion out of the other principal types. - if (p instanceof ParticipantPrincipal) { - address = ((ParticipantPrincipal) p).getName(); - break; - } - } + // Throws CharacterCodingException. + final CharBuffer parsed = utf8Decoder.decode(ByteBuffer.wrap(utf8Bytes)); + parametersLine = parsed.toString(); - return address == null ? null : ParticipantId.of(address); - } + final MultiMap<String> parameters = new UrlEncoded(parametersLine); + final CallbackHandler callbackHandler = new HttpRequestBasedCallbackHandler(parameters); - /** - * On GET, present a login form if the user isn't authenticated. - */ - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { - // If the user is already logged in, we'll try to redirect them immediately. - resp.setCharacterEncoding("UTF-8"); - req.setCharacterEncoding("UTF-8"); - HttpSession session = req.getSession(false); - ParticipantId user = sessionManager.getLoggedInUser(session); + final LoginContext context = new LoginContext("Wave", subject, callbackHandler, configuration); - if (user != null) { - redirectLoggedInUser(req, resp); - } else { - resp.setStatus(HttpServletResponse.SC_OK); - resp.setContentType("text/html;charset=utf-8"); - AuthenticationPage.write(resp.getWriter(), new GxpContext(req.getLocale()), domain, baseUrl, "", - RESPONSE_STATUS_NONE); + // If authentication fails, login() will throw a LoginException. + context.login(); + return context; + } catch (final CharacterCodingException cce) { + throw new LoginException("Character coding exception (not utf-8): " + cce.getLocalizedMessage()); + } catch (final UnsupportedEncodingException uee) { + throw new LoginException("ad character encoding specification: " + uee.getLocalizedMessage()); + } } - } - /** - * Redirect the user back to DEFAULT_REDIRECT_URL, unless a custom redirect - * URL has been specified in the query string; in which case redirect there. - * - * Only redirects to local URLs are allowed. - * - * @throws IOException - */ - private void redirectLoggedInUser(HttpServletRequest req, HttpServletResponse resp) - throws IOException { - Preconditions.checkState(sessionManager.getLoggedInUser(req.getSession(false)) != null, - "The user is not logged in"); - String query = req.getQueryString(); + /** + * Redirect the user back to DEFAULT_REDIRECT_URL, unless a custom redirect + * URL has been specified in the query string; in which case redirect there. + * + * Only redirects to local URLs are allowed. + * + * @throws IOException + */ + private void redirectLoggedInUser(final HttpServletRequest req, final HttpServletResponse resp) throws IOException { + Preconditions.checkState(sessionManager.getLoggedInUser(req.getSession(false)) != null, + "The user is not logged in"); + final String query = req.getQueryString(); - // Not using req.getParameter() for this because calling that method might parse the password - // sitting in POST data into a String, where it could be read by another process after the - // string is garbage collected. - if (query == null || !query.startsWith("r=")) { - resp.sendRedirect(baseUrl + DEFAULT_REDIRECT_URL); - return; - } + // Not using req.getParameter() for this because calling that method + // might parse the password + // sitting in POST data into a String, where it could be read by another + // process after the + // string is garbage collected. + if (query == null || !query.startsWith("r=")) { + resp.sendRedirect(DEFAULT_REDIRECT_URL); + return; + } - String encoded_url = query.substring("r=".length()); - String path = URLDecoder.decode(encoded_url, "UTF-8"); + final String encoded_url = query.substring("r=".length()); + final String path = URLDecoder.decode(encoded_url, "UTF-8"); - // The URL must not be an absolute URL to prevent people using this as a - // generic redirection service. - URI uri; - try { - uri = new URI(path); - } catch (URISyntaxException e) { - // The redirect URL is invalid. - resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - return; - } + // The URL must not be an absolute URL to prevent people using this as a + // generic redirection service. + URI uri; + try { + uri = new URI(path); + } catch (final URISyntaxException e) { + // The redirect URL is invalid. + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return; + } - if (Strings.isNullOrEmpty(uri.getHost()) == false) { - // The URL includes a host component. Disallow it. - resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - } else { - resp.sendRedirect(path); + if (Strings.isNullOrEmpty(uri.getHost()) == false) { + // The URL includes a host component. Disallow it. + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } else { + resp.sendRedirect(path); + } } - } } Deleted: trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,509 +0,0 @@ -package cc.kune.wave.server; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import javax.servlet.Servlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.nio.SelectChannelConnector; -import org.eclipse.jetty.servlet.DefaultServlet; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.resource.ResourceCollection; -import org.eclipse.jetty.webapp.WebAppContext; -import org.eclipse.jetty.websocket.WebSocket; -import org.eclipse.jetty.websocket.WebSocketServlet; -import org.ourproject.kune.rack.RackServletFilter; -import org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolAuthenticate; -import org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolAuthenticationResult; -import org.waveprotocol.box.server.CoreSettings; -import org.waveprotocol.box.server.authentication.SessionManager; -import org.waveprotocol.box.server.rpc.BaseUrlHelper; -import org.waveprotocol.box.server.rpc.MessageExpectingChannel; -import org.waveprotocol.box.server.rpc.ProtoCallback; -import org.waveprotocol.box.server.rpc.Rpc; -import org.waveprotocol.box.server.rpc.ServerRpcController; -import org.waveprotocol.box.server.rpc.SocketIOServerChannel; -import org.waveprotocol.box.server.rpc.WebSocketServerChannel; -import org.waveprotocol.box.server.util.NetUtils; -import org.waveprotocol.wave.model.util.Pair; -import org.waveprotocol.wave.model.wave.ParticipantId; -import org.waveprotocol.wave.util.logging.Log; - -import com.glines.socketio.server.SocketIOInbound; -import com.glines.socketio.server.SocketIOServlet; -import com.glines.socketio.server.transport.FlashSocketTransport; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.inject.Inject; -import com.google.inject.Injector; -import com.google.inject.name.Named; -import com.google.protobuf.Descriptors; -import com.google.protobuf.Descriptors.MethodDescriptor; -import com.google.protobuf.Message; -import com.google.protobuf.RpcCallback; -import com.google.protobuf.Service; -import com.google.protobuf.UnknownFieldSet; - -/** - * ServerRpcProvider can provide instances of type Service over an incoming - * network socket and service incoming RPCs to these services and their methods. - * - * - */ -public class CustomServerRpcProvider { - abstract class Connection implements ProtoCallback { - private final Map<Long, ServerRpcController> activeRpcs = new ConcurrentHashMap<Long, ServerRpcController>(); - - // The logged in user. - // Note: Due to this bug: - // http://code.google.com/p/wave-protocol/issues/detail?id=119, - // the field may be null on first connect and then set later using an - // RPC. - private ParticipantId loggedInUser; - - /** - * @param loggedInUser - * The currently logged in user, or null if no user is logged - * in. - */ - public Connection(final ParticipantId loggedInUser) { - this.loggedInUser = loggedInUser; - } - - private ParticipantId authenticate(final String token) { - final HttpSession session = sessionManager.getSessionFromToken(token); - final ParticipantId user = sessionManager.getLoggedInUser(session); - return user; - } - - protected void expectMessages(final MessageExpectingChannel channel) { - synchronized (registeredServices) { - for (final RegisteredServiceMethod serviceMethod : registeredServices.values()) { - channel.expectMessage(serviceMethod.service.getRequestPrototype(serviceMethod.method)); - LOG.fine("Expecting: " + serviceMethod.method.getFullName()); - } - } - channel.expectMessage(Rpc.CancelRpc.getDefaultInstance()); - } - - @Override - public void message(final long sequenceNo, final Message message) { - if (message instanceof Rpc.CancelRpc) { - final ServerRpcController controller = activeRpcs.get(sequenceNo); - if (controller == null) { - throw new IllegalStateException("Trying to cancel an RPC that is not active!"); - } else { - LOG.info("Cancelling open RPC " + sequenceNo); - controller.cancel(); - } - } else if (message instanceof ProtocolAuthenticate) { - // Workaround for bug: - // http://codereview.waveprotocol.org/224001/ - - // When we get this message, either the connection will not be - // logged in - // (loggedInUser == null) or the connection will have been - // authenticated - // via cookies - // (in which case loggedInUser must match the authenticated - // user, and - // this message has no - // effect). - - final ProtocolAuthenticate authMessage = (ProtocolAuthenticate) message; - final ParticipantId authenticatedAs = authenticate(authMessage.getToken()); - - Preconditions.checkArgument(authenticatedAs != null, "Auth token invalid"); - Preconditions.checkState(loggedInUser == null || loggedInUser.equals(authenticatedAs), - "Session already authenticated as a different user"); - - loggedInUser = authenticatedAs; - LOG.info("Session authenticated as " + loggedInUser); - sendMessage(sequenceNo, ProtocolAuthenticationResult.getDefaultInstance()); - } else if (registeredServices.containsKey(message.getDescriptorForType())) { - if (activeRpcs.containsKey(sequenceNo)) { - throw new IllegalStateException("Can't invoke a new RPC with a sequence number already in use."); - } else { - final RegisteredServiceMethod serviceMethod = registeredServices.get(message.getDescriptorForType()); - - // Create the internal ServerRpcController used to invoke - // the call. - final ServerRpcController controller = new ServerRpcControllerImpl(message, serviceMethod.service, - serviceMethod.method, loggedInUser, new RpcCallback<Message>() { - @Override - synchronized public void run(final Message message) { - if (message instanceof Rpc.RpcFinished - || !serviceMethod.method.getOptions().getExtension(Rpc.isStreamingRpc)) { - // This RPC is over - remove it from the - // map. - final boolean failed = message instanceof Rpc.RpcFinished ? ((Rpc.RpcFinished) message).getFailed() - : false; - LOG.fine("RPC " + sequenceNo + " is now finished, failed = " + failed); - if (failed) { - LOG.info("error = " + ((Rpc.RpcFinished) message).getErrorText()); - } - activeRpcs.remove(sequenceNo); - } - sendMessage(sequenceNo, message); - } - }); - - // Kick off a new thread specific to this RPC. - activeRpcs.put(sequenceNo, controller); - threadPool.execute(controller); - } - } else { - // Sent a message type we understand, but don't expect - - // erronous case! - throw new IllegalStateException("Got expected but unknown message (" + message + ") for sequence: " - + sequenceNo); - } - } - - protected abstract void sendMessage(long sequenceNo, Message message); - - @Override - public void unknown(final long sequenceNo, final String messageType, final String message) { - throw new IllegalStateException("Got unknown message (type: " + messageType + ", " + message - + ") for sequence: " + sequenceNo); - } - - @Override - public void unknown(final long sequenceNo, final String messageType, final UnknownFieldSet message) { - throw new IllegalStateException("Got unknown message (type: " + messageType + ", " + message - + ") for sequence: " + sequenceNo); - } - } - - /** - * Internal, static container class for any specific registered service - * method. - */ - static class RegisteredServiceMethod { - final MethodDescriptor method; - final Service service; - - RegisteredServiceMethod(final Service service, final MethodDescriptor method) { - this.service = service; - this.method = method; - } - } - class SocketIOConnection extends Connection { - private final SocketIOServerChannel socketChannel; - - SocketIOConnection(final ParticipantId loggedInUser) { - super(loggedInUser); - socketChannel = new SocketIOServerChannel(this); - LOG.info("New websocket connection set up for user " + loggedInUser); - expectMessages(socketChannel); - } - - public SocketIOServerChannel getWebSocketServerChannel() { - return socketChannel; - } - - @Override - protected void sendMessage(final long sequenceNo, final Message message) { - socketChannel.sendMessage(sequenceNo, message); - } - } - public class WaveSocketIOServlet extends SocketIOServlet { - @Override - protected SocketIOInbound doSocketIOConnect(final HttpServletRequest request, final String[] protocols) { - final ParticipantId loggedInUser = sessionManager.getLoggedInUser(request.getSession(false)); - - final SocketIOConnection connection = new SocketIOConnection(loggedInUser); - return connection.getWebSocketServerChannel(); - } - } - public class WaveWebSocketServlet extends WebSocketServlet { - @Override - protected WebSocket doWebSocketConnect(final HttpServletRequest request, final String protocol) { - final ParticipantId loggedInUser = sessionManager.getLoggedInUser(request.getSession(false)); - - final WebSocketConnection connection = new WebSocketConnection(loggedInUser); - return connection.getWebSocketServerChannel(); - } - } - class WebSocketConnection extends Connection { - private final WebSocketServerChannel socketChannel; - - WebSocketConnection(final ParticipantId loggedInUser) { - super(loggedInUser); - socketChannel = new WebSocketServerChannel(this); - LOG.info("New websocket connection set up for user " + loggedInUser); - expectMessages(socketChannel); - } - - public WebSocketServerChannel getWebSocketServerChannel() { - return socketChannel; - } - - @Override - protected void sendMessage(final long sequenceNo, final Message message) { - socketChannel.sendMessage(sequenceNo, message); - } - } - private static final Log LOG = Log.get(CustomServerRpcProvider.class); - - private static InetSocketAddress[] parseAddressList(final List<String> addressList) { - if (addressList == null || addressList.size() == 0) { - return new InetSocketAddress[0]; - } else { - final Set<InetSocketAddress> addresses = Sets.newHashSet(); - for (final String str : addressList) { - if (str.length() == 0) { - LOG.warning("Encountered empty address in http addresses list."); - } else { - try { - final InetSocketAddress address = NetUtils.parseHttpAddress(str); - if (!addresses.contains(address)) { - addresses.add(address); - } else { - LOG.warning("Ignoring duplicate address in http addresses list: Duplicate entry '" + str - + "' resolved to " + address.getAddress().getHostAddress()); - } - } catch (final IOException e) { - LOG.severe("Unable to process address " + str, e); - } - } - } - return addresses.toArray(new InetSocketAddress[0]); - } - } - private final String baseUrl; - - private final Integer flashsocketPolicyPort; - - private final InetSocketAddress[] httpAddresses; - - private Server httpServer = null; - - private final Set<Connection> incomingConnections = Sets.newHashSet(); - - private final org.eclipse.jetty.server.SessionManager jettySessionManager; - - // Mapping from incoming protocol buffer type -> specific handler. - private final Map<Descriptors.Descriptor, RegisteredServiceMethod> registeredServices = Maps.newHashMap(); - - private final String resourceBase; - - /** - * Set of servlets - */ - List<Pair<String, ServletHolder>> servletRegistry = Lists.newArrayList(); - - private final SessionManager sessionManager; - - private final ExecutorService threadPool; - - /** - * Construct a new ServerRpcProvider, hosting on the specified WebSocket - * addresses. - * - * Also accepts an ExecutorService for spawning managing threads. - */ - public CustomServerRpcProvider(final InetSocketAddress[] httpAddresses, final Integer flashsocketPolicyPort, - final String baseUrl, final String resourceBase, final ExecutorService threadPool, - final SessionManager sessionManager, final org.eclipse.jetty.server.SessionManager jettySessionManager) { - this.httpAddresses = httpAddresses; - this.flashsocketPolicyPort = flashsocketPolicyPort; - this.baseUrl = BaseUrlHelper.removeLastSlash(baseUrl); - this.resourceBase = resourceBase; - this.threadPool = threadPool; - this.sessionManager = sessionManager; - this.jettySessionManager = jettySessionManager; - } - - /** - * Constructs a new ServerRpcProvider with a default ExecutorService. - */ - public CustomServerRpcProvider(final InetSocketAddress[] httpAddresses, final Integer flashsocketPolicyPort, - final String baseUrl, final String resourceBase, final SessionManager sessionManager, - final org.eclipse.jetty.server.SessionManager jettySessionManager) { - this(httpAddresses, flashsocketPolicyPort, baseUrl, resourceBase, Executors.newCachedThreadPool(), - sessionManager, jettySessionManager); - } - - @Inject - public CustomServerRpcProvider(@Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) final List<String> httpAddresses, - @Named(CoreSettings.FLASHSOCKET_POLICY_PORT) final Integer flashsocketPolicyPort, - @Named(CoreSettings.HTTP_BASE_URL) final String baseUrl, - @Named(CoreSettings.RESOURCE_BASE) final String resourceBase, final SessionManager sessionManager, - final org.eclipse.jetty.server.SessionManager jettySessionManager) { - this(parseAddressList(httpAddresses), flashsocketPolicyPort, baseUrl, resourceBase, sessionManager, - jettySessionManager); - } - - /** - * Add a servlet to the servlet registry. This servlet will be attached to - * the specified URL pattern when the server is started up. - * - * @param urlPattern - * URL pattern for paths. Eg, '/foo', '/foo/*' - * @param servlet - * The servlet object to bind to the specified paths - * @return the {@link ServletHolder} that holds the servlet. - */ - public ServletHolder addServlet(final String urlPattern, final Servlet servlet) { - final ServletHolder servletHolder = new ServletHolder(servlet); - servletRegistry.add(new Pair<String, ServletHolder>(urlPattern, servletHolder)); - return servletHolder; - } - - /** - * @return a list of {@link SelectChannelConnector} each bound to a - * host:port pair form the list addresses. - */ - private List<SelectChannelConnector> getSelectChannelConnectors(final InetSocketAddress[] httpAddresses) { - final List<SelectChannelConnector> list = Lists.newArrayList(); - for (final InetSocketAddress address : httpAddresses) { - final SelectChannelConnector connector = new SelectChannelConnector(); - connector.setHost(address.getAddress().getHostAddress()); - connector.setPort(address.getPort()); - list.add(connector); - } - - return list; - } - - /** - * Returns the socket the WebSocket server is listening on. - */ - public SocketAddress getWebSocketAddress() { - if (httpServer == null) { - return null; - } else { - final Connector c = httpServer.getConnectors()[0]; - return new InetSocketAddress(c.getHost(), c.getLocalPort()); - } - } - - /** - * Register all methods provided by the given service type. - */ - public void registerService(final Service service) { - synchronized (registeredServices) { - for (final MethodDescriptor methodDescriptor : service.getDescriptorForType().getMethods()) { - registeredServices.put(methodDescriptor.getInputType(), new RegisteredServiceMethod(service, - methodDescriptor)); - } - } - } - - public void startWebSocketServer(final Injector injector) { - httpServer = new Server(); - - final List<SelectChannelConnector> connectors = getSelectChannelConnectors(httpAddresses); - if (connectors.isEmpty()) { - LOG.severe("No valid http end point address provided!"); - } - for (final SelectChannelConnector connector : connectors) { - httpServer.addConnector(connector); - } - - final WebAppContext context = new WebAppContext(); - - // FIXME This was with previous ServletContextHandler: needed? - // final ServletContextHandler context = new - // ServletContextHandler(ServletContextHandler.SESSIONS); - - if (jettySessionManager != null) { - context.getSessionHandler().setSessionManager(jettySessionManager); - } - final ResourceCollection resources = new ResourceCollection(new String[] { "src/main/webapp", resourceBase, }); - context.setBaseResource(resources); - context.setContextPath(baseUrl); - - context.setParentLoaderPriority(true); - context.setDescriptor("WEB-INF/web.xml"); - - context.setAttribute(RackServletFilter.INJECTOR_PARENT_ATTRIBUTE, injector); - - // Servlet where the websocket connection is served from. - final ServletHolder wsholder = new ServletHolder(new WaveWebSocketServlet()); - context.addServlet(wsholder, "/socket"); - // TODO(zamfi): fix to let messages span frames. - wsholder.setInitParameter("bufferSize", "" + 1024 * 1024); // 1M buffer - - // Servlet where the websocket connection is served from. - final ServletHolder sioholder = new ServletHolder(new WaveSocketIOServlet()); - context.addServlet(sioholder, "/socket.io/*"); - // TODO(zamfi): fix to let messages span frames. - sioholder.setInitParameter("bufferSize", "" + 1024 * 1024); // 1M buffer - // Set flash policy server parameters - String flashPolicyServerHost = "localhost"; - final StringBuilder flashPolicyAllowedPorts = new StringBuilder(); - /* - * Loop through addresses, collect list of ports, and determine if we - * are to use "localhost" of the AnyHost wildcard. - */ - for (final InetSocketAddress addr : httpAddresses) { - if (flashPolicyAllowedPorts.length() > 0) { - flashPolicyAllowedPorts.append(","); - } - flashPolicyAllowedPorts.append(addr.getPort()); - if (!addr.getAddress().isLoopbackAddress()) { - // Until it's possible to pass a list of address, this is the - // only valid alternative. - flashPolicyServerHost = "0.0.0.0"; - } - } - sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_SERVER_HOST_KEY, flashPolicyServerHost); - sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_SERVER_PORT_KEY, "" + flashsocketPolicyPort); - // TODO: Change to use the public http address and all other bound - // addresses. - sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_DOMAIN_KEY, "*"); - sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_PORTS_KEY, flashPolicyAllowedPorts.toString()); - - // Serve the static content and GWT web client with the default servlet - // (acts like a standard file-based web server). - final ServletHolder defaultServlet = new ServletHolder(new DefaultServlet()); - context.addServlet(defaultServlet, "/static/*"); - context.addServlet(defaultServlet, "/webclient/*"); - context.addServlet(defaultServlet, "/ws/*"); - context.addServlet(defaultServlet, "/images/*"); - context.addServlet(defaultServlet, "/javascripts/*"); - context.addServlet(defaultServlet, "/stylesheets/*"); - context.addServlet(defaultServlet, "/templates/*"); - - for (final Pair<String, ServletHolder> servlet : servletRegistry) { - context.addServlet(servlet.getSecond(), servlet.getFirst()); - } - - httpServer.setHandler(context); - - try { - httpServer.start(); - } catch (final Exception e) { // yes, .start() throws "Exception" - LOG.severe("Fatal error starting http server.", e); - return; - } - LOG.fine("WebSocket server running. --------"); - } - - /** - * Stops this server. - */ - public void stopServer() throws IOException { - try { - httpServer.stop(); // yes, .stop() throws "Exception" - } catch (final Exception e) { - LOG.warning("Fatal error stopping http server.", e); - } - LOG.fine("server shutdown."); - } -} Copied: trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java.txt (from rev 1265, trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java) =================================================================== --- trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java.txt (rev 0) +++ trunk/src/main/java/cc/kune/wave/server/CustomServerRpcProvider.java.txt 2011-03-07 17:08:07 UTC (rev 1269) @@ -0,0 +1,509 @@ +package cc.kune.wave.server; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import javax.servlet.Servlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.nio.SelectChannelConnector; +import org.eclipse.jetty.servlet.DefaultServlet; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.resource.ResourceCollection; +import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.websocket.WebSocket; +import org.eclipse.jetty.websocket.WebSocketServlet; +import org.ourproject.kune.rack.RackServletFilter; +import org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolAuthenticate; +import org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolAuthenticationResult; +import org.waveprotocol.box.server.CoreSettings; +import org.waveprotocol.box.server.authentication.SessionManager; +import org.waveprotocol.box.server.rpc.BaseUrlHelper; +import org.waveprotocol.box.server.rpc.MessageExpectingChannel; +import org.waveprotocol.box.server.rpc.ProtoCallback; +import org.waveprotocol.box.server.rpc.Rpc; +import org.waveprotocol.box.server.rpc.ServerRpcController; +import org.waveprotocol.box.server.rpc.SocketIOServerChannel; +import org.waveprotocol.box.server.rpc.WebSocketServerChannel; +import org.waveprotocol.box.server.util.NetUtils; +import org.waveprotocol.wave.model.util.Pair; +import org.waveprotocol.wave.model.wave.ParticipantId; +import org.waveprotocol.wave.util.logging.Log; + +import com.glines.socketio.server.SocketIOInbound; +import com.glines.socketio.server.SocketIOServlet; +import com.glines.socketio.server.transport.FlashSocketTransport; +import com.google.common.base.Preconditions; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.inject.Inject; +import com.google.inject.Injector; +import com.google.inject.name.Named; +import com.google.protobuf.Descriptors; +import com.google.protobuf.Descriptors.MethodDescriptor; +import com.google.protobuf.Message; +import com.google.protobuf.RpcCallback; +import com.google.protobuf.Service; +import com.google.protobuf.UnknownFieldSet; + +/** + * ServerRpcProvider can provide instances of type Service over an incoming + * network socket and service incoming RPCs to these services and their methods. + * + * + */ +public class CustomServerRpcProvider { + abstract class Connection implements ProtoCallback { + private final Map<Long, ServerRpcController> activeRpcs = new ConcurrentHashMap<Long, ServerRpcController>(); + + // The logged in user. + // Note: Due to this bug: + // http://code.google.com/p/wave-protocol/issues/detail?id=119, + // the field may be null on first connect and then set later using an + // RPC. + private ParticipantId loggedInUser; + + /** + * @param loggedInUser + * The currently logged in user, or null if no user is logged + * in. + */ + public Connection(final ParticipantId loggedInUser) { + this.loggedInUser = loggedInUser; + } + + private ParticipantId authenticate(final String token) { + final HttpSession session = sessionManager.getSessionFromToken(token); + final ParticipantId user = sessionManager.getLoggedInUser(session); + return user; + } + + protected void expectMessages(final MessageExpectingChannel channel) { + synchronized (registeredServices) { + for (final RegisteredServiceMethod serviceMethod : registeredServices.values()) { + channel.expectMessage(serviceMethod.service.getRequestPrototype(serviceMethod.method)); + LOG.fine("Expecting: " + serviceMethod.method.getFullName()); + } + } + channel.expectMessage(Rpc.CancelRpc.getDefaultInstance()); + } + + @Override + public void message(final long sequenceNo, final Message message) { + if (message instanceof Rpc.CancelRpc) { + final ServerRpcController controller = activeRpcs.get(sequenceNo); + if (controller == null) { + throw new IllegalStateException("Trying to cancel an RPC that is not active!"); + } else { + LOG.info("Cancelling open RPC " + sequenceNo); + controller.cancel(); + } + } else if (message instanceof ProtocolAuthenticate) { + // Workaround for bug: + // http://codereview.waveprotocol.org/224001/ + + // When we get this message, either the connection will not be + // logged in + // (loggedInUser == null) or the connection will have been + // authenticated + // via cookies + // (in which case loggedInUser must match the authenticated + // user, and + // this message has no + // effect). + + final ProtocolAuthenticate authMessage = (ProtocolAuthenticate) message; + final ParticipantId authenticatedAs = authenticate(authMessage.getToken()); + + Preconditions.checkArgument(authenticatedAs != null, "Auth token invalid"); + Preconditions.checkState(loggedInUser == null || loggedInUser.equals(authenticatedAs), + "Session already authenticated as a different user"); + + loggedInUser = authenticatedAs; + LOG.info("Session authenticated as " + loggedInUser); + sendMessage(sequenceNo, ProtocolAuthenticationResult.getDefaultInstance()); + } else if (registeredServices.containsKey(message.getDescriptorForType())) { + if (activeRpcs.containsKey(sequenceNo)) { + throw new IllegalStateException("Can't invoke a new RPC with a sequence number already in use."); + } else { + final RegisteredServiceMethod serviceMethod = registeredServices.get(message.getDescriptorForType()); + + // Create the internal ServerRpcController used to invoke + // the call. + final ServerRpcController controller = new ServerRpcControllerImpl(message, serviceMethod.service, + serviceMethod.method, loggedInUser, new RpcCallback<Message>() { + @Override + synchronized public void run(final Message message) { + if (message instanceof Rpc.RpcFinished + || !serviceMethod.method.getOptions().getExtension(Rpc.isStreamingRpc)) { + // This RPC is over - remove it from the + // map. + final boolean failed = message instanceof Rpc.RpcFinished ? ((Rpc.RpcFinished) message).getFailed() + : false; + LOG.fine("RPC " + sequenceNo + " is now finished, failed = " + failed); + if (failed) { + LOG.info("error = " + ((Rpc.RpcFinished) message).getErrorText()); + } + activeRpcs.remove(sequenceNo); + } + sendMessage(sequenceNo, message); + } + }); + + // Kick off a new thread specific to this RPC. + activeRpcs.put(sequenceNo, controller); + threadPool.execute(controller); + } + } else { + // Sent a message type we understand, but don't expect - + // erronous case! + throw new IllegalStateException("Got expected but unknown message (" + message + ") for sequence: " + + sequenceNo); + } + } + + protected abstract void sendMessage(long sequenceNo, Message message); + + @Override + public void unknown(final long sequenceNo, final String messageType, final String message) { + throw new IllegalStateException("Got unknown message (type: " + messageType + ", " + message + + ") for sequence: " + sequenceNo); + } + + @Override + public void unknown(final long sequenceNo, final String messageType, final UnknownFieldSet message) { + throw new IllegalStateException("Got unknown message (type: " + messageType + ", " + message + + ") for sequence: " + sequenceNo); + } + } + + /** + * Internal, static container class for any specific registered service + * method. + */ + static class RegisteredServiceMethod { + final MethodDescriptor method; + final Service service; + + RegisteredServiceMethod(final Service service, final MethodDescriptor method) { + this.service = service; + this.method = method; + } + } + class SocketIOConnection extends Connection { + private final SocketIOServerChannel socketChannel; + + SocketIOConnection(final ParticipantId loggedInUser) { + super(loggedInUser); + socketChannel = new SocketIOServerChannel(this); + LOG.info("New websocket connection set up for user " + loggedInUser); + expectMessages(socketChannel); + } + + public SocketIOServerChannel getWebSocketServerChannel() { + return socketChannel; + } + + @Override + protected void sendMessage(final long sequenceNo, final Message message) { + socketChannel.sendMessage(sequenceNo, message); + } + } + public class WaveSocketIOServlet extends SocketIOServlet { + @Override + protected SocketIOInbound doSocketIOConnect(final HttpServletRequest request, final String[] protocols) { + final ParticipantId loggedInUser = sessionManager.getLoggedInUser(request.getSession(false)); + + final SocketIOConnection connection = new SocketIOConnection(loggedInUser); + return connection.getWebSocketServerChannel(); + } + } + public class WaveWebSocketServlet extends WebSocketServlet { + @Override + protected WebSocket doWebSocketConnect(final HttpServletRequest request, final String protocol) { + final ParticipantId loggedInUser = sessionManager.getLoggedInUser(request.getSession(false)); + + final WebSocketConnection connection = new WebSocketConnection(loggedInUser); + return connection.getWebSocketServerChannel(); + } + } + class WebSocketConnection extends Connection { + private final WebSocketServerChannel socketChannel; + + WebSocketConnection(final ParticipantId loggedInUser) { + super(loggedInUser); + socketChannel = new WebSocketServerChannel(this); + LOG.info("New websocket connection set up for user " + loggedInUser); + expectMessages(socketChannel); + } + + public WebSocketServerChannel getWebSocketServerChannel() { + return socketChannel; + } + + @Override + protected void sendMessage(final long sequenceNo, final Message message) { + socketChannel.sendMessage(sequenceNo, message); + } + } + private static final Log LOG = Log.get(CustomServerRpcProvider.class); + + private static InetSocketAddress[] parseAddressList(final List<String> addressList) { + if (addressList == null || addressList.size() == 0) { + return new InetSocketAddress[0]; + } else { + final Set<InetSocketAddress> addresses = Sets.newHashSet(); + for (final String str : addressList) { + if (str.length() == 0) { + LOG.warning("Encountered empty address in http addresses list."); + } else { + try { + final InetSocketAddress address = NetUtils.parseHttpAddress(str); + if (!addresses.contains(address)) { + addresses.add(address); + } else { + LOG.warning("Ignoring duplicate address in http addresses list: Duplicate entry '" + str + + "' resolved to " + address.getAddress().getHostAddress()); + } + } catch (final IOException e) { + LOG.severe("Unable to process address " + str, e); + } + } + } + return addresses.toArray(new InetSocketAddress[0]); + } + } + private final String baseUrl; + + private final Integer flashsocketPolicyPort; + + private final InetSocketAddress[] httpAddresses; + + private Server httpServer = null; + + private final Set<Connection> incomingConnections = Sets.newHashSet(); + + private final org.eclipse.jetty.server.SessionManager jettySessionManager; + + // Mapping from incoming protocol buffer type -> specific handler. + private final Map<Descriptors.Descriptor, RegisteredServiceMethod> registeredServices = Maps.newHashMap(); + + private final String resourceBase; + + /** + * Set of servlets + */ + List<Pair<String, ServletHolder>> servletRegistry = Lists.newArrayList(); + + private final SessionManager sessionManager; + + private final ExecutorService threadPool; + + /** + * Construct a new ServerRpcProvider, hosting on the specified WebSocket + * addresses. + * + * Also accepts an ExecutorService for spawning managing threads. + */ + public CustomServerRpcProvider(final InetSocketAddress[] httpAddresses, final Integer flashsocketPolicyPort, + final String baseUrl, final String resourceBase, final ExecutorService threadPool, + final SessionManager sessionManager, final org.eclipse.jetty.server.SessionManager jettySessionManager) { + this.httpAddresses = httpAddresses; + this.flashsocketPolicyPort = flashsocketPolicyPort; + this.baseUrl = BaseUrlHelper.removeLastSlash(baseUrl); + this.resourceBase = resourceBase; + this.threadPool = threadPool; + this.sessionManager = sessionManager; + this.jettySessionManager = jettySessionManager; + } + + /** + * Constructs a new ServerRpcProvider with a default ExecutorService. + */ + public CustomServerRpcProvider(final InetSocketAddress[] httpAddresses, final Integer flashsocketPolicyPort, + final String baseUrl, final String resourceBase, final SessionManager sessionManager, + final org.eclipse.jetty.server.SessionManager jettySessionManager) { + this(httpAddresses, flashsocketPolicyPort, baseUrl, resourceBase, Executors.newCachedThreadPool(), + sessionManager, jettySessionManager); + } + + @Inject + public CustomServerRpcProvider(@Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) final List<String> httpAddresses, + @Named(CoreSettings.FLASHSOCKET_POLICY_PORT) final Integer flashsocketPolicyPort, + @Named(CoreSettings.HTTP_BASE_URL) final String baseUrl, + @Named(CoreSettings.RESOURCE_BASE) final String resourceBase, final SessionManager sessionManager, + final org.eclipse.jetty.server.SessionManager jettySessionManager) { + this(parseAddressList(httpAddresses), flashsocketPolicyPort, baseUrl, resourceBase, sessionManager, + jettySessionManager); + } + + /** + * Add a servlet to the servlet registry. This servlet will be attached to + * the specified URL pattern when the server is started up. + * + * @param urlPattern + * URL pattern for paths. Eg, '/foo', '/foo/*' + * @param servlet + * The servlet object to bind to the specified paths + * @return the {@link ServletHolder} that holds the servlet. + */ + public ServletHolder addServlet(final String urlPattern, final Servlet servlet) { + final ServletHolder servletHolder = new ServletHolder(servlet); + servletRegistry.add(new Pair<String, ServletHolder>(urlPattern, servletHolder)); + return servletHolder; + } + + /** + * @return a list of {@link SelectChannelConnector} each bound to a + * host:port pair form the list addresses. + */ + private List<SelectChannelConnector> getSelectChannelConnectors(final InetSocketAddress[] httpAddresses) { + final List<SelectChannelConnector> list = Lists.newArrayList(); + for (final InetSocketAddress address : httpAddresses) { + final SelectChannelConnector connector = new SelectChannelConnector(); + connector.setHost(address.getAddress().getHostAddress()); + connector.setPort(address.getPort()); + list.add(connector); + } + + return list; + } + + /** + * Returns the socket the WebSocket server is listening on. + */ + public SocketAddress getWebSocketAddress() { + if (httpServer == null) { + return null; + } else { + final Connector c = httpServer.getConnectors()[0]; + return new InetSocketAddress(c.getHost(), c.getLocalPort()); + } + } + + /** + * Register all methods provided by the given service type. + */ + public void registerService(final Service service) { + synchronized (registeredServices) { + for (final MethodDescriptor methodDescriptor : service.getDescriptorForType().getMethods()) { + registeredServices.put(methodDescriptor.getInputType(), new RegisteredServiceMethod(service, + methodDescriptor)); + } + } + } + + public void startWebSocketServer(final Injector injector) { + httpServer = new Server(); + + final List<SelectChannelConnector> connectors = getSelectChannelConnectors(httpAddresses); + if (connectors.isEmpty()) { + LOG.severe("No valid http end point address provided!"); + } + for (final SelectChannelConnector connector : connectors) { + httpServer.addConnector(connector); + } + + final WebAppContext context = new WebAppContext(); + + // FIXME This was with previous ServletContextHandler: needed? + // final ServletContextHandler context = new + // ServletContextHandler(ServletContextHandler.SESSIONS); + + if (jettySessionManager != null) { + context.getSessionHandler().setSessionManager(jettySessionManager); + } + final ResourceCollection resources = new ResourceCollection(new String[] { "src/main/webapp", resourceBase, }); + context.setBaseResource(resources); + context.setContextPath(baseUrl); + + context.setParentLoaderPriority(true); + context.setDescriptor("WEB-INF/web.xml"); + + context.setAttribute(RackServletFilter.INJECTOR_PARENT_ATTRIBUTE, injector); + + // Servlet where the websocket connection is served from. + final ServletHolder wsholder = new ServletHolder(new WaveWebSocketServlet()); + context.addServlet(wsholder, "/socket"); + // TODO(zamfi): fix to let messages span frames. + wsholder.setInitParameter("bufferSize", "" + 1024 * 1024); // 1M buffer + + // Servlet where the websocket connection is served from. + final ServletHolder sioholder = new ServletHolder(new WaveSocketIOServlet()); + context.addServlet(sioholder, "/socket.io/*"); + // TODO(zamfi): fix to let messages span frames. + sioholder.setInitParameter("bufferSize", "" + 1024 * 1024); // 1M buffer + // Set flash policy server parameters + String flashPolicyServerHost = "localhost"; + final StringBuilder flashPolicyAllowedPorts = new StringBuilder(); + /* + * Loop through addresses, collect list of ports, and determine if we + * are to use "localhost" of the AnyHost wildcard. + */ + for (final InetSocketAddress addr : httpAddresses) { + if (flashPolicyAllowedPorts.length() > 0) { + flashPolicyAllowedPorts.append(","); + } + flashPolicyAllowedPorts.append(addr.getPort()); + if (!addr.getAddress().isLoopbackAddress()) { + // Until it's possible to pass a list of address, this is the + // only valid alternative. + flashPolicyServerHost = "0.0.0.0"; + } + } + sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_SERVER_HOST_KEY, flashPolicyServerHost); + sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_SERVER_PORT_KEY, "" + flashsocketPolicyPort); + // TODO: Change to use the public http address and all other bound + // addresses. + sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_DOMAIN_KEY, "*"); + sioholder.setInitParameter(FlashSocketTransport.FLASHPOLICY_PORTS_KEY, flashPolicyAllowedPorts.toString()); + + // Serve the static content and GWT web client with the default servlet + // (acts like a standard file-based web server). + final ServletHolder defaultServlet = new ServletHolder(new DefaultServlet()); + context.addServlet(defaultServlet, "/static/*"); + context.addServlet(defaultServlet, "/webclient/*"); + context.addServlet(defaultServlet, "/ws/*"); + context.addServlet(defaultServlet, "/images/*"); + context.addServlet(defaultServlet, "/javascripts/*"); + context.addServlet(defaultServlet, "/stylesheets/*"); + context.addServlet(defaultServlet, "/templates/*"); + + for (final Pair<String, ServletHolder> servlet : servletRegistry) { + context.addServlet(servlet.getSecond(), servlet.getFirst()); + } + + httpServer.setHandler(context); + + try { + httpServer.start(); + } catch (final Exception e) { // yes, .start() throws "Exception" + LOG.severe("Fatal error starting http server.", e); + return; + } + LOG.fine("WebSocket server running. --------"); + } + + /** + * Stops this server. + */ + public void stopServer() throws IOException { + try { + httpServer.stop(); // yes, .stop() throws "Exception" + } catch (final Exception e) { + LOG.warning("Fatal error stopping http server.", e); + } + LOG.fine("server shutdown."); + } +} Modified: trunk/src/main/java/cc/kune/wave/server/CustomUserRegistrationServlet.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/CustomUserRegistrationServlet.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/server/CustomUserRegistrationServlet.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -32,7 +32,6 @@ import org.waveprotocol.box.server.persistence.AccountStore; import org.waveprotocol.box.server.persistence.PersistenceException; import org.waveprotocol.box.server.rpc.AuthenticationServlet; -import org.waveprotocol.box.server.rpc.BaseUrlHelper; import org.waveprotocol.wave.model.wave.InvalidParticipantAddress; import org.waveprotocol.wave.model.wave.ParticipantId; import org.waveprotocol.wave.util.logging.Log; @@ -48,18 +47,15 @@ */ public class CustomUserRegistrationServlet extends HttpServlet { private final AccountStore accountStore; - private final String baseUrl; private final String domain; private final Log LOG = Log.get(CustomUserRegistrationServlet.class); @Inject public CustomUserRegistrationServlet(final AccountStore accountStore, - @Named(CoreSettings.WAVE_SERVER_DOMAIN) final String domain, - @Named(CoreSettings.HTTP_BASE_URL) final String baseUrl) { + @Named(CoreSettings.WAVE_SERVER_DOMAIN) final String domain) { this.accountStore = accountStore; this.domain = domain; - this.baseUrl = BaseUrlHelper.removeLastSlash(baseUrl); } @Override @@ -151,6 +147,6 @@ final HttpServletResponse dest) throws IOException { dest.setCharacterEncoding("UTF-8"); dest.setContentType("text/html;charset=utf-8"); - UserRegistrationPage.write(dest.getWriter(), new GxpContext(locale), domain, baseUrl, message, responseType); + UserRegistrationPage.write(dest.getWriter(), new GxpContext(locale), domain, message, responseType); } } Modified: trunk/src/main/java/cc/kune/wave/server/CustomWaveClientServlet.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/CustomWaveClientServlet.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/server/CustomWaveClientServlet.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -34,7 +34,6 @@ import org.waveprotocol.box.server.authentication.SessionManager; import org.waveprotocol.box.server.gxp.TopBar; import org.waveprotocol.box.server.gxp.WaveClientPage; -import org.waveprotocol.box.server.rpc.BaseUrlHelper; import org.waveprotocol.box.server.util.RandomBase64Generator; import org.waveprotocol.wave.client.util.ClientFlagsBase; import org.waveprotocol.wave.common.bootstrap.FlagConstants; @@ -64,7 +63,6 @@ } } - private final String baseUrl; private final String domain; private final SessionManager sessionManager; private final Boolean useSocketIO; @@ -74,11 +72,9 @@ */ @Inject public CustomWaveClientServlet(@Named(CoreSettings.WAVE_SERVER_DOMAIN) final String domain, - @Named(CoreSettings.USE_SOCKETIO) final Boolean useSocketIO, - @Named(CoreSettings.HTTP_BASE_URL) final String baseUrl, final SessionManager sessionManager) { + @Named(CoreSettings.USE_SOCKETIO) final Boolean useSocketIO, final SessionManager sessionManager) { this.domain = domain; this.useSocketIO = useSocketIO; - this.baseUrl = BaseUrlHelper.removeLastSlash(baseUrl); this.sessionManager = sessionManager; } @@ -87,13 +83,13 @@ final ParticipantId id = sessionManager.getLoggedInUser(request.getSession(false)); // Eventually, it would be nice to show users who aren't logged in the - // public waves. + // public waves., // However, public waves aren't implemented yet. For now, we'll just // redirect users // who haven't signed in to the sign in page. // COMMENTED (vjrj) if (id == null) { - response.sendRedirect(baseUrl + sessionManager.getLoginUrl(baseUrl + "/")); + response.sendRedirect(sessionManager.getLoginUrl("/")); return; } @@ -108,7 +104,7 @@ try { WaveClientPage.write(response.getWriter(), new GxpContext(request.getLocale()), getSessionJson(request.getSession(false)), getClientFlags(request), - TopBar.getGxpClosure(username, userDomain, baseUrl), useSocketIO, baseUrl); + TopBar.getGxpClosure(username, userDomain), useSocketIO); } catch (final IOException e) { LOG.warning("Failed to write GXP for request " + request, e); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); Modified: trunk/src/main/java/cc/kune/wave/server/WaveMain.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/WaveMain.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/server/WaveMain.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -39,7 +39,10 @@ import org.waveprotocol.box.server.robots.dataapi.DataApiServlet; import org.waveprotocol.box.server.robots.passive.RobotsGateway; import org.waveprotocol.box.server.rpc.AttachmentServlet; +import org.waveprotocol.box.server.rpc.AuthenticationServlet; import org.waveprotocol.box.server.rpc.FetchServlet; +import org.waveprotocol.box.server.rpc.SearchServlet; +import org.waveprotocol.box.server.rpc.ServerRpcProvider; import org.waveprotocol.box.server.rpc.SignOutServlet; import org.waveprotocol.box.server.waveserver.WaveBus; import org.waveprotocol.box.server.waveserver.WaveServerException; @@ -88,7 +91,7 @@ federationManager.startFederation(); } - private static void initializeFrontend(final Injector injector, final CustomServerRpcProvider server, + private static void initializeFrontend(final Injector injector, final ServerRpcProvider server, final WaveBus waveBus) throws WaveServerException { final HashedVersionFactory hashFactory = injector.getInstance(HashedVersionFactory.class); final WaveletProvider provider = injector.getInstance(WaveletProvider.class); @@ -120,15 +123,17 @@ waveServer.initialize(); } - private static void initializeServlets(final Injector injector, final CustomServerRpcProvider server) { + private static void initializeServlets(final Injector injector, final ServerRpcProvider server) { server.addServlet("/attachment/*", injector.getInstance(AttachmentServlet.class)); - server.addServlet(SessionManager.SIGN_IN_URL, injector.getInstance(CustomAuthenticationServlet.class)); + server.addServlet(SessionManager.SIGN_IN_URL, injector.getInstance(AuthenticationServlet.class)); server.addServlet("/auth/signout", injector.getInstance(SignOutServlet.class)); server.addServlet("/auth/register", injector.getInstance(CustomUserRegistrationServlet.class)); server.addServlet("/fetch/*", injector.getInstance(FetchServlet.class)); + server.addServlet("/search/*", injector.getInstance(SearchServlet.class)); + server.addServlet("/robot/dataapi", injector.getInstance(DataApiServlet.class)); server.addServlet(DataApiOAuthServlet.DATA_API_OAUTH_PATH + "/*", injector.getInstance(DataApiOAuthServlet.class)); @@ -144,7 +149,8 @@ final ServletHolder proxyServletHolder = server.addServlet("/gadgets/*", proxyServlet); proxyServletHolder.setInitParameter("HostHeader", gadgetServerHostname); - server.addServlet("/", injector.getInstance(CustomWaveClientServlet.class)); + // server.addServlet("/", + // injector.getInstance(CustomWaveClientServlet.class)); } public static void main(final String... args) { @@ -179,7 +185,7 @@ final Injector injector = settingsInjector.createChildInjector(new ServerModule(enableFederation), new RobotApiModule(), federationModule, persistenceModule); - final CustomServerRpcProvider server = injector.getInstance(CustomServerRpcProvider.class); + final ServerRpcProvider server = injector.getInstance(ServerRpcProvider.class); final WaveBus waveBus = injector.getInstance(WaveBus.class); initializeServer(injector); Deleted: trunk/src/main/java/cc/kune/wave/server/WaveStarter.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/WaveStarter.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/cc/kune/wave/server/WaveStarter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -1,193 +0,0 @@ -/** - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package cc.kune.wave.server; - -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.servlets.ProxyServlet; -import org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolWaveClientRpc; -import org.waveprotocol.box.server.CoreSettings; -import org.waveprotocol.box.server.ServerModule; -import org.waveprotocol.box.server.authentication.AccountStoreHolder; -import org.waveprotocol.box.server.authentication.SessionManager; -import org.waveprotocol.box.server.frontend.ClientFrontend; -import org.waveprotocol.box.server.frontend.ClientFrontendImpl; -import org.waveprotocol.box.server.frontend.WaveClientRpcImpl; -import org.waveprotocol.box.server.persistence.AccountStore; -import org.waveprotocol.box.server.persistence.PersistenceException; -import org.waveprotocol.box.server.persistence.PersistenceModule; -import org.waveprotocol.box.server.persistence.SignerInfoStore; -import org.waveprotocol.box.server.robots.RobotApiModule; -import org.waveprotocol.box.server.robots.RobotRegistrationServlet; -import org.waveprotocol.box.server.robots.active.ActiveApiServlet; -import org.waveprotocol.box.server.robots.dataapi.DataApiOAuthServlet; -import org.waveprotocol.box.server.robots.dataapi.DataApiServlet; -import org.waveprotocol.box.server.robots.passive.RobotsGateway; -import org.waveprotocol.box.server.rpc.AttachmentServlet; -import org.waveprotocol.box.server.rpc.AuthenticationServlet; -import org.waveprotocol.box.server.rpc.FetchServlet; -import org.waveprotocol.box.server.rpc.ServerRpcProvider; -import org.waveprotocol.box.server.rpc.SignOutServlet; -import org.waveprotocol.box.server.waveserver.WaveBus; -import org.waveprotocol.box.server.waveserver.WaveServerException; -import org.waveprotocol.box.server.waveserver.WaveletProvider; -import org.waveprotocol.wave.crypto.CertPathStore; -import org.waveprotocol.wave.federation.FederationSettings; -import org.waveprotocol.wave.federation.FederationTransport; -import org.waveprotocol.wave.federation.noop.NoOpFederationModule; -import org.waveprotocol.wave.federation.xmpp.XmppFederationModule; -import org.waveprotocol.wave.model.version.HashedVersionFactory; -import org.waveprotocol.wave.util.settings.SettingsBinder; - -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Module; -import com.google.inject.name.Names; - -public class WaveStarter { - - private static final Log LOG = LogFactory.getLog(WaveStarter.class); - public static final String PROPERTIES_FILE_KEY = "wave-server.properties"; - - private static Module buildFederationModule(final Injector settingsInjector, final boolean enableFederation) - throws ConfigurationException { - Module federationModule; - if (enableFederation) { - federationModule = settingsInjector.getInstance(XmppFederationModule.class); - } else { - federationModule = settingsInjector.getInstance(NoOpFederationModule.class); - } - return federationModule; - } - - private static void initializeFederation(final Injector injector) { - final FederationTransport federationManager = injector.getInstance(FederationTransport.class); - federationManager.startFederation(); - } - - private static void initializeFrontend(final Injector injector, final ServerRpcProvider server, - final WaveBus waveBus) throws WaveServerException { - final HashedVersionFactory hashFactory = injector.getInstance(HashedVersionFactory.class); - final WaveletProvider provider = injector.getInstance(WaveletProvider.class); - final ClientFrontend frontend = ClientFrontendImpl.create(hashFactory, provider, waveBus); - - final ProtocolWaveClientRpc.Interface rpcImpl = WaveClientRpcImpl.create(frontend, false); - server.registerService(ProtocolWaveClientRpc.newReflectiveService(rpcImpl)); - } - - private static void initializeRobots(final Injector injector, final WaveBus waveBus) { - final RobotsGateway robotsGateway = injector.getInstance(RobotsGateway.class); - waveBus.subscribe(robotsGateway); - } - - private static void initializeServer(final Injector injector) throws PersistenceException, WaveServerException { - final AccountStore accountStore = injector.getInstance(AccountStore.class); - accountStore.initializeAccountStore(); - AccountStoreHolder.init(accountStore, - injector.getInstance(Key.get(String.class, Names.named(CoreSettings.WAVE_SERVER_DOMAIN)))); - - // Initialize the SignerInfoStore. - final CertPathStore certPathStore = injector.getInstance(CertPathStore.class); - if (certPathStore instanceof SignerInfoStore) { - ((SignerInfoStore) certPathStore).initializeSignerInfoStore(); - } - - // Initialize the server. - final WaveletProvider waveServer = injector.getInstance(WaveletProvider.class); - waveServer.initialize(); - } - - private static void initializeServlets(final Injector injector, final ServerRpcProvider server) { - server.addServlet("/attachment/*", injector.getInstance(AttachmentServlet.class)); - - server.addServlet(SessionManager.SIGN_IN_URL, injector.getInstance(AuthenticationServlet.class)); - server.addServlet("/auth/signout", injector.getInstance(SignOutServlet.class)); - server.addServlet("/auth/register", injector.getInstance(CustomUserRegistrationServlet.class)); - - server.addServlet("/fetch/*", injector.getInstance(FetchServlet.class)); - - server.addServlet("/robot/dataapi", injector.getInstance(DataApiServlet.class)); - server.addServlet(DataApiOAuthServlet.DATA_API_OAUTH_PATH + "/*", - injector.getInstance(DataApiOAuthServlet.class)); - server.addServlet("/robot/dataapi/rpc", injector.getInstance(DataApiServlet.class)); - server.addServlet("/robot/register/*", injector.getInstance(RobotRegistrationServlet.class)); - server.addServlet("/robot/rpc", injector.getInstance(ActiveApiServlet.class)); - - final String gadgetServerHostname = injector.getInstance(Key.get(String.class, - Names.named(CoreSettings.GADGET_SERVER_HOSTNAME))); - final ProxyServlet.Transparent proxyServlet = new ProxyServlet.Transparent("/gadgets", "http", - gadgetServerHostname, injector.getInstance(Key.get(int.class, - Names.named(CoreSettings.GADGET_SERVER_PORT))), "/gadgets"); - final ServletHolder proxyServletHolder = server.addServlet("/gadgets/*", proxyServlet); - proxyServletHolder.setInitParameter("HostHeader", gadgetServerHostname); - - server.addServlet("/", injector.getInstance(CustomWaveClientServlet.class)); - } - - public WaveStarter() { - } - - public Injector run(final Module coreSettings) throws PersistenceException, ConfigurationException, - WaveServerException { - Injector settingsInjector = Guice.createInjector(coreSettings); - final boolean enableFederation = settingsInjector.getInstance(Key.get(Boolean.class, - Names.named(CoreSettings.ENABLE_FEDERATION))); - - if (enableFederation) { - final Module federationSettings = SettingsBinder.bindSettings(PROPERTIES_FILE_KEY, FederationSettings.class); - // This MUST happen first, or bindings will fail if federation is - // enabled. - settingsInjector = settingsInjector.createChildInjector(federationSettings); - } - - final Module federationModule = buildFederationModule(settingsInjector, enableFederation); - final PersistenceModule persistenceModule = settingsInjector.getInstance(PersistenceModule.class); - final Injector injector = settingsInjector.createChildInjector(new ServerModule(enableFederation), - new RobotApiModule(), federationModule, persistenceModule); - - final ServerRpcProvider server = injector.getInstance(ServerRpcProvider.class); - final WaveBus waveBus = injector.getInstance(WaveBus.class); - - initializeServer(injector); - initializeServlets(injector, server); - initializeRobots(injector, waveBus); - initializeFrontend(injector, server, waveBus); - initializeFederation(injector); - - LOG.info("Starting server"); - server.startWebSocketServer(); - return injector; - } - - public Injector runMain() { - try { - final Module coreSettings = CustomSettingsBinder.bindSettings(PROPERTIES_FILE_KEY, CoreSettings.class); - return run(coreSettings); - } catch (final PersistenceException e) { - LOG.error("PersistenceException when running server:", e); - } catch (final ConfigurationException e) { - LOG.error("ConfigurationException when running server:", e); - } catch (final WaveServerException e) { - LOG.error("WaveServerException when running server:", e); - } - return null; - } -} Modified: trunk/src/main/java/org/ourproject/kune/platf/server/i18n/I18nTranslationServiceDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/i18n/I18nTranslationServiceDefault.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/org/ourproject/kune/platf/server/i18n/I18nTranslationServiceDefault.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -35,13 +35,13 @@ private final I18nTranslationManager translationManager; - // private final Provider<UserSession> userSessionProvider; + private final Provider<UserSession> userSessionProvider; @Inject public I18nTranslationServiceDefault(final I18nTranslationManager translationManager, final Provider<UserSession> userSessionProvider) { this.translationManager = translationManager; - // this.userSessionProvider = userSessionProvider; + this.userSessionProvider = userSessionProvider; } /** @@ -57,13 +57,13 @@ public String t(final String text) { String language; - // UserSession userSession = userSessionProvider.get(); - // if (userSession.isUserLoggedIn()) { - // language = userSession.getUser().getLanguage().getCode(); - // } else { - language = I18nTranslation.DEFAULT_LANG; - // } - String encodeText = TextUtils.escapeHtmlLight(text); + final UserSession userSession = userSessionProvider.get(); + if (userSession.isUserLoggedIn()) { + language = userSession.getUser().getLanguage().getCode(); + } else { + language = I18nTranslation.DEFAULT_LANG; + } + final String encodeText = TextUtils.escapeHtmlLight(text); String translation = translationManager.getTranslation(language, text); if (translation == UNTRANSLATED_VALUE) { // Not translated but in db, return text Modified: trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -152,7 +152,7 @@ public void setSocialNetworkVisibility(final String userHash, final StateToken token, final SocialNetworkVisibility visibility) { final Group group = groupManager.findByShortName(token.getGroup()); - group.getSocialNetwork().setVisibility(SocialNetworkVisibility.valueOf(visibility.toString())); + group.getSocialNetwork().setVisibility(visibility); } @Override Modified: trunk/src/main/java/org/ourproject/kune/platf/server/rpc/UserRPC.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/rpc/UserRPC.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/org/ourproject/kune/platf/server/rpc/UserRPC.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -164,7 +164,7 @@ if (!groupToken.getGroup().equals(user.getShortName())) { throw new AccessViolationException(); } - user.setBuddiesVisibility(UserBuddiesVisibility.valueOf(visibility.toString())); + user.setBuddiesVisibility(visibility); } } Modified: trunk/src/main/java/org/ourproject/kune/rack/RackServletFilter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/rack/RackServletFilter.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/java/org/ourproject/kune/rack/RackServletFilter.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -35,6 +35,7 @@ import org.ourproject.kune.platf.server.ServerException; import org.ourproject.kune.rack.dock.Dock; import org.ourproject.kune.rack.dock.RequestMatcher; +import org.waveprotocol.box.server.rpc.ServerRpcProvider; import com.google.inject.Injector; @@ -69,8 +70,8 @@ } } - public static final String INJECTOR_ATTRIBUTE = Injector.class.getName(); - public static final String INJECTOR_PARENT_ATTRIBUTE = Injector.class.getName() + "Parent"; + public static final String INJECTOR_ATTRIBUTE = Injector.class.getName() + "Child"; + public static final String INJECTOR_PARENT_ATTRIBUTE = ServerRpcProvider.INJECTOR_ATTRIBUTE; private static final Log LOG = LogFactory.getLog(RackServletFilter.class); private static final String MODULE_PARAMETER = RackModule.class.getName(); private List<Dock> docks; Modified: trunk/src/main/resources/wave-server.properties =================================================================== --- trunk/src/main/resources/wave-server.properties 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/main/resources/wave-server.properties 2011-03-07 17:08:07 UTC (rev 1269) @@ -6,10 +6,9 @@ # A comma separated list of address on which to listen for connections. # Each address is a comma separated host:port pair. -http_frontend_public_address = localhost:9898 +http_frontend_public_address = localhost:8888 http_frontend_addresses = ${http_frontend_public_address} -http_baseurl = / -resource_base = target/kune-0.0.7/ +resource_bases = target/kune-0.0.7/,src/main/webapp/ ### Server-specific variables ### Modified: trunk/src/test/java/org/ourproject/kune/platf/server/mapper/MapperTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/mapper/MapperTest.java 2011-03-02 01:35:30 UTC (rev 1268) +++ trunk/src/test/java/org/ourproject/kune/platf/server/mapper/MapperTest.java 2011-03-07 17:08:07 UTC (rev 1269) @@ -325,11 +325,11 @@ buddies.add(user); budData.setBuddies(buddies); final SocialNetworkData snResult = new SocialNetworkData(SocialNetworkVisibility.onlymembers, sn, part, - UserBuddiesVisibility.onlyyou, budData, new AccessRights(false, false, true), true, true); + UserBuddiesVisibility.yourbuddies, budData, new AccessRights(false, false, true), true, true); final SocialNetworkDataDTO map = mapper.map(snResult, SocialNetworkDataDTO.class); assertNotNull(map); assertEquals(SocialNetworkVisibility.onlymembers, map.getSocialNetworkVisibility()); - assertEquals(UserBuddiesVisibility.onlyyou, map.getUserBuddiesVisibility()); + assertEquals(UserBuddiesVisibility.yourbuddies, map.getUserBuddiesVisibility()); assertEquals("test", map.getGroupMembers().getAccessLists().getAdmins().getList().get(0).getShortName()); assertEquals("test", map.getUserParticipation().getGroupsIsAdmin().get(0).getShortName()); assertEquals("usertest", map.getUserBuddies().getBuddies().get(0).getShortName());
participants (1)
-
Vicente J. Ruiz Jurado