Commit 9b9e425f authored by Frank Bergmann's avatar Frank Bergmann

Initial Import

parents
Pipeline #681 failed with stages
* xowiki
*
* Copyright (C) 2005-2008 Gustaf Neumann, neumann@wu-wien.ac.at
*
* Vienna University of Economics and Business Administration
* Institute of Information Systems and New Media
* A-1090, Augasse 2-6
* Vienna, Austria
*
* This is a BSD-Style license applicable for the files in this
* directory and below, except when stated explicitly different.
*
* Permission to use, copy, modify, distribute, and sell this
* software and its documentation for any purpose is hereby granted
* without fee, provided that the above copyright notice appear in
* all copies and that both that copyright notice and this permission
* notice appear in supporting documentation. We make no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied
* warranty.
*
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="xowiki" locale="de_DE" charset="ISO-8859-1">
<msg key="abstract">Zusammenfassung</msg>
<msg key="admin">Verwalten</msg>
<msg key="admin_title">Verwaltungsoptionen fr dieses Paket ...</msg>
<msg key="ago">vor %time%</msg>
<msg key="back">Zurck</msg>
<msg key="categories">Kategorien</msg>
<msg key="content">Inhalt</msg>
<msg key="copy_entry">Kopiere Eintrag</msg>
<msg key="create_new_entry_of_type">Neuen Eintrag vom Typ %type% erstellen</msg>
<msg key="create_this_page_in_language">Erzeuge diese Seite in der folgenden Sprache:</msg>
<msg key="day">Tag</msg>
<msg key="days">Tage</msg>
<msg key="delete">Lschen</msg>
<msg key="delete_title">Lsche diese Seite ...</msg>
<msg key="details">Nhere Information</msg>
<msg key="edit">Bearbeiten</msg>
<msg key="edit_link">bearbeiten</msg>
<msg key="edit_title">Editiere diese Seite ...</msg>
<msg key="entries_using_form">Eintrge fr das Formular %form%:</msg>
<msg key="error-delete_entries_first">Dieses Formular wird noch von %count% Eintrgen verwendet. Bitte verwenden Sie diese, bevor Sie das Formular lschen.</msg>
<msg key="event">Termin</msg>
<msg key="event-end_of_event">Endzeit</msg>
<msg key="event-end_of_lecture">Vortragsende</msg>
<msg key="event-hourprefix"> um </msg>
<msg key="event-location">Ort</msg>
<msg key="event-start_of_event">Beginnzeit</msg>
<msg key="event-start_of_lecture">Vortragsbeginn</msg>
<msg key="event-title_of_lecture">Vortragstitel</msg>
<msg key="Form-form">Formular</msg>
<msg key="Form-form_constraints">Einschrnkungen</msg>
<msg key="form-menu-button-answers">Eintrge fr dieses Formular</msg>
<msg key="form-menu-button-new">Formular ausfllen</msg>
<msg key="hour">Stunde</msg>
<msg key="hours">Stunden</msg>
<msg key="includelet-visitors">Besucher</msg>
<msg key="includelets-visits">Besuche</msg>
<msg key="index">Index</msg>
<msg key="index_title">Zur Startseite</msg>
<msg key="last_visited_pages">Zuletzt besuchte Seiten</msg>
<msg key="minute">Minute</msg>
<msg key="minutes">Minuten</msg>
<msg key="month">Monat</msg>
<msg key="months">Monate</msg>
<msg key="most_frequent_visitors">Hufigsten Besucher</msg>
<msg key="most_popular_pages">Hufigst besuchten Seiten</msg>
<msg key="new_page">Neuer Eintrag</msg>
<msg key="news-source">Quelle</msg>
<msg key="news-teaser">Kurztext</msg>
<msg key="notifications">Verstndigungen</msg>
<msg key="notifications_title">Verwalten der Verstndigungen ...</msg>
<msg key="Page-creator">Ersteller</msg>
<msg key="Page-description">Kurzbeschreibung</msg>
<msg key="Page-last_modified">nderungsdatum</msg>
<msg key="Page-name">Name</msg>
<msg key="Page-name-help_text">Eindeutige Kurzbezeichnung fr einen Eintrag im Ordner; enthlt meist nur Kleinbuchstaben</msg>
<msg key="Page-nls_language">Sprache</msg>
<msg key="Page-page_order">Abschnitt</msg>
<msg key="Page-publish_date">Verffentlichungsdatum</msg>
<msg key="Page-text">Inhalt</msg>
<msg key="Page-title">Titel der Seite</msg>
<msg key="Page-validate_name">Another item with the name '%value%' exists already in this folder </msg>
<msg key="page_type">Typ der Seite</msg>
<msg key="PageInstance-instance_attributes">Instanzattribute</msg>
<msg key="PageInstance-page_template">Seitenvorlage</msg>
<msg key="PageTemplate-anon_instances">Automatische Namensvergabe</msg>
<msg key="PodcastItem-duration">Dauer</msg>
<msg key="PodcastItem-keywords">Schlsselworte</msg>
<msg key="PodcastItem-pub_date">Publikationsdatum</msg>
<msg key="PodcastItem-subtitle">Untertitel</msg>
<msg key="popular_tags_label">Hufig verwendete Schlagworte</msg>
<msg key="popular_tags_link">hufige Schlagworte</msg>
<msg key="portlet_title_exists_error_long">ndern Sie entweder den Namen des existierenden Portlets oder den Titel der Xowiki-Seite, die Sie zum Portal hinzufgen wollen.</msg>
<msg key="portlet_title_exists_error_short">Es gibt bereits ein Portlet mit dem Titel '%page_title%' in diesem Portal.</msg>
<msg key="publish_status">Freigegeben</msg>
<msg key="recently_changed_pages">Zuletzt genderte Seiten</msg>
<msg key="recently_changed_pages_by_categories">Zuletzt genderte Seiten (nach Kategorien)</msg>
<msg key="references_label">Verweise auf diese Seite:</msg>
<msg key="revisions">Verlauf</msg>
<msg key="rss_client">RSS-Klient</msg>
<msg key="search">Suche</msg>
<msg key="search_title">Suche in diesem Wiki...</msg>
<msg key="second">Sekunde</msg>
<msg key="seconds">Sekunden</msg>
<msg key="title">Titel</msg>
<msg key="title_of_event">Titel
</msg>
<msg key="unread_items">Ungelesene Seiten</msg>
<msg key="view">Ansehen</msg>
<msg key="weblog-more">mehr...</msg>
<msg key="week">Woche</msg>
<msg key="weeks">Wochen</msg>
<msg key="your_tags_label">Persnliche Schlagworte</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="xowiki" locale="en_US" charset="ISO-8859-1">
<msg key="abstract">Abstract</msg>
<msg key="admin">Admin</msg>
<msg key="admin_title">Administer this package ...</msg>
<msg key="ago">%time% ago</msg>
<msg key="back">Back</msg>
<msg key="categories">Categories</msg>
<msg key="CompoundField-validate_compound">%errorMsg%</msg>
<msg key="content">Content</msg>
<msg key="copy_entry">Copy Entry</msg>
<msg key="create_new_entry_of_type">Create new entry of type %type%</msg>
<msg key="create_this_page_in_language">Create this page in a different language</msg>
<msg key="day">day</msg>
<msg key="days">days</msg>
<msg key="delete">Delete</msg>
<msg key="delete_title">Delete this page ...</msg>
<msg key="details">Details</msg>
<msg key="edit">Edit</msg>
<msg key="edit_link">edit tags</msg>
<msg key="edit_title">Edit this page ...</msg>
<msg key="entries_using_form">Entries for form %form%</msg>
<msg key="error-delete_entries_first">This page is still used by %count% entries. Please delete these first before deleting this page.</msg>
<msg key="error-form_constraint-invalid_characters">Form constraint contains invalid characters</msg>
<msg key="error-form_constraint-unknown_attribute">From field '%name%' (class %class%) has unknown attribute '%entry%'</msg>
<msg key="error-form_constraint-unknown_editor">Unknown editor %editor%. Possible values are: %editors%</msg>
<msg key="error-form_constraint-unknown_spec_entry">From field '%name%' has unknown specification '%entry%'</msg>
<msg key="error-includelet-adp_syntax_invalid">Syntax: adp &amp;lt;name of adp-file&amp;gt; {&amp;lt;argument list&amp;gt;}&lt;br/&gt;
Invalid argument list: '%adp%'; must be of form: attribute value pairs (even number of elements)</msg>
<msg key="error-includelet-dash_syntax_invalid">&lt;pre&gt;%errMsg%&lt;/pre&gt;
Argument list must contain attribute value pairs (attributes with dashes)</msg>
<msg key="error-includelet-error_during_adp_evaluation">evaluation of adp file returned error message: %errorMsg%</msg>
<msg key="error-includelet-error_during_render">Error in includelet '%page_name%':
&lt;pre&gt;%::errorInfo%&lt;/pre&gt;</msg>
<msg key="error-includelet-nesting_to_deep">Nesting of includelets is to deep</msg>
<msg key="error-includelet-unknown">Error: includelet '%page_name%' unknown</msg>
<msg key="error_in_includelet">Error in includelet '{{%arg%}}' of page %name%:</msg>
<msg key="event">Event</msg>
<msg key="event-end_of_event">End Time</msg>
<msg key="event-end_of_lecture">End of Lecture</msg>
<msg key="event-hourprefix"> at </msg>
<msg key="event-location">Location</msg>
<msg key="event-start_of_event">Start Time</msg>
<msg key="event-start_of_lecture">Start of Lecture</msg>
<msg key="event-title_of_event">Title</msg>
<msg key="event-title_of_lecture">Title of Lecture</msg>
<msg key="File-name-help_text">Can be obtained from the name of the uploaded file</msg>
<msg key="form-created">Created form</msg>
<msg key="Form-form">Form</msg>
<msg key="Form-form_constraints">Form Constraints</msg>
<msg key="form-menu-button-answers">Entries for this form</msg>
<msg key="form-menu-button-form">Form %form_name%</msg>
<msg key="form-menu-button-new">Fill out</msg>
<msg key="form-menu-button-wf">Workflow %form_name%</msg>
<msg key="form-menu-button-wf-instances">Instances of %form_name%</msg>
<msg key="Form-submit_button"> OK </msg>
<msg key="Form-template">Template</msg>
<msg key="form-updated">Updated form</msg>
<msg key="form-validate_form">%errorMsg%</msg>
<msg key="Form-validate_form_constraints">Invalid Form %errorMsg%</msg>
<msg key="formfield-image_url-help_text">HTTP Url of the Image (you might drag an image displayed by a web-browser here)</msg>
<msg key="formfield-youtube_url-help_text">Cut&amp;Paste URL of YouTube video (http://www.youtube.com/....)</msg>
<msg key="FormPage-assignee">Assignee</msg>
<msg key="FormPage-state">State</msg>
<msg key="hour">hour</msg>
<msg key="hours">hours</msg>
<msg key="includelet-visitors">Visitors</msg>
<msg key="includelets-visits">Visits</msg>
<msg key="index">Index</msg>
<msg key="index_title">Go to the start page of this package ...</msg>
<msg key="last_visited_pages">Last Visited Pages</msg>
<msg key="minute">minute</msg>
<msg key="minutes">minutes</msg>
<msg key="month">month</msg>
<msg key="months">months</msg>
<msg key="most_frequent_visitors">Most Frequent Visitors</msg>
<msg key="most_popular_pages">Most Popular Pages</msg>
<msg key="new_page">New Page</msg>
<msg key="new_title">Create a new page ...</msg>
<msg key="news-source">Source</msg>
<msg key="news-teaser">Teaser</msg>
<msg key="notifications">Notifications</msg>
<msg key="notifications_title">Manage notifications ...</msg>
<msg key="numeric-validate_numeric">Invalid numeric value</msg>
<msg key="Page-creation_user">Creation User</msg>
<msg key="Page-creator">Creator</msg>
<msg key="Page-description">Description</msg>
<msg key="Page-last_modified">Last Modified</msg>
<msg key="Page-name">Name</msg>
<msg key="Page-name-help_text">Shortname to identify an entry within a folder, typically lowercase characters</msg>
<msg key="Page-nls_language">Language</msg>
<msg key="Page-page_order">Section</msg>
<msg key="Page-publish_date">Publish Date</msg>
<msg key="Page-text">Content</msg>
<msg key="Page-title">Page Title</msg>
<msg key="Page-validate_form_constraints">%errorMsg%</msg>
<msg key="Page-validate_name">Another item with the name '%value%' exists already in this folder </msg>
<msg key="Page-validate_page_order">Page Order invalid; might only contain upper and lower case letters, underscore, digits and dots</msg>
<msg key="page_type">Page Type</msg>
<msg key="PageInstance-instance_attributes">Instance Attributes</msg>
<msg key="PageInstance-page_template">Page Instance</msg>
<msg key="PageTemplate-anon_instances">Autonamed Entries</msg>
<msg key="party_id-validate_party_id_check">Value is not a valid party_id</msg>
<msg key="PodcastItem-duration">Duration</msg>
<msg key="PodcastItem-duration-help_text">E.g. 9:16 means 9 minutes 16 seconds (if ffmpeg is installed and configured, it will get the value automatically)</msg>
<msg key="PodcastItem-keywords">Keywords</msg>
<msg key="PodcastItem-keywords-help_text">comma separated itunes keywords, e.g. salt, pepper, shaker, exciting</msg>
<msg key="PodcastItem-name-help_text">Can be obtained from the name of the uploaded file</msg>
<msg key="PodcastItem-pub_date">Publication Date</msg>
<msg key="PodcastItem-subtitle">Subtitle</msg>
<msg key="popular_tags_label">Popular tags</msg>
<msg key="popular_tags_link">popular tags</msg>
<msg key="portlet_name_does_not_exist_error_long">There is no page with name &quot;%page_name%&quot; available.</msg>
<msg key="portlet_page_does_not_exist_error_short">The given page does not exist</msg>
<msg key="portlet_title_exists_error_long">Please either change the existing portlets' name or the title of the xowiki page you want to add to the portal.</msg>
<msg key="portlet_title_exists_error_short">A portlet with the title '%page_title%' already exists in this portal.</msg>
<msg key="publish_status">Published</msg>
<msg key="recently_changed_pages">Recently Changed Pages</msg>
<msg key="recently_changed_pages_by_categories">Recently Changed Pages (by categories)</msg>
<msg key="references_label">References to this Page:</msg>
<msg key="references_of_label">References of this Page:</msg>
<msg key="revisions">Revisions</msg>
<msg key="revisions_title">Show revisions of this page ...</msg>
<msg key="richtext-validate_safe_html">%errorMsg%</msg>
<msg key="rss_client">RSS Client</msg>
<msg key="search">Search</msg>
<msg key="search_title">Search pages of this package ...</msg>
<msg key="second">second</msg>
<msg key="seconds">seconds</msg>
<msg key="select_link_target">To create a click, click on a page name </msg>
<msg key="title">Title</msg>
<msg key="title_of_event">Title
</msg>
<msg key="unread_items">Unread Items</msg>
<msg key="view">View</msg>
<msg key="view_in_context">View page in original context %context%</msg>
<msg key="view_title">View this page ...</msg>
<msg key="weblog-more">more...</msg>
<msg key="week">week</msg>
<msg key="weeks">weeks</msg>
<msg key="workflow_definition-validate_workflow">%errorMsg%</msg>
<msg key="your_tags_label">Your Tags</msg>
</message_catalog>
<?xml version="1.0" encoding="ISO-8859-1"?>
<message_catalog package_key="xowiki" locale="es_ES" charset="ISO-8859-1">
<msg key="admin">Administrar</msg>
<msg key="back">Volver</msg>
<msg key="categories">Categoras</msg>
<msg key="content">Contenido</msg>
<msg key="create_this_page_in_language">Crear esta pgina en un lenguaje diferente</msg>
<msg key="delete">Borrar</msg>
<msg key="edit">Editar</msg>
<msg key="edit_link">editar tags</msg>
<msg key="Form-form">Forme</msg>
<msg key="index">ndice</msg>
<msg key="new_page">Nueva Pgina</msg>
<msg key="news-source">Origen</msg>
<msg key="notifications">Notificaciones</msg>
<msg key="Page-creator">Autor</msg>
<msg key="Page-description">Descripcin</msg>
<msg key="Page-name">Nombre</msg>
<msg key="Page-nls_language">Idioma</msg>
<msg key="Page-page_order">Seccin</msg>
<msg key="Page-publish_date">Fecha de publicacin</msg>
<msg key="Page-text">Contenido</msg>
<msg key="Page-title">Ttulo de la Pgina</msg>
<msg key="page_type">Tipo de Pgina</msg>
<msg key="PageInstance-instance_attributes">Cualidad</msg>
<msg key="PageInstance-page_template">Plantilla de la pgina</msg>
<msg key="PageTemplate-anon_instances">Entradas innomadas</msg>
<msg key="PodcastItem-duration">Duracin</msg>
<msg key="PodcastItem-keywords">Palabras claves</msg>
<msg key="PodcastItem-pub_date">Fecha de la publicacin</msg>
<msg key="PodcastItem-subtitle">Subttulo</msg>
<msg key="popular_tags_label">Tags populares</msg>
<msg key="popular_tags_link">tags populares</msg>
<msg key="portlet_title_exists_error_long">Por favor, cambie el nombre de los portlets existentes el ttulo de la pgina del xowiki que se quiere aadir al portal.</msg>
<msg key="portlet_title_exists_error_short">Un portlet cuyo ttulo es '%page_title%' ya existe en este portal.</msg>
<msg key="publish_status">Publicado</msg>
<msg key="references_label">Referencias a esta Pgina:</msg>
<msg key="revisions">Revisiones</msg>
<msg key="search">Buscar</msg>
<msg key="view">Vista</msg>
<msg key="weblog-more">ms...</msg>
<msg key="your_tags_label">Tus tags</msg>
</message_catalog>
@html;noquote@
set parameter [subst {
{-m view}
{-return_url "[ns_conn url]"}
{-template_file "view-links"}
{-folder_id 0}
}]
# TODO the following should be done more elegantly
set actual_query [expr {[info exists template_file] ? "template_file=$template_file" : " "}]
if {[info exists url]} {
# new style, the url is sufficient
::xowiki::Package initialize -parameter $parameter -url $url -actual_query $actual_query
} else {
# old style, use item_id
set page [::xowiki::Package instantiate_page_from_id \
-item_id $item_id -parameter $parameter]
::xo::cc export_vars
}
set html [::$package_id invoke -method $m]
set ::xowiki_head [::xo::Page header_stuff]
if {![info exists css]} {
set fn [get_server_root]/packages/xowiki/www/resources/xowiki.css
set F [open $fn]; set css [read $F]; close $F
set css "<style type='text/css'>$css</style>"
set html $css$html
}
This diff is collapsed.
namespace eval ::xowiki {
#
# ::xowiki::CatTree (category tree)
#
Class CatTree -superclass ::xo::OrderedComposite -parameter {{name ""}}
#
# Class methods
#
CatTree proc renderer {style} {
set renderer CategoryRenderer=$style
if {![my isclass $renderer]} {
error "No such renderer $renderer (avalialble [info cmd ::xowiki::CategoryRenderer=*]"
}
return $renderer
}
CatTree proc include_head_entries {{-style mktree}} {
[my renderer $style] include_head_entries
}
#
# Instance methods
#
CatTree instproc add_to_category {
-category
-orderby
-itemobj
{-increasing:boolean true}
{-open_item:boolean false}
} {
set items ${category}::items
if {![my isobject $items]} {
::xo::OrderedComposite create $items
if {[info exists orderby]} {
if {$orderby eq "page_order"} {
$items mixin add ::xo::OrderedComposite::IndexCompare
}
set direction [expr {$increasing ? "increasing" : "decreasing"}]
$items orderby -order $direction $orderby
}
}
$items add $itemobj
if {$open_item} {
$category open_tree
$itemobj set open_item 1
}
}
CatTree instproc open_tree {} {;}
CatTree instproc render {{-style mktree}} {
set renderer [[self class] renderer $style]
Category instmixin $renderer
set content [$renderer render [self]]
Category instmixin ""
return $content
}
#
# ::xowiki::Category
#
Class Category -superclass ::xo::OrderedComposite -parameter {
package_id level label pos category_id {open_requests 0} count {href ""}
}
#Category instproc destroy {} {my log --; next}
Category instproc open_tree {} {
my set open_requests 1
if {[my exists __parent]} {[my set __parent] open_tree}
}
Category instproc some_child_has_items {} {
foreach i [my children] {
if {[my isobject ${i}::items]} {return 1}
if {[$i some_child_has_items]} {return 1}
}
return 0
}
Category instproc render {} {
set content ""
if {[my isobject [self]::items]} {
foreach i [[self]::items children] {
$i instvar name title prefix suffix
set entry "$prefix<a href='[::[my package_id] pretty_link $name]'>$title</a>$suffix"
append cat_content [my render_item -highlight [$i exists open_item] $entry]
}
foreach c [my children] {append cat_content [$c render] \n}
append content [my render_category -open [expr {[my set open_requests]>0}] $cat_content]
} elseif {[my open_requests]>0 || [my some_child_has_items]} {
set cat_content ""
foreach c [my children] {append cat_content [$c render] \n}
append content [my render_category -open true $cat_content]
}
return $content
}
#
# Define a meta class for the category renderers with the common
# behavior.
#
Class create CategoryRenderer -superclass Class
CategoryRenderer instproc include_head_entries {} {
# to be overloaded
}
CategoryRenderer instproc render {cattree} {
set content ""
foreach c [$cattree children] {append content [$c render] \n}
return $content
}
#
# These are the list-specific rendering functions
#
CategoryRenderer create CategoryRenderer=mktree
CategoryRenderer=mktree proc include_head_entries {} {
::xo::Page requireCSS "/resources/xowiki/cattree.css"
::xo::Page requireJS "/resources/acs-templating/mktree.js"
}
CategoryRenderer=mktree proc render {cattree} {
return "<ul class='mktree' id='[$cattree name]'>[next]</ul>"
}
CategoryRenderer=mktree instproc render_item {{-highlight:boolean false} item} {
if {$highlight} {
return "<li class='liItem'><b>$item</b></li>\n"
} else {
return "<li class='liItem'>$item</li>\n"
}
}
CategoryRenderer=mktree instproc render_category {{-open:boolean false} cat_content} {
set open_state [expr {[my set open_requests]>0?"class='liOpen'" : "class='liClosed'"}]
set c [expr {[my exists count] ? "<a href='[my href]'>([my count])</a>" : ""}]
return "<li $open_state>[my label] $c\n <ul>$cat_content</ul>\n"
}
#
# These are the section-specific rendering functions
#
CategoryRenderer create CategoryRenderer=sections
CategoryRenderer=sections instproc render_item {{-highlight:boolean false} item} {
if {$highlight} {
return "<b>$item</b><br/>\n"
} else {
return "$item<br/>\n"
}
}
CategoryRenderer=sections instproc render_category {{-open:boolean false} cat_content} {
set section [expr {[my level] + 2}]
return "<H$section>[my label]</H$section>\n<p>\
<blockquote style='margin-left: 2em; margin-right:0px;'>$cat_content</blockquote>\n"
}
#
# Commonly used code for categories
#
Category proc get_mapped_trees {
-object_id
{-locale ""}
{-names ""}
{-output {tree_id tree_name subtree_category_id assign_single_p require_category_p}}
} {
# Return matched category trees matching the specified names (or all)
# provide compatibility with earlier versions of categories
set have_locale [expr {[lsearch [info args category_tree::get_mapped_trees] locale] > -1}]
set mapped_trees [expr {$have_locale ?
[category_tree::get_mapped_trees $object_id $locale] :
[category_tree::get_mapped_trees $object_id]}]
set trees [list]
foreach tree $mapped_trees {
foreach {tree_id my_tree_name ...} $tree {break}
# "names" is a list of category names
if {$names ne ""} {
# Check, if the current name matches any of the given
# names. If the name contains wild-cards, perform a string
# match, otherwise a string equal.
set match 0
foreach n $names {
if {[string first * $n] > -1} {
if {![string match $n $my_tree_name]} {
set match 1
break
}
} elseif {$n eq $my_tree_name} {
set match 1
break
}
}
if {!$match} continue
}
# Get the values from info in "tree" into separate variables given by output.
# Note, that the order matters!
foreach $output $tree break
set l [list]
foreach __var $output {lappend l [set $__var]}
lappend trees $l
}
return $trees
}
Category proc get_category_infos {{-all false} {-subtree_id ""} {-locale ""} -tree_id} {
#
# provide a common interface to older versions of categories
#
# provide compatibility with earlier versions of categories
set have_locale [expr {[lsearch [info args category_tree::get_tree] locale] > -1}]
set all_arg [expr {$all ? "-all" : ""}]
return [expr {$have_locale ?
[eval category_tree::get_tree $all_arg -subtree_id [list $subtree_id] $tree_id $locale] :
[eval category_tree::get_tree $all_arg -subtree_id [list $subtree_id] $tree_id]}]
}
}
::xo::library doc {
XoWiki - chat procs
@creation-date 2006-02-02
@author Gustaf Neumann
@cvs-id $Id$
}
namespace eval ::xowiki {
::xo::ChatClass Chat -superclass ::xo::Chat
Chat instproc render {} {
my orderby time
set result ""
foreach child [my children] {
set msg [$child msg]
set user_id [$child user_id]
set timelong [clock format [$child time]]
set timeshort [clock format [$child time] -format {[%H:%M:%S]}]
if {$user_id > 0} {
acs_user::get -user_id $user_id -array user
set name [expr {$user(screen_name) ne "" ? $user(screen_name) : $user(name)}]
set url "/shared/community-member?user%5fid=$user_id"
set creator "<a target='_parent' href='$url'>$name</a>"
} else {
set creator "Nobody"
}
append result "<TR><TD class='timestamp'>$timeshort</TD>\
<TD class='user'>[my encode $creator]</TD>\
<TD class='message'>[my encode $msg]</TD></TR>\n"
}
return $result
}
Chat proc initialize_nsvs {} {;} ;# noop
Chat proc login {-chat_id -package_id -mode} {
my log "--"
auth::require_login
if {![info exists package_id]} {set package_id [ad_conn package_id] }
if {![info exists chat_id]} {set chat_id $package_id }
set context id=$chat_id&s=[ad_conn session_id].[clock seconds]
set path [site_node::get_url_from_object_id -object_id $package_id]
if {![info exists mode]} {
set mode polling
if {[info command ::thread::mutex] ne "" &&
![catch {ns_conn contentsentlength}]} {
# we seem to have libthread installed, and the patch for obtaining the tcl-stream
# from a connection thread, so we can use the background delivery thread;
# scripted streaming should work everywhere
set mode scripted-streaming
if {[regexp (firefox) [string tolower [ns_set get [ns_conn headers] User-Agent]]]} {
# for firefox, we could use the nice mode without the spinning load indicator
# currently, streaming mode seems broken with current firefox...
#set mode streaming
}
}
my log "--chat mode $mode"
}
switch $mode {
polling {
::xo::Page requireJS "/resources/xowiki/get-http-object.js"
set jspath packages/xowiki/www/ajax/chat.js
set login_url ${path}ajax/chat?m=login&$context
set get_update "chatSendCmd(\"$path/ajax/chat?m=get_new&$context\",chatReceiver)"
set get_all "chatSendCmd(\"$path/ajax/chat?m=get_all&$context\",chatReceiver)"
}
streaming {
set jspath packages/xowiki/www/ajax/streaming-chat.js
set subscribe_url ${path}ajax/chat?m=subscribe&$context
}
scripted-streaming {
append context &mode=scripted
set jspath packages/xowiki/www/ajax/scripted-streaming-chat.js
set subscribe_url ${path}ajax/chat?m=subscribe&$context
}
}
set send_url ${path}ajax/chat?m=add_msg&$context&msg=
if { ![file exists [acs_root_dir]/$jspath] } {
return -code error "File [acs_root_dir]/$jspath does not exist"
}
set file [open [acs_root_dir]/$jspath]; set js [read $file]; close $file
my log "--CHAT mode=$mode"
switch $mode {
polling {return "\
<script type='text/javascript' language='javascript'>
$js
setInterval('$get_update',5000)
</script>
<form action='#' onsubmit='chatSendMsg(\"$send_url\",chatReceiver); return false;'>
<iframe name='ichat' id='ichat' frameborder='0' src='$login_url'
style='width:90%;' height='150'>
</iframe>
<input type='text' size='40' name='msg' id='chatMsg'>
</form>"
}
streaming {return "\
<script type='text/javascript' language='javascript'>$js
var send_url = \"$send_url\";
chatSubscribe(\"$subscribe_url\");
</script>
<div id='messages' style='margin:1.5em 0 1.5em 0;
padding:1em 0 1em 1em;
background-color: #f9f9f9;
border:1px solid #dedede;
height: 70px;
height:150px;
font-size:.95em;
line-height:.7em;
color:#333;
overflow:auto;
'></div>
<form action='#' onsubmit='chatSendMsg(); return false;'>
<input type='text' size='40' name='msg' id='chatMsg'>"
}
scripted-streaming {return "\
<script type='text/javascript' language='javascript'>
$js
var send_url = \"$send_url\";
</script>
<div id='messages' style='margin:1.5em 0 1.5em 0;
padding:1em 0 1em 1em;
background-color: #f9f9f9;
border:1px solid #dedede;
height: 70px;
height:150px;
font-size:.95em;
line-height:.7em;
color:#333;
overflow:auto;
'></div>
<iframe name='ichat' id='ichat' frameborder='0' src='$subscribe_url'
style='width:0px; height:0px; border: 0px'>
</iframe>
<form action='#' onsubmit='chatSendMsg(); return false;'>
<input type='text' size='40' name='msg' id='chatMsg'>
</form>"
}
}
}
}
This diff is collapsed.
::xo::library doc {
XoWiki - importer
@creation-date 2008-04-25
@author Gustaf Neumann
@cvs-id $Id$
}
namespace eval ::xowiki {
Class Importer -parameter {
{added 0} {replaced 0} {updated 0}
{package_id} {folder_id} {user_id}
}
Importer instproc init {} {
my set log ""
my destroy_on_cleanup
}
Importer instproc report_lines {} {
return "<table>[my set log]</table>"
}
Importer instproc report_line {obj operation} {
set href [[$obj package_id] pretty_link [$obj name]]
my append log "<tr><td>$operation</td><td><a href='$href'>[$obj name]</a></td></tr>\n"
}
Importer instproc report {} {
my instvar added updated replaced
return "$added objects newly inserted,\
$updated objects updated, $replaced objects replaced<p>\
[my report_lines]"
}
Importer instproc import {-object:required -replace -create_user_ids} {
#
# Import a single object. In essence, this method demarshalls a
# single object and inserts it (or updates it) in the database. It
# takes as well care about categories.
#
my instvar package_id user_id
$object demarshall -parent_id [$object parent_id] -package_id $package_id \
-creation_user $user_id -create_user_ids $create_user_ids
set item_id [::xo::db::CrClass lookup -name [$object name] -parent_id [$object parent_id]]
if {$item_id != 0} {
if {$replace} { ;# we delete the original
::xo::db::CrClass delete -item_id $item_id
set item_id 0
my report_line $object replaced
my incr replaced
} else {
::xo::db::CrClass get_instance_from_db -item_id $item_id
$item_id copy_content_vars -from_object $object
$item_id save -use_given_publish_date [$item_id exists publish_date] \
-modifying_user [$object set modifying_user]
$object set item_id [$item_id item_id]
#my msg "$item_id updated: [$object name]"
my report_line $item_id updated
my incr updated
}
}
if {$item_id == 0} {
set n [$object save_new -use_given_publish_date [$object exists publish_date] \
-creation_user [$object set modifying_user] ]
$object set item_id $n
set item_id $object
#my msg "$object added: [$object name]"
my report_line $object added
my incr added
}
#
# The method demarshall might set the mapped __category_ids in $object.
# Insert these into the category object map
#
if {[$object exists __category_ids]} {
#my msg "$item_id map_categories [object set __category_ids] // [$item_id item_id]"
$item_id map_categories [$object set __category_ids]
}
$package_id flush_references -item_id [$object item_id] -name [$object name]
}
Importer instproc import_all {-replace -objects:required {-create_user_ids 0}} {
#
# Import a series of objects. This method takes care especially
# about dependencies of objects, which is reflected by the order
# of object-imports.
#
# Extact information from objects to be imported, that might be
# changed later in the objects.
#
foreach o $objects {
#
# Remember old item_ids and old_names for pages with
# item_ids. Only these can have parents (page_templates) or
# child_objects
#
if {[$o exists item_id]} {
set item_ids([$o item_id]) $o
set old_names([$o item_id]) [$o name]
} {
$o item_id ""
}
# Remember old parent_ids for name-mapping, names are
# significant per parent_id.
if {[$o exists parent_id]} {
set parent_ids([$o item_id]) [$o parent_id]
} {
$o parent_id ""
}
set todo($o) 1
#
# Handle import of categories in the first pass
#
if {[$o exists __map_command]} {
$o package_id [my package_id]
$o eval [$o set __map_command]
}
# FIXME remove?
#if {[$o exists __category_map]} {
# array set ::__category_map [$o set __category_map]
#}
}
#my msg "item_ids=[array names item_ids], parent_ids=[array names parent_ids]"
#
# Make a fix-point iteration during import. Do only import, when
# all prerequirement pages are already loaded.
#
while {[llength [array names todo]] > 0} {
set new 0
foreach o [array names todo] {
#my msg "work on $o [$o info class] [$o name]"
set old_name [$o name]
set old_item_id [$o item_id]
set old_parent_id [$o parent_id]
# page instances have references to page templates, add the templates first
if {[$o istype ::xowiki::PageInstance]} {
set old_template_id [$o page_template]
if {![info exists old_names($old_template_id)]} {
set new 0
my msg "need name for $old_template_id. Maybe item_ids for PageTemplate missing?"
break
}
set template_name_key $parent_ids($old_template_id)-$old_names($old_template_id)
if {![info exists name_map($template_name_key)]} {
#my msg "... delay import of $o (no object with name $template_name_key) imported"
continue
}
#my msg "we found entry for name_map($template_name_key) = $name_map($template_name_key)"
}
if {[info exists item_ids($old_parent_id)]} {
# we have a child object
if {![info exists id_map($old_parent_id)]} {
#my msg "... delay import of $o (map of parent_id $old_parent_id missing)"
continue
}
}
# Now, all requirements are met, parent-object and
# child-object conditions are fulfilled. We have to map
# page_template for PageInstances and parent_ids for child
# objects to new IDs.
#
if {[$o istype ::xowiki::PageInstance]} {
#my msg "importing [$o name] page_instance, map $template_name_key to $name_map($template_name_key)"
$o page_template $name_map($template_name_key)
#my msg "exists template? [my isobject [$o page_template]]"
}
if {[info exists item_ids($old_parent_id)]} {
$o set parent_id $id_map($old_parent_id)
} else {
$o set parent_id [my folder_id]
}
# Everything is mapped, we can now do the import.
my import \
-object $o \
-replace $replace \
-create_user_ids $create_user_ids
#my msg "import for $o done, name=[$o name]"
# Maintain the maps and mark the item as done.
if {$old_item_id ne ""} {
set id_map($old_item_id) [$o item_id]
}
set name_map($old_parent_id-$old_name) [$o item_id]
#my msg "setting name_map($old_parent_id-$old_name)=$name_map($old_parent_id-$old_name), o=$o, old_item_id=$old_item_id"
#set ::__xowiki_import_object([$o item_id]) [self]
unset todo($o)
set new 1
}
if {$new == 0} {
my msg "could not import [array names todo]"
break
}
}
#my msg "final name_map=[array get name_map], id_map=[array get id_map]"
#
# final cleanup
#
foreach o $objects {$o destroy}
[my package_id] flush_page_fragment_cache
}
}
\ No newline at end of file
This diff is collapsed.
# Copyright (c) 2003 by Kevin B. Kenny. All rights reserved.
# See the file,
# 'http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/tcllib/license.terms'
# for terms and conditions of redistribution.
namespace eval list { namespace export longestCommonSubsequence }
# Do a compatibility version of [lset] for pre-8.4 versions of Tcl.
# This version does not do multi-arg [lset]!
if { [package vcompare [package provide Tcl] 8.4] < 0 } {
proc list::K { x y } { set x }
proc list::lset { var index arg } {
upvar 1 $var list
set list [lreplace [K $list [set list {}]] $index $index $arg]
}
}
# list::longestCommonSubsequence --
#
# Computes the longest common subsequence of two lists.
#
# Parameters:
# sequence1, sequence2 -- Two lists to compare.
#
# Results:
# Returns a list of two lists of equal length.
# The first sublist is of indices into sequence1, and the
# second sublist is of indices into sequence2. Each corresponding
# pair of indices corresponds to equal elements in the sequences;
# the sequence returned is the longest possible.
#
# Side effects:
# None.
proc list::longestCommonSubsequence { sequence1 sequence2 } {
set seta [list]
set setb [list]
# Construct a set of equivalence classes of lines in file 2
set index 0
foreach string $sequence2 {
lappend eqv($string) $index
incr index
}
# K holds descriptions of the common subsequences.
# Initially, there is one common subsequence of length 0,
# with a fence saying that it includes line -1 of both files.
# The maximum subsequence length is 0; position 0 of
# K holds a fence carrying the line following the end
# of both files.
lappend K [list -1 -1 {}]
lappend K [list [llength $sequence1] [llength $sequence2] {}]
set k 0
# Walk through the first file, letting i be the index of the line and
# string be the line itself.
set i 0
foreach string $sequence1 {
# Consider each possible corresponding index j in the second file.
if { [info exists eqv($string)] } {
# c is the candidate match most recently found, and r is the
# length of the corresponding subsequence.
set c [lindex $K 0]
set r 0
foreach j $eqv($string) {
# Perform a binary search to find a candidate common
# subsequence to which may be appended this match.
set max $k
set min $r
set s [expr { $k + 1 }]
while { $max >= $min } {
set mid [expr { ( $max + $min ) / 2 }]
set bmid [lindex [lindex $K $mid] 1]
if { $j == $bmid } {
break
} elseif { $j < $bmid } {
set max [expr {$mid - 1}]
} else {
set s $mid
set min [expr { $mid + 1 }]
}
}
# Go to the next match point if there is no suitable
# candidate.
if { $j == [lindex [lindex $K $mid] 1] || $s > $k} {
continue
}
# s is the sequence length of the longest sequence
# to which this match point may be appended. Make
# a new candidate match and store the old one in K
# Set r to the length of the new candidate match.
set newc [list $i $j [lindex $K $s]]
lset K $r $c
set c $newc
set r [expr {$s + 1}]
# If we've extended the length of the longest match,
# we're done; move the fence.
if { $s >= $k } {
lappend K [lindex $K end]
incr k
break
}
}
# Put the last candidate into the array
lset K $r $c
}
incr i
}
set q [lindex $K $k]
for { set i 0 } { $i < $k } {incr i } {
lappend seta {}
lappend setb {}
}
while { [lindex $q 0] >= 0 } {
incr k -1
lset seta $k [lindex $q 0]
lset setb $k [lindex $q 1]
set q [lindex $q 2]
}
return [list $seta $setb]
}
This diff is collapsed.
::xo::library doc {
XoWiki - Notification procs
@creation-date 2006-08-08
@author Gustaf Neumann
@cvs-id $Id$
}
namespace eval ::xowiki {
ad_proc -private ::xowiki::notifications-install {} {
set impl_id [acs_sc::impl::new_from_spec -spec {
name xowiki_notif_type
contract_name NotificationType
owner xowiki
aliases {
GetURL xowiki::notification::get_url
ProcessReply xowiki::notification::process_reply
}
}]
set type_id [notification::type::new \
-sc_impl_id $impl_id \
-short_name xowiki_notif \
-pretty_name "XoWiki Notification" \
-description "Notification of a new XoWiki page"]
foreach delivery {email} {
notification::type::delivery_method_enable -type_id $type_id \
-delivery_method_id [notification::delivery::get_id -short_name $delivery]
}
foreach interval {instant hourly daily} {
notification::type::interval_enable -type_id $type_id \
-interval_id [notification::interval::get_id_from_name -name $interval]
}
}
ad_proc -private ::xowiki::notifications-uninstall {} {
set type_id [notification::type::get_type_id -short_name xowiki_notif]
foreach delivery {email} {
notification::type::delivery_method_disable -type_id $type_id \
-delivery_method_id [notification::delivery::get_id -short_name $delivery]
}
foreach interval {instant hourly daily} {
notification::type::interval_disable -type_id $type_id \
-interval_id [notification::interval::get_id_from_name -name $interval]
}
notification::type::delete -short_name xowiki_notif
acs_sc::impl::delete \
-contract_name "NotificationType" \
-impl_name xowiki_notif_type
}
}
namespace eval ::xowiki::notification {
ad_proc -private get_url {id} {
if {[db_0or1row is_package_id "select 1 from apm_packages where package_id = $id"]} {
#
# the specified id is an package_id
#
set node_id [db_string get_node_id "select node_id from site_nodes where object_id = $id"]
set url [site_node::get_url -node_id $node_id]
return $url
}
if {[category::get_name $id] ne ""} {
#
# the specified id is a category_id
#
# if we would know the package_id here, we could return something like
# /xowiki/weblog-portlet?summary=1&category_id=8380
# however, since we have only a category_id, which might be mapped to
# multiple xowiki instances, we give up here.
return /categories
}
# id is an revision_id
return [::xowiki::url $id]
}
ad_proc -public do_notifications {
{-revision_id}
{-page}
{-html}
{-text}
{-new:boolean true}
} {
generate a notification
@param revision_id
@param new new or modified item
} {
if {![info exists page]} {
set page [::xowiki::Package instantiate_page_from_id -revision_id $revision_id]
$page volatile
}
if {[$page set publish_status] eq "production"} {
# don't do notification for pages under construction
#ns_log notice "--n xowiki::notification NO NOTIFCATION due to production state"
return
}
$page absolute_links 1
if {![info exists html]} {set html [$page render]}
if {![info exists text]} {set text [ad_html_text_convert -from text/html -to text/plain -- $html]}
#ns_log notice "--n xowiki::notification::do_notifications called for item_id [$page set revision_id] publish_status=[$page set publish_status] XXX"
$page instvar package_id
set link [::$package_id pretty_link -absolute 1 [$page name]]
append html "<p>For more details, see <a href='$link'>[$page set title]</a></p>"
append text "\nFor more details, see $link ...<hr>\n"
set state [expr {[$page set last_modified] eq [$page set creation_date] ? "New" : "Updated"}]
set instance_name [::$package_id instance_name]
#ns_log notice "--n per directory [$page set title] ($state)"
notification::new \
-type_id [notification::type::get_type_id -short_name xowiki_notif] \
-object_id [$page set package_id] \
-response_id [$page set revision_id] \
-notif_subject "\[$instance_name\] [$page set title] ($state)" \
-notif_text $text \
-notif_html $html \
-notif_user [expr {[$page exists modifying_user] ? [$page set modifying_user] : [$page set creation_user]}]
#ns_log notice "--n find categories [$page set title] ($state)"
foreach cat_id [category::get_mapped_categories [$page set item_id] ] {
set tree_id [category::get_tree $cat_id]
array unset cat
array unset label
foreach category_info [::xowiki::Category get_category_infos -tree_id $tree_id] {
foreach {category_id category_label deprecated_p level} $category_info {break}
set cat($level) $category_id
set label($level) $category_label
if {$category_id == $cat_id} break
}
foreach level [array names cat] {
#ns_log notice "--n category $cat($level) $label($level): [$page set title] ($state)"
notification::new \
-type_id [notification::type::get_type_id -short_name xowiki_notif] \
-object_id $cat($level) \
-response_id [$page set revision_id] \
-notif_subject "\[$instance_name\] $label($level): [$page set title] ($state)" \
-notif_text $text \
-notif_html $html \
-notif_user [$page set creation_user]
}
}
}
ad_proc -private process_reply { reply_id} {
handles a reply to an xowiki notif
@author Deds Castillo (deds@i-manila.com.ph)
@creation-date 2006-06-08
} {
# DEDS: need to decide on what to do with this
# do we publish it as comment?
# for now, drop it
return "f"
}
}
This diff is collapsed.
This diff is collapsed.
###
### just for backward compatibility for oacs 5.1 -gustaf neumann
###
if {[apm_version_names_compare [ad_acs_version] 5.2] <= -1} {
ad_proc -public ::template::adp_include {
{-uplevel 1}
src
varlist
} {
return a the output of a tcl/adp pair as a string. adp_level is
set to the calling procedure so that pass by reference works.
and example of using this is in the search indexer for various content
types:
<pre>
bookshelf::book::get -book_id $book_id -array bookdata
set body [template::adp_include /packages/bookshelf/lib/one-book \
[list &book "bookdata" base $base style feed]]
</pre>
The [list &book "bookdata" ...] tells adp_include to pass the book array by reference to the adp in
clude, where it is
refered to via @book.field@.
@param uplevel how far up the stack should the adp_level be set to
(default is the calling procedures level)
@param src should be the path to the tcl/adp pair relative to the server root, as
with the src attribute to the include tag.
@param varlist a list of {key value key value ... } varlist can also be &var foo
for things passed by reference (arrays and multirows)
@return the string generated by the tcl/adp pair.
@author Jeff Davis davis@xarg.net
@creation-date 2004-06-02
@see template::adp_parse
} {
# set the stack frame at which the template is being parsed so that
# other procedures can reference variables cleanly
variable parse_level
lappend parse_level [expr {[info level] - $uplevel}]
set __adp_out [template::adp_parse [template::util::url_to_file $src] $varlist]
# pop off parse level
template::util::lpop parse_level
return $__adp_out
}
}
\ No newline at end of file
This diff is collapsed.
#
# moved to xowiki-procs.tcl
#
#ns_cache create xowiki_cache -size 200000
#
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
::xowiki::Package initialize -ad_doc {
this file is called by the bulk action of admin/list
@author Gustaf Neumann (gustaf.neumann@wu-wien.ac.at)
@creation-date Nov 11, 2007
@cvs-id $Id$
@param object_type
} -parameter {
{-objects ""}
}
foreach o $objects {
ns_log notice "DELETE $o"
$package_id delete -name $o
}
ad_returnredirect "./list"
::xowiki::Package initialize -ad_doc {
This deletes a type with all subtypes and instances
@author Gustaf Neumann (gustaf.neumann@wu-wien.ac.at)
@creation-date Aug 11, 2006
@cvs-id $Id$
@param object_type
@param query
} -parameter {
{-object_type ::xowiki::Page}
{-return_url "."}
}
set sql [$object_type instance_select_query -with_subtypes 0 -folder_id [::$package_id folder_id]]
db_foreach retrieve_instances $sql {
permission::require_write_permission -object_id $item_id
$package_id delete -item_id $item_id -name $name
}
# drop type requires that all pages of all xowiki instances are deleted
# foreach type [$object_type object_types -subtypes_first true] {$type drop_object_type}
ad_returnredirect $return_url
This diff is collapsed.
<master>
<property name="title">@title;noquote@</property>
<property name="doc(title)">@title;noquote@</property>
<property name="context">@context;noquote@</property>
<formtemplate id="upload_form">
</formtemplate>
@msg;noquote@
<br/><a href="../">Index</a>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment