refactor: remove legacy ToolApp back strips

This commit is contained in:
7015725
2026-05-22 13:04:51 +08:00
parent 7bc4a1bb7d
commit 3f93a42a00
7 changed files with 19 additions and 194 deletions

View File

@@ -102,8 +102,6 @@ var ConfigValidator = {
CLICK_SLOP_DP: { type: "int", min: 2, max: 20, default: 6 },
TOOLAPP_BACK_GESTURE_MODE: { type: "enum", values: ["edge", "surface", "off"], default: "surface" },
TOOLAPP_BACK_EDGE_WIDTH_DP: { type: "int", min: 1, max: 120, default: 72 },
ENABLE_TOOLAPP_INNER_BACK_STRIPS: { type: "bool", default: false },
ENABLE_TOOLAPP_SCREEN_BACK_STRIPS: { type: "bool", default: false },
TOOLAPP_BACK_COMMIT_DISTANCE_DP: { type: "int", min: 1, max: 480, default: 36 },
TOOLAPP_BACK_SURFACE_SLOP_DP: { type: "int", min: 8, max: 96, default: 24 },
TOOLAPP_BACK_PROGRESS_DISTANCE_DP: { type: "int", min: 1, max: 720, default: 96 },
@@ -740,8 +738,6 @@ var ConfigManager = {
CLICK_SLOP_DP: 6,
TOOLAPP_BACK_GESTURE_MODE: "surface",
TOOLAPP_BACK_EDGE_WIDTH_DP: 72,
ENABLE_TOOLAPP_INNER_BACK_STRIPS: false,
ENABLE_TOOLAPP_SCREEN_BACK_STRIPS: false,
TOOLAPP_BACK_COMMIT_DISTANCE_DP: 36,
TOOLAPP_BACK_SURFACE_SLOP_DP: 24,
TOOLAPP_BACK_PROGRESS_DISTANCE_DP: 96,
@@ -852,16 +848,14 @@ var ConfigManager = {
{ key: "BOUNCE_STEP_MS", name: "回弹步进时长(ms)", type: "int", min: 20, max: 500, step: 10 },
{ key: "BOUNCE_DECAY", name: "回弹衰减(0~1)", type: "float", min: 0.30, max: 0.95, step: 0.01 },
{ type: "section", name: "触摸与手势" },
{ type: "section", name: "动作与手势" },
{ key: "CLICK_SLOP_DP", name: "点击位移阈值(dp)", type: "int", min: 1, max: 40, step: 1 },
{ key: "TOOLAPP_BACK_GESTURE_MODE", name: "设置页滑动返回模式", type: "single_choice", options: [
{ label: "全表面横滑", value: "surface" },
{ label: "仅面板内部左右边缘", value: "edge" },
{ label: "关闭", value: "off" }
]},
{ key: "TOOLAPP_BACK_EDGE_WIDTH_DP", name: "边缘模式起手宽度", type: "int", min: 1, max: 120, step: 1 },
{ key: "ENABLE_TOOLAPP_INNER_BACK_STRIPS", name: "启用旧版页面覆盖热区(不推荐)", type: "bool" },
{ key: "ENABLE_TOOLAPP_SCREEN_BACK_STRIPS", name: "启用旧版屏幕空白区热区(已禁用)", type: "bool" },
{ key: "TOOLAPP_BACK_EDGE_WIDTH_DP", name: "内部边缘起手宽度", type: "int", min: 1, max: 120, step: 1 },
{ key: "TOOLAPP_BACK_COMMIT_DISTANCE_DP", name: "设置页返回触发距离", type: "int", min: 1, max: 480, step: 1 },
{ key: "TOOLAPP_BACK_SURFACE_SLOP_DP", name: "表面横滑起手阈值", type: "int", min: 8, max: 96, step: 1 },
{ key: "TOOLAPP_BACK_PROGRESS_DISTANCE_DP", name: "设置页返回动画距离", type: "int", min: 1, max: 720, step: 1 },
@@ -902,7 +896,10 @@ var ConfigManager = {
var needReset = false;
if (s) {
var sStr = JSON.stringify(s);
if (sStr.indexOf("ENABLE_SNAP_TO_EDGE") < 0 || sStr.indexOf("ENABLE_ANIMATIONS") < 0 || sStr.indexOf("BALL_IDLE_ALPHA") < 0 || sStr.indexOf("PANEL_POS_GRAVITY") < 0 || sStr.indexOf("single_choice") < 0 || sStr.indexOf("ball_shortx_icon") < 0 || sStr.indexOf("ball_color") < 0 || sStr.indexOf("SETTINGS_THEME") < 0 || sStr.indexOf("BALL_BG_COLOR_HEX") < 0 || sStr.indexOf("BALL_ICON_SIZE_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_GESTURE_MODE") < 0 || sStr.indexOf("TOOLAPP_BACK_EDGE_WIDTH_DP") < 0 || sStr.indexOf("ENABLE_TOOLAPP_INNER_BACK_STRIPS") < 0 || sStr.indexOf("ENABLE_TOOLAPP_SCREEN_BACK_STRIPS") < 0 || sStr.indexOf("TOOLAPP_BACK_COMMIT_DISTANCE_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_SURFACE_SLOP_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_PROGRESS_DISTANCE_DP") < 0 || sStr.indexOf("LONG_PRESS_TRIGGERED_MOVE_SLOP_DP") < 0) {
if (sStr.indexOf("ENABLE_SNAP_TO_EDGE") < 0 || sStr.indexOf("ENABLE_ANIMATIONS") < 0 || sStr.indexOf("BALL_IDLE_ALPHA") < 0 || sStr.indexOf("PANEL_POS_GRAVITY") < 0 || sStr.indexOf("single_choice") < 0 || sStr.indexOf("ball_shortx_icon") < 0 || sStr.indexOf("ball_color") < 0 || sStr.indexOf("SETTINGS_THEME") < 0 || sStr.indexOf("BALL_BG_COLOR_HEX") < 0 || sStr.indexOf("BALL_ICON_SIZE_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_GESTURE_MODE") < 0 || sStr.indexOf("TOOLAPP_BACK_EDGE_WIDTH_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_COMMIT_DISTANCE_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_SURFACE_SLOP_DP") < 0 || sStr.indexOf("TOOLAPP_BACK_PROGRESS_DISTANCE_DP") < 0 || sStr.indexOf("LONG_PRESS_TRIGGERED_MOVE_SLOP_DP") < 0) {
needReset = true;
}
if (!needReset && (sStr.indexOf("ENABLE_TOOLAPP_INNER_BACK_STRIPS") >= 0 || sStr.indexOf("ENABLE_TOOLAPP_SCREEN_BACK_STRIPS") >= 0)) {
needReset = true;
}
@@ -935,8 +932,6 @@ var ConfigManager = {
schemaItemDiffers("BALL_BG_COLOR_HEX", ["name", "type"]) ||
schemaItemDiffers("TOOLAPP_BACK_GESTURE_MODE", ["name", "type"]) ||
schemaItemDiffers("TOOLAPP_BACK_EDGE_WIDTH_DP", ["name", "type", "min", "max", "step"]) ||
schemaItemDiffers("ENABLE_TOOLAPP_INNER_BACK_STRIPS", ["name", "type"]) ||
schemaItemDiffers("ENABLE_TOOLAPP_SCREEN_BACK_STRIPS", ["name", "type"]) ||
schemaItemDiffers("TOOLAPP_BACK_COMMIT_DISTANCE_DP", ["name", "type", "min", "max", "step"]) ||
schemaItemDiffers("TOOLAPP_BACK_SURFACE_SLOP_DP", ["name", "type", "min", "max", "step"]) ||
schemaItemDiffers("TOOLAPP_BACK_PROGRESS_DISTANCE_DP", ["name", "type", "min", "max", "step"]) ||

View File

@@ -56,7 +56,6 @@ function FloatBallAppWM(logger) {
toolAppBackPreviewView: null,
toolAppBackPreviewRoute: null,
toolAppBackPreviewReady: false,
toolAppScreenBackStrips: [],
toolAppTitleView: null,
toolAppBackButton: null,
settingsGroupKey: null,

View File

@@ -319,28 +319,7 @@ FloatBallAppWM.prototype.applyImmediateEffectsForKey = function(k) {
}
if (k === "BALL_SIZE_DP" || k === "BALL_PNG_MODE" || k === "BALL_ICON_TYPE" || k === "BALL_ICON_FILE_PATH" || k === "BALL_ICON_RES_ID" || k === "BALL_ICON_RES_NAME" || k === "BALL_ICON_SIZE_DP" || k === "BALL_ICON_TINT_HEX" || k === "BALL_BG_COLOR_HEX") { this.rebuildBallForNewSize(); return; }
if (k === "TOOLAPP_BACK_EDGE_WIDTH_DP" || k === "ENABLE_TOOLAPP_INNER_BACK_STRIPS") {
try {
if (this.state.toolAppActive) {
if (k === "ENABLE_TOOLAPP_INNER_BACK_STRIPS" && this.showToolApp) {
this.showToolApp(this.state.toolAppRoute || "settings", false);
}
if (this.refreshToolAppScreenBackStrips) this.refreshToolAppScreenBackStrips();
}
} catch(eBackStrip) {
safeLog(this.L, "w", "apply back strip fail: " + String(eBackStrip));
}
return;
}
if (k === "ENABLE_TOOLAPP_SCREEN_BACK_STRIPS") {
try {
if (this.state.toolAppActive && this.refreshToolAppScreenBackStrips) {
this.refreshToolAppScreenBackStrips();
}
} catch(eScreenBackStrip) {
safeLog(this.L, "w", "apply screen back strip fail: " + String(eScreenBackStrip));
}
if (k === "TOOLAPP_BACK_EDGE_WIDTH_DP") {
return;
}

View File

@@ -128,7 +128,6 @@ FloatBallAppWM.prototype.safeRemoveView = function(v, whichName) {
try {
if (!v) return { ok: true, skipped: true };
try { if (this.unregisterPanelPredictiveBack) this.unregisterPanelPredictiveBack(v); } catch (eBack) {}
try { if (whichName === "viewerPanel" && this.state && String(this.state.viewerPanelType || "") === "tool_app" && this.hideToolAppScreenBackStrips) this.hideToolAppScreenBackStrips(); } catch (eStrip) {}
this.state.wm.removeView(v);
return { ok: true };
} catch (e) {
@@ -196,7 +195,6 @@ FloatBallAppWM.prototype.hideViewerPanel = function() {
this.state.toolAppBackPreviewView = null;
this.state.toolAppBackPreviewRoute = null;
this.state.toolAppBackPreviewReady = false;
try { if (this.hideToolAppScreenBackStrips) this.hideToolAppScreenBackStrips(); } catch (eStrip) {}
this.state.toolAppTitleView = null;
this.state.toolAppBackButton = null;
}
@@ -608,7 +606,6 @@ FloatBallAppWM.prototype._clearHeavyCachesIfAllHidden = function(reason) {
};
FloatBallAppWM.prototype.hideAllPanels = function() {
try { if (this.hideToolAppScreenBackStrips) this.hideToolAppScreenBackStrips(); } catch (eStrip) {}
this.hideMainPanel();
this.hideSettingsPanel();
this.hideViewerPanel();
@@ -995,10 +992,6 @@ FloatBallAppWM.prototype.onScreenChangedReflow = function(reason) {
try { this.state.wm.updateViewLayout(this.state.ballRoot, this.state.ballLp); } catch(eU) { safeLog(null, 'e', "catch " + String(eU)); }
this.savePos(this.state.ballLp.x, this.state.ballLp.y);
if (this.state.toolAppActive && this.refreshToolAppScreenBackStrips) {
try { this.refreshToolAppScreenBackStrips(); } catch(eBackStrip) { safeLog(this.L, 'w', "screen reflow refresh tool app back strips fail: " + String(eBackStrip)); }
}
safeLog(this.L, 'i',
"screen reflow reason=" + String(reason || "") +
" old=" + oldW + "x" + oldH +

View File

@@ -557,7 +557,6 @@ FloatBallAppWM.prototype.closeToolApp = function() {
this.state.toolAppBackPreviewReady = false;
this.state.toolAppBackPreviewStackVersion = null;
this.state.toolAppBackPreviewEntryKey = null;
try { if (this.hideToolAppScreenBackStrips) this.hideToolAppScreenBackStrips(); } catch (eStrip) {}
this.state.toolAppTitleView = null;
this.state.toolAppBackButton = null;
} catch (e) { safeLog(this.L, 'e', "closeToolApp fail: " + String(e)); }
@@ -1121,81 +1120,6 @@ FloatBallAppWM.prototype.finishToolAppBackPreview = function(edge, complete) {
}
};
FloatBallAppWM.prototype.createToolAppEdgeBackStrip = function(edge) {
var self = this;
var strip = new android.view.View(context);
strip.setBackgroundColor(android.graphics.Color.TRANSPARENT);
var downX = 0;
var downY = 0;
var active = false;
var moved = false;
strip.setOnTouchListener(new android.view.View.OnTouchListener({
onTouch: function(v, event) {
try {
if (!event) return false;
var action = event.getActionMasked();
if (action === android.view.MotionEvent.ACTION_DOWN) {
downX = event.getRawX();
downY = event.getRawY();
active = !!(self.state && self.state.toolAppActive && self.hasToolAppBackTarget && self.hasToolAppBackTarget());
moved = false;
if (active) self.prepareToolAppBackPreview(edge);
return active;
}
if (!active) return false;
if (action === android.view.MotionEvent.ACTION_MOVE) {
var mx = event.getRawX() - downX;
var my = event.getRawY() - downY;
var validDir = (edge === 0 && mx > 0) || (edge === 1 && mx < 0);
if (validDir && Math.abs(mx) > self.dp(3) && Math.abs(mx) > Math.abs(my) * 0.85) {
if (!moved) {
try { safeLog(self.L, 'd', 'edge strip move edge=' + String(edge) + ' mx=' + String(mx)); } catch(eMoveLog) {}
}
moved = true;
var triggerDp = Number(self.config.TOOLAPP_BACK_PROGRESS_DISTANCE_DP || 96);
if (isNaN(triggerDp)) triggerDp = 96;
if (triggerDp < 1) triggerDp = 1;
if (triggerDp > 720) triggerDp = 720;
var triggerDistance = self.dp(triggerDp);
var p = Math.min(1, Math.abs(mx) / triggerDistance);
self.applyToolAppBackPreviewProgress(edge, p, Math.abs(mx));
}
return true;
}
if (action === android.view.MotionEvent.ACTION_UP || action === android.view.MotionEvent.ACTION_CANCEL) {
var ux = event.getRawX() - downX;
var uy = event.getRawY() - downY;
var commitDp = Number(self.config.TOOLAPP_BACK_COMMIT_DISTANCE_DP || 36);
if (isNaN(commitDp)) commitDp = 36;
if (commitDp < 1) commitDp = 1;
if (commitDp > 480) commitDp = 480;
var completeDistance = self.dp(commitDp);
var okDir = (edge === 0 && ux > completeDistance) || (edge === 1 && ux < -completeDistance);
var ok = (action === android.view.MotionEvent.ACTION_UP) && moved && okDir && Math.abs(ux) > Math.abs(uy) * 0.85;
active = false;
self.finishToolAppBackPreview(edge, ok);
return true;
}
} catch (e) {
try { self.clearToolAppBackPreview(true); } catch (eClear) {}
try { safeLog(self.L, 'w', "tool app edge back fail: " + String(e)); } catch(eLog) {}
}
return false;
}
}));
return strip;
};
FloatBallAppWM.prototype.hideToolAppScreenBackStrips = function() {
try {
var arr = this.state.toolAppScreenBackStrips || [];
for (var i = 0; i < arr.length; i++) {
try { if (arr[i] && this.state.wm) this.state.wm.removeView(arr[i]); } catch (eRm) {}
}
this.state.toolAppScreenBackStrips = [];
} catch (e) { safeLog(this.L, 'w', "hide tool app screen back strips fail: " + String(e)); }
};
FloatBallAppWM.prototype.getToolAppBackEdgeWidthPx = function() {
var stripDp = 72;
try {
@@ -1209,33 +1133,6 @@ FloatBallAppWM.prototype.getToolAppBackEdgeWidthPx = function() {
return this.dp(stripDp);
};
FloatBallAppWM.prototype.isToolAppScreenBackStripsEnabled = function() {
// 旧版 WindowManager 透明边缘热区已禁用:它可能抢 ACTION_DOWN影响按钮、列表、SeekBar、Switch。
// 保留函数和清理路径仅为兼容历史状态;正式返回手势由 ToolApp root surface 接管。
try { this.hideToolAppScreenBackStrips(); } catch(eHide) {}
return false;
};
FloatBallAppWM.prototype.showToolAppScreenBackStrips = function() {
// 旧版 WindowManager 透明边缘热区已禁用;不要再创建额外触摸层。
try { this.hideToolAppScreenBackStrips(); } catch(eHide) {}
return false;
};
FloatBallAppWM.prototype.refreshToolAppScreenBackStrips = function() {
try {
this.hideToolAppScreenBackStrips();
if (!this.state.toolAppActive) return false;
if (!this.hasToolAppBackTarget || !this.hasToolAppBackTarget()) return false;
if (!this.isToolAppScreenBackStripsEnabled || !this.isToolAppScreenBackStripsEnabled()) return false;
return this.showToolAppScreenBackStrips();
} catch(e) {
try { this.hideToolAppScreenBackStrips(); } catch(eHide) {}
safeLog(this.L, 'w', "refresh tool app screen back strips fail: " + String(e));
}
return false;
};
FloatBallAppWM.prototype.getToolAppResponsiveSpec = function() {
var sw = Math.max(1, Number(this.state.screen && this.state.screen.w || 0));
var sh = Math.max(1, Number(this.state.screen && this.state.screen.h || 0));
@@ -1585,13 +1482,6 @@ FloatBallAppWM.prototype.buildToolAppShell = function(contentView, title, canBac
hostLp.setMargins((spec && (spec.isExpandedWidth || spec.isWideWidth)) ? this.dp(4) : this.dp(6), 0, (spec && (spec.isExpandedWidth || spec.isWideWidth)) ? this.dp(4) : this.dp(6), (spec && (spec.isExpandedWidth || spec.isWideWidth)) ? this.dp(4) : this.dp(6));
body.addView(host, hostLp);
// 兼容旧设置:不再添加页面内透明返回热区。
// 返回手势由 root.onInterceptTouchEvent 延迟拦截surface 模式会排除交互控件edge 模式保留边缘起手。
try {
this.state.toolAppInnerBackLeftStrip = null;
this.state.toolAppInnerBackRightStrip = null;
} catch (eStrip) { safeLog(this.L, 'w', "clear edge back strip state fail: " + String(eStrip)); }
this.state.toolAppRoot = root;
this.state.toolAppBody = body;
this.state.toolAppContentHost = host;
@@ -1602,36 +1492,6 @@ FloatBallAppWM.prototype.buildToolAppShell = function(contentView, title, canBac
return root;
};
FloatBallAppWM.prototype.updateToolAppInnerBackEdgeWidth = function() {
try {
var w = this.getToolAppBackEdgeWidthPx ? this.getToolAppBackEdgeWidthPx() : this.dp(48);
var left = this.state.toolAppInnerBackLeftStrip;
var right = this.state.toolAppInnerBackRightStrip;
if (left) {
var lpL = left.getLayoutParams();
if (lpL) {
lpL.width = w;
left.setLayoutParams(lpL);
}
}
if (right) {
var lpR = right.getLayoutParams();
if (lpR) {
lpR.width = w;
right.setLayoutParams(lpR);
}
}
return true;
} catch(e) {
safeLog(this.L, "w", "update inner back edge width fail: " + String(e));
}
return false;
};
FloatBallAppWM.prototype.ensureToolAppShell = function() {
try {
if (this.state.toolAppRoot && this.state.toolAppContentHost) return this.state.toolAppRoot;
@@ -1764,7 +1624,6 @@ FloatBallAppWM.prototype.showToolApp = function(route, resetStack) {
} catch (eUpd) { safeLog(this.L, 'w', "tool_app update layout fail: " + String(eUpd)); }
try { shell.requestFocus(); } catch (eFocus) {}
}
try { this.refreshToolAppScreenBackStrips(); } catch (eScreenBack) { safeLog(this.L, 'w', "screen edge back strip update fail: " + String(eScreenBack)); }
} catch (e) {
this.state.toolAppActive = false;
safeLog(this.L, 'e', "showToolApp fail route=" + r + " err=" + String(e));

View File

@@ -2,12 +2,12 @@
"alg": "SHA256withRSA",
"files": {
"th_01_base.js": {
"sha256": "4174459f79dfbc9a79ae5fb148060470586f13c92bc28dbedc77396e0f93dc4b",
"size": 58159
"sha256": "c77eb730b0a54bfe784ff9fee4f88e3276826dc73ae98a2ef964bf5041632d38",
"size": 57562
},
"th_02_core.js": {
"sha256": "3c5c498d200e961d48fc9ca3f885475e770ecb32b83ec6a89d23df3f88aed1c9",
"size": 4664
"sha256": "7bfd21df21c137595c3e2a8724b3eb3f0cce82ef0dd18b732de08e9be30b2ba3",
"size": 4631
},
"th_03_icon.js": {
"sha256": "717f7f37474d3616c2cd944581455f600020a850ec8812100d0546ec1302c987",
@@ -18,8 +18,8 @@
"size": 42568
},
"th_05_persistence.js": {
"sha256": "1bec9f5bda8e5ae82f2a42707c59e72f4819fffc200d74ae55f191a76009af9b",
"size": 15754
"sha256": "fac67158d57ce23c92dbc4103d1732946b6ea0fde9f55a04edede9a1f201a7da",
"size": 14921
},
"th_06_icon_parser.js": {
"sha256": "25b95a5df634a7ee359f3ab798e4d3154a71c24016f7b4bf8a658096644b2484",
@@ -34,8 +34,8 @@
"size": 7938
},
"th_09_animation.js": {
"sha256": "2570ffbbc33fa2318e27c5e99c4e78e1bf96c7da8ec134053acda009207488cb",
"size": 42007
"sha256": "7c4b673869978f9015b8641bd2266fc7bbd2131f96338b4bb9c12fab11c50468",
"size": 41346
},
"th_10_shell.js": {
"sha256": "0ed793079c2f6ba7d29f4c0d411705cb72419f45f572cbe37ed32ac16527a8bc",
@@ -58,8 +58,8 @@
"size": 304993
},
"th_15_extra.js": {
"sha256": "037d6721289f615a9022994717f09a4cd30e0d09a5fb573d23606220faacd84b",
"size": 128762
"sha256": "f49d9e94702ff6b69b800aea10ae2d21dc0d52246ad176a92904a55352dbbf82",
"size": 122822
},
"th_16_entry.js": {
"sha256": "6c59d9891cd010647f84c3db93f1cf95c7bbfb758470ea21044bf72eb8ff73d1",
@@ -68,5 +68,5 @@
},
"keyId": "toolhub-targets-2026-rsa3072",
"schema": 2,
"version": 20260522045519
"version": 20260522050433
}

View File

@@ -1 +1 @@
l5dcsFyTm1d4MbDQ7XbMk8Swk4xdvIgu9yjUfupJbJBcSGmt43D4AR/VcAqypQc1BUeslBSpr2YWq8cnVO+9PFVNX2/NPY/hRjjD2HPJZ+jjcNUcSawDXkalcjzeMq7TcxhEadoLj3Hq6dimf7HzYklP+asLOZJfmVxw+2LfroIE+EnlhYhzVyeyWrYMXzpeuhZoO4eazVB3vfjn5gFgESU7yLjSymaUsYNgjx11kBA3Yhc6YdAe4wSf5KbX0prmHQ1pB7gs1YV720E9ECCGonD7nLvnpBMD7zuUb8wcgcq+v/qPCHhdDdaBPCrRQxormZ+gFdrzmoZemMpeYVNpRldAMZ2vwzWc6uQIrAoyujgDn2xcjv8ulY+/m6xM7qT/63kNLCcwN/vVrH7G9Ur/L3bpHyg14UbFmUhMuLpjAJ7HIYjJKORSRXE9JCy/LXV8vo7cy1fR9pBaxM1D+o25TwWU/uYS8sEp4skGetZvaxd0GAfhiprhUW+Xmd2cEar2
ZKMpxzvFsu5MwgX0yJYvrvvhoJxnaLgc8aRbF8Gewpy9vPKguPechj5Lreu91RXxM8eCoEREFP/Z7ed4C2MNIz5NVnzGGa0bmgTLYPLXxS3HX19u+/JtG9peVHXMXzO+ia3+XmFJ4qWm22YXDnfYTpHX8PyxEQwEEg+RkZt8DetxIoZANQFSV0UgUqfP2p0bge1WoNN136fWRmBFCx3+a/7R7My3I3FSvMoLSyGTE/yscaxypc40PTDJc9SrSGz2LbksnWStLduj0ZVrlgDjrr7nBiQWkTEdpNjHvhHAc9bx0S4/iqs1tjQrt2PKdPGxJrDcskQjaqEGlItVoyOwQPRHdDkTi7Zdv1u0sPdUEEelEVCIpWX6crQPG8Ar1OLkg9rguVPC8WilfV3RksntA9Hz52QjNaW0FKAYsE68ngAbbNIlZSXwKS6MBs7G5N+GE5aLdMlUQag1uWbCxjixzh9ipme15+bQ59VXbCBGde28ihMeZehRPIqUvG9Rs+Dj