(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/Scripts/mod/guildskill/guildskill_model.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '8fcedmpqCNCGZm7xYbxB3ZO', 'guildskill_model'); // Scripts/mod/guildskill/guildskill_model.js "use strict"; // -------------------------------------------------------------------- // @author: xxx@syg.com(必填, 创建模块的人员) // @description: // 这里填写详细说明,主要填写该模块的功能简要 //
Create: 2019-01-19 17:37:33 // -------------------------------------------------------------------- var GuildskillConst = require("guildskill_const"); var GuildskillEvent = require("guildskill_event"); var RoleController = require("role_controller"); var BackpackController = require("backpack_controller"); var GuildConst = require("guild_const"); var MainuiConst = require("mainui_const"); var MainuiController = require("mainui_controller"); var GuildEvent = require("guild_event"); var GuildskillModel = cc.Class({ "extends": BaseClass, ctor: function ctor() { this.ctrl = require("guildskill_controller").getInstance(); this.initConfig(); }, properties: {}, initConfig: function initConfig() { this.career_skill_list = {}; this.skill_wait_upgrade_list = {}; this.skill_upgrade_cost_list = {}; this.skill_red_status_list = {}; this.had_send_mainui = false; this.had_close_mainui = false; }, clearGuildCareerSkill: function clearGuildCareerSkill() { this.career_skill_list = {}; this.skill_wait_upgrade_list = {}; this.skill_upgrade_cost_list = {}; this.skill_red_status_list = {}; }, initGuildCareerSkill: function initGuildCareerSkill(data) { if (data == null || data.group_id == null) return; var config = Config.guild_skill_data.data_info_group[data.group_id]; if (config == null) cc.log("公会技能配置数据有问题,技能组id为:", data.group_id);else { var object = {}; object.career = data.career; // 当前职业 object.group_id = data.group_id; // 当前激活的技能组 object.group_ids = data.group_ids; // 已经激活的技能组 object.skill_ids = []; // 当前技能组的技能状态 for (var i in config) { var v = config[i]; object.skill_ids.push({ id: v.id, index: v.seq, status: GuildskillConst.status.un_activity }); } for (var i in data.skill_ids) { var v = data.skill_ids[i]; for (var n in object.skill_ids) { var item = object.skill_ids[n]; if (v.skill_id == item.id) { item.status = GuildskillConst.status.activity; break; } } } //对技能顺序做一个排序吧,主要是担心策划配置不是按照正常顺序来 if (Utils.next(object.skill_ids)) { object.skill_ids.sort(function (a, b) { return a.index < b.index; }); } this.career_skill_list[data.career] = object; gcore.GlobalEvent.fire(GuildskillEvent.UpdateGuildSkillEvent, data.career); } }, //获取指定职业的技能信息 getCareerSkillInfo: function getCareerSkillInfo(career) { return this.career_skill_list[career]; }, //激活指定职业的技能信息 updateGuildCareerSkill: function updateGuildCareerSkill(career, skill_id) { if (career == null || skill_id == null) return; var object = this.career_skill_list[career]; if (object && object.skill_ids) { for (var i in object.skill_ids) { var item = object.skill_ids[i]; if (item.id == skill_id) { item.status = GuildskillConst.status.activity; break; } } //升级之后,这边做一次保存当前待升级的技能id var red_skill_id = 0; for (var k in object.skill_ids) { var v = object.skill_ids[k]; if (v.status == GuildskillConst.status.un_activity) { red_skill_id = v.id; break; } } this.updateGuildSkillStatus(career, red_skill_id); gcore.GlobalEvent.fire(GuildskillEvent.UpdateSkillStatusEvent, career, skill_id); } }, //升级指定职业的技能组,这个时候默认该技能组技能都未激活 upgradeGuildCareerSkill: function upgradeGuildCareerSkill(career, group_id) { if (career == null || group_id == null) return; var object = this.career_skill_list[career]; if (object == null) { object = {}; object.group_ids = []; this.career_skill_list[career] = object; } if (object.group_ids) { object.group_ids.push({ group_id: object.group_id }); } object.career = career; if (object.group_id != group_id) { object.group_id = group_id; object.skill_ids = []; var config = Config.guild_skill_data.data_info_group[group_id]; if (config == null) { cc.log("更新技能组出错,配置数据有问题,技能组id为:", group_id); return; } for (var i in config) { var v = config[i]; object.skill_ids.push({ id: v.id, index: v.seq, status: GuildskillConst.status.un_activity }); } if (Utils.next(object.skill_ids)) { object.skill_ids.sort(function (a, b) { return a.index < b.index; }); } } //升级之后,这边做一次保存当前待升级的技能id var skill_id = 0; for (var k in object.skill_ids) { var v = object.skill_ids[k]; if (v.status == GuildskillConst.status.un_activity) { skill_id = v.id; break; } } this.updateGuildSkillStatus(career, skill_id); gcore.GlobalEvent.fire(GuildskillEvent.UpdateSkilUpgradeEvent, career, group_id); }, //获取当前技能组上线 getCareerGroupMax: function getCareerGroupMax(career) { career = career || GuildskillConst.index.physics; if (this.career_group_max == null) this.career_group_max = {}; if (this.career_group_max[career] == null) { var config = gdata("guild_skill_data", "data_career_list", [career]); if (config) { this.career_group_max[career] = config.length; } else { this.career_group_max[career] = 0; } } return this.career_group_max[career]; }, //公会技能的初始化红点状态 initGuildSkillStatus: function initGuildSkillStatus(data) { if (data && data.outline) { this.skill_wait_upgrade_list = {}; for (var i in data.outline) { var v = data.outline[i]; this.skill_wait_upgrade_list[v.career] = v.skill_id; } } this.checkGuildSkillRedStatus(); }, //更新当前技能 updateGuildSkillStatus: function updateGuildSkillStatus(career, skill_id) { if (this.skill_wait_upgrade_list == null) this.skill_wait_upgrade_list = {}; this.skill_wait_upgrade_list[career] = skill_id; this.checkGuildSkillRedStatus(); }, //公会技能红点的算法更新 checkGuildSkillRedStatus: function checkGuildSkillRedStatus() { if (this.skill_wait_upgrade_list == null || Utils.next(this.skill_wait_upgrade_list) == null) return; RedMgr.getInstance().addCalHandler(function () { var role_vo = RoleController.getInstance().getRoleVo(); var backpack_model = BackpackController.getInstance().getModel(); var red_list = {}; for (var k in this.skill_wait_upgrade_list) { var skill_id = this.skill_wait_upgrade_list[k]; var config = gdata("guild_skill_data", "data_info", [skill_id]); if (config) { red_list[k] = true; if (config.guild_lev > role_vo.guild_lev) { red_list[k] = false; } else { for (var i in config.loss || {}) { var v = config.loss[i]; if (v[0] != null && v[1] != null) { var bid = v[0]; var num = v[1]; var assert = Config.item_data.data_assets_id2label[bid]; if (assert) { if (num > role_vo[assert]) { red_list[k] = false; break; } } else { var sum = backpack_model.getBackPackItemNumByBid(bid); if (num > sum) { red_list[k] = false; break; } } } } } } } for (var k in red_list) { var id = this.getCareerKey(k); this.updateGuildRedStatus(id, red_list[k]); } }.bind(this), RedIds.GuildSkill); }, //设置一个唯一id吧, 跟 guildconst.skill_2 ,3 ,4 ,5对应 getCareerKey: function getCareerKey(career) { career = career || GuildskillConst.index.physics; if (career == GuildskillConst.index.magic) return GuildConst.red_index.skill_2;else if (career == GuildskillConst.index.physics) return GuildConst.red_index.skill_3;else if (career == GuildskillConst.index.defence) return GuildConst.red_index.skill_4;else if (career == GuildskillConst.index.assist) return GuildConst.red_index.skill_5;else return GuildConst.red_index.skill_3; }, //清楚主界面上面的红点 clearGuildSkillIconRed: function clearGuildSkillIconRed() { if (this.had_close_mainui == true) return; this.had_close_mainui = true; var is_red = false; for (var k in this.skill_red_status_list) { var v = this.skill_red_status_list[k]; if (v == true) { is_red = true; break; } } if (is_red == true) { var data = [{ bid: GuildConst.red_index.skill_2, status: false }, { bid: GuildConst.red_index.skill_3, status: false }, { bid: GuildConst.red_index.skill_4, status: false }, { bid: GuildConst.red_index.skill_5, status: false }]; MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, data); } }, //更新公会技能红点 updateGuildRedStatus: function updateGuildRedStatus(bid, status) { var base_data = Config.function_data.data_base; var bool = MainuiController.getInstance().checkIsOpenByActivate(base_data[6].activate); if (bool == false) return; var _status = this.skill_red_status_list[bid]; if (_status == status) return; this.skill_red_status_list[bid] = status; //更新场景红点状态,只在登录的时候提示一次 if (this.had_send_mainui == false) { this.had_send_mainui = true; MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, { bid: bid, status: status }); } //事件用于同步更新公会主ui的红点 gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, bid, status); }, getRedStatus: function getRedStatus(career) { var id = this.getCareerKey(career); return this.skill_red_status_list[id]; }, getRedTotalStatus: function getRedTotalStatus() { for (var k in this.skill_red_status_list) { var _status = this.skill_red_status_list[k]; if (_status == true) return true; } return false; }, // --获取各职业的公会技能等级 getCareerSkillLevel: function getCareerSkillLevel(career) { if (this.career_skill_list[career]) { var skill_ids = this.career_skill_list[career].skill_ids; var count = this.career_skill_list[career].group_ids.length * 6; for (var i = 0; i < skill_ids.length; ++i) { var v = skill_ids[i]; if (v.status == GuildskillConst.status.activity) { count = count + 1; } } return count; } return -1; } }); cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZHNraWxsXFxndWlsZHNraWxsX21vZGVsLmpzIl0sIm5hbWVzIjpbIkd1aWxkc2tpbGxDb25zdCIsInJlcXVpcmUiLCJHdWlsZHNraWxsRXZlbnQiLCJSb2xlQ29udHJvbGxlciIsIkJhY2twYWNrQ29udHJvbGxlciIsIkd1aWxkQ29uc3QiLCJNYWludWlDb25zdCIsIk1haW51aUNvbnRyb2xsZXIiLCJHdWlsZEV2ZW50IiwiR3VpbGRza2lsbE1vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJpbml0Q29uZmlnIiwicHJvcGVydGllcyIsImNhcmVlcl9za2lsbF9saXN0Iiwic2tpbGxfd2FpdF91cGdyYWRlX2xpc3QiLCJza2lsbF91cGdyYWRlX2Nvc3RfbGlzdCIsInNraWxsX3JlZF9zdGF0dXNfbGlzdCIsImhhZF9zZW5kX21haW51aSIsImhhZF9jbG9zZV9tYWludWkiLCJjbGVhckd1aWxkQ2FyZWVyU2tpbGwiLCJpbml0R3VpbGRDYXJlZXJTa2lsbCIsImRhdGEiLCJncm91cF9pZCIsImNvbmZpZyIsIkNvbmZpZyIsImd1aWxkX3NraWxsX2RhdGEiLCJkYXRhX2luZm9fZ3JvdXAiLCJsb2ciLCJvYmplY3QiLCJjYXJlZXIiLCJncm91cF9pZHMiLCJza2lsbF9pZHMiLCJpIiwidiIsInB1c2giLCJpZCIsImluZGV4Iiwic2VxIiwic3RhdHVzIiwidW5fYWN0aXZpdHkiLCJuIiwiaXRlbSIsInNraWxsX2lkIiwiYWN0aXZpdHkiLCJVdGlscyIsIm5leHQiLCJzb3J0IiwiYSIsImIiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVwZGF0ZUd1aWxkU2tpbGxFdmVudCIsImdldENhcmVlclNraWxsSW5mbyIsInVwZGF0ZUd1aWxkQ2FyZWVyU2tpbGwiLCJyZWRfc2tpbGxfaWQiLCJrIiwidXBkYXRlR3VpbGRTa2lsbFN0YXR1cyIsIlVwZGF0ZVNraWxsU3RhdHVzRXZlbnQiLCJ1cGdyYWRlR3VpbGRDYXJlZXJTa2lsbCIsIlVwZGF0ZVNraWxVcGdyYWRlRXZlbnQiLCJnZXRDYXJlZXJHcm91cE1heCIsInBoeXNpY3MiLCJjYXJlZXJfZ3JvdXBfbWF4IiwiZ2RhdGEiLCJsZW5ndGgiLCJpbml0R3VpbGRTa2lsbFN0YXR1cyIsIm91dGxpbmUiLCJjaGVja0d1aWxkU2tpbGxSZWRTdGF0dXMiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwicm9sZV92byIsImdldFJvbGVWbyIsImJhY2twYWNrX21vZGVsIiwiZ2V0TW9kZWwiLCJyZWRfbGlzdCIsImd1aWxkX2xldiIsImxvc3MiLCJiaWQiLCJudW0iLCJhc3NlcnQiLCJpdGVtX2RhdGEiLCJkYXRhX2Fzc2V0c19pZDJsYWJlbCIsInN1bSIsImdldEJhY2tQYWNrSXRlbU51bUJ5QmlkIiwiZ2V0Q2FyZWVyS2V5IiwidXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJiaW5kIiwiUmVkSWRzIiwiR3VpbGRTa2lsbCIsIm1hZ2ljIiwicmVkX2luZGV4Iiwic2tpbGxfMiIsInNraWxsXzMiLCJkZWZlbmNlIiwic2tpbGxfNCIsImFzc2lzdCIsInNraWxsXzUiLCJjbGVhckd1aWxkU2tpbGxJY29uUmVkIiwiaXNfcmVkIiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJndWlsZCIsImJhc2VfZGF0YSIsImZ1bmN0aW9uX2RhdGEiLCJkYXRhX2Jhc2UiLCJib29sIiwiY2hlY2tJc09wZW5CeUFjdGl2YXRlIiwiYWN0aXZhdGUiLCJfc3RhdHVzIiwiVXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJnZXRSZWRTdGF0dXMiLCJnZXRSZWRUb3RhbFN0YXR1cyIsImdldENhcmVlclNraWxsTGV2ZWwiLCJjb3VudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxlQUFlLEdBQUdDLE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJQyxlQUFlLEdBQUdELE9BQU8sQ0FBQyxrQkFBRCxDQUE3Qjs7QUFDQSxJQUFJRSxjQUFjLEdBQUdGLE9BQU8sQ0FBQyxpQkFBRCxDQUE1Qjs7QUFDQSxJQUFJRyxrQkFBa0IsR0FBR0gsT0FBTyxDQUFDLHFCQUFELENBQWhDOztBQUNBLElBQUlJLFVBQVUsR0FBR0osT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBQ0EsSUFBSUssV0FBVyxHQUFHTCxPQUFPLENBQUMsY0FBRCxDQUF6Qjs7QUFDQSxJQUFJTSxnQkFBZ0IsR0FBR04sT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlPLFVBQVUsR0FBR1AsT0FBTyxDQUFDLGFBQUQsQ0FBeEI7O0FBRUEsSUFBSVEsZUFBZSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUMzQixhQUFTQyxTQURrQjtBQUUzQkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsSUFBTCxHQUFZYixPQUFPLENBQUMsdUJBQUQsQ0FBUCxDQUFpQ2MsV0FBakMsRUFBWjtBQUNBLFNBQUtDLFVBQUw7QUFDSCxHQUwwQjtBQU8zQkMsRUFBQUEsVUFBVSxFQUFFLEVBUGU7QUFVM0JELEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixTQUFLRSxpQkFBTCxHQUF5QixFQUF6QjtBQUNBLFNBQUtDLHVCQUFMLEdBQStCLEVBQS9CO0FBQ0EsU0FBS0MsdUJBQUwsR0FBK0IsRUFBL0I7QUFDQSxTQUFLQyxxQkFBTCxHQUE2QixFQUE3QjtBQUVBLFNBQUtDLGVBQUwsR0FBdUIsS0FBdkI7QUFDQSxTQUFLQyxnQkFBTCxHQUF3QixLQUF4QjtBQUNILEdBbEIwQjtBQW9CM0JDLEVBQUFBLHFCQUFxQixFQUFFLGlDQUFZO0FBQy9CLFNBQUtOLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsU0FBS0MsdUJBQUwsR0FBK0IsRUFBL0I7QUFDQSxTQUFLQyx1QkFBTCxHQUErQixFQUEvQjtBQUNBLFNBQUtDLHFCQUFMLEdBQTZCLEVBQTdCO0FBQ0gsR0F6QjBCO0FBMkIzQkksRUFBQUEsb0JBQW9CLEVBQUUsOEJBQVVDLElBQVYsRUFBZ0I7QUFDbEMsUUFBSUEsSUFBSSxJQUFJLElBQVIsSUFBZ0JBLElBQUksQ0FBQ0MsUUFBTCxJQUFpQixJQUFyQyxFQUNJO0FBQ0osUUFBSUMsTUFBTSxHQUFHQyxNQUFNLENBQUNDLGdCQUFQLENBQXdCQyxlQUF4QixDQUF3Q0wsSUFBSSxDQUFDQyxRQUE3QyxDQUFiO0FBQ0EsUUFBSUMsTUFBTSxJQUFJLElBQWQsRUFDSWxCLEVBQUUsQ0FBQ3NCLEdBQUgsQ0FBTyxxQkFBUCxFQUE4Qk4sSUFBSSxDQUFDQyxRQUFuQyxFQURKLEtBRUs7QUFDRCxVQUFJTSxNQUFNLEdBQUcsRUFBYjtBQUNBQSxNQUFBQSxNQUFNLENBQUNDLE1BQVAsR0FBZ0JSLElBQUksQ0FBQ1EsTUFBckIsQ0FGQyxDQUUyQzs7QUFDNUNELE1BQUFBLE1BQU0sQ0FBQ04sUUFBUCxHQUFrQkQsSUFBSSxDQUFDQyxRQUF2QixDQUhDLENBRzJDOztBQUM1Q00sTUFBQUEsTUFBTSxDQUFDRSxTQUFQLEdBQW1CVCxJQUFJLENBQUNTLFNBQXhCLENBSkMsQ0FJMkM7O0FBQzVDRixNQUFBQSxNQUFNLENBQUNHLFNBQVAsR0FBbUIsRUFBbkIsQ0FMQyxDQUsyQzs7QUFFNUMsV0FBSyxJQUFJQyxDQUFULElBQWNULE1BQWQsRUFBc0I7QUFDbEIsWUFBSVUsQ0FBQyxHQUFHVixNQUFNLENBQUNTLENBQUQsQ0FBZDtBQUNBSixRQUFBQSxNQUFNLENBQUNHLFNBQVAsQ0FBaUJHLElBQWpCLENBQXNCO0FBQUVDLFVBQUFBLEVBQUUsRUFBRUYsQ0FBQyxDQUFDRSxFQUFSO0FBQVlDLFVBQUFBLEtBQUssRUFBRUgsQ0FBQyxDQUFDSSxHQUFyQjtBQUEwQkMsVUFBQUEsTUFBTSxFQUFFM0MsZUFBZSxDQUFDMkMsTUFBaEIsQ0FBdUJDO0FBQXpELFNBQXRCO0FBQ0g7O0FBRUQsV0FBSyxJQUFJUCxDQUFULElBQWNYLElBQUksQ0FBQ1UsU0FBbkIsRUFBOEI7QUFDMUIsWUFBSUUsQ0FBQyxHQUFHWixJQUFJLENBQUNVLFNBQUwsQ0FBZUMsQ0FBZixDQUFSOztBQUNBLGFBQUssSUFBSVEsQ0FBVCxJQUFjWixNQUFNLENBQUNHLFNBQXJCLEVBQWdDO0FBQzVCLGNBQUlVLElBQUksR0FBR2IsTUFBTSxDQUFDRyxTQUFQLENBQWlCUyxDQUFqQixDQUFYOztBQUNBLGNBQUlQLENBQUMsQ0FBQ1MsUUFBRixJQUFjRCxJQUFJLENBQUNOLEVBQXZCLEVBQTJCO0FBQ3ZCTSxZQUFBQSxJQUFJLENBQUNILE1BQUwsR0FBYzNDLGVBQWUsQ0FBQzJDLE1BQWhCLENBQXVCSyxRQUFyQztBQUNBO0FBQ0g7QUFDSjtBQUNKLE9BckJBLENBdUJEOzs7QUFDQSxVQUFJQyxLQUFLLENBQUNDLElBQU4sQ0FBV2pCLE1BQU0sQ0FBQ0csU0FBbEIsQ0FBSixFQUFrQztBQUM5QkgsUUFBQUEsTUFBTSxDQUFDRyxTQUFQLENBQWlCZSxJQUFqQixDQUFzQixVQUFVQyxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDbEMsaUJBQU9ELENBQUMsQ0FBQ1gsS0FBRixHQUFVWSxDQUFDLENBQUNaLEtBQW5CO0FBQ0gsU0FGRDtBQUdIOztBQUNELFdBQUt2QixpQkFBTCxDQUF1QlEsSUFBSSxDQUFDUSxNQUE1QixJQUFzQ0QsTUFBdEM7QUFDQXFCLE1BQUFBLEtBQUssQ0FBQ0MsV0FBTixDQUFrQkMsSUFBbEIsQ0FBdUJ0RCxlQUFlLENBQUN1RCxxQkFBdkMsRUFBOEQvQixJQUFJLENBQUNRLE1BQW5FO0FBQ0g7QUFDSixHQWpFMEI7QUFtRTNCO0FBQ0F3QixFQUFBQSxrQkFBa0IsRUFBRSw0QkFBVXhCLE1BQVYsRUFBa0I7QUFDbEMsV0FBTyxLQUFLaEIsaUJBQUwsQ0FBdUJnQixNQUF2QixDQUFQO0FBQ0gsR0F0RTBCO0FBd0UzQjtBQUNBeUIsRUFBQUEsc0JBQXNCLEVBQUUsZ0NBQVV6QixNQUFWLEVBQWtCYSxRQUFsQixFQUE0QjtBQUNoRCxRQUFJYixNQUFNLElBQUksSUFBVixJQUFrQmEsUUFBUSxJQUFJLElBQWxDLEVBQ0k7QUFDSixRQUFJZCxNQUFNLEdBQUcsS0FBS2YsaUJBQUwsQ0FBdUJnQixNQUF2QixDQUFiOztBQUNBLFFBQUlELE1BQU0sSUFBSUEsTUFBTSxDQUFDRyxTQUFyQixFQUFnQztBQUM1QixXQUFLLElBQUlDLENBQVQsSUFBY0osTUFBTSxDQUFDRyxTQUFyQixFQUFnQztBQUM1QixZQUFJVSxJQUFJLEdBQUdiLE1BQU0sQ0FBQ0csU0FBUCxDQUFpQkMsQ0FBakIsQ0FBWDs7QUFDQSxZQUFJUyxJQUFJLENBQUNOLEVBQUwsSUFBV08sUUFBZixFQUF5QjtBQUNyQkQsVUFBQUEsSUFBSSxDQUFDSCxNQUFMLEdBQWMzQyxlQUFlLENBQUMyQyxNQUFoQixDQUF1QkssUUFBckM7QUFDQTtBQUNIO0FBQ0osT0FQMkIsQ0FRNUI7OztBQUNBLFVBQUlZLFlBQVksR0FBRyxDQUFuQjs7QUFDQSxXQUFLLElBQUlDLENBQVQsSUFBYzVCLE1BQU0sQ0FBQ0csU0FBckIsRUFBZ0M7QUFDNUIsWUFBSUUsQ0FBQyxHQUFHTCxNQUFNLENBQUNHLFNBQVAsQ0FBaUJ5QixDQUFqQixDQUFSOztBQUNBLFlBQUl2QixDQUFDLENBQUNLLE1BQUYsSUFBWTNDLGVBQWUsQ0FBQzJDLE1BQWhCLENBQXVCQyxXQUF2QyxFQUFvRDtBQUNoRGdCLFVBQUFBLFlBQVksR0FBR3RCLENBQUMsQ0FBQ0UsRUFBakI7QUFDQTtBQUNIO0FBQ0o7O0FBQ0QsV0FBS3NCLHNCQUFMLENBQTRCNUIsTUFBNUIsRUFBb0MwQixZQUFwQztBQUVBTixNQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCdEQsZUFBZSxDQUFDNkQsc0JBQXZDLEVBQStEN0IsTUFBL0QsRUFBdUVhLFFBQXZFO0FBQ0g7QUFDSixHQWxHMEI7QUFvRzNCO0FBQ0FpQixFQUFBQSx1QkFBdUIsRUFBRSxpQ0FBVTlCLE1BQVYsRUFBa0JQLFFBQWxCLEVBQTRCO0FBQ2pELFFBQUlPLE1BQU0sSUFBSSxJQUFWLElBQWtCUCxRQUFRLElBQUksSUFBbEMsRUFDSTtBQUNKLFFBQUlNLE1BQU0sR0FBRyxLQUFLZixpQkFBTCxDQUF1QmdCLE1BQXZCLENBQWI7O0FBQ0EsUUFBSUQsTUFBTSxJQUFJLElBQWQsRUFBb0I7QUFDaEJBLE1BQUFBLE1BQU0sR0FBRyxFQUFUO0FBQ0FBLE1BQUFBLE1BQU0sQ0FBQ0UsU0FBUCxHQUFtQixFQUFuQjtBQUNBLFdBQUtqQixpQkFBTCxDQUF1QmdCLE1BQXZCLElBQWlDRCxNQUFqQztBQUNIOztBQUVELFFBQUlBLE1BQU0sQ0FBQ0UsU0FBWCxFQUFzQjtBQUNsQkYsTUFBQUEsTUFBTSxDQUFDRSxTQUFQLENBQWlCSSxJQUFqQixDQUFzQjtBQUFFWixRQUFBQSxRQUFRLEVBQUVNLE1BQU0sQ0FBQ047QUFBbkIsT0FBdEI7QUFDSDs7QUFFRE0sSUFBQUEsTUFBTSxDQUFDQyxNQUFQLEdBQWdCQSxNQUFoQjs7QUFDQSxRQUFJRCxNQUFNLENBQUNOLFFBQVAsSUFBbUJBLFFBQXZCLEVBQWlDO0FBQzdCTSxNQUFBQSxNQUFNLENBQUNOLFFBQVAsR0FBa0JBLFFBQWxCO0FBQ0FNLE1BQUFBLE1BQU0sQ0FBQ0csU0FBUCxHQUFtQixFQUFuQjtBQUVBLFVBQUlSLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxnQkFBUCxDQUF3QkMsZUFBeEIsQ0FBd0NKLFFBQXhDLENBQWI7O0FBQ0EsVUFBSUMsTUFBTSxJQUFJLElBQWQsRUFBb0I7QUFDaEJsQixRQUFBQSxFQUFFLENBQUNzQixHQUFILENBQU8seUJBQVAsRUFBa0NMLFFBQWxDO0FBQ0E7QUFDSDs7QUFFRCxXQUFLLElBQUlVLENBQVQsSUFBY1QsTUFBZCxFQUFzQjtBQUNsQixZQUFJVSxDQUFDLEdBQUdWLE1BQU0sQ0FBQ1MsQ0FBRCxDQUFkO0FBQ0FKLFFBQUFBLE1BQU0sQ0FBQ0csU0FBUCxDQUFpQkcsSUFBakIsQ0FBc0I7QUFBRUMsVUFBQUEsRUFBRSxFQUFFRixDQUFDLENBQUNFLEVBQVI7QUFBWUMsVUFBQUEsS0FBSyxFQUFFSCxDQUFDLENBQUNJLEdBQXJCO0FBQTBCQyxVQUFBQSxNQUFNLEVBQUUzQyxlQUFlLENBQUMyQyxNQUFoQixDQUF1QkM7QUFBekQsU0FBdEI7QUFDSDs7QUFFRCxVQUFJSyxLQUFLLENBQUNDLElBQU4sQ0FBV2pCLE1BQU0sQ0FBQ0csU0FBbEIsQ0FBSixFQUFrQztBQUM5QkgsUUFBQUEsTUFBTSxDQUFDRyxTQUFQLENBQWlCZSxJQUFqQixDQUFzQixVQUFVQyxDQUFWLEVBQWFDLENBQWIsRUFBZ0I7QUFDbEMsaUJBQU9ELENBQUMsQ0FBQ1gsS0FBRixHQUFVWSxDQUFDLENBQUNaLEtBQW5CO0FBQ0gsU0FGRDtBQUdIO0FBQ0osS0FuQ2dELENBcUNqRDs7O0FBQ0EsUUFBSU0sUUFBUSxHQUFHLENBQWY7O0FBQ0EsU0FBSyxJQUFJYyxDQUFULElBQWM1QixNQUFNLENBQUNHLFNBQXJCLEVBQWdDO0FBQzVCLFVBQUlFLENBQUMsR0FBR0wsTUFBTSxDQUFDRyxTQUFQLENBQWlCeUIsQ0FBakIsQ0FBUjs7QUFDQSxVQUFJdkIsQ0FBQyxDQUFDSyxNQUFGLElBQVkzQyxlQUFlLENBQUMyQyxNQUFoQixDQUF1QkMsV0FBdkMsRUFBb0Q7QUFDaERHLFFBQUFBLFFBQVEsR0FBR1QsQ0FBQyxDQUFDRSxFQUFiO0FBQ0E7QUFDSDtBQUNKOztBQUVELFNBQUtzQixzQkFBTCxDQUE0QjVCLE1BQTVCLEVBQW9DYSxRQUFwQztBQUNBTyxJQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCdEQsZUFBZSxDQUFDK0Qsc0JBQXZDLEVBQStEL0IsTUFBL0QsRUFBdUVQLFFBQXZFO0FBQ0gsR0F0SjBCO0FBd0ozQjtBQUNBdUMsRUFBQUEsaUJBQWlCLEVBQUUsMkJBQVVoQyxNQUFWLEVBQWtCO0FBQ2pDQSxJQUFBQSxNQUFNLEdBQUdBLE1BQU0sSUFBSWxDLGVBQWUsQ0FBQ3lDLEtBQWhCLENBQXNCMEIsT0FBekM7QUFDQSxRQUFJLEtBQUtDLGdCQUFMLElBQXlCLElBQTdCLEVBQ0ksS0FBS0EsZ0JBQUwsR0FBd0IsRUFBeEI7O0FBQ0osUUFBSSxLQUFLQSxnQkFBTCxDQUFzQmxDLE1BQXRCLEtBQWlDLElBQXJDLEVBQTJDO0FBQ3ZDLFVBQUlOLE1BQU0sR0FBR3lDLEtBQUssQ0FBQyxrQkFBRCxFQUFxQixrQkFBckIsRUFBeUMsQ0FBQ25DLE1BQUQsQ0FBekMsQ0FBbEI7O0FBQ0EsVUFBSU4sTUFBSixFQUFZO0FBQ1IsYUFBS3dDLGdCQUFMLENBQXNCbEMsTUFBdEIsSUFBZ0NOLE1BQU0sQ0FBQzBDLE1BQXZDO0FBQ0gsT0FGRCxNQUVPO0FBQ0gsYUFBS0YsZ0JBQUwsQ0FBc0JsQyxNQUF0QixJQUFnQyxDQUFoQztBQUNIO0FBQ0o7O0FBQ0QsV0FBTyxLQUFLa0MsZ0JBQUwsQ0FBc0JsQyxNQUF0QixDQUFQO0FBQ0gsR0F0SzBCO0FBd0szQjtBQUNBcUMsRUFBQUEsb0JBQW9CLEVBQUUsOEJBQVU3QyxJQUFWLEVBQWdCO0FBQ2xDLFFBQUlBLElBQUksSUFBSUEsSUFBSSxDQUFDOEMsT0FBakIsRUFBMEI7QUFDdEIsV0FBS3JELHVCQUFMLEdBQStCLEVBQS9COztBQUNBLFdBQUssSUFBSWtCLENBQVQsSUFBY1gsSUFBSSxDQUFDOEMsT0FBbkIsRUFBNEI7QUFDeEIsWUFBSWxDLENBQUMsR0FBR1osSUFBSSxDQUFDOEMsT0FBTCxDQUFhbkMsQ0FBYixDQUFSO0FBQ0EsYUFBS2xCLHVCQUFMLENBQTZCbUIsQ0FBQyxDQUFDSixNQUEvQixJQUF5Q0ksQ0FBQyxDQUFDUyxRQUEzQztBQUNIO0FBQ0o7O0FBQ0QsU0FBSzBCLHdCQUFMO0FBQ0gsR0FsTDBCO0FBb0wzQjtBQUNBWCxFQUFBQSxzQkFyTDJCLGtDQXFMSjVCLE1BckxJLEVBcUxJYSxRQXJMSixFQXFMYztBQUNyQyxRQUFJLEtBQUs1Qix1QkFBTCxJQUFnQyxJQUFwQyxFQUNJLEtBQUtBLHVCQUFMLEdBQStCLEVBQS9CO0FBQ0osU0FBS0EsdUJBQUwsQ0FBNkJlLE1BQTdCLElBQXVDYSxRQUF2QztBQUNBLFNBQUswQix3QkFBTDtBQUNILEdBMUwwQjtBQTRMM0I7QUFDQUEsRUFBQUEsd0JBQXdCLEVBQUUsb0NBQVk7QUFDbEMsUUFBSSxLQUFLdEQsdUJBQUwsSUFBZ0MsSUFBaEMsSUFBd0M4QixLQUFLLENBQUNDLElBQU4sQ0FBVyxLQUFLL0IsdUJBQWhCLEtBQTRDLElBQXhGLEVBQ0k7QUFDSnVELElBQUFBLE1BQU0sQ0FBQzNELFdBQVAsR0FBcUI0RCxhQUFyQixDQUFtQyxZQUFZO0FBQzNDLFVBQUlDLE9BQU8sR0FBR3pFLGNBQWMsQ0FBQ1ksV0FBZixHQUE2QjhELFNBQTdCLEVBQWQ7QUFDQSxVQUFJQyxjQUFjLEdBQUcxRSxrQkFBa0IsQ0FBQ1csV0FBbkIsR0FBaUNnRSxRQUFqQyxFQUFyQjtBQUNBLFVBQUlDLFFBQVEsR0FBRyxFQUFmOztBQUNBLFdBQUssSUFBSW5CLENBQVQsSUFBYyxLQUFLMUMsdUJBQW5CLEVBQTRDO0FBQ3hDLFlBQUk0QixRQUFRLEdBQUcsS0FBSzVCLHVCQUFMLENBQTZCMEMsQ0FBN0IsQ0FBZjtBQUNBLFlBQUlqQyxNQUFNLEdBQUd5QyxLQUFLLENBQUMsa0JBQUQsRUFBcUIsV0FBckIsRUFBa0MsQ0FBQ3RCLFFBQUQsQ0FBbEMsQ0FBbEI7O0FBQ0EsWUFBSW5CLE1BQUosRUFBWTtBQUNSb0QsVUFBQUEsUUFBUSxDQUFDbkIsQ0FBRCxDQUFSLEdBQWMsSUFBZDs7QUFDQSxjQUFJakMsTUFBTSxDQUFDcUQsU0FBUCxHQUFtQkwsT0FBTyxDQUFDSyxTQUEvQixFQUEwQztBQUN0Q0QsWUFBQUEsUUFBUSxDQUFDbkIsQ0FBRCxDQUFSLEdBQWMsS0FBZDtBQUNILFdBRkQsTUFFTztBQUNILGlCQUFLLElBQUl4QixDQUFULElBQWNULE1BQU0sQ0FBQ3NELElBQVAsSUFBZSxFQUE3QixFQUFpQztBQUM3QixrQkFBSTVDLENBQUMsR0FBR1YsTUFBTSxDQUFDc0QsSUFBUCxDQUFZN0MsQ0FBWixDQUFSOztBQUNBLGtCQUFJQyxDQUFDLENBQUMsQ0FBRCxDQUFELElBQVEsSUFBUixJQUFnQkEsQ0FBQyxDQUFDLENBQUQsQ0FBRCxJQUFRLElBQTVCLEVBQWtDO0FBQzlCLG9CQUFJNkMsR0FBRyxHQUFHN0MsQ0FBQyxDQUFDLENBQUQsQ0FBWDtBQUNBLG9CQUFJOEMsR0FBRyxHQUFHOUMsQ0FBQyxDQUFDLENBQUQsQ0FBWDtBQUNBLG9CQUFJK0MsTUFBTSxHQUFHeEQsTUFBTSxDQUFDeUQsU0FBUCxDQUFpQkMsb0JBQWpCLENBQXNDSixHQUF0QyxDQUFiOztBQUNBLG9CQUFJRSxNQUFKLEVBQVk7QUFDUixzQkFBSUQsR0FBRyxHQUFHUixPQUFPLENBQUNTLE1BQUQsQ0FBakIsRUFBMkI7QUFDdkJMLG9CQUFBQSxRQUFRLENBQUNuQixDQUFELENBQVIsR0FBYyxLQUFkO0FBQ0E7QUFDSDtBQUNKLGlCQUxELE1BS087QUFDSCxzQkFBSTJCLEdBQUcsR0FBR1YsY0FBYyxDQUFDVyx1QkFBZixDQUF1Q04sR0FBdkMsQ0FBVjs7QUFDQSxzQkFBSUMsR0FBRyxHQUFHSSxHQUFWLEVBQWU7QUFDWFIsb0JBQUFBLFFBQVEsQ0FBQ25CLENBQUQsQ0FBUixHQUFjLEtBQWQ7QUFDQTtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0o7QUFDSjtBQUNKOztBQUNELFdBQUssSUFBSUEsQ0FBVCxJQUFjbUIsUUFBZCxFQUF3QjtBQUNwQixZQUFJeEMsRUFBRSxHQUFHLEtBQUtrRCxZQUFMLENBQWtCN0IsQ0FBbEIsQ0FBVDtBQUNBLGFBQUs4QixvQkFBTCxDQUEwQm5ELEVBQTFCLEVBQThCd0MsUUFBUSxDQUFDbkIsQ0FBRCxDQUF0QztBQUNIO0FBQ0osS0F2Q2tDLENBdUNqQytCLElBdkNpQyxDQXVDNUIsSUF2QzRCLENBQW5DLEVBdUNjQyxNQUFNLENBQUNDLFVBdkNyQjtBQXdDSCxHQXhPMEI7QUEwTzNCO0FBQ0FKLEVBQUFBLFlBQVksRUFBRSxzQkFBVXhELE1BQVYsRUFBa0I7QUFDNUJBLElBQUFBLE1BQU0sR0FBR0EsTUFBTSxJQUFJbEMsZUFBZSxDQUFDeUMsS0FBaEIsQ0FBc0IwQixPQUF6QztBQUNBLFFBQUlqQyxNQUFNLElBQUlsQyxlQUFlLENBQUN5QyxLQUFoQixDQUFzQnNELEtBQXBDLEVBQ0ksT0FBTzFGLFVBQVUsQ0FBQzJGLFNBQVgsQ0FBcUJDLE9BQTVCLENBREosS0FFSyxJQUFJL0QsTUFBTSxJQUFJbEMsZUFBZSxDQUFDeUMsS0FBaEIsQ0FBc0IwQixPQUFwQyxFQUNELE9BQU85RCxVQUFVLENBQUMyRixTQUFYLENBQXFCRSxPQUE1QixDQURDLEtBRUEsSUFBSWhFLE1BQU0sSUFBSWxDLGVBQWUsQ0FBQ3lDLEtBQWhCLENBQXNCMEQsT0FBcEMsRUFDRCxPQUFPOUYsVUFBVSxDQUFDMkYsU0FBWCxDQUFxQkksT0FBNUIsQ0FEQyxLQUVBLElBQUlsRSxNQUFNLElBQUlsQyxlQUFlLENBQUN5QyxLQUFoQixDQUFzQjRELE1BQXBDLEVBQ0QsT0FBT2hHLFVBQVUsQ0FBQzJGLFNBQVgsQ0FBcUJNLE9BQTVCLENBREMsS0FHRCxPQUFPakcsVUFBVSxDQUFDMkYsU0FBWCxDQUFxQkUsT0FBNUI7QUFFUCxHQXhQMEI7QUEwUDNCO0FBQ0FLLEVBQUFBLHNCQUFzQixFQUFFLGtDQUFZO0FBQ2hDLFFBQUksS0FBS2hGLGdCQUFMLElBQXlCLElBQTdCLEVBQ0k7QUFDSixTQUFLQSxnQkFBTCxHQUF3QixJQUF4QjtBQUNBLFFBQUlpRixNQUFNLEdBQUcsS0FBYjs7QUFDQSxTQUFLLElBQUkzQyxDQUFULElBQWMsS0FBS3hDLHFCQUFuQixFQUEwQztBQUN0QyxVQUFJaUIsQ0FBQyxHQUFHLEtBQUtqQixxQkFBTCxDQUEyQndDLENBQTNCLENBQVI7O0FBQ0EsVUFBSXZCLENBQUMsSUFBSSxJQUFULEVBQWU7QUFDWGtFLFFBQUFBLE1BQU0sR0FBRyxJQUFUO0FBQ0E7QUFDSDtBQUNKOztBQUVELFFBQUlBLE1BQU0sSUFBSSxJQUFkLEVBQW9CO0FBQ2hCLFVBQUk5RSxJQUFJLEdBQUcsQ0FDUDtBQUFFeUQsUUFBQUEsR0FBRyxFQUFFOUUsVUFBVSxDQUFDMkYsU0FBWCxDQUFxQkMsT0FBNUI7QUFBcUN0RCxRQUFBQSxNQUFNLEVBQUU7QUFBN0MsT0FETyxFQUMrQztBQUFFd0MsUUFBQUEsR0FBRyxFQUFFOUUsVUFBVSxDQUFDMkYsU0FBWCxDQUFxQkUsT0FBNUI7QUFBcUN2RCxRQUFBQSxNQUFNLEVBQUU7QUFBN0MsT0FEL0MsRUFFUDtBQUFFd0MsUUFBQUEsR0FBRyxFQUFFOUUsVUFBVSxDQUFDMkYsU0FBWCxDQUFxQkksT0FBNUI7QUFBcUN6RCxRQUFBQSxNQUFNLEVBQUU7QUFBN0MsT0FGTyxFQUUrQztBQUFFd0MsUUFBQUEsR0FBRyxFQUFFOUUsVUFBVSxDQUFDMkYsU0FBWCxDQUFxQk0sT0FBNUI7QUFBcUMzRCxRQUFBQSxNQUFNLEVBQUU7QUFBN0MsT0FGL0MsQ0FBWDtBQUlBcEMsTUFBQUEsZ0JBQWdCLENBQUNRLFdBQWpCLEdBQStCMEYsY0FBL0IsQ0FBOENuRyxXQUFXLENBQUNvRyxTQUFaLENBQXNCQyxLQUFwRSxFQUEyRWpGLElBQTNFO0FBQ0g7QUFDSixHQS9RMEI7QUFpUjNCO0FBQ0FpRSxFQUFBQSxvQkFBb0IsRUFBRSw4QkFBVVIsR0FBVixFQUFleEMsTUFBZixFQUF1QjtBQUN6QyxRQUFJaUUsU0FBUyxHQUFHL0UsTUFBTSxDQUFDZ0YsYUFBUCxDQUFxQkMsU0FBckM7QUFDQSxRQUFJQyxJQUFJLEdBQUd4RyxnQkFBZ0IsQ0FBQ1EsV0FBakIsR0FBK0JpRyxxQkFBL0IsQ0FBcURKLFNBQVMsQ0FBQyxDQUFELENBQVQsQ0FBYUssUUFBbEUsQ0FBWDtBQUNBLFFBQUlGLElBQUksSUFBSSxLQUFaLEVBQ0k7QUFDSixRQUFJRyxPQUFPLEdBQUcsS0FBSzdGLHFCQUFMLENBQTJCOEQsR0FBM0IsQ0FBZDtBQUNBLFFBQUkrQixPQUFPLElBQUl2RSxNQUFmLEVBQ0k7QUFDSixTQUFLdEIscUJBQUwsQ0FBMkI4RCxHQUEzQixJQUFrQ3hDLE1BQWxDLENBUnlDLENBVXpDOztBQUNBLFFBQUksS0FBS3JCLGVBQUwsSUFBd0IsS0FBNUIsRUFBbUM7QUFDL0IsV0FBS0EsZUFBTCxHQUF1QixJQUF2QjtBQUNBZixNQUFBQSxnQkFBZ0IsQ0FBQ1EsV0FBakIsR0FBK0IwRixjQUEvQixDQUE4Q25HLFdBQVcsQ0FBQ29HLFNBQVosQ0FBc0JDLEtBQXBFLEVBQTJFO0FBQUV4QixRQUFBQSxHQUFHLEVBQUVBLEdBQVA7QUFBWXhDLFFBQUFBLE1BQU0sRUFBRUE7QUFBcEIsT0FBM0U7QUFDSCxLQWR3QyxDQWdCekM7OztBQUNBVyxJQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCaEQsVUFBVSxDQUFDMkcsb0JBQWxDLEVBQXdEaEMsR0FBeEQsRUFBNkR4QyxNQUE3RDtBQUNILEdBcFMwQjtBQXNTM0J5RSxFQUFBQSxZQUFZLEVBQUUsc0JBQVVsRixNQUFWLEVBQWtCO0FBQzVCLFFBQUlNLEVBQUUsR0FBRyxLQUFLa0QsWUFBTCxDQUFrQnhELE1BQWxCLENBQVQ7QUFDQSxXQUFPLEtBQUtiLHFCQUFMLENBQTJCbUIsRUFBM0IsQ0FBUDtBQUNILEdBelMwQjtBQTJTM0I2RSxFQUFBQSxpQkFBaUIsRUFBRSw2QkFBWTtBQUMzQixTQUFLLElBQUl4RCxDQUFULElBQWMsS0FBS3hDLHFCQUFuQixFQUEwQztBQUN0QyxVQUFJNkYsT0FBTyxHQUFHLEtBQUs3RixxQkFBTCxDQUEyQndDLENBQTNCLENBQWQ7QUFDQSxVQUFJcUQsT0FBTyxJQUFJLElBQWYsRUFDSSxPQUFPLElBQVA7QUFDUDs7QUFDRCxXQUFPLEtBQVA7QUFDSCxHQWxUMEI7QUFtVDNCO0FBQ0FJLEVBQUFBLG1CQXBUMkIsK0JBb1RQcEYsTUFwVE8sRUFvVEE7QUFDdkIsUUFBRyxLQUFLaEIsaUJBQUwsQ0FBdUJnQixNQUF2QixDQUFILEVBQWtDO0FBQzlCLFVBQUlFLFNBQVMsR0FBRyxLQUFLbEIsaUJBQUwsQ0FBdUJnQixNQUF2QixFQUErQkUsU0FBL0M7QUFDQSxVQUFJbUYsS0FBSyxHQUFHLEtBQUtyRyxpQkFBTCxDQUF1QmdCLE1BQXZCLEVBQStCQyxTQUEvQixDQUF5Q21DLE1BQXpDLEdBQWtELENBQTlEOztBQUNBLFdBQUksSUFBSWpDLENBQUMsR0FBQyxDQUFWLEVBQVlBLENBQUMsR0FBQ0QsU0FBUyxDQUFDa0MsTUFBeEIsRUFBK0IsRUFBRWpDLENBQWpDLEVBQW1DO0FBQy9CLFlBQUlDLENBQUMsR0FBR0YsU0FBUyxDQUFDQyxDQUFELENBQWpCOztBQUNBLFlBQUdDLENBQUMsQ0FBQ0ssTUFBRixJQUFZM0MsZUFBZSxDQUFDMkMsTUFBaEIsQ0FBdUJLLFFBQXRDLEVBQStDO0FBQzNDdUUsVUFBQUEsS0FBSyxHQUFHQSxLQUFLLEdBQUcsQ0FBaEI7QUFDSDtBQUNKOztBQUNELGFBQU9BLEtBQVA7QUFDSDs7QUFDRCxXQUFPLENBQUMsQ0FBUjtBQUNIO0FBalUwQixDQUFULENBQXRCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAxLTE5IDE3OjM3OjMzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEd1aWxkc2tpbGxDb25zdCA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2NvbnN0XCIpO1xudmFyIEd1aWxkc2tpbGxFdmVudCA9IHJlcXVpcmUoXCJndWlsZHNraWxsX2V2ZW50XCIpO1xudmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBHdWlsZENvbnN0ID0gcmVxdWlyZShcImd1aWxkX2NvbnN0XCIpO1xudmFyIE1haW51aUNvbnN0ID0gcmVxdWlyZShcIm1haW51aV9jb25zdFwiKTtcbnZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpO1xudmFyIEd1aWxkRXZlbnQgPSByZXF1aXJlKFwiZ3VpbGRfZXZlbnRcIik7XG5cbnZhciBHdWlsZHNraWxsTW9kZWwgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5jdHJsID0gcmVxdWlyZShcImd1aWxkc2tpbGxfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB0aGlzLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY2FyZWVyX3NraWxsX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnNraWxsX3VwZ3JhZGVfY29zdF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0ID0ge307XG5cbiAgICAgICAgdGhpcy5oYWRfc2VuZF9tYWludWkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5oYWRfY2xvc2VfbWFpbnVpID0gZmFsc2U7XG4gICAgfSxcblxuICAgIGNsZWFyR3VpbGRDYXJlZXJTa2lsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmNhcmVlcl9za2lsbF9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3QgPSB7fTtcbiAgICAgICAgdGhpcy5za2lsbF91cGdyYWRlX2Nvc3RfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnNraWxsX3JlZF9zdGF0dXNfbGlzdCA9IHt9O1xuICAgIH0sXG5cbiAgICBpbml0R3VpbGRDYXJlZXJTa2lsbDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmdyb3VwX2lkID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9za2lsbF9kYXRhLmRhdGFfaW5mb19ncm91cFtkYXRhLmdyb3VwX2lkXTtcbiAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxsKVxuICAgICAgICAgICAgY2MubG9nKFwi5YWs5Lya5oqA6IO96YWN572u5pWw5o2u5pyJ6Zeu6aKY77yM5oqA6IO957uEaWTkuLrvvJpcIiwgZGF0YS5ncm91cF9pZCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0LmNhcmVlciA9IGRhdGEuY2FyZWVyICAgICAgICAgICAgICAgICAvLyDlvZPliY3ogYzkuJpcbiAgICAgICAgICAgIG9iamVjdC5ncm91cF9pZCA9IGRhdGEuZ3JvdXBfaWQgICAgICAgICAgICAgLy8g5b2T5YmN5r+A5rS755qE5oqA6IO957uEXG4gICAgICAgICAgICBvYmplY3QuZ3JvdXBfaWRzID0gZGF0YS5ncm91cF9pZHMgICAgICAgICAgIC8vIOW3sue7j+a/gOa0u+eahOaKgOiDvee7hFxuICAgICAgICAgICAgb2JqZWN0LnNraWxsX2lkcyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3mioDog73nu4TnmoTmioDog73nirbmgIFcblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZ1tpXTtcbiAgICAgICAgICAgICAgICBvYmplY3Quc2tpbGxfaWRzLnB1c2goeyBpZDogdi5pZCwgaW5kZXg6IHYuc2VxLCBzdGF0dXM6IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMudW5fYWN0aXZpdHkgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YS5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IGRhdGEuc2tpbGxfaWRzW2ldO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gb2JqZWN0LnNraWxsX2lkcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG9iamVjdC5za2lsbF9pZHNbbl07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LnNraWxsX2lkID09IGl0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3RhdHVzID0gR3VpbGRza2lsbENvbnN0LnN0YXR1cy5hY3Rpdml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL+WvueaKgOiDvemhuuW6j+WBmuS4gOS4quaOkuW6j+WQp++8jOS4u+imgeaYr+aLheW/g+etluWIkumFjee9ruS4jeaYr+aMieeFp+ato+W4uOmhuuW6j+adpVxuICAgICAgICAgICAgaWYgKFV0aWxzLm5leHQob2JqZWN0LnNraWxsX2lkcykpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Quc2tpbGxfaWRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggPCBiLmluZGV4XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbZGF0YS5jYXJlZXJdID0gb2JqZWN0O1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZHNraWxsRXZlbnQuVXBkYXRlR3VpbGRTa2lsbEV2ZW50LCBkYXRhLmNhcmVlcik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/ojrflj5bmjIflrprogYzkuJrnmoTmioDog73kv6Hmga9cbiAgICBnZXRDYXJlZXJTa2lsbEluZm86IGZ1bmN0aW9uIChjYXJlZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbY2FyZWVyXTtcbiAgICB9LFxuXG4gICAgLy/mv4DmtLvmjIflrprogYzkuJrnmoTmioDog73kv6Hmga9cbiAgICB1cGRhdGVHdWlsZENhcmVlclNraWxsOiBmdW5jdGlvbiAoY2FyZWVyLCBza2lsbF9pZCkge1xuICAgICAgICBpZiAoY2FyZWVyID09IG51bGwgfHwgc2tpbGxfaWQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdO1xuICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gb2JqZWN0LnNraWxsX2lkcykge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gb2JqZWN0LnNraWxsX2lkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5pZCA9PSBza2lsbF9pZCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0YXR1cyA9IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/ljYfnuqfkuYvlkI7vvIzov5novrnlgZrkuIDmrKHkv53lrZjlvZPliY3lvoXljYfnuqfnmoTmioDog71pZFxuICAgICAgICAgICAgdmFyIHJlZF9za2lsbF9pZCA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBrIGluIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IG9iamVjdC5za2lsbF9pZHNba107XG4gICAgICAgICAgICAgICAgaWYgKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMudW5fYWN0aXZpdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVkX3NraWxsX2lkID0gdi5pZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxTdGF0dXMoY2FyZWVyLCByZWRfc2tpbGxfaWQpO1xuXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkc2tpbGxFdmVudC5VcGRhdGVTa2lsbFN0YXR1c0V2ZW50LCBjYXJlZXIsIHNraWxsX2lkKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+WNh+e6p+aMh+WumuiBjOS4mueahOaKgOiDvee7hO+8jOi/meS4quaXtuWAmem7mOiupOivpeaKgOiDvee7hOaKgOiDvemDveacqua/gOa0u1xuICAgIHVwZ3JhZGVHdWlsZENhcmVlclNraWxsOiBmdW5jdGlvbiAoY2FyZWVyLCBncm91cF9pZCkge1xuICAgICAgICBpZiAoY2FyZWVyID09IG51bGwgfHwgZ3JvdXBfaWQgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB2YXIgb2JqZWN0ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdO1xuICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IHt9O1xuICAgICAgICAgICAgb2JqZWN0Lmdyb3VwX2lkcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdID0gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iamVjdC5ncm91cF9pZHMpIHtcbiAgICAgICAgICAgIG9iamVjdC5ncm91cF9pZHMucHVzaCh7IGdyb3VwX2lkOiBvYmplY3QuZ3JvdXBfaWQgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYmplY3QuY2FyZWVyID0gY2FyZWVyO1xuICAgICAgICBpZiAob2JqZWN0Lmdyb3VwX2lkICE9IGdyb3VwX2lkKSB7XG4gICAgICAgICAgICBvYmplY3QuZ3JvdXBfaWQgPSBncm91cF9pZDtcbiAgICAgICAgICAgIG9iamVjdC5za2lsbF9pZHMgPSBbXTtcblxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IENvbmZpZy5ndWlsZF9za2lsbF9kYXRhLmRhdGFfaW5mb19ncm91cFtncm91cF9pZF07XG4gICAgICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjYy5sb2coXCLmm7TmlrDmioDog73nu4Tlh7rplJnvvIzphY3nva7mlbDmja7mnInpl67popjvvIzmioDog73nu4RpZOS4uu+8mlwiLCBncm91cF9pZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBjb25maWdbaV07XG4gICAgICAgICAgICAgICAgb2JqZWN0LnNraWxsX2lkcy5wdXNoKHsgaWQ6IHYuaWQsIGluZGV4OiB2LnNlcSwgc3RhdHVzOiBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoVXRpbHMubmV4dChvYmplY3Quc2tpbGxfaWRzKSkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5za2lsbF9pZHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5pbmRleCA8IGIuaW5kZXhcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/ljYfnuqfkuYvlkI7vvIzov5novrnlgZrkuIDmrKHkv53lrZjlvZPliY3lvoXljYfnuqfnmoTmioDog71pZFxuICAgICAgICB2YXIgc2tpbGxfaWQgPSAwO1xuICAgICAgICBmb3IgKHZhciBrIGluIG9iamVjdC5za2lsbF9pZHMpIHtcbiAgICAgICAgICAgIHZhciB2ID0gb2JqZWN0LnNraWxsX2lkc1trXTtcbiAgICAgICAgICAgIGlmICh2LnN0YXR1cyA9PSBHdWlsZHNraWxsQ29uc3Quc3RhdHVzLnVuX2FjdGl2aXR5KSB7XG4gICAgICAgICAgICAgICAgc2tpbGxfaWQgPSB2LmlkO1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkU2tpbGxTdGF0dXMoY2FyZWVyLCBza2lsbF9pZCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRza2lsbEV2ZW50LlVwZGF0ZVNraWxVcGdyYWRlRXZlbnQsIGNhcmVlciwgZ3JvdXBfaWQpO1xuICAgIH0sXG5cbiAgICAvL+iOt+WPluW9k+WJjeaKgOiDvee7hOS4iue6v1xuICAgIGdldENhcmVlckdyb3VwTWF4OiBmdW5jdGlvbiAoY2FyZWVyKSB7XG4gICAgICAgIGNhcmVlciA9IGNhcmVlciB8fCBHdWlsZHNraWxsQ29uc3QuaW5kZXgucGh5c2ljcztcbiAgICAgICAgaWYgKHRoaXMuY2FyZWVyX2dyb3VwX21heCA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jYXJlZXJfZ3JvdXBfbWF4ID0ge307XG4gICAgICAgIGlmICh0aGlzLmNhcmVlcl9ncm91cF9tYXhbY2FyZWVyXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZ2RhdGEoXCJndWlsZF9za2lsbF9kYXRhXCIsIFwiZGF0YV9jYXJlZXJfbGlzdFwiLCBbY2FyZWVyXSk7XG4gICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYXJlZXJfZ3JvdXBfbWF4W2NhcmVlcl0gPSBjb25maWcubGVuZ3RoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhcmVlcl9ncm91cF9tYXhbY2FyZWVyXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FyZWVyX2dyb3VwX21heFtjYXJlZXJdO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muaKgOiDveeahOWIneWni+WMlue6oueCueeKtuaAgVxuICAgIGluaXRHdWlsZFNraWxsU3RhdHVzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLm91dGxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZGF0YS5vdXRsaW5lKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSBkYXRhLm91dGxpbmVbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdFt2LmNhcmVlcl0gPSB2LnNraWxsX2lkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tHdWlsZFNraWxsUmVkU3RhdHVzKCk7XG4gICAgfSxcblxuICAgIC8v5pu05paw5b2T5YmN5oqA6IO9XG4gICAgdXBkYXRlR3VpbGRTa2lsbFN0YXR1cyhjYXJlZXIsIHNraWxsX2lkKSB7XG4gICAgICAgIGlmICh0aGlzLnNraWxsX3dhaXRfdXBncmFkZV9saXN0ID09IG51bGwpXG4gICAgICAgICAgICB0aGlzLnNraWxsX3dhaXRfdXBncmFkZV9saXN0ID0ge307XG4gICAgICAgIHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3RbY2FyZWVyXSA9IHNraWxsX2lkO1xuICAgICAgICB0aGlzLmNoZWNrR3VpbGRTa2lsbFJlZFN0YXR1cygpO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muaKgOiDvee6oueCueeahOeul+azleabtOaWsFxuICAgIGNoZWNrR3VpbGRTa2lsbFJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCA9PSBudWxsIHx8IFV0aWxzLm5leHQodGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCkgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByb2xlX3ZvID0gUm9sZUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5nZXRSb2xlVm8oKTtcbiAgICAgICAgICAgIHZhciBiYWNrcGFja19tb2RlbCA9IEJhY2twYWNrQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG4gICAgICAgICAgICB2YXIgcmVkX2xpc3QgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF93YWl0X3VwZ3JhZGVfbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBza2lsbF9pZCA9IHRoaXMuc2tpbGxfd2FpdF91cGdyYWRlX2xpc3Rba107XG4gICAgICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGdkYXRhKFwiZ3VpbGRfc2tpbGxfZGF0YVwiLCBcImRhdGFfaW5mb1wiLCBbc2tpbGxfaWRdKTtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5ndWlsZF9sZXYgPiByb2xlX3ZvLmd1aWxkX2xldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVkX2xpc3Rba10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gY29uZmlnLmxvc3MgfHwge30pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGNvbmZpZy5sb3NzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2WzBdICE9IG51bGwgJiYgdlsxXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaWQgPSB2WzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gdlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFzc2VydCA9IENvbmZpZy5pdGVtX2RhdGEuZGF0YV9hc3NldHNfaWQybGFiZWxbYmlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IHJvbGVfdm9bYXNzZXJ0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdW0gPSBiYWNrcGFja19tb2RlbC5nZXRCYWNrUGFja0l0ZW1OdW1CeUJpZChiaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA+IHN1bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9saXN0W2tdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGsgaW4gcmVkX2xpc3QpIHtcbiAgICAgICAgICAgICAgICB2YXIgaWQgPSB0aGlzLmdldENhcmVlcktleShrKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKGlkLCByZWRfbGlzdFtrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0uYmluZCh0aGlzKSwgUmVkSWRzLkd1aWxkU2tpbGwpXG4gICAgfSxcblxuICAgIC8v6K6+572u5LiA5Liq5ZSv5LiAaWTlkKcsIOi3nyBndWlsZGNvbnN0LnNraWxsXzIgLDMgLDQgLDXlr7nlupRcbiAgICBnZXRDYXJlZXJLZXk6IGZ1bmN0aW9uIChjYXJlZXIpIHtcbiAgICAgICAgY2FyZWVyID0gY2FyZWVyIHx8IEd1aWxkc2tpbGxDb25zdC5pbmRleC5waHlzaWNzO1xuICAgICAgICBpZiAoY2FyZWVyID09IEd1aWxkc2tpbGxDb25zdC5pbmRleC5tYWdpYylcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yO1xuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LnBoeXNpY3MpXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfM1xuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LmRlZmVuY2UpXG4gICAgICAgICAgICByZXR1cm4gR3VpbGRDb25zdC5yZWRfaW5kZXguc2tpbGxfNFxuICAgICAgICBlbHNlIGlmIChjYXJlZXIgPT0gR3VpbGRza2lsbENvbnN0LmluZGV4LmFzc2lzdClcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF81XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8zXG5cbiAgICB9LFxuXG4gICAgLy/muIXmpZrkuLvnlYzpnaLkuIrpnaLnmoTnuqLngrlcbiAgICBjbGVhckd1aWxkU2tpbGxJY29uUmVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhZF9jbG9zZV9tYWludWkgPT0gdHJ1ZSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB0aGlzLmhhZF9jbG9zZV9tYWludWkgPSB0cnVlO1xuICAgICAgICB2YXIgaXNfcmVkID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3Rba107XG4gICAgICAgICAgICBpZiAodiA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNfcmVkID09IHRydWUpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gW1xuICAgICAgICAgICAgICAgIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8yLCBzdGF0dXM6IGZhbHNlIH0sIHsgYmlkOiBHdWlsZENvbnN0LnJlZF9pbmRleC5za2lsbF8zLCBzdGF0dXM6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgeyBiaWQ6IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzQsIHN0YXR1czogZmFsc2UgfSwgeyBiaWQ6IEd1aWxkQ29uc3QucmVkX2luZGV4LnNraWxsXzUsIHN0YXR1czogZmFsc2UgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRCdG5SZWRQb2ludChNYWludWlDb25zdC5idG5faW5kZXguZ3VpbGQsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5pu05paw5YWs5Lya5oqA6IO957qi54K5XG4gICAgdXBkYXRlR3VpbGRSZWRTdGF0dXM6IGZ1bmN0aW9uIChiaWQsIHN0YXR1cykge1xuICAgICAgICB2YXIgYmFzZV9kYXRhID0gQ29uZmlnLmZ1bmN0aW9uX2RhdGEuZGF0YV9iYXNlO1xuICAgICAgICB2YXIgYm9vbCA9IE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5jaGVja0lzT3BlbkJ5QWN0aXZhdGUoYmFzZV9kYXRhWzZdLmFjdGl2YXRlKTtcbiAgICAgICAgaWYgKGJvb2wgPT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdmFyIF9zdGF0dXMgPSB0aGlzLnNraWxsX3JlZF9zdGF0dXNfbGlzdFtiaWRdO1xuICAgICAgICBpZiAoX3N0YXR1cyA9PSBzdGF0dXMpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3RbYmlkXSA9IHN0YXR1cztcblxuICAgICAgICAvL+abtOaWsOWcuuaZr+e6oueCueeKtuaAgSzlj6rlnKjnmbvlvZXnmoTml7blgJnmj5DnpLrkuIDmrKFcbiAgICAgICAgaWYgKHRoaXMuaGFkX3NlbmRfbWFpbnVpID09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmhhZF9zZW5kX21haW51aSA9IHRydWU7XG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkLCB7IGJpZDogYmlkLCBzdGF0dXM6IHN0YXR1cyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5LqL5Lu255So5LqO5ZCM5q2l5pu05paw5YWs5Lya5Li7dWnnmoTnuqLngrlcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShHdWlsZEV2ZW50LlVwZGF0ZUd1aWxkUmVkU3RhdHVzLCBiaWQsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIGdldFJlZFN0YXR1czogZnVuY3Rpb24gKGNhcmVlcikge1xuICAgICAgICB2YXIgaWQgPSB0aGlzLmdldENhcmVlcktleShjYXJlZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5za2lsbF9yZWRfc3RhdHVzX2xpc3RbaWRdO1xuICAgIH0sXG5cbiAgICBnZXRSZWRUb3RhbFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0KSB7XG4gICAgICAgICAgICB2YXIgX3N0YXR1cyA9IHRoaXMuc2tpbGxfcmVkX3N0YXR1c19saXN0W2tdO1xuICAgICAgICAgICAgaWYgKF9zdGF0dXMgPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG4gICAgLy8gLS3ojrflj5blkITogYzkuJrnmoTlhazkvJrmioDog73nrYnnuqdcbiAgICBnZXRDYXJlZXJTa2lsbExldmVsKGNhcmVlcil7XG4gICAgICAgIGlmKHRoaXMuY2FyZWVyX3NraWxsX2xpc3RbY2FyZWVyXSl7XG4gICAgICAgICAgICBsZXQgc2tpbGxfaWRzID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdLnNraWxsX2lkc1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5jYXJlZXJfc2tpbGxfbGlzdFtjYXJlZXJdLmdyb3VwX2lkcy5sZW5ndGggKiA2XG4gICAgICAgICAgICBmb3IobGV0IGk9MDtpPHNraWxsX2lkcy5sZW5ndGg7KytpKXtcbiAgICAgICAgICAgICAgICBsZXQgdiA9IHNraWxsX2lkc1tpXVxuICAgICAgICAgICAgICAgIGlmKHYuc3RhdHVzID09IEd1aWxkc2tpbGxDb25zdC5zdGF0dXMuYWN0aXZpdHkpe1xuICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb3VudFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMVxuICAgIH1cbn0pOyJdfQ==