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
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/mod/hero/hero_controller.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, '622bbkiYFRIaKotw7dT7rwW', 'hero_controller');
// Scripts/mod/hero/hero_controller.js
 
"use strict";
 
// --------------------------------------------------------------------
// @author: xxx@syg.com(必填, 创建模块的人员)
// @description:
//      这里填写详细说明,主要填写该模块的功能简要
// <br/>Create: {DATE}
// --------------------------------------------------------------------
var HeroConst = require("hero_const");
 
var HeroEvent = require("hero_event");
 
var PartnerConst = require("partner_const");
 
var HeroCalculate = require("hero_calculate");
 
var BackPackConst = require("backpack_const");
 
var HeroController = cc.Class({
  "extends": BaseController,
  ctor: function ctor() {},
  // 初始化配置数据
  initConfig: function initConfig() {
    var HeroModel = require("hero_model");
 
    this.model = new HeroModel(this);
    this.model.initConfig();
  },
  // 返回当前的model
  getModel: function getModel() {
    return this.model;
  },
  // 注册监听事件
  registerEvents: function registerEvents() {
    // 断线重连重置一下伙伴及其装备缓存数据
    this.re_link_game_event = gcore.GlobalEvent.bind(EventId.EVT_RE_LINK_GAME, function () {// this.sender11000();
      // this.sender11040();
      // this.sender11037();
    }.bind(this)); // 角色数据创建完毕后,监听资产数据变化情况
 
    this.login_event_success = gcore.GlobalEvent.bind(EventId.EVT_ROLE_CREATE_SUCCESS, function () {
      gcore.GlobalEvent.unbind(this.login_event_success);
      this.login_event_success = null; // this.sender11000();
      // this.sender11040();
      // this.sender11037();
 
      var StartowerController = require("startower_controller");
 
      StartowerController.getInstance().sender11320();
 
      var RoleController = require("role_controller");
 
      var role_vo = RoleController.getInstance().getRoleVo();
      this.role_update_evt = role_vo.bind(EventId.UPDATE_ROLE_ATTRIBUTE, function (key, lev) {
        if (key == "coin") {
          this.model.checkLevelRedPointUpdate();
        } else if (key == "hero_exp") {
          this.model.checkLevelRedPointUpdate();
        } else if (key == "lev") {
          this.model.checkUnlockFormRedPoint(lev);
        }
      }, this);
    }.bind(this)); // 物品道具增加 判断红点
 
    if (!this.add_goods_event) {
      this.add_goods_event = gcore.GlobalEvent.bind(EventId.ADD_GOODS, function (bag_code, temp_add) {
        if (bag_code == BackPackConst.Bag_Code.EQUIPS) {
          this.model.is_equip_redpoint_bag_update = true;
          this.model.checkEquipRedPointUpdate();
        } else {
          for (var item_i in temp_add) {
            var item = temp_add[item_i];
 
            if (item.base_id == this.model.upgrade_star_cost_id) {
              this.model.is_upgradestar_redpoint_bag_update = true;
              this.model.checkUpgradeStarRedPointUpdate();
              this.model.checkLevelRedPointUpdate();
            } else if (item.base_id == this.model.talent_skill_cost_id) {
              this.model.setUpdateTalentRedpoint();
              this.model.checkTalentRedPointUpdate();
            } // gdata("item_data", "data_skill_item_list", item.base_id);
 
 
            if (Utils.getItemConfig(item.base_id)) {
              this.model.setUpdateTalentRedpoint();
              this.model.checkTalentRedPointUpdate();
            }
          }
        }
      }.bind(this));
    } // 物品道具删除 判断红点
 
 
    if (!this.del_goods_event) {
      this.del_goods_event = gcore.GlobalEvent.bind(EventId.DELETE_GOODS, function (bag_code, temp_add) {
        if (bag_code == BackPackConst.Bag_Code.EQUIPS) {
          this.model.is_equip_redpoint_bag_update = true;
          this.model.checkEquipRedPointUpdate();
        } else {
          for (var item_i in temp_add) {
            var item = temp_add[item_i];
 
            if (item.base_id == this.model.upgrade_star_cost_id) {
              this.model.is_upgradestar_redpoint_bag_update = true;
              this.model.checkUpgradeStarRedPointUpdate();
              this.model.checkLevelRedPointUpdate();
            } else if (item.base_id == this.model.talent_skill_cost_id) {
              this.model.setUpdateTalentRedpoint();
              this.model.checkTalentRedPointUpdate();
            }
 
            if (Utils.getItemConfig(item.base_id)) {
              this.model.setUpdateTalentRedpoint();
              this.model.checkTalentRedPointUpdate();
            }
          }
        }
      }.bind(this));
    } // 物品道具改变 判断红点
 
 
    if (!this.modify_goods_event) {
      this.modify_goods_event = gcore.GlobalEvent.bind(EventId.MODIFY_GOODS_NUM, function (bag_code, temp_add) {
        if (bag_code == BackPackConst.Bag_Code.EQUIPS) {
          this.model.is_equip_redpoint_bag_update = true;
          this.model.checkEquipRedPointUpdate();
        } else {
          for (var item_i in temp_add) {
            var item = temp_add[item_i];
 
            if (item.base_id == this.model.upgrade_star_cost_id) {
              this.model.is_upgradestar_redpoint_bag_update = true;
              this.model.checkUpgradeStarRedPointUpdate();
              this.model.checkLevelRedPointUpdate();
            } else if (item.base_id == this.model.talent_skill_cost_id) {
              this.model.setUpdateTalentRedpoint();
              this.model.checkTalentRedPointUpdate();
            }
 
            if (Utils.getItemConfig(item.base_id)) {
              this.model.setUpdateTalentRedpoint();
              this.model.checkTalentRedPointUpdate();
            }
          }
        }
      }.bind(this));
    } // 激活神器(圣器) 判断红点
 
 
    if (!this.update_drama_hallows_event) {
      var HallowsEvent = require("hallows_event");
 
      this.update_drama_hallows_event = gcore.GlobalEvent.bind(HallowsEvent.HallowsActivityEvent, function () {
        this.model.checkUnlockHallowsRedPoint();
      }.bind(this));
    }
  },
  // 注册协议接受事件
  registerProtocals: function registerProtocals() {
    // this.RegisterProtocal(1110, this.on1110);
    this.RegisterProtocal(11000, this.handle11000.bind(this)); //请求所有伙伴
 
    this.RegisterProtocal(11001, this.handle11001.bind(this)); //伙伴增加
 
    this.RegisterProtocal(11002, this.handle11002.bind(this)); //伙伴属性变更通知(单个伙伴属性)
 
    this.RegisterProtocal(11007, this.handle11007.bind(this)); //伙伴属性变更通知(list列表伙伴属性)
    //升级
 
    this.RegisterProtocal(11003, this.handle11003.bind(this)); //伙伴升级
 
    this.RegisterProtocal(11004, this.handle11004.bind(this)); //伙伴进阶
 
    this.RegisterProtocal(11005, this.handle11005.bind(this)); //伙伴升星
 
    this.RegisterProtocal(11006, this.handle11006.bind(this)); //删除伙伴推送
 
    this.RegisterProtocal(11009, this.handle11009.bind(this)); //购买英雄数量上限
 
    this.RegisterProtocal(11016, this.handle11016.bind(this)); //伙伴下一阶属性
 
    this.RegisterProtocal(11017, this.handle11017.bind(this)); //推送伙伴最新数量
    //装备相关
 
    this.RegisterProtocal(11010, this.handle11010.bind(this)); //穿戴装备
 
    this.RegisterProtocal(11011, this.handle11011.bind(this)); //卸下装备
 
    this.RegisterProtocal(11012, this.handle11012.bind(this)); //推送装备改变
    // this.RegisterProtocal(11013, this.handle11013.bind(this));     //装备精炼
    // this.RegisterProtocal(11014, this.handle11014.bind(this));     //一键精炼
 
    this.RegisterProtocal(11015, this.handle11015.bind(this)); //英雄锁定
    //请求阵法
    // this.RegisterProtocal(11200, this.handle11200.bind(this));     //请求自身阵法
    // this.RegisterProtocal(11201, this.handle11201.bind(this));     //更换自身阵法
    // this.RegisterProtocal(11202, this.handle11202.bind(this));     //伙伴上阵/下阵/交换
    // this.RegisterProtocal(11203, this.handle11203.bind(this));     //阵法数据改变推送
    // this.RegisterProtocal(11204, this.handle11204.bind(this));     //阵法升级/激活
 
    this.RegisterProtocal(11211, this.handle11211.bind(this)); //请求队伍
 
    this.RegisterProtocal(11212, this.handle11212.bind(this)); //请求保存队伍协议
 
    this.RegisterProtocal(11213, this.handle11213.bind(this)); //请求多个队伍
    // //符文相关
 
    this.RegisterProtocal(11030, this.handle11030.bind(this)); //符文穿戴
 
    this.RegisterProtocal(11031, this.handle11031.bind(this)); //推送符文改变
 
    this.RegisterProtocal(11032, this.handle11032.bind(this)); //符文升星
 
    this.RegisterProtocal(11033, this.handle11033.bind(this)); //符文重置
 
    this.RegisterProtocal(11034, this.handle11034.bind(this)); //符文重铸保存
 
    this.RegisterProtocal(11035, this.handle11035.bind(this)); //符文碎片合成
 
    this.RegisterProtocal(11036, this.handle11036.bind(this)); //符文合成
 
    this.RegisterProtocal(11037, this.handle11037.bind(this)); //符文祝福值
 
    this.RegisterProtocal(11038, this.handle11038.bind(this)); //领取符文祝福值
 
    this.RegisterProtocal(11040, this.handle11040.bind(this)); //英雄图鉴信息
 
    this.RegisterProtocal(11060, this.handle11060.bind(this)); //英雄图鉴信息
 
    this.RegisterProtocal(11075, this.handle11075.bind(this)); //请求英雄遣散 分解材料
 
    this.RegisterProtocal(11076, this.handle11076.bind(this)); //英雄遣散 分解    
    // --天赋相关
 
    this.RegisterProtocal(11096, this.handle11096.bind(this)); //学习天赋技能
 
    this.RegisterProtocal(11097, this.handle11097.bind(this)); //天赋技能升级
 
    this.RegisterProtocal(11098, this.handle11098.bind(this)); //天赋遗忘
 
    this.RegisterProtocal(11099, this.handle11099.bind(this)); //获取英雄天赋信息      
 
    this.RegisterProtocal(11063, this.handle11063.bind(this)); //--英雄详细信息
 
    this.RegisterProtocal(11019, this.handle11019.bind(this)); //--皮肤
 
    this.RegisterProtocal(11020, this.handle11020.bind(this)); //--
  },
  sender11063: function sender11063(partner_id) {
    var protocal = {};
    protocal.partner_id = partner_id;
    this.SendProtocal(11063, protocal);
  },
  handle11063: function handle11063(data) {
    this.model.updateHeroVoDetailedInfo(data);
  },
  sender11000: function sender11000() {
    var protocal = {};
    this.SendProtocal(11000, protocal);
  },
  handle11000: function handle11000(data) {
    //请求所有伙伴
    this.model.setHeroMaxCount(data.num);
    this.model.setHeroBuyNum(data.buy_num);
    this.model.updateHeroList(data.partners);
    var calculate = HeroCalculate.getInstance();
    RedMgr.getInstance().addCalHandler(calculate.checkAllStarFuseRedpoint.bind(calculate), RedIds.RefuseHero);
    this.sender11020();
  },
  handle11001: function handle11001(data) {
    //伙伴增加
    this.model.updateHeroList(data.partners, true); //消除熔炼祭坛的红点 里面会重新计算红点
 
    HeroCalculate.getInstance().clearAllStarFuseRedpointRecord();
    this.model.is_upgradestar_redpoint_bag_update = true;
    this.model.checkUpgradeStarRedPointUpdate();
  },
  handle11002: function handle11002(data) {
    //单个伙伴属性变更通知
    this.model.updateHeroVo(data);
  },
  handle11007: function handle11007(data) {
    //list伙伴属性变更通知(
    var RoleController = require("role_controller");
 
    RoleController.getInstance().getRoleVo().showPower(true);
    this.model.updateHeroList(data.ref_partners, null, true);
  },
  sender11003: function sender11003(partner_id) {
    // 伙伴升级
    var protocal = {};
    protocal.partner_id = partner_id;
    this.SendProtocal(11003, protocal);
  },
  handle11003: function handle11003(data) {
    //伙伴升级
    if (data && data.result === 1) {
      gcore.GlobalEvent.getInstance().fire(HeroEvent.Hero_Level_Up_Success_Event, data);
    }
  },
  sender11004: function sender11004(partner_id) {
    var protocal = {};
    protocal.partner_id = partner_id;
    this.SendProtocal(11004, protocal);
  },
  handle11004: function handle11004(data) {
    //伙伴进阶结果
    if (data && data.result == 1) {// 显示进阶窗口
    }
  },
  sender11005: function sender11005(partner_id, hero_list, random_list) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.expend1 = hero_list;
    protocal.expend2 = random_list;
    this.SendProtocal(11005, protocal);
  },
  handle11005: function handle11005(data) {
    //伙伴升星
    message(data.msg);
 
    if (data && data.result === 1) {
      gcore.GlobalEvent.fire(HeroEvent.Upgrade_Star_Success_Event);
    } else {
      this.model.setUpgradeStarUpdateRecord(true);
    }
  },
  handle11006: function handle11006(data) {
    //删除伙伴推送
    this.model.delHeroDataList(data.expend2);
  },
  sender11009: function sender11009() {
    this.SendProtocal(11009, {});
  },
  handle11009: function handle11009(data) {
    //购买英雄数量上限        
    if (data.result) {
      this.model.setHeroMaxCount(data.num);
      this.model.setHeroBuyNum(data.buy_num);
      gcore.GlobalEvent.fire(HeroEvent.Buy_Hero_Max_Count_Event);
    }
  },
  sender11016: function sender11016(partner_id) {
    var protocal = {};
    protocal.partner_id = partner_id;
    this.SendProtocal(11016, protocal);
  },
  handle11016: function handle11016(data) {
    //伙伴下一阶属性
    gcore.GlobalEvent.fire(HeroEvent.Next_Break_Info_Event, data);
  },
  handle11017: function handle11017(data) {//推送伙伴最新数量
  },
  // 0 表示一键穿戴
  sender11010: function sender11010(partner_id, item_id) {
    //穿戴装备
    this.model.setEquipUpdateRecord(false);
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.item_id = item_id;
    this.SendProtocal(11010, protocal);
  },
  handle11010: function handle11010(data) {
    message(data.msg);
    if (!data.result) this.model.setEquipUpdateRecord(true);
  },
  sender11011: function sender11011(partner_id, pos_id) {
    this.model.setEquipUpdateRecord(false);
    var protocal = {};
    protocal.partner_id = partner_id; //此值改成装备唯一id 
 
    protocal.pos_id = pos_id;
    this.SendProtocal(11011, protocal);
  },
  handle11011: function handle11011(data) {
    //卸下装备
    message(data.msg);
    if (!data.result) this.model.setEquipUpdateRecord(true);
  },
  handle11012: function handle11012(data) {
    //推送装备改变
    message(data.msg);
 
    if (data) {
      this.model.updateHeroEquipList(data);
      data = this.model.getHeroById(data.partner_id);
      gcore.GlobalEvent.fire(HeroEvent.Equip_Update_Event, data);
      this.model.is_equip_redpoint_hero_update = true;
      this.model.checkEquipRedPointUpdate();
    }
  },
  sender11015: function sender11015(partner_id, is_lock) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.type = is_lock;
    this.SendProtocal(11015, protocal);
  },
  handle11015: function handle11015(data) {
    //英雄锁定
    if (data.result == 1) {
      this.model.setLockByPartnerid(data.partner_id, data.type);
      gcore.GlobalEvent.fire(HeroEvent.Hero_Lock_Event);
    }
  },
  sender11211: function sender11211(type) {
    // 请求单个布阵信息 
    var protocal = {};
    protocal.type = type;
    this.SendProtocal(11211, protocal);
  },
  handle11211: function handle11211(data) {
    // 请求单个布阵信息结果
    if (!data || typeof data.type != "number") return;
    if (data && (data.type === PartnerConst.Fun_Form.Drama || data.type === PartnerConst.Fun_Form.Arena)) this.model.setFormList(data);
    gcore.GlobalEvent.fire(HeroEvent.Update_Fun_Form, data);
  },
  sender11212: function sender11212(type, formation_type, pos_info, hallows_id) {
    var protocal = {};
    protocal.type = type;
    protocal.formation_type = formation_type;
    protocal.pos_info = pos_info;
    protocal.hallows_id = hallows_id;
    this.SendProtocal(11212, protocal);
  },
  handle11212: function handle11212(data) {
    //请求保存队伍协议
    if (data.code) {
      if (data.type === PartnerConst.Fun_Form.Drama) {
        var type_list = [];
        var drma_info = {};
        drma_info["type"] = PartnerConst.Fun_Form.Drama;
        type_list.push(drma_info);
        var arena_info = {};
        arena_info["type"] = PartnerConst.Fun_Form.Arena;
        type_list.push(arena_info);
        this.sender11213(type_list);
      } else if (data.type === PartnerConst.Fun_Form.Arena) {
        this.sender11211(data.type);
      } else if (data.type === PartnerConst.Fun_Form.LimitExercise) {
        var LimitExerciseController = require("limitexercise_controller");
 
        LimitExerciseController.getInstance().checkJoinFight();
      }
 
      gcore.GlobalEvent.fire(HeroEvent.Update_Save_Form, data);
    } else {
      message(Utils.TI18N(data.msg));
    }
  },
  sender11213: function sender11213(type_list) {
    // 请求多个布阵
    var protocal = {};
    protocal.type_list = type_list;
    this.SendProtocal(11213, protocal);
  },
  handle11213: function handle11213(data) {
    //请求多个布阵结果
    if (!data || !data.info) return;
 
    for (var form_i in data.info) {
      var form_data = data.info[form_i];
      if (form_data && (form_data.type === PartnerConst.Fun_Form.Drama || form_data.type === PartnerConst.Fun_Form.Arena)) this.model.setFormList(form_data);
    }
  },
  //符文-----------------
  //符文穿戴/卸下
  sender11030: function sender11030(partner_id, pos_id, artifact_id, type) {
    this.model.setEquipUpdateRecord(false);
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.pos_id = pos_id;
    protocal.artifact_id = artifact_id;
    protocal.type = type;
    this.SendProtocal(11030, protocal);
  },
  handle11030: function handle11030(data) {
    //符文穿戴
    message(data.msg);
 
    if (data.result == 0) {
      this.model.setEquipUpdateRecord(true);
    }
  },
  //推送符文改变
  handle11031: function handle11031(data) {
    message(data.msg || "");
    this.model.updatePartnerArtifactList(data);
  },
  //符文升星
  sender11032: function sender11032(partner_id, artifact_id, expends) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.artifact_id = artifact_id;
    protocal.expends = expends;
    this.SendProtocal(11032, protocal);
  },
  handle11032: function handle11032(data) {
    //符文升星
    message(data.msg);
 
    if (data.result == 1) {
      gcore.GlobalEvent.fire(HeroEvent.Artifact_UpStar_Event, data);
    }
  },
  //符文重置
  sender11033: function sender11033(partner_id, artifact_id, skills) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.artifact_id = artifact_id;
    protocal.skills = skills;
    this.SendProtocal(11033, protocal);
  },
  handle11033: function handle11033(data) {
    //符文重置
    message(data.msg);
 
    if (data.result == 1) {
      gcore.GlobalEvent.fire(HeroEvent.Artifact_Recast_Event);
    }
  },
  //符文重铸保存
  sender11034: function sender11034(partner_id, artifact_id, type) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.artifact_id = artifact_id;
    protocal.type = type;
    this.SendProtocal(11034, protocal);
  },
  handle11034: function handle11034(data) {
    //符文重铸保存
    message(data.msg);
 
    if (data.result == 1) {
      gcore.GlobalEvent.fire(HeroEvent.Artifact_Save_Event);
    }
  },
  //符文分解
  sender11035: function sender11035(artifact_id) {
    var protocal = {};
    protocal.artifact_id = artifact_id;
    this.SendProtocal(11035, protocal);
  },
  handle11035: function handle11035(data) {
    //符文碎片合成
    message(data.msg);
  },
  //符文合成
  sender11036: function sender11036(item_id, expend) {
    var protocal = {};
    protocal.item_id = item_id;
    protocal.expends = expend;
    this.SendProtocal(11036, protocal);
  },
  handle11036: function handle11036(data) {
    //符文合成
    message(data.msg);
 
    if (data.result == 1) {
      gcore.GlobalEvent.fire(HeroEvent.Artifact_Compound_Event, data.flag);
    }
  },
  //符文祝福值
  sender11037: function sender11037() {
    var protocal = {};
    this.SendProtocal(11037, protocal);
  },
  handle11037: function handle11037(data) {
    //符文祝福值
    if (data && data.lucky != null) {
      this.model.setArtifactLucky(data.lucky);
      gcore.GlobalEvent.fire(HeroEvent.Artifact_Lucky_Event);
    }
  },
  //领取符文祝福值
  sender11038: function sender11038() {
    this.SendProtocal(11038, {});
  },
  handle11038: function handle11038(data) {
    //领取符文祝福值
    message(data.msg);
  },
  sender11040: function sender11040() {
    var protocal = {};
    this.SendProtocal(11040, protocal);
  },
  handle11040: function handle11040(data) {
    //英雄图鉴信息
    this.model.setHadHeroInfo(data.partners);
  },
  sender11060: function sender11060(channel, partner_id) {
    var protocal = {};
    protocal.channel = channel;
    protocal.partner_id = partner_id;
    this.SendProtocal(11060, protocal);
  },
  handle11060: function handle11060(data) {
    //英雄图鉴信息
    message(data.msg);
  },
  sender11075: function sender11075(hero_list) {
    //请求英雄分解材料
    var protocal = {};
    protocal.list = hero_list;
    this.SendProtocal(11075, protocal);
  },
  handle11075: function handle11075(data) {
    if (data.code == 1) {
      gcore.GlobalEvent.fire(HeroEvent.Hero_Reset_Look_Event, data.list);
    }
  },
  sender11076: function sender11076(partner_list) {
    var protocal = {};
    protocal.list = partner_list;
    this.SendProtocal(11076, protocal);
  },
  handle11076: function handle11076(data) {
    //英雄遣散 
    message(data.msg);
 
    if (data.code) {
      this.model.delHeroDataList(data.list);
    }
  },
  //-天赋相关开始
  sender11096: function sender11096(partner_id, pos, skill_id) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.pos = pos;
    protocal.skill_id = skill_id;
    this.SendProtocal(11096, protocal);
  },
  handle11096: function handle11096(data) {
    if (data.result == true) {
      this.model.updateHeroVoTalent([data], true);
      data = this.model.getHeroById(data.partner_id);
      gcore.GlobalEvent.fire(HeroEvent.Hero_Learn_Talent_Event, data);
      HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPTalent);
    } else {
      message(data.msg);
    }
  },
  // 英雄(伙伴)背包界面
  // @ hero_vo 英雄对应数据对象
  openHeroBagWindow: function openHeroBagWindow(status, hero_vo) {
    if (!status) {
      if (this.hero_bag_window) {
        this.hero_bag_window.close();
        this.hero_bag_window = null;
      }
    } else {
      if (!this.hero_bag_window) {
        var HeroBagWIndow = require("hero_bag_window");
 
        this.hero_bag_window = new HeroBagWIndow(this);
      }
 
      this.hero_bag_window.open(hero_vo);
    }
  },
  //打开英雄图书馆信息
  openHeroLibraryMainWindow: function openHeroLibraryMainWindow(status, bid) {
    if (status == false) {
      if (this.hero_library_mainWindow != null) {
        this.hero_library_mainWindow.close();
        this.hero_library_mainWindow = null;
      }
    } else {
      if (this.hero_library_mainWindow == null) {
        var HeroLibraryMainWindow = require("hero_library_main_window");
 
        this.hero_library_mainWindow = new HeroLibraryMainWindow();
      }
 
      this.hero_library_mainWindow.open(bid);
    }
  },
  //打开英雄图书馆信息
  openHeroLibraryInfoWindow: function openHeroLibraryInfoWindow(status, bid) {
    if (status == false) {
      if (this.hero_library_info != null) {
        this.hero_library_info.close();
        this.hero_library_info = null;
      }
    } else {
      if (this.hero_library_info == null) {
        var HeroLibraryInfoWindow = require("hero_library_info_window");
 
        this.hero_library_info = new HeroLibraryInfoWindow();
      }
 
      this.hero_library_info.open(bid);
    }
  },
  //打开英雄图书馆传记信息
  openHeroLibraryStoryPanel: function openHeroLibraryStoryPanel(status, name, content) {
    if (status == false) {
      if (this.hero_library_story != null) {
        this.hero_library_story.close();
        this.hero_library_story = null;
      }
    } else {
      if (this.hero_library_story == null) {
        var HeroLibraryInfoWindow = require("hero_library_story_window");
 
        this.hero_library_story = new HeroLibraryInfoWindow();
      }
 
      this.hero_library_story.open({
        name: name,
        content: content
      });
    }
  },
  // -- 英雄(伙伴)主信息 界面
  // --@ hero_vo 英雄对应数据对象
  // --@ hero_list 英雄对象列表 
  // --@ setting 结构
  // --setting.showType 显示英雄新的页签类型
  // --setting.show_model_type 显示模式 1:英雄模式  2:图鉴模式 定义参考 HeroConst.BagTab.eBagHero
  openHeroMainInfoWindow: function openHeroMainInfoWindow(status, hero_vo, hero_list, setting) {
    if (status) {
      if (!this.hero_main_info_window) {
        var HeroMainInfoWindow = require("hero_main_info_window");
 
        this.hero_main_info_window = new HeroMainInfoWindow(this);
      }
 
      var open_pragma = {};
      open_pragma.hero_vo = hero_vo;
      open_pragma.hero_list = hero_list;
      open_pragma.setting = setting;
      this.hero_main_info_window.open(open_pragma);
    } else {
      if (this.hero_main_info_window) {
        this.hero_main_info_window.close();
        this.hero_main_info_window = null;
      }
    }
  },
  // 打开立绘界面
  openHeroLookDrawWindow: function openHeroLookDrawWindow(status, draw_res_id, name, bid, share_type) {
    if (status) {
      if (!this.hero_look_draw_window) {
        this.hero_look_draw_window = Utils.createClass("hero_look_draw_window");
      }
 
      var data = {
        draw_res_id: draw_res_id,
        name: name,
        bid: bid,
        share_type: share_type
      };
      this.hero_look_draw_window.open(data);
    } else {
      if (this.hero_look_draw_window) {
        this.hero_look_draw_window.close();
        this.hero_look_draw_window = null;
      }
    }
  },
  // --打开进阶界面
  openHeroBreakPanel: function openHeroBreakPanel(status, hero_vo) {
    if (status) {
      if (!this.hero_break_panel) {
        var HeroBreakPanel = require("hero_break_window");
 
        this.hero_break_panel = new HeroBreakPanel(this);
      }
 
      this.hero_break_panel.open(hero_vo);
    } else {
      if (this.hero_break_panel) {
        this.hero_break_panel.close();
        this.hero_break_panel = null;
      }
    }
  },
  // 打开进阶成功界面 old_vo new_vo 都是heroVo对象
  openBreakExhibitionWindow: function openBreakExhibitionWindow(status, old_vo, new_vo) {
    if (status) {
      if (!this.break_exhibition_window) {
        var HeroBreakExhibitionWindow = require("hero_break_exhibition_window");
 
        this.break_exhibition_window = new HeroBreakExhibitionWindow(this);
      }
 
      if (this.break_exhibition_window && !this.break_exhibition_window.isOpen()) {
        var open_pragma = {};
        open_pragma.old_vo = old_vo;
        open_pragma.new_vo = new_vo;
        this.break_exhibition_window.open(open_pragma);
      }
    } else {
      if (this.break_exhibition_window) {
        this.break_exhibition_window.close();
        this.break_exhibition_window = null;
      }
 
      if (old_vo && typeof old_vo == "number") {
        var skill_bid = old_vo;
        this.openSkillUnlockWindow(true, skill_bid);
      }
    }
  },
  // 打开升星成功界面 old_vo new_vo 都是heroVo对象
  openHeroUpgradeStarExhibitionPanel: function openHeroUpgradeStarExhibitionPanel(status, old_vo, new_vo) {
    if (status) {
      if (!this.upgrade_star_exhibition_window) {
        var HeroUpgradeStarExhibitionPanel = require("hero_upgrade_star_exhibition_window");
 
        this.upgrade_star_exhibition_window = new HeroUpgradeStarExhibitionPanel(this);
      }
 
      if (this.upgrade_star_exhibition_window && !this.upgrade_star_exhibition_window.isOpen()) {
        var open_pragma = {};
        open_pragma.old_vo = old_vo;
        open_pragma.new_vo = new_vo;
        this.upgrade_star_exhibition_window.open(open_pragma);
      }
    } else if (this.upgrade_star_exhibition_window) {
      this.upgrade_star_exhibition_window.close();
      this.upgrade_star_exhibition_window = null;
    }
  },
  // --打开天赋技能学习面板
  // function HeroController:openSkillUnlockWindow(status, skill_bid)
  //     if status == true then
  //         if not this.unlock_window then 
  //             this.unlock_window = SkillUnlockWindow.New(skill_bid)
  //         end
  //         if this.unlock_window and this.unlock_window:isOpen() == false then
  //             this.unlock_window:open()
  //         end
  //     else 
  //         if this.unlock_window then 
  //             this.unlock_window:close()
  //             this.unlock_window = null
  //         end
  //     end
  // end
  // --打开英雄过滤
  // function HeroController:openFormFilterHeroPanel(status, dic_filter_camp_type, dic_filter_career_type)
  //     if status == true then
  //         if not this.form_filter_hero_panel then 
  //             this.form_filter_hero_panel = FormFilterHeroPanel.New()
  //         end
  //         if this.form_filter_hero_panel and this.form_filter_hero_panel:isOpen() == false then
  //             this.form_filter_hero_panel:open(dic_filter_camp_type, dic_filter_career_type)
  //         end
  //     else 
  //         if this.form_filter_hero_panel then 
  //             this.form_filter_hero_panel:close()
  //             this.form_filter_hero_panel = null
  //         end
  //     end
  // end
  // --打开布阵出战界面
  // --@fun_form_type 布阵队伍类型
  // --@show_type 出战界面显示类型 1 出战 2 保存布阵
  openFormGoFightPanel: function openFormGoFightPanel(status, fun_form_type, setting, show_type) {
    if (!status) {
      if (this.form_go_fight_panel) {
        this.form_go_fight_panel.close();
        this.form_go_fight_panel = null;
      }
    } else {
      if (!this.form_go_fight_panel) {
        var FormGoFightPanel = require("form_go_fight_window");
 
        this.form_go_fight_panel = new FormGoFightPanel(this);
      }
 
      var open_pragma = {};
      open_pragma.fun_form_type = fun_form_type;
      open_pragma.setting = setting;
      open_pragma.show_type = show_type;
      this.form_go_fight_panel.open(open_pragma); // this.form_go_fight_panel.(fun_form_type, setting, show_type);
    }
  },
  // 打开布阵 改成和 布阵出战界面 合二为一
  openFormMainWindow: function openFormMainWindow(status, fun_form_type) {
    this.openFormGoFightPanel(status, fun_form_type, {}, HeroConst.FormShowType.eFormSave);
  },
  // 打开选择阵法界面
  // @formation_type 阵法类型 也是配置表的id
  openFormationSelectPanel: function openFormationSelectPanel(status, formation_type, callback) {
    if (status) {
      if (!this.formation_select_panel) {
        var FormSelectPannel = require("form_select_panel");
 
        this.formation_select_panel = new FormSelectPannel(this);
      } // if (this.formation_select_panel && !this.formation_select_panel.isOpen()) {
 
 
      var open_pragma = {};
      open_pragma.formation_type = formation_type;
      open_pragma.callback = callback;
      this.formation_select_panel.open(open_pragma); // }
    } else {
      if (this.formation_select_panel) {
        this.formation_select_panel.close();
        this.formation_select_panel = null;
      }
    }
  },
  // 打开选择神器界面
  // @hallows_id 神器id
  openFormHallowsSelectPanel: function openFormHallowsSelectPanel(status, hallows_id, callback) {
    if (status) {
      if (!this.form_hallows_select_panel) {
        var FormHallowsSelectPanel = require("form_hallows_select_window");
 
        this.form_hallows_select_panel = new FormHallowsSelectPanel(this);
      }
 
      var open_pragma = {};
      open_pragma.hallows_id = hallows_id;
      open_pragma.callback = callback;
      this.form_hallows_select_panel.open(open_pragma); // end
    } else {
      if (this.form_hallows_select_panel) {
        this.form_hallows_select_panel.close();
        this.form_hallows_select_panel = null;
      }
    }
  },
  // 打开英雄升星界面 4升5 5升6 融合祭坛
  openHeroUpgradeStarFuseWindow: function openHeroUpgradeStarFuseWindow(status, hero_vo) {
    if (status) {
      if (!this.upgrade_star_fuse_window || !this.upgrade_star_fuse_window.root_wnd) {
        var HeroUpgradeStarFuseWindow = require("hero_upgrade_star_fuse_window");
 
        this.upgrade_star_fuse_window = new HeroUpgradeStarFuseWindow(this);
      }
 
      if (this.upgrade_star_fuse_window && !this.upgrade_star_fuse_window.isOpen()) {
        this.upgrade_star_fuse_window.open(hero_vo);
      }
    } else {
      if (this.upgrade_star_fuse_window) {
        this.upgrade_star_fuse_window.close();
        this.upgrade_star_fuse_window = null;
      }
    }
  },
  // @select_data 是模拟hero_vo的数据
  // @dic_other_selected 已经其他被选择的数据 [id] = hero_vo模式
  // @ form_type --来源位置  1: 表示融合祭坛 2: 表示升星界面的
  // @ is_master 是否是主卡(融合祭坛专用)
  openHeroUpgradeStarSelectPanel: function openHeroUpgradeStarSelectPanel(status, select_data, dic_other_selected, form_type, is_master, select_cb, cur_hero_vo) {
    if (status) {
      if (!this.upgrade_star_select_panel) {
        var HeroUpgradeStarSelectPanel = require("hero_upgrade_star_select_window");
 
        this.upgrade_star_select_panel = new HeroUpgradeStarSelectPanel(this);
      }
 
      var open_pragma = {};
      open_pragma.select_data = select_data;
      open_pragma.dic_other_selected = dic_other_selected;
      open_pragma.form_type = form_type;
      open_pragma.select_cb = select_cb;
      open_pragma.cur_hero_vo = cur_hero_vo;
      open_pragma.is_master = is_master;
      this.upgrade_star_select_panel.open(open_pragma); // if this.upgrade_star_select_panel and this.upgrade_star_select_panel:isOpen() == false then
    } else {
      if (this.upgrade_star_select_panel) {
        this.upgrade_star_select_panel.close();
        this.upgrade_star_select_panel = null;
      }
    }
  },
  // 打开重生操作界面
  openHeroResetWindow: function openHeroResetWindow(status, data) {
    if (status) {
      if (!this.hero_reset_window) {
        var HeroResetWindow = require("hero_reset_window");
 
        this.hero_reset_window = new HeroResetWindow(this);
      }
 
      if (this.hero_reset_window) this.hero_reset_window.open(data);
    } else {
      if (this.hero_reset_window) {
        this.hero_reset_window.close();
        this.hero_reset_window = null;
      }
    }
  },
  openHeroResetReturnPanel: function openHeroResetReturnPanel(bool, item_list) {
    if (bool) {
      if (!this.hero_reset_return_panel) {
        var HeroResetReturnPanel = require("hero_rest_return_window");
 
        this.hero_reset_return_panel = new HeroResetReturnPanel(this);
      }
 
      var open_pragma = {};
      open_pragma.item_list = item_list;
      this.hero_reset_return_panel.open(open_pragma);
    } else {
      if (this.hero_reset_return_panel) {
        this.hero_reset_return_panel.close();
        this.hero_reset_return_panel = null;
      }
    }
  },
  openHeroResetOfferPanel: function openHeroResetOfferPanel(bool, item_list, is_show_tips, callback, reset_type, dec) {
    if (bool) {
      if (!this.hero_reset_offer_panel) {
        var HeroResetOfferPanel = require("hero_reset_offer_window");
 
        this.hero_reset_offer_panel = new HeroResetOfferPanel(this);
      }
 
      var open_pragma = {};
      open_pragma.item_list = item_list;
      open_pragma.callback = callback;
      open_pragma.is_show_tips = is_show_tips;
      open_pragma.reset_type = reset_type;
      open_pragma.dec = dec;
      this.hero_reset_offer_panel.open(open_pragma);
    } else {
      if (this.hero_reset_offer_panel) {
        this.hero_reset_offer_panel.close();
        this.hero_reset_offer_panel = null;
      }
    }
  },
  // --打开装备穿戴界面
  openEquipPanel: function openEquipPanel(status, pos, partner_id, data) {
    if (status) {
      if (!this.equip_panel) {
        var EquipClothWindow = require("equip_cloth_window");
 
        this.equip_panel = new EquipClothWindow(this);
      }
 
      var open_pragma = {};
      open_pragma.equip_type = pos;
      open_pragma.partner_id = partner_id;
      open_pragma.data = data;
      this.equip_panel.open(open_pragma);
    } else {
      if (this.equip_panel) {
        this.equip_panel.close();
        this.equip_panel = null;
      }
    }
  },
  // desc:打开装备tips
  // time:2018-05-24 05:50:42
  // @bool:打开与关闭
  // @data:装备数据
  // @open_type:装备状态,0.其他状态,1: 背包中 3:伙伴身上 具体查看 PartnerConst.EqmTips
  // @partner_id:穿戴在伙伴身上就有伙伴id,其他可不填或填0
  // @return 
  openEquipTips: function openEquipTips(status, data, open_type, partner) {
    if (status) {
      var TipsController = require("tips_controller");
 
      TipsController.getInstance().showEquipTips(data, open_type, partner);
    } // if (status) {
    //     // 引导的时候不弹
    //     // if GuideController:getInstance():isInGuide() return // 引导的时候不要显示tips了 因为可能会被挡住
    //     if (!this.equip_tips) {
    //         var EquipTips = require("equip_tips");
    //         this.equip_tips = new EquipTips();
    //     } 
    //     open_type = open_type || PartnerConst.EqmTips.normal;
    //     this.equip_tips.open();
    // } else {
    //     if (this.equip_tips) {
    //         this.equip_tips.close();
    //         this.equip_tips = null;
    //     }
    // }
 
  },
  // ----------------------------------------神器相关------------------------------
  // 打开符文重铸界面
  openArtifactRecastWindow: function openArtifactRecastWindow(status, data, partner_id) {
    if (status == true) {
      if (!this.artifact_recast_win) {
        this.artifact_recast_win = Utils.createClass("artifact_recast_window");
      }
 
      this.artifact_recast_win.open({
        data: data,
        partner_id: partner_id
      });
    } else {
      if (this.artifact_recast_win) {
        this.artifact_recast_win.close();
        this.artifact_recast_win = null;
      }
    }
  },
  //打开神器列表选择界面
  // function HeroController:openArtifactListWindow(bool,artifact_type,partner_id,select_vo)
  //     if bool == true then
  //         if not this.artifact_list_panel then 
  //             this.artifact_list_panel = ArtifactListWindow.New()
  //         end
  //         artifact_type = artifact_type or 0
  //         partner_id = partner_id or 0
  //         if this.artifact_list_panel and this.artifact_list_panel:isOpen() == false then
  //             this.artifact_list_panel:open(artifact_type,partner_id,select_vo)
  //         end
  //     else 
  //         if this.artifact_list_panel then 
  //             this.artifact_list_panel:close()
  //             this.artifact_list_panel = null
  //         end
  //     end
  // end
  openArtifactListWindow: function openArtifactListWindow(bool, artifact_type, partner_id, select_vo) {
    if (bool == true) {
      if (!this.artifact_list_window) {
        this.artifact_list_window = Utils.createClass("artifact_list_window");
      }
 
      artifact_type = artifact_type || 0;
      partner_id = partner_id || 0;
      var data = {};
      data.artifact_type = artifact_type;
      data.partner_id = partner_id;
      data.select_vo = select_vo;
      this.artifact_list_window.open(data);
    } else {
      if (this.artifact_list_window) {
        this.artifact_list_window.close();
        this.artifact_list_window = null;
      }
    }
  },
  // 符文选择界面
  openArtifactChoseWindow: function openArtifactChoseWindow(bool, data) {
    if (bool == true) {
      if (!this.artifact_chose_window) {
        this.artifact_chose_window = Utils.createClass("artifact_chose_window");
      }
 
      this.artifact_chose_window.open(data);
    } else {
      if (this.artifact_chose_window) {
        this.artifact_chose_window.close();
        this.artifact_chose_window = null;
      }
    }
  },
  // --==============================--
  // --desc:打开符文操作界面
  // --time:2018-05-17 05:34:13
  // --@bool:
  // --@data:符文数据,为goods_vo数据
  // --@open_type:打开类型,分为
  // --@return 
  // --==============================--
  openArtifactTipsWindow: function openArtifactTipsWindow(bool, data, open_type, partner_id, pos) {
    if (bool == true) {
      if (data == null || data.config == null) {
        message(Utils.TI18N("数据异常"));
        return;
      }
 
      if (!this.artifact_tips_window) {
        this.artifact_tips_window = Utils.createClass("artifact_tips_window");
      }
 
      if (open_type == null) {
        open_type = PartnerConst.ArtifactTips.backpack;
      }
 
      var param = {
        data: data,
        open_type: open_type,
        partner_id: partner_id,
        pos: pos
      };
      this.artifact_tips_window.open(param);
    } else {
      if (this.artifact_tips_window) {
        this.artifact_tips_window.close();
        this.artifact_tips_window = null;
      }
    }
  },
  // 打开符文合成tips界面
  openArtifactComTipsWindow: function openArtifactComTipsWindow(status, bid) {
    if (status == true) {
      if (!this.artifact_com_win) {
        this.artifact_com_win = Utils.createClass("artifact_com_tips_window");
      }
 
      this.artifact_com_win.open(bid);
    } else {
      if (this.artifact_com_win) {
        this.artifact_com_win.close();
        this.artifact_com_win = null;
      }
    }
  },
  // 打开符文祝福奖励领取界面
  openArtifactAwardWindow: function openArtifactAwardWindow(status) {
    if (status == true) {
      if (!this.artifact_award_win) {
        this.artifact_award_win = Utils.createClass("artifact_award_window");
      }
 
      this.artifact_award_win.open();
    } else {
      if (this.artifact_award_win) {
        this.artifact_award_win.close();
        this.artifact_award_win = null;
      }
    }
  },
  // 打开符文技能预览界面
  // -@show_type 显示类型 1 是符文技能预览 2 是英雄天赋技能
  openArtifactSkillWindow: function openArtifactSkillWindow(status, show_type) {
    if (status == true) {
      if (!this.artifact_skill_win) {
        this.artifact_skill_win = Utils.createClass("artifact_skill_window", show_type);
      }
 
      this.artifact_skill_win.open();
    } else {
      if (this.artifact_skill_win) {
        this.artifact_skill_win.close();
        this.artifact_skill_win = null;
      }
    }
  },
  // ----------------------------------------神器相关结束------------------------------
  // -- 打开英雄tips界面
  // --is_hide_equip 是否隐藏装备
  openHeroTipsPanel: function openHeroTipsPanel(bool, hero_vo, is_hide_equip) {
    if (bool == true) {
      if (!this.hero_tips_window) {
        var HeroTipsWindow = require("hero_tips_window");
 
        this.hero_tips_window = new HeroTipsWindow();
      }
 
      if (this.hero_tips_window.isOpen() == false) {
        this.hero_tips_window.open({
          hero_vo: hero_vo,
          is_hide_equip: is_hide_equip
        });
      }
    } else {
      if (this.hero_tips_window) {
        this.hero_tips_window.close();
        this.hero_tips_window = null;
      }
    }
  },
  // -- 打开英雄属性tips界面
  openHeroTipsAttrPanel: function openHeroTipsAttrPanel(bool, hero_vo, is_my) {
    if (bool == true) {
      if (!this.hero_tips_attr_panel) {
        var HeroTipsAttrWindow = require("hero_tips_attr_window");
 
        this.hero_tips_attr_panel = new HeroTipsAttrWindow();
      }
 
      this.hero_tips_attr_panel.open({
        hero_vo: hero_vo,
        is_my: is_my
      });
    } else {
      if (this.hero_tips_attr_panel) {
        this.hero_tips_attr_panel.close();
        this.hero_tips_attr_panel = null;
      }
    }
  },
  // -- 打开英雄tips界面根据bid
  openHeroTipsPanelByBid: function openHeroTipsPanelByBid(bid) {
    var hero_vo = this.model.getMockHeroVoByBid(bid);
 
    if (hero_vo) {
      this.openHeroTipsPanel(true, hero_vo, true);
    }
  },
  // 打开英雄图书馆信息根据bid 和星级
  openHeroInfoWindowByBidStar: function openHeroInfoWindowByBidStar(bid, star, callback) {
    if (bid == null || star == null) return;
    var key = Utils.getNorKey(bid, star);
    var hero_vo = this.model.getHeroPokedexByBid(key);
 
    if (hero_vo) {
      this.openHeroMainInfoWindow(true, hero_vo, [hero_vo], {
        show_model_type: HeroConst.BagTab.eBagPokedex,
        callback: callback
      });
    }
  },
  getHeroGoFightRoot: function getHeroGoFightRoot(finish_cb) {
    if (finish_cb) {
      if (this.form_go_fight_panel) {
        this.form_go_fight_panel.getRootWnd(finish_cb);
      } else {
        finish_cb(null);
      }
    } else {
      if (this.form_go_fight_panel) return this.form_go_fight_panel.root_wnd;
    }
  },
  getHeroBagRoot: function getHeroBagRoot(finish_cb) {
    if (finish_cb) {
      if (this.hero_bag_window) {
        this.hero_bag_window.getRootWnd(finish_cb);
      } else {
        finish_cb(null);
      }
    } else {
      if (this.hero_bag_window) return this.hero_bag_window.root_wnd;
    }
  },
  getHeroMianInfoRoot: function getHeroMianInfoRoot(finish_cb) {
    if (finish_cb) {
      if (this.hero_main_info_window) {
        this.hero_main_info_window.getRootWnd(finish_cb);
      } else {
        finish_cb(null);
      }
    } else {
      if (this.hero_main_info_window) return this.hero_main_info_window.root_wnd;
    }
  },
  // --请求天赋技能信息
  sender11099: function sender11099(list) {
    var protocal = {};
    protocal.partner_ids = list;
    this.SendProtocal(11099, protocal);
  },
  handle11099: function handle11099(data) {
    this.model.updateHeroVoTalent(data.partner_ids);
    gcore.GlobalEvent.fire(HeroEvent.Hero_Get_Talent_Event, data.partner_ids);
  },
  // --天赋技能升级
  sender11097: function sender11097(partner_id, pos) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.pos = pos;
    this.SendProtocal(11097, protocal);
  },
  handle11097: function handle11097(data) {
    if (data.result == true) {
      this.model.updateHeroVoTalent([data], true);
      data = this.model.getHeroById(data.partner_id);
      gcore.GlobalEvent.fire(HeroEvent.Hero_Level_Up_Talent_Event, data);
      HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPTalent);
    } else {
      message(data.msg);
    }
  },
  // --天赋遗忘
  sender11098: function sender11098(partner_id, pos) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.pos = pos;
    this.SendProtocal(11098, protocal);
  },
  handle11098: function handle11098(data) {
    if (data.result == true) {
      this.model.updateHeroVoTalent([data], true);
      data = this.model.getHeroById(data.partner_id);
      gcore.GlobalEvent.fire(HeroEvent.Hero_Forget_Talent_Event, data);
      HeroCalculate.getInstance().clearAllHeroRecordByRedPointType(HeroConst.RedPointType.eRPTalent);
    } else {
      message(data.msg);
    }
  },
  // -- 打开英雄学习技能界面
  openHeroTalentSkillLearnPanel: function openHeroTalentSkillLearnPanel(bool, hero_vo, pos) {
    var self = this;
 
    if (bool == true) {
      if (!self.hero_talent_skill_panel) {
        var HeroTalentSkillLearnPanel = require("hero_talent_skill_learn_window");
 
        self.hero_talent_skill_panel = new HeroTalentSkillLearnPanel();
      }
 
      self.hero_talent_skill_panel.open({
        hero_vo: hero_vo,
        pos: pos
      });
    } else {
      if (self.hero_talent_skill_panel) {
        self.hero_talent_skill_panel.close();
        self.hero_talent_skill_panel = null;
      }
    }
  },
  // -- 打开英雄学习技能升级界面
  openHeroTalentSkillLevelUpPanel: function openHeroTalentSkillLevelUpPanel(bool, hero_vo, skill_id, pos) {
    if (bool == true) {
      if (!this.hero_talent_levelup_panel) {
        var HeroTalentSkillLevelUpPanel = require("hero_talent_skill_level_up_window");
 
        this.hero_talent_levelup_panel = new HeroTalentSkillLevelUpPanel();
      }
 
      this.hero_talent_levelup_panel.open({
        hero_vo: hero_vo,
        skill_id: skill_id,
        pos: pos
      });
    } else {
      if (this.hero_talent_levelup_panel) {
        this.hero_talent_levelup_panel.close();
        this.hero_talent_levelup_panel = null;
      }
    }
  },
  //开启新技能
  openSkillUnlockWindow: function openSkillUnlockWindow(status, skill_bid) {
    if (status == true) {
      if (this.unlock_window == null) {
        var SkillUnlockWindow = require("skill_unlock_window");
 
        this.unlock_window = new SkillUnlockWindow(skill_bid);
      }
 
      if (this.unlock_window && this.unlock_window.isOpen() == false) {
        this.unlock_window.open();
      }
    } else {
      if (this.unlock_window) {
        this.unlock_window.close();
        this.unlock_window = null;
      }
    }
  },
  //播放英雄音效
  onPlayHeroVoice: function onPlayHeroVoice(vocie_res, time) {
    //默认4秒
    time = time || 4; //补充1秒时差
 
    time += 1;
 
    if (this.voice_time_ticket == null) {
      var volume = gcore.SysEnv.get("music_volume");
      volume -= 0.6;
      SoundManager.getInstance().setBackgroundVolume(volume);
    } else {
      gcore.Timer.del(this.voice_time_ticket);
      this.voice_time_ticket = null;
    }
 
    if (this.hero_music != null) {
      if (this.hero_music == "undef") {
        SoundManager.getInstance().removeEffectSound(null);
      } else {
        SoundManager.getInstance().removeEffectSound(this.hero_music);
      }
    }
 
    this.hero_music = SoundManager.getInstance().playHeroEffectOnce(AUDIO_TYPE.DUBBING, vocie_res);
 
    if (this.hero_music == undefined) {
      this.hero_music = "undef";
    }
 
    this.voice_time_ticket = gcore.Timer.set(function () {
      var volume = gcore.SysEnv.get("music_volume");
      SoundManager.getInstance().setBackgroundVolume(volume);
      this.voice_time_ticket = null;
    }.bind(this), time * 1000, 1);
  },
 
  /**
   * 皮肤提示
   * @param {*} status 打开与关闭
   * @param {*} data  皮肤信息
   * @param {*} open_type  装备状态,0.其他状态,1: 背包中 3:伙伴身上 具体查看 PartnerConst.EqmTips
   * @param {*} partner 穿戴在伙伴身上就有伙伴id,其他可不填或填0
   */
  openHeroSkinTipsPanel: function openHeroSkinTipsPanel(status, data, open_type, partner) {
    if (status == true) {
      if (!this.hero_skin_tips_panel) {
        var HeroSkinTipsPanel = require("hero_skin_tips_window");
 
        this.hero_skin_tips_panel = new HeroSkinTipsPanel(this);
      }
 
      this.hero_skin_tips_panel.open({
        data: data,
        open_type: open_type,
        partner: partner
      });
    } else {
      if (this.hero_skin_tips_panel) {
        this.hero_skin_tips_panel.close();
        this.hero_skin_tips_panel = null;
      }
    }
  },
  //---------------------------皮肤协议结束-----------------------------------------
  //皮肤使用
  sender11019: function sender11019(partner_id, skin_id) {
    var protocal = {};
    protocal.partner_id = partner_id;
    protocal.skin_id = skin_id;
    this.SendProtocal(11019, protocal);
  },
  handle11019: function handle11019(data) {
    message(data.msg);
    cc.log("11019", data);
 
    if (data.result == 1) {
      message(Utils.TI18N("更换成功"));
    }
  },
  //皮肤使用
  sender11020: function sender11020() {
    var protocal = {};
    this.SendProtocal(11020, protocal);
  },
  handle11020: function handle11020(data) {
    cc.log("11020", data);
    this.model.initHeroSkin(data);
  },
  //---------------------------皮肤协议结束-----------------------------------------
  //打开皮肤界面
  openHeroSkinWindow: function openHeroSkinWindow(status, vo) {
    if (status == true) {
      if (!this.hero_skin_window) {
        this.hero_skin_window = Utils.createClass("hero_skin_window");
      }
 
      this.hero_skin_window.open(vo);
    } else {
      if (this.hero_skin_window) {
        this.hero_skin_window.close();
        this.hero_skin_window = null;
      }
    }
  }
});
module.exports = HeroController;
 
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxoZXJvXFxoZXJvX2NvbnRyb2xsZXIuanMiXSwibmFtZXMiOlsiSGVyb0NvbnN0IiwicmVxdWlyZSIsIkhlcm9FdmVudCIsIlBhcnRuZXJDb25zdCIsIkhlcm9DYWxjdWxhdGUiLCJCYWNrUGFja0NvbnN0IiwiSGVyb0NvbnRyb2xsZXIiLCJjYyIsIkNsYXNzIiwiQmFzZUNvbnRyb2xsZXIiLCJjdG9yIiwiaW5pdENvbmZpZyIsIkhlcm9Nb2RlbCIsIm1vZGVsIiwiZ2V0TW9kZWwiLCJyZWdpc3RlckV2ZW50cyIsInJlX2xpbmtfZ2FtZV9ldmVudCIsImdjb3JlIiwiR2xvYmFsRXZlbnQiLCJiaW5kIiwiRXZlbnRJZCIsIkVWVF9SRV9MSU5LX0dBTUUiLCJsb2dpbl9ldmVudF9zdWNjZXNzIiwiRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MiLCJ1bmJpbmQiLCJTdGFydG93ZXJDb250cm9sbGVyIiwiZ2V0SW5zdGFuY2UiLCJzZW5kZXIxMTMyMCIsIlJvbGVDb250cm9sbGVyIiwicm9sZV92byIsImdldFJvbGVWbyIsInJvbGVfdXBkYXRlX2V2dCIsIlVQREFURV9ST0xFX0FUVFJJQlVURSIsImtleSIsImxldiIsImNoZWNrTGV2ZWxSZWRQb2ludFVwZGF0ZSIsImNoZWNrVW5sb2NrRm9ybVJlZFBvaW50IiwiYWRkX2dvb2RzX2V2ZW50IiwiQUREX0dPT0RTIiwiYmFnX2NvZGUiLCJ0ZW1wX2FkZCIsIkJhZ19Db2RlIiwiRVFVSVBTIiwiaXNfZXF1aXBfcmVkcG9pbnRfYmFnX3VwZGF0ZSIsImNoZWNrRXF1aXBSZWRQb2ludFVwZGF0ZSIsIml0ZW1faSIsIml0ZW0iLCJiYXNlX2lkIiwidXBncmFkZV9zdGFyX2Nvc3RfaWQiLCJpc191cGdyYWRlc3Rhcl9yZWRwb2ludF9iYWdfdXBkYXRlIiwiY2hlY2tVcGdyYWRlU3RhclJlZFBvaW50VXBkYXRlIiwidGFsZW50X3NraWxsX2Nvc3RfaWQiLCJzZXRVcGRhdGVUYWxlbnRSZWRwb2ludCIsImNoZWNrVGFsZW50UmVkUG9pbnRVcGRhdGUiLCJVdGlscyIsImdldEl0ZW1Db25maWciLCJkZWxfZ29vZHNfZXZlbnQiLCJERUxFVEVfR09PRFMiLCJtb2RpZnlfZ29vZHNfZXZlbnQiLCJNT0RJRllfR09PRFNfTlVNIiwidXBkYXRlX2RyYW1hX2hhbGxvd3NfZXZlbnQiLCJIYWxsb3dzRXZlbnQiLCJIYWxsb3dzQWN0aXZpdHlFdmVudCIsImNoZWNrVW5sb2NrSGFsbG93c1JlZFBvaW50IiwicmVnaXN0ZXJQcm90b2NhbHMiLCJSZWdpc3RlclByb3RvY2FsIiwiaGFuZGxlMTEwMDAiLCJoYW5kbGUxMTAwMSIsImhhbmRsZTExMDAyIiwiaGFuZGxlMTEwMDciLCJoYW5kbGUxMTAwMyIsImhhbmRsZTExMDA0IiwiaGFuZGxlMTEwMDUiLCJoYW5kbGUxMTAwNiIsImhhbmRsZTExMDA5IiwiaGFuZGxlMTEwMTYiLCJoYW5kbGUxMTAxNyIsImhhbmRsZTExMDEwIiwiaGFuZGxlMTEwMTEiLCJoYW5kbGUxMTAxMiIsImhhbmRsZTExMDE1IiwiaGFuZGxlMTEyMTEiLCJoYW5kbGUxMTIxMiIsImhhbmRsZTExMjEzIiwiaGFuZGxlMTEwMzAiLCJoYW5kbGUxMTAzMSIsImhhbmRsZTExMDMyIiwiaGFuZGxlMTEwMzMiLCJoYW5kbGUxMTAzNCIsImhhbmRsZTExMDM1IiwiaGFuZGxlMTEwMzYiLCJoYW5kbGUxMTAzNyIsImhhbmRsZTExMDM4IiwiaGFuZGxlMTEwNDAiLCJoYW5kbGUxMTA2MCIsImhhbmRsZTExMDc1IiwiaGFuZGxlMTEwNzYiLCJoYW5kbGUxMTA5NiIsImhhbmRsZTExMDk3IiwiaGFuZGxlMTEwOTgiLCJoYW5kbGUxMTA5OSIsImhhbmRsZTExMDYzIiwiaGFuZGxlMTEwMTkiLCJoYW5kbGUxMTAyMCIsInNlbmRlcjExMDYzIiwicGFydG5lcl9pZCIsInByb3RvY2FsIiwiU2VuZFByb3RvY2FsIiwiZGF0YSIsInVwZGF0ZUhlcm9Wb0RldGFpbGVkSW5mbyIsInNlbmRlcjExMDAwIiwic2V0SGVyb01heENvdW50IiwibnVtIiwic2V0SGVyb0J1eU51bSIsImJ1eV9udW0iLCJ1cGRhdGVIZXJvTGlzdCIsInBhcnRuZXJzIiwiY2FsY3VsYXRlIiwiUmVkTWdyIiwiYWRkQ2FsSGFuZGxlciIsImNoZWNrQWxsU3RhckZ1c2VSZWRwb2ludCIsIlJlZElkcyIsIlJlZnVzZUhlcm8iLCJzZW5kZXIxMTAyMCIsImNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZCIsInVwZGF0ZUhlcm9WbyIsInNob3dQb3dlciIsInJlZl9wYXJ0bmVycyIsInNlbmRlcjExMDAzIiwicmVzdWx0IiwiZmlyZSIsIkhlcm9fTGV2ZWxfVXBfU3VjY2Vzc19FdmVudCIsInNlbmRlcjExMDA0Iiwic2VuZGVyMTEwMDUiLCJoZXJvX2xpc3QiLCJyYW5kb21fbGlzdCIsImV4cGVuZDEiLCJleHBlbmQyIiwibWVzc2FnZSIsIm1zZyIsIlVwZ3JhZGVfU3Rhcl9TdWNjZXNzX0V2ZW50Iiwic2V0VXBncmFkZVN0YXJVcGRhdGVSZWNvcmQiLCJkZWxIZXJvRGF0YUxpc3QiLCJzZW5kZXIxMTAwOSIsIkJ1eV9IZXJvX01heF9Db3VudF9FdmVudCIsInNlbmRlcjExMDE2IiwiTmV4dF9CcmVha19JbmZvX0V2ZW50Iiwic2VuZGVyMTEwMTAiLCJpdGVtX2lkIiwic2V0RXF1aXBVcGRhdGVSZWNvcmQiLCJzZW5kZXIxMTAxMSIsInBvc19pZCIsInVwZGF0ZUhlcm9FcXVpcExpc3QiLCJnZXRIZXJvQnlJZCIsIkVxdWlwX1VwZGF0ZV9FdmVudCIsImlzX2VxdWlwX3JlZHBvaW50X2hlcm9fdXBkYXRlIiwic2VuZGVyMTEwMTUiLCJpc19sb2NrIiwidHlwZSIsInNldExvY2tCeVBhcnRuZXJpZCIsIkhlcm9fTG9ja19FdmVudCIsInNlbmRlcjExMjExIiwiRnVuX0Zvcm0iLCJEcmFtYSIsIkFyZW5hIiwic2V0Rm9ybUxpc3QiLCJVcGRhdGVfRnVuX0Zvcm0iLCJzZW5kZXIxMTIxMiIsImZvcm1hdGlvbl90eXBlIiwicG9zX2luZm8iLCJoYWxsb3dzX2lkIiwiY29kZSIsInR5cGVfbGlzdCIsImRybWFfaW5mbyIsInB1c2giLCJhcmVuYV9pbmZvIiwic2VuZGVyMTEyMTMiLCJMaW1pdEV4ZXJjaXNlIiwiTGltaXRFeGVyY2lzZUNvbnRyb2xsZXIiLCJjaGVja0pvaW5GaWdodCIsIlVwZGF0ZV9TYXZlX0Zvcm0iLCJUSTE4TiIsImluZm8iLCJmb3JtX2kiLCJmb3JtX2RhdGEiLCJzZW5kZXIxMTAzMCIsImFydGlmYWN0X2lkIiwidXBkYXRlUGFydG5lckFydGlmYWN0TGlzdCIsInNlbmRlcjExMDMyIiwiZXhwZW5kcyIsIkFydGlmYWN0X1VwU3Rhcl9FdmVudCIsInNlbmRlcjExMDMzIiwic2tpbGxzIiwiQXJ0aWZhY3RfUmVjYXN0X0V2ZW50Iiwic2VuZGVyMTEwMzQiLCJBcnRpZmFjdF9TYXZlX0V2ZW50Iiwic2VuZGVyMTEwMzUiLCJzZW5kZXIxMTAzNiIsImV4cGVuZCIsIkFydGlmYWN0X0NvbXBvdW5kX0V2ZW50IiwiZmxhZyIsInNlbmRlcjExMDM3IiwibHVja3kiLCJzZXRBcnRpZmFjdEx1Y2t5IiwiQXJ0aWZhY3RfTHVja3lfRXZlbnQiLCJzZW5kZXIxMTAzOCIsInNlbmRlcjExMDQwIiwic2V0SGFkSGVyb0luZm8iLCJzZW5kZXIxMTA2MCIsImNoYW5uZWwiLCJzZW5kZXIxMTA3NSIsImxpc3QiLCJIZXJvX1Jlc2V0X0xvb2tfRXZlbnQiLCJzZW5kZXIxMTA3NiIsInBhcnRuZXJfbGlzdCIsInNlbmRlcjExMDk2IiwicG9zIiwic2tpbGxfaWQiLCJ1cGRhdGVIZXJvVm9UYWxlbnQiLCJIZXJvX0xlYXJuX1RhbGVudF9FdmVudCIsImNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlIiwiUmVkUG9pbnRUeXBlIiwiZVJQVGFsZW50Iiwib3Blbkhlcm9CYWdXaW5kb3ciLCJzdGF0dXMiLCJoZXJvX3ZvIiwiaGVyb19iYWdfd2luZG93IiwiY2xvc2UiLCJIZXJvQmFnV0luZG93Iiwib3BlbiIsIm9wZW5IZXJvTGlicmFyeU1haW5XaW5kb3ciLCJiaWQiLCJoZXJvX2xpYnJhcnlfbWFpbldpbmRvdyIsIkhlcm9MaWJyYXJ5TWFpbldpbmRvdyIsIm9wZW5IZXJvTGlicmFyeUluZm9XaW5kb3ciLCJoZXJvX2xpYnJhcnlfaW5mbyIsIkhlcm9MaWJyYXJ5SW5mb1dpbmRvdyIsIm9wZW5IZXJvTGlicmFyeVN0b3J5UGFuZWwiLCJuYW1lIiwiY29udGVudCIsImhlcm9fbGlicmFyeV9zdG9yeSIsIm9wZW5IZXJvTWFpbkluZm9XaW5kb3ciLCJzZXR0aW5nIiwiaGVyb19tYWluX2luZm9fd2luZG93IiwiSGVyb01haW5JbmZvV2luZG93Iiwib3Blbl9wcmFnbWEiLCJvcGVuSGVyb0xvb2tEcmF3V2luZG93IiwiZHJhd19yZXNfaWQiLCJzaGFyZV90eXBlIiwiaGVyb19sb29rX2RyYXdfd2luZG93IiwiY3JlYXRlQ2xhc3MiLCJvcGVuSGVyb0JyZWFrUGFuZWwiLCJoZXJvX2JyZWFrX3BhbmVsIiwiSGVyb0JyZWFrUGFuZWwiLCJvcGVuQnJlYWtFeGhpYml0aW9uV2luZG93Iiwib2xkX3ZvIiwibmV3X3ZvIiwiYnJlYWtfZXhoaWJpdGlvbl93aW5kb3ciLCJIZXJvQnJlYWtFeGhpYml0aW9uV2luZG93IiwiaXNPcGVuIiwic2tpbGxfYmlkIiwib3BlblNraWxsVW5sb2NrV2luZG93Iiwib3Blbkhlcm9VcGdyYWRlU3RhckV4aGliaXRpb25QYW5lbCIsInVwZ3JhZGVfc3Rhcl9leGhpYml0aW9uX3dpbmRvdyIsIkhlcm9VcGdyYWRlU3RhckV4aGliaXRpb25QYW5lbCIsIm9wZW5Gb3JtR29GaWdodFBhbmVsIiwiZnVuX2Zvcm1fdHlwZSIsInNob3dfdHlwZSIsImZvcm1fZ29fZmlnaHRfcGFuZWwiLCJGb3JtR29GaWdodFBhbmVsIiwib3BlbkZvcm1NYWluV2luZG93IiwiRm9ybVNob3dUeXBlIiwiZUZvcm1TYXZlIiwib3BlbkZvcm1hdGlvblNlbGVjdFBhbmVsIiwiY2FsbGJhY2siLCJmb3JtYXRpb25fc2VsZWN0X3BhbmVsIiwiRm9ybVNlbGVjdFBhbm5lbCIsIm9wZW5Gb3JtSGFsbG93c1NlbGVjdFBhbmVsIiwiZm9ybV9oYWxsb3dzX3NlbGVjdF9wYW5lbCIsIkZvcm1IYWxsb3dzU2VsZWN0UGFuZWwiLCJvcGVuSGVyb1VwZ3JhZGVTdGFyRnVzZVdpbmRvdyIsInVwZ3JhZGVfc3Rhcl9mdXNlX3dpbmRvdyIsInJvb3Rfd25kIiwiSGVyb1VwZ3JhZGVTdGFyRnVzZVdpbmRvdyIsIm9wZW5IZXJvVXBncmFkZVN0YXJTZWxlY3RQYW5lbCIsInNlbGVjdF9kYXRhIiwiZGljX290aGVyX3NlbGVjdGVkIiwiZm9ybV90eXBlIiwiaXNfbWFzdGVyIiwic2VsZWN0X2NiIiwiY3VyX2hlcm9fdm8iLCJ1cGdyYWRlX3N0YXJfc2VsZWN0X3BhbmVsIiwiSGVyb1VwZ3JhZGVTdGFyU2VsZWN0UGFuZWwiLCJvcGVuSGVyb1Jlc2V0V2luZG93IiwiaGVyb19yZXNldF93aW5kb3ciLCJIZXJvUmVzZXRXaW5kb3ciLCJvcGVuSGVyb1Jlc2V0UmV0dXJuUGFuZWwiLCJib29sIiwiaXRlbV9saXN0IiwiaGVyb19yZXNldF9yZXR1cm5fcGFuZWwiLCJIZXJvUmVzZXRSZXR1cm5QYW5lbCIsIm9wZW5IZXJvUmVzZXRPZmZlclBhbmVsIiwiaXNfc2hvd190aXBzIiwicmVzZXRfdHlwZSIsImRlYyIsImhlcm9fcmVzZXRfb2ZmZXJfcGFuZWwiLCJIZXJvUmVzZXRPZmZlclBhbmVsIiwib3BlbkVxdWlwUGFuZWwiLCJlcXVpcF9wYW5lbCIsIkVxdWlwQ2xvdGhXaW5kb3ciLCJlcXVpcF90eXBlIiwib3BlbkVxdWlwVGlwcyIsIm9wZW5fdHlwZSIsInBhcnRuZXIiLCJUaXBzQ29udHJvbGxlciIsInNob3dFcXVpcFRpcHMiLCJvcGVuQXJ0aWZhY3RSZWNhc3RXaW5kb3ciLCJhcnRpZmFjdF9yZWNhc3Rfd2luIiwib3BlbkFydGlmYWN0TGlzdFdpbmRvdyIsImFydGlmYWN0X3R5cGUiLCJzZWxlY3Rfdm8iLCJhcnRpZmFjdF9saXN0X3dpbmRvdyIsIm9wZW5BcnRpZmFjdENob3NlV2luZG93IiwiYXJ0aWZhY3RfY2hvc2Vfd2luZG93Iiwib3BlbkFydGlmYWN0VGlwc1dpbmRvdyIsImNvbmZpZyIsImFydGlmYWN0X3RpcHNfd2luZG93IiwiQXJ0aWZhY3RUaXBzIiwiYmFja3BhY2siLCJwYXJhbSIsIm9wZW5BcnRpZmFjdENvbVRpcHNXaW5kb3ciLCJhcnRpZmFjdF9jb21fd2luIiwib3BlbkFydGlmYWN0QXdhcmRXaW5kb3ciLCJhcnRpZmFjdF9hd2FyZF93aW4iLCJvcGVuQXJ0aWZhY3RTa2lsbFdpbmRvdyIsImFydGlmYWN0X3NraWxsX3dpbiIsIm9wZW5IZXJvVGlwc1BhbmVsIiwiaXNfaGlkZV9lcXVpcCIsImhlcm9fdGlwc193aW5kb3ciLCJIZXJvVGlwc1dpbmRvdyIsIm9wZW5IZXJvVGlwc0F0dHJQYW5lbCIsImlzX215IiwiaGVyb190aXBzX2F0dHJfcGFuZWwiLCJIZXJvVGlwc0F0dHJXaW5kb3ciLCJvcGVuSGVyb1RpcHNQYW5lbEJ5QmlkIiwiZ2V0TW9ja0hlcm9Wb0J5QmlkIiwib3Blbkhlcm9JbmZvV2luZG93QnlCaWRTdGFyIiwic3RhciIsImdldE5vcktleSIsImdldEhlcm9Qb2tlZGV4QnlCaWQiLCJzaG93X21vZGVsX3R5cGUiLCJCYWdUYWIiLCJlQmFnUG9rZWRleCIsImdldEhlcm9Hb0ZpZ2h0Um9vdCIsImZpbmlzaF9jYiIsImdldFJvb3RXbmQiLCJnZXRIZXJvQmFnUm9vdCIsImdldEhlcm9NaWFuSW5mb1Jvb3QiLCJzZW5kZXIxMTA5OSIsInBhcnRuZXJfaWRzIiwiSGVyb19HZXRfVGFsZW50X0V2ZW50Iiwic2VuZGVyMTEwOTciLCJIZXJvX0xldmVsX1VwX1RhbGVudF9FdmVudCIsInNlbmRlcjExMDk4IiwiSGVyb19Gb3JnZXRfVGFsZW50X0V2ZW50Iiwib3Blbkhlcm9UYWxlbnRTa2lsbExlYXJuUGFuZWwiLCJzZWxmIiwiaGVyb190YWxlbnRfc2tpbGxfcGFuZWwiLCJIZXJvVGFsZW50U2tpbGxMZWFyblBhbmVsIiwib3Blbkhlcm9UYWxlbnRTa2lsbExldmVsVXBQYW5lbCIsImhlcm9fdGFsZW50X2xldmVsdXBfcGFuZWwiLCJIZXJvVGFsZW50U2tpbGxMZXZlbFVwUGFuZWwiLCJ1bmxvY2tfd2luZG93IiwiU2tpbGxVbmxvY2tXaW5kb3ciLCJvblBsYXlIZXJvVm9pY2UiLCJ2b2NpZV9yZXMiLCJ0aW1lIiwidm9pY2VfdGltZV90aWNrZXQiLCJ2b2x1bWUiLCJTeXNFbnYiLCJnZXQiLCJTb3VuZE1hbmFnZXIiLCJzZXRCYWNrZ3JvdW5kVm9sdW1lIiwiVGltZXIiLCJkZWwiLCJoZXJvX211c2ljIiwicmVtb3ZlRWZmZWN0U291bmQiLCJwbGF5SGVyb0VmZmVjdE9uY2UiLCJBVURJT19UWVBFIiwiRFVCQklORyIsInVuZGVmaW5lZCIsInNldCIsIm9wZW5IZXJvU2tpblRpcHNQYW5lbCIsImhlcm9fc2tpbl90aXBzX3BhbmVsIiwiSGVyb1NraW5UaXBzUGFuZWwiLCJzZW5kZXIxMTAxOSIsInNraW5faWQiLCJsb2ciLCJpbml0SGVyb1NraW4iLCJvcGVuSGVyb1NraW5XaW5kb3ciLCJ2byIsImhlcm9fc2tpbl93aW5kb3ciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsSUFBSUMsU0FBUyxHQUFHRCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxJQUFJRSxZQUFZLEdBQUdGLE9BQU8sQ0FBQyxlQUFELENBQTFCOztBQUNBLElBQUlHLGFBQWEsR0FBR0gsT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUNBLElBQUlJLGFBQWEsR0FBR0osT0FBTyxDQUFDLGdCQUFELENBQTNCOztBQUVBLElBQUlLLGNBQWMsR0FBR0MsRUFBRSxDQUFDQyxLQUFILENBQVM7QUFDMUIsYUFBU0MsY0FEaUI7QUFFMUJDLEVBQUFBLElBQUksRUFBRSxnQkFB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UUFBSWhMLE1BQU0sSUFBSSxJQUFkLEVBQW9CO0FBQ2hCLFVBQUksQ0FBQyxLQUFLaUwsZ0JBQVYsRUFBNEI7QUFDeEIsYUFBS0EsZ0JBQUwsR0FBd0IzVixLQUFLLENBQUNvTSxXQUFOLENBQWtCLGtCQUFsQixDQUF4QjtBQUNIOztBQUNELFdBQUt1SixnQkFBTCxDQUFzQjVLLElBQXRCLENBQTJCMkssRUFBM0I7QUFDSCxLQUxELE1BS087QUFDSCxVQUFJLEtBQUtDLGdCQUFULEVBQTJCO0FBQ3ZCLGFBQUtBLGdCQUFMLENBQXNCOUssS0FBdEI7QUFDQSxhQUFLOEssZ0JBQUwsR0FBd0IsSUFBeEI7QUFDSDtBQUNKO0FBQ0o7QUEvOEN5QixDQUFULENBQXJCO0FBazlDQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCN1ksY0FBakIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBAYXV0aG9yOiB4eHhAc3lnLmNvbSjlv4XloassIOWIm+W7uuaooeWdl+eahOS6uuWRmClcbi8vIEBkZXNjcmlwdGlvbjpcbi8vICAgICAg6L+Z6YeM5aGr5YaZ6K+m57uG6K+05piOLOS4u+imgeWhq+WGmeivpeaooeWdl+eahOWKn+iDveeugOimgVxuLy8gPGJyLz5DcmVhdGU6IHtEQVRFfVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnZhciBIZXJvQ29uc3QgPSByZXF1aXJlKFwiaGVyb19jb25zdFwiKTtcbnZhciBIZXJvRXZlbnQgPSByZXF1aXJlKFwiaGVyb19ldmVudFwiKTtcbnZhciBQYXJ0bmVyQ29uc3QgPSByZXF1aXJlKFwicGFydG5lcl9jb25zdFwiKTtcbnZhciBIZXJvQ2FsY3VsYXRlID0gcmVxdWlyZShcImhlcm9fY2FsY3VsYXRlXCIpO1xudmFyIEJhY2tQYWNrQ29uc3QgPSByZXF1aXJlKFwiYmFja3BhY2tfY29uc3RcIik7XG5cbnZhciBIZXJvQ29udHJvbGxlciA9IGNjLkNsYXNzKHtcbiAgICBleHRlbmRzOiBCYXNlQ29udHJvbGxlcixcbiAgICBjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgfSxcblxuICAgIC8vIOWIneWni+WMlumFjee9ruaVsOaNrlxuICAgIGluaXRDb25maWc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIEhlcm9Nb2RlbCA9IHJlcXVpcmUoXCJoZXJvX21vZGVsXCIpO1xuXG4gICAgICAgIHRoaXMubW9kZWwgPSBuZXcgSGVyb01vZGVsKHRoaXMpO1xuICAgICAgICB0aGlzLm1vZGVsLmluaXRDb25maWcoKTtcbiAgICB9LFxuXG4gICAgLy8g6L+U5Zue5b2T5YmN55qEbW9kZWxcbiAgICBnZXRNb2RlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbDtcbiAgICB9LFxuXG4gICAgLy8g5rOo5YaM55uR5ZCs5LqL5Lu2XG4gICAgcmVnaXN0ZXJFdmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8g5pat57q/6YeN6L+e6YeN572u5LiA5LiL5LyZ5Ly05Y+K5YW26KOF5aSH57yT5a2Y5pWw5o2uXG4gICAgICAgIHRoaXMucmVfbGlua19nYW1lX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFdmVudElkLkVWVF9SRV9MSU5LX0dBTUUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuc2VuZGVyMTEwMDAoKTtcbiAgICAgICAgICAgIC8vIHRoaXMuc2VuZGVyMTEwNDAoKTtcbiAgICAgICAgICAgIC8vIHRoaXMuc2VuZGVyMTEwMzcoKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKVxuXG4gICAgICAgIC8vIOinkuiJsuaVsOaNruWIm+W7uuWujOavleWQju+8jOebkeWQrOi1hOS6p+aVsOaNruWPmOWMluaDheWGtVxuICAgICAgICB0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuRVZUX1JPTEVfQ1JFQVRFX1NVQ0NFU1MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MpXG4gICAgICAgICAgICB0aGlzLmxvZ2luX2V2ZW50X3N1Y2Nlc3MgPSBudWxsO1xuICAgICAgICAgICAgLy8gdGhpcy5zZW5kZXIxMTAwMCgpO1xuICAgICAgICAgICAgLy8gdGhpcy5zZW5kZXIxMTA0MCgpO1xuICAgICAgICAgICAgLy8gdGhpcy5zZW5kZXIxMTAzNygpO1xuICAgICAgICAgICAgdmFyIFN0YXJ0b3dlckNvbnRyb2xsZXIgPSByZXF1aXJlKFwic3RhcnRvd2VyX2NvbnRyb2xsZXJcIik7XG4gICAgICAgICAgICBTdGFydG93ZXJDb250cm9sbGVyLmdldEluc3RhbmNlKCkuc2VuZGVyMTEzMjAoKTtcblxuICAgICAgICAgICAgdmFyIFJvbGVDb250cm9sbGVyID0gcmVxdWlyZShcInJvbGVfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgdmFyIHJvbGVfdm8gPSBSb2xlQ29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmdldFJvbGVWbygpO1xuICAgICAgICAgICAgdGhpcy5yb2xlX3VwZGF0ZV9ldnQgPSByb2xlX3ZvLmJpbmQoRXZlbnRJZC5VUERBVEVfUk9MRV9BVFRSSUJVVEUsIGZ1bmN0aW9uIChrZXksIGxldikge1xuICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gXCJjb2luXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tMZXZlbFJlZFBvaW50VXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gXCJoZXJvX2V4cFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrTGV2ZWxSZWRQb2ludFVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09IFwibGV2XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tVbmxvY2tGb3JtUmVkUG9pbnQobGV2KTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcblxuXG4gICAgICAgIH0uYmluZCh0aGlzKSlcblxuICAgICAgICAvLyDnianlk4HpgZPlhbflop7liqAg5Yik5pat57qi54K5XG4gICAgICAgIGlmICghdGhpcy5hZGRfZ29vZHNfZXZlbnQpIHtcbiAgICAgICAgICAgICB0aGlzLmFkZF9nb29kc19ldmVudCA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoRXZlbnRJZC5BRERfR09PRFMsIGZ1bmN0aW9uKGJhZ19jb2RlLHRlbXBfYWRkKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmFnX2NvZGUgPT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc19lcXVpcF9yZWRwb2ludF9iYWdfdXBkYXRlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrRXF1aXBSZWRQb2ludFVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlbV9pIGluIHRlbXBfYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRlbXBfYWRkW2l0ZW1faV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5iYXNlX2lkID09IHRoaXMubW9kZWwudXBncmFkZV9zdGFyX2Nvc3RfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmlzX3VwZ3JhZGVzdGFyX3JlZHBvaW50X2JhZ191cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tVcGdyYWRlU3RhclJlZFBvaW50VXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja0xldmVsUmVkUG9pbnRVcGRhdGUoKTsgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5iYXNlX2lkID09IHRoaXMubW9kZWwudGFsZW50X3NraWxsX2Nvc3RfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNldFVwZGF0ZVRhbGVudFJlZHBvaW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja1RhbGVudFJlZFBvaW50VXBkYXRlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZGF0YShcIml0ZW1fZGF0YVwiLCBcImRhdGFfc2tpbGxfaXRlbV9saXN0XCIsIGl0ZW0uYmFzZV9pZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKFV0aWxzLmdldEl0ZW1Db25maWcoaXRlbS5iYXNlX2lkKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRVcGRhdGVUYWxlbnRSZWRwb2ludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja1RhbGVudFJlZFBvaW50VXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOeJqeWTgemBk+WFt+WIoOmZpCDliKTmlq3nuqLngrlcbiAgICAgICAgaWYgKCF0aGlzLmRlbF9nb29kc19ldmVudCkge1xuICAgICAgICAgICAgIHRoaXMuZGVsX2dvb2RzX2V2ZW50ID0gZ2NvcmUuR2xvYmFsRXZlbnQuYmluZChFdmVudElkLkRFTEVURV9HT09EUywgZnVuY3Rpb24oYmFnX2NvZGUsdGVtcF9hZGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmFnX2NvZGUgPT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc19lcXVpcF9yZWRwb2ludF9iYWdfdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja0VxdWlwUmVkUG9pbnRVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpdGVtX2kgaW4gdGVtcF9hZGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGVtcF9hZGRbaXRlbV9pXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uYmFzZV9pZCA9PSB0aGlzLm1vZGVsLnVwZ3JhZGVfc3Rhcl9jb3N0X2lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc191cGdyYWRlc3Rhcl9yZWRwb2ludF9iYWdfdXBkYXRlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tVcGdyYWRlU3RhclJlZFBvaW50VXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrTGV2ZWxSZWRQb2ludFVwZGF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmJhc2VfaWQgPT0gdGhpcy5tb2RlbC50YWxlbnRfc2tpbGxfY29zdF9pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0VXBkYXRlVGFsZW50UmVkcG9pbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tUYWxlbnRSZWRQb2ludFVwZGF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoVXRpbHMuZ2V0SXRlbUNvbmZpZyhpdGVtLmJhc2VfaWQpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNldFVwZGF0ZVRhbGVudFJlZHBvaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrVGFsZW50UmVkUG9pbnRVcGRhdGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g54mp5ZOB6YGT5YW35pS55Y+YIOWIpOaWree6oueCuVxuICAgICAgICBpZiAoIXRoaXMubW9kaWZ5X2dvb2RzX2V2ZW50KSB7XG4gICAgICAgICAgICAgdGhpcy5tb2RpZnlfZ29vZHNfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEV2ZW50SWQuTU9ESUZZX0dPT0RTX05VTSwgZnVuY3Rpb24oYmFnX2NvZGUsdGVtcF9hZGQpIHtcbiAgICAgICAgICAgICAgICBpZiAoYmFnX2NvZGUgPT0gQmFja1BhY2tDb25zdC5CYWdfQ29kZS5FUVVJUFMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc19lcXVpcF9yZWRwb2ludF9iYWdfdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja0VxdWlwUmVkUG9pbnRVcGRhdGUoKTsgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaXRlbV9pIGluIHRlbXBfYWRkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHRlbXBfYWRkW2l0ZW1faV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmJhc2VfaWQgPT0gdGhpcy5tb2RlbC51cGdyYWRlX3N0YXJfY29zdF9pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfYmFnX3VwZGF0ZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrVXBncmFkZVN0YXJSZWRQb2ludFVwZGF0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja0xldmVsUmVkUG9pbnRVcGRhdGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5iYXNlX2lkID09IHRoaXMubW9kZWwudGFsZW50X3NraWxsX2Nvc3RfaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNldFVwZGF0ZVRhbGVudFJlZHBvaW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNoZWNrVGFsZW50UmVkUG9pbnRVcGRhdGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKFV0aWxzLmdldEl0ZW1Db25maWcoaXRlbS5iYXNlX2lkKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRVcGRhdGVUYWxlbnRSZWRwb2ludCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja1RhbGVudFJlZFBvaW50VXBkYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOa/gOa0u+elnuWZqCjlnKPlmagpIOWIpOaWree6oueCuVxuICAgICAgICBpZiAoIXRoaXMudXBkYXRlX2RyYW1hX2hhbGxvd3NfZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBIYWxsb3dzRXZlbnQgPSByZXF1aXJlKFwiaGFsbG93c19ldmVudFwiKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlX2RyYW1hX2hhbGxvd3NfZXZlbnQgPSBnY29yZS5HbG9iYWxFdmVudC5iaW5kKEhhbGxvd3NFdmVudC5IYWxsb3dzQWN0aXZpdHlFdmVudCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5jaGVja1VubG9ja0hhbGxvd3NSZWRQb2ludCgpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKVxuICAgICAgICAgfSAgICAgICAgXG4gICAgfSxcblxuICAgIC8vIOazqOWGjOWNj+iuruaOpeWPl+S6i+S7tlxuICAgIHJlZ2lzdGVyUHJvdG9jYWxzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTEwLCB0aGlzLm9uMTExMCk7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAwMCwgdGhpcy5oYW5kbGUxMTAwMC5iaW5kKHRoaXMpKTsgICAgIC8v6K+35rGC5omA5pyJ5LyZ5Ly0XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAwMSwgdGhpcy5oYW5kbGUxMTAwMS5iaW5kKHRoaXMpKTsgICAgIC8v5LyZ5Ly05aKe5YqgXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAwMiwgdGhpcy5oYW5kbGUxMTAwMi5iaW5kKHRoaXMpKTsgICAgIC8v5LyZ5Ly05bGe5oCn5Y+Y5pu06YCa55+lKOWNleS4quS8meS8tOWxnuaApylcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDA3LCB0aGlzLmhhbmRsZTExMDA3LmJpbmQodGhpcykpOyAgICAgLy/kvJnkvLTlsZ7mgKflj5jmm7TpgJrnn6UobGlzdOWIl+ihqOS8meS8tOWxnuaApylcblxuICAgICAgICAvL+WNh+e6p1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMDMsIHRoaXMuaGFuZGxlMTEwMDMuYmluZCh0aGlzKSk7ICAgICAvL+S8meS8tOWNh+e6p1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMDQsIHRoaXMuaGFuZGxlMTEwMDQuYmluZCh0aGlzKSk7ICAgICAvL+S8meS8tOi/m+mYtlxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMDUsIHRoaXMuaGFuZGxlMTEwMDUuYmluZCh0aGlzKSk7ICAgICAvL+S8meS8tOWNh+aYn1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMDYsIHRoaXMuaGFuZGxlMTEwMDYuYmluZCh0aGlzKSk7ICAgICAvL+WIoOmZpOS8meS8tOaOqOmAgVxuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAwOSwgdGhpcy5oYW5kbGUxMTAwOS5iaW5kKHRoaXMpKTsgICAgIC8v6LSt5Lmw6Iux6ZuE5pWw6YeP5LiK6ZmQXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAxNiwgdGhpcy5oYW5kbGUxMTAxNi5iaW5kKHRoaXMpKTsgICAgIC8v5LyZ5Ly05LiL5LiA6Zi25bGe5oCnXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAxNywgdGhpcy5oYW5kbGUxMTAxNy5iaW5kKHRoaXMpKTsgICAgIC8v5o6o6YCB5LyZ5Ly05pyA5paw5pWw6YePXG5cbiAgICAgICAgLy/oo4XlpIfnm7jlhbNcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDEwLCB0aGlzLmhhbmRsZTExMDEwLmJpbmQodGhpcykpOyAgICAgLy/nqb/miLToo4XlpIdcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDExLCB0aGlzLmhhbmRsZTExMDExLmJpbmQodGhpcykpOyAgICAgLy/ljbjkuIvoo4XlpIdcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDEyLCB0aGlzLmhhbmRsZTExMDEyLmJpbmQodGhpcykpOyAgICAgLy/mjqjpgIHoo4XlpIfmlLnlj5hcbiAgICAgICAgLy8gdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDEzLCB0aGlzLmhhbmRsZTExMDEzLmJpbmQodGhpcykpOyAgICAgLy/oo4XlpIfnsr7ngrxcbiAgICAgICAgLy8gdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDE0LCB0aGlzLmhhbmRsZTExMDE0LmJpbmQodGhpcykpOyAgICAgLy/kuIDplK7nsr7ngrxcblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMTUsIHRoaXMuaGFuZGxlMTEwMTUuYmluZCh0aGlzKSk7ICAgICAvL+iLsembhOmUgeWumlxuXG4gICAgICAgIC8v6K+35rGC6Zi15rOVXG4gICAgICAgIC8vIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTIwMCwgdGhpcy5oYW5kbGUxMTIwMC5iaW5kKHRoaXMpKTsgICAgIC8v6K+35rGC6Ieq6Lqr6Zi15rOVXG4gICAgICAgIC8vIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTIwMSwgdGhpcy5oYW5kbGUxMTIwMS5iaW5kKHRoaXMpKTsgICAgIC8v5pu05o2i6Ieq6Lqr6Zi15rOVXG4gICAgICAgIC8vIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTIwMiwgdGhpcy5oYW5kbGUxMTIwMi5iaW5kKHRoaXMpKTsgICAgIC8v5LyZ5Ly05LiK6Zi1L+S4i+mYtS/kuqTmjaJcbiAgICAgICAgLy8gdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMjAzLCB0aGlzLmhhbmRsZTExMjAzLmJpbmQodGhpcykpOyAgICAgLy/pmLXms5XmlbDmja7mlLnlj5jmjqjpgIFcbiAgICAgICAgLy8gdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMjA0LCB0aGlzLmhhbmRsZTExMjA0LmJpbmQodGhpcykpOyAgICAgLy/pmLXms5XljYfnuqcv5r+A5rS7XG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTIxMSwgdGhpcy5oYW5kbGUxMTIxMS5iaW5kKHRoaXMpKTsgICAgIC8v6K+35rGC6Zif5LyNXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTIxMiwgdGhpcy5oYW5kbGUxMTIxMi5iaW5kKHRoaXMpKTsgICAgIC8v6K+35rGC5L+d5a2Y6Zif5LyN5Y2P6K6uXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTIxMywgdGhpcy5oYW5kbGUxMTIxMy5iaW5kKHRoaXMpKTsgICAgIC8v6K+35rGC5aSa5Liq6Zif5LyNXG5cbiAgICAgICAgLy8gLy/nrKbmlofnm7jlhbNcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDMwLCB0aGlzLmhhbmRsZTExMDMwLmJpbmQodGhpcykpOyAgICAgLy/nrKbmlofnqb/miLRcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDMxLCB0aGlzLmhhbmRsZTExMDMxLmJpbmQodGhpcykpOyAgICAgLy/mjqjpgIHnrKbmlofmlLnlj5hcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDMyLCB0aGlzLmhhbmRsZTExMDMyLmJpbmQodGhpcykpOyAgICAgLy/nrKbmlofljYfmmJ9cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDMzLCB0aGlzLmhhbmRsZTExMDMzLmJpbmQodGhpcykpOyAgICAgLy/nrKbmlofph43nva5cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDM0LCB0aGlzLmhhbmRsZTExMDM0LmJpbmQodGhpcykpOyAgICAgLy/nrKbmlofph43pk7jkv53lrZhcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDM1LCB0aGlzLmhhbmRsZTExMDM1LmJpbmQodGhpcykpOyAgICAgLy/nrKbmlofnoo7niYflkIjmiJBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDM2LCB0aGlzLmhhbmRsZTExMDM2LmJpbmQodGhpcykpOyAgICAgLy/nrKbmloflkIjmiJBcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDM3LCB0aGlzLmhhbmRsZTExMDM3LmJpbmQodGhpcykpOyAgICAgLy/nrKbmlofnpZ3npo/lgLxcbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDM4LCB0aGlzLmhhbmRsZTExMDM4LmJpbmQodGhpcykpOyAgICAgLy/pooblj5bnrKbmlofnpZ3npo/lgLxcblxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwNDAsIHRoaXMuaGFuZGxlMTEwNDAuYmluZCh0aGlzKSk7ICAgICAvL+iLsembhOWbvumJtOS/oeaBr1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwNjAsIHRoaXMuaGFuZGxlMTEwNjAuYmluZCh0aGlzKSk7ICAgICAvL+iLsembhOWbvumJtOS/oeaBr1xuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTA3NSwgdGhpcy5oYW5kbGUxMTA3NS5iaW5kKHRoaXMpKTsgICAgIC8v6K+35rGC6Iux6ZuE6YGj5pWjIOWIhuino+adkOaWmVxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwNzYsIHRoaXMuaGFuZGxlMTEwNzYuYmluZCh0aGlzKSk7ICAgICAvL+iLsembhOmBo+aVoyDliIbop6MgICAgXG4gICAgICAgIFxuXG4gICAgICAgIC8vIC0t5aSp6LWL55u45YWzXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTA5NiwgdGhpcy5oYW5kbGUxMTA5Ni5iaW5kKHRoaXMpKSAgICAgLy/lrabkuaDlpKnotYvmioDog71cbiAgICAgICAgdGhpcy5SZWdpc3RlclByb3RvY2FsKDExMDk3LCB0aGlzLmhhbmRsZTExMDk3LmJpbmQodGhpcykpICAgICAvL+Wkqei1i+aKgOiDveWNh+e6p1xuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwOTgsIHRoaXMuaGFuZGxlMTEwOTguYmluZCh0aGlzKSkgICAgIC8v5aSp6LWL6YGX5b+YXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTA5OSwgdGhpcy5oYW5kbGUxMTA5OS5iaW5kKHRoaXMpKSAgICAgLy/ojrflj5boi7Hpm4TlpKnotYvkv6Hmga8gICAgICBcbiAgICAgICAgXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTA2MywgdGhpcy5oYW5kbGUxMTA2My5iaW5kKHRoaXMpKSAgICAgLy8tLeiLsembhOivpue7huS/oeaBr1xuXG4gICAgICAgIHRoaXMuUmVnaXN0ZXJQcm90b2NhbCgxMTAxOSwgdGhpcy5oYW5kbGUxMTAxOS5iaW5kKHRoaXMpKSAgICAgLy8tLeearuiCpFxuICAgICAgICB0aGlzLlJlZ2lzdGVyUHJvdG9jYWwoMTEwMjAsIHRoaXMuaGFuZGxlMTEwMjAuYmluZCh0aGlzKSkgICAgIC8vLS1cbiAgICB9LFxuICAgIHNlbmRlcjExMDYzKHBhcnRuZXJfaWQpe1xuICAgICAgICBsZXQgcHJvdG9jYWwgPXt9XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDYzLHByb3RvY2FsKVxuICAgIH0sXG4gICAgaGFuZGxlMTEwNjMoIGRhdGEgKXtcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIZXJvVm9EZXRhaWxlZEluZm8oZGF0YSlcbiAgICB9LFxuICAgIHNlbmRlcjExMDAwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDAwLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDAwOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/or7fmsYLmiYDmnInkvJnkvLRcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRIZXJvTWF4Q291bnQoZGF0YS5udW0pO1xuICAgICAgICB0aGlzLm1vZGVsLnNldEhlcm9CdXlOdW0oZGF0YS5idXlfbnVtKTtcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIZXJvTGlzdChkYXRhLnBhcnRuZXJzKTtcblxuICAgICAgICB2YXIgY2FsY3VsYXRlID0gSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBSZWRNZ3IuZ2V0SW5zdGFuY2UoKS5hZGRDYWxIYW5kbGVyKGNhbGN1bGF0ZS5jaGVja0FsbFN0YXJGdXNlUmVkcG9pbnQuYmluZChjYWxjdWxhdGUpLCBSZWRJZHMuUmVmdXNlSGVybyk7XG5cbiAgICAgICAgdGhpcy5zZW5kZXIxMTAyMCgpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAwMTogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v5LyZ5Ly05aKe5YqgXG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlSGVyb0xpc3QoZGF0YS5wYXJ0bmVycywgdHJ1ZSlcblxuICAgICAgICAvL+a2iOmZpOeGlOeCvOelreWdm+eahOe6oueCuSDph4zpnaLkvJrph43mlrDorqHnrpfnuqLngrlcbiAgICAgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsU3RhckZ1c2VSZWRwb2ludFJlY29yZCgpO1xuXG4gICAgICAgIHRoaXMubW9kZWwuaXNfdXBncmFkZXN0YXJfcmVkcG9pbnRfYmFnX3VwZGF0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMubW9kZWwuY2hlY2tVcGdyYWRlU3RhclJlZFBvaW50VXBkYXRlKCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDAyOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/ljZXkuKrkvJnkvLTlsZ7mgKflj5jmm7TpgJrnn6VcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIZXJvVm8oZGF0YSk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDA3OiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy9saXN05LyZ5Ly05bGe5oCn5Y+Y5pu06YCa55+lKFxuICAgICAgICB2YXIgUm9sZUNvbnRyb2xsZXIgPSByZXF1aXJlKFwicm9sZV9jb250cm9sbGVyXCIpXG4gICAgICAgIFJvbGVDb250cm9sbGVyLmdldEluc3RhbmNlKCkuZ2V0Um9sZVZvKCkuc2hvd1Bvd2VyKHRydWUpXG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlSGVyb0xpc3QoZGF0YS5yZWZfcGFydG5lcnMsIG51bGwsIHRydWUpO1xuICAgIH0sXG5cbiAgICBzZW5kZXIxMTAwMzogZnVuY3Rpb24gKHBhcnRuZXJfaWQpIHsgICAgICAgICAvLyDkvJnkvLTljYfnuqdcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAwMywgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAwMzogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v5LyZ5Ly05Y2H57qnXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ID09PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5nZXRJbnN0YW5jZSgpLmZpcmUoSGVyb0V2ZW50Lkhlcm9fTGV2ZWxfVXBfU3VjY2Vzc19FdmVudCwgZGF0YSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kZXIxMTAwNDogZnVuY3Rpb24gKHBhcnRuZXJfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAwNCwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAwNDogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v5LyZ5Ly06L+b6Zi257uT5p6cXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ID09IDEpIHtcbiAgICAgICAgICAgIC8vIOaYvuekuui/m+mYtueql+WPo1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjExMDA1OiBmdW5jdGlvbiAocGFydG5lcl9pZCwgaGVyb19saXN0LCByYW5kb21fbGlzdCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZDtcbiAgICAgICAgcHJvdG9jYWwuZXhwZW5kMSA9IGhlcm9fbGlzdDtcbiAgICAgICAgcHJvdG9jYWwuZXhwZW5kMiA9IHJhbmRvbV9saXN0O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAwNSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAwNTogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v5LyZ5Ly05Y2H5pifXG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ID09PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5VcGdyYWRlX1N0YXJfU3VjY2Vzc19FdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldFVwZ3JhZGVTdGFyVXBkYXRlUmVjb3JkKHRydWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDA2OiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/liKDpmaTkvJnkvLTmjqjpgIFcbiAgICAgICAgdGhpcy5tb2RlbC5kZWxIZXJvRGF0YUxpc3QoZGF0YS5leHBlbmQyKTtcbiAgICB9LFxuXG4gICAgc2VuZGVyMTEwMDk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwMDksIHt9KTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwMDk6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+i0reS5sOiLsembhOaVsOmHj+S4iumZkCAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLnJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRIZXJvTWF4Q291bnQoZGF0YS5udW0pO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRIZXJvQnV5TnVtKGRhdGEuYnV5X251bSk7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5CdXlfSGVyb19NYXhfQ291bnRfRXZlbnQpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjExMDE2OiBmdW5jdGlvbiAocGFydG5lcl9pZCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwucGFydG5lcl9pZCA9IHBhcnRuZXJfaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDE2LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDE2OiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/kvJnkvLTkuIvkuIDpmLblsZ7mgKdcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuTmV4dF9CcmVha19JbmZvX0V2ZW50LCBkYXRhKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwMTc6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+aOqOmAgeS8meS8tOacgOaWsOaVsOmHj1xuICAgIH0sXG5cbiAgICAvLyAwIOihqOekuuS4gOmUruepv+aItFxuICAgIHNlbmRlcjExMDEwOiBmdW5jdGlvbiAocGFydG5lcl9pZCwgaXRlbV9pZCkgeyAgICAgLy/nqb/miLToo4XlpIdcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRFcXVpcFVwZGF0ZVJlY29yZChmYWxzZSk7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkXG4gICAgICAgIHByb3RvY2FsLml0ZW1faWQgPSBpdGVtX2lkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDEwLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDEwOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKCFkYXRhLnJlc3VsdClcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0RXF1aXBVcGRhdGVSZWNvcmQodHJ1ZSk7XG4gICAgfSxcblxuICAgIHNlbmRlcjExMDExOiBmdW5jdGlvbiAocGFydG5lcl9pZCwgcG9zX2lkKSB7XG4gICAgICAgIHRoaXMubW9kZWwuc2V0RXF1aXBVcGRhdGVSZWNvcmQoZmFsc2UpOyAgICAgICAgXG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkXG4gICAgICAgIC8v5q2k5YC85pS55oiQ6KOF5aSH5ZSv5LiAaWQgXG4gICAgICAgIHByb3RvY2FsLnBvc19pZCA9IHBvc19pZFxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAxMSwgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAxMTogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v5Y245LiL6KOF5aSHXG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIGlmICghZGF0YS5yZXN1bHQpXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnNldEVxdWlwVXBkYXRlUmVjb3JkKHRydWUpOyAgICAgICAgXG4gICAgfSxcblxuICAgIGhhbmRsZTExMDEyOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/mjqjpgIHoo4XlpIfmlLnlj5hcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVwZGF0ZUhlcm9FcXVpcExpc3QoZGF0YSk7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5tb2RlbC5nZXRIZXJvQnlJZChkYXRhLnBhcnRuZXJfaWQpXG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5FcXVpcF9VcGRhdGVfRXZlbnQsZGF0YSk7XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmlzX2VxdWlwX3JlZHBvaW50X2hlcm9fdXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuY2hlY2tFcXVpcFJlZFBvaW50VXBkYXRlKClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kZXIxMTAxNTogZnVuY3Rpb24gKHBhcnRuZXJfaWQsIGlzX2xvY2spIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwucGFydG5lcl9pZCA9IHBhcnRuZXJfaWQ7XG4gICAgICAgIHByb3RvY2FsLnR5cGUgPSBpc19sb2NrO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAxNSwgcHJvdG9jYWwpXG4gICAgfSxcblxuICAgIGhhbmRsZTExMDE1OiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/oi7Hpm4TplIHlrppcbiAgICAgICAgaWYgKGRhdGEucmVzdWx0ID09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0TG9ja0J5UGFydG5lcmlkKGRhdGEucGFydG5lcl9pZCwgZGF0YS50eXBlKVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19Mb2NrX0V2ZW50KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjExMjExOiBmdW5jdGlvbiAodHlwZSkgeyAgICAgLy8g6K+35rGC5Y2V5Liq5biD6Zi15L+h5oGvIFxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC50eXBlID0gdHlwZVxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTIxMSwgcHJvdG9jYWwpXG4gICAgfSxcblxuICAgIGhhbmRsZTExMjExOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy8g6K+35rGC5Y2V5Liq5biD6Zi15L+h5oGv57uT5p6cXG4gICAgICAgIGlmICghZGF0YSB8fCB0eXBlb2YgZGF0YS50eXBlICE9IFwibnVtYmVyXCIpIHJldHVyblxuICAgICAgICBpZiAoZGF0YSAmJiAoZGF0YS50eXBlID09PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uRHJhbWEgfHwgZGF0YS50eXBlID09PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uQXJlbmEpKVxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRGb3JtTGlzdChkYXRhKTtcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuVXBkYXRlX0Z1bl9Gb3JtLCBkYXRhKTtcbiAgICB9LFxuXG4gICAgc2VuZGVyMTEyMTI6IGZ1bmN0aW9uICh0eXBlLCBmb3JtYXRpb25fdHlwZSwgcG9zX2luZm8sIGhhbGxvd3NfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwudHlwZSA9IHR5cGVcbiAgICAgICAgcHJvdG9jYWwuZm9ybWF0aW9uX3R5cGUgPSBmb3JtYXRpb25fdHlwZVxuICAgICAgICBwcm90b2NhbC5wb3NfaW5mbyA9IHBvc19pbmZvXG4gICAgICAgIHByb3RvY2FsLmhhbGxvd3NfaWQgPSBoYWxsb3dzX2lkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMjEyLCBwcm90b2NhbClcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEyMTI6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+ivt+axguS/neWtmOmYn+S8jeWNj+iurlxuICAgICAgICBpZiAoZGF0YS5jb2RlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uRHJhbWEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdHlwZV9saXN0ID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGRybWFfaW5mbyA9IHt9O1xuICAgICAgICAgICAgICAgIGRybWFfaW5mb1tcInR5cGVcIl0gPSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uRHJhbWE7XG4gICAgICAgICAgICAgICAgdHlwZV9saXN0LnB1c2goZHJtYV9pbmZvKTtcbiAgICAgICAgICAgICAgICB2YXIgYXJlbmFfaW5mbyA9IHt9O1xuICAgICAgICAgICAgICAgIGFyZW5hX2luZm9bXCJ0eXBlXCJdID0gUGFydG5lckNvbnN0LkZ1bl9Gb3JtLkFyZW5hO1xuICAgICAgICAgICAgICAgIHR5cGVfbGlzdC5wdXNoKGFyZW5hX2luZm8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VuZGVyMTEyMTModHlwZV9saXN0KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uQXJlbmEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRlcjExMjExKGRhdGEudHlwZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYoZGF0YS50eXBlID09PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uTGltaXRFeGVyY2lzZSl7XG4gICAgICAgICAgICAgICAgdmFyIExpbWl0RXhlcmNpc2VDb250cm9sbGVyID0gcmVxdWlyZShcImxpbWl0ZXhlcmNpc2VfY29udHJvbGxlclwiKVxuICAgICAgICAgICAgICAgIExpbWl0RXhlcmNpc2VDb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2hlY2tKb2luRmlnaHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuVXBkYXRlX1NhdmVfRm9ybSwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXNzYWdlKFV0aWxzLlRJMThOKGRhdGEubXNnKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kZXIxMTIxMzogZnVuY3Rpb24gKHR5cGVfbGlzdCkgeyAgICAvLyDor7fmsYLlpJrkuKrluIPpmLVcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwudHlwZV9saXN0ID0gdHlwZV9saXN0O1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTIxMywgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTIxMzogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v6K+35rGC5aSa5Liq5biD6Zi157uT5p6cXG4gICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5pbmZvKSByZXR1cm47ICAgICAgICBcbiAgICAgICAgZm9yICh2YXIgZm9ybV9pIGluIGRhdGEuaW5mbykge1xuICAgICAgICAgICAgdmFyIGZvcm1fZGF0YSA9IGRhdGEuaW5mb1tmb3JtX2ldO1xuICAgICAgICAgICAgaWYgKGZvcm1fZGF0YSAmJiAoZm9ybV9kYXRhLnR5cGUgPT09IFBhcnRuZXJDb25zdC5GdW5fRm9ybS5EcmFtYSB8fFxuICAgICAgICAgICAgICAgIGZvcm1fZGF0YS50eXBlID09PSBQYXJ0bmVyQ29uc3QuRnVuX0Zvcm0uQXJlbmEpKVxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0Rm9ybUxpc3QoZm9ybV9kYXRhKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+espuaWhy0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvL+espuaWh+epv+aItC/ljbjkuItcbiAgICBzZW5kZXIxMTAzMDogZnVuY3Rpb24gKHBhcnRuZXJfaWQsIHBvc19pZCwgYXJ0aWZhY3RfaWQsIHR5cGUpIHtcbiAgICAgICAgdGhpcy5tb2RlbC5zZXRFcXVpcFVwZGF0ZVJlY29yZChmYWxzZSlcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge31cbiAgICAgICAgcHJvdG9jYWwucGFydG5lcl9pZCA9IHBhcnRuZXJfaWRcbiAgICAgICAgcHJvdG9jYWwucG9zX2lkID0gcG9zX2lkXG4gICAgICAgIHByb3RvY2FsLmFydGlmYWN0X2lkID0gYXJ0aWZhY3RfaWRcbiAgICAgICAgcHJvdG9jYWwudHlwZSA9IHR5cGVcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwMzAsIHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAzMDogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v56ym5paH56m/5oi0XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZiAoZGF0YS5yZXN1bHQgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRFcXVpcFVwZGF0ZVJlY29yZCh0cnVlKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5o6o6YCB56ym5paH5pS55Y+YXG4gICAgaGFuZGxlMTEwMzE6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICAgIHRoaXMubW9kZWwudXBkYXRlUGFydG5lckFydGlmYWN0TGlzdChkYXRhKVxuICAgIH0sXG5cbiAgICAvL+espuaWh+WNh+aYn1xuICAgIHNlbmRlcjExMDMyOiBmdW5jdGlvbiAocGFydG5lcl9pZCwgYXJ0aWZhY3RfaWQsIGV4cGVuZHMpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkO1xuICAgICAgICBwcm90b2NhbC5hcnRpZmFjdF9pZCA9IGFydGlmYWN0X2lkO1xuICAgICAgICBwcm90b2NhbC5leHBlbmRzID0gZXhwZW5kcztcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwMzIsIHByb3RvY2FsKVxuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAzMjogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v56ym5paH5Y2H5pifXG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpO1xuICAgICAgICBpZiAoZGF0YS5yZXN1bHQgPT0gMSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuQXJ0aWZhY3RfVXBTdGFyX0V2ZW50LCBkYXRhKVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v56ym5paH6YeN572uXG4gICAgc2VuZGVyMTEwMzM6IGZ1bmN0aW9uIChwYXJ0bmVyX2lkLCBhcnRpZmFjdF9pZCwgc2tpbGxzKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZDtcbiAgICAgICAgcHJvdG9jYWwuYXJ0aWZhY3RfaWQgPSBhcnRpZmFjdF9pZDtcbiAgICAgICAgcHJvdG9jYWwuc2tpbGxzID0gc2tpbGxzO1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAzMywgcHJvdG9jYWwpXG4gICAgfSxcblxuICAgIGhhbmRsZTExMDMzOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/nrKbmlofph43nva5cbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgICAgIGlmIChkYXRhLnJlc3VsdCA9PSAxKSB7XG4gICAgICAgICAgICBnY29yZS5HbG9iYWxFdmVudC5maXJlKEhlcm9FdmVudC5BcnRpZmFjdF9SZWNhc3RfRXZlbnQpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nrKbmlofph43pk7jkv53lrZhcbiAgICBzZW5kZXIxMTAzNDogZnVuY3Rpb24gKHBhcnRuZXJfaWQsIGFydGlmYWN0X2lkLCB0eXBlKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZDtcbiAgICAgICAgcHJvdG9jYWwuYXJ0aWZhY3RfaWQgPSBhcnRpZmFjdF9pZDtcbiAgICAgICAgcHJvdG9jYWwudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDM0LCBwcm90b2NhbCk7XG4gICAgfSxcblxuXG4gICAgaGFuZGxlMTEwMzQ6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+espuaWh+mHjemTuOS/neWtmFxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgICAgICBpZiAoZGF0YS5yZXN1bHQgPT0gMSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuQXJ0aWZhY3RfU2F2ZV9FdmVudClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+espuaWh+WIhuino1xuICAgIHNlbmRlcjExMDM1OiBmdW5jdGlvbiAoYXJ0aWZhY3RfaWQpIHtcbiAgICAgICAgdmFyIHByb3RvY2FsID0ge307XG4gICAgICAgIHByb3RvY2FsLmFydGlmYWN0X2lkID0gYXJ0aWZhY3RfaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDM1LCBwcm90b2NhbClcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwMzU6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+espuaWh+eijueJh+WQiOaIkFxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKVxuICAgIH0sXG5cbiAgICAvL+espuaWh+WQiOaIkFxuICAgIHNlbmRlcjExMDM2OiBmdW5jdGlvbiAoaXRlbV9pZCwgZXhwZW5kKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5pdGVtX2lkID0gaXRlbV9pZDtcbiAgICAgICAgcHJvdG9jYWwuZXhwZW5kcyA9IGV4cGVuZDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwMzYsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwMzY6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+espuaWh+WQiOaIkFxuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgaWYgKGRhdGEucmVzdWx0ID09IDEpIHtcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGVyb0V2ZW50LkFydGlmYWN0X0NvbXBvdW5kX0V2ZW50LCBkYXRhLmZsYWcpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nrKbmlofnpZ3npo/lgLxcbiAgICBzZW5kZXIxMTAzNzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fVxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAzNywgcHJvdG9jYWwpO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAzNzogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v56ym5paH56Wd56aP5YC8XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubHVja3kgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXRBcnRpZmFjdEx1Y2t5KGRhdGEubHVja3kpO1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuQXJ0aWZhY3RfTHVja3lfRXZlbnQpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/pooblj5bnrKbmlofnpZ3npo/lgLxcbiAgICBzZW5kZXIxMTAzODogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTAzOCwge30pO1xuICAgIH0sXG5cbiAgICBoYW5kbGUxMTAzODogZnVuY3Rpb24gKGRhdGEpIHsgICAgIC8v6aKG5Y+W56ym5paH56Wd56aP5YC8XG4gICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgfSxcblxuICAgIHNlbmRlcjExMDQwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDQwLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDQwOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/oi7Hpm4Tlm77pibTkv6Hmga9cbiAgICAgICAgdGhpcy5tb2RlbC5zZXRIYWRIZXJvSW5mbyhkYXRhLnBhcnRuZXJzKTtcbiAgICB9LFxuXG4gICAgc2VuZGVyMTEwNjA6IGZ1bmN0aW9uIChjaGFubmVsLCBwYXJ0bmVyX2lkKSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5jaGFubmVsID0gY2hhbm5lbDtcbiAgICAgICAgcHJvdG9jYWwucGFydG5lcl9pZCA9IHBhcnRuZXJfaWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDYwLCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDYwOiBmdW5jdGlvbiAoZGF0YSkgeyAgICAgLy/oi7Hpm4Tlm77pibTkv6Hmga9cbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZyk7XG4gICAgfSxcblxuICAgIHNlbmRlcjExMDc1OiBmdW5jdGlvbiAoaGVyb19saXN0KSB7ICAgICAvL+ivt+axguiLsembhOWIhuino+adkOaWmVxuICAgICAgICB2YXIgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgcHJvdG9jYWwubGlzdCA9IGhlcm9fbGlzdDtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwNzUsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwNzU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmNvZGUgPT0gMSkge1xuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19SZXNldF9Mb29rX0V2ZW50LCBkYXRhLmxpc3QpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlbmRlcjExMDc2OiBmdW5jdGlvbiAocGFydG5lcl9saXN0KSB7XG4gICAgICAgIHZhciBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLmxpc3QgPSBwYXJ0bmVyX2xpc3RcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwNzYsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwNzY6IGZ1bmN0aW9uIChkYXRhKSB7ICAgICAvL+iLsembhOmBo+aVoyBcbiAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgaWYgKGRhdGEuY29kZSkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5kZWxIZXJvRGF0YUxpc3QoZGF0YS5saXN0KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8t5aSp6LWL55u45YWz5byA5aeLXG4gICAgc2VuZGVyMTEwOTYocGFydG5lcl9pZCwgcG9zLCBza2lsbF9pZCl7XG4gICAgICAgIGxldCBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkXG4gICAgICAgIHByb3RvY2FsLnBvcyA9IHBvc1xuICAgICAgICBwcm90b2NhbC5za2lsbF9pZCA9IHNraWxsX2lkXG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDk2LCBwcm90b2NhbClcbiAgICB9LFxuICAgIGhhbmRsZTExMDk2KGRhdGEpe1xuICAgICAgICBpZihkYXRhLnJlc3VsdCA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRoaXMubW9kZWwudXBkYXRlSGVyb1ZvVGFsZW50KFtkYXRhXSwgdHJ1ZSlcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLm1vZGVsLmdldEhlcm9CeUlkKGRhdGEucGFydG5lcl9pZClcbiAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LmZpcmUoSGVyb0V2ZW50Lkhlcm9fTGVhcm5fVGFsZW50X0V2ZW50LCBkYXRhKVxuICAgICAgICAgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50KVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIOiLsembhCjkvJnkvLQp6IOM5YyF55WM6Z2iXG4gICAgLy8gQCBoZXJvX3ZvIOiLsembhOWvueW6lOaVsOaNruWvueixoVxuICAgIG9wZW5IZXJvQmFnV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLCBoZXJvX3ZvKSB7XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX2JhZ193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fYmFnX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2JhZ193aW5kb3cgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGVyb19iYWdfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9CYWdXSW5kb3cgPSByZXF1aXJlKFwiaGVyb19iYWdfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19iYWdfd2luZG93ID0gbmV3IEhlcm9CYWdXSW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhlcm9fYmFnX3dpbmRvdy5vcGVuKGhlcm9fdm8pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8v5omT5byA6Iux6ZuE5Zu+5Lmm6aaG5L+h5oGvXG4gICAgb3Blbkhlcm9MaWJyYXJ5TWFpbldpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgYmlkKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlcm9fbGlicmFyeV9tYWluV2luZG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbGlicmFyeV9tYWluV2luZG93LmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbGlicmFyeV9tYWluV2luZG93ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19saWJyYXJ5X21haW5XaW5kb3cgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvTGlicmFyeU1haW5XaW5kb3cgPSByZXF1aXJlKFwiaGVyb19saWJyYXJ5X21haW5fd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2xpYnJhcnlfbWFpbldpbmRvdyA9IG5ldyBIZXJvTGlicmFyeU1haW5XaW5kb3coKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oZXJvX2xpYnJhcnlfbWFpbldpbmRvdy5vcGVuKGJpZClcbiAgICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8v5omT5byA6Iux6ZuE5Zu+5Lmm6aaG5L+h5oGvXG4gICAgb3Blbkhlcm9MaWJyYXJ5SW5mb1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgYmlkKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlcm9fbGlicmFyeV9pbmZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbGlicmFyeV9pbmZvLmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbGlicmFyeV9pbmZvID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19saWJyYXJ5X2luZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvTGlicmFyeUluZm9XaW5kb3cgPSByZXF1aXJlKFwiaGVyb19saWJyYXJ5X2luZm9fd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2xpYnJhcnlfaW5mbyA9IG5ldyBIZXJvTGlicmFyeUluZm9XaW5kb3coKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oZXJvX2xpYnJhcnlfaW5mby5vcGVuKGJpZClcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvL+aJk+W8gOiLsembhOWbvuS5pummhuS8oOiusOS/oeaBr1xuICAgIG9wZW5IZXJvTGlicmFyeVN0b3J5UGFuZWw6IGZ1bmN0aW9uIChzdGF0dXMsIG5hbWUsIGNvbnRlbnQpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19saWJyYXJ5X3N0b3J5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbGlicmFyeV9zdG9yeS5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2xpYnJhcnlfc3RvcnkgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX2xpYnJhcnlfc3RvcnkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvTGlicmFyeUluZm9XaW5kb3cgPSByZXF1aXJlKFwiaGVyb19saWJyYXJ5X3N0b3J5X3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19saWJyYXJ5X3N0b3J5ID0gbmV3IEhlcm9MaWJyYXJ5SW5mb1dpbmRvdygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhlcm9fbGlicmFyeV9zdG9yeS5vcGVuKHsgbmFtZTogbmFtZSwgY29udGVudDogY29udGVudCB9KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIC0tIOiLsembhCjkvJnkvLQp5Li75L+h5oGvIOeVjOmdolxuICAgIC8vIC0tQCBoZXJvX3ZvIOiLsembhOWvueW6lOaVsOaNruWvueixoVxuICAgIC8vIC0tQCBoZXJvX2xpc3Qg6Iux6ZuE5a+56LGh5YiX6KGoIFxuICAgIC8vIC0tQCBzZXR0aW5nIOe7k+aehFxuICAgIC8vIC0tc2V0dGluZy5zaG93VHlwZSDmmL7npLroi7Hpm4TmlrDnmoTpobXnrb7nsbvlnotcbiAgICAvLyAtLXNldHRpbmcuc2hvd19tb2RlbF90eXBlIOaYvuekuuaooeW8jyAxOuiLsembhOaooeW8jyAgMjrlm77pibTmqKHlvI8g5a6a5LmJ5Y+C6ICDIEhlcm9Db25zdC5CYWdUYWIuZUJhZ0hlcm9cbiAgICBvcGVuSGVyb01haW5JbmZvV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLCBoZXJvX3ZvLCBoZXJvX2xpc3QsIHNldHRpbmcpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhlcm9fbWFpbl9pbmZvX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvTWFpbkluZm9XaW5kb3cgPSByZXF1aXJlKFwiaGVyb19tYWluX2luZm9fd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19tYWluX2luZm9fd2luZG93ID0gbmV3IEhlcm9NYWluSW5mb1dpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcGVuX3ByYWdtYSA9IHt9XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5oZXJvX3ZvID0gaGVyb192bztcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmhlcm9fbGlzdCA9IGhlcm9fbGlzdDtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLnNldHRpbmcgPSBzZXR0aW5nO1xuICAgICAgICAgICAgdGhpcy5oZXJvX21haW5faW5mb193aW5kb3cub3BlbihvcGVuX3ByYWdtYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX21haW5faW5mb193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbWFpbl9pbmZvX3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19tYWluX2luZm9fd2luZG93ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOeri+e7mOeVjOmdolxuICAgIG9wZW5IZXJvTG9va0RyYXdXaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIGRyYXdfcmVzX2lkLCBuYW1lLCBiaWQsIHNoYXJlX3R5cGUpIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhlcm9fbG9va19kcmF3X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19sb29rX2RyYXdfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJoZXJvX2xvb2tfZHJhd193aW5kb3dcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICAgICAgICAgIGRyYXdfcmVzX2lkOiBkcmF3X3Jlc19pZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIGJpZDogYmlkLFxuICAgICAgICAgICAgICAgIHNoYXJlX3R5cGU6IHNoYXJlX3R5cGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhlcm9fbG9va19kcmF3X3dpbmRvdy5vcGVuKGRhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX2xvb2tfZHJhd193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fbG9va19kcmF3X3dpbmRvdy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19sb29rX2RyYXdfd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLeaJk+W8gOi/m+mYtueVjOmdolxuICAgIG9wZW5IZXJvQnJlYWtQYW5lbDogZnVuY3Rpb24gKHN0YXR1cywgaGVyb192bykge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGVyb19icmVha19wYW5lbCkge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvQnJlYWtQYW5lbCA9IHJlcXVpcmUoXCJoZXJvX2JyZWFrX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fYnJlYWtfcGFuZWwgPSBuZXcgSGVyb0JyZWFrUGFuZWwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhlcm9fYnJlYWtfcGFuZWwub3BlbihoZXJvX3ZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlcm9fYnJlYWtfcGFuZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fYnJlYWtfcGFuZWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fYnJlYWtfcGFuZWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOi/m+mYtuaIkOWKn+eVjOmdoiBvbGRfdm8gbmV3X3ZvIOmDveaYr2hlcm9Wb+WvueixoVxuICAgIG9wZW5CcmVha0V4aGliaXRpb25XaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIG9sZF92bywgbmV3X3ZvKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5icmVha19leGhpYml0aW9uX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvQnJlYWtFeGhpYml0aW9uV2luZG93ID0gcmVxdWlyZShcImhlcm9fYnJlYWtfZXhoaWJpdGlvbl93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5icmVha19leGhpYml0aW9uX3dpbmRvdyA9IG5ldyBIZXJvQnJlYWtFeGhpYml0aW9uV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuYnJlYWtfZXhoaWJpdGlvbl93aW5kb3cgJiYgIXRoaXMuYnJlYWtfZXhoaWJpdGlvbl93aW5kb3cuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgICAgICB2YXIgb3Blbl9wcmFnbWEgPSB7fTtcbiAgICAgICAgICAgICAgICBvcGVuX3ByYWdtYS5vbGRfdm8gPSBvbGRfdm87XG4gICAgICAgICAgICAgICAgb3Blbl9wcmFnbWEubmV3X3ZvID0gbmV3X3ZvO1xuICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtfZXhoaWJpdGlvbl93aW5kb3cub3BlbihvcGVuX3ByYWdtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5icmVha19leGhpYml0aW9uX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJlYWtfZXhoaWJpdGlvbl93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJyZWFrX2V4aGliaXRpb25fd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKG9sZF92byAmJiB0eXBlb2YgKG9sZF92bykgPT1cIm51bWJlclwiKXtcbiAgICAgICAgICAgICAgICBsZXQgc2tpbGxfYmlkID0gb2xkX3ZvXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuU2tpbGxVbmxvY2tXaW5kb3codHJ1ZSxza2lsbF9iaWQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvLyDmiZPlvIDljYfmmJ/miJDlip/nlYzpnaIgb2xkX3ZvIG5ld192byDpg73mmK9oZXJvVm/lr7nosaFcbiAgICBvcGVuSGVyb1VwZ3JhZGVTdGFyRXhoaWJpdGlvblBhbmVsOiBmdW5jdGlvbiAoc3RhdHVzLCBvbGRfdm8sIG5ld192bykge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXBncmFkZV9zdGFyX2V4aGliaXRpb25fd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9VcGdyYWRlU3RhckV4aGliaXRpb25QYW5lbCA9IHJlcXVpcmUoXCJoZXJvX3VwZ3JhZGVfc3Rhcl9leGhpYml0aW9uX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGVfc3Rhcl9leGhpYml0aW9uX3dpbmRvdyA9IG5ldyBIZXJvVXBncmFkZVN0YXJFeGhpYml0aW9uUGFuZWwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy51cGdyYWRlX3N0YXJfZXhoaWJpdGlvbl93aW5kb3cgJiYgIXRoaXMudXBncmFkZV9zdGFyX2V4aGliaXRpb25fd2luZG93LmlzT3BlbigpKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9wZW5fcHJhZ21hID0ge307XG4gICAgICAgICAgICAgICAgb3Blbl9wcmFnbWEub2xkX3ZvID0gb2xkX3ZvO1xuICAgICAgICAgICAgICAgIG9wZW5fcHJhZ21hLm5ld192byA9IG5ld192bztcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGVfc3Rhcl9leGhpYml0aW9uX3dpbmRvdy5vcGVuKG9wZW5fcHJhZ21hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVwZ3JhZGVfc3Rhcl9leGhpYml0aW9uX3dpbmRvdykge1xuICAgICAgICAgICAgdGhpcy51cGdyYWRlX3N0YXJfZXhoaWJpdGlvbl93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMudXBncmFkZV9zdGFyX2V4aGliaXRpb25fd2luZG93ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLeaJk+W8gOWkqei1i+aKgOiDveWtpuS5oOmdouadv1xuICAgIC8vIGZ1bmN0aW9uIEhlcm9Db250cm9sbGVyOm9wZW5Ta2lsbFVubG9ja1dpbmRvdyhzdGF0dXMsIHNraWxsX2JpZClcblxuICAgIC8vICAgICBpZiBzdGF0dXMgPT0gdHJ1ZSB0aGVuXG4gICAgLy8gICAgICAgICBpZiBub3QgdGhpcy51bmxvY2tfd2luZG93IHRoZW4gXG4gICAgLy8gICAgICAgICAgICAgdGhpcy51bmxvY2tfd2luZG93ID0gU2tpbGxVbmxvY2tXaW5kb3cuTmV3KHNraWxsX2JpZClcbiAgICAvLyAgICAgICAgIGVuZFxuICAgIC8vICAgICAgICAgaWYgdGhpcy51bmxvY2tfd2luZG93IGFuZCB0aGlzLnVubG9ja193aW5kb3c6aXNPcGVuKCkgPT0gZmFsc2UgdGhlblxuICAgIC8vICAgICAgICAgICAgIHRoaXMudW5sb2NrX3dpbmRvdzpvcGVuKClcbiAgICAvLyAgICAgICAgIGVuZFxuICAgIC8vICAgICBlbHNlIFxuICAgIC8vICAgICAgICAgaWYgdGhpcy51bmxvY2tfd2luZG93IHRoZW4gXG4gICAgLy8gICAgICAgICAgICAgdGhpcy51bmxvY2tfd2luZG93OmNsb3NlKClcbiAgICAvLyAgICAgICAgICAgICB0aGlzLnVubG9ja193aW5kb3cgPSBudWxsXG4gICAgLy8gICAgICAgICBlbmRcbiAgICAvLyAgICAgZW5kXG4gICAgLy8gZW5kXG5cblxuXG4gICAgLy8gLS3miZPlvIDoi7Hpm4Tov4fmu6RcbiAgICAvLyBmdW5jdGlvbiBIZXJvQ29udHJvbGxlcjpvcGVuRm9ybUZpbHRlckhlcm9QYW5lbChzdGF0dXMsIGRpY19maWx0ZXJfY2FtcF90eXBlLCBkaWNfZmlsdGVyX2NhcmVlcl90eXBlKVxuICAgIC8vICAgICBpZiBzdGF0dXMgPT0gdHJ1ZSB0aGVuXG4gICAgLy8gICAgICAgICBpZiBub3QgdGhpcy5mb3JtX2ZpbHRlcl9oZXJvX3BhbmVsIHRoZW4gXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mb3JtX2ZpbHRlcl9oZXJvX3BhbmVsID0gRm9ybUZpbHRlckhlcm9QYW5lbC5OZXcoKVxuICAgIC8vICAgICAgICAgZW5kXG4gICAgLy8gICAgICAgICBpZiB0aGlzLmZvcm1fZmlsdGVyX2hlcm9fcGFuZWwgYW5kIHRoaXMuZm9ybV9maWx0ZXJfaGVyb19wYW5lbDppc09wZW4oKSA9PSBmYWxzZSB0aGVuXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mb3JtX2ZpbHRlcl9oZXJvX3BhbmVsOm9wZW4oZGljX2ZpbHRlcl9jYW1wX3R5cGUsIGRpY19maWx0ZXJfY2FyZWVyX3R5cGUpXG4gICAgLy8gICAgICAgICBlbmRcbiAgICAvLyAgICAgZWxzZSBcbiAgICAvLyAgICAgICAgIGlmIHRoaXMuZm9ybV9maWx0ZXJfaGVyb19wYW5lbCB0aGVuIFxuICAgIC8vICAgICAgICAgICAgIHRoaXMuZm9ybV9maWx0ZXJfaGVyb19wYW5lbDpjbG9zZSgpXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5mb3JtX2ZpbHRlcl9oZXJvX3BhbmVsID0gbnVsbFxuICAgIC8vICAgICAgICAgZW5kXG4gICAgLy8gICAgIGVuZFxuICAgIC8vIGVuZFxuXG4gICAgLy8gLS3miZPlvIDluIPpmLXlh7rmiJjnlYzpnaJcbiAgICAvLyAtLUBmdW5fZm9ybV90eXBlIOW4g+mYtemYn+S8jeexu+Wei1xuICAgIC8vIC0tQHNob3dfdHlwZSDlh7rmiJjnlYzpnaLmmL7npLrnsbvlnosgMSDlh7rmiJggMiDkv53lrZjluIPpmLVcbiAgICBvcGVuRm9ybUdvRmlnaHRQYW5lbDogZnVuY3Rpb24gKHN0YXR1cywgZnVuX2Zvcm1fdHlwZSwgc2V0dGluZywgc2hvd190eXBlKSB7XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIEZvcm1Hb0ZpZ2h0UGFuZWwgPSByZXF1aXJlKFwiZm9ybV9nb19maWdodF93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsID0gbmV3IEZvcm1Hb0ZpZ2h0UGFuZWwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb3Blbl9wcmFnbWEgPSB7fVxuICAgICAgICAgICAgb3Blbl9wcmFnbWEuZnVuX2Zvcm1fdHlwZSA9IGZ1bl9mb3JtX3R5cGU7XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5zZXR0aW5nID0gc2V0dGluZztcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLnNob3dfdHlwZSA9IHNob3dfdHlwZTtcbiAgICAgICAgICAgIHRoaXMuZm9ybV9nb19maWdodF9wYW5lbC5vcGVuKG9wZW5fcHJhZ21hKTtcbiAgICAgICAgICAgIC8vIHRoaXMuZm9ybV9nb19maWdodF9wYW5lbC4oZnVuX2Zvcm1fdHlwZSwgc2V0dGluZywgc2hvd190eXBlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDluIPpmLUg5pS55oiQ5ZKMIOW4g+mYteWHuuaImOeVjOmdoiDlkIjkuozkuLrkuIBcbiAgICBvcGVuRm9ybU1haW5XaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIGZ1bl9mb3JtX3R5cGUpIHtcbiAgICAgICAgdGhpcy5vcGVuRm9ybUdvRmlnaHRQYW5lbChzdGF0dXMsIGZ1bl9mb3JtX3R5cGUsIHt9LCBIZXJvQ29uc3QuRm9ybVNob3dUeXBlLmVGb3JtU2F2ZSlcbiAgICB9LFxuXG4gICAgLy8g5omT5byA6YCJ5oup6Zi15rOV55WM6Z2iXG4gICAgLy8gQGZvcm1hdGlvbl90eXBlIOmYteazleexu+WeiyDkuZ/mmK/phY3nva7ooajnmoRpZFxuICAgIG9wZW5Gb3JtYXRpb25TZWxlY3RQYW5lbDogZnVuY3Rpb24gKHN0YXR1cywgZm9ybWF0aW9uX3R5cGUsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JtYXRpb25fc2VsZWN0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIEZvcm1TZWxlY3RQYW5uZWwgPSByZXF1aXJlKFwiZm9ybV9zZWxlY3RfcGFuZWxcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRpb25fc2VsZWN0X3BhbmVsID0gbmV3IEZvcm1TZWxlY3RQYW5uZWwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBpZiAodGhpcy5mb3JtYXRpb25fc2VsZWN0X3BhbmVsICYmICF0aGlzLmZvcm1hdGlvbl9zZWxlY3RfcGFuZWwuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgIHZhciBvcGVuX3ByYWdtYSA9IHt9O1xuICAgICAgICAgICAgb3Blbl9wcmFnbWEuZm9ybWF0aW9uX3R5cGUgPSBmb3JtYXRpb25fdHlwZTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdGlvbl9zZWxlY3RfcGFuZWwub3BlbihvcGVuX3ByYWdtYSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtYXRpb25fc2VsZWN0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtYXRpb25fc2VsZWN0X3BhbmVsLmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdGlvbl9zZWxlY3RfcGFuZWwgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA6YCJ5oup56We5Zmo55WM6Z2iXG4gICAgLy8gQGhhbGxvd3NfaWQg56We5ZmoaWRcbiAgICBvcGVuRm9ybUhhbGxvd3NTZWxlY3RQYW5lbDogZnVuY3Rpb24gKHN0YXR1cywgaGFsbG93c19pZCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1faGFsbG93c19zZWxlY3RfcGFuZWwpIHtcbiAgICAgICAgICAgICAgICB2YXIgRm9ybUhhbGxvd3NTZWxlY3RQYW5lbCA9IHJlcXVpcmUoXCJmb3JtX2hhbGxvd3Nfc2VsZWN0X3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1faGFsbG93c19zZWxlY3RfcGFuZWwgPSBuZXcgRm9ybUhhbGxvd3NTZWxlY3RQYW5lbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcGVuX3ByYWdtYSA9IHt9O1xuICAgICAgICAgICAgb3Blbl9wcmFnbWEuaGFsbG93c19pZCA9IGhhbGxvd3NfaWQ7XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgdGhpcy5mb3JtX2hhbGxvd3Nfc2VsZWN0X3BhbmVsLm9wZW4ob3Blbl9wcmFnbWEpO1xuICAgICAgICAgICAgLy8gZW5kXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtX2hhbGxvd3Nfc2VsZWN0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2hhbGxvd3Nfc2VsZWN0X3BhbmVsLmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1faGFsbG93c19zZWxlY3RfcGFuZWwgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8g5omT5byA6Iux6ZuE5Y2H5pif55WM6Z2iIDTljYc1IDXljYc2IOiejeWQiOelreWdm1xuICAgIG9wZW5IZXJvVXBncmFkZVN0YXJGdXNlV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLCBoZXJvX3ZvKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy51cGdyYWRlX3N0YXJfZnVzZV93aW5kb3cgfHwgIXRoaXMudXBncmFkZV9zdGFyX2Z1c2Vfd2luZG93LnJvb3Rfd25kKSB7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9VcGdyYWRlU3RhckZ1c2VXaW5kb3cgPSByZXF1aXJlKFwiaGVyb191cGdyYWRlX3N0YXJfZnVzZV93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX3N0YXJfZnVzZV93aW5kb3cgPSBuZXcgSGVyb1VwZ3JhZGVTdGFyRnVzZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnVwZ3JhZGVfc3Rhcl9mdXNlX3dpbmRvdyAmJiAhdGhpcy51cGdyYWRlX3N0YXJfZnVzZV93aW5kb3cuaXNPcGVuKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGVfc3Rhcl9mdXNlX3dpbmRvdy5vcGVuKGhlcm9fdm8pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudXBncmFkZV9zdGFyX2Z1c2Vfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX3N0YXJfZnVzZV93aW5kb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGVfc3Rhcl9mdXNlX3dpbmRvdyA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIEBzZWxlY3RfZGF0YSDmmK/mqKHmi59oZXJvX3Zv55qE5pWw5o2uXG4gICAgLy8gQGRpY19vdGhlcl9zZWxlY3RlZCDlt7Lnu4/lhbbku5booqvpgInmi6nnmoTmlbDmja4gW2lkXSA9IGhlcm9fdm/mqKHlvI9cbiAgICAvLyBAIGZvcm1fdHlwZSAtLeadpea6kOS9jee9riAgMTog6KGo56S66J6N5ZCI56Wt5Z2bIDI6IOihqOekuuWNh+aYn+eVjOmdoueahFxuICAgIC8vIEAgaXNfbWFzdGVyIOaYr+WQpuaYr+S4u+WNoSjono3lkIjnpa3lnZvkuJPnlKgpXG4gICAgb3Blbkhlcm9VcGdyYWRlU3RhclNlbGVjdFBhbmVsOiBmdW5jdGlvbiAoc3RhdHVzLCBzZWxlY3RfZGF0YSwgZGljX290aGVyX3NlbGVjdGVkLCBmb3JtX3R5cGUsIGlzX21hc3Rlciwgc2VsZWN0X2NiLCBjdXJfaGVyb192bykge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXBncmFkZV9zdGFyX3NlbGVjdF9wYW5lbCkge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvVXBncmFkZVN0YXJTZWxlY3RQYW5lbCA9IHJlcXVpcmUoXCJoZXJvX3VwZ3JhZGVfc3Rhcl9zZWxlY3Rfd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBncmFkZV9zdGFyX3NlbGVjdF9wYW5lbCA9IG5ldyBIZXJvVXBncmFkZVN0YXJTZWxlY3RQYW5lbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBvcGVuX3ByYWdtYSA9IHt9O1xuICAgICAgICAgICAgb3Blbl9wcmFnbWEuc2VsZWN0X2RhdGEgPSBzZWxlY3RfZGF0YTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmRpY19vdGhlcl9zZWxlY3RlZCA9IGRpY19vdGhlcl9zZWxlY3RlZDtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmZvcm1fdHlwZSA9IGZvcm1fdHlwZTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLnNlbGVjdF9jYiA9IHNlbGVjdF9jYjtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmN1cl9oZXJvX3ZvID0gY3VyX2hlcm9fdm87XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5pc19tYXN0ZXIgPSBpc19tYXN0ZXI7XG4gICAgICAgICAgICB0aGlzLnVwZ3JhZGVfc3Rhcl9zZWxlY3RfcGFuZWwub3BlbihvcGVuX3ByYWdtYSk7XG4gICAgICAgICAgICAvLyBpZiB0aGlzLnVwZ3JhZGVfc3Rhcl9zZWxlY3RfcGFuZWwgYW5kIHRoaXMudXBncmFkZV9zdGFyX3NlbGVjdF9wYW5lbDppc09wZW4oKSA9PSBmYWxzZSB0aGVuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy51cGdyYWRlX3N0YXJfc2VsZWN0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX3N0YXJfc2VsZWN0X3BhbmVsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGdyYWRlX3N0YXJfc2VsZWN0X3BhbmVsID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDph43nlJ/mk43kvZznlYzpnaJcbiAgICBvcGVuSGVyb1Jlc2V0V2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3Jlc2V0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHZhciBIZXJvUmVzZXRXaW5kb3cgPSByZXF1aXJlKFwiaGVyb19yZXNldF93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3Jlc2V0X3dpbmRvdyA9IG5ldyBIZXJvUmVzZXRXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX3Jlc2V0X3dpbmRvdylcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fcmVzZXRfd2luZG93Lm9wZW4oZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX3Jlc2V0X3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF93aW5kb3cuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF93aW5kb3cgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9wZW5IZXJvUmVzZXRSZXR1cm5QYW5lbDogZnVuY3Rpb24gKGJvb2wsIGl0ZW1fbGlzdCkge1xuICAgICAgICBpZiAoYm9vbCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhlcm9fcmVzZXRfcmV0dXJuX3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9SZXNldFJldHVyblBhbmVsID0gcmVxdWlyZShcImhlcm9fcmVzdF9yZXR1cm5fd2luZG93XCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF9yZXR1cm5fcGFuZWwgPSBuZXcgSGVyb1Jlc2V0UmV0dXJuUGFuZWwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb3Blbl9wcmFnbWEgPSB7fTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLml0ZW1fbGlzdCA9IGl0ZW1fbGlzdDtcbiAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF9yZXR1cm5fcGFuZWwub3BlbihvcGVuX3ByYWdtYSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX3Jlc2V0X3JldHVybl9wYW5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF9yZXR1cm5fcGFuZWwuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF9yZXR1cm5fcGFuZWwgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIG9wZW5IZXJvUmVzZXRPZmZlclBhbmVsOiBmdW5jdGlvbiAoYm9vbCwgaXRlbV9saXN0ICxpc19zaG93X3RpcHMsIGNhbGxiYWNrICxyZXNldF90eXBlICxkZWMpIHtcbiAgICAgICAgaWYgKGJvb2wpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3Jlc2V0X29mZmVyX3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9SZXNldE9mZmVyUGFuZWwgPSByZXF1aXJlKFwiaGVyb19yZXNldF9vZmZlcl93aW5kb3dcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3Jlc2V0X29mZmVyX3BhbmVsID0gbmV3IEhlcm9SZXNldE9mZmVyUGFuZWwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb3Blbl9wcmFnbWEgPSB7fTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLml0ZW1fbGlzdCA9IGl0ZW1fbGlzdDtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5pc19zaG93X3RpcHMgPSBpc19zaG93X3RpcHM7XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5yZXNldF90eXBlID0gcmVzZXRfdHlwZTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmRlYyA9IGRlYztcbiAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF9vZmZlcl9wYW5lbC5vcGVuKG9wZW5fcHJhZ21hKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhlcm9fcmVzZXRfb2ZmZXJfcGFuZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fcmVzZXRfb2ZmZXJfcGFuZWwuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19yZXNldF9vZmZlcl9wYW5lbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gLS3miZPlvIDoo4XlpIfnqb/miLTnlYzpnaJcbiAgICBvcGVuRXF1aXBQYW5lbDogZnVuY3Rpb24gKHN0YXR1cywgcG9zLCBwYXJ0bmVyX2lkLCBkYXRhKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5lcXVpcF9wYW5lbCkge1xuICAgICAgICAgICAgICAgIHZhciBFcXVpcENsb3RoV2luZG93ID0gcmVxdWlyZShcImVxdWlwX2Nsb3RoX3dpbmRvd1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVxdWlwX3BhbmVsID0gbmV3IEVxdWlwQ2xvdGhXaW5kb3codGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgb3Blbl9wcmFnbWEgPSB7fTtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmVxdWlwX3R5cGUgPSBwb3M7XG4gICAgICAgICAgICBvcGVuX3ByYWdtYS5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZDtcbiAgICAgICAgICAgIG9wZW5fcHJhZ21hLmRhdGEgPSBkYXRhO1xuXG4gICAgICAgICAgICB0aGlzLmVxdWlwX3BhbmVsLm9wZW4ob3Blbl9wcmFnbWEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXF1aXBfcGFuZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVxdWlwX3BhbmVsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5lcXVpcF9wYW5lbCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gZGVzYzrmiZPlvIDoo4XlpId0aXBzXG4gICAgLy8gdGltZToyMDE4LTA1LTI0IDA1OjUwOjQyXG4gICAgLy8gQGJvb2w65omT5byA5LiO5YWz6ZetXG4gICAgLy8gQGRhdGE66KOF5aSH5pWw5o2uXG4gICAgLy8gQG9wZW5fdHlwZTroo4XlpIfnirbmgIHvvIwwLuWFtuS7lueKtuaAge+8jDE6IOiDjOWMheS4rSAzOuS8meS8tOi6q+S4iiDlhbfkvZPmn6XnnIsgUGFydG5lckNvbnN0LkVxbVRpcHNcbiAgICAvLyBAcGFydG5lcl9pZDrnqb/miLTlnKjkvJnkvLTouqvkuIrlsLHmnInkvJnkvLRpZO+8jOWFtuS7luWPr+S4jeWhq+aIluWhqzBcbiAgICAvLyBAcmV0dXJuIFxuICAgIG9wZW5FcXVpcFRpcHM6IGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEsIG9wZW5fdHlwZSwgcGFydG5lcikge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB2YXIgVGlwc0NvbnRyb2xsZXIgPSByZXF1aXJlKFwidGlwc19jb250cm9sbGVyXCIpO1xuICAgICAgICAgICAgVGlwc0NvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKS5zaG93RXF1aXBUaXBzKGRhdGEsIG9wZW5fdHlwZSwgcGFydG5lcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHN0YXR1cykge1xuICAgICAgICAvLyAgICAgLy8g5byV5a+855qE5pe25YCZ5LiN5by5XG4gICAgICAgIC8vICAgICAvLyBpZiBHdWlkZUNvbnRyb2xsZXI6Z2V0SW5zdGFuY2UoKTppc0luR3VpZGUoKSByZXR1cm4gLy8g5byV5a+855qE5pe25YCZ5LiN6KaB5pi+56S6dGlwc+S6hiDlm6DkuLrlj6/og73kvJrooqvmjKHkvY9cbiAgICAgICAgLy8gICAgIGlmICghdGhpcy5lcXVpcF90aXBzKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIEVxdWlwVGlwcyA9IHJlcXVpcmUoXCJlcXVpcF90aXBzXCIpO1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuZXF1aXBfdGlwcyA9IG5ldyBFcXVpcFRpcHMoKTtcbiAgICAgICAgLy8gICAgIH0gXG4gICAgICAgIC8vICAgICBvcGVuX3R5cGUgPSBvcGVuX3R5cGUgfHwgUGFydG5lckNvbnN0LkVxbVRpcHMubm9ybWFsO1xuICAgICAgICAvLyAgICAgdGhpcy5lcXVpcF90aXBzLm9wZW4oKTtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLmVxdWlwX3RpcHMpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmVxdWlwX3RpcHMuY2xvc2UoKTtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmVxdWlwX3RpcHMgPSBudWxsO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgfSxcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3npZ7lmajnm7jlhbMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyDmiZPlvIDnrKbmlofph43pk7jnlYzpnaJcbiAgICBvcGVuQXJ0aWZhY3RSZWNhc3RXaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIGRhdGEsIHBhcnRuZXJfaWQpIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PSB0cnVlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXJ0aWZhY3RfcmVjYXN0X3dpbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfcmVjYXN0X3dpbiA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYXJ0aWZhY3RfcmVjYXN0X3dpbmRvd1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9yZWNhc3Rfd2luLm9wZW4oeyBkYXRhOiBkYXRhLCBwYXJ0bmVyX2lkOiBwYXJ0bmVyX2lkIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcnRpZmFjdF9yZWNhc3Rfd2luKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9yZWNhc3Rfd2luLmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X3JlY2FzdF93aW4gPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/miZPlvIDnpZ7lmajliJfooajpgInmi6nnlYzpnaJcbiAgICAvLyBmdW5jdGlvbiBIZXJvQ29udHJvbGxlcjpvcGVuQXJ0aWZhY3RMaXN0V2luZG93KGJvb2wsYXJ0aWZhY3RfdHlwZSxwYXJ0bmVyX2lkLHNlbGVjdF92bylcbiAgICAvLyAgICAgaWYgYm9vbCA9PSB0cnVlIHRoZW5cbiAgICAvLyAgICAgICAgIGlmIG5vdCB0aGlzLmFydGlmYWN0X2xpc3RfcGFuZWwgdGhlbiBcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X2xpc3RfcGFuZWwgPSBBcnRpZmFjdExpc3RXaW5kb3cuTmV3KClcbiAgICAvLyAgICAgICAgIGVuZFxuICAgIC8vICAgICAgICAgYXJ0aWZhY3RfdHlwZSA9IGFydGlmYWN0X3R5cGUgb3IgMFxuICAgIC8vICAgICAgICAgcGFydG5lcl9pZCA9IHBhcnRuZXJfaWQgb3IgMFxuICAgIC8vICAgICAgICAgaWYgdGhpcy5hcnRpZmFjdF9saXN0X3BhbmVsIGFuZCB0aGlzLmFydGlmYWN0X2xpc3RfcGFuZWw6aXNPcGVuKCkgPT0gZmFsc2UgdGhlblxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfbGlzdF9wYW5lbDpvcGVuKGFydGlmYWN0X3R5cGUscGFydG5lcl9pZCxzZWxlY3Rfdm8pXG4gICAgLy8gICAgICAgICBlbmRcbiAgICAvLyAgICAgZWxzZSBcbiAgICAvLyAgICAgICAgIGlmIHRoaXMuYXJ0aWZhY3RfbGlzdF9wYW5lbCB0aGVuIFxuICAgIC8vICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfbGlzdF9wYW5lbDpjbG9zZSgpXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9saXN0X3BhbmVsID0gbnVsbFxuICAgIC8vICAgICAgICAgZW5kXG4gICAgLy8gICAgIGVuZFxuICAgIC8vIGVuZFxuICAgIG9wZW5BcnRpZmFjdExpc3RXaW5kb3c6IGZ1bmN0aW9uIChib29sLCBhcnRpZmFjdF90eXBlLCBwYXJ0bmVyX2lkLCBzZWxlY3Rfdm8pIHtcbiAgICAgICAgaWYgKGJvb2wgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFydGlmYWN0X2xpc3Rfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9saXN0X3dpbmRvdyA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYXJ0aWZhY3RfbGlzdF93aW5kb3dcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFydGlmYWN0X3R5cGUgPSBhcnRpZmFjdF90eXBlIHx8IDA7XG4gICAgICAgICAgICBwYXJ0bmVyX2lkID0gcGFydG5lcl9pZCB8fCAwO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgICAgIGRhdGEuYXJ0aWZhY3RfdHlwZSA9IGFydGlmYWN0X3R5cGU7XG4gICAgICAgICAgICBkYXRhLnBhcnRuZXJfaWQgPSBwYXJ0bmVyX2lkO1xuICAgICAgICAgICAgZGF0YS5zZWxlY3Rfdm8gPSBzZWxlY3Rfdm87XG4gICAgICAgICAgICB0aGlzLmFydGlmYWN0X2xpc3Rfd2luZG93Lm9wZW4oZGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFydGlmYWN0X2xpc3Rfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9saXN0X3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9saXN0X3dpbmRvdyA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDnrKbmlofpgInmi6nnlYzpnaJcbiAgICBvcGVuQXJ0aWZhY3RDaG9zZVdpbmRvdzogZnVuY3Rpb24gKGJvb2wsIGRhdGEpIHtcbiAgICAgICAgaWYgKGJvb2wgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFydGlmYWN0X2Nob3NlX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfY2hvc2Vfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhcnRpZmFjdF9jaG9zZV93aW5kb3dcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfY2hvc2Vfd2luZG93Lm9wZW4oZGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFydGlmYWN0X2Nob3NlX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfY2hvc2Vfd2luZG93LmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X2Nob3NlX3dpbmRvdyA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgLy8gLS1kZXNjOuaJk+W8gOespuaWh+aTjeS9nOeVjOmdolxuICAgIC8vIC0tdGltZToyMDE4LTA1LTE3IDA1OjM0OjEzXG4gICAgLy8gLS1AYm9vbDpcbiAgICAvLyAtLUBkYXRhOuespuaWh+aVsOaNru+8jOS4umdvb2RzX3Zv5pWw5o2uXG4gICAgLy8gLS1Ab3Blbl90eXBlOuaJk+W8gOexu+Wei++8jOWIhuS4ulxuICAgIC8vIC0tQHJldHVybiBcbiAgICAvLyAtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tXG4gICAgb3BlbkFydGlmYWN0VGlwc1dpbmRvdzogZnVuY3Rpb24gKGJvb2wsIGRhdGEsIG9wZW5fdHlwZSwgcGFydG5lcl9pZCwgcG9zKSB7XG4gICAgICAgIGlmIChib29sID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YS5jb25maWcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UoVXRpbHMuVEkxOE4oXCLmlbDmja7lvILluLhcIikpXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuYXJ0aWZhY3RfdGlwc193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X3RpcHNfd2luZG93ID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhcnRpZmFjdF90aXBzX3dpbmRvd1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wZW5fdHlwZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb3Blbl90eXBlID0gUGFydG5lckNvbnN0LkFydGlmYWN0VGlwcy5iYWNrcGFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBwYXJhbSA9IHsgZGF0YTogZGF0YSwgb3Blbl90eXBlOiBvcGVuX3R5cGUsIHBhcnRuZXJfaWQ6IHBhcnRuZXJfaWQsIHBvczogcG9zIH1cbiAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfdGlwc193aW5kb3cub3BlbihwYXJhbSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFydGlmYWN0X3RpcHNfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF90aXBzX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF90aXBzX3dpbmRvdyA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyDmiZPlvIDnrKbmloflkIjmiJB0aXBz55WM6Z2iXG4gICAgb3BlbkFydGlmYWN0Q29tVGlwc1dpbmRvdzogZnVuY3Rpb24gKHN0YXR1cywgYmlkKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFydGlmYWN0X2NvbV93aW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X2NvbV93aW4gPSBVdGlscy5jcmVhdGVDbGFzcyhcImFydGlmYWN0X2NvbV90aXBzX3dpbmRvd1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9jb21fd2luLm9wZW4oYmlkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXJ0aWZhY3RfY29tX3dpbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfY29tX3dpbi5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9jb21fd2luID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOespuaWh+elneemj+WlluWKsemihuWPlueVjOmdolxuICAgIG9wZW5BcnRpZmFjdEF3YXJkV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFydGlmYWN0X2F3YXJkX3dpbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfYXdhcmRfd2luID0gVXRpbHMuY3JlYXRlQ2xhc3MoXCJhcnRpZmFjdF9hd2FyZF93aW5kb3dcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfYXdhcmRfd2luLm9wZW4oKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXJ0aWZhY3RfYXdhcmRfd2luKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9hd2FyZF93aW4uY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RfYXdhcmRfd2luID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOaJk+W8gOespuaWh+aKgOiDvemihOiniOeVjOmdolxuICAgIC8vIC1Ac2hvd190eXBlIOaYvuekuuexu+WeiyAxIOaYr+espuaWh+aKgOiDvemihOiniCAyIOaYr+iLsembhOWkqei1i+aKgOiDvVxuICAgIG9wZW5BcnRpZmFjdFNraWxsV2luZG93OiBmdW5jdGlvbiAoc3RhdHVzLHNob3dfdHlwZSkge1xuICAgICAgICBpZiAoc3RhdHVzID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hcnRpZmFjdF9za2lsbF93aW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X3NraWxsX3dpbiA9IFV0aWxzLmNyZWF0ZUNsYXNzKFwiYXJ0aWZhY3Rfc2tpbGxfd2luZG93XCIsc2hvd190eXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9za2lsbF93aW4ub3BlbigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcnRpZmFjdF9za2lsbF93aW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFydGlmYWN0X3NraWxsX3dpbi5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpZmFjdF9za2lsbF93aW4gPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3npZ7lmajnm7jlhbPnu5PmnZ8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5cbiAgICAvLyAtLSDmiZPlvIDoi7Hpm4R0aXBz55WM6Z2iXG4gICAgLy8gLS1pc19oaWRlX2VxdWlwIOaYr+WQpumakOiXj+ijheWkh1xuICAgIG9wZW5IZXJvVGlwc1BhbmVsKGJvb2wsIGhlcm9fdm8sIGlzX2hpZGVfZXF1aXApIHtcbiAgICAgICAgaWYgKGJvb2wgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhlcm9fdGlwc193aW5kb3cpIHtcbiAgICAgICAgICAgICAgICBsZXQgSGVyb1RpcHNXaW5kb3cgPSByZXF1aXJlKFwiaGVyb190aXBzX3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb190aXBzX3dpbmRvdyA9IG5ldyBIZXJvVGlwc1dpbmRvdygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih0aGlzLmhlcm9fdGlwc193aW5kb3cuaXNPcGVuKCkgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb190aXBzX3dpbmRvdy5vcGVuKHsgaGVyb192bzogaGVyb192bywgaXNfaGlkZV9lcXVpcDogaXNfaGlkZV9lcXVpcCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb190aXBzX3dpbmRvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb190aXBzX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3RpcHNfd2luZG93ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyAtLSDmiZPlvIDoi7Hpm4TlsZ7mgKd0aXBz55WM6Z2iXG4gICAgb3Blbkhlcm9UaXBzQXR0clBhbmVsKGJvb2wsIGhlcm9fdm8sIGlzX215KSB7XG4gICAgICAgIGlmIChib29sID09IHRydWUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oZXJvX3RpcHNfYXR0cl9wYW5lbCkge1xuICAgICAgICAgICAgICAgIGxldCBIZXJvVGlwc0F0dHJXaW5kb3cgPSByZXF1aXJlKFwiaGVyb190aXBzX2F0dHJfd2luZG93XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3RpcHNfYXR0cl9wYW5lbCA9IG5ldyBIZXJvVGlwc0F0dHJXaW5kb3coKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oZXJvX3RpcHNfYXR0cl9wYW5lbC5vcGVuKHsgaGVyb192bzogaGVyb192bywgaXNfbXk6IGlzX215IH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX3RpcHNfYXR0cl9wYW5lbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGVyb190aXBzX2F0dHJfcGFuZWwuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb190aXBzX2F0dHJfcGFuZWwgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gLS0g5omT5byA6Iux6ZuEdGlwc+eVjOmdouagueaNrmJpZFxuICAgIG9wZW5IZXJvVGlwc1BhbmVsQnlCaWQoYmlkKSB7XG4gICAgICAgIGxldCBoZXJvX3ZvID0gdGhpcy5tb2RlbC5nZXRNb2NrSGVyb1ZvQnlCaWQoYmlkKVxuICAgICAgICBpZiAoaGVyb192bykge1xuICAgICAgICAgICAgdGhpcy5vcGVuSGVyb1RpcHNQYW5lbCh0cnVlLCBoZXJvX3ZvLCB0cnVlKVxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyDmiZPlvIDoi7Hpm4Tlm77kuabppobkv6Hmga/moLnmja5iaWQg5ZKM5pif57qnXG4gICAgb3Blbkhlcm9JbmZvV2luZG93QnlCaWRTdGFyOiBmdW5jdGlvbiAoYmlkLCBzdGFyLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoYmlkID09IG51bGwgfHwgc3RhciA9PSBudWxsKSByZXR1cm5cbiAgICAgICAgdmFyIGtleSA9IFV0aWxzLmdldE5vcktleShiaWQsIHN0YXIpO1xuICAgICAgICB2YXIgaGVyb192byA9IHRoaXMubW9kZWwuZ2V0SGVyb1Bva2VkZXhCeUJpZChrZXkpO1xuICAgICAgICBpZiAoaGVyb192bykge1xuICAgICAgICAgICAgdGhpcy5vcGVuSGVyb01haW5JbmZvV2luZG93KHRydWUsIGhlcm9fdm8sIFtoZXJvX3ZvXSwgeyBzaG93X21vZGVsX3R5cGU6IEhlcm9Db25zdC5CYWdUYWIuZUJhZ1Bva2VkZXgsIGNhbGxiYWNrOiBjYWxsYmFjayB9KVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEhlcm9Hb0ZpZ2h0Um9vdDogZnVuY3Rpb24gKGZpbmlzaF9jYikge1xuICAgICAgICBpZiAoZmluaXNoX2NiKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsLmdldFJvb3RXbmQoZmluaXNoX2NiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluaXNoX2NiKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybV9nb19maWdodF9wYW5lbClcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtX2dvX2ZpZ2h0X3BhbmVsLnJvb3Rfd25kOyAgICAgICAgICAgIFxuICAgICAgICB9ICAgICAgICBcbiAgICB9LFxuXG4gICAgZ2V0SGVyb0JhZ1Jvb3Q6IGZ1bmN0aW9uIChmaW5pc2hfY2IpIHtcbiAgICAgICAgaWYgKGZpbmlzaF9jYikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19iYWdfd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX2JhZ193aW5kb3cuZ2V0Um9vdFduZChmaW5pc2hfY2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hfY2IobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX2JhZ193aW5kb3cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVyb19iYWdfd2luZG93LnJvb3Rfd25kO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldEhlcm9NaWFuSW5mb1Jvb3Q6IGZ1bmN0aW9uIChmaW5pc2hfY2IpIHtcbiAgICAgICAgaWYgKGZpbmlzaF9jYikge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGVyb19tYWluX2luZm9fd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX21haW5faW5mb193aW5kb3cuZ2V0Um9vdFduZChmaW5pc2hfY2IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5pc2hfY2IobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX21haW5faW5mb193aW5kb3cpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVyb19tYWluX2luZm9fd2luZG93LnJvb3Rfd25kO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIC0t6K+35rGC5aSp6LWL5oqA6IO95L+h5oGvXG4gICAgc2VuZGVyMTEwOTkobGlzdCl7XG4gICAgICAgIGxldCBwcm90b2NhbCA9IHt9XG4gICAgICAgIHByb3RvY2FsLnBhcnRuZXJfaWRzID0gbGlzdFxuICAgICAgICB0aGlzLlNlbmRQcm90b2NhbCgxMTA5OSwgcHJvdG9jYWwpXG4gICAgfSxcbiAgICBoYW5kbGUxMTA5OShkYXRhKXtcbiAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIZXJvVm9UYWxlbnQoZGF0YS5wYXJ0bmVyX2lkcylcbiAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19HZXRfVGFsZW50X0V2ZW50LCBkYXRhLnBhcnRuZXJfaWRzKVxuICAgIH0sXG4gICAgLy8gLS3lpKnotYvmioDog73ljYfnuqdcbiAgICBzZW5kZXIxMTA5NyhwYXJ0bmVyX2lkLCBwb3Mpe1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZFxuICAgICAgICBwcm90b2NhbC5wb3MgPSBwb3NcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwOTcsIHByb3RvY2FsKVxuICAgIH0sXG4gICAgaGFuZGxlMTEwOTcoZGF0YSl7XG4gICAgICAgIGlmKGRhdGEucmVzdWx0ID09IHRydWUpe1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIZXJvVm9UYWxlbnQoW2RhdGFdLCB0cnVlKVxuICAgICAgICAgICAgZGF0YSA9IHRoaXMubW9kZWwuZ2V0SGVyb0J5SWQoZGF0YS5wYXJ0bmVyX2lkKVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19MZXZlbF9VcF9UYWxlbnRfRXZlbnQsIGRhdGEpXG4gICAgICAgICAgICBIZXJvQ2FsY3VsYXRlLmdldEluc3RhbmNlKCkuY2xlYXJBbGxIZXJvUmVjb3JkQnlSZWRQb2ludFR5cGUoSGVyb0NvbnN0LlJlZFBvaW50VHlwZS5lUlBUYWxlbnQpXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgbWVzc2FnZShkYXRhLm1zZylcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLy8gLS3lpKnotYvpgZflv5hcbiAgICBzZW5kZXIxMTA5OChwYXJ0bmVyX2lkLCBwb3Mpe1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fVxuICAgICAgICBwcm90b2NhbC5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZFxuICAgICAgICBwcm90b2NhbC5wb3MgPSBwb3NcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwOTgsIHByb3RvY2FsKVxuICAgIH0sXG4gICAgaGFuZGxlMTEwOTgoZGF0YSl7XG4gICAgICAgIGlmKGRhdGEucmVzdWx0ID09IHRydWUpe1xuICAgICAgICAgICAgdGhpcy5tb2RlbC51cGRhdGVIZXJvVm9UYWxlbnQoW2RhdGFdLCB0cnVlKVxuICAgICAgICAgICAgZGF0YSA9IHRoaXMubW9kZWwuZ2V0SGVyb0J5SWQoZGF0YS5wYXJ0bmVyX2lkKVxuICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQuZmlyZShIZXJvRXZlbnQuSGVyb19Gb3JnZXRfVGFsZW50X0V2ZW50LCBkYXRhKVxuICAgICAgICAgICAgSGVyb0NhbGN1bGF0ZS5nZXRJbnN0YW5jZSgpLmNsZWFyQWxsSGVyb1JlY29yZEJ5UmVkUG9pbnRUeXBlKEhlcm9Db25zdC5SZWRQb2ludFR5cGUuZVJQVGFsZW50KVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIG1lc3NhZ2UoZGF0YS5tc2cpXG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tIOaJk+W8gOiLsembhOWtpuS5oOaKgOiDveeVjOmdolxuICAgIG9wZW5IZXJvVGFsZW50U2tpbGxMZWFyblBhbmVsKGJvb2wsIGhlcm9fdm8sIHBvcyl7XG4gICAgICAgIHZhciBzZWxmID0gdGhpc1xuICAgICAgICBpZihib29sID09IHRydWUpe1xuICAgICAgICAgICAgaWYoIXNlbGYuaGVyb190YWxlbnRfc2tpbGxfcGFuZWwpe1xuICAgICAgICAgICAgICAgIHZhciBIZXJvVGFsZW50U2tpbGxMZWFyblBhbmVsID0gcmVxdWlyZShcImhlcm9fdGFsZW50X3NraWxsX2xlYXJuX3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIHNlbGYuaGVyb190YWxlbnRfc2tpbGxfcGFuZWwgPSBuZXcgSGVyb1RhbGVudFNraWxsTGVhcm5QYW5lbCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZWxmLmhlcm9fdGFsZW50X3NraWxsX3BhbmVsLm9wZW4oe2hlcm9fdm86aGVyb192bywgcG9zOnBvc30pXG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgaWYoc2VsZi5oZXJvX3RhbGVudF9za2lsbF9wYW5lbCl7IFxuICAgICAgICAgICAgICAgIHNlbGYuaGVyb190YWxlbnRfc2tpbGxfcGFuZWwuY2xvc2UoKVxuICAgICAgICAgICAgICAgIHNlbGYuaGVyb190YWxlbnRfc2tpbGxfcGFuZWwgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8vIC0tIOaJk+W8gOiLsembhOWtpuS5oOaKgOiDveWNh+e6p+eVjOmdolxuICAgIG9wZW5IZXJvVGFsZW50U2tpbGxMZXZlbFVwUGFuZWwoYm9vbCwgaGVyb192bywgc2tpbGxfaWQsIHBvcyl7XG4gICAgICAgIGlmKGJvb2wgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZighdGhpcy5oZXJvX3RhbGVudF9sZXZlbHVwX3BhbmVsKXtcbiAgICAgICAgICAgICAgICB2YXIgSGVyb1RhbGVudFNraWxsTGV2ZWxVcFBhbmVsID0gcmVxdWlyZShcImhlcm9fdGFsZW50X3NraWxsX2xldmVsX3VwX3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb190YWxlbnRfbGV2ZWx1cF9wYW5lbCA9IG5ldyBIZXJvVGFsZW50U2tpbGxMZXZlbFVwUGFuZWwoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oZXJvX3RhbGVudF9sZXZlbHVwX3BhbmVsLm9wZW4oe2hlcm9fdm86aGVyb192bywgc2tpbGxfaWQ6c2tpbGxfaWQsIHBvczpwb3N9KVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMuaGVyb190YWxlbnRfbGV2ZWx1cF9wYW5lbCl7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3RhbGVudF9sZXZlbHVwX3BhbmVsLmNsb3NlKClcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fdGFsZW50X2xldmVsdXBfcGFuZWwgPSBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8v5byA5ZCv5paw5oqA6IO9XG4gICAgb3BlblNraWxsVW5sb2NrV2luZG93KHN0YXR1cywgc2tpbGxfYmlkKXtcbiAgICAgICAgaWYoc3RhdHVzID09IHRydWUpe1xuICAgICAgICAgICAgaWYgKHRoaXMudW5sb2NrX3dpbmRvdyA9PSBudWxsKXtcbiAgICAgICAgICAgICAgICBsZXQgU2tpbGxVbmxvY2tXaW5kb3cgPSByZXF1aXJlKFwic2tpbGxfdW5sb2NrX3dpbmRvd1wiKSBcbiAgICAgICAgICAgICAgICB0aGlzLnVubG9ja193aW5kb3cgPSBuZXcgU2tpbGxVbmxvY2tXaW5kb3coc2tpbGxfYmlkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYodGhpcy51bmxvY2tfd2luZG93ICYmIHRoaXMudW5sb2NrX3dpbmRvdy5pc09wZW4oKSA9PSBmYWxzZSl7XG4gICAgICAgICAgICAgICAgdGhpcy51bmxvY2tfd2luZG93Lm9wZW4oKVxuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmKHRoaXMudW5sb2NrX3dpbmRvdyl7IFxuICAgICAgICAgICAgICAgIHRoaXMudW5sb2NrX3dpbmRvdy5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy51bmxvY2tfd2luZG93ID0gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuXG4gICAgLy/mkq3mlL7oi7Hpm4Tpn7PmlYhcbiAgICBvblBsYXlIZXJvVm9pY2U6IGZ1bmN0aW9uICh2b2NpZV9yZXMsIHRpbWUpIHtcbiAgICAgICAgLy/pu5jorqQ056eSXG4gICAgICAgIHRpbWUgPSB0aW1lIHx8IDQ7XG4gICAgICAgIC8v6KGl5YWFMeenkuaXtuW3rlxuICAgICAgICB0aW1lICs9IDE7XG4gICAgICAgIFxuICAgICAgICBpZiAodGhpcy52b2ljZV90aW1lX3RpY2tldCA9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgdm9sdW1lID0gZ2NvcmUuU3lzRW52LmdldChcIm11c2ljX3ZvbHVtZVwiKTtcbiAgICAgICAgICAgIHZvbHVtZSAtPSAwLjY7XG4gICAgICAgICAgICBTb3VuZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRCYWNrZ3JvdW5kVm9sdW1lKHZvbHVtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy52b2ljZV90aW1lX3RpY2tldCk7XG4gICAgICAgICAgICB0aGlzLnZvaWNlX3RpbWVfdGlja2V0ID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhlcm9fbXVzaWMgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYodGhpcy5oZXJvX211c2ljID09IFwidW5kZWZcIil7XG4gICAgICAgICAgICAgICAgU291bmRNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRWZmZWN0U291bmQobnVsbCk7XG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBTb3VuZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVFZmZlY3RTb3VuZCh0aGlzLmhlcm9fbXVzaWMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVyb19tdXNpYyA9IFNvdW5kTWFuYWdlci5nZXRJbnN0YW5jZSgpLnBsYXlIZXJvRWZmZWN0T25jZShBVURJT19UWVBFLkRVQkJJTkcsIHZvY2llX3Jlcyk7XG4gICAgICAgIGlmKHRoaXMuaGVyb19tdXNpYyA9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgdGhpcy5oZXJvX211c2ljID0gXCJ1bmRlZlwiO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudm9pY2VfdGltZV90aWNrZXQgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHZvbHVtZSA9IGdjb3JlLlN5c0Vudi5nZXQoXCJtdXNpY192b2x1bWVcIik7XG4gICAgICAgICAgICBTb3VuZE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRCYWNrZ3JvdW5kVm9sdW1lKHZvbHVtZSk7XG4gICAgICAgICAgICB0aGlzLnZvaWNlX3RpbWVfdGlja2V0ID0gbnVsbDtcbiAgICAgICAgfS5iaW5kKHRoaXMpLCB0aW1lICogMTAwMCwgMSlcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIOearuiCpOaPkOekulxuICAgICAqIEBwYXJhbSB7Kn0gc3RhdHVzIOaJk+W8gOS4juWFs+mXrVxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSAg55qu6IKk5L+h5oGvXG4gICAgICogQHBhcmFtIHsqfSBvcGVuX3R5cGUgIOijheWkh+eKtuaAge+8jDAu5YW25LuW54q25oCB77yMMTog6IOM5YyF5LitIDM65LyZ5Ly06Lqr5LiKIOWFt+S9k+afpeeciyBQYXJ0bmVyQ29uc3QuRXFtVGlwc1xuICAgICAqIEBwYXJhbSB7Kn0gcGFydG5lciDnqb/miLTlnKjkvJnkvLTouqvkuIrlsLHmnInkvJnkvLRpZO+8jOWFtuS7luWPr+S4jeWhq+aIluWhqzBcbiAgICAgKi9cbiAgICBvcGVuSGVyb1NraW5UaXBzUGFuZWwoc3RhdHVzLCBkYXRhLCBvcGVuX3R5cGUsIHBhcnRuZXIpe1xuICAgICAgICBpZihzdGF0dXMgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBpZighdGhpcy5oZXJvX3NraW5fdGlwc19wYW5lbCl7XG4gICAgICAgICAgICAgICAgdmFyIEhlcm9Ta2luVGlwc1BhbmVsID0gcmVxdWlyZShcImhlcm9fc2tpbl90aXBzX3dpbmRvd1wiKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVyb19za2luX3RpcHNfcGFuZWwgPSBuZXcgSGVyb1NraW5UaXBzUGFuZWwodGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaGVyb19za2luX3RpcHNfcGFuZWwub3Blbih7ZGF0YTpkYXRhLG9wZW5fdHlwZTpvcGVuX3R5cGUscGFydG5lcjpwYXJ0bmVyfSlcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZih0aGlzLmhlcm9fc2tpbl90aXBzX3BhbmVsKXsgXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3NraW5fdGlwc19wYW5lbC5jbG9zZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3NraW5fdGlwc19wYW5lbCA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3nmq7ogqTljY/orq7nu5PmnZ8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8v55qu6IKk5L2/55SoXG4gICAgc2VuZGVyMTEwMTk6IGZ1bmN0aW9uIChwYXJ0bmVyX2lkLCBza2luX2lkKSB7XG4gICAgICAgIGxldCBwcm90b2NhbCA9IHt9O1xuICAgICAgICBwcm90b2NhbC5wYXJ0bmVyX2lkID0gcGFydG5lcl9pZDtcbiAgICAgICAgcHJvdG9jYWwuc2tpbl9pZCA9IHNraW5faWQ7XG4gICAgICAgIHRoaXMuU2VuZFByb3RvY2FsKDExMDE5LCBwcm90b2NhbCk7XG4gICAgfSxcblxuICAgIGhhbmRsZTExMDE5OiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBtZXNzYWdlKGRhdGEubXNnKTtcbiAgICAgICAgY2MubG9nKFwiMTEwMTlcIixkYXRhKVxuICAgICAgICBpZiAoZGF0YS5yZXN1bHQgPT0gMSkge1xuICAgICAgICAgICAgbWVzc2FnZShVdGlscy5USTE4TihcIuabtOaNouaIkOWKn1wiKSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy/nmq7ogqTkvb/nlKhcbiAgICBzZW5kZXIxMTAyMDogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgcHJvdG9jYWwgPSB7fTtcbiAgICAgICAgdGhpcy5TZW5kUHJvdG9jYWwoMTEwMjAsIHByb3RvY2FsKTtcbiAgICB9LFxuXG4gICAgaGFuZGxlMTEwMjA6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGNjLmxvZyhcIjExMDIwXCIsZGF0YSlcbiAgICAgICAgdGhpcy5tb2RlbC5pbml0SGVyb1NraW4oZGF0YSk7XG5cbiAgICB9LFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3nmq7ogqTljY/orq7nu5PmnZ8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLy/miZPlvIDnmq7ogqTnlYzpnaJcbiAgICBvcGVuSGVyb1NraW5XaW5kb3c6IGZ1bmN0aW9uIChzdGF0dXMsIHZvKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhlcm9fc2tpbl93aW5kb3cpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhlcm9fc2tpbl93aW5kb3cgPSBVdGlscy5jcmVhdGVDbGFzcyhcImhlcm9fc2tpbl93aW5kb3dcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhlcm9fc2tpbl93aW5kb3cub3Blbih2byk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oZXJvX3NraW5fd2luZG93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3NraW5fd2luZG93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oZXJvX3NraW5fd2luZG93ID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBIZXJvQ29udHJvbGxlcjsiXX0=