difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/guildboss/guildboss_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, '63353o0oUxMXLyGJQRMY0+Z', 'guildboss_model');
// Scripts/mod/guildboss/guildboss_model.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-01-24 17:44:54
// --------------------------------------------------------------------
var GuildEvent = require("guild_event"); // var ActivityController = require("activity_controller");
 
 
var MainuiController = require("mainui_controller");
 
var MainuiConst = require("mainui_const");
 
var MainuiController = require("mainui_controller");
 
var GuildbossEvent = require("guildboss_event");
 
var GuildConst = require("guild_const");
 
var GuildbossModel = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    var ctrl = require("guildboss_controller");
 
    this.ctrl = ctrl.getInstance();
  },
  properties: {},
  initConfig: function initConfig() {
    this.guildboss_red_list = {};
    this.role_rank_list = {}; //319排行协议列表
  },
  //退出公会的时候清空掉相关的数据
  clearGuildBossInfo: function clearGuildBossInfo() {
    this.base_info = {}; //基础信息
 
    this.first_pass_list = {}; //公会boss首通奖励
 
    this.day_bos_list = {}; //每日宝箱
 
    this.guildboss_red_list = {}; //公会红点相关,主要包含了首通奖励红点,每日击杀红点以及拥有次数的红点
 
    this._initFirstPassData = {}; //首通
  },
  updateGuildRedStatus: function updateGuildRedStatus(bid, status) {
    RedMgr.getInstance().addCalHandler(function () {
      var base_data = Config.function_data.data_base;
      var bool = MainuiController.getInstance().checkIsOpenByActivate(base_data[6].activate);
      if (bool == false) return;
      var _status = this.guildboss_red_list[bid];
      if (_status == status) return;
      this.guildboss_red_list[bid] = status; //更新场景红点状态
 
      cc.log("更新场景红点状态", MainuiConst.btn_index.guild, {
        bid: bid,
        status: status
      });
      MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.guild, {
        bid: bid,
        status: status
      }); //限时活动
 
      var limitRed = false;
 
      if (this.base_info && this.base_info.count) {} // if (ActivityController.getInstance().getBossActivityDoubleTime() == true && this.base_info.count > 0) {
      //     limitRed = true;
      // }
      //事件用于同步更新公会主ui的红点
 
 
      gcore.GlobalEvent.fire(GuildEvent.UpdateGuildRedStatus, bid, status);
    }.bind(this), RedIds.GuildBoss);
  },
  //公会副本是否有红点状态
  checkGuildDunRedStatus: function checkGuildDunRedStatus() {
    for (var k in this.guildboss_red_list) {
      var v = this.guildboss_red_list[k];
      if (v == true) return true;
    }
 
    return false;
  },
  //根据类型获取红点,
  getRedStatusByType: function getRedStatusByType(type) {
    return this.guildboss_red_list[type];
  },
  //公会副本基础信息,或者清除
  updateGuildDunBaseInfo: function updateGuildDunBaseInfo(data) {
    var need_update_red_status = false;
 
    if (this.base_info == null || this.base_info.count != data.count) {
      need_update_red_status = true;
    }
 
    this.base_info = data; // fid:当前id max_id:历史最高副本id count:剩余挑战次数 type:重置类型(0:正常 1:章节回退)buy_count:购买次数
 
    gcore.GlobalEvent.fire(GuildbossEvent.UpdateGuildDunBaseInfo); //判断一下当前的Boss是否能打
    //更新红点
 
    if (need_update_red_status == true) {
      this.updateGuildRedStatus(GuildConst.red_index.boss_times, this.base_info.count > 0);
    }
  },
  //获取挑战次数
  getChangeCount: function getChangeCount() {
    if (this.base_info) {
      if (!this.base_info.count) {
        return false;
      }
 
      if (this.base_info.count > 0) return true;else return false;
    }
  },
  //获取基础信息
  getBaseInfo: function getBaseInfo() {
    return this.base_info;
  },
  //更新剩余挑战次数以及购买次数
  //FALSE为普通购买TRUE为挑战购买
  updateBaseWithTimes: function updateBaseWithTimes(count, buy_count, buy_type) {
    if (this.base_info == null) this.base_info = {};
    this.base_info.count = count;
    this.base_info.buy_count = buy_count;
    gcore.GlobalEvent.fire(GuildbossEvent.UpdateGuildBossChallengeTimes, buy_type); //更新红点
 
    this.updateGuildRedStatus(GuildConst.red_index.boss_times, this.base_info.count > 0);
  },
  getFirstPassRewardList: function getFirstPassRewardList() {
    var return_list = []; //0:未达成
 
    var return_list1 = []; //1:可领取
 
    var return_list2 = []; //2:已领取
 
    if (!this._initFirstPassData.award_list) return;
 
    for (var i in this._initFirstPassData.award_list) {
      var v = this._initFirstPassData.award_list[i];
 
      if (v.status == 0) {
        return_list.push(v);
      } else if (v.status == 1) {
        return_list1.push(v);
      } else if (v.status == 3) {
        return_list2.push(v);
      }
    }
 
    if (return_list.length != 0) {
      for (var i in return_list) {
        var v = return_list[i];
        return_list1.push(v);
      }
    }
 
    if (return_list2.length != 0) {
      for (var i in return_list2) {
        var v = return_list[i];
        return_list1.push(v);
      }
    }
  },
  //根据排名获取伤害排名奖励
  getRankAward: function getRankAward(rank) {
    rank = rank || 1;
 
    for (var k in Config.guild_dun_data.data_rank_reward) {
      var v = gdata("guild_dun_data", "data_rank_reward", [k]);
      if (v.rank1 < rank && rank <= v.rank2) return v.award;
    }
 
    return [];
  },
  //初始化每日宝箱奖励的
  initDayBoxRewardsStatus: function initDayBoxRewardsStatus(data_list) {
    this.day_bos_list = {};
 
    for (var i = 1; i <= Config.guild_dun_data.data_chapter_box_length; i++) {
      this.day_bos_list[i] = 0;
    }
 
    var red_status = false;
 
    for (var i in data_list) {
      var v = data_list[i];
      this.day_bos_list[v.fid] = v.num;
 
      if (v.num > 0 && red_status == false) {
        red_status = true;
      }
    }
 
    gcore.GlobalEvent.fire(GuildbossEvent.UpdateBoxRewardsStatus);
  },
  //更新指定宝箱数量
  updateBoxRewards: function updateBoxRewards(fid, num) {
    if (this.day_bos_list[fid] == null) return;
    this.day_bos_list[fid] = num;
  },
  //返回击杀宝箱的数量状态
  getBoxRewardList: function getBoxRewardList() {
    return this.day_bos_list || {};
  },
  //保存排行榜协议
  setRaknRoleList: function setRaknRoleList(list) {
    this.role_rank_list = list;
  },
  //获取前三个
  getRaknRoleTopThreeList: function getRaknRoleTopThreeList() {
    var list = [{
      rank: 1,
      name: Utils.TI18N("虚位以待")
    }, {
      rank: 2,
      name: Utils.TI18N("虚位以待")
    }, {
      rank: 3,
      name: Utils.TI18N("虚位以待")
    }];
 
    if (this.role_rank_list.rank_list && Utils.next(this.role_rank_list.rank_list || {}) != null) {
      var rank_list = this.role_rank_list.rank_list;
 
      for (var i in rank_list) {
        var v = rank_list[i];
 
        for (var i2 in list) {
          var v1 = list[i2];
 
          if (v.rank == v1.rank) {
            list[i2] = v;
          }
        }
      }
    }
 
    return list;
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxndWlsZGJvc3NcXGd1aWxkYm9zc19tb2RlbC5qcyJdLCJuYW1lcyI6WyJHdWlsZEV2ZW50IiwicmVxdWlyZSIsIk1haW51aUNvbnRyb2xsZXIiLCJNYWludWlDb25zdCIsIkd1aWxkYm9zc0V2ZW50IiwiR3VpbGRDb25zdCIsIkd1aWxkYm9zc01vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJjdHJsIiwiZ2V0SW5zdGFuY2UiLCJwcm9wZXJ0aWVzIiwiaW5pdENvbmZpZyIsImd1aWxkYm9zc19yZWRfbGlzdCIsInJvbGVfcmFua19saXN0IiwiY2xlYXJHdWlsZEJvc3NJbmZvIiwiYmFzZV9pbmZvIiwiZmlyc3RfcGFzc19saXN0IiwiZGF5X2Jvc19saXN0IiwiX2luaXRGaXJzdFBhc3NEYXRhIiwidXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJiaWQiLCJzdGF0dXMiLCJSZWRNZ3IiLCJhZGRDYWxIYW5kbGVyIiwiYmFzZV9kYXRhIiwiQ29uZmlnIiwiZnVuY3Rpb25fZGF0YSIsImRhdGFfYmFzZSIsImJvb2wiLCJjaGVja0lzT3BlbkJ5QWN0aXZhdGUiLCJhY3RpdmF0ZSIsIl9zdGF0dXMiLCJsb2ciLCJidG5faW5kZXgiLCJndWlsZCIsInNldEJ0blJlZFBvaW50IiwibGltaXRSZWQiLCJjb3VudCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJmaXJlIiwiVXBkYXRlR3VpbGRSZWRTdGF0dXMiLCJiaW5kIiwiUmVkSWRzIiwiR3VpbGRCb3NzIiwiY2hlY2tHdWlsZER1blJlZFN0YXR1cyIsImsiLCJ2IiwiZ2V0UmVkU3RhdHVzQnlUeXBlIiwidHlwZSIsInVwZGF0ZUd1aWxkRHVuQmFzZUluZm8iLCJkYXRhIiwibmVlZF91cGRhdGVfcmVkX3N0YXR1cyIsIlVwZGF0ZUd1aWxkRHVuQmFzZUluZm8iLCJyZWRfaW5kZXgiLCJib3NzX3RpbWVzIiwiZ2V0Q2hhbmdlQ291bnQiLCJnZXRCYXNlSW5mbyIsInVwZGF0ZUJhc2VXaXRoVGltZXMiLCJidXlfY291bnQiLCJidXlfdHlwZSIsIlVwZGF0ZUd1aWxkQm9zc0NoYWxsZW5nZVRpbWVzIiwiZ2V0Rmlyc3RQYXNzUmV3YXJkTGlzdCIsInJldHVybl9saXN0IiwicmV0dXJuX2xpc3QxIiwicmV0dXJuX2xpc3QyIiwiYXdhcmRfbGlzdCIsImkiLCJwdXNoIiwibGVuZ3RoIiwiZ2V0UmFua0F3YXJkIiwicmFuayIsImd1aWxkX2R1bl9kYXRhIiwiZGF0YV9yYW5rX3Jld2FyZCIsImdkYXRhIiwicmFuazEiLCJyYW5rMiIsImF3YXJkIiwiaW5pdERheUJveFJld2FyZHNTdGF0dXMiLCJkYXRhX2xpc3QiLCJkYXRhX2NoYXB0ZXJfYm94X2xlbmd0aCIsInJlZF9zdGF0dXMiLCJmaWQiLCJudW0iLCJVcGRhdGVCb3hSZXdhcmRzU3RhdHVzIiwidXBkYXRlQm94UmV3YXJkcyIsImdldEJveFJld2FyZExpc3QiLCJzZXRSYWtuUm9sZUxpc3QiLCJsaXN0IiwiZ2V0UmFrblJvbGVUb3BUaHJlZUxpc3QiLCJuYW1lIiwiVXRpbHMiLCJUSTE4TiIsInJhbmtfbGlzdCIsIm5leHQiLCJpMiIsInYxIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFVBQVUsR0FBR0MsT0FBTyxDQUFDLGFBQUQsQ0FBeEIsRUFDQTs7O0FBQ0EsSUFBSUMsZ0JBQWdCLEdBQUdELE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJRSxXQUFXLEdBQUdGLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlDLGdCQUFnQixHQUFHRCxPQUFPLENBQUMsbUJBQUQsQ0FBOUI7O0FBQ0EsSUFBSUcsY0FBYyxHQUFHSCxPQUFPLENBQUMsaUJBQUQsQ0FBNUI7O0FBQ0EsSUFBSUksVUFBVSxHQUFHSixPQUFPLENBQUMsYUFBRCxDQUF4Qjs7QUFFQSxJQUFJSyxjQUFjLEdBQUdDLEVBQUUsQ0FBQ0MsS0FBSCxD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eUMsSUFBUDtBQUNIO0FBcE15QixDQUFULENBQXJCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAxLTI0IDE3OjQ0OjU0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIEd1aWxkRXZlbnQgPSByZXF1aXJlKFwiZ3VpbGRfZXZlbnRcIik7XG4vLyB2YXIgQWN0aXZpdHlDb250cm9sbGVyID0gcmVxdWlyZShcImFjdGl2aXR5X2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBNYWludWlDb25zdCA9IHJlcXVpcmUoXCJtYWludWlfY29uc3RcIik7XG52YXIgTWFpbnVpQ29udHJvbGxlciA9IHJlcXVpcmUoXCJtYWludWlfY29udHJvbGxlclwiKTtcbnZhciBHdWlsZGJvc3NFdmVudCA9IHJlcXVpcmUoXCJndWlsZGJvc3NfZXZlbnRcIik7XG52YXIgR3VpbGRDb25zdCA9IHJlcXVpcmUoXCJndWlsZF9jb25zdFwiKTtcblxudmFyIEd1aWxkYm9zc01vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBjdHJsID0gcmVxdWlyZShcImd1aWxkYm9zc19jb250cm9sbGVyXCIpO1xuICAgICAgICB0aGlzLmN0cmwgPSBjdHJsLmdldEluc3RhbmNlKCk7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLmd1aWxkYm9zc19yZWRfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnJvbGVfcmFua19saXN0ID0ge307Ly8zMTnmjpLooYzljY/orq7liJfooahcbiAgICB9LFxuXG4gICAgLy/pgIDlh7rlhazkvJrnmoTml7blgJnmuIXnqbrmjonnm7jlhbPnmoTmlbDmja5cbiAgICBjbGVhckd1aWxkQm9zc0luZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5iYXNlX2luZm8gPSB7fTsvL+WfuuehgOS/oeaBr1xuICAgICAgICB0aGlzLmZpcnN0X3Bhc3NfbGlzdCA9IHt9Oy8v5YWs5LyaYm9zc+mmlumAmuWlluWKsVxuICAgICAgICB0aGlzLmRheV9ib3NfbGlzdCA9IHt9Oy8v5q+P5pel5a6d566xXG4gICAgICAgIHRoaXMuZ3VpbGRib3NzX3JlZF9saXN0ID0ge307Ly/lhazkvJrnuqLngrnnm7jlhbPvvIzkuLvopoHljIXlkKvkuobpppbpgJrlpZblirHnuqLngrnvvIzmr4/ml6Xlh7vmnYDnuqLngrnku6Xlj4rmi6XmnInmrKHmlbDnmoTnuqLngrlcbiAgICAgICAgdGhpcy5faW5pdEZpcnN0UGFzc0RhdGEgPSB7fTsvL+mmlumAmlxuICAgIH0sXG5cbiAgICB1cGRhdGVHdWlsZFJlZFN0YXR1czogZnVuY3Rpb24gKGJpZCwgc3RhdHVzKSB7XG4gICAgICAgIFJlZE1nci5nZXRJbnN0YW5jZSgpLmFkZENhbEhhbmRsZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGJhc2VfZGF0YSA9IENvbmZpZy5mdW5jdGlvbl9kYXRhLmRhdGFfYmFzZTtcbiAgICAgICAgICAgIHZhciBib29sID0gTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNoZWNrSXNPcGVuQnlBY3RpdmF0ZShiYXNlX2RhdGFbNl0uYWN0aXZhdGUpO1xuICAgICAgICAgICAgaWYgKGJvb2wgPT0gZmFsc2UpIHJldHVyblxuICAgICAgICAgICAgdmFyIF9zdGF0dXMgPSB0aGlzLmd1aWxkYm9zc19yZWRfbGlzdFtiaWRdO1xuICAgICAgICAgICAgaWYgKF9zdGF0dXMgPT0gc3RhdHVzKSByZXR1cm5cbiAgICAgICAgICAgIHRoaXMuZ3VpbGRib3NzX3JlZF9saXN0W2JpZF0gPSBzdGF0dXM7XG4gICAgICAgICAgICAvL+abtOaWsOWcuuaZr+e6oueCueeKtuaAgVxuICAgICAgICAgICAgY2MubG9nKFwi5pu05paw5Zy65pmv57qi54K554q25oCBXCIsTWFpbnVpQ29uc3QuYnRuX2luZGV4Lmd1aWxkLCB7IGJpZDogYmlkLCBzdGF0dXM6IHN0YXR1cyB9KVxuICAgICAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEJ0blJlZFBvaW50KE1haW51aUNvbnN0LmJ0bl9pbmRleC5ndWlsZCwgeyBiaWQ6IGJpZCwgc3RhdHVzOiBzdGF0dXMgfSk7XG4gICAgICAgICAgICAvL+mZkOaXtua0u+WKqFxuICAgICAgICAgICAgdmFyIGxpbWl0UmVkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8gJiYgdGhpcy5iYXNlX2luZm8uY291bnQpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAoQWN0aXZpdHlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Qm9zc0FjdGl2aXR5RG91YmxlVGltZSgpID09IHRydWUgJiYgdGhpcy5iYXNlX2luZm8uY291bnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGxpbWl0UmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+S6i+S7tueUqOS6juWQjOatpeabtOaWsOWFrOS8muS4u3Vp55qE57qi54K5XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkRXZlbnQuVXBkYXRlR3VpbGRSZWRTdGF0dXMsIGJpZCwgc3RhdHVzKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpLFJlZElkcy5HdWlsZEJvc3MpXG4gICAgfSxcblxuICAgIC8v5YWs5Lya5Ymv5pys5piv5ZCm5pyJ57qi54K554q25oCBXG4gICAgY2hlY2tHdWlsZER1blJlZFN0YXR1czogZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKHZhciBrIGluIHRoaXMuZ3VpbGRib3NzX3JlZF9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuZ3VpbGRib3NzX3JlZF9saXN0W2tdO1xuICAgICAgICAgICAgaWYgKHYgPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH0sXG5cbiAgICAvL+agueaNruexu+Wei+iOt+WPlue6oueCue+8jFxuICAgIGdldFJlZFN0YXR1c0J5VHlwZTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VpbGRib3NzX3JlZF9saXN0W3R5cGVdO1xuICAgIH0sXG5cbiAgICAvL+WFrOS8muWJr+acrOWfuuehgOS/oeaBryzmiJbogIXmuIXpmaRcbiAgICB1cGRhdGVHdWlsZER1bkJhc2VJbmZvOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgbmVlZF91cGRhdGVfcmVkX3N0YXR1cyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5iYXNlX2luZm8gPT0gbnVsbCB8fCB0aGlzLmJhc2VfaW5mby5jb3VudCAhPSBkYXRhLmNvdW50KSB7XG4gICAgICAgICAgICBuZWVkX3VwZGF0ZV9yZWRfc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhc2VfaW5mbyA9IGRhdGE7Ly8gZmlkOuW9k+WJjWlkIG1heF9pZDrljoblj7LmnIDpq5jlia/mnKxpZCBjb3VudDrliankvZnmjJHmiJjmrKHmlbAgdHlwZTrph43nva7nsbvlnovvvIgw77ya5q2j5bi4IDHvvJrnq6DoioLlm57pgIDvvIlidXlfY291bnQ66LSt5Lmw5qyh5pWwXG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRib3NzRXZlbnQuVXBkYXRlR3VpbGREdW5CYXNlSW5mbyk7XG4gICAgICAgIC8v5Yik5pat5LiA5LiL5b2T5YmN55qEQm9zc+aYr+WQpuiDveaJk1xuICAgICAgICAvL+abtOaWsOe6oueCuVxuICAgICAgICBpZiAobmVlZF91cGRhdGVfcmVkX3N0YXR1cyA9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUd1aWxkUmVkU3RhdHVzKEd1aWxkQ29uc3QucmVkX2luZGV4LmJvc3NfdGltZXMsICh0aGlzLmJhc2VfaW5mby5jb3VudCA+IDApKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+iOt+WPluaMkeaImOasoeaVsFxuICAgIGdldENoYW5nZUNvdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VfaW5mbykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmJhc2VfaW5mby5jb3VudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZV9pbmZvLmNvdW50ID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6I635Y+W5Z+656GA5L+h5oGvXG4gICAgZ2V0QmFzZUluZm86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZV9pbmZvO1xuICAgIH0sXG5cbiAgICAvL+abtOaWsOWJqeS9meaMkeaImOasoeaVsOS7peWPiui0reS5sOasoeaVsFxuICAgIC8vRkFMU0XkuLrmma7pgJrotK3kubBUUlVF5Li65oyR5oiY6LSt5LmwXG4gICAgdXBkYXRlQmFzZVdpdGhUaW1lczogZnVuY3Rpb24gKGNvdW50LCBidXlfY291bnQsIGJ1eV90eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VfaW5mbyA9PSBudWxsKVxuICAgICAgICAgICAgdGhpcy5iYXNlX2luZm8gPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX2luZm8uY291bnQgPSBjb3VudDtcbiAgICAgICAgdGhpcy5iYXNlX2luZm8uYnV5X2NvdW50ID0gYnV5X2NvdW50O1xuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEd1aWxkYm9zc0V2ZW50LlVwZGF0ZUd1aWxkQm9zc0NoYWxsZW5nZVRpbWVzLCBidXlfdHlwZSk7XG4gICAgICAgIC8v5pu05paw57qi54K5XG4gICAgICAgIHRoaXMudXBkYXRlR3VpbGRSZWRTdGF0dXMoR3VpbGRDb25zdC5yZWRfaW5kZXguYm9zc190aW1lcywgKHRoaXMuYmFzZV9pbmZvLmNvdW50ID4gMCkpO1xuICAgIH0sXG5cbiAgICBnZXRGaXJzdFBhc3NSZXdhcmRMaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZXR1cm5fbGlzdCA9IFtdOy8vMDrmnKrovr7miJBcbiAgICAgICAgdmFyIHJldHVybl9saXN0MSA9IFtdOy8vMTrlj6/pooblj5ZcbiAgICAgICAgdmFyIHJldHVybl9saXN0MiA9IFtdOy8vMjrlt7Lpooblj5ZcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0Rmlyc3RQYXNzRGF0YS5hd2FyZF9saXN0KSByZXR1cm5cbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9pbml0Rmlyc3RQYXNzRGF0YS5hd2FyZF9saXN0KSB7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuX2luaXRGaXJzdFBhc3NEYXRhLmF3YXJkX2xpc3RbaV07XG4gICAgICAgICAgICBpZiAodi5zdGF0dXMgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybl9saXN0LnB1c2godik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYuc3RhdHVzID09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5fbGlzdDEucHVzaCh2KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodi5zdGF0dXMgPT0gMykge1xuICAgICAgICAgICAgICAgIHJldHVybl9saXN0Mi5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXR1cm5fbGlzdC5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiByZXR1cm5fbGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gcmV0dXJuX2xpc3RbaV07XG4gICAgICAgICAgICAgICAgcmV0dXJuX2xpc3QxLnB1c2godik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldHVybl9saXN0Mi5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiByZXR1cm5fbGlzdDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHJldHVybl9saXN0W2ldO1xuICAgICAgICAgICAgICAgIHJldHVybl9saXN0MS5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5qC55o2u5o6S5ZCN6I635Y+W5Lyk5a6z5o6S5ZCN5aWW5YqxXG4gICAgZ2V0UmFua0F3YXJkOiBmdW5jdGlvbiAocmFuaykge1xuICAgICAgICByYW5rID0gcmFuayB8fCAxO1xuICAgICAgICBmb3IgKHZhciBrIGluIENvbmZpZy5ndWlsZF9kdW5fZGF0YS5kYXRhX3JhbmtfcmV3YXJkKSB7XG4gICAgICAgICAgICB2YXIgdiA9IGdkYXRhKFwiZ3VpbGRfZHVuX2RhdGFcIiwgXCJkYXRhX3JhbmtfcmV3YXJkXCIsIFtrXSk7XG4gICAgICAgICAgICBpZiAodi5yYW5rMSA8IHJhbmsgJiYgcmFuayA8PSB2LnJhbmsyKVxuICAgICAgICAgICAgICAgIHJldHVybiB2LmF3YXJkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdXG4gICAgfSxcblxuICAgIC8v5Yid5aeL5YyW5q+P5pel5a6d566x5aWW5Yqx55qEXG4gICAgaW5pdERheUJveFJld2FyZHNTdGF0dXM6IGZ1bmN0aW9uIChkYXRhX2xpc3QpIHtcbiAgICAgICAgdGhpcy5kYXlfYm9zX2xpc3QgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gQ29uZmlnLmd1aWxkX2R1bl9kYXRhLmRhdGFfY2hhcHRlcl9ib3hfbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGF5X2Jvc19saXN0W2ldID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVkX3N0YXR1cyA9IGZhbHNlO1xuICAgICAgICBmb3IgKHZhciBpIGluIGRhdGFfbGlzdCkge1xuICAgICAgICAgICAgdmFyIHYgPSBkYXRhX2xpc3RbaV07XG4gICAgICAgICAgICB0aGlzLmRheV9ib3NfbGlzdFt2LmZpZF0gPSB2Lm51bTtcbiAgICAgICAgICAgIGlmICh2Lm51bSA+IDAgJiYgcmVkX3N0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJlZF9zdGF0dXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoR3VpbGRib3NzRXZlbnQuVXBkYXRlQm94UmV3YXJkc1N0YXR1cyk7XG4gICAgfSxcblxuICAgIC8v5pu05paw5oyH5a6a5a6d566x5pWw6YePXG4gICAgdXBkYXRlQm94UmV3YXJkczogZnVuY3Rpb24gKGZpZCwgbnVtKSB7XG4gICAgICAgIGlmICh0aGlzLmRheV9ib3NfbGlzdFtmaWRdID09IG51bGwpIHJldHVyblxuICAgICAgICB0aGlzLmRheV9ib3NfbGlzdFtmaWRdID0gbnVtO1xuICAgIH0sXG5cbiAgICAvL+i/lOWbnuWHu+adgOWuneeuseeahOaVsOmHj+eKtuaAgVxuICAgIGdldEJveFJld2FyZExpc3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF5X2Jvc19saXN0IHx8IHt9O1xuICAgIH0sXG5cbiAgICAvL+S/neWtmOaOkuihjOamnOWNj+iurlxuICAgIHNldFJha25Sb2xlTGlzdDpmdW5jdGlvbihsaXN0KXtcbiAgICAgICAgdGhpcy5yb2xlX3JhbmtfbGlzdCA9IGxpc3Q7XG4gICAgfSxcblxuICAgIC8v6I635Y+W5YmN5LiJ5LiqXG4gICAgZ2V0UmFrblJvbGVUb3BUaHJlZUxpc3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgdmFyIGxpc3QgPSBbe3Jhbms6MSxuYW1lOlV0aWxzLlRJMThOKFwi6Jma5L2N5Lul5b6FXCIpfSx7cmFuazoyLG5hbWU6VXRpbHMuVEkxOE4oXCLomZrkvY3ku6XlvoVcIil9LHtyYW5rOjMsbmFtZTpVdGlscy5USTE4TihcIuiZmuS9jeS7peW+hVwiKX1dO1xuICAgICAgICBpZih0aGlzLnJvbGVfcmFua19saXN0LnJhbmtfbGlzdCAmJiBVdGlscy5uZXh0KHRoaXMucm9sZV9yYW5rX2xpc3QucmFua19saXN0IHx8IHt9KSE9IG51bGwpe1xuICAgICAgICAgICAgdmFyIHJhbmtfbGlzdCA9IHRoaXMucm9sZV9yYW5rX2xpc3QucmFua19saXN0O1xuICAgICAgICAgICAgZm9yKHZhciBpIGluIHJhbmtfbGlzdCl7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSByYW5rX2xpc3RbaV07XG4gICAgICAgICAgICAgICAgZm9yKHZhciBpMiBpbiBsaXN0KXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYxID0gbGlzdFtpMl07XG4gICAgICAgICAgICAgICAgICAgIGlmKHYucmFuayA9PSB2MS5yYW5rKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RbaTJdID0gdjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGlzdFxuICAgIH1cblxufSk7Il19