|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/task/task_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, 'cbaefStWFJBmJI1Ps8JScv/', 'task_model');
|
// Scripts/mod/task/task_model.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: xxx@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 这里填写详细说明,主要填写该模块的功能简要
|
// <br/>Create: 2019-01-09 11:26:10
|
// --------------------------------------------------------------------
|
var TaskConst = require("task_const");
|
|
var RoleController = require("role_controller");
|
|
var TaskEvent = require("task_event");
|
|
var TaskVo = require("task_vo");
|
|
var TaskModel = cc.Class({
|
"extends": BaseClass,
|
ctor: function ctor() {
|
this.ctrl = arguments[0];
|
},
|
properties: {},
|
initConfig: function initConfig() {
|
this.task_list = []; //当前所有任务数据
|
|
this.feat_list = {}; //当前成就所有数据
|
|
this.task_status_list = []; //任务icon的红点状态
|
|
this.update_feat_status_list = []; //待更新成就状态,延迟更新的
|
|
this.finish_feat_list = [];
|
},
|
// @desc:需要检测的红点状态,分活跃度,任务或者成就3中
|
// author:{author}
|
// time:2018-05-22 15:50:49
|
// --@type:
|
// return
|
checkQuestAndFeatStatus: function checkQuestAndFeatStatus(type) {
|
var red_status = false;
|
|
if (type == TaskConst.update_type.activity) {
|
var role_vo = RoleController.getInstance().getRoleVo();
|
|
if (role_vo != null && this.activity_data != null) {
|
for (var i in Config.activity_data.data_get) {
|
var v = Config.activity_data.data_get[i];
|
|
if (role_vo.activity >= v.activity && !this.activity_data[v.activity]) {
|
red_status = true;
|
break;
|
}
|
}
|
}
|
} else if (type == TaskConst.update_type.quest) {
|
if (this.task_list != null) {
|
for (var k in this.task_list) {
|
var v = this.task_list[k];
|
|
if (v.finish == TaskConst.task_status.finish) {
|
red_status = true;
|
break;
|
}
|
}
|
}
|
} else if (type == TaskConst.update_type.feat) {
|
if (this.feat_list != null) {
|
for (var k in this.feat_list) {
|
var v = this.feat_list[k];
|
|
if (v.finish == TaskConst.task_status.finish) {
|
red_status = true;
|
break;
|
}
|
}
|
}
|
}
|
|
if (this.red_status_list == null) {
|
this.red_status_list = [];
|
}
|
|
if (this.red_status_list[type] == null || this.red_status_list[type] != null && this.red_status_list[type] != red_status) {
|
this.red_status_list[type] = red_status; //抛出事件更新红点
|
|
gcore.GlobalEvent.fire(TaskEvent.UpdateUIRedStatus, type, red_status);
|
} //红点状态
|
|
|
var num = 0;
|
if (red_status == true) num = 1;
|
|
var MainuiConst = require("mainui_const");
|
|
require("mainui_controller").getInstance().setFunctionTipsStatus(MainuiConst.icon.daily, {
|
bid: type,
|
num: num
|
});
|
},
|
// @desc:用于日常面板上的红点接口判断
|
// author:{author}
|
// time:2018-05-28 14:41:18
|
// --@type:
|
// return
|
getRedStatus: function getRedStatus(type) {
|
if (this.red_status_list == null) return false;
|
return this.red_status_list[type];
|
},
|
// @desc:更新整个活跃度数据,只有在上线或者断线重连的时候更新
|
// author:{author}
|
// time:2018-05-22 16:14:11
|
// --@data:
|
// return
|
updateActivityData: function updateActivityData(data_list) {
|
this.activity_data = {};
|
|
for (var k in data_list) {
|
var v = data_list[k];
|
this.activity_data[v.activity] = true;
|
}
|
|
this.checkQuestAndFeatStatus(TaskConst.update_type.activity);
|
gcore.GlobalEvent.fire(TaskEvent.UpdateActivityInfo, this.activity_data);
|
},
|
// @desc:领取某个活跃度宝箱之后的更新,更新单个的
|
// author:{author}
|
// time:2018-05-22 16:14:40
|
// --@activity:
|
// return
|
updateSingleActivityData: function updateSingleActivityData(activity) {
|
if (this.activity_data == null) return;
|
this.activity_data[activity] = true;
|
this.checkQuestAndFeatStatus(TaskConst.update_type.activity);
|
gcore.GlobalEvent.fire(TaskEvent.UpdateActivityInfo, this.activity_data);
|
},
|
getActivityData: function getActivityData() {
|
return this.activity_data;
|
},
|
//desc:增加或者更新任务
|
//time:2018-07-19 05:58:51
|
//@task_list:
|
//@is_update:
|
//@return
|
addTaskList: function addTaskList(task_list, is_update, is_init) {
|
var taskVo,
|
config = null;
|
var is_new = false;
|
var finish_list = [];
|
if (is_init == true) this.task_list = [];
|
|
for (var i in task_list) {
|
var v = task_list[i];
|
config = gdata("quest_data", "data_get", [v.id]);
|
|
if (config != null) {
|
if (this.task_list[v.id] == null) {
|
this.task_list[v.id] = new TaskVo(v.id, TaskConst.type.quest);
|
is_new = true;
|
} else {
|
if (v.finish == 1 && is_update == true) finish_list.push(v.id);
|
}
|
|
taskVo = this.task_list[v.id];
|
taskVo.updateData(v);
|
}
|
}
|
|
this.checkQuestAndFeatStatus(TaskConst.update_type.quest);
|
gcore.GlobalEvent.fire(TaskEvent.UpdateTaskList, is_new, finish_list);
|
},
|
// @desc:设置一个任务为提交完成状态
|
// author:{author}
|
// time:2018-05-22 16:27:46
|
// --@id:
|
// return
|
setTaskCompleted: function setTaskCompleted(id) {
|
var taskVo = this.task_list[id];
|
|
if (taskVo != null) {
|
taskVo.setCompletedStatus(TaskConst.task_status.completed);
|
this.checkQuestAndFeatStatus(TaskConst.update_type.quest);
|
gcore.GlobalEvent.fire(TaskEvent.UpdateTaskList, false);
|
}
|
},
|
// @desc:获取全部任务列表,这个根据 finish_sort 做了排序的
|
// author:{author}
|
// time:2018-05-22 19:23:23
|
// return
|
getTaskList: function getTaskList() {
|
var task_list = [];
|
|
for (var k in this.task_list) {
|
task_list.push(this.task_list[k]);
|
}
|
|
if (Utils.next(task_list)) {
|
task_list.sort(Utils.tableLowerSorter(["finish_sort", "id"]));
|
}
|
|
return task_list;
|
},
|
getTaskById: function getTaskById(id) {
|
return this.task_list[id];
|
},
|
getFeatById: function getFeatById(id) {
|
return this.feat_list[id];
|
},
|
//desc:增加或者更新任务
|
//time:2018-07-19 05:59:30
|
//@feat_list:
|
//@is_update:
|
//@return
|
addFeatList: function addFeatList(feat_list, is_update, is_init) {
|
var taskVo,
|
config = null;
|
var is_new = false;
|
var finish_list = [];
|
if (is_init == true) this.feat_list = {};
|
|
for (var i in feat_list) {
|
var v = feat_list[i];
|
config = gdata("feat_data", "data_get", [v.id]);
|
|
if (config != null) {
|
if (this.feat_list[v.id] == null) {
|
this.feat_list[v.id] = new TaskVo(v.id, TaskConst.type.feat);
|
is_new = true;
|
} else {
|
if (v.finish == 1 && is_update == true) finish_list.push(v.id);
|
}
|
|
taskVo = this.feat_list[v.id];
|
taskVo.updateData(v);
|
}
|
}
|
|
this.checkQuestAndFeatStatus(TaskConst.update_type.feat);
|
this.needUpdateFeat(is_new, finish_list);
|
},
|
setFeatCompleted: function setFeatCompleted(id) {
|
var taskVo = this.feat_list[id];
|
|
if (taskVo != null) {
|
taskVo.setCompletedStatus(TaskConst.task_status.completed);
|
this.checkQuestAndFeatStatus(TaskConst.update_type.feat);
|
this.needUpdateFeat(false);
|
}
|
},
|
// @desc:是否需要抛出更新成就的事件,因为提交一个成就可能触发新增成就,所以如果都抛事件的话,会触发多次更新,做延迟抛出更新,避免次更新
|
// author:{author}
|
// time:2018-05-23 11:56:08
|
// --@status:
|
// return
|
needUpdateFeat: function needUpdateFeat(status, finish_list) {
|
gcore.GlobalEvent.fire(TaskEvent.UpdateFeatList, finish_list);
|
},
|
getFeatList: function getFeatList() {
|
var feat_list = [];
|
|
for (var k in this.feat_list) {
|
var v = this.feat_list[k];
|
if (v.finish != TaskConst.task_status.completed) feat_list.push(v);
|
}
|
|
if (Utils.next(feat_list)) {
|
feat_list.sort(Utils.tableLowerSorter(["finish_sort", "id"]));
|
}
|
|
return feat_list;
|
},
|
//存贮主线任务数据
|
setMainTaskData: function setMainTaskData(data) {
|
this.main_task_data = data;
|
gcore.GlobalEvent.fire(TaskEvent.UpdateMainQuestTask, data);
|
},
|
getMainTaskData: function getMainTaskData() {
|
return this.main_task_data;
|
}
|
});
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFx0YXNrXFx0YXNrX21vZGVsLmpzIl0sIm5hbWVzIjpbIlRhc2tDb25zdCIsInJlcXVpcmUiLCJSb2xlQ29udHJvbGxlciIsIlRhc2tFdmVudCIsIlRhc2tWbyIsIlRhc2tNb2RlbCIsImNjIiwiQ2xhc3MiLCJCYXNlQ2xhc3MiLCJjdG9yIiwiY3RybCIsImFyZ3VtZW50cyIsInByb3BlcnRpZXMiLCJpbml0Q29uZmlnIiwidGFza19saXN0IiwiZmVhdF9saXN0IiwidGFza19zdGF0dXNfbGlzdCIsInVwZGF0ZV9mZWF0X3N0YXR1c19saXN0IiwiZmluaXNoX2ZlYXRfbGlzdCIsImNoZWNrUXVlc3RBbmRGZWF0U3RhdHVzIiwidHlwZSIsInJlZF9zdGF0dXMiLCJ1cGRhdGVfdHlwZSIsImFjdGl2aXR5Iiwicm9sZV92byIsImdldEluc3RhbmNlIiwiZ2V0Um9sZVZvIiwiYWN0aXZpdHlfZGF0YSIsImkiLCJDb25maWciLCJkYXRhX2dldCIsInYiLCJxdWVzdCIsImsiLCJmaW5pc2giLCJ0YXNrX3N0YXR1cyIsImZlYXQiLCJyZWRfc3RhdHVzX2xpc3QiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVwZGF0ZVVJUmVkU3RhdHVzIiwibnVtIiwiTWFpbnVpQ29uc3QiLCJzZXRGdW5jdGlvblRpcHNTdGF0dXMiLCJpY29uIiwiZGFpbHkiLCJiaWQiLCJnZXRSZWRTdGF0dXMiLCJ1cGRhdGVBY3Rpdml0eURhdGEiLCJkYXRhX2xpc3QiLCJVcGRhdGVBY3Rpdml0eUluZm8iLCJ1cGRhdGVTaW5nbGVBY3Rpdml0eURhdGEiLCJnZXRBY3Rpdml0eURhdGEiLCJhZGRUYXNrTGlzdCIsImlzX3VwZGF0ZSIsImlzX2luaXQiLCJ0YXNrVm8iLCJjb25maWciLCJpc19uZXciLCJmaW5pc2hfbGlzdCIsImdkYXRhIiwiaWQiLCJwdXNoIiwidXBkYXRlRGF0YSIsIlVwZGF0ZVRhc2tMaXN0Iiwic2V0VGFza0NvbXBsZXRlZCIsInNldENvbXBsZXRlZFN0YXR1cyIsImNvbXBsZXRlZCIsImdldFRhc2tMaXN0IiwiVXRpbHMiLCJuZXh0Iiwic29ydCIsInRhYmxlTG93ZXJTb3J0ZXIiLCJnZXRUYXNrQnlJZCIsImdldEZlYXRCeUlkIiwiYWRkRmVhdExpc3QiLCJuZWVkVXBkYXRlRmVhdCIsInNldEZlYXRDb21wbGV0ZWQiLCJzdGF0dXMiLCJVcGRhdGVGZWF0TGlzdCIsImdldEZlYXRMaXN0Iiwic2V0TWFpblRhc2tEYXRhIiwiZGF0YSIsIm1haW5fdGFza19kYXRhIiwiVXBkYXRlTWFpblF1ZXN0VGFzayIsImdldE1haW5UYXNrRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlDLGNBQWMsR0FBR0QsT0FBTyxDQUFDLGlCQUFELENBQTVCOztBQUNBLElBQUlFLFNBQVMsR0FBR0YsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUcsTUFBTSxHQUFHSCxPQUFPLENBQUMsU0FBRCxDQUFwQjs7QUFFQSxJQUFJSSxTQUFTLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxDQUFTO0FBQ3JCLGFBQVNDLFNBRFk7QUFFckJDLEVBQUFBLElBQUksRUFBRSxnQkFBWTtBQUNkLFNBQUtDLElBQUwsR0FBWUMsU0FBUyxDQUFDLENBQUQsQ0FBckI7QUFDSCxHQUpvQjtBQU1yQkMsRUFBQUEsVUFBVSxFQUFFLEVBTlM7QUFTckJDLEVBQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUNwQixTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBRG9CLENBQ29COztBQUN4QyxTQUFLQyxTQUFMLEdBQWlCLEVBQWpCLENBRm9CLENBRW9COztBQUN4QyxTQUFLQyxnQkFBTCxHQUF3QixFQUF4QixDQUhvQixDQUdvQjs7QUFDeEMsU0FBS0MsdUJBQUwsR0FBK0IsRUFBL0IsQ0FKb0IsQ0FJb0I7O0FBQ3hD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LGNBQWMsRUFBRSx3QkFBVUUsTUFBVixFQUFrQm5CLFdBQWxCLEVBQStCO0FBQzNDdEIsSUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QnJDLFNBQVMsQ0FBQzZFLGNBQWpDLEVBQWlEcEIsV0FBakQ7QUFDSCxHQXZPb0I7QUF5T3JCcUIsRUFBQUEsV0FBVyxFQUFFLHVCQUFZO0FBQ3JCLFFBQUlsRSxTQUFTLEdBQUcsRUFBaEI7O0FBQ0EsU0FBSyxJQUFJa0IsQ0FBVCxJQUFjLEtBQUtsQixTQUFuQixFQUE4QjtBQUMxQixVQUFJZ0IsQ0FBQyxHQUFHLEtBQUtoQixTQUFMLENBQWVrQixDQUFmLENBQVI7QUFDQSxVQUFJRixDQUFDLENBQUNHLE1BQUYsSUFBWWxDLFNBQVMsQ0FBQ21DLFdBQVYsQ0FBc0JpQyxTQUF0QyxFQUNJckQsU0FBUyxDQUFDZ0QsSUFBVixDQUFlaEMsQ0FBZjtBQUNQOztBQUNELFFBQUl1QyxLQUFLLENBQUNDLElBQU4sQ0FBV3hELFNBQVgsQ0FBSixFQUEyQjtBQUN2QkEsTUFBQUEsU0FBUyxDQUFDeUQsSUFBVixDQUFlRixLQUFLLENBQUNHLGdCQUFOLENBQXVCLENBQUMsYUFBRCxFQUFnQixJQUFoQixDQUF2QixDQUFmO0FBQ0g7O0FBQ0QsV0FBTzFELFNBQVA7QUFDSCxHQXBQb0I7QUFzUHJCO0FBQ0FtRSxFQUFBQSxlQUFlLEVBQUMseUJBQVNDLElBQVQsRUFBYztBQUMxQixTQUFLQyxjQUFMLEdBQXNCRCxJQUF0QjtBQUNBN0MsSUFBQUEsS0FBSyxDQUFDQyxXQUFOLENBQWtCQyxJQUFsQixDQUF1QnJDLFNBQVMsQ0FBQ2tGLG1CQUFqQyxFQUFxREYsSUFBckQ7QUFDSCxHQTFQb0I7QUE0UHJCRyxFQUFBQSxlQUFlLEVBQUMsMkJBQVU7QUFDdEIsV0FBTyxLQUFLRixjQUFaO0FBQ0g7QUE5UG9CLENBQVQsQ0FBaEIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6L+Z6YeM5aGr5YaZ6K+m57uG6K+05piOLOS4u+imgeWhq+WGmeivpeaooeWdl+eahOWKn+iDveeugOimgVxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDEtMDkgMTE6MjY6MTBcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgVGFza0NvbnN0ID0gcmVxdWlyZShcInRhc2tfY29uc3RcIik7XG52YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpO1xudmFyIFRhc2tFdmVudCA9IHJlcXVpcmUoXCJ0YXNrX2V2ZW50XCIpO1xudmFyIFRhc2tWbyA9IHJlcXVpcmUoXCJ0YXNrX3ZvXCIpO1xuXG52YXIgVGFza01vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICB9LFxuXG4gICAgcHJvcGVydGllczoge1xuICAgIH0sXG5cbiAgICBpbml0Q29uZmlnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMudGFza19saXN0ID0gW107ICAgICAgICAgICAgICAgICAgICAvL+W9k+WJjeaJgOacieS7u+WKoeaVsOaNrlxuICAgICAgICB0aGlzLmZlYXRfbGlzdCA9IHt9OyAgICAgICAgICAgICAgICAgICAgLy/lvZPliY3miJDlsLHmiYDmnInmlbDmja5cbiAgICAgICAgdGhpcy50YXNrX3N0YXR1c19saXN0ID0gW107ICAgICAgICAgICAgIC8v5Lu75YqhaWNvbueahOe6oueCueeKtuaAgVxuICAgICAgICB0aGlzLnVwZGF0ZV9mZWF0X3N0YXR1c19saXN0ID0gW107ICAgICAgLy/lvoXmm7TmlrDmiJDlsLHnirbmgIHvvIzlu7bov5/mm7TmlrDnmoRcbiAgICAgICAgdGhpcy5maW5pc2hfZmVhdF9saXN0ID0gW107XG4gICAgfSxcblxuICAgIC8vIEBkZXNjOumcgOimgeajgOa1i+eahOe6oueCueeKtuaAge+8jOWIhua0u+i3g+W6pu+8jOS7u+WKoeaIluiAheaIkOWwsTPkuK1cbiAgICAvLyBhdXRob3I6e2F1dGhvcn1cbiAgICAvLyB0aW1lOjIwMTgtMDUtMjIgMTU6NTA6NDlcbiAgICAvLyAtLUB0eXBlOiBcbiAgICAvLyByZXR1cm5cbiAgICBjaGVja1F1ZXN0QW5kRmVhdFN0YXR1czogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgdmFyIHJlZF9zdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgaWYgKHR5cGUgPT0gVGFza0NvbnN0LnVwZGF0ZV90eXBlLmFjdGl2aXR5KSB7XG4gICAgICAgICAgICB2YXIgcm9sZV92byA9IFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCk7XG4gICAgICAgICAgICBpZiAocm9sZV92byAhPSBudWxsICYmIHRoaXMuYWN0aXZpdHlfZGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBDb25maWcuYWN0aXZpdHlfZGF0YS5kYXRhX2dldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IENvbmZpZy5hY3Rpdml0eV9kYXRhLmRhdGFfZ2V0W2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZV92by5hY3Rpdml0eSA+PSB2LmFjdGl2aXR5ICYmICF0aGlzLmFjdGl2aXR5X2RhdGFbdi5hY3Rpdml0eV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9zdGF0dXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFRhc2tDb25zdC51cGRhdGVfdHlwZS5xdWVzdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMudGFza19saXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMudGFza19saXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy50YXNrX2xpc3Rba107XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LmZpbmlzaCA9PSBUYXNrQ29uc3QudGFza19zdGF0dXMuZmluaXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRfc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUYXNrQ29uc3QudXBkYXRlX3R5cGUuZmVhdCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmVhdF9saXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZmVhdF9saXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gdGhpcy5mZWF0X2xpc3Rba107XG4gICAgICAgICAgICAgICAgICAgIGlmICh2LmZpbmlzaCA9PSBUYXNrQ29uc3QudGFza19zdGF0dXMuZmluaXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWRfc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWRfc3RhdHVzX2xpc3QgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZWRfc3RhdHVzX2xpc3QgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlZF9zdGF0dXNfbGlzdFt0eXBlXSA9PSBudWxsIHx8ICh0aGlzLnJlZF9zdGF0dXNfbGlzdFt0eXBlXSAhPSBudWxsICYmIHRoaXMucmVkX3N0YXR1c19saXN0W3R5cGVdICE9IHJlZF9zdGF0dXMpKSB7XG4gICAgICAgICAgICB0aGlzLnJlZF9zdGF0dXNfbGlzdFt0eXBlXSA9IHJlZF9zdGF0dXM7XG4gICAgICAgICAgICAvL+aKm+WHuuS6i+S7tuabtOaWsOe6oueCuVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShUYXNrRXZlbnQuVXBkYXRlVUlSZWRTdGF0dXMsIHR5cGUsIHJlZF9zdGF0dXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/nuqLngrnnirbmgIFcbiAgICAgICAgdmFyIG51bSA9IDA7XG4gICAgICAgIGlmIChyZWRfc3RhdHVzID09IHRydWUpXG4gICAgICAgICAgICBudW0gPSAxO1xuICAgICAgICB2YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpO1xuICAgICAgICByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5kYWlseSwge2JpZDp0eXBlLCBudW06bnVtfSlcbiAgICB9LFxuXG4gICAgLy8gQGRlc2M655So5LqO5pel5bi46Z2i5p2/5LiK55qE57qi54K55o6l5Y+j5Yik5patXG4gICAgLy8gYXV0aG9yOnthdXRob3J9XG4gICAgLy8gdGltZToyMDE4LTA1LTI4IDE0OjQxOjE4XG4gICAgLy8gLS1AdHlwZTogXG4gICAgLy8gcmV0dXJuXG4gICAgZ2V0UmVkU3RhdHVzOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICBpZiAodGhpcy5yZWRfc3RhdHVzX2xpc3QgPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICByZXR1cm4gdGhpcy5yZWRfc3RhdHVzX2xpc3RbdHlwZV1cbiAgICB9LFxuXG4gICAgLy8gQGRlc2M65pu05paw5pW05Liq5rS76LeD5bqm5pWw5o2u77yM5Y+q5pyJ5Zyo5LiK57q/5oiW6ICF5pat57q/6YeN6L+e55qE5pe25YCZ5pu05pawXG4gICAgLy8gYXV0aG9yOnthdXRob3J9XG4gICAgLy8gdGltZToyMDE4LTA1LTIyIDE2OjE0OjExXG4gICAgLy8gLS1AZGF0YTogXG4gICAgLy8gcmV0dXJuXG4gICAgdXBkYXRlQWN0aXZpdHlEYXRhOiBmdW5jdGlvbiAoZGF0YV9saXN0KSB7XG4gICAgICAgIHRoaXMuYWN0aXZpdHlfZGF0YSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrIGluIGRhdGFfbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSBkYXRhX2xpc3Rba107XG4gICAgICAgICAgICB0aGlzLmFjdGl2aXR5X2RhdGFbdi5hY3Rpdml0eV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2hlY2tRdWVzdEFuZEZlYXRTdGF0dXMoVGFza0NvbnN0LnVwZGF0ZV90eXBlLmFjdGl2aXR5KTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShUYXNrRXZlbnQuVXBkYXRlQWN0aXZpdHlJbmZvLCB0aGlzLmFjdGl2aXR5X2RhdGEpO1xuICAgIH0sXG5cbiAgICAvLyBAZGVzYzrpooblj5bmn5DkuKrmtLvot4Pluqblrp3nrrHkuYvlkI7nmoTmm7TmlrDvvIzmm7TmlrDljZXkuKrnmoRcbiAgICAvLyBhdXRob3I6e2F1dGhvcn1cbiAgICAvLyB0aW1lOjIwMTgtMDUtMjIgMTY6MTQ6NDBcbiAgICAvLyAtLUBhY3Rpdml0eTogXG4gICAgLy8gcmV0dXJuXG4gICAgdXBkYXRlU2luZ2xlQWN0aXZpdHlEYXRhOiBmdW5jdGlvbiAoYWN0aXZpdHkpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZpdHlfZGF0YSA9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIHRoaXMuYWN0aXZpdHlfZGF0YVthY3Rpdml0eV0gPSB0cnVlO1xuICAgICAgICB0aGlzLmNoZWNrUXVlc3RBbmRGZWF0U3RhdHVzKFRhc2tDb25zdC51cGRhdGVfdHlwZS5hY3Rpdml0eSk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVGFza0V2ZW50LlVwZGF0ZUFjdGl2aXR5SW5mbywgdGhpcy5hY3Rpdml0eV9kYXRhKTtcbiAgICB9LFxuXG4gICAgZ2V0QWN0aXZpdHlEYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2aXR5X2RhdGFcbiAgICB9LFxuXG4gICAgLy9kZXNjOuWinuWKoOaIluiAheabtOaWsOS7u+WKoVxuICAgIC8vdGltZToyMDE4LTA3LTE5IDA1OjU4OjUxXG4gICAgLy9AdGFza19saXN0OlxuICAgIC8vQGlzX3VwZGF0ZTpcbiAgICAvL0ByZXR1cm4gXG4gICAgYWRkVGFza0xpc3Q6IGZ1bmN0aW9uICh0YXNrX2xpc3QsIGlzX3VwZGF0ZSwgaXNfaW5pdCkge1xuICAgICAgICB2YXIgdGFza1ZvLCBjb25maWcgPSBudWxsO1xuICAgICAgICB2YXIgaXNfbmV3ID0gZmFsc2U7XG4gICAgICAgIHZhciBmaW5pc2hfbGlzdCA9IFtdO1xuICAgICAgICBpZiAoaXNfaW5pdCA9PSB0cnVlKVxuICAgICAgICAgICAgdGhpcy50YXNrX2xpc3QgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0YXNrX2xpc3QpIHtcbiAgICAgICAgICAgIHZhciB2ID0gdGFza19saXN0W2ldO1xuICAgICAgICAgICAgY29uZmlnID0gZ2RhdGEoXCJxdWVzdF9kYXRhXCIsIFwiZGF0YV9nZXRcIiwgW3YuaWRdKTtcbiAgICAgICAgICAgIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhc2tfbGlzdFt2LmlkXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFza19saXN0W3YuaWRdID0gbmV3IFRhc2tWbyh2LmlkLCBUYXNrQ29uc3QudHlwZS5xdWVzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlzX25ldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuZmluaXNoID09IDEgJiYgaXNfdXBkYXRlID09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hfbGlzdC5wdXNoKHYuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrVm8gPSB0aGlzLnRhc2tfbGlzdFt2LmlkXTtcbiAgICAgICAgICAgICAgICB0YXNrVm8udXBkYXRlRGF0YSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrUXVlc3RBbmRGZWF0U3RhdHVzKFRhc2tDb25zdC51cGRhdGVfdHlwZS5xdWVzdCk7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVGFza0V2ZW50LlVwZGF0ZVRhc2tMaXN0LCBpc19uZXcsIGZpbmlzaF9saXN0KTtcbiAgICB9LFxuXG4gICAgLy8gQGRlc2M66K6+572u5LiA5Liq5Lu75Yqh5Li65o+Q5Lqk5a6M5oiQ54q25oCBXG4gICAgLy8gYXV0aG9yOnthdXRob3J9XG4gICAgLy8gdGltZToyMDE4LTA1LTIyIDE2OjI3OjQ2XG4gICAgLy8gLS1AaWQ6IFxuICAgIC8vIHJldHVyblxuICAgIHNldFRhc2tDb21wbGV0ZWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICB2YXIgdGFza1ZvID0gdGhpcy50YXNrX2xpc3RbaWRdO1xuICAgICAgICBpZiAodGFza1ZvICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRhc2tWby5zZXRDb21wbGV0ZWRTdGF0dXMoVGFza0NvbnN0LnRhc2tfc3RhdHVzLmNvbXBsZXRlZCk7XG4gICAgICAgICAgICB0aGlzLmNoZWNrUXVlc3RBbmRGZWF0U3RhdHVzKFRhc2tDb25zdC51cGRhdGVfdHlwZS5xdWVzdCk7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKFRhc2tFdmVudC5VcGRhdGVUYXNrTGlzdCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEBkZXNjOuiOt+WPluWFqOmDqOS7u+WKoeWIl+ihqO+8jOi/meS4quagueaNriBmaW5pc2hfc29ydCDlgZrkuobmjpLluo/nmoRcbiAgICAvLyBhdXRob3I6e2F1dGhvcn1cbiAgICAvLyB0aW1lOjIwMTgtMDUtMjIgMTk6MjM6MjNcbiAgICAvLyByZXR1cm5cbiAgICBnZXRUYXNrTGlzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdGFza19saXN0ID0gW107XG4gICAgICAgIGZvciAodmFyIGsgaW4gdGhpcy50YXNrX2xpc3QpIHtcbiAgICAgICAgICAgIHRhc2tfbGlzdC5wdXNoKHRoaXMudGFza19saXN0W2tdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVXRpbHMubmV4dCh0YXNrX2xpc3QpKSB7XG4gICAgICAgICAgICB0YXNrX2xpc3Quc29ydChVdGlscy50YWJsZUxvd2VyU29ydGVyKFtcImZpbmlzaF9zb3J0XCIsIFwiaWRcIl0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFza19saXN0XG4gICAgfSxcblxuICAgIGdldFRhc2tCeUlkOiBmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza19saXN0W2lkXTtcbiAgICB9LFxuXG4gICAgZ2V0RmVhdEJ5SWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0X2xpc3RbaWRdO1xuICAgIH0sXG5cbiAgICAvL2Rlc2M65aKe5Yqg5oiW6ICF5pu05paw5Lu75YqhXG4gICAgLy90aW1lOjIwMTgtMDctMTkgMDU6NTk6MzBcbiAgICAvL0BmZWF0X2xpc3Q6XG4gICAgLy9AaXNfdXBkYXRlOlxuICAgIC8vQHJldHVybiBcbiAgICBhZGRGZWF0TGlzdDogZnVuY3Rpb24gKGZlYXRfbGlzdCwgaXNfdXBkYXRlLCBpc19pbml0KSB7XG4gICAgICAgIHZhciB0YXNrVm8sIGNvbmZpZyA9IG51bGw7XG4gICAgICAgIHZhciBpc19uZXcgPSBmYWxzZTtcbiAgICAgICAgdmFyIGZpbmlzaF9saXN0ID0gW107XG4gICAgICAgIGlmIChpc19pbml0ID09IHRydWUpXG4gICAgICAgICAgICB0aGlzLmZlYXRfbGlzdCA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpIGluIGZlYXRfbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSBmZWF0X2xpc3RbaV07XG4gICAgICAgICAgICBjb25maWcgPSBnZGF0YShcImZlYXRfZGF0YVwiLCBcImRhdGFfZ2V0XCIsIFt2LmlkXSk7XG4gICAgICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mZWF0X2xpc3Rbdi5pZF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXRfbGlzdFt2LmlkXSA9IG5ldyBUYXNrVm8odi5pZCwgVGFza0NvbnN0LnR5cGUuZmVhdCk7XG4gICAgICAgICAgICAgICAgICAgIGlzX25ldyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYuZmluaXNoID09IDEgJiYgaXNfdXBkYXRlID09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hfbGlzdC5wdXNoKHYuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0YXNrVm8gPSB0aGlzLmZlYXRfbGlzdFt2LmlkXTtcbiAgICAgICAgICAgICAgICB0YXNrVm8udXBkYXRlRGF0YSh2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrUXVlc3RBbmRGZWF0U3RhdHVzKFRhc2tDb25zdC51cGRhdGVfdHlwZS5mZWF0KTtcbiAgICAgICAgdGhpcy5uZWVkVXBkYXRlRmVhdChpc19uZXcsIGZpbmlzaF9saXN0KTtcbiAgICB9LFxuXG4gICAgc2V0RmVhdENvbXBsZXRlZDogZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciB0YXNrVm8gPSB0aGlzLmZlYXRfbGlzdFtpZF07XG4gICAgICAgIGlmICh0YXNrVm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGFza1ZvLnNldENvbXBsZXRlZFN0YXR1cyhUYXNrQ29uc3QudGFza19zdGF0dXMuY29tcGxldGVkKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tRdWVzdEFuZEZlYXRTdGF0dXMoVGFza0NvbnN0LnVwZGF0ZV90eXBlLmZlYXQpO1xuICAgICAgICAgICAgdGhpcy5uZWVkVXBkYXRlRmVhdChmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQGRlc2M65piv5ZCm6ZyA6KaB5oqb5Ye65pu05paw5oiQ5bCx55qE5LqL5Lu277yM5Zug5Li65o+Q5Lqk5LiA5Liq5oiQ5bCx5Y+v6IO96Kem5Y+R5paw5aKe5oiQ5bCx77yM5omA5Lul5aaC5p6c6YO95oqb5LqL5Lu255qE6K+d77yM5Lya6Kem5Y+R5aSa5qyh5pu05paw77yM5YGa5bu26L+f5oqb5Ye65pu05paw77yM6YG/5YWN5qyh5pu05pawXG4gICAgLy8gYXV0aG9yOnthdXRob3J9XG4gICAgLy8gdGltZToyMDE4LTA1LTIzIDExOjU2OjA4XG4gICAgLy8gLS1Ac3RhdHVzOiBcbiAgICAvLyByZXR1cm5cbiAgICBuZWVkVXBkYXRlRmVhdDogZnVuY3Rpb24gKHN0YXR1cywgZmluaXNoX2xpc3QpIHtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShUYXNrRXZlbnQuVXBkYXRlRmVhdExpc3QsIGZpbmlzaF9saXN0KTtcbiAgICB9LFxuXG4gICAgZ2V0RmVhdExpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZlYXRfbGlzdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZmVhdF9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuZmVhdF9saXN0W2tdO1xuICAgICAgICAgICAgaWYgKHYuZmluaXNoICE9IFRhc2tDb25zdC50YXNrX3N0YXR1cy5jb21wbGV0ZWQpXG4gICAgICAgICAgICAgICAgZmVhdF9saXN0LnB1c2godik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFV0aWxzLm5leHQoZmVhdF9saXN0KSkge1xuICAgICAgICAgICAgZmVhdF9saXN0LnNvcnQoVXRpbHMudGFibGVMb3dlclNvcnRlcihbXCJmaW5pc2hfc29ydFwiLCBcImlkXCJdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZlYXRfbGlzdFxuICAgIH0sXG5cbiAgICAvL+WtmOi0ruS4u+e6v+S7u+WKoeaVsOaNrlxuICAgIHNldE1haW5UYXNrRGF0YTpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5tYWluX3Rhc2tfZGF0YSA9IGRhdGE7XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoVGFza0V2ZW50LlVwZGF0ZU1haW5RdWVzdFRhc2ssZGF0YSk7XG4gICAgfSxcblxuICAgIGdldE1haW5UYXNrRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5tYWluX3Rhc2tfZGF0YTtcbiAgICB9XG59KTsiXX0=
|