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
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/backpack/view/backpack_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, '5b39cJSdOdAzKauqpdNdx1I', 'backpack_window');
// Scripts/mod/backpack/view/backpack_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: shiraho@syg.com(必填, 创建模块的人员)
// @description:
//      背包主界面
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var PathTool = require("pathtool");
 
var BackPackController = require("backpack_controller");
 
var BackPackConst = require("backpack_const");
 
var CommonScrollView = require("common_scrollview");
 
var TipsConst = require("tips_const");
 
var BackpackEvent = require("backpack_event");
 
var GuideController = require("guide_controller");
 
var BackPackWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.rleasePrefab = false;
    this.prefabPath = PathTool.getPrefabPath("backpack", "backpack_window");
    this.viewTag = SCENE_TAG.ui;
    this.win_type = WinType.Full;
  },
  initConfig: function initConfig() {
    this.panel_list = {};
    this.tab_list = {};
    this.min_size = 30; // 每一页最小的物品数目
 
    this.col_size = 5; // 一行最多
 
    this.normal_color = new cc.Color(0xd3, 0xb4, 0x9b, 0xff);
    this.normal_outlinecolor = new cc.Color(0x40, 0x22, 0x15, 0xff);
    this.select_color = new cc.Color(0xff, 0xff, 0xff, 0xff);
    this.select_outlinecolor = new cc.Color(0x6d, 0x35, 0x07, 0xff);
  },
  openCallBack: function openCallBack() {
    var title_list = [Utils.TI18N("装备"), Utils.TI18N("道具"), Utils.TI18N("碎片"), Utils.TI18N("特殊")];
    this.mainContainer = this.root_wnd.getChildByName("main_container");
    this.title_effect = this.mainContainer.getChildByName("title_img").getComponent(sp.Skeleton);
    var anima_path = PathTool.getSpinePath(PathTool.getEffectRes(640), "action");
    this.loadRes(anima_path, function (ske_data) {
      this.title_effect.skeletonData = ske_data;
      this.title_effect.setAnimation(0, PlayerAction.stand, true);
    }.bind(this));
    this.background = this.seekChild("background");
    this.background.scale = FIT_SCALE;
    var tab_container = this.seekChild("tab_container");
 
    for (var index = 0; index < 4; index++) {
      var object = {};
      var new_index = index + 1;
      object.btn = tab_container.getChildByName("tab_btn_" + new_index); //获取主节点
 
      object.normal = object.btn.getChildByName("normal"); //普通状态
 
      object.select = object.btn.getChildByName("select"); //选中状态
 
      object.red_point = object.btn.getChildByName("red_point"); //红点
 
      object.title = object.btn.getChildByName("label"); //label对象
 
      object.title_label = object.title.getComponent(cc.Label); //label
 
      object.title_outline = object.title.getComponent(cc.LabelOutline); //描边
 
      object.title_label.string = title_list[index];
      object.index = new_index;
      this.tab_list[new_index] = object;
    }
 
    var container = this.seekChild("container");
    var scroll_view_size = cc.size(620, 600);
    var setting = {
      item_class: "backpack_item",
      // 单元类
      start_x: 0,
      // 第一个单元的X起点
      space_x: 4,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 10,
      // y方向的间隔
      item_width: 120,
      // 单元的尺寸width
      item_height: 120,
      // 单元的尺寸height
      row: 5,
      // 行数,作用于水平滚动类型
      col: 5,
      // 列数,作用于垂直滚动类型
      once_num: 5,
      need_dynamic: true
    };
    this.item_scrollview = new CommonScrollView();
    this.item_scrollview.createScroll(container, cc.v2(0, -30), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
    if (GuideController.getInstance().isInGuide()) this.item_scrollview.setClickEnabled(false);
  },
  registerEvent: function registerEvent() {
    var _this = this;
 
    var _loop = function _loop() {
      var element = _this.tab_list[key];
 
      if (element.btn) {
        element.btn.on(cc.Node.EventType.TOUCH_END, function (event) {
          this.changeTabView(element.index);
        }.bind(_this));
      }
    };
 
    for (var key in this.tab_list) {
      _loop();
    }
 
    this.addGlobalEvent(EventId.ADD_GOODS, function (bag_code, item_list) {
      this.updateBackPack(bag_code, item_list);
    }.bind(this));
    this.addGlobalEvent(EventId.DELETE_GOODS, function (bag_code, item_list) {
      this.updateBackPack(bag_code, item_list);
    }.bind(this));
    this.addGlobalEvent(EventId.MODIFY_GOODS_NUM, function (bag_code, item_list) {
      this.updateBackPack(bag_code, item_list);
 
      if (this.cur_index == 3) {
        this.isCompRedPoint();
      }
    }.bind(this));
    this.addGlobalEvent(BackpackEvent.Compose_BackPack_Success, function () {
      this.isCompRedPoint();
      this.setPanelData();
    }.bind(this));
  },
  openRootWnd: function openRootWnd(params) {
    var index = params || BackPackConst.item_tab_type.EQUIPS;
    this.changeTabView(index);
    this.isCompRedPoint();
  },
  // --判断碎片是否显示红点
  isCompRedPoint: function isCompRedPoint() {
    var self = this;
    var item_list = BackPackController.getInstance().getModel().getAllBackPackArray(3);
    var status = false;
    var partner_config = Config.partner_data.data_get_compound_info;
 
    for (var i = 0; i < item_list.length; ++i) {
      var v = item_list[i];
 
      if (v.quality != -1 && v.base_id) {
        if (partner_config[v.base_id]) {
          if (v.quantity >= partner_config[v.base_id].num) {
            status = true;
            break;
          }
        } // --神器的时候
        // let hallow_list = BackpackController:getModel():getHallowsCompData(v.base_id)
        // if hallow_list and next(hallow_list) ~= nil then
        //     if v.quantity >= hallow_list.num then
        //         status = true
        //         break
        //     end
        // end
 
      }
    }
 
    self.tab_list[3].red_point.active = status; //--仅碎片需要红点显示
  },
 
  /**
   * 切换标签页
   * @param {*} index 
   */
  changeTabView: function changeTabView(index) {
    if (this.cur_index == index) {
      return;
    }
 
    if (this.cur_tab) {
      this.cur_tab.select.active = false;
      this.cur_tab.title.color = this.normal_color;
      this.cur_tab.title_outline.color = this.normal_outlinecolor;
    }
 
    this.cur_index = index;
    this.cur_tab = this.tab_list[index];
 
    if (this.cur_tab) {
      this.cur_tab.select.active = true;
      this.cur_tab.title.color = this.select_color;
      this.cur_tab.title_outline.color = this.select_outlinecolor;
    }
 
    this.setPanelData();
  },
 
  /**
   * 设置当前显示标签页内容
   */
  setPanelData: function setPanelData() {
    if (this.cur_index == null) {
      return;
    }
 
    if (this.cur_index == BackPackConst.item_tab_type.HERO) {
      this.item_scrollview.setSpaceY(30, true);
    } else {
      this.item_scrollview.setSpaceY(10);
    }
 
    var item_list = BackPackController.getInstance().getModel().getAllBackPackArray(this.cur_index); // 这个是一个数组
 
    var item_total_length = item_list.length; // 不足30个补满30个.不足5的倍数,补满5的倍数
 
    this.min_size = item_total_length;
 
    if (this.min_size < 30) {
      this.min_size = 30;
    } else if (this.min_size % this.col_size != 0) {
      this.min_size = this.min_size + this.col_size - this.min_size % this.col_size;
    } // 需要填充的数量
 
 
    var fill_num = this.min_size - item_total_length;
 
    if (fill_num > 0) {
      for (var index = 0; index < fill_num; index++) {
        item_list.push({
          sort: -1,
          quality: -1,
          undata: true
        });
      }
    }
 
    var callback = function (cell) {
      this.selectedItem(cell);
    }.bind(this);
 
    var sort_func = null;
 
    if (this.cur_index == BackPackConst.item_tab_type.EQUIPS) {
      sort_func = Utils.tableUpperSorter(["quality", "sort"]);
    } else if (this.cur_index == BackPackConst.item_tab_type.PROPS) {
      sort_func = Utils.tableUpperSorter(["quality", "sort", "base_id"]);
    } else if (this.cur_index == BackPackConst.item_tab_type.SPECIAL) {
      // 特殊分页只有符文,星级越大的放前面
      sort_func = function sort_func(objA, objB) {
        return objA.quality > objB.quality ? -1 : 1;
      };
    } else if (this.cur_index == BackPackConst.item_tab_type.HERO) {
      var checkIsFull = function checkIsFull(data) {
        var is_full = false;
 
        if (data.quality != -1 && data.base_id) {
          if (Config.partner_data.data_get_compound_info[data.base_id]) {
            if (data.quantity >= Config.partner_data.data_get_compound_info[data.base_id].num) {
              is_full = true;
            }
          }
        }
 
        return is_full;
      };
 
      var sortFunc = function sortFunc(objA, objB) {
        if (checkIsFull(objA) && !checkIsFull(objB)) {
          return -1;
        } else if (!checkIsFull(objA) && checkIsFull(objB)) {
          return 1;
        } else {
          if (objA.quality != -1 && objA.base_id && objB.quality != -1 && objB.base_id) {
            if (objA.quality == objB.quality) {
              return objA.base_id < objB.base_id ? -1 : 1;
            } else {
              return objA.quality > objB.quality ? -1 : 1;
            }
          } else if (objA.quality != -1 && objA.base_id && objB.quality == -1) {
            return -1;
          } else if (objA.quality == -1 && objB.quality != -1 && objB.base_id) {
            return 1;
          } else {
            return 1;
          }
        }
      };
 
      sort_func = sortFunc; // --英雄碎片需要取消红点
 
      var MainuiController = require("mainui_controller");
 
      var MainuiConst = require("mainui_const");
 
      MainuiController.getInstance().setBtnRedPoint(MainuiConst.btn_index.backpack, false);
    } else {
      sort_func = Utils.tableUpperSorter(["sort", "quality"]);
    }
 
    item_list.sort(sort_func);
    var ext = {
      is_other: false,
      scale: 1,
      effect: false,
      is_show_tips: false,
      is_show_chip_loading: true
    };
 
    if (this.cur_index == 3) {
      ext.is_comp_num = true;
    } else {
      ext.is_comp_num = false;
    }
 
    this.item_scrollview.setData(item_list, callback, ext);
  },
  // 点击返回,显示tips
  selectedItem: function selectedItem(cell) {
    if (cell == null) return;
    var data = cell.getItemData();
    if (data == null) return;
    var data_config = cell.getItemConfig();
    if (data_config == null) return;
 
    var TipsController = require("tips_controller");
 
    if (BackPackConst.checkIsEquip(data_config.type)) {
      // 装备
      TipsController.getInstance().showEquipTips(data, TipsConst.eqmTips.backpack);
    } else if (data_config.type == BackPackConst.item_type.ARTIFACTCHIPS) {
      // 符文
      var PartnerConst = require("partner_const");
 
      require("hero_controller").getInstance().openArtifactTipsWindow(true, data, PartnerConst.ArtifactTips.backpack);
    } else if (data_config.sub_type == BackPackConst.item_tab_type.HERO) {
      // 碎片
      TipsController.getInstance().showBackPackCompTips(true, data.base_id);
    } else if (BackPackConst.checkIsHeroSkin(data_config.type)) {
      var HeroController = require("hero_controller");
 
      var PartnerConst = require("partner_const"); //皮肤
 
 
      HeroController.getInstance().openHeroSkinTipsPanel(true, data, PartnerConst.EqmTips.backpack);
    } else {
      TipsController.getInstance().showGoodsTips(data, true);
    }
  },
  updateBackPack: function updateBackPack(bag_code, item_list) {
    if (this.cur_index == null) return;
 
    if (this.cur_index == BackPackConst.item_tab_type.EQUIPS) {
      if (bag_code != BackPackConst.Bag_Code.EQUIPS) return;
    } else {
      if (bag_code == BackPackConst.Bag_Code.EQUIPS) return;
    }
 
    if (item_list == null || Object.keys(item_list).length == 0) return;
    var can_update = false;
 
    for (var key in item_list) {
      var vo = item_list[key];
 
      if (vo.sub_type == this.cur_index) {
        can_update = true;
        break;
      }
    }
 
    if (can_update) {
      this.setPanelData();
    }
  },
  closeCallBack: function closeCallBack() {
    BackPackController.getInstance().openMainWindow(false);
 
    if (this.item_scrollview) {
      this.item_scrollview.DeleteMe();
    }
 
    this.item_scrollview = null;
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYWNrcGFja1xcdmlld1xcYmFja3BhY2tfd2luZG93LmpzIl0sIm5hbWVzIjpbIlBhdGhUb29sIiwicmVxdWlyZSIsIkJhY2tQYWNrQ29udHJvbGxlciIsIkJhY2tQYWNrQ29uc3QiLCJDb21tb25TY3JvbGxWaWV3IiwiVGlwc0NvbnN0IiwiQmFja3BhY2tFdmVudCIsIkd1aWRlQ29udHJvbGxlciIsIkJhY2tQYWNrV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInJsZWFzZVByZWZhYiIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwidmlld1RhZyIsIlNDRU5FX1RBRyIsInVpIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiRnVsbCIsImluaXRDb25maWciLCJwYW5lbF9saXN0IiwidGFiX2xpc3QiLCJtaW5fc2l6ZSIsImNvbF9zaXplIiwibm9ybWFsX2NvbG9yIiwiQ29sb3IiLCJub3JtYWxfb3V0bGluZWNvbG9yIiwic2VsZWN0X2NvbG9yIiwic2VsZWN0X291dGxpbmVjb2xvciIsIm9wZW5DYWxsQmFjayIsInRpdGxlX2xpc3QiLCJVdGlscyIsIlRJMThOIiwibWFpbkNvbnRhaW5lciIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJ0aXRsZV9lZmZlY3QiLCJnZXRDb21wb25lbnQiLCJzcCIsIlNrZWxldG9uIiwiYW5pbWFfcGF0aCIsImdldFNwaW5lUGF0aCIsImdldEVmZmVjdFJlcyIsImxvYWRSZXMiLCJza2VfZGF0YSIsInNrZWxldG9uRGF0YSIsInNldEFuaW1hdGlvbiIsIlBsYXllckFjdGlvbiIsInN0YW5kIiwiYmluZCIsImJhY2tncm91bmQiLCJzZWVrQ2hpbGQiLCJzY2FsZSIsIkZJVF9TQ0FMRSIsInRhYl9jb250YWluZXIiLCJpbmRleCIsIm9iamVjdCIsIm5ld19pbmRleCIsImJ0biIsIm5vcm1hbCIsInNlbGVjdCIsInJlZF9wb2ludCIsInRpdGxlIiwidGl0bGVfbGFiZWwiLCJMYWJlbCIsInRpdGxlX291dGxpbmUiLCJMYWJlbE91dGxpbmUiLCJzdHJpbmciLCJjb250YWluZXIiLCJzY3JvbGxfdmlld19zaXplIiwic2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm9uY2VfbnVtIiwibmVlZF9keW5hbWljIiwiaXRlbV9zY3JvbGx2aWV3IiwiY3JlYXRlU2Nyb2xsIiwidjIiLCJTY3JvbGxWaWV3RGlyIiwidmVydGljYWwiLCJTY3JvbGxWaWV3U3RhcnRQb3MiLCJ0b3AiLCJnZXRJbnN0YW5jZSIsImlzSW5HdWlkZSIsInNldENsaWNrRW5hYmxlZCIsInJlZ2lzdGVyRXZlbnQiLCJlbGVtZW50Iiwia2V5Iiwib24iLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwiZXZlbnQiLCJjaGFuZ2VUYWJWaWV3IiwiYWRkR2xvYmFsRXZlbnQiLCJFdmVudElkIiwiQUREX0dPT0RTIiwiYmFnX2NvZGUiLCJpdGVtX2xpc3QiLCJ1cGRhdGVCYWNrUGFjayIsIkRFTEVURV9HT09EUyIsIk1PRElGWV9HT09EU19OVU0iLCJjdXJfaW5kZXgiLCJpc0NvbXBSZWRQb2ludCIsIkNvbXBvc2VfQmFja1BhY2tfU3VjY2VzcyIsInNldFBhbmVsRGF0YSIsIm9wZW5Sb290V25kIiwicGFyYW1zIiwiaXRlbV90YWJfdHlwZSIsIkVRVUlQUyIsInNlbGYiLCJnZXRNb2RlbCIsImdldEFsbEJhY2tQYWNrQXJyYXkiLCJzdGF0dXMiLCJwYXJ0bmVyX2NvbmZpZyIsIkNvbmZpZyIsInBhcnRuZXJfZGF0YSIsImRhdGFfZ2V0X2NvbXBvdW5kX2luZm8iLCJpIiwibGVuZ3RoIiwidiIsInF1YWxpdHkiLCJiYXNlX2lkIiwicXVhbnRpdHkiLCJudW0iLCJhY3RpdmUiLCJjdXJfdGFiIiwiY29sb3IiLCJIRVJPIiwic2V0U3BhY2VZIiwiaXRlbV90b3RhbF9sZW5ndGgiLCJmaWxsX251bSIsInB1c2giLCJzb3J0IiwidW5kYXRhIiwiY2FsbGJhY2siLCJjZWxsIiwic2VsZWN0ZWRJdGVtIiwic29ydF9mdW5jIiwidGFibGVVcHBlclNvcnRlciIsIlBST1BTIiwiU1BFQ0lBTCIsIm9iakEiLCJvYmpCIiwiY2hlY2tJc0Z1bGwiLCJkYXRhIiwiaXNfZnVsbCIsInNvcnRGdW5jIiwiTWFpbnVpQ29udHJvbGxlciIsIk1haW51aUNvbnN0Iiwic2V0QnRuUmVkUG9pbnQiLCJidG5faW5kZXgiLCJiYWNrcGFjayIsImV4dCIsImlzX290aGVyIiwiZWZmZWN0IiwiaXNfc2hvd190aXBzIiwiaXNfc2hvd19jaGlwX2xvYWRpbmciLCJpc19jb21wX251bSIsInNldERhdGEiLCJnZXRJdGVtRGF0YSIsImRhdGFfY29uZmlnIiwiZ2V0SXRlbUNvbmZpZyIsIlRpcHNDb250cm9sbGVyIiwiY2hlY2tJc0VxdWlwIiwidHlwZSIsInNob3dFcXVpcFRpcHMiLCJlcW1UaXBzIiwiaXRlbV90eXBlIiwiQVJUSUZBQ1RDSElQUyIsIlBhcnRuZXJDb25zdCIsIm9wZW5BcnRpZmFjdFRpcHNXaW5kb3ciLCJBcnRpZmFjdFRpcHMiLCJzdWJfdHlwZSIsInNob3dCYWNrUGFja0NvbXBUaXBzIiwiY2hlY2tJc0hlcm9Ta2luIiwiSGVyb0NvbnRyb2xsZXIiLCJvcGVuSGVyb1NraW5UaXBzUGFuZWwiLCJFcW1UaXBzIiwic2hvd0dvb2RzVGlwcyIsIkJhZ19Db2RlIiwiT2JqZWN0Iiwia2V5cyIsImNhbl91cGRhdGUiLCJ2byIsImNsb3NlQ2FsbEJhY2siLCJvcGVuTWFpbldpbmRvdyIsIkRlbGV0ZU1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBR0MsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUMsa0JBQWtCLEdBQUdELE9BQU8sQ0FBQyxxQkFBRCxDQUFo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Q0g7QUFyVHlCLENBQVQsQ0FBckIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiBzaGlyYWhvQHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOiDjOWMheS4u+eVjOmdolxuLy8gPGJyLz5DcmVhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcbnZhciBCYWNrUGFja0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiYmFja3BhY2tfY29udHJvbGxlclwiKTtcbnZhciBCYWNrUGFja0NvbnN0ID0gcmVxdWlyZShcImJhY2twYWNrX2NvbnN0XCIpO1xudmFyIENvbW1vblNjcm9sbFZpZXcgPSByZXF1aXJlKFwiY29tbW9uX3Njcm9sbHZpZXdcIik7XG52YXIgVGlwc0NvbnN0ID0gcmVxdWlyZShcInRpcHNfY29uc3RcIik7XG52YXIgQmFja3BhY2tFdmVudCA9IHJlcXVpcmUoXCJiYWNrcGFja19ldmVudFwiKTtcbnZhciBHdWlkZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwiZ3VpZGVfY29udHJvbGxlclwiKTtcblxudmFyIEJhY2tQYWNrV2luZG93ID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VWaWV3LFxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5ybGVhc2VQcmVmYWIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVmYWJQYXRoID0gUGF0aFRvb2wuZ2V0UHJlZmFiUGF0aChcImJhY2twYWNrXCIsIFwiYmFja3BhY2tfd2luZG93XCIpO1xuICAgICAgICB0aGlzLnZpZXdUYWcgPSBTQ0VORV9UQUcudWk7XG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkZ1bGw7XG4gICAgfSxcblxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMucGFuZWxfbGlzdCA9IHt9O1xuICAgICAgICB0aGlzLnRhYl9saXN0ID0ge307XG4gICAgICAgIHRoaXMubWluX3NpemUgPSAzMDsgICAgIC8vIOavj+S4gOmhteacgOWwj+eahOeJqeWTgeaVsOebrlxuICAgICAgICB0aGlzLmNvbF9zaXplID0gNTsgICAgICAvLyDkuIDooYzmnIDlpJpcbiAgICAgICAgdGhpcy5ub3JtYWxfY29sb3IgPSBuZXcgY2MuQ29sb3IoMHhkMywgMHhiNCwgMHg5YiwgMHhmZilcbiAgICAgICAgdGhpcy5ub3JtYWxfb3V0bGluZWNvbG9yID0gbmV3IGNjLkNvbG9yKDB4NDAsIDB4MjIsIDB4MTUsIDB4ZmYpXG4gICAgICAgIHRoaXMuc2VsZWN0X2NvbG9yID0gbmV3IGNjLkNvbG9yKDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYpXG4gICAgICAgIHRoaXMuc2VsZWN0X291dGxpbmVjb2xvciA9IG5ldyBjYy5Db2xvcigweDZkLCAweDM1LCAweDA3LCAweGZmKVxuICAgIH0sXG5cbiAgICBvcGVuQ2FsbEJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRpdGxlX2xpc3QgPSBbVXRpbHMuVEkxOE4oXCLoo4XlpIdcIiksIFV0aWxzLlRJMThOKFwi6YGT5YW3XCIpLCBVdGlscy5USTE4TihcIueijueJh1wiKSwgVXRpbHMuVEkxOE4oXCLnibnmropcIildXG4gICAgICAgIFxuICAgICAgICB0aGlzLm1haW5Db250YWluZXIgPSB0aGlzLnJvb3Rfd25kLmdldENoaWxkQnlOYW1lKFwibWFpbl9jb250YWluZXJcIik7XG4gICAgICAgIHRoaXMudGl0bGVfZWZmZWN0ID0gdGhpcy5tYWluQ29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGl0bGVfaW1nXCIpLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XG4gICAgICAgIHZhciBhbmltYV9wYXRoID0gUGF0aFRvb2wuZ2V0U3BpbmVQYXRoKFBhdGhUb29sLmdldEVmZmVjdFJlcyg2NDApLCBcImFjdGlvblwiKTtcbiAgICAgICAgdGhpcy5sb2FkUmVzKGFuaW1hX3BhdGgsIGZ1bmN0aW9uKHNrZV9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlX2VmZmVjdC5za2VsZXRvbkRhdGEgPSBza2VfZGF0YTtcbiAgICAgICAgICAgIHRoaXMudGl0bGVfZWZmZWN0LnNldEFuaW1hdGlvbigwLCBQbGF5ZXJBY3Rpb24uc3RhbmQsIHRydWUpO1xuICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcbiAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLnNjYWxlID0gRklUX1NDQUxFO1xuXG4gICAgICAgIHZhciB0YWJfY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJ0YWJfY29udGFpbmVyXCIpXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0ge31cbiAgICAgICAgICAgIHZhciBuZXdfaW5kZXggPSBpbmRleCArIDFcbiAgICAgICAgICAgIG9iamVjdC5idG4gPSB0YWJfY29udGFpbmVyLmdldENoaWxkQnlOYW1lKFwidGFiX2J0bl9cIiArIG5ld19pbmRleCkgICAgICAgLy/ojrflj5bkuLvoioLngrlcbiAgICAgICAgICAgIG9iamVjdC5ub3JtYWwgPSBvYmplY3QuYnRuLmdldENoaWxkQnlOYW1lKFwibm9ybWFsXCIpICAgICAgICAgICAgICAgICAgICAgLy/mma7pgJrnirbmgIFcbiAgICAgICAgICAgIG9iamVjdC5zZWxlY3QgPSBvYmplY3QuYnRuLmdldENoaWxkQnlOYW1lKFwic2VsZWN0XCIpICAgICAgICAgICAgICAgICAgICAgLy/pgInkuK3nirbmgIFcbiAgICAgICAgICAgIG9iamVjdC5yZWRfcG9pbnQgPSBvYmplY3QuYnRuLmdldENoaWxkQnlOYW1lKFwicmVkX3BvaW50XCIpICAgICAgICAgICAgICAgLy/nuqLngrlcbiAgICAgICAgICAgIG9iamVjdC50aXRsZSA9IG9iamVjdC5idG4uZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKSAgICAgICAgICAgICAgICAgICAgICAgLy9sYWJlbOWvueixoVxuICAgICAgICAgICAgb2JqZWN0LnRpdGxlX2xhYmVsID0gb2JqZWN0LnRpdGxlLmdldENvbXBvbmVudChjYy5MYWJlbCkgICAgICAgICAgICAgICAgLy9sYWJlbFxuICAgICAgICAgICAgb2JqZWN0LnRpdGxlX291dGxpbmUgPSBvYmplY3QudGl0bGUuZ2V0Q29tcG9uZW50KGNjLkxhYmVsT3V0bGluZSkgICAgICAgLy/mj4/ovrlcbiAgICAgICAgICAgIG9iamVjdC50aXRsZV9sYWJlbC5zdHJpbmcgPSB0aXRsZV9saXN0W2luZGV4XVxuICAgICAgICAgICAgb2JqZWN0LmluZGV4ID0gbmV3X2luZGV4XG4gICAgICAgICAgICB0aGlzLnRhYl9saXN0W25ld19pbmRleF0gPSBvYmplY3Q7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5zZWVrQ2hpbGQoXCJjb250YWluZXJcIilcbiAgICAgICAgdmFyIHNjcm9sbF92aWV3X3NpemUgPSBjYy5zaXplKDYyMCw2MDApXG4gICAgICAgIHZhciBzZXR0aW5nID0ge1xuICAgICAgICAgICAgaXRlbV9jbGFzczogXCJiYWNrcGFja19pdGVtXCIsICAgICAgLy8g5Y2V5YWD57G7XG4gICAgICAgICAgICBzdGFydF94OiAwLCAgICAgICAgICAgICAgICAgICAgLy8g56ys5LiA5Liq5Y2V5YWD55qEWOi1t+eCuVxuICAgICAgICAgICAgc3BhY2VfeDogNCwgICAgICAgICAgICAgICAgICAgIC8vIHjmlrnlkJHnmoTpl7TpmpRcbiAgICAgICAgICAgIHN0YXJ0X3k6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XG4gICAgICAgICAgICBzcGFjZV95OiAxMCwgICAgICAgICAgICAgICAgICAgLy8geeaWueWQkeeahOmXtOmalFxuICAgICAgICAgICAgaXRlbV93aWR0aDogMTIwLCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXG4gICAgICAgICAgICBpdGVtX2hlaWdodDogMTIwLCAgICAgICAgICAgICAgLy8g5Y2V5YWD55qE5bC65a+4aGVpZ2h0XG4gICAgICAgICAgICByb3c6IDUsICAgICAgICAgICAgICAgICAgICAgICAgLy8g6KGM5pWw77yM5L2c55So5LqO5rC05bmz5rua5Yqo57G75Z6LXG4gICAgICAgICAgICBjb2w6IDUsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXG4gICAgICAgICAgICBvbmNlX251bTogNSxcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbmV3IENvbW1vblNjcm9sbFZpZXcoKVxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwoY29udGFpbmVyLCBjYy52MigwLCAtMzApLCBTY3JvbGxWaWV3RGlyLnZlcnRpY2FsLCBTY3JvbGxWaWV3U3RhcnRQb3MudG9wLCBzY3JvbGxfdmlld19zaXplLCBzZXR0aW5nLCBjYy52MigwLjUsMC41KSlcblxuICAgICAgICBpZiAoR3VpZGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuaXNJbkd1aWRlKCkpXG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXRDbGlja0VuYWJsZWQoZmFsc2UpO1xuICAgIH0sXG5cbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMudGFiX2xpc3Qpe1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFiX2xpc3Rba2V5XVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuYnRuKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCAoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGFiVmlldyhlbGVtZW50LmluZGV4KVxuICAgICAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkFERF9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3Qpe1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrUGFjayhiYWdfY29kZSwgaXRlbV9saXN0KVxuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChFdmVudElkLkRFTEVURV9HT09EUywgZnVuY3Rpb24gKGJhZ19jb2RlLCBpdGVtX2xpc3QpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQmFja1BhY2soYmFnX2NvZGUsIGl0ZW1fbGlzdClcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIHRoaXMuYWRkR2xvYmFsRXZlbnQoRXZlbnRJZC5NT0RJRllfR09PRFNfTlVNLCBmdW5jdGlvbiAoYmFnX2NvZGUsIGl0ZW1fbGlzdCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCYWNrUGFjayhiYWdfY29kZSwgaXRlbV9saXN0KVxuICAgICAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gMyl7IFxuICAgICAgICAgICAgICAgIHRoaXMuaXNDb21wUmVkUG9pbnQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LmJpbmQodGhpcykpXG5cbiAgICAgICAgdGhpcy5hZGRHbG9iYWxFdmVudChCYWNrcGFja0V2ZW50LkNvbXBvc2VfQmFja1BhY2tfU3VjY2VzcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pc0NvbXBSZWRQb2ludCgpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYW5lbERhdGEoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgIH0sXG5cbiAgICBvcGVuUm9vdFduZDogZnVuY3Rpb24gKHBhcmFtcyl7XG4gICAgICAgIHZhciBpbmRleCA9IHBhcmFtcyB8fCBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuRVFVSVBTXG4gICAgICAgIHRoaXMuY2hhbmdlVGFiVmlldyhpbmRleClcbiAgICAgICAgdGhpcy5pc0NvbXBSZWRQb2ludCgpXG4gICAgfSxcbiAgICAvLyAtLeWIpOaWreeijueJh+aYr+WQpuaYvuekuue6oueCuVxuICAgIGlzQ29tcFJlZFBvaW50KCl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBsZXQgaXRlbV9saXN0ID0gQmFja1BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRBbGxCYWNrUGFja0FycmF5KDMpXG4gICAgICAgIGxldCBzdGF0dXMgPSBmYWxzZVxuICAgICAgICBsZXQgcGFydG5lcl9jb25maWcgPSBDb25maWcucGFydG5lcl9kYXRhLmRhdGFfZ2V0X2NvbXBvdW5kX2luZm9cbiAgICAgICAgZm9yKGxldCBpPTA7aTxpdGVtX2xpc3QubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGl0ZW1fbGlzdFtpXVxuICAgICAgICAgICAgaWYodi5xdWFsaXR5ICE9IC0xICYmIHYuYmFzZV9pZCl7XG4gICAgICAgICAgICAgICAgaWYocGFydG5lcl9jb25maWdbdi5iYXNlX2lkXSl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHYucXVhbnRpdHkgPj0gcGFydG5lcl9jb25maWdbdi5iYXNlX2lkXS5udW0pe1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAtLeelnuWZqOeahOaXtuWAmVxuICAgICAgICAgICAgICAgIC8vIGxldCBoYWxsb3dfbGlzdCA9IEJhY2twYWNrQ29udHJvbGxlcjpnZXRNb2RlbCgpOmdldEhhbGxvd3NDb21wRGF0YSh2LmJhc2VfaWQpXG4gICAgICAgICAgICAgICAgLy8gaWYgaGFsbG93X2xpc3QgYW5kIG5leHQoaGFsbG93X2xpc3QpIH49IG5pbCB0aGVuXG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIHYucXVhbnRpdHkgPj0gaGFsbG93X2xpc3QubnVtIHRoZW5cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHN0YXR1cyA9IHRydWVcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgLy8gICAgIGVuZFxuICAgICAgICAgICAgICAgIC8vIGVuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYudGFiX2xpc3RbM10ucmVkX3BvaW50LmFjdGl2ZSA9IHN0YXR1cyAvLy0t5LuF56KO54mH6ZyA6KaB57qi54K55pi+56S6XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiDliIfmjaLmoIfnrb7pobVcbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFxuICAgICAqL1xuICAgIGNoYW5nZVRhYlZpZXc6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZih0aGlzLmN1cl9pbmRleCA9PSBpbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cl90YWIpe1xuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLnNlbGVjdC5hY3RpdmUgPSBmYWxzZVxuICAgICAgICAgICAgdGhpcy5jdXJfdGFiLnRpdGxlLmNvbG9yID0gdGhpcy5ub3JtYWxfY29sb3JcbiAgICAgICAgICAgIHRoaXMuY3VyX3RhYi50aXRsZV9vdXRsaW5lLmNvbG9yID0gdGhpcy5ub3JtYWxfb3V0bGluZWNvbG9yXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJfaW5kZXggPSBpbmRleFxuICAgICAgICB0aGlzLmN1cl90YWIgPSB0aGlzLnRhYl9saXN0W2luZGV4XVxuICAgICAgICBpZiAodGhpcy5jdXJfdGFiKSB7XG4gICAgICAgICAgICB0aGlzLmN1cl90YWIuc2VsZWN0LmFjdGl2ZSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuY3VyX3RhYi50aXRsZS5jb2xvciA9IHRoaXMuc2VsZWN0X2NvbG9yXG4gICAgICAgICAgICB0aGlzLmN1cl90YWIudGl0bGVfb3V0bGluZS5jb2xvciA9IHRoaXMuc2VsZWN0X291dGxpbmVjb2xvclxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0UGFuZWxEYXRhKClcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog6K6+572u5b2T5YmN5pi+56S65qCH562+6aG15YaF5a65XG4gICAgICovXG4gICAgc2V0UGFuZWxEYXRhOmZ1bmN0aW9uKCl7XG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jdXJfaW5kZXggPT0gQmFja1BhY2tDb25zdC5pdGVtX3RhYl90eXBlLkhFUk8pIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldFNwYWNlWSgzMCx0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldFNwYWNlWSgxMCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlbV9saXN0ID0gQmFja1BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKS5nZXRBbGxCYWNrUGFja0FycmF5KHRoaXMuY3VyX2luZGV4KSAgICAgLy8g6L+Z5Liq5piv5LiA5Liq5pWw57uEXG4gICAgICAgIHZhciBpdGVtX3RvdGFsX2xlbmd0aCA9IGl0ZW1fbGlzdC5sZW5ndGhcblxuICAgICAgICAvLyDkuI3otrMzMOS4quihpea7oTMw5LiqLuS4jei2szXnmoTlgI3mlbAs6KGl5ruhNeeahOWAjeaVsFxuICAgICAgICB0aGlzLm1pbl9zaXplID0gaXRlbV90b3RhbF9sZW5ndGhcbiAgICAgICAgaWYgKHRoaXMubWluX3NpemUgPCAzMCl7XG4gICAgICAgICAgICB0aGlzLm1pbl9zaXplID0gMzBcbiAgICAgICAgfWVsc2UgaWYoKHRoaXMubWluX3NpemUgJSB0aGlzLmNvbF9zaXplKSAhPSAwKXtcbiAgICAgICAgICAgIHRoaXMubWluX3NpemUgPSB0aGlzLm1pbl9zaXplICsgdGhpcy5jb2xfc2l6ZSAtIHRoaXMubWluX3NpemUgJSB0aGlzLmNvbF9zaXplIFxuICAgICAgICB9XG4gICAgICAgIC8vIOmcgOimgeWhq+WFheeahOaVsOmHj1xuICAgICAgICB2YXIgZmlsbF9udW0gPSB0aGlzLm1pbl9zaXplIC0gaXRlbV90b3RhbF9sZW5ndGhcbiAgICAgICAgaWYgKGZpbGxfbnVtID4gMCl7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmlsbF9udW07IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpdGVtX2xpc3QucHVzaCh7c29ydDotMSwgcXVhbGl0eTotMSwgdW5kYXRhOnRydWV9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGNlbGwpe1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0oY2VsbClcbiAgICAgICAgfS5iaW5kKHRoaXMpXG5cbiAgICAgICAgdmFyIHNvcnRfZnVuYyA9IG51bGw7XG4gICAgICAgIGlmKHRoaXMuY3VyX2luZGV4ID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5FUVVJUFMpe1xuICAgICAgICAgICAgc29ydF9mdW5jID0gVXRpbHMudGFibGVVcHBlclNvcnRlcihbXCJxdWFsaXR5XCIsXCJzb3J0XCJdKTtcbiAgICAgICAgfWVsc2UgaWYgKHRoaXMuY3VyX2luZGV4ID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5QUk9QUyl7XG4gICAgICAgICAgICBzb3J0X2Z1bmMgPSBVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInF1YWxpdHlcIixcInNvcnRcIixcImJhc2VfaWRcIl0pO1xuICAgICAgICB9ZWxzZSBpZih0aGlzLmN1cl9pbmRleCA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuU1BFQ0lBTCl7XG4gICAgICAgICAgICAvLyDnibnmrorliIbpobXlj6rmnInnrKbmlofvvIzmmJ/nuqfotorlpKfnmoTmlL7liY3pnaJcbiAgICAgICAgICAgIHNvcnRfZnVuYyA9IGZ1bmN0aW9uICggb2JqQSwgb2JqQiApe1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLnF1YWxpdHkgPiBvYmpCLnF1YWxpdHk/LTE6MTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1lbHNlIGlmKHRoaXMuY3VyX2luZGV4ID09IEJhY2tQYWNrQ29uc3QuaXRlbV90YWJfdHlwZS5IRVJPKXtcbiAgICAgICAgICAgIHZhciBjaGVja0lzRnVsbCA9IGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICAgICAgICAgIHZhciBpc19mdWxsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYoZGF0YS5xdWFsaXR5ICE9IC0xICYmIGRhdGEuYmFzZV9pZCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKENvbmZpZy5wYXJ0bmVyX2RhdGEuZGF0YV9nZXRfY29tcG91bmRfaW5mb1tkYXRhLmJhc2VfaWRdKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEucXVhbnRpdHkgPj0gQ29uZmlnLnBhcnRuZXJfZGF0YS5kYXRhX2dldF9jb21wb3VuZF9pbmZvW2RhdGEuYmFzZV9pZF0ubnVtKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19mdWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNfZnVsbDtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBzb3J0RnVuYyA9IGZ1bmN0aW9uKG9iakEsIG9iakIpe1xuICAgICAgICAgICAgICAgIGlmKGNoZWNrSXNGdWxsKG9iakEpICYmICFjaGVja0lzRnVsbChvYmpCKSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZighY2hlY2tJc0Z1bGwob2JqQSkgJiYgY2hlY2tJc0Z1bGwob2JqQikpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICAgaWYob2JqQS5xdWFsaXR5ICE9IC0xICYmIG9iakEuYmFzZV9pZCAmJiBvYmpCLnF1YWxpdHkgIT0gLTEgJiYgb2JqQi5iYXNlX2lkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKG9iakEucXVhbGl0eSA9PSBvYmpCLnF1YWxpdHkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLmJhc2VfaWQgPCBvYmpCLmJhc2VfaWQ/LTE6MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLnF1YWxpdHkgPiBvYmpCLnF1YWxpdHk/LTE6MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYob2JqQS5xdWFsaXR5ICE9IC0xICYmIG9iakEuYmFzZV9pZCAmJiBvYmpCLnF1YWxpdHkgPT0gLTEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihvYmpBLnF1YWxpdHkgPT0gLTEgJiYgb2JqQi5xdWFsaXR5ICE9IC0xICYmIG9iakIuYmFzZV9pZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHNvcnRfZnVuYyA9IHNvcnRGdW5jO1xuICAgICAgICAgICAgLy8gLS3oi7Hpm4Tnoo7niYfpnIDopoHlj5bmtojnuqLngrlcbiAgICAgICAgICAgIHZhciBNYWludWlDb250cm9sbGVyID0gcmVxdWlyZShcIm1haW51aV9jb250cm9sbGVyXCIpXG4gICAgICAgICAgICB2YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpXG4gICAgICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0QnRuUmVkUG9pbnQoTWFpbnVpQ29uc3QuYnRuX2luZGV4LmJhY2twYWNrLCBmYWxzZSlcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBzb3J0X2Z1bmMgPSBVdGlscy50YWJsZVVwcGVyU29ydGVyKFtcInNvcnRcIiwgXCJxdWFsaXR5XCJdKTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtX2xpc3Quc29ydChzb3J0X2Z1bmMpO1xuXG4gICAgICAgIHZhciBleHQgPSB7aXNfb3RoZXI6ZmFsc2UsIHNjYWxlOjEsIGVmZmVjdDpmYWxzZSwgaXNfc2hvd190aXBzOmZhbHNlLCBpc19zaG93X2NoaXBfbG9hZGluZzp0cnVlfTtcbiAgICAgICAgaWYodGhpcy5jdXJfaW5kZXggPT0gMyl7XG4gICAgICAgICAgICBleHQuaXNfY29tcF9udW0gPSB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGV4dC5pc19jb21wX251bSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3LnNldERhdGEoaXRlbV9saXN0LCBjYWxsYmFjaywgZXh0KTtcbiAgICB9LFxuXG4gICAgLy8g54K55Ye76L+U5ZueLOaYvuekunRpcHNcbiAgICBzZWxlY3RlZEl0ZW06ZnVuY3Rpb24oY2VsbCl7XG4gICAgICAgIGlmIChjZWxsID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIGRhdGEgPSBjZWxsLmdldEl0ZW1EYXRhKClcbiAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB2YXIgZGF0YV9jb25maWcgPSBjZWxsLmdldEl0ZW1Db25maWcoKVxuICAgICAgICBpZiAoZGF0YV9jb25maWcgPT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICAgIHZhciBUaXBzQ29udHJvbGxlciA9IHJlcXVpcmUoXCJ0aXBzX2NvbnRyb2xsZXJcIilcbiAgICAgICAgaWYgKEJhY2tQYWNrQ29uc3QuY2hlY2tJc0VxdWlwKGRhdGFfY29uZmlnLnR5cGUpKXsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOijheWkh1xuICAgICAgICAgICAgVGlwc0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zaG93RXF1aXBUaXBzKGRhdGEsIFRpcHNDb25zdC5lcW1UaXBzLmJhY2twYWNrKVxuICAgICAgICB9ZWxzZSBpZihkYXRhX2NvbmZpZy50eXBlID09IEJhY2tQYWNrQ29uc3QuaXRlbV90eXBlLkFSVElGQUNUQ0hJUFMpeyAgICAgICAgLy8g56ym5paHXG4gICAgICAgICAgICB2YXIgUGFydG5lckNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJfY29uc3RcIik7XG4gICAgICAgICAgICByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkub3BlbkFydGlmYWN0VGlwc1dpbmRvdyh0cnVlLCBkYXRhLCBQYXJ0bmVyQ29uc3QuQXJ0aWZhY3RUaXBzLmJhY2twYWNrKVxuICAgICAgICB9ZWxzZSBpZihkYXRhX2NvbmZpZy5zdWJfdHlwZSA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuSEVSTyl7ICAgICAgICAgLy8g56KO54mHXG4gICAgICAgICAgICBUaXBzQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNob3dCYWNrUGFja0NvbXBUaXBzKHRydWUsZGF0YS5iYXNlX2lkKVxuICAgICAgICB9ZWxzZSBpZihCYWNrUGFja0NvbnN0LmNoZWNrSXNIZXJvU2tpbihkYXRhX2NvbmZpZy50eXBlKSl7ICAgICAgXG4gICAgICAgICAgICB2YXIgSGVyb0NvbnRyb2xsZXIgPSByZXF1aXJlKFwiaGVyb19jb250cm9sbGVyXCIpICAgICAgXG4gICAgICAgICAgICB2YXIgUGFydG5lckNvbnN0ID0gcmVxdWlyZShcInBhcnRuZXJfY29uc3RcIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nmq7ogqRcbiAgICAgICAgICAgIEhlcm9Db250cm9sbGVyLmdldEluc3RhbmNlKCkub3Blbkhlcm9Ta2luVGlwc1BhbmVsKHRydWUsIGRhdGEsIFBhcnRuZXJDb25zdC5FcW1UaXBzLmJhY2twYWNrKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIFRpcHNDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2hvd0dvb2RzVGlwcyhkYXRhLCB0cnVlKSBcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB1cGRhdGVCYWNrUGFjazpmdW5jdGlvbihiYWdfY29kZSwgaXRlbV9saXN0KXtcbiAgICAgICAgaWYgKHRoaXMuY3VyX2luZGV4ID09IG51bGwpIHJldHVybjtcblxuICAgICAgICBpZih0aGlzLmN1cl9pbmRleCA9PSBCYWNrUGFja0NvbnN0Lml0ZW1fdGFiX3R5cGUuRVFVSVBTKXtcbiAgICAgICAgICAgIGlmKGJhZ19jb2RlICE9IEJhY2tQYWNrQ29uc3QuQmFnX0NvZGUuRVFVSVBTKXJldHVybjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZihiYWdfY29kZSA9PSBCYWNrUGFja0NvbnN0LkJhZ19Db2RlLkVRVUlQUylyZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChpdGVtX2xpc3QgPT0gbnVsbCB8fCBPYmplY3Qua2V5cyhpdGVtX2xpc3QpLmxlbmd0aCA9PSAwKSByZXR1cm47XG4gICAgICAgIHZhciBjYW5fdXBkYXRlID0gZmFsc2VcbiAgICAgICAgZm9yKHZhciBrZXkgaW4gaXRlbV9saXN0KXtcbiAgICAgICAgICAgIHZhciB2byA9IGl0ZW1fbGlzdFtrZXldXG4gICAgICAgICAgICBpZiAodm8uc3ViX3R5cGUgPT0gdGhpcy5jdXJfaW5kZXgpe1xuICAgICAgICAgICAgICAgIGNhbl91cGRhdGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FuX3VwZGF0ZSl7XG4gICAgICAgICAgICB0aGlzLnNldFBhbmVsRGF0YSgpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24oKXtcbiAgICAgICAgQmFja1BhY2tDb250cm9sbGVyLmdldEluc3RhbmNlKCkub3Blbk1haW5XaW5kb3coZmFsc2UpXG4gICAgICAgIGlmICh0aGlzLml0ZW1fc2Nyb2xsdmlldyl7XG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5EZWxldGVNZSgpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pdGVtX3Njcm9sbHZpZXcgPSBudWxsXG4gICAgfSxcbn0pOyJdfQ==