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
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/action/action_model.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, '3f27dqUQapJ4LUEFzPeFEif', 'action_model');
// Scripts/mod/action/action_model.js
 
"use strict";
 
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: 2019-03-02 16:49:03
// --------------------------------------------------------------------
var MainuiController = require("mainui_controller");
 
var MainuiConst = require("mainui_const");
 
var ActionEvent = require("action_event");
 
var ActionConst = require("action_const");
 
var ActionModel = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {},
  properties: {},
  initConfig: function initConfig() {
    // -- 基金红点数据
    this.fund_red_list = {};
  },
  //------------------@ 基金活动相关
  // -- 开启中的基金活动id
  setOpenFundIds: function setOpenFundIds(id_list) {
    this.fund_id_list = id_list || [];
    this.checkFundRedStatus();
  },
  getOpenFundIds: function getOpenFundIds() {
    return this.fund_id_list || [];
  },
  // -- 设置基金的数据
  setFundSrvData: function setFundSrvData(data) {
    this.fund_datas = this.fund_datas || {};
 
    if (data && data.id) {
      this.fund_datas[data.id] = data;
      this.updateFundStatus(data.id, data.status);
    }
  },
  // -- 获取基金数据
  getFundSrvDataById: function getFundSrvDataById(id) {
    this.fund_datas = this.fund_datas || {};
    return this.fund_datas[id] || {};
  },
  updateFundStatus: function updateFundStatus(id, status) {
    this.fund_id_list = this.fund_id_list || [];
 
    for (var k = 0; k < this.fund_id_list.length; ++k) {
      var v = this.fund_id_list[k];
 
      if (v.id == id) {
        v.status = status;
        break;
      }
    }
 
    this.checkFundRedStatus();
  },
  //检查超值基金红点
  checkFundRedStatus: function checkFundRedStatus() {
    this.fund_id_list = this.fund_id_list || [];
 
    for (var k = 0; k < this.fund_id_list.length; ++k) {
      var v = this.fund_id_list[k];
 
      if (v.id == ActionConst.FundType.type_one) {
        this.updateFundRedStatus(ActionConst.FundRedIndex.fund_get_one, v.status == 1);
        this.updateFundRedStatus(ActionConst.FundRedIndex.fund_buy_one, v.status == 0);
      } else if (v.id == ActionConst.FundType.type_two) {
        this.updateFundRedStatus(ActionConst.FundRedIndex.fund_get_two, v.status == 1);
        this.updateFundRedStatus(ActionConst.FundRedIndex.fund_buy_two, v.status == 0);
      }
    }
  },
  // -- 更新基金红点数据
  updateFundRedStatus: function updateFundRedStatus(bid, status) {
    var _status = this.fund_red_list[bid];
    if (_status == status) return; // -- 购买的红点只有登陆时才显示,点击之后消失,之后不再显示
 
    if ((bid == ActionConst.FundRedIndex.fund_buy_one || bid == ActionConst.FundRedIndex.fund_buy_two) && _status == false) {
      return;
    }
 
    this.fund_red_list[bid] = status;
    var red_status = false;
 
    for (var k in this.fund_red_list) {
      var v = this.fund_red_list[k];
 
      if (v == true) {
        red_status = true;
        break;
      }
    }
 
    MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.fund, red_status);
    gcore.GlobalEvent.fire(ActionEvent.UPDATA_FUND_RED_STATUS_EVENT);
  },
  updateSevenLoginData: function updateSevenLoginData(data) {
    this.seven_login_data = data;
  },
  getSevenLoginData: function getSevenLoginData() {
    return this.seven_login_data;
  },
  // --desc:获取当前可领取7天登录的最大天数
  getMaxSevenDay: function getMaxSevenDay() {
    if (this.seven_login_data == null || this.seven_login_data.status_list == null) return;
    var status_list = this.seven_login_data.status_list;
    status_list.sort(function (a, b) {
      return a.day - b.day;
    });
    var day = null;
 
    for (var i in status_list) {
      if (status_list[i].status == 2) {
        day = status_list[i];
        break;
      }
    }
 
    if (day == null) {
      day = status_list[status_list.length];
    }
 
    return day;
  },
  setFirstBtnStatus: function setFirstBtnStatus(data) {
    this.firstBtnStatus = {};
 
    for (var i = 0; i < data.length; ++i) {
      var v = data[i];
      this.firstBtnStatus[v.id] = v.status;
    }
  },
  getFirstBtnStatus: function getFirstBtnStatus(index) {
    if (!this.firstBtnStatus) return;
    return this.firstBtnStatus[index] || 0;
  },
  // 获取七日目标的周期数
  setSevenGoldPeriod: function setSevenGoldPeriod(period) {
    this.sevenPeriod = period;
  },
  getSevenGoldPeriod: function getSevenGoldPeriod() {
    return this.sevenPeriod;
  },
  // 七天目标检查红点   --当前天数以下的
  checkRedPoint: function checkRedPoint(day) {
    if (day < 1 || day > 7) return;
    day = day || 1; // 福利
 
    this.welfareRetPoint = [];
 
    for (var i = 1; i <= day; i++) {
      var welfare = this.getSevenGoalWelfareList(i);
      this.welfareRetPoint[i] = false;
 
      for (var k in welfare) {
        if (welfare[k].status == 1) {
          this.welfareRetPoint[i] = true;
          break;
        }
      }
    } // 每日目标
 
 
    this.growRetPoint = [];
 
    for (var i = 1; i <= day; i++) {
      var grow = this.getServerGrowListData(i - 1);
      this.growRetPoint[i] = false;
 
      for (var k in grow) {
        if (grow[k].status == 1) {
          this.growRetPoint[i] = true;
          break;
        }
      }
    } // 超值礼包
 
 
    this.giftRetPoint = [];
 
    for (var i = 1; i <= day; i++) {
      var grow = this.getServerGiftListData(i - 1);
      this.giftRetPoint[i] = false;
 
      for (var k in grow) {
        if (grow[k].status == 1) {
          this.giftRetPoint[i] = true;
          break;
        }
      }
    }
 
    this.halfRedPoint = []; // 0、还有领取  1、已领取
 
    for (var i = 1; i <= day; i++) {
      var half = this.getHalfGiftList(i);
      this.halfRedPoint[i] = false;
 
      for (var k in half) {
        if (k == 0 && half[k].status == 0) {
          this.halfRedPoint[i] = true;
          break;
        }
      }
    } // 宝箱
 
 
    this.boxRedPoint = [];
    var box = this.getSevenGoalBoxList();
 
    for (var i in box) {
      this.boxRedPoint[i] = false;
 
      if (box[i].status == 1) {
        this.boxRedPoint[i] = true;
      }
    }
 
    var redStatus = false;
    var redStatus1 = false;
    var redStatus2 = false;
    var redStatus3 = false;
    var redStatus4 = false;
    var redStatus5 = false;
 
    for (var i in this.welfareRetPoint) {
      if (this.welfareRetPoint[i] == true) {
        redStatus1 = true;
        break;
      }
    }
 
    for (var i in this.growRetPoint) {
      if (this.growRetPoint[i] == true) {
        redStatus2 = true;
        break;
      }
    }
 
    for (var i in this.giftRetPoint) {
      if (this.giftRetPoint[i] == true) {
        redStatus3 = true;
        break;
      }
    }
 
    for (var i in this.halfRedPoint) {
      if (this.halfRedPoint[i] == true) {
        redStatus5 = true;
        break;
      }
    }
 
    for (var i in this.boxRedPoint) {
      if (this.boxRedPoint[i] == true) {
        redStatus4 = true;
        break;
      }
    }
 
    redStatus = redStatus1 || redStatus2 || redStatus3 || redStatus4 || redStatus5;
    var icon_id = MainuiConst.icon.seven_goal;
 
    if (this.getSevenGoldPeriod() == 1) {
      icon_id = MainuiConst.icon.seven_goal;
    } else if (this.getSevenGoldPeriod() == 2) {
      icon_id = MainuiConst.icon.seven_goal1;
    } else if (this.getSevenGoldPeriod() == 3) {
      icon_id = MainuiConst.icon.seven_goal2;
    } else {
      icon_id = MainuiConst.icon.seven_goal3;
    }
 
    MainuiController.getInstance().setFunctionTipsStatus(icon_id, redStatus);
  },
  // 红点状态
  getRedPointWelfareStatus: function getRedPointWelfareStatus(day) {
    if (!this.welfareRetPoint) return;
    var status = false;
    status = this.welfareRetPoint[day];
    return status;
  },
  // 更新
  updataRedPointWelfareStatus: function updataRedPointWelfareStatus(day, status) {
    if (!this.welfareRetPoint) return;
    this.welfareRetPoint[day] = status;
  },
  getRedPointGrowStatus: function getRedPointGrowStatus(day) {
    if (!this.growRetPoint) return;
    var status = false;
    status = this.growRetPoint[day];
    return status;
  },
  // 更新
  updataRedPointGrowStatus: function updataRedPointGrowStatus(day, status) {
    if (!this.growRetPoint) return;
    this.growRetPoint[day] = status;
  },
  getRedPointGiftStatus: function getRedPointGiftStatus(day) {
    if (!this.giftRetPoint) return;
    var status = false;
    status = this.giftRetPoint[day];
    return status;
  },
  // 更新
  updataRedPointGiftStatus: function updataRedPointGiftStatus(day, status) {
    if (!this.giftRetPoint) return;
    this.giftRetPoint[day] = status;
  },
  // 福利礼包
  getRedPointHalfStatus: function getRedPointHalfStatus(day) {
    if (!this.halfRedPoint) return;
    var status = false;
    status = this.halfRedPoint[day];
    return status;
  },
  // 更新
  updataRedPointHalfStatus: function updataRedPointHalfStatus(day, status) {
    if (!this.halfRedPoint) return;
    this.halfRedPoint[day] = status;
  },
  getRedPointBoxStatus: function getRedPointBoxStatus(index) {
    if (!this.boxRedPoint) return;
    var status = false;
    status = this.boxRedPoint[index];
    return status;
  },
  // 更新
  updataRedPointBoxStatus: function updataRedPointBoxStatus(index, status) {
    if (!this.boxRedPoint) return;
    this.boxRedPoint[index] = status;
  },
  // 七天目标*********** start *****
  initSevenWalfare: function initSevenWalfare(index) {
    this.setWalfareData(index);
    this.setWalfareGrowUpData(index);
    this.setHalfGiftData(index);
    this.setBoxRewardData(index);
  },
  // 宝箱
  setBoxRewardData: function setBoxRewardData(index) {
    var data = Config.day_goals_data.data_all_target[index];
    this.boxRewardData = [];
 
    for (var i in data) {
      this.boxRewardData.push(data[i][0]);
    }
 
    this.boxRewardData.sort(function (a, b) {
      return a.id - b.id;
    });
  },
  getBoxRewardData: function getBoxRewardData() {
    return this.boxRewardData || [];
  },
  // 福利
  setWalfareData: function setWalfareData(index) {
    var data = Config.day_goals_data.data_welfarecollection[index];
    this.welfareData = Utils.deepCopy(data);
  },
  // 成长目标
  setWalfareGrowUpData: function setWalfareGrowUpData(index) {
    var data = Config.day_goals_data.data_growthtarget[index];
    this.welfareGrowData = [];
    this.welfareGiftData = [];
 
    for (var i in data) {
      var tab = [];
      var tab1 = [];
 
      for (var k in data[i]) {
        if (data[i][k].target_type == 1) {
          tab.push(data[i][k]);
        } else if (data[i][k].target_type == 2) {
          tab1.push(data[i][k]);
        }
      }
 
      this.welfareGrowData.push(tab);
      this.welfareGiftData.push(tab1);
    }
  },
  // 福利礼包
  setHalfGiftData: function setHalfGiftData(index) {
    var data = Config.day_goals_data.data_halfdiscount[index];
    this.walfareHalfData = [];
 
    for (var i = 1; i <= 7; i++) {
      this.walfareHalfData[i] = [];
    }
 
    for (var i in data) {
      this.walfareHalfData[data[i][0].day].push(data[i][0]);
    }
 
    for (var i = 1; i <= 7; i++) {
      this.walfareHalfData[i].sort(function (a, b) {
        return a.id - b.id;
      });
    }
  },
  getWalfareData: function getWalfareData(day) {
    if (!this.welfareData) return;
    return this.welfareData[day] || [];
  },
  getWalfareGrowUpData: function getWalfareGrowUpData(day) {
    if (!this.welfareGrowData) return;
    return this.welfareGrowData[day] || [];
  },
  getWelfareGiftData: function getWelfareGiftData(day) {
    if (!this.welfareGiftData) return;
    return this.welfareGiftData[day] || [];
  },
  getWelfareHalfData: function getWelfareHalfData(day) {
    if (this.walfareHalfData && this.walfareHalfData[day]) {
      return this.walfareHalfData[day] || [];
    }
  },
  // *********** 协议相关*********
  // 七天目标的福利领取
  setSevenGoalWelfareList: function setSevenGoalWelfareList(data) {
    this.welfareList = [];
 
    for (var i = 1; i <= 7; i++) {
      this.welfareList[i] = [];
    }
 
    for (var i in data) {
      this.welfareList[data[i].day].push(data[i]);
    }
  },
  getSevenGoalWelfareList: function getSevenGoalWelfareList(day) {
    if (!this.welfareList) return;
    return this.welfareList[day] || [];
  },
  // 更新数据
  updataGoalWelfareList: function updataGoalWelfareList(day, index, status) {
    this.welfareList[day][index].status = status;
  },
  // 七天目标的成长目标
  setSevenGoalGrowList: function setSevenGoalGrowList(data) {
    var grow_list = [];
 
    for (var i = 1; i <= 7; i++) {
      grow_list[i] = [];
    }
 
    for (var i in data) {
      grow_list[data[i].day].push(data[i]);
    }
 
    this.serverGrowListData = [];
    this.serverGiftListData = [];
 
    for (var i in grow_list) {
      var tab = [];
      var tab1 = [];
 
      for (var k in grow_list[i]) {
        if (grow_list[i][k].target_type == 1) {
          tab.push(grow_list[i][k]);
        } else if (grow_list[i][k].target_type == 2) {
          tab1.push(grow_list[i][k]);
        }
      }
 
      this.serverGrowListData.push(tab);
      this.serverGiftListData.push(tab1);
    }
  },
  getServerGrowListData: function getServerGrowListData(day) {
    if (this.serverGrowListData && this.serverGrowListData[day]) {
      return this.serverGrowListData[day] || [];
    }
 
    return [];
  },
  // 更新数据
  updataGrowListData: function updataGrowListData(day, index, status) {
    this.serverGrowListData[day][index].status = status;
  },
  getServerGiftListData: function getServerGiftListData(day) {
    if (!this.serverGiftListData) return;
    return this.serverGiftListData[day] || [];
  },
  // 更新数据
  updataGiftListData: function updataGiftListData(day, index, status) {
    this.serverGiftListData[day][index].status = status;
  },
  // 福利礼包礼包购买
  setHalfGiftList: function setHalfGiftList(data) {
    this.halfGiftList = [];
 
    for (var i = 1; i <= 7; i++) {
      this.halfGiftList[i] = [];
    }
 
    for (var i = 1; i <= 7; i++) {
      var half_list = this.getWelfareHalfData(i);
 
      for (var k in half_list) {
        for (var b in data) {
          if (half_list[k].id == data[b].day) {
            this.halfGiftList[i].push(data[b]);
          }
        }
      }
    }
  },
  getHalfGiftList: function getHalfGiftList(day) {
    if (this.halfGiftList && this.halfGiftList[day]) {
      return this.halfGiftList[day] || [];
    }
  },
  // 更新数据
  updataHalfListData: function updataHalfListData(day, index, status) {
    this.halfGiftList[day][index].status = status;
  },
  // 活跃宝箱
  setSevenGoalBoxList: function setSevenGoalBoxList(data) {
    this.boxList = data;
  },
  getSevenGoalBoxList: function getSevenGoalBoxList() {
    if (!this.boxList) return;
    this.boxList.sort(Utils.tableLowerSorter(["goal_id"]));
    return this.boxList || [];
  },
  // 更新数据
  updataBoxListData: function updataBoxListData(index, status) {
    this.boxList[index].status = status;
  },
  sortItemList: function sortItemList(list) {
    var _tempsort;
 
    var tempsort = (_tempsort = {}, _defineProperty(_tempsort, 0, 2), _defineProperty(_tempsort, 1, 1), _defineProperty(_tempsort, 2, 3), _tempsort);
 
    var sortFunc = function sortFunc(objA, objB) {
      if (objA.status != objB.status) {
        if (tempsort[objA.status] && tempsort[objB.status]) {
          return tempsort[objA.status] - tempsort[objB.status];
        } else {
          return -1;
        }
      } else {
        return objA.aim - objB.aim;
      }
    };
 
    list.sort(sortFunc);
  },
  //设置倒计时
  setCountDownTime: function setCountDownTime(text, less_time) {
    var node = text.node;
    if (!node) return;
    node.stopAllActions();
 
    if (less_time > 0) {
      this.setTimeFormatString(text, less_time);
      var callfun = cc.callFunc(function () {
        less_time = less_time - 1;
 
        if (less_time < 0) {
          node.stopAllActions();
          text.string = "00:00:00";
        } else {
          this.setTimeFormatString(text, less_time);
        }
      }.bind(this));
      node.runAction(cc.repeatForever(cc.sequence(cc.delayTime(1), callfun)));
    } else {
      this.setTimeFormatString(text, less_time);
    }
  },
  setTimeFormatString: function setTimeFormatString(text, time) {
    var TimeTool = require("timetool");
 
    if (time > 0) {
      text.string = TimeTool.getTimeForFunction(time);
    } else {
      text.node.stopAllActions();
      text.string = "00:00:00";
    }
  },
  // *********** end *********************************************
  // 幸运值
  setLucklyRewardData: function setLucklyRewardData() {
    var data = Config.dial_data.data_get_lucky_award;
    var list = this.sortLucklyData(data);
    this.lucky_num1 = list[0];
    this.lucky_num2 = list[1];
  },
  getLucklyRewardData: function getLucklyRewardData(index) {
    if (!this.lucky_num1 || !this.lucky_num2) return [];
 
    if (index == 1) {
      return this.lucky_num1 || [];
    } else if (index == 2) {
      return this.lucky_num2 || [];
    }
  },
  // 抽奖两个按钮
  setBuyRewardData: function setBuyRewardData() {
    var data = Config.dial_data.data_get_limit_open;
    var list = this.sortLucklyData(data, true);
    this.buy_num_list1 = list[0];
    this.buy_num_list2 = list[1];
  },
  getBuyRewardData: function getBuyRewardData(index) {
    if (!this.buy_num_list1 || !this.buy_num_list2) return [];
 
    if (index == 1) {
      return this.buy_num_list1 || [];
    } else if (index == 2) {
      return this.buy_num_list2 || [];
    }
  },
  sortLucklyData: function sortLucklyData(data, _type) {
    var list1 = [];
    var list2 = [];
 
    for (var i in data) {
      var v = data[i];
 
      if (v.type == 1) {
        list1.push(v);
      } else if (v.type == 2) {
        list2.push(v);
      }
    }
 
    if (_type) {
      list1.sort(function (a, b) {
        return a.type2 - b.type2;
      });
      list2.sort(function (a, b) {
        return a.type2 - b.type2;
      });
    } else {
      list1.sort(function (a, b) {
        return a.id - b.id;
      });
      list2.sort(function (a, b) {
        return a.id - b.id;
      });
    }
 
    return [list1, list2];
  },
  // ------- 探宝服务器返回----------
  // 寻宝数据
  setTreasureInitData: function setTreasureInitData(data) {
    this.treasureInitData = [];
 
    for (var i in data) {
      this.treasureInitData[data[i].type] = data[i];
    }
  },
  getTreasureInitData: function getTreasureInitData(index) {
    if (!this.treasureInitData) return [];
    return this.treasureInitData[index] || [];
  },
  // 更新
  updataTreasureInitData: function updataTreasureInitData(index, data) {
    if (!this.treasureInitData) return;
    this.treasureInitData[index].count = data.count;
    this.treasureInitData[index].end_time = data.end_time;
    this.treasureInitData[index].lucky = data.lucky;
    this.treasureInitData[index].lucky_award = data.lucky_award;
    this.treasureInitData[index].rand_lists = data.rand_lists;
  },
  // 更新日记
  updataTreasureLogData: function updataTreasureLogData(index, data) {
    if (!this.treasureInitData) return;
    this.treasureInitData[index].log_list = data;
  },
  // *********探宝红点*********
  lucklyRedPoint: function lucklyRedPoint() {
    this.setLucklyRewardData();
    this.tab_redpoint = [false, false];
 
    for (var val = 1; val <= 2; val++) {
      var data = this.getLucklyRewardData(val);
      var serve_data = this.getTreasureInitData(val);
      var status = false;
 
      for (var j in data) {
        var _bool = true;
 
        for (var k in serve_data.lucky_award) {
          if (data[j].id == serve_data.lucky_award[k].lucky) {
            _bool = false;
            break;
          }
        }
 
        if (serve_data.lucky < data[j].lucky_val) {
          _bool = false;
        }
 
        if (_bool == true) {
          status = true;
          break;
        }
      }
 
      this.setLucklyTabRedPoint(val, status);
    }
 
    MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.lucky_treasure, this.tab_redpoint[1] || this.tab_redpoint[2]);
  },
  // 获取幸运探宝页签红点
  setLucklyTabRedPoint: function setLucklyTabRedPoint(index, status) {
    this.tab_redpoint[index] = status;
  },
  getLucklyTabRedPoint: function getLucklyTabRedPoint(index) {
    if (this.tab_redpoint && this.tab_redpoint[index]) {
      return this.tab_redpoint[index];
    }
 
    return false;
  },
  getFundRedStatusByBid: function getFundRedStatusByBid(bid) {
    return this.fund_red_list[bid];
  },
  //杂货铺数据
  setStoneShopData: function setStoneShopData(data) {
    this.stone_shop_data = {};
 
    for (var i in data) {
      var v = data[i];
      this.stone_shop_data[v.id] = v;
    }
  },
  getStoneShopData: function getStoneShopData(id) {
    if (this.stone_shop_data && this.stone_shop_data[id] != null) {
      return this.stone_shop_data[id];
    }
 
    return null;
  },
  // -----------每日红点仅显示一次-----------
  updateGiftRedPointStatus: function updateGiftRedPointStatus(data) {
    var bid = data.bid;
    this.gift_id_list = this.gift_id_list || [];
    this.gift_id_list[bid] = data;
  },
  getGiftRedStatusByBid: function getGiftRedStatusByBid(bid) {
    if (!this.gift_id_list) return;
    var list = this.gift_id_list[bid];
 
    if (list) {
      return list.status;
    }
  },
  setGiftRedStatus: function setGiftRedStatus(data) {
    if (!this.gift_id_list) return;
    var bid = data.bid;
    var status = data.status;
    var list = this.gift_id_list[bid];
 
    if (list && list.status != status) {
      list.status = status;
    }
 
    gcore.GlobalEvent.fire(ActionEvent.SHOW_ACTIVITY_RED_POINT, bid, status);
  },
  updataFestvalRedStatus: function updataFestvalRedStatus(bid, data) {
    var red_status = this.getRedPointStatus(data);
    var festval_bid = MainuiConst.icon.festval;
 
    if (bid == ActionConst.ActionRankCommonType.festval_day) {
      festval_bid = MainuiConst.icon.festval_spring;
    } else if (bid == ActionConst.ActionRankCommonType.lover_day) {
      festval_bid = MainuiConst.icon.festval_lover;
    }
 
    MainuiController.getInstance().setFunctionTipsStatus(festval_bid, red_status);
  },
  getRedPointStatus: function getRedPointStatus(data) {
    if (!data) return false;
    var red_status = false;
 
    for (var k = 0; k < data.length; ++k) {
      var v = data[k];
 
      if (v.status == 1) {
        red_status = true;
        break;
      }
    }
 
    return red_status;
  },
  updataCombineLoginRedStatus: function updataCombineLoginRedStatus(data) {
    if (!data) return;
    var red_status = false;
 
    for (var k = 0; k < data.length; ++k) {
      var v = data[k];
 
      if (v.status == 1) {
        red_status = true;
        break;
      }
    }
 
    MainuiController.getInstance().setFunctionTipsStatus(MainuiConst.icon.combine_login, red_status);
  },
  updataPreferentialRedStatus: function updataPreferentialRedStatus(status, id) {
    if (true) return; //暂时屏蔽掉 不需要
    // id = id or MainuiConst.icon.preferential
    // if status then
    //     if self.prefer_fisrt_flag == nil then
    //         self.prefer_fisrt_flag = {}
    //     end
    //     if not self.prefer_fisrt_flag[id] then
    //         self.prefer_fisrt_flag[id] = true
    //     else
    //         status = false
    //     end
    // end
    // MainuiController:getInstance():setFunctionTipsStatus(id, status)
  },
  clearFundSrvData: function clearFundSrvData() {
    this.fund_datas = {};
  }
});
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxhY3Rpb25cXGFjdGlvbl9tb2RlbC5qcyJdLCJuYW1lcyI6WyJNYWludWlDb250cm9sbGVyIiwicmVxdWlyZSIsIk1haW51aUNvbnN0IiwiQWN0aW9uRXZlbnQiLCJBY3Rpb25Db25zdCIsIkFjdGlvbk1vZGVsIiwiY2MiLCJDbGFzcyIsIkJhc2VDbGFzcyIsImN0b3IiLCJwcm9wZXJ0aWVzIiwiaW5pdENvbmZpZyIsImZ1bmRfcmVkX2xpc3QiLCJzZXRPcGVuRnVuZElkcyIsImlkX2xpc3QiLCJmdW5kX2lkX2xpc3QiLCJjaGVja0Z1bmRSZWRTdGF0dXMiLCJnZXRPcGVuRnVuZElkcyIsInNldEZ1bmRTcnZEYXRhIiwiZGF0YSIsImZ1bmRfZGF0YXMiLCJpZCIsInVwZGF0ZUZ1bmRTdGF0dXMiLCJzdGF0dXMiLCJnZXRGdW5kU3J2RGF0YUJ5SWQiLCJrIiwibGVuZ3RoIiwidiIsIkZ1bmRUeXBlIiwidHlwZV9vbmUiLCJ1cGRhdGVGdW5kUmVkU3RhdHVzIiwiRnVuZFJlZEluZGV4IiwiZnVuZF9nZXRfb25lIiwiZnVuZF9idXlfb25lIiwidHlwZV90d28iLCJmdW5kX2dldF90d28iLCJmdW5kX2J1eV90d28iLCJiaWQiLCJfc3RhdHVzIiwicmVkX3N0YXR1cyIsImdldEluc3RhbmNlIiwic2V0RnVuY3Rpb25UaXBzU3RhdHVzIiwiaWNvbiIsImZ1bmQiLCJnY29yZSIsIkdsb2JhbEV2ZW50IiwiZmlyZSIsIlVQREFUQV9GVU5EX1JFRF9TVEFUVVNfRVZFTlQiLCJ1cGRhdGVTZXZlbkxvZ2luRGF0YSIsInNldmVuX2xvZ2luX2RhdGEiLCJnZXRTZXZlbkxvZ2luRGF0YSIsImdldE1heFNldmVuRGF5Iiwic3RhdHVzX2xpc3QiLCJzb3J0IiwiYSIsImIiLCJkYXkiLCJpIiwic2V0Rmlyc3RCdG5TdGF0dXMiLCJmaXJzdEJ0blN0YXR1cyIsImdldEZpcnN0QnRuU3RhdHVzIiwiaW5kZXgiLCJzZXRTZXZlbkdvbGRQZXJpb2QiLCJwZXJpb2QiLCJzZXZlblBlcmlvZCIsImdldFNldmVuR29sZFBlcmlvZCIsImNoZWNrUmVkUG9pbnQiLCJ3ZWxmYXJlUmV0UG9pbnQiLCJ3ZWxmYXJlIiwiZ2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3QiLCJncm93UmV0UG9pbnQiLCJncm93IiwiZ2V0U2VydmVyR3Jvd0xpc3REYXRhIiwiZ2lmdFJldFBvaW50IiwiZ2V0U2VydmVyR2lmdExpc3REYXRhIiwiaGFsZlJlZFBvaW50IiwiaGFsZiIsImdldEhhbGZHaWZ0TGlzdCIsImJveFJlZFBvaW50IiwiYm94IiwiZ2V0U2V2ZW5Hb2FsQm94TGlzdCIsInJlZFN0YXR1cyIsInJlZFN0YXR1czEiLCJyZWRTdGF0dXMyIiwicmVkU3RhdHVzMyIsInJlZFN0YXR1czQiLCJyZWRTdGF0dXM1IiwiaWNvbl9pZCIsInNldmVuX2dvYWwiLCJzZXZlbl9nb2FsMSIsInNldmVuX2dvYWwyIiwic2V2ZW5fZ29hbDMiLCJnZXRSZWRQb2ludFdlbGZhcmVTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludFdlbGZhcmVTdGF0dXMiLCJnZXRSZWRQb2ludEdyb3dTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEdyb3dTdGF0dXMiLCJnZXRSZWRQb2ludEdpZnRTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEdpZnRTdGF0dXMiLCJnZXRSZWRQb2ludEhhbGZTdGF0dXMiLCJ1cGRhdGFSZWRQb2ludEhhbGZTdGF0dXMiLCJnZXRSZWRQb2ludEJveFN0YXR1cyIsInVwZGF0YVJlZFBvaW50Qm94U3RhdHVzIiwiaW5pdFNldmVuV2FsZmFyZSIsInNldFdhbGZhcmVEYXRhIiwic2V0V2FsZmFyZUdyb3dVcERhdGEiLCJzZXRIYWxmR2lmdERhdGEiLCJzZXRCb3hSZXdhcmREYXRhIiwiQ29uZmlnIiwiZGF5X2dvYWxzX2RhdGEiLCJkYXRhX2FsbF90YXJnZXQiLCJib3hSZXdhcmREYXRhIiwicHVzaCIsImdldEJveFJld2FyZERhdGEiLCJkYXRhX3dlbGZhcmVjb2xsZWN0aW9uIiwid2VsZmFyZURhdGEiLCJVdGlscyIsImRlZXBDb3B5IiwiZGF0YV9ncm93dGh0YXJnZXQiLCJ3ZWxmYXJlR3Jvd0RhdGEiLCJ3ZWxmYXJlR2lmdERhdGEiLCJ0YWIiLCJ0YWIxIiwidGFyZ2V0X3R5cGUiLCJkYXRhX2hhbGZkaXNjb3VudCIsIndhbGZhcmVIYWxmRGF0YSIsImdldFdhbGZhcmVEYXRhIiwiZ2V0V2FsZmFyZUdyb3dVcERhdGEiLCJnZXRXZWxmYXJlR2lmdERhdGEiLCJnZXRXZWxmYXJlSGFsZkRhdGEiLCJzZXRTZXZlbkdvYWxXZWxmYXJlTGlzdCIsIndlbGZhcmVMaXN0IiwidXBkYXRhR29hbFdlbGZhcmVMaXN0Iiwic2V0U2V2ZW5Hb2FsR3Jvd0xpc3QiLCJncm93X2xpc3QiLCJzZXJ2ZXJHcm93TGlzdERhdGEiLCJzZXJ2ZXJHaWZ0TGlzdERhdGEiLCJ1cGRhdGFHcm93TGlzdERhdGEiLCJ1cGRhdGFHaWZ0TGlzdERhdGEiLCJzZXRIYWxmR2lmdExpc3QiLCJoYWxmR2lmdExpc3QiLCJoYWxmX2xpc3QiLCJ1cGRhdGFIYWxmTGlzdERhdGEiLCJzZXRTZXZlbkdvYWxCb3hMaXN0IiwiYm94TGlzdCIsInRhYmxlTG93ZXJTb3J0ZXIiLCJ1cGRhdGFCb3hMaXN0RGF0YSIsInNvcnRJdGVtTGlzdCIsImxpc3QiLCJ0ZW1wc29ydCIsInNvcnRGdW5jIiwib2JqQSIsIm9iakIiLCJhaW0iLCJzZXRDb3VudERvd25UaW1lIiwidGV4dCIsImxlc3NfdGltZSIsIm5vZGUiLCJzdG9wQWxsQWN0aW9ucyIsInNldFRpbWVGb3JtYXRTdHJpbmciLCJjYWxsZnVuIiwiY2FsbEZ1bmMiLCJzdHJpbmciLCJiaW5kIiwicnVuQWN0aW9uIiwicmVwZWF0Rm9yZXZlciIsInNlcXVlbmNlIiwiZGVsYXlUaW1lIiwidGltZSIsIlRpbWVUb29sIiwiZ2V0VGltZUZvckZ1bmN0aW9uIiwic2V0THVja2x5UmV3YXJkRGF0YSIsImRpYWxfZGF0YSIsImRhdGFfZ2V0X2x1Y2t5X2F3YXJkIiwic29ydEx1Y2tseURhdGEiLCJsdWNreV9udW0xIiwibHVja3lfbnVtMiIsImdldEx1Y2tseVJld2FyZERhdGEiLCJzZXRCdXlSZXdhcmREYXRhIiwiZGF0YV9nZXRfbGltaXRfb3BlbiIsImJ1eV9udW1fbGlzdDEiLCJidXlfbnVtX2xpc3QyIiwiZ2V0QnV5UmV3YXJkRGF0YSIsIl90eXBlIiwibGlzdDEiLCJsaXN0MiIsInR5cGUiLCJ0eXBlMiIsInNldFRyZWFzdXJlSW5pdERhdGEiLCJ0cmVhc3VyZUluaXREYXRhIiwiZ2V0VHJlYXN1cmVJbml0RGF0YSIsInVwZGF0YVRyZWFzdXJlSW5pdERhdGEiLCJjb3VudCIsImVuZF90aW1lIiwibHVja3kiLCJsdWNreV9hd2FyZCIsInJhbmRfbGlzdHMiLCJ1cGRhdGFUcmVhc3VyZUxvZ0RhdGEiLCJsb2dfbGlzdCIsImx1Y2tseVJlZFBvaW50IiwidGFiX3JlZHBvaW50IiwidmFsIiwic2VydmVfZGF0YSIsImoiLCJfYm9vbCIsImx1Y2t5X3ZhbCIsInNldEx1Y2tseVRhYlJlZFBvaW50IiwibHVja3lfdHJlYXN1cmUiLCJnZXRMdWNrbHlUYWJSZWRQb2ludCIsImdldEZ1bmRSZWRTdGF0dXNCeUJpZCIsInNldFN0b25lU2hvcERhdGEiLCJzdG9uZV9zaG9wX2RhdGEiLCJnZXRTdG9uZVNob3BEYXRhIiwidXBkYXRlR2lmdFJlZFBvaW50U3RhdHVzIiwiZ2lmdF9pZF9saXN0IiwiZ2V0R2lmdFJlZFN0YXR1c0J5QmlkIiwic2V0R2lmdFJlZFN0YXR1cyIsIlNIT1dfQUNUSVZJVFlfUkVEX1BPSU5UIiwidXBkYXRhRmVzdHZhbFJlZFN0YXR1cyIsImdldFJlZFBvaW50U3RhdHVzIiwiZmVzdHZhbF9iaWQiLCJmZXN0dmFsIiwiQWN0aW9uUmFua0NvbW1vblR5cGUiLCJmZXN0dmFsX2RheSIsImZlc3R2YWxfc3ByaW5nIiwibG92ZXJfZGF5IiwiZmVzdHZhbF9sb3ZlciIsInVwZGF0YUNvbWJpbmVMb2dpblJlZFN0YXR1cyIsImNvbWJpbmVfbG9naW4iLCJ1cGRhdGFQcmVmZXJlbnRpYWxS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LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogeHh4QHN5Zy5jb20o5b+F5aGrLCDliJvlu7rmqKHlnZfnmoTkurrlkZgpXG4vLyBAZGVzY3JpcHRpb246XG4vLyAgICAgIOi/memHjOWhq+WGmeivpue7huivtOaYjizkuLvopoHloavlhpnor6XmqKHlnZfnmoTlip/og73nroDopoFcbi8vIDxici8+Q3JlYXRlOiAyMDE5LTAzLTAyIDE2OjQ5OjAzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudmFyIE1haW51aUNvbnRyb2xsZXIgICAgPSByZXF1aXJlKFwibWFpbnVpX2NvbnRyb2xsZXJcIik7XG52YXIgTWFpbnVpQ29uc3QgPSByZXF1aXJlKFwibWFpbnVpX2NvbnN0XCIpO1xudmFyIEFjdGlvbkV2ZW50ID0gcmVxdWlyZShcImFjdGlvbl9ldmVudFwiKVxudmFyIEFjdGlvbkNvbnN0ID0gcmVxdWlyZShcImFjdGlvbl9jb25zdFwiKVxudmFyIEFjdGlvbk1vZGVsID0gY2MuQ2xhc3Moe1xuICAgIGV4dGVuZHM6IEJhc2VDbGFzcyxcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIHByb3BlcnRpZXM6IHtcbiAgICB9LFxuXG4gICAgaW5pdENvbmZpZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyAtLSDln7rph5HnuqLngrnmlbDmja5cbiAgICAgICAgdGhpcy5mdW5kX3JlZF9saXN0ID0ge31cbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS1AIOWfuumHkea0u+WKqOebuOWFs1xuICAgIC8vIC0tIOW8gOWQr+S4reeahOWfuumHkea0u+WKqGlkXG4gICAgc2V0T3BlbkZ1bmRJZHMoaWRfbGlzdCkge1xuICAgICAgICB0aGlzLmZ1bmRfaWRfbGlzdCA9IGlkX2xpc3QgfHwgW11cbiAgICAgICAgdGhpcy5jaGVja0Z1bmRSZWRTdGF0dXMoKVxuICAgIH0sXG4gICAgZ2V0T3BlbkZ1bmRJZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgIH0sXG4gICAgLy8gLS0g6K6+572u5Z+66YeR55qE5pWw5o2uXG4gICAgc2V0RnVuZFNydkRhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLmZ1bmRfZGF0YXMgPSB0aGlzLmZ1bmRfZGF0YXMgfHwge31cbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5pZCkge1xuICAgICAgICAgICAgdGhpcy5mdW5kX2RhdGFzW2RhdGEuaWRdID0gZGF0YVxuICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kU3RhdHVzKGRhdGEuaWQsIGRhdGEuc3RhdHVzKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDojrflj5bln7rph5HmlbDmja5cbiAgICBnZXRGdW5kU3J2RGF0YUJ5SWQoaWQpIHtcbiAgICAgICAgdGhpcy5mdW5kX2RhdGFzID0gdGhpcy5mdW5kX2RhdGFzIHx8IHt9XG4gICAgICAgIHJldHVybiB0aGlzLmZ1bmRfZGF0YXNbaWRdIHx8IHt9XG4gICAgfSxcbiAgICB1cGRhdGVGdW5kU3RhdHVzKGlkLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5mdW5kX2lkX2xpc3QgPSB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRoaXMuZnVuZF9pZF9saXN0Lmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHRoaXMuZnVuZF9pZF9saXN0W2tdXG4gICAgICAgICAgICBpZiAodi5pZCA9PSBpZCkge1xuICAgICAgICAgICAgICAgIHYuc3RhdHVzID0gc3RhdHVzXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrRnVuZFJlZFN0YXR1cygpXG4gICAgfSxcbiAgICAvL+ajgOafpei2heWAvOWfuumHkee6oueCuVxuICAgIGNoZWNrRnVuZFJlZFN0YXR1cygpIHtcbiAgICAgICAgdGhpcy5mdW5kX2lkX2xpc3QgPSB0aGlzLmZ1bmRfaWRfbGlzdCB8fCBbXVxuICAgICAgICBmb3IobGV0IGs9MDtrPHRoaXMuZnVuZF9pZF9saXN0Lmxlbmd0aDsrK2spe1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmZ1bmRfaWRfbGlzdFtrXVxuICAgICAgICAgICAgaWYodi5pZCA9PSBBY3Rpb25Db25zdC5GdW5kVHlwZS50eXBlX29uZSl7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kUmVkU3RhdHVzKEFjdGlvbkNvbnN0LkZ1bmRSZWRJbmRleC5mdW5kX2dldF9vbmUsIHYuc3RhdHVzID09IDEpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGdW5kUmVkU3RhdHVzKEFjdGlvbkNvbnN0LkZ1bmRSZWRJbmRleC5mdW5kX2J1eV9vbmUsIHYuc3RhdHVzID09IDApXG4gICAgICAgICAgICB9ZWxzZSBpZih2LmlkID09IEFjdGlvbkNvbnN0LkZ1bmRUeXBlLnR5cGVfdHdvKXtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZ1bmRSZWRTdGF0dXMoQWN0aW9uQ29uc3QuRnVuZFJlZEluZGV4LmZ1bmRfZ2V0X3R3bywgdi5zdGF0dXMgPT0gMSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZ1bmRSZWRTdGF0dXMoQWN0aW9uQ29uc3QuRnVuZFJlZEluZGV4LmZ1bmRfYnV5X3R3bywgdi5zdGF0dXMgPT0gMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS0g5pu05paw5Z+66YeR57qi54K55pWw5o2uXG4gICAgdXBkYXRlRnVuZFJlZFN0YXR1cyggYmlkLCBzdGF0dXMgKXtcbiAgICAgICAgbGV0IF9zdGF0dXMgPSB0aGlzLmZ1bmRfcmVkX2xpc3RbYmlkXVxuICAgICAgICBpZihfc3RhdHVzID09IHN0YXR1cykgcmV0dXJuO1xuICAgICAgICAvLyAtLSDotK3kubDnmoTnuqLngrnlj6rmnInnmbvpmYbml7bmiY3mmL7npLrvvIzngrnlh7vkuYvlkI7mtojlpLHvvIzkuYvlkI7kuI3lho3mmL7npLpcbiAgICAgICAgaWYoKGJpZCA9PSBBY3Rpb25Db25zdC5GdW5kUmVkSW5kZXguZnVuZF9idXlfb25lIHx8IGJpZCA9PSBBY3Rpb25Db25zdC5GdW5kUmVkSW5kZXguZnVuZF9idXlfdHdvKSAmJiBfc3RhdHVzID09IGZhbHNlKXtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5mdW5kX3JlZF9saXN0W2JpZF0gPSBzdGF0dXNcblxuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IGZhbHNlXG4gICAgICAgIGZvcihsZXQgayBpbiB0aGlzLmZ1bmRfcmVkX2xpc3Qpe1xuICAgICAgICAgICAgbGV0IHYgPSB0aGlzLmZ1bmRfcmVkX2xpc3Rba11cbiAgICAgICAgICAgIGlmKHYgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoTWFpbnVpQ29uc3QuaWNvbi5mdW5kLCByZWRfc3RhdHVzKVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlVQREFUQV9GVU5EX1JFRF9TVEFUVVNfRVZFTlQpXG4gICAgfSxcbiAgICB1cGRhdGVTZXZlbkxvZ2luRGF0YTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgdGhpcy5zZXZlbl9sb2dpbl9kYXRhID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Mb2dpbkRhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V2ZW5fbG9naW5fZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gLS1kZXNjOuiOt+WPluW9k+WJjeWPr+mihuWPljflpKnnmbvlvZXnmoTmnIDlpKflpKnmlbBcbiAgICBnZXRNYXhTZXZlbkRheTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5zZXZlbl9sb2dpbl9kYXRhID09IG51bGwgfHwgdGhpcy5zZXZlbl9sb2dpbl9kYXRhLnN0YXR1c19saXN0ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgdmFyIHN0YXR1c19saXN0ID0gdGhpcy5zZXZlbl9sb2dpbl9kYXRhLnN0YXR1c19saXN0O1xuICAgICAgICBzdGF0dXNfbGlzdC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5kYXkgLSBiLmRheTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIGRheSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgaW4gc3RhdHVzX2xpc3QpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXNfbGlzdFtpXS5zdGF0dXMgPT0gMikge1xuICAgICAgICAgICAgICAgIGRheSA9IHN0YXR1c19saXN0W2ldO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgZGF5ID0gc3RhdHVzX2xpc3Rbc3RhdHVzX2xpc3QubGVuZ3RoXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF5O1xuICAgIH0sXG4gICAgc2V0Rmlyc3RCdG5TdGF0dXM6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuZmlyc3RCdG5TdGF0dXMgPSB7fVxuICAgICAgICBmb3IobGV0IGk9MDtpPGRhdGEubGVuZ3RoOysraSl7XG4gICAgICAgICAgICBsZXQgdiA9IGRhdGFbaV1cbiAgICAgICAgICAgIHRoaXMuZmlyc3RCdG5TdGF0dXNbdi5pZF0gPSB2LnN0YXR1c1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEZpcnN0QnRuU3RhdHVzOiBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0QnRuU3RhdHVzKSByZXR1cm5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlyc3RCdG5TdGF0dXNbaW5kZXhdIHx8IDBcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5LiD5pel55uu5qCH55qE5ZGo5pyf5pWwXG4gICAgc2V0U2V2ZW5Hb2xkUGVyaW9kOmZ1bmN0aW9uKHBlcmlvZCl7XG4gICAgICAgIHRoaXMuc2V2ZW5QZXJpb2QgPSBwZXJpb2Q7XG4gICAgfSxcblxuICAgIGdldFNldmVuR29sZFBlcmlvZDpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gdGhpcy5zZXZlblBlcmlvZDtcbiAgICB9LFxuXG4gICAgLy8g5LiD5aSp55uu5qCH5qOA5p+l57qi54K5ICAgLS3lvZPliY3lpKnmlbDku6XkuIvnmoRcbiAgICBjaGVja1JlZFBvaW50OmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKGRheSA8IDEgfHwgZGF5ID4gNylyZXR1cm47XG4gICAgICAgIGRheSA9IGRheSB8fCAxO1xuICAgICAgICAvLyDnpo/liKlcbiAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnQgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpPTE7IGk8PWRheTtpKyspe1xuICAgICAgICAgICAgdmFyIHdlbGZhcmUgPSB0aGlzLmdldFNldmVuR29hbFdlbGZhcmVMaXN0KGkpO1xuICAgICAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnRbaV0gPSBmYWxzZTtcbiAgICAgICAgICAgIGZvcih2YXIgayBpbiB3ZWxmYXJlKXtcbiAgICAgICAgICAgICAgICBpZih3ZWxmYXJlW2tdLnN0YXR1cyA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWxmYXJlUmV0UG9pbnRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5q+P5pel55uu5qCHXG4gICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50ID0gW107XG4gICAgICAgIGZvcih2YXIgaT0xOyBpPD1kYXk7aSsrKXtcbiAgICAgICAgICAgIHZhciBncm93ID0gdGhpcy5nZXRTZXJ2ZXJHcm93TGlzdERhdGEoaS0xKTtcbiAgICAgICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZ3Jvdyl7XG4gICAgICAgICAgICAgICAgaWYoZ3Jvd1trXS5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2ldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIOi2heWAvOekvOWMhVxuICAgICAgICB0aGlzLmdpZnRSZXRQb2ludCA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTsgaTw9ZGF5O2krKyl7XG4gICAgICAgICAgICB2YXIgZ3JvdyA9IHRoaXMuZ2V0U2VydmVyR2lmdExpc3REYXRhKGktMSk7XG4gICAgICAgICAgICB0aGlzLmdpZnRSZXRQb2ludFtpXSA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yKHZhciBrIGluIGdyb3cpe1xuICAgICAgICAgICAgICAgIGlmKGdyb3dba10uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdpZnRSZXRQb2ludFtpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFsZlJlZFBvaW50ID0gW107XG4gICAgICAgIC8vIDDjgIHov5jmnInpooblj5YgIDHjgIHlt7Lpooblj5ZcbiAgICAgICAgZm9yKHZhciBpPTE7IGk8PWRheTtpKyspe1xuICAgICAgICAgICAgdmFyIGhhbGYgPSB0aGlzLmdldEhhbGZHaWZ0TGlzdChpKTtcbiAgICAgICAgICAgIHRoaXMuaGFsZlJlZFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gaGFsZil7XG4gICAgICAgICAgICAgICAgaWYoayA9PSAwICYmIGhhbGZba10uc3RhdHVzID09IDApe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbGZSZWRQb2ludFtpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWuneeusVxuICAgICAgICB0aGlzLmJveFJlZFBvaW50ID0gW107XG4gICAgICAgIHZhciBib3ggPSB0aGlzLmdldFNldmVuR29hbEJveExpc3QoKTtcbiAgICAgICAgZm9yKHZhciBpIGluIGJveCl7XG4gICAgICAgICAgICB0aGlzLmJveFJlZFBvaW50W2ldID0gZmFsc2U7XG4gICAgICAgICAgICBpZihib3hbaV0uc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgIHRoaXMuYm94UmVkUG9pbnRbaV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJlZFN0YXR1cyA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMSA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMiA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzMyA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzNCA9IGZhbHNlO1xuICAgICAgICB2YXIgcmVkU3RhdHVzNSA9IGZhbHNlO1xuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLndlbGZhcmVSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLndlbGZhcmVSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMxID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmdyb3dSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmdyb3dSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmdpZnRSZXRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmdpZnRSZXRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXMzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmhhbGZSZWRQb2ludCl7XG4gICAgICAgICAgICBpZih0aGlzLmhhbGZSZWRQb2ludFtpXSA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICByZWRTdGF0dXM1ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvcih2YXIgaSBpbiB0aGlzLmJveFJlZFBvaW50KXtcbiAgICAgICAgICAgIGlmKHRoaXMuYm94UmVkUG9pbnRbaV0gPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgcmVkU3RhdHVzNCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZWRTdGF0dXMgPSByZWRTdGF0dXMxIHx8IHJlZFN0YXR1czIgfHwgcmVkU3RhdHVzMyB8fCByZWRTdGF0dXM0IHx8IHJlZFN0YXR1czU7XG4gICAgICAgIHZhciBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsO1xuICAgICAgICBpZih0aGlzLmdldFNldmVuR29sZFBlcmlvZCgpID09IDEpe1xuICAgICAgICAgICAgaWNvbl9pZCA9IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbFxuICAgICAgICB9ZWxzZSBpZih0aGlzLmdldFNldmVuR29sZFBlcmlvZCgpID09IDIpe1xuICAgICAgICAgICAgaWNvbl9pZCA9IE1haW51aUNvbnN0Lmljb24uc2V2ZW5fZ29hbDE7XG4gICAgICAgIH1lbHNlIGlmKHRoaXMuZ2V0U2V2ZW5Hb2xkUGVyaW9kKCkgPT0gMyl7XG4gICAgICAgICAgICBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsMjtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpY29uX2lkID0gTWFpbnVpQ29uc3QuaWNvbi5zZXZlbl9nb2FsM1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKGljb25faWQsIHJlZFN0YXR1cyk7XG4gICAgfSxcblxuICAgIC8vIOe6oueCueeKtuaAgVxuICAgIGdldFJlZFBvaW50V2VsZmFyZVN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy53ZWxmYXJlUmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMud2VsZmFyZVJldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50V2VsZmFyZVN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLndlbGZhcmVSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMud2VsZmFyZVJldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFJlZFBvaW50R3Jvd1N0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5ncm93UmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuZ3Jvd1JldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50R3Jvd1N0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmdyb3dSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuZ3Jvd1JldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIGdldFJlZFBvaW50R2lmdFN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5naWZ0UmV0UG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuZ2lmdFJldFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50R2lmdFN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmdpZnRSZXRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuZ2lmdFJldFBvaW50W2RheV0gPSBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOemj+WIqeekvOWMhVxuICAgIGdldFJlZFBvaW50SGFsZlN0YXR1czpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy5oYWxmUmVkUG9pbnQpcmV0dXJuO1xuICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgIHN0YXR1cyA9IHRoaXMuaGFsZlJlZFBvaW50W2RheV07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50SGFsZlN0YXR1czpmdW5jdGlvbihkYXksIHN0YXR1cyl7XG4gICAgICAgIGlmKCF0aGlzLmhhbGZSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuaGFsZlJlZFBvaW50W2RheV0gPSBzdGF0dXNcbiAgICB9LFxuXG4gICAgZ2V0UmVkUG9pbnRCb3hTdGF0dXM6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZighdGhpcy5ib3hSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHZhciBzdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgc3RhdHVzID0gdGhpcy5ib3hSZWRQb2ludFtpbmRleF07XG4gICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsFxuICAgIHVwZGF0YVJlZFBvaW50Qm94U3RhdHVzOmZ1bmN0aW9uKGluZGV4LCBzdGF0dXMpe1xuICAgICAgICBpZighdGhpcy5ib3hSZWRQb2ludClyZXR1cm47XG4gICAgICAgIHRoaXMuYm94UmVkUG9pbnRbaW5kZXhdID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDkuIPlpKnnm67moIcqKioqKioqKioqKiBzdGFydCAqKioqKlxuICAgIGluaXRTZXZlbldhbGZhcmU6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB0aGlzLnNldFdhbGZhcmVEYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5zZXRXYWxmYXJlR3Jvd1VwRGF0YShpbmRleCk7XG4gICAgICAgIHRoaXMuc2V0SGFsZkdpZnREYXRhKGluZGV4KTtcbiAgICAgICAgdGhpcy5zZXRCb3hSZXdhcmREYXRhKGluZGV4KTtcbiAgICB9LFxuXG4gICAgLy8g5a6d566xXG4gICAgc2V0Qm94UmV3YXJkRGF0YTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIHZhciBkYXRhID0gQ29uZmlnLmRheV9nb2Fsc19kYXRhLmRhdGFfYWxsX3RhcmdldFtpbmRleF1cbiAgICAgICAgdGhpcy5ib3hSZXdhcmREYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMuYm94UmV3YXJkRGF0YS5wdXNoKGRhdGFbaV1bMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYm94UmV3YXJkRGF0YS5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICByZXR1cm4gYS5pZCAtIGIuaWQ7XG4gICAgICAgIH0pXG4gICAgfSxcblxuICAgIGdldEJveFJld2FyZERhdGE6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm94UmV3YXJkRGF0YSB8fCBbXTtcbiAgICB9LFxuXG4gICAgLy8g56aP5YipXG4gICAgc2V0V2FsZmFyZURhdGE6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kYXlfZ29hbHNfZGF0YS5kYXRhX3dlbGZhcmVjb2xsZWN0aW9uW2luZGV4XTtcbiAgICAgICAgdGhpcy53ZWxmYXJlRGF0YSA9IFV0aWxzLmRlZXBDb3B5KGRhdGEpO1xuICAgIH0sXG4gICAgXG4gICAgLy8g5oiQ6ZW/55uu5qCHXG4gICAgc2V0V2FsZmFyZUdyb3dVcERhdGE6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kYXlfZ29hbHNfZGF0YS5kYXRhX2dyb3d0aHRhcmdldFtpbmRleF07XG4gICAgICAgIHRoaXMud2VsZmFyZUdyb3dEYXRhID0gW107XG4gICAgICAgIHRoaXMud2VsZmFyZUdpZnREYXRhID0gW107XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHZhciB0YWIgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YWIxID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZGF0YVtpXSl7XG4gICAgICAgICAgICAgICAgaWYoZGF0YVtpXVtrXS50YXJnZXRfdHlwZSA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiLnB1c2goZGF0YVtpXVtrXSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZGF0YVtpXVtrXS50YXJnZXRfdHlwZSA9PSAyKXtcbiAgICAgICAgICAgICAgICAgICAgdGFiMS5wdXNoKGRhdGFbaV1ba10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUdyb3dEYXRhLnB1c2godGFiKTtcbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUdpZnREYXRhLnB1c2godGFiMSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g56aP5Yip56S85YyFXG4gICAgc2V0SGFsZkdpZnREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgdmFyIGRhdGEgPSBDb25maWcuZGF5X2dvYWxzX2RhdGEuZGF0YV9oYWxmZGlzY291bnRbaW5kZXhdO1xuICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YVtpXSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKHZhciBpIGluIGRhdGEpe1xuICAgICAgICAgICAgdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF0YVtpXVswXS5kYXldLnB1c2goZGF0YVtpXVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICB0aGlzLndhbGZhcmVIYWxmRGF0YVtpXS5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0V2FsZmFyZURhdGE6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYoIXRoaXMud2VsZmFyZURhdGEpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlRGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICBnZXRXYWxmYXJlR3Jvd1VwRGF0YTpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZighdGhpcy53ZWxmYXJlR3Jvd0RhdGEpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlR3Jvd0RhdGFbZGF5XSB8fCBbXTtcbiAgICB9LFxuXG4gICAgZ2V0V2VsZmFyZUdpZnREYXRhOmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKCF0aGlzLndlbGZhcmVHaWZ0RGF0YSlyZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLndlbGZhcmVHaWZ0RGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICBnZXRXZWxmYXJlSGFsZkRhdGE6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYodGhpcy53YWxmYXJlSGFsZkRhdGEgJiYgdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF5XSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53YWxmYXJlSGFsZkRhdGFbZGF5XSB8fCBbXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbi8vICoqKioqKioqKioqIOWNj+iuruebuOWFsyoqKioqKioqKlxuLy8g5LiD5aSp55uu5qCH55qE56aP5Yip6aKG5Y+WXG4gICAgc2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMud2VsZmFyZUxpc3QgPSBbXTtcbiAgICAgICAgZm9yKHZhciBpPTE7aTw9NztpKyspe1xuICAgICAgICAgICAgdGhpcy53ZWxmYXJlTGlzdFtpXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHRoaXMud2VsZmFyZUxpc3RbZGF0YVtpXS5kYXldLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0U2V2ZW5Hb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYoIXRoaXMud2VsZmFyZUxpc3QpcmV0dXJuO1xuICAgICAgICByZXR1cm4gdGhpcy53ZWxmYXJlTGlzdFtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFHb2FsV2VsZmFyZUxpc3Q6ZnVuY3Rpb24oZGF5LCBpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy53ZWxmYXJlTGlzdFtkYXldW2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7ICAgIFxuICAgIH0sXG5cbiAgICAvLyDkuIPlpKnnm67moIfnmoTmiJDplb/nm67moIdcbiAgICBzZXRTZXZlbkdvYWxHcm93TGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdmFyIGdyb3dfbGlzdCA9IFtdO1xuICAgICAgICBmb3IodmFyIGk9MTtpPD03O2krKyl7XG4gICAgICAgICAgICBncm93X2xpc3RbaV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICBncm93X2xpc3RbZGF0YVtpXS5kYXldLnB1c2goZGF0YVtpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZ3Jvd19saXN0KXtcbiAgICAgICAgICAgIHZhciB0YWIgPSBbXTtcbiAgICAgICAgICAgIHZhciB0YWIxID0gW107XG4gICAgICAgICAgICBmb3IodmFyIGsgaW4gZ3Jvd19saXN0W2ldKXtcbiAgICAgICAgICAgICAgICBpZihncm93X2xpc3RbaV1ba10udGFyZ2V0X3R5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgICAgIHRhYi5wdXNoKGdyb3dfbGlzdFtpXVtrXSk7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZ3Jvd19saXN0W2ldW2tdLnRhcmdldF90eXBlID09IDIpe1xuICAgICAgICAgICAgICAgICAgICB0YWIxLnB1c2goZ3Jvd19saXN0W2ldW2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YS5wdXNoKHRhYik7XG4gICAgICAgICAgICB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YS5wdXNoKHRhYjEpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFNlcnZlckdyb3dMaXN0RGF0YTpmdW5jdGlvbihkYXkpe1xuICAgICAgICBpZih0aGlzLnNlcnZlckdyb3dMaXN0RGF0YSAmJiB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YVtkYXldKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdyb3dMaXN0RGF0YVtkYXldIHx8IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuXG4gICAgLy8g5pu05paw5pWw5o2uXG4gICAgdXBkYXRhR3Jvd0xpc3REYXRhOmZ1bmN0aW9uKGRheSwgaW5kZXgsIHN0YXR1cyl7XG4gICAgICAgIHRoaXMuc2VydmVyR3Jvd0xpc3REYXRhW2RheV1baW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgZ2V0U2VydmVyR2lmdExpc3REYXRhOmZ1bmN0aW9uKGRheSl7XG4gICAgICAgIGlmKCF0aGlzLnNlcnZlckdpZnRMaXN0RGF0YSlyZXR1cm47XG4gICAgICAgIHJldHVybiB0aGlzLnNlcnZlckdpZnRMaXN0RGF0YVtkYXldIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFHaWZ0TGlzdERhdGE6ZnVuY3Rpb24oZGF5LCBpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy5zZXJ2ZXJHaWZ0TGlzdERhdGFbZGF5XVtpbmRleF0uc3RhdHVzID0gc3RhdHVzO1xuICAgIH0sXG5cbiAgICAvLyDnpo/liKnnpLzljIXnpLzljIXotK3kubBcbiAgICBzZXRIYWxmR2lmdExpc3Q6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0ID0gW107XG4gICAgICAgIGZvcih2YXIgaT0xO2k8PTc7aSsrKXtcbiAgICAgICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0W2ldID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHZhciBpPTE7aTw9NztpKyspe1xuICAgICAgICAgICAgdmFyIGhhbGZfbGlzdCA9IHRoaXMuZ2V0V2VsZmFyZUhhbGZEYXRhKGkpO1xuICAgICAgICAgICAgZm9yKHZhciBrIGluIGhhbGZfbGlzdCl7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBiIGluIGRhdGEpe1xuICAgICAgICAgICAgICAgICAgICBpZihoYWxmX2xpc3Rba10uaWQgPT0gZGF0YVtiXS5kYXkpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYWxmR2lmdExpc3RbaV0ucHVzaChkYXRhW2JdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRIYWxmR2lmdExpc3Q6ZnVuY3Rpb24oZGF5KXtcbiAgICAgICAgaWYodGhpcy5oYWxmR2lmdExpc3QgJiYgdGhpcy5oYWxmR2lmdExpc3RbZGF5XSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYWxmR2lmdExpc3RbZGF5XSB8fCBbXTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLy8g5pu05paw5pWw5o2uXG4gICAgdXBkYXRhSGFsZkxpc3REYXRhOmZ1bmN0aW9uKGRheSwgaW5kZXgsIHN0YXR1cyl7XG4gICAgICAgIHRoaXMuaGFsZkdpZnRMaXN0W2RheV1baW5kZXhdLnN0YXR1cyA9IHN0YXR1cztcbiAgICB9LFxuXG4gICAgLy8g5rS76LeD5a6d566xXG4gICAgc2V0U2V2ZW5Hb2FsQm94TGlzdDpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdGhpcy5ib3hMaXN0ID0gZGF0YTtcbiAgICB9LFxuICAgIFxuICAgIGdldFNldmVuR29hbEJveExpc3Q6ZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoIXRoaXMuYm94TGlzdClyZXR1cm47XG4gICAgICAgIHRoaXMuYm94TGlzdC5zb3J0KFV0aWxzLnRhYmxlTG93ZXJTb3J0ZXIoW1wiZ29hbF9pZFwiXSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5ib3hMaXN0IHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrDmlbDmja5cbiAgICB1cGRhdGFCb3hMaXN0RGF0YTpmdW5jdGlvbihpbmRleCwgc3RhdHVzKXtcbiAgICAgICAgdGhpcy5ib3hMaXN0W2luZGV4XS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfSxcbiAgICBzb3J0SXRlbUxpc3QobGlzdCl7XG4gICAgICAgIGxldCB0ZW1wc29ydCA9IHtcbiAgICAgICAgICAgIFswXSA6IDIsICAvLy0tIDAg5pyq6aKG5Y+W5pS+5Lit6Ze0XG4gICAgICAgICAgICBbMV0gOiAxLCAgLy8tLSAxIOWPr+mihuWPluaUvuWJjemdolxuICAgICAgICAgICAgWzJdIDogMywgIC8vLS0gMiDlt7Lpooblj5bmlL7mnIDlkI5cbiAgICAgICAgfVxuICAgICAgICBsZXQgc29ydEZ1bmMgPSBmdW5jdGlvbiAob2JqQSxvYmpCKXtcbiAgICAgICAgICAgIGlmIChvYmpBLnN0YXR1cyAhPSBvYmpCLnN0YXR1cyl7XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBzb3J0W29iakEuc3RhdHVzXSAmJiB0ZW1wc29ydFtvYmpCLnN0YXR1c10pe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVtcHNvcnRbb2JqQS5zdGF0dXNdIC0gdGVtcHNvcnRbb2JqQi5zdGF0dXNdXG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmpBLmFpbSAtIG9iakIuYWltXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGlzdC5zb3J0KHNvcnRGdW5jKVxuICAgIH0sXG4gICAgLy/orr7nva7lgJLorqHml7ZcbiAgICBzZXRDb3VudERvd25UaW1lKHRleHQsbGVzc190aW1lKXtcbiAgICAgICAgbGV0IG5vZGUgPSB0ZXh0Lm5vZGVcbiAgICAgICAgaWYoIW5vZGUpcmV0dXJuXG4gICAgICAgIG5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgaWYgKGxlc3NfdGltZSA+IDApe1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICAgICAgbGV0IGNhbGxmdW4gPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGVzc190aW1lID0gbGVzc190aW1lIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAobGVzc190aW1lIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLnN0b3BBbGxBY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIHRleHQuc3RyaW5nID0gXCIwMDowMDowMFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgICAgIG5vZGUucnVuQWN0aW9uKGNjLnJlcGVhdEZvcmV2ZXIoY2Muc2VxdWVuY2UoY2MuZGVsYXlUaW1lKDEpLCBjYWxsZnVuKSkpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5zZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsbGVzc190aW1lKVxuICAgICAgICB9XG4gICAgfSxcbiAgICBzZXRUaW1lRm9ybWF0U3RyaW5nKHRleHQsdGltZSl7XG4gICAgICAgIHZhciBUaW1lVG9vbCA9IHJlcXVpcmUoXCJ0aW1ldG9vbFwiKVxuICAgICAgICBpZih0aW1lID4gMCl7XG4gICAgICAgICAgICB0ZXh0LnN0cmluZyA9IFRpbWVUb29sLmdldFRpbWVGb3JGdW5jdGlvbih0aW1lKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0ZXh0Lm5vZGUuc3RvcEFsbEFjdGlvbnMoKTtcbiAgICAgICAgICAgIHRleHQuc3RyaW5nID0gXCIwMDowMDowMFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vICoqKioqKioqKioqIGVuZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAvLyDlubjov5DlgLxcbiAgICBzZXRMdWNrbHlSZXdhcmREYXRhOmZ1bmN0aW9uKCl7XG4gICAgICAgIHZhciBkYXRhID0gQ29uZmlnLmRpYWxfZGF0YS5kYXRhX2dldF9sdWNreV9hd2FyZDtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnNvcnRMdWNrbHlEYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmx1Y2t5X251bTEgPSBsaXN0WzBdO1xuICAgICAgICB0aGlzLmx1Y2t5X251bTIgPSBsaXN0WzFdO1xuICAgIH0sXG5cbiAgICBnZXRMdWNrbHlSZXdhcmREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYoIXRoaXMubHVja3lfbnVtMSB8fCAhdGhpcy5sdWNreV9udW0yKXJldHVybiBbXTtcbiAgICAgICAgaWYoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sdWNreV9udW0xIHx8IFtdO1xuICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmx1Y2t5X251bTIgfHwgW107XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5oq95aWW5Lik5Liq5oyJ6ZKuXG4gICAgc2V0QnV5UmV3YXJkRGF0YTpmdW5jdGlvbigpe1xuICAgICAgICB2YXIgZGF0YSA9IENvbmZpZy5kaWFsX2RhdGEuZGF0YV9nZXRfbGltaXRfb3BlbjtcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLnNvcnRMdWNrbHlEYXRhKGRhdGEsIHRydWUpO1xuICAgICAgICB0aGlzLmJ1eV9udW1fbGlzdDEgPSBsaXN0WzBdO1xuICAgICAgICB0aGlzLmJ1eV9udW1fbGlzdDIgPSBsaXN0WzFdO1xuICAgIH0sXG5cbiAgICBnZXRCdXlSZXdhcmREYXRhOmZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgaWYoIXRoaXMuYnV5X251bV9saXN0MSB8fCAhdGhpcy5idXlfbnVtX2xpc3QyKXJldHVybiBbXTtcbiAgICAgICAgaWYoaW5kZXggPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idXlfbnVtX2xpc3QxIHx8IFtdO1xuICAgICAgICB9ZWxzZSBpZihpbmRleCA9PSAyKXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1eV9udW1fbGlzdDIgfHwgW107XG4gICAgICAgIH1cbiAgICB9LFxuICAgIFxuICAgIHNvcnRMdWNrbHlEYXRhOmZ1bmN0aW9uKGRhdGEsIF90eXBlKXtcbiAgICAgICAgdmFyIGxpc3QxID0gW107XG4gICAgICAgIHZhciBsaXN0MiA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICB2YXIgdiA9IGRhdGFbaV07XG4gICAgICAgICAgICBpZih2LnR5cGUgPT0gMSl7XG4gICAgICAgICAgICAgICAgbGlzdDEucHVzaCh2KTtcbiAgICAgICAgICAgIH1lbHNlIGlmKHYudHlwZSA9PSAyKXtcbiAgICAgICAgICAgICAgICBsaXN0Mi5wdXNoKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmKF90eXBlKXtcbiAgICAgICAgICAgIGxpc3QxLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEudHlwZTItYi50eXBlMjtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsaXN0Mi5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnR5cGUyLWIudHlwZTI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsaXN0MS5zb3J0KGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgICAgICAgICAgIHJldHVybiBhLmlkLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxpc3QyLnNvcnQoZnVuY3Rpb24oYSwgYil7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaWQgLSBiLmlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtsaXN0MSxsaXN0Ml07XG4gICAgfSxcblxuICAgIC8vIC0tLS0tLS0g5o6i5a6d5pyN5Yqh5Zmo6L+U5ZueLS0tLS0tLS0tLVxuICAgIC8vIOWvu+WuneaVsOaNrlxuICAgIHNldFRyZWFzdXJlSW5pdERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgaW4gZGF0YSl7XG4gICAgICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbZGF0YVtpXS50eXBlXSA9IGRhdGFbaV07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0VHJlYXN1cmVJbml0RGF0YTpmdW5jdGlvbihpbmRleCl7XG4gICAgICAgIGlmKCF0aGlzLnRyZWFzdXJlSW5pdERhdGEpcmV0dXJuW107XG4gICAgICAgIHJldHVybiB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdIHx8IFtdO1xuICAgIH0sXG5cbiAgICAvLyDmm7TmlrBcbiAgICB1cGRhdGFUcmVhc3VyZUluaXREYXRhOmZ1bmN0aW9uKGluZGV4LCBkYXRhKXtcbiAgICAgICAgaWYoIXRoaXMudHJlYXN1cmVJbml0RGF0YSlyZXR1cm47XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YVtpbmRleF0uY291bnQgPSBkYXRhLmNvdW50O1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLmVuZF90aW1lID0gZGF0YS5lbmRfdGltZTtcbiAgICAgICAgdGhpcy50cmVhc3VyZUluaXREYXRhW2luZGV4XS5sdWNreSA9IGRhdGEubHVja3k7XG4gICAgICAgIHRoaXMudHJlYXN1cmVJbml0RGF0YVtpbmRleF0ubHVja3lfYXdhcmQgPSBkYXRhLmx1Y2t5X2F3YXJkO1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLnJhbmRfbGlzdHMgPSBkYXRhLnJhbmRfbGlzdHM7XG4gICAgfSxcblxuICAgIC8vIOabtOaWsOaXpeiusFxuICAgIHVwZGF0YVRyZWFzdXJlTG9nRGF0YTpmdW5jdGlvbihpbmRleCwgZGF0YSl7XG4gICAgICAgIGlmKCF0aGlzLnRyZWFzdXJlSW5pdERhdGEpcmV0dXJuO1xuICAgICAgICB0aGlzLnRyZWFzdXJlSW5pdERhdGFbaW5kZXhdLmxvZ19saXN0ID0gZGF0YTtcbiAgICB9LFxuXG4gICAgLy8gKioqKioqKioq5o6i5a6d57qi54K5KioqKioqKioqXG4gICAgbHVja2x5UmVkUG9pbnQ6ZnVuY3Rpb24oKXtcbiAgICAgICAgdGhpcy5zZXRMdWNrbHlSZXdhcmREYXRhKCk7XG4gICAgICAgIHRoaXMudGFiX3JlZHBvaW50ID0gW2ZhbHNlLGZhbHNlXTtcbiAgICAgICAgZm9yKHZhciB2YWw9MTt2YWw8PTI7dmFsKyspe1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldEx1Y2tseVJld2FyZERhdGEodmFsKTtcbiAgICAgICAgICAgIHZhciBzZXJ2ZV9kYXRhID0gdGhpcy5nZXRUcmVhc3VyZUluaXREYXRhKHZhbCk7XG4gICAgICAgICAgICB2YXIgc3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IodmFyIGogaW4gZGF0YSl7XG4gICAgICAgICAgICAgICAgdmFyIF9ib29sID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBmb3IodmFyIGsgaW4gc2VydmVfZGF0YS5sdWNreV9hd2FyZCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKGRhdGFbal0uaWQgPT0gc2VydmVfZGF0YS5sdWNreV9hd2FyZFtrXS5sdWNreSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBfYm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoc2VydmVfZGF0YS5sdWNreSA8IGRhdGFbal0ubHVja3lfdmFsKXtcbiAgICAgICAgICAgICAgICAgICAgX2Jvb2wgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihfYm9vbCA9PSB0cnVlKXtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRMdWNrbHlUYWJSZWRQb2ludCh2YWwsc3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgICBNYWludWlDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2V0RnVuY3Rpb25UaXBzU3RhdHVzKE1haW51aUNvbnN0Lmljb24ubHVja3lfdHJlYXN1cmUsIHRoaXMudGFiX3JlZHBvaW50WzFdIHx8IHRoaXMudGFiX3JlZHBvaW50WzJdKTtcbiAgICB9LFxuXG4gICAgLy8g6I635Y+W5bm46L+Q5o6i5a6d6aG1562+57qi54K5XG4gICAgc2V0THVja2x5VGFiUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgsc3RhdHVzKXtcbiAgICAgICAgdGhpcy50YWJfcmVkcG9pbnRbaW5kZXhdID0gc3RhdHVzO1xuICAgIH0sXG4gICAgXG4gICAgZ2V0THVja2x5VGFiUmVkUG9pbnQ6ZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICBpZih0aGlzLnRhYl9yZWRwb2ludCAmJiB0aGlzLnRhYl9yZWRwb2ludFtpbmRleF0pe1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFiX3JlZHBvaW50W2luZGV4XTsgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICBnZXRGdW5kUmVkU3RhdHVzQnlCaWQoIGJpZCApe1xuICAgICAgICByZXR1cm4gdGhpcy5mdW5kX3JlZF9saXN0W2JpZF1cbiAgICB9LFxuXG5cbiAgICAvL+adgui0p+mTuuaVsOaNrlxuICAgIHNldFN0b25lU2hvcERhdGE6ZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIHRoaXMuc3RvbmVfc2hvcF9kYXRhID0ge307XG4gICAgICAgIGZvcih2YXIgaSBpbiBkYXRhKXtcbiAgICAgICAgICAgIHZhciB2ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHRoaXMuc3RvbmVfc2hvcF9kYXRhW3YuaWRdPSB2O1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFN0b25lU2hvcERhdGE6ZnVuY3Rpb24oaWQpe1xuICAgICAgICBpZih0aGlzLnN0b25lX3Nob3BfZGF0YSAmJiB0aGlzLnN0b25lX3Nob3BfZGF0YVtpZF0gIT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9uZV9zaG9wX2RhdGFbaWRdXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9LFxuXG4gICAgLy8gLS0tLS0tLS0tLS3mr4/ml6XnuqLngrnku4XmmL7npLrkuIDmrKEtLS0tLS0tLS0tLVxuICAgIHVwZGF0ZUdpZnRSZWRQb2ludFN0YXR1czpmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgdmFyIGJpZCA9IGRhdGEuYmlkO1xuICAgICAgICB0aGlzLmdpZnRfaWRfbGlzdCA9IHRoaXMuZ2lmdF9pZF9saXN0IHx8IFtdO1xuICAgICAgICB0aGlzLmdpZnRfaWRfbGlzdFtiaWRdID0gZGF0YTtcbiAgICB9LFxuXG4gICAgZ2V0R2lmdFJlZFN0YXR1c0J5QmlkOmZ1bmN0aW9uKGJpZCl7XG4gICAgICAgIGlmKCF0aGlzLmdpZnRfaWRfbGlzdClyZXR1cm47XG4gICAgICAgIHZhciBsaXN0ID0gdGhpcy5naWZ0X2lkX2xpc3RbYmlkXTtcbiAgICAgICAgaWYobGlzdCl7XG4gICAgICAgICAgICByZXR1cm4gbGlzdC5zdGF0dXNcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRHaWZ0UmVkU3RhdHVzOmZ1bmN0aW9uKGRhdGEpe1xuICAgICAgICBpZighdGhpcy5naWZ0X2lkX2xpc3QpcmV0dXJuO1xuICAgICAgICB2YXIgYmlkID0gZGF0YS5iaWQ7XG4gICAgICAgIHZhciBzdGF0dXMgPSBkYXRhLnN0YXR1cztcbiAgICAgICAgdmFyIGxpc3QgPSB0aGlzLmdpZnRfaWRfbGlzdFtiaWRdO1xuICAgICAgICBpZihsaXN0ICYmIGxpc3Quc3RhdHVzICE9IHN0YXR1cyl7XG4gICAgICAgICAgICBsaXN0LnN0YXR1cyA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEFjdGlvbkV2ZW50LlNIT1dfQUNUSVZJVFlfUkVEX1BPSU5ULCBiaWQsIHN0YXR1cyk7XG4gICAgfSxcblxuICAgIHVwZGF0YUZlc3R2YWxSZWRTdGF0dXMoYmlkLGRhdGEpe1xuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IHRoaXMuZ2V0UmVkUG9pbnRTdGF0dXMoZGF0YSlcbiAgICAgICAgbGV0IGZlc3R2YWxfYmlkID0gTWFpbnVpQ29uc3QuaWNvbi5mZXN0dmFsXG4gICAgICAgIGlmKGJpZCA9PSBBY3Rpb25Db25zdC5BY3Rpb25SYW5rQ29tbW9uVHlwZS5mZXN0dmFsX2RheSl7XG4gICAgICAgICAgICBmZXN0dmFsX2JpZCA9IE1haW51aUNvbnN0Lmljb24uZmVzdHZhbF9zcHJpbmdcbiAgICAgICAgfWVsc2UgaWYoYmlkID09IEFjdGlvbkNvbnN0LkFjdGlvblJhbmtDb21tb25UeXBlLmxvdmVyX2RheSl7XG4gICAgICAgICAgICBmZXN0dmFsX2JpZCA9IE1haW51aUNvbnN0Lmljb24uZmVzdHZhbF9sb3ZlclxuICAgICAgICB9XG4gICAgICAgIE1haW51aUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zZXRGdW5jdGlvblRpcHNTdGF0dXMoZmVzdHZhbF9iaWQsIHJlZF9zdGF0dXMpXG4gICAgfSxcbiAgICBnZXRSZWRQb2ludFN0YXR1cyhkYXRhKXtcbiAgICAgICAgaWYoIWRhdGEpICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGxldCByZWRfc3RhdHVzID0gZmFsc2UgXG4gICAgICAgIGZvcihsZXQgaz0wO2s8ZGF0YS5sZW5ndGg7KytrKXtcbiAgICAgICAgICAgIGxldCB2ID0gZGF0YVtrXVxuICAgICAgICAgICAgaWYodi5zdGF0dXMgPT0gMSl7XG4gICAgICAgICAgICAgICAgcmVkX3N0YXR1cyA9IHRydWUgXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVkX3N0YXR1c1xuICAgIH0sXG4gICAgdXBkYXRhQ29tYmluZUxvZ2luUmVkU3RhdHVzKGRhdGEpe1xuICAgICAgICBpZighZGF0YSkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVkX3N0YXR1cyA9IGZhbHNlIFxuICAgICAgICBmb3IobGV0IGs9MDtrPGRhdGEubGVuZ3RoOysrayl7XG4gICAgICAgICAgICBsZXQgdiA9IGRhdGFba11cbiAgICAgICAgICAgIGlmKHYuc3RhdHVzID09IDEpe1xuICAgICAgICAgICAgICAgIHJlZF9zdGF0dXMgPSB0cnVlIFxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTWFpbnVpQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLnNldEZ1bmN0aW9uVGlwc1N0YXR1cyhNYWludWlDb25zdC5pY29uLmNvbWJpbmVfbG9naW4sIHJlZF9zdGF0dXMpXG4gICAgfSxcbiAgICB1cGRhdGFQcmVmZXJlbnRpYWxSZWRTdGF0dXMoIHN0YXR1cywgaWQgKXtcbiAgICAgICAgaWYodHJ1ZSkgIHJldHVybjsgIC8v5pqC5pe25bGP6JS95o6JIOS4jemcgOimgVxuXG4gICAgICAgIC8vIGlkID0gaWQgb3IgTWFpbnVpQ29uc3QuaWNvbi5wcmVmZXJlbnRpYWxcbiAgICAgICAgLy8gaWYgc3RhdHVzIHRoZW5cbiAgICAgICAgLy8gICAgIGlmIHNlbGYucHJlZmVyX2Zpc3J0X2ZsYWcgPT0gbmlsIHRoZW5cbiAgICAgICAgLy8gICAgICAgICBzZWxmLnByZWZlcl9maXNydF9mbGFnID0ge31cbiAgICAgICAgLy8gICAgIGVuZFxuICAgICAgICAvLyAgICAgaWYgbm90IHNlbGYucHJlZmVyX2Zpc3J0X2ZsYWdbaWRdIHRoZW5cbiAgICAgICAgLy8gICAgICAgICBzZWxmLnByZWZlcl9maXNydF9mbGFnW2lkXSA9IHRydWVcbiAgICAgICAgLy8gICAgIGVsc2VcbiAgICAgICAgLy8gICAgICAgICBzdGF0dXMgPSBmYWxzZVxuICAgICAgICAvLyAgICAgZW5kXG4gICAgICAgIC8vIGVuZFxuICAgICAgICAvLyBNYWludWlDb250cm9sbGVyOmdldEluc3RhbmNlKCk6c2V0RnVuY3Rpb25UaXBzU3RhdHVzKGlkLCBzdGF0dXMpXG4gICAgfSxcbiAgICBjbGVhckZ1bmRTcnZEYXRhKCAgKXtcbiAgICAgICAgdGhpcy5mdW5kX2RhdGFzID0ge31cbiAgICB9XG59KTsiXX0=