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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hallows/view/hallows_trace_window.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, 'f6b31ozLvBNMIhH+5tRauox', 'hallows_trace_window');
// Scripts/mod/hallows/view/hallows_trace_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     圣印窗体
// <br/>Create: 2019-02-20 14:15:58
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var BackpackController = require("backpack_controller");
 
var Hallows_traceWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("hallows", "hallows_trace_window");
    this.viewTag = SCENE_TAG.dialogue; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Big; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.attr_list = {};
    this.this_use_num = 0;
    this.cost_config = Config.hallows_data.data_const.id_stone;
    this.attr_config = Config.hallows_data.data_const.stone_attribute;
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    this.background = this.root_wnd.getChildByName("background");
    this.background.scale = FIT_SCALE;
    var main_panel = this.root_wnd.getChildByName("main_panel");
    this.background_img = main_panel.getChildByName("background").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_1036"), function (resObject) {
      this.background_img.spriteFrame = resObject;
    }.bind(this));
    this.Image_1 = main_panel.getChildByName("Image_1").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_1037"), function (resObject) {
      this.Image_1.spriteFrame = resObject;
    }.bind(this));
    this.Image_2 = main_panel.getChildByName("Image_2").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_1024"), function (resObject) {
      this.Image_2.spriteFrame = resObject;
    }.bind(this));
    this.Image_5 = main_panel.getChildByName("Image_5").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_90024"), function (resObject) {
      this.Image_5.spriteFrame = resObject;
    }.bind(this));
    this.Sprite_5 = main_panel.getChildByName("Sprite_5").getComponent(cc.Sprite);
    this.Sprite_6 = main_panel.getChildByName("Sprite_6").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_1033"), function (resObject) {
      this.Sprite_5.spriteFrame = resObject;
      this.Sprite_6.spriteFrame = resObject;
    }.bind(this));
    this.Sprite_23 = main_panel.getChildByName("Sprite_23").getComponent(cc.Sprite);
    this.Sprite_23_0 = main_panel.getChildByName("Sprite_23_0").getComponent(cc.Sprite);
    this.loadRes(PathTool.getCommonIcomPath("common_1016"), function (resObject) {
      this.Sprite_23.spriteFrame = resObject;
      this.Sprite_23_0.spriteFrame = resObject;
    }.bind(this));
    var win_title = main_panel.getChildByName("win_title").getComponent(cc.Label);
    win_title.string = Utils.TI18N("圣印");
    var attr_title = main_panel.getChildByName("attr_title").getComponent(cc.Label);
    attr_title.string = Utils.TI18N("当前属性");
    var desc = main_panel.getChildByName("desc").getComponent(cc.Label);
    desc.string = Utils.TI18N("来源:充值活动");
    this.cost_item = ItemsPool.getInstance().getItem("backpack_item");
    this.cost_item.setParent(main_panel);
    this.cost_item.setPosition(336 - main_panel.width / 2, 290 - main_panel.height / 2);
    this.cost_item.initConfig(false, 1, false, true);
    this.cost_item.show();
    this.can_use_label = main_panel.getChildByName("can_use_label").getComponent(cc.RichText);
    this.max_btn = main_panel.getChildByName("max_btn");
    this.plus_btn = main_panel.getChildByName("plus_btn");
    this.min_btn = main_panel.getChildByName("min_btn");
    this.slider = main_panel.getChildByName("slider").getComponent(cc.Slider); // 滑块
 
    this.progress = main_panel.getChildByName("ProgressBar").getComponent(cc.ProgressBar);
    this.upgrade_btn = main_panel.getChildByName("upgrade_btn");
    this.upgrade_btn_label = this.upgrade_btn.getChildByName("label").getComponent(cc.Label);
    this.upgrade_btn_label.string = Utils.TI18N("使用");
 
    for (var i = 1; i < 3; i++) {
      var attr = main_panel.getChildByName("attr_" + i);
 
      if (attr) {
        var object = {};
        object.item = attr;
        object.icon = attr.getChildByName("icon").getComponent(cc.Sprite);
        object.label = attr.getChildByName("label").getComponent(cc.Label);
        this.attr_list[i] = object;
      }
    }
 
    this.close_btn = main_panel.getChildByName("close_btn");
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    this.background.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Close);
      this.ctrl.openHallowsTraceWindow(false);
    }, this);
    this.close_btn.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Close);
      this.ctrl.openHallowsTraceWindow(false);
    }, this);
    this.upgrade_btn.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Close);
 
      if (this.data) {
        if (this.this_use_num == 0) {
          this.ctrl.openHallowsTraceWindow(false);
        } else {
          if (this.num == 0) {
            message(Utils.TI18N("使用数量不能为0"));
          } else {
            this.ctrl.requestUseTraceItem(this.data.id, this.num);
          }
        }
      }
    }, this);
    this.slider.node.on("slide", function () {
      this.setComposeNumByPercent(this.slider.progress);
      this.progress.progress = this.slider.progress;
    }, this);
    this.min_btn.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Normal);
      var percent = this.slider.progress;
      if (percent == 0) return;
      if (this.num == 0) return;
      if (this.this_use_num == 0) return;
      this.num = this.num - 1;
      this.setComposeNum(this.num);
    }, this);
    this.plus_btn.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Normal);
      var percent = this.slider.progress;
      if (percent == 1) return;
      if (this.this_use_num == 0) return;
      if (this.num >= this.this_use_num) return;
      this.num = this.num + 1;
      this.setComposeNum(this.num);
    }, this);
    this.max_btn.on(cc.Node.EventType.TOUCH_END, function () {
      Utils.playButtonSound(ButtonSound.Normal);
      var percent = this.slider.progress;
      if (percent == 1) return;
      if (this.this_use_num == 0) return;
      if (this.num >= this.this_use_num) return;
      this.num = this.this_use_num;
      this.setComposeNum(this.num);
    }, this);
  },
  setComposeNum: function setComposeNum(num) {
    this.num = num;
    var percent = this.num / this.this_use_num || 0;
    this.slider.progress = percent;
    this.progress.progress = this.slider.progress;
    this.fileNum(num);
  },
  setComposeNumByPercent: function setComposeNumByPercent(percent) {
    this.num = Math.floor(percent * this.this_use_num);
    this.fileNum(this.num);
  },
  fileNum: function fileNum(num) {
    if (this.had_max_num == null) return;
    this.cost_item.setNeedNum(num, this.had_max_num);
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(data) {
    this.data = data;
 
    if (data && data.vo && this.cost_config) {
      this.had_use_num = data.vo.seal; // 当前使用的数量
 
      this.use_max_num = this.getUseMaxNum(); // 当前最高可使用数量
      //数据异常
 
      if (this.use_max_num == 0) return;
      var max_step = Config.hallows_data.data_max_lev[this.data.id];
      if (max_step == null) return;
      var step = this.data.vo.step; //没吃满,都显示可以使用的
 
      if (this.had_use_num < this.use_max_num) {
        this.can_use_label.string = cc.js.formatStr(Utils.TI18N("当前已使用:%s/%s"), this.had_use_num, this.use_max_num);
      } else {
        if (step >= max_step) {
          //已经满级的
          this.can_use_label.string = cc.js.formatStr(Utils.TI18N("已达最大使用数量:%s/%s"), this.had_use_num, this.use_max_num);
        } else {
          //找出下一阶的
          var next_config = gdata("hallows_data", "data_trace_cost", Utils.getNorKey(this.data.id, step + 1));
 
          if (next_config) {
            this.can_use_label.string = cc.js.formatStr(Utils.TI18N("圣器%s阶可增加使用数量:%s"), step + 1, next_config.num - this.had_use_num);
          }
        }
      }
 
      this.can_use_num = this.use_max_num - this.had_use_num; // 当前剩余可使用数量
 
      if (this.can_use_num < 0) {
        this.can_use_num = 0;
      } //当前背包中数量
 
 
      this.had_max_num = BackpackController.getInstance().getModel().getItemNumByBid(this.cost_config.val); // 背包中总数量
 
      var itemVo = {
        bid: this.cost_config.val,
        num: this.had_max_num
      };
      this.cost_item.setData(itemVo);
      this.this_use_num = Math.min(this.can_use_num, this.had_max_num); //这次最多可使用的数量
 
      this.num = this.this_use_num; // 当前数量
 
      this.setComposeNum(this.num);
      this.setBaseAttrList();
    }
  },
  //设置当前圣印总属性
  setBaseAttrList: function setBaseAttrList() {
    if (this.cost_config == null || this.attr_config == null) return;
 
    if (this.had_use_num == null) {
      this.had_use_num = 0;
    }
 
    for (var i in this.attr_list) {
      this.attr_list[i].item.active = false;
    }
 
    for (var j in this.attr_config.val) {
      var v = this.attr_config.val[j];
      var attr_key = v[0];
      var attr_val = v[1] * this.had_use_num;
      var attr_name = Config.attr_data.data_key_to_name[attr_key];
 
      if (attr_name) {
        var attr_icon = PathTool.getAttrIconByStr(attr_key);
        var attr_str = cc.js.formatStr(Utils.TI18N(" %s +%s"), attr_name, attr_val);
        var object = this.attr_list[parseInt(j) + 1];
 
        if (object) {
          object.item.active = true;
          var res = PathTool.getCommonIcomPath(attr_icon);
          this.loadRes(res, function (icon, sf_obj) {
            icon.spriteFrame = sf_obj;
          }.bind(this, object.icon));
          object.label.string = attr_str;
        }
      }
    }
  },
  //返回当前阶数最大可使用的数量的配置表
  getUseMaxNum: function getUseMaxNum() {
    if (this.data == null || this.data.vo == null) return;
    var trace_cost_config = gdata("hallows_data", "data_trace_cost", Utils.getNorKey(this.data.id, this.data.vo.step));
 
    if (trace_cost_config) {
      return trace_cost_config.num;
    }
 
    return 0;
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.cost_item) {
      this.cost_item.onDelete();
    }
 
    this.cost_item = null;
    this.ctrl.openHallowsTraceWindow(false);
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoYWxsb3dzXFx2aWV3XFxoYWxsb3dzX3RyYWNlX3dpbmRvdy5qcyJdLCJuYW1lcyI6WyJQYXRoVG9vbCIsInJlcXVpcmUiLCJCYWNrcGFja0NvbnRyb2xsZXIiLCJIYWxsb3dzX3RyYWNlV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsImRpYWxvZ3VlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiQmlnIiwiY3RybCIsImFyZ3VtZW50cyIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJpbml0Q29uZmlnIiwiYXR0cl9saXN0IiwidGhpc191c2VfbnVtIiwiY29zdF9jb25maWciLCJDb25maWciLCJoYWxsb3dzX2RhdGEiLCJkYXRhX2NvbnN0IiwiaWRfc3RvbmUiLCJhdHRyX2NvbmZpZyIsInN0b25lX2F0dHJpYnV0ZSIsIm9wZW5DYWxsQmFjayIsImJhY2tncm91bmQiLCJyb290X3duZCIsImdldENoaWxkQnlOYW1lIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJtYWluX3BhbmVsIiwiYmFja2dyb3VuZF9pbWciLCJnZXRDb21wb25lbnQiLCJTcHJpdGUiLCJsb2FkUmVzIiwiZ2V0Q29tbW9uSWNvbVBhdGgiLCJyZXNPYmplY3QiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJJbWFnZV8xIiwiSW1hZ2VfMiIsIkltYWdlXzUiLCJTcHJpdGVfNSIsIlNwcml0ZV82IiwiU3ByaXRlXzIzIiwiU3ByaXRlXzIzXzAiLCJ3aW5fdGl0bGUiLCJMYWJlbCIsInN0cmluZyIsIlV0aWxzIiwiVEkxOE4iLCJhdHRyX3RpdGxlIiwiZGVzYyIsImNvc3RfaXRlbSIsIkl0ZW1zUG9vbCIsImdldEluc3RhbmNlIiwiZ2V0SXRlbSIsInNldFBhcmVudCIsInNldFBvc2l0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJzaG93IiwiY2FuX3VzZV9sYWJlbCIsIlJpY2hUZXh0IiwibWF4X2J0biIsInBsdXNfYnRuIiwibWluX2J0biIsInNsaWRlciIsIlNsaWRlciIsInByb2dyZXNzIiwiUHJvZ3Jlc3NCYXIiLCJ1cGdyYWRlX2J0biIsInVwZ3JhZGVfYnRuX2xhYmVsIiwiaSIsImF0dHIiLCJvYmplY3QiLCJpdGVtIiwiaWNvbiIsImxhYmVsIiwiY2xvc2VfYnRuIiwicmVnaXN0ZXJFdmVudCIsIm9uIiwiTm9kZSIsIkV2ZW50VHlwZSIsIlRPVUNIX0VORCIsInBsYXlCdXR0b25Tb3VuZCIsIkJ1dHRvblNvdW5kIiwiQ2xvc2UiLCJvcGVuSGFsbG93c1RyYWNlV2luZG93IiwiZGF0YSIsIm51bSIsIm1lc3NhZ2UiLCJyZXF1ZXN0VXNlVHJhY2VJdGVtIiwiaWQiLCJub2RlIiwic2V0Q29tcG9zZU51bUJ5UGVyY2VudCIsIk5vcm1hbCIsInBlcmNlbnQiLCJzZXRDb21wb3NlTnVtIiwiZmlsZU51bSIsIk1hdGgiLCJmbG9vciIsImhhZF9tYXhfbnVtIiwic2V0TmVlZE51bSIsIm9wZW5Sb290V25kIiwidm8iLCJoYWRfdXNlX251bSIsInNlYWwiLCJ1c2VfbWF4X251bSIsImdldFVzZU1heE51bSIsIm1heF9zdGVwIiwiZGF0YV9tYXhfbGV2Iiwic3RlcCIsImpzIiwiZm9ybWF0U3RyIiwibmV4dF9jb25maWciLCJnZGF0YSIsImdldE5vcktleSIsImNhbl91c2VfbnVtIiwiZ2V0SXRlbU51bUJ5QmlkIiwidmFsIiwiaXRlbVZvIiwiYmlkIiwic2V0RGF0YSIsIm1pbiIsInNldEJhc2VBdHRyTGlzdCIsImFjdGl2ZSIsImoiLCJ2IiwiYXR0cl9rZXkiLCJhdHRyX3ZhbCIsImF0dHJfbmFtZSIsImF0dHJfZGF0YSIsImRhdGFfa2V5X3RvX25hbWUiLCJhdHRyX2ljb24iLCJnZXRBdHRySWNvbkJ5U3RyIiwiYXR0cl9zdHIiLCJwYXJzZUludCIsInJlcyIsInNmX29iaiIsInRyYWNlX2Nvc3RfY29uZmlnIiwiY2xvc2VDYWxsQmFjayIsIm9uRGVsZXRlIl0s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QUFVN0QsSUFBVixFQUFlOEQsTUFBZixFQUF1QjtBQUNyQzlELFlBQUFBLElBQUksQ0FBQ3hDLFdBQUwsR0FBbUJzRyxNQUFuQjtBQUNILFdBRmlCLENBRWhCckcsSUFGZ0IsQ0FFWCxJQUZXLEVBRU5xQyxNQUFNLENBQUNFLElBRkQsQ0FBbEI7QUFHQUYsVUFBQUEsTUFBTSxDQUFDRyxLQUFQLENBQWE5QixNQUFiLEdBQXNCd0YsUUFBdEI7QUFDSDtBQUNKO0FBQ0o7QUFDSixHQS9QOEI7QUFpUS9CO0FBQ0EzQixFQUFBQSxZQUFZLEVBQUMsd0JBQVU7QUFDbkIsUUFBRyxLQUFLcEIsSUFBTCxJQUFhLElBQWIsSUFBcUIsS0FBS0EsSUFBTCxDQUFVZ0IsRUFBVixJQUFnQixJQUF4QyxFQUE2QztBQUM3QyxRQUFJbUMsaUJBQWlCLEdBQUd4QixLQUFLLENBQUMsY0FBRCxFQUFnQixpQkFBaEIsRUFBa0NuRSxLQUFLLENBQUNvRSxTQUFOLENBQWdCLEtBQUs1QixJQUFMLENBQVVJLEVBQTFCLEVBQThCLEtBQUtKLElBQUwsQ0FBVWdCLEVBQVYsQ0FBYU8sSUFBM0MsQ0FBbEMsQ0FBN0I7O0FBQ0EsUUFBRzRCLGlCQUFILEVBQXFCO0FBQ2pCLGFBQU9BLGlCQUFpQixDQUFDbEQsR0FBekI7QUFDSDs7QUFDRCxXQUFPLENBQVA7QUFDSCxHQXpROEI7QUEyUS9CO0FBQ0FtRCxFQUFBQSxhQUFhLEVBQUMseUJBQVU7QUFDcEIsUUFBRyxLQUFLeEYsU0FBUixFQUFrQjtBQUNkLFdBQUtBLFNBQUwsQ0FBZXlGLFFBQWY7QUFDSDs7QUFDRCxTQUFLekYsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFNBQUszQyxJQUFMLENBQVU4RSxzQkFBVixDQUFpQyxLQUFqQztBQUNIO0FBbFI4QixDQUFULENBQTFCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAg5Zyj5Y2w56qX5L2TXG4vLyA8YnIvPkNyZWF0ZTogMjAxOS0wMi0yMCAxNDoxNTo1OFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYWNrcGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcblxudmFyIEhhbGxvd3NfdHJhY2VXaW5kb3cgPSBjYy5DbGFzcyh7XG4gICAgZXh0ZW5kczogQmFzZVZpZXcsXG4gICAgY3RvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiaGFsbG93c1wiLCBcImhhbGxvd3NfdHJhY2Vfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcuZGlhbG9ndWU7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5CaWc7ICAgICAgICAgICAgICAgLy/mmK/lkKbmmK/lhajlsY/nqpfkvZMgIFdpblR5cGUuRnVsbCwgV2luVHlwZS5CaWcsIFdpblR5cGUuTWluaSwgV2luVHlwZS5UaXBzXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmF0dHJfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnRoaXNfdXNlX251bSA9IDA7XG4gICAgICAgIHRoaXMuY29zdF9jb25maWcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfY29uc3QuaWRfc3RvbmU7XG4gICAgICAgIHRoaXMuYXR0cl9jb25maWcgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfY29uc3Quc3RvbmVfYXR0cmlidXRlO1xuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI7nmoTlm57osIMs5Y+v5Lul5Zyo6L+Z6YeM5o2V6I6355u45YWz6IqC54K55oiW6ICF57uE5Lu2XG4gICAgb3BlbkNhbGxCYWNrOmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJiYWNrZ3JvdW5kXCIpO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQuc2NhbGUgPSBGSVRfU0NBTEU7XG4gICAgICAgIHZhciBtYWluX3BhbmVsID0gdGhpcy5yb290X3duZC5nZXRDaGlsZEJ5TmFtZShcIm1haW5fcGFuZWxcIilcblxuICAgICAgICB0aGlzLmJhY2tncm91bmRfaW1nID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImJhY2tncm91bmRcIikuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRoaXMubG9hZFJlcyhQYXRoVG9vbC5nZXRDb21tb25JY29tUGF0aChcImNvbW1vbl8xMDM2XCIpLCAoZnVuY3Rpb24ocmVzT2JqZWN0KXtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZF9pbWcuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuSW1hZ2VfMSA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8xXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAzN1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLkltYWdlXzEuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuSW1hZ2VfMiA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV8yXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAyNFwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLkltYWdlXzIuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuSW1hZ2VfNSA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJJbWFnZV81XCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fOTAwMjRcIiksIChmdW5jdGlvbihyZXNPYmplY3Qpe1xuICAgICAgICAgICAgdGhpcy5JbWFnZV81LnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLlNwcml0ZV81ID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV81XCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLlNwcml0ZV82ID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV82XCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAzM1wiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLlNwcml0ZV81LnNwcml0ZUZyYW1lID0gcmVzT2JqZWN0O1xuICAgICAgICAgICAgdGhpcy5TcHJpdGVfNi5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgdGhpcy5TcHJpdGVfMjMgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiU3ByaXRlXzIzXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLlNwcml0ZV8yM18wID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcIlNwcml0ZV8yM18wXCIpLmdldENvbXBvbmVudChjYy5TcHJpdGUpO1xuICAgICAgICB0aGlzLmxvYWRSZXMoUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoXCJjb21tb25fMTAxNlwiKSwgKGZ1bmN0aW9uKHJlc09iamVjdCl7XG4gICAgICAgICAgICB0aGlzLlNwcml0ZV8yMy5zcHJpdGVGcmFtZSA9IHJlc09iamVjdDtcbiAgICAgICAgICAgIHRoaXMuU3ByaXRlXzIzXzAuc3ByaXRlRnJhbWUgPSByZXNPYmplY3Q7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHZhciB3aW5fdGl0bGUgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwid2luX3RpdGxlXCIpLmdldENvbXBvbmVudChjYy5MYWJlbCk7XG4gICAgICAgIHdpbl90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuWco+WNsFwiKTtcbiAgICAgICAgXG4gICAgICAgIHZhciBhdHRyX3RpdGxlID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImF0dHJfdGl0bGVcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgYXR0cl90aXRsZS5zdHJpbmcgPSBVdGlscy5USTE4TihcIuW9k+WJjeWxnuaAp1wiKTtcbiAgICAgICAgXG4gICAgICAgIHZhciBkZXNjID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImRlc2NcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgZGVzYy5zdHJpbmcgPSBVdGlscy5USTE4TihcIuadpea6kDrlhYXlgLzmtLvliqhcIik7XG4gICAgIFxuICAgICAgICB0aGlzLmNvc3RfaXRlbSA9IEl0ZW1zUG9vbC5nZXRJbnN0YW5jZSgpLmdldEl0ZW0oXCJiYWNrcGFja19pdGVtXCIpO1xuICAgICAgICB0aGlzLmNvc3RfaXRlbS5zZXRQYXJlbnQobWFpbl9wYW5lbCk7XG4gICAgICAgIHRoaXMuY29zdF9pdGVtLnNldFBvc2l0aW9uKDMzNi1tYWluX3BhbmVsLndpZHRoLzIsIDI5MCAtIG1haW5fcGFuZWwuaGVpZ2h0LzIpO1xuICAgICAgICB0aGlzLmNvc3RfaXRlbS5pbml0Q29uZmlnKGZhbHNlLCAxLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuY29zdF9pdGVtLnNob3coKTtcbiAgICAgICAgdGhpcy5jYW5fdXNlX2xhYmVsID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNhbl91c2VfbGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KVxuICAgIFxuICAgICAgICB0aGlzLm1heF9idG4gPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwibWF4X2J0blwiKVxuICAgICAgICB0aGlzLnBsdXNfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInBsdXNfYnRuXCIpXG4gICAgICAgIHRoaXMubWluX2J0biA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJtaW5fYnRuXCIpXG4gICAgICAgIHRoaXMuc2xpZGVyID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInNsaWRlclwiKS5nZXRDb21wb25lbnQoY2MuU2xpZGVyKTsvLyDmu5HlnZdcbiAgICAgICAgdGhpcy5wcm9ncmVzcyA9IG1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJQcm9ncmVzc0JhclwiKS5nZXRDb21wb25lbnQoY2MuUHJvZ3Jlc3NCYXIpO1xuICAgIFxuICAgICAgICB0aGlzLnVwZ3JhZGVfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInVwZ3JhZGVfYnRuXCIpXG4gICAgICAgIHRoaXMudXBncmFkZV9idG5fbGFiZWwgPSB0aGlzLnVwZ3JhZGVfYnRuLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy51cGdyYWRlX2J0bl9sYWJlbC5zdHJpbmcgPSBVdGlscy5USTE4TihcIuS9v+eUqFwiKTtcblxuICAgICAgICBmb3IodmFyIGkgPSAxO2k8MztpKyspe1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBtYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiYXR0cl9cIitpKTtcbiAgICAgICAgICAgIGlmKGF0dHIpe1xuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICAgICAgICAgICAgICBvYmplY3QuaXRlbSA9IGF0dHI7XG4gICAgICAgICAgICAgICAgb2JqZWN0Lmljb24gPSBhdHRyLmdldENoaWxkQnlOYW1lKFwiaWNvblwiKS5nZXRDb21wb25lbnQoY2MuU3ByaXRlKTtcbiAgICAgICAgICAgICAgICBvYmplY3QubGFiZWwgPSBhdHRyLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIikuZ2V0Q29tcG9uZW50KGNjLkxhYmVsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmF0dHJfbGlzdFtpXSA9IG9iamVjdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gbWFpbl9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNsb3NlX2J0blwiKVxuICAgIH0sXG5cbiAgICAvLyDms6jlhozkuovku7bnm5HlkKznmoTmjqXlj6Ms5LiN6ZyA6KaB5omL5Yqo6LCD55SoLOWmguaenOaYr+S9v+eUqGdjb3JlLkdsb2JhbEV2ZW5055uR5ZCsLOWPr+S7peebtOaOpeiwg+eUqGFkZEdsb2JhbEV2ZW50XG4gICAgcmVnaXN0ZXJFdmVudDpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmJhY2tncm91bmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuQ2xvc2UpO1xuICAgICAgICAgICAgdGhpcy5jdHJsLm9wZW5IYWxsb3dzVHJhY2VXaW5kb3coZmFsc2UpO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLkNsb3NlKTtcbiAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1RyYWNlV2luZG93KGZhbHNlKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnVwZ3JhZGVfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbHMucGxheUJ1dHRvblNvdW5kKEJ1dHRvblNvdW5kLkNsb3NlKTtcbiAgICAgICAgICAgIGlmKHRoaXMuZGF0YSl7XG4gICAgICAgICAgICAgICAgaWYodGhpcy50aGlzX3VzZV9udW0gPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3RybC5vcGVuSGFsbG93c1RyYWNlV2luZG93KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5udW0gPT0gMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKFwi5L2/55So5pWw6YeP5LiN6IO95Li6MFwiKSlcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0cmwucmVxdWVzdFVzZVRyYWNlSXRlbSh0aGlzLmRhdGEuaWQsIHRoaXMubnVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcylcblxuICAgICAgICB0aGlzLnNsaWRlci5ub2RlLm9uKFwic2xpZGVcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5zZXRDb21wb3NlTnVtQnlQZXJjZW50KHRoaXMuc2xpZGVyLnByb2dyZXNzKTtcbiAgICAgICAgICAgIHRoaXMucHJvZ3Jlc3MucHJvZ3Jlc3MgPSB0aGlzLnNsaWRlci5wcm9ncmVzcztcbiAgICAgICAgfSx0aGlzKVxuXG4gICAgICAgIHRoaXMubWluX2J0bi5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWxzLnBsYXlCdXR0b25Tb3VuZChCdXR0b25Tb3VuZC5Ob3JtYWwpO1xuICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSB0aGlzLnNsaWRlci5wcm9ncmVzcztcbiAgICAgICAgICAgIGlmKHBlcmNlbnQgPT0gMClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLm51bSA9PSAwKXJldHVybjtcbiAgICAgICAgICAgIGlmKHRoaXMudGhpc191c2VfbnVtID09IDApcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5udW0gPSB0aGlzLm51bSAtIDE7XG4gICAgICAgICAgICB0aGlzLnNldENvbXBvc2VOdW0odGhpcy5udW0pO1xuICAgICAgICB9LCB0aGlzKVxuXG4gICAgICAgIHRoaXMucGx1c19idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDEpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy50aGlzX3VzZV9udW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLm51bSA+PSB0aGlzLnRoaXNfdXNlX251bSlyZXR1cm47XG4gICAgICAgICAgICB0aGlzLm51bSA9IHRoaXMubnVtICsgMTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29tcG9zZU51bSh0aGlzLm51bSk7XG4gICAgICAgIH0sIHRoaXMpXG5cblxuICAgICAgICB0aGlzLm1heF9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlscy5wbGF5QnV0dG9uU291bmQoQnV0dG9uU291bmQuTm9ybWFsKTtcbiAgICAgICAgICAgIHZhciBwZXJjZW50ID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgICAgICBpZihwZXJjZW50ID09IDEpcmV0dXJuO1xuICAgICAgICAgICAgaWYodGhpcy50aGlzX3VzZV9udW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICBpZih0aGlzLm51bSA+PSB0aGlzLnRoaXNfdXNlX251bSlyZXR1cm47XG4gICAgICAgICAgICB0aGlzLm51bSA9IHRoaXMudGhpc191c2VfbnVtO1xuICAgICAgICAgICAgdGhpcy5zZXRDb21wb3NlTnVtKHRoaXMubnVtKTtcbiAgICAgICAgfSwgdGhpcylcblxuICAgIH0sXG5cbiAgICBzZXRDb21wb3NlTnVtOmZ1bmN0aW9uKG51bSl7XG4gICAgICAgIHRoaXMubnVtID0gbnVtO1xuICAgICAgICB2YXIgcGVyY2VudCA9IHRoaXMubnVtIC8gdGhpcy50aGlzX3VzZV9udW0gfHwgMDtcbiAgICAgICAgdGhpcy5zbGlkZXIucHJvZ3Jlc3MgPSBwZXJjZW50O1xuICAgICAgICB0aGlzLnByb2dyZXNzLnByb2dyZXNzID0gdGhpcy5zbGlkZXIucHJvZ3Jlc3M7XG4gICAgICAgIHRoaXMuZmlsZU51bShudW0pO1xuICAgIH0sXG5cbiAgICBzZXRDb21wb3NlTnVtQnlQZXJjZW50OmZ1bmN0aW9uKHBlcmNlbnQpe1xuICAgICAgICB0aGlzLm51bSA9IE1hdGguZmxvb3IoIHBlcmNlbnQgKiB0aGlzLnRoaXNfdXNlX251bSApXG4gICAgICAgIHRoaXMuZmlsZU51bSh0aGlzLm51bSk7XG4gICAgfSxcblxuICAgIGZpbGVOdW06ZnVuY3Rpb24obnVtKXtcbiAgICAgICAgaWYodGhpcy5oYWRfbWF4X251bSA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdGhpcy5jb3N0X2l0ZW0uc2V0TmVlZE51bShudW0gLCB0aGlzLmhhZF9tYXhfbnVtKVxuICAgIH0sXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICAgICAgaWYoZGF0YSAmJiBkYXRhLnZvICYmIHRoaXMuY29zdF9jb25maWcpe1xuICAgICAgICAgICAgdGhpcy5oYWRfdXNlX251bSA9IGRhdGEudm8uc2VhbDsgICAgICAgICAgICAgLy8g5b2T5YmN5L2/55So55qE5pWw6YePXG4gICAgICAgICAgICB0aGlzLnVzZV9tYXhfbnVtID0gdGhpcy5nZXRVc2VNYXhOdW0oKTsgICAgICAvLyDlvZPliY3mnIDpq5jlj6/kvb/nlKjmlbDph49cblxuICAgICAgICAgICAgLy/mlbDmja7lvILluLhcbiAgICAgICAgICAgIGlmKHRoaXMudXNlX21heF9udW0gPT0gMClyZXR1cm47XG4gICAgICAgICAgICB2YXIgbWF4X3N0ZXAgPSBDb25maWcuaGFsbG93c19kYXRhLmRhdGFfbWF4X2xldlt0aGlzLmRhdGEuaWRdO1xuICAgICAgICAgICAgaWYobWF4X3N0ZXAgPT0gbnVsbClyZXR1cm47XG4gICAgICAgICAgICB2YXIgc3RlcCA9IHRoaXMuZGF0YS52by5zdGVwO1xuICAgICAgICAgICAgLy/msqHlkIPmu6Es6YO95pi+56S65Y+v5Lul5L2/55So55qEXG4gICAgICAgICAgICBpZih0aGlzLmhhZF91c2VfbnVtIDwgdGhpcy51c2VfbWF4X251bSl7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5fdXNlX2xhYmVsLnN0cmluZyA9IGNjLmpzLmZvcm1hdFN0cihVdGlscy5USTE4TihcIuW9k+WJjeW3suS9v+eUqDolcy8lc1wiKSwgdGhpcy5oYWRfdXNlX251bSwgdGhpcy51c2VfbWF4X251bSk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZihzdGVwID49IG1heF9zdGVwKXsvL+W3sue7j+a7oee6p+eahFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbl91c2VfbGFiZWwuc3RyaW5nID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwi5bey6L6+5pyA5aSn5L2/55So5pWw6YePOiVzLyVzXCIpLCB0aGlzLmhhZF91c2VfbnVtLCB0aGlzLnVzZV9tYXhfbnVtKVxuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAvL+aJvuWHuuS4i+S4gOmYtueahFxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dF9jb25maWcgPSBnZGF0YShcImhhbGxvd3NfZGF0YVwiLFwiZGF0YV90cmFjZV9jb3N0XCIsVXRpbHMuZ2V0Tm9yS2V5KHRoaXMuZGF0YS5pZCwgc3RlcCsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKG5leHRfY29uZmlnKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuX3VzZV9sYWJlbC5zdHJpbmcgPSBjYy5qcy5mb3JtYXRTdHIoVXRpbHMuVEkxOE4oXCLlnKPlmaglc+mYtuWPr+WinuWKoOS9v+eUqOaVsOmHjzolc1wiKSwgc3RlcCsxLCAobmV4dF9jb25maWcubnVtIC0gdGhpcy5oYWRfdXNlX251bSkgKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNhbl91c2VfbnVtID0gdGhpcy51c2VfbWF4X251bSAtIHRoaXMuaGFkX3VzZV9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDlvZPliY3liankvZnlj6/kvb/nlKjmlbDph49cbiAgICAgICAgICAgIGlmKHRoaXMuY2FuX3VzZV9udW0gPCAwKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbl91c2VfbnVtID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5b2T5YmN6IOM5YyF5Lit5pWw6YePXG4gICAgICAgICAgICB0aGlzLmhhZF9tYXhfbnVtID0gQmFja3BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRJdGVtTnVtQnlCaWQodGhpcy5jb3N0X2NvbmZpZy52YWwpOyAgICAgLy8g6IOM5YyF5Lit5oC75pWw6YePXG4gICAgICAgICAgICB2YXIgaXRlbVZvID0ge2JpZDp0aGlzLmNvc3RfY29uZmlnLnZhbCwgbnVtOnRoaXMuaGFkX21heF9udW19O1xuICAgICAgICAgICAgdGhpcy5jb3N0X2l0ZW0uc2V0RGF0YShpdGVtVm8pICBcbiAgICAgICAgICAgIHRoaXMudGhpc191c2VfbnVtID0gTWF0aC5taW4odGhpcy5jYW5fdXNlX251bSwgdGhpcy5oYWRfbWF4X251bSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+i/measoeacgOWkmuWPr+S9v+eUqOeahOaVsOmHj1xuICAgICAgICAgICAgdGhpcy5udW0gPSB0aGlzLnRoaXNfdXNlX251bTsgICAgICAgIC8vIOW9k+WJjeaVsOmHj1xuICAgICAgICAgICAgdGhpcy5zZXRDb21wb3NlTnVtKHRoaXMubnVtKTtcbiAgICAgICAgICAgIHRoaXMuc2V0QmFzZUF0dHJMaXN0KClcblxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6K6+572u5b2T5YmN5Zyj5Y2w5oC75bGe5oCnXG4gICAgc2V0QmFzZUF0dHJMaXN0OmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuY29zdF9jb25maWcgPT0gbnVsbCB8fCB0aGlzLmF0dHJfY29uZmlnID09IG51bGwpcmV0dXJuO1xuICAgICAgICBpZih0aGlzLmhhZF91c2VfbnVtID09IG51bGwpe1xuICAgICAgICAgICAgdGhpcy5oYWRfdXNlX251bSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGkgaW4gdGhpcy5hdHRyX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy5hdHRyX2xpc3RbaV0uaXRlbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaiBpbiB0aGlzLmF0dHJfY29uZmlnLnZhbCl7XG4gICAgICAgICAgICB2YXIgdiA9IHRoaXMuYXR0cl9jb25maWcudmFsW2pdO1xuICAgICAgICAgICAgdmFyIGF0dHJfa2V5ID0gdlswXTtcbiAgICAgICAgICAgIHZhciBhdHRyX3ZhbCA9IHZbMV0gKiB0aGlzLmhhZF91c2VfbnVtIDtcbiAgICAgICAgICAgIHZhciBhdHRyX25hbWUgPSBDb25maWcuYXR0cl9kYXRhLmRhdGFfa2V5X3RvX25hbWVbYXR0cl9rZXldO1xuICAgICAgICAgICAgaWYoYXR0cl9uYW1lKXtcbiAgICAgICAgICAgICAgICB2YXIgYXR0cl9pY29uID0gUGF0aFRvb2wuZ2V0QXR0ckljb25CeVN0cihhdHRyX2tleSk7XG4gICAgICAgICAgICAgICAgdmFyIGF0dHJfc3RyID0gY2MuanMuZm9ybWF0U3RyKFV0aWxzLlRJMThOKFwiICVzICslc1wiKSxhdHRyX25hbWUsIGF0dHJfdmFsKTtcblxuICAgICAgICAgICAgICAgIHZhciBvYmplY3QgPSB0aGlzLmF0dHJfbGlzdFtwYXJzZUludChqKSsxXTtcbiAgICAgICAgICAgICAgICBpZihvYmplY3Qpe1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QuaXRlbS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzID0gUGF0aFRvb2wuZ2V0Q29tbW9uSWNvbVBhdGgoYXR0cl9pY29uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKGljb24sc2Zfb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uLnNwcml0ZUZyYW1lID0gc2Zfb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyxvYmplY3QuaWNvbikpO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3QubGFiZWwuc3RyaW5nID0gYXR0cl9zdHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v6L+U5Zue5b2T5YmN6Zi25pWw5pyA5aSn5Y+v5L2/55So55qE5pWw6YeP55qE6YWN572u6KGoXG4gICAgZ2V0VXNlTWF4TnVtOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuZGF0YSA9PSBudWxsIHx8IHRoaXMuZGF0YS52byA9PSBudWxsKXJldHVybjtcbiAgICAgICAgdmFyIHRyYWNlX2Nvc3RfY29uZmlnID0gZ2RhdGEoXCJoYWxsb3dzX2RhdGFcIixcImRhdGFfdHJhY2VfY29zdFwiLFV0aWxzLmdldE5vcktleSh0aGlzLmRhdGEuaWQsIHRoaXMuZGF0YS52by5zdGVwKSk7XG4gICAgICAgIGlmKHRyYWNlX2Nvc3RfY29uZmlnKXtcbiAgICAgICAgICAgIHJldHVybiB0cmFjZV9jb3N0X2NvbmZpZy5udW1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMFxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICBpZih0aGlzLmNvc3RfaXRlbSl7XG4gICAgICAgICAgICB0aGlzLmNvc3RfaXRlbS5vbkRlbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29zdF9pdGVtID0gbnVsbFxuICAgICAgICB0aGlzLmN0cmwub3BlbkhhbGxvd3NUcmFjZVdpbmRvdyhmYWxzZSk7XG4gICAgfSxcbn0pIl19