From 6c38eefcbe173456c279da2ba417687453001093 Mon Sep 17 00:00:00 2001 From: schrom01 Date: Tue, 18 Oct 2022 12:17:51 +0200 Subject: [PATCH] initial commit --- build.gradle | 26 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 ++ gradlew.bat | 89 + settings.gradle | 10 + src/ch/zhaw/ads/ADS5_2_test.java | 84 + src/ch/zhaw/ads/ADS5_3_test.java | 61 + src/ch/zhaw/ads/ADS5_4_test.java | 61 + src/ch/zhaw/ads/ADS5_5_test.java | 56 + src/ch/zhaw/ads/AnyServer.java | 15 + src/ch/zhaw/ads/CommandExecutor.java | 20 + src/ch/zhaw/ads/Competitor.java | 67 + src/ch/zhaw/ads/ExBox.java | 13 + src/ch/zhaw/ads/ExBoxFrame.java | 294 ++ src/ch/zhaw/ads/ExBoxJUnit.java | 92 + src/ch/zhaw/ads/GraphicPanel.java | 84 + src/ch/zhaw/ads/MyVisitor.java | 20 + src/ch/zhaw/ads/RangZuerich.csv | 3166 ++++++++++++++++++++++ src/ch/zhaw/ads/RankingTreeServer.java | 37 + src/ch/zhaw/ads/ServerFactory.java | 76 + src/ch/zhaw/ads/SortedBinaryTree.java | 125 + src/ch/zhaw/ads/Traversal.java | 15 + src/ch/zhaw/ads/Tree.java | 25 + src/ch/zhaw/ads/TreeNode.java | 22 + src/ch/zhaw/ads/TreeTraversal.java | 21 + src/ch/zhaw/ads/Visitor.java | 7 + 27 files changed, 4725 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/ch/zhaw/ads/ADS5_2_test.java create mode 100644 src/ch/zhaw/ads/ADS5_3_test.java create mode 100644 src/ch/zhaw/ads/ADS5_4_test.java create mode 100644 src/ch/zhaw/ads/ADS5_5_test.java create mode 100644 src/ch/zhaw/ads/AnyServer.java create mode 100644 src/ch/zhaw/ads/CommandExecutor.java create mode 100644 src/ch/zhaw/ads/Competitor.java create mode 100644 src/ch/zhaw/ads/ExBox.java create mode 100644 src/ch/zhaw/ads/ExBoxFrame.java create mode 100644 src/ch/zhaw/ads/ExBoxJUnit.java create mode 100644 src/ch/zhaw/ads/GraphicPanel.java create mode 100644 src/ch/zhaw/ads/MyVisitor.java create mode 100644 src/ch/zhaw/ads/RangZuerich.csv create mode 100644 src/ch/zhaw/ads/RankingTreeServer.java create mode 100644 src/ch/zhaw/ads/ServerFactory.java create mode 100644 src/ch/zhaw/ads/SortedBinaryTree.java create mode 100644 src/ch/zhaw/ads/Traversal.java create mode 100644 src/ch/zhaw/ads/Tree.java create mode 100644 src/ch/zhaw/ads/TreeNode.java create mode 100644 src/ch/zhaw/ads/TreeTraversal.java create mode 100644 src/ch/zhaw/ads/Visitor.java diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..2430006 --- /dev/null +++ b/build.gradle @@ -0,0 +1,26 @@ +plugins { + id 'application' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.junit.jupiter:junit-jupiter:5.9.0' + implementation 'org.junit.platform:junit-platform-engine:1.9.0' + implementation 'org.junit.platform:junit-platform-launcher:1.9.0' +} + +application { + mainClass = 'ch.zhaw.ads.ExBox' +} + +sourceSets { + main.java.srcDirs = ['src'] + test.java.srcDirs = ['src'] +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..41d9927a4d4fb3f96a785543079b8df6723c946b GIT binary patch literal 59821 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..aa991fc --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# 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 +# +# https://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. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..81ac7b3 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.4.2/userguide/multi_project_builds.html + */ + +rootProject.name = 'ADS Praktikum 5' diff --git a/src/ch/zhaw/ads/ADS5_2_test.java b/src/ch/zhaw/ads/ADS5_2_test.java new file mode 100644 index 0000000..1485e08 --- /dev/null +++ b/src/ch/zhaw/ads/ADS5_2_test.java @@ -0,0 +1,84 @@ +package ch.zhaw.ads; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @(#)TreeTest.java + * + * + * @author K Rege + * @version 1.00 2018/3/17 + * @version 1.01 2021/8/1 + */ +public class ADS5_2_test { + Tree tree; + + @BeforeEach + public void setUp() { + tree = new SortedBinaryTree<>(); + tree.add("B"); + tree.add("A"); + tree.add("C"); + tree.add("D"); + } + + @Test + public void testInorder() { + Visitor v = new MyVisitor<>(); + tree.traversal().inorder(v); + assertEquals("ABCD", v.toString(), "inorder"); + } + + @Test + public void testPreorder() { + Visitor v = new MyVisitor<>(); + tree.traversal().preorder(v); + assertEquals("BACD", v.toString(), "preorder"); + } + + @Test + public void testPostorder() { + Visitor v = new MyVisitor<>(); + tree.traversal().postorder(v); + assertEquals("ADCB", v.toString(), "postorder"); + } + + @Test + public void testLevelorder() { + Visitor v = new MyVisitor<>(); + tree.traversal().levelorder(v); + assertEquals("BACD", v.toString(), "levelorder"); + } + + @Test + public void testMixed() { + Tree tree = new SortedBinaryTree<>(); + List list = new LinkedList<>(); + for (int i = 0; i < 1000; i++) { + char c = (char) ('A' + (Math.random() * 26)); + int op = (int) (Math.random() * 2); + switch (op) { + case 0: + list.add(Character.toString(c)); + tree.add(Character.toString(c)); + break; + case 1: + list.remove(Character.toString(c)); + tree.remove(Character.toString(c)); + break; + } + } + Collections.sort(list); + String expected = String.join("", list); + Visitor v = new MyVisitor<>(); + tree.traversal().inorder(v); + assertEquals(expected, v.toString(), "mixed"); + } +} diff --git a/src/ch/zhaw/ads/ADS5_3_test.java b/src/ch/zhaw/ads/ADS5_3_test.java new file mode 100644 index 0000000..11a8dcc --- /dev/null +++ b/src/ch/zhaw/ads/ADS5_3_test.java @@ -0,0 +1,61 @@ +package ch.zhaw.ads; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ADS5_3_test { + Tree rankGood; + Tree rankTest; + String textGood; + String textTest; + + public Tree createTree(String rankingText) { + Tree competitorTree = new SortedBinaryTree<>(); + String[] lines = rankingText.split("\n"); + for (String line : lines) { + String name = line.split(";")[0]; + String time = line.split(";")[1]; + competitorTree.add(new Competitor(0, name, time)); + } + return competitorTree; + } + + public String createSortedText(Tree competitorTree) { + AtomicInteger rank = new AtomicInteger(1); + StringBuilder sb = new StringBuilder(); + competitorTree.traversal().inorder(c -> {c.setRank(rank.getAndIncrement()); sb.append(c).append("\n");}); + return sb.toString(); + } + + @BeforeEach + public void setUp() { + String rangliste = "Mueller Stefan;02:31:14\n" + + "Marti Adrian;02:30:09\n" + + "Kiptum Daniel;02:11:31\n" + + "Ancay Tarcis;02:20:02\n" + + "Kreibuhl Christian;02:21:47\n" + + "Ott Michael;02:33:48\n" + + "Menzi Christoph;02:27:26\n" + + "Oliver Ruben;02:32:12\n" + + "Elmer Beat;02:33:53\n" + + "Kuehni Martin;02:33:36\n"; + rankGood = createTree(rangliste); + textGood = createSortedText(rankGood); + rankTest = new RankingTreeServer().createTree(rangliste); + textTest = new RankingTreeServer().createSortedText(rankTest); + } + + @Test + public void testCreateText() { + String[] good = textGood.split("\n"); + String[] test = textTest.split("\n"); + assertEquals(good.length, test.length, "length"); + for (int i = 0; i < good.length;i++) { + assertEquals(good[i], test[i], "rangliste["+i+"]"); + } + } +} diff --git a/src/ch/zhaw/ads/ADS5_4_test.java b/src/ch/zhaw/ads/ADS5_4_test.java new file mode 100644 index 0000000..99dc44d --- /dev/null +++ b/src/ch/zhaw/ads/ADS5_4_test.java @@ -0,0 +1,61 @@ +package ch.zhaw.ads; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.LinkedList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @(#)TreeTest.java + * + * + * @author K Rege + * @version 1.00 2018/3/17 + * @version 1.01 2021/8/1 + */ +public class ADS5_4_test { + Tree tree; + + @BeforeEach + public void setUp() { + tree = new SortedBinaryTree<>(); + tree.add("B"); + tree.add("A"); + tree.add("C"); + tree.add("D"); + } + + @Test + public void testHeight() { + assertEquals(3, tree.height(), "height"); + } + + @Test + public void testSize() { + assertEquals(4, tree.size(), "size"); + } + + @Test + public void testSizeMixed() { + Tree tree = new SortedBinaryTree<>(); + List list = new LinkedList<>(); + for (int i = 0; i < 1000; i++) { + char c = (char) ('A' + (Math.random() * 26)); + int op = (int) (Math.random() * 2); + switch (op) { + case 0: + list.add(Character.toString(c)); + tree.add(Character.toString(c)); + break; + case 1: + list.remove(Character.toString(c)); + tree.remove(Character.toString(c)); + break; + } + } + assertEquals(list.size(), tree.size()); + } +} diff --git a/src/ch/zhaw/ads/ADS5_5_test.java b/src/ch/zhaw/ads/ADS5_5_test.java new file mode 100644 index 0000000..a3b95ce --- /dev/null +++ b/src/ch/zhaw/ads/ADS5_5_test.java @@ -0,0 +1,56 @@ +package ch.zhaw.ads; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @(#)TreeTest.java + * + * + * @author K Rege + * @version 1.00 2018/3/17 + * @version 1.01 2021/8/1 + */ +public class ADS5_5_test { + Tree tree; + + @BeforeEach + public void setUp() { + tree = new SortedBinaryTree<>(); + tree.add("B"); + tree.add("A"); + tree.add("C"); + tree.add("D"); + } + + @Test + public void testInterval() { + char left = 'K'; + char right = 'O'; + + for (int i = 0; i < 200; i++) { + char c = (char) ('A' + (Math.random() * 26)); + tree.add(Character.toString(c)); + } + // get all elements with inorder + Visitor v = new MyVisitor<>(); + tree.traversal().inorder(v); + int count = 0; + String s = v.toString(); + for (int i = 0; i < s.length(); i++) { + if (s.charAt(i) >= left && s.charAt(i) <= right) count++; + } + // now interval + v = new MyVisitor<>(); + tree.traversal().interval(Character.toString(left), Character.toString(right), v); + s = v.toString(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + assertTrue(c >= left && c <= right, c + " in interval "+left+" "+right); + } + assertEquals(count, s.length(), "size"); + } +} diff --git a/src/ch/zhaw/ads/AnyServer.java b/src/ch/zhaw/ads/AnyServer.java new file mode 100644 index 0000000..cf89f5f --- /dev/null +++ b/src/ch/zhaw/ads/AnyServer.java @@ -0,0 +1,15 @@ +package ch.zhaw.ads; + +/** + * AnyServer -- Praktikum Experimentierkasten -- ADS + * + * @author E. Mumprecht + * @version 1.0 -- Geruest fuer irgendeinen Server + */ +public class AnyServer implements CommandExecutor { + //----- Dies implementiert das CommandExecutor Interface. + @Override + public String execute(String command) { + return "Die Eingabe ist \"" + command + "\"\n"; + } +} diff --git a/src/ch/zhaw/ads/CommandExecutor.java b/src/ch/zhaw/ads/CommandExecutor.java new file mode 100644 index 0000000..bb2a018 --- /dev/null +++ b/src/ch/zhaw/ads/CommandExecutor.java @@ -0,0 +1,20 @@ +package ch.zhaw.ads; + +/** + * CommandExecutor -- Praktikum Experimentierkasten -- SW3 Dieses Interface muss + * von jedem Server implementiert werden. + * + * @author E. Mumprecht + * @version 1.0 -- Geruest fuer irgendeinen Server + * @version 1.1 -- K. Rege Fehlerueckgabe hinzugefuegt + */ +public interface CommandExecutor { + /** + * execute -- nimmt eine Kommandozeile, tut irgendetwas gescheites, und + * berichtet das Resultat. + * + * @param command Kommandozeile + * @return Resultat, ueblicherweise eine oder mehrere Zeilen. + */ + String execute(String command) throws Exception; +} \ No newline at end of file diff --git a/src/ch/zhaw/ads/Competitor.java b/src/ch/zhaw/ads/Competitor.java new file mode 100644 index 0000000..ca9e93e --- /dev/null +++ b/src/ch/zhaw/ads/Competitor.java @@ -0,0 +1,67 @@ +package ch.zhaw.ads; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Competitor implements Comparable { + private final String name; + private final String time; + private int rank; + + public Competitor(int rank, String name, String time) { + this.rank = rank; + this.name = name; + this.time = time; + } + + public void setRank(int rank) { + this.rank = rank; + } + + public String getTime() { + return time; + } + + public String getName() { + return name; + } + + private static long parseTime(String s) { + try { + DateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + Date date = sdf.parse(s); + return date.getTime(); + } catch (Exception e) {System.err.println(e);} + return 0; + } + + private static String timeToString(int time) { + SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); + return df.format(new Date(time)); + } + + public String toString() { + return ""+ rank + " "+name+" "+time; + } + + @Override + public int compareTo(Competitor o) { + if (o == this) return 0; + return (int) (parseTime(this.getTime()) - parseTime(o.getTime())); + } + + @Override + public boolean equals (Object o) { + if (!(o instanceof Competitor)) return false; + return compareTo((Competitor)o) == 0; + } + + @Override + public int hashCode() { + int hash = 7; + hash = 31 * hash + (name == null ? 0 : name.hashCode()); + hash = 31 * hash + (time == null ? 0 : time.hashCode()); + return hash; + } +} diff --git a/src/ch/zhaw/ads/ExBox.java b/src/ch/zhaw/ads/ExBox.java new file mode 100644 index 0000000..81a6992 --- /dev/null +++ b/src/ch/zhaw/ads/ExBox.java @@ -0,0 +1,13 @@ +package ch.zhaw.ads; + +/** + * @author K. Rege + * @version 1.0 -- Experimentierkasten + */ +public class ExBox { + public static void main(String[] args) { + ExBoxFrame f = new ExBoxFrame(); + f.setLocationRelativeTo(null); + f.setVisible(true); + } +} \ No newline at end of file diff --git a/src/ch/zhaw/ads/ExBoxFrame.java b/src/ch/zhaw/ads/ExBoxFrame.java new file mode 100644 index 0000000..7eb69cf --- /dev/null +++ b/src/ch/zhaw/ads/ExBoxFrame.java @@ -0,0 +1,294 @@ +package ch.zhaw.ads; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Set; + +/** + * @(#)ExBoxFrame.java + * + * JFC ExBox application + * + * @author K.Rege + * @version 1.00 2014/2/3 + * @version 1.01 2016/8/2 + * @version 2.00 2017/8/30 Test + * @version 2.01 2018/2/5 AutoscaleFaktor + * @version 2.02 2018/3/12 Reconnect (inspired by S. Kunz) + * @version 2.03 2021/7/24 Test (repeat) + * @version 2.04 2021/9/11 Test as plugin + */ +public class ExBoxFrame extends JFrame implements ActionListener, ItemListener { + private final int UHDTHRESHOLD = 1920; + private final String STANDARDENCODING = "ISO-8859-1"; + + private JMenuItem connect, exit, open, test, retest, textView, graphicView, clear; + private JMenu menuServer; + private JButton enter; + private JTextField arguments; + private JComboBox history; + private JTextArea output; + private JScrollPane scrollPane; + private CommandExecutor command; + private CommandExecutor unitTest; + private boolean graphicOn; + private GraphicPanel graphic; + private String lastServer; + private String lastTestFile; + + public void setFontSize(int size) { + Set keySet = UIManager.getLookAndFeelDefaults().keySet(); + for (Object key : keySet) { + if (key != null && key.toString().toLowerCase().contains("font")) { + Font font = UIManager.getDefaults().getFont(key); + if (font != null) { + font = font.deriveFont((float) size); + UIManager.put(key, font); + } + } + } + } + + private void initMenu() { + JMenuBar menuBar = new JMenuBar(); + setJMenuBar(menuBar); + + JMenu menuFile = new JMenu("File"); + menuBar.add(menuFile); + open = new JMenuItem("Open..."); + open.addActionListener(this); + menuFile.add(open); + exit = new JMenuItem(); + exit.setText("Exit"); + exit.addActionListener(this); + menuFile.add(exit); + + menuServer = new JMenu("Server"); + menuBar.add(menuServer); + connect = new JMenuItem("Connect ..."); + connect.addActionListener(this); + menuServer.add(connect); + + JMenu menuView = new JMenu("View"); + menuBar.add(menuView); + clear = new JMenuItem("Clear"); + clear.addActionListener(this); + menuView.add(clear); + textView = new JMenuItem("Text"); + textView.addActionListener(this); + menuView.add(textView); + graphicView = new JMenuItem("Graphic"); + graphicView.addActionListener(this); + menuView.add(graphicView); + } + + private void initJUnit() { + try { + unitTest = ServerFactory.createServer(getPathCompiled().resolve("ExBoxJUnit.class").toString()); + test = new JMenuItem("Test ..."); + test.addActionListener(this); + menuServer.add(test); + retest = new JMenuItem("Test"); + retest.addActionListener(this); + menuServer.add(retest); + } catch (Exception e) { + warning("Test Plugin not found\n"); + } + } + + private void initComponents() { + setLayout(new BorderLayout()); + output = new JTextArea(); + scrollPane = new JScrollPane(output); + add(BorderLayout.CENTER, scrollPane); + + JPanel panel = new JPanel(new BorderLayout()); + panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); + arguments = new JTextField(); + arguments.addActionListener(this); + panel.add(BorderLayout.CENTER, arguments); + enter = new JButton("enter"); + enter.addActionListener(this); + panel.add(BorderLayout.EAST, enter); + history = new JComboBox<>(); + history.addItemListener(this); + panel.add(BorderLayout.SOUTH, history); + add(BorderLayout.SOUTH, panel); + } + + /** + * get default path for file open dialog + */ + private Path getPathCompiled() { + try { + Path path = Paths.get(getClass().getProtectionDomain().getCodeSource().getLocation().toURI()); + for (String part : getClass().getPackage().getName().split("\\.")) { + path = path.resolve(part); + } + return path; + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + + /** + * The constructor + */ + public ExBoxFrame() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) { + ex.printStackTrace(); + } + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + double scaleFaktor = (screenSize.getWidth() <= UHDTHRESHOLD) ? 1 : 2; + setFontSize((int) (11 * scaleFaktor)); + setSize( + new Dimension((int) (400 * scaleFaktor), (int) (400 * scaleFaktor))); + setTitle("ExBox"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + initComponents(); + initMenu(); + initJUnit(); + } + + private void warning(String s) { + System.err.println("\nWARNING: " + s + "\n"); + } + + private void error(String s) { + output.append("\nERROR: " + s + "\n"); + } + + private void execute(String args) throws Exception { + if (lastServer != null) { + command = ServerFactory.createServer(lastServer); + } + if (!arguments.getText().equals(history.getItemAt(0)) + && !arguments.getText().equals(history.getSelectedItem())) { + history.insertItemAt(arguments.getText(), 0); + } + if (command == null) { + error("no Server connected"); + } else { + String res = command.execute(args); + if (graphicOn) { + graphic.setFigure(res); + } else { + output.append(res); + } + } + } + + private void setGraphicView() { + if (!graphicOn) { + remove(scrollPane); + graphic = new GraphicPanel(); + output.removeNotify(); + add(BorderLayout.CENTER, graphic); + graphicOn = true; + validate(); + repaint(); + } + } + + private void setTextView() { + if (graphicOn) { + remove(graphic); + add(BorderLayout.CENTER, scrollPane); + graphicOn = false; + validate(); + repaint(); + } + } + + private String openFileDialog(Path startDirectory, String pattern) { + FileDialog fd = new FileDialog(this, "Open"); + if (pattern != null) fd.setFile(pattern); + if (startDirectory != null) fd.setDirectory(startDirectory.toString()); + fd.setVisible(true); + return fd.getDirectory() + fd.getFile(); + } + + private void testCommand(boolean retest) throws Exception { + if (!retest) { + lastTestFile = openFileDialog(getPathCompiled(), "*test.class"); + } + if (lastTestFile == null) { + output.append("ERROR no Test spezified\n"); + } else if (unitTest != null) { + output.append(unitTest.execute(lastTestFile)); + } + } + + private void connectCommand() throws Exception { + String name = openFileDialog(getPathCompiled(), "*Server.class"); + command = ServerFactory.createServer(name); + lastServer = name; + String fullClassName = command.getClass().getName(); + String simpleClassName = fullClassName.substring( + fullClassName.lastIndexOf('.') + 1); + setTitle("ExBox connected to " + simpleClassName); + + } + + private void openFile() throws Exception { + String name = openFileDialog(null, null); + + BufferedReader br = new BufferedReader( + new InputStreamReader(new FileInputStream(name), STANDARDENCODING)); + StringBuilder b = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + b.append(line); + b.append('\n'); + } + execute(b.toString()); + } + + public void itemStateChanged(ItemEvent e) { + try { + arguments.setText((String) e.getItem()); + execute(arguments.getText()); + } catch (Throwable ex) { + error(ex.toString()); + } + } + + public void actionPerformed(ActionEvent e) { + try { + if ((e.getSource() == arguments) || (e.getSource() == enter)) { + execute(arguments.getText()); + } else if (e.getSource() == connect) { + connectCommand(); + } else if (e.getSource() == test) { + testCommand(false); + } else if (e.getSource() == retest) { + testCommand(true); + } else if (e.getSource() == open) { + openFile(); + } else if (e.getSource() == textView) { + setTextView(); + } else if (e.getSource() == graphicView) { + setGraphicView(); + } else if (e.getSource() == clear) { + output.setText(""); + } else if (e.getSource() == exit) { + System.exit(0); + } + } catch (Throwable ex) { + ex.printStackTrace(); + error(ex.toString()); + } + } +} \ No newline at end of file diff --git a/src/ch/zhaw/ads/ExBoxJUnit.java b/src/ch/zhaw/ads/ExBoxJUnit.java new file mode 100644 index 0000000..b382669 --- /dev/null +++ b/src/ch/zhaw/ads/ExBoxJUnit.java @@ -0,0 +1,92 @@ +package ch.zhaw.ads; + +import org.junit.platform.engine.TestDescriptor; +import org.junit.platform.engine.TestExecutionResult; +import org.junit.platform.engine.discovery.DiscoverySelectors; +import org.junit.platform.launcher.Launcher; +import org.junit.platform.launcher.LauncherDiscoveryRequest; +import org.junit.platform.launcher.TestExecutionListener; +import org.junit.platform.launcher.TestIdentifier; +import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder; +import org.junit.platform.launcher.core.LauncherFactory; + +import java.io.*; +import java.util.LinkedList; +import java.util.List; + +public class ExBoxJUnit implements CommandExecutor { + @Override + public String execute(String testFile) throws Exception { + final List successfulTests = new LinkedList<>(); + final List failedResults = new LinkedList<>(); + + StringBuilder output = new StringBuilder(); + + output.append("\nRUN TESTS ").append(new File(testFile).getName().split("\\.")[0]).append("\n"); + + LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() + .selectors(DiscoverySelectors.selectClass(ServerFactory.loadClass(testFile))) + .build(); + + Launcher launcher = LauncherFactory.create(); + launcher.discover(request); + launcher.registerTestExecutionListeners(new TestExecutionListener() { + @Override + public void executionFinished(TestIdentifier testIdentifier, TestExecutionResult testExecutionResult) { + if (testIdentifier.getType() != TestDescriptor.Type.TEST) { + return; + } + + if (testExecutionResult.getStatus() == TestExecutionResult.Status.SUCCESSFUL) { + successfulTests.add(testIdentifier.getDisplayName()); + } else { + failedResults.add(new TestFailure(testIdentifier.getDisplayName(), + testExecutionResult.getThrowable().orElse(null))); + } + } + }); + launcher.execute(request); + + for (String testName : successfulTests) { + output.append(testName).append(": OK\n"); + } + for (TestFailure result : failedResults) { + output.append(result.getName()).append(": ERROR\n"); + String error = result.errorString(); + if (!error.isEmpty()) { + output.append(error).append("\n"); + } + } + boolean wasSuccessful = failedResults.isEmpty(); + output.append("TESTS ").append(wasSuccessful ? "PASSED" : "FAILED").append(": ") + .append(wasSuccessful ? "OK \u263a" : failedResults.size() + " ERRORS").append("\n"); + return output.toString(); + } + + private static class TestFailure { + private final String name; + private final Throwable throwable; + + TestFailure(String name, Throwable throwable) { + this.name = name; + this.throwable = throwable; + } + + public String getName() { + return name; + } + + public String errorString() { + if (throwable == null) { + return ""; + } + try (StringWriter stringWriter = new StringWriter(); + PrintWriter printWriter = new PrintWriter(stringWriter)) { + throwable.printStackTrace(printWriter); + return stringWriter.toString(); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + } +} \ No newline at end of file diff --git a/src/ch/zhaw/ads/GraphicPanel.java b/src/ch/zhaw/ads/GraphicPanel.java new file mode 100644 index 0000000..ae0b1f0 --- /dev/null +++ b/src/ch/zhaw/ads/GraphicPanel.java @@ -0,0 +1,84 @@ +package ch.zhaw.ads; + +import javax.swing.*; +import java.awt.*; +import java.util.StringTokenizer; + +public class GraphicPanel extends JPanel { + String figure; + + public void setFigure(String figure) { + this.figure = figure; + paint(getGraphics()); + } + + private void drawRect(Graphics g, double x, double y, double width, double height, String style) { + int w = getWidth(); + int h = getHeight(); + int ix0 = (int) (w * x); + int iy0 = (int) (h * y); + int ix1 = (int) (w * (x + width)); + int iy1 = (int) (h * (y + height)); + if (style.equals("draw")) { + g.drawRect(ix0, h - iy1, ix1 - ix0, iy1 - iy0); + } else { + g.fillRect(ix0, h - iy1, ix1 - ix0, iy1 - iy0); + } + } + + private void drawFigure(Graphics g) { + if (figure != null) { + int w = getWidth(); + int h = getHeight(); + g.setColor(Color.black); + StringTokenizer tok = new StringTokenizer(figure, " <>=/,\"\n"); + while (tok.hasMoreTokens()) { + String fig = tok.nextToken(); + if (fig.equals("line")) { + tok.nextToken(); + double x1 = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double y1 = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double x2 = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double y2 = Double.parseDouble(tok.nextToken()); + g.drawLine((int) (x1 * w), h - (int) (y1 * h), + (int) (x2 * w), h - (int) (y2 * h)); + } else if (fig.equals("rect")) { + tok.nextToken(); + double x = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double y = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double width = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + double height = Double.parseDouble(tok.nextToken()); + tok.nextToken(); + String style = tok.nextToken(); + drawRect(g, x, y, width, height, style); + } else if (fig.equals("color")) { + tok.nextToken(); + int red = Integer.parseInt(tok.nextToken()); + tok.nextToken(); + int green = Integer.parseInt(tok.nextToken()); + tok.nextToken(); + int blue = Integer.parseInt(tok.nextToken()); + g.setColor(new Color(red, green, blue)); + } + } + } + } + + private void clear(Graphics g) { + int w = getWidth(); + int h = getHeight(); + g.setColor(new Color(240, 240, 240)); + g.fillRect(0, 0, w, h); + } + + public void paint(Graphics g) { + clear(g); + drawFigure(g); + } +} \ No newline at end of file diff --git a/src/ch/zhaw/ads/MyVisitor.java b/src/ch/zhaw/ads/MyVisitor.java new file mode 100644 index 0000000..4457dcf --- /dev/null +++ b/src/ch/zhaw/ads/MyVisitor.java @@ -0,0 +1,20 @@ +package ch.zhaw.ads; + +/** + * MyVisitor -- Diese Klasse wird für die Tests verwendet + */ +class MyVisitor implements Visitor { + StringBuilder output; + + MyVisitor() { + output = new StringBuilder(); + } + + public void visit(T s) { + output.append(s); + } + + public String toString() { + return output.toString(); + } +} diff --git a/src/ch/zhaw/ads/RangZuerich.csv b/src/ch/zhaw/ads/RangZuerich.csv new file mode 100644 index 0000000..4146e43 --- /dev/null +++ b/src/ch/zhaw/ads/RangZuerich.csv @@ -0,0 +1,3166 @@ +Kiptum Daniel;02:11:31 +Ançay Tarcis;02:20:02 +Kreienbühl Christian;02:21:47 +Ott Michael;02:33:48 +Menzi Christoph;02:27:26 +Oliver Ruben;02:32:12 +Elmer Beat;02:33:53 +Kühni Martin;02:33:36 +Müller Stefan;02:31:14 +Marti Adrian;02:30:09 +Zwicky Christian;02:36:28 +Gehrig Roman;02:33:50 +Körner Lutz;02:32:47 +Nunige Guy;02:34:11 +Marti Fredi;02:44:48 +Dufaux Laurent;02:43:48 +Hamd Mohamednur;02:19:45 +Simpson Guy;02:30:50 +Morceli Patricia;02:37:28 +Berchtold Rachel;02:53:42 +Di Marco Magali;02:42:56 +Wyss Sandra;02:54:06 +Amiet Tanja;02:53:08 +Meneghin-Pliska Maja;02:46:07 +Zimmermann Denise;02:56:54 +Beffa Heidi;03:09:43 +Haller Natasha;03:01:07 +Lohri Nicole;02:52:31 +Serafini Susanna;03:29:00 +Annen Lamard Sandra;02:57:20 +Mayer-Hofmann Lucia;02:59:35 +Allard David;04:26:57 +Andres Robert;03:33:42 +Angehrn Otto;04:20:16 +Bader Philipp;03:40:53 +Baer Willi;03:28:12 +Baumann Simon;03:03:47 +Baumann Simon;03:12:09 +Baumann Werner;03:45:49 +Baur Hansruedi;04:04:04 +Bellerjeau James;03:42:08 +Benz Felix;02:58:13 +Bergamin Mario;03:26:30 +Bernhard Stefan;04:46:01 +Berweger Peter;02:53:15 +Bischof Thomas;03:26:40 +Blatter Eveline;02:56:49 +Bolliger Armin;03:00:08 +Brem Daniel;03:49:53 +Meier Zgraggen Stefani;04:33:30 +Brunold Andrea;03:34:27 +Brüschweiler Mathias;03:29:48 +Bucher René;04:06:20 +Buchmann Isabel;03:26:18 +Bühler Sigi;03:41:30 +Bühler Willi;03:30:40 +Buzzi Andreas;03:46:55 +Cavelti Roland;03:17:16 +Cremon René;03:39:32 +Denker Catrina;03:13:34 +Egli Ariane;04:06:18 +Ehrismann Martin;03:31:04 +Eichholzer Hans;03:57:46 +Estermann Thomas;03:48:47 +Fahrni Kurt;03:32:56 +Fesli Mehmet;04:46:31 +Flück Heinz;04:41:57 +Flühmann Katrin;03:31:29 +Fuchs Stefan;03:02:36 +Füglistaller Jörg;03:32:35 +Fürst Roger;03:24:10 +Fürst Willi;04:39:57 +Galati Francesco;03:29:38 +Gasser Matthias;03:29:03 +Gäumann Coni;03:59:14 +Gautschi Martin;03:02:27 +Gerber Bernhard;04:06:33 +Gianini Franz;04:01:52 +Giger Claudio;03:06:06 +Giger Stephan;03:56:50 +Good Erich;03:30:46 +Merkt Jürg;02:59:49 +Streit Markus;02:59:49 +Goudsmit Gerrit;02:56:51 +Gut Viktor;03:22:35 +Haag Elisabeth;04:10:05 +Häberli Roland;04:36:11 +Hächler Roland;04:00:18 +Haefeli Angela;03:48:09 +Häfliger Jürg;03:42:23 +Hafner Jürg;04:25:44 +Hager Armin;03:22:35 +Händle Heinz;04:13:38 +Herren Kurt;04:49:31 +Brüniger Markus;03:56:54 +Hirschi Peter;04:32:42 +Höck Stefan;03:34:37 +Hofmann Martin;04:21:51 +Hofstetter Corinne;03:30:35 +Holzinger Adrian;03:15:05 +Huber Edi;03:10:04 +Huber Mac;03:46:59 +Huggenberger Kurt;04:20:30 +Jaccard Marc Pierre;04:41:07 +Jakopic Klemen;03:17:07 +Jarjour Kamel;03:47:02 +Jordi Markus;03:51:01 +Jost Hansueli;03:49:31 +Jucker Andreas H.;03:22:44 +Jud Ueli;02:52:15 +Jutzi Victor;03:40:25 +Kälin Léon;04:04:11 +Kaufmann Patrick;04:03:16 +Keller Peter;03:23:54 +Keller Stephan;03:26:12 +Kilchherr Virginia;03:44:11 +Kloter Georg;03:38:02 +Koch Stephan;03:28:39 +Kopp Martin;03:17:15 +Kreienbühl Anna;04:04:25 +Kreienbühl Fridolin;03:51:50 +Kuendig Christoph;04:18:39 +Kulik Karsten;03:07:13 +Kunz Thomas;03:47:52 +Kunz Tommy;04:00:43 +Kuonen Kurt;03:16:10 +Kurz Daniel;03:42:28 +Kuster Verena;04:46:49 +Laffer Urs;03:48:15 +Landolt Andreas;03:19:46 +Ledermann Martin;04:51:42 +Nüssli Dave;03:14:49 +Graf Peter;03:14:47 +Lilley Darrel;04:16:09 +Manning John;03:38:25 +Maslarevic Dragan;04:45:37 +Meier Pascal;03:53:51 +Meier Pius;05:24:48 +Meier Robert;03:58:11 +Meyer Arthur;04:36:21 +Meyer Christoph;03:49:14 +Meyer Dirk;03:13:32 +Meyer Stephan;03:26:31 +Milivojevic Ljubomir;03:04:44 +Miller Barbara;03:17:17 +Mona Sergio;03:19:03 +Monn Matilda;03:59:34 +Müller Adrian;03:54:32 +Müller Doris;03:40:25 +Müller Thomas;03:23:52 +Ochsner René;04:01:31 +Patcas Michel;03:53:53 +Peric Frank;03:27:59 +Pfister Matthias;03:22:09 +Prosdocimi Ivan;03:46:41 +Pürro Beat;03:44:25 +Rau Dani;03:24:19 +Renggli Thomas;02:53:46 +Helfenstein Alain;03:44:44 +Anderhalden Donnino;03:44:01 +Rezan Robert;03:34:37 +Rickli Jörg;03:29:51 +Rothen Franz;03:25:01 +Röthlisberger Alain P.;03:34:40 +Rüegg Beat;03:26:53 +Rüegg Herbert;03:23:31 +Ruoss Sven;03:06:32 +Sandmeier Ueli;03:13:54 +Saxer Peter;03:45:15 +Schaffer Bernard;03:37:55 +Schaub Werner;03:36:45 +Schilling Hans;03:55:00 +Appenzeller Ulrich;03:59:30 +Fischer Reto;03:59:33 +Schlatter Sonya;04:18:26 +Schmid Christian;03:00:53 +Schmid Richard;02:58:46 +Schuster Mathias;03:11:42 +Seiler Hans;03:37:28 +Späni Urs;04:22:38 +Spiess Paul;03:42:34 +Stalder Martin;03:57:32 +Steimann Ernst;04:41:02 +Stöckli Urs;03:03:26 +Straumann Urs;03:01:40 +Studer Franz;04:17:49 +Sturzenegger Daniel;03:28:01 +Süssli Philipp;03:08:02 +Suter Kurt;03:46:46 +Tanner Christian;03:34:34 +Taschi Sander;03:36:13 +Thalmann Martin;03:49:11 +Theiler Alois;03:47:54 +Tischer Georg;04:44:08 +Tramacere Enrico;04:00:20 +Veraguth Christian;05:29:08 +Vetterli Thomas;04:16:32 +Vogel Marco;03:25:36 +Vögeli Thomas;03:49:27 +Vogt Urs;03:19:15 +Voser Therese;03:29:13 +Vosseler Beat;02:56:34 +Waller Max;04:15:17 +Walther Rita;04:23:45 +Wäschle Stefan;03:15:35 +Wenger Beat;03:34:52 +Wettstein Walter;04:53:57 +Wild Ruedi;03:27:44 +Wyser Norbert;03:26:23 +Zahler Markus;03:56:47 +Zgraggen Walter;03:33:11 +Zimmermann Herbert;04:26:40 +Zingg Marcel;03:45:33 +Zollinger Thomas;03:17:47 +Zingg Matthias;03:28:26 +Züger Fritz;04:20:41 +Zurbuchen Röbi;03:26:40 +Alpiger Karl Jun.;03:26:11 +Amacher Tom;03:54:37 +Ammann Anton;04:54:02 +Ammann Hansruedi;03:49:23 +Anneler James;04:59:47 +Bailey Richard;03:24:29 +Baumberger Rolf;03:05:38 +Uhler Remo;04:13:30 +Jaussi Lars;04:13:31 +Baumgartner Peter;04:43:47 +Bebie Bruno;03:23:03 +Beck René;04:21:30 +Bergamin Roland;03:24:28 +Berger Beat;02:42:27 +Bertschinger Erwin;03:24:17 +Binder Peter;03:49:11 +Bischofberger Lukas;03:17:26 +Böhler Thomas;03:43:48 +Borner Daniel;04:51:53 +Bosshard Roland;03:18:10 +Breitenmoser Stefan;02:56:21 +Brem Gabriella;03:56:23 +Huber Yvonne;04:27:59 +Malischke Jacqueline;04:27:59 +Brem Ruedi;03:32:12 +Bruhin Marino;03:32:43 +Bryner Adrian;04:06:52 +Bürgi Matthias;04:11:55 +Christen David;05:02:03 +Ciprian Peter;04:12:24 +Conrad Otto;04:34:00 +Conti Antonio;03:14:49 +Della Rossa Hanspeter;04:04:20 +Deseö Katja;04:32:53 +Deseö Thomas;03:52:05 +Reichmuth Ruedi;04:40:20 +Mettler Martin;04:39:44 +Ehrhard Andre;03:29:17 +Eigenmann Markus;03:40:47 +Engeli Benjamin;02:57:53 +Etzold Liz;04:33:10 +Flury Alois;04:51:02 +Frei Martin;02:46:47 +Geerdsema Jan;04:32:20 +Gloor Ruedi;04:20:10 +Grimm Schädel Christia;03:49:06 +Hauck Rene;03:28:20 +Haupt Hanspeter;04:20:51 +Josty Adrian;04:59:25 +Wieser Andreas;04:59:26 +Heer Andreas;03:50:32 +Hegner Connie;03:51:46 +Huerlimann Markus;03:33:33 +Jordi Christine;03:56:35 +Juhasz Bruno;03:45:55 +Kämpf Kurt;03:57:28 +Keller Andreas;03:53:52 +Keller Markus;03:14:12 +Kern Jean-Pierre;03:55:37 +Läderach Peter;03:35:32 +Landolt Fredi;03:57:25 +Lörtscher Robin;03:29:19 +Lutz Peter;04:39:56 +Mächler Anton;03:47:14 +Manz Thomas;03:33:38 +Meier Kurt;04:04:48 +Meier Philipp;03:32:31 +Meile Urs;04:10:32 +Melchior Ursula;03:46:13 +Münzenmaier Samuel;02:58:03 +Nägeli Oliver;03:45:17 +Niederberger Martin;03:55:45 +Pfenniger Peter;03:55:37 +Rhyn Andy;03:28:54 +Rieder Marcos;03:08:11 +Rüeger Urs;03:19:30 +Schreiber Christian;03:27:36 +Sobaszkiewicz Markus;04:06:39 +Sonderer Marcel;03:11:32 +Spielmann Hans-Peter;03:44:30 +Steiner Ueli;03:56:34 +Stöckli Silvia;05:10:36 +Straube Wolfgang;03:42:04 +Zielmann Sarah;03:59:32 +Suter Thomas;03:21:52 +Sutter Fritz;04:23:39 +Tschopp André;03:25:06 +Utzinger Reto;03:24:43 +Waltl Günther;03:28:29 +Wartmann Matthias;03:42:03 +Wegmueller Marc Simon;03:15:37 +Wegmüller Rolf;03:15:38 +Widmer Lucas;02:46:06 +Bugmann Daniel;03:15:19 +Dos Reis Romeo;03:34:55 +Meier-Pfosi Marlies;05:11:40 +Schmid Beat;04:19:03 +Sicurelli Ernesto;03:26:25 +Ulrich Beat;03:25:27 +Bossi Daniel;04:04:24 +Coradi Reto;03:38:27 +Kaufmann Reto;05:10:43 +Margreth Pascal;04:24:04 +Schaffner Lukas;03:35:23 +Schatt Hansjörg;04:09:32 +Schmid Ernst;02:51:07 +Soland Benjamin;03:31:59 +Meier Stefan;03:33:03 +Herzog Margrit;03:57:45 +Bartholdi Roger;04:01:38 +Lauber Gerold;03:48:01 +Abegg Monica;03:56:33 +Abeguile Juliette;03:33:44 +Aerne Rusterholz Susan;04:05:15 +Allemann Olivia;04:12:36 +Altmann Béatrice;03:31:22 +Altwegg Fehr Susanne;03:44:40 +Angst Nicole;03:58:32 +Antener Doris;03:47:33 +Arena Michaela;04:12:27 +Arlitt Nicole;04:10:56 +Arnold Corinne;03:28:30 +Arnold Ruth;03:24:42 +Bächle Karin;03:47:12 +Bachmann Nicole;03:47:13 +Ballamann Gudrun;04:10:45 +Bannier Elsbeth;03:54:42 +Bättig Ruth;03:45:44 +Bebi Mirjam;02:58:12 +Béguin Sandrine;04:21:05 +Belk Brigitte;04:04:51 +Bellgardt Sabine;04:21:17 +Bennett Nicole;04:53:22 +Benz Regula;03:30:19 +Berchtold Marion;03:45:48 +Berchtold Silvia;05:00:58 +Bienz Sabrina;03:54:02 +Bissig Katharina;03:57:07 +Blaeser Manelle;04:05:37 +Blatter Priska;04:16:43 +Boehm Martina;03:58:38 +Bolfing Petra;03:09:24 +Boos-Hautmann Andrea;04:16:17 +Borsatti Luciana;04:39:50 +Bosshard Erika;04:21:35 +Bottesi Elisabeth;04:11:56 +Brandenberg Monika;03:41:55 +Brändle Cindy;04:07:53 +Brülisauer Marianne;03:09:16 +Brunner Jeannette;03:38:03 +Bucher Yvonne;04:04:11 +Buchser Marie-Louise;04:27:44 +Buehler Luzia;03:37:34 +Bugmann Franziska;04:04:06 +Buholzer Marlis;04:14:25 +Burgardt Sonja;03:53:53 +Bürge-Stahel Ursula;04:21:06 +Busque Stephanie;04:16:09 +Calic Manda;04:01:57 +Camathias Heidi;04:25:21 +Casagrande Ruth;03:47:47 +Cathomas Yvonne;04:33:50 +Cavelti Gaby;03:32:08 +Claivaz Patricia;04:57:11 +Clark Joan;04:09:41 +Clematide Renate;03:12:23 +Cotroneo Laura;04:40:20 +De Cristofaro Teresa;04:31:18 +Debély-Escher Raphaela;03:56:36 +Deck-Meier Rosie;04:00:35 +Diethelm Melanie;04:43:21 +Dober Karin;03:41:48 +Dollerup Brit;03:34:36 +Dossenbach Laura;03:48:51 +Ducrey Marie-Claire;03:37:40 +Ecoffey Liliane;04:26:32 +Emmenegger Sandra;03:52:23 +Emmenegger Tanja;03:42:35 +Engeler-Zöllig Monika;04:01:55 +Erismann Liliane;04:09:57 +Eyerman Jennifer;03:27:32 +Addea Jasmin;03:43:23 +Fikarova Olga;04:14:49 +Fischer Marion;04:05:54 +Fischknecht Sibylle;03:30:21 +Föller Fiona;04:27:12 +Forrer Brigitte;03:43:13 +Forster Kundert Helen;05:02:18 +Frankiny Denise;03:13:41 +Franz-Pfetzer Ursula;05:14:57 +Fratila Ana-Maria;04:06:41 +Frei Melanie;03:54:41 +Frei Miriam;04:43:31 +Frey Gaby;03:41:35 +Frey Viola;04:03:08 +Frey-Martins Eli;03:58:10 +Friederich-Baur Marian;04:37:22 +Friedli Gertrud;04:33:34 +Fritzsche Sandra;04:01:35 +Fuchs Katharina;04:16:29 +Fuchser Karin;04:01:53 +Furrer-Theiler Imelda;03:49:14 +Gagliardi Ulla;04:09:39 +Gahlinger Chantal;03:58:12 +Gähwiler Anita;05:13:12 +Gähwiler Liselotte;03:16:54 +Gass Regina;04:01:53 +Gattiker Irene;04:11:34 +Gautschi Caroline;04:13:10 +Gerth-Zellweger Trudi;04:12:03 +Glaus Barbara;03:11:55 +Gleises Alice;04:11:29 +Gloor Isabelle;03:57:49 +Goeree Michelle;04:57:30 +Gomringer Nicole;03:12:56 +Graf-Ganz Ursula;04:26:49 +Graule Karin;03:56:29 +Grosswiler Katrin;04:01:13 +Guenat Raquel;03:45:58 +Häcki Florence;03:22:38 +Hägle Monika;04:49:05 +Hannay Jackie;03:48:34 +Hartmann Hanne;04:05:53 +Haudenschild Barbara;04:11:32 +Häusermann Anya;03:41:17 +Häusler Eva;03:39:02 +Hayoz Catherine;03:40:32 +Hefti Eliane;04:23:02 +Heim Tina;03:33:22 +Heiniger Daniela;03:44:44 +Heiniger Elsbeth;04:06:59 +Hersberger-Gsell Vera;03:58:03 +Herwig Marie-Therese;04:11:08 +Hoffmann Dorothee;04:08:14 +Hofmann Judith;03:39:20 +Höglund Mikaela;02:59:13 +Hotz Sigrist Gabriela;04:03:19 +Huber Alice;03:45:15 +Huber-Muhl Prisca;03:27:03 +Hübscher Sara;04:06:30 +Huclova Sonja;03:28:29 +Hunn Erika;03:47:11 +Huwyler Renate;04:56:46 +In-Albon Wampfler Tina;02:54:59 +Inglin Heidi;04:08:25 +Insley-Darling Janet;04:01:18 +Issakainen Vilma;03:59:57 +Jeker Sabine;03:40:53 +Jenny Esther;03:26:56 +Jenzer Nina;04:33:15 +Jokl Franziska;05:15:39 +Jud Daniela;04:10:28 +Käch Silvia;04:03:47 +Kaderli Iris;04:15:39 +Kaetzke Philomela;03:48:35 +Kaltenrieder Margrit;03:25:23 +Kamm Heidy;04:56:29 +Käppeli Helena;03:59:34 +Karremans Jeannette;03:33:33 +Keller Jacqueline;03:09:10 +Keller-Noser Nicole;04:21:59 +Kellerhals Luzia;03:30:14 +Kern Beatrice;04:32:41 +Keup Verena;04:34:54 +Kirchhof Frizzi;03:57:05 +Kleinlaut Karin;03:56:20 +Knuchel Patrizia;03:13:21 +Koch Tamara;04:00:47 +Kramer Jutta;03:57:31 +Krebs-Stickel Sandra;04:03:03 +Krummenacher Brigitte;04:00:52 +Kubli Rebekka;04:07:21 +Küffner Marianne;03:36:19 +Kuhn Patricia;04:05:17 +Kunz Sibylle;03:50:46 +Lacher Priska;03:22:38 +Landolt Bernadette;03:54:31 +Lanner Regina;04:20:58 +Lehner Christa;04:44:59 +Leitmann Petra;04:13:02 +Lewis Anne;05:07:56 +Litzius Denise;04:16:19 +Long Lisbeth;05:28:42 +Loretz Manuela;03:27:22 +Lüthi Lisa;03:52:40 +Maag-Hegetschweiler Ch;03:32:15 +Maggini Esther;04:35:40 +Marti Rosmarie;04:46:36 +Matz Brigitte;03:27:20 +Mazzolini Mbenda Betti;04:02:53 +Meier Gisela;04:20:56 +Meier Isabel;03:54:29 +Meier Jessica;03:47:11 +Allemann Isabelle;03:20:13 +Meister Franziska;03:43:43 +Messmer Monika;04:43:05 +Metzger Hübi;03:56:50 +Michel Irène;04:40:33 +Mlekusch Sabine;04:57:10 +Möckli Ruth;04:55:14 +Modoux Liliane;04:33:28 +Mühldorfer Annette;03:58:49 +Morf Doris;04:46:54 +Mosetti Michelle;04:21:30 +Muggleton Belinda;04:18:22 +Bärtsch Edith;03:40:14 +Müller Jennifer;03:29:58 +Müller Sandra;03:31:42 +Näf Esther;04:04:42 +Nakanishi Yoshiko;04:26:51 +Nardiello Selina;03:43:57 +Neidhart Jana;03:36:45 +Nelson Christen;03:24:28 +Baumann Flavia;03:50:36 +Neri Claudia;03:52:57 +Neustadt Rita;03:35:23 +Niederberger Fränzi;03:54:18 +Niederberger Trudi;04:39:30 +Niederhauser Dami;04:14:27 +Nielsen Birgitte;03:44:22 +O'Neill Annemarie;04:10:48 +Odenbach Mary;03:50:44 +Oneta Cristina;04:07:10 +Ossowska Maria;03:57:34 +Padberg Barbara;03:46:42 +Paganini Chiara;04:16:43 +Praz Maria;04:26:42 +Pulver Barbara;03:21:09 +Purtschert Amanda;04:07:03 +Rada Marianne;03:51:41 +Rakic Silvia;04:25:10 +Rechsteiner Sandra;03:23:42 +Recine Lisa;04:33:10 +Reinhold Irene;03:57:05 +Renggli Conny;04:23:09 +Reusser Christine;04:08:57 +Rhomberg Birgitta;03:29:49 +Richards Shola;05:05:02 +Riga Petra;03:30:53 +Ringger Christa;04:14:44 +Rippstein Hilde;04:02:11 +Riva Anita;04:57:03 +Rosenast Andrea;03:33:20 +Rosenberger Thekla;04:03:36 +Rossi Marianne;03:43:50 +Roth Barbara;04:38:53 +Rüeger Riikka;04:10:10 +Rüegg Kim;04:11:34 +Ruesch Caroline;04:28:02 +Russenberger Doris;03:13:34 +Russo Andrea;04:41:49 +Rutishauser Cornelia;04:28:46 +Saly Katrin;03:31:23 +Schaub Andrea;04:08:39 +Scheiwiller Margrit;05:03:02 +Schenkel Gabriela;03:34:02 +Schenkel Karin;04:13:08 +Scherer Cornelia;04:27:02 +Schild-Leuthold Juliet;02:57:44 +Schneider Anne;04:01:13 +Schneider Monica;03:59:27 +Schölly Deborah;04:39:56 +Schudel Jacqueline;04:27:00 +Schülin Sabina;03:47:19 +Schwander Gabriela;04:14:55 +Schwarzentruber Cornel;03:45:09 +Schwegler Nicole;03:42:48 +Schwerzmann Michèle;03:17:01 +Seiler Sonja;03:09:36 +Seitz Judith;04:00:13 +Senn Claudia;03:45:32 +Siegenthaler Brigitte;03:48:24 +Siegfried Anita;04:14:01 +Sigrist Jeannette;03:36:39 +Simmen Sabine;03:24:12 +Skreckova Denisa;03:51:43 +Smith Sarah;03:52:56 +Sobrino Karen;03:26:49 +Stadler Eufemia;04:16:10 +Stäger Marianne;03:46:56 +Stampfer Brigitte;04:19:50 +Steiger Birgit;04:31:36 +Steimann Dana;04:48:23 +Steiner Marianne;03:12:17 +Stettler-Brotschi Clau;04:13:17 +Stich Isabelle;04:11:38 +Stöckli Jolanda;04:04:16 +Stöckli Mara;03:46:21 +Streule Eliane;04:28:34 +Strub Kunz Jrène;03:56:17 +Studer Cornelia;03:29:55 +Surber Tanja;03:33:44 +Symonds Rebecca;03:54:16 +Szlavik Vanda;03:52:35 +Tan Siew;04:40:39 +Tellefsen Tina;03:28:51 +Theiler Nadia;04:04:38 +Tholen Anna;03:54:26 +Thoma Erika;03:53:09 +Tiebout Isabelle;03:53:32 +Tietz Julia;03:16:22 +Toledano Marisol;04:12:36 +Toumani Jenna;03:41:53 +Tricarico Gabi;03:07:35 +Trovato Carmela;03:48:41 +Ulrich Katharina;03:47:35 +Urbach Deborah;04:27:53 +van Rijs Ursula;04:57:03 +Vasilache Cristina;03:49:57 +Vermeulen Helene;04:37:14 +Villiger Sonja;04:04:59 +Vocke Daniela;04:27:03 +Voegeli Nico;03:55:29 +Voigt Cornelia;04:29:36 +Volfschütz Simona;03:43:40 +von Mandach Annette;03:40:33 +von Niederhäusern Cris;04:39:56 +Vopat Johanna;04:08:22 +Wachter Karin D.;03:38:58 +Wackernagel Britta;04:23:01 +Walder Darja;03:57:22 +Wartenberg Alexandra;04:39:44 +Washington Caroline;04:36:48 +Weber Tosca;04:33:11 +Weiersmüller Jacquelin;04:10:53 +Weiler Katja;04:42:27 +Welbergen Louisa;03:08:03 +Werner Stephanie;03:40:08 +Werthmüller Gabriele;03:09:45 +Wettstein Edith;04:19:31 +Wey Mirjam;04:16:23 +Widmer Monika;03:22:33 +Wiedmer Christine;04:09:04 +Wild Irene;04:40:20 +Winklehner Anna;03:50:53 +Wittwer Gertrud;04:08:44 +Wyler Karin;03:35:51 +Wyss Ingrid;04:44:13 +Wyss Sonja;04:07:25 +Zaugg Sibil;03:51:58 +Zeller Seline;03:47:18 +Zenger Daniela;04:26:55 +Ziegler Isabella;03:41:15 +Zingg Karin;03:16:04 +Zuber Helen;03:36:41 +Zuber Sabrina;04:35:32 +Zwicker Selinda;03:26:18 +Brazerol Carmen;03:37:38 +Bucher Sylvie;03:51:22 +Freiburghaus Rahel;03:53:47 +Götsch Helen;03:51:34 +Güntzel Sara;03:25:25 +Gurtner Susanne;03:52:40 +Hauser-Ruckli Cornelia;03:39:46 +Heimbs Anette;04:36:24 +Inauen Fränzi;03:14:21 +Jaggi Theres;04:55:33 +Janser Susanne;04:13:22 +Jörg Regina;03:43:22 +Kern Alexandra;04:41:12 +Kolhaupt Tanja;04:26:48 +Landolt Christina;04:12:17 +Lienhard Sonja;03:30:23 +Müntener Brigitte;03:55:51 +Ochieng Pernet Awilo;04:17:59 +Peer Sandy;03:31:59 +Polinelli Christina;03:34:40 +Queralto Cristina;03:50:26 +Ramsay Julie;04:54:41 +Röthisberger Céline;04:21:20 +Rüegger Andrea;04:31:24 +Rütimann Gabriela;03:51:33 +Scheitlin Julie;04:11:09 +Schiess Gabriela;03:23:41 +Schillig-Planzer Stefa;03:04:46 +Schlegel Alexandra;03:24:22 +Schmid Catherine;03:56:28 +Schmid Conny;03:08:27 +Schrott Andrea;03:53:30 +Schumacher Sandra;03:53:25 +Senn Brigitte;04:09:12 +Sommer Daniela;03:04:31 +Sonderegger Tanja;03:20:13 +Stalder Caroline;03:44:15 +Steiner Denise;04:48:42 +Stoppiello Banu;04:27:05 +Stucki Sonja;03:27:03 +Tambini Irma;03:50:24 +Tangorra Sabrina;04:21:32 +Tschannen Nathalie;04:27:15 +Wiederkehr Denise;04:41:12 +Zähnler Bircher Silvia;04:27:22 +Zanetti Windegger Lara;03:26:56 +Zehnder Corinne;04:42:04 +Antila Heidi;05:04:33 +Flockerzi Martina;04:03:55 +Kieran Rose;04:05:28 +Merz Beatrix;03:40:06 +Minard Delphine;04:14:28 +Schoch Katharina;04:12:52 +Steiger Susanne;04:12:15 +von Rotz Madeleine;03:58:13 +Fischer Muriel;04:33:00 +Köpfli Stephanie;03:49:57 +Walser Hans;03:56:38 +Abderhalden Claude;03:41:42 +Abdo Osman;02:58:00 +Abegglen Timon;03:58:34 +Abgottspon Benjamin;04:50:43 +Achermann Alois;03:58:12 +Ackermann Michael;03:18:34 +Adler Ruedi;03:31:56 +Adler Sandro;04:27:06 +Aebersold Thomas;04:14:11 +Aebi Hansjörg;04:12:29 +Aeby Pascal;03:48:08 +Aegerter Michael;04:45:55 +Aeschlimann Martin;03:49:39 +Affentranger Fernando;03:58:24 +Agostini Bernardo;03:51:52 +Ait Bahassou Mohamed;03:05:18 +Akeret Martin;02:59:54 +Akermann Elmar;04:13:06 +Albers Vincent;03:14:20 +Albin Basil;04:10:33 +Albin Norbert;03:56:43 +Albin Silvan;04:10:34 +Alder Daniel;04:41:19 +Alder Ernesto;03:59:27 +Alfassi Sami;03:48:59 +Allemann Patrick;04:18:55 +Alpiger Patrick Michae;03:55:21 +Amacker Hugo;03:42:20 +Ambühl Dany;04:33:00 +Amstalden Guido;03:50:47 +Amstutz Jean-Luc;03:19:09 +Andenmatten Cyril;03:43:33 +Anderegg Kurt;03:54:38 +Andres Peter Thomas;03:20:56 +Andrews John;03:33:53 +Anneler Albert;04:59:47 +Antweiler Ralf;03:13:22 +Arbenz Beat;03:42:12 +Aretano Aldo;04:30:15 +Arm Ueli;03:32:38 +Arnold Philipp;02:41:46 +Artan Ayhan;03:16:46 +Aurag Daniel;03:45:18 +Azzato Remo;04:20:56 +Bäbler Ruedi;04:32:46 +Bachmann Markus;03:01:39 +Bachmann Markus;03:56:19 +Bachmann Rolf;03:49:30 +Bächthold Jj;04:20:38 +Baco Uwe;03:27:34 +Bader Sandro;03:45:03 +Badertscher Christian;03:40:18 +Badorff Cornel;03:27:32 +Baer Tobias;03:16:28 +Baeriswyl René;04:07:47 +Bahl Alexander;04:26:05 +Bahner Bertram;03:20:11 +Bako Barnabas;04:34:08 +Bamert Rafael;03:32:01 +Bangerter Adrian;03:08:16 +Bannier Marcel;03:39:04 +Bänninger Andy;03:17:49 +Bärtsch Jonas;04:26:32 +Baschera Matteo;03:39:47 +Basler Michael;03:45:33 +Bauer Jürgen;04:17:56 +Bauer Mathias;03:35:49 +Bauert Stephan;03:20:28 +Baumann David;03:13:50 +Baumann Reto;03:23:53 +Baumgartner Benjamin;03:11:34 +Baumgartner Christoph;03:02:43 +Colombani Jonathan;03:02:45 +Baumgartner Philipp;03:14:08 +Bäumler Werner;03:59:00 +Baumstark Achim;03:24:55 +Baur Sigrist Dieter;04:00:33 +Bayer Claudio;04:13:54 +Bebi Michael;04:30:52 +Beeler Karl;02:48:41 +Beeli Gian;04:27:39 +Beer Patrick;04:22:37 +Beglinger Michael;04:27:45 +Beglinger Urs;03:18:09 +Belk Thomas;04:26:06 +Benfatto Alessandro;03:42:59 +Benz Andy;02:48:55 +Berg Christian;03:27:36 +Berger Gedeon;04:12:06 +Berger Olivier;03:44:03 +Berger Walo;04:08:34 +Bernet Heiri;03:03:49 +Bernet Rolf;03:51:10 +Bernhard Daniel;03:37:57 +Bernhardsgrütter Pitsc;03:27:47 +Bernotto Stefano;03:55:01 +Bertozzi Silvio;04:25:58 +Berz Fabian;03:26:17 +Betschon Stefan;03:45:15 +Bettini Enrico;03:49:03 +Biber Alex;03:40:45 +Bichler Christoph;03:31:24 +Biedermann Daniel;03:03:17 +Bieler Walter;03:23:17 +Bieri Walter;03:20:22 +Neiger Lukas;03:24:45 +Bigler Gilles;03:45:09 +Billeter Jürg;03:33:56 +Binder Walter;03:55:38 +Binggeli Hansjörg;04:26:21 +Birbaum Patrice;03:35:36 +Birrer Hanspeter;04:38:21 +Bischofberger Guido;02:54:27 +Bissig Hans;03:34:42 +Bissoli Benno;03:44:17 +Bitterlin Stephan;04:22:11 +Blaser Hanspeter;04:18:12 +Blaser Sascha;03:14:32 +Blattmann Heiner;02:59:53 +Bleiker Harry;04:01:36 +Blöchlinger Fabian;02:58:56 +Blumer Philipp;03:28:15 +Blumer Renato;04:36:55 +Blumer Sascha;03:43:56 +Bodenmann Andreas;02:55:28 +Bodenmann Hanspeter;03:40:22 +Bodmer David;04:25:48 +Bohnet Christophe;03:04:42 +Bohnet Nicolas;03:04:07 +Boller Simon;03:45:47 +Bolli Kilian;03:30:05 +Bolliger Bruno;04:28:09 +Bollinger Beat;03:39:58 +Bolt Thomas;02:55:14 +Bommer Hans;04:15:28 +Böniger-Prüfer Michael;03:47:21 +Bonner John;04:16:28 +Bonvin Jean-Charles;03:04:59 +Bonvin John;03:59:43 +Born Leo;03:29:51 +Bortolin Sergio;04:21:40 +Bosshard Stefan;03:23:59 +Bottecchi Diego;03:32:12 +Boulter Robert;02:59:49 +Boutellier René;02:41:54 +Bozi Imre;03:20:05 +Braathen Einar H;04:57:19 +Bracher Ueli;03:28:21 +Brachetto Pascal;03:45:04 +Brändli Jakob;04:08:40 +Brändli Urs-Beat;03:09:05 +Brandt Maximilian;03:58:13 +Brandt Simppa;03:15:55 +Brecht Jens;03:37:16 +Breimer Mans;03:40:50 +Bressa Massimo;03:46:41 +Brotz Sandro;03:42:38 +Bruderer Daniel;04:27:11 +Brühwiler Rolf;02:59:26 +Brüllmann David;03:57:33 +Brunhart Jakob;03:16:31 +Brunner Alfred;03:29:59 +Brunner André;03:21:22 +Brunner Jan;03:36:53 +Brunner Johannes;02:56:57 +Brunner Reinhard;04:23:31 +Bruno Emanuele;04:12:47 +Bruns Wolfgang;03:33:18 +Brunschweiler Marco;03:18:51 +Bucher Johannes;03:10:20 +Büchler Fredi;05:21:01 +Buchli Urs;04:52:55 +Buchser Thomas;03:41:24 +Buck Andreas;04:32:20 +Büeler Gerry;03:36:59 +Bügükkaya Abuzer;03:14:12 +Bühler D.J Wale;03:59:32 +Bühler Raphael;03:20:21 +Bührer John;03:43:03 +Bünter Jean Pierre;04:15:52 +Burger Willi;03:51:02 +Bürgi Simon;03:09:10 +Bürgis Stefan;03:28:37 +Burkhard Beat;02:39:47 +Burkhard Roger;03:45:58 +Burkhardt Ralf;03:46:35 +Burns Kevin;03:51:19 +Burri Christian;03:24:58 +Buser Thomas;04:05:20 +Buslau Michael;04:33:12 +Bussinger Manuel;04:32:51 +Bussmann Oliver;02:58:43 +Butty Stéphane;02:59:31 +Caflisch Amedeo;03:14:34 +Caillet Cédric;03:21:40 +Calame Louis;03:35:20 +Calcagni Carlo;03:52:42 +Calendo Ciro;04:32:47 +Camathias Ulrich;05:21:11 +Camenisch Glauco;03:25:24 +Camenzind Markus;03:00:07 +Caprez Andrea;02:54:43 +Carbonara Toni;04:16:44 +Carbotti Franco;03:35:47 +Caretta Claudio;04:12:04 +Carminati Walter;03:51:24 +Caruso Renato;04:29:06 +Casanovas Ramon;03:24:06 +Castella Vincent;03:13:41 +Castiglioni Luca;03:47:45 +Casto Salvatore;05:25:47 +Caudwell David;04:36:27 +Cavegn Werner;03:45:44 +Caviezel Andrin;03:41:56 +Ceccarini Massimo;03:26:18 +Ceriani Angelo;04:25:25 +Cester Marc;03:03:44 +Chapman Brian;04:14:02 +Chassot Pierre-André;03:43:24 +Chatila Rico;03:26:02 +Chatzichrisafis Nikos;03:33:49 +Chevalley Raymond;04:22:45 +Chiller-Glaus Michael;03:53:35 +Choffat Yves;03:17:39 +Choukroun Daniel;02:45:27 +Christ Tobias;03:30:40 +Christiner Mario;02:48:10 +Clavadetscher Georg;04:23:21 +Clesle Hanspeter;04:32:43 +Cloetta Andri;03:41:44 +Collenberg Reto;03:39:01 +Colvin Graham;03:20:35 +Conrad Alex;04:29:04 +Cooke Sam;03:28:23 +Corbisiero Salvatore;03:34:25 +Cortelezzi Paolo;03:40:05 +Cottet Laurent;03:23:56 +Crespo Ricardo;04:49:35 +Crettenand Olivier;04:25:31 +Crisafulli Sebastiano;03:26:57 +Curda Josef;04:37:56 +Curda Tobias;03:40:33 +Cusack John-Paul;03:38:38 +D'Amato Gionni;03:52:25 +Da Col Claudio;03:31:27 +Da Costa Fernando;03:05:47 +Daly Paul;04:21:31 +Dambach René;03:22:06 +Danz Martin;03:52:38 +Däpp Willi;04:17:14 +Dariz Michele;03:51:17 +Daschmann Volker;04:49:31 +De Faria Patrick;04:43:32 +De Martin Marco;02:49:12 +De Murga John;04:58:21 +De Plinval Pierre-Loui;03:41:55 +De Toffol Simon;04:14:18 +De Wit Guido;03:52:16 +Degen Lukas;02:58:50 +Della Badia Antonio;03:24:35 +Delley Alain;03:20:38 +Dentskevich Andrew;03:27:49 +Dessimoz Philippe;03:09:13 +Desteffani Jörg;03:09:27 +Dhom Michael;03:03:48 +Di Giorgio Benedetto;04:04:34 +Di Mauro Philipp;04:01:57 +Diallo Ousmane;03:23:35 +Dick Markus;03:21:35 +Diener Erwin;02:55:16 +Diethelm Karl;03:53:47 +Dietrich Rainer;03:00:12 +Dillner Tomas;03:03:47 +Diviney Craig;03:20:23 +Döbeli Philipp;03:05:55 +Dober Meinrad;03:38:30 +Dooney Barry;04:44:52 +Doubman Jay;02:57:42 +Downey Denis;03:53:09 +Drayton Jeffrey;03:43:02 +Dreier Daniel;03:51:25 +Dreier Matthias;03:18:07 +Dübi Roland;04:05:24 +Dubugnon Christian;03:27:29 +Dudle Cornel;03:35:12 +Duerr Hampi;03:36:35 +Dummermuth Jürg;03:09:28 +Düringer Michael;03:39:12 +Durrer Daniel;04:27:31 +Dürst Michael;03:12:56 +Duschl Martin;04:25:17 +Dütschler Joel;03:06:38 +Eberhard Thomas;04:05:07 +Eberle Paul;03:44:00 +Eckard Christophe;03:47:58 +Eckert Clemens;03:24:09 +Eckhardt Jürg;03:42:48 +Eggenschwiler Bernhard;02:44:49 +Eggenschwiler Christop;02:59:47 +Eggenschwiler Denis;03:04:59 +Egidio Arturo;03:29:56 +Egli Martin;03:47:10 +Egli Peter;04:21:32 +Egli Sven;03:27:58 +Eiche Francis;04:06:02 +Eichelberger Pascal;04:01:48 +Eichhorn Beat;03:16:51 +Eisenlohr Frank;03:21:41 +Eisner Hannes;03:28:45 +Ellinger Thomas;04:11:31 +Elmer Markus;03:07:08 +Emert Frank;04:29:08 +Eppler Beat;03:09:38 +Erb Peter;03:10:21 +Erb Thomas;03:57:37 +Erian Tom;02:57:11 +Ernst Andreas;03:38:39 +Ernst Andreas;03:47:40 +Ettlinger Claudius;03:49:48 +Eugster Marcel;02:59:33 +Eugster Tobias;03:44:23 +Faccoli Gabriele;03:37:58 +Faerber Philipp;02:50:59 +Fahrni Andreas;03:22:49 +Falconer John;03:49:34 +Falcy Yves-Alain;04:23:41 +Falter Harald;03:19:52 +Fanger Adrian;04:11:25 +Fankhauser Martin;03:36:21 +Farner Kurt;04:41:50 +Farner Martin;03:51:54 +Farner René;03:29:55 +Farner Roger;03:51:55 +Fasel Samuel;03:49:40 +Fasnacht Markus;03:17:36 +Fässler Christoph;03:57:08 +Fässler Lukas;04:01:23 +Fatio Didier;03:16:59 +Fattorini Leonardo;02:54:53 +Fausch Jörg;03:42:54 +Fehr Adrian;03:32:24 +Fehr Harry;03:09:24 +Fehr Kurt;04:25:06 +Fehr Matthias;03:34:08 +Feigl Christopher;03:29:22 +Fejes Stefan;03:20:33 +Fejry Khalil;03:31:07 +Felchlin Walter;04:18:13 +Felder Oliver;03:57:32 +Felder Willhelm;04:27:39 +Fernandes Casimiro;03:04:51 +Fernandez Antonio;03:22:54 +Ferraiuolo Salvatore;03:40:18 +Ferrini Mattia;04:13:05 +Fetzer Roland;03:00:23 +Fior Guglielmo;02:59:38 +Fischer Cosy;04:26:53 +Fischer Felix;03:34:08 +Fischer Kai;02:43:15 +Fischer Oliver;03:10:50 +Flach Roland;03:28:52 +Fleischer Thomas;03:19:07 +Fleischhacker Cris;04:22:00 +Fleischmann Rene;03:37:43 +Fleischmann Sascha;03:28:45 +Flueckiger Joerg;03:55:45 +Flum Michael;03:29:34 +Föllmi Daniel;02:47:15 +Folly Olivier;03:08:24 +Fontana Patrick;04:49:09 +Forlesi Maurice;04:00:31 +Forney Jean-Francois;03:50:11 +Forrer Andi;03:57:35 +Forrer Markus;03:43:13 +Forrer Thomas;03:26:44 +Forster Urs;03:56:10 +Fort Pierre-Andre;03:43:23 +Fortgens Erik;03:12:57 +Foster Cheran;04:09:16 +Foster Kevin;03:39:59 +Fraefel Beat;03:39:42 +Fraefel Mario;03:42:55 +Franck Andreas;03:19:31 +Francois Herve;03:56:16 +Frehner Jakob;05:29:09 +Frei Christoph;03:34:04 +Frei Marc;03:37:59 +Frei Martin;02:44:02 +Frei Othmar;03:59:15 +Frei Pascal;03:34:47 +Frei Thomas;03:28:06 +Freisler Peter;04:06:40 +Fretz Willi;04:35:35 +Frey Dominik;04:00:28 +Frey Heini;03:56:30 +Frey Stefan;03:51:14 +Frieden Thomas;02:32:25 +Friederich Mathias;03:26:38 +Friedli Jürg;03:39:09 +Frischknecht Fritz;03:27:40 +Fritsche Lukas;03:29:27 +Fritschi Michael;03:19:32 +Fuchs Christian;02:58:20 +Fuchs Heinz;04:23:57 +Fuchs Markus;04:28:36 +Fuchs Peter;04:31:50 +Fürer Karl;03:30:37 +Furrer Felix;03:38:12 +Fürst René;03:25:04 +Fusco Carlo;03:20:24 +Gabathuler Tobias;03:35:08 +Gabriel Daniel;03:54:27 +Gächter Roland;03:22:01 +Gadient Hans;03:53:31 +Gähwiler Hanspeter;03:03:34 +Galliker Philipp;03:28:25 +Gambino Dario;04:12:56 +Gameiro Antonio;02:56:40 +Gantenbein Silvan;04:45:52 +Gartmann Urs;03:34:59 +Gasser Marc;03:44:28 +Gast Fritz;03:36:32 +Gattiker Roger;04:12:59 +Gaussmann Andreas;02:49:19 +Geiger Christian;03:30:05 +Geissbühler Andreas;03:12:39 +Geissmann Walter;03:27:55 +Genné Daniel;03:44:54 +Gerber Bernhard;04:11:50 +Gerber Roger;02:49:17 +Gerber Thomas;03:14:33 +Gerlof Wolfram;04:36:04 +Germain Jean-Pierre;05:05:54 +Germann Pascal;03:24:18 +Gerster Richard;03:57:09 +Gertsch Marcel;02:52:23 +Gertsch Ralph;04:04:17 +Gertsch Silvan;04:09:01 +Gertschen Mike;04:14:45 +Gex-Collet Pierre-Jose;03:01:05 +Geyer Marc;04:48:45 +Gibel Richard;03:47:26 +Gigandet Sylvain;03:01:43 +Giordano Lorenz;03:33:03 +Girsberger Martin;03:49:07 +Gisler Beat;02:57:43 +Gisler Jan;03:05:52 +Gisler Karl;02:46:40 +Glässner Marcel;03:58:25 +Gleitz Robert;03:29:13 +Gloden Alain;03:42:54 +Gnos Renato;03:51:49 +Gomez David;04:38:57 +Gorgerat Jean-Philippe;03:10:36 +Gosteli Hansjörg;02:56:59 +Gosteli Oliver José;03:07:01 +Goto Fumihiko;03:28:24 +Gottwald Martin;03:53:30 +Götz Markus;03:59:00 +Grab Manfred;03:25:34 +Graber Marcel;03:10:08 +Graf Daniel;03:48:08 +Graf Klaus;03:29:26 +Granges Thierry;03:08:17 +Grausgruber Johannes;04:21:27 +Greil Maeck;03:13:35 +Greter Arno;04:19:22 +Grisoni Gérald;03:50:38 +Gröbli Adrian;02:42:11 +Grossmann Frank;03:06:51 +Grubenmann Hens;03:42:41 +Gruber Bernhard;03:48:54 +Grüebler Thomas;04:28:45 +Grujcic Dejan;03:59:53 +Grundmann Oliver;03:56:49 +Grüter André;02:58:56 +Grütter Matthias;03:04:15 +Gubler Daniel;03:23:50 +Gubler Peter;05:00:05 +Gückel Christian;03:18:41 +Gudehus Kim;03:34:02 +Guex Stéphane;03:07:06 +Gugelmann René;03:23:28 +Guidon Andri;03:58:33 +Guignard Philippe;03:48:33 +Guillet Marc-Antoine;03:42:50 +Günthard Huldrych;03:44:06 +Gunti Markus;03:14:02 +Gut Daniel;03:24:08 +Gutjahr Rolf;02:58:02 +Gutzwiller Mark;03:48:16 +Gyger Peter;03:05:00 +Gygli Walter;03:03:59 +Gysin Ernst;05:07:37 +Ha Thomas;03:41:22 +Haas Ingo;03:05:20 +Hablützel Roman;02:55:57 +Hadorn Jonas;04:49:10 +Haefeli Stephan;03:48:07 +Häfliger Peter;03:28:20 +Häfliger Rolf;03:44:11 +Hähni Marcel;04:10:06 +Haider Martin;03:35:02 +Halvorsroed Jan;04:30:52 +Hänggi Gerold;04:26:09 +Häni Stephan;03:13:50 +Hannah Jeremy;03:14:27 +Hannay Mark;03:46:52 +Hansen Kjetil Hoie;03:53:12 +Hansmann Daniel;03:26:44 +Härri Markus;02:56:18 +Haselbach Stefan;03:15:22 +Häsler Daniel;03:40:47 +Hässig Ralph;03:45:53 +Hassler Daniel;03:06:09 +Haubensack André;03:54:47 +Haukaas Magnus Solli;04:02:41 +Hausammann Urs;03:35:21 +Hauser Daniel;03:01:58 +Hauser Olivier;04:01:12 +Hauser Thomas;03:00:12 +Hauser Thomas;03:05:45 +Häusermann Christian;03:10:43 +Haussner Enrico;03:10:05 +Heckendorn Felix;04:54:02 +Heer Dominik;03:49:37 +Hefti Gian-Franco;02:59:32 +Hegglin Marco;03:52:19 +Hegglin Markus;03:30:57 +Hegner Norbert;02:38:11 +Heide Uwe;04:15:06 +Heiniger Peter;03:46:31 +Heiniger Stefan;03:52:21 +Heinz Max;03:33:11 +Helbling Daniel;03:21:41 +Helbling Felix;03:48:07 +Held Michel;03:20:14 +Henle Lukas;03:49:53 +Herger Anton;04:11:29 +Herrmann Daniel;03:07:48 +Hersche Marcel;04:48:12 +Herz Daniel;03:49:14 +Hess Dieter;03:24:08 +Hess Florian;04:13:36 +Hess Michael;03:33:11 +Heyer Serge;04:13:31 +Hilpertshauser Urs;04:18:49 +Hiltbrand Martin;03:19:24 +Hirschi Alexandre;03:56:11 +Hischier Aldo;03:43:51 +Hochuli Reto;03:18:25 +Hodel Roger;03:11:15 +Hofer Cédric;05:20:20 +Hofer Erich;03:44:20 +Hofer Urs;03:57:42 +Hofmann Edy;03:54:47 +Hofmann Raymond;03:00:32 +Hofstetter Martin;03:53:26 +Hofstetter Roman;03:39:15 +Hohl Andreas;03:26:04 +Holenweger Mirko;03:28:22 +Holenweger Thomas;04:16:36 +Hölling Matthias;04:11:46 +Holub Marc;04:20:54 +Holzhüter Dirk;02:56:32 +Hommann Edgar;03:33:34 +Hookey Mark;05:08:11 +Höppli Marcel;04:18:59 +Horat Karl;03:43:51 +Hosner Markus;04:22:08 +Huber Andreas;03:55:22 +Huber Daniel;04:06:24 +Huber Erwin;04:14:35 +Huber Michael;02:59:15 +Huber Michael;04:34:43 +Huber Rolf;03:31:34 +Huber-Meier Hans;04:09:42 +Hug Jean-Pierre;03:34:08 +Hugener Thomas;04:39:42 +Hugentobler Martin;03:07:55 +Hügli Heinz;03:53:16 +Humbel Markus;04:10:57 +Hungerbühler Andreas;03:51:39 +Hürlimann Fabrizio;03:55:19 +Hurni Beat;04:33:18 +Huser Josef;04:06:01 +Huser Roland;03:21:57 +Huwiler Denis;03:23:18 +Ijland Marcel;04:06:59 +Illi Ruedi;03:28:01 +Immer Marcel;03:34:15 +Inglin Roger;04:28:05 +Ingold Marc;03:54:20 +Ingold Markus;03:25:36 +Ingold-Martinez Lukas;03:43:56 +Inzirillo Maurice;03:03:34 +Ippel Rene;03:35:14 +Iseli Ernst;04:32:16 +Isenring Martin;03:39:07 +Aeschlimann Ulrich;03:13:16 +Ismajli Alban;03:42:49 +Iten Ralph;04:28:17 +Iten Roman;03:48:06 +Jacky Florian;03:57:40 +Jacobs Reto;03:21:41 +Jäger Fabian;04:16:02 +Jäggi Andreas;03:40:32 +Jähde Oliver;03:28:19 +Janes Paul;03:29:51 +Janssen Volker;03:50:45 +Jegerlehner Andreas;05:07:38 +Jenny Florian;03:58:43 +Jimenez José Manuel;03:30:23 +Jöchle Werner;04:28:05 +Johnson Mike;03:29:50 +Joos Markus;02:40:24 +Jörgensen Martin;04:05:49 +Jöri Sandro;02:45:27 +Jornot-Schmitt Michael;04:23:37 +Joss Marc;02:57:44 +Jost Urs;03:39:56 +Jud Toni;02:52:57 +Juengling Stephan;03:43:04 +Jung Urs;03:21:31 +Jutz Josef Sepp;04:48:17 +Jutz Otto;03:14:52 +Jutz Stephan;04:16:13 +Jutzi Urs;04:54:10 +Kaderli Oliver;04:03:21 +Kägi Benjamin;04:15:08 +Kägi Christian;04:35:32 +Kägi Rolf;03:54:31 +Kaiser Walter;05:10:37 +Kälin Christian;03:28:06 +Stampfli Marc;04:23:41 +Kälin Stefan;03:07:00 +Kalt Markus;02:57:56 +Kameni Gaétan;03:28:13 +Kamer Stefan;03:08:06 +Känzig Jürg;03:57:34 +Karlen Werner;04:23:48 +Käser Hans;03:56:16 +Kastrati Albert;05:21:39 +Kathriner Reto;03:01:41 +Kätsch Hans-Martin;04:24:59 +Kaufmann Corrado;04:19:27 +Kaufmann Ferdi;03:43:39 +Kaufmann Hubert;03:04:03 +Kaufmann Michael;02:53:19 +Kehl Arthur;03:41:36 +Keller Christian;02:53:05 +Keller Michael;03:14:50 +Kellerhals Martin;02:59:54 +Kempter Christoph;03:47:44 +Kerenyi Alexander;03:24:44 +Kern Andreas;04:27:23 +Kern Daniel;03:34:17 +Kersten Udo;03:58:34 +Kessler Beat;03:22:49 +Kessler Marcel;04:36:38 +Kessler Nicolas;02:54:36 +Kessler Thomas;04:17:33 +Key Matthew;03:41:19 +Kimati Celso;04:34:19 +Kirchmayr Wolfgang;03:36:00 +Kirst Christian;03:06:06 +Kiser Felix;04:31:01 +Kistler Roger;03:26:48 +Klaus Oliver;03:04:59 +Kläusler Stefan;03:02:23 +Klingelfuss Marc;03:52:57 +Klingenberg Björn;03:11:35 +Klopfenstein Marco;03:41:02 +Klotz Matthias;02:53:23 +Klotzsch Thomas;02:57:37 +Knapp Christian;03:11:29 +Knobel Albert;03:13:01 +Koch Dominik;02:45:03 +Kock Carsten;02:59:08 +Kodlinsky Christian;04:37:31 +Kohler Marcel;05:10:40 +Kohler Pirmin;04:00:18 +Koller Gerold;02:59:33 +Kölliker Thomas;03:14:11 +Kolly Jean-Bernard;03:13:14 +Königbauer Stefan;03:43:36 +Koskela Ari;03:09:54 +Kostic Milan;03:57:18 +Koutny Zdenek;03:23:51 +Krähemann Thomas;03:40:47 +Kral Philipp;04:19:30 +Krause Rainer;03:14:44 +Krebs Marcel;03:38:13 +Krebs Markus;03:33:16 +Krebs Sandro;03:47:07 +Krebs Thomas;03:41:12 +Kreis Pablo;04:03:57 +Kreis Simon;03:19:31 +Krieger Urs;02:59:44 +Kron Marius;03:18:23 +Krucher Daniel;03:13:52 +Kubli Jürg;03:45:40 +Kuczynski Roman;03:25:29 +Kuhn Bruno;04:09:49 +Kühne Raphael;03:23:39 +Kuipers Dennis;02:42:30 +Kulendik Martin;04:29:19 +Kümin Michael;05:05:16 +Kündig Walter;03:24:59 +Küng Martin;03:56:01 +Küng Ralf;04:11:58 +Kunkel Maximilian;03:07:48 +Kunz Dieter;04:22:50 +Kunz Gerhard;03:09:07 +Kunz Markus;04:40:40 +Künzle Peter;03:16:12 +Kupny Wojciech;05:23:35 +Kushwaha Imran;03:12:23 +Küttel Lars;03:45:04 +Küttel Peter;02:58:08 +Küttel Ruedi;03:23:20 +Kyburz Reto;03:23:32 +Lagotzki Andreas;04:21:42 +Lamard David;03:36:50 +Lambert Gerard;04:02:37 +Lampart Remo;03:26:15 +Landi Marco;03:23:33 +Landtwing Martin;04:54:11 +Langenegger Christian;03:25:43 +Langridge James;03:43:34 +Lanter Guido;03:39:57 +Lanz Peter;04:07:17 +Larsson David;03:56:14 +Lasser Philippe;03:51:09 +Laticevschi Dumitru;03:35:32 +Lay Daniel;03:42:40 +Le Quang Duc;03:59:50 +Ledergerber Ruedi;04:32:10 +Ledergerber Stefan;04:32:10 +Leek Peter;02:59:20 +Lehner Jürg;03:57:37 +Leimgruber Jörg;03:15:32 +Lennon Mark Antony;04:03:01 +Lerose Luigi;03:54:21 +Leserf Gottlieb;04:38:43 +Letta Marco;03:24:07 +Leuenberger Frank;03:36:30 +Leuenberger Hans;03:54:21 +Leuenberger Michael;03:41:23 +Leuthold Bernhard;03:26:03 +Liard Gilles;03:21:25 +Lichtin Jürg;03:34:19 +Lichtsteiner Klemens;03:51:32 +Liechti Alexander;04:10:06 +Lienhard Cédric;03:06:33 +Lienhard Tobias;04:27:54 +Lindner Jack Olav;03:26:11 +Lindsay Luke;03:42:14 +Lippuner Christoph;03:49:09 +Liver Richard;03:50:15 +Lloyd William;03:35:22 +Locantore Paolo;04:27:21 +Lockyer Mark;04:01:55 +Lockyer Paul;04:30:44 +Loher Martin;03:26:47 +Lohri Philipp;02:52:34 +Loiudice Giulio;04:01:09 +Loosli Peter;03:21:24 +Lorenz Roman;03:43:56 +Lorenz Tino;03:50:20 +Louis Jvan;03:39:52 +Loye Eric;03:27:17 +Luder Beat;02:44:46 +Luginbühl Guy;03:36:20 +Lüönd Urs;03:42:14 +Lupp Bjoern;04:04:57 +Lüscher Urs;03:00:51 +Lustenberger Silvan;03:46:35 +Lusti André;03:41:12 +Lutz Hansjörg;03:47:12 +Luzzani Roger;02:57:26 +Maccioni Sandro;04:04:04 +Machowetz Alex;03:49:38 +Macquarrie Hugh;04:08:57 +Stadler Christian;02:51:48 +Magnenat David;03:26:51 +Maier Jürgen;03:47:16 +Maier Robert;03:57:45 +Maier Thomas;05:04:51 +Maier-Thurn Marcus;05:25:28 +Maillard Joel;04:23:55 +Maillefer Joël;02:45:44 +Maio Giuseppe;03:55:33 +Mani Simon;02:50:34 +Mann Felix;03:38:33 +Marchand Antoine;02:46:45 +Marchand Tony;02:52:58 +Mariuzzo Christian;03:27:13 +Marrel David;03:21:55 +Marro Alain;03:20:56 +Marta Massimo;03:24:48 +Martel Sylvain;03:34:24 +Marti Michael;03:59:00 +Martin Javier;04:33:40 +Martin Sergio;03:37:34 +Martino Giuseppe;03:32:26 +Marty Patrick;03:12:04 +Marty Philipp;04:27:48 +Matos Gilberto;04:06:32 +Matter Chrigi;04:41:38 +Mattheis Hartmut;05:12:34 +Mattle Paul;03:46:07 +Mattmüller Martin;03:45:00 +Maurer Heinz;03:15:31 +Maurer Oliver;03:25:13 +Maurer Urs;03:17:04 +Maury Laribiere Martia;03:37:06 +Mayer Jens;03:53:36 +Mccreadie Murray;02:57:57 +Mecchia Francesco;03:59:13 +Meier Andreas;03:37:11 +Meier Daniel;03:51:59 +Meier Elias;03:23:41 +Meier Franz;03:35:51 +Meier Heinz;03:35:11 +Meier Kusi;04:36:10 +Meier Marcel;03:57:58 +Meier Marcel;03:56:53 +Meier Michael;03:24:24 +Meier Patrick;03:45:18 +Meier Peter;04:17:58 +Meier Roland;03:57:37 +Meier Simon;03:09:02 +Meier Stefan;05:18:06 +Meierhans Roman;03:49:47 +Felix Manuela;04:27:31 +Meisser Reto;03:43:24 +Meister Roger;04:08:36 +Mele Piero;04:17:55 +Melzer Tino;03:01:31 +Menghini Daniel;03:40:05 +Menzi Micha;03:07:26 +Merkle Othmar;03:18:39 +Merkt Peter;02:46:41 +Merup Christian;03:11:09 +Mesaros Thomas;03:31:36 +Metger Georg;04:11:15 +Metzler Hans;03:28:18 +Meuris Richard;03:56:30 +Meyer Daniel;03:54:19 +Meyer Stephan;03:39:00 +Michel Dominique;02:53:22 +Michel Walter;03:28:38 +Michnac Ivan;03:17:43 +Milesi Luca;03:29:29 +Milic Mladen;03:50:36 +Millius Beat;03:05:01 +Misic Andrija;03:45:35 +Misiek Wiktor;04:39:59 +Mistretta Antinoo;03:22:25 +Mittelholcz Béla;02:59:34 +Moehlecke Thomas;03:38:22 +Moggi Christoph;03:07:46 +Mohring Stephan;04:14:29 +Mollitt Andrew;03:43:01 +Monachon Jean-Claude;03:48:13 +Monney Roland;03:55:16 +Montanari Matteo;03:58:59 +Monterosso Germano;04:11:41 +Monterosso Vincenzo;03:31:29 +Mordasini Niccolo;03:50:29 +Moret Eloi;04:20:10 +Morley Tim;05:01:53 +Moscetti Christian;04:23:30 +Moser Felix;03:25:57 +Moser Rudolf;03:36:15 +Mosetti Nicolas;03:07:06 +Mourtada Samir Paul;04:04:00 +Mozzi Guido;04:58:45 +Muehlethaler Adrian;03:05:54 +Muff Christian;03:17:48 +Muff René;02:59:55 +Muff Roland;03:44:48 +Müller Andreas;04:19:43 +Müller Bruno;02:59:29 +Müller Daniel;02:41:27 +Müller Hans-Jörg;03:39:32 +Müller Hansruedi;04:54:25 +Müller Heinrich;04:50:24 +Müller Lukas;02:58:48 +Müller Michael;03:27:18 +Müller Michael;04:47:25 +Müller Patrick;03:20:42 +Müller Rolf;03:24:52 +Müller Ronnie;03:37:55 +Müller Thomas;03:18:13 +Mumenthaler Stephan;03:18:08 +Munz Thomas;04:44:53 +Murer Werner;04:12:53 +Muriqi Agron;03:51:22 +Murray Mark;03:12:56 +Nachbaur Gerd;03:42:44 +Nater Remo;03:15:12 +Naylor Charles;03:55:34 +Nazabal Alexis;03:27:10 +Neff Armin;03:23:51 +Neff Yanick;03:35:05 +Neuländner Martin;03:45:52 +Neumüller Peter;02:59:15 +Nicolet Samuel;02:57:24 +Niederberger Guido;05:01:39 +Niederberger Philippe;03:11:47 +Niederer Christian;03:44:10 +Niedermair Uli;03:13:04 +Niethammer Thomas;03:22:03 +Niklaus Michael;03:26:55 +Nobis Markus;03:30:49 +Noli Lorenz;03:57:45 +Notter René;04:10:33 +Notter Stefan;03:13:32 +Notz Ruedi;04:12:35 +Nussbaum Walter;02:51:47 +Nutt Reto;03:31:59 +Nyikos Thomas;02:58:29 +Oberkalmsteiner Karl;03:25:11 +Oberle Adrian;03:32:21 +Obermeit Volker;03:48:01 +Obrecht Walter;03:41:35 +Ochsner Daniel;03:50:44 +Ochsner Harry;03:57:42 +Odermatt Fredi;03:14:26 +Odermatt Michael;02:56:50 +Odermatt Urs;03:18:56 +Oehninger Ernst;04:44:48 +Oester Patrick;04:29:57 +Omollo Omondi;03:39:25 +Oppitz Lothar;03:30:46 +Oppitz Ulrich;03:33:17 +Oppliger Christophe;02:58:07 +Oreilly David;03:22:25 +Ortega Ilias;04:50:08 +Ortkemper Frank;04:00:41 +Ott Manuel;04:19:27 +Otter Ueli;04:05:48 +Overbeck Gernot;04:04:16 +Overeem Joost;04:00:38 +Paccaud Christophe;03:23:05 +Pacozzi Romeo;03:54:08 +Page Basile;03:24:58 +Pagy Eilam;04:17:56 +Palmiere Cristian;03:36:36 +Panatti Erik;02:55:22 +Passera Giacomo;03:58:51 +Pauchard Patrick;03:42:45 +Pedrini Claudio;04:34:43 +Peinsold Martin;03:23:16 +Pellegrini Flavio;03:19:52 +Pellet Laurent;03:30:38 +Peng Pierre;05:29:00 +Pepe Pasquale;03:55:45 +Perisset Laurent;03:27:54 +Perseghini Mauro;03:06:10 +Pescheta Donato;02:47:34 +Peter Guido;04:13:58 +Peterhans Urs;04:45:28 +Petrig Markus;03:42:58 +Peyer Thomas;03:43:03 +Pfäffli Roger;04:23:41 +Pfändler Jonas;03:23:40 +Pfenninger Roland;04:25:03 +Pfister Felix;03:49:12 +Pfister Heinz;04:49:13 +Pfister Jeremias;03:57:51 +Pfister Samuel;04:19:00 +Pfyffer Roland;03:18:30 +Pfyffer Urs;03:20:18 +Pianaro Claudio;03:17:17 +Piguet Florian;02:44:03 +Pillard Luc;05:12:05 +Piras Davide;03:58:44 +Pirrello Antonino;03:54:18 +Pirscher Andreas;03:20:13 +Pittet Laurent;02:48:33 +Place Raymond;03:57:29 +Ploetz Armin;03:36:55 +Plum Carsten;03:28:52 +Plüss Fabian;03:42:49 +Porfido Franco;03:25:53 +Portmann Hansjörg;03:18:53 +Portmann Marco;03:53:52 +Németh Aniko;03:38:23 +Portmann Thomas;03:04:13 +Praz Max;03:46:00 +Procacci Fabio;05:27:44 +Protze Sören;03:32:31 +Pulizzi Antonino;04:30:16 +Putallaz Jean-Yves;03:46:42 +Quauka Daniel;03:24:49 +Quirici Giulio;03:13:54 +Raca Mirko;03:56:05 +Raccuglia Armando;03:50:52 +Ramer Stefan;03:47:44 +Randegger Erwin;04:35:57 +Ranta Tommy;03:13:32 +Raschle Adrian;03:53:25 +Rasquinet Patrick;05:33:14 +Raymann Patrick;03:32:12 +Rechsteiner Helmut;03:28:02 +Rechsteiner Kuno;02:54:25 +Rehm Martin;03:36:33 +Rehmet Joachim;03:58:16 +Reichmuth Thomas;03:43:29 +Reinhard-Miltz Gerhard;03:39:41 +Reinhardt Stephan;04:24:27 +Reitbauer Stefan;03:26:39 +Rentsch Peter;04:22:15 +Reutemann Patrick;04:39:43 +Rentsch Max;03:21:56 +Rezzonico Andrea;03:27:57 +Richter Carsten;03:15:23 +Richter Manfred;04:25:00 +Richterich Lukas;03:21:29 +Riedi Mattias;04:03:12 +Riekert Patrick;04:10:28 +Rigoni Bruno;03:45:09 +Rinderknecht Christoph;03:39:20 +Rindlisbacher Martin;02:45:30 +Rippstein Guido;03:45:54 +Risby Lee Alexander;04:13:36 +Risi Christoph;04:03:02 +Ritler Roger;03:25:15 +Ritschard Mario;03:59:14 +Ritter Daniel;03:21:43 +Ritz Daniel;03:19:33 +Rizzello Roberto;04:23:05 +Rodelli Leo;03:59:53 +Roduit Pascal;03:38:15 +Roduner Christoph;04:00:27 +Roffler Markus;03:32:14 +Rohner Marius;04:09:52 +Rohr Stephan;02:46:41 +Rohrer Hansruedi;03:07:34 +Röllin Martin;04:13:18 +Roman Emilio;03:18:19 +Rosen Oliver;03:43:32 +Rosic Renato;04:39:25 +Rosset Gilles;03:43:26 +Rossi Lorenzo;03:23:54 +Roth Heiner;04:15:00 +Roth Nick;03:36:42 +Röthlisberger Andres;04:37:29 +Röthlisberger Sergio;04:25:03 +Röthlisberger Urs;04:16:25 +Roulet Vincent;03:54:01 +Rückstein Bruno;04:34:57 +Rudaz Gérald;04:23:41 +Rudolf Hanspeter;03:27:18 +Rüede Christian;03:53:44 +Rüede Nico;03:59:46 +Rueegg Patrick Stefan;03:44:51 +Rüegg Armin;04:53:59 +Rüegg Walter;03:27:05 +Rüesch Peter;03:42:38 +Ruf Andreas;04:11:30 +Rupper Patrick;03:56:31 +Rusch Stefan;03:39:31 +Safi Kamran;03:52:32 +Sägesser Simon;03:10:45 +Salamin Michel;03:14:35 +Salmi Janne;02:40:56 +Salzmann Urs;02:58:48 +Sanchez Walter;05:02:44 +Sano Shogo;04:07:36 +Sara Benedé Enrique;03:49:28 +Sauder Patrick;02:46:46 +Saurer Werner;03:51:01 +Sauter Markus;03:05:55 +Savill Ian;04:04:16 +Savola Juha;02:59:23 +Schaad Marco;02:59:09 +Schaad Thomas;03:31:23 +Schaerer Bruno;04:37:21 +Schaermeli Claudio;03:32:27 +Schäfer Andreas;04:44:07 +Schäfer Roger;03:54:43 +Schäffer Beat;03:30:50 +Schär Markus;03:25:26 +Schärer Kurt;03:38:13 +Schärli Christoph;04:27:06 +Schaub Rolf;03:40:58 +Schegg Stefan;03:53:05 +Scheidegger René;03:34:04 +Schelbert Armin;03:17:03 +Schenk Felix;02:40:59 +Schenkel Patrick;03:54:05 +Scherer Kurt;02:48:44 +Scherzinger Fredy;03:47:12 +Schibig Viktor;04:14:23 +Schilling Martin;03:26:17 +Schläfli Matthias;03:27:33 +Schläpfer Marco;03:41:13 +Schlatter Adrian;02:47:58 +Schlatter David;03:56:07 +Schlicht Michael;03:56:54 +Schlub Jarbas;03:32:39 +Schlüchter Roland;04:08:56 +Schmid Philipp;04:35:30 +Schmid Tobias;04:24:42 +Schmid Tom;03:50:12 +Schmid-Erni Reto;03:54:33 +Schmidt Roberto;03:28:11 +Schmidt Urs;04:11:40 +Schmidt Urs-Peter;03:24:14 +Schmied Bruno;04:15:44 +Schmutz Dominik;03:10:12 +Schneckenburger Julian;03:20:55 +Schneider Hans-Peter;03:43:26 +Schneider Jochen;03:59:45 +Schneider Martin;03:49:35 +Schneider Martin;03:14:47 +Schneider Reto;03:31:42 +Schnüriger Erwin;03:21:49 +Schnyder Roger;02:39:40 +Schoch Christoph;03:45:11 +Scholian Heinz;03:18:56 +Scholl Hans;03:09:32 +Schönenberger Bruno;03:44:13 +Schönenberger Felix;04:12:40 +Schönenberger Samuel;03:48:07 +Schönenberger Tim;03:22:48 +Schönenberger Urs;02:59:20 +Schönherr Andreas;03:27:28 +Schöni Beat;03:37:03 +Schöni Martin;03:14:32 +Schoppe Mathias;03:20:08 +Schorno Enrico;03:27:34 +Schranz Fred;03:13:16 +Schreiber Mark;03:30:52 +Schreiber Simon;03:24:29 +Schröder Jan;03:45:37 +Schüepp Daniel;03:58:33 +Schuler Paul;03:16:16 +Schuler Werner;04:56:45 +Schulte Christian;03:47:49 +Schultheiss Tobias;03:45:27 +Schulze Elko;03:49:49 +Schüpbach Fabian;04:19:23 +Schütz Patrick;02:54:51 +Schütz Reinhart;03:06:23 +Schweitzer Pascal;04:03:43 +Schweizer Marcel;04:37:07 +Schwery Rolf;04:49:04 +Scotece Gerardo;03:11:52 +Seeger Andreas;04:15:25 +Seiler Rico;03:19:04 +Seipel Oliver;04:28:28 +Seki Tomoo;04:30:38 +Semadeni Gian Andrea;03:48:33 +Senn Lucien;03:58:23 +Senteler Roger;03:26:22 +Serrano Camilo;04:25:15 +Sgier Giusep;03:17:08 +Sibilia Enrico;03:56:19 +Sieber Oliver;03:44:20 +Siegenthaler Fredy;03:38:44 +Siegrist Thomas;03:16:43 +Signer Martin;03:06:23 +Signer Ueli;03:42:23 +Sigrist Daniel;03:40:57 +Sigrist Felix;03:07:04 +Silberschmidt Rico;03:26:22 +Simon Robert;04:53:49 +Siragusa Pietro Giovan;04:03:53 +Sitruk Yves;04:32:17 +Smith Craig;03:27:00 +Somerville Trevor;04:03:32 +Soto Josetxo;03:20:56 +Spaargaren Marco;03:06:49 +Spaggiari Giuseppe;03:54:22 +Späh Martin;04:06:19 +Specht Dominique;04:03:52 +Al-Godari Hamid;03:41:40 +Spielhofer Hans;03:59:34 +Spielhofer Reto;03:54:43 +Spiess Thomas;03:10:09 +Spilker Max;04:03:58 +Spitteler Peter;03:18:07 +Spitznagel Kurt;04:10:00 +Spörndli Daniel;03:19:23 +Sprenger Raphael;02:58:37 +Spring Daniel;02:44:39 +Stadelmann Marc;04:22:33 +Maeder Walter;03:24:38 +Stadler Marcel;03:16:27 +Stadler Reto;03:44:02 +Staeheli Oliver;03:57:53 +Staffelbach Thomas;03:08:56 +Stähli Sandro;03:45:28 +Stamm Dominik;03:52:10 +Stamm Franz;03:21:11 +Stamm Urs;04:25:34 +Stämpfli Bernhard;02:54:25 +Kälin Kurt;03:43:37 +Stangl Dominik;03:00:46 +Stangl Stefan;03:04:52 +Stäuble Roland;03:04:43 +Staudenmann Beat;03:15:38 +Stauffacher Ruedi;03:11:28 +Stauffer Alexandre;04:06:21 +Stauffer Mario;05:15:15 +Stauffer Markus;03:42:13 +Stebler Markus;03:02:06 +Steffen Peter;03:10:42 +Steigmeier Linus;04:08:41 +Stein Martin;03:22:45 +Steiner Armin;02:50:52 +Steiner Daniel;03:43:36 +Steiner Markus;03:05:14 +Steiner Patrick;03:24:12 +Steiner Peter;04:09:50 +Steiner Rolf;03:09:05 +Steiner Thomas;04:10:46 +Steinhof Co Rosen Arne;03:47:55 +Stern Pascal Nicolas;03:19:11 +Stettler Roman;03:40:48 +Stifel Peter;04:15:30 +Stillman David;02:38:27 +Stirnemann Paul;03:40:07 +Stirnimann Daniel;02:41:11 +Stocker Ueli;03:49:26 +Stockmann Hubertus;03:25:34 +Stoll Oliver;04:02:48 +Storchenegger Daniel;03:42:10 +Strähl Stefan;02:51:29 +Strebel Philipp;02:59:26 +Strehler Erich;03:13:55 +Streich Daniel;04:41:40 +Streiff Christoph;03:43:42 +Streule Ralf;04:01:55 +Strickler Werner;04:03:01 +Strimer Simon;03:34:57 +Stucker Jürg;03:46:43 +Studer Adrian;03:15:06 +Studer Jürg;03:44:32 +Studer Peter;03:36:35 +Stupp Oliver;03:26:35 +Sturzenegger Hans-Rudo;03:28:40 +Sturzenegger Michael;03:33:10 +Sturzenegger Thomas;03:32:38 +Stütz Andy;03:11:15 +Stutz Bruno;04:20:28 +Stutz Michael;03:26:25 +Stutz Toni;03:46:37 +Sulser Silvio;03:09:20 +Sumi Arthur;04:36:55 +Süssli Eric;03:16:24 +Suter Jürg;03:50:56 +Sutter Jürg;04:32:57 +Swars Erik;03:53:42 +Szegvary Thomas;02:51:21 +Szentgyörgyi Istvan;04:12:33 +Tabakovic Velid;03:48:12 +Tacca Gianni;03:48:33 +Tanner Marcel;03:02:51 +Tauber Albert;03:52:15 +Tellefsen Anders;03:49:52 +Teshima Ryo;05:12:50 +Thalmann Rolf;03:25:29 +Theis Manuel;03:26:20 +Theules Olivier;03:43:07 +Thiel Dieter;04:13:20 +Thoma Remo;03:23:37 +Thoma Turi;03:17:57 +Thür Raphaél;03:39:33 +Thurre Jean-Daniel;04:37:23 +Tighnavard Babak;04:11:49 +Tobler Urs;04:26:49 +Tourolle Bruno;05:09:51 +Traber Fabio;04:23:21 +Trajkovic Ivo;03:18:32 +Tremp Christof;03:32:14 +Tresch Reto;03:27:44 +Triantafillou Christos;04:52:37 +Tripolt Fabio;04:50:44 +Troller Rolf;03:16:04 +Trolp Frank;03:47:42 +Troxler Andreas;03:05:43 +Trümpler Michael;03:59:59 +Truninger Joey;04:21:42 +Trüssel Stefan;03:32:50 +Tschamon Martin;04:26:02 +Tschanz Lukas;03:50:40 +Tschopp Silvan;03:11:38 +Tschumper Markus;03:23:05 +Turberg Yves;03:11:45 +Uebbing Jürgen;03:25:51 +Ueltschi Thomas;03:03:16 +Ulber Wolfgang;02:56:59 +Ullmann Rolf;04:23:43 +Ulrich Daniel;02:47:17 +Umbricht Niklaus;03:28:21 +Vacheron Thierry;03:56:01 +Vagt Toni;03:05:22 +van Zyl Charl;03:17:57 +Veronesi Silvio;04:04:59 +Vetsch Matthias;03:20:04 +Vieux Florian;02:44:19 +Vilchez Martin;03:32:58 +Voegeli Matthias;03:46:10 +Vögeli Pierre;04:20:39 +Voegeli Ueli;03:36:28 +Vogel Hanspeter;04:59:03 +Vogel Markus;03:42:53 +Vogel Roland;03:59:22 +Vögeli Bernhard;04:15:08 +Völlmin Manuel;03:19:55 +von Dahlen Steffen;03:47:50 +von Holzen Christoph;03:01:28 +von Kaenel Dominik;04:54:14 +von Mandach Conrad;03:15:07 +Vonarburg Christian;03:43:28 +Vonbach Lukas;03:27:53 +Vonplon Raymond;03:46:02 +Votteler Michael;04:08:24 +Vournelis Ellin;03:19:49 +Vuillemez Samuel;03:08:05 +Vuilleumier Cédric;04:14:26 +Waeber Pascal;03:03:57 +Wahl Kurt;03:53:47 +Waldburger Hans;03:57:57 +Walder Vitus;03:13:37 +Waldis Stefan;02:55:28 +Waldner Peter;03:19:31 +Allemann Urs;03:34:53 +Wälti Jean Pierre;03:28:59 +Wälti Thomas;03:30:38 +Wangler Timothy;03:43:31 +Wanner Florian;03:27:05 +Wanner Laurent;03:44:52 +Weber Heinrich;04:07:24 +Weber Jakob;03:15:35 +Weber Peter;03:13:56 +Weber Stefan;03:28:52 +Wegmann Marco;02:53:05 +Wegmann-Wittlin Andrea;03:08:13 +Wegscheider Beat;03:13:23 +Wehrli Fabian;03:53:27 +Weibel Patrick;03:45:57 +Weibel Xaver;03:20:43 +Weiersmüller J-C;05:01:02 +Weilenmann Pascal;04:21:39 +Weiler Andreas;02:49:59 +Weiler Christoph;03:53:47 +Weiser Thomas;04:26:18 +Weisheimer Thomas;03:21:52 +Weisser Klaus;03:47:57 +Welbergen Anthony;03:18:37 +Welten Ernst;04:24:38 +Wenger Urban;03:33:01 +Werder Daniel;03:44:31 +Wernli Oliver;03:27:50 +Wernli Raphael;03:39:33 +Wespi Marcel;03:13:52 +Westphalen Stephan;05:24:41 +Wettstein Erich;03:48:10 +Wettstein Markus;03:27:17 +Wicki Roger;03:14:34 +Widmer Erhard;03:49:04 +Wildhaber Walter;03:49:04 +Wilkening Jan;03:08:18 +Willisegger Christoph;03:25:32 +Wilson Antony;03:48:14 +Windmüller Stefan;03:56:11 +Winistörfer Georges;04:20:29 +Winkler Michael;02:44:19 +Wirz Daniel;03:27:50 +Wittlin Marc;03:42:46 +Wittwer David;05:10:20 +Wohlers Florian;03:42:07 +Wolf Etienne;02:32:49 +Wollnow Jörg;04:10:28 +Wörner Mike;03:23:40 +Wullimann Markus;02:51:35 +Würzebesser Christian;04:26:22 +Wüthrich Jürg;03:47:43 +Wyler Karl;03:47:18 +Wymann Fredi;04:30:06 +Wymann Markus;04:43:36 +Wyniger Lukas;03:21:22 +Wyss Eric;02:54:59 +Wyss Roman;02:55:54 +Wyss Stefan;03:26:00 +Yamashita Masato;03:43:53 +Zabe-Kühn Martin;03:41:01 +Zampiccoli Manuel;04:05:48 +Zanella Bruno;04:49:35 +Zangl Christian;03:41:31 +Zaouia Mehdi;04:14:01 +Zbinden Manfred;03:40:48 +Zbinden René;03:25:40 +Zbinden Thomas;02:54:31 +Zeder Markus;03:11:35 +Zeder Patrick;03:06:35 +Zehnder Marcel;03:10:08 +Zekhnini Ahmed;04:49:37 +Zemp Marco;03:23:55 +Zemp Markus;03:07:50 +Zengaffinen Erwin;03:54:57 +Zgraggen Franz;03:20:19 +Ziegler Marc;04:19:45 +Ziegler Robert;03:44:31 +Zimmerli Thomas;03:32:23 +Zimmermann Patrick;03:29:36 +Zimmermann Robert;03:38:54 +Zingg Christoph;03:02:52 +Zink Fritz;04:07:32 +Zoder Roland;02:53:55 +Zoller Stefan;03:23:42 +Zollinger Marcel;03:17:44 +Zuber Benno;03:40:35 +Zuber Ralf;04:35:44 +Zubler Martin;03:22:58 +Zulauf Stefan;04:04:22 +Zumer Robert;03:36:37 +Zumsteg Rene;03:45:16 +Zurbuchen Christian;03:51:40 +Zurflüh-Begré Daniel;03:13:49 +Zutter Jerome;04:04:45 +Zwahlen Beat;03:57:51 +Zwick Jürg;03:17:10 +Zwygart Stephan;04:01:59 +Alvarez Fernando;03:51:14 +Ambrosini Stefan;04:55:45 +Ayeah Ebenezer;03:17:16 +Bachsteffel Niklaus;03:30:01 +Bagnoud Gérard;02:39:30 +Bartel Marco;03:44:18 +Barz Andreas;04:09:47 +Baumann Rainer;03:15:53 +Baumann Walter;02:57:59 +Baumgartner Andreas;03:51:00 +Beck Jan;03:03:19 +Beer Sebastian;03:17:11 +Beerli Urs-Peter;03:20:06 +Beermann Stefan;03:09:44 +Bekcic Vladimir;03:37:21 +Benkert Fritz;03:38:32 +Birkenmaier Claude;03:38:56 +Blum Edgar;03:52:36 +Bogner Walter;03:03:47 +Bonfanti Stefan;03:17:04 +Bronner Reto;03:52:08 +Brönnimann Ruedi;03:24:43 +Bucher Martin;03:07:06 +Buehler Andreas;03:34:03 +Buerki Fritz;04:35:05 +Bühlmann Daniel;04:12:59 +Burgener Hubert;03:35:04 +Bürgi Thomas;03:06:51 +Businger Urs;03:20:45 +Camenzind Peter;02:54:41 +Carisch Emanuel;03:55:06 +Carrasco Ernesto;04:38:15 +Casanova Lukas;03:37:50 +Castella Jean-Marc;05:11:31 +Caviezel Marzel;03:39:40 +Coradi Thomas;03:57:57 +Coray Roger;03:59:48 +Crosara Michel;03:09:28 +Derron Simon;04:07:34 +Dobler Christoph;03:32:07 +Dos Santos Nelson;04:33:45 +Duschen Patrick;03:07:44 +Dütschler Reto;03:57:58 +Eckert Marc;04:24:13 +Egger Daniel;03:12:08 +Ehrbar Martin;03:13:13 +Eigenmann Raffael;03:26:14 +Enemrke Simon;03:34:52 +Fallegger Hans-Jörg;03:26:03 +Fessler Andreas;05:33:39 +Forster Martin;03:57:47 +Frei Nicola;03:18:16 +Fritz Romeo;04:21:34 +Geissmann Willy;04:04:51 +Gisi Daniel;02:58:06 +Gomez Carlos;03:09:16 +Gossauer Andreas;04:23:59 +Graham Colin;03:25:39 +Grau Patrick;04:38:55 +Grüninger Thomas;03:56:50 +Gujer Hanspeter;04:21:31 +Gyger Franz;03:06:10 +Haider Thomas;02:53:41 +Haller Heinrich;03:14:40 +Hartmann Thomas;04:21:26 +Haueter Max;04:12:49 +Hauser Wolfgang;02:55:57 +Häusler Philippe;03:26:49 +Herren Lars;04:11:27 +Hertach Alain;03:46:24 +Hess Ivan;03:43:57 +Hess Oliver;04:05:34 +Hohler Patrick;03:56:55 +Holenweger Michael;04:16:36 +Hollenstein Alex;03:44:11 +Hösli Hans;03:28:24 +Hubacher Thomas;03:13:08 +Huber René;04:36:47 +Hug Rene;03:14:54 +Humbel Jürg;03:30:52 +Hungerbuehler Pius;03:53:02 +Inniger Hans-Christoph;04:41:42 +Janser Alfred;04:13:22 +Jegen Thomas;03:57:29 +Joller Thomas;03:23:38 +Jutzi Stephan;04:09:25 +Kaufmann Hanspeter;03:50:16 +Kellenberger Stephan;03:15:43 +Keller Daniel;03:58:39 +Keller Ernst;02:58:15 +Kelling Udo;03:04:50 +Kimmerlin Thierry;03:16:52 +Kindlimann Heinz;03:43:31 +Kobi Peider;04:43:57 +Kopalek Peter;03:20:33 +Küchler Thorsten;03:22:32 +Kuster Marcel;03:17:29 +Kuster Matthias;03:53:57 +Lanz Peter;02:51:38 +Laubscher Daniel;03:35:14 +Leach Steven;04:22:52 +Leder Manfred;03:38:05 +Lehmann Nik;03:08:46 +Lehni Markus;03:51:10 +Leiggener Christoph;04:24:27 +Leuener Felix;03:56:31 +Loosli Adrian;03:07:31 +Lopes Oliveira Leonel;03:05:47 +Lorencez Isaac;03:48:08 +Lucas François;03:44:05 +Lüthi Jean-Pierre;03:36:16 +Lüthi Marc;04:06:42 +Lüthi Markus;03:55:50 +Maag Reto;03:30:04 +Maegli Rolf;04:07:31 +Maier Bernhard;03:49:12 +Malacarne Sergio;03:57:34 +Martel Jan;04:12:25 +Maurer Dani;03:06:14 +Meichtry Urs;03:14:13 +Meier Bruno;03:03:26 +Meier Daniel;03:28:25 +Meier Martin;04:39:50 +Merian Paul;03:27:56 +Messer Markus;03:18:13 +Metzger Bernhard;04:24:15 +Minuscoli Patrik;03:17:11 +Miralhos Paulo;02:42:54 +Moncaro Andrea;04:00:17 +Montagut Vidal Jorge;03:27:46 +Moser Ives Jan;03:13:18 +Moser Mario;04:25:43 +Motavalli Masoud;04:39:41 +Mühle Housi;03:44:56 +Mullaney Chris;04:00:35 +Murbach Umberto;04:44:47 +Nehmer Raphael;04:12:31 +Neuenschwander Hanspet;04:31:36 +Notter Thomy;04:11:43 +Nünlist Nüni;04:26:57 +Nusseck Peter;03:20:19 +Nyfeler Thomas;03:29:17 +Oberhänsli Fabian;03:20:58 +Obrist Beat;04:26:57 +Obrist Fabio;04:11:19 +Odden Lee;03:26:42 +Odermatt Karlheinz;04:23:05 +Oetiker Beat;04:43:15 +Omlin Niklaus;03:39:26 +Ommerborn Stephan;03:57:30 +Ort Fred;03:42:06 +Pagan Olivier;03:56:16 +Pauli Marc;03:18:53 +Perez De La Sota Gabri;04:08:57 +Perren Patrick;02:42:52 +Pfäffli Andreas;03:12:35 +Pfister Andreas;03:11:43 +Pfister Christian;03:51:55 +Plattner Daniel;04:14:34 +Poenaru Daniel;03:58:25 +Portmann Philipp;03:33:19 +Pravato David;03:18:04 +Provinzano Ignazio;03:14:06 +Racine Gabriel;04:12:19 +Raiser Thomas;03:30:12 +Rando Andrés;03:36:42 +Reber Rolf;03:30:37 +Renz Thomas;03:17:41 +Rickenbacher Leo;03:03:42 +Risler Martin;03:31:03 +Romer Paul;03:16:56 +Rüegg Roman;03:23:46 +Russenberger Thomas;03:30:07 +Rütimann Willy;04:06:31 +Sadriu Kreshnik;05:17:51 +Salisbury David;03:40:37 +Schädeli Ernst;03:44:00 +Schäfer Kai;03:05:08 +Scheller Gerd;03:15:32 +Schiavarelli Nicola;03:31:43 +Schlepfer Roland;04:07:21 +Schmidl Martin;03:21:19 +Schmitt Marius Gerhard;03:43:19 +Schuler Othmar;03:10:19 +Schwegler Klaus;04:12:49 +Siegenthaler Thomas;03:43:26 +Signer Peter;03:36:24 +Spiegel Patrick;03:11:15 +Städler Oliver;03:32:53 +Steiner Daniel;04:36:39 +Steinhauser Jürg;03:55:45 +Stephani Reto;04:14:32 +Stoppiello Frank;04:27:04 +Strebel Paddy;03:33:53 +Suter Daniel;04:04:30 +Taucher Joshua;04:22:37 +Thode Andreas;03:34:42 +Isler Bruno;03:33:38 +Thomschke Till;03:33:50 +Tobler Daniel;03:12:40 +Tomic Slobodan Bob;04:29:48 +Tonak Torsten;02:52:15 +Tonolli Alberto;05:04:59 +Tuta Niko;04:18:53 +Vogt Roland;03:42:03 +von Känel Hans;03:40:14 +Vonchristen Martin;04:08:13 +Walder Christoph;04:27:39 +Walker Steven;03:10:20 +Walter Martin;03:02:43 +Wang Lei;05:21:55 +Wehren Marcel;03:31:01 +Wey Franz;04:08:53 +Wey Herbert;04:01:43 +Wey Simon;03:22:42 +Wick Bernhard;03:50:22 +Wille David;04:46:13 +Wirth Thomas;04:30:41 +Wüest Simon;03:59:02 +Wunderli Andreas;03:38:17 +Wyler Marco;04:21:15 +Zähnler Bruno;04:27:22 +Zehnder Rolf;03:58:45 +Zehntner Daniel;03:23:23 +Zimmermann Niklaus;03:36:50 +Zimmermann Werner;04:37:54 +Zumbach Charles;03:33:26 +Ackermann Martin;03:28:06 +Berndt Matthias;04:05:43 +Bertucci Dario;03:51:29 +Buchmann Remo;04:12:44 +Flückiger Hans;03:46:16 +Germann Peter;03:32:20 +Hagemann Peter;03:31:09 +Halme Tero;02:59:02 +Huber Daniel;03:25:29 +Jeannet Olivier;03:26:00 +Jorge Humberto;03:38:11 +Kälin Sepp;03:27:46 +Kellenberger Daniel;04:33:31 +Knupfer Stefan;02:58:32 +Knüsel Markus;03:26:26 +Kovar Thomas;02:59:45 +Kuhn Matthias;03:02:55 +Lustenberger Kurt;02:39:45 +Mantel Rico;05:11:09 +Martin Ludwig;03:26:31 +Mazzotta Cosimo;03:21:14 +Moret Raoul;03:55:48 +Nebbe Harry;03:13:15 +Neuenschwander Andre;04:13:30 +Pellegrini Fausto;03:08:09 +Pellkofer Martin;03:32:45 +Peterli Ralph;04:26:53 +Phan Quang Biu;03:38:30 +Ruoss Patrick;03:17:49 +Ryser Martin;03:22:53 +Schmid Andreas;02:45:39 +Schmidt Yvan;04:03:33 +Schwarzkopf Dominik;04:57:38 +Stoob Max;04:29:24 +Tomczak Krzysztof;03:13:04 +Wellington Daniel;03:57:55 +Zgraggen Lorenzo;04:01:05 +Häuptli Daniel;03:34:36 +Babounakis Antonios;03:20:54 +Di Giovanni Bruno;03:54:13 +Böni André;04:21:43 +Keller Christian;04:40:52 +Briner-Weber Markus;03:43:34 +Brenner Patrick;02:38:58 +Oyetan Seun;04:24:23 +Manivanan Vijay Sudhak;04:08:11 +Lehner Markus;04:23:29 +Stadel Joachim;03:14:49 +Sudan Philippe;03:11:11 +Holzapfel Helmut;04:10:32 +Lanz Martin;02:37:54 +Gorrie Luke;04:44:13 +Sutter Markus;03:05:39 +Meier Werner;03:51:16 +Mvongo Jean-Paul;03:20:08 +Czaykowsky Marco;03:25:26 +Czaykowsky Yves;03:14:06 +Kümin Otto;05:09:42 +Thalmann Daniel;03:15:41 +Wespi Bernhard;03:41:54 +Geiger Christoph;04:18:19 +Oswald Flurin;05:01:23 +Mader Kevin;03:20:24 +Gentile Daniele;03:26:43 +Ahler Markus;03:58:28 +Zuzolo Vincenzo;04:32:45 +Lochmann Guido;04:03:18 +Bartosch Lukas;03:54:56 +Pfyffer Stefan;03:37:36 +Unternährer René;03:24:40 +Habisreutinger Thomas;03:35:27 +Pokora Daniel;03:13:45 +Steinbach Simon;03:44:59 +Bischof Harald;04:06:47 +Kohli Bernhard;03:40:30 +Bigger Reto;03:25:21 +Lopez Oswaldo;04:38:07 +Ortiz Claviso Luis Alb;04:28:03 +Richner Peter;03:29:21 +Beinhoff Martin;03:51:58 +Bucherer Thomas;04:07:49 +Cupples Richard;03:34:25 +Dorn Alexander;03:47:21 +Frou Benoit;03:31:11 +Gerull John-Phillip;03:23:42 +Hertig Andi;03:59:01 +Joss Myriam;03:33:17 +Lichtenberger Alexande;04:10:32 +Mimouni Didier;03:13:49 +Moeckli Simon;03:55:15 +Nashid Ibrahim;04:13:34 +Ochsner Thomy;04:52:15 +Schmid Alex;04:20:38 +van Ulzen Manuela;03:56:48 +Vogeli Bernhard;03:23:07 +Waldburger Claudio;03:43:51 +Walser Alexander;04:15:57 +Witzel Christian;03:17:20 +Rupp Thomas H.;03:29:09 +Affolter Darius;03:24:44 +Graham Angus;04:31:29 +Lee Jon;03:55:54 +Luessi Andreas;03:19:44 +Melas Theocharis;05:24:59 +Rentsch Beat;03:41:14 +Rezk Markus;03:56:55 +Schumacher Martin;03:44:43 +Sieger Pascal;03:17:43 +Sutter Andy;04:12:08 +van Buul Peter;03:26:02 +Wieland Lucio;04:56:57 +Zuzak Miro;04:30:29 +De-Vizzi Evelyn;04:52:55 +De-Vizzi Fiona;04:26:54 +Kläger Roland;03:15:58 +Allard Darren;04:26:56 +Greco Luigi;04:01:57 +Huber Sibylle;03:52:02 +Ostertag Andreas;03:02:03 +Piekarz Iwona;04:05:35 +Rodriguez José Manuel;04:26:30 +Waelti Philippe;03:43:39 +Ziegler Philippe;03:26:06 +Baumgartner Rico;03:57:39 +Cestonato Antonella;04:01:16 +Eggenberger Kurt;03:40:38 +Enderlin Michèle;04:41:47 +Hauser Claudia;03:53:32 +Litscher Daniel;04:06:55 +Regenscheit Fabian;03:43:11 +Sommer Martin;04:23:44 +Mathis Stefan;03:36:46 +Merkli Stephan;03:06:32 +Türler Thomas;03:08:12 +Baumann Matthias;03:31:08 +Baumgartner Philip;03:42:46 +Biefer Christian;03:34:56 +Faller Sascha;04:17:10 +Ganz Jeannette;03:52:36 +Hari Daniel;03:01:44 +Hüsser Zoe;04:10:43 +Lacy David;03:26:32 +Maag Felix;03:38:30 +Rehal Jaspal;03:53:54 +Sax Fredi;04:31:08 +Schmitt Martin;03:54:46 +Schraven Jan-Christian;05:28:19 +Stoller Fabienne;04:38:16 +Winkler Hansjörg;03:25:01 +Zanotelli Reto;03:47:17 +Hug Pascal;03:13:19 +Pavlovic Marko;03:06:25 +Seebach Nicole;04:18:42 +Wegmann Joachim;04:22:49 +Leupi Daniel;03:38:01 +Ziegler Roger;03:16:34 +Fässler Hildegard;03:38:29 +Egger Urs;03:17:35 +Egger Urs;03:35:12 +Abele Martin;03:17:01 +Schmidig Urs;03:25:06 +Mayenzet Didier;03:24:19 +Rüdisüli Pius;03:09:17 +Lauener Nicole;03:55:59 +Wettstein Peter;03:58:32 +Wettstein Peter;03:33:56 +Wettstein Peter;03:48:10 +Welti Martin;03:21:19 +Smits Léon;03:31:41 +Diethelm Theri;04:17:34 +Achermann Annemarie;04:04:04 +Thomys Heike;03:55:56 +Thomys Heike;04:04:24 +Dettwiler Daniel;03:35:12 +Zehr Bruno;03:20:21 +Spycher Hunziker Susan;03:29:11 +Grieder Sandra;04:03:23 +Schumpf Nicole;04:33:36 +Gantner Felicitas;03:39:29 +Vaucher Pascale;03:37:56 +Frost Elke;03:15:55 +Vorbrodt Dominique;03:41:23 +Koch Pascal;03:21:34 +Ferrari-Fidel Frederic;03:21:19 +Cloos Lis;03:42:50 +Urosevic Aleksandra;03:36:55 +Knaus Michèle;04:24:04 +Flückiger Miriam;03:48:12 +Stutz Markus;03:29:55 +Niffenegger Viktor;03:15:01 +Wehleit Kolja;03:37:34 +Wehleit Kolja;03:53:06 +Wehleit Kolja;03:38:34 +Knecht Anina;03:28:39 +Pfister René;04:04:57 +Fröhlich Valérie;03:35:20 +Blomberg Per-Inge;04:02:01 +Lhommel Laurence;03:13:06 +Bollinger-Könz Dieter;03:08:41 +Brutschi Daniela;03:38:47 +Platzer Martina;03:46:53 +Ammann Barbara;02:58:56 +Aubry Luzia;03:29:33 +Stössel Daniel;03:26:15 +Gschwend Christian;03:41:46 +Leiser Kolja;03:37:04 +Grütter Urs;03:05:29 +Coester Franz;03:53:05 +Wirz Markus;03:25:52 +Wirz Markus;03:22:32 +Albisser Beat;03:36:49 +Endres Julia;03:56:24 +Ummel Beat;03:14:20 +Fischer Hurter Daniel;03:12:31 +Senn Rolf;03:04:12 +Tobler Raphael;03:17:22 +Tobler Raphael;03:16:41 +Tobler Raphael;03:15:21 +Eggimann Thomas;03:25:22 +Bartholdi Andre;03:26:19 +Merk Gaby;03:49:16 +Limacher Esther;03:20:57 +Badertscher Sara;03:45:10 +Francotte Benedicte;03:55:30 +Boschung Bernard;04:01:42 +Oswald Manfred;03:27:07 +Steiner Markus;03:28:41 +von Euw Martin;03:40:19 +Buergi Taboada Carole;03:09:43 +Cordey Olivier;03:44:06 +Richinger David;03:29:20 +Caminada Rafael;03:47:59 +Schuermann Balz;03:14:12 +Charrière Thomas;03:49:45 +Vaterlaus Peter;03:34:58 +Eggimann Andreas;03:21:26 +Gemperle Patrik;03:40:13 +Point Laetitia;03:24:53 +Preisig Ueli;03:25:43 +Huber Nadine;04:15:00 +Friedli Corinne;03:30:37 +Knechtli Thomas;03:26:56 +Hasler Catherine;03:32:33 +Böllenrücher Melanie;03:09:13 +Oung Raymond;03:57:14 +Hassler Daniel;03:33:44 +Bachmann Maria;03:43:11 +Petersen Claus Gregers;04:00:18 +Petersen Claus Gregers;03:52:08 +Koch Roman;03:56:38 +Thalmann Hans-Peter;03:44:32 +Beck Lea;03:30:28 +Beck Lea;03:10:59 +Beck Lea;03:27:46 +Inderbitzin Kevin;03:30:31 +Ledergerber Isabelle;03:26:53 +Carnevale Vito;03:54:49 +Nguyen Raphael;03:38:06 +Huwyler Reto;03:49:32 +Trappitsch Stefan;03:49:28 +Meier David;03:55:16 +Weisstanner Andreas;03:39:43 +Donath Marc;03:33:25 +Klein Tobias;03:51:55 +Keller Claudia;03:33:02 +Gabriel Reto;03:35:04 +Holzinger Thomas;03:35:01 +Frischknecht Christine;03:52:07 +Roth Jeannine;04:01:38 +Delahaye Benjamin;03:22:30 +Trifari Patricia;03:34:45 +Mühlberg Martin;03:28:10 +Leuenberger Susanne;04:09:14 +Lurati Laura;03:41:38 +Cackett Joanne;03:35:02 +Baumgartner Philipp;03:31:11 +Altmann Andreas;03:38:29 +Marti Gabriel;03:20:21 +Steiger-Glocker Gaby;03:59:20 +Ruprecht Balz;03:04:17 +Stoessel Laura;03:39:06 +Lauffenburger Roman;03:56:36 +Williamson Libby;03:54:41 +Koch Gisela;04:21:23 +Gubelmann Patrick;03:49:50 +Majoleth Stefan;03:16:44 +Parro Paolo;03:23:59 +Zollinger Reto;03:23:12 +Gundermann Julia;04:19:35 +Tross-Müller Marianne;04:02:29 +Müller Anna-Katharina;03:32:55 +Suter Lorena;03:46:31 +Grindley Peter;03:49:28 +Leutwiler Sara;03:40:08 +Bachmann Beatrice;04:23:48 +Streuli Gabriela;03:18:41 +Stefka Daniel;03:49:46 +Kofel Felix;03:34:29 +Burkhard Patrick;03:06:38 +Hess Corina;03:56:24 +Lehmann Beat;04:18:47 +Patkovic Slavica;04:14:22 +Rudat Jörg;04:03:15 +Price Robert;03:48:57 +Imhof Nathalie;04:10:43 +Sommer Ernesto;04:23:31 +von Gunten Erich;03:36:42 +Niederberger Katja;04:31:56 +Püchel Johannes;03:43:53 +Studer Lukas;03:20:55 +Graf Bettina;03:32:31 +Burckhardt Straub Caro;04:10:05 +Camenzind Sepp;03:36:18 +Rech Marielle;03:25:46 +Gut Michael;03:31:07 +Sigg Arnold;03:25:00 +Honegger Silja;03:45:55 +Heiz Patrick;04:12:02 +Rais Jeanne;04:01:39 +Beyeler Erika;03:53:31 +Zürcher Thomas;03:33:57 +Sutter Matthias;03:46:55 +Sutter Matthias;03:24:44 +Sutter Matthias;03:54:50 +Jud Maria;03:49:48 +Bonfranchi Riccardo;04:33:12 +Rigamonti Alessandro;03:31:34 +Kaufmann Patrick;03:26:30 +Ortega Lydia;04:20:15 +De Faveri Marisa;03:50:29 +Ortega Lydia;03:41:42 +Hruba Gabriela;03:35:52 +Hruba Gabriela;03:53:28 +Kilbert Gert;02:58:12 +Aniol Wars;02:51:31 +Kraus Bret;03:31:50 +Wenger Esther;03:58:17 +Schneeberger Ivonne;03:33:36 +Luginbühl Carolin;03:41:17 +Furrer Roman;03:24:42 +Nesme Salome;03:41:42 +Pirlet Xavier;02:51:29 +Schneeberger Ivonne;03:55:03 +Schneeberger Ivonne;03:30:43 +Schneeberger Ivonne;04:34:24 +Schneeberger Ivonne;03:40:37 +Schneeberger Ivonne;03:13:40 +Schneeberger Ivonne;03:50:16 +Schneeberger Ivonne;03:54:05 +Schneeberger Ivonne;03:14:16 +Schneeberger Ivonne;04:05:02 +Montanari Dani;03:01:41 +Dolfing Henrico;02:52:39 +Maag Ana;02:50:57 +Hafner Markus;03:48:44 +Schilliger Rolf;03:41:56 +Fontanive Christian;04:39:49 +Fontanive Christian;03:32:31 +Fontanive Christian;03:50:43 +Mäder Petra;04:12:24 +Schneeberger Ivonne;04:13:15 +Ritter Christine;03:53:54 +Hancock Julia;04:06:52 +Hildebrand Carmen;03:30:30 +Reiser Evelyne;03:23:32 +Schaller Oscar;02:58:40 +Fäh Marco;03:03:43 +Grogg Diana;03:08:03 +Holdener Laura;03:57:17 +Jud Janine;03:28:37 +Ebnöther Reto;03:18:10 +Thomas Astrid;04:08:52 +Schawalder Peter;03:51:06 +Lassmann Fredi;03:09:56 +Hansmann Nicole;03:52:12 +Fuhrer Susanna;03:36:22 +Güttinger Daniel;03:34:01 +Eugster Olivier;02:53:58 +Fitoussi Cecile;04:32:55 +Holzberg Nina;03:38:14 +Zahno Andi;03:54:03 +Gyomlay Katinka;03:40:30 +Leitner Fabian;03:19:16 +Reber Samuel;03:13:08 +Marti Georg;03:33:04 +Ruggaber Michel;03:18:31 +Theiler Helen;04:11:34 +Theiler Helen;03:44:07 +Hormann Christian;03:28:45 +Hempen Roland;03:55:05 +Koch Gisela;03:50:52 +Kollbrunner Rebekka;03:53:14 +Schmid Daria;03:35:02 +Wigger Marcel;03:32:08 +Hirt Christian;04:11:43 +Mühlethaler Armando;03:37:55 +Weiss Ruth;03:45:49 +Weisstanner Andreas;03:30:56 +Roberts Tania;03:52:05 +Fischer Marcel;03:21:50 +Fischer Marcel;03:37:54 +Blunschi Selina;04:04:23 +Säuberli Franziska;03:50:01 +Hürlimann Janine;04:30:01 +Favre Guy;02:38:31 +Wehrli Edith;03:40:23 +Bonfils Jacqueline;03:40:51 +Schneider Sven;03:37:03 +Annaheim Simon;02:29:43 +Mohenski Brigitte;04:06:01 +Fischer Marc Pascal;03:17:03 +Stettler Stefan;03:49:30 +Stettler Christa;03:20:45 +Hocher Ursula;04:09:44 +Hager Michel;03:29:40 +Kreppke Jan-Niklas;02:37:53 +Grassi Grazia;04:03:01 +Cerjak-Frei Cornelia;03:52:05 +Suter Peter A.;03:32:10 +Föllmi Carolyn;04:15:45 +Bischof Simone;03:08:49 +Ruile Stefan;02:46:27 +Schneider Roland;03:46:04 +Scott Steven;03:04:03 +Hohl Isabelle;03:33:15 +Stirnimann Ruedi;03:47:04 +Stirnimann Ruedi;03:44:25 +Weiss Martin;03:07:33 +Fuccaro Alexandra;03:31:42 +Ratjen Christian;03:33:12 +Walter Susanna;04:09:57 +Lucas Elise;03:29:58 +Abbenseth Ben;03:13:55 +Skalik Vojtech;03:25:57 +Meier Michael;03:08:48 +Bieler Sarah;03:57:19 +Vetter Beat;03:02:15 +Klinkmann Thomas;03:22:48 +Frey Marcel;04:07:28 +Frey Marcel;03:33:33 +Scholz Urte;04:03:08 +Maltry Karin;03:50:28 +Gloor Marco;03:47:16 +Ströbele René;04:01:34 +Calörtscher Denise;03:37:54 +Magee Karina;03:21:43 +Rabenbauer Karin;03:48:48 +Rauber-Lüthy Christine;03:58:37 +Ballabio-Höhne Sabrina;03:52:51 +Mächler Emil;03:36:50 +Hausmann Nicole;04:00:49 +Kälin Robin;04:24:31 +Maier Sandy;04:04:36 +Werer Karin;03:41:33 +Schilling Stephanie;04:22:31 +Ineichen Gerhard;03:16:54 +Gilgen Sascha;03:27:09 +Salinas Antoinette;03:52:57 +Rüthemann Helen;03:25:42 +Bracko Oliver;03:09:00 +Schaelin Marcel;03:47:54 +Lüllau Claus;04:07:23 +Späni Andrea;03:41:38 +Donner Georg;03:26:31 +Rutz Eric;03:49:55 +Stampfli Reto;03:10:50 +Wloka Martin;03:32:23 +Belguendouz Abdelmalek;03:51:14 +Wüthrich Thomas;03:21:20 +Schmiedler Ursula;03:25:43 +Güldenapfel Erhard;03:41:31 +Schönbächler Ralph;03:41:31 +Hofmann Daniel;03:20:55 +Traxler Sabrina;03:23:26 +Traxler Sabrina;03:24:52 +Schneble Max Charles;03:11:57 +Wichmann Fabienne;03:47:39 +Frei Stefan;03:41:43 +Biedermann Urs;03:27:19 +Guindo Dominique;04:17:47 +Niehus Swaantje;03:43:50 +Chèvre Frédéric;04:07:45 +Mose Soren;03:43:22 +Shtufi Lara;03:59:00 +Müller Wenzel;03:51:13 +Schoenholzer Beat;03:46:45 +Schultz Tilman;04:07:14 +Kölsky Carsten;03:40:21 +Schieler Katrin;04:27:28 +Schmidt Marc Andre;04:13:16 +Kadlec Sven;03:35:45 +Hörler Rhea;03:59:12 +Gehri Friederike;04:01:45 +Kaufmann Christian;03:51:07 +Tschurr Flavian;03:20:50 +Dörgeloh Martin;03:13:13 +Elmer Heiri;03:23:34 +Elmer Heiri;03:31:30 +Elmer Heiri;03:26:55 +Stauch Vanessa;03:11:35 +Sieber Eva;03:57:18 +Suter Franziska;02:59:01 +Scattolin Pascal;03:11:31 +Walter Thomas;03:29:40 +Seger Holger;03:29:57 +Ruest Erich;03:29:54 +Sigrist Yvonne;03:28:37 +Landolt Fridolin;03:15:18 +Meier Anita;04:12:26 +Bleiker Rolf;03:21:31 +Fontolliet Daniel;03:55:58 +Foletti Anita;03:51:07 +Denier Claudia;04:05:17 +Fuchs Ruth;04:28:01 +Studer Larissa;04:07:31 +Flückiger Reto;03:42:29 +Egli Susanne;03:54:19 +Bachmann Roger;03:51:44 +Brunner Heiko;03:46:08 +Zemp Peter;03:51:09 +Bachmann Ruedi;03:22:08 +Camenzind André;02:54:12 +Steiner Sarah;03:34:59 +Walter Urs;03:28:45 +Curiger Andreas;03:08:36 +Romaniuc Marcelo Rober;04:07:36 +Fehr Jessica;03:30:09 +Jakob Barbara;03:42:04 +Jakob Barbara;04:00:14 +Casali Daniela;03:54:45 +Casali Fulvio;03:46:58 +Felger Martin;03:38:26 +Zürcher Toni;03:32:47 +Flachsmann Stefan;03:03:28 +Weiersmüller Jacquelin;04:07:45 +Weiersmüller Jacquelin;04:06:21 +Weiersmüller Jacquelin;04:02:38 +Weiersmüller Jacquelin;04:27:12 +Willi Barbara;03:20:14 +Auf der Mauer Raphael;02:43:58 +Kutej Stefan;03:27:40 +Cappiello Mauro;03:28:20 +Tatalias Melina;03:41:37 +Sherlock Cushla;03:41:14 +Benhauresch Abdel;03:27:43 +Pircher Daniel;03:54:15 +Sasso Angela;03:46:20 +Meyer Bernhard;03:13:50 +Olson Garrett;03:36:52 +Künzle Doris;03:39:37 +Knauer Anne-Juliane;03:25:26 +Schleifer Judith;03:57:50 +Goessler Franziska;03:43:50 +Beeler Etienne;03:27:16 +Wagner Mario;03:27:13 +Niklaus Christin;03:41:38 +Birkeland Ina;03:55:35 +Adelmann Horst;03:41:01 +Sommer Martin;03:55:51 +Eltgen Johannes;03:19:10 +Jörg Silvana;03:42:14 +Baumann Thomas;03:47:21 +Ulrich Barbara;03:41:15 +Volz Andreas;03:34:37 +Britschgi Dani;03:51:54 +Fleetwood Rahel;03:40:22 +Goulbourne Jane;04:06:30 +Plüss Samuel;03:22:32 +Fotheringham Jilly;04:39:27 +Wirz Peter;03:05:58 +Hall Terry;03:25:45 +Wintsch Hanna;03:52:58 +Götz Thomas;03:14:35 +Götz Thomas;03:10:48 +Krampf Eckhard;04:18:50 +Akpinar Hakan;03:04:17 +Bourquin Philippe;03:41:35 +Bley Petra;03:44:29 +Landolt Thomas;03:18:15 +Thoma Rolf;03:11:29 +Dickenmann Stefan;03:09:23 +Lehner Christoph;03:37:26 +Marxer Ruth;04:12:30 +Koch Gisela;04:00:22 +Hiestand Steve;04:09:43 +Maggiulli Ivan;04:22:05 +Wu Daye;03:43:45 +Wantz Nadine;03:37:12 +Müller Rolf;03:34:40 +Locher Beatrice;03:25:04 +Cevik Selim;03:40:55 +Schulz Bianca;03:30:38 +von Aesch Christoph;03:07:51 +Borner Laura;03:19:52 +Koch Gustav;03:21:28 +Lendenmann Tobias;03:37:11 +Berger Verena;03:36:21 +Berger Verena;03:31:16 +Berger Verena;03:35:27 +Betschart Markus;03:27:50 +Feroce Adrian;02:59:01 +Meier Thomas;03:02:31 +Müller Lothar;03:19:58 +Böni Ralf;03:20:43 +Koller Urs;03:23:11 +Bründl Michael;03:46:03 +Wicki Robin;03:10:14 +Fisler Guido;04:16:11 +Bonato Dario;04:00:03 +Müller Matthias;03:49:18 +Balz Rene;03:18:02 +Geiger Dominik;04:10:40 +Werder Roland;03:35:59 +Haldemann Peter;03:47:50 +Peterhans Renato;03:50:15 +Heusser Daniel;03:32:16 +Meuli Barbara;04:15:41 +Abplanalp Beat;02:56:18 +Hoogerwerf Erik;03:20:51 +Feurer Olivia;03:32:15 +Lange Otto;03:37:58 +De Lemos Antonio;04:10:09 +Seematter Marc;03:02:33 +Bühlmann Sandra;04:00:50 +Benz Fabienne;04:00:49 +Huber Paul;03:40:27 +Pilz Michelle M.;03:56:20 +Walser Thomas;03:40:42 +Senn Monika;03:40:59 +Denneberg Jürg;03:55:59 +Lutz Stephan;03:12:00 +Steiner Melvin;03:59:26 +Jetter Patrick;03:39:07 +Isler Dominik;03:33:58 +Kaufmann Ursula;04:14:10 +Reimann Olivia;03:41:57 +Ziesack Myriam;03:44:39 +Moser-Hausammann Brigi;03:56:57 +Moser-Hausammann Brigi;03:56:57 +Manz Hansruedi;03:40:15 +Manz Hansruedi;03:41:44 +Berli Beatrice;04:01:07 +Weiler Walter;03:05:54 +Bos Heleen;04:43:34 +Hoidn Anuschka;03:55:28 +Schroeder Bernd;03:26:23 +Barlow Mike;03:17:44 +Müller Philippe;03:17:20 +Grob Gabriela;03:34:51 +Bosshardt Felix;03:33:12 +Bührer Roger;03:55:46 +Pletscher Thomas;03:29:04 +Rüttimann Erhard;03:13:11 +Janik Evelyn;03:09:22 +Huber Peter;03:35:41 +Federspiel Heike;03:44:35 +Müller Patrick;03:06:35 +Karrer Dominique;03:38:35 +Bührer Roger;03:47:50 +Schönbächler Pascal;04:12:22 +Kögel Harald;03:26:37 +Huber Nicolas;03:53:55 +Utz Patrick;03:29:23 +Ricardoch Ag;03:54:22 +Ricardoch Ag;03:39:43 +Luise Ivo;03:24:29 +Enz Daniel;03:38:51 +Wiederkehr Mirjam;03:33:14 +Ricardoch Ag;03:42:17 +Ricardoch Ag;04:04:55 +Jäggi Jean-Pierre;04:09:59 +Habermacher Claudia;03:21:07 +Rey Bruno;04:04:48 +Krismer Saskia;03:44:54 +Greuel Wanja;03:17:44 +Weibel Martina;04:02:34 +Hofmann Markus;03:20:40 +Cathrein Rene;03:39:27 +Cathrein Rene;03:28:22 +Badertscher Jörg;03:12:07 +Hassler Brigitte;04:09:54 +Gisler Sybille;03:24:08 +Bräm Corina;03:24:43 +Hinder Christine;03:52:37 +Buner Sacha;03:23:47 +Illi Liselotte;03:28:04 +Gasser Ronny;03:03:53 +Schefer Stefan;02:59:20 +Carl Anna Barbla;03:43:24 +Hottinger Nicole;03:21:51 +Rechsteiner Simone;03:28:45 +Rutz Miriam;03:14:39 +Umbricht Sarah;03:15:55 +Gonzalez Arza Jose;04:28:07 +Tedeschi Alfonso;03:28:39 +Krebs Michaela;03:31:25 +Willborn Alexander;03:30:52 +Niederbacher Martin;04:10:14 +Langhard Markus;03:34:16 +Blatter Samuel;03:20:59 +Kwak Grace;03:47:04 +Müri Michaela;03:35:15 +Seuring Carolin;03:45:02 +Bär Eva;03:48:23 +Meyer Nina;04:32:29 +Zellweger Monique;03:25:58 +Sutter Samuel;03:30:12 +Saar Rachel-Lee;03:52:13 +Morf Celine;03:29:13 +Naito Shinichi;03:24:00 +De Boni Oliver;03:30:53 +Keller Max;03:29:53 +Pinchiroli Ettore;03:14:14 +Peter Peter;02:30:28 +Ziegler Paul;02:29:58 +Schärer Sandra;03:36:52 +Kessler Hannes;03:22:18 +Fraczak Marcin;03:43:49 +Rüegg Roger;03:32:10 +Tschudi Michèle;03:12:09 +Bächer Rico;03:34:27 +Hottarek Tatjana;03:58:52 +Blatter Samuel;03:16:14 +Bingesser Barbara;03:24:11 +Vaia Karin;03:53:39 +Gellert Alexandre;03:35:09 +Sagolla Markus;03:41:17 +Bisgaard Jane;04:00:09 +Beurret Hermes;03:08:37 +Harder Daniel;03:29:57 +Harder Daniel;03:30:32 +Kugler Raphael;03:13:30 +Ploskonka Elmar;03:39:46 +Kammerer Dorothee;03:26:09 +Kammerer Dorothee;03:02:54 +Koch Rachelle;03:44:11 +Bolliger Aino;03:02:42 +Bolliger Aino;03:55:59 +Guggisberg Michael;03:03:11 +Winter Beatrix;04:39:01 +Vincenz Claudia;03:30:31 +Györvari Lars;03:50:30 +Künzle Stefan;03:25:50 +Dütting André;03:42:42 +Mondini Michèle;04:09:20 +Rohner Catherine;03:29:21 +Ammann Beat;02:37:36 +Kummrow Valerie;03:36:06 +Graf Peter;03:44:18 +Graf Peter;02:42:09 +Winiger Benjamin;03:50:28 +Lüthi Markus;03:24:57 +Blatter Samuel;03:33:51 +Gaillard Stephane;03:33:35 +Rüegg Marco;03:23:19 +Rüttimann Urs;03:07:43 +Koller Markus;03:04:41 +Flury Ernesto;03:16:30 +Specker Marco;03:09:45 +Niklaus Tina;03:37:33 +Widmer Nathalie;03:49:31 +Gröbli Susanne;03:34:44 +Rütimann Thomas;03:26:25 +Graf Beatrice;03:31:13 +Steiner Elisabeth;03:45:54 +Croset Marcel;03:25:34 +Scherrer Rainer;03:00:26 +Kuhn Gabriela;03:36:44 +Bernold Roman;03:25:29 +Insley Anne;04:01:04 +Wirth Jessy;03:17:09 +Soldo Lovro;03:56:04 +Mazziotta Raffaele;03:52:18 +Lacharite Claudie;03:51:29 +Manz Alexander;04:14:01 +Staub Jürg;04:12:48 +Petrakis Stefanos;03:37:33 +Gerber Mark;03:15:01 +Gerber Mark;03:17:27 +Franzi Roger;03:27:52 +Schmid Stefanie;03:36:29 +Mehta Sunil;04:00:20 +Spillmann Roger;04:05:07 +Bolli Andreas;04:02:04 +Suter Sabrina;03:52:01 +Meier Helen;03:57:12 diff --git a/src/ch/zhaw/ads/RankingTreeServer.java b/src/ch/zhaw/ads/RankingTreeServer.java new file mode 100644 index 0000000..7406eb5 --- /dev/null +++ b/src/ch/zhaw/ads/RankingTreeServer.java @@ -0,0 +1,37 @@ +package ch.zhaw.ads; + +import java.util.concurrent.atomic.AtomicInteger; + +public class RankingTreeServer implements CommandExecutor { + + public Tree createTree(String rankingText) { + // TODO Implement + } + + public String createSortedText(Tree competitorTree) { + AtomicInteger rank = new AtomicInteger(1); + StringBuilder sb = new StringBuilder(); + competitorTree.traversal() // TODO Implement + return sb.toString(); + } + + public String execute(String rankingList) { + Tree competitorTree = createTree(rankingList); + return "Rangliste (Tree)\n" + createSortedText(competitorTree); + } + + public static void main(String[] args) { + String rangliste = "Mueller Stefan;02:31:14\n" + + "Marti Adrian;02:30:09\n" + + "Kiptum Daniel;02:11:31\n" + + "Ancay Tarcis;02:20:02\n" + + "Kreibuhl Christian;02:21:47\n" + + "Ott Michael;02:33:48\n" + + "Menzi Christoph;02:27:26\n" + + "Oliver Ruben;02:32:12\n" + + "Elmer Beat;02:33:53\n" + + "Kuehni Martin;02:33:36\n"; + RankingTreeServer server = new RankingTreeServer(); + System.out.println(server.execute(rangliste)); + } +} diff --git a/src/ch/zhaw/ads/ServerFactory.java b/src/ch/zhaw/ads/ServerFactory.java new file mode 100644 index 0000000..16805ae --- /dev/null +++ b/src/ch/zhaw/ads/ServerFactory.java @@ -0,0 +1,76 @@ +package ch.zhaw.ads; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * Classloader that handles file path of class + */ +class MyClassLoader extends ClassLoader { + private String path; + + MyClassLoader(ClassLoader parent) { + super(parent); + } + + /** + * @param name filename of class + * return content of file as array of bytes; if file does not exist return null + */ + private byte[] getBytes(String name) { + try { + System.out.println(name); + RandomAccessFile file = new RandomAccessFile(name, "r"); + byte[] data = new byte[(int) file.length()]; + file.readFully(data); + file.close(); + return data; + } catch (IOException e) { + } + return null; + } + + /** + * @param name filename of class + */ + public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + System.out.println("load:" + name + " " + resolve); + Class clazz; + byte[] classData = getBytes(name); + if (classData != null) { + clazz = defineClass(null, classData, 0, classData.length); + path = name.substring(0, + name.length() - clazz.getName().length() - ".class".length()); + return clazz; + } + if (!resolve) { + classData = getBytes( + path + name.replace(".", File.separator) + ".class"); + if (classData != null) { + return defineClass(null, classData, 0, classData.length); + } + } + return findSystemClass(name); + } +} + +/** + * ServerFactory -- Praktikum Experimentierkasten -- + * + * @author K. Rege + * @version 1.0 -- Factory zur Erstellung von Server Objekten + * @version 2.0 -- Dynamisches Nachladen + * @version 2.01 -- Fix deprecated Functions + */ +public class ServerFactory { + public static Class loadClass(String name) throws Exception { + MyClassLoader myClassLoader = new MyClassLoader( + MyClassLoader.class.getClassLoader()); + return myClassLoader.loadClass(name, true); + } + + public static CommandExecutor createServer(String name) throws Exception { + return (CommandExecutor) loadClass(name).getConstructor(new Class[]{}).newInstance(); + } +} \ No newline at end of file diff --git a/src/ch/zhaw/ads/SortedBinaryTree.java b/src/ch/zhaw/ads/SortedBinaryTree.java new file mode 100644 index 0000000..bcc146d --- /dev/null +++ b/src/ch/zhaw/ads/SortedBinaryTree.java @@ -0,0 +1,125 @@ +package ch.zhaw.ads; + +public class SortedBinaryTree> implements Tree { + protected TreeNode root; + + private TreeNode insertAt(TreeNode node, T x) { + if (node == null) { + return new TreeNode(x); + } else { + if (x.compareTo(node.getValue()) <= 0) { + node.left = insertAt(node.left, x); + } else { + node.right = insertAt(node.right, x); + } + return node; + } + } + + public void add(T x) { + root = insertAt(root, x); + } + + // find node to replace + private TreeNode findRepAt(TreeNode node, TreeNode rep) { + if (node.right != null) { + node.right = findRepAt(node.right, rep); + } else { + rep.values = node.values; + node = node.left; + } + return node; + } + + // remove node + private TreeNode removeAt(TreeNode node, T x, TreeNode removed) { + if (node == null) { + return null; + } else { + if (x.compareTo(node.getValue()) == 0) { + // found + removed.values = node.values; + if (node.left == null) { + node = node.right; + } else if (node.right == null) { + node = node.left; + } else { + node.left = findRepAt(node.left, node); + } + } else if (x.compareTo(node.getValue()) < 0) { + // search left + node.left = removeAt(node.left, x, removed); + } else { + // search right + node.right = removeAt(node.right, x, removed); + } + return node; + } + } + + public T remove(T x) { + TreeNode removed = new TreeNode(null); + root = removeAt(root, x, removed); + return removed.getValue(); + } + + public boolean isEmpty() { + return root == null; + } + + public Traversal traversal() { + // TODO Implement + } + + protected int calcHeight(TreeNode node) { + // TODO Implement + } + + public int height() { + return calcHeight(root); + } + + protected int calcSize(TreeNode p) { + // TODO Implement + } + + public int size() { + return calcSize(root); + } + + public boolean balanced() { + return false; + } + + // only for testing and debugging: show the structure of the tree + public String printTree() { + StringBuilder out = new StringBuilder(); + if (root.right != null) { + printTree(root.right, out, true, ""); + } + out.append(root.values).append("\n"); + if (root.left != null) { + printTree(root.left, out, false, ""); + } + return out.toString(); + } + + private void printTree(TreeNode node, StringBuilder out, boolean isRight, String indent) { + if (node.right != null) { + printTree(node.right, out, true, + indent + (isRight ? " " : " | ")); + } + out.append(indent); + if (isRight) { + out.append(" /"); + } else { + out.append(" \\"); + } + out.append("----- "); + out.append(node.values).append("\n"); + if (node.left != null) { + printTree(node.left, out, false, + indent + (isRight ? " | " : " ")); + } + } +} diff --git a/src/ch/zhaw/ads/Traversal.java b/src/ch/zhaw/ads/Traversal.java new file mode 100644 index 0000000..d6d2125 --- /dev/null +++ b/src/ch/zhaw/ads/Traversal.java @@ -0,0 +1,15 @@ +package ch.zhaw.ads; + +/** interface of Traversal ADT */ +public interface Traversal { + /** traverse elements of tree in preorder */ + void preorder(Visitor vistor); + /** traverse elements of tree in inorder */ + void inorder(Visitor vistor); + /** traverse elements of tree in postorder */ + void postorder(Visitor vistor); + /** traverse elements of tree in levelorder */ + void levelorder(Visitor vistor); + /** traverse elements of tree interval */ + void interval(T min, T max, Visitor vistor); +} diff --git a/src/ch/zhaw/ads/Tree.java b/src/ch/zhaw/ads/Tree.java new file mode 100644 index 0000000..6fd05cd --- /dev/null +++ b/src/ch/zhaw/ads/Tree.java @@ -0,0 +1,25 @@ +package ch.zhaw.ads; + +/** interface of Tree ADT */ +public interface Tree> { + /** add an element to the tree */ + void add(T o); + + /** remove an element; returns the element if found else return null */ + T remove(T o); + + /** test if tree is empty */ + boolean isEmpty(); + + /** returns instance of class that implements traversal interface */ + Traversal traversal(); + + /** number of elements */ + int size(); + + /** height of the tree */ + int height(); + + /** is the tree balanced */ + boolean balanced(); +} diff --git a/src/ch/zhaw/ads/TreeNode.java b/src/ch/zhaw/ads/TreeNode.java new file mode 100644 index 0000000..fc85700 --- /dev/null +++ b/src/ch/zhaw/ads/TreeNode.java @@ -0,0 +1,22 @@ +package ch.zhaw.ads; + +import java.util.LinkedList; +import java.util.List; + +class TreeNode> { + List values; // implemented as list because of doublette handling in AVL + TreeNode left, right; + int height; // for AVL + + TreeNode(T value){ + this.values = new LinkedList<>(); + this.values.add(value); + this.height = 1; + } + + TreeNode(T value, TreeNode left, TreeNode right){ + this(value); this.left = left; this.right = right; + } + + T getValue(){return values.get(0);} +} diff --git a/src/ch/zhaw/ads/TreeTraversal.java b/src/ch/zhaw/ads/TreeTraversal.java new file mode 100644 index 0000000..4b9b681 --- /dev/null +++ b/src/ch/zhaw/ads/TreeTraversal.java @@ -0,0 +1,21 @@ +package ch.zhaw.ads; + +public class TreeTraversal> implements Traversal { + private final TreeNode root; + + public TreeTraversal(TreeNode root) { + this.root = root; + } + + public void inorder(Visitor vis) { + // TODO Implement + } + + public void preorder(Visitor vis) { + // TODO Implement + } + + public void postorder(Visitor vis) { + // TODO Implement + } +} diff --git a/src/ch/zhaw/ads/Visitor.java b/src/ch/zhaw/ads/Visitor.java new file mode 100644 index 0000000..a634242 --- /dev/null +++ b/src/ch/zhaw/ads/Visitor.java @@ -0,0 +1,7 @@ +package ch.zhaw.ads; + +/** interface of visitor ADT */ +public interface Visitor { + /** called for each element in the tree */ + void visit(T obj); +}