<commit_before><?xml version="1.0" encoding="UTF-8"?>
<xwikidoc>
<web>XWiki</web>
<name>ExtensionManager</name>
<language></language>
<defaultLanguage>en</defaultLanguage>
<translation>0</translation>
<parent>XWiki.AdminSheet</parent>
<creator>XWiki.Admin</creator>
<author>XWiki.Admin</author>
<customClass></customClass>
<contentAuthor>XWiki.Admin</contentAuthor>
<creationDate>1284043167000</creationDate>
<date>1298905259000</date>
<contentUpdateDate>1298905259000</contentUpdateDate>
<version>2.25</version>
<title>Extension Manager</title>
<template></template>
<defaultTemplate></defaultTemplate>
<validationScript></validationScript>
<comment></comment>
<minorEdit>true</minorEdit>
<syntaxId>xwiki/2.0</syntaxId>
<hidden>false</hidden><attachment>
<filename>icon.png</filename>
<filesize>7442</filesize>
<author>XWiki.Admin</author>
<date>1285847285000</date>
<version>1.1</version>
<comment></comment><content>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
<KEY>
</content></attachment>
<object>
<class>
<name>XWiki.ConfigurableClass</name>
<customClass></customClass>
<customMapping></customMapping>
<defaultViewSheet></defaultViewSheet>
<defaultEditSheet></defaultEditSheet>
<defaultWeb></defaultWeb>
<nameField></nameField>
<validationScript></validationScript>
<codeToExecute>
<disabled>0</disabled>
<editor>---</editor>
<name>codeToExecute</name>
<number>7</number>
<picker>0</picker>
<prettyName>codeToExecute</prettyName>
<rows>5</rows>
<size>40</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.TextAreaClass</classType>
</codeToExecute>
<configurationClass>
<disabled>0</disabled>
<name>configurationClass</name>
<number>3</number>
<picker>0</picker>
<prettyName>configurationClass</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</configurationClass>
<configureGlobally>
<defaultValue></defaultValue>
<disabled>0</disabled>
<displayFormType>checkbox</displayFormType>
<displayType></displayType>
<name>configureGlobally</name>
<number>4</number>
<prettyName>configureGlobally</prettyName>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.BooleanClass</classType>
</configureGlobally>
<displayInSection>
<disabled>0</disabled>
<name>displayInSection</name>
<number>1</number>
<picker>0</picker>
<prettyName>displayInSection</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</displayInSection>
<heading>
<disabled>0</disabled>
<name>heading</name>
<number>2</number>
<picker>0</picker>
<prettyName>heading</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</heading>
<iconAttachment>
<disabled>0</disabled>
<name>iconAttachment</name>
<number>8</number>
<picker>0</picker>
<prettyName>iconAttachment</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</iconAttachment>
<linkPrefix>
<disabled>0</disabled>
<name>linkPrefix</name>
<number>5</number>
<picker>0</picker>
<prettyName>linkPrefix</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</linkPrefix>
<propertiesToShow>
<cache>0</cache>
<disabled>0</disabled>
<displayType>input</displayType>
<multiSelect>1</multiSelect>
<name>propertiesToShow</name>
<number>6</number>
<picker>0</picker>
<prettyName>propertiesToShow</prettyName>
<relationalStorage>1</relationalStorage>
<separator> </separator>
<separators> ,|</separators>
<size>20</size>
<sort>none</sort>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<values></values>
<classType>com.xpn.xwiki.objects.classes.StaticListClass</classType>
</propertiesToShow>
</class>
<name>XWiki.ExtensionManager</name>
<number>0</number>
<className>XWiki.ConfigurableClass</className>
<guid>cef8c7cf-fecf-42cc-9e95-8a3be6ce936b</guid>
<property>
<codeToExecute>{{include document="XWiki.ExtensionManager" /}}</codeToExecute>
</property>
<property>
<configurationClass></configurationClass>
</property>
<property>
<configureGlobally>1</configureGlobally>
</property>
<property>
<displayInSection>Extensions</displayInSection>
</property>
<property>
<heading></heading>
</property>
<property>
<iconAttachment>icon.png</iconAttachment>
</property>
<property>
<linkPrefix></linkPrefix>
</property>
<property>
<propertiesToShow/>
</property>
</object>
<content>{{warning}}
This application is experimental, use it at your own risk.
{{/warning}}

{{velocity output="false"}}
#set($extensionManager = $services.extension)
#set($versionManager = $extensionManager.versionManager)
{{/velocity}}

{{velocity}}
{{html}}
&lt;form action="$xwiki.requestURL" enctype="multipart/form-data" method="post"&gt;
&lt;fieldset&gt;

  &lt;p&gt;
    &lt;label for="extensionid"&gt;Extension identifier&lt;/label&gt;
    &lt;input id="extensionid" name="extensionid" type="text" title="Extension identifier (&amp;lt;groupid&amp;gt;:&amp;lt;artefactid&amp;gt; for a maven extension)" #if($request.extensionid)value="${escapetool.xml($request.extensionid)}"#end /&gt;
  &lt;/p&gt;

  &lt;p&gt;
    &lt;label for="extensionversion"&gt;Extension version&lt;/label&gt;
    &lt;input id="extensionversion" name="extensionversion" type="text" title="Extension version" #if($request.extensionversion)value="${escapetool.xml($request.extensionversion)}"#end /&gt;
  &lt;/p&gt;

  &lt;span class="buttonwrapper"&gt;&lt;input type="submit" value="Resolve" name="actionresolve" class="button"/&gt;&lt;/span&gt;
  #if ($hasProgramming)
  &lt;span class="buttonwrapper"&gt;&lt;input type="submit" value="Install" name="actioninstall" class="button"/&gt;&lt;/span&gt;
  #end

&lt;/fieldset&gt;
&lt;/form&gt;
{{/html}}
{{/velocity}}

{{velocity}}
#if ($request.actionresolve)
  = Resolve

  #macro(resolveExtension $extensionid $extensionversion $extensionlevel)
    #set($extension = $extensionManager.resolve($extensionid, $extensionversion, null))
    #if (!$extension)
      #set($lasterror = $extensionManager.lastError)
      {{error}}Failed to resolve extension with id $request.extensionid and version $extensionversion: $lasterror.message{{/error}}
    #else
      #set($extensionclass = "${extension.class}")
      #foreach($index in [1..$extensionlevel])*#end #if($extensionclass.endsWith('CoreExtension'))**C**#elseif($extensionclass.endsWith('LocalExtension'))**I**#else**R**#end $extension.id.id ($extension.id.version#if($extensionversion != $extension.id.version) was $extensionversion#end)
      #resolveExtensionDependencies($extension)
    #end
  #end
  #macro(resolveExtensionDependencies $extension $extensionlevel)
    #set($extensionlevel = $extensionlevel + 1)
    #foreach ($dependency in $extension.dependencies)
      #resolveExtension($dependency.id, $dependency.version, $extensionlevel)
    #end
    #set($extensionlevel = $extensionlevel - 1)
  #end
  #resolveExtension($request.extensionid, $request.extensionversion, 1)

  **C**: core extension
  **I**: installed extension
  **R**: remote extension
#elseif($request.actioninstall)
  = Install

  #if($request.confirm)
    #set($extension = $extensionManager.install($request.extensionid, $request.extensionversion, null))
    #set($lasterror = $extensionManager.lastError)
    #if ($lasterror)
      {{error}}Failed to install extension with id $request.extensionid: $lasterror.message{{/error}}
    #end
  #else
    #macro(prepareInstall $extensionid $extensionversion $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts)
      #set($extension = $extensionManager.resolve($extensionid, $extensionversion, null))
      #set($extensionclass = "${extension.class}")
      #if (!$extensionclass.endsWith('CoreExtension') &amp;&amp; !$extensionclass.endsWith('LocalExtension'))
        #if ($extensionManager.getInstalledExtension($extensionid, null))
          #set($extensionsToUpgrade[$extension.id] = $extension)
        #else
          #set($extensionsToInstall[$extension.id] = $extension)
        #end
      #elseif ($extensionclass.endsWith('CoreExtension') &amp;&amp; $versionManager.compareVersions($extensionversion, $extension.id.version) &gt; 0)
        #set($coreExtensionsConflicts[$extension.id] = [$extension, $extensionversion])
      #end
      #prepareInstallDependencies($extension, $extensionsToInstall, $extensionsToUpgrade, $extensionsSuggested)
    #end
    #macro(prepareInstallDependencies $extension $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts)
      #foreach ($dependency in $extension.dependencies)
        #prepareInstall($dependency.id, $dependency.version, $extensionsToInstall, $extensionsToUpgrade, $extensionsSuggested)
      #end
    #end
    #set($extensionsToInstall = {})
    #set($extensionsToUpgrade = {})
    #set($extensionsSuggested = {})
    #set($coreExtensionsConflicts = {})
    #prepareInstall($request.extensionid $request.extensionversion $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts)
    #set($lasterror = $extensionManager.lastError)
    #if ($lasterror)
      {{error}}Can't resolve extension with id $request.extensionid and version $request.extensionversion: $lasterror.message{{/error}}
    #elseif ($extensionsToInstall.isEmpty() &amp;&amp; $extensionsToUpgrade.isEmpty())
      Already installed
    #else
      #if (!$extensionsToInstall.isEmpty())
        The following new extensions will be installed:
        #foreach ($extension in $extensionsToInstall.values())
          * $extension.id.id ($extension.id.version)
        #end

      #end
      #if (!$extensionsToUpgrade.isEmpty())
        The following extensions will be upgraded:
        #foreach ($extension in $extensionsToUpgrade.values())
          * $extension.id.id ($extension.id.version)
        #end

      #end
      #if (!$extensionsSuggested.isEmpty())
        Suggested:
        #foreach ($extension in $extensionsSuggested.values())
          * $extension.id.id ($extension.id.version)
        #end

      #end
      #if (!$coreExtensionsConflicts.isEmpty())
        {{warning}}
          Conflict with core extensions:
          #foreach ($conflict in $coreExtensionsConflicts.values())
            * extension **$conflict.get(0).id.id** is needed in version **$conflict.get(1)** but core extension has version **$conflict.get(0).id.version**
          #end

          Are you sure you want to install ?
        {{/warning}}

      #end
      {{html}}
      &lt;form action="$xwiki.requestURL" enctype="multipart/form-data" method="post"&gt;
        &lt;fieldset&gt;
          &lt;input name="extensionid" value="${escapetool.xml($request.extensionid)}" type="hidden" /&gt;
          &lt;input name="extensionversion" value="${escapetool.xml($request.extensionversion)}" type="hidden" /&gt;
          &lt;input name="actioninstall" type="hidden" /&gt;
          &lt;span class="buttonwrapper"&gt;&lt;input type="submit" value="Apply" name="confirm" class="button"/&gt;&lt;/span&gt;
        &lt;/fieldset&gt;
      &lt;/form&gt;
      {{/html}}
    #end
  #end
#elseif($request.actionuninstall)
  = Uninstall

  #if($request.confirm)
    #set($extension = $extensionManager.uninstall($request.extensionid, null))
    #set($lasterror = $extensionManager.lastError)
    #if ($lasterror)
      {{error}}Failed to uninstall extension with id $request.extensionid: $lasterror.message{{/error}}
    #end
  #else
    #macro(prepareUninstall $extensionid $extensionsToUninstall)
      #set($void = $extensionsToUninstall.add($extensionid))
      #set($backwardDependencies = $extensionManager.getBackwardDependencies($extensionid, null))
      #prepareUninstallBackwardDependencies($backwardDependencies, $extensionsToUninstall)
    #end
    #macro(prepareUninstallBackwardDependencies $backwardDependencies $extensionsToUninstall)
      #foreach ($backwardDependency in $backwardDependencies)
        #prepareUninstall($backwardDependency.id, $extensionsToUninstall)
      #end
    #end
    #set($extensionsToUninstall = [])
    #prepareUninstall($request.extensionid $extensionsToUninstall)
    #if ($extensionsToUninstall.empty)
      Extension does not exists
    #else
      The following extensions will be removed:
      #foreach ($extensionid in $extensionsToUninstall)<commit_msg>XAEXTENSION-5: Add multiwiki support to extension Improve error handling<commit_after><?xml version="1.0" encoding="UTF-8"?>
<xwikidoc>
<web>XWiki</web>
<name>ExtensionManager</name>
<language></language>
<defaultLanguage>en</defaultLanguage>
<translation>0</translation>
<parent>XWiki.AdminSheet</parent>
<creator>XWiki.Admin</creator>
<author>XWiki.Admin</author>
<customClass></customClass>
<contentAuthor>XWiki.Admin</contentAuthor>
<creationDate>1284043167000</creationDate>
<date>1298969789000</date>
<contentUpdateDate>1298969789000</contentUpdateDate>
<version>1.1</version>
<title>Extension Manager</title>
<template></template>
<defaultTemplate></defaultTemplate>
<validationScript></validationScript>
<comment></comment>
<minorEdit>true</minorEdit>
<syntaxId>xwiki/2.0</syntaxId>
<hidden>false</hidden><attachment>
<filename>icon.png</filename>
<filesize>7442</filesize>
<author>XWiki.Admin</author>
<date>1285847285000</date>
<version>1.1</version>
<comment></comment><content>iVBORw0KGgoAAAANSUhEUgAAAH0AAABVCAYAAABkf+t+AAAABmJLR0QA/wD/AP+gvaeTAAAcx0lE
QVR4Xu2deZAcV53nPy9fZlZWdV3drT5ltQ4LS5aNZKNhfGA52AGbYz2YjQFid1jOXWIXFrx/rHcD
zHANgz3sLEfAMDHjCYLFnmEIjsVcYzCLF48R9mCwLB+SZUmWrMtqqY/qOrqOPN5mZ9SLUGVUqaQu
1N0M+kb84mW+fNkVqk9+f+/ITJWplOJ3Sxdl8hvURV2EflEXoV+UECIP2DRl2wyj1YArrr46c9ll
l2VWr16dSaUSAwnLyX/kYx/7qlLq1PJCvwjOAvrRgrxtYwNs2XJFcv36SwfXr1+fHBwczORy+Yzj
OLlUKrVQZh5+6CGnf3AwZZpGzjBkNmyTTiQSWYHII0QOkERSoGB6epq9+/Z9G1h50EUofvs0hBbY
QH7jxo2JrVu3ZoeGBgbHx9ckc7lcZkFCqP5wO2XbicwDD/wos2bN2oSUMhdGNhMqne7LCiJolqJV
GiDoQm/FCqXi9ThJh2QyOSGEOMQ5SoW6UNA1aB3ocomVAvpo6iUvWb8mdFsIZU0IIp0fGhpNhmVm
wWmGQX6BzwI4yzIzw8MjTviFZhbACSFyIyMjGRSJdtA0E604sSDQwOLH2oDW9d0vDMIsQHixDQKS
7lJNLgpQZ7sAzB5hG80QOjh/WUAeIHSatWXLlpGBgdzI8PBwpr+/P4Ri5gf7B5NOKpUFlQsh9lmW
tQAuHabPvtCBfYZhZBcin8snTMuivRSdPaCo1+otIOJAuji4w7HFQ9cKnT4A2N2B65JAhxBCg+/Z
6Rq2bJ4vmzEc9lHmddddl73kktHBIDBGQ2jpTKgQUD6fzyUdx1lwWtr3gwV4KdM00wsxOjqaaoJz
QqCEINt/4V2g1BuNKOJCKRRd1Mnd3YH25PC5uSJzxRLDQ6siZ8fpSykHgb7u0KPwAe/MUoPvCH3z
5s2Zm266aezyyy/PjY2N5Y8cOTSRzeayC+lRCJHPZrOpsE/Lzs9XB8LUk65WqzkpZVrKBXhywXFJ
mhoYGKST4hg9z0WrVqtSKhXjTLvrPLB2/9vqgp575Ohx4gp8L4RuE9eNN+6469FHH/moUsoLgqAe
lvWwbIShy5pSgbdv775fvf+22/4CaAD1M5zvn9Xpd975qW/t2LHjZprK528hdB5aQRBE8cwzT7Nt
21Wcqxa56hd3aHe3n7ODe/lbqhv0rse2bd3WKUt06haSzc2M6nCOEMYckAfmAeMM4AHQ2emOk5wd
GhqmszT4c4WoUKpH2L1/RndQWkr1ALuHLqEz7LMfU8SVawIPALfperEgFaotdMMw5ro4NoIelj2C
6B24UgGe61E5cYziZz+Ft29PmymEite17quzHVex/dixc61v+3cUAs7eVrW2FSgkCiMqg6g0lEJE
dXD5xi0bgWQTtAVIwOg6eq/X68WzAdewQS097Hj6VOB6HiVpUXj3BzDuv4/UQz8BFXAhlXzdrTg3
/AGzH76te9s3v43aN+9hCaT/2ZYeXLfMqrpAL3cCWa3WOHr8GJ7nMTNbWBH9tmmapFIpKpUK0zfe
xMyqEUZ/9B2sconllhxdjfO6Ny4Z9CAIRAz2uS3OzM5OVdsBf2rPHr58z9/r9M6asRFe/apXxd1N
db7IsaPPsJQKgoBGrY7vzjE94HDs5pu5bOdOBidPXjigY+OM/OMjABRCxzd2PUbuU1/AvvrlqHKJ
uTs+QN+7/ksEvu8DHyI4eZxUuA9E28U73o8KywuguLO7Q3ddr9AuTSed5Dmn8nUbfo+lllJqIUtR
LBY5efIk0xu2kfj6l0kfO8yFkEhnmXr3m7Beson0u95HbeODGJkMp19/LYkdryJ92wcp3flhsnd+
gcoX7wKgGjpeAP3f+L/IsdV4Fwh6DH536MXiXPlc+2WlVtRNEL1kSb1axfr234fAX+BCydv/LH4I
TQDmxs3w8INROfSPj9JGUZqXGy+PyhV3a3Vq6nSp0XCxLCu2FOiw0uX7PvOFAt5ffYb007u4kDJf
shkjnQld/Qd4B54FiMrZ296pbRaldiOdBYhSfOmuO3B//lPSH7oTkc6sHOi53OChQqHA0NAQZ2r1
2BgrVUqpaHA5e/AAlc/9GeaxI1xoqXKRoW88QNR/3/XhqE+3r3q5djq1cCZR+cqXAMh+6os0Hv4p
mRC2dyDKEBijq/lNS/m+vyjoO3fuLL73ve9lRSs+iGs0mPn5z3D/+nPI6jwXWtX7vxvGffE5NnPR
FE611E+/5SY994a7YvP03/yXsTjoP/nJT2pKqQZgo7WCHe66LoX9+5jf+RD1TVeg9C3OLuq2OEPn
xRmALos2ndvQZXGGNoszWnoRxnOrWNJCoKKQhkFfMsl0IAuLgg5UZmamS+FtzcFYDo1S/LETJ7rM
t9WSQvd9H7VqGPXH78bwPJZaKra9FCoWJ3GcvP5QTNPEy2Y5/NTuk/Cl84eulKrs2vV4GRhsgakH
c51gL9OI3bZt8vk82WyW3xUVCiap5KBmjhAgpcQ0LbVYpy+4p9QF5rID19BN04zid0mNRiqEnkLF
brxIafQA3fPL7WAmHSfGe7lwX5SmE4e0aOiV+XKlHc7V42M8+cwefhvlnj5N4f77UY0Gg29+MzKX
47ddrdxVb9CllHP8C1L1ued4cvt2ktdfS2b9pUzefTcv/eUvf7thqzawgx6gu65bPvdng+JtFCtN
Xujyuik4NnmI/v4U2aNH8WZmMAcGfpu5x61OgFo89Lm50nw74ONjo11veSpWnjKveAWjN72W+cd3
Unv8cUa3bm0BXq5PUagcJa5capyMM4JWqTbJ3PwJxvu3YgjJcipuQtVrejcMCrHReYf1d318+RVU
qxy+/Xb6QqDJyy9HptOktm1DSIk7OUn98GGUbTIwMEr6ZS/jTO09/mMe2vf52HdgcbKwj4/cuicC
7wcNPvndLSHwKzg+8ySB8rlk4GoMYfCytW9hx6b3LTXzOOzeoNdqtXKHh/tW7OjdSCaZ/f73cQsz
nLr3HkQQUHliN8r3wUlQzTownGPg39zKix+/i9IvfhEdU40G/u7dmB83yVzvo1Wo2rxk5NX0JVYB
IA2bicHtFKs72TzmM5TdTrk+z2D6OvZPPrSk0OOw9abnebXFj94r5WI7no7jsJJlDQ1xbPcjBI5F
pC2r4ymNo9/6O3Jvei2V07OoQFA+cpTxm28iMf0gQqBFuZbm317z8ZY0/p5Xfoc7v3clvnqRqdKv
AThddEiYm1gWqfizDYG3GOga7lShUCCfz8futI2ykiVzOeTJKc76Wp3nUXx6N1oimUA4CawiCAMt
xvJXUZg/xur+rWglzD6EkGHothAg6bOzywM87vkAeoDed8p13fMcvStdLJlO33MP1b176b/1VpKX
XUb90CHMvIkSnJ+EwqjRcrFcueZGvvOr28mnLtHgeeDpP8c2X8QyBVpKSRxrGaCjYkbvsU8PHzea
O99nvVFLyjtaaDn+uf/FwGtey5H/fjulXbtgoA9p5zmrai5iqgTTYZgStSqDWu0hHFrS+4tzX+GG
ze/gG798H6XqaWruHOlkiZF80NJOBQYJM72cRtciIBCLhr5v375i5PQ2g7n+fJ7pmZnYVG3pVXr0
URqzp5j82XcBkFdewrkoCIHPvH0C+dY3sPuxr/Gar42jKhXkhAKBFpX6kTA+ycTQasq1AkpVMAzi
wlOqxekz5RcIlM+qzIYloq4936PTv/jFLx58+qmnGB8biwNloF9DX9Z1mCidi4aLMV3CO13C6LOR
Q1mMlE0n+bMVTl1eZvaNe0l7FbZd81a+Z97NxK9nCF4nMA1FXFX3OFLSUf1940yVn6fmFrnv8f/B
gcmHMI0Eo7ktvP2GezGEXKIRfI/QAd8PgoqCPs5biiVQtH5efuwxglqN0fe/P9o++ie3Y65bRSfJ
9Cpq104jBFQaR8L4c9ZvAsKQKBajtUOjnJw1+ci3JxjOuawfDVg7+EaeeqHAodOPcOnwDSv6hkv8
MaQyMehdra3Ukrlf2DbrPv95tMIFGQ7ddhtpgA6j9yCTw3VEyyi9VBUkbYUpWZT2TX4JISRXbfQR
AAiOzH6XTPINnC7uvzDQVTPing96hF6tzpeBkXjfvWHdOvYffL7DMuzySUiJmcthBAFGB4L2Vduw
nvgljdcJTs+FURCM5XZw+PmnGN84S5+jWJx8PB9sEy1KtROkEv1LN4LvPb2DlGax+7tpGvbKkOE4
mEohDdoqu36U8b+Bn73UgO2X8p7Nn6X03j+l+pzPP38QMjeyKB0+aeA2JrDsI6wbDZguCl6cOcym
sZuW8H66QgnVG3Tf98rd1tWVYsVJCoHZIb3Pf+/rbPzkJ8j/8MfU7n2BUzN/RHowSWbbVsyZh2l3
mufD5KygUBYYAob7FYNZhdZsSTCSfgPv3PE17t35Tn757Lejkfu7b/zraDFnyVbj6N3peJ5XUsSl
GOjPde1slktesYg93o8hOjVwUd//CsMj49SrAnPNGACTJ0/iDQhEzCkK2PWc5FXGGl46sB1fnebn
xWkOz+9l/VgAQDqxDccYAeBtr/jfUSz1Ao0mLoSQPUGfn5+vtEvl+Vx+Rad6S6Chd9apEyQdEy2v
VIJB4su3TBUkL5uzePWLReD/Yd/wNi6t/YC7+q6kWn+KlAO2zBMEvr75pEsNIYoLALt9elcq6Am6
YYi5cwOqVkyqD8plLLmK6AWIqgv6Hbc+G61GzSXwAs5U/cQJGDMRsXn6eH4Hs8YjYBBJHbwPxvJk
nGHc4OmovWkalCtl/TZvFBq4YRhnA9+2Ximlj5334oxt2n09Qa/X66Ue/m+VJdfxKReCgD07D0Iq
jb/uMkwJptcge/IIqzcOcfzAaWYTQ6hMDgDHBENAeWsVXxQplASWqUjaICWMDwxyYuN1PF98nA01
iZU6xZGrPs3BR9/FNVsUAkB4NLzqwveF53kamn5KV4NvBzxqG5Yadhx6PGN0Te8IJXqCLoScm6/M
k0ylOFMb1q1dkQO5rz5p8eBHn2emfwIvUIxmYHbeYP+U4KFvbcGdLzOXn+DfveNJco7CNhaOQbkB
147+kOtnf8ql8gDTxVNMlQ5GK2xCfIdBH/JBFjML3iWv56RS5NJ1nj8hKNcEpvE0/YkrF7pDXNeN
nB7CxrKsaDuE3uJiDVBKqbOBzhL4vq+h62NRSClb3K9io3dNXZpWb04fGhp6sTKvoZ/LQE0t65Uw
nDXYm8+ydsMeAMrA9JExPm3/gtpzz5F528349z7AzUd+yP1brmF8YpJN62BNn41T2kH1YJX3zX0B
lE8kmcRtuKhaEk9J2PAG5JF72VovocQrqFWnucSrI4Hx+hTqwZs5euVf4iVGIughQFzX1Y7WMCOI
+qLQ4PX7eJ7nRds6U+h2gG571lurQgijJ+i1Wq3UNpWrlfmMXNqGwDc4U1OTA2y/+z1s3DKMceR5
Nn7odj7w/Df56olbGFtzCiEURysNVtVgbfUQ89VVRDId8Kugs6UB3v4HUBvegunOsb06S1CXIPrR
st3HmFdZRNPtIUANvMXlIUgSiYRe9dTv40Xdg84UGrjjOFEZyxR6L270hbapnqCXSqW5TrdO87nc
ihvE5RzwfcmZ+v3Vgsb6LZRffIJ61WXm8NdI/+lnYA8tCjxJ1iiCdpKqg2Ggpev8gw/gExcIA8RA
f9StCOVFLo9Ju1W7XTszcncIO3J6CFyn/zjsLrdWdZeA7DW9T87NFVg1OEicaX8+h9eor6jVuD5b
xZ3O66+s8/7XfJPPnfwMa60SqZvfyG1T/4rh8dMtc3LPN8iJIkgWJdGXxTNdDS0OSwPWpXZ3S18e
hu7r9eBPv3ev+3dd3446CpBCJnuCfs0115x88sndqM6LL6hlenLmK48bfP1Jg9VZ+PArfS4dUFQa
AkMGnKlf1F7g7a+Z4LPP3smPnoPU4z75oSnGJ07FnvOPnI60G0hZIwhsPD/JucpIpXGNugZ9tjds
NciO07QwWroHDVxfDLptu/QujB6dDhSIQ9XMlwm2Bv75XVVevqHGOmuA199j8g9v8fjBPoP8QIkz
dWK+wTfmD8Aq2B5GJzU8QV4WUONXcKT/X7PrSJX+wqNcaz7FOclKIvwqWsnqIdLlJ/DMfmb7XxkH
3+L6M8C2ODw2+Gs5R0vF3G7IHp0OVMJ+xgcl48zXr13L/v3PAWqpmfPlX0kYPMWeRpWCOct/uHYd
b/qmwOw/yaqRGRajl44FPFz8M8TaDHc8PEQmY2OlJfmTP+Brg/+ZblLSwZ4/iRHMk5o/yKZn/xOs
fjVCOEwdeojD6z/Wdu6tR/I6gJZpmmVZ0aAvPBbtx4C3ybqiZ6djmmYJRb4jVBWrXwL8hwuC8XFX
O5n7eI7RzfSkzWtLHD2+iXf81CczNI09MsP1o1l+/ItbeCbYzBXWs5xNQf00iS3v4KpdrwPl45LG
O/4k5qa3sGrm+0w2jtNITmjn6r4b27Z1RGBj6bwl9DGgY3oH5fcEXb+nriDfljZLDxxgJK2ozdVx
nHkAPM9irjhALjuDabosRn+3pwTAmnVE8srwkwMlRrOrOTi3niucfZxNqjHD/P77wegHBFregW9i
<KEY>
</content></attachment>
<object>
<class>
<name>XWiki.ConfigurableClass</name>
<customClass></customClass>
<customMapping></customMapping>
<defaultViewSheet></defaultViewSheet>
<defaultEditSheet></defaultEditSheet>
<defaultWeb></defaultWeb>
<nameField></nameField>
<validationScript></validationScript>
<codeToExecute>
<disabled>0</disabled>
<editor>---</editor>
<name>codeToExecute</name>
<number>7</number>
<picker>0</picker>
<prettyName>codeToExecute</prettyName>
<rows>5</rows>
<size>40</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.TextAreaClass</classType>
</codeToExecute>
<configurationClass>
<disabled>0</disabled>
<name>configurationClass</name>
<number>3</number>
<picker>0</picker>
<prettyName>configurationClass</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</configurationClass>
<configureGlobally>
<defaultValue></defaultValue>
<disabled>0</disabled>
<displayFormType>checkbox</displayFormType>
<displayType></displayType>
<name>configureGlobally</name>
<number>4</number>
<prettyName>configureGlobally</prettyName>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.BooleanClass</classType>
</configureGlobally>
<displayInSection>
<disabled>0</disabled>
<name>displayInSection</name>
<number>1</number>
<picker>0</picker>
<prettyName>displayInSection</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</displayInSection>
<heading>
<disabled>0</disabled>
<name>heading</name>
<number>2</number>
<picker>0</picker>
<prettyName>heading</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</heading>
<iconAttachment>
<disabled>0</disabled>
<name>iconAttachment</name>
<number>8</number>
<picker>0</picker>
<prettyName>iconAttachment</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</iconAttachment>
<linkPrefix>
<disabled>0</disabled>
<name>linkPrefix</name>
<number>5</number>
<picker>0</picker>
<prettyName>linkPrefix</prettyName>
<size>30</size>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<classType>com.xpn.xwiki.objects.classes.StringClass</classType>
</linkPrefix>
<propertiesToShow>
<cache>0</cache>
<disabled>0</disabled>
<displayType>input</displayType>
<multiSelect>1</multiSelect>
<name>propertiesToShow</name>
<number>6</number>
<picker>0</picker>
<prettyName>propertiesToShow</prettyName>
<relationalStorage>1</relationalStorage>
<separator> </separator>
<separators> ,|</separators>
<size>20</size>
<sort>none</sort>
<unmodifiable>0</unmodifiable>
<validationMessage></validationMessage>
<validationRegExp></validationRegExp>
<values></values>
<classType>com.xpn.xwiki.objects.classes.StaticListClass</classType>
</propertiesToShow>
</class>
<name>XWiki.ExtensionManager</name>
<number>0</number>
<className>XWiki.ConfigurableClass</className>
<guid>cef8c7cf-fecf-42cc-9e95-8a3be6ce936b</guid>
<property>
<codeToExecute>{{include document="XWiki.ExtensionManager" /}}</codeToExecute>
</property>
<property>
<configurationClass></configurationClass>
</property>
<property>
<configureGlobally>1</configureGlobally>
</property>
<property>
<displayInSection>Extensions</displayInSection>
</property>
<property>
<heading></heading>
</property>
<property>
<iconAttachment>icon.png</iconAttachment>
</property>
<property>
<linkPrefix></linkPrefix>
</property>
<property>
<propertiesToShow/>
</property>
</object>
<content>{{warning}}
This application is experimental, use it at your own risk.
{{/warning}}

{{velocity output="false"}}
#set($extensionManager = $services.extension)
#set($versionManager = $extensionManager.versionManager)
{{/velocity}}

{{velocity}}
{{html}}
&lt;form action="$xwiki.requestURL" enctype="multipart/form-data" method="post"&gt;
&lt;fieldset&gt;

  &lt;p&gt;
    &lt;label for="extensionid"&gt;Extension identifier&lt;/label&gt;
    &lt;input id="extensionid" name="extensionid" type="text" title="Extension identifier (&amp;lt;groupid&amp;gt;:&amp;lt;artefactid&amp;gt; for a maven extension)" #if($request.extensionid)value="${escapetool.xml($request.extensionid)}"#end /&gt;
  &lt;/p&gt;

  &lt;p&gt;
    &lt;label for="extensionversion"&gt;Extension version&lt;/label&gt;
    &lt;input id="extensionversion" name="extensionversion" type="text" title="Extension version" #if($request.extensionversion)value="${escapetool.xml($request.extensionversion)}"#end /&gt;
  &lt;/p&gt;

  &lt;span class="buttonwrapper"&gt;&lt;input type="submit" value="Resolve" name="actionresolve" class="button"/&gt;&lt;/span&gt;
  #if ($hasProgramming)
  &lt;span class="buttonwrapper"&gt;&lt;input type="submit" value="Install" name="actioninstall" class="button"/&gt;&lt;/span&gt;
  #end

&lt;/fieldset&gt;
&lt;/form&gt;
{{/html}}
{{/velocity}}

{{velocity}}
#if ($request.actionresolve)
  = Resolve

  #if (!$request.extensionid || !$request.extensionversion)
    {{error}}You have to provide both extension id and version.{{/error}}
  #else
    #macro(resolveExtension $extensionid $extensionversion $extensionlevel)
      #set($extension = $extensionManager.resolve($extensionid, $extensionversion, null))
      #if (!$extension)
        #set($lasterror = $extensionManager.lastError)
        {{error}}Failed to resolve extension with id $request.extensionid and version $extensionversion: $lasterror.message{{/error}}
      #else
        #set($extensionclass = "${extension.class}")
        #foreach($index in [1..$extensionlevel])*#end #if($extensionclass.endsWith('CoreExtension'))**C**#elseif($extensionclass.endsWith('LocalExtension'))**I**#else**R**#end $extension.id.id ($extension.id.version#if($extensionversion != $extension.id.version) was $extensionversion#end)
        #resolveExtensionDependencies($extension)
      #end
    #end
    #macro(resolveExtensionDependencies $extension $extensionlevel)
      #set($extensionlevel = $extensionlevel + 1)
      #foreach ($dependency in $extension.dependencies)
        #resolveExtension($dependency.id, $dependency.version, $extensionlevel)
      #end
      #set($extensionlevel = $extensionlevel - 1)
    #end
    #resolveExtension($request.extensionid, $request.extensionversion, 1)

    **C**: core extension
    **I**: installed extension
    **R**: remote extension
  #end
#elseif($request.actioninstall)
  = Install

  #if (!$request.extensionid || !$request.extensionversion)
    {{error}}You have to provide both extension id and version.{{/error}}
  #elseif ($request.confirm)
    #set($extension = $extensionManager.install($request.extensionid, $request.extensionversion, null))
    #set($lasterror = $extensionManager.lastError)
    #if ($lasterror)
      {{error}}Failed to install extension with id $request.extensionid: $lasterror.message{{/error}}
    #end
  #else
    #macro(prepareInstall $extensionid $extensionversion $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts)
      #set($extension = $extensionManager.resolve($extensionid, $extensionversion, null))
      #set($extensionclass = "${extension.class}")
      #if (!$extensionclass.endsWith('CoreExtension') &amp;&amp; !$extensionclass.endsWith('LocalExtension'))
        #if ($extensionManager.getInstalledExtension($extensionid, null))
          #set($extensionsToUpgrade[$extension.id] = $extension)
        #else
          #set($extensionsToInstall[$extension.id] = $extension)
        #end
      #elseif ($extensionclass.endsWith('CoreExtension') &amp;&amp; $versionManager.compareVersions($extensionversion, $extension.id.version) &gt; 0)
        #set($coreExtensionsConflicts[$extension.id] = [$extension, $extensionversion])
      #end
      #prepareInstallDependencies($extension, $extensionsToInstall, $extensionsToUpgrade, $extensionsSuggested)
    #end
    #macro(prepareInstallDependencies $extension $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts)
      #foreach ($dependency in $extension.dependencies)
        #prepareInstall($dependency.id, $dependency.version, $extensionsToInstall, $extensionsToUpgrade, $extensionsSuggested)
      #end
    #end
    #set($extensionsToInstall = {})
    #set($extensionsToUpgrade = {})
    #set($extensionsSuggested = {})
    #set($coreExtensionsConflicts = {})
    #prepareInstall($request.extensionid $request.extensionversion $extensionsToInstall $extensionsToUpgrade $extensionsSuggested, $coreExtensionsConflicts)
    #set($lasterror = $extensionManager.lastError)
    #if ($lasterror)
      {{error}}Can't resolve extension with id $request.extensionid and version $request.extensionversion: $lasterror.message{{/error}}
    #elseif ($extensionsToInstall.isEmpty() &amp;&amp; $extensionsToUpgrade.isEmpty())
      Already installed
    #else
      #if (!$extensionsToInstall.isEmpty())
        The following new extensions will be installed:
        #foreach ($extension in $extensionsToInstall.values())
          * $extension.id.id ($extension.id.version)
        #end

      #end
      #if (!$extensionsToUpgrade.isEmpty())
        The following extensions will be upgraded:
        #foreach ($extension in $extensionsToUpgrade.values())
          * $extension.id.id ($extension.id.version)
        #end

      #end
      #if (!$extensionsSuggested.isEmpty())
        Suggested:
        #foreach ($extension in $extensionsSuggested.values())
          * $extension.id.id ($extension.id.version)
        #end

      #end
      #if (!$coreExtensionsConflicts.isEmpty())
        {{warning}}
          Conflict with core extensions:
          #foreach ($conflict in $coreExtensionsConflicts.values())
            * extension **$conflict.get(0).id.id** is needed in version **$conflict.get(1)** but core extension has version **$conflict.get(0).id.version**
          #end

          Are you sure you want to install ?
        {{/warning}}

      #end
      {{html}}
      &lt;form action="$xwiki.requestURL" enctype="multipart/form-data" method="post"&gt;
        &lt;fieldset&gt;
          &lt;input name="extensionid" value="${escapetool.xml($request.extensionid)}" type="hidden" /&gt;
          &lt;input name="extensionversion" value="${escapetool.xml($request.extensionversion)}" type="hidden" /&gt;
          &lt;input name="actioninstall" type="hidden" /&gt;
          &lt;span class="buttonwrapper"&gt;&lt;input type="submit" value="Apply" name="confirm" class="button"/&gt;&lt;/span&gt;
        &lt;/fieldset&gt;
      &lt;/form&gt;
      {{/html}}
    #end
  #end
#elseif($request.actionuninstall)
  = Uninstall

  #if (!$request.extensionid || !$request.extensionversion)
    {{error}}You have to provide both extension id and version.{{/error}}
  #elseif($request.confirm)
    #set($extension = $extensionManager.uninstall($request.extensionid, null))
    #set($lasterror = $extensionManager.lastError)
    #if ($lasterror)
      {{error}}Failed to uninstall extension with id $request.extensionid: $lasterror.message{{/error}}
    #end
  #else
    #macro(prepareUninstall $extensionid $extensionsToUninstall)
      #set($void = $extensionsToUninstall.add($extensionid))
      #set($backwardDependencies = $extensionManager.getBackwardDependencies($extensionid, null))
      #prepareUninstallBackwardDependencies($backwardDependencies, $extensionsToUninstall)
    #end
    #macro(prepareUninstallBackwardDependencies $backwardDependencies $extensionsToUninstall)
      #foreach ($backwardDependency in $backwardDependencies)
        #prepareUninstall($backwardDependency.id, $extensionsToUninstall)
      #end
    #end
    #set($extensionsToUninstall = [])
    #prepareUninstall($request.extensionid $extensionsToUninstall)
    #if ($extensionsToUninstall.empty)
      Extension does not exists
    #else
      The following extensions will be removed:
      #foreach ($extensionid in $extensionsToUninstall)
{'fraction_non_alphanumeric': 0.11218458470814442, 'fraction_numerical': 0.06803237828471052, 'mean_word_length': 9.139109506618531, 'pattern_counts': {'":': 0, '<': 645, '<?xml version=': 2, '>': 645, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 10}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1695495', 'n_tokens_mistral': 21050, 'n_tokens_neox': 19742, 'n_words': 1479}