外观
等级、经验与死亡
等级不是简单的数字——它直接影响你的力量、防御、速度和饥饿消耗。死亡会带来沉重的代价,但每次重生都是一次重新规划的机会。理解这套系统,你就能在生存之路上走得更远。
等级系统
等级是衡量玩家成长的核心指标,它不像传统游戏那样给你技能点,而是直接提升你的基础属性乘数。每升一级,力量、防御、速度和饥饿消耗都会得到改善。
等级基础
玩家初始等级为 1,等级以浮点数形式存储在存档中,UI 上显示为整数(向下取整)。
等级上限对于乘数计算而言为 21 级,超过 21 级后属性不再增长——但等级本身可以继续累积。
经验获取
经验值增加的核心逻辑如下:
floor(x):向下取整。这里把等级转为整数用于指数计算。
其中:0.012 是基础经验值;1.08 是每级的衰减系数。等级越高,获取相同经验值带来的等级增量越小。
因此,玩家等级越高,升级所需经验越多,在本节最下方附录可见2~21级所需经验宝珠数目
经验来源:
| 来源 | 详述 |
|---|---|
| 自动获取 | 每 180 游戏秒(约 3 现实分钟)自动获得 1 点经验,无论玩家在做什么 |
| 击杀生物 | 击杀生物时掉落经验球,数量为 (攻击抗性 / 12)(向上取整),拾取后自动增加经验 |
| 挖矿掉落 | 挖矿或挖掘方块时掉落,掉落数量为 1~3 点 |
| 挖掘坟墓 | 挖掘坟墓时概率掉落 |
说明:攻击抗性会受攻击抗性系数加成(默认 1.0),实际掉落数量按加成后的值计算。只有被玩家击杀的生物才会掉落经验球,自然死亡或其他原因死亡不会掉落。
经验球拾取:经验球弹射出后会散落在生物尸体周围,玩家只需走近即可自动拾取。拾取时播放拾取音效,经验球数量直接累加到玩家经验值上。
经验效率对比:
| 来源 | 单次经验 |
|---|---|
| 自动获取 | 1 |
| 击杀弱小生物(鸟/鱼) | 1 |
| 击杀中型生物(狼/马/牛) | 2~3 |
| 击杀大型生物(熊/犀牛/虎鲸) | 6~25 |
提示:击杀一只虎鲸即可获得 25 点经验,相当于 75 分钟的自动获取量。因此积极狩猎是快速升级的关键。
升级表现:升级时屏幕中央显示"你的等级提升了"提示,并播放一段升级音效(由多个音调渐升的短音组成)。


等级对属性的影响
等级通过四个乘数影响玩家属性。每个乘数由多个因子相乘得到,玩家可以在游戏内面板中查看详细构成。
力量乘数——影响攻击伤害和挖掘速度:
| 因子 | 条件 | 值 | 说明 |
|---|---|---|---|
| 玩家性别 | 男性 | 1.0 | 默认 |
| 女性 | 0.8 | 女性力量 80% | |
| 等级 | 等级 1 | 1.0 | / |
| 等级 21 | 2.0 | 每级 +0.05,最多 +100% | |
| 体力 | 体力 0 | ~0.45 | 体力越低力量越弱 |
| 体力 1 | 1.0 | 满体力时力量正常 | |
| 是否生病 | 健康 | 1.0 | 无影响 |
| 生病 | 0.75 | 生病时力量降低 25% | |
| 是否呕吐 | 未呕吐 | 1.0 | 无影响 |
| 呕吐中 | 0 | 呕吐时完全无法攻击/挖掘 | |
| 是否患流感 | 无流感 | 1.0 | 无影响 |
| 患流感 | 0.75 | 流感时力量降低 25% | |
| 是否咳嗽 | 未咳嗽 | 1.0 | 无影响 |
| 咳嗽中 | 0 | 咳嗽时完全无法攻击/挖掘 | |
| 游戏模式 | 挑战/生存 | 1.0 | 无影响 |
| 无害 | 1.25 | 无害模式力量 +25% |
防御乘数——影响受到的伤害:
| 因子 | 条件 | 值 | 说明 |
|---|---|---|---|
| 玩家性别 | 男性 | 1.0 | 默认 |
| 女性 | 0.8 | 女性防御 80% | |
| 等级 | 等级 1 | 1.0 | / |
| 等级 21 | 2.0 | 每级 +0.05,最多 +100% | |
| 是否生病 | 生病 | 0.75 | 防御降低 25% |
| 是否患流感 | 患流感 | 0.75 | 防御降低 25% |
| 游戏模式 | 挑战 | 1.0 | 无影响 |
| 生存 | 1.25 | 生存模式防御 +25% | |
| 无害 | 1.5 | 无害模式防御 +50% | |
| 创造 | ∞ | 创造模式无敌 |
速度乘数——影响移动速度:
| 因子 | 条件 | 值 | 说明 |
|---|---|---|---|
| 玩家性别 | 男性 | 1.0 | 默认 |
| 女性 | 1.03 | 女性速度 +3% | |
| 等级 | 等级 1 | 1.0 | / |
| 等级 21 | 1.4 | 每级 +0.02,最多 +40% | |
| 衣物 | 依衣物 | 0.5~1.0 | 笨重衣物降低速度,轻便衣物无影响 |
| 体力 | 体力 0 | ~0.45 | 体力越低速度越慢 |
| 体力 1 | 1.0 | 满体力时速度正常 | |
| 是否生病 | 生病 | 0.75 | 速度降低 25% |
| 是否呕吐 | 呕吐中 | 0 | 无法移动 |
| 是否患流感 | 患流感 | 0.75 | 速度降低 25% |
| 是否咳嗽 | 咳嗽中 | 0 | 无法移动 |
饥饿乘数——影响饥饿消耗速度(已在食物与腐败篇详述,这里简列):
| 因子 | 条件 | 值 |
|---|---|---|
| 玩家性别 | 男性 | 1.0 |
| 女性 | 0.7 | |
| 等级 | 等级 1 | 1.0 |
| 等级 21 | 0.8 | |
| 游戏模式 | 无害 | 0.66 |
| 生存 | 0.75 | |
| 挑战 | 1.0 | |
| 创造 | 0 |
举例:一个女性玩家,等级 21,无害模式,则:
- 力量 = 0.8 × 2.0 × 1.25 = 2.0(不考虑体力/疾病)
- 防御 = 0.8 × 2.0 × 1.5 = 2.4
- 速度 = 1.03 × 1.4 = 1.442(不考虑衣物/体力/疾病)
- 饥饿消耗 = 0.7 × 0.8 × 0.66 ≈ 0.37,仅为基准的 37%
生命系统
生命值不是简单的"血条"——它受到多种抗性的影响,不同伤害类型各自独立计算。理解伤害机制,你才能有针对性地提升生存能力。
生命值
生命值在游戏画面上显示为 10 颗心,即 0~20 点生命值(1 颗心 = 2 点)。生命值会自动恢复,恢复速度取决于多种因素:
| 状态 | 每秒恢复 | 约等于 | 回满时间 |
|---|---|---|---|
| 无害模式 | 0.33 点 | 1 点 / 3 秒 | 约 60 秒 |
| 睡觉中且有食物 | 0.033 点 | 1 颗心 / 60 秒 | 约 10 分钟 |
| 清醒且食物 > 50% | 0.022 点 | 1 颗心 / 90 秒 | 约 15 分钟 |
| 非玩家生物 | 0.022 点 | 1 颗心 / 90 秒 | 约 15 分钟 |
说明:游戏内部生命值以 0~1 浮点数存储(1.0 = 满血),画面上换算为 10 颗心。上表已换算为玩家熟悉的"点"和"颗心"单位。恢复量受生命恢复系数(默认 1.0)加成。
伤害类型
游戏中有多种独立的伤害类型,每种都有自己的抗性:
| 伤害类型 | 抗性来源 | 计算公式 | 说明 |
|---|---|---|---|
| 攻击伤害 | 攻击抗性 | 攻击力 / 防御乘数 | 来自生物或玩家的直接攻击 |
| 跌落伤害 | 跌落抗性 | (速度变化 - 抗性)² / 15 / 防御乘数 | 速度变化超过抗性时才受伤 |
| 火焰伤害 | 火焰抗性 | 1 / 抗性 / 防御乘数 | 每秒判定一次 |
| 岩浆伤害 | 岩浆抗性 | 1 / 抗性 × 浸入度 × dt | 浸入岩浆时持续受伤 |
| 溺水伤害 | 缺氧抗性 | 1 / 抗性 / 防御乘数 | 空气值归零后每秒判定 |
| 虚空伤害 | 虚空伤害系数 | 系数 × 0.1 | Y<0 或 Y>296 时每 2 秒判定 |
| 挤压伤害 | 挤压抗性 | 1 / 抗性 | 被方块挤压时每秒判定 |
| 尖刺伤害 | 尖刺抗性 | 取决于尖刺方块 | 踩到仙人掌等尖刺方块 |
| 爆炸伤害 | 爆炸抗性 | 取决于爆炸源 | 被爆炸波及 |
防御乘数会降低所有伤害类型的实际伤害量。
特殊状态
- 空气值:范围 0~1,在水中逐渐下降,归零后开始溺水伤害
- 着火状态:持续受到火焰伤害,可被水扑灭
- 挤压:被移动的方块挤压时受到伤害,屏幕变红
- 鱼类搁浅:水生生物离开水后受到伤害
死亡系统
死亡不是终点,但代价高昂——你会失去所有物品,等级减半。理解不同模式下的死亡规则,能帮你选择最适合自己的游戏方式。
死亡判定
当生命值降至 0 时,游戏执行以下流程:
- 记录死亡时间:记录当前游戏时间作为死亡时间戳
- 播放死亡粒子效果:在尸体位置生成死亡粒子系统
- 掉落所有物品:遍历玩家所有背包栏位,将全部物品丢出
- 记录死亡信息:在玩家统计中添加一条死亡记录(包含天数、位置、死因)
- 尸体存在期间:一定时间后尸体消失(生物被刷掉)
玩家死亡后的流程
玩家死亡后进入"死亡状态",屏幕变暗,等待操作。
当玩家死亡(生命值 ≤ 0)后:
- 玩家数据的状态机切换到死亡状态
- 等级惩罚立即执行:等级减半(最低保留 1 级)
- 等待 1.5 秒现实时间后,玩家可以点击屏幕重生
- 重生等待时间:2.0 秒(地形加载时间)
不同模式下的死亡处理:
| 游戏模式 | 死亡后行为 |
|---|---|
| 创造 | 不会死亡(无敌状态) |
| 无害/生存/挑战 | 等待 1.5 秒后,点击屏幕重生 |
| 残酷 | 弹出游戏菜单,无法直接重生 |
| 冒险 | 若不允许冒险重生,则重新开始冒险关卡 |
等级惩罚
死亡时等级会减半(向下取整,最低为 1):
max(a, b):取较大值。这里保证等级不会低于 1。
举例:
- 等级 10 → 复活后等级 5
- 等级 21 → 复活后等级 10
- 等级 1 → 复活后等级 1(无损失)
注意:等级是浮点数,惩罚时先对当前等级取整再除以 2。例如等级 15.7 先取整为 15,除以 2 得 7.5,再取整为 7。
重生位置
重生时系统会在存档的出生点附近搜索安全位置(范围 17×17×17 格),优先选择:
- 不卡在方块内
- 不处于危险地形中
- 接近原始出生点
经验球
击杀生物后掉落的绿色光球,拾取后自动增加经验值。
击杀生物时,经验球掉落数量为:

- 经验球超过 100 个时会成组掉落,防止卡顿(每组最多 100 个)
- 经验球在生物死亡时生成,通过掉落物子系统添加到世界
玩家统计数据
游戏会记录你从开档以来的所有行为数据,在游戏菜单中可以查看。这些数据没有实际用途,纯粹是满足好奇心和成就感。
游戏会记录以下数据:
| 类别 | 统计项 |
|---|---|
| 移动 | 总移动距离、步行距离、飞行距离、游泳距离、骑行距离、攀爬距离、坠落距离 |
| 高度 | 最高海拔、最低海拔、最深潜水 |
| 动作 | 跳跃次数、睡眠次数、总睡眠时间 |
| 挖掘 | 挖掘方块数、放置方块数、交互次数 |
| 战斗 | 近战攻击/命中次数、远程攻击/命中次数、受到攻击次数 |
| 击杀 | 玩家击杀、陆地生物击杀、水生生物击杀、飞行生物击杀 |
| 生存 | 进食次数、生病次数、患流感次数、呕吐次数 |
| 制作 | 合成物品数、制作家具数 |
| 死亡 | 死亡记录列表(天数、坐标、死因) |
| 等级 | 最高到达等级 |
| 模式 | 使用过的最简单模式 |
附录 部分等级经验值表
| 等级 | 所需经验值 | 等级 | 所需经验值 |
|---|---|---|---|
| 2 | 84 | 12 | 1387 |
| 3 | 174 | 13 | 1581 |
| 4 | 271 | 14 | 1791 |
| 5 | 376 | 15 | 2018 |
| 6 | 489 | 16 | 2264 |
| 7 | 612 | 17 | 2527 |
| 8 | 744 | 18 | 2812 |
| 9 | 887 | 19 | 3111 |
| 10 | 1041 | 20 | 3454 |
| 11 | 1207 | 21 | 3813 |
附录 各生物掉落经验表
| 生物 | 攻击抗性 | 经验球数量 |
|---|---|---|
| 麻雀 | 1.5 | 1 |
| 鸽子 | 2 | 1 |
| 小鸟 | 2.5 | 1 |
| 玩家 | 10 | 1 |
| 鹤鸵、鬣狗、食人鱼、鳐鱼 | 15 | 2 |
| 羊驼、梭鱼、鲈鱼、海鲈、鸵鸟、狼 | 20 | 2 |
| 驴、马、豹、驯鹿、野猪 | 30 | 3 |
| 牛、美洲豹、斑马 | 35 | 3 |
| 骆驼、角马、狮子、公牛鲨 | 40 | 4 |
| 狼人 | 45 | 4 |
| 老虎 | 50 | 5 |
| 公牛、驼鹿 | 60 | 5 |
| 熊 | 70 | 6 |
| 野牛 | 75 | 7 |
| 长颈鹿、虎鲨 | 80 | 7 |
| 犀牛 | 150 | 13 |
| 白鲸、大白鲨 | 240 | 20 |
| 虎鲸 | 300 | 25 |
写给开发者
资料暂存
本小节内容暂时存放于此,后续会移动至"MOD开发"章节。
开发概览
经验获取公式(ComponentLevel.cs)
AddExperience方法:增加玩家经验值的核心方法。参数count(数量)表示增加的经验点数;playSound(是否播放音效)控制是否播放拾取音效。
csharp
public virtual void AddExperience(int count, bool playSound) {
// playSound = 是否播放拾取音效
if (playSound) {
// m_subsystemAudio = 音频子系统,播放经验拾取音效
// 0.2f = 音量;m_random.Float(-0.1f, 0.4f) = 随机音调偏移
m_subsystemAudio.PlaySound("Audio/ExperienceCollected", 0.2f, m_random.Float(-0.1f, 0.4f), 0f, 0f);
}
for (int i = 0; i < count; i++) {
// num = 本次增加的等级增量(浮点数)
// 0.012f = 基础经验值;1.08f = 每级衰减系数
// m_componentPlayer.PlayerData.Level = 玩家当前等级(浮点数)
// MathF.Floor = 向下取整,把等级转为整数用于指数计算
float num = 0.012f / MathF.Pow(1.08f, MathF.Floor(m_componentPlayer.PlayerData.Level - 1f));
// 判断是否跨过整数边界(即是否升级)
if (MathF.Floor(m_componentPlayer.PlayerData.Level + num) > MathF.Floor(m_componentPlayer.PlayerData.Level)) {
// 播放升级音效(7个音调渐升的短音)
// 显示"你的等级提升了"提示
}
m_componentPlayer.PlayerData.Level += num; // 累加等级
}
}自动经验获取
PeriodicGameTimeEvent:周期性游戏时间事件。参数 1 为事件周期(180 秒),参数 2 为初始偏移(179 秒)。每 180 游戏秒触发一次,自动给玩家增加 1 点经验。
csharp
// m_subsystemTime = 时间子系统
// 每 180 游戏秒(约 3 现实分钟)自动获得 1 点经验
if (m_subsystemTime.PeriodicGameTimeEvent(180.0, 179.0)) {
AddExperience(1, false); // false = 不播放音效
}乘数系统框架(ComponentFactors.cs)
每个**乘数(Factor)由多个因子(Factor)组成,每个因子可以是乘算(Multiply)或加算(Add)**类型。最终乘数值 = 所有因子按类型累乘或累加的结果。
csharp
public class Factor {
public string Description; // Description = 显示名称(在游戏内面板中展示)
public float Value; // Value = 数值(该因子的乘数值或加算值)
public string Name; // Name = 索引名称(用于内部查找)
// FactorAdditionType = 因子累加方式,默认为乘算
public FactorAdditionType FactorAdditionType = FactorAdditionType.Multiply; // Multiply=乘算, Add=加算
}
// CalculateFactorsResult = 计算所有因子的最终结果
// factors = 因子集合
public static float CalculateFactorsResult(ICollection<Factor> factors) {
float ans = 1f; // ans = 累积结果,初始为 1
foreach (var factor in factors) {
switch (factor.FactorAdditionType) {
case FactorAdditionType.Multiply: ans *= factor.Value; break; // 乘算:累乘
case FactorAdditionType.Add: ans += factor.Value; break; // 加算:累加
}
}
return ans; // 返回最终乘数值
}等级对各乘数的贡献
下表展示了等级对四个核心乘数的贡献。
level= 玩家当前等级;floor= 向下取整;clamp(x, min, max)= 限制函数,将 x 限制在 min~max 之间。
| 乘数(英文) | 乘数(中文) | 每级增量 | 公式 | 21 级总值 |
|---|---|---|---|---|
| Strength(力量) | 力量乘数 | +0.05 | 1 + 0.05 × floor(clamp(level,1,21) - 1) | 2.0 |
| Resilience(防御) | 防御乘数 | +0.05 | 1 + 0.05 × floor(clamp(level,1,21) - 1) | 2.0 |
| Speed(速度) | 速度乘数 | +0.02 | 1 + 0.02 × floor(clamp(level,1,21) - 1) | 1.4 |
| Hunger(饥饿) | 饥饿乘数 | -0.01 | 1 - 0.01 × floor(clamp(level,1,21) - 1) | 0.8 |
说明:
level被限制在 1~21 之间(clamp(level,1,21)),超过 21 级后乘数不再增长。floor函数将等级取整后参与计算,确保每级增量固定。
死亡惩罚(PlayerData.cs)
PlayerDead状态:玩家死亡后进入的状态机分支。ReduceLevelUponDeath(死亡时是否降低等级)为 true 时执行等级减半;PreviousState(前一状态)为"Playing"(游戏中)时才执行惩罚。
csharp
// m_stateMachine = 状态机,管理玩家状态切换
// "PlayerDead" = 玩家死亡状态
m_stateMachine.AddState("PlayerDead",
// 进入状态时执行(入口委托)
delegate {
HideSpawnDialog(); // HideSpawnDialog = 隐藏重生对话框
// ReduceLevelUponDeath = 是否在死亡时降低等级(默认 true)
// PreviousState = 前一个状态,必须是 "Playing"(游戏中)才惩罚
if (ReduceLevelUponDeath && m_stateMachine.PreviousState == "Playing") {
// Level = 玩家等级;MathF.Floor = 向下取整;MathUtils.Max = 取较大值
// 等级减半,最低保留 1 级
Level = MathUtils.Max(MathF.Floor(Level / 2f), 1f);
}
},
// 每帧更新时执行(更新委托)
delegate {
// Time.RealTime = 现实时间(秒)
// m_playerDeathTime = 玩家死亡时刻(现实时间)
// 等待 1.5 秒现实时间后才允许重生
if (Time.RealTime - (m_playerDeathTime ?? 0) > 1.5) {
if (GameMode == Cruel) {
// Cruel = 残酷模式,弹出游戏菜单,无法重生
}
else if (GameMode == Adventure && !IsAdventureRespawnAllowed) {
// Adventure = 冒险模式
// IsAdventureRespawnAllowed = 是否允许冒险重生,为 false 则重启关卡
}
else {
respawn = true; // respawn = 是否重生标志
}
}
if (respawn) {
LastDeadPlayer = ComponentPlayer.Entity; // LastDeadPlayer = 记录最后死亡的玩家实体
ComponentPlayer = null; // 置空以触发重生流程
}
},
null // 退出状态时执行(出口委托),此处无操作
);经验球掉落(ComponentHealth.cs)
Die方法:生物死亡时调用。Injury(伤害信息)包含伤害来源和类型;AttackResilience(攻击抗性)决定经验球掉落数量;StackExperienceOnKill(击杀时是否叠加经验)控制是否掉落经验球。
csharp
// injury = 伤害信息(包含伤害来源、类型等)
public virtual void Die(Injury injury) {
Health = 0f; // Health = 生命值,归零
// experienceOrbDropCount = 经验球掉落数量
// m_componentCreature.ComponentHealth.AttackResilience = 被击杀生物的攻击抗性
// MathF.Ceiling = 向上取整,除以 12 后取整确保至少掉 1 个
int experienceOrbDropCount = (int)MathF.Ceiling(m_componentCreature.ComponentHealth.AttackResilience / 12f);
// attacker = 攻击者;StackExperienceOnKill = 是否允许击杀叠加经验
if (attacker != null && StackExperienceOnKill) {
// 超过 100 个时分组掉落,防止卡顿
for (int i = 0; i < Math.Min(100, experienceOrbDropCount); i++) {
// dropInWave = 每组掉落数量
int dropInWave = experienceOrbDropCount / 100;
if (i < experienceOrbDropCount % 100) dropInWave++; // 余数补到前几组
// m_subsystemPickables = 掉落物子系统
// ExperienceOrbBlockIndex = 经验球方块索引(值为 8)
// dropInWave = 每组数量
// m_componentCreature.ComponentBody.Position = 掉落位置(生物位置)
// new Vector3(...) = 掉落初速度(随机水平 + 向上 6)
m_subsystemPickables.AddPickable(
ExperienceOrbBlockIndex, // 8
dropInWave,
m_componentCreature.ComponentBody.Position,
new Vector3(random.Vector2(2.5f, 3.5f), 6f),
null,
Entity
);
}
}
}死亡掉落(ComponentHealth.cs)
死亡掉落逻辑:当生命值归零且生命值变化为负(受到致命伤害)或尚未记录死亡时间时,触发死亡流程。
DeathTime(死亡时间戳)记录死亡时刻;KillParticleSystem(死亡粒子系统)播放死亡特效;DropAllItems(掉落全部物品)将背包内所有物品丢出。
csharp
// Health = 生命值;HealthChange = 本帧生命值变化量
// DeathTime = 死亡时间戳(可空,HasValue 表示是否已记录)
if (Health == 0f && (HealthChange < 0f || !DeathTime.HasValue)) {
// m_subsystemGameInfo.TotalElapsedGameTime = 游戏总经过时间
DeathTime = m_subsystemGameInfo.TotalElapsedGameTime;
// KillParticleSystem = 死亡粒子系统(播放死亡特效)
// m_subsystemTerrain = 地形子系统;position2 = 死亡位置;x = 粒子参数
KillParticleSystem killParticleSystem = new(m_subsystemTerrain, position2, x);
// m_subsystemParticles = 粒子系统,添加死亡粒子效果
m_subsystemParticles.AddParticleSystem(killParticleSystem);
// position3 = 掉落中心位置(生物包围盒中心点)
// BoundingBox.Min / Max = 包围盒最小/最大角点
Vector3 position3 = (m_componentCreature.ComponentBody.BoundingBox.Min + m_componentCreature.ComponentBody.BoundingBox.Max) / 2f;
// Entity.FindComponents<IInventory>() = 查找实体上所有实现 IInventory 接口的组件(背包)
// DropAllItems = 掉落全部物品到指定位置
foreach (IInventory item in Entity.FindComponents<IInventory>()) {
item.DropAllItems(position3);
}
}游戏模式枚举
GameMode枚举:定义游戏的所有模式。数值从 0(最简单)到 5(最严格),影响玩家属性、死亡规则和世界行为。
csharp
public enum GameMode {
Creative = 0, // Creative = 创造模式,无敌、无限资源、可飞行
Harmless = 1, // Harmless = 无害模式,不会饥饿、属性加成、死亡可重生
Survival = 2, // Survival = 生存模式,正常饥饿、防御 +25%、死亡可重生
Challenging = 3, // Challenging = 挑战模式,正常属性、死亡可重生
Cruel = 4, // Cruel = 残酷模式,死亡后无法重生,只能删除存档重来
Adventure = 5 // Adventure = 冒险模式,用于自定义冒险关卡,重生规则由关卡设定
}IyDnrYnnuqfjgIHnu4/pqozkuI7mrbvkuqEKCiDnrYnnuqfkuI3mmK/nroDljZXnmoTmlbDlrZfigJTigJTlroPnm7TmjqXlvbHlk43kvaDnmoTlipvph4/jgIHpmLLlvqHjgIHpgJ/luqblkozppaXppb/mtojogJfjgILmrbvkuqHkvJrluKbmnaXmsonph43nmoTku6Pku7fvvIzkvYbmr4/mrKHph43nlJ/pg73mmK/kuIDmrKHph43mlrDop4TliJLnmoTmnLrkvJrjgILnkIbop6Pov5nlpZfns7vnu5/vvIzkvaDlsLHog73lnKjnlJ/lrZjkuYvot6/kuIrotbDlvpfmm7Tov5zjgIIKCiMjIOetiee6p+ezu+e7nwoKPiDnrYnnuqfmmK/ooaHph4/njqnlrrbmiJDplb/nmoTmoLjlv4PmjIfmoIfvvIzlroPkuI3lg4/kvKDnu5/muLjmiI/pgqPmoLfnu5nkvaDmioDog73ngrnvvIzogIzmmK8qKuebtOaOpeaPkOWNh+S9oOeahOWfuuehgOWxnuaAp+S5mOaVsCoq44CC5q+P5Y2H5LiA57qn77yM5Yqb6YeP44CB6Ziy5b6h44CB6YCf5bqm5ZKM6aWl6aW/5raI6ICX6YO95Lya5b6X5Yiw5pS55ZaE44CCCgojIyMg562J57qn5Z+656GACgrnjqnlrrbliJ3lp4vnrYnnuqfkuLogKioxKirvvIznrYnnuqfku6Xmta7ngrnmlbDlvaLlvI/lrZjlgqjlnKjlrZjmoaPkuK3vvIxVSSDkuIrmmL7npLrkuLrmlbTmlbDvvIjlkJHkuIvlj5bmlbTvvInjgIIKCuetiee6p+S4iumZkOWvueS6juS5mOaVsOiuoeeul+iAjOiogOS4uiAqKjIxIOe6pyoq77yM6LaF6L+HIDIxIOe6p+WQjuWxnuaAp+S4jeWGjeWinumVv+KAlOKAlOS9huetiee6p+acrOi6q+WPr+S7pee7p+e7ree0r+enr+OAggoKIyMjIOe7j+mqjOiOt+WPlgoK57uP6aqM5YC85aKe5Yqg55qE5qC45b+D6YC76L6R5aaC5LiL77yaCgokJApcdGV4dHvljYfnuqfmiYDpnIDnu4/pqox9ID0gXGZyYWN7MC4wMTJ9ezEuMDhee1xsZmxvb3IgXHRleHR7562J57qnfSAtIDEgXHJmbG9vcn19CiQkCgo+ICoqZmxvb3IoeCkqKu+8muWQkeS4i+WPluaVtOOAgui/memHjOaKiuetiee6p+i9rOS4uuaVtOaVsOeUqOS6juaMh+aVsOiuoeeul+OAggoK5YW25Lit77yaKiowLjAxMioqIOaYr+WfuuehgOe7j+mqjOWAvO+8myoqMS4wOCoqIOaYr+avj+e6p+eahOihsOWHj+ezu+aVsOOAguetiee6p+i2iumrmO+8jOiOt+WPluebuOWQjOe7j+mqjOWAvOW4puadpeeahOetiee6p+WinumHj+i2iuWwj+OAggoK5Zug5q2k77yM546p5a62562J57qn6LaK6auY77yM5Y2H57qn5omA6ZyA57uP6aqM6LaK5aSa77yM5Zyo5pys6IqC5pyA5LiL5pa56ZmE5b2V5Y+v6KeBMn4yMee6p+aJgOmcgOe7j+mqjOWuneePoOaVsOebrgoKKirnu4/pqozmnaXmupAqKu+8mgoKfCDmnaXmupAgfCDor6bov7AgfAp8LS0tLS0tfC0tLS0tLXwKfCAqKuiHquWKqOiOt+WPlioqIHwg5q+PIDE4MCDmuLjmiI/np5LvvIjnuqYgMyDnjrDlrp7liIbpkp/vvInoh6rliqjojrflvpcgMSDngrnnu4/pqozvvIzml6DorrrnjqnlrrblnKjlgZrku4DkuYggfAp8ICoq5Ye75p2A55Sf54mpKiogfCDlh7vmnYDnlJ/nianml7bmjonokL3nu4/pqoznkIPvvIzmlbDph4/kuLogYCjmlLvlh7vmipfmgKcgLyAxMilg77yI5ZCR5LiK5Y+W5pW077yJ77yM5ou+5Y+W5ZCO6Ieq5Yqo5aKe5Yqg57uP6aqMIHwKfCAqKuaMluefv+aOieiQvSoqIHwg5oyW55+/5oiW5oyW5o6Y5pa55Z2X5pe25o6J6JC977yM5o6J6JC95pWw6YeP5Li6IDF+MyDngrkgfAp8ICoq5oyW5o6Y5Z2f5aKTKiogfCDmjJbmjpjlnZ/lopPml7bmpoLnjofmjonokL0gfAoKPiAqKuivtOaYjioq77ya5pS75Ye75oqX5oCn5Lya5Y+X5pS75Ye75oqX5oCn57O75pWw5Yqg5oiQ77yI6buY6K6kIDEuMO+8ie+8jOWunumZheaOieiQveaVsOmHj+aMieWKoOaIkOWQjueahOWAvOiuoeeul+OAguWPquacieiiq+eOqeWutuWHu+adgOeahOeUn+eJqeaJjeS8muaOieiQvee7j+mqjOeQg++8jOiHqueEtuatu+S6oeaIluWFtuS7luWOn+WboOatu+S6oeS4jeS8muaOieiQveOAggoKKirnu4/pqoznkIPmi77lj5YqKu+8mue7j+mqjOeQg+W8ueWwhOWHuuWQjuS8muaVo+iQveWcqOeUn+eJqeWwuOS9k+WRqOWbtO+8jOeOqeWutuWPqumcgOi1sOi/keWNs+WPr+iHquWKqOaLvuWPluOAguaLvuWPluaXtuaSreaUvuaLvuWPlumfs+aViO+8jOe7j+mqjOeQg+aVsOmHj+ebtOaOpee0r+WKoOWIsOeOqeWutue7j+mqjOWAvOS4iuOAggoKKirnu4/pqozmlYjnjoflr7nmr5QqKu+8mgoKfCDmnaXmupAgfCDljZXmrKHnu4/pqowgfAp8LS0tLS0tfC0tLS0tLS0tLXwKfCDoh6rliqjojrflj5YgfCAxIHwKfCDlh7vmnYDlvLHlsI/nlJ/nianvvIjpuJ8v6bG877yJIHwgMSB8Cnwg5Ye75p2A5Lit5Z6L55Sf54mp77yI54u8L+mprC/niZvvvIkgfCAyfjMgfAp8IOWHu+adgOWkp+Wei+eUn+eJqe+8iOeGii/nioDniZsv6JmO6bK477yJIHwgNn4yNSB8Cgo+ICoq5o+Q56S6KirvvJrlh7vmnYDkuIDlj6romY7psrjljbPlj6/ojrflvpcgMjUg54K557uP6aqM77yM55u45b2T5LqOIDc1IOWIhumSn+eahOiHquWKqOiOt+WPlumHj+OAguWboOatpCoq56ev5p6B54up54yO5piv5b+r6YCf5Y2H57qn55qE5YWz6ZSuKirjgIIKCioq5Y2H57qn6KGo546wKirvvJrljYfnuqfml7blsY/luZXkuK3lpK7mmL7npLoi5L2g55qE562J57qn5o+Q5Y2H5LqGIuaPkOekuu+8jOW5tuaSreaUvuS4gOauteWNh+e6p+mfs+aViO+8iOeUseWkmuS4qumfs+iwg+a4kOWNh+eahOefremfs+e7hOaIkO+8ieOAggoKPGRpdiBjbGFzcz0iYXJjaGl2ZS1nYWxsZXJ5Ij4KICA8ZmlndXJlPgogICAgPGltZyBzcmM9Ii9hcmNoaXZlLWltYWdlcy9leHRlcm5hbC13aWtpL2V4cGVyaWVuY2UtZmFuZG9tLWVzLmpwZyIgYWx0PSLnjqnlrrblnKjnn7/mtJ7mlLbpm4bph5HoibLnu4/pqoznkIPlubbljYfliLDkuoznuqfnmoTmuLjmiI/miKrlm74iPgogICAgPGZpZ2NhcHRpb24+RmFuZG9tIOilv+ivree7tOWfuuWunuacuuWbvu+8mue7j+mqjOeQg+mdoOi/keeOqeWutuWQjuiiq+WQuOaUtu+8jOWNh+e6p+aPkOekuuS4juW9k+WJjeetiee6p+S8muaYvuekuuWcqOW/q+aNt+agj+S4iuaWueOAguaIquWbvueVjOmdouadpeiHqui+g+aXqeeJiOacrO+8jOacuuWItuekuuaEj+S7jeeEtuacieaViOOAgjwvZmlnY2FwdGlvbj4KICA8L2ZpZ3VyZT4KICA8ZmlndXJlPgogICAgPGltZyBzcmM9Ii9pbGx1c3RyYXRpb25zL3RoZW9yeS9leHBlcmllbmNlLWxldmVscy0xLmpwZyIgYWx0PSLpop3lpJbooaXlhYXnmoTljYfnuqfnlYzpnaLmiKrlm74iPgogICAgPGZpZ2NhcHRpb24+6aKd5aSW6KGl5YWF55qE5Y2H57qn55WM6Z2i5oiq5Zu+PC9maWdjYXB0aW9uPgogIDwvZmlndXJlPgo8L2Rpdj4KCiMjIyDnrYnnuqflr7nlsZ7mgKfnmoTlvbHlk40KCuetiee6p+mAmui/h+Wbm+S4quS5mOaVsOW9seWTjeeOqeWutuWxnuaAp+OAguavj+S4quS5mOaVsOeUseWkmuS4quWboOWtkOebuOS5mOW+l+WIsO+8jOeOqeWutuWPr+S7peWcqOa4uOaIj+WGhemdouadv+S4reafpeeci+ivpue7huaehOaIkOOAggoKKirlipvph4/kuZjmlbAqKuKAlOKAlOW9seWTjeaUu+WHu+S8pOWus+WSjOaMluaOmOmAn+W6pu+8mgoKfCDlm6DlrZAgfCDmnaHku7YgfCDlgLwgfCDor7TmmI4gfAp8LS0tLS0tfC0tLS0tLXwtLS0tLXwtLS0tLS18CnwgKirnjqnlrrbmgKfliKsqKiB8IOeUt+aApyB8IDEuMCB8IOm7mOiupCB8CnwgfCDlpbPmgKcgfCAqKjAuOCoqIHwg5aWz5oCn5Yqb6YePIDgwJSB8CnwgKirnrYnnuqcqKiB8IOetiee6pyAxIHwgMS4wIHwgLyB8CnwgfCDnrYnnuqcgMjEgfCAqKjIuMCoqIHwg5q+P57qnICswLjA177yM5pyA5aSaICsxMDAlIHwKfCAqKuS9k+WKmyoqIHwg5L2T5YqbIDAgfCB+MC40NSB8IOS9k+WKm+i2iuS9juWKm+mHj+i2iuW8sSB8CnwgfCDkvZPlipsgMSB8IDEuMCB8IOa7oeS9k+WKm+aXtuWKm+mHj+ato+W4uCB8CnwgKirmmK/lkKbnlJ/nl4UqKiB8IOWBpeW6tyB8IDEuMCB8IOaXoOW9seWTjSB8CnwgfCDnlJ/nl4UgfCAqKjAuNzUqKiB8IOeUn+eXheaXtuWKm+mHj+mZjeS9jiAyNSUgfAp8ICoq5piv5ZCm5ZGV5ZCQKiogfCDmnKrlkZXlkJAgfCAxLjAgfCDml6DlvbHlk40gfAp8IHwg5ZGV5ZCQ5LitIHwgKiowKiogfCDlkZXlkJDml7blrozlhajml6Dms5XmlLvlh7sv5oyW5o6YIHwKfCAqKuaYr+WQpuaCo+a1geaEnyoqIHwg5peg5rWB5oSfIHwgMS4wIHwg5peg5b2x5ZONIHwKfCB8IOaCo+a1geaEnyB8ICoqMC43NSoqIHwg5rWB5oSf5pe25Yqb6YeP6ZmN5L2OIDI1JSB8CnwgKirmmK/lkKblkrPll70qKiB8IOacquWSs+WXvSB8IDEuMCB8IOaXoOW9seWTjSB8CnwgfCDlkrPll73kuK0gfCAqKjAqKiB8IOWSs+WXveaXtuWujOWFqOaXoOazleaUu+WHuy/mjJbmjpggfAp8ICoq5ri45oiP5qih5byPKiogfCDmjJHmiJgv55Sf5a2YIHwgMS4wIHwg5peg5b2x5ZONIHwKfCB8IOaXoOWusyB8ICoqMS4yNSoqIHwg5peg5a6z5qih5byP5Yqb6YePICsyNSUgfAoKKirpmLLlvqHkuZjmlbAqKuKAlOKAlOW9seWTjeWPl+WIsOeahOS8pOWus++8mgoKfCDlm6DlrZAgfCDmnaHku7YgfCDlgLwgfCDor7TmmI4gfAp8LS0tLS0tfC0tLS0tLXwtLS0tLXwtLS0tLXwKfCAqKueOqeWutuaAp+WIqyoqIHwg55S35oCnIHwgMS4wIHwg6buY6K6kIHwKfCB8IOWls+aApyB8ICoqMC44KiogfCDlpbPmgKfpmLLlvqEgODAlIHwKfCAqKuetiee6pyoqIHwg562J57qnIDEgfCAxLjAgfCAvIHwKfCB8IOetiee6pyAyMSB8ICoqMi4wKiogfCDmr4/nuqcgKzAuMDXvvIzmnIDlpJogKzEwMCUgfAp8ICoq5piv5ZCm55Sf55eFKiogfCDnlJ/nl4UgfCAqKjAuNzUqKiB8IOmYsuW+oemZjeS9jiAyNSUgfAp8ICoq5piv5ZCm5oKj5rWB5oSfKiogfCDmgqPmtYHmhJ8gfCAqKjAuNzUqKiB8IOmYsuW+oemZjeS9jiAyNSUgfAp8ICoq5ri45oiP5qih5byPKiogfCDmjJHmiJggfCAxLjAgfCDml6DlvbHlk40gfAp8IHwg55Sf5a2YIHwgKioxLjI1KiogfCDnlJ/lrZjmqKHlvI/pmLLlvqEgKzI1JSB8CnwgfCDml6DlrrMgfCAqKjEuNSoqIHwg5peg5a6z5qih5byP6Ziy5b6hICs1MCUgfAp8IHwg5Yib6YCgIHwgKiriiJ4qKiB8IOWIm+mAoOaooeW8j+aXoOaVjCB8CgoqKumAn+W6puS5mOaVsCoq4oCU4oCU5b2x5ZON56e75Yqo6YCf5bqm77yaCgp8IOWboOWtkCB8IOadoeS7tiB8IOWAvCB8IOivtOaYjiB8CnwtLS0tLS18LS0tLS0tfC0tLS0tfC0tLS0tfAp8ICoq546p5a625oCn5YirKiogfCDnlLfmgKcgfCAxLjAgfCDpu5jorqQgfAp8IHwg5aWz5oCnIHwgKioxLjAzKiogfCDlpbPmgKfpgJ/luqYgKzMlIHwKfCAqKuetiee6pyoqIHwg562J57qnIDEgfCAxLjAgfCAvIHwKfCB8IOetiee6pyAyMSB8ICoqMS40KiogfCDmr4/nuqcgKzAuMDLvvIzmnIDlpJogKzQwJSB8CnwgKirooaPniakqKiB8IOS+neiho+eJqSB8IDAuNX4xLjAgfCDnrKjph43ooaPnianpmY3kvY7pgJ/luqbvvIzovbvkvr/ooaPnianml6DlvbHlk40gfAp8ICoq5L2T5YqbKiogfCDkvZPlipsgMCB8IH4wLjQ1IHwg5L2T5Yqb6LaK5L2O6YCf5bqm6LaK5oWiIHwKfCB8IOS9k+WKmyAxIHwgMS4wIHwg5ruh5L2T5Yqb5pe26YCf5bqm5q2j5bi4IHwKfCAqKuaYr+WQpueUn+eXhSoqIHwg55Sf55eFIHwgKiowLjc1KiogfCDpgJ/luqbpmY3kvY4gMjUlIHwKfCAqKuaYr+WQpuWRleWQkCoqIHwg5ZGV5ZCQ5LitIHwgKiowKiogfCDml6Dms5Xnp7vliqggfAp8ICoq5piv5ZCm5oKj5rWB5oSfKiogfCDmgqPmtYHmhJ8gfCAqKjAuNzUqKiB8IOmAn+W6pumZjeS9jiAyNSUgfAp8ICoq5piv5ZCm5ZKz5Ze9KiogfCDlkrPll73kuK0gfCAqKjAqKiB8IOaXoOazleenu+WKqCB8CgoqKumlpemlv+S5mOaVsCoq4oCU4oCU5b2x5ZON6aWl6aW/5raI6ICX6YCf5bqm77yI5bey5ZyoW+mjn+eJqeS4juiFkOi0pV0oL3RoZW9yeS9mb29kI+mlpemlv+ezu+e7nynnr4for6bov7DvvIzov5nph4znroDliJfvvInvvJoKCnwg5Zug5a2QIHwg5p2h5Lu2IHwg5YC8IHwKfC0tLS0tLXwtLS0tLS18LS0tLS18CnwgKirnjqnlrrbmgKfliKsqKiB8IOeUt+aApyB8IDEuMCB8CnwgfCDlpbPmgKcgfCAqKjAuNyoqIHwKfCAqKuetiee6pyoqIHwg562J57qnIDEgfCAxLjAgfAp8IHwg562J57qnIDIxIHwgKiowLjgqKiB8CnwgKirmuLjmiI/mqKHlvI8qKiB8IOaXoOWusyB8ICoqMC42NioqIHwKfCB8IOeUn+WtmCB8ICoqMC43NSoqIHwKfCB8IOaMkeaImCB8IDEuMCB8CnwgfCDliJvpgKAgfCAqKjAqKiB8CgoqKuS4vuS+iyoq77ya5LiA5Liq5aWz5oCn546p5a6277yM562J57qnIDIx77yM5peg5a6z5qih5byP77yM5YiZ77yaCi0g5Yqb6YePID0gMC44IMOXIDIuMCDDlyAxLjI1ID0gKioyLjAqKu+8iOS4jeiAg+iZkeS9k+WKmy/nlr7nl4XvvIkKLSDpmLLlvqEgPSAwLjggw5cgMi4wIMOXIDEuNSA9ICoqMi40KioKLSDpgJ/luqYgPSAxLjAzIMOXIDEuNCA9ICoqMS40NDIqKu+8iOS4jeiAg+iZkeiho+eJqS/kvZPlipsv55a+55eF77yJCi0g6aWl6aW/5raI6ICXID0gMC43IMOXIDAuOCDDlyAwLjY2IOKJiCAqKjAuMzcqKu+8jOS7heS4uuWfuuWHhueahCAzNyUKCiMjIOeUn+WRveezu+e7nwoKPiDnlJ/lkb3lgLzkuI3mmK/nroDljZXnmoQi6KGA5p2hIuKAlOKAlOWug+WPl+WIsOWkmuenjeaKl+aAp+eahOW9seWTje+8jOS4jeWQjOS8pOWus+exu+Wei+WQhOiHqueLrOeri+iuoeeul+OAgueQhuino+S8pOWus+acuuWItu+8jOS9oOaJjeiDveaciemSiOWvueaAp+WcsOaPkOWNh+eUn+WtmOiDveWKm+OAggoKIyMjIOeUn+WRveWAvAoK55Sf5ZG95YC85Zyo5ri45oiP55S76Z2i5LiK5pi+56S65Li6ICoqMTAg6aKX5b+DKirvvIzljbMgKiowfjIwIOeCueeUn+WRveWAvCoq77yIMSDpopflv4MgPSAyIOeCue+8ieOAgueUn+WRveWAvOS8muiHquWKqOaBouWkje+8jOaBouWkjemAn+W6puWPluWGs+S6juWkmuenjeWboOe0oO+8mgoKfCDnirbmgIEgfCDmr4/np5LmgaLlpI0gfCDnuqbnrYnkuo4gfCDlm57mu6Hml7bpl7QgfAp8LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLXwtLS0tLS0tLS18CnwgKirml6DlrrPmqKHlvI8qKiB8IDAuMzMg54K5IHwgMSDngrkgLyAzIOenkiB8IOe6piA2MCDnp5IgfAp8ICoq552h6KeJ5Lit5LiU5pyJ6aOf54mpKiogfCAwLjAzMyDngrkgfCAxIOmil+W/gyAvIDYwIOenkiB8IOe6piAxMCDliIbpkp8gfAp8ICoq5riF6YaS5LiU6aOf54mpID4gNTAlKiogfCAwLjAyMiDngrkgfCAxIOmil+W/gyAvIDkwIOenkiB8IOe6piAxNSDliIbpkp8gfAp8ICoq6Z2e546p5a6255Sf54mpKiogfCAwLjAyMiDngrkgfCAxIOmil+W/gyAvIDkwIOenkiB8IOe6piAxNSDliIbpkp8gfAoKPiAqKuivtOaYjioq77ya5ri45oiP5YaF6YOo55Sf5ZG95YC85LulIDB+MSDmta7ngrnmlbDlrZjlgqjvvIgxLjAgPSDmu6HooYDvvInvvIznlLvpnaLkuIrmjaLnrpfkuLogMTAg6aKX5b+D44CC5LiK6KGo5bey5o2i566X5Li6546p5a6254af5oKJ55qEIueCuSLlkowi6aKX5b+DIuWNleS9jeOAguaBouWkjemHj+WPl+eUn+WRveaBouWkjeezu+aVsO+8iOm7mOiupCAxLjDvvInliqDmiJDjgIIKCiMjIyDkvKTlrrPnsbvlnosKCua4uOaIj+S4reacieWkmuenjeeLrOeri+eahOS8pOWus+exu+Wei++8jOavj+enjemDveacieiHquW3seeahOaKl+aAp++8mgoKfCDkvKTlrrPnsbvlnosgfCDmipfmgKfmnaXmupAgfCDorqHnrpflhazlvI8gfCDor7TmmI4gfAp8LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAp8ICoq5pS75Ye75Lyk5a6zKiogfCDmlLvlh7vmipfmgKcgfCDmlLvlh7vlipsgLyDpmLLlvqHkuZjmlbAgfCDmnaXoh6rnlJ/nianmiJbnjqnlrrbnmoTnm7TmjqXmlLvlh7sgfAp8ICoq6LeM6JC95Lyk5a6zKiogfCDot4zokL3mipfmgKcgfCBgKOmAn+W6puWPmOWMliAtIOaKl+aApynCsiAvIDE1IC8g6Ziy5b6h5LmY5pWwYCB8IOmAn+W6puWPmOWMlui2hei/h+aKl+aAp+aXtuaJjeWPl+S8pCB8CnwgKirngavnhLDkvKTlrrMqKiB8IOeBq+eEsOaKl+aApyB8IDEgLyDmipfmgKcgLyDpmLLlvqHkuZjmlbAgfCDmr4/np5LliKTlrprkuIDmrKEgfAp8ICoq5bKp5rWG5Lyk5a6zKiogfCDlsqnmtYbmipfmgKcgfCAxIC8g5oqX5oCnIMOXIOa1uOWFpeW6piDDlyBkdCB8IOa1uOWFpeWyqea1huaXtuaMgee7reWPl+S8pCB8CnwgKirmurrmsLTkvKTlrrMqKiB8IOe8uuawp+aKl+aApyB8IDEgLyDmipfmgKcgLyDpmLLlvqHkuZjmlbAgfCDnqbrmsJTlgLzlvZLpm7blkI7mr4/np5LliKTlrpogfAp8ICoq6Jma56m65Lyk5a6zKiogfCDomZrnqbrkvKTlrrPns7vmlbAgfCDns7vmlbAgw5cgMC4xIHwgWTwwIOaIliBZPjI5NiDml7bmr48gMiDnp5LliKTlrpogfAp8ICoq5oyk5Y6L5Lyk5a6zKiogfCDmjKTljovmipfmgKcgfCAxIC8g5oqX5oCnIHwg6KKr5pa55Z2X5oyk5Y6L5pe25q+P56eS5Yik5a6aIHwKfCAqKuWwluWIuuS8pOWusyoqIHwg5bCW5Yi65oqX5oCnIHwg5Y+W5Yaz5LqO5bCW5Yi65pa55Z2XIHwg6Lip5Yiw5LuZ5Lq65o6M562J5bCW5Yi65pa55Z2XIHwKfCAqKueIhueCuOS8pOWusyoqIHwg54iG54K45oqX5oCnIHwg5Y+W5Yaz5LqO54iG54K45rqQIHwg6KKr54iG54K45rOi5Y+KIHwKCumYsuW+oeS5mOaVsOS8mumZjeS9juaJgOacieS8pOWus+exu+Wei+eahOWunumZheS8pOWus+mHj+OAggoKIyMjIOeJueauiueKtuaAgQoKLSAqKuepuuawlOWAvCoq77ya6IyD5Zu0IDB+Me+8jOWcqOawtOS4remAkOa4kOS4i+mZje+8jOW9kumbtuWQjuW8gOWni+a6uuawtOS8pOWuswotICoq552A54Gr54q25oCBKirvvJrmjIHnu63lj5fliLDngavnhLDkvKTlrrPvvIzlj6/ooqvmsLTmiZHnga0KLSAqKuaMpOWOiyoq77ya6KKr56e75Yqo55qE5pa55Z2X5oyk5Y6L5pe25Y+X5Yiw5Lyk5a6z77yM5bGP5bmV5Y+Y57qiCi0gKirpsbznsbvmkIHmtYUqKu+8muawtOeUn+eUn+eJqeemu+W8gOawtOWQjuWPl+WIsOS8pOWuswoKIyMg5q275Lqh57O757ufCgo+IOatu+S6oeS4jeaYr+e7iOeCue+8jOS9huS7o+S7t+mrmOaYguKAlOKAlOS9oOS8muWkseWOu+aJgOacieeJqeWTge+8jOetiee6p+WHj+WNiuOAgueQhuino+S4jeWQjOaooeW8j+S4i+eahOatu+S6oeinhOWIme+8jOiDveW4ruS9oOmAieaLqeacgOmAguWQiOiHquW3seeahOa4uOaIj+aWueW8j+OAggoKIyMjIOatu+S6oeWIpOWumgoK5b2T55Sf5ZG95YC86ZmN6IezIDAg5pe277yM5ri45oiP5omn6KGM5Lul5LiL5rWB56iL77yaCgoxLiAqKuiusOW9leatu+S6oeaXtumXtCoq77ya6K6w5b2V5b2T5YmN5ri45oiP5pe26Ze05L2c5Li65q275Lqh5pe26Ze05oizCjIuICoq5pKt5pS+5q275Lqh57KS5a2Q5pWI5p6cKirvvJrlnKjlsLjkvZPkvY3nva7nlJ/miJDmrbvkuqHnspLlrZDns7vnu58KMy4gKirmjonokL3miYDmnInnianlk4EqKu+8mumBjeWOhueOqeWutuaJgOacieiDjOWMheagj+S9je+8jOWwhuWFqOmDqOeJqeWTgeS4ouWHugo0LiAqKuiusOW9leatu+S6oeS/oeaBryoq77ya5Zyo546p5a6257uf6K6h5Lit5re75Yqg5LiA5p2h5q275Lqh6K6w5b2V77yI5YyF5ZCr5aSp5pWw44CB5L2N572u44CB5q275Zug77yJCjUuICoq5bC45L2T5a2Y5Zyo5pyf6Ze0KirvvJrkuIDlrprml7bpl7TlkI7lsLjkvZPmtojlpLHvvIjnlJ/nianooqvliLfmjonvvIkKCiMjIyDnjqnlrrbmrbvkuqHlkI7nmoTmtYHnqIsKCj4g546p5a625q275Lqh5ZCO6L+b5YWlIuatu+S6oeeKtuaAgSLvvIzlsY/luZXlj5jmmpfvvIznrYnlvoXmk43kvZzjgIIKCuW9k+eOqeWutuatu+S6oe+8iOeUn+WRveWAvCDiiaQgMO+8ieWQju+8mgoKMS4g546p5a625pWw5o2u55qE54q25oCB5py65YiH5o2i5Yiw5q275Lqh54q25oCBCjIuIOetiee6p+aDqee9mueri+WNs+aJp+ihjO+8muetiee6p+WHj+WNiu+8iOacgOS9juS/neeVmSAxIOe6p++8iQozLiDnrYnlvoUgMS41IOenkueOsOWunuaXtumXtOWQju+8jOeOqeWutuWPr+S7peeCueWHu+Wxj+W5lemHjeeUnwo0LiDph43nlJ/nrYnlvoXml7bpl7TvvJoyLjAg56eS77yI5Zyw5b2i5Yqg6L295pe26Ze077yJCgoqKuS4jeWQjOaooeW8j+S4i+eahOatu+S6oeWkhOeQhioq77yaCgp8IOa4uOaIj+aooeW8jyB8IOatu+S6oeWQjuihjOS4uiB8CnwtLS0tLS0tLS18LS0tLS0tLS0tLS18CnwgKirliJvpgKAqKiB8IOS4jeS8muatu+S6oe+8iOaXoOaVjOeKtuaAge+8iSB8CnwgKirml6DlrrMv55Sf5a2YL+aMkeaImCoqIHwg562J5b6FIDEuNSDnp5LlkI7vvIzngrnlh7vlsY/luZXph43nlJ8gfAp8ICoq5q6L6YW3KiogfCDlvLnlh7rmuLjmiI/oj5zljZXvvIzml6Dms5Xnm7TmjqXph43nlJ8gfAp8ICoq5YaS6ZmpKiogfCDoi6XkuI3lhYHorrjlhpLpmanph43nlJ/vvIzliJnph43mlrDlvIDlp4vlhpLpmanlhbPljaEgfAoKIyMjIOetiee6p+aDqee9mgoK5q275Lqh5pe2562J57qn5LyaKirlh4/ljYoqKu+8iOWQkeS4i+WPluaVtO+8jOacgOS9juS4uiAx77yJ77yaCgokJApcdGV4dHvlpI3mtLvlkI7nrYnnuqd9ID0gXG1heFxiaWcoXGxmbG9vciBcZnJhY3tcdGV4dHvmrbvkuqHliY3nrYnnuqd9fXsyfSBccmZsb29yLFwgMVxiaWcpCiQkCgo+ICoqbWF4KGEsIGIpKirvvJrlj5bovoPlpKflgLzjgILov5nph4zkv53or4HnrYnnuqfkuI3kvJrkvY7kuo4gMeOAggoKKirkuL7kvosqKu+8mgotIOetiee6pyAxMCDihpIg5aSN5rS75ZCO562J57qnIDUKLSDnrYnnuqcgMjEg4oaSIOWkjea0u+WQjuetiee6pyAxMAotIOetiee6pyAxIOKGkiDlpI3mtLvlkI7nrYnnuqcgMe+8iOaXoOaNn+Wkse+8iQoKPiDms6jmhI/vvJrnrYnnuqfmmK/mta7ngrnmlbDvvIzmg6nnvZrml7blhYjlr7kqKuW9k+WJjeetiee6p+WPluaVtCoq5YaN6Zmk5LulIDLjgILkvovlpoLnrYnnuqcgMTUuNyDlhYjlj5bmlbTkuLogMTXvvIzpmaTku6UgMiDlvpcgNy4177yM5YaN5Y+W5pW05Li6IDfjgIIKCiMjIyDph43nlJ/kvY3nva4KCumHjeeUn+aXtuezu+e7n+S8muWcqOWtmOaho+eahOWHuueUn+eCuemZhOi/keaQnOe0ouWuieWFqOS9jee9ru+8iOiMg+WbtCAxN8OXMTfDlzE3IOagvO+8ie+8jOS8mOWFiOmAieaLqe+8mgotIOS4jeWNoeWcqOaWueWdl+WGhQotIOS4jeWkhOS6juWNsemZqeWcsOW9ouS4rQotIOaOpei/keWOn+Wni+WHuueUn+eCuQoKIyMg57uP6aqM55CDCgo+IOWHu+adgOeUn+eJqeWQjuaOieiQveeahOe7v+iJsuWFieeQg++8jOaLvuWPluWQjuiHquWKqOWinuWKoOe7j+mqjOWAvOOAggoK5Ye75p2A55Sf54mp5pe277yM57uP6aqM55CD5o6J6JC95pWw6YeP5Li677yaCgokJApcdGV4dHvnu4/pqoznkIPmlbDph499ID0gXGxjZWlsIFxmcmFje1x0ZXh0e+aUu+WHu+aKl+aAp319ezEyfSBccmNlaWwKJCQKCjxkaXYgY2xhc3M9Im1vZGVsLWdhbGxlcnkgY29tcGFjdC1tb2RlbC1nYWxsZXJ5IHBpeGVsLWl0ZW0tZ2FsbGVyeSI+CiAgPGZpZ3VyZT48aW1nIHNyYz0iL2FyY2hpdmUtaW1hZ2VzL2V4dGVybmFsLXdpa2kvZXhwZXJpZW5jZS1vcmItZmFuZG9tLWVzLnBuZyIgYWx0PSJGYW5kb20g6KW/6K+t57u05Z+65pS25b2V55qE6YeR6Imy57uP6aqM55CD5Zu+5qCHIj48ZmlnY2FwdGlvbj7ph5HoibLnu4/pqoznkIM8L2ZpZ2NhcHRpb24+PC9maWd1cmU+CjwvZGl2PgoKLSDnu4/pqoznkIPotoXov4cgMTAwIOS4quaXtuS8muaIkOe7hOaOieiQve+8jOmYsuatouWNoemhv++8iOavj+e7hOacgOWkmiAxMDAg5Liq77yJCi0g57uP6aqM55CD5Zyo55Sf54mp5q275Lqh5pe255Sf5oiQ77yM6YCa6L+H5o6J6JC954mp5a2Q57O757uf5re75Yqg5Yiw5LiW55WMCgojIyDnjqnlrrbnu5/orqHmlbDmja4KCj4g5ri45oiP5Lya6K6w5b2V5L2g5LuO5byA5qGj5Lul5p2l55qE5omA5pyJ6KGM5Li65pWw5o2u77yM5Zyo5ri45oiP6I+c5Y2V5Lit5Y+v5Lul5p+l55yL44CC6L+Z5Lqb5pWw5o2u5rKh5pyJ5a6e6ZmF55So6YCU77yM57qv57K55piv5ruh6Laz5aW95aWH5b+D5ZKM5oiQ5bCx5oSf44CCCgrmuLjmiI/kvJrorrDlvZXku6XkuIvmlbDmja7vvJoKCnwg57G75YirIHwg57uf6K6h6aG5IHwKfC0tLS0tLXwtLS0tLS0tLXwKfCAqKuenu+WKqCoqIHwg5oC756e75Yqo6Led56a744CB5q2l6KGM6Led56a744CB6aOe6KGM6Led56a744CB5ri45rOz6Led56a744CB6aqR6KGM6Led56a744CB5pSA54is6Led56a744CB5Z2g6JC96Led56a7IHwKfCAqKumrmOW6pioqIHwg5pyA6auY5rW35ouU44CB5pyA5L2O5rW35ouU44CB5pyA5rex5r2c5rC0IHwKfCAqKuWKqOS9nCoqIHwg6Lez6LeD5qyh5pWw44CB552h55yg5qyh5pWw44CB5oC7552h55yg5pe26Ze0IHwKfCAqKuaMluaOmCoqIHwg5oyW5o6Y5pa55Z2X5pWw44CB5pS+572u5pa55Z2X5pWw44CB5Lqk5LqS5qyh5pWwIHwKfCAqKuaImOaWlyoqIHwg6L+R5oiY5pS75Ye7L+WRveS4reasoeaVsOOAgei/nOeoi+aUu+WHuy/lkb3kuK3mrKHmlbDjgIHlj5fliLDmlLvlh7vmrKHmlbAgfAp8ICoq5Ye75p2AKiogfCDnjqnlrrblh7vmnYDjgIHpmYblnLDnlJ/nianlh7vmnYDjgIHmsLTnlJ/nlJ/nianlh7vmnYDjgIHpo57ooYznlJ/nianlh7vmnYAgfAp8ICoq55Sf5a2YKiogfCDov5vpo5/mrKHmlbDjgIHnlJ/nl4XmrKHmlbDjgIHmgqPmtYHmhJ/mrKHmlbDjgIHlkZXlkJDmrKHmlbAgfAp8ICoq5Yi25L2cKiogfCDlkIjmiJDnianlk4HmlbDjgIHliLbkvZzlrrblhbfmlbAgfAp8ICoq5q275LqhKiogfCDmrbvkuqHorrDlvZXliJfooajvvIjlpKnmlbDjgIHlnZDmoIfjgIHmrbvlm6DvvIkgfAp8ICoq562J57qnKiogfCDmnIDpq5jliLDovr7nrYnnuqcgfAp8ICoq5qih5byPKiogfCDkvb/nlKjov4fnmoTmnIDnroDljZXmqKHlvI8gfAoKIyMg6ZmE5b2VIOmDqOWIhuetiee6p+e7j+mqjOWAvOihqAp8IOetiee6pyB8IOaJgOmcgOe7j+mqjOWAvCB8IOetiee6pyB8IOaJgOmcgOe7j+mqjOWAvCB8CnwgLS0tIHwgLS0tIHwgLS0tIHwgLS0tIHwKfCAyIHwgODQgfCAxMiB8IDEzODcgfAp8IDMgfCAxNzQgfCAxMyB8IDE1ODEgfAp8IDQgfCAyNzEgfCAxNCB8IDE3OTEgfAp8IDUgfCAzNzYgfCAxNSB8IDIwMTggfAp8IDYgfCA0ODkgfCAxNiB8IDIyNjQgfAp8IDcgfCA2MTIgfCAxNyB8IDI1MjcgfAp8IDggfCA3NDQgfCAxOCB8IDI4MTIgfAp8IDkgfCA4ODcgfCAxOSB8IDMxMTEgfAp8IDEwIHwgMTA0MSB8IDIwIHwgMzQ1NCB8CnwgMTEgfCAxMjA3IHwgMjEgfCAzODEzIHwKCiMjIOmZhOW9lSDlkITnlJ/nianmjonokL3nu4/pqozooagKCgp8IOeUn+eJqSB8IOaUu+WHu+aKl+aApyB8IOe7j+mqjOeQg+aVsOmHjyB8CnwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tfAp8IOm6u+mbgCB8IDEuNSB8IDEgfAp8IOm4veWtkCB8IDIgfCAxIHwKfCDlsI/puJ8gfCAyLjUgfCAxIHwKfCDnjqnlrrYgfCAxMCB8IDEgfAp8IOm5pOm4teOAgemso+eLl+OAgemjn+S6uumxvOOAgemzkOmxvCB8IDE1IHwgMiB8Cnwg576K6am844CB5qKt6bG844CB6bKI6bG844CB5rW36bKI44CB6bi16bif44CB54u8IHwgMjAgfCAyIHwKfCDpqbTjgIHpqazjgIHosbnjgIHpqa/pub/jgIHph47njKogfCAzMCB8IDMgfAp8IOeJm+OAgee+jua0suixueOAgeaWkemprCB8IDM1IHwgMyB8Cnwg6aqG6am844CB6KeS6ams44CB54uu5a2Q44CB5YWs54mb6bKoIHwgNDAgfCA0IHwKfCDni7zkurogfCA0NSB8IDQgfAp8IOiAgeiZjiB8IDUwIHwgNSB8Cnwg5YWs54mb44CB6am86bm/IHwgNjAgfCA1IHwKfCDnhoogfCA3MCB8IDYgfAp8IOmHjueJmyB8IDc1IHwgNyB8Cnwg6ZW/6aKI6bm/44CB6JmO6bKoIHwgODAgfCA3IHwKfCDnioDniZsgfCAxNTAgfCAxMyB8Cnwg55m96bK444CB5aSn55m96bKoIHwgMjQwIHwgMjAgfAp8IOiZjumyuCB8IDMwMCB8IDI1IHwKCiMjIOWGmee7meW8gOWPkeiAhQoKOjo6IGluZm8g6LWE5paZ5pqC5a2YCuacrOWwj+iKguWGheWuueaaguaXtuWtmOaUvuS6juatpO+8jOWQjue7reS8muenu+WKqOiHsyJNT0TlvIDlj5Ei56ug6IqC44CCCjo6OgoKPGRldGFpbHM+CjxzdW1tYXJ5PuW8gOWPkeamguiniDwvc3VtbWFyeT4KCgojIyMg57uP6aqM6I635Y+W5YWs5byP77yIYENvbXBvbmVudExldmVsLmNzYO+8iQoKPiAqKmBBZGRFeHBlcmllbmNlYCDmlrnms5UqKu+8muWinuWKoOeOqeWutue7j+mqjOWAvOeahOaguOW/g+aWueazleOAguWPguaVsCBgY291bnRg77yI5pWw6YeP77yJ6KGo56S65aKe5Yqg55qE57uP6aqM54K55pWw77ybYHBsYXlTb3VuZGDvvIjmmK/lkKbmkq3mlL7pn7PmlYjvvInmjqfliLbmmK/lkKbmkq3mlL7mi77lj5bpn7PmlYjjgIIKCmBgYGNzaGFycApwdWJsaWMgdmlydHVhbCB2b2lkIEFkZEV4cGVyaWVuY2UoaW50IGNvdW50LCBib29sIHBsYXlTb3VuZCkgewogICAgLy8gcGxheVNvdW5kID0g5piv5ZCm5pKt5pS+5ou+5Y+W6Z+z5pWICiAgICBpZiAocGxheVNvdW5kKSB7CiAgICAgICAgLy8gbV9zdWJzeXN0ZW1BdWRpbyA9IOmfs+mikeWtkOezu+e7n++8jOaSreaUvue7j+mqjOaLvuWPlumfs+aViAogICAgICAgIC8vIDAuMmYgPSDpn7Pph4/vvJttX3JhbmRvbS5GbG9hdCgtMC4xZiwgMC40ZikgPSDpmo/mnLrpn7PosIPlgY/np7sKICAgICAgICBtX3N1YnN5c3RlbUF1ZGlvLlBsYXlTb3VuZCgiQXVkaW8vRXhwZXJpZW5jZUNvbGxlY3RlZCIsIDAuMmYsIG1fcmFuZG9tLkZsb2F0KC0wLjFmLCAwLjRmKSwgMGYsIDBmKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgIC8vIG51bSA9IOacrOasoeWinuWKoOeahOetiee6p+WinumHj++8iOa1rueCueaVsO+8iQogICAgICAgIC8vIDAuMDEyZiA9IOWfuuehgOe7j+mqjOWAvO+8mzEuMDhmID0g5q+P57qn6KGw5YeP57O75pWwCiAgICAgICAgLy8gbV9jb21wb25lbnRQbGF5ZXIuUGxheWVyRGF0YS5MZXZlbCA9IOeOqeWutuW9k+WJjeetiee6p++8iOa1rueCueaVsO+8iQogICAgICAgIC8vIE1hdGhGLkZsb29yID0g5ZCR5LiL5Y+W5pW077yM5oqK562J57qn6L2s5Li65pW05pWw55So5LqO5oyH5pWw6K6h566XCiAgICAgICAgZmxvYXQgbnVtID0gMC4wMTJmIC8gTWF0aEYuUG93KDEuMDhmLCBNYXRoRi5GbG9vcihtX2NvbXBvbmVudFBsYXllci5QbGF5ZXJEYXRhLkxldmVsIC0gMWYpKTsKICAgICAgICAvLyDliKTmlq3mmK/lkKbot6jov4fmlbTmlbDovrnnlYzvvIjljbPmmK/lkKbljYfnuqfvvIkKICAgICAgICBpZiAoTWF0aEYuRmxvb3IobV9jb21wb25lbnRQbGF5ZXIuUGxheWVyRGF0YS5MZXZlbCArIG51bSkgPiBNYXRoRi5GbG9vcihtX2NvbXBvbmVudFBsYXllci5QbGF5ZXJEYXRhLkxldmVsKSkgewogICAgICAgICAgICAvLyDmkq3mlL7ljYfnuqfpn7PmlYjvvIg35Liq6Z+z6LCD5riQ5Y2H55qE55+t6Z+z77yJCiAgICAgICAgICAgIC8vIOaYvuekuiLkvaDnmoTnrYnnuqfmj5DljYfkuoYi5o+Q56S6CiAgICAgICAgfQogICAgICAgIG1fY29tcG9uZW50UGxheWVyLlBsYXllckRhdGEuTGV2ZWwgKz0gbnVtOyAgLy8g57Sv5Yqg562J57qnCiAgICB9Cn0KYGBgCgojIyMg6Ieq5Yqo57uP6aqM6I635Y+WCgo+ICoqYFBlcmlvZGljR2FtZVRpbWVFdmVudGAqKu+8muWRqOacn+aAp+a4uOaIj+aXtumXtOS6i+S7tuOAguWPguaVsCAxIOS4uuS6i+S7tuWRqOacn++8iDE4MCDnp5LvvInvvIzlj4LmlbAgMiDkuLrliJ3lp4vlgY/np7vvvIgxNzkg56eS77yJ44CC5q+PIDE4MCDmuLjmiI/np5Lop6blj5HkuIDmrKHvvIzoh6rliqjnu5nnjqnlrrblop7liqAgMSDngrnnu4/pqozjgIIKCmBgYGNzaGFycAovLyBtX3N1YnN5c3RlbVRpbWUgPSDml7bpl7TlrZDns7vnu58KLy8g5q+PIDE4MCDmuLjmiI/np5LvvIjnuqYgMyDnjrDlrp7liIbpkp/vvInoh6rliqjojrflvpcgMSDngrnnu4/pqowKaWYgKG1fc3Vic3lzdGVtVGltZS5QZXJpb2RpY0dhbWVUaW1lRXZlbnQoMTgwLjAsIDE3OS4wKSkgewogICAgQWRkRXhwZXJpZW5jZSgxLCBmYWxzZSk7ICAvLyBmYWxzZSA9IOS4jeaSreaUvumfs+aViAp9CmBgYAoKIyMjIOS5mOaVsOezu+e7n+ahhuaetu+8iGBDb21wb25lbnRGYWN0b3JzLmNzYO+8iQoKPiDmr4/kuKoqKuS5mOaVsO+8iEZhY3Rvcu+8iSoq55Sx5aSa5LiqKirlm6DlrZDvvIhGYWN0b3LvvIkqKue7hOaIkO+8jOavj+S4quWboOWtkOWPr+S7peaYryoq5LmY566X77yITXVsdGlwbHnvvIkqKuaIlioq5Yqg566X77yIQWRk77yJKirnsbvlnovjgILmnIDnu4jkuZjmlbDlgLwgPSDmiYDmnInlm6DlrZDmjInnsbvlnovntK/kuZjmiJbntK/liqDnmoTnu5PmnpzjgIIKCmBgYGNzaGFycApwdWJsaWMgY2xhc3MgRmFjdG9yIHsKICAgIHB1YmxpYyBzdHJpbmcgRGVzY3JpcHRpb247ICAgICAvLyBEZXNjcmlwdGlvbiA9IOaYvuekuuWQjeensO+8iOWcqOa4uOaIj+WGhemdouadv+S4reWxleekuu+8iQogICAgcHVibGljIGZsb2F0IFZhbHVlOyAgICAgICAgICAgIC8vIFZhbHVlID0g5pWw5YC877yI6K+l5Zug5a2Q55qE5LmY5pWw5YC85oiW5Yqg566X5YC877yJCiAgICBwdWJsaWMgc3RyaW5nIE5hbWU7ICAgICAgICAgICAgLy8gTmFtZSA9IOe0ouW8leWQjeensO+8iOeUqOS6juWGhemDqOafpeaJvu+8iQogICAgLy8gRmFjdG9yQWRkaXRpb25UeXBlID0g5Zug5a2Q57Sv5Yqg5pa55byP77yM6buY6K6k5Li65LmY566XCiAgICBwdWJsaWMgRmFjdG9yQWRkaXRpb25UeXBlIEZhY3RvckFkZGl0aW9uVHlwZSA9IEZhY3RvckFkZGl0aW9uVHlwZS5NdWx0aXBseTsgIC8vIE11bHRpcGx5PeS5mOeulywgQWRkPeWKoOeulwp9CgovLyBDYWxjdWxhdGVGYWN0b3JzUmVzdWx0ID0g6K6h566X5omA5pyJ5Zug5a2Q55qE5pyA57uI57uT5p6cCi8vIGZhY3RvcnMgPSDlm6DlrZDpm4blkIgKcHVibGljIHN0YXRpYyBmbG9hdCBDYWxjdWxhdGVGYWN0b3JzUmVzdWx0KElDb2xsZWN0aW9uPEZhY3Rvcj4gZmFjdG9ycykgewogICAgZmxvYXQgYW5zID0gMWY7ICAvLyBhbnMgPSDntK/np6/nu5PmnpzvvIzliJ3lp4vkuLogMQogICAgZm9yZWFjaCAodmFyIGZhY3RvciBpbiBmYWN0b3JzKSB7CiAgICAgICAgc3dpdGNoIChmYWN0b3IuRmFjdG9yQWRkaXRpb25UeXBlKSB7CiAgICAgICAgICAgIGNhc2UgRmFjdG9yQWRkaXRpb25UeXBlLk11bHRpcGx5OiBhbnMgKj0gZmFjdG9yLlZhbHVlOyBicmVhazsgIC8vIOS5mOeul++8mue0r+S5mAogICAgICAgICAgICBjYXNlIEZhY3RvckFkZGl0aW9uVHlwZS5BZGQ6IGFucyArPSBmYWN0b3IuVmFsdWU7IGJyZWFrOyAgICAgICAvLyDliqDnrpfvvJrntK/liqAKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gYW5zOyAgLy8g6L+U5Zue5pyA57uI5LmY5pWw5YC8Cn0KYGBgCgojIyMg562J57qn5a+55ZCE5LmY5pWw55qE6LSh54yuCgo+IOS4i+ihqOWxleekuuS6huetiee6p+WvueWbm+S4quaguOW/g+S5mOaVsOeahOi0oeeMruOAgmBsZXZlbGAgPSDnjqnlrrblvZPliY3nrYnnuqfvvJtgZmxvb3JgID0g5ZCR5LiL5Y+W5pW077ybYGNsYW1wKHgsIG1pbiwgbWF4KWAgPSDpmZDliLblh73mlbDvvIzlsIYgeCDpmZDliLblnKggbWlufm1heCDkuYvpl7TjgIIKCnwg5LmY5pWw77yI6Iux5paH77yJIHwg5LmY5pWw77yI5Lit5paH77yJIHwg5q+P57qn5aKe6YePIHwg5YWs5byPIHwgMjEg57qn5oC75YC8IHwKfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tfAp8ICoqU3RyZW5ndGgqKu+8iOWKm+mHj++8iSB8IOWKm+mHj+S5mOaVsCB8ICswLjA1IHwgYDEgKyAwLjA1IMOXIGZsb29yKGNsYW1wKGxldmVsLDEsMjEpIC0gMSlgIHwgMi4wIHwKfCAqKlJlc2lsaWVuY2UqKu+8iOmYsuW+oe+8iSB8IOmYsuW+oeS5mOaVsCB8ICswLjA1IHwgYDEgKyAwLjA1IMOXIGZsb29yKGNsYW1wKGxldmVsLDEsMjEpIC0gMSlgIHwgMi4wIHwKfCAqKlNwZWVkKirvvIjpgJ/luqbvvIkgfCDpgJ/luqbkuZjmlbAgfCArMC4wMiB8IGAxICsgMC4wMiDDlyBmbG9vcihjbGFtcChsZXZlbCwxLDIxKSAtIDEpYCB8IDEuNCB8CnwgKipIdW5nZXIqKu+8iOmlpemlv++8iSB8IOmlpemlv+S5mOaVsCB8IC0wLjAxIHwgYDEgLSAwLjAxIMOXIGZsb29yKGNsYW1wKGxldmVsLDEsMjEpIC0gMSlgIHwgMC44IHwKCj4gKiror7TmmI4qKu+8mmBsZXZlbGAg6KKr6ZmQ5Yi25ZyoIDF+MjEg5LmL6Ze077yIYGNsYW1wKGxldmVsLDEsMjEpYO+8ie+8jOi2hei/hyAyMSDnuqflkI7kuZjmlbDkuI3lho3lop7plb/jgIJgZmxvb3JgIOWHveaVsOWwhuetiee6p+WPluaVtOWQjuWPguS4juiuoeeul++8jOehruS/neavj+e6p+WinumHj+WbuuWumuOAggoKIyMjIOatu+S6oeaDqee9mu+8iGBQbGF5ZXJEYXRhLmNzYO+8iQoKPiAqKmBQbGF5ZXJEZWFkYCDnirbmgIEqKu+8mueOqeWutuatu+S6oeWQjui/m+WFpeeahOeKtuaAgeacuuWIhuaUr+OAgmBSZWR1Y2VMZXZlbFVwb25EZWF0aGDvvIjmrbvkuqHml7bmmK/lkKbpmY3kvY7nrYnnuqfvvInkuLogdHJ1ZSDml7bmiafooYznrYnnuqflh4/ljYrvvJtgUHJldmlvdXNTdGF0ZWDvvIjliY3kuIDnirbmgIHvvInkuLogYCJQbGF5aW5nImDvvIjmuLjmiI/kuK3vvInml7bmiY3miafooYzmg6nnvZrjgIIKCmBgYGNzaGFycAovLyBtX3N0YXRlTWFjaGluZSA9IOeKtuaAgeacuu+8jOeuoeeQhueOqeWutueKtuaAgeWIh+aNogovLyAiUGxheWVyRGVhZCIgPSDnjqnlrrbmrbvkuqHnirbmgIEKbV9zdGF0ZU1hY2hpbmUuQWRkU3RhdGUoIlBsYXllckRlYWQiLAogICAgLy8g6L+b5YWl54q25oCB5pe25omn6KGM77yI5YWl5Y+j5aeU5omY77yJCiAgICBkZWxlZ2F0ZSB7CiAgICAgICAgSGlkZVNwYXduRGlhbG9nKCk7ICAvLyBIaWRlU3Bhd25EaWFsb2cgPSDpmpDol4/ph43nlJ/lr7nor53moYYKICAgICAgICAvLyBSZWR1Y2VMZXZlbFVwb25EZWF0aCA9IOaYr+WQpuWcqOatu+S6oeaXtumZjeS9juetiee6p++8iOm7mOiupCB0cnVl77yJCiAgICAgICAgLy8gUHJldmlvdXNTdGF0ZSA9IOWJjeS4gOS4queKtuaAge+8jOW/hemhu+aYryAiUGxheWluZyLvvIjmuLjmiI/kuK3vvInmiY3mg6nnvZoKICAgICAgICBpZiAoUmVkdWNlTGV2ZWxVcG9uRGVhdGggJiYgbV9zdGF0ZU1hY2hpbmUuUHJldmlvdXNTdGF0ZSA9PSAiUGxheWluZyIpIHsKICAgICAgICAgICAgLy8gTGV2ZWwgPSDnjqnlrrbnrYnnuqfvvJtNYXRoRi5GbG9vciA9IOWQkeS4i+WPluaVtO+8m01hdGhVdGlscy5NYXggPSDlj5bovoPlpKflgLwKICAgICAgICAgICAgLy8g562J57qn5YeP5Y2K77yM5pyA5L2O5L+d55WZIDEg57qnCiAgICAgICAgICAgIExldmVsID0gTWF0aFV0aWxzLk1heChNYXRoRi5GbG9vcihMZXZlbCAvIDJmKSwgMWYpOwogICAgICAgIH0KICAgIH0sCiAgICAvLyDmr4/luKfmm7TmlrDml7bmiafooYzvvIjmm7TmlrDlp5TmiZjvvIkKICAgIGRlbGVnYXRlIHsKICAgICAgICAvLyBUaW1lLlJlYWxUaW1lID0g546w5a6e5pe26Ze077yI56eS77yJCiAgICAgICAgLy8gbV9wbGF5ZXJEZWF0aFRpbWUgPSDnjqnlrrbmrbvkuqHml7bliLvvvIjnjrDlrp7ml7bpl7TvvIkKICAgICAgICAvLyDnrYnlvoUgMS41IOenkueOsOWunuaXtumXtOWQjuaJjeWFgeiuuOmHjeeUnwogICAgICAgIGlmIChUaW1lLlJlYWxUaW1lIC0gKG1fcGxheWVyRGVhdGhUaW1lID8/IDApID4gMS41KSB7CiAgICAgICAgICAgIGlmIChHYW1lTW9kZSA9PSBDcnVlbCkgewogICAgICAgICAgICAgICAgLy8gQ3J1ZWwgPSDmrovphbfmqKHlvI/vvIzlvLnlh7rmuLjmiI/oj5zljZXvvIzml6Dms5Xph43nlJ8KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChHYW1lTW9kZSA9PSBBZHZlbnR1cmUgJiYgIUlzQWR2ZW50dXJlUmVzcGF3bkFsbG93ZWQpIHsKICAgICAgICAgICAgICAgIC8vIEFkdmVudHVyZSA9IOWGkumZqeaooeW8jwogICAgICAgICAgICAgICAgLy8gSXNBZHZlbnR1cmVSZXNwYXduQWxsb3dlZCA9IOaYr+WQpuWFgeiuuOWGkumZqemHjeeUn++8jOS4uiBmYWxzZSDliJnph43lkK/lhbPljaEKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3Bhd24gPSB0cnVlOyAgLy8gcmVzcGF3biA9IOaYr+WQpumHjeeUn+agh+W/lwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyZXNwYXduKSB7CiAgICAgICAgICAgIExhc3REZWFkUGxheWVyID0gQ29tcG9uZW50UGxheWVyLkVudGl0eTsgIC8vIExhc3REZWFkUGxheWVyID0g6K6w5b2V5pyA5ZCO5q275Lqh55qE546p5a625a6e5L2TCiAgICAgICAgICAgIENvbXBvbmVudFBsYXllciA9IG51bGw7ICAvLyDnva7nqbrku6Xop6blj5Hph43nlJ/mtYHnqIsKICAgICAgICB9CiAgICB9LAogICAgbnVsbCAgLy8g6YCA5Ye654q25oCB5pe25omn6KGM77yI5Ye65Y+j5aeU5omY77yJ77yM5q2k5aSE5peg5pON5L2cCik7CmBgYAoKIyMjIOe7j+mqjOeQg+aOieiQve+8iGBDb21wb25lbnRIZWFsdGguY3Ng77yJCgo+ICoqYERpZWAg5pa55rOVKirvvJrnlJ/nianmrbvkuqHml7bosIPnlKjjgIJgSW5qdXJ5YO+8iOS8pOWus+S/oeaBr++8ieWMheWQq+S8pOWus+adpea6kOWSjOexu+Wei++8m2BBdHRhY2tSZXNpbGllbmNlYO+8iOaUu+WHu+aKl+aAp++8ieWGs+Wumue7j+mqjOeQg+aOieiQveaVsOmHj++8m2BTdGFja0V4cGVyaWVuY2VPbktpbGxg77yI5Ye75p2A5pe25piv5ZCm5Y+g5Yqg57uP6aqM77yJ5o6n5Yi25piv5ZCm5o6J6JC957uP6aqM55CD44CCCgpgYGBjc2hhcnAKLy8gaW5qdXJ5ID0g5Lyk5a6z5L+h5oGv77yI5YyF5ZCr5Lyk5a6z5p2l5rqQ44CB57G75Z6L562J77yJCnB1YmxpYyB2aXJ0dWFsIHZvaWQgRGllKEluanVyeSBpbmp1cnkpIHsKICAgIEhlYWx0aCA9IDBmOyAgLy8gSGVhbHRoID0g55Sf5ZG95YC877yM5b2S6Zu2CiAgICAvLyBleHBlcmllbmNlT3JiRHJvcENvdW50ID0g57uP6aqM55CD5o6J6JC95pWw6YePCiAgICAvLyBtX2NvbXBvbmVudENyZWF0dXJlLkNvbXBvbmVudEhlYWx0aC5BdHRhY2tSZXNpbGllbmNlID0g6KKr5Ye75p2A55Sf54mp55qE5pS75Ye75oqX5oCnCiAgICAvLyBNYXRoRi5DZWlsaW5nID0g5ZCR5LiK5Y+W5pW077yM6Zmk5LulIDEyIOWQjuWPluaVtOehruS/neiHs+WwkeaOiSAxIOS4qgogICAgaW50IGV4cGVyaWVuY2VPcmJEcm9wQ291bnQgPSAoaW50KU1hdGhGLkNlaWxpbmcobV9jb21wb25lbnRDcmVhdHVyZS5Db21wb25lbnRIZWFsdGguQXR0YWNrUmVzaWxpZW5jZSAvIDEyZik7CiAgICAvLyBhdHRhY2tlciA9IOaUu+WHu+iAhe+8m1N0YWNrRXhwZXJpZW5jZU9uS2lsbCA9IOaYr+WQpuWFgeiuuOWHu+adgOWPoOWKoOe7j+mqjAogICAgaWYgKGF0dGFja2VyICE9IG51bGwgJiYgU3RhY2tFeHBlcmllbmNlT25LaWxsKSB7CiAgICAgICAgLy8g6LaF6L+HIDEwMCDkuKrml7bliIbnu4TmjonokL3vvIzpmLLmraLljaHpob8KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1hdGguTWluKDEwMCwgZXhwZXJpZW5jZU9yYkRyb3BDb3VudCk7IGkrKykgewogICAgICAgICAgICAvLyBkcm9wSW5XYXZlID0g5q+P57uE5o6J6JC95pWw6YePCiAgICAgICAgICAgIGludCBkcm9wSW5XYXZlID0gZXhwZXJpZW5jZU9yYkRyb3BDb3VudCAvIDEwMDsKICAgICAgICAgICAgaWYgKGkgPCBleHBlcmllbmNlT3JiRHJvcENvdW50ICUgMTAwKSBkcm9wSW5XYXZlKys7ICAvLyDkvZnmlbDooaXliLDliY3lh6Dnu4QKICAgICAgICAgICAgLy8gbV9zdWJzeXN0ZW1QaWNrYWJsZXMgPSDmjonokL3nianlrZDns7vnu58KICAgICAgICAgICAgLy8gRXhwZXJpZW5jZU9yYkJsb2NrSW5kZXggPSDnu4/pqoznkIPmlrnlnZfntKLlvJXvvIjlgLzkuLogOO+8iQogICAgICAgICAgICAvLyBkcm9wSW5XYXZlID0g5q+P57uE5pWw6YePCiAgICAgICAgICAgIC8vIG1fY29tcG9uZW50Q3JlYXR1cmUuQ29tcG9uZW50Qm9keS5Qb3NpdGlvbiA9IOaOieiQveS9jee9ru+8iOeUn+eJqeS9jee9ru+8iQogICAgICAgICAgICAvLyBuZXcgVmVjdG9yMyguLi4pID0g5o6J6JC95Yid6YCf5bqm77yI6ZqP5py65rC05bmzICsg5ZCR5LiKIDbvvIkKICAgICAgICAgICAgbV9zdWJzeXN0ZW1QaWNrYWJsZXMuQWRkUGlja2FibGUoCiAgICAgICAgICAgICAgICBFeHBlcmllbmNlT3JiQmxvY2tJbmRleCwgIC8vIDgKICAgICAgICAgICAgICAgIGRyb3BJbldhdmUsCiAgICAgICAgICAgICAgICBtX2NvbXBvbmVudENyZWF0dXJlLkNvbXBvbmVudEJvZHkuUG9zaXRpb24sCiAgICAgICAgICAgICAgICBuZXcgVmVjdG9yMyhyYW5kb20uVmVjdG9yMigyLjVmLCAzLjVmKSwgNmYpLAogICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgIEVudGl0eQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KfQpgYGAKCiMjIyDmrbvkuqHmjonokL3vvIhgQ29tcG9uZW50SGVhbHRoLmNzYO+8iQoKPiAqKuatu+S6oeaOieiQvemAu+i+kSoq77ya5b2T55Sf5ZG95YC85b2S6Zu25LiU55Sf5ZG95YC85Y+Y5YyW5Li66LSf77yI5Y+X5Yiw6Ie05ZG95Lyk5a6z77yJ5oiW5bCa5pyq6K6w5b2V5q275Lqh5pe26Ze05pe277yM6Kem5Y+R5q275Lqh5rWB56iL44CCYERlYXRoVGltZWDvvIjmrbvkuqHml7bpl7TmiLPvvInorrDlvZXmrbvkuqHml7bliLvvvJtgS2lsbFBhcnRpY2xlU3lzdGVtYO+8iOatu+S6oeeykuWtkOezu+e7n++8ieaSreaUvuatu+S6oeeJueaViO+8m2BEcm9wQWxsSXRlbXNg77yI5o6J6JC95YWo6YOo54mp5ZOB77yJ5bCG6IOM5YyF5YaF5omA5pyJ54mp5ZOB5Lii5Ye644CCCgpgYGBjc2hhcnAKLy8gSGVhbHRoID0g55Sf5ZG95YC877ybSGVhbHRoQ2hhbmdlID0g5pys5bin55Sf5ZG95YC85Y+Y5YyW6YePCi8vIERlYXRoVGltZSA9IOatu+S6oeaXtumXtOaIs++8iOWPr+epuu+8jEhhc1ZhbHVlIOihqOekuuaYr+WQpuW3suiusOW9le+8iQppZiAoSGVhbHRoID09IDBmICYmIChIZWFsdGhDaGFuZ2UgPCAwZiB8fCAhRGVhdGhUaW1lLkhhc1ZhbHVlKSkgewogICAgLy8gbV9zdWJzeXN0ZW1HYW1lSW5mby5Ub3RhbEVsYXBzZWRHYW1lVGltZSA9IOa4uOaIj+aAu+e7j+i/h+aXtumXtAogICAgRGVhdGhUaW1lID0gbV9zdWJzeXN0ZW1HYW1lSW5mby5Ub3RhbEVsYXBzZWRHYW1lVGltZTsKICAgIC8vIEtpbGxQYXJ0aWNsZVN5c3RlbSA9IOatu+S6oeeykuWtkOezu+e7n++8iOaSreaUvuatu+S6oeeJueaViO+8iQogICAgLy8gbV9zdWJzeXN0ZW1UZXJyYWluID0g5Zyw5b2i5a2Q57O757uf77ybcG9zaXRpb24yID0g5q275Lqh5L2N572u77ybeCA9IOeykuWtkOWPguaVsAogICAgS2lsbFBhcnRpY2xlU3lzdGVtIGtpbGxQYXJ0aWNsZVN5c3RlbSA9IG5ldyhtX3N1YnN5c3RlbVRlcnJhaW4sIHBvc2l0aW9uMiwgeCk7CiAgICAvLyBtX3N1YnN5c3RlbVBhcnRpY2xlcyA9IOeykuWtkOezu+e7n++8jOa3u+WKoOatu+S6oeeykuWtkOaViOaenAogICAgbV9zdWJzeXN0ZW1QYXJ0aWNsZXMuQWRkUGFydGljbGVTeXN0ZW0oa2lsbFBhcnRpY2xlU3lzdGVtKTsKICAgIC8vIHBvc2l0aW9uMyA9IOaOieiQveS4reW/g+S9jee9ru+8iOeUn+eJqeWMheWbtOebkuS4reW/g+eCue+8iQogICAgLy8gQm91bmRpbmdCb3guTWluIC8gTWF4ID0g5YyF5Zu055uS5pyA5bCPL+acgOWkp+inkueCuQogICAgVmVjdG9yMyBwb3NpdGlvbjMgPSAobV9jb21wb25lbnRDcmVhdHVyZS5Db21wb25lbnRCb2R5LkJvdW5kaW5nQm94Lk1pbiArIG1fY29tcG9uZW50Q3JlYXR1cmUuQ29tcG9uZW50Qm9keS5Cb3VuZGluZ0JveC5NYXgpIC8gMmY7CiAgICAvLyBFbnRpdHkuRmluZENvbXBvbmVudHM8SUludmVudG9yeT4oKSA9IOafpeaJvuWunuS9k+S4iuaJgOacieWunueOsCBJSW52ZW50b3J5IOaOpeWPo+eahOe7hOS7tu+8iOiDjOWMhe+8iQogICAgLy8gRHJvcEFsbEl0ZW1zID0g5o6J6JC95YWo6YOo54mp5ZOB5Yiw5oyH5a6a5L2N572uCiAgICBmb3JlYWNoIChJSW52ZW50b3J5IGl0ZW0gaW4gRW50aXR5LkZpbmRDb21wb25lbnRzPElJbnZlbnRvcnk+KCkpIHsKICAgICAgICBpdGVtLkRyb3BBbGxJdGVtcyhwb3NpdGlvbjMpOwogICAgfQp9CmBgYAoKIyMjIOa4uOaIj+aooeW8j+aemuS4vgoKPiAqKmBHYW1lTW9kZWAg5p6a5Li+KirvvJrlrprkuYnmuLjmiI/nmoTmiYDmnInmqKHlvI/jgILmlbDlgLzku44gMO+8iOacgOeugOWNle+8ieWIsCA177yI5pyA5Lil5qC877yJ77yM5b2x5ZON546p5a625bGe5oCn44CB5q275Lqh6KeE5YiZ5ZKM5LiW55WM6KGM5Li644CCCgpgYGBjc2hhcnAKcHVibGljIGVudW0gR2FtZU1vZGUgewogICAgQ3JlYXRpdmUgPSAwLCAgICAgICAvLyBDcmVhdGl2ZSA9IOWIm+mAoOaooeW8j++8jOaXoOaVjOOAgeaXoOmZkOi1hOa6kOOAgeWPr+mjnuihjAogICAgSGFybWxlc3MgPSAxLCAgICAgICAvLyBIYXJtbGVzcyA9IOaXoOWus+aooeW8j++8jOS4jeS8mumlpemlv+OAgeWxnuaAp+WKoOaIkOOAgeatu+S6oeWPr+mHjeeUnwogICAgU3Vydml2YWwgPSAyLCAgICAgICAvLyBTdXJ2aXZhbCA9IOeUn+WtmOaooeW8j++8jOato+W4uOmlpemlv+OAgemYsuW+oSArMjUl44CB5q275Lqh5Y+v6YeN55SfCiAgICBDaGFsbGVuZ2luZyA9IDMsICAgIC8vIENoYWxsZW5naW5nID0g5oyR5oiY5qih5byP77yM5q2j5bi45bGe5oCn44CB5q275Lqh5Y+v6YeN55SfCiAgICBDcnVlbCA9IDQsICAgICAgICAgIC8vIENydWVsID0g5q6L6YW35qih5byP77yM5q275Lqh5ZCO5peg5rOV6YeN55Sf77yM5Y+q6IO95Yig6Zmk5a2Y5qGj6YeN5p2lCiAgICBBZHZlbnR1cmUgPSA1ICAgICAgIC8vIEFkdmVudHVyZSA9IOWGkumZqeaooeW8j++8jOeUqOS6juiHquWumuS5ieWGkumZqeWFs+WNoe+8jOmHjeeUn+inhOWImeeUseWFs+WNoeiuvuWumgp9CmBgYAoKPC9kZXRhaWxzPg==
