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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/view/hero_bag_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, '0de4dtCbj5N5qD1QLdL024V', 'hero_bag_window');
// Scripts/mod/hero/view/hero_bag_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//     这里是描述这个窗体的作用的
// <br/>Create: 2019-01-23 10:25:14
// --------------------------------------------------------------------
var HeroConst = require("hero_const");
 
var HeroEvent = require("hero_event");
 
var HeroCalculate = require("hero_calculate");
 
var PathTool = require("pathtool");
 
var GuideController = require("guide_controller");
 
var HeroBagWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("hero", "hero_bag_window");
    this.viewTag = SCENE_TAG.ui; //该窗体所属ui层级,全屏ui需要在ui层,非全屏ui在dialogue层,这个要注意
 
    this.win_type = WinType.Full; //是否是全屏窗体  WinType.Full, WinType.Big, WinType.Mini, WinType.Tips
 
    this.rleasePrefab = false;
    this.ctrl = arguments[0];
    this.model = this.ctrl.getModel();
  },
  // 初始化一些配置数据,可以用于声明一些变量之类的
  initConfig: function initConfig() {
    this.cur_index = 1; // 当前选中的标签页
 
    this.cur_camp = 0; // 当前阵容 
 
    this.camp_btns = {};
    this.cur_role_list = {};
  },
  // 预制体加载完成之后的回调,可以在这里捕获相关节点或者组件
  openCallBack: function openCallBack() {
    // 装备tap
    this.tab_btn_1_nd = this.seekChild("tab_btn_1");
    this.tab_btn_1_normal_nd = this.tab_btn_1_nd.getChildByName("normal_img");
    this.tab_btn_1_select_nd = this.tab_btn_1_nd.getChildByName("select_img");
    this.tab_btn_1_label_nd = this.tab_btn_1_nd.getChildByName("label");
    this.tab_btn_1_red_point_nd = this.tab_btn_1_nd.getChildByName("red_point");
    this.background = this.seekChild("background");
    this.loadRes(PathTool.getBigBg("hero/hero_bag_bg"), function (sp) {
      this.background.getComponent(cc.Sprite).spriteFrame = sp;
    }.bind(this)); // 图鉴
 
    this.tab_btn_2_nd = this.seekChild("tab_btn_2");
    this.tab_btn_2_normal_nd = this.tab_btn_2_nd.getChildByName("normal_img");
    this.tab_btn_2_select_nd = this.tab_btn_2_nd.getChildByName("select_img");
    this.tab_btn_2_label_nd = this.tab_btn_2_nd.getChildByName("label");
    this.tab_btn_2_red_point_nd = this.tab_btn_2_nd.getChildByName("red_point"); // camps
 
    this.camp_node_nd = this.seekChild("camp_node");
    this.camp_layout_nd = this.seekChild("camp_layout");
    this.img_select_nd = this.seekChild("img_select");
    this.no_vedio_image_nd = this.seekChild("no_vedio_image");
 
    for (var camp_i = 0; camp_i < 6; camp_i++) {
      this.camp_btns[camp_i] = this.camp_layout_nd.getChildByName("camp_btn" + camp_i);
      this.camp_btns[camp_i].camp_tag = camp_i;
      this.camp_btns[camp_i].on(cc.Node.EventType.TOUCH_END, this.didClickCampBtn, this);
    }
 
    this.volume_lb = this.seekChild("volume", cc.Label);
    this.add_btn_nd = this.seekChild("add_btn");
    this.embattle_btn_nd = this.seekChild("embattle_btn");
    this.listview_container_nd = this.seekChild("lay_scrollview");
    this.tab_btn_1_red_point_nd.active = false;
    this.tab_btn_2_red_point_nd.active = false;
    this.add_btn_nd.on(cc.Node.EventType.TOUCH_END, this.onClickAddBtn, this);
    this.tab_btn_1_nd.on(cc.Node.EventType.TOUCH_END, this.didClickTabBtn, this);
    this.tab_btn_2_nd.on(cc.Node.EventType.TOUCH_END, this.didClickTabBtn, this);
    this.embattle_btn_nd.on(cc.Node.EventType.TOUCH_END, this.didClickEmbattleBtn, this);
    this.initListView();
    this.time_ticket = gcore.Timer.set(function () {
      gcore.Timer.del(this.time_ticket);
      this.updageTapIndex();
    }.bind(this), 100, 1);
    this.background.scale = FIT_SCALE;
  },
  // 注册事件监听的接口,不需要手动调用,如果是使用gcore.GlobalEvent监听,可以直接调用addGlobalEvent
  registerEvent: function registerEvent() {
    this.addGlobalEvent(HeroEvent.Buy_Hero_Max_Count_Event, function () {
      this.updateBagVal();
    }.bind(this));
    this.addGlobalEvent(HeroEvent.All_Hero_RedPoint_Event, function (status_data) {
      this.updateHeroBagRedpoint(status_data);
    }.bind(this));
    this.addGlobalEvent(HeroEvent.Del_Hero_Event, function () {
      this.updageTapIndex();
      this.updateBagVal();
    }.bind(this));
    this.addGlobalEvent(HeroEvent.Hero_Data_Add, function () {
      this.updageTapIndex();
      this.updateBagVal();
    }.bind(this));
  },
  // 预制体加载完成之后,添加到对应主节点之后的回调,也就是一个窗体的正式入口,可以设置一些数据了
  openRootWnd: function openRootWnd(params) {
    this.updateBagVal();
    HeroCalculate.getInstance().checkAllHeroRedPoint();
  },
  // 关闭窗体回调,需要在这里调用该窗体所属controller的close方法没用于置空该窗体实例对象
  closeCallBack: function closeCallBack() {
    if (this.item_scrollview) {
      this.item_scrollview.deleteMe();
      this.item_scrollview = null;
    }
 
    this.ctrl.openHeroBagWindow(false);
  },
  // 点击阵容标签
  didClickCampBtn: function didClickCampBtn(event) {
    var cur_camp = event.target.camp_tag;
    if (cur_camp === this.cur_camp) return;
    this.img_select_nd.parent = this.camp_btns[cur_camp];
    this.cur_camp = cur_camp;
    this.updageTapIndex();
  },
  didClickTabBtn: function didClickTabBtn(event) {
    var cur_index = 1;
    if (event.target.name == "tab_btn_2") cur_index = 2;
    if (cur_index === this.cur_index) return;
    this["tab_btn_" + cur_index + "_normal_nd"].active = false;
    this["tab_btn_" + cur_index + "_select_nd"].active = true;
    var cur_color = this["tab_btn_" + cur_index + "_label_nd"].color;
    cur_color.fromHEX("#6c402c");
    this["tab_btn_" + cur_index + "_label_nd"].color = cur_color;
    this["tab_btn_" + this.cur_index + "_normal_nd"].active = true;
    this["tab_btn_" + this.cur_index + "_select_nd"].active = false;
    var cur_color_l = this["tab_btn_" + this.cur_index + "_label_nd"].color;
    cur_color_l.fromHEX("#dda880");
    this["tab_btn_" + this.cur_index + "_label_nd"].color = cur_color_l;
 
    if (cur_index === 2) {
      if (this.cur_index === 1) {
        this.cur_camp = 1;
        this.img_select_nd.parent = this.camp_btns[1];
      }
 
      this.camp_btns[0].active = false;
    } else {
      if (this.cur_index === 2) {
        this.cur_camp = 0;
        this.img_select_nd.parent = this.camp_btns[0];
      }
 
      this.camp_btns[0].active = true;
    }
 
    this.cur_index = cur_index;
    this.updageTapIndex();
  },
  initListView: function initListView() {
    var CommonScrollView = require("common_scrollview");
 
    var scroll_view_size = cc.size(this.listview_container_nd.width, this.listview_container_nd.height);
    var setting = {
      item_class: "hero_exhibition_item",
      // 单元类
      start_x: 0,
      // 第一个单元的X起点
      space_x: 4,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 0,
      // y方向的间隔
      item_width: 150,
      // 单元的尺寸width
      item_height: 136,
      // 单元的尺寸height
      col: 4,
      // 列数,作用于垂直滚动类型
      once_num: 5,
      need_dynamic: true
    };
    this.item_scrollview = new CommonScrollView();
    this.item_scrollview.createScroll(this.listview_container_nd, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
    if (GuideController.getInstance().isInGuide()) this.item_scrollview.setClickEnabled(false);
  },
  updageTapIndex: function updageTapIndex() {
    this.cur_role_list = [];
    var from_type = HeroConst.ExhibitionItemType.eNone;
 
    if (this.cur_index == HeroConst.BagTab.eBagHero) {
      from_type = HeroConst.ExhibitionItemType.eHeroBag;
      this.cur_role_list = this.model.getHeroListByCamp(this.cur_camp);
    } else if (this.cur_index == HeroConst.BagTab.eBagPokedex) {
      from_type = HeroConst.ExhibitionItemType.ePokedex;
      this.cur_role_list = this.model.getHeroPokedexList(this.cur_camp);
    }
 
    if (this.cur_role_list.length > 0) {
      this.no_vedio_image_nd.active = false;
    } else {
      this.no_vedio_image_nd.active = true;
    }
 
    this.item_scrollview.setData(this.cur_role_list, this.setlectHeroExhibiton.bind(this), {
      can_click: true,
      from_type: from_type
    });
  },
  setlectHeroExhibiton: function setlectHeroExhibiton(select_item) {
    var show_model_type = this.cur_index || HeroConst.BagTab.eBagHero;
    this.ctrl.openHeroMainInfoWindow(true, select_item.data, this.cur_role_list, {
      show_model_type: show_model_type
    });
  },
  // 布阵
  didClickEmbattleBtn: function didClickEmbattleBtn(event) {
    // this.ctrl.openFormMainWindow(true, null,  null, HeroConst.FormShowType.eFormSave);
    this.ctrl.openFormMainWindow(true);
  },
  onClickAddBtn: function onClickAddBtn() {
    var buy_num = this.model.getHeroBuyNum();
    var buy_cfg = Config.partner_data.data_partner_buy[buy_num + 1];
 
    if (buy_cfg) {
      var item_id = buy_cfg.expend[0][0] || 3;
      var count = buy_cfg.expend[0][1]; // var item_cfg = 
 
      var str = Utils.TI18N(cc.js.formatStr("是否花费%s<img src='%s'/> 扩充%s个英雄位置数量上限?", count, 3, buy_cfg.add_num));
 
      var CommonAlert = require("commonalert");
 
      var res = PathTool.getItemRes(3);
      CommonAlert.show(str, Utils.TI18N("确定"), function () {
        this.ctrl.sender11009();
      }.bind(this), Utils.TI18N("取消"), null, 2, null, {
        resArr: [res]
      });
    } else {
      message(Utils.TI18N("购买次数已达上限"));
    }
  },
  updateBagVal: function updateBagVal() {
    var hero_num_info = this.model.getHeroMaxCount();
    var val_str = hero_num_info.have_coutn + "/" + hero_num_info.max_count;
    this.volume_lb.string = val_str; // var hero_num;
  },
  updateHeroBagRedpoint: function updateHeroBagRedpoint(status_data) {
    if (!this.redpoint_status) this.redpoint_status = {};
 
    for (var data_i in status_data) {
      var data = status_data[data_i];
      this.redpoint_status[data.bid] = data.status;
    }
 
    var is_redpoint = false;
 
    for (var statu_i in this.redpoint_status) {
      if (this.redpoint_status[statu_i]) {
        is_redpoint = true;
        break;
      }
    }
 
    if (is_redpoint) {
      this.tab_btn_1_red_point_nd.active = true;
    } else {
      this.tab_btn_1_red_point_nd.active = false;
    }
 
    if (this.cur_index == HeroConst.BagTab.eBagHero) {
      // 更新一下英雄红点
      this.item_scrollview.resetCurrentItems();
    }
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFx2aWV3XFxoZXJvX2JhZ193aW5kb3cuanMiXSwibmFtZXMiOlsiSGVyb0NvbnN0IiwicmVxdWlyZSIsIkhlcm9FdmVudCIsIkhlcm9DYWxjdWxhdGUiLCJQYXRoVG9vbCIsIkd1aWRlQ29udHJvbGxlciIsIkhlcm9CYWdXaW5kb3ciLCJjYyIsIkNsYXNzIiwiQmFzZVZpZXciLCJjdG9yIiwicHJlZmFiUGF0aCIsImdldFByZWZhYlBhdGgiLCJ2aWV3VGFnIiwiU0NFTkVfVEFHIiwidWkiLCJ3aW5fdHlwZSIsIldpblR5cGUiLCJGdWxsIiwicmxlYXNlUHJlZmFiIiwiY3RybCIsImFyZ3VtZW50cyIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJpbml0Q29uZmlnIiwiY3VyX2luZGV4IiwiY3VyX2NhbXAiLCJjYW1wX2J0bnMiLCJjdXJfcm9sZV9saXN0Iiwib3BlbkNhbGxCYWNrIiwidGFiX2J0bl8xX25kIiwic2Vla0NoaWxkIiwidGFiX2J0bl8xX25vcm1hbF9uZCIsImdldENoaWxkQnlOYW1lIiwidGFiX2J0bl8xX3NlbGVjdF9uZCIsInRhYl9idG5fMV9sYWJlbF9uZCIsInRhYl9idG5fMV9yZWRfcG9pbnRfbmQiLCJiYWNrZ3JvdW5kIiwibG9hZFJlcyIsImdldEJpZ0JnIiwic3AiLCJnZXRDb21wb25lbnQiLCJTcHJpdGUiLCJzcHJpdGVGcmFtZSIsImJpbmQiLCJ0YWJfYnRuXzJfbmQiLCJ0YWJfYnRuXzJfbm9ybWFsX25kIiwidGFiX2J0bl8yX3NlbGVjdF9uZCIsInRhYl9idG5fMl9sYWJlbF9uZCIsInRhYl9idG5fMl9yZWRfcG9pbnRfbmQiLCJjYW1wX25vZGVfbmQiLCJjYW1wX2xheW91dF9uZCIsImltZ19zZWxlY3RfbmQiLCJub192ZWRpb19pbWFnZV9uZCIsImNhbXBfaSIsImNhbXBfdGFnIiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZGlkQ2xpY2tDYW1wQnRuIiwidm9sdW1lX2xiIiwiTGFiZWwiLCJhZGRfYnRuX25kIiwiZW1iYXR0bGVfYnRuX25kIiwibGlzdHZpZXdfY29udGFpbmVyX25kIiwiYWN0aXZlIiwib25DbGlja0FkZEJ0biIsImRpZENsaWNrVGFiQnRuIiwiZGlkQ2xpY2tFbWJhdHRsZUJ0biIsImluaXRMaXN0VmlldyIsInRpbWVfdGlja2V0IiwiZ2NvcmUiLCJUaW1lciIsInNldCIsImRlbCIsInVwZGFnZVRhcEluZGV4Iiwic2NhbGUiLCJGSVRfU0NBTEUiLCJyZWdpc3RlckV2ZW50IiwiYWRkR2xvYmFsRXZlbnQiLCJCdXlfSGVyb19NYXhfQ291bnRfRXZlbnQiLCJ1cGRhdGVCYWdWYWwiLCJBbGxfSGVyb19SZWRQb2ludF9FdmVudCIsInN0YXR1c19kYXRhIiwidXBkYXRlSGVyb0JhZ1JlZHBvaW50IiwiRGVsX0hlcm9fRXZlbnQiLCJIZXJvX0RhdGFfQWRkIiwib3BlblJvb3RXbmQiLCJwYXJhbXMiLCJnZXRJbnN0YW5jZSIsImNoZWNrQWxsSGVyb1JlZFBvaW50IiwiY2xvc2VDYWxsQmFjayIsIml0ZW1fc2Nyb2xsdmlldyIsImRlbGV0ZU1lIiwib3Blbkhlcm9CYWdXaW5kb3ciLCJldmVudCIsInRhcmdldCIsInBhcmVudCIsIm5hbWUiLCJjdXJfY29sb3IiLCJjb2xvciIsImZyb21IRVgiLCJjdXJfY29sb3JfbCIsIkNvbW1vblNjcm9sbFZpZXciLCJzY3JvbGxfdmlld19zaXplIiwic2l6ZSIsIndpZHRoIiwiaGVpZ2h0Iiwic2V0dGluZyIsIml0ZW1fY2xhc3MiLCJzdGFydF94Iiwic3BhY2VfeCIsInN0YXJ0X3kiLCJzcGFjZV95IiwiaXRlbV93aWR0aCIsIml0ZW1faGVpZ2h0IiwiY29sIiwib25jZV9udW0iLCJuZWVkX2R5bmFtaWMiLCJjcmVhdGVTY3JvbGwiLCJ2MiIsIlNjcm9sbFZpZXdEaXIiLCJ2ZXJ0aWNhbCIsIlNjcm9sbFZpZXdTdGFydFBvcyIsInRvcCIsImlzSW5HdWlkZSIsInNldENsaWNrRW5hYmxlZCIsImZyb21fdHlwZSIsIkV4aGliaXRpb25JdGVtVHlwZSIsImVOb25lIiwiQmFnVGFiIiwiZUJhZ0hlcm8iLCJlSGVyb0JhZyIsImdldEhlcm9MaXN0QnlDYW1wIiwiZUJhZ1Bva2VkZXgiLCJlUG9rZWRleCIsImdldEhlcm9Qb2tlZGV4TGlzdCIsImxlbmd0aCIsInNldERhdGEiLCJzZXRsZWN0SGVyb0V4aGliaXRvbiIsImNhbl9jbGljayIsInNlbGVjdF9pdGVtIiwic2hvd19tb2RlbF90eXBlIiwib3Blbkhlcm9NYWluSW5mb1dpbmRvdyIsImRhdGEiLCJvcGVuRm9ybU1haW5XaW5kb3ciLCJidXlfbnVtIiwiZ2V0SGVyb0J1eU51bSIsImJ1eV9jZmciLCJDb25maWciLCJwYXJ0bmVyX2RhdGEiLCJkYXRhX3BhcnRuZXJfYnV5IiwiaXRlbV9pZCIsImV4cGVuZCIsImNvdW50Iiwic3RyIiwiVXRpbHMiLCJUSTE4TiIsImpzIiwiZm9ybWF0U3RyIiwiYWRkX251bSIsIkNvbW1vbkFsZXJ0IiwicmVzIiwiZ2V0SXRlbVJlcyIsInNob3ciLCJzZW5kZXIxMTAwOSIsInJlc0FyciIsIm1lc3NhZ2UiLCJoZXJvX251bV9pbmZvIiwiZ2V0SGVyb01heENvdW50IiwidmFsX3N0ciIsImhhdmVfY291dG4iLCJtYXhfY291bnQiLCJzdHJpbmciLCJyZWRwb2ludF9zdGF0dXMiLCJkYXRhX2kiLCJiaWQiLCJzdGF0dXMiLCJpc19yZWRwb2ludCIsInN0YXR1X2kiLCJyZXNldEN1cnJlbnRJdGVtcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQXZCOztBQUNBLElBQUlDLFNBQVMsR0FBR0QsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUUsYUFBYSxHQUFHRixPQUFPLENBQUMsZ0JBQUQsQ0FBM0I7O0FBQ0EsSUFBSUcsUUFBUSxHQUFHSCxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFD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RUosU0FBSyxJQUFJQyxNQUFULElBQW1CNUYsV0FBbkIsRUFBZ0M7QUFDNUIsVUFBSTZELElBQUksR0FBRzdELFdBQVcsQ0FBQzRGLE1BQUQsQ0FBdEI7QUFDQSxXQUFLRCxlQUFMLENBQXFCOUIsSUFBSSxDQUFDZ0MsR0FBMUIsSUFBaUNoQyxJQUFJLENBQUNpQyxNQUF0QztBQUNIOztBQUVELFFBQUlDLFdBQVcsR0FBRyxLQUFsQjs7QUFDQSxTQUFLLElBQUlDLE9BQVQsSUFBb0IsS0FBS0wsZUFBekIsRUFBMEM7QUFDdEMsVUFBSSxLQUFLQSxlQUFMLENBQXFCSyxPQUFyQixDQUFKLEVBQW1DO0FBQy9CRCxRQUFBQSxXQUFXLEdBQUcsSUFBZDtBQUNBO0FBQ0g7QUFDSjs7QUFFRCxRQUFJQSxXQUFKLEVBQWlCO0FBQ2IsV0FBSy9JLHNCQUFMLENBQTRCOEIsTUFBNUIsR0FBcUMsSUFBckM7QUFDSCxLQUZELE1BRU87QUFDSCxXQUFLOUIsc0JBQUwsQ0FBNEI4QixNQUE1QixHQUFxQyxLQUFyQztBQUNIOztBQUVELFFBQUksS0FBS3pDLFNBQUwsSUFBa0J6QixTQUFTLENBQUNtSSxNQUFWLENBQWlCQyxRQUF2QyxFQUFpRDtBQUM3QztBQUNBLFdBQUt2QyxlQUFMLENBQXFCd0YsaUJBQXJCO0FBQ0g7QUFDSjtBQTFRd0IsQ0FBVCxDQUFwQiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEBhdXRob3I6IHh4eEBzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgIOi/memHjOaYr+aPj+i/sOi/meS4queql+S9k+eahOS9nOeUqOeahFxuLy8gPGJyLz5DcmVhdGU6IDIwMTktMDEtMjMgMTA6MjU6MTRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgSGVyb0NvbnN0ID0gcmVxdWlyZShcImhlcm9fY29uc3RcIik7XG52YXIgSGVyb0V2ZW50ID0gcmVxdWlyZShcImhlcm9fZXZlbnRcIik7XG52YXIgSGVyb0NhbGN1bGF0ZSA9IHJlcXVpcmUoXCJoZXJvX2NhbGN1bGF0ZVwiKVxudmFyIFBhdGhUb29sID0gcmVxdWlyZShcInBhdGh0b29sXCIpO1xudmFyIEd1aWRlQ29udHJvbGxlciA9IHJlcXVpcmUoXCJndWlkZV9jb250cm9sbGVyXCIpO1xuXG52YXIgSGVyb0JhZ1dpbmRvdyA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMucHJlZmFiUGF0aCA9IFBhdGhUb29sLmdldFByZWZhYlBhdGgoXCJoZXJvXCIsIFwiaGVyb19iYWdfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7ICAgICAgICAgICAgICAgIC8v6K+l56qX5L2T5omA5bGedWnlsYLnuqcs5YWo5bGPdWnpnIDopoHlnKh1aeWxgizpnZ7lhajlsY91aeWcqGRpYWxvZ3Vl5bGCLOi/meS4quimgeazqOaEj1xuICAgICAgICB0aGlzLndpbl90eXBlID0gV2luVHlwZS5GdWxsOyAgICAgICAgICAgICAgIC8v5piv5ZCm5piv5YWo5bGP56qX5L2TICBXaW5UeXBlLkZ1bGwsIFdpblR5cGUuQmlnLCBXaW5UeXBlLk1pbmksIFdpblR5cGUuVGlwc1xuICAgICAgICB0aGlzLnJsZWFzZVByZWZhYiA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY3RybCA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IHRoaXMuY3RybC5nZXRNb2RlbCgpO1xuICAgIH0sXG5cbiAgICAvLyDliJ3lp4vljJbkuIDkupvphY3nva7mlbDmja4s5Y+v5Lul55So5LqO5aOw5piO5LiA5Lqb5Y+Y6YeP5LmL57G755qEXG4gICAgaW5pdENvbmZpZzpmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmN1cl9pbmRleCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW9k+WJjemAieS4reeahOagh+etvumhtVxuICAgICAgICB0aGlzLmN1cl9jYW1wICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOW9k+WJjemYteWuuSBcbiAgICAgICAgdGhpcy5jYW1wX2J0bnMgPSB7fTtcbiAgICAgICAgdGhpcy5jdXJfcm9sZV9saXN0ID0ge307XG4gICAgfSxcblxuICAgIC8vIOmihOWItuS9k+WKoOi9veWujOaIkOS5i+WQjueahOWbnuiwgyzlj6/ku6XlnKjov5nph4zmjZXojrfnm7jlhbPoioLngrnmiJbogIXnu4Tku7ZcbiAgICBvcGVuQ2FsbEJhY2s6ZnVuY3Rpb24oKXtcbiAgICAgICAgLy8g6KOF5aSHdGFwXG4gICAgICAgIHRoaXMudGFiX2J0bl8xX25kICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwidGFiX2J0bl8xXCIpO1xuICAgICAgICB0aGlzLnRhYl9idG5fMV9ub3JtYWxfbmQgICAgPSB0aGlzLnRhYl9idG5fMV9uZC5nZXRDaGlsZEJ5TmFtZShcIm5vcm1hbF9pbWdcIik7XG4gICAgICAgIHRoaXMudGFiX2J0bl8xX3NlbGVjdF9uZCAgICA9IHRoaXMudGFiX2J0bl8xX25kLmdldENoaWxkQnlOYW1lKFwic2VsZWN0X2ltZ1wiKTtcbiAgICAgICAgdGhpcy50YWJfYnRuXzFfbGFiZWxfbmQgICAgID0gdGhpcy50YWJfYnRuXzFfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKTtcbiAgICAgICAgdGhpcy50YWJfYnRuXzFfcmVkX3BvaW50X25kID0gdGhpcy50YWJfYnRuXzFfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJyZWRfcG9pbnRcIik7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKFBhdGhUb29sLmdldEJpZ0JnKFwiaGVyby9oZXJvX2JhZ19iZ1wiKSxmdW5jdGlvbihzcCl7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSkuc3ByaXRlRnJhbWUgPSBzcDtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIC8vIOWbvumJtFxuICAgICAgICB0aGlzLnRhYl9idG5fMl9uZCAgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcInRhYl9idG5fMlwiKTtcbiAgICAgICAgdGhpcy50YWJfYnRuXzJfbm9ybWFsX25kICAgID0gdGhpcy50YWJfYnRuXzJfbmQuZ2V0Q2hpbGRCeU5hbWUoXCJub3JtYWxfaW1nXCIpO1xuICAgICAgICB0aGlzLnRhYl9idG5fMl9zZWxlY3RfbmQgICAgPSB0aGlzLnRhYl9idG5fMl9uZC5nZXRDaGlsZEJ5TmFtZShcInNlbGVjdF9pbWdcIik7XG4gICAgICAgIHRoaXMudGFiX2J0bl8yX2xhYmVsX25kICAgICA9IHRoaXMudGFiX2J0bl8yX25kLmdldENoaWxkQnlOYW1lKFwibGFiZWxcIik7XG4gICAgICAgIHRoaXMudGFiX2J0bl8yX3JlZF9wb2ludF9uZCA9IHRoaXMudGFiX2J0bl8yX25kLmdldENoaWxkQnlOYW1lKFwicmVkX3BvaW50XCIpO1xuXG4gICAgICAgIC8vIGNhbXBzXG4gICAgICAgIHRoaXMuY2FtcF9ub2RlX25kICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwiY2FtcF9ub2RlXCIpO1xuICAgICAgICB0aGlzLmNhbXBfbGF5b3V0X25kICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImNhbXBfbGF5b3V0XCIpO1xuICAgICAgICB0aGlzLmltZ19zZWxlY3RfbmQgICAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImltZ19zZWxlY3RcIik7XG5cbiAgICAgICAgdGhpcy5ub192ZWRpb19pbWFnZV9uZCAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJub192ZWRpb19pbWFnZVwiKTtcblxuICAgICAgICBmb3IgKHZhciBjYW1wX2kgPSAwOyBjYW1wX2kgPCA2OyBjYW1wX2krKykge1xuICAgICAgICAgICAgdGhpcy5jYW1wX2J0bnNbY2FtcF9pXSAgPSB0aGlzLmNhbXBfbGF5b3V0X25kLmdldENoaWxkQnlOYW1lKFwiY2FtcF9idG5cIiArIGNhbXBfaSk7XG4gICAgICAgICAgICB0aGlzLmNhbXBfYnRuc1tjYW1wX2ldLmNhbXBfdGFnID0gY2FtcF9pO1xuICAgICAgICAgICAgdGhpcy5jYW1wX2J0bnNbY2FtcF9pXS5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tDYW1wQnRuLCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudm9sdW1lX2xiICAgICAgICAgICAgICA9IHRoaXMuc2Vla0NoaWxkKFwidm9sdW1lXCIsIGNjLkxhYmVsKTtcbiAgICAgICAgdGhpcy5hZGRfYnRuX25kICAgICAgICAgICAgID0gdGhpcy5zZWVrQ2hpbGQoXCJhZGRfYnRuXCIpO1xuICAgICAgICB0aGlzLmVtYmF0dGxlX2J0bl9uZCAgICAgICAgPSB0aGlzLnNlZWtDaGlsZChcImVtYmF0dGxlX2J0blwiKTtcbiAgICAgICAgdGhpcy5saXN0dmlld19jb250YWluZXJfbmQgID0gdGhpcy5zZWVrQ2hpbGQoXCJsYXlfc2Nyb2xsdmlld1wiKTtcblxuICAgICAgICB0aGlzLnRhYl9idG5fMV9yZWRfcG9pbnRfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFiX2J0bl8yX3JlZF9wb2ludF9uZC5hY3RpdmUgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFkZF9idG5fbmQub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCB0aGlzLm9uQ2xpY2tBZGRCdG4sIHRoaXMpO1xuICAgICAgICB0aGlzLnRhYl9idG5fMV9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tUYWJCdG4sIHRoaXMpO1xuICAgICAgICB0aGlzLnRhYl9idG5fMl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tUYWJCdG4sIHRoaXMpO1xuICAgICAgICB0aGlzLmVtYmF0dGxlX2J0bl9uZC5vbihjYy5Ob2RlLkV2ZW50VHlwZS5UT1VDSF9FTkQsIHRoaXMuZGlkQ2xpY2tFbWJhdHRsZUJ0biwgdGhpcylcblxuICAgICAgICB0aGlzLmluaXRMaXN0VmlldygpO1xuICAgICAgICB0aGlzLnRpbWVfdGlja2V0ID0gZ2NvcmUuVGltZXIuc2V0KChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy50aW1lX3RpY2tldClcbiAgICAgICAgICAgIHRoaXMudXBkYWdlVGFwSW5kZXgoKTtcbiAgICAgICAgfSkuYmluZCh0aGlzKSwgMTAwLCAxKVxuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZC5zY2FsZSA9IEZJVF9TQ0FMRTtcbiAgICB9LFxuXG5cblxuICAgIC8vIOazqOWGjOS6i+S7tuebkeWQrOeahOaOpeWPoyzkuI3pnIDopoHmiYvliqjosIPnlKgs5aaC5p6c5piv5L2/55SoZ2NvcmUuR2xvYmFsRXZlbnTnm5HlkKws5Y+v5Lul55u05o6l6LCD55SoYWRkR2xvYmFsRXZlbnRcbiAgICByZWdpc3RlckV2ZW50OmZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoSGVyb0V2ZW50LkJ1eV9IZXJvX01heF9Db3VudF9FdmVudCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJhZ1ZhbCgpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoSGVyb0V2ZW50LkFsbF9IZXJvX1JlZFBvaW50X0V2ZW50LCBmdW5jdGlvbihzdGF0dXNfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVIZXJvQmFnUmVkcG9pbnQoc3RhdHVzX2RhdGEpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoSGVyb0V2ZW50LkRlbF9IZXJvX0V2ZW50LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYWdlVGFwSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmFnVmFsKClcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmFkZEdsb2JhbEV2ZW50KEhlcm9FdmVudC5IZXJvX0RhdGFfQWRkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYWdlVGFwSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmFnVmFsKClcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcbiAgICB9LFxuXG5cbiAgICAvLyDpooTliLbkvZPliqDovb3lrozmiJDkuYvlkI4s5re75Yqg5Yiw5a+55bqU5Li76IqC54K55LmL5ZCO55qE5Zue6LCDLOS5n+WwseaYr+S4gOS4queql+S9k+eahOato+W8j+WFpeWPoyzlj6/ku6Xorr7nva7kuIDkupvmlbDmja7kuoZcbiAgICBvcGVuUm9vdFduZDpmdW5jdGlvbihwYXJhbXMpe1xuICAgICAgICB0aGlzLnVwZGF0ZUJhZ1ZhbCgpO1xuICAgICAgICBIZXJvQ2FsY3VsYXRlLmdldEluc3RhbmNlKCkuY2hlY2tBbGxIZXJvUmVkUG9pbnQoKVxuICAgIH0sXG5cbiAgICAvLyDlhbPpl63nqpfkvZPlm57osIMs6ZyA6KaB5Zyo6L+Z6YeM6LCD55So6K+l56qX5L2T5omA5bGeY29udHJvbGxlcueahGNsb3Nl5pa55rOV5rKh55So5LqO572u56m66K+l56qX5L2T5a6e5L6L5a+56LGhXG4gICAgY2xvc2VDYWxsQmFjazpmdW5jdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5pdGVtX3Njcm9sbHZpZXcpe1xuICAgICAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuZGVsZXRlTWUoKTtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmN0cmwub3Blbkhlcm9CYWdXaW5kb3coZmFsc2UpO1xuICAgIH0sXG5cbiAgICAvLyDngrnlh7vpmLXlrrnmoIfnrb5cbiAgICBkaWRDbGlja0NhbXBCdG46IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciBjdXJfY2FtcCA9IGV2ZW50LnRhcmdldC5jYW1wX3RhZztcbiAgICAgICAgaWYgKGN1cl9jYW1wID09PSB0aGlzLmN1cl9jYW1wKSByZXR1cm47XG4gICAgICAgIHRoaXMuaW1nX3NlbGVjdF9uZC5wYXJlbnQgPSB0aGlzLmNhbXBfYnRuc1tjdXJfY2FtcF07XG4gICAgICAgIHRoaXMuY3VyX2NhbXAgPSBjdXJfY2FtcDtcbiAgICAgICAgdGhpcy51cGRhZ2VUYXBJbmRleCgpO1xuICAgIH0sXG5cbiAgICBkaWRDbGlja1RhYkJ0bjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdmFyIGN1cl9pbmRleCA9IDE7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQubmFtZSA9PSBcInRhYl9idG5fMlwiKVxuICAgICAgICAgICAgY3VyX2luZGV4ID0gMlxuICAgICAgICBpZiAoY3VyX2luZGV4ID09PSB0aGlzLmN1cl9pbmRleCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXNbXCJ0YWJfYnRuX1wiICsgY3VyX2luZGV4ICsgXCJfbm9ybWFsX25kXCJdLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzW1widGFiX2J0bl9cIiArIGN1cl9pbmRleCArIFwiX3NlbGVjdF9uZFwiXS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB2YXIgY3VyX2NvbG9yID0gdGhpc1tcInRhYl9idG5fXCIgKyBjdXJfaW5kZXggKyBcIl9sYWJlbF9uZFwiXS5jb2xvcjtcbiAgICAgICAgY3VyX2NvbG9yLmZyb21IRVgoXCIjNmM0MDJjXCIpO1xuICAgICAgICB0aGlzW1widGFiX2J0bl9cIiArIGN1cl9pbmRleCArIFwiX2xhYmVsX25kXCJdLmNvbG9yID0gY3VyX2NvbG9yO1xuXG4gICAgICAgIHRoaXNbXCJ0YWJfYnRuX1wiICsgdGhpcy5jdXJfaW5kZXggKyBcIl9ub3JtYWxfbmRcIl0uYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpc1tcInRhYl9idG5fXCIgKyB0aGlzLmN1cl9pbmRleCArIFwiX3NlbGVjdF9uZFwiXS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGN1cl9jb2xvcl9sID0gdGhpc1tcInRhYl9idG5fXCIgKyB0aGlzLmN1cl9pbmRleCArIFwiX2xhYmVsX25kXCJdLmNvbG9yO1xuICAgICAgICBjdXJfY29sb3JfbC5mcm9tSEVYKFwiI2RkYTg4MFwiKTtcbiAgICAgICAgdGhpc1tcInRhYl9idG5fXCIgKyB0aGlzLmN1cl9pbmRleCArIFwiX2xhYmVsX25kXCJdLmNvbG9yID0gY3VyX2NvbG9yX2w7XG5cbiAgICAgICAgaWYgKGN1cl9pbmRleCA9PT0gMikge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJfY2FtcCA9IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5pbWdfc2VsZWN0X25kLnBhcmVudCA9IHRoaXMuY2FtcF9idG5zWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jYW1wX2J0bnNbMF0uYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT09IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cl9jYW1wID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmltZ19zZWxlY3RfbmQucGFyZW50ID0gdGhpcy5jYW1wX2J0bnNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNhbXBfYnRuc1swXS5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSBjdXJfaW5kZXg7XG4gICAgICAgIHRoaXMudXBkYWdlVGFwSW5kZXgoKTtcbiAgICB9LFxuXG4gICAgaW5pdExpc3RWaWV3OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIENvbW1vblNjcm9sbFZpZXcgPSByZXF1aXJlKFwiY29tbW9uX3Njcm9sbHZpZXdcIik7XG4gICAgICAgIHZhciBzY3JvbGxfdmlld19zaXplID0gY2Muc2l6ZSh0aGlzLmxpc3R2aWV3X2NvbnRhaW5lcl9uZC53aWR0aCwgdGhpcy5saXN0dmlld19jb250YWluZXJfbmQuaGVpZ2h0KVxuICAgICAgICB2YXIgc2V0dGluZyA9IHtcbiAgICAgICAgICAgIGl0ZW1fY2xhc3M6IFwiaGVyb19leGhpYml0aW9uX2l0ZW1cIiwgICAgICAvLyDljZXlhYPnsbtcbiAgICAgICAgICAgIHN0YXJ0X3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XG4gICAgICAgICAgICBzcGFjZV94OiA0LCAgICAgICAgICAgICAgICAgICAgLy8geOaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgc3RhcnRfeTogMCwgICAgICAgICAgICAgICAgICAgIC8vIOesrOS4gOS4quWNleWFg+eahFnotbfngrlcbiAgICAgICAgICAgIHNwYWNlX3k6IDAsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgIGl0ZW1fd2lkdGg6IDE1MCwgICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7h3aWR0aFxuICAgICAgICAgICAgaXRlbV9oZWlnaHQ6IDEzNiwgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuGhlaWdodFxuICAgICAgICAgICAgY29sOiA0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIl+aVsO+8jOS9nOeUqOS6juWeguebtOa7muWKqOexu+Wei1xuICAgICAgICAgICAgb25jZV9udW06IDUsXG4gICAgICAgICAgICBuZWVkX2R5bmFtaWM6IHRydWVcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KClcbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcuY3JlYXRlU2Nyb2xsKHRoaXMubGlzdHZpZXdfY29udGFpbmVyX25kLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgc2Nyb2xsX3ZpZXdfc2l6ZSwgc2V0dGluZywgY2MudjIoMC41LDAuNSkpXG5cblxuICAgICAgICBpZiAoR3VpZGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaXNJbkd1aWRlKCkpXG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXRDbGlja0VuYWJsZWQoZmFsc2UpO1xuICAgIH0sXG5cbiAgICB1cGRhZ2VUYXBJbmRleDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3VyX3JvbGVfbGlzdCA9IFtdO1xuICAgICAgICB2YXIgZnJvbV90eXBlID0gSGVyb0NvbnN0LkV4aGliaXRpb25JdGVtVHlwZS5lTm9uZTtcbiAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IEhlcm9Db25zdC5CYWdUYWIuZUJhZ0hlcm8pIHtcbiAgICAgICAgICAgIGZyb21fdHlwZSA9IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZUhlcm9CYWc7XG4gICAgICAgICAgICB0aGlzLmN1cl9yb2xlX2xpc3QgPSB0aGlzLm1vZGVsLmdldEhlcm9MaXN0QnlDYW1wKHRoaXMuY3VyX2NhbXApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3VyX2luZGV4ID09IEhlcm9Db25zdC5CYWdUYWIuZUJhZ1Bva2VkZXgpIHtcbiAgICAgICAgICAgIGZyb21fdHlwZSA9IEhlcm9Db25zdC5FeGhpYml0aW9uSXRlbVR5cGUuZVBva2VkZXg7XG4gICAgICAgICAgICB0aGlzLmN1cl9yb2xlX2xpc3QgPSB0aGlzLm1vZGVsLmdldEhlcm9Qb2tlZGV4TGlzdCh0aGlzLmN1cl9jYW1wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmN1cl9yb2xlX2xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ub192ZWRpb19pbWFnZV9uZC5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubm9fdmVkaW9faW1hZ2VfbmQuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKHRoaXMuY3VyX3JvbGVfbGlzdCwgdGhpcy5zZXRsZWN0SGVyb0V4aGliaXRvbi5iaW5kKHRoaXMpLCB7Y2FuX2NsaWNrOiB0cnVlLCBmcm9tX3R5cGU6ZnJvbV90eXBlfSk7XG5cbiAgICB9LFxuXG4gICAgc2V0bGVjdEhlcm9FeGhpYml0b246IGZ1bmN0aW9uKHNlbGVjdF9pdGVtKSB7XG4gICAgICAgIHZhciBzaG93X21vZGVsX3R5cGUgPSB0aGlzLmN1cl9pbmRleCB8fCBIZXJvQ29uc3QuQmFnVGFiLmVCYWdIZXJvXG4gICAgICAgIHRoaXMuY3RybC5vcGVuSGVyb01haW5JbmZvV2luZG93KHRydWUsIHNlbGVjdF9pdGVtLmRhdGEsIHRoaXMuY3VyX3JvbGVfbGlzdCwge3Nob3dfbW9kZWxfdHlwZTogc2hvd19tb2RlbF90eXBlfSlcbiAgICB9LFxuXG4gICAgLy8g5biD6Zi1XG4gICAgZGlkQ2xpY2tFbWJhdHRsZUJ0bjogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgLy8gdGhpcy5jdHJsLm9wZW5Gb3JtTWFpbldpbmRvdyh0cnVlLCBudWxsLCAgbnVsbCwgSGVyb0NvbnN0LkZvcm1TaG93VHlwZS5lRm9ybVNhdmUpO1xuICAgICAgICB0aGlzLmN0cmwub3BlbkZvcm1NYWluV2luZG93KHRydWUpO1xuICAgIH0sXG5cbiAgICBvbkNsaWNrQWRkQnRuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGJ1eV9udW0gPSB0aGlzLm1vZGVsLmdldEhlcm9CdXlOdW0oKTtcbiAgICAgICAgdmFyIGJ1eV9jZmcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfcGFydG5lcl9idXlbYnV5X251bSArIDFdO1xuICAgICAgICBpZiAoYnV5X2NmZykge1xuICAgICAgICAgICAgdmFyIGl0ZW1faWQgPSBidXlfY2ZnLmV4cGVuZFswXVswXSB8fCAzO1xuICAgICAgICAgICAgdmFyIGNvdW50ID0gYnV5X2NmZy5leHBlbmRbMF1bMV07XG4gICAgICAgICAgICAvLyB2YXIgaXRlbV9jZmcgPSBcbiAgICAgICAgICAgIHZhciBzdHIgPSBVdGlscy5USTE4TihjYy5qcy5mb3JtYXRTdHIoXCLmmK/lkKboirHotLklczxpbWcgc3JjPSclcycvPiDmianlhYUlc+S4quiLsembhOS9jee9ruaVsOmHj+S4iumZkO+8n1wiLCBjb3VudCwzLCBidXlfY2ZnLmFkZF9udW0pKTtcbiAgICAgICAgICAgIHZhciBDb21tb25BbGVydCA9IHJlcXVpcmUoXCJjb21tb25hbGVydFwiKTtcbiAgICAgICAgICAgIHZhciByZXMgPSAgUGF0aFRvb2wuZ2V0SXRlbVJlcygzKTtcbiAgICAgICAgICAgIENvbW1vbkFsZXJ0LnNob3coc3RyLCBVdGlscy5USTE4TihcIuehruWumlwiKSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jdHJsLnNlbmRlcjExMDA5KCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIFV0aWxzLlRJMThOKFwi5Y+W5raIXCIpLCBudWxsLDIsIG51bGwsIHtyZXNBcnI6W3Jlc119KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIui0reS5sOasoeaVsOW3sui+vuS4iumZkFwiKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgdXBkYXRlQmFnVmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGhlcm9fbnVtX2luZm8gPSB0aGlzLm1vZGVsLmdldEhlcm9NYXhDb3VudCgpO1xuICAgICAgICB2YXIgdmFsX3N0ciA9IGhlcm9fbnVtX2luZm8uaGF2ZV9jb3V0biArIFwiL1wiICsgaGVyb19udW1faW5mby5tYXhfY291bnQ7XG4gICAgICAgIHRoaXMudm9sdW1lX2xiLnN0cmluZyA9IHZhbF9zdHI7XG4gICAgICAgIC8vIHZhciBoZXJvX251bTtcbiAgICB9LFxuXG4gICAgdXBkYXRlSGVyb0JhZ1JlZHBvaW50OiBmdW5jdGlvbihzdGF0dXNfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMucmVkcG9pbnRfc3RhdHVzKVxuICAgICAgICAgICAgdGhpcy5yZWRwb2ludF9zdGF0dXMgPSB7fTtcblxuICAgICAgICBmb3IgKHZhciBkYXRhX2kgaW4gc3RhdHVzX2RhdGEpIHtcbiAgICAgICAgICAgIHZhciBkYXRhID0gc3RhdHVzX2RhdGFbZGF0YV9pXTtcbiAgICAgICAgICAgIHRoaXMucmVkcG9pbnRfc3RhdHVzW2RhdGEuYmlkXSA9IGRhdGEuc3RhdHVzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlzX3JlZHBvaW50ID0gZmFsc2U7XG4gICAgICAgIGZvciAodmFyIHN0YXR1X2kgaW4gdGhpcy5yZWRwb2ludF9zdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlZHBvaW50X3N0YXR1c1tzdGF0dV9pXSkge1xuICAgICAgICAgICAgICAgIGlzX3JlZHBvaW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc19yZWRwb2ludCkge1xuICAgICAgICAgICAgdGhpcy50YWJfYnRuXzFfcmVkX3BvaW50X25kLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRhYl9idG5fMV9yZWRfcG9pbnRfbmQuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT0gSGVyb0NvbnN0LkJhZ1RhYi5lQmFnSGVybykge1xuICAgICAgICAgICAgLy8g5pu05paw5LiA5LiL6Iux6ZuE57qi54K5XG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5yZXNldEN1cnJlbnRJdGVtcygpO1xuICAgICAgICB9XG4gICAgfSxcbn0pIl19