[PATCH] Traslate

Esteban Arias earias at plan.ceibal.edu.uy
Wed Jun 2 11:50:36 EDT 2010


---
 po/es.po |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/po/es.po b/po/es.po
index 587608f..0e138a4 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1275,6 +1275,45 @@ msgstr "Fuente del paquete de la actividad"
 msgid "View source: %r"
 msgstr "Ver c=F3digo fuente: %r"

+#: ../src/jarabe/journal/volumestoolbar.py:196
+msgid "Journal Backup"
+msgstr "Respaldar Diario"
+
+#: ../src/jarabe/journal/volumestoolbar.py:208
+msgid "Journal Restore"
+msgstr "Restaurar Diario"
+
+#: ../src/jarabe/journal/backup.py:84
+msgid "backup"
+msgstr "respaldar"
+
+#: ../src/jarabe/journal/backup.py:84
+msgid "restore"
+msgstr "restaurar"
+
+#: ../src/jarabe/journal/backup.py:89
+msgid ""
+"Close all activities and do not remove the external device during the
process. \n\n"
+"To make the backup of the Journal, a restart is required. \n\n"
+"The backup can only be restore from this computer"
+msgstr ""
+"Cierre todas las actividades y no extraiga el dispositivo externo durante
el proceso. \n\n"
+"Para realizar el respaldo del Diario, se requiere reiniciar. \n\n"
+"El resplado s=F3lo podr=E1 ser recuperado desde este equipo "
+
+#: ../src/jarabe/journal/backup.py:94
+msgid ""
+"The content you restore will overwrite the current contents of the
Journal. \n\n"
+"Do not remove the external device during the process. \n"
+"To implement the restoration of the Journal, a restart is required. \n\n"
+"It will restore the backup done for this computer "
+msgstr ""
+"El contenido que restaurar=E1 va a sobrescribir el contenido acutal del
Diario. \n\n"
+"No extraiga el dispositivo externo durante el proceso. \n"
+"Para aplicar la restauraci=F3n del Diario, se requiere reiniciar. \n\n"
+"Se restaurar=E1 el respado realizado para este equipo "
+
+
 #~ msgid "Cannot obtain data needed for registration."
 #~ msgstr "No se puede obtener datos necesarios para el registro"

--=20
1.6.2.5




--=20
   Esteban Arias
   Plan Ceibal - =C1rea T=E9cnica
   Avda. Italia 6201
   Montevideo - Uruguay.
   Tel.: 601.57.73 Interno 2228
   E-mail : earias at plan.ceibal.edu.uy

--001636e0b9b8e73b3104880e573f
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

hi, <br>I attached patches of journal backup on volumenes.<br>then, we need=
 migrate to 0.84.<br><br><br>From 3c28e29e44b8b30a2598ed7e90b3ca3ac809c89e =
Mon Sep 17 00:00:00 2001<br>From: Esteban Arias &lt;<a href=3D"mailto:earia=
s at plan.ceibal.edu.uy" target=3D"_blank">earias at plan.ceibal.edu.uy</a>&gt;<b=
r>
Date: Wed, 2 Jun 2010 12:32:59 -0300<br>
Subject: [PATCH] Adds-JournalVolumePalette<br>Organization: Plan Ceibal<br>=
<br>---<br>=A0src/jarabe/journal/volumestoolbar.py |=A0=A0 42 +++++++++++++=
++++++++++++++++++++-<br>=A01 files changed, 41 insertions(+), 1 deletions(=
-)<br>

<br>diff --git a/src/jarabe/journal/volumestoolbar.py b/src/jarabe/journal/=
volumestoolbar.py<br>index 74b974c..cc7ae38 100644<br>--- a/src/jarabe/jour=
nal/volumestoolbar.py<br>+++ b/src/jarabe/journal/volumestoolbar.py<br>

@@ -1,4 +1,6 @@<br>=A0# Copyright (C) 2007, One Laptop Per Child<br>+# Copy=
right (C) 2010, Plan Ceibal &lt;<a href=3D"mailto:comunidad at plan.ceibal.edu=
.uy" target=3D"_blank">comunidad at plan.ceibal.edu.uy</a>&gt;<br>+# Copyright=
 (C) 2010, Paraguay Educa &lt;<a href=3D"mailto:tecnologia at paraguayeduca.or=
g" target=3D"_blank">tecnologia at paraguayeduca.org</a>&gt;<br>

=A0#<br>=A0# This program is free software; you can redistribute it and/or =
modify<br>=A0# it under the terms of the GNU General Public License as publ=
ished by<br>@@ -22,13 +24,17 @@ import gio<br>=A0import gtk<br>=A0import gc=
onf<br>

=A0<br>+from sugar.graphics.icon import Icon<br>=A0from sugar.graphics.radi=
otoolbutton import RadioToolButton<br>=A0from sugar.graphics.palette import=
 Palette<br>=A0from sugar.graphics.xocolor import XoColor<br>+from sugar.gr=
aphics.menuitem import MenuItem<br>

=A0<br>=A0from jarabe.journal import model<br>+from jarabe.journal.backup i=
mport Backup<br>=A0from jarabe.view.palettes import VolumePalette<br>=A0<br=
>+<br>=A0class VolumesToolbar(gtk.Toolbar):<br>=A0=A0=A0=A0 __gtype_name__ =
=3D &#39;VolumesToolbar&#39;<br>

=A0<br>@@ -164,7 +170,7 @@ class VolumeButton(BaseButton):<br>=A0=A0=A0=A0=
=A0=A0=A0=A0 self.props.xo_color =3D color<br>=A0<br>=A0=A0=A0=A0 def creat=
e_palette(self):<br>-=A0=A0=A0=A0=A0=A0=A0 palette =3D VolumePalette(self._=
mount)<br>+=A0=A0=A0=A0=A0=A0=A0 palette =3D JournalVolumePalette(self._mou=
nt)<br>

=A0=A0=A0=A0=A0=A0=A0=A0 #palette.props.invoker =3D FrameWidgetInvoker(self=
)<br>=A0=A0=A0=A0=A0=A0=A0=A0 #palette.set_group_id(&#39;frame&#39;)<br>=A0=
=A0=A0=A0=A0=A0=A0=A0 return palette<br>@@ -179,3 +185,37 @@ class JournalB=
utton(BaseButton):<br>=A0=A0=A0=A0=A0=A0=A0=A0 color =3D XoColor(client.get=
_string(&#39;/desktop/sugar/user/color&#39;))<br>

=A0=A0=A0=A0=A0=A0=A0=A0 self.props.xo_color =3D color<br>=A0<br>+class Jou=
rnalVolumePalette(VolumePalette):<br>+<br>+=A0=A0=A0 __gtype_name__ =3D &#3=
9;JournalVolumePalette&#39;<br>+<br>+=A0=A0=A0 def __init__(self, mount):<b=
r>+=A0=A0=A0=A0=A0=A0=A0 VolumePalette.__init__(self, mount)<br>

+<br>+=A0=A0=A0=A0=A0=A0=A0 journal_separator =3D gtk.SeparatorMenuItem()<b=
r>+=A0=A0=A0=A0=A0=A0=A0 self.menu.append(journal_separator)<br>+=A0=A0=A0=
=A0=A0=A0=A0 journal_separator.show()<br>+<br>+=A0=A0=A0=A0=A0=A0=A0 menu_i=
tem_journal_backup =3D MenuItem(_(&#39;Journal Backup&#39;))<br>

+=A0=A0=A0=A0=A0=A0=A0 icon =3D Icon(icon_name=3D&#39;transfer-to&#39;, ico=
n_size=3Dgtk.ICON_SIZE_MENU)<br>+=A0=A0=A0=A0=A0=A0=A0 menu_item_journal_ba=
ckup.set_image(icon)<br>+=A0=A0=A0=A0=A0=A0=A0 icon.show()<br>+=A0=A0=A0=A0=
=A0=A0=A0 menu_item_journal_backup.connect(&#39;activate&#39;, self.__journ=
al_backup_activate_cb, mount.get_root().get_path())<br>

+=A0=A0=A0=A0=A0=A0=A0 self.menu.append(menu_item_journal_backup)<br>+=A0=
=A0=A0=A0=A0=A0=A0 menu_item_journal_backup.show()<br>+<br>+=A0=A0=A0=A0=A0=
=A0=A0 menu_item_journal_restore =3D MenuItem(_(&#39;Journal Restore&#39;))=
<br>+=A0=A0=A0=A0=A0=A0=A0 icon =3D Icon(icon_name=3D&#39;transfer-from&#39=
;, icon_size=3Dgtk.ICON_SIZE_MENU)<br>

+=A0=A0=A0=A0=A0=A0=A0 menu_item_journal_restore.set_image(icon)<br>+=A0=A0=
=A0=A0=A0=A0=A0 icon.show()<br>+=A0=A0=A0=A0=A0=A0=A0 menu_item_journal_res=
tore.connect(&#39;activate&#39;, self.__journal_restore_activate_cb, mount.=
get_root().get_path())<br>+=A0=A0=A0=A0=A0=A0=A0 self.menu.append(menu_item=
_journal_restore)<br>

+=A0=A0=A0=A0=A0=A0=A0 menu_item_journal_restore.show()<br>+<br>+=A0=A0=A0 =
def __journal_backup_activate_cb(self, menu_item, mount_path):<br>+=A0=A0=
=A0=A0=A0=A0=A0 self._do_backup =3D Backup(&#39;backup&#39;, mount_path)<br=
>+=A0=A0=A0=A0=A0=A0=A0 self._do_backup.show()<br>

+<br>+=A0=A0=A0 def __journal_restore_activate_cb(self, menu_item, mount_pa=
th):<br>+=A0=A0=A0=A0=A0=A0=A0 self._do_restore =3D Backup(&#39;restore&#39=
;, mount_path)<br>+=A0=A0=A0=A0=A0=A0=A0 self._do_restore.show()<br>-- <br>=
1.6.2.5<br><br clear=3D"all">From 1e85ffa2955e7ca5761786ae63934ed9a41acffb =
Mon Sep 17 00:00:00 2001<br>
From: Esteban Arias &lt;<a href=3D"mailto:earias at plan.ceibal.edu.uy">earias=
@plan.ceibal.edu.uy</a>&gt;<br>Date: Wed, 2 Jun 2010 12:48:03 -0300<br>Subj=
ect: [PATCH] Adds-view-and-scripts-for-volumes-backup-restore<br>Organizati=
on: Plan Ceibal<br>
<br>---<br>=A0bin/Makefile.am=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 2 +<br>=A0bin/journal-backup-volume=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |=A0=A0 65 +++++++++<br>=A0bin/journal-resto=
re-volume=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 |=A0=A0 67 ++++++++++<br>=A0src/=
jarabe/journal/Makefile.am=A0=A0=A0=A0=A0=A0=A0 |=A0=A0=A0 3 +-<br>
=A0src/jarabe/journal/backup.py=A0=A0=A0=A0=A0=A0=A0=A0=A0 |=A0 231 +++++++=
++++++++++++++++++++++++++<br>=A0src/jarabe/model/Makefile.am=A0=A0=A0=A0=
=A0=A0=A0=A0=A0 |=A0=A0=A0 3 +-<br>=A0src/jarabe/model/processmanagement.py=
 |=A0=A0 88 +++++++++++++<br>=A07 files changed, 457 insertions(+), 2 delet=
ions(-)<br>
=A0create mode 100644 bin/journal-backup-volume<br>=A0create mode 100644 bi=
n/journal-restore-volume<br>=A0create mode 100644 src/jarabe/journal/backup=
.py<br>=A0create mode 100644 src/jarabe/model/processmanagement.py<br><br>d=
iff --git a/bin/Makefile.am b/bin/Makefile.am<br>
index 05a9215..90f157a 100644<br>--- a/bin/Makefile.am<br>+++ b/bin/Makefil=
e.am<br>@@ -9,6 +9,8 @@ python_scripts =3D=A0=A0=A0 =A0=A0=A0 \<br>=A0<br>=
=A0bin_SCRIPTS =3D =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 \<br>=A0=A0=A0=A0 sugar=A0=
=A0=A0 =A0=A0=A0 =A0=A0=A0 \<br>+=A0=A0=A0 journal-backup-volume=A0=A0=A0 =
=A0=A0=A0 =A0=A0=A0 \<br>
+=A0=A0=A0 journal-restore-volume=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 \<br>=A0=A0=
=A0=A0 $(python_scripts)<br>=A0<br>=A0EXTRA_DIST =3D $(python_scripts) <a h=
ref=3D"http://sugar.in">sugar.in</a><br>diff --git a/bin/journal-backup-vol=
ume b/bin/journal-backup-volume<br>new file mode 100644<br>
index 0000000..e4a070f<br>--- /dev/null<br>+++ b/bin/journal-backup-volume<=
br>@@ -0,0 +1,65 @@<br>+#!/bin/bash<br>+# Journal Backup<br>+# Copyright (C=
) 2010 Plan Ceibal<br>+# Copyright (C) 2010 Paraguay Educa<br>+#<br>+# This=
 program is free software: you can redistribute it and/or modify<br>
+# it under the terms of the GNU General Public License as published by<br>=
+# the Free Software Foundation, either version 3 of the License, or<br>+# =
(at your option) any later version.<br>+#<br>+# This program is distributed=
 in the hope that it will be useful,<br>
+# but WITHOUT ANY WARRANTY; without even the implied warranty of<br>+# MER=
CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.=A0 See the<br>+# GNU Gene=
ral Public License for more details.<br>+#<br>+# You should have received a=
 copy of the GNU General Public License<br>
+# along with this program.=A0 If not, see &lt;<a href=3D"http://www.gnu.or=
g/licenses/">http://www.gnu.org/licenses/</a>&gt;.<br>+#<br>+# Contact info=
rmation: <a href=3D"mailto:comunidad at plan.ceibal.edu.uy">comunidad at plan.cei=
bal.edu.uy</a><br>
+# Plan Ceibal <a href=3D"http://www.ceibal.edu.uy">http://www.ceibal.edu.u=
y</a><br>+<br>+function check_for_errors() {<br>+=A0=A0=A0 if [[ $? !=3D 0 =
]]; then<br>+=A0=A0=A0 =A0=A0=A0 echo &quot;$1&quot; &gt;&amp;2<br>+=A0=A0=
=A0 =A0=A0=A0 exit 1<br>+=A0=A0=A0 fi;<br>
+}<br>+<br>+function validate_path() {<br>+=A0=A0=A0 if !(test -e &quot;$1&=
quot;); then<br>+=A0=A0=A0 =A0=A0=A0 echo &quot;No such file $1&quot; &gt;&=
amp;2<br>+=A0=A0=A0 =A0=A0=A0 exit 1<br>+=A0=A0=A0 fi;<br>+}<br>+<br>+DATAS=
TORE=3D&quot;$HOME/.sugar/default/datastore/&quot;<br>
+validate_path $DATASTORE<br>+<br>+if [ -z &quot;$1&quot; ]; then<br>+=A0=
=A0=A0 echo &quot;Backup path is not valid.&quot; &gt;&amp;2<br>+=A0=A0=A0 =
exit 1<br>+fi;<br>+<br>+PARAMS_PATH=3D$1<br>+validate_path $PARAMS_PATH<br>=
+<br>+if [ -z &quot;$2&quot; ]; then<br>
+=A0=A0=A0 echo &quot;Backup name is not valid.&quot; &gt;&amp;2<br>+=A0=A0=
=A0 exit 1<br>+fi;<br>+<br>+SERIAL=3D$2<br>+<br>+#TODO: Lets find a sugar-w=
ay to do this?<br>+pkill -f -x &quot;python /usr/bin/datastore-service&quot=
;<br>+<br>
+BACKUP_PATH=3D$PARAMS_PATH/.backup/$SERIAL/<br>+mkdir -p $BACKUP_PATH<br>+=
<br>+cd $DATASTORE;<br>+tar -zcf &quot;$BACKUP_PATH&quot;datastore.tar.gz .=
/*<br>+<br>+check_for_errors<br>+<br>+exit 0<br>diff --git a/bin/journal-re=
store-volume b/bin/journal-restore-volume<br>
new file mode 100644<br>index 0000000..134be1c<br>--- /dev/null<br>+++ b/bi=
n/journal-restore-volume<br>@@ -0,0 +1,67 @@<br>+#!/bin/bash<br>+# Journal =
Restore<br>+# Copyright (C) 2010 Plan Ceibal<br>+# Copyright (C) 2010 Parag=
uay Educa<br>
+#<br>+# This program is free software: you can redistribute it and/or modi=
fy<br>+# it under the terms of the GNU General Public License as published =
by<br>+# the Free Software Foundation, either version 3 of the License, or<=
br>
+# (at your option) any later version.<br>+#<br>+# This program is distribu=
ted in the hope that it will be useful,<br>+# but WITHOUT ANY WARRANTY; wit=
hout even the implied warranty of<br>+# MERCHANTABILITY or FITNESS FOR A PA=
RTICULAR PURPOSE.=A0 See the<br>
+# GNU General Public License for more details.<br>+#<br>+# You should have=
 received a copy of the GNU General Public License<br>+# along with this pr=
ogram.=A0 If not, see &lt;<a href=3D"http://www.gnu.org/licenses/">http://w=
ww.gnu.org/licenses/</a>&gt;.<br>
+#<br>+# Contact information: <a href=3D"mailto:comunidad at plan.ceibal.edu.u=
y">comunidad at plan.ceibal.edu.uy</a><br>+# Plan Ceibal <a href=3D"http://www=
.ceibal.edu.uy">http://www.ceibal.edu.uy</a><br>+<br>+function check_for_er=
rors() {<br>
+=A0=A0=A0 if [[ $? !=3D 0 ]]; then<br>+=A0=A0=A0 =A0=A0=A0 echo &quot;$1&q=
uot; &gt;&amp;2<br>+=A0=A0=A0 =A0=A0=A0 exit 1<br>+=A0=A0=A0 fi;<br>+}<br>+=
<br>+function validate_path() {<br>+=A0=A0=A0 if !(test -e &quot;$1&quot;);=
 then<br>+=A0=A0=A0 =A0=A0=A0 echo &quot;No such file $1&quot; &gt;&amp;2<b=
r>
+=A0=A0=A0 =A0=A0=A0 exit 1<br>+=A0=A0=A0 fi;<br>+}<br>+<br>+DATASTORE_PATH=
=3D&quot;$HOME/.sugar/default/datastore/&quot;<br>+validate_path $DATASTORE=
_PATH<br>+<br>+if [ -z &quot;$1&quot; ]; then<br>+=A0=A0=A0 echo &quot;Back=
up path is not valid.&quot; &gt;&amp;2<br>
+=A0=A0=A0 exit 1<br>+fi;<br>+<br>+PARAMS_PATH=3D$1<br>+validate_path $PARA=
MS_PATH<br>+<br>+if [ -z &quot;$2&quot; ]; then<br>+=A0=A0=A0 echo &quot;Ba=
ckup name is not valid.&quot; &gt;&amp;2<br>+=A0=A0=A0 exit 1<br>+fi;<br>+<=
br>+SERIAL=3D$2<br>
+<br>+BACKUP_FILE=3D$PARAMS_PATH/.backup/$SERIAL/datastore.tar.gz<br>+valid=
ate_path $BACKUP_FILE<br>+<br>+#TODO: Lets find a sugar-way to do this?<br>=
+pkill -f -x &quot;python /usr/bin/datastore-service&quot;<br>+<br>+cd $DAT=
ASTORE_PATH<br>
+rm -rf $DATASTORE_PATH*<br>+<br>+tar -xvzf $BACKUP_FILE<br>+<br>+check_for=
_errors<br>+<br>+exit 0<br>diff --git a/src/jarabe/journal/Makefile.am b/sr=
c/jarabe/journal/Makefile.am<br>index f4bf273..6a3091e 100644<br>--- a/src/=
jarabe/journal/Makefile.am<br>
+++ b/src/jarabe/journal/Makefile.am<br>@@ -14,4 +14,5 @@ sugar_PYTHON =3D=
=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 =A0=A0=A0 \<br>=A0=A0=A0=A0 model.py=A0=A0=A0=
 =A0=A0=A0 =A0=A0=A0 \<br>=A0=A0=A0=A0 objectchooser.py=A0=A0=A0 =A0=A0=A0 =
\<br>=A0=A0=A0=A0 palettes.py=A0=A0=A0 =A0=A0=A0 =A0=A0=A0 \<br>-=A0=A0=A0 =
volumestoolbar.py<br>+=A0=A0=A0 volumestoolbar.py \<br>
+=A0=A0=A0 backup.py<br>diff --git a/src/jarabe/journal/backup.py b/src/jar=
abe/journal/backup.py<br>new file mode 100644<br>index 0000000..1b12660<br>=
--- /dev/null<br>+++ b/src/jarabe/journal/backup.py<br>@@ -0,0 +1,231 @@<br=
>+#!/usr/bin/env python<br>
+# Copyright (C) 2010, Plan Ceibal &lt;<a href=3D"mailto:comunidad at plan.cei=
bal.edu.uy">comunidad at plan.ceibal.edu.uy</a>&gt;<br>+# Copyright (C) 2010, =
Paraguay Educa &lt;<a href=3D"mailto:tecnologia at paraguayeduca.org">tecnolog=
ia at paraguayeduca.org</a>&gt;<br>
+#<br>+# This program is free software: you can redistribute it and/or modi=
fy<br>+# it under the terms of the GNU General Public License as published =
by<br>+# the Free Software Foundation, either version 3 of the License, or<=
br>
+# (at your option) any later version.<br>+#<br>+# This program is distribu=
ted in the hope that it will be useful,<br>+# but WITHOUT ANY WARRANTY; wit=
hout even the implied warranty of<br>+# MERCHANTABILITY or FITNESS FOR A PA=
RTICULAR PURPOSE.=A0 See the<br>
+# GNU General Public License for more details.<br>+#<br>+# You should have=
 received a copy of the GNU General Public License<br>+# along with this pr=
ogram.=A0 If not, see &lt;<a href=3D"http://www.gnu.org/licenses/">http://w=
ww.gnu.org/licenses/</a>&gt;.<br>
+<br>+import os<br>+import gtk<br>+import gobject<br>+import gconf<br>+impo=
rt logging<br>+<br>+from gettext import gettext as _<br>+from sugar.graphic=
s import style<br>+from sugar.graphics.icon import Icon<br>+from sugar.grap=
hics.xocolor import XoColor<br>
+<br>+from jarabe.model.session import get_session_manager<br>+from jarabe.=
model.processmanagement import ProcessManagement<br>+<br>+PATH_BACKUP =3D &=
#39;/usr/bin/journal-backup-volume&#39;<br>+PATH_RESTORE =3D &#39;/usr/bin/=
journal-restore-volume&#39;<br>
+<br>+class Backup(gtk.Window):<br>+<br>+=A0=A0=A0 __gtype_name__ =3D &#39;=
SugarJournalBackup&#39;<br>+<br>+=A0=A0=A0 def __init__(self, type_ps, moun=
t_path):<br>+<br>+=A0=A0=A0=A0=A0=A0=A0 self._type_ps =3D type_ps<br>+=A0=
=A0=A0=A0=A0=A0=A0 self._mount_path =3D mount_path<br>
+<br>+=A0=A0=A0=A0=A0=A0=A0 if self._isValidType(self._type_ps):<br>+=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0 if ((not self._mount_path =3D=3D &quot;&quot;) =
and (not self._mount_path =3D=3D None)):<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0 self._progressBarHandler =3D None<br>+<br>+=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 gtk.Window.__init__(self)<br>
+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.set_border_width(s=
tyle.LINE_WIDTH)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 width =
=3D gtk.gdk.screen_width()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 height =3D gtk.gdk.screen_height()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0 self.set_size_request(width, height)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.set_position(gtk.WIN_PO=
S_CENTER_ALWAYS)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.set=
_decorated(False)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.se=
t_resizable(False)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.s=
et_modal(True)<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.=
_main_view =3D gtk.EventBox()<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._vbox =3D gtk.VBox()<br=
>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._vbox.set_spacing(styl=
e.DEFAULT_SPACING)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._=
vbox.set_border_width(style.GRID_CELL_SIZE)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0 self._main_view.modify_bg(gtk.STATE_NORMAL,<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 style.COLOR_BLACK.get_g=
dk_color())<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._main_vi=
ew.add(self._vbox)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._=
vbox.show()<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 client =
=3D gconf.client_get_default()<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 color =3D XoColor(client.get=
_string(&#39;/desktop/sugar/user/color&#39;))<br>+<br>+=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0 icon =3D Icon(icon_name=3D&#39;activity-journal=
&#39;,<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0 pixel_size=3Dstyle.XLARGE_ICON_SIZE,<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 xo_color=3Dcolor)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 self._vbox.pack_start(icon, False)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0 icon.show()<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 self._title =3D gtk.Label()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 self._title.modify_fg(gtk.STATE_NORMAL,<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 style.COLOR_WHITE.get_gdk_color())<=
br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._title.set_markup(&#=
39;&lt;b&gt;%s&lt;/b&gt;&#39; % _(self._type_ps))<br>+=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0 self._vbox.pack_start(self._title, False)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._title.show()<br>+<br>+=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if self._type_ps =3D=3D &#39;=
backup&#39;:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 =
lbl_txt =3D _(&quot;Close all activities and do not remove the external dev=
ice during the process. \n\n&quot;<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0 &quot;To make the backup of the Journal, a restart is=
 required. \n\n&quot;<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &quot;The backup can only be =
restore from this computer&quot;)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 elif self._type_ps =3D=3D &#39;restore&#39;:<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 lbl_txt =3D _(&q=
uot;The content you restore will overwrite the current contents of the Jour=
nal. \n\n&quot;<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &quot;Do not remove the external de=
vice during the process. \n&quot;<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0 &quot;To implement the restoration of the Journal, a =
restart is required. \n\n&quot;<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 &quot;It will restor=
e the backup done for this computer &quot;)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 lbl_txt +=3D self._get_seria=
l_number()<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._mes=
sage =3D gtk.Label(lbl_txt)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 self._message.modify_fg(gtk.STATE_NORMAL,<br>+=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 style.COLOR_WHITE.get_gdk_color())<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._message.set_line_wrap(=
True)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._vbox.pack_sta=
rt(self._message, True)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 s=
elf._message.show()<br>+<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0 vbox =3D gtk.VBox(False, 5)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 vbox.show()<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hbox =3D gtk.HBox(True, 3)<b=
r>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hbox.show()<br>+<br>+=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 valign =3D gtk.Alignment(0, 1, 0=
, 0)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 valign.show()<br>+=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 vbox.pack_start(valign)<br>+<=
br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._accept =3D gtk.Butt=
on()<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._accept.set_label(_(&#3=
9;Accept&#39;))<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._acc=
ept.show()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._accept.c=
onnect(&#39;clicked&#39;, self.__accept_cb)<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0 self._show_journal =3D gtk.Button()<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._show_journal.set_label=
(_(&#39;Close&#39;))<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self=
._show_journal.show()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 sel=
f._show_journal.connect(&#39;clicked&#39;, self.__show_journal_cb)<br>+<br>=
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._restart =3D gtk.Button=
()<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._restart.set_label(_(&#=
39;Restart&#39;))<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._r=
estart.hide()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._resta=
rt.connect(&#39;clicked&#39;, self.__restart_cb)<br>+<br>+=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hbox.add(self._accept)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hbox.add(self._show_journal)=
<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 hbox.add(self._restart)<=
br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 halign =3D gtk.Align=
ment(1, 0, 0, 0)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 halign.s=
how()<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 halign.add(hbox)<br=
>
+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 vbox.pack_start(halign,=
 False, False, 3)<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 se=
lf._vbox.add(vbox)<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 s=
elf._progress_bar =3D gtk.ProgressBar(adjustment=3DNone)<br>+<br>+=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.add(self._main_view)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._main_view.show()<br>+<=
br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.connect(&quot;realiz=
e&quot;, self.__realize_cb)<br>+<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 self._process_management =3D ProcessManagement()<br>+=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._process_management.connect(&#39;pro=
cess-management-running&#39;, self._set_update_log)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._process_management.con=
nect(&#39;process-management-started&#39;, self._set_status_started)<br>+=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._process_management.conn=
ect(&#39;process-management-finished&#39;, self._set_status_finished)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._process_management.con=
nect(&#39;process-management-failed&#39;, self._set_status_failed)<br>+<br>=
+=A0=A0=A0 def __realize_cb(self, widget):<br>+=A0=A0=A0=A0=A0=A0=A0 self.w=
indow.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)<br>
+=A0=A0=A0=A0=A0=A0=A0 self.window.set_accept_focus(True)<br>+<br>+=A0=A0=
=A0 def __show_journal_cb(self, button):<br>+=A0=A0=A0=A0=A0=A0=A0 self.des=
troy()<br>+<br>+=A0=A0=A0 def __accept_cb(self, *args):<br>+=A0=A0=A0=A0=A0=
=A0=A0 if ((not self._mount_path =3D=3D &quot;&quot;) and (not self._mount_=
path =3D=3D None)):<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if self._isValidType(self._type_ps):<br>=
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if self._type_ps =3D=3D &#39=
;backup&#39;:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
 self._process_management.do_process([PATH_BACKUP, self._mount_path, self._=
get_serial_number()])<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 elif self._type_ps =3D=3D &#=
39;restore&#39;:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 self._process_management.do_process([PATH_RESTORE, self._mount_path, se=
lf._get_serial_number()])<br>+<br>+=A0=A0=A0 def _set_status_started(self, =
model, data=3DNone):<br>
+=A0=A0=A0=A0=A0=A0=A0 self._message.set_text(_(&quot;Is running, Please wa=
it&quot;))<br>+=A0=A0=A0=A0=A0=A0=A0 self._accept.hide()<br>+=A0=A0=A0=A0=
=A0=A0=A0 self._show_journal.hide()<br>+=A0=A0=A0=A0=A0=A0=A0 self._showPro=
gress()<br>+<br>+=A0=A0=A0 def _set_update_log(self, model, data):<br>
+=A0=A0=A0=A0=A0=A0=A0 pass<br>+<br>+=A0=A0=A0 def _set_status_finished(sel=
f, model, data=3DNone):<br>+=A0=A0=A0=A0=A0=A0=A0 self._message.set_text(_(=
&quot;It is done, please restart sugar&quot;))<br>+=A0=A0=A0=A0=A0=A0=A0 se=
lf._progress_bar.hide()<br>+=A0=A0=A0=A0=A0=A0=A0 self._restart.show()<br>
+<br>+=A0=A0=A0 def _set_status_failed(self, model, data=3DNone):<br>+=A0=
=A0=A0=A0=A0=A0=A0 logging.error(data)<br>+=A0=A0=A0=A0=A0=A0=A0 self._show=
MsgError(data)<br>+<br>+=A0=A0=A0 def __restart_cb(self, *args):<br>+=A0=A0=
=A0=A0=A0=A0=A0 session_manager =3D get_session_manager()<br>
+=A0=A0=A0=A0=A0=A0=A0 session_manager.logout()<br>+<br>+=A0=A0=A0 def _sho=
wProgress(self):<br>+=A0=A0=A0=A0=A0=A0=A0 self._progress_bar.set_fraction(=
0.0)<br>+=A0=A0=A0=A0=A0=A0=A0 self._progress_bar.show()<br>+=A0=A0=A0=A0=
=A0=A0=A0 self._vbox.add(self._progress_bar)<br>+=A0=A0=A0=A0=A0=A0=A0 if (=
self._progressBarHandler =3D=3D None):<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._progressBarHandler =3D gobject.tim=
eout_add(1000, self._timerProgressBar)<br>+<br>+=A0=A0=A0 def _timerProgres=
sBar(self):<br>+=A0=A0=A0=A0=A0=A0=A0 self._progress_bar.pulse()<br>+=A0=A0=
=A0=A0=A0=A0=A0 return True<br>+<br>+=A0=A0=A0 def _showMsgError(self, msg)=
:<br>
+=A0=A0=A0=A0=A0=A0=A0 self._title.set_markup(&#39;&lt;b&gt;%s&lt;/b&gt;&#3=
9; % _(&quot;Error&quot;))<br>+=A0=A0=A0=A0=A0=A0=A0 self._message.set_text=
(msg)<br>+=A0=A0=A0=A0=A0=A0=A0 self._show_journal.show()<br>+=A0=A0=A0=A0=
=A0=A0=A0 self._progress_bar.hide()<br>+<br>+=A0=A0=A0 def _isValidType(sel=
f, type_ps):<br>
+=A0=A0=A0=A0=A0=A0=A0 return (type_ps =3D=3D &#39;backup&#39;) | (type_ps =
=3D=3D &#39;restore&#39;)<br>+<br>+=A0=A0=A0 def _get_serial_number(self):<=
br>+=A0=A0=A0=A0=A0=A0=A0 serial_no =3D self._read_file(&#39;/ofw/serial-nu=
mber&#39;)<br>+=A0=A0=A0=A0=A0=A0=A0 if serial_no is None:<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 serial_no =3D self._get_nick()<br>+=A0=
=A0=A0=A0=A0=A0=A0 return serial_no<br>+<br>+=A0=A0=A0 def _read_file(self,=
 path):<br>+=A0=A0=A0=A0=A0=A0=A0 if os.access(path, os.R_OK) =3D=3D 0:<br>=
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return None<br>+<br>+=A0=A0=A0=A0=A0=A0=
=A0 fd =3D open(path, &#39;r&#39;)<br>
+=A0=A0=A0=A0=A0=A0=A0 value =3D fd.read()<br>+=A0=A0=A0=A0=A0=A0=A0 fd.clo=
se()<br>+=A0=A0=A0=A0=A0=A0=A0 if value:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 value =3D value.strip(&#39;\n&#39;)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 return value<br>+=A0=A0=A0=A0=A0=A0=A0 else:<br>+=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0 logging.error(&#39;No information in file or directory: %s&#39=
; % path)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 return None<br>+<br>+=A0=A0=A0 def _get_=
nick(self):<br>+=A0=A0=A0=A0=A0=A0=A0 client =3D gconf.client_get_default()=
<br>+=A0=A0=A0=A0=A0=A0=A0 return client.get_string(&quot;/desktop/sugar/us=
er/nick&quot;)<br>diff --git a/src/jarabe/model/Makefile.am b/src/jarabe/mo=
del/Makefile.am<br>
index e9f0700..a4f89a3 100644<br>--- a/src/jarabe/model/Makefile.am<br>+++ =
b/src/jarabe/model/Makefile.am<br>@@ -15,4 +15,5 @@ sugar_PYTHON =3D=A0=A0=
=A0 =A0=A0=A0 =A0=A0=A0 \<br>=A0=A0=A0=A0 shell.py=A0=A0=A0 =A0=A0=A0 \<br>=
=A0=A0=A0=A0 screen.py=A0=A0=A0 =A0=A0=A0 \<br>=A0=A0=A0=A0=A0=A0=A0=A0 ses=
sion.py=A0=A0=A0 =A0=A0=A0 \<br>
-=A0=A0=A0 sound.py<br>+=A0=A0=A0 sound.py \<br>+=A0=A0=A0 processmanagemen=
t.py<br>diff --git a/src/jarabe/model/processmanagement.py b/src/jarabe/mod=
el/processmanagement.py<br>new file mode 100644<br>index 0000000..d28ad64<b=
r>--- /dev/null<br>
+++ b/src/jarabe/model/processmanagement.py<br>@@ -0,0 +1,88 @@<br>+# Copyr=
ight (C) 2010 Paraguay Educa, Martin Abente, Bernie Innocenti<br>+# Copyrig=
ht (C) 2010, Plan Ceibal &lt;<a href=3D"mailto:comunidad at plan.ceibal.edu.uy=
">comunidad at plan.ceibal.edu.uy</a>&gt;<br>
+#<br>+# This program is free software; you can redistribute it and/or modi=
fy<br>+# it under the terms of the GNU General Public License as published =
by<br>+# the Free Software Foundation; either version 2 of the License, or<=
br>
+# (at your option) any later version.<br>+#<br>+# This program is distribu=
ted in the hope that it will be useful,<br>+# but WITHOUT ANY WARRANTY; wit=
hout even the implied warranty of<br>+# MERCHANTABILITY or FITNESS FOR A PA=
RTICULAR PURPOSE.=A0 See the<br>
+# GNU General Public License for more details.<br>+#<br>+# You should have=
 received a copy of the GNU General Public License<br>+# along with this pr=
ogram; if not, write to the Free Software<br>+# Foundation, Inc., 51 Frankl=
in St, Fifth Floor, Boston, MA=A0 02110-1301=A0 USA<br>
+<br>+import os<br>+import gobject<br>+import glib<br>+import gio<br>+<br>+=
from gettext import gettext as _<br>+<br>+BYTES_TO_READ =3D 100<br>+<br>+cl=
ass ProcessManagement(gobject.GObject):<br>+<br>+=A0=A0=A0 __gtype_name__ =
=3D &#39;ProcessManagement&#39;<br>
+<br>+=A0=A0=A0 __gsignals__ =3D {<br>+=A0=A0=A0=A0=A0=A0=A0 &#39;process-m=
anagement-running&#39;=A0=A0=A0 : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_N=
ONE, ([str])),<br>+=A0=A0=A0=A0=A0=A0=A0 &#39;process-management-started&#3=
9;=A0=A0=A0 : (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),<br>
+=A0=A0=A0=A0=A0=A0=A0 &#39;process-management-finished&#39;=A0=A0=A0 : (go=
bject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, ([])),<br>+=A0=A0=A0=A0=A0=A0=A0=
 &#39;process-management-failed&#39;=A0=A0=A0 : (gobject.SIGNAL_RUN_FIRST, =
gobject.TYPE_NONE, ([str]))<br>+=A0=A0=A0 }<br>
+<br>+=A0=A0=A0 def __init__(self):<br>+=A0=A0=A0=A0=A0=A0=A0 gobject.GObje=
ct.__init__(self)<br>+=A0=A0=A0=A0=A0=A0=A0 self._running =3D False<br>+<br=
>+=A0=A0=A0 def do_process(self, cmd):<br>+=A0=A0=A0=A0=A0=A0=A0 self._run_=
cmd_async(cmd)<br>+<br>+=A0=A0=A0 def _report_process_status(self, stream, =
result):<br>
+=A0=A0=A0=A0=A0=A0=A0 data =3D stream.read_finish(result)<br>+<br>+=A0=A0=
=A0=A0=A0=A0=A0 if len(data):<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.em=
it(&#39;process-management-running&#39;, data)<br>+=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 stream.read_async(BYTES_TO_READ, self._report_process_status)<br>
+<br>+=A0=A0=A0 def _report_process_error(self, stream, result, concat_err=
=3D&#39;&#39;):<br>+=A0=A0=A0=A0=A0=A0=A0 data =3D stream.read_finish(resul=
t)<br>+=A0=A0=A0=A0=A0=A0=A0 concat_err =3D concat_err + data<br>+<br>+=A0=
=A0=A0=A0=A0=A0=A0 if len(data) =3D=3D 0:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0 self.emit(&#39;process-management-failed&#39;, concat_er=
r)<br>
+=A0=A0=A0=A0=A0=A0=A0 else:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 stream.r=
ead_async(BYTES_TO_READ, self._report_process_error, user_data=3Dconcat_err=
)<br>+<br>+=A0=A0=A0 def _notify_error(self, stderr):<br>+=A0=A0=A0=A0=A0=
=A0=A0 stdin_stream =3D gio.unix.InputStream(stderr, True)<br>
+=A0=A0=A0=A0=A0=A0=A0 stdin_stream.read_async(BYTES_TO_READ, self._report_=
process_error)<br>+<br>+=A0=A0=A0 def _notify_process_status(self, stdout):=
<br>+=A0=A0=A0=A0=A0=A0=A0 stdin_stream =3D gio.unix.InputStream(stdout, Tr=
ue)<br>+=A0=A0=A0=A0=A0=A0=A0 stdin_stream.read_async(BYTES_TO_READ, self._=
report_process_status)<br>
+<br>+=A0=A0=A0 def _run_cmd_async(self, cmd):<br>+=A0=A0=A0=A0=A0=A0=A0 if=
 self._running =3D=3D False:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 try:<br>=
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 pid, stdin, stdout, stderr =
=3D glib.spawn_async(cmd, flags=3Dglib.SPAWN_DO_NOT_REAP_CHILD, standard_ou=
tput=3DTrue, standard_error=3DTrue)<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 gobject.child_watch_add(pid,=
 _handle_process_end, (self, stderr))<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
 except Exception:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.e=
mit(&#39;process-management-failed&#39;, _(&quot;Error - Call process: &quo=
t;) + str(cmd))<br>
+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 else:<br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0 self._notify_process_status(stdout)<br>+=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0 self._running=A0 =3D True<br>+=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 self.emit(&#39;process-management-started&#3=
9;)<br>+<br>+def _handle_process_end(pid, condition, (myself, stderr)):<br>
+=A0=A0=A0 myself._running =3D False<br>+<br>+=A0=A0=A0 if os.WIFEXITED(con=
dition) and\<br>+=A0=A0=A0=A0=A0=A0=A0 os.WEXITSTATUS(condition) =3D=3D 0:<=
br>+=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 myself.emit(&#39;process-management-f=
inished&#39;)<br>+=A0=A0=A0 else:<br>+=A0=A0=A0=A0=A0=A0=A0 myself._notify_=
error(stderr)<br>
-- <br>1.6.2.5<br><br>From c68f3f55bebc332643ee5d0c282fa29851cbd6a5 Mon Sep=
 17 00:00:00 2001<br>From: Esteban Arias &lt;<a href=3D"mailto:earias at plan.=
ceibal.edu.uy">earias at plan.ceibal.edu.uy</a>&gt;<br>Date: Wed, 2 Jun 2010 1=
2:50:36 -0300<br>
Subject: [PATCH] Traslate<br>Organization: Plan Ceibal<br><br>---<br>=A0po/=
es.po |=A0=A0 39 +++++++++++++++++++++++++++++++++++++++<br>=A01 files chan=
ged, 39 insertions(+), 0 deletions(-)<br><br>diff --git a/po/es.po b/po/es.=
po<br>
index 587608f..0e138a4 100644<br>--- a/po/es.po<br>+++ b/po/es.po<br>@@ -12=
75,6 +1275,45 @@ msgstr &quot;Fuente del paquete de la actividad&quot;<br>=
=A0msgid &quot;View source: %r&quot;<br>=A0msgstr &quot;Ver c=F3digo fuente=
: %r&quot;<br>
=A0<br>+#: ../src/jarabe/journal/volumestoolbar.py:196<br>+msgid &quot;Jour=
nal Backup&quot;<br>+msgstr &quot;Respaldar Diario&quot;<br>+<br>+#: ../src=
/jarabe/journal/volumestoolbar.py:208<br>+msgid &quot;Journal Restore&quot;=
<br>
+msgstr &quot;Restaurar Diario&quot;<br>+<br>+#: ../src/jarabe/journal/back=
up.py:84<br>+msgid &quot;backup&quot;<br>+msgstr &quot;respaldar&quot;<br>+=
<br>+#: ../src/jarabe/journal/backup.py:84<br>+msgid &quot;restore&quot;<br=
>
+msgstr &quot;restaurar&quot;<br>+<br>+#: ../src/jarabe/journal/backup.py:8=
9<br>+msgid &quot;&quot;<br>+&quot;Close all activities and do not remove t=
he external device during the process. \n\n&quot;<br>+&quot;To make the bac=
kup of the Journal, a restart is required. \n\n&quot;<br>
+&quot;The backup can only be restore from this computer&quot;<br>+msgstr &=
quot;&quot;<br>+&quot;Cierre todas las actividades y no extraiga el disposi=
tivo externo durante el proceso. \n\n&quot;<br>+&quot;Para realizar el resp=
aldo del Diario, se requiere reiniciar. \n\n&quot;<br>
+&quot;El resplado s=F3lo podr=E1 ser recuperado desde este equipo &quot;<b=
r>+<br>+#: ../src/jarabe/journal/backup.py:94<br>+msgid &quot;&quot;<br>+&q=
uot;The content you restore will overwrite the current contents of the Jour=
nal. \n\n&quot;<br>
+&quot;Do not remove the external device during the process. \n&quot;<br>+&=
quot;To implement the restoration of the Journal, a restart is required. \n=
\n&quot;<br>+&quot;It will restore the backup done for this computer &quot;=
<br>
+msgstr &quot;&quot;<br>+&quot;El contenido que restaurar=E1 va a sobrescri=
bir el contenido acutal del Diario. \n\n&quot;<br>+&quot;No extraiga el dis=
positivo externo durante el proceso. \n&quot;<br>+&quot;Para aplicar la res=
tauraci=F3n del Diario, se requiere reiniciar. \n\n&quot;<br>
+&quot;Se restaurar=E1 el respado realizado para este equipo &quot;<br>+<br=
>+<br>=A0#~ msgid &quot;Cannot obtain data needed for registration.&quot;<b=
r>=A0#~ msgstr &quot;No se puede obtener datos necesarios para el registro&=
quot;<br>
=A0<br>-- <br>1.6.2.5<br><br><br><br><br>-- <br>
 =A0 =A0Esteban Arias<br> =A0 =A0Plan Ceibal - =C1rea T=E9cnica<br> =A0 =A0=
Avda. Italia 6201<br> =A0 =A0Montevideo - Uruguay.<br> =A0 =A0Tel.: 601.57.=
73 Interno 2228<br> =A0 =A0E-mail : <a href=3D"mailto:earias at plan.ceibal.ed=
u.uy" target=3D"_blank">earias at plan.ceibal.edu.uy</a><br>

<br>

--001636e0b9b8e73b3104880e573f--
--001636e0b9b8e73b3604880e5741
Content-Type: application/octet-stream; 
	name="0001-Adds-JournalVolumePalette.patch"
Content-Disposition: attachment; 
	filename="0001-Adds-JournalVolumePalette.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_g9ycekiy0

RnJvbSAzYzI4ZTI5ZTQ0YjhiMzBhMjU5OGVkN2U5MGIzY2EzYWM4MDljODllIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBFc3RlYmFuIEFyaWFzIDxlYXJpYXNAcGxhbi5jZWliYWwuZWR1
LnV5PgpEYXRlOiBXZWQsIDIgSnVuIDIwMTAgMTI6MzI6NTkgLTAzMDAKU3ViamVjdDogW1BBVENI
XSBBZGRzLUpvdXJuYWxWb2x1bWVQYWxldHRlCk9yZ2FuaXphdGlvbjogUGxhbiBDZWliYWwKCi0t
LQogc3JjL2phcmFiZS9qb3VybmFsL3ZvbHVtZXN0b29sYmFyLnB5IHwgICA0MiArKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKystCiAxIGZpbGVzIGNoYW5nZWQsIDQxIGluc2VydGlvbnMo
KyksIDEgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2phcmFiZS9qb3VybmFsL3ZvbHVt
ZXN0b29sYmFyLnB5IGIvc3JjL2phcmFiZS9qb3VybmFsL3ZvbHVtZXN0b29sYmFyLnB5CmluZGV4
IDc0Yjk3NGMuLmNjN2FlMzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXJhYmUvam91cm5hbC92b2x1bWVz
dG9vbGJhci5weQorKysgYi9zcmMvamFyYWJlL2pvdXJuYWwvdm9sdW1lc3Rvb2xiYXIucHkKQEAg
LTEsNCArMSw2IEBACiAjIENvcHlyaWdodCAoQykgMjAwNywgT25lIExhcHRvcCBQZXIgQ2hpbGQK
KyMgQ29weXJpZ2h0IChDKSAyMDEwLCBQbGFuIENlaWJhbCA8Y29tdW5pZGFkQHBsYW4uY2VpYmFs
LmVkdS51eT4KKyMgQ29weXJpZ2h0IChDKSAyMDEwLCBQYXJhZ3VheSBFZHVjYSA8dGVjbm9sb2dp
YUBwYXJhZ3VheWVkdWNhLm9yZz4KICMKICMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICMgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAg
LTIyLDEzICsyNCwxNyBAQCBpbXBvcnQgZ2lvCiBpbXBvcnQgZ3RrCiBpbXBvcnQgZ2NvbmYKIAor
ZnJvbSBzdWdhci5ncmFwaGljcy5pY29uIGltcG9ydCBJY29uCiBmcm9tIHN1Z2FyLmdyYXBoaWNz
LnJhZGlvdG9vbGJ1dHRvbiBpbXBvcnQgUmFkaW9Ub29sQnV0dG9uCiBmcm9tIHN1Z2FyLmdyYXBo
aWNzLnBhbGV0dGUgaW1wb3J0IFBhbGV0dGUKIGZyb20gc3VnYXIuZ3JhcGhpY3MueG9jb2xvciBp
bXBvcnQgWG9Db2xvcgorZnJvbSBzdWdhci5ncmFwaGljcy5tZW51aXRlbSBpbXBvcnQgTWVudUl0
ZW0KIAogZnJvbSBqYXJhYmUuam91cm5hbCBpbXBvcnQgbW9kZWwKK2Zyb20gamFyYWJlLmpvdXJu
YWwuYmFja3VwIGltcG9ydCBCYWNrdXAKIGZyb20gamFyYWJlLnZpZXcucGFsZXR0ZXMgaW1wb3J0
IFZvbHVtZVBhbGV0dGUKIAorCiBjbGFzcyBWb2x1bWVzVG9vbGJhcihndGsuVG9vbGJhcik6CiAg
ICAgX19ndHlwZV9uYW1lX18gPSAnVm9sdW1lc1Rvb2xiYXInCiAKQEAgLTE2NCw3ICsxNzAsNyBA
QCBjbGFzcyBWb2x1bWVCdXR0b24oQmFzZUJ1dHRvbik6CiAgICAgICAgIHNlbGYucHJvcHMueG9f
Y29sb3IgPSBjb2xvcgogCiAgICAgZGVmIGNyZWF0ZV9wYWxldHRlKHNlbGYpOgotICAgICAgICBw
YWxldHRlID0gVm9sdW1lUGFsZXR0ZShzZWxmLl9tb3VudCkKKyAgICAgICAgcGFsZXR0ZSA9IEpv
dXJuYWxWb2x1bWVQYWxldHRlKHNlbGYuX21vdW50KQogICAgICAgICAjcGFsZXR0ZS5wcm9wcy5p
bnZva2VyID0gRnJhbWVXaWRnZXRJbnZva2VyKHNlbGYpCiAgICAgICAgICNwYWxldHRlLnNldF9n
cm91cF9pZCgnZnJhbWUnKQogICAgICAgICByZXR1cm4gcGFsZXR0ZQpAQCAtMTc5LDMgKzE4NSwz
NyBAQCBjbGFzcyBKb3VybmFsQnV0dG9uKEJhc2VCdXR0b24pOgogICAgICAgICBjb2xvciA9IFhv
Q29sb3IoY2xpZW50LmdldF9zdHJpbmcoJy9kZXNrdG9wL3N1Z2FyL3VzZXIvY29sb3InKSkKICAg
ICAgICAgc2VsZi5wcm9wcy54b19jb2xvciA9IGNvbG9yCiAKK2NsYXNzIEpvdXJuYWxWb2x1bWVQ
YWxldHRlKFZvbHVtZVBhbGV0dGUpOgorCisgICAgX19ndHlwZV9uYW1lX18gPSAnSm91cm5hbFZv
bHVtZVBhbGV0dGUnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW91bnQpOgorICAgICAgICBW
b2x1bWVQYWxldHRlLl9faW5pdF9fKHNlbGYsIG1vdW50KQorCisgICAgICAgIGpvdXJuYWxfc2Vw
YXJhdG9yID0gZ3RrLlNlcGFyYXRvck1lbnVJdGVtKCkKKyAgICAgICAgc2VsZi5tZW51LmFwcGVu
ZChqb3VybmFsX3NlcGFyYXRvcikKKyAgICAgICAgam91cm5hbF9zZXBhcmF0b3Iuc2hvdygpCisK
KyAgICAgICAgbWVudV9pdGVtX2pvdXJuYWxfYmFja3VwID0gTWVudUl0ZW0oXygnSm91cm5hbCBC
YWNrdXAnKSkKKyAgICAgICAgaWNvbiA9IEljb24oaWNvbl9uYW1lPSd0cmFuc2Zlci10bycsIGlj
b25fc2l6ZT1ndGsuSUNPTl9TSVpFX01FTlUpCisgICAgICAgIG1lbnVfaXRlbV9qb3VybmFsX2Jh
Y2t1cC5zZXRfaW1hZ2UoaWNvbikKKyAgICAgICAgaWNvbi5zaG93KCkKKyAgICAgICAgbWVudV9p
dGVtX2pvdXJuYWxfYmFja3VwLmNvbm5lY3QoJ2FjdGl2YXRlJywgc2VsZi5fX2pvdXJuYWxfYmFj
a3VwX2FjdGl2YXRlX2NiLCBtb3VudC5nZXRfcm9vdCgpLmdldF9wYXRoKCkpCisgICAgICAgIHNl
bGYubWVudS5hcHBlbmQobWVudV9pdGVtX2pvdXJuYWxfYmFja3VwKQorICAgICAgICBtZW51X2l0
ZW1fam91cm5hbF9iYWNrdXAuc2hvdygpCisKKyAgICAgICAgbWVudV9pdGVtX2pvdXJuYWxfcmVz
dG9yZSA9IE1lbnVJdGVtKF8oJ0pvdXJuYWwgUmVzdG9yZScpKQorICAgICAgICBpY29uID0gSWNv
bihpY29uX25hbWU9J3RyYW5zZmVyLWZyb20nLCBpY29uX3NpemU9Z3RrLklDT05fU0laRV9NRU5V
KQorICAgICAgICBtZW51X2l0ZW1fam91cm5hbF9yZXN0b3JlLnNldF9pbWFnZShpY29uKQorICAg
ICAgICBpY29uLnNob3coKQorICAgICAgICBtZW51X2l0ZW1fam91cm5hbF9yZXN0b3JlLmNvbm5l
Y3QoJ2FjdGl2YXRlJywgc2VsZi5fX2pvdXJuYWxfcmVzdG9yZV9hY3RpdmF0ZV9jYiwgbW91bnQu
Z2V0X3Jvb3QoKS5nZXRfcGF0aCgpKQorICAgICAgICBzZWxmLm1lbnUuYXBwZW5kKG1lbnVfaXRl
bV9qb3VybmFsX3Jlc3RvcmUpCisgICAgICAgIG1lbnVfaXRlbV9qb3VybmFsX3Jlc3RvcmUuc2hv
dygpCisKKyAgICBkZWYgX19qb3VybmFsX2JhY2t1cF9hY3RpdmF0ZV9jYihzZWxmLCBtZW51X2l0
ZW0sIG1vdW50X3BhdGgpOgorICAgICAgICBzZWxmLl9kb19iYWNrdXAgPSBCYWNrdXAoJ2JhY2t1
cCcsIG1vdW50X3BhdGgpCisgICAgICAgIHNlbGYuX2RvX2JhY2t1cC5zaG93KCkKKworICAgIGRl
ZiBfX2pvdXJuYWxfcmVzdG9yZV9hY3RpdmF0ZV9jYihzZWxmLCBtZW51X2l0ZW0sIG1vdW50X3Bh
dGgpOgorICAgICAgICBzZWxmLl9kb19yZXN0b3JlID0gQmFja3VwKCdyZXN0b3JlJywgbW91bnRf
cGF0aCkKKyAgICAgICAgc2VsZi5fZG9fcmVzdG9yZS5zaG93KCkKLS0gCjEuNi4yLjUKCg==
--001636e0b9b8e73b3604880e5741
Content-Type: application/octet-stream; 
	name="0002-Adds-view-and-scripts-for-volumes-backup-restore.patch"
Content-Disposition: attachment; 
	filename="0002-Adds-view-and-scripts-for-volumes-backup-restore.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_g9ycguea1

RnJvbSAxZTg1ZmZhMjk1NWU3Y2E1NzYxNzg2YWU2MzkzNGVkOWE0MWFjZmZiIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBFc3RlYmFuIEFyaWFzIDxlYXJpYXNAcGxhbi5jZWliYWwuZWR1
LnV5PgpEYXRlOiBXZWQsIDIgSnVuIDIwMTAgMTI6NDg6MDMgLTAzMDAKU3ViamVjdDogW1BBVENI
XSBBZGRzLXZpZXctYW5kLXNjcmlwdHMtZm9yLXZvbHVtZXMtYmFja3VwLXJlc3RvcmUKT3JnYW5p
emF0aW9uOiBQbGFuIENlaWJhbAoKLS0tCiBiaW4vTWFrZWZpbGUuYW0gICAgICAgICAgICAgICAg
ICAgICAgIHwgICAgMiArCiBiaW4vam91cm5hbC1iYWNrdXAtdm9sdW1lICAgICAgICAgICAgIHwg
ICA2NSArKysrKysrKysKIGJpbi9qb3VybmFsLXJlc3RvcmUtdm9sdW1lICAgICAgICAgICAgfCAg
IDY3ICsrKysrKysrKysKIHNyYy9qYXJhYmUvam91cm5hbC9NYWtlZmlsZS5hbSAgICAgICAgfCAg
ICAzICstCiBzcmMvamFyYWJlL2pvdXJuYWwvYmFja3VwLnB5ICAgICAgICAgIHwgIDIzMSArKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9qYXJhYmUvbW9kZWwvTWFrZWZpbGUu
YW0gICAgICAgICAgfCAgICAzICstCiBzcmMvamFyYWJlL21vZGVsL3Byb2Nlc3NtYW5hZ2VtZW50
LnB5IHwgICA4OCArKysrKysrKysrKysrCiA3IGZpbGVzIGNoYW5nZWQsIDQ1NyBpbnNlcnRpb25z
KCspLCAyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGJpbi9qb3VybmFsLWJhY2t1
cC12b2x1bWUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBiaW4vam91cm5hbC1yZXN0b3JlLXZvbHVtZQog
Y3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9qYXJhYmUvam91cm5hbC9iYWNrdXAucHkKIGNyZWF0ZSBt
b2RlIDEwMDY0NCBzcmMvamFyYWJlL21vZGVsL3Byb2Nlc3NtYW5hZ2VtZW50LnB5CgpkaWZmIC0t
Z2l0IGEvYmluL01ha2VmaWxlLmFtIGIvYmluL01ha2VmaWxlLmFtCmluZGV4IDA1YTkyMTUuLjkw
ZjE1N2EgMTAwNjQ0Ci0tLSBhL2Jpbi9NYWtlZmlsZS5hbQorKysgYi9iaW4vTWFrZWZpbGUuYW0K
QEAgLTksNiArOSw4IEBAIHB5dGhvbl9zY3JpcHRzID0JCVwKIAogYmluX1NDUklQVFMgPSAJCQlc
CiAJc3VnYXIJCQlcCisJam91cm5hbC1iYWNrdXAtdm9sdW1lCQkJXAorCWpvdXJuYWwtcmVzdG9y
ZS12b2x1bWUJCQlcCiAJJChweXRob25fc2NyaXB0cykKIAogRVhUUkFfRElTVCA9ICQocHl0aG9u
X3NjcmlwdHMpIHN1Z2FyLmluCmRpZmYgLS1naXQgYS9iaW4vam91cm5hbC1iYWNrdXAtdm9sdW1l
IGIvYmluL2pvdXJuYWwtYmFja3VwLXZvbHVtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5lNGEwNzBmCi0tLSAvZGV2L251bGwKKysrIGIvYmluL2pvdXJuYWwtYmFja3VwLXZv
bHVtZQpAQCAtMCwwICsxLDY1IEBACisjIS9iaW4vYmFzaAorIyBKb3VybmFsIEJhY2t1cAorIyBD
b3B5cmlnaHQgKEMpIDIwMTAgUGxhbiBDZWliYWwKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFBhcmFn
dWF5IEVkdWNhCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisj
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUg
PGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBDb250YWN0IGluZm9ybWF0aW9u
OiBjb211bmlkYWRAcGxhbi5jZWliYWwuZWR1LnV5CisjIFBsYW4gQ2VpYmFsIGh0dHA6Ly93d3cu
Y2VpYmFsLmVkdS51eQorCitmdW5jdGlvbiBjaGVja19mb3JfZXJyb3JzKCkgeworCWlmIFtbICQ/
ICE9IDAgXV07IHRoZW4KKwkJZWNobyAiJDEiID4mMgorCQlleGl0IDEKKwlmaTsKK30KKworZnVu
Y3Rpb24gdmFsaWRhdGVfcGF0aCgpIHsKKwlpZiAhKHRlc3QgLWUgIiQxIik7IHRoZW4KKwkJZWNo
byAiTm8gc3VjaCBmaWxlICQxIiA+JjIKKwkJZXhpdCAxCisJZmk7Cit9CisKK0RBVEFTVE9SRT0i
JEhPTUUvLnN1Z2FyL2RlZmF1bHQvZGF0YXN0b3JlLyIKK3ZhbGlkYXRlX3BhdGggJERBVEFTVE9S
RQorCitpZiBbIC16ICIkMSIgXTsgdGhlbgorCWVjaG8gIkJhY2t1cCBwYXRoIGlzIG5vdCB2YWxp
ZC4iID4mMgorCWV4aXQgMQorZmk7CisKK1BBUkFNU19QQVRIPSQxCit2YWxpZGF0ZV9wYXRoICRQ
QVJBTVNfUEFUSAorCitpZiBbIC16ICIkMiIgXTsgdGhlbgorCWVjaG8gIkJhY2t1cCBuYW1lIGlz
IG5vdCB2YWxpZC4iID4mMgorCWV4aXQgMQorZmk7CisKK1NFUklBTD0kMgorCisjVE9ETzogTGV0
cyBmaW5kIGEgc3VnYXItd2F5IHRvIGRvIHRoaXM/Citwa2lsbCAtZiAteCAicHl0aG9uIC91c3Iv
YmluL2RhdGFzdG9yZS1zZXJ2aWNlIgorCitCQUNLVVBfUEFUSD0kUEFSQU1TX1BBVEgvLmJhY2t1
cC8kU0VSSUFMLworbWtkaXIgLXAgJEJBQ0tVUF9QQVRICisKK2NkICREQVRBU1RPUkU7Cit0YXIg
LXpjZiAiJEJBQ0tVUF9QQVRIImRhdGFzdG9yZS50YXIuZ3ogLi8qCisKK2NoZWNrX2Zvcl9lcnJv
cnMKKworZXhpdCAwCmRpZmYgLS1naXQgYS9iaW4vam91cm5hbC1yZXN0b3JlLXZvbHVtZSBiL2Jp
bi9qb3VybmFsLXJlc3RvcmUtdm9sdW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjEzNGJlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vam91cm5hbC1yZXN0b3JlLXZvbHVt
ZQpAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vYmFzaAorIyBKb3VybmFsIFJlc3RvcmUKKyMgQ29w
eXJpZ2h0IChDKSAyMDEwIFBsYW4gQ2VpYmFsCisjIENvcHlyaWdodCAoQykgMjAxMCBQYXJhZ3Vh
eSBFZHVjYQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
IworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxo
dHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQ29udGFjdCBpbmZvcm1hdGlvbjog
Y29tdW5pZGFkQHBsYW4uY2VpYmFsLmVkdS51eQorIyBQbGFuIENlaWJhbCBodHRwOi8vd3d3LmNl
aWJhbC5lZHUudXkKKworZnVuY3Rpb24gY2hlY2tfZm9yX2Vycm9ycygpIHsKKwlpZiBbWyAkPyAh
PSAwIF1dOyB0aGVuCisJCWVjaG8gIiQxIiA+JjIKKwkJZXhpdCAxCisJZmk7Cit9CisKK2Z1bmN0
aW9uIHZhbGlkYXRlX3BhdGgoKSB7CisJaWYgISh0ZXN0IC1lICIkMSIpOyB0aGVuCisJCWVjaG8g
Ik5vIHN1Y2ggZmlsZSAkMSIgPiYyCisJCWV4aXQgMQorCWZpOworfQorCitEQVRBU1RPUkVfUEFU
SD0iJEhPTUUvLnN1Z2FyL2RlZmF1bHQvZGF0YXN0b3JlLyIKK3ZhbGlkYXRlX3BhdGggJERBVEFT
VE9SRV9QQVRICisKK2lmIFsgLXogIiQxIiBdOyB0aGVuCisJZWNobyAiQmFja3VwIHBhdGggaXMg
bm90IHZhbGlkLiIgPiYyCisJZXhpdCAxCitmaTsKKworUEFSQU1TX1BBVEg9JDEKK3ZhbGlkYXRl
X3BhdGggJFBBUkFNU19QQVRICisKK2lmIFsgLXogIiQyIiBdOyB0aGVuCisJZWNobyAiQmFja3Vw
IG5hbWUgaXMgbm90IHZhbGlkLiIgPiYyCisJZXhpdCAxCitmaTsKKworU0VSSUFMPSQyCisKK0JB
Q0tVUF9GSUxFPSRQQVJBTVNfUEFUSC8uYmFja3VwLyRTRVJJQUwvZGF0YXN0b3JlLnRhci5negor
dmFsaWRhdGVfcGF0aCAkQkFDS1VQX0ZJTEUKKworI1RPRE86IExldHMgZmluZCBhIHN1Z2FyLXdh
eSB0byBkbyB0aGlzPworcGtpbGwgLWYgLXggInB5dGhvbiAvdXNyL2Jpbi9kYXRhc3RvcmUtc2Vy
dmljZSIKKworY2QgJERBVEFTVE9SRV9QQVRICitybSAtcmYgJERBVEFTVE9SRV9QQVRIKgorCit0
YXIgLXh2emYgJEJBQ0tVUF9GSUxFCisKK2NoZWNrX2Zvcl9lcnJvcnMKKworZXhpdCAwCmRpZmYg
LS1naXQgYS9zcmMvamFyYWJlL2pvdXJuYWwvTWFrZWZpbGUuYW0gYi9zcmMvamFyYWJlL2pvdXJu
YWwvTWFrZWZpbGUuYW0KaW5kZXggZjRiZjI3My4uNmEzMDkxZSAxMDA2NDQKLS0tIGEvc3JjL2ph
cmFiZS9qb3VybmFsL01ha2VmaWxlLmFtCisrKyBiL3NyYy9qYXJhYmUvam91cm5hbC9NYWtlZmls
ZS5hbQpAQCAtMTQsNCArMTQsNSBAQCBzdWdhcl9QWVRIT04gPQkJCQlcCiAJbW9kZWwucHkJCQlc
CiAJb2JqZWN0Y2hvb3Nlci5weQkJXAogCXBhbGV0dGVzLnB5CQkJXAotCXZvbHVtZXN0b29sYmFy
LnB5CisJdm9sdW1lc3Rvb2xiYXIucHkgXAorCWJhY2t1cC5weQpkaWZmIC0tZ2l0IGEvc3JjL2ph
cmFiZS9qb3VybmFsL2JhY2t1cC5weSBiL3NyYy9qYXJhYmUvam91cm5hbC9iYWNrdXAucHkKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxMjY2MAotLS0gL2Rldi9udWxsCisr
KyBiL3NyYy9qYXJhYmUvam91cm5hbC9iYWNrdXAucHkKQEAgLTAsMCArMSwyMzEgQEAKKyMhL3Vz
ci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIFBsYW4gQ2VpYmFsIDxjb211
bmlkYWRAcGxhbi5jZWliYWwuZWR1LnV5PgorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIFBhcmFndWF5
IEVkdWNhIDx0ZWNub2xvZ2lhQHBhcmFndWF5ZWR1Y2Eub3JnPgorIworIyBUaGlzIHByb2dyYW0g
aXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQor
IyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVy
c2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRo
IHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMv
Pi4KKworaW1wb3J0IG9zCitpbXBvcnQgZ3RrCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGdjb25m
CitpbXBvcnQgbG9nZ2luZworCitmcm9tIGdldHRleHQgaW1wb3J0IGdldHRleHQgYXMgXworZnJv
bSBzdWdhci5ncmFwaGljcyBpbXBvcnQgc3R5bGUKK2Zyb20gc3VnYXIuZ3JhcGhpY3MuaWNvbiBp
bXBvcnQgSWNvbgorZnJvbSBzdWdhci5ncmFwaGljcy54b2NvbG9yIGltcG9ydCBYb0NvbG9yCisK
K2Zyb20gamFyYWJlLm1vZGVsLnNlc3Npb24gaW1wb3J0IGdldF9zZXNzaW9uX21hbmFnZXIKK2Zy
b20gamFyYWJlLm1vZGVsLnByb2Nlc3NtYW5hZ2VtZW50IGltcG9ydCBQcm9jZXNzTWFuYWdlbWVu
dAorCitQQVRIX0JBQ0tVUCA9ICcvdXNyL2Jpbi9qb3VybmFsLWJhY2t1cC12b2x1bWUnCitQQVRI
X1JFU1RPUkUgPSAnL3Vzci9iaW4vam91cm5hbC1yZXN0b3JlLXZvbHVtZScKKworY2xhc3MgQmFj
a3VwKGd0ay5XaW5kb3cpOgorCisgICAgX19ndHlwZV9uYW1lX18gPSAnU3VnYXJKb3VybmFsQmFj
a3VwJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVfcHMsIG1vdW50X3BhdGgpOgorCisg
ICAgICAgIHNlbGYuX3R5cGVfcHMgPSB0eXBlX3BzCisgICAgICAgIHNlbGYuX21vdW50X3BhdGgg
PSBtb3VudF9wYXRoCisKKyAgICAgICAgaWYgc2VsZi5faXNWYWxpZFR5cGUoc2VsZi5fdHlwZV9w
cyk6CisgICAgICAgICAgICBpZiAoKG5vdCBzZWxmLl9tb3VudF9wYXRoID09ICIiKSBhbmQgKG5v
dCBzZWxmLl9tb3VudF9wYXRoID09IE5vbmUpKToKKyAgICAgICAgICAgICAgICBzZWxmLl9wcm9n
cmVzc0JhckhhbmRsZXIgPSBOb25lCisKKyAgICAgICAgICAgICAgICBndGsuV2luZG93Ll9faW5p
dF9fKHNlbGYpCisKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9ib3JkZXJfd2lkdGgoc3R5bGUu
TElORV9XSURUSCkKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGd0ay5nZGsuc2NyZWVuX3dpZHRo
KCkKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBndGsuZ2RrLnNjcmVlbl9oZWlnaHQoKQorICAg
ICAgICAgICAgICAgIHNlbGYuc2V0X3NpemVfcmVxdWVzdCh3aWR0aCwgaGVpZ2h0KQorICAgICAg
ICAgICAgICAgIHNlbGYuc2V0X3Bvc2l0aW9uKGd0ay5XSU5fUE9TX0NFTlRFUl9BTFdBWVMpCisg
ICAgICAgICAgICAgICAgc2VsZi5zZXRfZGVjb3JhdGVkKEZhbHNlKQorICAgICAgICAgICAgICAg
IHNlbGYuc2V0X3Jlc2l6YWJsZShGYWxzZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9tb2Rh
bChUcnVlKQorCisgICAgICAgICAgICAgICAgc2VsZi5fbWFpbl92aWV3ID0gZ3RrLkV2ZW50Qm94
KCkKKyAgICAgICAgICAgICAgICBzZWxmLl92Ym94ID0gZ3RrLlZCb3goKQorICAgICAgICAgICAg
ICAgIHNlbGYuX3Zib3guc2V0X3NwYWNpbmcoc3R5bGUuREVGQVVMVF9TUEFDSU5HKQorICAgICAg
ICAgICAgICAgIHNlbGYuX3Zib3guc2V0X2JvcmRlcl93aWR0aChzdHlsZS5HUklEX0NFTExfU0la
RSkKKyAgICAgICAgICAgICAgICBzZWxmLl9tYWluX3ZpZXcubW9kaWZ5X2JnKGd0ay5TVEFURV9O
T1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5D
T0xPUl9CTEFDSy5nZXRfZ2RrX2NvbG9yKCkpCisgICAgICAgICAgICAgICAgc2VsZi5fbWFpbl92
aWV3LmFkZChzZWxmLl92Ym94KQorICAgICAgICAgICAgICAgIHNlbGYuX3Zib3guc2hvdygpCisK
KyAgICAgICAgICAgICAgICBjbGllbnQgPSBnY29uZi5jbGllbnRfZ2V0X2RlZmF1bHQoKQorICAg
ICAgICAgICAgICAgIGNvbG9yID0gWG9Db2xvcihjbGllbnQuZ2V0X3N0cmluZygnL2Rlc2t0b3Av
c3VnYXIvdXNlci9jb2xvcicpKQorCisgICAgICAgICAgICAgICAgaWNvbiA9IEljb24oaWNvbl9u
YW1lPSdhY3Rpdml0eS1qb3VybmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhl
bF9zaXplPXN0eWxlLlhMQVJHRV9JQ09OX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgeG9fY29sb3I9Y29sb3IpCisgICAgICAgICAgICAgICAgc2VsZi5fdmJveC5wYWNrX3N0YXJ0
KGljb24sIEZhbHNlKQorICAgICAgICAgICAgICAgIGljb24uc2hvdygpCisKKyAgICAgICAgICAg
ICAgICBzZWxmLl90aXRsZSA9IGd0ay5MYWJlbCgpCisgICAgICAgICAgICAgICAgc2VsZi5fdGl0
bGUubW9kaWZ5X2ZnKGd0ay5TVEFURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHN0eWxlLkNPTE9SX1dISVRFLmdldF9nZGtfY29sb3IoKSkKKyAgICAgICAg
ICAgICAgICBzZWxmLl90aXRsZS5zZXRfbWFya3VwKCc8Yj4lczwvYj4nICUgXyhzZWxmLl90eXBl
X3BzKSkKKyAgICAgICAgICAgICAgICBzZWxmLl92Ym94LnBhY2tfc3RhcnQoc2VsZi5fdGl0bGUs
IEZhbHNlKQorICAgICAgICAgICAgICAgIHNlbGYuX3RpdGxlLnNob3coKQorCisgICAgICAgICAg
ICAgICAgaWYgc2VsZi5fdHlwZV9wcyA9PSAnYmFja3VwJzoKKyAgICAgICAgICAgICAgICAgICAg
bGJsX3R4dCA9IF8oIkNsb3NlIGFsbCBhY3Rpdml0aWVzIGFuZCBkbyBub3QgcmVtb3ZlIHRoZSBl
eHRlcm5hbCBkZXZpY2UgZHVyaW5nIHRoZSBwcm9jZXNzLiBcblxuIgorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiVG8gbWFrZSB0aGUgYmFja3VwIG9mIHRoZSBKb3VybmFsLCBhIHJl
c3RhcnQgaXMgcmVxdWlyZWQuIFxuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJUaGUgYmFja3VwIGNhbiBvbmx5IGJlIHJlc3RvcmUgZnJvbSB0aGlzIGNvbXB1dGVyIikKKyAg
ICAgICAgICAgICAgICBlbGlmIHNlbGYuX3R5cGVfcHMgPT0gJ3Jlc3RvcmUnOgorICAgICAgICAg
ICAgICAgICAgICBsYmxfdHh0ID0gXygiVGhlIGNvbnRlbnQgeW91IHJlc3RvcmUgd2lsbCBvdmVy
d3JpdGUgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIEpvdXJuYWwuIFxuXG4iCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJEbyBub3QgcmVtb3ZlIHRoZSBleHRlcm5hbCBkZXZp
Y2UgZHVyaW5nIHRoZSBwcm9jZXNzLiBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIlRvIGltcGxlbWVudCB0aGUgcmVzdG9yYXRpb24gb2YgdGhlIEpvdXJuYWwsIGEgcmVzdGFy
dCBpcyByZXF1aXJlZC4gXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0
IHdpbGwgcmVzdG9yZSB0aGUgYmFja3VwIGRvbmUgZm9yIHRoaXMgY29tcHV0ZXIgIikKKyAgICAg
ICAgICAgICAgICBsYmxfdHh0ICs9IHNlbGYuX2dldF9zZXJpYWxfbnVtYmVyKCkKKworICAgICAg
ICAgICAgICAgIHNlbGYuX21lc3NhZ2UgPSBndGsuTGFiZWwobGJsX3R4dCkKKyAgICAgICAgICAg
ICAgICBzZWxmLl9tZXNzYWdlLm1vZGlmeV9mZyhndGsuU1RBVEVfTk9STUFMLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5DT0xPUl9XSElURS5nZXRfZ2RrX2Nv
bG9yKCkpCisgICAgICAgICAgICAgICAgc2VsZi5fbWVzc2FnZS5zZXRfbGluZV93cmFwKFRydWUp
CisgICAgICAgICAgICAgICAgc2VsZi5fdmJveC5wYWNrX3N0YXJ0KHNlbGYuX21lc3NhZ2UsIFRy
dWUpCisgICAgICAgICAgICAgICAgc2VsZi5fbWVzc2FnZS5zaG93KCkKKworCisgICAgICAgICAg
ICAgICAgdmJveCA9IGd0ay5WQm94KEZhbHNlLCA1KQorICAgICAgICAgICAgICAgIHZib3guc2hv
dygpCisgICAgICAgICAgICAgICAgaGJveCA9IGd0ay5IQm94KFRydWUsIDMpCisgICAgICAgICAg
ICAgICAgaGJveC5zaG93KCkKKworICAgICAgICAgICAgICAgIHZhbGlnbiA9IGd0ay5BbGlnbm1l
bnQoMCwgMSwgMCwgMCkKKyAgICAgICAgICAgICAgICB2YWxpZ24uc2hvdygpCisgICAgICAgICAg
ICAgICAgdmJveC5wYWNrX3N0YXJ0KHZhbGlnbikKKworICAgICAgICAgICAgICAgIHNlbGYuX2Fj
Y2VwdCA9IGd0ay5CdXR0b24oKQorICAgICAgICAgICAgICAgIHNlbGYuX2FjY2VwdC5zZXRfbGFi
ZWwoXygnQWNjZXB0JykpCisgICAgICAgICAgICAgICAgc2VsZi5fYWNjZXB0LnNob3coKQorICAg
ICAgICAgICAgICAgIHNlbGYuX2FjY2VwdC5jb25uZWN0KCdjbGlja2VkJywgc2VsZi5fX2FjY2Vw
dF9jYikKKworICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfam91cm5hbCA9IGd0ay5CdXR0b24o
KQorICAgICAgICAgICAgICAgIHNlbGYuX3Nob3dfam91cm5hbC5zZXRfbGFiZWwoXygnQ2xvc2Un
KSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zaG93X2pvdXJuYWwuc2hvdygpCisgICAgICAgICAg
ICAgICAgc2VsZi5fc2hvd19qb3VybmFsLmNvbm5lY3QoJ2NsaWNrZWQnLCBzZWxmLl9fc2hvd19q
b3VybmFsX2NiKQorCisgICAgICAgICAgICAgICAgc2VsZi5fcmVzdGFydCA9IGd0ay5CdXR0b24o
KQorICAgICAgICAgICAgICAgIHNlbGYuX3Jlc3RhcnQuc2V0X2xhYmVsKF8oJ1Jlc3RhcnQnKSkK
KyAgICAgICAgICAgICAgICBzZWxmLl9yZXN0YXJ0LmhpZGUoKQorICAgICAgICAgICAgICAgIHNl
bGYuX3Jlc3RhcnQuY29ubmVjdCgnY2xpY2tlZCcsIHNlbGYuX19yZXN0YXJ0X2NiKQorCisgICAg
ICAgICAgICAgICAgaGJveC5hZGQoc2VsZi5fYWNjZXB0KQorICAgICAgICAgICAgICAgIGhib3gu
YWRkKHNlbGYuX3Nob3dfam91cm5hbCkKKyAgICAgICAgICAgICAgICBoYm94LmFkZChzZWxmLl9y
ZXN0YXJ0KQorCisgICAgICAgICAgICAgICAgaGFsaWduID0gZ3RrLkFsaWdubWVudCgxLCAwLCAw
LCAwKQorICAgICAgICAgICAgICAgIGhhbGlnbi5zaG93KCkKKyAgICAgICAgICAgICAgICBoYWxp
Z24uYWRkKGhib3gpCisKKyAgICAgICAgICAgICAgICB2Ym94LnBhY2tfc3RhcnQoaGFsaWduLCBG
YWxzZSwgRmFsc2UsIDMpCisKKyAgICAgICAgICAgICAgICBzZWxmLl92Ym94LmFkZCh2Ym94KQor
CisgICAgICAgICAgICAgICAgc2VsZi5fcHJvZ3Jlc3NfYmFyID0gZ3RrLlByb2dyZXNzQmFyKGFk
anVzdG1lbnQ9Tm9uZSkKKworICAgICAgICAgICAgICAgIHNlbGYuYWRkKHNlbGYuX21haW5fdmll
dykKKyAgICAgICAgICAgICAgICBzZWxmLl9tYWluX3ZpZXcuc2hvdygpCisKKyAgICAgICAgICAg
ICAgICBzZWxmLmNvbm5lY3QoInJlYWxpemUiLCBzZWxmLl9fcmVhbGl6ZV9jYikKKworICAgICAg
ICAgICAgICAgIHNlbGYuX3Byb2Nlc3NfbWFuYWdlbWVudCA9IFByb2Nlc3NNYW5hZ2VtZW50KCkK
KyAgICAgICAgICAgICAgICBzZWxmLl9wcm9jZXNzX21hbmFnZW1lbnQuY29ubmVjdCgncHJvY2Vz
cy1tYW5hZ2VtZW50LXJ1bm5pbmcnLCBzZWxmLl9zZXRfdXBkYXRlX2xvZykKKyAgICAgICAgICAg
ICAgICBzZWxmLl9wcm9jZXNzX21hbmFnZW1lbnQuY29ubmVjdCgncHJvY2Vzcy1tYW5hZ2VtZW50
LXN0YXJ0ZWQnLCBzZWxmLl9zZXRfc3RhdHVzX3N0YXJ0ZWQpCisgICAgICAgICAgICAgICAgc2Vs
Zi5fcHJvY2Vzc19tYW5hZ2VtZW50LmNvbm5lY3QoJ3Byb2Nlc3MtbWFuYWdlbWVudC1maW5pc2hl
ZCcsIHNlbGYuX3NldF9zdGF0dXNfZmluaXNoZWQpCisgICAgICAgICAgICAgICAgc2VsZi5fcHJv
Y2Vzc19tYW5hZ2VtZW50LmNvbm5lY3QoJ3Byb2Nlc3MtbWFuYWdlbWVudC1mYWlsZWQnLCBzZWxm
Ll9zZXRfc3RhdHVzX2ZhaWxlZCkKKworICAgIGRlZiBfX3JlYWxpemVfY2Ioc2VsZiwgd2lkZ2V0
KToKKyAgICAgICAgc2VsZi53aW5kb3cuc2V0X3R5cGVfaGludChndGsuZ2RrLldJTkRPV19UWVBF
X0hJTlRfRElBTE9HKQorICAgICAgICBzZWxmLndpbmRvdy5zZXRfYWNjZXB0X2ZvY3VzKFRydWUp
CisKKyAgICBkZWYgX19zaG93X2pvdXJuYWxfY2Ioc2VsZiwgYnV0dG9uKToKKyAgICAgICAgc2Vs
Zi5kZXN0cm95KCkKKworICAgIGRlZiBfX2FjY2VwdF9jYihzZWxmLCAqYXJncyk6CisgICAgICAg
IGlmICgobm90IHNlbGYuX21vdW50X3BhdGggPT0gIiIpIGFuZCAobm90IHNlbGYuX21vdW50X3Bh
dGggPT0gTm9uZSkpOgorICAgICAgICAgICAgaWYgc2VsZi5faXNWYWxpZFR5cGUoc2VsZi5fdHlw
ZV9wcyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdHlwZV9wcyA9PSAnYmFja3VwJzoKKyAg
ICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzc19tYW5hZ2VtZW50LmRvX3Byb2Nlc3MoW1BB
VEhfQkFDS1VQLCBzZWxmLl9tb3VudF9wYXRoLCBzZWxmLl9nZXRfc2VyaWFsX251bWJlcigpXSkK
KyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX3R5cGVfcHMgPT0gJ3Jlc3RvcmUnOgorICAgICAg
ICAgICAgICAgICAgICBzZWxmLl9wcm9jZXNzX21hbmFnZW1lbnQuZG9fcHJvY2VzcyhbUEFUSF9S
RVNUT1JFLCBzZWxmLl9tb3VudF9wYXRoLCBzZWxmLl9nZXRfc2VyaWFsX251bWJlcigpXSkKKwor
ICAgIGRlZiBfc2V0X3N0YXR1c19zdGFydGVkKHNlbGYsIG1vZGVsLCBkYXRhPU5vbmUpOgorICAg
ICAgICBzZWxmLl9tZXNzYWdlLnNldF90ZXh0KF8oIklzIHJ1bm5pbmcsIFBsZWFzZSB3YWl0Iikp
CisgICAgICAgIHNlbGYuX2FjY2VwdC5oaWRlKCkKKyAgICAgICAgc2VsZi5fc2hvd19qb3VybmFs
LmhpZGUoKQorICAgICAgICBzZWxmLl9zaG93UHJvZ3Jlc3MoKQorCisgICAgZGVmIF9zZXRfdXBk
YXRlX2xvZyhzZWxmLCBtb2RlbCwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfc2V0
X3N0YXR1c19maW5pc2hlZChzZWxmLCBtb2RlbCwgZGF0YT1Ob25lKToKKyAgICAgICAgc2VsZi5f
bWVzc2FnZS5zZXRfdGV4dChfKCJJdCBpcyBkb25lLCBwbGVhc2UgcmVzdGFydCBzdWdhciIpKQor
ICAgICAgICBzZWxmLl9wcm9ncmVzc19iYXIuaGlkZSgpCisgICAgICAgIHNlbGYuX3Jlc3RhcnQu
c2hvdygpCisKKyAgICBkZWYgX3NldF9zdGF0dXNfZmFpbGVkKHNlbGYsIG1vZGVsLCBkYXRhPU5v
bmUpOgorICAgICAgICBsb2dnaW5nLmVycm9yKGRhdGEpCisgICAgICAgIHNlbGYuX3Nob3dNc2dF
cnJvcihkYXRhKQorCisgICAgZGVmIF9fcmVzdGFydF9jYihzZWxmLCAqYXJncyk6CisgICAgICAg
IHNlc3Npb25fbWFuYWdlciA9IGdldF9zZXNzaW9uX21hbmFnZXIoKQorICAgICAgICBzZXNzaW9u
X21hbmFnZXIubG9nb3V0KCkKKworICAgIGRlZiBfc2hvd1Byb2dyZXNzKHNlbGYpOgorICAgICAg
ICBzZWxmLl9wcm9ncmVzc19iYXIuc2V0X2ZyYWN0aW9uKDAuMCkKKyAgICAgICAgc2VsZi5fcHJv
Z3Jlc3NfYmFyLnNob3coKQorICAgICAgICBzZWxmLl92Ym94LmFkZChzZWxmLl9wcm9ncmVzc19i
YXIpCisgICAgICAgIGlmIChzZWxmLl9wcm9ncmVzc0JhckhhbmRsZXIgPT0gTm9uZSk6CisgICAg
ICAgICAgICBzZWxmLl9wcm9ncmVzc0JhckhhbmRsZXIgPSBnb2JqZWN0LnRpbWVvdXRfYWRkKDEw
MDAsIHNlbGYuX3RpbWVyUHJvZ3Jlc3NCYXIpCisKKyAgICBkZWYgX3RpbWVyUHJvZ3Jlc3NCYXIo
c2VsZik6CisgICAgICAgIHNlbGYuX3Byb2dyZXNzX2Jhci5wdWxzZSgpCisgICAgICAgIHJldHVy
biBUcnVlCisKKyAgICBkZWYgX3Nob3dNc2dFcnJvcihzZWxmLCBtc2cpOgorICAgICAgICBzZWxm
Ll90aXRsZS5zZXRfbWFya3VwKCc8Yj4lczwvYj4nICUgXygiRXJyb3IiKSkKKyAgICAgICAgc2Vs
Zi5fbWVzc2FnZS5zZXRfdGV4dChtc2cpCisgICAgICAgIHNlbGYuX3Nob3dfam91cm5hbC5zaG93
KCkKKyAgICAgICAgc2VsZi5fcHJvZ3Jlc3NfYmFyLmhpZGUoKQorCisgICAgZGVmIF9pc1ZhbGlk
VHlwZShzZWxmLCB0eXBlX3BzKToKKyAgICAgICAgcmV0dXJuICh0eXBlX3BzID09ICdiYWNrdXAn
KSB8ICh0eXBlX3BzID09ICdyZXN0b3JlJykKKworICAgIGRlZiBfZ2V0X3NlcmlhbF9udW1iZXIo
c2VsZik6CisgICAgICAgIHNlcmlhbF9ubyA9IHNlbGYuX3JlYWRfZmlsZSgnL29mdy9zZXJpYWwt
bnVtYmVyJykKKyAgICAgICAgaWYgc2VyaWFsX25vIGlzIE5vbmU6CisgICAgICAgICAgICBzZXJp
YWxfbm8gPSBzZWxmLl9nZXRfbmljaygpCisgICAgICAgIHJldHVybiBzZXJpYWxfbm8KKworICAg
IGRlZiBfcmVhZF9maWxlKHNlbGYsIHBhdGgpOgorICAgICAgICBpZiBvcy5hY2Nlc3MocGF0aCwg
b3MuUl9PSykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZmQgPSBv
cGVuKHBhdGgsICdyJykKKyAgICAgICAgdmFsdWUgPSBmZC5yZWFkKCkKKyAgICAgICAgZmQuY2xv
c2UoKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3RyaXAo
J1xuJykKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgbG9nZ2luZy5lcnJvcignTm8gaW5mb3JtYXRpb24gaW4gZmlsZSBvciBkaXJlY3Rvcnk6ICVz
JyAlIHBhdGgpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9nZXRfbmljayhz
ZWxmKToKKyAgICAgICAgY2xpZW50ID0gZ2NvbmYuY2xpZW50X2dldF9kZWZhdWx0KCkKKyAgICAg
ICAgcmV0dXJuIGNsaWVudC5nZXRfc3RyaW5nKCIvZGVza3RvcC9zdWdhci91c2VyL25pY2siKQpk
aWZmIC0tZ2l0IGEvc3JjL2phcmFiZS9tb2RlbC9NYWtlZmlsZS5hbSBiL3NyYy9qYXJhYmUvbW9k
ZWwvTWFrZWZpbGUuYW0KaW5kZXggZTlmMDcwMC4uYTRmODlhMyAxMDA2NDQKLS0tIGEvc3JjL2ph
cmFiZS9tb2RlbC9NYWtlZmlsZS5hbQorKysgYi9zcmMvamFyYWJlL21vZGVsL01ha2VmaWxlLmFt
CkBAIC0xNSw0ICsxNSw1IEBAIHN1Z2FyX1BZVEhPTiA9CQkJXAogCXNoZWxsLnB5CQlcCiAJc2Ny
ZWVuLnB5CQlcCiAgICAgICAgIHNlc3Npb24ucHkJCVwKLQlzb3VuZC5weQorCXNvdW5kLnB5IFwK
Kwlwcm9jZXNzbWFuYWdlbWVudC5weQpkaWZmIC0tZ2l0IGEvc3JjL2phcmFiZS9tb2RlbC9wcm9j
ZXNzbWFuYWdlbWVudC5weSBiL3NyYy9qYXJhYmUvbW9kZWwvcHJvY2Vzc21hbmFnZW1lbnQucHkK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4YWQ2NAotLS0gL2Rldi9udWxs
CisrKyBiL3NyYy9qYXJhYmUvbW9kZWwvcHJvY2Vzc21hbmFnZW1lbnQucHkKQEAgLTAsMCArMSw4
OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgUGFyYWd1YXkgRWR1Y2EsIE1hcnRpbiBBYmVudGUs
IEJlcm5pZSBJbm5vY2VudGkKKyMgQ29weXJpZ2h0IChDKSAyMDEwLCBQbGFuIENlaWJhbCA8Y29t
dW5pZGFkQHBsYW4uY2VpYmFsLmVkdS51eT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMK
KyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dy
YW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBV
U0EKKworaW1wb3J0IG9zCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGdsaWIKK2ltcG9ydCBnaW8K
KworZnJvbSBnZXR0ZXh0IGltcG9ydCBnZXR0ZXh0IGFzIF8KKworQllURVNfVE9fUkVBRCA9IDEw
MAorCitjbGFzcyBQcm9jZXNzTWFuYWdlbWVudChnb2JqZWN0LkdPYmplY3QpOgorCisgICAgX19n
dHlwZV9uYW1lX18gPSAnUHJvY2Vzc01hbmFnZW1lbnQnCisKKyAgICBfX2dzaWduYWxzX18gPSB7
CisgICAgICAgICdwcm9jZXNzLW1hbmFnZW1lbnQtcnVubmluZycgICAgOiAoZ29iamVjdC5TSUdO
QUxfUlVOX0ZJUlNULCBnb2JqZWN0LlRZUEVfTk9ORSwgKFtzdHJdKSksCisgICAgICAgICdwcm9j
ZXNzLW1hbmFnZW1lbnQtc3RhcnRlZCcgICAgOiAoZ29iamVjdC5TSUdOQUxfUlVOX0ZJUlNULCBn
b2JqZWN0LlRZUEVfTk9ORSwgKFtdKSksCisgICAgICAgICdwcm9jZXNzLW1hbmFnZW1lbnQtZmlu
aXNoZWQnICAgIDogKGdvYmplY3QuU0lHTkFMX1JVTl9GSVJTVCwgZ29iamVjdC5UWVBFX05PTkUs
IChbXSkpLAorICAgICAgICAncHJvY2Vzcy1tYW5hZ2VtZW50LWZhaWxlZCcgICAgOiAoZ29iamVj
dC5TSUdOQUxfUlVOX0ZJUlNULCBnb2JqZWN0LlRZUEVfTk9ORSwgKFtzdHJdKSkKKyAgICB9CisK
KyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGdvYmplY3QuR09iamVjdC5fX2luaXRf
XyhzZWxmKQorICAgICAgICBzZWxmLl9ydW5uaW5nID0gRmFsc2UKKworICAgIGRlZiBkb19wcm9j
ZXNzKHNlbGYsIGNtZCk6CisgICAgICAgIHNlbGYuX3J1bl9jbWRfYXN5bmMoY21kKQorCisgICAg
ZGVmIF9yZXBvcnRfcHJvY2Vzc19zdGF0dXMoc2VsZiwgc3RyZWFtLCByZXN1bHQpOgorICAgICAg
ICBkYXRhID0gc3RyZWFtLnJlYWRfZmluaXNoKHJlc3VsdCkKKworICAgICAgICBpZiBsZW4oZGF0
YSk6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ3Byb2Nlc3MtbWFuYWdlbWVudC1ydW5uaW5nJywg
ZGF0YSkKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkX2FzeW5jKEJZVEVTX1RPX1JFQUQsIHNlbGYu
X3JlcG9ydF9wcm9jZXNzX3N0YXR1cykKKworICAgIGRlZiBfcmVwb3J0X3Byb2Nlc3NfZXJyb3Io
c2VsZiwgc3RyZWFtLCByZXN1bHQsIGNvbmNhdF9lcnI9JycpOgorICAgICAgICBkYXRhID0gc3Ry
ZWFtLnJlYWRfZmluaXNoKHJlc3VsdCkKKyAgICAgICAgY29uY2F0X2VyciA9IGNvbmNhdF9lcnIg
KyBkYXRhCisKKyAgICAgICAgaWYgbGVuKGRhdGEpID09IDA6CisgICAgICAgICAgICAgICAgc2Vs
Zi5lbWl0KCdwcm9jZXNzLW1hbmFnZW1lbnQtZmFpbGVkJywgY29uY2F0X2VycikKKyAgICAgICAg
ZWxzZToKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkX2FzeW5jKEJZVEVTX1RPX1JFQUQsIHNlbGYu
X3JlcG9ydF9wcm9jZXNzX2Vycm9yLCB1c2VyX2RhdGE9Y29uY2F0X2VycikKKworICAgIGRlZiBf
bm90aWZ5X2Vycm9yKHNlbGYsIHN0ZGVycik6CisgICAgICAgIHN0ZGluX3N0cmVhbSA9IGdpby51
bml4LklucHV0U3RyZWFtKHN0ZGVyciwgVHJ1ZSkKKyAgICAgICAgc3RkaW5fc3RyZWFtLnJlYWRf
YXN5bmMoQllURVNfVE9fUkVBRCwgc2VsZi5fcmVwb3J0X3Byb2Nlc3NfZXJyb3IpCisKKyAgICBk
ZWYgX25vdGlmeV9wcm9jZXNzX3N0YXR1cyhzZWxmLCBzdGRvdXQpOgorICAgICAgICBzdGRpbl9z
dHJlYW0gPSBnaW8udW5peC5JbnB1dFN0cmVhbShzdGRvdXQsIFRydWUpCisgICAgICAgIHN0ZGlu
X3N0cmVhbS5yZWFkX2FzeW5jKEJZVEVTX1RPX1JFQUQsIHNlbGYuX3JlcG9ydF9wcm9jZXNzX3N0
YXR1cykKKworICAgIGRlZiBfcnVuX2NtZF9hc3luYyhzZWxmLCBjbWQpOgorICAgICAgICBpZiBz
ZWxmLl9ydW5uaW5nID09IEZhbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAg
IHBpZCwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyID0gZ2xpYi5zcGF3bl9hc3luYyhjbWQsIGZsYWdz
PWdsaWIuU1BBV05fRE9fTk9UX1JFQVBfQ0hJTEQsIHN0YW5kYXJkX291dHB1dD1UcnVlLCBzdGFu
ZGFyZF9lcnJvcj1UcnVlKQorICAgICAgICAgICAgICAgIGdvYmplY3QuY2hpbGRfd2F0Y2hfYWRk
KHBpZCwgX2hhbmRsZV9wcm9jZXNzX2VuZCwgKHNlbGYsIHN0ZGVycikpCisgICAgICAgICAgICBl
eGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgncHJvY2Vzcy1tYW5h
Z2VtZW50LWZhaWxlZCcsIF8oIkVycm9yIC0gQ2FsbCBwcm9jZXNzOiAiKSArIHN0cihjbWQpKQor
ICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RpZnlfcHJvY2Vzc19z
dGF0dXMoc3Rkb3V0KQorICAgICAgICAgICAgICAgIHNlbGYuX3J1bm5pbmcgID0gVHJ1ZQorICAg
ICAgICAgICAgICAgIHNlbGYuZW1pdCgncHJvY2Vzcy1tYW5hZ2VtZW50LXN0YXJ0ZWQnKQorCitk
ZWYgX2hhbmRsZV9wcm9jZXNzX2VuZChwaWQsIGNvbmRpdGlvbiwgKG15c2VsZiwgc3RkZXJyKSk6
CisgICAgbXlzZWxmLl9ydW5uaW5nID0gRmFsc2UKKworICAgIGlmIG9zLldJRkVYSVRFRChjb25k
aXRpb24pIGFuZFwKKyAgICAgICAgb3MuV0VYSVRTVEFUVVMoY29uZGl0aW9uKSA9PSAwOgorICAg
ICAgICAgICAgbXlzZWxmLmVtaXQoJ3Byb2Nlc3MtbWFuYWdlbWVudC1maW5pc2hlZCcpCisgICAg
ZWxzZToKKyAgICAgICAgbXlzZWxmLl9ub3RpZnlfZXJyb3Ioc3RkZXJyKQotLSAKMS42LjIuNQoK
--001636e0b9b8e73b3604880e5741
Content-Type: application/octet-stream; name="0003-Traslate.patch"
Content-Disposition: attachment; filename="0003-Traslate.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_g9ycgxbd2

RnJvbSBjNjhmM2Y1NWJlYmMzMzI2NDNlZTVkMGMyODJmYTI5ODUxY2JkNmE1IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBFc3RlYmFuIEFyaWFzIDxlYXJpYXNAcGxhbi5jZWliYWwuZWR1
LnV5PgpEYXRlOiBXZWQsIDIgSnVuIDIwMTAgMTI6NTA6MzYgLTAzMDAKU3ViamVjdDogW1BBVENI
XSBUcmFzbGF0ZQpPcmdhbml6YXRpb246IFBsYW4gQ2VpYmFsCgotLS0KIHBvL2VzLnBvIHwgICAz
OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZXMgY2hhbmdl
ZCwgMzkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9wby9lcy5w
byBiL3BvL2VzLnBvCmluZGV4IDU4NzYwOGYuLjBlMTM4YTQgMTAwNjQ0Ci0tLSBhL3BvL2VzLnBv
CisrKyBiL3BvL2VzLnBvCkBAIC0xMjc1LDYgKzEyNzUsNDUgQEAgbXNnc3RyICJGdWVudGUgZGVs
IHBhcXVldGUgZGUgbGEgYWN0aXZpZGFkIgogbXNnaWQgIlZpZXcgc291cmNlOiAlciIKIG1zZ3N0
ciAiVmVyIGPDs2RpZ28gZnVlbnRlOiAlciIKIAorIzogLi4vc3JjL2phcmFiZS9qb3VybmFsL3Zv
bHVtZXN0b29sYmFyLnB5OjE5NgorbXNnaWQgIkpvdXJuYWwgQmFja3VwIgorbXNnc3RyICJSZXNw
YWxkYXIgRGlhcmlvIgorCisjOiAuLi9zcmMvamFyYWJlL2pvdXJuYWwvdm9sdW1lc3Rvb2xiYXIu
cHk6MjA4Cittc2dpZCAiSm91cm5hbCBSZXN0b3JlIgorbXNnc3RyICJSZXN0YXVyYXIgRGlhcmlv
IgorCisjOiAuLi9zcmMvamFyYWJlL2pvdXJuYWwvYmFja3VwLnB5Ojg0Cittc2dpZCAiYmFja3Vw
IgorbXNnc3RyICJyZXNwYWxkYXIiCisKKyM6IC4uL3NyYy9qYXJhYmUvam91cm5hbC9iYWNrdXAu
cHk6ODQKK21zZ2lkICJyZXN0b3JlIgorbXNnc3RyICJyZXN0YXVyYXIiCisKKyM6IC4uL3NyYy9q
YXJhYmUvam91cm5hbC9iYWNrdXAucHk6ODkKK21zZ2lkICIiCisiQ2xvc2UgYWxsIGFjdGl2aXRp
ZXMgYW5kIGRvIG5vdCByZW1vdmUgdGhlIGV4dGVybmFsIGRldmljZSBkdXJpbmcgdGhlIHByb2Nl
c3MuIFxuXG4iCisiVG8gbWFrZSB0aGUgYmFja3VwIG9mIHRoZSBKb3VybmFsLCBhIHJlc3RhcnQg
aXMgcmVxdWlyZWQuIFxuXG4iCisiVGhlIGJhY2t1cCBjYW4gb25seSBiZSByZXN0b3JlIGZyb20g
dGhpcyBjb21wdXRlciIKK21zZ3N0ciAiIgorIkNpZXJyZSB0b2RhcyBsYXMgYWN0aXZpZGFkZXMg
eSBubyBleHRyYWlnYSBlbCBkaXNwb3NpdGl2byBleHRlcm5vIGR1cmFudGUgZWwgcHJvY2Vzby4g
XG5cbiIKKyJQYXJhIHJlYWxpemFyIGVsIHJlc3BhbGRvIGRlbCBEaWFyaW8sIHNlIHJlcXVpZXJl
IHJlaW5pY2lhci4gXG5cbiIKKyJFbCByZXNwbGFkbyBzw7NsbyBwb2Ryw6Egc2VyIHJlY3VwZXJh
ZG8gZGVzZGUgZXN0ZSBlcXVpcG8gIgorCisjOiAuLi9zcmMvamFyYWJlL2pvdXJuYWwvYmFja3Vw
LnB5Ojk0Cittc2dpZCAiIgorIlRoZSBjb250ZW50IHlvdSByZXN0b3JlIHdpbGwgb3ZlcndyaXRl
IHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBKb3VybmFsLiBcblxuIgorIkRvIG5vdCByZW1v
dmUgdGhlIGV4dGVybmFsIGRldmljZSBkdXJpbmcgdGhlIHByb2Nlc3MuIFxuIgorIlRvIGltcGxl
bWVudCB0aGUgcmVzdG9yYXRpb24gb2YgdGhlIEpvdXJuYWwsIGEgcmVzdGFydCBpcyByZXF1aXJl
ZC4gXG5cbiIKKyJJdCB3aWxsIHJlc3RvcmUgdGhlIGJhY2t1cCBkb25lIGZvciB0aGlzIGNvbXB1
dGVyICIKK21zZ3N0ciAiIgorIkVsIGNvbnRlbmlkbyBxdWUgcmVzdGF1cmFyw6EgdmEgYSBzb2Jy
ZXNjcmliaXIgZWwgY29udGVuaWRvIGFjdXRhbCBkZWwgRGlhcmlvLiBcblxuIgorIk5vIGV4dHJh
aWdhIGVsIGRpc3Bvc2l0aXZvIGV4dGVybm8gZHVyYW50ZSBlbCBwcm9jZXNvLiBcbiIKKyJQYXJh
IGFwbGljYXIgbGEgcmVzdGF1cmFjacOzbiBkZWwgRGlhcmlvLCBzZSByZXF1aWVyZSByZWluaWNp
YXIuIFxuXG4iCisiU2UgcmVzdGF1cmFyw6EgZWwgcmVzcGFkbyByZWFsaXphZG8gcGFyYSBlc3Rl
IGVxdWlwbyAiCisKKwogI34gbXNnaWQgIkNhbm5vdCBvYnRhaW4gZGF0YSBuZWVkZWQgZm9yIHJl
Z2lzdHJhdGlvbi4iCiAjfiBtc2dzdHIgIk5vIHNlIHB1ZWRlIG9idGVuZXIgZGF0b3MgbmVjZXNh
cmlvcyBwYXJhIGVsIHJlZ2lzdHJvIgogCi0tIAoxLjYuMi41Cgo=
--001636e0b9b8e73b3604880e5741--


More information about the Sugar-devel mailing list