821 lines
32 KiB
XML
821 lines
32 KiB
XML
<?xml version="1.0"?>
|
|
<!--
|
|
Copyright 1991-2015 Amebis
|
|
Copyright 2016 GÉANT
|
|
|
|
This file is part of MSIBuild.
|
|
|
|
MSIBuild is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
MSIBuild is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with MSIBuild. If not, see <http://www.gnu.org/licenses/>.
|
|
-->
|
|
<package>
|
|
<job id="MakeDDF">
|
|
<runtime>
|
|
<description>Compile DDF file for shared CAB archive from input MSI files.</description>
|
|
<unnamed name="<output.ddf>" helpstring="Output DDF file" required="true"/>
|
|
<unnamed name="<input.msi ...>" helpstring="Input MSI files" required="true"/>
|
|
<named name="I" helpstring="Input files folder" type="string" required="false"/>
|
|
<named name="O" helpstring="CAB archive base name (default "Dat")" type="string" required="false"/>
|
|
<named name="C" helpstring="Compression (default "MSZIP")" type="string" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 2) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
ddf_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
|
|
output_base = WScript.Arguments.Named.Exists("O") ? WScript.Arguments.Named("O") : "Dat",
|
|
compression = WScript.Arguments.Named.Exists("C") ? WScript.Arguments.Named("C") : "MSZIP",
|
|
files = new Array(),
|
|
i, n = WScript.Arguments.Unnamed.length;
|
|
|
|
// No user interaction is desired.
|
|
installer.UILevel = msiUILevelNone;
|
|
|
|
for (i = 1; i < n; i++) {
|
|
var
|
|
msi_path = WScript.Arguments.Unnamed(i),
|
|
d;
|
|
|
|
try {
|
|
d = MSIGetFiles(installer, msi_path, input_path);
|
|
MSIMergeFiles(files, d);
|
|
} catch (err) {
|
|
throw new Error(err.number, "" + msi_path + ": " + err.description);
|
|
}
|
|
|
|
// Force JScript engine to free database and session objects, otherwise opening of another session will fail.
|
|
CollectGarbage();
|
|
}
|
|
|
|
// Create DDF file and write header properties.
|
|
var
|
|
dat = fso.CreateTextFile(ddf_path, true, false);
|
|
|
|
try {
|
|
dat.WriteLine(".Set CabinetNameTemplate=" + output_base + "*.cab");
|
|
dat.WriteLine(".Set CabinetName1=" + output_base + ".cab");
|
|
dat.WriteLine(".Set InfFileName=" + output_base + ".inf");
|
|
dat.WriteLine(".Set RptFileName=" + output_base + ".rpt");
|
|
dat.WriteLine(".Set ReservePerCabinetSize=8");
|
|
dat.WriteLine(".Set MaxDiskSize=0");
|
|
dat.WriteLine(".Set CompressionType=" + compression);
|
|
dat.WriteLine(".Set InfFileLineFormat=(*disk#*) *file#*: *file* = *Size*");
|
|
dat.WriteLine(".Set InfHeader=");
|
|
dat.WriteLine(".Set InfFooter=");
|
|
dat.WriteLine(".Set InfDateFormat=yyyy-mm-dd");
|
|
dat.WriteLine(".Set DiskDirectoryTemplate=");
|
|
dat.WriteLine(".Set Compress=ON");
|
|
dat.WriteLine(".Set Cabinet=ON");
|
|
//if (input_path)
|
|
// dat.WriteLine(".Set SourceDir=" + input_path);
|
|
for (fileKey in files) {
|
|
var
|
|
f = fso.GetFile(files[fileKey]),
|
|
d = new Date(f.DateLastModified);
|
|
|
|
// Seconds should be even. This is MAKECAB limitation.
|
|
d.setSeconds(Math.round(d.getSeconds() / 2) * 2);
|
|
|
|
dat.WriteLine("\"" + files[fileKey] + "\" /Date=" + d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + " /Time=" + Time2Str(d) + " " + fileKey);
|
|
}
|
|
} finally {
|
|
dat.Close();
|
|
}
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(ddf_path))
|
|
fso.DeleteFile(ddf_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="MakeDEP">
|
|
<runtime>
|
|
<description>Compile DEP dependency file from input MSI files.</description>
|
|
<unnamed name="<output.dep>" helpstring="Output DEP file" required="true"/>
|
|
<unnamed name="<target file>" helpstring="Target file dependant of input" required="true"/>
|
|
<unnamed name="<input.msi ...>" helpstring="Input MSI files" required="true"/>
|
|
<named name="I" helpstring="Input files folder" type="string" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
dep_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
|
|
target_path = WScript.Arguments.Unnamed(1),
|
|
files = new Array(),
|
|
i, n = WScript.Arguments.Unnamed.length;
|
|
|
|
// No user interaction is desired.
|
|
installer.UILevel = msiUILevelNone;
|
|
|
|
for (i = 2; i < n; i++) {
|
|
var
|
|
msi_path = WScript.Arguments.Unnamed(i),
|
|
d;
|
|
|
|
d = MSIGetFiles(installer, msi_path, input_path);
|
|
MSIMergeFiles(files, d);
|
|
|
|
// Force JScript engine to free database and session objects, otherwise opening of another session will fail.
|
|
CollectGarbage();
|
|
}
|
|
|
|
var
|
|
dat = fso.CreateTextFile(dep_path, true, false);
|
|
|
|
try {
|
|
dat.Write("\"" + target_path + "\" :");
|
|
for (fileKey in files)
|
|
dat.Write(" \\\r\n\t\"" + files[fileKey] + "\"");
|
|
dat.WriteLine();
|
|
dat.WriteLine();
|
|
} finally {
|
|
dat.Close();
|
|
}
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(dep_path))
|
|
fso.DeleteFile(dep_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="SetCAB">
|
|
<runtime>
|
|
<description>Configures MSI package to use external CAB file.</description>
|
|
<unnamed name="<database.msi>" helpstring="Output MSI file" required="true"/>
|
|
<unnamed name="<input.inf>" helpstring="Input INF file" required="true"/>
|
|
<named name="I" helpstring="Input files folder" type="string" required="false"/>
|
|
<named name="E" helpstring="Embed CAB file" type="simple" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 2) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : "",
|
|
embed = WScript.Arguments.Named.Exists("E") ? true : false,
|
|
msi_path = WScript.Arguments.Unnamed(0),
|
|
inf_path = WScript.Arguments.Unnamed(1),
|
|
cab_path = null,
|
|
cab_name;
|
|
|
|
// No user interaction is desired.
|
|
installer.UILevel = msiUILevelNone;
|
|
|
|
var
|
|
database = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
|
|
session = installer.OpenPackage(database, 1),
|
|
shortNames = session.Mode(msiRunModeSourceShortNames),
|
|
lastSequence = 0,
|
|
stat,
|
|
view,
|
|
record,
|
|
updateMode,
|
|
sumInfo,
|
|
today = new Date();
|
|
|
|
if (input_path)
|
|
session.Property("OriginalDatabase") = input_path;
|
|
|
|
stat = session.DoAction("CostInitialize");
|
|
if (stat != 1)
|
|
throw new Error("Error calling CostInitialize() (code " + stat + ").");
|
|
|
|
var
|
|
dat = fso.OpenTextFile(inf_path, 1);
|
|
|
|
try {
|
|
var
|
|
section = null,
|
|
re_section = new RegExp("^\\s*\\[([^\\]]*)\\]\\s*$", "i"),
|
|
re_file_list = new RegExp("^\\s*\\((\\d+)\\)\\s*(\\d+)\\s*[:]([^=]+)[=]\\s*(\\d+)\\s*$", "i"),
|
|
re_cabinet_list = new RegExp("^\\s*(\\d+)\\s*[,]\\s*(\\d+)\\s*[,](.*)$", "i");
|
|
|
|
while (!dat.AtEndOfStream) {
|
|
var
|
|
s = new String(dat.ReadLine()),
|
|
m;
|
|
|
|
if (m = s.match(re_section)) {
|
|
// We found a section.
|
|
section = new String(m[1]);
|
|
} else if (section.toLowerCase() == "file list") {
|
|
if (m = s.match(re_file_list)) {
|
|
var
|
|
fileNum = parseInt(m[2], 10),
|
|
fileId = Trim(m[3]);
|
|
|
|
// Set file sequence in database.
|
|
view = database.OpenView("SELECT Sequence,Attributes FROM File WHERE File='" + _S(fileId) + "'");
|
|
view.Execute();
|
|
record = view.Fetch();
|
|
if (record) {
|
|
record.IntegerData(1) = fileNum;
|
|
// record.IntegerData(2) = (record.IntegerData(2) & ~msidbFileAttributesNoncompressed) | msidbFileAttributesCompressed;
|
|
view.Modify(msiViewModifyUpdate, record);
|
|
}
|
|
view.Close();
|
|
|
|
if (fileNum > lastSequence)
|
|
lastSequence = fileNum;
|
|
}
|
|
} else if (section.toLowerCase() == "cabinet list") {
|
|
if (m = s.match(re_cabinet_list)) {
|
|
if (cab_path)
|
|
throw new Error("INF file can contain one CAB archive only.");
|
|
|
|
// Read archive file name.
|
|
cab_path = Trim(m[3]);
|
|
cab_name = cab_path.split("\\");
|
|
cab_name = cab_name[cab_name.length - 1];
|
|
}
|
|
}
|
|
}
|
|
} finally {
|
|
dat.Close();
|
|
}
|
|
|
|
view = database.OpenView("SELECT DiskId,LastSequence,Cabinet FROM Media ORDER BY DiskId");
|
|
view.Execute();
|
|
record = view.Fetch();
|
|
updateMode = msiViewModifyUpdate;
|
|
if (!record) {
|
|
// Media table is empty.
|
|
record = installer.CreateRecord(3);
|
|
record.IntegerData(1) = 1;
|
|
updateMode = msiViewModifyInsert;
|
|
}
|
|
record.IntegerData(2) = lastSequence;
|
|
record.StringData(3) = (embed ? "#" : "") + cab_name;
|
|
view.Modify(updateMode, record);
|
|
|
|
sumInfo = database.SummaryInformation(3);
|
|
sumInfo.Property(PID_LASTPRINTED) = today.getVarDate();
|
|
sumInfo.Property(PID_LASTSAVE_DTM) = today.getVarDate();
|
|
sumInfo.Property(PID_WORDCOUNT) = (shortNames ? 1 : 0) | 2;
|
|
sumInfo.Persist();
|
|
|
|
if (embed) {
|
|
view = database.OpenView("SELECT Name,Data FROM _Streams");
|
|
view.Execute();
|
|
record = installer.CreateRecord(2);
|
|
record.StringData(1) = cab_name;
|
|
record.SetStream(2, cab_path);
|
|
view.Modify(msiViewModifyAssign, record);
|
|
}
|
|
|
|
// Commit database
|
|
database.Commit();
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="MakeMST">
|
|
<runtime>
|
|
<description>Build MSI language from differences between two MSI files.</description>
|
|
<unnamed name="<source.msi>" helpstring="Original MSI file" required="true"/>
|
|
<unnamed name="<destination.msi>" helpstring="Updated MSI file" required="true"/>
|
|
<unnamed name="<diff.mst>" helpstring="Output MST file" required="true"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
mst_path = WScript.Arguments.Unnamed(2);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
db_src = installer.OpenDatabase(WScript.Arguments.Unnamed(0), msiOpenDatabaseModeReadOnly),
|
|
db_dst = installer.OpenDatabase(WScript.Arguments.Unnamed(1), msiOpenDatabaseModeReadOnly);
|
|
|
|
db_dst.GenerateTransform(db_src, mst_path);
|
|
db_dst.CreateTransformSummaryInfo(db_src, mst_path, msiTransformErrorNone, msiTransformValidationNone);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(mst_path))
|
|
fso.DeleteFile(mst_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="AddStorage">
|
|
<runtime>
|
|
<description>Adds sub-storage to MSI file.</description>
|
|
<unnamed name="<database.msi>" helpstring="MSI database file" required="true"/>
|
|
<unnamed name="<transform.mst>" helpstring="MST file to add as a sub-storage" required="true"/>
|
|
<unnamed name="<name>" helpstring="Sub-storage name" required="true"/>
|
|
<named name="L" helpstring="Add transform to the list of language transforms" type="boolean" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
msi_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
database = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
|
|
view = database.OpenView("SELECT Name,Data FROM _Storages"),
|
|
record = installer.CreateRecord(2),
|
|
stream_path = WScript.Arguments.Unnamed(1),
|
|
stream_name = WScript.Arguments.Unnamed(2);
|
|
|
|
try {
|
|
// Inserts or updates sub-storage.
|
|
record.StringData(1) = stream_name;
|
|
view.Execute(record);
|
|
record.SetStream(2, stream_path);
|
|
view.Modify(msiViewModifyAssign, record);
|
|
} catch (err) {
|
|
throw new Error(err.number, "" + stream_path + ": " + err.description);
|
|
}
|
|
|
|
if (WScript.Arguments.Named.Exists("L") && WScript.Arguments.Named("L") != false) {
|
|
// Get platform.
|
|
var
|
|
sumInfo = database.SummaryInformation(1),
|
|
template = sumInfo.Property(PID_TEMPLATE),
|
|
idx_delim = template.indexOf(";"),
|
|
platform = idx_delim >= 0 ? template.substring(0, idx_delim + 1) : ";",
|
|
languages = idx_delim >= 0 ? template.substring(idx_delim + 1).split(new RegExp("\\s*,\\s*")) : new Array();
|
|
|
|
languages.push(stream_name);
|
|
|
|
// Set template property.
|
|
sumInfo.Property(PID_TEMPLATE) = platform + languages.join(",");
|
|
sumInfo.Persist();
|
|
}
|
|
|
|
// Commit database
|
|
database.Commit();
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(msi_path))
|
|
fso.DeleteFile(msi_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="IDTDiff">
|
|
<runtime>
|
|
<description>Extract strings to translate by comparing two IDT files.</description>
|
|
<unnamed name="<output.po>" helpstring="Output PO file" required="true"/>
|
|
<unnamed name="<source.idt>" helpstring="Original IDT file" required="true"/>
|
|
<unnamed name="<destination.idt>" helpstring="Translated IDT file" required="true"/>
|
|
<named name="L" helpstring="Language identifier" type="string" required="false"/>
|
|
</runtime>
|
|
<reference object="ADODB.Stream"/>
|
|
<reference object="Scripting.FileSystemObject"/>
|
|
<script language="JScript" src="IDT.js"/>
|
|
<script language="JScript" src="PO.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
po_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
// Open and parse IDT file(s).
|
|
var
|
|
idt_src_path = WScript.Arguments.Unnamed(1),
|
|
idt_src = new IDT(idt_src_path),
|
|
idt_dst = new IDT(WScript.Arguments.Unnamed(2));
|
|
|
|
// IDT files must represent identical table.
|
|
if (idt_src.columns.toString() != idt_dst.columns.toString() ||
|
|
idt_src.types .toString() != idt_dst.types .toString() ||
|
|
idt_src.table != idt_dst.table ||
|
|
idt_src.key .toString() != idt_dst.key .toString())
|
|
throw new Error("IDT files are not compatible.");
|
|
|
|
var po = new POCatalog();
|
|
|
|
// Add header.
|
|
po.push("",
|
|
"MIME-Version: 1.0\n" +
|
|
"Content-Type: text/plain; charset=" + po.charset + "\n" +
|
|
"Content-Transfer-Encoding: 8bit\n" +
|
|
(WScript.Arguments.Named.Exists("L") ? "Language: "+ WScript.Arguments.Named("L") +"\n" : ""), false);
|
|
|
|
// Build translations.
|
|
for (var key in idt_src.data) {
|
|
if (key in idt_dst.data) {
|
|
// We found a record in both IDT files.
|
|
for (var col in idt_src.types)
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "")
|
|
po.push(idt_src.data[key][col], idt_dst.data[key][col], false, "#: " + idt_src_path + ":" + idt_src.linenum[key]);
|
|
} else {
|
|
// The record is available in the source IDT file only.
|
|
for (var col in idt_src.types)
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "")
|
|
po.push(idt_src.data[key][col], "", false, "#: " + idt_src_path + ":" + idt_src.linenum[key]);
|
|
}
|
|
}
|
|
|
|
// Save to file.
|
|
po.save(po_path);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(po_path))
|
|
fso.DeleteFile(po_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="IDTExtract">
|
|
<runtime>
|
|
<description>Extract strings to translate.</description>
|
|
<unnamed name="<output.po>" helpstring="Output PO file" required="true"/>
|
|
<unnamed name="<source.idt>..." helpstring="Source IDT files" required="true"/>
|
|
</runtime>
|
|
<reference object="ADODB.Stream"/>
|
|
<reference object="Scripting.FileSystemObject"/>
|
|
<script language="JScript" src="IDT.js"/>
|
|
<script language="JScript" src="PO.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 2) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
po_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var po = new POCatalog();
|
|
|
|
// Add header.
|
|
po.push("",
|
|
"MIME-Version: 1.0\n" +
|
|
"Content-Type: text/plain; charset=" + po.charset + "\n" +
|
|
"Content-Transfer-Encoding: 8bit\n", false);
|
|
|
|
// Build translations.
|
|
for (var i = 1, argc = WScript.Arguments.Unnamed.Length; i < argc; i++) {
|
|
// Open and parse IDT file(s).
|
|
var
|
|
idt_src_path = WScript.Arguments.Unnamed(i),
|
|
idt_src = new IDT(idt_src_path);
|
|
|
|
for (var key in idt_src.data) {
|
|
for (var col in idt_src.types)
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "") {
|
|
var src = idt_src.data[key][col];
|
|
var t = po.search(src);
|
|
if (t) {
|
|
// Text-to-translate already present. Add source to the list.
|
|
t["#"] += " " + idt_src_path + ":" + idt_src.linenum[key];
|
|
} else {
|
|
// Add text-to-translate.
|
|
po.push(src, "", false, "#: " + idt_src_path + ":" + idt_src.linenum[key]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Save to file.
|
|
po.save(po_path);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(po_path))
|
|
fso.DeleteFile(po_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="IDTTranslate">
|
|
<runtime>
|
|
<description>Translate IDT file.</description>
|
|
<unnamed name="<destination.idt>" helpstring="Translated IDT file" required="true"/>
|
|
<unnamed name="<source.idt>" helpstring="Original IDT file" required="true"/>
|
|
<unnamed name="<catalogue.po>" helpstring="PO catalog file with translations" required="true"/>
|
|
<named name="CP" helpstring="Output code page" type="string" required="false"/>
|
|
</runtime>
|
|
<reference object="ADODB.Stream"/>
|
|
<reference object="Scripting.FileSystemObject"/>
|
|
<script language="JScript" src="IDT.js"/>
|
|
<script language="JScript" src="PO.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
idt_dst_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
// Open and parse source IDT file and PO catalogue.
|
|
var
|
|
idt_src = new IDT(WScript.Arguments.Unnamed(1)),
|
|
po = new POCatalog(WScript.Arguments.Unnamed(2));
|
|
|
|
// Translate records.
|
|
for (var key in idt_src.data) {
|
|
for (var col in idt_src.types) {
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "")
|
|
idt_src.data[key][col] = po.translate(idt_src.data[key][col]);
|
|
}
|
|
}
|
|
|
|
if (WScript.Arguments.Named.Exists("CP"))
|
|
idt_src.codepage = parseInt(WScript.Arguments.Named("CP"), 10);
|
|
idt_src.save(idt_dst_path);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(idt_dst_path))
|
|
fso.DeleteFile(idt_dst_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="MakeGUID">
|
|
<runtime>
|
|
<description>Creates a new GUID and displays it on output.</description>
|
|
<named name="M" helpstring="Makefile macro name" type="string" required="false"/>
|
|
</runtime>
|
|
<reference object="Scriptlet.TypeLib"/>
|
|
<script language="JScript"><![CDATA[
|
|
var
|
|
tlib = WScript.CreateObject("Scriptlet.TypeLib"),
|
|
guid = tlib.Guid;
|
|
|
|
WScript.Echo(
|
|
WScript.Arguments.Named.Exists("M") ? WScript.Arguments.Named("M") + "=" + guid.toUpperCase() :
|
|
guid.toUpperCase());
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
|
|
<signature>
|
|
** SIG ** MIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQExCzAJBgUr
|
|
** SIG ** DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
|
|
** SIG ** gjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIBAAIB
|
|
** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFA4papFj+oVZ
|
|
** SIG ** RmYuKgyMqZUTsUTBoIISyDCCA+4wggNXoAMCAQICEH6T
|
|
** SIG ** 6/t8xk5Z6kuad9QG/DswDQYJKoZIhvcNAQEFBQAwgYsx
|
|
** SIG ** CzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENh
|
|
** SIG ** cGUxFDASBgNVBAcTC0R1cmJhbnZpbGxlMQ8wDQYDVQQK
|
|
** SIG ** EwZUaGF3dGUxHTAbBgNVBAsTFFRoYXd0ZSBDZXJ0aWZp
|
|
** SIG ** Y2F0aW9uMR8wHQYDVQQDExZUaGF3dGUgVGltZXN0YW1w
|
|
** SIG ** aW5nIENBMB4XDTEyMTIyMTAwMDAwMFoXDTIwMTIzMDIz
|
|
** SIG ** NTk1OVowXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
|
|
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
|
|
** SIG ** bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
|
|
** SIG ** RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
|
** SIG ** AQCxrLNJVEuXHBIK2CV5kSJXKm/cuCbEQ3Nrwr8uUFr7
|
|
** SIG ** FMJ2jkMBJUO0oeJF9Oi3e8N0zCLXtJQAAvdN7b+0t0Qk
|
|
** SIG ** a81fRTvRRM5DEnMXgotptCvLmR6schsmTXEfsTHd+1Fh
|
|
** SIG ** AlOmqvVJLAV4RaUvic7nmef+jOJXPz3GktxK+Hsz5HkK
|
|
** SIG ** +/B1iEGc/8UDUZmq12yfk2mHZSmDhcJgFMTIyTsU2sCB
|
|
** SIG ** 8B8NdN6SIqvK9/t0fCfm90obf6fDni2uiuqm5qonFn1h
|
|
** SIG ** 95hxEbziUKFL5V365Q6nLJ+qZSDT2JboyHylTkhE/xni
|
|
** SIG ** RAeSC9dohIBdanhkRc1gRn5UwRN8xXnxycFxAgMBAAGj
|
|
** SIG ** gfowgfcwHQYDVR0OBBYEFF+a9W5czMx0mtTdfe8/2+xM
|
|
** SIG ** gC7dMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW
|
|
** SIG ** aHR0cDovL29jc3AudGhhd3RlLmNvbTASBgNVHRMBAf8E
|
|
** SIG ** CDAGAQH/AgEAMD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6
|
|
** SIG ** Ly9jcmwudGhhd3RlLmNvbS9UaGF3dGVUaW1lc3RhbXBp
|
|
** SIG ** bmdDQS5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDgYD
|
|
** SIG ** VR0PAQH/BAQDAgEGMCgGA1UdEQQhMB+kHTAbMRkwFwYD
|
|
** SIG ** VQQDExBUaW1lU3RhbXAtMjA0OC0xMA0GCSqGSIb3DQEB
|
|
** SIG ** BQUAA4GBAAMJm495739ZMKrvaLX64wkdu0+CBl03X6ZS
|
|
** SIG ** nxaN6hySCURu9W3rWHww6PlpjSNzCxJvR6muORH4KrGb
|
|
** SIG ** sBrDjutZlgCtzgxNstAxpghcKnr84nodV0yoZRjpeUBi
|
|
** SIG ** JZZux8c3aoMhCI5B6t3ZVz8dd0mHKhYGXqY4aiISo1EZ
|
|
** SIG ** g362MIIEozCCA4ugAwIBAgIQDs/0OMj+vzVuBNhqmBsa
|
|
** SIG ** UDANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQGEwJVUzEd
|
|
** SIG ** MBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xMDAu
|
|
** SIG ** BgNVBAMTJ1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2Vy
|
|
** SIG ** dmljZXMgQ0EgLSBHMjAeFw0xMjEwMTgwMDAwMDBaFw0y
|
|
** SIG ** MDEyMjkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMR0wGwYD
|
|
** SIG ** VQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjE0MDIGA1UE
|
|
** SIG ** AxMrU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNl
|
|
** SIG ** cyBTaWduZXIgLSBHNDCCASIwDQYJKoZIhvcNAQEBBQAD
|
|
** SIG ** ggEPADCCAQoCggEBAKJjCzlEuLsjp0RJuw7/ofBhClOT
|
|
** SIG ** sJjbrSwPSsVu/4Y8U1UPFc4EPyv9qZaW2b5heQtbyUyG
|
|
** SIG ** duXgQ0sile7CK0PBn9hotI5AT+6FOLkRxSPyZFjwFTJv
|
|
** SIG ** TlehroikAtcqHs1L4d1j1ReJMluwXplaqJ0oUA4X7pbb
|
|
** SIG ** YTtFUR3PElYLkkf8q672Zj1HrHBy55LnX80QucSDZJQZ
|
|
** SIG ** vSWA4ejSIqXQugJ6oXeTW2XD7hd0vEGGKtwITIySjJEt
|
|
** SIG ** nndEH2jWqHR32w5bMotWizO92WPISZ06xcXqMwvS8aMb
|
|
** SIG ** 9Iu+2bNXizveBKd6IrIkri7HcMW+ToMmCPsLvalPmQjh
|
|
** SIG ** EChyqs0CAwEAAaOCAVcwggFTMAwGA1UdEwEB/wQCMAAw
|
|
** SIG ** FgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/
|
|
** SIG ** BAQDAgeAMHMGCCsGAQUFBwEBBGcwZTAqBggrBgEFBQcw
|
|
** SIG ** AYYeaHR0cDovL3RzLW9jc3Aud3Muc3ltYW50ZWMuY29t
|
|
** SIG ** MDcGCCsGAQUFBzAChitodHRwOi8vdHMtYWlhLndzLnN5
|
|
** SIG ** bWFudGVjLmNvbS90c3MtY2EtZzIuY2VyMDwGA1UdHwQ1
|
|
** SIG ** MDMwMaAvoC2GK2h0dHA6Ly90cy1jcmwud3Muc3ltYW50
|
|
** SIG ** ZWMuY29tL3Rzcy1jYS1nMi5jcmwwKAYDVR0RBCEwH6Qd
|
|
** SIG ** MBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTIwHQYD
|
|
** SIG ** VR0OBBYEFEbGaaMOShQe1UzaUmMXP142vA3mMB8GA1Ud
|
|
** SIG ** IwQYMBaAFF+a9W5czMx0mtTdfe8/2+xMgC7dMA0GCSqG
|
|
** SIG ** SIb3DQEBBQUAA4IBAQB4O7SRKgBM8I9iMDd4o4QnB28Y
|
|
** SIG ** st4l3KDUlAOqhk4ln5pAAxzdzuN5yyFoBtq2MrRtv/Qs
|
|
** SIG ** JmMz5ElkbQ3mw2cO9wWkNWx8iRbG6bLfsundIMZxD82V
|
|
** SIG ** dNy2XN69Nx9DeOZ4tc0oBCCjqvFLxIgpkQ6A0RH83Vx2
|
|
** SIG ** bk9eDkVGQW4NsOo4mrE62glxEPwcebSAe6xp9P2ctgwW
|
|
** SIG ** K/F/Wwk9m1viFsoTgW0ALjgNqCmPLOGy9FqpAa8VnCwv
|
|
** SIG ** SRvbIrvD/niUUcOGsYKIXfA9tFGheTMrLnu53CAJE3Hr
|
|
** SIG ** ahlbz+ilMFcsiUk/uc9/yb8+ImhjU5q9aXSsxR08f5Lg
|
|
** SIG ** w7wc2AR1MIIEzjCCA7agAwIBAgIQMHo2eqo+aIGm+U8I
|
|
** SIG ** yzs5ZDANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
|
|
** SIG ** UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
|
|
** SIG ** HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
|
|
** SIG ** MDAuBgNVBAMTJ1N5bWFudGVjIENsYXNzIDMgU0hBMjU2
|
|
** SIG ** IENvZGUgU2lnbmluZyBDQTAeFw0xNTEwMDkwMDAwMDBa
|
|
** SIG ** Fw0xODExMDcyMzU5NTlaMGExCzAJBgNVBAYTAlNJMREw
|
|
** SIG ** DwYDVQQIEwhTbG92ZW5pYTEPMA0GA1UEBxMGS2Ftbmlr
|
|
** SIG ** MRYwFAYDVQQKFA1BbWViaXMgZC5vLm8uMRYwFAYDVQQD
|
|
** SIG ** FA1BbWViaXMgZC5vLm8uMIIBIjANBgkqhkiG9w0BAQEF
|
|
** SIG ** AAOCAQ8AMIIBCgKCAQEAl/LoF3DHaSrIaG1pgBmBwDyl
|
|
** SIG ** Yt7sRvIuoEdGr/yMhV9RfUIft+xsTPVQOAirvgG+KUbc
|
|
** SIG ** E3KMnGH+VuK7Y+vYzRp3dYTLinSQz1NKYAELyTdVzmmY
|
|
** SIG ** mU3LX764yk3ABtSZsZwPoiCy+TXE9ZsCkugB2c7Qp9N/
|
|
** SIG ** O9EjjQDRwZlUa3nLoY96Y3qNPwkCn04ppYiqPeIXTRz8
|
|
** SIG ** XBLs4Nl/bD9wymEuNSV75vzobJ7BUYQwRU7lmNL2SwRY
|
|
** SIG ** ENaf0DpdiyFLBsNafHjGYiXQHgNxZUBpj7OoRDNBvMQY
|
|
** SIG ** L+LM8OrjhGIK1uGL5CqBD/p81ebeFsAZVxg9hrgnkPVQ
|
|
** SIG ** w77U0LZw8wIDAQABo4IBYjCCAV4wCQYDVR0TBAIwADAO
|
|
** SIG ** BgNVHQ8BAf8EBAMCB4AwKwYDVR0fBCQwIjAgoB6gHIYa
|
|
** SIG ** aHR0cDovL3N2LnN5bWNiLmNvbS9zdi5jcmwwZgYDVR0g
|
|
** SIG ** BF8wXTBbBgtghkgBhvhFAQcXAzBMMCMGCCsGAQUFBwIB
|
|
** SIG ** FhdodHRwczovL2Quc3ltY2IuY29tL2NwczAlBggrBgEF
|
|
** SIG ** BQcCAjAZDBdodHRwczovL2Quc3ltY2IuY29tL3JwYTAT
|
|
** SIG ** BgNVHSUEDDAKBggrBgEFBQcDAzBXBggrBgEFBQcBAQRL
|
|
** SIG ** MEkwHwYIKwYBBQUHMAGGE2h0dHA6Ly9zdi5zeW1jZC5j
|
|
** SIG ** b20wJgYIKwYBBQUHMAKGGmh0dHA6Ly9zdi5zeW1jYi5j
|
|
** SIG ** b20vc3YuY3J0MB8GA1UdIwQYMBaAFJY7U/B5M5evfYPv
|
|
** SIG ** LivMyreGHnJmMB0GA1UdDgQWBBT3B72WgJotdMR/DD09
|
|
** SIG ** J93UkAqfzDANBgkqhkiG9w0BAQsFAAOCAQEAinEvQC+1
|
|
** SIG ** yttKEsqAjt2YufpYlul3OQH17YKbUy4AAiKiAsUXWfTu
|
|
** SIG ** XRVdkT6CrEYcHyOLaHfe36jVHw8vLIiR2cyEcB3vweyr
|
|
** SIG ** JnNpt+Za4I/XZMoG/vvCJmSltOj8C/7PRKWklGgynPNe
|
|
** SIG ** HI8+0d1vLzRtK77hFeV7CIMIfnpoYThJKTSLxdr0kn+j
|
|
** SIG ** M8otfdLN2aDonnxe0Mf+2rkrX8AFIIHPpIXZj2X2VEmk
|
|
** SIG ** ZdyFINgI+KlJVQY/RY9BFMM2htLAIkNcDP1QVzFajhGH
|
|
** SIG ** yj+C+UtZQf5PceGYtJHNeq3cm6omjnEfyzi8/NwYFlkW
|
|
** SIG ** hvzJEH3woPqKgUramNFFLD0W5zCCBVkwggRBoAMCAQIC
|
|
** SIG ** ED141/l2SWCyYX308B7KhiowDQYJKoZIhvcNAQELBQAw
|
|
** SIG ** gcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2ln
|
|
** SIG ** biwgSW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3Qg
|
|
** SIG ** TmV0d29yazE6MDgGA1UECxMxKGMpIDIwMDYgVmVyaVNp
|
|
** SIG ** Z24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
|
** SIG ** eTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMyBQdWJs
|
|
** SIG ** aWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
|
|
** SIG ** eSAtIEc1MB4XDTEzMTIxMDAwMDAwMFoXDTIzMTIwOTIz
|
|
** SIG ** NTk1OVowfzELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
|
|
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1h
|
|
** SIG ** bnRlYyBUcnVzdCBOZXR3b3JrMTAwLgYDVQQDEydTeW1h
|
|
** SIG ** bnRlYyBDbGFzcyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcg
|
|
** SIG ** Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
|
|
** SIG ** AQCXgx4AFq8ssdIIxNdok1FgHnH24ke021hNI2JqtL9a
|
|
** SIG ** G1H3ow0Yd2i72DarLyFQ2p7z518nTgvCl8gJcJOp2lwN
|
|
** SIG ** TqQNkaC07BTOkXJULs6j20TpUhs/QTzKSuSqwOg5q1PM
|
|
** SIG ** IdDMz3+b5sLMWGqCFe49Ns8cxZcHJI7xe74xLT1u3LWZ
|
|
** SIG ** Qp9LYZVfHHDuF33bi+VhiXjHaBuvEXgamK7EVUdT2bMy
|
|
** SIG ** 1qEORkDFl5KK0VOnmVuFNVfT6pNiYSAKxzB3JBFNYoO2
|
|
** SIG ** untogjHuZcrf+dWNsjXcjCtvanJcYISc8gyUXsBWUgBI
|
|
** SIG ** zNP4pX3eL9cT5DiohNVGuBOGwhud6lo43ZvbAgMBAAGj
|
|
** SIG ** ggGDMIIBfzAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUH
|
|
** SIG ** MAGGE2h0dHA6Ly9zMi5zeW1jYi5jb20wEgYDVR0TAQH/
|
|
** SIG ** BAgwBgEB/wIBADBsBgNVHSAEZTBjMGEGC2CGSAGG+EUB
|
|
** SIG ** BxcDMFIwJgYIKwYBBQUHAgEWGmh0dHA6Ly93d3cuc3lt
|
|
** SIG ** YXV0aC5jb20vY3BzMCgGCCsGAQUFBwICMBwaGmh0dHA6
|
|
** SIG ** Ly93d3cuc3ltYXV0aC5jb20vcnBhMDAGA1UdHwQpMCcw
|
|
** SIG ** JaAjoCGGH2h0dHA6Ly9zMS5zeW1jYi5jb20vcGNhMy1n
|
|
** SIG ** NS5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUF
|
|
** SIG ** BwMDMA4GA1UdDwEB/wQEAwIBBjApBgNVHREEIjAgpB4w
|
|
** SIG ** HDEaMBgGA1UEAxMRU3ltYW50ZWNQS0ktMS01NjcwHQYD
|
|
** SIG ** VR0OBBYEFJY7U/B5M5evfYPvLivMyreGHnJmMB8GA1Ud
|
|
** SIG ** IwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
|
|
** SIG ** SIb3DQEBCwUAA4IBAQAThRoeaak396C9pK9+HWFT/p2M
|
|
** SIG ** XgymdR54FyPd/ewaA1U5+3GVx2Vap44w0kRaYdtwb9oh
|
|
** SIG ** BcIuc7pJ8dGT/l3JzV4D4ImeP3Qe1/c4i6nWz7s1LzNY
|
|
** SIG ** qJJW0chNO4LmeYQW/CiwsUfzHaI+7ofZpn+kVqU/rYQu
|
|
** SIG ** Kd58vKiqoz0EAeq6k6IOUCIpF0yH5DoRX9akJYmbBWsv
|
|
** SIG ** tMkBTCd7C6wZBSKgYBU/2sn7TUyP+3Jnd/0nlMe6NQ6I
|
|
** SIG ** Sf6N/SivShK9DbOXBd5EDBX6NisD3MFQAfGhEV0U5eK9
|
|
** SIG ** J0tUviuEXg+mw3QFCu+Xw4kisR93873NQ9TxTKk/tYuE
|
|
** SIG ** r2Ty0BQhMYIEPDCCBDgCAQEwgZMwfzELMAkGA1UEBhMC
|
|
** SIG ** VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
|
|
** SIG ** MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
|
|
** SIG ** MTAwLgYDVQQDEydTeW1hbnRlYyBDbGFzcyAzIFNIQTI1
|
|
** SIG ** NiBDb2RlIFNpZ25pbmcgQ0ECEDB6NnqqPmiBpvlPCMs7
|
|
** SIG ** OWQwCQYFKw4DAhoFAKBwMBAGCisGAQQBgjcCAQwxAjAA
|
|
** SIG ** MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
|
|
** SIG ** AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3
|
|
** SIG ** DQEJBDEWBBTEyFRcyI6lfQmmYwVcQ2dEWSxabTANBgkq
|
|
** SIG ** hkiG9w0BAQEFAASCAQB3VnaU6G7rLgFxRHbsRL8X0Jy4
|
|
** SIG ** mmmXTZb/bDh6i7mtDHv1RpByWBgIVyf4nKW7YoixSZa6
|
|
** SIG ** RWLhfNP7i3xpiNw7iRQ3PVFV4kAbKID+XkpJJfS8K/YQ
|
|
** SIG ** y2nsd9sPyUbyEhGy4aQ+StmpbF02yIfmROUrrzDoeWel
|
|
** SIG ** q6t9+ub6uHyZW03p1Cb9E8A35WQ4OHUo9Xpwo69zfu95
|
|
** SIG ** vXrAl4geLepmR6LA/lS06C8Vtbia9AxPdh1Qu6sU6ZBV
|
|
** SIG ** j7YqeLdrCyfNV1nlZh00Bk30GGv++p/ihwdupwyml5eR
|
|
** SIG ** 1QbRhY5ayOFRjGWWF3tUIHw9uQ06uXk8BhsIozqQYn+H
|
|
** SIG ** UcqciTq6oYICCzCCAgcGCSqGSIb3DQEJBjGCAfgwggH0
|
|
** SIG ** AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5
|
|
** SIG ** bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1h
|
|
** SIG ** bnRlYyBUaW1lIFN0YW1waW5nIFNlcnZpY2VzIENBIC0g
|
|
** SIG ** RzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBd
|
|
** SIG ** MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZI
|
|
** SIG ** hvcNAQkFMQ8XDTE2MDkyNjEwNDk1MVowIwYJKoZIhvcN
|
|
** SIG ** AQkEMRYEFPVZb/ODAnCdILDoYByrbhNLBPmIMA0GCSqG
|
|
** SIG ** SIb3DQEBAQUABIIBAEJaBvMu9UhdK4QKhz5ijKW068W+
|
|
** SIG ** gtPfnzTWtqpXhGRzFe1d+0R0AntvfUB77I2DnREz7+d5
|
|
** SIG ** u27R0y+xfrPjkkdrPalDWFCQc34p5LNpXruQt57qahhk
|
|
** SIG ** SKT2qwrDyCtH5JHS/qlCEYvBjkt6t9k9CR8vQNv/L2Ys
|
|
** SIG ** zDSI/VzYscm6RhfuYQetIs/EMdIbGyKTr/2bARbfuXWC
|
|
** SIG ** NoniU1cMTATY20tAeQZLOJraPr+tU81AOc8/LFOs9bzo
|
|
** SIG ** xcloLqIvqlKqn8yODQuunWqDoAQw7br8mB9FE0j6AzHw
|
|
** SIG ** y1LZh2+Ll9yEBYc1LkQXwY2L2jp6aoPSQdTwDCwHJ45V
|
|
** SIG ** eE3nzs8=
|
|
</signature>
|
|
</package>
|