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
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/friend/view/friend_add_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, '8f12clNRplDypP98v6Mecs5', 'friend_add_window');
// Scripts/mod/friend/view/friend_add_window.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: @syg.com(必填, 创建模块的人员)
// @description:
//      用户输入框
// <br/>Create: new Date().toISOString()
// --------------------------------------------------------------------
var FriendEvent = require("friend_event");
 
var PathTool = require("pathtool");
 
var FriendController = require("friend_controller");
 
var CommonScrollView = require("common_scrollview");
 
var FriendListItem = require("friend_list_item");
 
var FriendConst = require("friend_const");
 
var FriendAddWindow = cc.Class({
  "extends": BaseView,
  ctor: function ctor() {
    this.prefabPath = PathTool.getPrefabPath("friend", "friend_find_panel");
    this.ctrl = FriendController.getInstance();
    this.win_type = WinType.Big;
    this.scroll_width = 624;
    this.scroll_height = 570;
    this.create_index = 1;
    this.rend_list = new Array();
    this.cache_list = {};
    this.is_init = false;
  },
  openCallBack: function openCallBack() {
    this.background = this.seekChild("background");
    this.background.scale = FIT_SCALE;
    this.main_container = this.root_wnd.getChildByName("main_container");
    this.panel = this.main_container.getChildByName("panel");
    this.container = this.panel.getChildByName("container");
    this.main_panel = this.container.getChildByName("main_panel");
    this.top_panel = this.main_panel.getChildByName("top_panel");
    this.recommend_label = this.top_panel.getChildByName("recommend_label").getComponent(cc.Label);
    this.close_btn = this.panel.getChildByName("close_btn");
    this.scroll_con = this.main_panel.getChildByName("scroll_con"); //查找好友
 
    this.find_btn = this.top_panel.getChildByName("find_btn");
    this.edit_box = this.top_panel.getChildByName("edit_box").getComponent(cc.EditBox);
    this.edit_box.node.on("editing-return", function (event) {
      var str = event.string; // if GmCmd and GmCmd.show_from_chat and GmCmd:show_from_chat(str) then return end
    }, this); //刷新按钮
 
    this.flash_btn = this.main_panel.getChildByName("flash_btn");
    this.num_label = this.main_panel.getChildByName("rich_text").getComponent(cc.RichText);
    var all_num = this.ctrl.getModel().getBlackListOnlineAndTotal().total_num;
    var str = Utils.TI18N("好友数:") + all_num + "/100";
    this.num_label.string = str;
    var scroll_view_size = cc.size(this.scroll_width, this.scroll_height);
    var setting = {
      item_class: FriendListItem,
      // 单元类
      start_x: 0,
      // 第一个单元的X起点
      space_x: 0,
      // x方向的间隔
      start_y: 0,
      // 第一个单元的Y起点
      space_y: 2,
      // y方向的间隔
      item_width: 624,
      // 单元的尺寸width
      item_height: 114,
      // 单元的尺寸height
      row: 0,
      // 行数,作用于水平滚动类型
      col: 1,
      // 列数,作用于垂直滚动类型
      once_num: 1,
      item_obj: {
        open_type: 5
      },
      //参数
      need_dynamic: true
    };
    this.item_scrollview = new CommonScrollView();
    this.item_scrollview.createScroll(this.scroll_con, cc.v2(0, 0), ScrollViewDir.vertical, ScrollViewStartPos.top, scroll_view_size, setting, cc.v2(0.5, 0.5));
  },
  registerEvent: function registerEvent() {
    this.close_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      FriendController.getInstance().openFriendFindWindow(false);
    }, this); //申请好友列表返回
 
    if (!this.apply_list_event) {
      this.apply_list_event = gcore.GlobalEvent.bind(FriendEvent.UD_COMMEND_LIST, function (data_list) {
        this.updateFriendList(data_list);
      }.bind(this));
    }
 
    if (!this.find_friend_event) {
      this.find_friend_event = gcore.GlobalEvent.bind(FriendEvent.FRIEND_QUERY_RESULT, function (data_list) {
        this.recommend_label.string = "搜索结果";
        this.updateFriendList(data_list);
      }.bind(this));
    }
 
    this.flash_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      this.ctrl.recommend();
      this.recommend_label.string = "推荐好友";
    }.bind(this), this);
    this.find_btn.on(cc.Node.EventType.TOUCH_END, function (event) {
      var name = this.edit_box.string || "";
      this.ctrl.queryFind(name);
    }.bind(this), this); //请求推荐列表
 
    this.ctrl.recommend();
  },
  //显示空白
  showEmptyIcon: function showEmptyIcon(bool) {
    if (!this.empty_con && bool == false) return;
 
    if (!this.empty_con) {
      var size = cc.size(200, 200);
      this.empty_con = new cc.Node();
      this.empty_con.setContentSize(size);
      this.empty_con.setAnchorPoint(cc.v2(0.5, 0.5));
      this.empty_con.setPosition(cc.v2(0, 0));
      this.main_panel.addChild(this.empty_con);
      var res = PathTool.getBigBg("bigbg_3");
      this.empty_bg = Utils.createImage(this.empty_con, null, 0, 0, cc.v2(0.5, 0.5), false);
      this.loadRes(res, function (sf_obj) {
        this.empty_bg.spriteFrame = sf_obj;
      }.bind(this));
      this.empty_label = Utils.createLabel(26, new cc.Color(0x68, 0x45, 0x2a, 0xff), null, 0, -100, "", this.empty_con, 0, cc.v2(0.5, 0.5));
    }
 
    var str = Utils.TI18N("未搜索到玩家");
    this.empty_label.string = str;
    this.empty_con.active = bool;
  },
  openRootWnd: function openRootWnd(type) {
    type = type || FriendConst.Type.MyFriend;
  },
  closeCallBack: function closeCallBack() {
    this.ctrl.openFriendFindWindow(false);
    this.setscheduleUpdate(false);
 
    for (var i in this.cache_list) {
      var v = this.cache_list[i];
 
      if (v && v["DeleteMe"]) {
        v.DeleteMe();
        v = null;
      }
    }
 
    this.cache_list = null;
 
    if (this.apply_list_event) {
      gcore.GlobalEvent.unbind(this.apply_list_event);
      this.apply_list_event = null;
    }
 
    if (this.find_friend_event) {
      gcore.GlobalEvent.unbind(this.find_friend_event);
      this.find_friend_event = null;
    }
 
    if (this.item_scrollview) {
      this.item_scrollview.DeleteMe();
    }
 
    this.item_scrollview = null;
 
    if (this.empty_con) {
      this.empty_con.destroy();
      this.empty_label.destroy();
      this.empty_bg.destroy();
      this.empty_con = null;
      this.empty_bg = null;
      this.empty_label = null;
    }
  },
  updateFriendList: function updateFriendList(data_list) {
    // return
    for (var i in this.cache_list) {
      var v = this.cache_list[i]; // v.setVisible(false);
    }
 
    this.create_index = 1;
    var list = new Array();
 
    for (var i in data_list) {
      list.push(data_list[i]);
    }
 
    this.rend_list = list || [];
    this.showEmptyIcon(false);
 
    if (list.length <= 0) {
      {
        this.showEmptyIcon(true);
      }
    }
 
    if (this.is_init == true) {
      // this.setscheduleUpdate(true);
      this.is_init = false;
    } else {} // for (var i = 0; i < list.length; i++) {
    // this.createItem(list[i]);
    // }
    // list = [1,2,3]
 
 
    this.item_scrollview.setData(list);
  },
  setscheduleUpdate: function setscheduleUpdate(status) {
    if (status == true) {
      if (this.queue_timer == null) {
        this.queue_timer = gcore.Timer.set(function () {
          var vo = this.rend_list[this.create_index - 1];
          if (vo) this.createItem(vo);
          if (this.create_index >= this.rend_list.length + 1) this.setscheduleUpdate(false);
        }.bind(this), 1 / 60, -1);
      }
    } else {
      if (this.queue_timer != null) {
        gcore.Timer.del(this.queue_timer);
        this.queue_timer = null;
      }
    }
  },
  createItem: function createItem(vo) {
    var item = null;
 
    if (this.cache_list[this.create_index] == null) {
      item = new FriendListItem(this.create_index, 5);
      this.cache_list[this.create_index] = item;
      this.scroll_view.addChild(item);
    }
 
    item = this.cache_list[this.create_index];
    var offy = this.scroll_height - 120 * this.create_index; // item:setPosition(cc.p(self.scroll_view:getContentSize().width/2,offy))
    // item:setVisible(true)
    // item:setExtendData(5)
    // item:setData(vo)
 
    this.create_index = this.create_index + 1;
  }
});
module.exports = FriendAddWindow;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxmcmllbmRcXHZpZXdcXGZyaWVuZF9hZGRfd2luZG93LmpzIl0sIm5hbWVzIjpbIkZyaWVuZEV2ZW50IiwicmVxdWlyZSIsIlBhdGhUb29sIiwiRnJpZW5kQ29udHJvbGxlciIsIkNvbW1vblNjcm9sbFZpZXciLCJGcmllbmRMaXN0SXRlbSIsIkZyaWVuZENvbnN0IiwiRnJpZW5kQWRkV2luZG93IiwiY2MiLCJDbGFzcyIsIkJhc2VWaWV3IiwiY3RvciIsInByZWZhYlBhdGgiLCJnZXRQcmVmYWJQYXRoIiwiY3RybCIsImdldEluc3RhbmNlIiwid2luX3R5cGUiLCJXaW5UeXBlIiwiQmlnIiwic2Nyb2xsX3dpZHRoIiwic2Nyb2xsX2hlaWdodCIsImNyZWF0ZV9pbmRleCIsInJlbmRfbGlzdCIsIkFycmF5IiwiY2FjaGVfbGlzdCIsImlzX2luaXQiLCJvcGVuQ2FsbEJhY2siLCJiYWNrZ3JvdW5kIiwic2Vla0NoaWxkIiwic2NhbGUiLCJGSVRfU0NBTEUiLCJtYWluX2NvbnRhaW5lciIsInJvb3Rfd25kIiwiZ2V0Q2hpbGRCeU5hbWUiLCJwYW5lbCIsImNvbnRhaW5lciIsIm1haW5fcGFuZWwiLCJ0b3BfcGFuZWwiLCJyZWNvbW1lbmRfbGFiZWwiLCJnZXRDb21wb25lbnQiLCJMYWJlbCIsImNsb3NlX2J0biIsInNjcm9sbF9jb24iLCJmaW5kX2J0biIsImVkaXRfYm94IiwiRWRpdEJveCIsIm5vZGUiLCJvbiIsImV2ZW50Iiwic3RyIiwic3RyaW5nIiwiZmxhc2hfYnRuIiwibnVtX2xhYmVsIiwiUmljaFRleHQiLCJhbGxfbnVtIiwiZ2V0TW9kZWwiLCJnZXRCbGFja0xpc3RPbmxpbmVBbmRUb3RhbCIsInRvdGFsX251bSIsIlV0aWxzIiwiVEkxOE4iLCJzY3JvbGxfdmlld19zaXplIiwic2l6ZSIsInNldHRpbmciLCJpdGVtX2NsYXNzIiwic3RhcnRfeCIsInNwYWNlX3giLCJzdGFydF95Iiwic3BhY2VfeSIsIml0ZW1fd2lkdGgiLCJpdGVtX2hlaWdodCIsInJvdyIsImNvbCIsIm9uY2VfbnVtIiwiaXRlbV9vYmoiLCJvcGVuX3R5cGUiLCJuZWVkX2R5bmFtaWMiLCJpdGVtX3Njcm9sbHZpZXciLCJjcmVhdGVTY3JvbGwiLCJ2MiIsIlNjcm9sbFZpZXdEaXIiLCJ2ZXJ0aWNhbCIsIlNjcm9sbFZpZXdTdGFydFBvcyIsInRvcCIsInJlZ2lzdGVyRXZlbnQiLCJOb2RlIiwiRXZlbnRUeXBlIiwiVE9VQ0hfRU5EIiwib3BlbkZyaWVuZEZpbmRXaW5kb3ciLCJhcHBseV9saXN0X2V2ZW50IiwiZ2NvcmUiLCJHbG9iYWxFdmVudCIsImJpbmQiLCJVRF9DT01NRU5EX0xJU1QiLCJkYXRhX2xpc3QiLCJ1cGRhdGVGcmllbmRMaXN0IiwiZmluZF9mcmllbmRfZXZlbnQiLCJGUklFTkRfUVVFUllfUkVTVUxUIiwicmVjb21tZW5kIiwibmFtZSIsInF1ZXJ5RmluZCIsInNob3dFbXB0eUljb24iLCJib29sIiwiZW1wdHlfY29uIiwic2V0Q29udGVudFNpemUiLCJzZXRBbmNob3JQb2ludCIsInNldFBvc2l0aW9uIiwiYWRkQ2hpbGQiLCJyZXMiLCJnZXRCaWdCZyIsImVtcHR5X2JnIiwiY3JlYXRlSW1hZ2UiLCJsb2FkUmVzIiwic2Zfb2JqIiwic3ByaXRlRnJhbWUiLCJlbXB0eV9sYWJlbCIsImNyZWF0ZUxhYmVsIiwiQ29sb3IiLCJhY3RpdmUiLCJvcGVuUm9vdFduZCIsInR5cGUiLCJUeXBlIiwiTXlGcmllbmQiLCJjbG9zZUNhbGxCYWNrIiwic2V0c2NoZWR1bGVVcGRhdGUiLCJpIiwidiIsIkRlbGV0ZU1lIiwidW5iaW5kIiwiZGVzdHJveSIsImxpc3QiLCJwdXNoIiwibGVuZ3RoIiwic2V0RGF0YSIsInN0YXR1cyIsInF1ZXVlX3RpbWVyIiwiVGltZXIiLCJzZXQiLCJ2byIsImNyZWF0ZUl0ZW0iLCJkZWwiLCJpdGVtIiwic2Nyb2xsX3ZpZXciLCJvZmZ5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJQSxXQUFXLEdBQUdDLE9BQU8sQ0FBQyxjQUFELENBQXpCOztBQUNBLElBQUlDLFFBQVEsR0FBR0QsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsSUFBSUUsZ0JBQWdCLEdBQUdGLE9BQU8sQ0FBQyxtQkFBRCxDQUE5Qjs7QUFDQSxJQUFJRyxnQkFBZ0IsR0FBR0gsT0FBTyxDQUFDLG1CQUFELENBQTlCOztBQUNBLElBQUlJLGNBQWMsR0FBR0osT0FBTyxDQUFDLGtCQUFELENBQTVCOztBQUNBLElBQUlLLFdBQVcsR0FBR0wsT0FBTyxDQUFDLGNBQUQsQ0FBekI7O0FBRUEsSUFBSU0sZUFBZSxHQUFHQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUMzQixhQUFTQyxRQURrQjtBQUUzQkMsRUFBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2QsU0FBS0MsVUFBTCxHQUFrQlYsUUFBUSxDQUFDVyxhQUFULENBQXVCLFFBQXZCLEVBQWlDLG1CQUFqQyxDQUFsQjtBQUNBLFNBQUtDLElBQUwsR0FBWVgsZ0JBQWdCLENBQUNZLFdBQWpCLEVBQVo7QUFDQSxTQUFLQyxRQUFMLEdBQWdCQyxPQUFPLENBQUNDLEdBQXhCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixHQUFwQjtBQUNBLFNBQUtDLGFBQUwsR0FBcUIsR0FBckI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLENBQXBCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixJQUFJQyxLQUFKLEVBQWpCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixFQUFsQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxLQUFmO0FBQ0gsR0FaMEI7QUFjM0JDLEVBQUFBLFlBQVksRUFBRSx3QkFBWTtBQUN0QixTQUFLQyxVQUFMLEdBQWtCLEtBQUtDLFNBQUwsQ0FBZSxZQUFmLENBQWxCO0FBQ0EsU0FBS0QsVUFBTCxDQUFnQkUsS0FBaEIsR0FBd0JDLFNBQXhCO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQixLQUFLQyxRQUFMLENBQWNDLGNBQWQsQ0FBNkIsZ0JBQTdCLENBQXRCO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLEtBQUtILGNBQUwsQ0FBb0JFLGNBQXBCLENBQW1DLE9BQW5DLENBQWI7QUFDQSxTQUFLRSxTQUFMLEdBQWlCLEtBQUtELEtBQUwsQ0FBV0QsY0FBWCxDQUEwQixXQUExQixDQUFqQjtBQUNBLFNBQUtHLFVBQUwsR0FBa0IsS0FBS0QsU0FBTCxDQUFlRixjQUFmLENBQThCLFlBQTlCLENBQWxCO0FBQ0EsU0FBS0ksU0FBTCxHQUFpQixLQUFLRCxVQUFMLENBQWdCSCxjQUFoQixDQUErQixXQUEvQixDQUFqQjtBQUNBLFNBQUtLLGVBQUwsR0FBdUIsS0FBS0QsU0FBTCxDQUFlSixjQUFmLENBQThCLGlCQUE5QixFQUFpRE0sWUFBakQsQ0FBOEQvQixFQUFFLENBQUNnQyxLQUFqRSxDQUF2QjtBQUNBLFNBQUtDLFNBQUwsR0FBaUIsS0FBS1AsS0FBTCxDQUFXRCxjQUFYLENBQTBCLFdBQTFCLENBQWpCO0FBQ0EsU0FBS1MsVUFBTCxHQUFrQixLQUFLTixVQUFMLENBQWdCSCxjQUFoQixDQUErQixZQUEvQixDQUFsQixDQVZzQixDQVd0Qjs7QUFDQSxTQUFLVSxRQUFMLEdBQWdCLEtBQUtOLFNBQUwsQ0FBZUosY0FBZixDQUE4QixVQUE5QixDQUFoQjtBQUNBLFNBQUtXLFFBQUwsR0FBZ0IsS0FBS1AsU0FBTCxDQUFlSixjQUFmLENBQThCLFVBQTlCLEVBQTBDTSxZQUExQyxDQUF1RC9CLEVBQUUsQ0FBQ3FDLE9BQTFELENBQWhCO0FBQ0EsU0FBS0QsUUFBTCxDQUFjRSxJQUFkLENBQW1CQyxFQUFuQixDQUFzQixnQkFBdEIsRUFBd0MsVUFBVUMsS0FBVixFQUFpQjtBQUNyRCxVQUFJQyxHQUFHLEdBQUdELEtBQUssQ0FBQ0UsTUFBaEIsQ0FEcUQsQ0FFckQ7QUFDSCxLQUhELEVBR0csSUFISCxFQWRzQixDQW1CdEI7O0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixLQUFLZixVQUFMLENBQWdCSCxjQUFoQixDQUErQixXQUEvQixDQUFqQjtBQUVBLFNBQUttQixTQUFMLEdBQWlCLEtBQUtoQixVQUFMLENBQWdCSCxjQUFoQixDQUErQixXQUEvQixFQUE0Q00sWUFBNUMsQ0FBeUQvQixFQUFFLENBQUM2QyxRQUE1RCxDQUFqQjtBQUNBLFFBQUlDLE9BQU8sR0FBRyxLQUFLeEMsSUFBTCxDQUFVeUMsUUFBVixHQUFxQkMsMEJBQXJCLEdBQWtEQyxTQUFoRTtBQUNBLFFBQUlSLEdBQUcsR0FBR1MsS0FBSyxDQUFDQyxLQUFOLENBQVksTUFBWixJQUFzQkwsT0FBdEIsR0FBZ0MsTUFBMUM7QUFDQSxTQUFLRixTQUFMLENBQWVGLE1BQWYsR0FBd0JELEdBQXhCO0FBRUEsUUFBSVcsZ0JBQWdCLEdBQUdwRCxFQUFFLENBQUNxRCxJQUFILENBQVEsS0FBSzFDLFlBQWIsRUFBMkIsS0FBS0MsYUFBaEMsQ0FBdkI7QUFDQSxRQUFJMEMsT0FBTyxHQUFHO0FBQ1ZDLE1BQUFBLFVBQVUsRUFBRTFELGNBREY7QUFDdUI7QUFDakMyRCxNQUFBQSxPQUFPLEVBQUUsQ0FGQztBQUVxQjtBQUMvQkMsTUFBQUEsT0FBTyxFQUFFLENBSEM7QUFHcUI7QUFDL0JDLE1BQUFBLE9BQU8sRUFBRSxDQUpDO0FBSXFCO0FBQy9CQyxNQUFBQSxPQUFPLEVBQUUsQ0FMQztBQUtvQjtBQUM5QkMsTUFBQUEsVUFBVSxFQUFFLEdBTkY7QUFNcUI7QUFDL0JDLE1BQUFBLFdBQVcsRUFBRSxHQVBIO0FBT3FCO0FBQy9CQyxNQUFBQSxHQUFHLEVBQUUsQ0FSSztBQVFxQjtBQUMvQkMsTUFBQUEsR0FBRyxFQUFFLENBVEs7QUFTcUI7QUFDL0JDLE1BQUFBLFFBQVEsRUFBRSxDQVZBO0FBV1ZDLE1BQUFBLFFBQVEsRUFBRTtBQUFFQyxRQUFBQSxTQUFTLEVBQUU7QUFBYixPQVhBO0FBV3NCO0FBQ2hDQyxNQUFBQSxZQUFZLEVBQUU7QUFaSixLQUFkO0FBY0EsU0FBS0MsZUFBTCxHQUF1QixJQUFJeEUsZ0JBQUosRUFBdkI7QUFDQSxTQUFLd0UsZUFBTCxDQUFxQkMsWUFBckIsQ0FBa0MsS0FBS25DLFVBQXZDLEVBQW1EbEMsRUFBRSxDQUFDc0UsRUFBSCxDQUFNLENBQU4sRUFBUyxDQUFULENBQW5ELEVBQWdFQyxhQUFhLENBQUNDLFFBQTlFLEVBQXdGQyxrQkFBa0IsQ0FBQ0MsR0FBM0csRUFBZ0h0QixnQkFBaEgsRUFBa0lFLE9BQWxJLEVBQTJJdEQsRUFBRSxDQUFDc0UsRUFBSCxDQUFNLEdBQU4sRUFBVyxHQUFYLENBQTNJO0FBQ0gsR0ExRDBCO0FBNEQzQkssRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBQ3ZCLFNBQUsxQyxTQUFMLENBQWVNLEVBQWYsQ0FBa0J2QyxFQUFFLENBQUM0RSxJQUFILENBQVFDLFNBQVIsQ0FBa0JDLFNBQXBDLEVBQStDLFVBQVV0QyxLQUFWLEVBQWlCO0FBQzVEN0MsTUFBQUEsZ0JBQWdCLENBQUNZLFdBQWpCLEdBQStCd0Usb0JBQS9CLENBQW9ELEtBQXBEO0FBQ0gsS0FGRCxFQUVHLElBRkgsRUFEdUIsQ0FJdkI7O0FBQ0EsUUFBSSxDQUFDLEtBQUtDLGdCQUFWLEVBQTRCO0FBQ3hCLFdBQUtBLGdCQUFMLEdBQXdCQyxLQUFLLENBQUNDLFdBQU4sQ0FBa0JDLElBQWxCLENBQXVCM0YsV0FBVyxDQUFDNEYsZUFBbkMsRUFBcUQsVUFBVUMsU0FBVixFQUFxQjtBQUM5RixhQUFLQyxnQkFBTCxDQUFzQkQsU0FBdEI7QUFDSCxPQUYyRSxDQUV6RUYsSUFGeUUsQ0FFcEUsSUFGb0UsQ0FBcEQsQ0FBeEI7QUFHSDs7QUFFRCxRQUFJLENBQUMsS0FBS0ksaUJBQVYsRUFBNkI7QUFDekIsV0FBS0EsaUJBQUwsR0FBeUJOLEtBQUssQ0FBQ0MsV0FBTixDQUFrQkMsSUFBbEIsQ0FBdUIzRixXQUFXLENBQUNnRyxtQkFBbkMsRUFBeUQsVUFBVUgsU0FBVixFQUFxQjtBQUNuRyxhQUFLdkQsZUFBTCxDQUFxQlksTUFBckIsR0FBOEIsTUFBOUI7QUFDQSxhQUFLNEMsZ0JBQUwsQ0FBc0JELFNBQXRCO0FBQ0gsT0FIZ0YsQ0FHOUVGLElBSDhFLENBR3pFLElBSHlFLENBQXhELENBQXpCO0FBSUg7O0FBRUQsU0FBS3hDLFNBQUwsQ0FBZUosRUFBZixDQUFrQnZDLEVBQUUsQ0FBQzRFLElBQUgsQ0FBUUMsU0FBUixDQUFrQkMsU0FBcEMsRUFBZ0QsVUFBVXRDLEtBQVYsRUFBaUI7QUFDN0QsV0FBS2xDLElBQUwsQ0FBVW1GLFNBQVY7QUFDQSxXQUFLM0QsZUFBTCxDQUFxQlksTUFBckIsR0FBOEIsTUFBOUI7QUFDSCxLQUg4QyxDQUc1Q3lDLElBSDRDLENBR3ZDLElBSHVDLENBQS9DLEVBR2UsSUFIZjtBQUtBLFNBQUtoRCxRQUFMLENBQWNJLEVBQWQsQ0FBaUJ2QyxFQUFFLENBQUM0RSxJQUFILENBQVFDLFNBQVIsQ0FBa0JDLFNBQW5DLEVBQStDLFVBQVV0QyxLQUFWLEVBQWlCO0FBRTVELFVBQUlrRCxJQUFJLEdBQUcsS0FBS3RELFFBQUwsQ0FBY00sTUFBZCxJQUF1QixFQUFsQztBQUNBLFdBQUtwQyxJQUFMLENBQVVxRixTQUFWLENBQW9CRCxJQUFwQjtBQUNILEtBSjZDLENBSTNDUCxJQUoyQyxDQUl0QyxJQUpzQyxDQUE5QyxFQUllLElBSmYsRUF2QnVCLENBNkJ2Qjs7QUFDQSxTQUFLN0UsSUFBTCxDQUFVbUYsU0FBVjtBQUNILEdBM0YwQjtBQTZGM0I7QUFDQUcsRUFBQUEsYUFBYSxFQUFFLHVCQUFVQyxJQUFWLEVBQWdCO0FBQzNCLFFBQUksQ0FBQyxLQUFLQyxTQUFOLElBQW1CRCxJQUFJLElBQUksS0FBL0IsRUFBc0M7O0FBQ3RDLFFBQUksQ0FBQyxLQUFLQyxTQUFWLEVBQXFCO0FBQ2pCLFVBQUl6QyxJQUFJLEdBQUdyRCxFQUFFLENBQUNxRCxJQUFILENBQVEsR0FBUixFQUFhLEdBQWIsQ0FBWDtBQUNBLFdBQUt5QyxTQUFMLEdBQWlCLElBQUk5RixFQUFFLENBQUM0RSxJQUFQLEVBQWpCO0FBQ0EsV0FBS2tCLFNBQUwsQ0FBZUMsY0FBZixDQUE4QjFDLElBQTlCO0FBQ0EsV0FBS3lDLFNBQUwsQ0FBZUUsY0FBZixDQUE4QmhHLEVBQUUsQ0FBQ3NFLEVBQUgsQ0FBTSxHQUFOLEVBQVcsR0FBWCxDQUE5QjtBQUNBLFdBQUt3QixTQUFMLENBQWVHLFdBQWYsQ0FBMkJqRyxFQUFFLENBQUNzRSxFQUFILENBQU0sQ0FBTixFQUFTLENBQVQsQ0FBM0I7QUFDQSxXQUFLMUMsVUFBTCxDQUFnQnNFLFFBQWhCLENBQXlCLEtBQUtKLFNBQTlCO0FBQ0EsVUFBSUssR0FBRyxHQUFHekcsUUFBUSxDQUFDMEcsUUFBVCxDQUFrQixTQUFsQixDQUFWO0FBQ0EsV0FBS0MsUUFBTCxHQUFnQm5ELEtBQUssQ0FBQ29ELFdBQU4sQ0FBa0IsS0FBS1IsU0FBdkIsRUFBa0MsSUFBbEMsRUFBd0MsQ0FBeEMsRUFBMkMsQ0FBM0MsRUFBOEM5RixFQUFFLENBQUNzRSxFQUFILENBQU0sR0FBTixFQUFXLEdBQVgsQ0FBOUMsRUFBK0QsS0FBL0QsQ0FBaEI7QUFDQSxXQUFLaUMsT0FBTCxDQUFhSixHQUFiLEVBQWtCLFVBQVVLLE1BQVYsRUFBa0I7QUFDaEMsYUFBS0gsUUFBTCxDQUFjSSxXQUFkLEdBQTRCRCxNQUE1QjtBQUNILE9BRmlCLENBRWhCckIsSUFGZ0IsQ0FFWCxJQUZXLENBQWxCO0FBR0EsV0FBS3VCLFdBQUwsR0FBbUJ4RCxLQUFLLENBQUN5RCxXQUFOLENBQWtCLEVBQWxCLEVBQXNCLElBQUkzRyxFQUFFLENBQUM0RyxLQUFQLENBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQixDQUF0QixFQUE0RCxJQUE1RCxFQUFrRSxDQUFsRSxFQUFxRSxDQUFDLEdBQXRFLEVBQTJFLEVBQTNFLEVBQStFLEtBQUtkLFNBQXBGLEVBQStGLENBQS9GLEVBQWtHOUYsRUFBRSxDQUFDc0UsRUFBSCxDQUFNLEdBQU4sRUFBVyxHQUFYLENBQWxHLENBQW5CO0FBQ0g7O0FBQ0QsUUFBSTdCLEdBQUcsR0FBR1MsS0FBSyxDQUFDQyxLQUFOLENBQVksUUFBWixDQUFWO0FBQ0EsU0FBS3VELFdBQUwsQ0FBaUJoRSxNQUFqQixHQUEwQkQsR0FBMUI7QUFDQSxTQUFLcUQsU0FBTCxDQUFlZSxNQUFmLEdBQXdCaEIsSUFBeEI7QUFDSCxHQWpIMEI7QUFvSDNCaUIsRUFBQUEsV0FBVyxFQUFFLHFCQUFVQyxJQUFWLEVBQWdCO0FBQ3pCQSxJQUFBQSxJQUFJLEdBQUdBLElBQUksSUFBSWpILFdBQVcsQ0FBQ2tILElBQVosQ0FBaUJDLFFBQWhDO0FBQ0gsR0F0SDBCO0FBd0gzQkMsRUFBQUEsYUFBYSxFQUFFLHlCQUFZO0FBQ3ZCLFNBQUs1RyxJQUFMLENBQVV5RSxvQkFBVixDQUErQixLQUEvQjtBQUNBLFNBQUtvQyxpQkFBTCxDQUF1QixLQUF2Qjs7QUFDQSxTQUFLLElBQUlDLENBQVQsSUFBYyxLQUFLcEcsVUFBbkIsRUFBK0I7QUFDM0IsVUFBSXFHLENBQUMsR0FBRyxLQUFLckcsVUFBTCxDQUFnQm9HLENBQWhCLENBQVI7O0FBQ0EsVUFBSUMsQ0FBQyxJQUFJQSxDQUFDLENBQUMsVUFBRCxDQUFWLEVBQXVCO0FBQ25CQSxRQUFBQSxDQUFDLENBQUNDLFFBQUY7QUFDQUQsUUFBQUEsQ0FBQyxHQUFDLElBQUY7QUFDSDtBQUNKOztBQUNELFNBQUtyRyxVQUFMLEdBQWtCLElBQWxCOztBQUNBLFFBQUksS0FBS2dFLGdCQUFULEVBQTJCO0FBQ3ZCQyxNQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JxQyxNQUFsQixDQUF5QixLQUFLdkMsZ0JBQTlCO0FBQ0EsV0FBS0EsZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDs7QUFDRCxRQUFJLEtBQUtPLGlCQUFULEVBQTRCO0FBQ3hCTixNQUFBQSxLQUFLLENBQUNDLFdBQU4sQ0FBa0JxQyxNQUFsQixDQUF5QixLQUFLaEMsaUJBQTlCO0FBQ0EsV0FBS0EsaUJBQUwsR0FBeUIsSUFBekI7QUFDSDs7QUFDRCxRQUFJLEtBQUtuQixlQUFULEVBQTBCO0FBQ3RCLFdBQUtBLGVBQUwsQ0FBcUJrRCxRQUFyQjtBQUNIOztBQUNELFNBQUtsRCxlQUFMLEdBQXVCLElBQXZCOztBQUNBLFFBQUksS0FBSzBCLFNBQVQsRUFBb0I7QUFDaEIsV0FBS0EsU0FBTCxDQUFlMEIsT0FBZjtBQUNBLFdBQUtkLFdBQUwsQ0FBaUJjLE9BQWpCO0FBQ0EsV0FBS25CLFFBQUwsQ0FBY21CLE9BQWQ7QUFDQSxXQUFLMUIsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFdBQUtPLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxXQUFLSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0g7QUFDSixHQXZKMEI7QUF5SjNCcEIsRUFBQUEsZ0JBQWdCLEVBQUUsMEJBQVVELFNBQVYsRUFBcUI7QUFDbkM7QUFDQSxTQUFLLElBQUkrQixDQUFULElBQWMsS0FBS3BHLFVBQW5CLEVBQStCO0FBQzNCLFVBQUlxRyxDQUFDLEdBQUcsS0FBS3JHLFVBQUwsQ0FBZ0JvRyxDQUFoQixDQUFSLENBRDJCLENBRTNCO0FBQ0g7O0FBRUQsU0FBS3ZHLFlBQUwsR0FBb0IsQ0FBcEI7QUFDQSxRQUFJNEcsSUFBSSxHQUFHLElBQUkxRyxLQUFKLEVBQVg7O0FBQ0EsU0FBSyxJQUFJcUcsQ0FBVCxJQUFjL0IsU0FBZCxFQUF5QjtBQUNyQm9DLE1BQUFBLElBQUksQ0FBQ0MsSUFBTCxDQUFVckMsU0FBUyxDQUFDK0IsQ0FBRCxDQUFuQjtBQUNIOztBQUVELFNBQUt0RyxTQUFMLEdBQWlCMkcsSUFBSSxJQUFJLEVBQXpCO0FBQ0EsU0FBSzdCLGFBQUwsQ0FBbUIsS0FBbkI7O0FBQ0EsUUFBSTZCLElBQUksQ0FBQ0UsTUFBTCxJQUFlLENBQW5CLEVBQXNCO0FBQ2xCO0FBQ0ksYUFBSy9CLGFBQUwsQ0FBbUIsSUFBbkI7QUFDSDtBQUNKOztBQUNELFFBQUksS0FBSzNFLE9BQUwsSUFBZ0IsSUFBcEIsRUFBMEI7QUFDdEI7QUFDQSxXQUFLQSxPQUFMLEdBQWUsS0FBZjtBQUNILEtBSEQsTUFHTyxDQUtOLENBUkQsQ0FJSTtBQUNBO0FBQ0E7QUFHSjs7O0FBQ0EsU0FBS21ELGVBQUwsQ0FBcUJ3RCxPQUFyQixDQUE2QkgsSUFBN0I7QUFDSCxHQXhMMEI7QUEwTDNCTixFQUFBQSxpQkFBaUIsRUFBRSwyQkFBVVUsTUFBVixFQUFrQjtBQUNqQyxRQUFJQSxNQUFNLElBQUksSUFBZCxFQUFvQjtBQUNoQixVQUFJLEtBQUtDLFdBQUwsSUFBb0IsSUFBeEIsRUFBOEI7QUFDMUIsYUFBS0EsV0FBTCxHQUFtQjdDLEtBQUssQ0FBQzhDLEtBQU4sQ0FBWUMsR0FBWixDQUFpQixZQUFZO0FBQzVDLGNBQUlDLEVBQUUsR0FBRyxLQUFLbkgsU0FBTCxDQUFlLEtBQUtELFlBQUwsR0FBb0IsQ0FBbkMsQ0FBVDtBQUNBLGNBQUlvSCxFQUFKLEVBQ0ksS0FBS0MsVUFBTCxDQUFnQkQsRUFBaEI7QUFDSixjQUFJLEtBQUtwSCxZQUFMLElBQXFCLEtBQUtDLFNBQUwsQ0FBZTZHLE1BQWYsR0FBd0IsQ0FBakQsRUFDSSxLQUFLUixpQkFBTCxDQUF1QixLQUF2QjtBQUNQLFNBTmtDLENBTWhDaEMsSUFOZ0MsQ0FNM0IsSUFOMkIsQ0FBaEIsRUFNSixJQUFLLEVBTkQsRUFNTSxDQUFDLENBTlAsQ0FBbkI7QUFPSDtBQUNKLEtBVkQsTUFVTztBQUNILFVBQUksS0FBSzJDLFdBQUwsSUFBb0IsSUFBeEIsRUFBOEI7QUFDMUI3QyxRQUFBQSxLQUFLLENBQUM4QyxLQUFOLENBQVlJLEdBQVosQ0FBZ0IsS0FBS0wsV0FBckI7QUFDQSxhQUFLQSxXQUFMLEdBQW1CLElBQW5CO0FBQ0g7QUFDSjtBQUNKLEdBM00wQjtBQTZNM0JJLEVBQUFBLFVBQVUsRUFBRSxvQkFBVUQsRUFBVixFQUFjO0FBQ3RCLFFBQUlHLElBQUksR0FBRyxJQUFYOztBQUNBLFFBQUksS0FBS3BILFVBQUwsQ0FBZ0IsS0FBS0gsWUFBckIsS0FBc0MsSUFBMUMsRUFBZ0Q7QUFDNUN1SCxNQUFBQSxJQUFJLEdBQUcsSUFBSXZJLGNBQUosQ0FBbUIsS0FBS2dCLFlBQXhCLEVBQXNDLENBQXRDLENBQVA7QUFDQSxXQUFLRyxVQUFMLENBQWdCLEtBQUtILFlBQXJCLElBQXFDdUgsSUFBckM7QUFDQSxXQUFLQyxXQUFMLENBQWlCbkMsUUFBakIsQ0FBMEJrQyxJQUExQjtBQUNIOztBQUNEQSxJQUFBQSxJQUFJLEdBQUcsS0FBS3BILFVBQUwsQ0FBZ0IsS0FBS0gsWUFBckIsQ0FBUDtBQUNBLFFBQUl5SCxJQUFJLEdBQUcsS0FBSzFILGFBQUwsR0FBcUIsTUFBTSxLQUFLQyxZQUEzQyxDQVJzQixDQVN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxTQUFLQSxZQUFMLEdBQW9CLEtBQUtBLFlBQUwsR0FBb0IsQ0FBeEM7QUFDSDtBQTNOMEIsQ0FBVCxDQUF0QjtBQStOQTBILE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQnpJLGVBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBAYXV0aG9yOiBAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcclxuLy8gQGRlc2NyaXB0aW9uOlxyXG4vLyAgICAgIOeUqOaIt+i+k+WFpeahhlxyXG4vLyA8YnIvPkNyZWF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbnZhciBGcmllbmRFdmVudCA9IHJlcXVpcmUoXCJmcmllbmRfZXZlbnRcIik7XHJcbnZhciBQYXRoVG9vbCA9IHJlcXVpcmUoXCJwYXRodG9vbFwiKTtcclxudmFyIEZyaWVuZENvbnRyb2xsZXIgPSByZXF1aXJlKFwiZnJpZW5kX2NvbnRyb2xsZXJcIik7XHJcbnZhciBDb21tb25TY3JvbGxWaWV3ID0gcmVxdWlyZShcImNvbW1vbl9zY3JvbGx2aWV3XCIpO1xyXG52YXIgRnJpZW5kTGlzdEl0ZW0gPSByZXF1aXJlKFwiZnJpZW5kX2xpc3RfaXRlbVwiKTtcclxudmFyIEZyaWVuZENvbnN0ID0gcmVxdWlyZShcImZyaWVuZF9jb25zdFwiKTtcclxuXHJcbnZhciBGcmllbmRBZGRXaW5kb3cgPSBjYy5DbGFzcyh7XHJcbiAgICBleHRlbmRzOiBCYXNlVmlldyxcclxuICAgIGN0b3I6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLnByZWZhYlBhdGggPSBQYXRoVG9vbC5nZXRQcmVmYWJQYXRoKFwiZnJpZW5kXCIsIFwiZnJpZW5kX2ZpbmRfcGFuZWxcIik7XHJcbiAgICAgICAgdGhpcy5jdHJsID0gRnJpZW5kQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpO1xyXG4gICAgICAgIHRoaXMud2luX3R5cGUgPSBXaW5UeXBlLkJpZztcclxuICAgICAgICB0aGlzLnNjcm9sbF93aWR0aCA9IDYyNDtcclxuICAgICAgICB0aGlzLnNjcm9sbF9oZWlnaHQgPSA1NzA7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVfaW5kZXggPSAxO1xyXG4gICAgICAgIHRoaXMucmVuZF9saXN0ID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgdGhpcy5jYWNoZV9saXN0ID0ge307XHJcbiAgICAgICAgdGhpcy5pc19pbml0ID0gZmFsc2U7XHJcbiAgICB9LFxyXG5cclxuICAgIG9wZW5DYWxsQmFjazogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHRoaXMuc2Vla0NoaWxkKFwiYmFja2dyb3VuZFwiKTtcclxuICAgICAgICB0aGlzLmJhY2tncm91bmQuc2NhbGUgPSBGSVRfU0NBTEU7XHJcbiAgICAgICAgdGhpcy5tYWluX2NvbnRhaW5lciA9IHRoaXMucm9vdF93bmQuZ2V0Q2hpbGRCeU5hbWUoXCJtYWluX2NvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLnBhbmVsID0gdGhpcy5tYWluX2NvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcInBhbmVsXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNvbnRhaW5lclwiKTtcclxuICAgICAgICB0aGlzLm1haW5fcGFuZWwgPSB0aGlzLmNvbnRhaW5lci5nZXRDaGlsZEJ5TmFtZShcIm1haW5fcGFuZWxcIik7XHJcbiAgICAgICAgdGhpcy50b3BfcGFuZWwgPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJ0b3BfcGFuZWxcIik7XHJcbiAgICAgICAgdGhpcy5yZWNvbW1lbmRfbGFiZWwgPSB0aGlzLnRvcF9wYW5lbC5nZXRDaGlsZEJ5TmFtZShcInJlY29tbWVuZF9sYWJlbFwiKS5nZXRDb21wb25lbnQoY2MuTGFiZWwpO1xyXG4gICAgICAgIHRoaXMuY2xvc2VfYnRuID0gdGhpcy5wYW5lbC5nZXRDaGlsZEJ5TmFtZShcImNsb3NlX2J0blwiKTtcclxuICAgICAgICB0aGlzLnNjcm9sbF9jb24gPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJzY3JvbGxfY29uXCIpO1xyXG4gICAgICAgIC8v5p+l5om+5aW95Y+LXHJcbiAgICAgICAgdGhpcy5maW5kX2J0biA9IHRoaXMudG9wX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiZmluZF9idG5cIik7XHJcbiAgICAgICAgdGhpcy5lZGl0X2JveCA9IHRoaXMudG9wX3BhbmVsLmdldENoaWxkQnlOYW1lKFwiZWRpdF9ib3hcIikuZ2V0Q29tcG9uZW50KGNjLkVkaXRCb3gpO1xyXG4gICAgICAgIHRoaXMuZWRpdF9ib3gubm9kZS5vbihcImVkaXRpbmctcmV0dXJuXCIsIGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB2YXIgc3RyID0gZXZlbnQuc3RyaW5nO1xyXG4gICAgICAgICAgICAvLyBpZiBHbUNtZCBhbmQgR21DbWQuc2hvd19mcm9tX2NoYXQgYW5kIEdtQ21kOnNob3dfZnJvbV9jaGF0KHN0cikgdGhlbiByZXR1cm4gZW5kXHJcbiAgICAgICAgfSwgdGhpcyk7XHJcblxyXG4gICAgICAgIC8v5Yi35paw5oyJ6ZKuXHJcbiAgICAgICAgdGhpcy5mbGFzaF9idG4gPSB0aGlzLm1haW5fcGFuZWwuZ2V0Q2hpbGRCeU5hbWUoXCJmbGFzaF9idG5cIik7XHJcblxyXG4gICAgICAgIHRoaXMubnVtX2xhYmVsID0gdGhpcy5tYWluX3BhbmVsLmdldENoaWxkQnlOYW1lKFwicmljaF90ZXh0XCIpLmdldENvbXBvbmVudChjYy5SaWNoVGV4dCk7XHJcbiAgICAgICAgdmFyIGFsbF9udW0gPSB0aGlzLmN0cmwuZ2V0TW9kZWwoKS5nZXRCbGFja0xpc3RPbmxpbmVBbmRUb3RhbCgpLnRvdGFsX251bTtcclxuICAgICAgICB2YXIgc3RyID0gVXRpbHMuVEkxOE4oXCLlpb3lj4vmlbDvvJpcIikgKyBhbGxfbnVtICsgXCIvMTAwXCI7XHJcbiAgICAgICAgdGhpcy5udW1fbGFiZWwuc3RyaW5nID0gc3RyO1xyXG5cclxuICAgICAgICB2YXIgc2Nyb2xsX3ZpZXdfc2l6ZSA9IGNjLnNpemUodGhpcy5zY3JvbGxfd2lkdGgsIHRoaXMuc2Nyb2xsX2hlaWdodClcclxuICAgICAgICB2YXIgc2V0dGluZyA9IHtcclxuICAgICAgICAgICAgaXRlbV9jbGFzczogRnJpZW5kTGlzdEl0ZW0sICAgICAgLy8g5Y2V5YWD57G7XHJcbiAgICAgICAgICAgIHN0YXJ0X3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRY6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3g6IDAsICAgICAgICAgICAgICAgICAgICAvLyB45pa55ZCR55qE6Ze06ZqUXHJcbiAgICAgICAgICAgIHN0YXJ0X3k6IDAsICAgICAgICAgICAgICAgICAgICAvLyDnrKzkuIDkuKrljZXlhYPnmoRZ6LW354K5XHJcbiAgICAgICAgICAgIHNwYWNlX3k6IDIsICAgICAgICAgICAgICAgICAgIC8vIHnmlrnlkJHnmoTpl7TpmpRcclxuICAgICAgICAgICAgaXRlbV93aWR0aDogNjI0LCAgICAgICAgICAgICAgIC8vIOWNleWFg+eahOWwuuWvuHdpZHRoXHJcbiAgICAgICAgICAgIGl0ZW1faGVpZ2h0OiAxMTQsICAgICAgICAgICAgICAvLyDljZXlhYPnmoTlsLrlr7hoZWlnaHRcclxuICAgICAgICAgICAgcm93OiAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIOihjOaVsO+8jOS9nOeUqOS6juawtOW5s+a7muWKqOexu+Wei1xyXG4gICAgICAgICAgICBjb2w6IDEsICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiX5pWw77yM5L2c55So5LqO5Z6C55u05rua5Yqo57G75Z6LXHJcbiAgICAgICAgICAgIG9uY2VfbnVtOiAxLFxyXG4gICAgICAgICAgICBpdGVtX29iajogeyBvcGVuX3R5cGU6IDUgfSwgICAgIC8v5Y+C5pWwXHJcbiAgICAgICAgICAgIG5lZWRfZHluYW1pYzogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldyA9IG5ldyBDb21tb25TY3JvbGxWaWV3KClcclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5jcmVhdGVTY3JvbGwodGhpcy5zY3JvbGxfY29uLCBjYy52MigwLCAwKSwgU2Nyb2xsVmlld0Rpci52ZXJ0aWNhbCwgU2Nyb2xsVmlld1N0YXJ0UG9zLnRvcCwgc2Nyb2xsX3ZpZXdfc2l6ZSwgc2V0dGluZywgY2MudjIoMC41LCAwLjUpKVxyXG4gICAgfSxcclxuXHJcbiAgICByZWdpc3RlckV2ZW50OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZV9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgRnJpZW5kQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLm9wZW5GcmllbmRGaW5kV2luZG93KGZhbHNlKTtcclxuICAgICAgICB9LCB0aGlzKTtcclxuICAgICAgICAvL+eUs+ivt+WlveWPi+WIl+ihqOi/lOWbnlxyXG4gICAgICAgIGlmICghdGhpcy5hcHBseV9saXN0X2V2ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlfbGlzdF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRnJpZW5kRXZlbnQuVURfQ09NTUVORF9MSVNULCAoZnVuY3Rpb24gKGRhdGFfbGlzdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGcmllbmRMaXN0KGRhdGFfbGlzdCk7XHJcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZmluZF9mcmllbmRfZXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5maW5kX2ZyaWVuZF9ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRnJpZW5kRXZlbnQuRlJJRU5EX1FVRVJZX1JFU1VMVCwgKGZ1bmN0aW9uIChkYXRhX2xpc3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb21tZW5kX2xhYmVsLnN0cmluZyA9IFwi5pCc57Si57uT5p6cXCI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZyaWVuZExpc3QoZGF0YV9saXN0KTtcclxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmxhc2hfYnRuLm9uKGNjLk5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgKGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmN0cmwucmVjb21tZW5kKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb21tZW5kX2xhYmVsLnN0cmluZyA9IFwi5o6o6I2Q5aW95Y+LXCI7XHJcbiAgICAgICAgfSkuYmluZCh0aGlzKSwgdGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuZmluZF9idG4ub24oY2MuTm9kZS5FdmVudFR5cGUuVE9VQ0hfRU5ELCAoZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZWRpdF9ib3guc3RyaW5nfHwgXCJcIjtcclxuICAgICAgICAgICAgdGhpcy5jdHJsLnF1ZXJ5RmluZChuYW1lKTtcclxuICAgICAgICB9KS5iaW5kKHRoaXMpLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy/or7fmsYLmjqjojZDliJfooahcclxuICAgICAgICB0aGlzLmN0cmwucmVjb21tZW5kKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8v5pi+56S656m655m9XHJcbiAgICBzaG93RW1wdHlJY29uOiBmdW5jdGlvbiAoYm9vbCkge1xyXG4gICAgICAgIGlmICghdGhpcy5lbXB0eV9jb24gJiYgYm9vbCA9PSBmYWxzZSkgcmV0dXJuXHJcbiAgICAgICAgaWYgKCF0aGlzLmVtcHR5X2Nvbikge1xyXG4gICAgICAgICAgICB2YXIgc2l6ZSA9IGNjLnNpemUoMjAwLCAyMDApO1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2NvbiA9IG5ldyBjYy5Ob2RlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfY29uLnNldENvbnRlbnRTaXplKHNpemUpO1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2Nvbi5zZXRBbmNob3JQb2ludChjYy52MigwLjUsIDAuNSkpO1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2Nvbi5zZXRQb3NpdGlvbihjYy52MigwLCAwKSk7XHJcbiAgICAgICAgICAgIHRoaXMubWFpbl9wYW5lbC5hZGRDaGlsZCh0aGlzLmVtcHR5X2Nvbik7XHJcbiAgICAgICAgICAgIHZhciByZXMgPSBQYXRoVG9vbC5nZXRCaWdCZyhcImJpZ2JnXzNcIik7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfYmcgPSBVdGlscy5jcmVhdGVJbWFnZSh0aGlzLmVtcHR5X2NvbiwgbnVsbCwgMCwgMCwgY2MudjIoMC41LCAwLjUpLCBmYWxzZSlcclxuICAgICAgICAgICAgdGhpcy5sb2FkUmVzKHJlcywgZnVuY3Rpb24gKHNmX29iaikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbXB0eV9iZy5zcHJpdGVGcmFtZSA9IHNmX29iajtcclxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2xhYmVsID0gVXRpbHMuY3JlYXRlTGFiZWwoMjYsIG5ldyBjYy5Db2xvcigweDY4LCAweDQ1LCAweDJhLCAweGZmKSwgbnVsbCwgMCwgLTEwMCwgXCJcIiwgdGhpcy5lbXB0eV9jb24sIDAsIGNjLnYyKDAuNSwgMC41KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzdHIgPSBVdGlscy5USTE4TihcIuacquaQnOe0ouWIsOeOqeWutlwiKTtcclxuICAgICAgICB0aGlzLmVtcHR5X2xhYmVsLnN0cmluZyA9IHN0cjtcclxuICAgICAgICB0aGlzLmVtcHR5X2Nvbi5hY3RpdmUgPSBib29sO1xyXG4gICAgfSxcclxuXHJcblxyXG4gICAgb3BlblJvb3RXbmQ6IGZ1bmN0aW9uICh0eXBlKSB7XHJcbiAgICAgICAgdHlwZSA9IHR5cGUgfHwgRnJpZW5kQ29uc3QuVHlwZS5NeUZyaWVuZDtcclxuICAgIH0sXHJcblxyXG4gICAgY2xvc2VDYWxsQmFjazogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuY3RybC5vcGVuRnJpZW5kRmluZFdpbmRvdyhmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXRzY2hlZHVsZVVwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmNhY2hlX2xpc3QpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNhY2hlX2xpc3RbaV07XHJcbiAgICAgICAgICAgIGlmICh2ICYmIHZbXCJEZWxldGVNZVwiXSl7XHJcbiAgICAgICAgICAgICAgICB2LkRlbGV0ZU1lKCk7XHJcbiAgICAgICAgICAgICAgICB2PW51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlX2xpc3QgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLmFwcGx5X2xpc3RfZXZlbnQpIHtcclxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQudW5iaW5kKHRoaXMuYXBwbHlfbGlzdF9ldmVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlfbGlzdF9ldmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmZpbmRfZnJpZW5kX2V2ZW50KSB7XHJcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmZpbmRfZnJpZW5kX2V2ZW50KTtcclxuICAgICAgICAgICAgdGhpcy5maW5kX2ZyaWVuZF9ldmVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLml0ZW1fc2Nyb2xsdmlldykge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5EZWxldGVNZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXRlbV9zY3JvbGx2aWV3ID0gbnVsbFxyXG4gICAgICAgIGlmICh0aGlzLmVtcHR5X2Nvbikge1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2Nvbi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1wdHlfbGFiZWwuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2JnLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5lbXB0eV9jb24gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmVtcHR5X2JnID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5lbXB0eV9sYWJlbCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICB1cGRhdGVGcmllbmRMaXN0OiBmdW5jdGlvbiAoZGF0YV9saXN0KSB7XHJcbiAgICAgICAgLy8gcmV0dXJuXHJcbiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmNhY2hlX2xpc3QpIHtcclxuICAgICAgICAgICAgdmFyIHYgPSB0aGlzLmNhY2hlX2xpc3RbaV07XHJcbiAgICAgICAgICAgIC8vIHYuc2V0VmlzaWJsZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZV9pbmRleCA9IDE7XHJcbiAgICAgICAgdmFyIGxpc3QgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICBmb3IgKHZhciBpIGluIGRhdGFfbGlzdCkge1xyXG4gICAgICAgICAgICBsaXN0LnB1c2goZGF0YV9saXN0W2ldKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVuZF9saXN0ID0gbGlzdCB8fCBbXTtcclxuICAgICAgICB0aGlzLnNob3dFbXB0eUljb24oZmFsc2UpO1xyXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA8PSAwKSB7XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0VtcHR5SWNvbih0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5pc19pbml0ID09IHRydWUpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5zZXRzY2hlZHVsZVVwZGF0ZSh0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5pc19pbml0ID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY3JlYXRlSXRlbShsaXN0W2ldKTtcclxuICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbGlzdCA9IFsxLDIsM11cclxuICAgICAgICB0aGlzLml0ZW1fc2Nyb2xsdmlldy5zZXREYXRhKGxpc3QpXHJcbiAgICB9LFxyXG5cclxuICAgIHNldHNjaGVkdWxlVXBkYXRlOiBmdW5jdGlvbiAoc3RhdHVzKSB7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlX3RpbWVyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVldWVfdGltZXIgPSBnY29yZS5UaW1lci5zZXQoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdm8gPSB0aGlzLnJlbmRfbGlzdFt0aGlzLmNyZWF0ZV9pbmRleCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2bylcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJdGVtKHZvKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jcmVhdGVfaW5kZXggPj0gdGhpcy5yZW5kX2xpc3QubGVuZ3RoICsgMSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRzY2hlZHVsZVVwZGF0ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9KS5iaW5kKHRoaXMpLCAxIC8gKDYwKSwgLTEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucXVldWVfdGltZXIgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMucXVldWVfdGltZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5xdWV1ZV90aW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIGNyZWF0ZUl0ZW06IGZ1bmN0aW9uICh2bykge1xyXG4gICAgICAgIHZhciBpdGVtID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZV9saXN0W3RoaXMuY3JlYXRlX2luZGV4XSA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSBuZXcgRnJpZW5kTGlzdEl0ZW0odGhpcy5jcmVhdGVfaW5kZXgsIDUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlX2xpc3RbdGhpcy5jcmVhdGVfaW5kZXhdID0gaXRlbTtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxfdmlldy5hZGRDaGlsZChpdGVtKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXRlbSA9IHRoaXMuY2FjaGVfbGlzdFt0aGlzLmNyZWF0ZV9pbmRleF07XHJcbiAgICAgICAgdmFyIG9mZnkgPSB0aGlzLnNjcm9sbF9oZWlnaHQgLSAxMjAgKiB0aGlzLmNyZWF0ZV9pbmRleDtcclxuICAgICAgICAvLyBpdGVtOnNldFBvc2l0aW9uKGNjLnAoc2VsZi5zY3JvbGxfdmlldzpnZXRDb250ZW50U2l6ZSgpLndpZHRoLzIsb2ZmeSkpXHJcbiAgICAgICAgLy8gaXRlbTpzZXRWaXNpYmxlKHRydWUpXHJcbiAgICAgICAgLy8gaXRlbTpzZXRFeHRlbmREYXRhKDUpXHJcbiAgICAgICAgLy8gaXRlbTpzZXREYXRhKHZvKVxyXG4gICAgICAgIHRoaXMuY3JlYXRlX2luZGV4ID0gdGhpcy5jcmVhdGVfaW5kZXggKyAxXHJcbiAgICB9LFxyXG5cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZyaWVuZEFkZFdpbmRvdzsiXX0=