@swmansion/argent 0.29.1-next.12 → 0.29.1-next.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli-cmds.mjs +1 -1
- package/dist/installer.mjs +1 -1
- package/dist/tool-server.cjs +373 -205
- package/package.json +1 -1
package/dist/tool-server.cjs
CHANGED
|
@@ -41931,11 +41931,11 @@ var require_parse = __commonJS({
|
|
|
41931
41931
|
segments[segments.length] = parent;
|
|
41932
41932
|
}
|
|
41933
41933
|
var n = key2.length;
|
|
41934
|
-
var
|
|
41934
|
+
var open4 = first;
|
|
41935
41935
|
var collected = 0;
|
|
41936
|
-
while (
|
|
41936
|
+
while (open4 >= 0 && collected < options.depth) {
|
|
41937
41937
|
var level = 1;
|
|
41938
|
-
var i =
|
|
41938
|
+
var i = open4 + 1;
|
|
41939
41939
|
var close = -1;
|
|
41940
41940
|
while (i < n && close < 0) {
|
|
41941
41941
|
var cu = key2.charCodeAt(i);
|
|
@@ -41950,23 +41950,23 @@ var require_parse = __commonJS({
|
|
|
41950
41950
|
i += 1;
|
|
41951
41951
|
}
|
|
41952
41952
|
if (close < 0) {
|
|
41953
|
-
segments[segments.length] = "[" + key2.slice(
|
|
41953
|
+
segments[segments.length] = "[" + key2.slice(open4) + "]";
|
|
41954
41954
|
return segments;
|
|
41955
41955
|
}
|
|
41956
|
-
var seg = key2.slice(
|
|
41956
|
+
var seg = key2.slice(open4, close + 1);
|
|
41957
41957
|
var content = seg.slice(1, -1);
|
|
41958
41958
|
if (!options.plainObjects && has.call(Object.prototype, content) && !options.allowPrototypes) {
|
|
41959
41959
|
return;
|
|
41960
41960
|
}
|
|
41961
41961
|
segments[segments.length] = seg;
|
|
41962
41962
|
collected += 1;
|
|
41963
|
-
|
|
41963
|
+
open4 = key2.indexOf("[", close + 1);
|
|
41964
41964
|
}
|
|
41965
|
-
if (
|
|
41965
|
+
if (open4 >= 0) {
|
|
41966
41966
|
if (options.strictDepth === true) {
|
|
41967
41967
|
throw new RangeError("Input depth exceeded depth option of " + options.depth + " and strictDepth is true");
|
|
41968
41968
|
}
|
|
41969
|
-
segments[segments.length] = "[" + key2.slice(
|
|
41969
|
+
segments[segments.length] = "[" + key2.slice(open4) + "]";
|
|
41970
41970
|
}
|
|
41971
41971
|
return segments;
|
|
41972
41972
|
};
|
|
@@ -42474,7 +42474,7 @@ var require_view = __commonJS({
|
|
|
42474
42474
|
var dirname19 = path53.dirname;
|
|
42475
42475
|
var basename14 = path53.basename;
|
|
42476
42476
|
var extname6 = path53.extname;
|
|
42477
|
-
var
|
|
42477
|
+
var join56 = path53.join;
|
|
42478
42478
|
var resolve15 = path53.resolve;
|
|
42479
42479
|
module2.exports = View;
|
|
42480
42480
|
function View(name, options) {
|
|
@@ -42536,14 +42536,14 @@ var require_view = __commonJS({
|
|
|
42536
42536
|
};
|
|
42537
42537
|
View.prototype.resolve = function resolve16(dir, file2) {
|
|
42538
42538
|
var ext = this.ext;
|
|
42539
|
-
var path54 =
|
|
42540
|
-
var
|
|
42541
|
-
if (
|
|
42539
|
+
var path54 = join56(dir, file2);
|
|
42540
|
+
var stat7 = tryStat(path54);
|
|
42541
|
+
if (stat7 && stat7.isFile()) {
|
|
42542
42542
|
return path54;
|
|
42543
42543
|
}
|
|
42544
|
-
path54 =
|
|
42545
|
-
|
|
42546
|
-
if (
|
|
42544
|
+
path54 = join56(dir, basename14(file2, ext), "index" + ext);
|
|
42545
|
+
stat7 = tryStat(path54);
|
|
42546
|
+
if (stat7 && stat7.isFile()) {
|
|
42547
42547
|
return path54;
|
|
42548
42548
|
}
|
|
42549
42549
|
};
|
|
@@ -42696,9 +42696,9 @@ var require_etag = __commonJS({
|
|
|
42696
42696
|
}
|
|
42697
42697
|
return obj && typeof obj === "object" && "ctime" in obj && toString.call(obj.ctime) === "[object Date]" && "mtime" in obj && toString.call(obj.mtime) === "[object Date]" && "ino" in obj && typeof obj.ino === "number" && "size" in obj && typeof obj.size === "number";
|
|
42698
42698
|
}
|
|
42699
|
-
function stattag(
|
|
42700
|
-
var mtime =
|
|
42701
|
-
var size =
|
|
42699
|
+
function stattag(stat7) {
|
|
42700
|
+
var mtime = stat7.mtime.getTime().toString(16);
|
|
42701
|
+
var size = stat7.size.toString(16);
|
|
42702
42702
|
return '"' + size + "-" + mtime + '"';
|
|
42703
42703
|
}
|
|
42704
42704
|
}
|
|
@@ -74865,7 +74865,7 @@ var require_send = __commonJS({
|
|
|
74865
74865
|
var Stream2 = require("stream");
|
|
74866
74866
|
var util = require("util");
|
|
74867
74867
|
var extname6 = path53.extname;
|
|
74868
|
-
var
|
|
74868
|
+
var join56 = path53.join;
|
|
74869
74869
|
var normalize = path53.normalize;
|
|
74870
74870
|
var resolve15 = path53.resolve;
|
|
74871
74871
|
var sep5 = path53.sep;
|
|
@@ -75037,7 +75037,7 @@ var require_send = __commonJS({
|
|
|
75037
75037
|
return res;
|
|
75038
75038
|
}
|
|
75039
75039
|
parts2 = path54.split(sep5);
|
|
75040
|
-
path54 = normalize(
|
|
75040
|
+
path54 = normalize(join56(root, path54));
|
|
75041
75041
|
} else {
|
|
75042
75042
|
if (UP_PATH_REGEXP.test(path54)) {
|
|
75043
75043
|
debug('malicious path "%s"', path54);
|
|
@@ -75068,8 +75068,8 @@ var require_send = __commonJS({
|
|
|
75068
75068
|
this.sendFile(path54);
|
|
75069
75069
|
return res;
|
|
75070
75070
|
};
|
|
75071
|
-
SendStream.prototype.send = function send2(path54,
|
|
75072
|
-
var len =
|
|
75071
|
+
SendStream.prototype.send = function send2(path54, stat7) {
|
|
75072
|
+
var len = stat7.size;
|
|
75073
75073
|
var options = this.options;
|
|
75074
75074
|
var opts = {};
|
|
75075
75075
|
var res = this.res;
|
|
@@ -75081,7 +75081,7 @@ var require_send = __commonJS({
|
|
|
75081
75081
|
return;
|
|
75082
75082
|
}
|
|
75083
75083
|
debug('pipe "%s"', path54);
|
|
75084
|
-
this.setHeader(path54,
|
|
75084
|
+
this.setHeader(path54, stat7);
|
|
75085
75085
|
this.type(path54);
|
|
75086
75086
|
if (this.isConditionalGET()) {
|
|
75087
75087
|
if (this.isPreconditionFailure()) {
|
|
@@ -75137,16 +75137,16 @@ var require_send = __commonJS({
|
|
|
75137
75137
|
var i = 0;
|
|
75138
75138
|
var self2 = this;
|
|
75139
75139
|
debug('stat "%s"', path54);
|
|
75140
|
-
fs69.stat(path54, function onstat(err,
|
|
75140
|
+
fs69.stat(path54, function onstat(err, stat7) {
|
|
75141
75141
|
var pathEndsWithSep = path54[path54.length - 1] === sep5;
|
|
75142
75142
|
if (err && err.code === "ENOENT" && !extname6(path54) && !pathEndsWithSep) {
|
|
75143
75143
|
return next(err);
|
|
75144
75144
|
}
|
|
75145
75145
|
if (err) return self2.onStatError(err);
|
|
75146
|
-
if (
|
|
75146
|
+
if (stat7.isDirectory()) return self2.redirect(path54);
|
|
75147
75147
|
if (pathEndsWithSep) return self2.error(404);
|
|
75148
|
-
self2.emit("file", path54,
|
|
75149
|
-
self2.send(path54,
|
|
75148
|
+
self2.emit("file", path54, stat7);
|
|
75149
|
+
self2.send(path54, stat7);
|
|
75150
75150
|
});
|
|
75151
75151
|
function next(err) {
|
|
75152
75152
|
if (self2._extensions.length <= i) {
|
|
@@ -75154,11 +75154,11 @@ var require_send = __commonJS({
|
|
|
75154
75154
|
}
|
|
75155
75155
|
var p = path54 + "." + self2._extensions[i++];
|
|
75156
75156
|
debug('stat "%s"', p);
|
|
75157
|
-
fs69.stat(p, function(err2,
|
|
75157
|
+
fs69.stat(p, function(err2, stat7) {
|
|
75158
75158
|
if (err2) return next(err2);
|
|
75159
|
-
if (
|
|
75160
|
-
self2.emit("file", p,
|
|
75161
|
-
self2.send(p,
|
|
75159
|
+
if (stat7.isDirectory()) return next();
|
|
75160
|
+
self2.emit("file", p, stat7);
|
|
75161
|
+
self2.send(p, stat7);
|
|
75162
75162
|
});
|
|
75163
75163
|
}
|
|
75164
75164
|
};
|
|
@@ -75170,13 +75170,13 @@ var require_send = __commonJS({
|
|
|
75170
75170
|
if (err) return self2.onStatError(err);
|
|
75171
75171
|
return self2.error(404);
|
|
75172
75172
|
}
|
|
75173
|
-
var p =
|
|
75173
|
+
var p = join56(path54, self2._index[i]);
|
|
75174
75174
|
debug('stat "%s"', p);
|
|
75175
|
-
fs69.stat(p, function(err2,
|
|
75175
|
+
fs69.stat(p, function(err2, stat7) {
|
|
75176
75176
|
if (err2) return next(err2);
|
|
75177
|
-
if (
|
|
75178
|
-
self2.emit("file", p,
|
|
75179
|
-
self2.send(p,
|
|
75177
|
+
if (stat7.isDirectory()) return next();
|
|
75178
|
+
self2.emit("file", p, stat7);
|
|
75179
|
+
self2.send(p, stat7);
|
|
75180
75180
|
});
|
|
75181
75181
|
}
|
|
75182
75182
|
next();
|
|
@@ -75207,9 +75207,9 @@ var require_send = __commonJS({
|
|
|
75207
75207
|
debug("content-type %s", type2);
|
|
75208
75208
|
res.setHeader("Content-Type", type2);
|
|
75209
75209
|
};
|
|
75210
|
-
SendStream.prototype.setHeader = function setHeader(path54,
|
|
75210
|
+
SendStream.prototype.setHeader = function setHeader(path54, stat7) {
|
|
75211
75211
|
var res = this.res;
|
|
75212
|
-
this.emit("headers", res, path54,
|
|
75212
|
+
this.emit("headers", res, path54, stat7);
|
|
75213
75213
|
if (this._acceptRanges && !res.getHeader("Accept-Ranges")) {
|
|
75214
75214
|
debug("accept ranges");
|
|
75215
75215
|
res.setHeader("Accept-Ranges", "bytes");
|
|
@@ -75223,12 +75223,12 @@ var require_send = __commonJS({
|
|
|
75223
75223
|
res.setHeader("Cache-Control", cacheControl);
|
|
75224
75224
|
}
|
|
75225
75225
|
if (this._lastModified && !res.getHeader("Last-Modified")) {
|
|
75226
|
-
var modified =
|
|
75226
|
+
var modified = stat7.mtime.toUTCString();
|
|
75227
75227
|
debug("modified %s", modified);
|
|
75228
75228
|
res.setHeader("Last-Modified", modified);
|
|
75229
75229
|
}
|
|
75230
75230
|
if (this._etag && !res.getHeader("ETag")) {
|
|
75231
|
-
var val = etag(
|
|
75231
|
+
var val = etag(stat7);
|
|
75232
75232
|
debug("etag %s", val);
|
|
75233
75233
|
res.setHeader("ETag", val);
|
|
75234
75234
|
}
|
|
@@ -82265,7 +82265,7 @@ var require_stream = __commonJS({
|
|
|
82265
82265
|
};
|
|
82266
82266
|
duplex._final = function(callback) {
|
|
82267
82267
|
if (ws.readyState === ws.CONNECTING) {
|
|
82268
|
-
ws.once("open", function
|
|
82268
|
+
ws.once("open", function open4() {
|
|
82269
82269
|
duplex._final(callback);
|
|
82270
82270
|
});
|
|
82271
82271
|
return;
|
|
@@ -82286,7 +82286,7 @@ var require_stream = __commonJS({
|
|
|
82286
82286
|
};
|
|
82287
82287
|
duplex._write = function(chunk, encoding, callback) {
|
|
82288
82288
|
if (ws.readyState === ws.CONNECTING) {
|
|
82289
|
-
ws.once("open", function
|
|
82289
|
+
ws.once("open", function open4() {
|
|
82290
82290
|
duplex._write(chunk, encoding, callback);
|
|
82291
82291
|
});
|
|
82292
82292
|
return;
|
|
@@ -83355,14 +83355,14 @@ async function resolveAvdPath(avdName) {
|
|
|
83355
83355
|
return null;
|
|
83356
83356
|
}
|
|
83357
83357
|
async function hasDefaultBootSnapshot(avdName) {
|
|
83358
|
-
const { stat:
|
|
83358
|
+
const { stat: stat7 } = await import("node:fs/promises");
|
|
83359
83359
|
const avdPath = await resolveAvdPath(avdName);
|
|
83360
83360
|
if (!avdPath) return false;
|
|
83361
83361
|
const snapshotPath = `${avdPath}/snapshots/default_boot`;
|
|
83362
83362
|
try {
|
|
83363
83363
|
const [metaStat, ramStat] = await Promise.all([
|
|
83364
|
-
|
|
83365
|
-
|
|
83364
|
+
stat7(`${snapshotPath}/snapshot.pb`),
|
|
83365
|
+
stat7(`${snapshotPath}/ram.bin`)
|
|
83366
83366
|
]);
|
|
83367
83367
|
if (!metaStat.isFile()) return false;
|
|
83368
83368
|
if (!ramStat.isFile() || ramStat.size === 0) return false;
|
|
@@ -83503,14 +83503,14 @@ var require_ncp = __commonJS({
|
|
|
83503
83503
|
return getStats(source2);
|
|
83504
83504
|
}
|
|
83505
83505
|
function getStats(source2) {
|
|
83506
|
-
var
|
|
83506
|
+
var stat7 = dereference ? fs69.stat : fs69.lstat;
|
|
83507
83507
|
if (running >= limit) {
|
|
83508
83508
|
return setImmediate(function() {
|
|
83509
83509
|
getStats(source2);
|
|
83510
83510
|
});
|
|
83511
83511
|
}
|
|
83512
83512
|
running++;
|
|
83513
|
-
|
|
83513
|
+
stat7(source2, function(err, stats) {
|
|
83514
83514
|
var item = {};
|
|
83515
83515
|
if (err) {
|
|
83516
83516
|
return onError(err);
|
|
@@ -83543,8 +83543,8 @@ var require_ncp = __commonJS({
|
|
|
83543
83543
|
});
|
|
83544
83544
|
}
|
|
83545
83545
|
if (modified) {
|
|
83546
|
-
var
|
|
83547
|
-
|
|
83546
|
+
var stat7 = dereference ? fs69.stat : fs69.lstat;
|
|
83547
|
+
stat7(target, function(err, stats) {
|
|
83548
83548
|
if (file2.mtime.getTime() > stats.mtime.getTime())
|
|
83549
83549
|
copyFile(file2, target);
|
|
83550
83550
|
else return cb();
|
|
@@ -84961,7 +84961,7 @@ var require_sync = __commonJS({
|
|
|
84961
84961
|
return this._readdir(abs, false);
|
|
84962
84962
|
var entries;
|
|
84963
84963
|
var lstat;
|
|
84964
|
-
var
|
|
84964
|
+
var stat7;
|
|
84965
84965
|
try {
|
|
84966
84966
|
lstat = fs69.lstatSync(abs);
|
|
84967
84967
|
} catch (er) {
|
|
@@ -85087,8 +85087,8 @@ var require_sync = __commonJS({
|
|
|
85087
85087
|
return false;
|
|
85088
85088
|
}
|
|
85089
85089
|
var exists2;
|
|
85090
|
-
var
|
|
85091
|
-
if (!
|
|
85090
|
+
var stat7 = this.statCache[abs];
|
|
85091
|
+
if (!stat7) {
|
|
85092
85092
|
var lstat;
|
|
85093
85093
|
try {
|
|
85094
85094
|
lstat = fs69.lstatSync(abs);
|
|
@@ -85097,16 +85097,16 @@ var require_sync = __commonJS({
|
|
|
85097
85097
|
}
|
|
85098
85098
|
if (lstat.isSymbolicLink()) {
|
|
85099
85099
|
try {
|
|
85100
|
-
|
|
85100
|
+
stat7 = fs69.statSync(abs);
|
|
85101
85101
|
} catch (er) {
|
|
85102
|
-
|
|
85102
|
+
stat7 = lstat;
|
|
85103
85103
|
}
|
|
85104
85104
|
} else {
|
|
85105
|
-
|
|
85105
|
+
stat7 = lstat;
|
|
85106
85106
|
}
|
|
85107
85107
|
}
|
|
85108
|
-
this.statCache[abs] =
|
|
85109
|
-
var c =
|
|
85108
|
+
this.statCache[abs] = stat7;
|
|
85109
|
+
var c = stat7.isDirectory() ? "DIR" : "FILE";
|
|
85110
85110
|
this.cache[abs] = this.cache[abs] || c;
|
|
85111
85111
|
if (needDir && c !== "DIR")
|
|
85112
85112
|
return false;
|
|
@@ -85655,16 +85655,16 @@ var require_glob = __commonJS({
|
|
|
85655
85655
|
return cb();
|
|
85656
85656
|
}
|
|
85657
85657
|
var exists2;
|
|
85658
|
-
var
|
|
85659
|
-
if (
|
|
85660
|
-
if (
|
|
85661
|
-
return cb(null,
|
|
85658
|
+
var stat7 = this.statCache[abs];
|
|
85659
|
+
if (stat7 !== void 0) {
|
|
85660
|
+
if (stat7 === false)
|
|
85661
|
+
return cb(null, stat7);
|
|
85662
85662
|
else {
|
|
85663
|
-
var type =
|
|
85663
|
+
var type = stat7.isDirectory() ? "DIR" : "FILE";
|
|
85664
85664
|
if (needDir && type === "FILE")
|
|
85665
85665
|
return cb();
|
|
85666
85666
|
else
|
|
85667
|
-
return cb(null, type,
|
|
85667
|
+
return cb(null, type, stat7);
|
|
85668
85668
|
}
|
|
85669
85669
|
}
|
|
85670
85670
|
var self2 = this;
|
|
@@ -85673,31 +85673,31 @@ var require_glob = __commonJS({
|
|
|
85673
85673
|
fs69.lstat(abs, statcb);
|
|
85674
85674
|
function lstatcb_(er, lstat) {
|
|
85675
85675
|
if (lstat && lstat.isSymbolicLink()) {
|
|
85676
|
-
return fs69.stat(abs, function(er2,
|
|
85676
|
+
return fs69.stat(abs, function(er2, stat8) {
|
|
85677
85677
|
if (er2)
|
|
85678
85678
|
self2._stat2(f, abs, null, lstat, cb);
|
|
85679
85679
|
else
|
|
85680
|
-
self2._stat2(f, abs, er2,
|
|
85680
|
+
self2._stat2(f, abs, er2, stat8, cb);
|
|
85681
85681
|
});
|
|
85682
85682
|
} else {
|
|
85683
85683
|
self2._stat2(f, abs, er, lstat, cb);
|
|
85684
85684
|
}
|
|
85685
85685
|
}
|
|
85686
85686
|
};
|
|
85687
|
-
Glob.prototype._stat2 = function(f, abs, er,
|
|
85687
|
+
Glob.prototype._stat2 = function(f, abs, er, stat7, cb) {
|
|
85688
85688
|
if (er) {
|
|
85689
85689
|
this.statCache[abs] = false;
|
|
85690
85690
|
return cb();
|
|
85691
85691
|
}
|
|
85692
85692
|
var needDir = f.slice(-1) === "/";
|
|
85693
|
-
this.statCache[abs] =
|
|
85694
|
-
if (abs.slice(-1) === "/" && !
|
|
85695
|
-
return cb(null, false,
|
|
85696
|
-
var c =
|
|
85693
|
+
this.statCache[abs] = stat7;
|
|
85694
|
+
if (abs.slice(-1) === "/" && !stat7.isDirectory())
|
|
85695
|
+
return cb(null, false, stat7);
|
|
85696
|
+
var c = stat7.isDirectory() ? "DIR" : "FILE";
|
|
85697
85697
|
this.cache[abs] = this.cache[abs] || c;
|
|
85698
85698
|
if (needDir && c !== "DIR")
|
|
85699
85699
|
return cb();
|
|
85700
|
-
return cb(null, c,
|
|
85700
|
+
return cb(null, c, stat7);
|
|
85701
85701
|
};
|
|
85702
85702
|
}
|
|
85703
85703
|
});
|
|
@@ -85753,7 +85753,7 @@ var require_rimraf = __commonJS({
|
|
|
85753
85753
|
var n = 0;
|
|
85754
85754
|
if (options.disableGlob || !glob.hasMagic(p))
|
|
85755
85755
|
return afterGlob(null, [p]);
|
|
85756
|
-
fs69.lstat(p, function(er,
|
|
85756
|
+
fs69.lstat(p, function(er, stat7) {
|
|
85757
85757
|
if (!er)
|
|
85758
85758
|
return afterGlob(null, [p]);
|
|
85759
85759
|
glob(p, globOpts, afterGlob);
|
|
@@ -86010,8 +86010,8 @@ var require_mkdirp = __commonJS({
|
|
|
86010
86010
|
// there already. If so, then hooray! If not, then something
|
|
86011
86011
|
// is borked.
|
|
86012
86012
|
default:
|
|
86013
|
-
xfs.stat(p, function(er2,
|
|
86014
|
-
if (er2 || !
|
|
86013
|
+
xfs.stat(p, function(er2, stat7) {
|
|
86014
|
+
if (er2 || !stat7.isDirectory()) cb(er, made);
|
|
86015
86015
|
else cb(null, made);
|
|
86016
86016
|
});
|
|
86017
86017
|
break;
|
|
@@ -86042,13 +86042,13 @@ var require_mkdirp = __commonJS({
|
|
|
86042
86042
|
// there already. If so, then hooray! If not, then something
|
|
86043
86043
|
// is borked.
|
|
86044
86044
|
default:
|
|
86045
|
-
var
|
|
86045
|
+
var stat7;
|
|
86046
86046
|
try {
|
|
86047
|
-
|
|
86047
|
+
stat7 = xfs.statSync(p);
|
|
86048
86048
|
} catch (err1) {
|
|
86049
86049
|
throw err0;
|
|
86050
86050
|
}
|
|
86051
|
-
if (!
|
|
86051
|
+
if (!stat7.isDirectory()) throw err0;
|
|
86052
86052
|
break;
|
|
86053
86053
|
}
|
|
86054
86054
|
}
|
|
@@ -100257,7 +100257,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
100257
100257
|
var SESSION_ID = (0, import_node_crypto3.randomUUID)();
|
|
100258
100258
|
function readCliVersion() {
|
|
100259
100259
|
if (true) {
|
|
100260
|
-
return "0.29.1-next.
|
|
100260
|
+
return "0.29.1-next.13";
|
|
100261
100261
|
}
|
|
100262
100262
|
return "0.0.0";
|
|
100263
100263
|
}
|
|
@@ -106647,9 +106647,9 @@ var Writer = class _Writer {
|
|
|
106647
106647
|
*/
|
|
106648
106648
|
static async tryOpen(quic, options) {
|
|
106649
106649
|
const cancelled = options.cancel.then(() => void 0, () => void 0);
|
|
106650
|
-
const
|
|
106650
|
+
const open4 = _Writer.open(quic, options);
|
|
106651
106651
|
try {
|
|
106652
|
-
const stream = await Promise.race([cancelled,
|
|
106652
|
+
const stream = await Promise.race([cancelled, open4]);
|
|
106653
106653
|
if (stream)
|
|
106654
106654
|
return stream;
|
|
106655
106655
|
} catch (err) {
|
|
@@ -106658,7 +106658,7 @@ var Writer = class _Writer {
|
|
|
106658
106658
|
return void 0;
|
|
106659
106659
|
}
|
|
106660
106660
|
const abandoned = new Error("abandoned waiting for a stream slot");
|
|
106661
|
-
|
|
106661
|
+
open4.then((w) => w.reset(abandoned)).catch(() => void 0);
|
|
106662
106662
|
return void 0;
|
|
106663
106663
|
}
|
|
106664
106664
|
};
|
|
@@ -124229,7 +124229,7 @@ function createTabsManager(deps) {
|
|
|
124229
124229
|
});
|
|
124230
124230
|
}
|
|
124231
124231
|
}
|
|
124232
|
-
async function
|
|
124232
|
+
async function open4(opts) {
|
|
124233
124233
|
const url2 = opts?.url ?? "about:blank";
|
|
124234
124234
|
const created = await withBrowserClient(async (browser) => {
|
|
124235
124235
|
let out;
|
|
@@ -124293,7 +124293,7 @@ function createTabsManager(deps) {
|
|
|
124293
124293
|
return {
|
|
124294
124294
|
list,
|
|
124295
124295
|
select,
|
|
124296
|
-
open:
|
|
124296
|
+
open: open4,
|
|
124297
124297
|
close,
|
|
124298
124298
|
activeTargetId: () => activeTargetId
|
|
124299
124299
|
};
|
|
@@ -135009,8 +135009,8 @@ function resolveLauncher(appPath) {
|
|
|
135009
135009
|
error_kind: "validation"
|
|
135010
135010
|
});
|
|
135011
135011
|
}
|
|
135012
|
-
const
|
|
135013
|
-
if (
|
|
135012
|
+
const stat7 = fs33.statSync(abs);
|
|
135013
|
+
if (stat7.isDirectory()) {
|
|
135014
135014
|
if (abs.endsWith(".app")) {
|
|
135015
135015
|
const macOsDir = path28.join(abs, "Contents", "MacOS");
|
|
135016
135016
|
if (!fs33.existsSync(macOsDir)) {
|
|
@@ -136853,23 +136853,186 @@ Succeeds when the app is not running or not installed.`,
|
|
|
136853
136853
|
init_zod();
|
|
136854
136854
|
|
|
136855
136855
|
// ../tool-server/src/tools/reinstall-app/platforms/ios.ts
|
|
136856
|
+
var import_node_child_process30 = require("node:child_process");
|
|
136857
|
+
var import_node_util23 = require("node:util");
|
|
136858
|
+
var import_node_path17 = require("node:path");
|
|
136859
|
+
init_src2();
|
|
136860
|
+
|
|
136861
|
+
// ../tool-server/src/tools/reinstall-app/validate-app.ts
|
|
136856
136862
|
var import_node_child_process29 = require("node:child_process");
|
|
136857
|
-
var
|
|
136863
|
+
var import_promises11 = require("node:fs/promises");
|
|
136858
136864
|
var import_node_path16 = require("node:path");
|
|
136859
|
-
|
|
136865
|
+
var import_node_util22 = require("node:util");
|
|
136866
|
+
|
|
136867
|
+
// ../tool-server/src/utils/apk-package.ts
|
|
136868
|
+
var import_promises10 = require("node:fs/promises");
|
|
136869
|
+
var import_node_zlib = require("node:zlib");
|
|
136870
|
+
async function readApkPackageName(apkPath) {
|
|
136871
|
+
return parseManifestPackage(await readZipEntry(apkPath, "AndroidManifest.xml"));
|
|
136872
|
+
}
|
|
136873
|
+
async function readZipEntry(zipPath, entryName) {
|
|
136874
|
+
const file2 = await (0, import_promises10.open)(zipPath, "r");
|
|
136875
|
+
try {
|
|
136876
|
+
const read = async (position, length) => {
|
|
136877
|
+
const buf = Buffer.alloc(length);
|
|
136878
|
+
const { bytesRead } = await file2.read(buf, 0, length, position);
|
|
136879
|
+
return buf.subarray(0, bytesRead);
|
|
136880
|
+
};
|
|
136881
|
+
const { size } = await file2.stat();
|
|
136882
|
+
const tailStart = Math.max(0, size - (22 + 65535));
|
|
136883
|
+
const tail = await read(tailStart, size - tailStart);
|
|
136884
|
+
const eocd = tail.lastIndexOf(Buffer.from([80, 75, 5, 6]));
|
|
136885
|
+
if (eocd < 0) throw new Error("not a zip archive");
|
|
136886
|
+
const entryCount = tail.readUInt16LE(eocd + 10);
|
|
136887
|
+
const dir = await read(tail.readUInt32LE(eocd + 16), tail.readUInt32LE(eocd + 12));
|
|
136888
|
+
let p = 0;
|
|
136889
|
+
for (let i = 0; i < entryCount && dir.readUInt32LE(p) === 33639248; i++) {
|
|
136890
|
+
const method = dir.readUInt16LE(p + 10);
|
|
136891
|
+
const compressedSize = dir.readUInt32LE(p + 20);
|
|
136892
|
+
const nameLength = dir.readUInt16LE(p + 28);
|
|
136893
|
+
const nextEntry = p + 46 + nameLength + dir.readUInt16LE(p + 30) + dir.readUInt16LE(p + 32);
|
|
136894
|
+
if (dir.toString("utf8", p + 46, p + 46 + nameLength) === entryName) {
|
|
136895
|
+
const localOffset = dir.readUInt32LE(p + 42);
|
|
136896
|
+
const local = await read(localOffset, 30);
|
|
136897
|
+
const dataStart = localOffset + 30 + local.readUInt16LE(26) + local.readUInt16LE(28);
|
|
136898
|
+
const data = await read(dataStart, compressedSize);
|
|
136899
|
+
if (method === 0) return data;
|
|
136900
|
+
if (method === 8) return (0, import_node_zlib.inflateRawSync)(data);
|
|
136901
|
+
throw new Error(`unsupported zip compression method ${method}`);
|
|
136902
|
+
}
|
|
136903
|
+
p = nextEntry;
|
|
136904
|
+
}
|
|
136905
|
+
throw new Error(`no ${entryName} in the archive`);
|
|
136906
|
+
} finally {
|
|
136907
|
+
await file2.close();
|
|
136908
|
+
}
|
|
136909
|
+
}
|
|
136910
|
+
var RES_STRING_POOL_TYPE = 1;
|
|
136911
|
+
var RES_XML_START_ELEMENT_TYPE = 258;
|
|
136912
|
+
var UTF8_FLAG = 1 << 8;
|
|
136913
|
+
function parseManifestPackage(xml) {
|
|
136914
|
+
let strings = [];
|
|
136915
|
+
for (let p = xml.readUInt16LE(2); p + 8 <= xml.length; ) {
|
|
136916
|
+
const type = xml.readUInt16LE(p);
|
|
136917
|
+
const chunkSize = xml.readUInt32LE(p + 4);
|
|
136918
|
+
if (chunkSize < 8) break;
|
|
136919
|
+
if (type === RES_STRING_POOL_TYPE) {
|
|
136920
|
+
strings = readStringPool(xml, p);
|
|
136921
|
+
} else if (type === RES_XML_START_ELEMENT_TYPE) {
|
|
136922
|
+
const ext = p + xml.readUInt16LE(p + 2);
|
|
136923
|
+
const attrStart = ext + xml.readUInt16LE(ext + 8);
|
|
136924
|
+
const attrSize = xml.readUInt16LE(ext + 10);
|
|
136925
|
+
const attrCount = xml.readUInt16LE(ext + 12);
|
|
136926
|
+
for (let i = 0; i < attrCount; i++) {
|
|
136927
|
+
const attr2 = attrStart + i * attrSize;
|
|
136928
|
+
if (strings[xml.readUInt32LE(attr2 + 4)] === "package") {
|
|
136929
|
+
const value = strings[xml.readUInt32LE(attr2 + 8)];
|
|
136930
|
+
if (value) return value;
|
|
136931
|
+
}
|
|
136932
|
+
}
|
|
136933
|
+
break;
|
|
136934
|
+
}
|
|
136935
|
+
p += chunkSize;
|
|
136936
|
+
}
|
|
136937
|
+
throw new Error("no package attribute in AndroidManifest.xml");
|
|
136938
|
+
}
|
|
136939
|
+
function readStringPool(xml, chunk) {
|
|
136940
|
+
const count2 = xml.readUInt32LE(chunk + 8);
|
|
136941
|
+
const utf8 = (xml.readUInt32LE(chunk + 16) & UTF8_FLAG) !== 0;
|
|
136942
|
+
const stringsStart = chunk + xml.readUInt32LE(chunk + 20);
|
|
136943
|
+
const offsets = chunk + xml.readUInt16LE(chunk + 2);
|
|
136944
|
+
const out = [];
|
|
136945
|
+
for (let i = 0; i < count2; i++) {
|
|
136946
|
+
let p = stringsStart + xml.readUInt32LE(offsets + i * 4);
|
|
136947
|
+
if (utf8) {
|
|
136948
|
+
p += xml[p] & 128 ? 2 : 1;
|
|
136949
|
+
const len = xml[p] & 128 ? (xml[p] & 127) << 8 | xml[p + 1] : xml[p];
|
|
136950
|
+
p += xml[p] & 128 ? 2 : 1;
|
|
136951
|
+
out.push(xml.toString("utf8", p, p + len));
|
|
136952
|
+
} else {
|
|
136953
|
+
const head = xml.readUInt16LE(p);
|
|
136954
|
+
const len = head & 32768 ? (head & 32767) << 16 | xml.readUInt16LE(p + 2) : head;
|
|
136955
|
+
p += head & 32768 ? 4 : 2;
|
|
136956
|
+
out.push(xml.toString("utf16le", p, p + len * 2));
|
|
136957
|
+
}
|
|
136958
|
+
}
|
|
136959
|
+
return out;
|
|
136960
|
+
}
|
|
136961
|
+
|
|
136962
|
+
// ../tool-server/src/tools/reinstall-app/validate-app.ts
|
|
136860
136963
|
var execFileAsync22 = (0, import_node_util22.promisify)(import_node_child_process29.execFile);
|
|
136964
|
+
async function requirePath(absolute, kind, what) {
|
|
136965
|
+
const info = await (0, import_promises11.stat)(absolute).catch(() => null);
|
|
136966
|
+
if (!info) {
|
|
136967
|
+
throw new InvalidToolInputError(`appPath ${absolute} does not exist. Nothing was uninstalled.`);
|
|
136968
|
+
}
|
|
136969
|
+
if (kind === "directory" ? !info.isDirectory() : !info.isFile()) {
|
|
136970
|
+
throw new InvalidToolInputError(`appPath ${absolute} is not ${what}. Nothing was uninstalled.`);
|
|
136971
|
+
}
|
|
136972
|
+
}
|
|
136973
|
+
function mismatch(bundleId, absolute, actual) {
|
|
136974
|
+
return new InvalidToolInputError(
|
|
136975
|
+
`bundleId ${bundleId} does not match the app at ${absolute}, which is ${actual}. Pass bundleId ${actual}, or the path of the ${bundleId} build. Nothing was uninstalled.`
|
|
136976
|
+
);
|
|
136977
|
+
}
|
|
136978
|
+
async function assertIosAppBundle(absolute, bundleId, { readBundleId = true } = {}) {
|
|
136979
|
+
await requirePath(absolute, "directory", "an .app bundle directory");
|
|
136980
|
+
const infoPlist = (0, import_node_path16.join)(absolute, "Info.plist");
|
|
136981
|
+
if (!(await (0, import_promises11.stat)(infoPlist).catch(() => null))?.isFile()) {
|
|
136982
|
+
throw new InvalidToolInputError(
|
|
136983
|
+
`appPath ${absolute} has no Info.plist, so it is not an iOS .app bundle. Nothing was uninstalled.`
|
|
136984
|
+
);
|
|
136985
|
+
}
|
|
136986
|
+
if (!readBundleId) return;
|
|
136987
|
+
const actual = await execFileAsync22("plutil", [
|
|
136988
|
+
"-extract",
|
|
136989
|
+
"CFBundleIdentifier",
|
|
136990
|
+
"raw",
|
|
136991
|
+
"-o",
|
|
136992
|
+
"-",
|
|
136993
|
+
infoPlist
|
|
136994
|
+
]).then(
|
|
136995
|
+
({ stdout }) => stdout.trim(),
|
|
136996
|
+
() => ""
|
|
136997
|
+
);
|
|
136998
|
+
if (!actual) {
|
|
136999
|
+
throw new InvalidToolInputError(
|
|
137000
|
+
`${infoPlist} has no CFBundleIdentifier, so it is not an iOS .app bundle. Nothing was uninstalled.`
|
|
137001
|
+
);
|
|
137002
|
+
}
|
|
137003
|
+
if (actual !== bundleId) throw mismatch(bundleId, absolute, actual);
|
|
137004
|
+
}
|
|
137005
|
+
async function assertApk(absolute, packageName) {
|
|
137006
|
+
await requirePath(absolute, "file", "an .apk file");
|
|
137007
|
+
let actual;
|
|
137008
|
+
try {
|
|
137009
|
+
actual = await readApkPackageName(absolute);
|
|
137010
|
+
} catch (err) {
|
|
137011
|
+
throw new InvalidToolInputError(
|
|
137012
|
+
`appPath ${absolute} is not a readable APK (${err.message}). Nothing was uninstalled.`
|
|
137013
|
+
);
|
|
137014
|
+
}
|
|
137015
|
+
if (actual !== packageName) throw mismatch(packageName, absolute, actual);
|
|
137016
|
+
}
|
|
137017
|
+
async function assertVpkg(absolute) {
|
|
137018
|
+
await requirePath(absolute, "file", "a .vpkg file");
|
|
137019
|
+
}
|
|
137020
|
+
|
|
137021
|
+
// ../tool-server/src/tools/reinstall-app/platforms/ios.ts
|
|
137022
|
+
var execFileAsync23 = (0, import_node_util23.promisify)(import_node_child_process30.execFile);
|
|
136861
137023
|
var iosImpl = {
|
|
136862
137024
|
requires: ["xcrun"],
|
|
136863
137025
|
handler: async (_services, params) => {
|
|
136864
137026
|
const { udid, bundleId, appPath } = params;
|
|
136865
|
-
const absolute = (0,
|
|
137027
|
+
const absolute = (0, import_node_path17.resolve)(appPath);
|
|
137028
|
+
await assertIosAppBundle(absolute, bundleId);
|
|
136866
137029
|
const { nativeId, prefix } = await simctlTargetForUdid(udid);
|
|
136867
137030
|
try {
|
|
136868
|
-
await
|
|
137031
|
+
await execFileAsync23("xcrun", [...prefix, "uninstall", nativeId, bundleId]);
|
|
136869
137032
|
} catch {
|
|
136870
137033
|
}
|
|
136871
137034
|
try {
|
|
136872
|
-
await
|
|
137035
|
+
await execFileAsync23("xcrun", [...prefix, "install", nativeId, absolute]);
|
|
136873
137036
|
} catch (err) {
|
|
136874
137037
|
throw new FailureError(
|
|
136875
137038
|
`Failed to install iOS app bundle on ${udid}.`,
|
|
@@ -136888,14 +137051,15 @@ var iosImpl = {
|
|
|
136888
137051
|
};
|
|
136889
137052
|
|
|
136890
137053
|
// ../tool-server/src/tools/reinstall-app/platforms/android.ts
|
|
136891
|
-
var
|
|
137054
|
+
var import_node_path18 = require("node:path");
|
|
136892
137055
|
init_src2();
|
|
136893
137056
|
init_adb();
|
|
136894
137057
|
var androidImpl3 = {
|
|
136895
137058
|
requires: ["adb"],
|
|
136896
137059
|
handler: async (_services, params) => {
|
|
136897
137060
|
const { udid, bundleId, appPath } = params;
|
|
136898
|
-
const absolute = (0,
|
|
137061
|
+
const absolute = (0, import_node_path18.resolve)(appPath);
|
|
137062
|
+
await assertApk(absolute, bundleId);
|
|
136899
137063
|
try {
|
|
136900
137064
|
await runAdb(["-s", udid, "uninstall", bundleId], { timeoutMs: 3e4 });
|
|
136901
137065
|
} catch {
|
|
@@ -136917,7 +137081,7 @@ ${stderr}`;
|
|
|
136917
137081
|
};
|
|
136918
137082
|
|
|
136919
137083
|
// ../tool-server/src/tools/reinstall-app/platforms/ios-device.ts
|
|
136920
|
-
var
|
|
137084
|
+
var import_node_path19 = require("node:path");
|
|
136921
137085
|
var iosDeviceImpl3 = {
|
|
136922
137086
|
requires: ["xcrun"],
|
|
136923
137087
|
handler: async (_services, params) => {
|
|
@@ -136926,10 +137090,12 @@ var iosDeviceImpl3 = {
|
|
|
136926
137090
|
`${params.bundleId} is system UI: it is always running and cannot be reinstalled. Use launch-app to put it under automation.`
|
|
136927
137091
|
);
|
|
136928
137092
|
}
|
|
137093
|
+
const absolute = (0, import_node_path19.resolve)(params.appPath);
|
|
137094
|
+
await assertIosAppBundle(absolute, params.bundleId);
|
|
136929
137095
|
await ensureDeviceReady(params.udid);
|
|
136930
137096
|
await uninstallApp(params.udid, params.bundleId);
|
|
136931
137097
|
clearCurrentIosDeviceApp(params.udid, params.bundleId);
|
|
136932
|
-
await installApp(params.udid,
|
|
137098
|
+
await installApp(params.udid, absolute);
|
|
136933
137099
|
return {
|
|
136934
137100
|
reinstalled: true,
|
|
136935
137101
|
bundleId: params.bundleId
|
|
@@ -136938,12 +137104,13 @@ var iosDeviceImpl3 = {
|
|
|
136938
137104
|
};
|
|
136939
137105
|
|
|
136940
137106
|
// ../tool-server/src/tools/reinstall-app/platforms/ios-remote.ts
|
|
136941
|
-
var
|
|
137107
|
+
var import_node_path20 = require("node:path");
|
|
136942
137108
|
var iosRemoteImpl3 = {
|
|
136943
137109
|
requires: ["sim-remote"],
|
|
136944
137110
|
handler: async (_services, params) => {
|
|
136945
137111
|
const { udid, bundleId, appPath } = params;
|
|
136946
|
-
const absolute = (0,
|
|
137112
|
+
const absolute = (0, import_node_path20.resolve)(appPath);
|
|
137113
|
+
await assertIosAppBundle(absolute, bundleId, { readBundleId: false });
|
|
136947
137114
|
try {
|
|
136948
137115
|
await simctlUninstall(udid, bundleId);
|
|
136949
137116
|
} catch {
|
|
@@ -136954,13 +137121,14 @@ var iosRemoteImpl3 = {
|
|
|
136954
137121
|
};
|
|
136955
137122
|
|
|
136956
137123
|
// ../tool-server/src/tools/reinstall-app/platforms/vega.ts
|
|
136957
|
-
var
|
|
137124
|
+
var import_node_path21 = require("node:path");
|
|
136958
137125
|
init_src2();
|
|
136959
137126
|
var vegaImpl3 = {
|
|
136960
137127
|
requires: ["vega"],
|
|
136961
137128
|
handler: async (_services, params) => {
|
|
136962
137129
|
const { udid, bundleId, appPath } = params;
|
|
136963
|
-
const absolute = (0,
|
|
137130
|
+
const absolute = (0, import_node_path21.resolve)(appPath);
|
|
137131
|
+
await assertVpkg(absolute);
|
|
136964
137132
|
await vegaDevice(udid, ["uninstall-app", "-a", bundleId], { timeoutMs: 6e4 }).catch(
|
|
136965
137133
|
() => {
|
|
136966
137134
|
}
|
|
@@ -137010,7 +137178,7 @@ var reinstallAppTool = {
|
|
|
137010
137178
|
},
|
|
137011
137179
|
description: `Install or reinstall an app on the device. The previous installation (if any) is uninstalled first so app data and runtime permissions are cleared.
|
|
137012
137180
|
Use for a full reinstall after rebuilding, or to start from a clean app state.
|
|
137013
|
-
Returns { reinstalled, bundleId }. Fails if the app path does not exist
|
|
137181
|
+
Returns { reinstalled, bundleId }. Fails before uninstalling anything if the app path does not exist, is not the platform's package (.app for iOS, .apk for Android, .vpkg for Vega), or bundleId does not match it.`,
|
|
137014
137182
|
zodSchema: zodSchema13,
|
|
137015
137183
|
capability: capability5,
|
|
137016
137184
|
fileInputs: [{ target: "appPath", path: "${appPath}", kind: "tar-upload" }],
|
|
@@ -137046,10 +137214,10 @@ var PERMISSION_NAMES = [
|
|
|
137046
137214
|
];
|
|
137047
137215
|
|
|
137048
137216
|
// ../tool-server/src/tools/settings-permissions/platforms/ios.ts
|
|
137049
|
-
var
|
|
137050
|
-
var
|
|
137217
|
+
var import_node_child_process31 = require("node:child_process");
|
|
137218
|
+
var import_node_util24 = require("node:util");
|
|
137051
137219
|
init_src2();
|
|
137052
|
-
var
|
|
137220
|
+
var execFileAsync24 = (0, import_node_util24.promisify)(import_node_child_process31.execFile);
|
|
137053
137221
|
var SIMCTL_ACTION = {
|
|
137054
137222
|
grant: "grant",
|
|
137055
137223
|
deny: "revoke",
|
|
@@ -137074,7 +137242,7 @@ var NON_TCC_GRANT_NEEDS_INSTALL = /* @__PURE__ */ new Set([
|
|
|
137074
137242
|
]);
|
|
137075
137243
|
var localBackend = {
|
|
137076
137244
|
async run(udid, simctlAction, service, bundleId) {
|
|
137077
|
-
await
|
|
137245
|
+
await execFileAsync24(
|
|
137078
137246
|
"xcrun",
|
|
137079
137247
|
await simctlArgsForUdid(udid, ["privacy", udid, simctlAction, service, bundleId]),
|
|
137080
137248
|
{ timeout: 3e4 }
|
|
@@ -137082,7 +137250,7 @@ var localBackend = {
|
|
|
137082
137250
|
},
|
|
137083
137251
|
async isInstalled(udid, bundleId) {
|
|
137084
137252
|
try {
|
|
137085
|
-
await
|
|
137253
|
+
await execFileAsync24(
|
|
137086
137254
|
"xcrun",
|
|
137087
137255
|
await simctlArgsForUdid(udid, ["get_app_container", udid, bundleId]),
|
|
137088
137256
|
{ timeout: 15e3 }
|
|
@@ -137365,8 +137533,8 @@ init_zod();
|
|
|
137365
137533
|
init_device_info();
|
|
137366
137534
|
|
|
137367
137535
|
// ../tool-server/src/tools/open-url/platforms/ios.ts
|
|
137368
|
-
var
|
|
137369
|
-
var
|
|
137536
|
+
var import_node_child_process32 = require("node:child_process");
|
|
137537
|
+
var import_node_util25 = require("node:util");
|
|
137370
137538
|
init_src2();
|
|
137371
137539
|
|
|
137372
137540
|
// ../tool-server/src/tools/open-url/deep-link-note.ts
|
|
@@ -137376,12 +137544,12 @@ function httpDeepLinkNote(url2) {
|
|
|
137376
137544
|
}
|
|
137377
137545
|
|
|
137378
137546
|
// ../tool-server/src/tools/open-url/platforms/ios.ts
|
|
137379
|
-
var
|
|
137547
|
+
var execFileAsync25 = (0, import_node_util25.promisify)(import_node_child_process32.execFile);
|
|
137380
137548
|
var iosImpl3 = {
|
|
137381
137549
|
requires: ["xcrun"],
|
|
137382
137550
|
handler: async (_services, params) => {
|
|
137383
137551
|
try {
|
|
137384
|
-
await
|
|
137552
|
+
await execFileAsync25(
|
|
137385
137553
|
"xcrun",
|
|
137386
137554
|
await simctlArgsForUdid(params.udid, ["openurl", params.udid, params.url])
|
|
137387
137555
|
);
|
|
@@ -137537,8 +137705,8 @@ Returns { opened, url, note? }. note carries the deep-linking caveat when a web
|
|
|
137537
137705
|
};
|
|
137538
137706
|
|
|
137539
137707
|
// ../tool-server/src/tools/screenshot/index.ts
|
|
137540
|
-
var
|
|
137541
|
-
var
|
|
137708
|
+
var import_node_child_process33 = require("node:child_process");
|
|
137709
|
+
var import_node_util26 = require("node:util");
|
|
137542
137710
|
var os13 = __toESM(require("node:os"));
|
|
137543
137711
|
var path29 = __toESM(require("node:path"));
|
|
137544
137712
|
init_zod();
|
|
@@ -137901,9 +138069,9 @@ async function captureSnapshot(api, bundleId) {
|
|
|
137901
138069
|
}
|
|
137902
138070
|
|
|
137903
138071
|
// ../tool-server/src/utils/vega-screen.ts
|
|
137904
|
-
var
|
|
138072
|
+
var import_promises12 = require("node:fs/promises");
|
|
137905
138073
|
var import_node_os12 = require("node:os");
|
|
137906
|
-
var
|
|
138074
|
+
var import_node_path22 = require("node:path");
|
|
137907
138075
|
var import_pngjs = __toESM(require_png());
|
|
137908
138076
|
init_src2();
|
|
137909
138077
|
init_adb();
|
|
@@ -138070,12 +138238,12 @@ async function captureVegaScreenshotPng(opts = {}) {
|
|
|
138070
138238
|
async function captureViaEmulatorConsole(opts) {
|
|
138071
138239
|
const port = await discoverVegaConsolePort();
|
|
138072
138240
|
const serial = `emulator-${port}`;
|
|
138073
|
-
const outDir = await (0,
|
|
138241
|
+
const outDir = await (0, import_promises12.mkdtemp)((0, import_node_path22.join)((0, import_node_os12.tmpdir)(), "vega-shot-"));
|
|
138074
138242
|
try {
|
|
138075
138243
|
await runAdb(["-s", serial, "emu", "screenrecord", "screenshot", outDir], {
|
|
138076
138244
|
timeoutMs: 2e4
|
|
138077
138245
|
});
|
|
138078
|
-
const pngName = (await (0,
|
|
138246
|
+
const pngName = (await (0, import_promises12.readdir)(outDir)).find((f) => f.toLowerCase().endsWith(".png"));
|
|
138079
138247
|
if (!pngName) {
|
|
138080
138248
|
throw new FailureError(`emulator console wrote no PNG to ${outDir} for ${serial}`, {
|
|
138081
138249
|
error_code: FAILURE_CODES.VEGA_SCREENSHOT_FAILED,
|
|
@@ -138084,13 +138252,13 @@ async function captureViaEmulatorConsole(opts) {
|
|
|
138084
138252
|
error_kind: "unknown"
|
|
138085
138253
|
});
|
|
138086
138254
|
}
|
|
138087
|
-
const decoded = import_pngjs.PNG.sync.read(await (0,
|
|
138255
|
+
const decoded = import_pngjs.PNG.sync.read(await (0, import_promises12.readFile)((0, import_node_path22.join)(outDir, pngName)));
|
|
138088
138256
|
const scaled = scalePng(decoded, opts.scale);
|
|
138089
|
-
const outPath = (0,
|
|
138090
|
-
await (0,
|
|
138257
|
+
const outPath = (0, import_node_path22.join)((0, import_node_os12.tmpdir)(), `vega-screenshot-${process.hrtime.bigint()}.png`);
|
|
138258
|
+
await (0, import_promises12.writeFile)(outPath, import_pngjs.PNG.sync.write(scaled));
|
|
138091
138259
|
return outPath;
|
|
138092
138260
|
} finally {
|
|
138093
|
-
await (0,
|
|
138261
|
+
await (0, import_promises12.rm)(outDir, { recursive: true, force: true }).catch(() => {
|
|
138094
138262
|
});
|
|
138095
138263
|
}
|
|
138096
138264
|
}
|
|
@@ -138111,7 +138279,7 @@ function scalePng(src, scale) {
|
|
|
138111
138279
|
|
|
138112
138280
|
// ../tool-server/src/tools/screenshot/index.ts
|
|
138113
138281
|
var fs35 = __toESM(require("node:fs/promises"));
|
|
138114
|
-
var
|
|
138282
|
+
var execFileAsync26 = (0, import_node_util26.promisify)(import_node_child_process33.execFile);
|
|
138115
138283
|
var zodSchema16 = external_exports.object({
|
|
138116
138284
|
udid: external_exports.string().describe(
|
|
138117
138285
|
"Target device id from `list-devices` (iOS UDID, Android serial, Apple TV UDID, Vega serial, or Chromium id)."
|
|
@@ -138152,11 +138320,11 @@ async function tvScreenshot(udid, scale, signal) {
|
|
|
138152
138320
|
os13.tmpdir(),
|
|
138153
138321
|
`argent-tv-screenshot-${udid.slice(0, 8)}-${process.hrtime.bigint()}.png`
|
|
138154
138322
|
);
|
|
138155
|
-
await
|
|
138323
|
+
await execFileAsync26("xcrun", await simctlArgsForUdid(udid, ["io", udid, "screenshot", file2]), {
|
|
138156
138324
|
signal
|
|
138157
138325
|
});
|
|
138158
138326
|
if (scale === void 0 || scale < 1) {
|
|
138159
|
-
await
|
|
138327
|
+
await execFileAsync26("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
|
|
138160
138328
|
signal
|
|
138161
138329
|
}).catch(() => {
|
|
138162
138330
|
});
|
|
@@ -138166,7 +138334,7 @@ async function tvScreenshot(udid, scale, signal) {
|
|
|
138166
138334
|
async function tvTargetLongSide(file2, scale) {
|
|
138167
138335
|
let longSide = 3840;
|
|
138168
138336
|
try {
|
|
138169
|
-
const { stdout } = await
|
|
138337
|
+
const { stdout } = await execFileAsync26("sips", ["-g", "pixelWidth", "-g", "pixelHeight", file2]);
|
|
138170
138338
|
const width = Number(/pixelWidth:\s*(\d+)/.exec(stdout)?.[1]);
|
|
138171
138339
|
const height = Number(/pixelHeight:\s*(\d+)/.exec(stdout)?.[1]);
|
|
138172
138340
|
if (Number.isFinite(width) && Number.isFinite(height) && width > 0 && height > 0) {
|
|
@@ -138201,7 +138369,7 @@ async function downscalePngInPlace(file2, scale, signal) {
|
|
|
138201
138369
|
if (scale >= 1) {
|
|
138202
138370
|
return;
|
|
138203
138371
|
}
|
|
138204
|
-
await
|
|
138372
|
+
await execFileAsync26("sips", ["-Z", String(await tvTargetLongSide(file2, scale)), file2], {
|
|
138205
138373
|
signal
|
|
138206
138374
|
}).catch(() => {
|
|
138207
138375
|
});
|
|
@@ -140252,12 +140420,12 @@ var shakeZodSchema = external_exports.object({
|
|
|
140252
140420
|
});
|
|
140253
140421
|
|
|
140254
140422
|
// ../tool-server/src/tools/shake/platforms/ios.ts
|
|
140255
|
-
var
|
|
140256
|
-
var
|
|
140423
|
+
var import_node_child_process35 = require("node:child_process");
|
|
140424
|
+
var import_node_util27 = require("node:util");
|
|
140257
140425
|
init_src2();
|
|
140258
140426
|
|
|
140259
140427
|
// ../tool-server/src/utils/window-shake.ts
|
|
140260
|
-
var
|
|
140428
|
+
var import_node_child_process34 = require("node:child_process");
|
|
140261
140429
|
init_src();
|
|
140262
140430
|
var MICROINTERACTIONS_FLAG = "microinteractions";
|
|
140263
140431
|
var AMPLITUDE = 22;
|
|
@@ -140364,7 +140532,7 @@ end run
|
|
|
140364
140532
|
}
|
|
140365
140533
|
function runOsascript(script) {
|
|
140366
140534
|
return new Promise((resolve15, reject) => {
|
|
140367
|
-
const child = (0,
|
|
140535
|
+
const child = (0, import_node_child_process34.execFile)(
|
|
140368
140536
|
"/usr/bin/osascript",
|
|
140369
140537
|
["-"],
|
|
140370
140538
|
{ timeout: OSASCRIPT_TIMEOUT_MS },
|
|
@@ -140457,7 +140625,7 @@ async function prepareHostWindowShake(target) {
|
|
|
140457
140625
|
}
|
|
140458
140626
|
|
|
140459
140627
|
// ../tool-server/src/tools/shake/platforms/ios.ts
|
|
140460
|
-
var
|
|
140628
|
+
var execFileAsync27 = (0, import_node_util27.promisify)(import_node_child_process35.execFile);
|
|
140461
140629
|
var SHAKE_NOTIFICATION = "com.apple.UIKit.SimulatorShake";
|
|
140462
140630
|
var SHAKE_INTERVAL_MS = 400;
|
|
140463
140631
|
var sleep11 = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
@@ -140499,7 +140667,7 @@ var iosImpl4 = {
|
|
|
140499
140667
|
if (i > 0) await sleep11(SHAKE_INTERVAL_MS);
|
|
140500
140668
|
shaker.begin();
|
|
140501
140669
|
try {
|
|
140502
|
-
await
|
|
140670
|
+
await execFileAsync27("xcrun", args, { timeout: 15e3 });
|
|
140503
140671
|
} catch (err) {
|
|
140504
140672
|
const error63 = err instanceof Error ? err : new Error(String(err));
|
|
140505
140673
|
throw shakeFailure(udid, error63.message, error63);
|
|
@@ -153849,8 +154017,8 @@ var import_util14 = require("util");
|
|
|
153849
154017
|
var DEFAULT_EXEC_TIMEOUT_MS = 6e4;
|
|
153850
154018
|
var DEFAULT_EXEC_MAX_BUFFER = 256 * 1024 * 1024;
|
|
153851
154019
|
async function execFileAsyncWithTimeout(file2, args, options = {}) {
|
|
153852
|
-
const
|
|
153853
|
-
const { stdout, stderr } = await
|
|
154020
|
+
const execFileAsync32 = (0, import_util14.promisify)(import_child_process2.execFile);
|
|
154021
|
+
const { stdout, stderr } = await execFileAsync32(file2, args, {
|
|
153854
154022
|
encoding: "utf-8",
|
|
153855
154023
|
...options,
|
|
153856
154024
|
// Applied after ...options so a caller cannot weaken the guards; maxBuffer
|
|
@@ -157894,7 +158062,7 @@ var WATERMARK_PNG_HEIGHT = 277;
|
|
|
157894
158062
|
var WATERMARK_PNG_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAA4QAAAEVCAYAAAC46yv0AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOydd7xkRbX916qGIcwQBAaQDEPOacgqIgoCgxJEQRiCCuJ7CCoIzwQYfoIYAJ8BFAUERYLwAEUBMcCoMAwZiUMSkJwGJMycWr8/ui709D23Y1Wf7tP7+/ncz3zm3HN27e7b4eyqXWsRhtEiksYBmCrp8wBWKzqffoLkqiRnFp2HYRiGYRiGYbTDPEUnYPQ/ksYD+LikzwFYvuh8+pTNAVhBaBiGYRiGYQwUVhAaYyJpMe/9YZIOA7B40fn0M977zQD8sug8jOFB0ju89zunHsc5dwHJGanHMQzDMAyjGKwgNEYhaSnv/aGSjiC5SNH5DAIkNy86B2O4kHQcye1Sj+O9XxnAh1OPYxiGYRhGMbDoBIz+QdKq3vvPk5wKYL4mp2cAXupBWkXwtg6ueY3kIiTfiJ6NYdQhaUVJDwBwPRjuDZLLkHy2B2MZhmEYhmEYvUbSBlmWnee9n+O9V5Of17Is+5GkVYrOOyaSnKQ9vPc3tvAc5P5Imlz04zCGgyzLju30ddrha/tTRT9mwzAMwzAMIzKStvHeX+arNLspnJVl2SmSli0675hImlfSVO/9P1u8OX5A0uFZlv0y56b5v4p+PEb5kUTv/f29LAi99zcU/bgNwzAMwzCMSIRC8KoWbwSfzrLsOEmLFZ13TCTNJ+lg7/0jLT4Pt0maKmmecP0n68/Jsuysoh+XUX4kvbvHxeDIhMd6RT92wzAMwzAMo0NCS+QU7/0NLd4A/lvS0cFyojRIWljS4d77x1t8Hq6TNEUS6+JslHPu3UU9LmN4yLLsrCIKwizLTir6sRuGYRiGYRhtImlcaIm8u8Ubv5mSDpc0f9G5x0TSklmWHee9f76dQrBBvHm89y/XXeMldSJIYxgtIWmC935WEQWh9/4JSfMW/RwYhmEYhhEXs50oKZImAPiYpCMBLNfCJbeS/C6Ac0lmabPrHZJW8t5/RtInSC7Q5HQP4Hckv0pyeqMTSc7x3t8MYJvawwAmA7iyu6wNY0w+DGBCQWMvBWAHAJcXNL5hGIZhFI6kpdDavXWrzCF5a8R4xrATWiKP9t4/001L5KAjad0sy8723s9u4Tl4PcuysyWt2c4YWZZ9pz6WpC+nekyG4b2/rqDVwZGfC4t+DgzDMAyjSCQdFfm7tXBbJ1shLAm1ZvIAmpnJC8BvSX6T5N96kF7PkLSxpGMk7UmyWZH7iqQznHMnOecebXcs59z1kurH36zdOIbRCpJWk7RVwWlMkTSR5NMF52EYhmEYRiSsIBxwJK3ivT9c0sEkm+37G2mJPI7kjF7k1yskbRNEcHZp4fSXJP0oFILdzMpcn3Ns8y7iGcaYeO8PaGGSIzXjAOwN4NSC8zAMwzAMwxhuJK3fQUvk6kXnHZMa5dTrWxXFCBYazVZQW8Z7/0RO2+jKseIbBlB9rfvWLVJS/9xU9PNhGIZhGEVhLaNG4dSshO3cwmrBy5J+5pz7lnPusZ4k2AOC0uHeko4BsFYLlzxI8hQApznnXouczg0A6tVINwPwYORxjOHmvQCWLzqJwEaSNrAN8IZhGIZRDlzRCRitEczkr5Z0LYBdUFW0HItnJB1PcsVKpXI4yVIUg5LGB0uMmZLOQvNi8DaS+5NcneQpJGMXgyA5qm3Ue29to0ZUvPcHFp1DLd77A4rOwTAMwzCMONgKYR8jyQHYWdJXJG3awiVPkDwZwPedc/9JnF7PkLQwgAPDiuDSLVwyjeSJAC4nqaZnd8cN9QdImrCMEQ1Ji0jateg8aiG5n6SjSb5RdC6GYRiGYXSHFYR9iKRxAD4i6QsA1mjhkpkkvw/gtBSrYEUhaUnv/ackHQ5g0RYumUbyWJJ/TJ1bDTegKtZTu9q+iaR5Sc7uYR5GefkogGYemr1mcQA7Abik6EQMwzAMw+gOaxntIyRNqGuJbFYM3hpaItdI1RJZBJJWzrLsFEkPkTwWjYtBj+pK4GTn3DY9LgZB8kUA99Ydnh/Aer3Mwygvkg4oOoc8+jUvwzAMwzDaw1YI+wBJS3jv/1vSYQAWa+GSXrZE9gxJ63nvj5K0N8lmr803JP3aOfcNkvf0JMExkHQ9yXpT+80BmBqj0RWS1pE0ueg8xmBnSUuTfKLoRAzDMAzD6BxbISwQSUsFG4SZYSWsUTEoVAvArcJK2GVlKQYlbe29v0zSrST3Q+OJipclnUpyUqVSmVp0MQgAzrlR+wi997aP0OiafhOTqWMeVD0JDcMwDMMYYGyFsAA6NJM/lmSpVpzaNJN/VtL/OudOdc49lzy59hilNErSlEaNrpA0j6SPFp1HIyQdBOB7RedhGIZhGEbnWEHYQySt770/UtI+JCtNTh9pifwayft6kmAPqFFO/XKLrXBPSvqxc+57zrkXU+fXIbcBeBVzC3+sKWlRki8UlJMx+OyE1lR1i2RdSRuXbbLKMAzDMIYJaxntAcFD8DJJt4SWyEbF4EhL5MqhJbIUxaCkcZKmSrpT0qUAmhWDD5A8guRKlUrluCDe0pcENdFb6g8D2KSAdIySIKmf20XfxDwJDcMwDGOwsYIwIZK2995Pa9NMfoVgJv94j9JMSo2Z/P1BObVefKWeETP5gVJOlTSqbRRVYRnDaBtJE1FdIYzJQ5HjAQBI7iNpvhSxDcMwDMNIjxWEkZHkJE3x3t8o6SoAWzW55JGwErZiWAl7vhd5pkbSwjWF4MkAlm9yyTSSu5LckOTZJOf0Is9Y5AnLSDJhGaNTPgpgXMyAQZl4esyYgcUBTEkQ1zAMwzCMHmB7CCNRYyb/RQCrt3DJiJn8j0m+nja73lFjJn8EgEVauOTqIJjzt9S5JcZWCI1oJPD4ewPABSQrKWwsQr4Xxo5rGIZhGIbR94yYyXvvH/Xeq4Wfm8NeumaiMgPFiJm89/4/LTwHWdhTuWnRecfEe/9k/WOVtELReRmDhaSNW/wsaefnghB7Me/9awniz5b09qKfO8MwDMNIjaSjIn+HPlv0Y7KW0Q6RtETwEHw4tEQu2+SSkZbIjUNLZNaLPFMjab0sy86WdC/JT2Nupc163pD0C5JrO+emkLyxV3n2iLx2PFslNNoihfcgyV+Ef58D8NvY8VHtNtk3QVzDMAzDMBJjBWGbSFo6y7ITJD3Uhpn8liU0kx9RTm3HTH6VfjGTTwFJM6g3ukLSOJIfiRz2aQBXjPyH5FmR4wMAJH0sRVzDMAzDMNJiewhbpAMz+YtIHk/yzl7k1yvaNJN/RtIP+tRMPgVmUG90ywcALBEzoKRfOedm1xz6HYAnASwVcxwAa0jaLG9ixDAMwzCM/sVWCJsgaYO6lshGxeDroSVyTefcXmUpBmuUU2+osdBoxBPBQmNSUE4dhmIQqLaM1q8AbyLJJl6MlkggJgPn3Nm1/yc5R9J5sccBzJPQMAzDMIwSMdIS6as02wz6UpZlp0hapui8YzJiJu+9v6vFTbEzg9VEsxXU0uK9vzdHWGbDovMy+h9JS3vvZ0feqJ47KSVpowTCMvLevyCp0T5iwzAMwxhoTFSm5EhiWAlr1Uz+6bAStmJJzeRntmgmf2swk199kMzkUzCGQb3tIzRaYX9EbuMnefYYx28GcFvMsQKLANg1QVzDMAzDMBJhBSHeaomUNF3SpWhuJv9wMJNfqYRm8kfXKKcu1+SSEeXUjcqknNoNeQb13nvbR2g0RdL+kUN6AL8c65djFYvdkqLt1TAMwzCMdAz13qYOzOTvJ3kSgJ+TnN307AFB0lLe+0OH0Ew+BXnCMrZCaDRE0paS1ooc9o8k/9Xg9+cAOAHxvwfeJ2n5JmMbxlxIWhzVbpS1vPcrAFiG5JKoKnnPD2BeAPMBeBnA8wBmSXoZwAvOubsB3AXgDpJPF/IADIT98isDWAPAqt775QBMJDkRwNtQ/RuOAzAewAuo7rmfg6oA3TMAnnHOPQrgAQAzUb3ner33j8SQtBCAVUd+vPerklwIwKKovh8XRPV+8UUAbwB4BcArkv7lnHsIwMOo/h1vL9P9cpkZyoJQ0gQAH5N0FJr7BwLALSS/B+DcMq2CSVrZe39EG8qpvyN5HMkZvchvQLkFwOuo3riMsLakhUm+VFBORp/jvT+AbNSd3j4j3oMNfv+k9/5KADtFHbjaebIvgG9GjtsTJB0s6UPdxiH5U5K/jpFTLZLmQ/WGew0Aa3jvJ6B6s70AyQVQvWGrz+U7JH8fO5dukLQOgPd477ciuZWk5Ud+1+p7YeQ86S0tL+/9MwBuCo/3cpL3Rc57QUn/122cYEN1aoycikLSEqj+DbckubmkjVDz3dfOZ1re3xLAHO/9nZJmOOeuB3ANyfujJF8QkiqSun4vkryK5Ldi5AQAkt4OYFvv/bYk3yVpjbrxWs2r/m/4mvd+hqTrnXN/BXAlyVdj5d0JkhbvVlhN0oqx8gks5L2/KnLMEWY553ZvdlLcO5A+R9IS3vv/JnkYGvsHjjCN5IkkL0udWy+RtL73/kiSe6P5pMAbkn7tnPs6yXt7kd+g473/B+oM6UluR/JPBaVk9DGSFpD0OHJu5LvgFZJLk3y5ydh7SYpetAC4l+Sag+i7mmXZSSSP7DaOpJ9UKpWDI8RZBcCOkt4NYGMAK6HN7R4kP0byZ93m0i2StvDe701yCqorSb3gPkmXO+fOIXlTt8EkbSDplghxflipVP6r2zi9RtKqAPaWtDOAyej91qNHJP3eOXcRqgXinB6P3xWS5pEUY8XsBudcV9tRJE0EsE/YrrBRhJxa4RUAV5C8GMDFRRSHkpaR9Fivxy2Q55xzizc7aShWCCWt4L3/nKSPk1ywxcueBPCqpE977z+dMr8es1DwCms2GTBL0o+dc991zj3Rk8xKgqQbcvwHNwNgBaGRx+6IWwxC0gXOuYbFYOBSVNvv3hZzfFRb8LcEMLRt5SSbiXGNSWjX2l/SVEmTI6bVcyQtAuATkg6StFbslfAWWI3kZyR9xns/neR3AVzQRbfPGs1PKReSFgSwr6T9JTXTWEjNCiQPlnQwgGezLDvfOXcayVsLzqvXrCPJkfTtXihpO0mHSdoJ1RbeXjIewJ6S9kT17/cT59wPSD7a4zyMOoalIPwjyVXbvGwpxDduHgSGzUw+Os656yUdVntMkgnLGLlIOjB2TOdcw3bREUi+lmXZ+SQPiZ1D8CQc2oIQzdWZRyFpgvf+yDb2c/ctkt7uvf+MpEMALFx0PoHJkn4F4HhJR3bY/dOK3kApCFY4nw7FV9MVhgJYnOShkg713v8jFPsXdVIkDSDjUd3f13LnlqStJX1d0rbJsmqPxUkeI+nILMvOcc59ieQwrdz1FaVXGZX0NgCTis5jAHgkKKeuOGRm8ikYpTQKs54wcpC0HIBtI4d9DMBfWj3ZOXdW5PEBACQ/HFYWhpWJQSilJSTtIek+ksdigIvBsMfuaEl3kzwK/VMM1rK6pEu995dJakVH4E2896VfIZT0tizLvilpJsn/QX8Wg/VsIel8SXeGlfXS398CWL+VkySt6r2/QtJ1iP99E4N5SB4g6d4sy74adD6MHjMMb5hNMWR7JdvkHpIHkVw1eAj+p+iESsD9AOpNRpcNN/+GUctBACoxA0o6q512OJJ/B3B3zBwCCwPYLUHcQaLpKmFQeT5f0oUAlu5BTskIe1Lvk3QC+rMQrGcXSbdJmtrqBSRLu0IYBE/+OxSCx6CqJDlorCnpLEkzwr7b0uK9b1gQquqtfbCkmwHs2KO0umFBkl8ORf27ik5m2BiGgtBWZsYmI7kxyVLZaBRNENKYnvMrey0abxK+rFu+EW2VVttFayF5Tuw8APMkRJOCUNJ7Jf0TQNeqpkUS9ulfHgSKlik6nzZZTNJZWZadpqoVVTNKuUIoaRNJ10v6PuLvKS6CDSVdk2XZeUE8pXSQHLMglLSspD9IOg3AoK24rSDpj2GVet6ikxkWSr+HMG9DPsmjAfyxgHQKRdLZANauOVQBsCGGe59PEiRdT3LHumOHSFqthcvnDVLyrbIQWnsvyzl3mBX/fcM7Eb+d/QaSnaz2nQXgeERerQSwnaQVSD4SOe5A4L0fsyCU9HFJP0TVm21gkbS7pJ9iwIuIIFSyjqQ9SD6Zd46kpYNITmmQVAFwjKTjUMJ7wtC6vp2kT5G8sOh8IpNbEKqqhPtbtGar1q9Uwv7Cd0j6IMlnik6o7JTuzZ9DnkLbbwbdy6YTsiy7juTadYc3hxWE0XHOPSWNUtx/n6T3tXJ9QiW+0wF0Lb1udI/3/sAE3oNnd3jdo977vwDYLmpC1S6UqQC+HjnuQEByrbzjWZZ9W9Lnep1PTCTN570/NQiOlIWtJf1D0o4k78n5fanaRVWV3/8VqpNTZWaipAuyLPtf59znSL5RdEKRWEnSoiRfGDkgafvQfl6WiYutw8r1TmO8J41IlLplNOzZqm9feQ7AzALSKZxg7DoX3ntTv4yIpHd476+U9IOicxmDgZawLwuSJpDcI3LYNwB07ClIMom4jKp2A8O6j3vUCmGWZV8nOejF4OKS/kCyTMXgCCtJ+qOkvNX70rSLStpU0g0ofzH4JiT/W9JfJA30Xt0aCGDdkf9I2kfS71CeYnCEVSRdK6lXXolDSakLQuTf/E4fRLPkSIwqCHP88owOkLS99/7Pkv4K4L1F5zMW3nsrCPuDvRB/X8dvu2yruQjArFjJ1LAygG0SxB0EVpY0/8h/JB1K8otFJtQtktaQdCOAMos+LBuKwhVrD5ZFYTS0+f4Vg91S2ClbSPqbpFL8LRHaRiW9R9LPMeAt6A2YGPZEtmshZ7RIqQvCvJtfSXliH8PCXQBeqju2Uolmy3pKEAXZ2Xv/d0lXYQBukEhaQdgHpBBbIdm2mEzd9a9I+k2sfGoJnoTDiAOwGgBI2lnS/xacT1dIWlfSXwCsVHQuPWDFUBS++f1YBoVRSR8N4j8LFJ1LgawsaZqkTYpOpFu89+uH1d5L0HuT+V4zUdIVkpYsOpEyUuo9hCRHqTo654a2ICTpvffTAbyn7lebA/i/AlIaSEL72wclfQnAxi1cclPYzN6qWe6LTc6lpF0B7NRivFrWlrSg2YsUh6SVJcVeMXsOwO+6DeKcO0vS/hHymQuSe0k6nOTLsWMPAGtKejwIrwzsJKyk9SRdA2CJonPpIZMknSdpe5JzMOAto5IOkHQGBvh1GJHFJV0p6T0kbyk6mU4huZ2k3TB4SqKdsqqqfpPbkWz1nspogdIWhGH1Jm/2J880fGgI6pdzFYRhH6EVhE1Q1eh2L0lfRE3ffgP+TvIbAH4Xo005jL9nGL8VQ9obACyJuWfz5wGwEYBp3eZjdIb3/mOMrCYj6VfOudcjhPozgAdRbfOMyQQAe6CqZjpsrOW935PkwHZiSFo+qBYOUzE4wru899+U9AVJsd8XPUPSFEk/gRWDtSwm6SpJ7yR5V9HJdEgryuVl410APgvg20UnUibK/MGwBoBF6449QvKJIpLpF5xz/6g/ZvsIGyPJSfqQqmapv0LzYnAayV2dc1uR/G23xWDN+HeEVp9mxeDI+JtL+kPO761ttCAkOZL7xY7bifdgHiQl6dwYsepJ0SY7CEg6mOReRefRKUFA5ioAyxedS1EEEaCjMKD7syRtGb47SrsI0AVLSLpcJfUqLCuSvi5pvaLzKBNl/nDIMwEf2nbRGkYJywCYLKlCMut5Nn2Mqoaoe4cVuVb2jkwjeSzJKB6XHY5/IsnLRg4456ZLOqT2JBOWKZTtAawQOea9iNj5ENpGv4iqgl1M3iVpEslhU3keWOGOMBl1Lga8VTIClPSNopPoBFW9Ey9CMXsGXwdws6TbnHMPA3gEwCt4S7xqAQALAljae78CyUkANgGwXI/zXEXSJaENMUanhZGe+SSdIWkLax2NQ2kLQu/95PquLJJDXxCSfMp7X98SthCAtQDcUUxW/YWkcQA+IukraM04/GqSXyY5avW1y/G/DKAVRa1pYfw/5fxu1GvehGWKI5H34FkxlZNJ3u+9/xuArWPFHAntvd8PwHGR4xqJ8N4fT3KHgoYXgLsk/dU5dweA+wE8BOAZAK8FEaR5UW1HXgjViZbVvPdrkNwG1UnhgVzRi4WkeSSdB+DtPRz2YUkXOucuA/A3krPbDRCEfHaUtBOAXdCbYnYr7/23ABzeg7H6mdkA/glgpqT7nXPPoapr8BqqojXjACwSCviVAawHoKh2+MkAPoQu7JaMtyhtQTjGTe9Q7x8cIewjrN8LsQWGvCCUNB7AxyUdheaz+kJV5v+rsSYaJM0HYP9QCDabIR0Z/2skG72u70R1RnZ8zbFVJS1O8tnuMjbaQdIikj4QOyyAX0aOCZJnSYpdEILkAZK+ajO6/Y+kbSV9odfDArg2eGJeTvKpRieHYuP58PMIgOveDFT9PN9O0lQAUwDMlyzrPsV7/0WSvVK/vorkKQCucM519f4OW3vOBHCmpEUBfFTSEWhtgrSbcQ+T9BeSSdSW+5hHJP3SOXcNqkX8K+1cLGk1ANtK+giAbdHD7WiSjpd0YZsdbnMAPNDl0IsCWKzLGLV4VCe8UvBCorj9j6R5vfeveu9V85NJWrjo3PoBSUfUPTfKsuwnRedVFJImSDrce/94/fOS85N57y9TRINUSePD+I+1MX7Lctne+2vr40jqW6/EsiLpky38fdv9idKenJPrwt77VxLkK0nvTpFzLLIsOynF407481yzH0kfbec5kLSQ9/7BHj6GN7IsO135ZvBdI2mxLMuO9d4/3wd/L3nvlWXZD1I81prHvKH3/o0ePJZ/SEpubh9WOw/0rX1PdvPzrBJacUmap+jXXs3P5ZK2C4J1sR7fclmWfc8n+v7I+5F0YKz823icR8V+3fX6MdRTVlGZDQDMX3fsHpL1HnzDihnUo3rTI+loSQ9LOhmN22pmS/oFyXWcc1NI3hxp/MMlzQzjL9PgdA/gApLrhvFntDFO3gqmtY32mBRfWt16DzaI+5KkS1PE9sPrSdgpswD8nuSXSH6I5MYkJ5KczzlH59xizX5ItiUU5KutcysleTSjuYDk6pVK5eBU+0tJPlepVI4nuYqkk1BdISgtoXg6E2lbZl8meTjJrUj+NeE4AACSc0j+nORaqvp5RmuTr2MxST9MFLtfmEZyS+fcLiSvidmxQfLRSqXyGZKTJJ0fK24jwn1c7D3vQ0dZC8I8Q3prF32Lm1Dd7F3LOsOygippiSzLjpP0iKQT0HjZ/42RQrBSqUwleXeE8RcP448Uoks1OH2kEF3LObdXJ9LYed6bkqwg7CGS1ka+0FU3/AfARZFjvolzLolFBMk9JC2UInaJeE3Sr0i+j+Rizrn3k/wGyQtJ3kzyGZJvpBhY0sYkD04Ru44nSO4ePtce6sF4IPl8pVL5PMktAdzeizEL4mBUJ8ZTcSfJySRP7XX7N8mXKpXKYSSnAEi1qrKbpD0SxS6SV0l+juQ7Y2kejAXJJyqVyodJ7om3RIRSsQbi73kfOkpZEPocFcVhNqSvJ6ho3Vp32KGq7lVaJC0ZCrGZJI/FaFuSWl6XdDrJVUMheF+E8SfWjf+2BqePFKJrh/Hv7WJoWyEsGO999NVBSb8hmfKL9koAjyaIOx5VIQBjNLPD584qlUplH5JXsWqI3hNU9e/9HtLfG9xMcjOSFyceJxeSN5KcLOnsIsZPiaRFJR2fcIj/I7l5jMnRbmDV0mkyqirL0ZF0YhB4Kwv/JrkNye/2sogneRHJrQE8nHIc7/1BKeMPA6UsCEnmzcTbCmENkvLsJ7boeSI9QNLyWZadIumhUIg1Wgl9RdKp4YbsEJL/ijD+klmWnVAz/iINTn+95oZwKsn7ux0fwEyMnkldVlKjFlUjEpLmIdnWHq5WcM4lvZkl6VX13YyOhtSTsAk3klw3fO78u6AcPgAg6X4wSeeFNsOuP1u7geTrzrkDSH4R6doPe473/hgAS6SILekMknu0KzqSCpIPknwHgFsShJ8E4FMJ4hbBP0luQfKmIgYneTvJ7QA8lnCMvazzpDtKVxBKmgBgzbrDbwC4rYB0+hbn3KiCUFKp9hFKWikUgveS/DQaS1e/HArBVSuVyuEkH48w/go1hejRqPotNRt/5XBDGO2Dk1VLgrwvgk1jjWE05P2IL/v+OIBrIscchXPuzESh3yFp2L3t3kTS90lu3WUnQIw8vph4iAudc/uRfC3xOC1BUiT/H8kjis4lBkE9+r8SxT7HOfeJNtUck0PyKZI7ojrxGRVJ/yOpCP/GmDwcWs8fKTIJkg+QfB+qqucpGI+qRYnRIaUrCFFte6zUHbuVZjZaT94K4ZY9zyIBklbJsuw0SfeFQrBeYKiWlySdSHKFUAg+EWH8dgrRWWH8FcP4SVYG8oRl8lqrjfikWA0L7cTJb8xI/hNAywJG7eC93zdF3EFD0omVSuXTqfYEtpHHLkg7SXQJyb172QLbKmEv3FFF59Et3vvPoOrLGJtrnHMfY0S/05iQfJLkTgBiCwcuCeCAyDF7yfMkd4w5wdwNJP9J8shU8b3370sVexgoY0E4ql3UBGVymYmqwW8tS0pasYhkYiBpnSzLzpZ0TxBFaOSz+Yyk40MhdgzJ5yOMP6muEG3ke/Vs3fjPdTt+I/L20NIM6pMjaXEAO8eO65xrSzWyG1j1hEsR9wBJ9ZN3Q0UoBo8pOg8AkPSZhOFvJblvPxaDI5D8tqTTi86jUyQtSDJFi+OTJPcpesKiGSTvJXlo7LiSPhfTlqGXkPx40Xs9czgNwJ9SBCb5PlMb7ZyBfJE3Ik890QRlRhNm+vJWCQeubVTS+qEQvJXkfmhcCD5F8phQiB1HsmvDTknrtlGIPh0KwUlh/K4L0RbJFZaxD8/k7Iv4htgzSPZSIfGXGK1KHIPlAGyXIO6gcLVzLnWLZktIWhVAKn/I50ju3i/7zhrhnPs0gBuLzqND9kJjobKOCEXFk7HjpoDkLxFfeXkSgAEQMK8AACAASURBVO0jx0yOpB+T/E3RedQT2rQ/h6qVVmyWAbBOgrhDQekKQuSrJ1pBmAPJUQWh935gCkJJG3nvz5d0SygEG602PELyCJIrkTyR5H8ijL9BXSHaaPwnQyG6UigEX+x2/HYILSP1+yIXA7BKL/MYNlK0izKR92CD8Z4FcEWK2EPsSfhMWHXpi/1Y3vtDASSZHCJ5CMkHUsSODcnXSe4N4NWic2kXSZ9MEPZykpcniJsMkp9B5H1q3vv9Y8brAf92zn2+6CTGguTNCT0K35MobukpVUEoaSJGm+nOAtBvS+b9wkAa1Et6p/f+Skk3oSpf3+hGZibJT5BcjeQpJLv+ope0lff+dzWFaKP30UMkP0VyxViFaBeY/UQPkbQRgA0jh50D4LzIMZuSsG10d0mN7F9KCcnPkny66DwAQJIj+ZFE4S8jeWGi2EkgeT/JrxWdRzsEgabY392eZN8WFWNB8l+SfhQ55m6D5NNM8mimtSTqGufct1PE9d5vlCLuMFCKglBSRdKHJV2Z8+sZ7LFx6gBxA0bLbW8sad4ikmmGpPd67/8i6S8A3tvk9LtJTiW5Jsmfxtj/IGlb7/3VkqahqhzZiPtJfozk6iR/1A+iRiRNWKaHJFr9uqKg9q3fAkhRwMyPaqvbMPG3Xq/yNmEbVFutYvMKyRSrVr3g2wDuLDqJNkjh63kpybsSxE2Oc+5kVNXlY7EAgB0ixkvJbQDOKTqJZpCcgfxtS93G3SB2zGFhoAtCSeMkTZV0h6TzkDMbb4IyYxP2z91Td3gBAH31hpK0vff+76Hgb+aRdQfJ/UmuS/IXMUQMJG0TCsE/oXk7wszQIrUWyZ+RnN3t+BExYZkeIWlcaD2LCslCjLRJzg6fsdEZNk9Ckl8qOodavPcpiglI+gEj2PcUAcnZJL9SdB6tImmP2DFJfj92zF5B8jFJUffPee+nxIyXCpIn9asabD0kU4ijrS1pXIK4pWcgC0JJ4yUdLmmmpLMw2nfwTUxQpjFjGNQX3jYqiZKmeO9vkHQVgC2aXHJrKAQ3IHl2jL05oRD9h6Rr0bwQHClE1yB5ep+q6d2I0SvCm0hqJIJjdMYUABMjx3wR1ZW6QnDOJWkbBbClpDE/w0vGdSSTKOx1Cslm3Q6d8HKqlrAecjGAW4tOohmSlkP81vR/A/hL5Jg9JbYSM8n3D4Da6KMAfl10Em1wIeKLy4wDYB63HdDvL+65kLSwpKMlPSzpZFRV6pphK4QNyDOoL1JYRpKTNEXSjZIuRfM9bn8nuSvJjUIh2NWHS00hOj0Uos2ei1tJ7kVy/ViFaCpYtbaoF3dYEA0mVIzOkHRggpi/irEHtlNCi08SddMBFG3oCJL/W3QOtQSboUkJ4v68X/ZIdkpQQzyx6DxaILpSr6RL+vm7rEX+AKBrFfEalkCff1dKOrfPupIawqrvcgqf277+O/UrA1EQSlouy7LvSnpM0gkAFm/x0qdIPpIytxLwj/oDRQjLSJpH0v6S7gqF4MZNLvkzye2dc1uRvKzbFomwD3UfSbeH8ZsZNE8j+X7n3IYkLxiUFo08g3rkeHcanSNpKSTYb+KcK3zfWaq9bySnDoEn4VOorjr1E0kU+ZxzZ6SIWwC/AfBs0Uk0wnsfvSB0zl0TO2avCYVR7FXOrSPHi4pz7pdF59Aukv6aIOyyCWKWnr4uCCWtkmXZKcHo+zMAJrQZIvqG1RJyO0ZLNK8WDLWTU7MP9J+SzgSwepNLpoVC8N0k/xhh/HnD+HdKOhfNPWymkdzVObcNyd93O36vyWuhNmGZ6OyPxl6UnXA/gL9HjtkJ5wJIsXKwDJoLRQ00kn4TQ9wqJt77LROEnUGy71stW4Hk65L6WqCD5DYJwl6XIGbPIRm1sPXeN9u6UiT3kbyt6CTaxTkXvSD03qcQySo9fVkQStooy7Jfh0Lw06gq0Y3Fa5J+DOCC+l+QHFSD2Z4R9rrdVH8YiVeNJC0g6TBJ94d9oKs1Oh1V+fLNQyEWoxAcJ+kQSfeE8Zv1nP+B5DvC+Jd1O36B5AnLNFsNNdoglfdgP6xCB5GQq1LELrsnoXOu31YHk7z3SV4SO2aROOf6dk9WsGyJ7SX7JMknIscsiqj3gCTXjRkvJpKuLjqHDkkxefT2BDFLT18VhEHN8TJJM0juhcb5vSzpVJKrViqVQwEslXOO7R9sgTxhmVT7CGsEge6TdCqA5Rudjqox7mbOuV1Jdv33lDSfpINDIfpjACs3ueRqkls453YkWYZZ0xmoetnVsoGkRpMuRotI2hzAWrHDoo9kxBN6Eu7Wq86EAvgPgD8XnUQtkuZD846ITrgiQcwiuQH92za6MRr78HbCvZHjFcntGC2k1g1rS4r9fEfBOddXYlVt8AiqfuHRIGktox3QF+qCkraXdLykrVo4/RlJP3DOneqcey5c74IJ9FxhkW/EbdThnLtemvszM/Y+QkkTAHxM0jEAlm5yugfwO5JfIXlzpPHHA/i4pM+juefWyPjHl22VmeR/vPd3AViv5vC8ANaHTaB0jff+QDL6/cJfSdaLARXJJaiKNcQ2lB8H4MMAfhg5bj9wQ7+1i6Lanh/bc/ZpjO44GWhIZlmW/YHkPkXnksP6CWKu4b1P0gXQa8J9TYZ497oTUJ3E7kdtimlFJ9AJJOW9vwfNdRvaYcmIsYaGwgrCIN+7s6SvSGrlhfAIye8C+Ilz7j91v1sHwEJ1xx4g2a+zev3GKGEZAFtIYgSxloUBHBoKscWanD5b0nnOuW+QrPdH7HT8QgvRfkTSdJLr1R2eDCsIu0LS/JI+HDtun5mYg+RrWZZdQPITsWOHdtvSFYSS+rG7ILq6KIDp/dDaHBvn3HWS+q4g9N6vmmACakkA28cOWiJWRP8VhM8Oqudn4FHELQit46kDet4yWiMiMqIm2exFMJPkESRXJ3kKyfpiEMixJhhDTdHIgeSjAB6rO7woGu/ra4ikJbIsOy5YhJyAxsXgG5J+QXLtSqUyNUYxmGNR0qgYnD0yvnNuSpmLQcCEZRKyO+Kvmr0G4KLIMbsmoSfhZEn1kxUDj3PulqJzyCGF3URZPzv7ctWTZOz9g0Zz+lGw5I6iE+gGSbH3rFpB2AE9KwglTQh7xx4IIh7N1CRvqTH6PoXk62OdmHcza4b0bRPFoF7SkqEQnEnyWDS+QX5d0ukkJ4VC8P52x8sZv9BCdEDIE5axgrBLEnkPXkwyppdWFEhOA5Dk/eK9n5oibsHcVXQC9XjvV4wd0zk3cCqHLXIbRu+97gea7YE34tN3+9Mk3V10Dl3yVOR4C0SONxQkLwjrbtBPRvM307RgNL5xq0bfJPMUMa39rQ1IdiUsI2mFYBHyUCgEF25w+itBEGiVSqVySFih7IqiC9EB4zZUV55qWTO09xodIGk5AO+OHbcfvAfHguS5ieLuJyn23rYi8ajahvQbExPEfDBBzMIh+SqAh4vOIwdTU+wx3vu3FZ1DPc65+g6vgcI5V2991i22QtgByQpCSUtnWXaCpIfDDXqjlZoRNcktR2T9W92HENQR66WAMwBlbV1JxaiCkGRTzx1JK4VC8J5gEdJoZmZWjTLs4TF63iUtX2QhOogEw976mXyHqmKd0RkHAIhtrP4kElk8ROJsVIud2CwFYIcEcYvi6T4UlAHJJRKELfNn6r+KTqCWMGlik3i9p16voh8YdJuQVyPHs4KwA6IXhJImhRv0B0keDWDBBqd7ABeQXC/s3coTN2nGhqiq09VyJ8nYMw5lZzpGt8SsLyn37ydplSzLTmvRK/IlSSeSXDEUgl1/eNUUovcWUYgOOmPssbW20Q6QREn7J4h7TvAJ7UtIPgwguqkwkMbLsUCeLDqBMYht8TEH8Vu/+gZJfVUQovr360sLhJIzoegEchj0grC+Y6lbXL/ag/Qz0VRGJW3ovf+spH1INpspf13S+c65r5G8r8uhR7WLSrJ20TYJdgR3Atig5vC8ADZCjZyxpHW9959v8e88YhHyPefcizHylLSK9/5oSQeRbPb6fUnSj5xzJzrnno8xfllwzk2vtxqRZAVhZ7wDwKqxgwZlw34XjbhK0rYJ4k6RtATJZxLE7jX9+hjGR443q5UtHgNMvxX2ixSdwJAyX9EJ5PBy0Ql0SZk/NwaGrgtCSdsENced2Vz/eJakn4cb9CirNN77yfXDmqBMZ0j6B8kN6g5vDmCapPW990dK+ijJZivLTwWLkO/nWIR0mts6oRBspxA92TnXd4IcfULepIkVhB2QyHsQki6OHnRwGAdgbwDfLzqRCMRuh4pFfWdNt/Tr44xFlO+yiPRjYTIM9OPrfEzRRcNolY4KwuAhOEXS/0hqRXjkSZInA/hRrJWiEUjm2VaUyky8VwSD+kNqj0na3Xv/Hkk7tXDT+zDJbwE4o5EqbDtI2kjSlyR9sIVC9HGS3wZwWqxCtMTcA2AW5t4PsZKkiSSfLiingUPSeEl7FJ1HGQlto2UoCPv1Zi12QRi77auvcM69Wt9VUTCx/35Ga1hBaJSSlgtCSW8DsAqAdSUdhaoZfDPekHSOc+7nqL6JVo38gTq/pHr7ijkAxknaJOZAQ0LeF/rWLVz3uqSfOefOBjAb1ddIt7ksFmxKdkLzfRKP1BSipb4piQVJ772fAWDbul9tCuCK3mc0sOyF/hQZKAMbS9qA5K1FJ9INkvpOUCYQW0Og7G1f/VYIlEmJd5Dot9cBUL3vMoyuaGeF8CBJ324z/jiSB0k6qM3rumEeSX/v4XgGMB/JQyUd2uNxHyD5TQBn96OKX78jaTrJbesOT4YVhC1TMvGTvsN7vz+AzxadR5f01bJSDbEFi8rewthvK3IpFH6NJpgegVFWWp4h9N7nef0ZRhHcTXJ/kmuQ/KkVg52Rt9fWhGVaR9LKqArKGIkgOVVSv92Il4XYn5ullnr33jdSTC8CWxUqhn5TmzWMKLRcEJK0G0WjaG4n+RGS65A8u58l+QcEs57oAu/9QTDZ99QsDmCnopMoKbELwn4rmGLTyNqoCGwitBjK7LVpDDEttYxKmhhmww2jCF4ieQCAS0j2a/vVwEHyIe/90wAm1hxeStIKJB8pKq9BQJKTNLXoPIaB0JZ7SdF5lJBZkeNNkDSB5KBL4I/FEkUnUEcK4bQMwMMJ4pYJ+240Skmrewjz2kWfAnBbxFwGibUBLFN37B5010qwMYDF6o7dCmAYFR/fDaDWWmJ+AL+zYjAJ0zF6BWYy7EuvGe8BsELRSQwJO0tamuSgmy/3Gyn8EZdF9buwdJBcvugc6ng2QcynnHOTEsQ1DKPPaakgzPP6k3RWpVL5fJKs+hxJX5D0jbpjv69UKkd0GtN7fz/qCkKS+5G8vdOYg4r3/jYA69UcGgdgA+R75xldEIRl5ioIvfeTAVxUUEoDgff+gBTeg0Yu86DqSfi9ohMpE5KeTfAaLm1BCGC5ohOoheSL3vs3EFfspuxtv4ZhjEFLewhJjlohdM4N8835qMee9xy1iqTFULX0qOUVAP/sNOYgI8n2tvUAScsAWKv+uO0XboykRUh+sOg8hokeK1UPCym6T9ZMELNwJFUArFR0HjnEXiVc2EScDGM4aVoQSiLyb8aHuSC8EaOlxDeS1Kkv0GSMFqe4iWTZfZ1yyVO/DKtWRgQkrZhl2Q8kPUByr5xTNpEU26OsTHwENpPea9aVtHHRSZQJ51z0vWLe+41ix+wT1kZ/vudjK14SVSEnwzCGjFZu+lbG6M3UTw6z6ATJFwDcW3d4fszd5tgOo4qdMVbJhoVRj91WrbpH0qQsy34q6V6Sn8LYvmGLAFi9h6kNFJIOLDqHYcR7f0DROZSMB2MHJLlh7Jh9Ql9ORkh6IEFY2xttGENIKwVhXivkMK8OAgAk5T0HHbWNStq0/ljeKtkQcTuA1+uOrSlpoSKSGXQkrZll2dmS7ib5MTTec/IsyS/DpLVzkbQGgM2LzmMYIflRSWU3P+8lKYqJDSQtnCBuoXjvtyo6hzFI8TcsZduvYRiNaVoQ5hnSkxz6gjByW6MV3TUEo/lb6w479Oksbb8iad1QCN5Bcj80FpF6WtLxJCeR/HqJpeO7IngPGsWwGIBdik6iRNyL+F5286KqwFsqSO5QdA55OOfuih3Tez9qX7lhGOWnaUE4hljK0BYrNUQRlpG0HIC31x1+DgnaeQYJE5bpHEkbhELw1lAIVhqc/hTJY0iuVKlUjiP5Yq/yHDQkzUNy36LzGGaCJ6ERgTDxFl24zHtfb2Mz0EhaH8CKRecxBjNiB+xGIM8wjMGlYUEoaR4A9XsChAQfQgPILRjd1rh2B+0yuYI9w+65Z8Iy7SNpS+/9ZZJuDoVgo/f3IySPILkSyRNJpjA5Lhs7YLT/qNFbdpRUP4FmdIikm2PHJLlbmVp7vfd7Fp1DA+4BMCtyzC0lzR85pmEYfU6zFcL1AIyvO3YfyRSGqAMFydcB3FZ3uO22xrwiZ8gFZUYwYZkWkbRNKAT/hmpLXSNzsQdDIbg6yVNIvtqjNAceE5PpC+YBYKu0kXDOXZ8g7OIASmHLEroC+rZNnKQHcFPksPMD2CJyTMMw+pxmBeGo1oExxFSGkhjCMnlFzpALyoxwN4CX6o6tLGnJIpLpR0IheLWka9F8b9VMkofUFIL1q9tGAyQtDtu/1hdY22hU/pQiqKRPpIhbADsDWLboJBpB8prYMft8VdQwjAQ0EpmA934yOfdigxUrb+Gcmy7N3dkpqeVVLEmUtEnOr27sNrdBh6T33t8EYNu6X20C4IreZ9Q/SNpe0tcltaJ2eQfJkwCcO6y+lpH4KMa26eiGh4KQj08QuzAkLSHpUaR5ztaWtJmJm3UPyXu9948CWC5y6PdIeifJv0aO21MkHVN0Di1wFYDjYwYkuaekI0jOiRm3l0jaSdJXI4Z83Dm3a8R4htFXNCwITVCmKd2uEK4G4G11xx4l+e/OUyoPkqaT3Lbu8GQMYUEoiQB2kfSVPJuSHG4l+Q0AFw77ftQYpFqVIvnzshWDAEDyGe/9bwHsniJ+8CS076IISLoyRVukpGMxwIqjknaRNAitk9MBPI/R9xLdsBSqHRGXRIzZU7z3+5HMm3DvCEn3x4plGP3ImC2jkhYEUC8/PBuj7QCGmbsBvFB3bIU2RA/yVhNtBTaQtxrdzgpsGZDkJE2RNEPSpQCaFYN/I7kryY1IXmDFYPdIWg/ARilCAzgnQdy+gOTPEsbeR9ICqeIPE865CxOF3k7SlESxkyJpHknfKDqPViA5R9LFseNKOip2zF4haWGSUVv8nXPXxoxnGP1Goz2Em2L0CuJtJkLxFuFmO29DdysrOLmCMiStIHyLvOdiKCSxQyH4IUl3hkKwWUEyjeSuzrmtSV5mhWA8vPcfSxT6jyRTGEv3C78H8K9EsRcBYO1bcbgaVauj6Eg6TVLMlate8XkA6xedRKs4585LEHYrSe9KELcXfBTAhMgxB7r92TCa0aggNEGZFsh7Tlq1RxhDNdMKwgDJhwA8VXd4SUnLF5BOT5A0TtJUSXdLOh/Amk0umUbyPc65bUhe1oschwlJ40jukyI2yZ+niNsvkMwk/SJVfBOXiQPJ2ZJ+kyj8273330kUOwmS1pT05aLzaJNrAETfaiLpe5Ia+dj2HWF19zORwz4E4I7IMQ2jloZb+HrBmAVhXlFjgjKjyXtOWjF2DR+yG9QfhgnK1JPneVm6ttFQCB4s6X5JZ6G6v7QRV5PcIhSC0VXmjDfZBcDEBHFfxADvz2kV59wZqH6upeB9ZZ4c6iXOuR+mik3yQEmHpoofE0kTJF2AqvXCwBAmX05LEHojAJ9MEDclU9H8+7MtJF1kXTdGYsYHrYjCGLMgNEGZlsl7Tia38IddF/kej/V7EoeaPE/GMhnUSxov6XBJD4Yv9EY3uB7A5SQnO+feSzKFh5hRQyrvQUnnkfxPitj9RGiJTdVq5VBtDTO6hOTNSNidIukUSdumih+DoPr9M1S/mwcO59yPAES3E5J0oqS1Y8dNgaSFJX09dtyE+2yNwSW2GFwFo2uCnpJbEEqaCGClusOzUBVRMWog+SiAx+sOLwZg1SaX5rXk2gpsHZ2uwPY7YSb68LAieDKAZRqcPlIIbuqcm0LSVpF7gKSlAOyQIrZzrtTtorWQPCNVbEkHFj2rWhZInpIw/LySLpG0ccIxOkYSvfcnA/hQ0bl0CsmnJKXYSzhe0q8lFXqz2gre+1MAtCrq1yr3ArDJV6OeFF7OzeqGpIy1Qpjnb3aj+ZiNSdv2E9aS2zJ5H8SbSGq0/7VvCTOYR0t6OBSCSzc4fbakX5BcOxSCN/cqTwMAsB+AeRPEvWfIVncvxGg15lisDmAQrAEGgfMA3JMw/iKS/iBpnYRjtE0oBr9P8tNF59ItzrmvoaoGH5t1JV0gKcXnYRQkHUDygNhxSf7A2kWNHFIUhBsmiNkyuTfVecWKCcqMTZ4yaLO2RhOUaQ2STwN4pO7wIoi8RyA1kpbIsuy4UAiegOoq8li8EQrBdSqVylSSKW/SjDGQNDVFXJI/TRG3XyH5qqRfp4ofPAmNLiGZkYzeblfHEpL+IundicdpidCy/2uS/1V0LjEgOTO0vabg/d77M/tRZEbSdpJ+nCD0LABnJohrDD7Rt3x475N0JLVKbkGY15Jnq1cNGVUsN2prlDQ/gPpZ0gzm8TgWea+9gdhHKGnJUAjOJHksgEUbnP66pNNJTgqF4H29ytOYG0mbAVgvQeg5AM5NELevCeIySSD5keCba3TPrwDclniMxcNKYaFCM5JWk/R3DHCbaB7OueNRLWSiE/w/L5A0X4r4nSDpncGHMXpO4fv4pdhxjVLwZOyAJHeTtETsuK0yqiAM+zHybrZthXBspmP0BtONGrRXbITRrWh3kHwlemYloJMV2KKRtHyWZadIeigUggs3OP0VSaeSXKVSqRwS9qUaBeK9TyImA+AKktHl4fud8B5ONeG1MIDdEsUeKsIq4RE9GGpeST/03v9e0oo9GO9Ngi3B4ZJuRppJn0Ih+W+SxyUcYjdJV0pqtO+9J0jaU9Lv0fj7tVNedM6dkCCuUQ6eSBBzPknJFJ+bkbdCuAqAxeuOPUEylcHwwEPyRQD1qznzY+wvG2vJbY88YZm+LAglrRQKwXvDnpQFGpz+cigEV61UKoeTrBcnMgpA0vwkP5widtm9BxtB8sxUsc2TMB4k/wSgV56mO0i6Pcuy41Mb2EtykvaSdEvYv933Iild8H2k9c17Z3ged044xphImj/LspOCV2+j79iOIfltks+kiG2UgscSxf1QlmXfKWK/bl5BaHYTHTBGQZfbNmqCMm0zA+2twPYcSatkWXaapPtCIdjIx+olSSeSXCEUgilmmozO2Q1AipvTZwH8NkHcQeEXSLMRHwC2k7RCothDB8lPoeqV2QsWIvkVSQ9lWfYtSVFtHyQtIelTkm4Pe1n7StQmBSRnkzwQaQRmRpgo6XLv/SWSJiUcZy4k7SLpdpJHAkilMPwwgO8lim2UAJLPA0jS7UPys5JmSPqEpEbbjKIyT/0B7/1kcu73WF7LnjE3zrnpkvarPRYKv1EbnU1Qpj1Ivui9vw/AGjWHR/Zh3lJMVlUkreO9P1rS3iRHvZ/qeEbSD5xzJzvnzG+yT0m12iTpbOfcGyliDwIkn/XeX4o0e7YcqobUqUVRhgKSj0o6UtJPejjswiSPknSU9/5WSZc7564F8DeSLe+JC6InGwF4h6T3StoeadSC+xqSN0r6mqSvJh7qA5Len2XZ+c6575G8KfYAYfL3A+E1maeCH3U4kp+wLTxGC9yB+DYnI6wn6XQAp3nvZwL4p6SXUN0f3PG+VufcyWMtQoy6gTVD+o5pSVhG0iKS6hUyXwNwZ6rEyoCk6STXqDu8GQoqCCWt770/UtI+JJuprj0l6UfOue8652yDeh8jaVlJ70kR2zl3Voq4gwTJn0lKIuIh6SBJ3zCJ+GicAWAnFLM/cwOSG0gCAO+9fxTATEkPo7rS/ppzbhaAcd778QAWIbksgEmSVkHjDo1h4psAtgfwzsTjjCO5r6R9vfe3kPwNgP9DVRuhIwNvVX0Pt/Hef0DS7gCWiplwg3F/6py7qhdjGYONpBkk35t4GKLqT7hq/WJdh5yLMfY/zlUQhs3W9T4YQrVlz2jMLai2Q9UqXa0taeE6lapNMbpV92aSKVs7Bp6wArtv7bGwAnt6L/OQtKGkL0jak83fnY+Q/C6A051zr/YiP6NrDgCQQlZ9BklTEQauRNVGJkV758oAtgFwbYLYQwdJSTowtHAWafPjUH29rFD7kRuKRUS6SWqFDGk+G5JBco6kD0majjTvuTw2DPeRXwXwkvf+Bkl3OOceQrUVcxaqvqQe1XvQRVBV314YwFLe+zVIri9pPQDz9PDvCwD3OOeO7OWAxuDinLtG0jFF5xGL+hXC9TB6o/V9JJ/tUT4DC8nXvfe3YW7BGAdgYwB/rjmWJyhj7aLNyVuB7ZmwjKRtVDWU36WF0x8ieTKA00i+ljo3Ix71bd+xGGYxmVpI+izLziL55RTxgyehFYSRIPmipD0kXYc0So6DwnOSziT52aITaReST0naTdK1AHptz7IwgO1Jbj9SwDejxwVgLS+R/KDZTBhtcB2AV5FI2KjX1K9U5bU4Wrtoi7QiLCPJBGU64xaM3iC/bmgrSYakbbz3l4Uv02bF4AMkDyG5GslTrBgcLCS9A3PvU43FGwDOSxB3IHHO/QyjRaKiQHIvSRNSxB5WSN5O8gNIJwjU73iS+4UVroGE5E0kd0f1s8gYjSe5H8m7i07EGBxIvirp0qLziMVcBaGpX3ZH3nOVUwCaoEwHhOKqXka7AmCDFONJ2t57//cWC8E7Se5PcnWSp5OckyInIy1hdSk6ki62Lou3IPkQ5u6aiMkEALsnij20kPwzyf0ADN1nW9iX+rui8+gWkn8gWrHE7wAAIABJREFUuQ+qra/GW4jkf5EszY290TvKpA0wV0E4RguerRC2Tt5z9eZzKmkpAMvX/T7Pw9DIYYzW2mhto5IoaUrY83AVgC2aXHJbKAQ3IHk2SfuiHVAkjSeZROzEOWftonWQPCNVbPMkTAPJC0juheFaZbrMOXdc0UnEguRFYaXQ9rQHSB5DcpQavGG0yJUA7ik6iRi8WRBKWhDA2nW/nw3AhBBa525UN0vXsqKkEVnavOLlxk5VuIaNvBXYvFXtdgmGxVMk3RiW/5vFvJnkXiQ3tEKwNOwJYKEEcR8DcHWCuIPObwA8nyj2tr30RRsmSF4c2kdfLjqXHnAFyQ+V7fuZ5KUkd0YX0vUlQSQ/T/JbRSdiDC4kM5JfKzqPGNSuEG6K0SIzt5G0maQWCXLneR48mwL5xYsJyrTFqOeqG2GZUAh+SNKdoRDcuMkl00ju6pzbOMyWm7x9SZB0YKK4Z9qEwWhIvibpV6nCe++TiAMZAMnfk9wKwINF55KQq0juTrKU+yZJ/inYYt1VdC4F8QbJqSRPKjoRoxT8CsD1RSfRLbUFoQnKRCDvORspBPN8CW2PZlvcAaDeLHY1SYu2E0TSvJKmSrpL0vkA1mxyyTSS73XObUPysnbGMvofSSsjkU+Xc+4XKeKWAedcsrZRkvtLqhdNMyIRhGY2R7VdqmxcQfIDZRcFI3kPyS0BDNt32vMkdyB5TtGJGOWApCe5Pwa8FfvNL0wTlIlD3nNWUwhuknOJPcctElZa6luYibAC2wxJ42oKwbMArN7kkqtJbhkKQWv7Kyne+wNRfR3F5lqSpdhbkAKSN6GqHpyClQC8K1FsAwDJp0nuSPIQAP8pOp8ISNKJJKcMS2cUyRdD8XsIhqMNeDrJTUn+uehEjHIRJlg+iap3+0DyZkGYt3oFE5TphFxhGUmrAJhYd/xJkv/qQU6lYYxV64Zto5LGSzpc0gOhEGy0v0gALie5mXPuvST/0U2+Rn8jiST3TRHbvAebQ/JnqWKnUo013oKkgrLyZAB/KTqfLniB5Acrlcoxw9biXfM33BDp1H+LRpJOIrk1yQeKTsYoJ0FT4otF59EpDgAkTUR1RrWWWaiKpBhtQPJRAI/XHV4MwN45p1vB3SYtWnuMHJ8QCsH7JJ0MYNkGoT2qheCmzrkpJG3ldjjYDsDKCeK+AuDCBHHLxrkAkrTmkdxDUgqhIKMOkv8k+e5gTfFY0fm0yR/CqtFQ2w6QnOmcezfJjwB4tOh8InIHyW0rlcrnSdZ7GRtGVEh+k+RhSOS1m5KRFcK8G+oZwzZTFpFRhZ6kg+uPkbyxN+mUirznbK7Xr6RFJX1F0sOhEHx7zjUjzJF0Nsm1QyGYJwpklJTQLhodSeeTnJUidpkg+ZykSxKFHw8giZWIMZqw0nQOydVIHgWg3703HyD5QefcjiRntnB+irbyvoPkr0muSfJ/ADxTdD5dMIvkkSQ3JvnXopMxhgeS/0tyF4xeHOprHAB47zev/4WkgVfMKYoxVpdWyDlmK4Ttcx9Gy9UvJ+ntkhbPsuw4SQ9KOh7VldmxmC3pFyTXqVQq+9ter+FD0sIkd0sR27wHW8c5l6xt1DwJew/JV0l+m+RKYaa833x2HyV5NMl1SP5fG9ctEDmPOZHjRYPkKyRPILkyyaMxWCuGL0r6BslJJL9jq4JGEZC8guS6kk5D1cKv73FAvnS/c85Wrzqn1UJvRtIsSkiwehj1vEn6iaSHSB4LoJHq6GuSfkBy1UqlMpXkvcmSNfqdjwBYMEHcBwFclyBuWbkaQKp9Pe+QtEai2EYDSL4cZsrXJLmDpLNR3YpSBAJwDck9Q5HzrXZVRL33sQvCvhfiCX/Db4XnbHdUVWX7tXPsAZJfILlipVL5Esmni07IGG5IPl+pVD5JcnVJP8Jon/K+YsR3MK9ldFlJ1m7TGYu0cM4LqBoop86ldEjK84baucllr0g63Tl3knPu3ynyMgaLVN6DJM+geVS2DEllWXY2yeNSxPfe7wvgyyliG81h1dj9SgBXSvokgO299zuS3AGNBb665TVUlX7/gOr+8G67QKJOHjnn+r4gHIHkHAAXA7hY0lIAdpe0B6p2PfMWmNoLkn7jnDsTwHX2uWv0IyQfAvApSZ8FMMV7vwvJ7QAsV2xmczOPpEmSlqj/Rdh7ZaRj0eCBZ6TlZf3/9u497rap3h/45zOW+/1+i3IvFKESInfRjUicUs4ph+LXRamcdHS6na6KFN1QEt2UiIhsl5DcU1RILiHkujf2Nr+f3x9z7s5j7TUva625nvXsvT/v1+t5sdca8zvGWs+a65ljjjG+QzoxpfQZdwRtNknrS5pjqnwLAoD3HuxTSunbkj4KoNN2bJIHSPqY18SPX7Gdw1nFDyStCuClEfESkhsBWBfAeuh/euZ0AH+S9OeU0s3It3O6mGSbna5VWowFzAUjhL2QvB/A8QCOl7Q4gG0iYgeSWwHYBMASI6z+SQBXk/wVgF8B+F1Kyee1zRWKWQk/Kn5m74G8CYANI2IDkqsg/55ZCfmNliXxfwN3o2+fpH0lnTZZFZpNkoclHZtSOpbkP8fdGDMza6bIfL4C8q2algWwEPILo4WRd/4eKf47HcCDJEee2TQiLkSelbgVJN9F8vi24k0FkhLyTv0mANaOiLVIroX8Inf54meRmjBPIl+zeK+kuwDclVK6AfkexH/2jR2z0VggIl5KzhfJs2z+8CDJLwE4LqX02LgbY2Zm/SnWfz0A4OZxt2WCtqd3/aPleGNXTA/+c/HTk6TFkHfsgf9bXvMogIyk/2abjckCJEcxbcpssj0g6WsppaP9R8XMzNoiaTFJba93vKPleHOFYhrv7Omy3RnDzWxMFpD0OwB/GHdDzAaVUvo9gG+nlJ4cd1vMzGyeswnaX996R8vxzMwGtkCn03nfuBthZmZmNkX1ysQ+jMdJPtRyTDOzgU1a9hozMzObWiTtJ+n9bcYk+eYWtnmYMiTt2nLIUe27aWY2EHcIzczM5l/PANi85Zg7A5gnOoSSFpW0Xcsxr2oznpnZsNK4G2BmZmZjc1fbASW9tu2YY7QH2t+U/rdtxjMzG5Y7hGZmZvOvO0cQcydJbW/TMBaS3jmCsJePIKaZ2cDcITQzM5t/3Qvgny3HTBHxrpZjTjpJmwLYpuWwj2AemU5rZvMOdwjNzMzmUyQF4MoRxD1U0gptx51Mkv53BDF/WWzgbmY2ZbhDaGZmNh8jecUIwi4ZEZ8fQdxJIelVANrOLoqU0o/bjmlmNix3CM3MzOZvI1nTRvJtkl49itijJGl5Sd8aQegZAM4dQVwzs6G4Q2hmZjZ/uxTAgyOIS0mnSFpnBLFHQlJH0okAnjOC8OeQnDGCuGZmQ3GH0MzMbD5Gcpakn4wo/LKSfi3peSOK36qIOBrA60YRm+QJo4hrZjYsdwjNzMzmcymlH4ww/HMlXSBpvRHWMRRJnSzLvkzy3SOq4gaSF44otpnZUNwhNDMzs4sB3DLC+OtKukLSLiOsYyCSlpL0M5LvGVUdJL84qthmZsNyh9DMzGw+RzJIfnbE1Swv6ZdZln1B0uIjrqsRSbtJugnAa0ZYzZ0ATh9hfDOzobhDaGZmZgBwKoC/jbgOkny/pJslvVlSZ8T19SRpk4g4Q9I5ANYYZV0kP0hy1ijrMDMbBsfdADMzM5saJL1N0smTWOVtJI8BcBrJUWQ6/RdJCwLYXdI7ALwak3MNdFFKaYdJqMfMbGDuEJqZmRkAQBIlXQhg+0mueiaAC0ieC+ACAH8iqWGDSloNwA4RsRPJ3QGsOGzMPjxDclOSN01inWZmfXOH0MzMzP5F0vqSbgCwyBib8SiA6yT9OaV0O4D7AUwH8HDx3+nIO5GLA1gAwNIAVgawckSsTnIjABsDWGkcjQcASR/rdDr/M676zcyacofQzMzMnkXSIZKOG3c75mIXkNyVZIy7IWZmddwhNDMzszlkWXYCyYPG3Y650P3FVNF7x90QM7Mm3CE0MzOzOUhaqFhP+Ipxt2UuMoPkziQvH3dDzMya8rYTZmZmNgeSM0m+BsAV427LXGImyb3dGTSzuY07hGZmZtYTyUdJ7gzgonG3ZYrLSL6lyJJqZjZXcYfQzMzMSpGcTvK1AM4cd1umqMdJ7kXyR+NuiJnZINwhNDMzs0pFp3BPku8F8My42zOF3EpyK5LuLJvZXMtJZczMzKwxSTtK+i6A1cbdljE7m+T+JB8Zd0PMzIbhEUIzMzNrjOSFJDeUdCyA+XGfvftJvo3k69wZNLN5gUcIzczMbCCStis2sN9o3G2ZBCHpGyml/yL58LgbY2bWFncIzczMbGCSEoD9JB0FYL1xt2cEZkk6PaX0OZI3jbsxZmZtc4fQzMzMhiZpAQBvlnQIgJeOuz0teELSiSmlo0n+bdyNMTMbFXcIzczMrFWSNo+Ig0nuA2CpcbenDzMBnEfydABnkpw+7gaZmY2aO4RmZmY2EpIWBrB9ROxB8nUAVh13m3r4u6SLU0oXAjjD6wPNbH7jDqGZmZmNnCQC2BDAlhGxNcktAayPyb0WeQzALZJuSildBuBSkrdOYv1mZlOOO4RmZmY2FpIWQ94pfD6A9SNiXZIrAlgZwEoAVgSwcMNwTwF4EMD9AO6X9ACA+1NKdwH4E4CbSd7d9mswM5vbuUNoZmZmU1YxsrhM8c8lACyIfP/DR4vHHif5zDjaZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm8yKOuwFmZmZTlSQC2ADASyJifQDrkVwOwFIAOkWxJwA8IumOlNLtAK4FcC3JGWNptJmZWR/cITQzAyBp6Yg4YrKqSyk9AuDR4udWADeSfHqS6rcKkhYC8OqI2JfkdgBWGiDMMwB+S/JMAGeQvK3NNpqZTUWSdouIV1aVSSkdQ/LeyWqTmZlZI5JWjwiN8WdmRFyTZdknJK077vdjfiTpOVmWfTEiHmr5dxsRcYGkvSSlcb9OM7NRybLsM3XfiZI2GXc77dn8h8nMbGpYEMBmJI+U9OeImCZpi3E3an4gaZUsy74h6XaShwFYruUqCGBHST+WdIOkPVuOb2ZmNjB3CM3Mph4CeKWky7MsO17S0uNu0LxIUkfSeyXdQvJAAAtNQrUvlHRGRJwjac1JqM/MzKzSAuNugJmZlUokD5b0SkmvInnnuBs0r5C0hqRTAWzToPijAC6RdE1K6c8A7gIwA8AjABYFsBiAVQCsGREbk3wpgI1RvU5/N0k3Sno7yR8N9WLMzMyG4A6hmdnUt4Gk8yRtRfLhcTdmbidpZ0mno3pq6AxJP0opnQTgMpJZn3WsCuC1kt4GYKuSYktK+mGWZZ9PKX2IpPqpw8zMrA2eMmpmNnd4QUR8bdyNmNtJerOks1HeGZwu6bMk1+x0OgeQvLjfziAAkLyX5DdSSluT3BTATwH07PCRPDwiTpTU6fW8mZnZKLlDaGY2lyC5r6Sy0SarIelASaegfK3gOSQ36nQ6Hyb5QFv1krw+pfQGktsDuKWkzAERcUJbdZqZmTXlKaNmZn2QdEJK6SdDhOgAWAbAupK2BLAL8gyjTes/DMDlQ9Q/X5L0JknHo/e6vpkk30dypCOwJC+WtHlEHE/yrT2ef4ekv5L89CjbYWY2KimlWyVdUFPs8UlpjJmZWT+a7kNYdMjarHflLMtO6mNPu6ckLd5mG+Z1kraMiKdL3s+HJW09hjZ9pKQ9z0hqkujGzMzMzMzaMq4O4YT6/7tpp1DSjqNow7xI0goRcVfJe/mQpM3H2Lb/KmnXHZKWGFe7zMxs/uI1hGZmU8MnAFzfsOzao2zIvETStwGs3uOpp0nuSfKayW7TbCQ/LenkHk89LyKOmOz2mJnZ/MlrCM3MpgCSkvQ1Sd9oUHzlkTdoHiBpL0mv6/UcyUNIXtJnvIWQ7y+4MYAVI2LZlNIjAG4FcPEgiWhSSocWU0TX6WrfYZJOIHlXvzHNzMz64Q6hmdnUcXGTQhGx0qgbMreTtLikY0ue/hnJb/cRa/OIeI+k1yJPCAQAIAnpXztJZBFxNsn/Jnlj1/GvALBhV9j7SZ5JcrqkQyT9suv5RSLiEAAfbtpOMzOzQbhDaGY2ddzRsJz3q6v3LgCr9Xj8cZIHNwkg6bmSjpX0erJXctJn6QB4vaTdJR1O8pgJcY4FsGlX7K8BOBMASJ4XEb8GsMPEMiQPlPQxkk81aW+D17M0gHWLn1UBLB4RSwKYmVJ6AsA/AfwVwE0k72+jTuufpOci/7ysW/x+FkkpPQbgXgA3ALhhkL0xi9iLA3gxgBcCWC4ilgbwVDHS/QiAGwHcSPKZFl5KP+1aEMBaANYD8BwAy0bEoshf+wwATwB4EPm2LbeQfGwy21enWPO7GfLZA8tFxGIppUcBPAzgfgBXkbxnktu0FP7vfF8NwGIRsRSAWSmlx5Gf73cgP9/vm8y2jYqkBQBshHzGxfMALBERiwNQ8Rn/J4DbAdxM8u/ja2m5Yj/aFyL/DlglIpYpzoGHi58bAPyBZLRZrzuEZmZTBMmZETEDwGI1RR/u9aCk/dG7EzTR3SRPHaR9ZST9P9S3+dskH2yz3or2LC7pA72eI/m/TTo7kvaV9E0A/SZ3WVDSlyUtQPKLktaUtGl3oZTS+V3t+pKkHbqKLYe8k3hOn20A8K+L7FdHxE4kd5C0QXeZ2R3dCSOdAICI+IekX6SUzgDwK5JP91Hv2gDeWFNsJskvNY3Zo453AliqqgiALw7RcfoPACvWFDua5Kyu49YFsFfFMT1ft6QVALyr+Nz96/dU8vt5MMuyn6aUjiV5U00bZx+/i6RDJe0MYJGa+DMi4hKSJwA4e9D3sKY9BLBFRLyK5G6SNkPXNWnZZxMAIuJPks5OKZ0F4NJhLo4lrQfgDRVFnib55ZJjXyXpIEmvQtf72uOc+lvR5q+Q/NOg7S1TdIZ2j4idi/O9e1ZC1fn+QNf5PvBNKEnbAdiipthJJP8xaB1d9S0L4I2S9i62cnrWd3bFa75N0gUppVMBXEZyzg9a/20hgA/WFPt+r6UAktYrZqLsjQnLQnp9lgA8GhHTSB4P4Pw22m5mZhh/ltGiDZ2IyBq04d97HZ9l2ccavIYnizvHbbV5wwZ13lXc9ZwUkv6zIqtoXce16ftY9/OMpFdIem+P52Z2/w6K3/093WWzLOt7b0RJS0r6QETc2cLrUETcLek/iw5mk/qXj4hZDT7H69RHK43f5DzZbMD4i0f5NiWzf64rOfZ1Ncc91lU+SXp/RDw+wO8lsiz7btGZLHsta0fEr4f43f+lmPLcCkmUtGdEXNfSZ1MRcaOkfSQNlChR0h418R/pccwLI+I3A7Y3i4ifSlp1+Hc0H52UdFhE/K2l9/MeSe9ser53y7LsMw3OzU1aeN3PzbLsuIiY0cJr/qOk/Yf9O1V8j9e99m27jlk6y7KvR4PvzJKfP3THHISzjJqZTR2rodn38lW9HkwpfQdA3Z3yRQDs2We7SkXEPnVlJJ06ilGGivreXvL4N0nOqDo2y7JPkjyqhWZ0JB0nqddo0W+7p7yRzCSd312QZN2d9meRtI2kGyV9HsAa/TW51HMkfV3SDb1GHbqRfAjAbxrEHXT7lFei2Xky6H6OrwSwUFUBST8bMPbEGItLOlvSF9D/SDQAkOT+kq4uRrm64+8h6QYA2w/RzHUlTcuybOhzQtKLiraegXzaalteJOkHkqZJqpshMTTla36vBrDVgCESgD2K82n3IduyVRHniwCeO0ysCVZTnuDs95Je2FLM1khaSNKRkm4heQiARVsIu4Gk70r6naSXtRCvEUkvkfR7kv+JwWdtbijp11mWfXzQmyKAO4RmZlNJ95TBXv4M4I+9niD5VwDT6gJI2q+/ZpUj+aa6Miml77ZVXx3l0+16/kFPKX2r5ti3kfxITRUPSDqG5F4ktyS5S9GBvLtH2U0AzDG6QnKOjl/Rvl5JhTZoetda0hGSLgKwZpPyA9hA0pUqydw6Eckz68pExEAdwojYrkm5Qe+aR8QudWVSSkN1CIuL2nMA7DZMnMLzJF0oabkJ8Q+S9BMM1tHs1iH5MUkDJzhSnvH3KuTr7EZlG0nXSOrrJko/siz7X0nHAVi4hXArSjqz5KZRLUmHS7oEo9uG6PmSrpDU2g3EYUlaQ9Ilkj6BdjqC3TaV9BtJH1A+/XNkJO0saRrauXHXIfnRiGiSpbwndwjNzKaAYirVIXXlSH6zar0AyZMaVLejpKEzlUraGMALaopdTbJnB3ZEdi15/DqSt5YdJOl5xYVeRRF9keRanU7nvSTPIHklyV+R/DjJF0g6pWEbe3YIAdzc47FF0WCbEUkfkvRpjD7h0JKSfqx8q4wqtR1CktsPctFFcruGRbcZMP7ONUX+SvKGfuNOFBFfATD0NK8J1oiIrwKApLcoT1rU6jWepE9I6ntkT9Kekn6ACWvsRmgVST+X1Nbo+L9I+gDJtrP+LiDpO01G3rvacpikz2H05/sSkn6ofF3gWEnaqLipMLIOf2EBSZ+PiG8OO4W0jKTNi5HyxduMS/Ltkg4d5Fh3CM3Mpob3AXhpTZm/AfhqTZkzADxaU2YB1Cf9qBURtaODJCdtdBAAJPUcdZJ0ds1xX0f5aMp0kvt0Op0PkJzeqwDJ6SmltwH4aU0T/wng6pLnbi95fOmqgJJeWXQGJ8uCxUXic8oKkLwdwO9r4qyIPCtjY8rXyzWdxrYi6m9YdMdfHXNuEdJdZtjRwYOKKWKtIvkmSQcoT4Y0iuu7BYqRmcYkbSDpe5jczMgrSfqp8iQrrVC+HvizbcXrsnjNzajutmxddAYnywLFlNzWO9lNSVqvmP2wymTVSfLtEfHNEYReUtKP0c7o/RwkfVoDrE91llEzszEq5vwf1uBiYxbJA0g+WVWI5Iwsy35Qd8FZTBut61xWIlm3fnAmgNOGqWMAPdf1pJQuLzugGFEpG1l8huQbyqZ5TkRSxVS9nQAsWVLswor1lGWp9EsvHIqR5ePQvANwi6RLU0q3IO+cZgBWjojnkNwU+fvXJJnEKpK+gorsjJLOJPmimjg7Ik+j3tQrAfQz6rcNeo+8lqkbHRx2uuiSkk7o8bgAXC3p3JTSHQBmId++4MUkd0V99mAAoKSyGQKPSDovpXQNgAcAPANgxYhYh+QeyLd6aGJ3SauT7DVF+lmKz+ZJqM9APFsG4FJJv0sp3Y78xtaCyN+HFUi+EPnvf5mqIIXNAewPoMmMiTqLFZ3aXufYY8ozh96IfFsQAVg+IjYnuQuApjMxtpe0FcnS76nZivOuaQf7T8X5fjPy8/0Z5FsZrDbhfK9cL1tYqRh1fm3DelsjaRlJZ6E+6+9E10m6KKV0K4CHkE/xXbU4n14FYNkmQUj+u/K1iq11wCV9Cb2n9WcALpZ0SUrpXuR/D5aLiPVJ7oR8O40mloyIdwM4opUGm5nNTzTJWUYlLSLp9RFxRZOsdCpJlFIS++UNYoakNYdo/+YN6hg68UafbVqx4ve2fMkxKSL+VHFc7TTeblmWHVMR7x1Vx0aP7JnF1Nyy17xNw0x0P1KDrJ6SVs6y7NMRMbPh+VA6hVDSSxrE+EVdmybKsuwr/WTgy7Lse33G/35NzH9UTSNTfZbRXj+XStq8IubCko6MXL+xZ0j6iKTS6ZrKM52+IyKeaPg7f0uT91L12Ttn/zyZZdln1WAae/G9eXBEPNwg7mUtt3Piz0PKt/EoXUsoaVFJh0fD7JFZln2lQVubfLcrIs5Qj0RDPeKtlGXZJ6M+q+7s333dLJbWs4xmWXZyH7+X8+piK1+/e1BEPNQw5kw1zFisBllGe/w8k2XZCZIqRz8l7RYRdzWMeUfT99fMzCZo2iGMiOsj4odD/PwiIn4XEU82rG+6pNqpmd0i4o8N/igPvB4my7LPNYhftbdX6yS9oqQt/6w45tUVr+EiDbAGTdKrKt6T51Uct0TJMaVJI5pskZFl2Yn9vo7i4qP2QrbqIlYSG1zAPK4+0ttHxO/7uNBSRPytj9ecIuIfNa/32zUx+uoQZln2jaoOZlfsj/b52p+uGPnuFX/3yNW1+fgm8SLi7AZt/IcGSAKjfNuHB2tiZ5Jq12gN0CG8sZ8pecWNv9r3NSL+0CDWkQ1+P98d4HzfJRrcBMqyrNfo9rO02SGUtGPD38lTkt7bz+uWtEZETGsY/xo1yOA5QIfw8WJGSdM2rx49ticqeY8H2tbHzGy+1keHcDJ/pjW5y1vyeg5vEH+gxBjFhf5fa2I/KKnJVKTWSNqrpC3Xlh0TEb8qOWaWpKZTdLrb8YKSmJVTF8s+g5qQPbJH+3/Y4MJgoHT0WZYd2+AzVLbucXaMrzZo39ZN2iNppcj1dR41HQmXtFmDWJVT5vrsEJ7R5wXswtHH3pKSPtQ09mwNRkgVEb9r0NZFo8Gok6TajK4VdRzcIH7tyE6fHcK/VJ2PZbIs+1aD2CGpMoFUk9/PoB2BLMu+1KCNc2yo3iNOKx3C4u/MVQ3a9IykPQZ5zZIWjIjzG55P+zaI10+HcJbqk3P1quP1DdvbeFYR4KQyZmZT0QySb0wpbUfyLwPGOAX5epEqGw/Y6dkCNVsbSDqd5MwBYg+jbN3eHBtLA/kdYpTvhfcLkrV37Ev0XJ8v6Vc1x/Va1/IwydIRTtQknEG+L2XtRVwvKaVjGxRbq2qqU0qpNtsomu9HWLV+8KGK45pedNWtH5wO4IKGseo8QPLtVRmDu5F8Wnm2zibuBPDlfhuVUjqxQbEVGpTZDPVr06Y1WZtb4dQqx7O0AAAdg0lEQVQGZfruvFWYRfLfas7HnlJKRzcoRgClMwgAgGTd+Q7kycf6llI6pkGx1ZUnXpoMO6I+0RpIHkZyoOUJJGeR3Bv1CbAwzIyakro/TvLSAQ79OYDSjNmzRcSa/QR1Uhkzs6lnMUmnRsTBJL8H4Hsk6zp3z0Lyvog4FzVJACJiPwBH9hM7IvYhqwc2JnPvwQlKs4SWPP5alHQwSH59iHb07CCllOoufp/f47G6P/yP1zyfAKwLoO8bCyRvzbLsCwCWqilXNS1vGvLkIKUXssozw368rj0RsV3Z547kp5Vvzt3ruG2R3yCp1GC06ry6pE5NkfwSyYf7PS6lNE3SB+rKSfpeSunpAZr2G+Q3EaoGDJok5Fi3rgDJnzRtVMnxj0c+Hbyq09faLAVJp6WUakdHeyH5x8inhNbdgOu51nlCGx6v++4FsD5K9qqtQvKOLMs+h5qkPSRHsf/fHCLiwAav9XIAtWsvq5B8THkysN+gOmHVJpJeTvLKYeor3AtgoEQ1JJVl2U9I1s0AqPwsdXOH0MxsaloI+X6BOwI4UtJhJH/eTwCSJ9VNcSO5r6SPNh2pUJ6Aom7LiltIXtW4oe0p6zT3fG0R8cqSC45HUL5XYBO9ti2YibxzVCoiXtrdHkmVF6CS7qu7aJL0KUlv6mc0arZOp3N4v8dMRHJmlmXnkqyabvVySYuXbekxIdZ2JU/9BXk2254dQpK1I4SSFqubujroKEQPGYBBN5BudKHfcGR2DiSfjDwhRdVm50tJ6lRkywWAeyVVvkaSvx6kjbMpTw5SebOiTSmlnp+vpiRdRXKoDiHyjkRdPZ+UtDfJaN66XKfT6Xua8SgU52NdRlORfO8g32vdSF5RZOeunBYa+VZLQ3cISX6V5CA3bAAAKaWrpNqX7Q6hmdk8Zh1JP8uy7AsppSNqLsQmOhvAP1Cd+nwd5FNAm/6R2xpA5ZShyd57cIKyDkXPtPcky6YjXdbHezwHSTv0ePhykk9UHUfyZd2PpZSmVR2TUrqzwYXBGyUtIentJGsvKNuWUvp5zfqbhQC8AsB5ZQUkrSxpg5LnpqWU7o2IW9B738H1Ja1M8v6KNmyLPDV9mVnIz6c2XEuyaoprlQcblMkA3DhgfKB+H1Mi3/ag9BwppoIOc1Olic0wedexd5Ac5j1FSunPDc7V0mywRYwm5/ueks6V9B8k7+mnjVPITgDqRiJ/S3KgEdteUkrH1a0TJPka5HsGD6uvm7s9/KmuAMmq77M5eA2hmdncgSQPj4jGd6lJzpJUu84mImoXy08oW7f3YADoK9V/i2aUPD5Hh7BIeNMz2QrJ3w7aAEmLAtiuR8zKi2NJywB4edfDMwHUjaI0XdO2m6Tbsiz7uqQt+s1COKRzkL+WUhFRt46wdP1gSuliAJB0ccmxRM06woiomy56ySBTPHuRNPDnC+U3PSb6K8mnhqijlWmxoyRpBUlN1ri2Vd+0FsL8o4UYFzYst4ukW4sstls2yZA5lRTTvCuRPL3lai9H/frLdSU12RO0yoMAbhoyRhufpWeZqz4gZmbjJulLJF8y5M/LSO5K8gDlm4rf1rR+ku+RdGDT8iml2o2ZSb5JDVLfF9PE9q4pdhHJgZKYtOC+ksd7pYhfDeWbOw8zirYPeq+Xqxst2Rtzjg78om4kieS1AJpOz12U5H9KulLS3UV6+oMkvajJ739QJB8FUNZZm12mskMYEdtVPH0xUD2aGhGVHUKSlQllWpwuipTSA4MeW0wDrBsiGrbjOkxncqQkLS3pEEnXo0HCkRbd2UKMupHXWsUoZe3m9YVFSB4o6fLifD9F0sGSNpY0pWcIknxJg2JtjdjPrlOSmsRs0rYqd7UwzXXoz1K3Kf2BMDObalJKd5O8psWQ3ynu3r6muONdmWUOACR9VtJPSdZOHyP5+yJNfNXF0yoAtkf9aNO2KEmYMqG+cU0XBYCyLRBWl7RAV2KesoykANB3FsHZJL2rx8MPAriu5rj9ux8jWbnn3YRy75J0BYDG+/kBWI3k/hPqnR75XltXpZSuQp4BcuCOS482nimpqtP1YknLl3WAK9YP3kby7uL/SzudJEtHHCStVpNtVwAGWpNXYuDPV0N1iYbqjH2EUNLSyBPTrAdg7YhYi+RmkjbGGK5dU0pNpupOCpKHFKPM/STMWZXkWyS9pfj39Ii4tut8b33UaQi9EmxN9AjKv+8HllK6tsGU3BdguCmfU+azNJE7hGZmY1bc9f+5pEsknYV8PVWVZSPiSADvbRj/ZEmVd9OLbKOVHcKIeFNNApMnAJzRpE0jch/yKXXdWS8XQL5NxsSMnVUvpHYz614k7SVpjnWAki5IKZUmeJC0laTuDst1yKda1iJ5jaSjJH26vxY/y+IAtiW5bXFBFBFxnaTzU0rnIV8DOWuI+D9Hng2w7H1PyKfazpF5UtIqknqtDXzWNFGSVesIN5a0DMleW5DsXNEuALim5VHvgdenNjTM7wmo366mFcWNsDUBbABgw4h4PskNAKwnacWJZRtkmxy1Yd/T1pC8XtJHJH1+iDCLA9iG5DbF+a4e5/tkbxsEIN9vUzX7MQK4vo1kMr3i1hWIiDWGrGMs72sdTxk1M5siSD5C8vUA7mhQ9q2Smi4aPw0108BIvqEqXjHC9oaqGJLOqEucMkrFBUJZ4ofuDnHp6FdErNdv3ZIWLbtAq9tuoldHjuRR/VzwkPxfkh9G/XTCphKAzUkeIWmapPuyLPuCpNrtBEradxeAa6vKVKwjrF0/OFvFOsKEPCFSr3onbbro/E7SJpL+KyJ+I2m6pNsknS3pcyTfDmArACvWxZnfkfwCyfejvfOdADYj+WFJFxXn+9GS+v4ubMHyqL5BA0mjSo7VJG6TfTjnOu4QmplNIST/SfK/GxRdFsBrGsZ8WFLdRe0yAHaveH4H1FyojWnvwWeRdFmvxyOiO2HLAyi5609y137rjYhvAlir5OnSDekl7Ye8wzPRL0me1W8bSH6W5KvRx5rUPixH8v2Sbi4uFKum3Ja1r3LaZdk6wibrB2frdx2hJJLcqapdANwhHJKknSPiYknXS/oU8o5fZUZNq0byaJKvwgB7jDawLMn3Fef7MZrE7T1QkhW6S6+R/jbUrr9l9b6rcy13CM3Mpp7TATxWV6hJJrbZUkon1pUpOidldb2p5vC7AFzUtD2jklLq2SEkuVvXv59BeXKGLSRt1bROSR8h+eaSp/8yYY1b93EvkPT1roenk/x/TevuRvJcki8sYtwyaJwKCxQXitcPMHpQtw5vfUlzTMeqWD94B8nurIAXo2TUpGQd4SYAqqan/YXkHyqetwqSVoyIsyWdj3wNcltulNR2lsm5DsnzSb6I5CEAbh5BFR2S75Z0g6S6dX1tabKcbeA9/GrMRJ4pu8o8udzOHUIzsymmWKt1aYNym/cR9kLUZ8p7Ta+RH0kLkdyz6kBJ3+MAGyGPwEXovf3EekVCin8heW5ZEEknSlquqiJJnSzLvizpkxXFeo7WSVpT0pnoSm5D8lCSt/Y6pimST5E8juSGJLeW9AnkmUjbXLu2tqTfSNqwj3bdCOCvNcWetYejpFXRe01gz60AmO+zWLZH1+aSukcfKqeLNhhZtxKSVpd0OYBXDxnqKQB/kPR9kh8g+fKU0iZlN3/mNySfJvk1khuR3ErSxwH8Fu2e72tKukzSi1qMWaZJUqNemZzbsBTq+0Zl2xvN1dwhNDObgiTd0aDY+k3jkQxJ36kptiiAPXo8vjPyKaqlpsJ0UQAg+XhZ6vCI6M7k+R2UX3w8v1g7t2mvJ4u1UBeQfE9Nk+a4eCiSyFyBrt+fpONJnlwTrzGSInl5p9P575TSFiRXJrmvpK8C+B2GT5SxoqTT+ljLiqITXKrHOsLtysp2rx+cUMe0kkMWQtdejzWZT5FScodwAJIWKc7DftacPgrgF5I+Q/JAktuTfC7JxVJKL+x0Om8m+UUOsU/ovKw436/odDpHpZReTnIl5lsKHYf8htCwyUxWKM73UU/1rV2HTrLy79EQauNKGts6+VFyh9DMbGpqspfYMv0ETCmdjJokBL2mjTbYjP4qkqOYnjiQlNL3ez1O8u2SFp/w7/skfbMi1IskXR0RlxXr5o7MsuzYiLhK+T5o2zVozg6SXixpSUnbRsSPi3WO3dt3/CylNPBU0SZIPkTyB51O59CU0stILklyS+Z7W/4AwD0DhN04Io5oWjil1Nc6wn7WD06oo3T7iYnrCCUtiuoN6+8DcGXF81YiIj6KfDpuncckfYHkZiSXTym9ptPpHEHyWySnkWxjz7b5UrEe/YedTuf/FTeEliL58mIK6OkAek5lr7FRkeF6lP6J+lHCxjdD+9RkWuwg35NTnjuEZmZT0xINyizYYwpcKZK3A7ikptjOE1O+S1qkyHxaFXdKjA5OcDZ671G1LIADJz6QUjqqpOy/igDYulg394libV6vLTzKUvUvI+k6SY8VGTD3QlcGvWIq3D4kR70dwbMUU82uJHlsp9PZN6W0OslNiyln9/UR592Smu6Jdhmq9+FbTdIGE2JvV1LuTpJl00+nodk6wm1QkdhE0llTZBr0XEX5fpJ1I+cAcCnJDTqdzuEkr5vsz//8pjjff0vyK51OZ7+U0hokN5H0P2iWXXN2nENHOUpY3ACoW97w/Ik391q0WV2BlFL3uuV5gjuEZmZT06oNymToc3E9ybrkMgsAeOOEf++K6vUaM5EnwZkySGYkj+71XLF/1zITyj5Ccl8Mty7kepKlCXkqBMmjUkr7c7g9/lpD8vpOp3MUyTVJfhDNppkti+qRtonxn5H0i5piOwD5hvEoGQmo2F4CJO9D+TrCl0taEAAiYpeqRni66MD2RP1enn8guSvJv09Gg6w3kjd2Op2PkVyL+TYWTf6eLI05MyO3qpiBUaWDrunfLdXbJJlY7V6FcyN3CM3MpiCSdZvTA8CDA9xV/wlqMphOnDbaILvoL0g+1GcbJsNJ6D21Z4WI+J+JD5D8HfOtBwZ5HReS3AHAuQCm93HcbSR3IvnxqTgKVYwmfL54bU2SPLy4aey6aaOSZk8b3a4iRmmHsIgxreSpxQBsDgAkq9YPPo48EZP1KSJ2qCtD8kMkm3yuKsMMebwVivP96GJEvsn3WOPzfRAppd/VlWnwt6kvkpZHTZIp5B3mG9qsd6pwh9DMbIqRtCWA5zQo2nha32wkp0v6YU2xrSU9V9JiJF9bE2+qTRcFAJCcwXyj9l7PHTqh0zH7sStIbgGgbvRqtulFRtCdST5McjrJzzY47sHiYvhFJIfapkPSARHxw6ofSWsOUwfJ30jqOdo6UUR0r4msch7yzJFltpPUGWT94Gw1HcZtJa0CoDRjoqRzSY4qtf08jeQGNUUeB3D+sPVERJNZFPMMSfs3ON/XGaYOkldK+nxduT7P90GcV1eA5N7FOuC27IM88VSVS+bV74V5ci8NM7O5lSQWa7ialP39IHWklE6S9I6KIgSwL/K1dVVrGR8EcM4gbZgkpwI4GMDWXY8nSd+V9HKSd81+kORtyLfe2DEi3krydZgzcc8dkr6fUjqW5P1dz32y6HAfhTx9+WwzAZxD8nsAzu6+oJD0PAArdMWaXpeoJyLWJvnGqjLIR4TvqClTKaX0c0kfqSm2YNN4JJ+IiAtRvh3BsgA2q1g/eDfrt+aYhnwd4RyjSJK2Yb49RekIk6eLDmXFmufvbGOKNMnJ2hdvqlgLz57O38uZKNnqpqnifP9YTbHG5/sgSN4UEbcDWLui2LIADgPwqWHrk7SYpP9q0K6zhq1rqvIIoZnZ1HIkgJ2aFEwpXTBIBSQvR82m5ZL2k1Q5JUfS6SSHTWU+MszTsB+AfESi22qSzpY0x/pIkhd2Op23kVyR5OpFZr6tSK6RUlqr0+l8pEdncHZ9RxfHbEVyz+LYZVJKe5L8SY/O4Csk3STp6ok/KKY1Vkkp3VVXJiIafZZqNPkdP9pPQJJ120+8FUDPje+r1g9OiF+1jvAVEbFrxeEzMbVvdEx1daM2Q0+RLtaXvmbYOHOZukQrU/Z8HwQbbMEj6UPFZ2EoEXE4gNVrij0FoGcG63mBO4RmZlOApIWzLDumyPjWxFPI7wYPpMEf2xcD2LuqwFTZe7AKyVtJHlLy9MaSLpyYVbXr2GdI3lNk5ruCZKM07SQfL8r/rDi251opSdtJOgddo7CSTiN5aoOqateyMN93sHv0sV+1IzEppapMrb2chYqOAclDK+qq7RAClesIlyH55opDLyI58gveediDNc+vJ2mpmjKlJDEivgSg8f6X84gm5/s+klYesp4X1BUY4HwfxLdRn+RmSUk/7SfbdjdJu5Os3UqjuAE6FdfLt8IdQjOzMZL0AkmHS/oLyXejYaIESSeTfGSIqk9B+VYJTfyRZO3C/6mA5CmSvlzy9OaSLpO00WS2SdJBks4HsGTXU7enlN7VMMw1qE+Es4Skb0vq9N1IAJIWkvShBkWv6iduMYI36AbjjTqETTuO3Uh6uuhw6rYwWCQiGk2L71asLf0yybq9UWcb6dTGSXYDgH/UlFlM0olDnO8LjuJ8HwTJv0s6oUHRl0k6fZBtKIoZGj9A/RK6WSmlT/Qbf27iNYRmZn2QdFBE7DZkmIUBLA9g5SKzWb8eTSl9cpgGkPx7RJyH8nVcdcdP+dHBiVJK74+IVUn2mga7vqSrJL0PwDc5wo2wJa0i6ThJe/V4+v4iFX+jjj7JLMuy0ytGQGd7XTE99j+KtXNN27qqpO8A2LSm6E0kb24adzaSZxYJlPpxL8k/Nyw7DSXrCCsEgJ/32SaboLi5VbktAcn3ZFn2TErpI02TdBQ3z75Gcvs+mjPq5CeThmRkWXYa6/d43F3SuZIOYB/bekhaWdLJ6L3P6kS3kBxo/Xq/UkqflPRvqF+X+tpiuv2+JGtHUiUlAEcUayVr+0KSjpmkUVEzMxsnSatHhOaGH0n7t/Sa9xqwDZmkuvUWU46khYpsfFWv7XJJW4yg7kUlHRYRD5XU+4ikuo5Xr7jrRMTTDX9vM7IsO0HS9mXZ+SQtL2m3LMtOiIgnGn4e3zrge/KCfj97WZad1k8dEXFzn3VcMchrmfCaXtfg/XrnMHVErqqOXw4Z/2cNXkNpNkZJe/bxft8m6YOSNiou0rtjLS/pjcV5+8wA31WXSKqcWippjwav9+Bh3tOintrv25pkX5C0ZkQ81fC1P5ll2Tck7VA2pVLScpJelWXZ1yLi8Ybn+9ur2phl2WcaxNikj/dt7z5+3zOzLDupmI4/x+hwcUPuoIi4qY+YN5d9X/aI32kQ7+ymr72inoUa1NPXTAePEJqZzUUkfTKldEpL4c5Cvt6n3zVmFzZdTzeVkJwpab+IeIhk2QXelpKujIgLmG9u/yuSA0+tLTrOb5V0KICyNPl/J/l6ktf1G5/kbVmWfZHkEQ2KL0ryIEkHAcgi4i7kU06FPGPfCiqS7JCNB9UuBfC9fttd1HFLRPwJDdYoztbvNFBJ00jWroma0CZPFx3eWcgz267ZoOzakj4L4LMAno6IBwDcj3zj8VWUbw8yjG0k3R0RfwSwGMnvk/zSkDHHhuQdWZZ9juRHGxRfhOSBkg5Efr7fjfz7fvb5vrykZYq4TZtwBYCT+2/54Ej+OMuyL5D8QIPiC5I8QNIBAGZGxG3I91UkgNUHWF/5aJEcbNg9M6c8ryE0M5s7BMkjOp1OkwuBRooOUpPkJd3HzVXTRScimXU6nXeSPAjVG67vJOkcSfdkWXa8pDepQTY7SQtLeqmkD0XEhZL+JulTKO8MXk3ypSSvHuT1AEBK6SgAl/d5WAf5BfvmAF4CYB0Ac2RcrXEXyf1IDpw1UlK/iZH66hCmlKb1Gd8dwiEVyZiaroOdaGHkmR43R57Uqq3pnisA2BbASyJi4GQ2U0Wxlu3SPg/rAHgenn2+d2+pU+fvJPclmfV53NBSSh+S1O+Np4UAbID89W4OoN/O4BMk96jb/mde4Q6hmdnUdzvJnUh+pu3AKaWT+jzkcQA/bbsdk43kN0huifrMfSuRPLhIWnBPRDwSEVdHxC8j4odZlp0W+RS7XxfT36YX6xE/A2AHlP+dzSQdQ3Lbftb5lLyWWcz3TKxdO9OiO0nuTPKeYYKklPpZr3c/arZL6eFi5CMiTdxMsmyrCusDyXMlfXPE1dyOfMRqvlKc768HcO0kVnt3cb7Xbn0xCiQjpfQ2SV+ZpCrvJ7kLyWmTVN/YuUNoZjZ13UvygyQ3InnRKCooFuA3vrCQ9BOS00fRlslG8gaSmxfZXZtmbF0a+d3mXQG8keS+AF4PYHvkmyg3ye53A8ktO53Oe9uaikTyIZLbYHI66xeQ3KKlztMVyDt6tSRd3G/CH1bvR9gd36ODLUopvbNIUjIK5zHf4/NbI4o/pZF8uEjc86NJqO6i4nz/4yTUVYpkdDqdd5PcH6PdB/Hi4u/CfHWzwR1CM7Op5SkAZxVTc9Yk+XmST42yQpKNRwnnhr0H+0EyI/kVkmuT/G/U76E2jBtIvoXkS0axZQfJx1NKbyhGC29rOz7yrUbeXNw5v6+NgCRDUqMkC4NuI6Hy/Qi74w+8r6fNiWSWUvoPkh9Cvo6rDX8jeQDJ3Ug+gHyj8Dtaij1XIflESmkfkq8G8JcRVHELybeS3HHYWQxtIvk9khtIOgVAm9NX/07y30luP+zMh7mRO4RmZuPxJPILmcslnULywyR3ILlsSul1JH9AcuYkteX7AJrU9Tf0uYZrblHccf9E0Qn/dwAXomLj9D48AeBHxQXspiRP5RBJapogeVYxqnwAgAsw3EXTkwB+QXJvki9inpSj1W05+uiIDfTZa7iO8B5Mwt5q8xuSIvk5khtJOhGDdQwDwK+Lzsn6JL8z+zNI8imSewKYMh2WyUbynOLcfBuA8zHc+f4UgHNI7lN8h5zS9vneBpL3djqdt5LcUPlehf8cItzVJA8ubgqePBVf72ToZ28eM7N5VpHyvN+kGoN4guSsSainMUmrSboLNTcJJX2q0+kcOUnNGrsiw+H2EbEdyS0ArA+gLv34owBulHRDSul85FlKRzrCW6dIhrNTRLyY5IsBbIj8s75IV9EZyDtGf5B0c0rpSuTTQ2eMuH1Nz71HBrlYk7QAgCVris0i+US/sXvUtSCAJWqKzWDDvfdK6li2pshQr0XSEqjZ0J3kwwPGXgrAnhGxTXFOrYNnn1PTkY/S3yrp8pTSFQAuJ1k5RVDScgAOkbQHgPXwf7/vWQD+KunqlNKlAH7WPbo9Gb+zop6FANRtnt5GPavi2ef7Rqg+3/9YnO+/Rf59NdRobrFFQ3dd3R5ji8lpivd2+4jYtvhcrYs8QVH3FP7HAdwu6Y8ppcuQv95WR1dHfX6Oqh53CM3M5nOS3iXpq3XlSD6fzTcFn+dIIvKLjFUBLFX8ZMg7gY8CeIBz0XYcxUXU0shfw2OjHrk066XoQCyB/GZZK2tqJS2JPGvpI/5c5yac74H8fJ9SNyZHodhWYxEATwN4qq3Pl5mZ2TwnIi5ssMltv2nOzczMzMzMbCqTtFpEPFPXIZT0b+Nuq5mZmbXPSWXMzOZvb0b9VgkPAjhjEtpiZmZmk8wdQjOz+ZSkBSUd2KDct8edGMXMzMzMzMxaJOmjDdYOZpLWHndbzczMzMzMrCFJqUi33+u5RbMs+1jk6jqE3qzbzMxsHuZtJ8zM5kGS1pR0C4CbAdwp6V4AGcnVAbwCwHJNwpB8KclrRtlWMzMzMzMza5GkNRuM/tX9OJGMmZnZPM5JZczMrJdHSL573I0wMzOz0XKH0MzMuonkQSTvHndDzMzMbLTcITQzs4lE8lCSPxx3Q8zMzGz03CE0M7PZHiS5H8mvjbshZmZmNjncITQzs6ckfYvkhiR/MO7GmJmZ2eTxthNmZvMgSYsC2A3AGhHxXABLkVwawEIAMkkzAPw1pXQtgItIPjrG5pqZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmc2X/j9B0/+uMB3y2gAAAABJRU5ErkJggg==";
|
|
157895
158063
|
|
|
157896
158064
|
// ../tool-server/src/tools/screen-recording/watermark.ts
|
|
157897
|
-
var
|
|
158065
|
+
var execFileAsync28 = (0, import_util15.promisify)(import_child_process6.execFile);
|
|
157898
158066
|
var OUTPUT_FPS = 30;
|
|
157899
158067
|
var FFMPEG_FALLBACK_PATHS = [
|
|
157900
158068
|
"/opt/homebrew/bin/ffmpeg",
|
|
@@ -157911,7 +158079,7 @@ var MASK_DARK_MAX_LUMA = 90;
|
|
|
157911
158079
|
var MASK_LIGHT_MIN_LUMA = 165;
|
|
157912
158080
|
async function resolveBinary(name, fallbacks) {
|
|
157913
158081
|
try {
|
|
157914
|
-
await
|
|
158082
|
+
await execFileAsync28("/bin/sh", ["-c", `command -v ${name}`], { timeout: 2e3 });
|
|
157915
158083
|
return name;
|
|
157916
158084
|
} catch {
|
|
157917
158085
|
}
|
|
@@ -158583,7 +158751,7 @@ function makePointerControl(simulator) {
|
|
|
158583
158751
|
}
|
|
158584
158752
|
|
|
158585
158753
|
// ../tool-server/src/tools/screen-recording/screen-recording-stop.ts
|
|
158586
|
-
var
|
|
158754
|
+
var import_node_path23 = require("node:path");
|
|
158587
158755
|
init_zod();
|
|
158588
158756
|
init_device_info();
|
|
158589
158757
|
var zodSchema57 = external_exports.object({
|
|
@@ -158623,7 +158791,7 @@ Fails if no recording (running or finished-but-unretrieved) exists for the given
|
|
|
158623
158791
|
kind: "screen-recording",
|
|
158624
158792
|
mimeType: "video/mp4",
|
|
158625
158793
|
// Drop the internal `argent-` temp-file prefix from the saved name.
|
|
158626
|
-
filename: (0,
|
|
158794
|
+
filename: (0, import_node_path23.basename)(stopped.outputFile).replace(/^argent-/, ""),
|
|
158627
158795
|
saveDir: RECORDINGS_DIR
|
|
158628
158796
|
});
|
|
158629
158797
|
const result = { video, durationMs: stopped.durationMs };
|
|
@@ -160717,7 +160885,7 @@ Returns { stopped } - the URNs of the services that were actually live and got s
|
|
|
160717
160885
|
|
|
160718
160886
|
// ../tool-server/src/tools/simulator/stop-metro.ts
|
|
160719
160887
|
init_zod();
|
|
160720
|
-
var
|
|
160888
|
+
var import_node_child_process36 = require("node:child_process");
|
|
160721
160889
|
function parseNetstatListeningPids(netstatOutput, port) {
|
|
160722
160890
|
const pids = /* @__PURE__ */ new Set();
|
|
160723
160891
|
for (const line of netstatOutput.split(/\r?\n/)) {
|
|
@@ -160733,7 +160901,7 @@ function parseNetstatListeningPids(netstatOutput, port) {
|
|
|
160733
160901
|
}
|
|
160734
160902
|
function listeningPids(port) {
|
|
160735
160903
|
if (process.platform === "win32") {
|
|
160736
|
-
const output3 = (0,
|
|
160904
|
+
const output3 = (0, import_node_child_process36.execFileSync)("netstat", ["-ano"], {
|
|
160737
160905
|
encoding: "utf-8",
|
|
160738
160906
|
timeout: 5e3,
|
|
160739
160907
|
// `netstat -ano` dumps every socket on the host; overflowing Node's
|
|
@@ -160742,7 +160910,7 @@ function listeningPids(port) {
|
|
|
160742
160910
|
});
|
|
160743
160911
|
return parseNetstatListeningPids(output3, port);
|
|
160744
160912
|
}
|
|
160745
|
-
const output2 = (0,
|
|
160913
|
+
const output2 = (0, import_node_child_process36.execFileSync)("lsof", ["-ti", `tcp:${port}`, "-sTCP:LISTEN"], {
|
|
160746
160914
|
encoding: "utf-8",
|
|
160747
160915
|
timeout: 5e3
|
|
160748
160916
|
}).trim();
|
|
@@ -166355,7 +166523,7 @@ var import_node_url4 = require("node:url");
|
|
|
166355
166523
|
init_src2();
|
|
166356
166524
|
|
|
166357
166525
|
// ../tool-server/src/tools/flows/script/flow-script-executor.ts
|
|
166358
|
-
var
|
|
166526
|
+
var import_node_child_process37 = require("node:child_process");
|
|
166359
166527
|
var fs58 = __toESM(require("node:fs"));
|
|
166360
166528
|
var os17 = __toESM(require("node:os"));
|
|
166361
166529
|
var path44 = __toESM(require("node:path"));
|
|
@@ -166740,7 +166908,7 @@ var FlowScriptExecutor = class {
|
|
|
166740
166908
|
detached: process.platform !== "win32",
|
|
166741
166909
|
windowsHide: process.platform === "win32"
|
|
166742
166910
|
};
|
|
166743
|
-
child = (0,
|
|
166911
|
+
child = (0, import_node_child_process37.fork)(scriptPath, [], forkOptions);
|
|
166744
166912
|
} catch (err) {
|
|
166745
166913
|
return emptyResult(
|
|
166746
166914
|
{ kind: "spawn", message: `Could not start the script process: ${errorMessage(err)}` },
|
|
@@ -167181,7 +167349,7 @@ async function stopProcessTree(child, graceMs) {
|
|
|
167181
167349
|
if (process.platform === "win32") {
|
|
167182
167350
|
if (hasExited(child)) return;
|
|
167183
167351
|
tryKill(() => {
|
|
167184
|
-
const killer = (0,
|
|
167352
|
+
const killer = (0, import_node_child_process37.spawn)("taskkill", ["/pid", String(pid), "/t", "/f"], {
|
|
167185
167353
|
windowsHide: true,
|
|
167186
167354
|
stdio: "ignore"
|
|
167187
167355
|
});
|
|
@@ -167350,9 +167518,9 @@ var ScriptLogCapture = class {
|
|
|
167350
167518
|
};
|
|
167351
167519
|
function withoutPartialMarker(buffer, taken) {
|
|
167352
167520
|
const text = buffer.subarray(0, taken).toString("utf8");
|
|
167353
|
-
const
|
|
167354
|
-
if (
|
|
167355
|
-
return Buffer.byteLength(text.slice(0,
|
|
167521
|
+
const open4 = text.lastIndexOf(SECRET_PLACEHOLDER_MARKER);
|
|
167522
|
+
if (open4 >= 0 && !text.includes("}}", open4 + SECRET_PLACEHOLDER_MARKER.length)) {
|
|
167523
|
+
return Buffer.byteLength(text.slice(0, open4), "utf8");
|
|
167356
167524
|
}
|
|
167357
167525
|
for (let n = Math.min(SECRET_PLACEHOLDER_MARKER.length - 1, text.length); n > 0; n--) {
|
|
167358
167526
|
if (text.endsWith(SECRET_PLACEHOLDER_MARKER.slice(0, n))) return taken - n;
|
|
@@ -167584,8 +167752,8 @@ function scriptRan(result) {
|
|
|
167584
167752
|
}
|
|
167585
167753
|
async function scriptFileProblem(canonical) {
|
|
167586
167754
|
try {
|
|
167587
|
-
const
|
|
167588
|
-
return
|
|
167755
|
+
const stat7 = await fs59.stat(canonical);
|
|
167756
|
+
return stat7.isFile() ? null : "is not a file";
|
|
167589
167757
|
} catch (err) {
|
|
167590
167758
|
const code = err.code;
|
|
167591
167759
|
return code === "ENOENT" || code === "ENOTDIR" ? "does not exist" : `cannot be read: ${errMsg3(err)}`;
|
|
@@ -167893,7 +168061,7 @@ var import_pngjs4 = __toESM(require_png());
|
|
|
167893
168061
|
init_src2();
|
|
167894
168062
|
|
|
167895
168063
|
// ../tool-server/src/tools/screenshot-diff/screenshot-diff.ts
|
|
167896
|
-
var
|
|
168064
|
+
var import_promises13 = __toESM(require("fs/promises"));
|
|
167897
168065
|
var import_path7 = __toESM(require("path"));
|
|
167898
168066
|
var import_pngjs3 = __toESM(require_png());
|
|
167899
168067
|
init_src2();
|
|
@@ -167901,7 +168069,7 @@ init_src2();
|
|
|
167901
168069
|
// ../tool-server/src/tools/screenshot-diff/screenshot-diff-ocr.ts
|
|
167902
168070
|
var import_child_process8 = require("child_process");
|
|
167903
168071
|
var import_util16 = require("util");
|
|
167904
|
-
var
|
|
168072
|
+
var execFileAsync29 = (0, import_util16.promisify)(import_child_process8.execFile);
|
|
167905
168073
|
var OCR_TIMEOUT_MS = 1e4;
|
|
167906
168074
|
var OCR_MAX_BUFFER_BYTES = 32 * 1024 * 1024;
|
|
167907
168075
|
var TESSERACT_BINARY = "tesseract";
|
|
@@ -167946,7 +168114,7 @@ async function extractOcrTextBlocks(imagePath) {
|
|
|
167946
168114
|
}
|
|
167947
168115
|
}
|
|
167948
168116
|
async function recognizeTsv(imagePath) {
|
|
167949
|
-
const { stdout } = await
|
|
168117
|
+
const { stdout } = await execFileAsync29(
|
|
167950
168118
|
TESSERACT_BINARY,
|
|
167951
168119
|
[
|
|
167952
168120
|
imagePath,
|
|
@@ -169638,7 +169806,7 @@ async function writeDiffArtifacts(params) {
|
|
|
169638
169806
|
}
|
|
169639
169807
|
async function decodePngFile(filePath) {
|
|
169640
169808
|
try {
|
|
169641
|
-
const buffer = await
|
|
169809
|
+
const buffer = await import_promises13.default.readFile(filePath);
|
|
169642
169810
|
const png = import_pngjs3.PNG.sync.read(buffer);
|
|
169643
169811
|
return {
|
|
169644
169812
|
width: png.width,
|
|
@@ -169693,8 +169861,8 @@ function luminanceFromOffset(data, offset) {
|
|
|
169693
169861
|
return 0.2126 * data[offset] + 0.7152 * data[offset + 1] + 0.0722 * data[offset + 2];
|
|
169694
169862
|
}
|
|
169695
169863
|
async function writePngFile(filePath, png) {
|
|
169696
|
-
await
|
|
169697
|
-
await
|
|
169864
|
+
await import_promises13.default.mkdir(import_path7.default.dirname(filePath), { recursive: true });
|
|
169865
|
+
await import_promises13.default.writeFile(filePath, import_pngjs3.PNG.sync.write(png));
|
|
169698
169866
|
}
|
|
169699
169867
|
function downscalePng(source, scale) {
|
|
169700
169868
|
const resized = resizeDecodedPng(
|
|
@@ -170228,11 +170396,11 @@ async function runSnapshot(env, opts) {
|
|
|
170228
170396
|
}
|
|
170229
170397
|
|
|
170230
170398
|
// ../tool-server/src/utils/status-bar.ts
|
|
170231
|
-
var
|
|
170232
|
-
var
|
|
170399
|
+
var import_node_child_process38 = require("node:child_process");
|
|
170400
|
+
var import_node_util28 = require("node:util");
|
|
170233
170401
|
init_adb();
|
|
170234
170402
|
init_device_info();
|
|
170235
|
-
var
|
|
170403
|
+
var execFileAsync30 = (0, import_node_util28.promisify)(import_node_child_process38.execFile);
|
|
170236
170404
|
var DEMO_BROADCAST = "am broadcast -a com.android.systemui.demo";
|
|
170237
170405
|
var IOS_STATUS_BAR_OVERRIDE = [
|
|
170238
170406
|
"override",
|
|
@@ -170256,7 +170424,7 @@ async function pinStatusBar(device, signal) {
|
|
|
170256
170424
|
if (isIosPhysicalDevice(device)) return false;
|
|
170257
170425
|
try {
|
|
170258
170426
|
if (device.platform === "ios") {
|
|
170259
|
-
await
|
|
170427
|
+
await execFileAsync30(
|
|
170260
170428
|
"xcrun",
|
|
170261
170429
|
await simctlArgsForUdid(device.id, ["status_bar", device.id, ...IOS_STATUS_BAR_OVERRIDE])
|
|
170262
170430
|
);
|
|
@@ -170292,7 +170460,7 @@ async function pinStatusBar(device, signal) {
|
|
|
170292
170460
|
async function restoreStatusBar(device) {
|
|
170293
170461
|
try {
|
|
170294
170462
|
if (device.platform === "ios") {
|
|
170295
|
-
await
|
|
170463
|
+
await execFileAsync30(
|
|
170296
170464
|
"xcrun",
|
|
170297
170465
|
await simctlArgsForUdid(device.id, ["status_bar", device.id, "clear"])
|
|
170298
170466
|
);
|
|
@@ -171875,13 +172043,13 @@ Address the flow exactly as you will address it in flow-execute: name or flow_pa
|
|
|
171875
172043
|
init_zod();
|
|
171876
172044
|
|
|
171877
172045
|
// ../tool-server/src/utils/workspace-reader.ts
|
|
171878
|
-
var
|
|
171879
|
-
var
|
|
171880
|
-
var
|
|
172046
|
+
var import_promises14 = require("node:fs/promises");
|
|
172047
|
+
var import_node_path24 = require("node:path");
|
|
172048
|
+
var import_node_child_process39 = require("node:child_process");
|
|
171881
172049
|
var import_dotenv2 = __toESM(require_main());
|
|
171882
172050
|
async function exists(path53) {
|
|
171883
172051
|
try {
|
|
171884
|
-
await (0,
|
|
172052
|
+
await (0, import_promises14.access)(path53);
|
|
171885
172053
|
return true;
|
|
171886
172054
|
} catch {
|
|
171887
172055
|
return false;
|
|
@@ -171889,7 +172057,7 @@ async function exists(path53) {
|
|
|
171889
172057
|
}
|
|
171890
172058
|
async function isDirectory(path53) {
|
|
171891
172059
|
try {
|
|
171892
|
-
const s = await (0,
|
|
172060
|
+
const s = await (0, import_promises14.stat)(path53);
|
|
171893
172061
|
return s.isDirectory();
|
|
171894
172062
|
} catch {
|
|
171895
172063
|
return false;
|
|
@@ -171897,7 +172065,7 @@ async function isDirectory(path53) {
|
|
|
171897
172065
|
}
|
|
171898
172066
|
async function readJsonFile(path53) {
|
|
171899
172067
|
try {
|
|
171900
|
-
const raw = await (0,
|
|
172068
|
+
const raw = await (0, import_promises14.readFile)(path53, "utf-8");
|
|
171901
172069
|
return JSON.parse(raw);
|
|
171902
172070
|
} catch {
|
|
171903
172071
|
return null;
|
|
@@ -171905,14 +172073,14 @@ async function readJsonFile(path53) {
|
|
|
171905
172073
|
}
|
|
171906
172074
|
async function readTextFile(path53) {
|
|
171907
172075
|
try {
|
|
171908
|
-
return await (0,
|
|
172076
|
+
return await (0, import_promises14.readFile)(path53, "utf-8");
|
|
171909
172077
|
} catch {
|
|
171910
172078
|
return null;
|
|
171911
172079
|
}
|
|
171912
172080
|
}
|
|
171913
172081
|
async function listDir(path53) {
|
|
171914
172082
|
try {
|
|
171915
|
-
const entries = await (0,
|
|
172083
|
+
const entries = await (0, import_promises14.readdir)(path53);
|
|
171916
172084
|
return entries;
|
|
171917
172085
|
} catch {
|
|
171918
172086
|
return null;
|
|
@@ -171921,7 +172089,7 @@ async function listDir(path53) {
|
|
|
171921
172089
|
var COMMAND_TIMEOUT_MS = 3e3;
|
|
171922
172090
|
function runVersionCommand(cmd, args, cwd) {
|
|
171923
172091
|
return new Promise((resolve15) => {
|
|
171924
|
-
const child = (0,
|
|
172092
|
+
const child = (0, import_node_child_process39.execFile)(cmd, args, { cwd, timeout: COMMAND_TIMEOUT_MS }, (err, stdout) => {
|
|
171925
172093
|
if (err) {
|
|
171926
172094
|
resolve15(null);
|
|
171927
172095
|
return;
|
|
@@ -171964,7 +172132,7 @@ async function detectLockfile(workspacePath) {
|
|
|
171964
172132
|
const checks = await Promise.all(
|
|
171965
172133
|
LOCKFILES.map(async (name) => ({
|
|
171966
172134
|
name,
|
|
171967
|
-
exists: await exists((0,
|
|
172135
|
+
exists: await exists((0, import_node_path24.join)(workspacePath, name))
|
|
171968
172136
|
}))
|
|
171969
172137
|
);
|
|
171970
172138
|
return checks.find((c) => c.exists)?.name ?? null;
|
|
@@ -171983,7 +172151,7 @@ var CI_CONFIGS = [
|
|
|
171983
172151
|
];
|
|
171984
172152
|
async function detectCiConfig(workspacePath) {
|
|
171985
172153
|
for (const ci of CI_CONFIGS) {
|
|
171986
|
-
if (await exists((0,
|
|
172154
|
+
if (await exists((0, import_node_path24.join)(workspacePath, ci.path))) return ci.label;
|
|
171987
172155
|
}
|
|
171988
172156
|
return null;
|
|
171989
172157
|
}
|
|
@@ -172004,7 +172172,7 @@ async function detectLintStagedConfig(workspacePath, packageJson) {
|
|
|
172004
172172
|
return packageJson["lint-staged"];
|
|
172005
172173
|
}
|
|
172006
172174
|
for (const file2 of LINT_STAGED_FILES) {
|
|
172007
|
-
const full = (0,
|
|
172175
|
+
const full = (0, import_node_path24.join)(workspacePath, file2);
|
|
172008
172176
|
if (await exists(full)) {
|
|
172009
172177
|
if (file2.endsWith(".json") || file2 === ".lintstagedrc") {
|
|
172010
172178
|
return readJsonFile(full);
|
|
@@ -172046,7 +172214,7 @@ var CONFIG_FILES = [
|
|
|
172046
172214
|
async function detectConfigFiles(workspacePath) {
|
|
172047
172215
|
const results = await Promise.allSettled(
|
|
172048
172216
|
CONFIG_FILES.map(async (file2) => {
|
|
172049
|
-
if (await exists((0,
|
|
172217
|
+
if (await exists((0, import_node_path24.join)(workspacePath, file2))) return file2;
|
|
172050
172218
|
return null;
|
|
172051
172219
|
})
|
|
172052
172220
|
);
|
|
@@ -172085,7 +172253,7 @@ async function detectEnvFiles(workspacePath) {
|
|
|
172085
172253
|
const envFileNames = entries.filter((e) => e === ".env" || e.startsWith(".env."));
|
|
172086
172254
|
const results = await Promise.all(
|
|
172087
172255
|
envFileNames.map(async (name) => {
|
|
172088
|
-
const content = await readTextFile((0,
|
|
172256
|
+
const content = await readTextFile((0, import_node_path24.join)(workspacePath, name));
|
|
172089
172257
|
return {
|
|
172090
172258
|
name,
|
|
172091
172259
|
keys: content ? extractEnvKeys(content) : []
|
|
@@ -172112,34 +172280,34 @@ async function readWorkspaceSnapshot(workspacePath) {
|
|
|
172112
172280
|
ciConfig,
|
|
172113
172281
|
configFilesFound
|
|
172114
172282
|
] = await Promise.all([
|
|
172115
|
-
readJsonFile((0,
|
|
172116
|
-
readJsonFile((0,
|
|
172117
|
-
readJsonFile((0,
|
|
172118
|
-
readJsonFile((0,
|
|
172119
|
-
readTextFile((0,
|
|
172120
|
-
(r) => r ?? readTextFile((0,
|
|
172283
|
+
readJsonFile((0, import_node_path24.join)(workspacePath, "package.json")),
|
|
172284
|
+
readJsonFile((0, import_node_path24.join)(workspacePath, "app.json")),
|
|
172285
|
+
readJsonFile((0, import_node_path24.join)(workspacePath, "eas.json")),
|
|
172286
|
+
readJsonFile((0, import_node_path24.join)(workspacePath, "tsconfig.json")),
|
|
172287
|
+
readTextFile((0, import_node_path24.join)(workspacePath, "metro.config.js")).then(
|
|
172288
|
+
(r) => r ?? readTextFile((0, import_node_path24.join)(workspacePath, "metro.config.ts"))
|
|
172121
172289
|
),
|
|
172122
|
-
readTextFile((0,
|
|
172123
|
-
(r) => r ?? readTextFile((0,
|
|
172290
|
+
readTextFile((0, import_node_path24.join)(workspacePath, "babel.config.js")).then(
|
|
172291
|
+
(r) => r ?? readTextFile((0, import_node_path24.join)(workspacePath, "babel.config.cjs"))
|
|
172124
172292
|
),
|
|
172125
|
-
isDirectory((0,
|
|
172126
|
-
isDirectory((0,
|
|
172293
|
+
isDirectory((0, import_node_path24.join)(workspacePath, "ios")),
|
|
172294
|
+
isDirectory((0, import_node_path24.join)(workspacePath, "android")),
|
|
172127
172295
|
detectLockfile(workspacePath),
|
|
172128
172296
|
detectEnvFiles(workspacePath),
|
|
172129
172297
|
detectToolVersions(workspacePath),
|
|
172130
|
-
listDir((0,
|
|
172131
|
-
listDir((0,
|
|
172298
|
+
listDir((0, import_node_path24.join)(workspacePath, "scripts")),
|
|
172299
|
+
listDir((0, import_node_path24.join)(workspacePath, ".husky")),
|
|
172132
172300
|
detectCiConfig(workspacePath),
|
|
172133
172301
|
detectConfigFiles(workspacePath)
|
|
172134
172302
|
]);
|
|
172135
|
-
const iosDir = (0,
|
|
172136
|
-
const androidDir = (0,
|
|
172303
|
+
const iosDir = (0, import_node_path24.join)(workspacePath, "ios");
|
|
172304
|
+
const androidDir = (0, import_node_path24.join)(workspacePath, "android");
|
|
172137
172305
|
const [iosWorkspace, iosHasPodfile, makefileText, lintStagedConfig, androidHasGradle] = await Promise.all([
|
|
172138
172306
|
hasIosDir ? findIosWorkspace(iosDir) : Promise.resolve(null),
|
|
172139
|
-
exists((0,
|
|
172140
|
-
readTextFile((0,
|
|
172307
|
+
exists((0, import_node_path24.join)(workspacePath, "ios", "Podfile")),
|
|
172308
|
+
readTextFile((0, import_node_path24.join)(workspacePath, "Makefile")),
|
|
172141
172309
|
detectLintStagedConfig(workspacePath, packageJson),
|
|
172142
|
-
hasAndroidDir ? exists((0,
|
|
172310
|
+
hasAndroidDir ? exists((0, import_node_path24.join)(androidDir, "gradlew")) : Promise.resolve(false)
|
|
172143
172311
|
]);
|
|
172144
172312
|
const metroPort2 = metroConfigRaw ? extractMetroPort(metroConfigRaw) : null;
|
|
172145
172313
|
const makefileTargets = makefileText ? extractMakefileTargets(makefileText) : null;
|
|
@@ -172210,7 +172378,7 @@ Fails if the workspacePath is not an absolute path or the directory cannot be ac
|
|
|
172210
172378
|
};
|
|
172211
172379
|
|
|
172212
172380
|
// ../tool-server/src/tools/system/update-argent.ts
|
|
172213
|
-
var
|
|
172381
|
+
var import_node_child_process40 = require("node:child_process");
|
|
172214
172382
|
var fs65 = __toESM(require("node:fs"));
|
|
172215
172383
|
var path49 = __toESM(require("node:path"));
|
|
172216
172384
|
init_zod();
|
|
@@ -172345,7 +172513,7 @@ var updateArgentTool = {
|
|
|
172345
172513
|
if (spawnRoot) updateArgs.push("--project-root", spawnRoot);
|
|
172346
172514
|
const cmd = cliEntry ? process.execPath : "argent";
|
|
172347
172515
|
const args = cliEntry ? [cliEntry, ...updateArgs] : updateArgs;
|
|
172348
|
-
const child = (0,
|
|
172516
|
+
const child = (0, import_node_child_process40.spawn)(cmd, args, {
|
|
172349
172517
|
detached: true,
|
|
172350
172518
|
stdio: "ignore",
|
|
172351
172519
|
env: { ...process.env, ARGENT_UPDATE_TRIGGER: "mcp_update" }
|
|
@@ -172398,7 +172566,7 @@ var dismissUpdateTool = {
|
|
|
172398
172566
|
|
|
172399
172567
|
// ../tool-server/src/tools/screenshot-diff/index.ts
|
|
172400
172568
|
var import_node_crypto13 = __toESM(require("node:crypto"));
|
|
172401
|
-
var
|
|
172569
|
+
var import_promises15 = __toESM(require("fs/promises"));
|
|
172402
172570
|
var import_node_os13 = __toESM(require("node:os"));
|
|
172403
172571
|
var import_path8 = __toESM(require("path"));
|
|
172404
172572
|
init_zod();
|
|
@@ -172530,7 +172698,7 @@ async function resolveOutputDir(params, options) {
|
|
|
172530
172698
|
}
|
|
172531
172699
|
if (params.outputDir) {
|
|
172532
172700
|
try {
|
|
172533
|
-
await
|
|
172701
|
+
await import_promises15.default.mkdir(params.outputDir);
|
|
172534
172702
|
return params.outputDir;
|
|
172535
172703
|
} catch (err) {
|
|
172536
172704
|
if (err.code === "EEXIST") return params.outputDir;
|
|
@@ -172541,7 +172709,7 @@ async function resolveOutputDir(params, options) {
|
|
|
172541
172709
|
"argent-screenshot-diff",
|
|
172542
172710
|
import_node_crypto13.default.randomBytes(6).toString("hex")
|
|
172543
172711
|
);
|
|
172544
|
-
await
|
|
172712
|
+
await import_promises15.default.mkdir(dir, { recursive: true });
|
|
172545
172713
|
return dir;
|
|
172546
172714
|
}
|
|
172547
172715
|
async function resolveInputPaths(services, params, outputDir, options, captureScreenshot2, peekFor) {
|
|
@@ -172631,8 +172799,8 @@ async function captureIosDeviceLiveInput(params) {
|
|
|
172631
172799
|
const png = await captureRunnerScreenshotPng(params.runner, RUNNER_COMMAND_TIMEOUT_MS);
|
|
172632
172800
|
const suffix = import_node_crypto13.default.randomBytes(4).toString("hex");
|
|
172633
172801
|
const destination = import_path8.default.join(params.outputDir, `${params.name}-${suffix}.live.png`);
|
|
172634
|
-
await
|
|
172635
|
-
await
|
|
172802
|
+
await import_promises15.default.mkdir(params.outputDir, { recursive: true });
|
|
172803
|
+
await import_promises15.default.writeFile(destination, png);
|
|
172636
172804
|
return destination;
|
|
172637
172805
|
}
|
|
172638
172806
|
async function captureLiveInput(params) {
|
|
@@ -172662,8 +172830,8 @@ async function captureLiveInput(params) {
|
|
|
172662
172830
|
}
|
|
172663
172831
|
const suffix = import_node_crypto13.default.randomBytes(4).toString("hex");
|
|
172664
172832
|
const destination = import_path8.default.join(params.outputDir, `${params.name}-${suffix}.live.png`);
|
|
172665
|
-
await
|
|
172666
|
-
await
|
|
172833
|
+
await import_promises15.default.mkdir(params.outputDir, { recursive: true });
|
|
172834
|
+
await import_promises15.default.copyFile(capture.path, destination);
|
|
172667
172835
|
return {
|
|
172668
172836
|
path: destination,
|
|
172669
172837
|
...panel?.warning !== void 0 ? { warning: panel.warning } : {}
|
|
@@ -173379,13 +173547,13 @@ function probeArgentToolServer(host, port, timeoutMs = 500) {
|
|
|
173379
173547
|
|
|
173380
173548
|
// ../tool-server/src/utils/simulator-watcher.ts
|
|
173381
173549
|
var fs67 = __toESM(require("node:fs"));
|
|
173382
|
-
var
|
|
173383
|
-
var
|
|
173550
|
+
var import_node_child_process41 = require("node:child_process");
|
|
173551
|
+
var import_node_util29 = require("node:util");
|
|
173384
173552
|
init_external_devices();
|
|
173385
|
-
var
|
|
173553
|
+
var execFileAsync31 = (0, import_node_util29.promisify)(import_node_child_process41.execFile);
|
|
173386
173554
|
var POLL_INTERVAL_MS2 = 1e4;
|
|
173387
173555
|
async function getBootedUdidsInSet(deviceSet) {
|
|
173388
|
-
const { stdout } = await
|
|
173556
|
+
const { stdout } = await execFileAsync31("xcrun", [
|
|
173389
173557
|
...simctlPrefix(deviceSet),
|
|
173390
173558
|
"list",
|
|
173391
173559
|
"devices",
|
|
@@ -173504,7 +173672,7 @@ function startSimulatorWatcher(registry2) {
|
|
|
173504
173672
|
}
|
|
173505
173673
|
|
|
173506
173674
|
// ../tool-server/src/utils/preview-window.ts
|
|
173507
|
-
var
|
|
173675
|
+
var import_node_child_process42 = require("node:child_process");
|
|
173508
173676
|
var fs68 = __toESM(require("node:fs"));
|
|
173509
173677
|
var os20 = __toESM(require("node:os"));
|
|
173510
173678
|
var path51 = __toESM(require("node:path"));
|
|
@@ -173536,10 +173704,10 @@ function ensureLensAppBundle(electronBin) {
|
|
|
173536
173704
|
fs68.copyFileSync(path51.join(realContents, "Info.plist"), plist);
|
|
173537
173705
|
const setPlist = (entry, value) => {
|
|
173538
173706
|
try {
|
|
173539
|
-
(0,
|
|
173707
|
+
(0, import_node_child_process42.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Set :${entry} ${value}`, plist]);
|
|
173540
173708
|
} catch {
|
|
173541
173709
|
try {
|
|
173542
|
-
(0,
|
|
173710
|
+
(0, import_node_child_process42.execFileSync)("/usr/libexec/PlistBuddy", ["-c", `Add :${entry} string ${value}`, plist]);
|
|
173543
173711
|
} catch {
|
|
173544
173712
|
}
|
|
173545
173713
|
}
|
|
@@ -173598,7 +173766,7 @@ function createPreviewWindowManager(opts = {}) {
|
|
|
173598
173766
|
const wrapperBin = ensureLensAppBundle(electronBin);
|
|
173599
173767
|
const launchBin = wrapperBin ?? electronBin;
|
|
173600
173768
|
const launchArgs = wrapperBin ? ["--no-sandbox", mainScript] : [mainScript];
|
|
173601
|
-
const next = (0,
|
|
173769
|
+
const next = (0, import_node_child_process42.spawn)(launchBin, launchArgs, {
|
|
173602
173770
|
// Strips ELECTRON_RUN_AS_NODE, which an Electron-based MCP host leaves in
|
|
173603
173771
|
// our env, so the child boots as a GUI app instead of bare Node.
|
|
173604
173772
|
env: electronGuiChildEnv({ ARGENT_PREVIEW_URL: url2 }),
|