wangzhibo
2023-10-31 86070cd00485c47a2c5c3ffa4a9bae6648dd05c6
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
import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { style as _$style } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { className as _$className } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { effect as _$effect } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { use as _$use } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { memo as _$memo } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
const _tmpl$ = /*#__PURE__*/_$template(`<div>`);
// src/drag-drop-context.tsx
import { batch, createContext, createEffect, mergeProps, untrack, useContext } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { createStore } from "/node_modules/.vite/deps/solid-js_store.js?v=93754656";
 
// src/layout.ts
var Layout = class {
  x;
  y;
  width;
  height;
  constructor(rect) {
    this.x = Math.floor(rect.x);
    this.y = Math.floor(rect.y);
    this.width = Math.floor(rect.width);
    this.height = Math.floor(rect.height);
  }
  get rect() {
    return {
      x: this.x,
      y: this.y,
      width: this.width,
      height: this.height
    };
  }
  get left() {
    return this.x;
  }
  get top() {
    return this.y;
  }
  get right() {
    return this.x + this.width;
  }
  get bottom() {
    return this.y + this.height;
  }
  get center() {
    return {
      x: this.x + this.width * 0.5,
      y: this.y + this.height * 0.5
    };
  }
  get corners() {
    return {
      topLeft: {
        x: this.left,
        y: this.top
      },
      topRight: {
        x: this.right,
        y: this.top
      },
      bottomRight: {
        x: this.left,
        y: this.bottom
      },
      bottomLeft: {
        x: this.right,
        y: this.bottom
      }
    };
  }
};
var elementLayout = element => {
  let layout = new Layout(element.getBoundingClientRect());
  const {
    transform
  } = getComputedStyle(element);
  if (transform) {
    layout = stripTransformFromLayout(layout, transform);
  }
  return layout;
};
var stripTransformFromLayout = (layout, transform) => {
  let translateX, translateY;
  if (transform.startsWith("matrix3d(")) {
    const matrix = transform.slice(9, -1).split(/, /);
    translateX = +matrix[12];
    translateY = +matrix[13];
  } else if (transform.startsWith("matrix(")) {
    const matrix = transform.slice(7, -1).split(/, /);
    translateX = +matrix[4];
    translateY = +matrix[5];
  } else {
    translateX = 0;
    translateY = 0;
  }
  return new Layout({
    ...layout,
    x: layout.x - translateX,
    y: layout.y - translateY
  });
};
var noopTransform = () => ({
  x: 0,
  y: 0
});
var transformsAreEqual = (firstTransform, secondTransform) => {
  return firstTransform.x === secondTransform.x && firstTransform.y === secondTransform.y;
};
var transformLayout = (layout, transform) => {
  return new Layout({
    ...layout,
    x: layout.x + transform.x,
    y: layout.y + transform.y
  });
};
var distanceBetweenPoints = (firstPoint, secondPoint) => {
  return Math.sqrt(Math.pow(firstPoint.x - secondPoint.x, 2) + Math.pow(firstPoint.y - secondPoint.y, 2));
};
var intersectionRatioOfLayouts = (firstLayout, secondLayout) => {
  const top = Math.max(firstLayout.top, secondLayout.top);
  const left = Math.max(firstLayout.left, secondLayout.left);
  const right = Math.min(firstLayout.right, secondLayout.right);
  const bottom = Math.min(firstLayout.bottom, secondLayout.bottom);
  const width = right - left;
  const height = bottom - top;
  if (left < right && top < bottom) {
    const layout1Area = firstLayout.width * firstLayout.height;
    const layout2Area = secondLayout.width * secondLayout.height;
    const intersectionArea = width * height;
    return intersectionArea / (layout1Area + layout2Area - intersectionArea);
  }
  return 0;
};
var layoutsAreEqual = (firstLayout, secondLayout) => {
  return firstLayout.x === secondLayout.x && firstLayout.y === secondLayout.y && firstLayout.width === secondLayout.width && firstLayout.height === secondLayout.height;
};
 
// src/collision.ts
var closestCenter = (draggable, droppables, context) => {
  const point1 = draggable.transformed.center;
  const collision = {
    distance: Infinity,
    droppable: null
  };
  for (const droppable of droppables) {
    const distance = distanceBetweenPoints(point1, droppable.layout.center);
    if (distance < collision.distance) {
      collision.distance = distance;
      collision.droppable = droppable;
    } else if (distance === collision.distance && droppable.id === context.activeDroppableId) {
      collision.droppable = droppable;
    }
  }
  return collision.droppable;
};
var closestCorners = (draggable, droppables, context) => {
  const draggableCorners = draggable.transformed.corners;
  const collision = {
    distance: Infinity,
    droppable: null
  };
  for (const droppable of droppables) {
    const droppableCorners = droppable.layout.corners;
    const distance = distanceBetweenPoints(droppableCorners.topLeft, draggableCorners.topLeft) + distanceBetweenPoints(droppableCorners.topRight, draggableCorners.topRight) + distanceBetweenPoints(droppableCorners.bottomRight, draggableCorners.bottomRight) + distanceBetweenPoints(droppableCorners.bottomLeft, draggableCorners.bottomLeft);
    if (distance < collision.distance) {
      collision.distance = distance;
      collision.droppable = droppable;
    } else if (distance === collision.distance && droppable.id === context.activeDroppableId) {
      collision.droppable = droppable;
    }
  }
  return collision.droppable;
};
var mostIntersecting = (draggable, droppables, context) => {
  const draggableLayout = draggable.transformed;
  const collision = {
    ratio: 0,
    droppable: null
  };
  for (const droppable of droppables) {
    const ratio = intersectionRatioOfLayouts(draggableLayout, droppable.layout);
    if (ratio > collision.ratio) {
      collision.ratio = ratio;
      collision.droppable = droppable;
    } else if (ratio > 0 && ratio === collision.ratio && droppable.id === context.activeDroppableId) {
      collision.droppable = droppable;
    }
  }
  return collision.droppable;
};
 
// src/drag-drop-context.tsx
var Context = createContext();
var DragDropProvider = passedProps => {
  const props = mergeProps({
    collisionDetector: mostIntersecting
  }, passedProps);
  const [state, setState] = createStore({
    draggables: {},
    droppables: {},
    sensors: {},
    active: {
      draggableId: null,
      get draggable() {
        return state.active.draggableId !== null ? state.draggables[state.active.draggableId] : null;
      },
      droppableId: null,
      get droppable() {
        return state.active.droppableId !== null ? state.droppables[state.active.droppableId] : null;
      },
      sensorId: null,
      get sensor() {
        return state.active.sensorId !== null ? state.sensors[state.active.sensorId] : null;
      },
      overlay: null
    }
  });
  const addTransformer = (type, id, transformer) => {
    const displayType = type.substring(0, type.length - 1);
    if (!untrack(() => state[type][id])) {
      console.warn(`Cannot add transformer to nonexistent ${displayType} with id: ${id}`);
      return;
    }
    setState(type, id, "transformers", transformer.id, transformer);
  };
  const removeTransformer = (type, id, transformerId) => {
    const displayType = type.substring(0, type.length - 1);
    if (!untrack(() => state[type][id])) {
      console.warn(`Cannot remove transformer from nonexistent ${displayType} with id: ${id}`);
      return;
    }
    if (!untrack(() => state[type][id]["transformers"][transformerId])) {
      console.warn(`Cannot remove from ${displayType} with id ${id}, nonexistent transformer with id: ${transformerId}`);
      return;
    }
    setState(type, id, "transformers", transformerId, void 0);
  };
  const addDraggable = ({
    id,
    node,
    layout,
    data
  }) => {
    const existingDraggable = state.draggables[id];
    const draggable = {
      id,
      node,
      layout,
      data,
      _pendingCleanup: false
    };
    let transformer;
    if (!existingDraggable) {
      Object.defineProperties(draggable, {
        transformers: {
          enumerable: true,
          configurable: true,
          writable: true,
          value: {}
        },
        transform: {
          enumerable: true,
          configurable: true,
          get: () => {
            if (state.active.overlay) {
              return noopTransform();
            }
            const transformers = Object.values(state.draggables[id].transformers);
            transformers.sort((a, b) => a.order - b.order);
            return transformers.reduce((transform, transformer2) => {
              return transformer2.callback(transform);
            }, noopTransform());
          }
        },
        transformed: {
          enumerable: true,
          configurable: true,
          get: () => {
            return transformLayout(state.draggables[id].layout, state.draggables[id].transform);
          }
        }
      });
    } else if (state.active.draggableId === id && !state.active.overlay) {
      const layoutDelta = {
        x: existingDraggable.layout.x - layout.x,
        y: existingDraggable.layout.y - layout.y
      };
      const transformerId = "addDraggable-existing-offset";
      const existingTransformer = existingDraggable.transformers[transformerId];
      const transformOffset = existingTransformer ? existingTransformer.callback(layoutDelta) : layoutDelta;
      transformer = {
        id: transformerId,
        order: 100,
        callback: transform => {
          return {
            x: transform.x + transformOffset.x,
            y: transform.y + transformOffset.y
          };
        }
      };
      onDragEnd(() => removeTransformer("draggables", id, transformerId));
    }
    batch(() => {
      setState("draggables", id, draggable);
      if (transformer) {
        addTransformer("draggables", id, transformer);
      }
    });
    if (state.active.draggable) {
      recomputeLayouts();
    }
  };
  const removeDraggable = id => {
    if (!untrack(() => state.draggables[id])) {
      console.warn(`Cannot remove nonexistent draggable with id: ${id}`);
      return;
    }
    setState("draggables", id, "_pendingCleanup", true);
    queueMicrotask(() => cleanupDraggable(id));
  };
  const cleanupDraggable = id => {
    if (state.draggables[id]?._pendingCleanup) {
      const cleanupActive = state.active.draggableId === id;
      batch(() => {
        if (cleanupActive) {
          setState("active", "draggableId", null);
        }
        setState("draggables", id, void 0);
      });
    }
  };
  const addDroppable = ({
    id,
    node,
    layout,
    data
  }) => {
    const existingDroppable = state.droppables[id];
    const droppable = {
      id,
      node,
      layout,
      data,
      _pendingCleanup: false
    };
    if (!existingDroppable) {
      Object.defineProperties(droppable, {
        transformers: {
          enumerable: true,
          configurable: true,
          writable: true,
          value: {}
        },
        transform: {
          enumerable: true,
          configurable: true,
          get: () => {
            const transformers = Object.values(state.droppables[id].transformers);
            transformers.sort((a, b) => a.order - b.order);
            return transformers.reduce((transform, transformer) => {
              return transformer.callback(transform);
            }, noopTransform());
          }
        },
        transformed: {
          enumerable: true,
          configurable: true,
          get: () => {
            return transformLayout(state.droppables[id].layout, state.droppables[id].transform);
          }
        }
      });
    }
    setState("droppables", id, droppable);
    if (state.active.draggable) {
      recomputeLayouts();
    }
  };
  const removeDroppable = id => {
    if (!untrack(() => state.droppables[id])) {
      console.warn(`Cannot remove nonexistent droppable with id: ${id}`);
      return;
    }
    setState("droppables", id, "_pendingCleanup", true);
    queueMicrotask(() => cleanupDroppable(id));
  };
  const cleanupDroppable = id => {
    if (state.droppables[id]?._pendingCleanup) {
      const cleanupActive = state.active.droppableId === id;
      batch(() => {
        if (cleanupActive) {
          setState("active", "droppableId", null);
        }
        setState("droppables", id, void 0);
      });
    }
  };
  const addSensor = ({
    id,
    activators
  }) => {
    setState("sensors", id, {
      id,
      activators,
      coordinates: {
        origin: {
          x: 0,
          y: 0
        },
        current: {
          x: 0,
          y: 0
        },
        get delta() {
          return {
            x: state.sensors[id].coordinates.current.x - state.sensors[id].coordinates.origin.x,
            y: state.sensors[id].coordinates.current.y - state.sensors[id].coordinates.origin.y
          };
        }
      }
    });
  };
  const removeSensor = id => {
    if (!untrack(() => state.sensors[id])) {
      console.warn(`Cannot remove nonexistent sensor with id: ${id}`);
      return;
    }
    const cleanupActive = state.active.sensorId === id;
    batch(() => {
      if (cleanupActive) {
        setState("active", "sensorId", null);
      }
      setState("sensors", id, void 0);
    });
  };
  const setOverlay = ({
    node,
    layout
  }) => {
    const existing = state.active.overlay;
    const overlay = {
      node,
      layout
    };
    if (!existing) {
      Object.defineProperties(overlay, {
        id: {
          enumerable: true,
          configurable: true,
          get: () => state.active.draggable?.id
        },
        data: {
          enumerable: true,
          configurable: true,
          get: () => state.active.draggable?.data
        },
        transformers: {
          enumerable: true,
          configurable: true,
          get: () => Object.fromEntries(Object.entries(state.active.draggable ? state.active.draggable.transformers : {}).filter(([id]) => id !== "addDraggable-existing-offset"))
        },
        transform: {
          enumerable: true,
          configurable: true,
          get: () => {
            const transformers = Object.values(state.active.overlay ? state.active.overlay.transformers : []);
            transformers.sort((a, b) => a.order - b.order);
            return transformers.reduce((transform, transformer) => {
              return transformer.callback(transform);
            }, noopTransform());
          }
        },
        transformed: {
          enumerable: true,
          configurable: true,
          get: () => {
            return state.active.overlay ? transformLayout(state.active.overlay.layout, state.active.overlay.transform) : new Layout({
              x: 0,
              y: 0,
              width: 0,
              height: 0
            });
          }
        }
      });
    }
    setState("active", "overlay", overlay);
  };
  const clearOverlay = () => setState("active", "overlay", null);
  const sensorStart = (id, coordinates) => {
    batch(() => {
      setState("sensors", id, "coordinates", {
        origin: {
          ...coordinates
        },
        current: {
          ...coordinates
        }
      });
      setState("active", "sensorId", id);
    });
  };
  const sensorMove = coordinates => {
    const sensorId = state.active.sensorId;
    if (!sensorId) {
      console.warn("Cannot move sensor when no sensor active.");
      return;
    }
    setState("sensors", sensorId, "coordinates", "current", {
      ...coordinates
    });
  };
  const sensorEnd = () => setState("active", "sensorId", null);
  const draggableActivators = (draggableId, asHandlers) => {
    const eventMap = {};
    for (const sensor of Object.values(state.sensors)) {
      if (sensor) {
        for (const [type, activator] of Object.entries(sensor.activators)) {
          eventMap[type] ??= [];
          eventMap[type].push({
            sensor,
            activator
          });
        }
      }
    }
    const listeners = {};
    for (const key in eventMap) {
      let handlerKey = key;
      if (asHandlers) {
        handlerKey = `on${key}`;
      }
      listeners[handlerKey] = event => {
        for (const {
          activator
        } of eventMap[key]) {
          if (state.active.sensor) {
            break;
          }
          activator(event, draggableId);
        }
      };
    }
    return listeners;
  };
  const recomputeLayouts = () => {
    let anyLayoutChanged = false;
    const draggables = Object.values(state.draggables);
    const droppables = Object.values(state.droppables);
    const overlay = state.active.overlay;
    batch(() => {
      const cache = /* @__PURE__ */new WeakMap();
      for (const draggable of draggables) {
        if (draggable) {
          const currentLayout = draggable.layout;
          if (!cache.has(draggable.node)) cache.set(draggable.node, elementLayout(draggable.node));
          const layout = cache.get(draggable.node);
          if (!layoutsAreEqual(currentLayout, layout)) {
            setState("draggables", draggable.id, "layout", layout);
            anyLayoutChanged = true;
          }
        }
      }
      for (const droppable of droppables) {
        if (droppable) {
          const currentLayout = droppable.layout;
          if (!cache.has(droppable.node)) cache.set(droppable.node, elementLayout(droppable.node));
          const layout = cache.get(droppable.node);
          if (!layoutsAreEqual(currentLayout, layout)) {
            setState("droppables", droppable.id, "layout", layout);
            anyLayoutChanged = true;
          }
        }
      }
      if (overlay) {
        const currentLayout = overlay.layout;
        const layout = elementLayout(overlay.node);
        if (!layoutsAreEqual(currentLayout, layout)) {
          setState("active", "overlay", "layout", layout);
          anyLayoutChanged = true;
        }
      }
    });
    return anyLayoutChanged;
  };
  const detectCollisions = () => {
    const draggable = state.active.overlay ?? state.active.draggable;
    if (draggable) {
      const droppable = props.collisionDetector(draggable, Object.values(state.droppables), {
        activeDroppableId: state.active.droppableId
      });
      const droppableId = droppable ? droppable.id : null;
      if (state.active.droppableId !== droppableId) {
        setState("active", "droppableId", droppableId);
      }
    }
  };
  const dragStart = draggableId => {
    const transformer = {
      id: "sensorMove",
      order: 0,
      callback: transform => {
        if (state.active.sensor) {
          return {
            x: transform.x + state.active.sensor.coordinates.delta.x,
            y: transform.y + state.active.sensor.coordinates.delta.y
          };
        }
        return transform;
      }
    };
    recomputeLayouts();
    batch(() => {
      setState("active", "draggableId", draggableId);
      addTransformer("draggables", draggableId, transformer);
    });
    detectCollisions();
  };
  const dragEnd = () => {
    const draggableId = untrack(() => state.active.draggableId);
    batch(() => {
      if (draggableId !== null) {
        removeTransformer("draggables", draggableId, "sensorMove");
      }
      setState("active", ["draggableId", "droppableId"], null);
    });
    recomputeLayouts();
  };
  const onDragStart = handler => {
    createEffect(() => {
      const draggable = state.active.draggable;
      if (draggable) {
        untrack(() => handler({
          draggable
        }));
      }
    });
  };
  const onDragMove = handler => {
    createEffect(() => {
      const draggable = state.active.draggable;
      if (draggable) {
        const overlay = untrack(() => state.active.overlay);
        Object.values(overlay ? overlay.transform : draggable.transform);
        untrack(() => handler({
          draggable,
          overlay
        }));
      }
    });
  };
  const onDragOver = handler => {
    createEffect(() => {
      const draggable = state.active.draggable;
      const droppable = state.active.droppable;
      if (draggable) {
        untrack(() => handler({
          draggable,
          droppable,
          overlay: state.active.overlay
        }));
      }
    });
  };
  const onDragEnd = handler => {
    createEffect(({
      previousDraggable,
      previousDroppable,
      previousOverlay
    }) => {
      const draggable = state.active.draggable;
      const droppable = draggable ? state.active.droppable : null;
      const overlay = draggable ? state.active.overlay : null;
      if (!draggable && previousDraggable) {
        untrack(() => handler({
          draggable: previousDraggable,
          droppable: previousDroppable,
          overlay: previousOverlay
        }));
      }
      return {
        previousDraggable: draggable,
        previousDroppable: droppable,
        previousOverlay: overlay
      };
    }, {
      previousDraggable: null,
      previousDroppable: null,
      previousOverlay: null
    });
  };
  onDragMove(() => detectCollisions());
  props.onDragStart && onDragStart(props.onDragStart);
  props.onDragMove && onDragMove(props.onDragMove);
  props.onDragOver && onDragOver(props.onDragOver);
  props.onDragEnd && onDragEnd(props.onDragEnd);
  const actions = {
    addTransformer,
    removeTransformer,
    addDraggable,
    removeDraggable,
    addDroppable,
    removeDroppable,
    addSensor,
    removeSensor,
    setOverlay,
    clearOverlay,
    recomputeLayouts,
    detectCollisions,
    draggableActivators,
    sensorStart,
    sensorMove,
    sensorEnd,
    dragStart,
    dragEnd,
    onDragStart,
    onDragMove,
    onDragOver,
    onDragEnd
  };
  const context = [state, actions];
  return _$createComponent(Context.Provider, {
    value: context,
    get children() {
      return props.children;
    }
  });
};
var useDragDropContext = () => {
  return useContext(Context) || null;
};
 
// src/create-pointer-sensor.ts
import { onCleanup, onMount } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
var createPointerSensor = (id = "pointer-sensor") => {
  const [state, {
    addSensor,
    removeSensor,
    sensorStart,
    sensorMove,
    sensorEnd,
    dragStart,
    dragEnd
  }] = useDragDropContext();
  const activationDelay = 250;
  const activationDistance = 10;
  onMount(() => {
    addSensor({
      id,
      activators: {
        pointerdown: attach
      }
    });
  });
  onCleanup(() => {
    removeSensor(id);
  });
  const isActiveSensor = () => state.active.sensorId === id;
  const initialCoordinates = {
    x: 0,
    y: 0
  };
  let activationDelayTimeoutId = null;
  let activationDraggableId = null;
  const attach = (event, draggableId) => {
    if (event.button !== 0) return;
    document.addEventListener("pointermove", onPointerMove);
    document.addEventListener("pointerup", onPointerUp);
    activationDraggableId = draggableId;
    initialCoordinates.x = event.clientX;
    initialCoordinates.y = event.clientY;
    activationDelayTimeoutId = window.setTimeout(onActivate, activationDelay);
  };
  const detach = () => {
    if (activationDelayTimeoutId) {
      clearTimeout(activationDelayTimeoutId);
      activationDelayTimeoutId = null;
    }
    document.removeEventListener("pointermove", onPointerMove);
    document.removeEventListener("pointerup", onPointerUp);
    document.removeEventListener("selectionchange", clearSelection);
  };
  const onActivate = () => {
    if (!state.active.sensor) {
      sensorStart(id, initialCoordinates);
      dragStart(activationDraggableId);
      clearSelection();
      document.addEventListener("selectionchange", clearSelection);
    } else if (!isActiveSensor()) {
      detach();
    }
  };
  const onPointerMove = event => {
    const coordinates = {
      x: event.clientX,
      y: event.clientY
    };
    if (!state.active.sensor) {
      const transform = {
        x: coordinates.x - initialCoordinates.x,
        y: coordinates.y - initialCoordinates.y
      };
      if (Math.sqrt(transform.x ** 2 + transform.y ** 2) > activationDistance) {
        onActivate();
      }
    }
    if (isActiveSensor()) {
      event.preventDefault();
      sensorMove(coordinates);
    }
  };
  const onPointerUp = event => {
    detach();
    if (isActiveSensor()) {
      event.preventDefault();
      dragEnd();
      sensorEnd();
    }
  };
  const clearSelection = () => {
    window.getSelection()?.removeAllRanges();
  };
};
 
// src/drag-drop-sensors.tsx
var DragDropSensors = props => {
  createPointerSensor();
  return _$memo(() => props.children);
};
 
// src/create-draggable.ts
import { createEffect as createEffect2, createSignal, onCleanup as onCleanup2, onMount as onMount2 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
 
// src/style.ts
var layoutStyle = layout => {
  return {
    top: `${layout.y}px`,
    left: `${layout.x}px`,
    width: `${layout.width}px`,
    height: `${layout.height}px`
  };
};
var transformStyle = transform => {
  return {
    transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`
  };
};
var maybeTransformStyle = transform => {
  return transformsAreEqual(transform, noopTransform()) ? {} : transformStyle(transform);
};
 
// src/create-draggable.ts
var createDraggable = (id, data = {}) => {
  const [state, {
    addDraggable,
    removeDraggable,
    draggableActivators
  }] = useDragDropContext();
  const [node, setNode] = createSignal(null);
  onMount2(() => {
    const resolvedNode = node();
    if (resolvedNode) {
      addDraggable({
        id,
        node: resolvedNode,
        layout: elementLayout(resolvedNode),
        data
      });
    }
  });
  onCleanup2(() => removeDraggable(id));
  const isActiveDraggable = () => state.active.draggableId === id;
  const transform = () => {
    return state.draggables[id]?.transform || noopTransform();
  };
  const draggable = Object.defineProperties((element, accessor) => {
    const config = accessor ? accessor() : {};
    createEffect2(() => {
      const resolvedNode = node();
      const activators = draggableActivators(id);
      if (resolvedNode) {
        for (const key in activators) {
          resolvedNode.addEventListener(key, activators[key]);
        }
      }
      onCleanup2(() => {
        if (resolvedNode) {
          for (const key in activators) {
            resolvedNode.removeEventListener(key, activators[key]);
          }
        }
      });
    });
    setNode(element);
    if (!config.skipTransform) {
      createEffect2(() => {
        const resolvedTransform = transform();
        if (!transformsAreEqual(resolvedTransform, noopTransform())) {
          const style = transformStyle(transform());
          element.style.setProperty("transform", style.transform ?? null);
        } else {
          element.style.removeProperty("transform");
        }
      });
    }
  }, {
    ref: {
      enumerable: true,
      value: setNode
    },
    isActiveDraggable: {
      enumerable: true,
      get: isActiveDraggable
    },
    dragActivators: {
      enumerable: true,
      get: () => {
        return draggableActivators(id, true);
      }
    },
    transform: {
      enumerable: true,
      get: transform
    }
  });
  return draggable;
};
 
// src/create-droppable.ts
import { createEffect as createEffect3, createSignal as createSignal2, onCleanup as onCleanup3, onMount as onMount3 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
var createDroppable = (id, data = {}) => {
  const [state, {
    addDroppable,
    removeDroppable
  }] = useDragDropContext();
  const [node, setNode] = createSignal2(null);
  onMount3(() => {
    const resolvedNode = node();
    if (resolvedNode) {
      addDroppable({
        id,
        node: resolvedNode,
        layout: elementLayout(resolvedNode),
        data
      });
    }
  });
  onCleanup3(() => removeDroppable(id));
  const isActiveDroppable = () => state.active.droppableId === id;
  const transform = () => {
    return state.droppables[id]?.transform || noopTransform();
  };
  const droppable = Object.defineProperties((element, accessor) => {
    const config = accessor ? accessor() : {};
    setNode(element);
    if (!config.skipTransform) {
      createEffect3(() => {
        const resolvedTransform = transform();
        if (!transformsAreEqual(resolvedTransform, noopTransform())) {
          const style = transformStyle(transform());
          element.style.setProperty("transform", style.transform ?? null);
        } else {
          element.style.removeProperty("transform");
        }
      });
    }
  }, {
    ref: {
      enumerable: true,
      value: setNode
    },
    isActiveDroppable: {
      enumerable: true,
      get: isActiveDroppable
    },
    transform: {
      enumerable: true,
      get: transform
    }
  });
  return droppable;
};
 
// src/drag-overlay.tsx
import { Portal } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
import { Show } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
var DragOverlay = props => {
  const [state, {
    onDragStart,
    onDragEnd,
    setOverlay,
    clearOverlay
  }] = useDragDropContext();
  let node;
  onDragStart(({
    draggable
  }) => {
    setOverlay({
      node: draggable.node,
      layout: draggable.layout
    });
    queueMicrotask(() => {
      if (node) {
        const layout = elementLayout(node);
        const delta = {
          x: (draggable.layout.width - layout.width) / 2,
          y: (draggable.layout.height - layout.height) / 2
        };
        layout.x += delta.x;
        layout.y += delta.y;
        setOverlay({
          node,
          layout
        });
      }
    });
  });
  onDragEnd(() => queueMicrotask(clearOverlay));
  const style = () => {
    const overlay = state.active.overlay;
    const draggable = state.active.draggable;
    if (!overlay || !draggable) return {};
    return {
      position: "fixed",
      transition: "transform 0s",
      top: `${overlay.layout.top}px`,
      left: `${overlay.layout.left}px`,
      "min-width": `${draggable.layout.width}px`,
      "min-height": `${draggable.layout.height}px`,
      ...transformStyle(overlay.transform),
      ...props.style
    };
  };
  return _$createComponent(Portal, {
    get mount() {
      return document.body;
    },
    get children() {
      return _$createComponent(Show, {
        get when() {
          return state.active.draggable;
        },
        get children() {
          const _el$ = _tmpl$();
          const _ref$ = node;
          typeof _ref$ === "function" ? _$use(_ref$, _el$) : node = _el$;
          _$insert(_el$, (() => {
            const _c$ = _$memo(() => typeof props.children === "function");
            return () => _c$() ? props.children(state.active.draggable) : props.children;
          })());
          _$effect(_p$ => {
            const _v$ = props.class,
              _v$2 = style();
            _v$ !== _p$._v$ && _$className(_el$, _p$._v$ = _v$);
            _p$._v$2 = _$style(_el$, _v$2, _p$._v$2);
            return _p$;
          }, {
            _v$: undefined,
            _v$2: undefined
          });
          return _el$;
        }
      });
    }
  });
};
 
// src/sortable-context.tsx
import { createContext as createContext2, createEffect as createEffect4, untrack as untrack2, useContext as useContext2 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { createStore as createStore2 } from "/node_modules/.vite/deps/solid-js_store.js?v=93754656";
 
// src/move-array-item.ts
var moveArrayItem = (array, fromIndex, toIndex) => {
  const newArray = array.slice();
  newArray.splice(toIndex, 0, ...newArray.splice(fromIndex, 1));
  return newArray;
};
 
// src/sortable-context.tsx
var Context2 = createContext2();
var SortableProvider = props => {
  const [dndState] = useDragDropContext();
  const [state, setState] = createStore2({
    initialIds: [],
    sortedIds: []
  });
  const isValidIndex = index => {
    return index >= 0 && index < state.initialIds.length;
  };
  createEffect4(() => {
    setState("initialIds", [...props.ids]);
    setState("sortedIds", [...props.ids]);
  });
  createEffect4(() => {
    if (dndState.active.draggableId && dndState.active.droppableId) {
      untrack2(() => {
        const fromIndex = state.sortedIds.indexOf(dndState.active.draggableId);
        const toIndex = state.initialIds.indexOf(dndState.active.droppableId);
        if (!isValidIndex(fromIndex) || !isValidIndex(toIndex)) {
          setState("sortedIds", [...props.ids]);
        } else if (fromIndex !== toIndex) {
          const resorted = moveArrayItem(state.sortedIds, fromIndex, toIndex);
          setState("sortedIds", resorted);
        }
      });
    } else {
      setState("sortedIds", [...props.ids]);
    }
  });
  const actions = {};
  const context = [state, actions];
  return _$createComponent(Context2.Provider, {
    value: context,
    get children() {
      return props.children;
    }
  });
};
var useSortableContext = () => {
  return useContext2(Context2) || null;
};
 
// src/create-sortable.ts
import { createEffect as createEffect5, onCleanup as onCleanup4, onMount as onMount4 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
 
// src/combine-refs.ts
var combineRefs = (setRefA, setRefB) => {
  return ref => {
    setRefA(ref);
    setRefB(ref);
  };
};
 
// src/create-sortable.ts
var createSortable = (id, data = {}) => {
  const [dndState, {
    addTransformer,
    removeTransformer
  }] = useDragDropContext();
  const [sortableState] = useSortableContext();
  const draggable = createDraggable(id, data);
  const droppable = createDroppable(id, data);
  const setNode = combineRefs(draggable.ref, droppable.ref);
  const initialIndex = () => sortableState.initialIds.indexOf(id);
  const currentIndex = () => sortableState.sortedIds.indexOf(id);
  const layoutById = id2 => dndState.droppables[id2]?.layout || null;
  const sortedTransform = () => {
    const delta = noopTransform();
    const resolvedInitialIndex = initialIndex();
    const resolvedCurrentIndex = currentIndex();
    if (resolvedCurrentIndex !== resolvedInitialIndex) {
      const currentLayout = layoutById(id);
      const targetLayout = layoutById(sortableState.initialIds[resolvedCurrentIndex]);
      if (currentLayout && targetLayout) {
        delta.x = targetLayout.x - currentLayout.x;
        delta.y = targetLayout.y - currentLayout.y;
      }
    }
    return delta;
  };
  const transformer = {
    id: "sortableOffset",
    order: 100,
    callback: transform2 => {
      const delta = sortedTransform();
      return {
        x: transform2.x + delta.x,
        y: transform2.y + delta.y
      };
    }
  };
  onMount4(() => addTransformer("droppables", id, transformer));
  onCleanup4(() => removeTransformer("droppables", id, transformer.id));
  const transform = () => {
    return (id === dndState.active.draggableId && !dndState.active.overlay ? dndState.draggables[id]?.transform : dndState.droppables[id]?.transform) || noopTransform();
  };
  const sortable = Object.defineProperties(element => {
    draggable(element, () => ({
      skipTransform: true
    }));
    droppable(element, () => ({
      skipTransform: true
    }));
    createEffect5(() => {
      const resolvedTransform = transform();
      if (!transformsAreEqual(resolvedTransform, noopTransform())) {
        const style = transformStyle(transform());
        element.style.setProperty("transform", style.transform ?? null);
      } else {
        element.style.removeProperty("transform");
      }
    });
  }, {
    ref: {
      enumerable: true,
      value: setNode
    },
    transform: {
      enumerable: true,
      get: transform
    },
    isActiveDraggable: {
      enumerable: true,
      get: () => draggable.isActiveDraggable
    },
    dragActivators: {
      enumerable: true,
      get: () => draggable.dragActivators
    },
    isActiveDroppable: {
      enumerable: true,
      get: () => droppable.isActiveDroppable
    }
  });
  return sortable;
};
 
// src/drag-drop-debugger.tsx
import { For, mergeProps as mergeProps2, onCleanup as onCleanup5, onMount as onMount5, Show as Show2 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
import { Portal as Portal2 } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
var Highlighter = props => {
  props = mergeProps2({
    color: "red",
    active: false
  }, props);
  return (() => {
    const _el$2 = _tmpl$();
    _$insert(_el$2, () => props.id);
    _$effect(_$p => _$style(_el$2, {
      position: "fixed",
      "pointer-events": "none",
      ...layoutStyle(props.layout),
      outline: "1px dashed",
      "outline-width": props.active ? "4px" : "1px",
      "outline-color": props.color,
      display: "flex",
      color: props.color,
      "align-items": "flex-end",
      "justify-content": "flex-end",
      ...props.style
    }, _$p));
    return _el$2;
  })();
};
var DragDropDebugger = () => {
  const [state, {
    recomputeLayouts
  }] = useDragDropContext();
  let ticking = false;
  const update = () => {
    if (!ticking) {
      window.requestAnimationFrame(function () {
        recomputeLayouts();
        ticking = false;
      });
      ticking = true;
    }
  };
  onMount5(() => {
    document.addEventListener("scroll", update);
  });
  onCleanup5(() => {
    document.removeEventListener("scroll", update);
  });
  return _$createComponent(Portal2, {
    get mount() {
      return document.body;
    },
    get children() {
      return [_$createComponent(For, {
        get each() {
          return Object.values(state.droppables);
        },
        children: droppable => droppable ? _$createComponent(Highlighter, {
          get id() {
            return droppable.id;
          },
          get layout() {
            return droppable.layout;
          },
          get active() {
            return droppable.id === state.active.droppableId;
          }
        }) : null
      }), _$createComponent(For, {
        get each() {
          return Object.values(state.draggables);
        },
        children: draggable => draggable ? _$createComponent(Highlighter, {
          get id() {
            return draggable.id;
          },
          get layout() {
            return draggable.layout;
          },
          get active() {
            return draggable.id === state.active.draggableId;
          },
          color: "blue",
          get style() {
            return {
              "align-items": "flex-start",
              "justify-content": "flex-start",
              ...transformStyle(draggable.transform)
            };
          }
        }) : null
      }), _$createComponent(Show2, {
        get when() {
          return state.active.overlay;
        },
        keyed: true,
        children: overlay => _$createComponent(Highlighter, {
          get id() {
            return overlay.id;
          },
          get layout() {
            return overlay.layout;
          },
          active: true,
          color: "orange",
          get style() {
            return {
              ...transformStyle(overlay.transform)
            };
          }
        })
      })];
    }
  });
};
export { DragDropDebugger, DragDropProvider, DragDropSensors, DragOverlay, SortableProvider, closestCenter, closestCorners, createDraggable, createDroppable, createPointerSensor, createSortable, layoutStyle, maybeTransformStyle, mostIntersecting, transformStyle, useDragDropContext, useSortableContext };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXRjaCIsImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVFZmZlY3QiLCJtZXJnZVByb3BzIiwidW50cmFjayIsInVzZUNvbnRleHQiLCJjcmVhdGVTdG9yZSIsIkxheW91dCIsIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJjb25zdHJ1Y3RvciIsInJlY3QiLCJNYXRoIiwiZmxvb3IiLCJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJjZW50ZXIiLCJjb3JuZXJzIiwidG9wTGVmdCIsInRvcFJpZ2h0IiwiYm90dG9tUmlnaHQiLCJib3R0b21MZWZ0IiwiZWxlbWVudExheW91dCIsImVsZW1lbnQiLCJsYXlvdXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0cmFuc2Zvcm0iLCJnZXRDb21wdXRlZFN0eWxlIiwic3RyaXBUcmFuc2Zvcm1Gcm9tTGF5b3V0IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJzdGFydHNXaXRoIiwibWF0cml4Iiwic2xpY2UiLCJzcGxpdCIsIm5vb3BUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zQXJlRXF1YWwiLCJmaXJzdFRyYW5zZm9ybSIsInNlY29uZFRyYW5zZm9ybSIsInRyYW5zZm9ybUxheW91dCIsImRpc3RhbmNlQmV0d2VlblBvaW50cyIsImZpcnN0UG9pbnQiLCJzZWNvbmRQb2ludCIsInNxcnQiLCJwb3ciLCJpbnRlcnNlY3Rpb25SYXRpb09mTGF5b3V0cyIsImZpcnN0TGF5b3V0Iiwic2Vjb25kTGF5b3V0IiwibWF4IiwibWluIiwibGF5b3V0MUFyZWEiLCJsYXlvdXQyQXJlYSIsImludGVyc2VjdGlvbkFyZWEiLCJsYXlvdXRzQXJlRXF1YWwiLCJjbG9zZXN0Q2VudGVyIiwiZHJhZ2dhYmxlIiwiZHJvcHBhYmxlcyIsImNvbnRleHQiLCJwb2ludDEiLCJ0cmFuc2Zvcm1lZCIsImNvbGxpc2lvbiIsImRpc3RhbmNlIiwiSW5maW5pdHkiLCJkcm9wcGFibGUiLCJpZCIsImFjdGl2ZURyb3BwYWJsZUlkIiwiY2xvc2VzdENvcm5lcnMiLCJkcmFnZ2FibGVDb3JuZXJzIiwiZHJvcHBhYmxlQ29ybmVycyIsIm1vc3RJbnRlcnNlY3RpbmciLCJkcmFnZ2FibGVMYXlvdXQiLCJyYXRpbyIsIkNvbnRleHQiLCJEcmFnRHJvcFByb3ZpZGVyIiwicGFzc2VkUHJvcHMiLCJwcm9wcyIsImNvbGxpc2lvbkRldGVjdG9yIiwic3RhdGUiLCJzZXRTdGF0ZSIsImRyYWdnYWJsZXMiLCJzZW5zb3JzIiwiYWN0aXZlIiwiZHJhZ2dhYmxlSWQiLCJkcm9wcGFibGVJZCIsInNlbnNvcklkIiwic2Vuc29yIiwib3ZlcmxheSIsImFkZFRyYW5zZm9ybWVyIiwidHlwZSIsInRyYW5zZm9ybWVyIiwiZGlzcGxheVR5cGUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJjb25zb2xlIiwid2FybiIsInJlbW92ZVRyYW5zZm9ybWVyIiwidHJhbnNmb3JtZXJJZCIsImFkZERyYWdnYWJsZSIsIm5vZGUiLCJkYXRhIiwiZXhpc3RpbmdEcmFnZ2FibGUiLCJfcGVuZGluZ0NsZWFudXAiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidHJhbnNmb3JtZXJzIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwidmFsdWUiLCJnZXQiLCJ2YWx1ZXMiLCJzb3J0IiwiYSIsImIiLCJvcmRlciIsInJlZHVjZSIsInRyYW5zZm9ybWVyMiIsImNhbGxiYWNrIiwibGF5b3V0RGVsdGEiLCJleGlzdGluZ1RyYW5zZm9ybWVyIiwidHJhbnNmb3JtT2Zmc2V0Iiwib25EcmFnRW5kIiwicmVjb21wdXRlTGF5b3V0cyIsInJlbW92ZURyYWdnYWJsZSIsInF1ZXVlTWljcm90YXNrIiwiY2xlYW51cERyYWdnYWJsZSIsImNsZWFudXBBY3RpdmUiLCJhZGREcm9wcGFibGUiLCJleGlzdGluZ0Ryb3BwYWJsZSIsInJlbW92ZURyb3BwYWJsZSIsImNsZWFudXBEcm9wcGFibGUiLCJhZGRTZW5zb3IiLCJhY3RpdmF0b3JzIiwiY29vcmRpbmF0ZXMiLCJvcmlnaW4iLCJjdXJyZW50IiwiZGVsdGEiLCJyZW1vdmVTZW5zb3IiLCJzZXRPdmVybGF5IiwiZXhpc3RpbmciLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJmaWx0ZXIiLCJjbGVhck92ZXJsYXkiLCJzZW5zb3JTdGFydCIsInNlbnNvck1vdmUiLCJzZW5zb3JFbmQiLCJkcmFnZ2FibGVBY3RpdmF0b3JzIiwiYXNIYW5kbGVycyIsImV2ZW50TWFwIiwiYWN0aXZhdG9yIiwicHVzaCIsImxpc3RlbmVycyIsImtleSIsImhhbmRsZXJLZXkiLCJldmVudCIsImFueUxheW91dENoYW5nZWQiLCJjYWNoZSIsIldlYWtNYXAiLCJjdXJyZW50TGF5b3V0IiwiaGFzIiwic2V0IiwiZGV0ZWN0Q29sbGlzaW9ucyIsImRyYWdTdGFydCIsImRyYWdFbmQiLCJvbkRyYWdTdGFydCIsImhhbmRsZXIiLCJvbkRyYWdNb3ZlIiwib25EcmFnT3ZlciIsInByZXZpb3VzRHJhZ2dhYmxlIiwicHJldmlvdXNEcm9wcGFibGUiLCJwcmV2aW91c092ZXJsYXkiLCJhY3Rpb25zIiwiXyRjcmVhdGVDb21wb25lbnQiLCJQcm92aWRlciIsImNoaWxkcmVuIiwidXNlRHJhZ0Ryb3BDb250ZXh0Iiwib25DbGVhbnVwIiwib25Nb3VudCIsImNyZWF0ZVBvaW50ZXJTZW5zb3IiLCJhY3RpdmF0aW9uRGVsYXkiLCJhY3RpdmF0aW9uRGlzdGFuY2UiLCJwb2ludGVyZG93biIsImF0dGFjaCIsImlzQWN0aXZlU2Vuc29yIiwiaW5pdGlhbENvb3JkaW5hdGVzIiwiYWN0aXZhdGlvbkRlbGF5VGltZW91dElkIiwiYWN0aXZhdGlvbkRyYWdnYWJsZUlkIiwiYnV0dG9uIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25Qb2ludGVyTW92ZSIsIm9uUG9pbnRlclVwIiwiY2xpZW50WCIsImNsaWVudFkiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Iiwib25BY3RpdmF0ZSIsImRldGFjaCIsImNsZWFyVGltZW91dCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjbGVhclNlbGVjdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiRHJhZ0Ryb3BTZW5zb3JzIiwiXyRtZW1vIiwiY3JlYXRlRWZmZWN0MiIsImNyZWF0ZVNpZ25hbCIsIm9uQ2xlYW51cDIiLCJvbk1vdW50MiIsImxheW91dFN0eWxlIiwidHJhbnNmb3JtU3R5bGUiLCJtYXliZVRyYW5zZm9ybVN0eWxlIiwiY3JlYXRlRHJhZ2dhYmxlIiwic2V0Tm9kZSIsInJlc29sdmVkTm9kZSIsImlzQWN0aXZlRHJhZ2dhYmxlIiwiYWNjZXNzb3IiLCJjb25maWciLCJza2lwVHJhbnNmb3JtIiwicmVzb2x2ZWRUcmFuc2Zvcm0iLCJzdHlsZSIsInNldFByb3BlcnR5IiwicmVtb3ZlUHJvcGVydHkiLCJyZWYiLCJkcmFnQWN0aXZhdG9ycyIsImNyZWF0ZUVmZmVjdDMiLCJjcmVhdGVTaWduYWwyIiwib25DbGVhbnVwMyIsIm9uTW91bnQzIiwiY3JlYXRlRHJvcHBhYmxlIiwiaXNBY3RpdmVEcm9wcGFibGUiLCJQb3J0YWwiLCJTaG93IiwiRHJhZ092ZXJsYXkiLCJwb3NpdGlvbiIsInRyYW5zaXRpb24iLCJtb3VudCIsImJvZHkiLCJ3aGVuIiwiX2VsJCIsIl90bXBsJCIsIl9yZWYkIiwiXyR1c2UiLCJfJGluc2VydCIsIl9jJCIsIl8kZWZmZWN0IiwiX3AkIiwiX3YkIiwiY2xhc3MiLCJfdiQyIiwiXyRjbGFzc05hbWUiLCJfJHN0eWxlIiwidW5kZWZpbmVkIiwiY3JlYXRlQ29udGV4dDIiLCJjcmVhdGVFZmZlY3Q0IiwidW50cmFjazIiLCJ1c2VDb250ZXh0MiIsImNyZWF0ZVN0b3JlMiIsIm1vdmVBcnJheUl0ZW0iLCJhcnJheSIsImZyb21JbmRleCIsInRvSW5kZXgiLCJuZXdBcnJheSIsInNwbGljZSIsIkNvbnRleHQyIiwiU29ydGFibGVQcm92aWRlciIsImRuZFN0YXRlIiwiaW5pdGlhbElkcyIsInNvcnRlZElkcyIsImlzVmFsaWRJbmRleCIsImluZGV4IiwiaWRzIiwiaW5kZXhPZiIsInJlc29ydGVkIiwidXNlU29ydGFibGVDb250ZXh0IiwiY3JlYXRlRWZmZWN0NSIsIm9uQ2xlYW51cDQiLCJvbk1vdW50NCIsImNvbWJpbmVSZWZzIiwic2V0UmVmQSIsInNldFJlZkIiLCJjcmVhdGVTb3J0YWJsZSIsInNvcnRhYmxlU3RhdGUiLCJpbml0aWFsSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJsYXlvdXRCeUlkIiwiaWQyIiwic29ydGVkVHJhbnNmb3JtIiwicmVzb2x2ZWRJbml0aWFsSW5kZXgiLCJyZXNvbHZlZEN1cnJlbnRJbmRleCIsInRhcmdldExheW91dCIsInRyYW5zZm9ybTIiLCJzb3J0YWJsZSIsIkZvciIsIm1lcmdlUHJvcHMyIiwib25DbGVhbnVwNSIsIm9uTW91bnQ1IiwiU2hvdzIiLCJQb3J0YWwyIiwiSGlnaGxpZ2h0ZXIiLCJjb2xvciIsIl9lbCQyIiwiXyRwIiwib3V0bGluZSIsImRpc3BsYXkiLCJEcmFnRHJvcERlYnVnZ2VyIiwidGlja2luZyIsInVwZGF0ZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImVhY2giLCJrZXllZCJdLCJzb3VyY2VzIjpbImRldi5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2RyYWctZHJvcC1jb250ZXh0LnRzeFxuaW1wb3J0IHtcbiAgYmF0Y2gsXG4gIGNyZWF0ZUNvbnRleHQsXG4gIGNyZWF0ZUVmZmVjdCxcbiAgbWVyZ2VQcm9wcyxcbiAgdW50cmFjayxcbiAgdXNlQ29udGV4dFxufSBmcm9tIFwic29saWQtanNcIjtcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSBcInNvbGlkLWpzL3N0b3JlXCI7XG5cbi8vIHNyYy9sYXlvdXQudHNcbnZhciBMYXlvdXQgPSBjbGFzcyB7XG4gIHg7XG4gIHk7XG4gIHdpZHRoO1xuICBoZWlnaHQ7XG4gIGNvbnN0cnVjdG9yKHJlY3QpIHtcbiAgICB0aGlzLnggPSBNYXRoLmZsb29yKHJlY3QueCk7XG4gICAgdGhpcy55ID0gTWF0aC5mbG9vcihyZWN0LnkpO1xuICAgIHRoaXMud2lkdGggPSBNYXRoLmZsb29yKHJlY3Qud2lkdGgpO1xuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5mbG9vcihyZWN0LmhlaWdodCk7XG4gIH1cbiAgZ2V0IHJlY3QoKSB7XG4gICAgcmV0dXJuIHsgeDogdGhpcy54LCB5OiB0aGlzLnksIHdpZHRoOiB0aGlzLndpZHRoLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0IH07XG4gIH1cbiAgZ2V0IGxlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMueDtcbiAgfVxuICBnZXQgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLnk7XG4gIH1cbiAgZ2V0IHJpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xuICB9XG4gIGdldCBib3R0b20oKSB7XG4gICAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICB9XG4gIGdldCBjZW50ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMueCArIHRoaXMud2lkdGggKiAwLjUsXG4gICAgICB5OiB0aGlzLnkgKyB0aGlzLmhlaWdodCAqIDAuNVxuICAgIH07XG4gIH1cbiAgZ2V0IGNvcm5lcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcExlZnQ6IHsgeDogdGhpcy5sZWZ0LCB5OiB0aGlzLnRvcCB9LFxuICAgICAgdG9wUmlnaHQ6IHsgeDogdGhpcy5yaWdodCwgeTogdGhpcy50b3AgfSxcbiAgICAgIGJvdHRvbVJpZ2h0OiB7IHg6IHRoaXMubGVmdCwgeTogdGhpcy5ib3R0b20gfSxcbiAgICAgIGJvdHRvbUxlZnQ6IHsgeDogdGhpcy5yaWdodCwgeTogdGhpcy5ib3R0b20gfVxuICAgIH07XG4gIH1cbn07XG52YXIgZWxlbWVudExheW91dCA9IChlbGVtZW50KSA9PiB7XG4gIGxldCBsYXlvdXQgPSBuZXcgTGF5b3V0KGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICBjb25zdCB7IHRyYW5zZm9ybSB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgaWYgKHRyYW5zZm9ybSkge1xuICAgIGxheW91dCA9IHN0cmlwVHJhbnNmb3JtRnJvbUxheW91dChsYXlvdXQsIHRyYW5zZm9ybSk7XG4gIH1cbiAgcmV0dXJuIGxheW91dDtcbn07XG52YXIgc3RyaXBUcmFuc2Zvcm1Gcm9tTGF5b3V0ID0gKGxheW91dCwgdHJhbnNmb3JtKSA9PiB7XG4gIGxldCB0cmFuc2xhdGVYLCB0cmFuc2xhdGVZO1xuICBpZiAodHJhbnNmb3JtLnN0YXJ0c1dpdGgoXCJtYXRyaXgzZChcIikpIHtcbiAgICBjb25zdCBtYXRyaXggPSB0cmFuc2Zvcm0uc2xpY2UoOSwgLTEpLnNwbGl0KC8sIC8pO1xuICAgIHRyYW5zbGF0ZVggPSArbWF0cml4WzEyXTtcbiAgICB0cmFuc2xhdGVZID0gK21hdHJpeFsxM107XG4gIH0gZWxzZSBpZiAodHJhbnNmb3JtLnN0YXJ0c1dpdGgoXCJtYXRyaXgoXCIpKSB7XG4gICAgY29uc3QgbWF0cml4ID0gdHJhbnNmb3JtLnNsaWNlKDcsIC0xKS5zcGxpdCgvLCAvKTtcbiAgICB0cmFuc2xhdGVYID0gK21hdHJpeFs0XTtcbiAgICB0cmFuc2xhdGVZID0gK21hdHJpeFs1XTtcbiAgfSBlbHNlIHtcbiAgICB0cmFuc2xhdGVYID0gMDtcbiAgICB0cmFuc2xhdGVZID0gMDtcbiAgfVxuICByZXR1cm4gbmV3IExheW91dCh7XG4gICAgLi4ubGF5b3V0LFxuICAgIHg6IGxheW91dC54IC0gdHJhbnNsYXRlWCxcbiAgICB5OiBsYXlvdXQueSAtIHRyYW5zbGF0ZVlcbiAgfSk7XG59O1xudmFyIG5vb3BUcmFuc2Zvcm0gPSAoKSA9PiAoeyB4OiAwLCB5OiAwIH0pO1xudmFyIHRyYW5zZm9ybXNBcmVFcXVhbCA9IChmaXJzdFRyYW5zZm9ybSwgc2Vjb25kVHJhbnNmb3JtKSA9PiB7XG4gIHJldHVybiBmaXJzdFRyYW5zZm9ybS54ID09PSBzZWNvbmRUcmFuc2Zvcm0ueCAmJiBmaXJzdFRyYW5zZm9ybS55ID09PSBzZWNvbmRUcmFuc2Zvcm0ueTtcbn07XG52YXIgdHJhbnNmb3JtTGF5b3V0ID0gKGxheW91dCwgdHJhbnNmb3JtKSA9PiB7XG4gIHJldHVybiBuZXcgTGF5b3V0KHtcbiAgICAuLi5sYXlvdXQsXG4gICAgeDogbGF5b3V0LnggKyB0cmFuc2Zvcm0ueCxcbiAgICB5OiBsYXlvdXQueSArIHRyYW5zZm9ybS55XG4gIH0pO1xufTtcbnZhciBkaXN0YW5jZUJldHdlZW5Qb2ludHMgPSAoZmlyc3RQb2ludCwgc2Vjb25kUG9pbnQpID0+IHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhmaXJzdFBvaW50LnggLSBzZWNvbmRQb2ludC54LCAyKSArIE1hdGgucG93KGZpcnN0UG9pbnQueSAtIHNlY29uZFBvaW50LnksIDIpXG4gICk7XG59O1xudmFyIGludGVyc2VjdGlvblJhdGlvT2ZMYXlvdXRzID0gKGZpcnN0TGF5b3V0LCBzZWNvbmRMYXlvdXQpID0+IHtcbiAgY29uc3QgdG9wID0gTWF0aC5tYXgoZmlyc3RMYXlvdXQudG9wLCBzZWNvbmRMYXlvdXQudG9wKTtcbiAgY29uc3QgbGVmdCA9IE1hdGgubWF4KGZpcnN0TGF5b3V0LmxlZnQsIHNlY29uZExheW91dC5sZWZ0KTtcbiAgY29uc3QgcmlnaHQgPSBNYXRoLm1pbihmaXJzdExheW91dC5yaWdodCwgc2Vjb25kTGF5b3V0LnJpZ2h0KTtcbiAgY29uc3QgYm90dG9tID0gTWF0aC5taW4oZmlyc3RMYXlvdXQuYm90dG9tLCBzZWNvbmRMYXlvdXQuYm90dG9tKTtcbiAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20pIHtcbiAgICBjb25zdCBsYXlvdXQxQXJlYSA9IGZpcnN0TGF5b3V0LndpZHRoICogZmlyc3RMYXlvdXQuaGVpZ2h0O1xuICAgIGNvbnN0IGxheW91dDJBcmVhID0gc2Vjb25kTGF5b3V0LndpZHRoICogc2Vjb25kTGF5b3V0LmhlaWdodDtcbiAgICBjb25zdCBpbnRlcnNlY3Rpb25BcmVhID0gd2lkdGggKiBoZWlnaHQ7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbkFyZWEgLyAobGF5b3V0MUFyZWEgKyBsYXlvdXQyQXJlYSAtIGludGVyc2VjdGlvbkFyZWEpO1xuICB9XG4gIHJldHVybiAwO1xufTtcbnZhciBsYXlvdXRzQXJlRXF1YWwgPSAoZmlyc3RMYXlvdXQsIHNlY29uZExheW91dCkgPT4ge1xuICByZXR1cm4gZmlyc3RMYXlvdXQueCA9PT0gc2Vjb25kTGF5b3V0LnggJiYgZmlyc3RMYXlvdXQueSA9PT0gc2Vjb25kTGF5b3V0LnkgJiYgZmlyc3RMYXlvdXQud2lkdGggPT09IHNlY29uZExheW91dC53aWR0aCAmJiBmaXJzdExheW91dC5oZWlnaHQgPT09IHNlY29uZExheW91dC5oZWlnaHQ7XG59O1xuXG4vLyBzcmMvY29sbGlzaW9uLnRzXG52YXIgY2xvc2VzdENlbnRlciA9IChkcmFnZ2FibGUsIGRyb3BwYWJsZXMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgcG9pbnQxID0gZHJhZ2dhYmxlLnRyYW5zZm9ybWVkLmNlbnRlcjtcbiAgY29uc3QgY29sbGlzaW9uID0geyBkaXN0YW5jZTogSW5maW5pdHksIGRyb3BwYWJsZTogbnVsbCB9O1xuICBmb3IgKGNvbnN0IGRyb3BwYWJsZSBvZiBkcm9wcGFibGVzKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMocG9pbnQxLCBkcm9wcGFibGUubGF5b3V0LmNlbnRlcik7XG4gICAgaWYgKGRpc3RhbmNlIDwgY29sbGlzaW9uLmRpc3RhbmNlKSB7XG4gICAgICBjb2xsaXNpb24uZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIGNvbGxpc2lvbi5kcm9wcGFibGUgPSBkcm9wcGFibGU7XG4gICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gY29sbGlzaW9uLmRpc3RhbmNlICYmIGRyb3BwYWJsZS5pZCA9PT0gY29udGV4dC5hY3RpdmVEcm9wcGFibGVJZCkge1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbGxpc2lvbi5kcm9wcGFibGU7XG59O1xudmFyIGNsb3Nlc3RDb3JuZXJzID0gKGRyYWdnYWJsZSwgZHJvcHBhYmxlcywgY29udGV4dCkgPT4ge1xuICBjb25zdCBkcmFnZ2FibGVDb3JuZXJzID0gZHJhZ2dhYmxlLnRyYW5zZm9ybWVkLmNvcm5lcnM7XG4gIGNvbnN0IGNvbGxpc2lvbiA9IHsgZGlzdGFuY2U6IEluZmluaXR5LCBkcm9wcGFibGU6IG51bGwgfTtcbiAgZm9yIChjb25zdCBkcm9wcGFibGUgb2YgZHJvcHBhYmxlcykge1xuICAgIGNvbnN0IGRyb3BwYWJsZUNvcm5lcnMgPSBkcm9wcGFibGUubGF5b3V0LmNvcm5lcnM7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMoXG4gICAgICBkcm9wcGFibGVDb3JuZXJzLnRvcExlZnQsXG4gICAgICBkcmFnZ2FibGVDb3JuZXJzLnRvcExlZnRcbiAgICApICsgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKFxuICAgICAgZHJvcHBhYmxlQ29ybmVycy50b3BSaWdodCxcbiAgICAgIGRyYWdnYWJsZUNvcm5lcnMudG9wUmlnaHRcbiAgICApICsgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKFxuICAgICAgZHJvcHBhYmxlQ29ybmVycy5ib3R0b21SaWdodCxcbiAgICAgIGRyYWdnYWJsZUNvcm5lcnMuYm90dG9tUmlnaHRcbiAgICApICsgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKFxuICAgICAgZHJvcHBhYmxlQ29ybmVycy5ib3R0b21MZWZ0LFxuICAgICAgZHJhZ2dhYmxlQ29ybmVycy5ib3R0b21MZWZ0XG4gICAgKTtcbiAgICBpZiAoZGlzdGFuY2UgPCBjb2xsaXNpb24uZGlzdGFuY2UpIHtcbiAgICAgIGNvbGxpc2lvbi5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID09PSBjb2xsaXNpb24uZGlzdGFuY2UgJiYgZHJvcHBhYmxlLmlkID09PSBjb250ZXh0LmFjdGl2ZURyb3BwYWJsZUlkKSB7XG4gICAgICBjb2xsaXNpb24uZHJvcHBhYmxlID0gZHJvcHBhYmxlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29sbGlzaW9uLmRyb3BwYWJsZTtcbn07XG52YXIgbW9zdEludGVyc2VjdGluZyA9IChkcmFnZ2FibGUsIGRyb3BwYWJsZXMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgZHJhZ2dhYmxlTGF5b3V0ID0gZHJhZ2dhYmxlLnRyYW5zZm9ybWVkO1xuICBjb25zdCBjb2xsaXNpb24gPSB7IHJhdGlvOiAwLCBkcm9wcGFibGU6IG51bGwgfTtcbiAgZm9yIChjb25zdCBkcm9wcGFibGUgb2YgZHJvcHBhYmxlcykge1xuICAgIGNvbnN0IHJhdGlvID0gaW50ZXJzZWN0aW9uUmF0aW9PZkxheW91dHMoZHJhZ2dhYmxlTGF5b3V0LCBkcm9wcGFibGUubGF5b3V0KTtcbiAgICBpZiAocmF0aW8gPiBjb2xsaXNpb24ucmF0aW8pIHtcbiAgICAgIGNvbGxpc2lvbi5yYXRpbyA9IHJhdGlvO1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9IGVsc2UgaWYgKHJhdGlvID4gMCAmJiByYXRpbyA9PT0gY29sbGlzaW9uLnJhdGlvICYmIGRyb3BwYWJsZS5pZCA9PT0gY29udGV4dC5hY3RpdmVEcm9wcGFibGVJZCkge1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbGxpc2lvbi5kcm9wcGFibGU7XG59O1xuXG4vLyBzcmMvZHJhZy1kcm9wLWNvbnRleHQudHN4XG52YXIgQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbnZhciBEcmFnRHJvcFByb3ZpZGVyID0gKHBhc3NlZFByb3BzKSA9PiB7XG4gIGNvbnN0IHByb3BzID0gbWVyZ2VQcm9wcyhcbiAgICB7IGNvbGxpc2lvbkRldGVjdG9yOiBtb3N0SW50ZXJzZWN0aW5nIH0sXG4gICAgcGFzc2VkUHJvcHNcbiAgKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBjcmVhdGVTdG9yZSh7XG4gICAgZHJhZ2dhYmxlczoge30sXG4gICAgZHJvcHBhYmxlczoge30sXG4gICAgc2Vuc29yczoge30sXG4gICAgYWN0aXZlOiB7XG4gICAgICBkcmFnZ2FibGVJZDogbnVsbCxcbiAgICAgIGdldCBkcmFnZ2FibGUoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlSWQgIT09IG51bGwgPyBzdGF0ZS5kcmFnZ2FibGVzW3N0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZF0gOiBudWxsO1xuICAgICAgfSxcbiAgICAgIGRyb3BwYWJsZUlkOiBudWxsLFxuICAgICAgZ2V0IGRyb3BwYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmFjdGl2ZS5kcm9wcGFibGVJZCAhPT0gbnVsbCA/IHN0YXRlLmRyb3BwYWJsZXNbc3RhdGUuYWN0aXZlLmRyb3BwYWJsZUlkXSA6IG51bGw7XG4gICAgICB9LFxuICAgICAgc2Vuc29ySWQ6IG51bGwsXG4gICAgICBnZXQgc2Vuc29yKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUuYWN0aXZlLnNlbnNvcklkICE9PSBudWxsID8gc3RhdGUuc2Vuc29yc1tzdGF0ZS5hY3RpdmUuc2Vuc29ySWRdIDogbnVsbDtcbiAgICAgIH0sXG4gICAgICBvdmVybGF5OiBudWxsXG4gICAgfVxuICB9KTtcbiAgY29uc3QgYWRkVHJhbnNmb3JtZXIgPSAodHlwZSwgaWQsIHRyYW5zZm9ybWVyKSA9PiB7XG4gICAgY29uc3QgZGlzcGxheVR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCB0eXBlLmxlbmd0aCAtIDEpO1xuICAgIGlmICghdW50cmFjaygoKSA9PiBzdGF0ZVt0eXBlXVtpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBDYW5ub3QgYWRkIHRyYW5zZm9ybWVyIHRvIG5vbmV4aXN0ZW50ICR7ZGlzcGxheVR5cGV9IHdpdGggaWQ6ICR7aWR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U3RhdGUodHlwZSwgaWQsIFwidHJhbnNmb3JtZXJzXCIsIHRyYW5zZm9ybWVyLmlkLCB0cmFuc2Zvcm1lcik7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVRyYW5zZm9ybWVyID0gKHR5cGUsIGlkLCB0cmFuc2Zvcm1lcklkKSA9PiB7XG4gICAgY29uc3QgZGlzcGxheVR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCB0eXBlLmxlbmd0aCAtIDEpO1xuICAgIGlmICghdW50cmFjaygoKSA9PiBzdGF0ZVt0eXBlXVtpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBDYW5ub3QgcmVtb3ZlIHRyYW5zZm9ybWVyIGZyb20gbm9uZXhpc3RlbnQgJHtkaXNwbGF5VHlwZX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXVudHJhY2soKCkgPT4gc3RhdGVbdHlwZV1baWRdW1widHJhbnNmb3JtZXJzXCJdW3RyYW5zZm9ybWVySWRdKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlbW92ZSBmcm9tICR7ZGlzcGxheVR5cGV9IHdpdGggaWQgJHtpZH0sIG5vbmV4aXN0ZW50IHRyYW5zZm9ybWVyIHdpdGggaWQ6ICR7dHJhbnNmb3JtZXJJZH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRTdGF0ZSh0eXBlLCBpZCwgXCJ0cmFuc2Zvcm1lcnNcIiwgdHJhbnNmb3JtZXJJZCwgdm9pZCAwKTtcbiAgfTtcbiAgY29uc3QgYWRkRHJhZ2dhYmxlID0gKHtcbiAgICBpZCxcbiAgICBub2RlLFxuICAgIGxheW91dCxcbiAgICBkYXRhXG4gIH0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ0RyYWdnYWJsZSA9IHN0YXRlLmRyYWdnYWJsZXNbaWRdO1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9IHtcbiAgICAgIGlkLFxuICAgICAgbm9kZSxcbiAgICAgIGxheW91dCxcbiAgICAgIGRhdGEsXG4gICAgICBfcGVuZGluZ0NsZWFudXA6IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgdHJhbnNmb3JtZXI7XG4gICAgaWYgKCFleGlzdGluZ0RyYWdnYWJsZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZHJhZ2dhYmxlLCB7XG4gICAgICAgIHRyYW5zZm9ybWVyczoge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB7fVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hY3RpdmUub3ZlcmxheSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9vcFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgc3RhdGUuZHJhZ2dhYmxlc1tpZF0udHJhbnNmb3JtZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdHJhbnNmb3JtZXJzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcnMucmVkdWNlKFxuICAgICAgICAgICAgICAodHJhbnNmb3JtLCB0cmFuc2Zvcm1lcjIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIyLmNhbGxiYWNrKHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5vb3BUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTGF5b3V0KFxuICAgICAgICAgICAgICBzdGF0ZS5kcmFnZ2FibGVzW2lkXS5sYXlvdXQsXG4gICAgICAgICAgICAgIHN0YXRlLmRyYWdnYWJsZXNbaWRdLnRyYW5zZm9ybVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuYWN0aXZlLmRyYWdnYWJsZUlkID09PSBpZCAmJiAhc3RhdGUuYWN0aXZlLm92ZXJsYXkpIHtcbiAgICAgIGNvbnN0IGxheW91dERlbHRhID0ge1xuICAgICAgICB4OiBleGlzdGluZ0RyYWdnYWJsZS5sYXlvdXQueCAtIGxheW91dC54LFxuICAgICAgICB5OiBleGlzdGluZ0RyYWdnYWJsZS5sYXlvdXQueSAtIGxheW91dC55XG4gICAgICB9O1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXJJZCA9IFwiYWRkRHJhZ2dhYmxlLWV4aXN0aW5nLW9mZnNldFwiO1xuICAgICAgY29uc3QgZXhpc3RpbmdUcmFuc2Zvcm1lciA9IGV4aXN0aW5nRHJhZ2dhYmxlLnRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcklkXTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybU9mZnNldCA9IGV4aXN0aW5nVHJhbnNmb3JtZXIgPyBleGlzdGluZ1RyYW5zZm9ybWVyLmNhbGxiYWNrKGxheW91dERlbHRhKSA6IGxheW91dERlbHRhO1xuICAgICAgdHJhbnNmb3JtZXIgPSB7XG4gICAgICAgIGlkOiB0cmFuc2Zvcm1lcklkLFxuICAgICAgICBvcmRlcjogMTAwLFxuICAgICAgICBjYWxsYmFjazogKHRyYW5zZm9ybSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB0cmFuc2Zvcm0ueCArIHRyYW5zZm9ybU9mZnNldC54LFxuICAgICAgICAgICAgeTogdHJhbnNmb3JtLnkgKyB0cmFuc2Zvcm1PZmZzZXQueVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvbkRyYWdFbmQoKCkgPT4gcmVtb3ZlVHJhbnNmb3JtZXIoXCJkcmFnZ2FibGVzXCIsIGlkLCB0cmFuc2Zvcm1lcklkKSk7XG4gICAgfVxuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIHNldFN0YXRlKFwiZHJhZ2dhYmxlc1wiLCBpZCwgZHJhZ2dhYmxlKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1lcikge1xuICAgICAgICBhZGRUcmFuc2Zvcm1lcihcImRyYWdnYWJsZXNcIiwgaWQsIHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc3RhdGUuYWN0aXZlLmRyYWdnYWJsZSkge1xuICAgICAgcmVjb21wdXRlTGF5b3V0cygpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlRHJhZ2dhYmxlID0gKGlkKSA9PiB7XG4gICAgaWYgKCF1bnRyYWNrKCgpID0+IHN0YXRlLmRyYWdnYWJsZXNbaWRdKSkge1xuICAgICAgY29uc29sZS53YXJuKGBDYW5ub3QgcmVtb3ZlIG5vbmV4aXN0ZW50IGRyYWdnYWJsZSB3aXRoIGlkOiAke2lkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRTdGF0ZShcImRyYWdnYWJsZXNcIiwgaWQsIFwiX3BlbmRpbmdDbGVhbnVwXCIsIHRydWUpO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNsZWFudXBEcmFnZ2FibGUoaWQpKTtcbiAgfTtcbiAgY29uc3QgY2xlYW51cERyYWdnYWJsZSA9IChpZCkgPT4ge1xuICAgIGlmIChzdGF0ZS5kcmFnZ2FibGVzW2lkXT8uX3BlbmRpbmdDbGVhbnVwKSB7XG4gICAgICBjb25zdCBjbGVhbnVwQWN0aXZlID0gc3RhdGUuYWN0aXZlLmRyYWdnYWJsZUlkID09PSBpZDtcbiAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXBBY3RpdmUpIHtcbiAgICAgICAgICBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcImRyYWdnYWJsZUlkXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHNldFN0YXRlKFwiZHJhZ2dhYmxlc1wiLCBpZCwgdm9pZCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWRkRHJvcHBhYmxlID0gKHtcbiAgICBpZCxcbiAgICBub2RlLFxuICAgIGxheW91dCxcbiAgICBkYXRhXG4gIH0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ0Ryb3BwYWJsZSA9IHN0YXRlLmRyb3BwYWJsZXNbaWRdO1xuICAgIGNvbnN0IGRyb3BwYWJsZSA9IHtcbiAgICAgIGlkLFxuICAgICAgbm9kZSxcbiAgICAgIGxheW91dCxcbiAgICAgIGRhdGEsXG4gICAgICBfcGVuZGluZ0NsZWFudXA6IGZhbHNlXG4gICAgfTtcbiAgICBpZiAoIWV4aXN0aW5nRHJvcHBhYmxlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkcm9wcGFibGUsIHtcbiAgICAgICAgdHJhbnNmb3JtZXJzOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgc3RhdGUuZHJvcHBhYmxlc1tpZF0udHJhbnNmb3JtZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdHJhbnNmb3JtZXJzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcnMucmVkdWNlKFxuICAgICAgICAgICAgICAodHJhbnNmb3JtLCB0cmFuc2Zvcm1lcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5jYWxsYmFjayh0cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub29wVHJhbnNmb3JtKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm1lZDoge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUxheW91dChcbiAgICAgICAgICAgICAgc3RhdGUuZHJvcHBhYmxlc1tpZF0ubGF5b3V0LFxuICAgICAgICAgICAgICBzdGF0ZS5kcm9wcGFibGVzW2lkXS50cmFuc2Zvcm1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0U3RhdGUoXCJkcm9wcGFibGVzXCIsIGlkLCBkcm9wcGFibGUpO1xuICAgIGlmIChzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlKSB7XG4gICAgICByZWNvbXB1dGVMYXlvdXRzKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmVEcm9wcGFibGUgPSAoaWQpID0+IHtcbiAgICBpZiAoIXVudHJhY2soKCkgPT4gc3RhdGUuZHJvcHBhYmxlc1tpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vdCByZW1vdmUgbm9uZXhpc3RlbnQgZHJvcHBhYmxlIHdpdGggaWQ6ICR7aWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFN0YXRlKFwiZHJvcHBhYmxlc1wiLCBpZCwgXCJfcGVuZGluZ0NsZWFudXBcIiwgdHJ1ZSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2xlYW51cERyb3BwYWJsZShpZCkpO1xuICB9O1xuICBjb25zdCBjbGVhbnVwRHJvcHBhYmxlID0gKGlkKSA9PiB7XG4gICAgaWYgKHN0YXRlLmRyb3BwYWJsZXNbaWRdPy5fcGVuZGluZ0NsZWFudXApIHtcbiAgICAgIGNvbnN0IGNsZWFudXBBY3RpdmUgPSBzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQgPT09IGlkO1xuICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW51cEFjdGl2ZSkge1xuICAgICAgICAgIHNldFN0YXRlKFwiYWN0aXZlXCIsIFwiZHJvcHBhYmxlSWRcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3RhdGUoXCJkcm9wcGFibGVzXCIsIGlkLCB2b2lkIDApO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBhZGRTZW5zb3IgPSAoeyBpZCwgYWN0aXZhdG9ycyB9KSA9PiB7XG4gICAgc2V0U3RhdGUoXCJzZW5zb3JzXCIsIGlkLCB7XG4gICAgICBpZCxcbiAgICAgIGFjdGl2YXRvcnMsXG4gICAgICBjb29yZGluYXRlczoge1xuICAgICAgICBvcmlnaW46IHsgeDogMCwgeTogMCB9LFxuICAgICAgICBjdXJyZW50OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgZ2V0IGRlbHRhKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBzdGF0ZS5zZW5zb3JzW2lkXS5jb29yZGluYXRlcy5jdXJyZW50LnggLSBzdGF0ZS5zZW5zb3JzW2lkXS5jb29yZGluYXRlcy5vcmlnaW4ueCxcbiAgICAgICAgICAgIHk6IHN0YXRlLnNlbnNvcnNbaWRdLmNvb3JkaW5hdGVzLmN1cnJlbnQueSAtIHN0YXRlLnNlbnNvcnNbaWRdLmNvb3JkaW5hdGVzLm9yaWdpbi55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCByZW1vdmVTZW5zb3IgPSAoaWQpID0+IHtcbiAgICBpZiAoIXVudHJhY2soKCkgPT4gc3RhdGUuc2Vuc29yc1tpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vdCByZW1vdmUgbm9uZXhpc3RlbnQgc2Vuc29yIHdpdGggaWQ6ICR7aWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNsZWFudXBBY3RpdmUgPSBzdGF0ZS5hY3RpdmUuc2Vuc29ySWQgPT09IGlkO1xuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIGlmIChjbGVhbnVwQWN0aXZlKSB7XG4gICAgICAgIHNldFN0YXRlKFwiYWN0aXZlXCIsIFwic2Vuc29ySWRcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBzZXRTdGF0ZShcInNlbnNvcnNcIiwgaWQsIHZvaWQgMCk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHNldE92ZXJsYXkgPSAoeyBub2RlLCBsYXlvdXQgfSkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc3RhdGUuYWN0aXZlLm92ZXJsYXk7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHtcbiAgICAgIG5vZGUsXG4gICAgICBsYXlvdXRcbiAgICB9O1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG92ZXJsYXksIHtcbiAgICAgICAgaWQ6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU/LmlkXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU/LmRhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtZXJzOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlLmRyYWdnYWJsZSA/IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGUudHJhbnNmb3JtZXJzIDoge31cbiAgICAgICAgICAgICkuZmlsdGVyKChbaWRdKSA9PiBpZCAhPT0gXCJhZGREcmFnZ2FibGUtZXhpc3Rpbmctb2Zmc2V0XCIpXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVycyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZS5vdmVybGF5ID8gc3RhdGUuYWN0aXZlLm92ZXJsYXkudHJhbnNmb3JtZXJzIDogW11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVycy5yZWR1Y2UoXG4gICAgICAgICAgICAgICh0cmFuc2Zvcm0sIHRyYW5zZm9ybWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmNhbGxiYWNrKHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5vb3BUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuYWN0aXZlLm92ZXJsYXkgPyB0cmFuc2Zvcm1MYXlvdXQoXG4gICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZS5vdmVybGF5LmxheW91dCxcbiAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlLm92ZXJsYXkudHJhbnNmb3JtXG4gICAgICAgICAgICApIDogbmV3IExheW91dCh7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgXCJvdmVybGF5XCIsIG92ZXJsYXkpO1xuICB9O1xuICBjb25zdCBjbGVhck92ZXJsYXkgPSAoKSA9PiBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcIm92ZXJsYXlcIiwgbnVsbCk7XG4gIGNvbnN0IHNlbnNvclN0YXJ0ID0gKGlkLCBjb29yZGluYXRlcykgPT4ge1xuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIHNldFN0YXRlKFwic2Vuc29yc1wiLCBpZCwgXCJjb29yZGluYXRlc1wiLCB7XG4gICAgICAgIG9yaWdpbjogeyAuLi5jb29yZGluYXRlcyB9LFxuICAgICAgICBjdXJyZW50OiB7IC4uLmNvb3JkaW5hdGVzIH1cbiAgICAgIH0pO1xuICAgICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgXCJzZW5zb3JJZFwiLCBpZCk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHNlbnNvck1vdmUgPSAoY29vcmRpbmF0ZXMpID0+IHtcbiAgICBjb25zdCBzZW5zb3JJZCA9IHN0YXRlLmFjdGl2ZS5zZW5zb3JJZDtcbiAgICBpZiAoIXNlbnNvcklkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgbW92ZSBzZW5zb3Igd2hlbiBubyBzZW5zb3IgYWN0aXZlLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U3RhdGUoXCJzZW5zb3JzXCIsIHNlbnNvcklkLCBcImNvb3JkaW5hdGVzXCIsIFwiY3VycmVudFwiLCB7XG4gICAgICAuLi5jb29yZGluYXRlc1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBzZW5zb3JFbmQgPSAoKSA9PiBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcInNlbnNvcklkXCIsIG51bGwpO1xuICBjb25zdCBkcmFnZ2FibGVBY3RpdmF0b3JzID0gKGRyYWdnYWJsZUlkLCBhc0hhbmRsZXJzKSA9PiB7XG4gICAgY29uc3QgZXZlbnRNYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNlbnNvciBvZiBPYmplY3QudmFsdWVzKHN0YXRlLnNlbnNvcnMpKSB7XG4gICAgICBpZiAoc2Vuc29yKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3R5cGUsIGFjdGl2YXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoc2Vuc29yLmFjdGl2YXRvcnMpKSB7XG4gICAgICAgICAgZXZlbnRNYXBbdHlwZV0gPz89IFtdO1xuICAgICAgICAgIGV2ZW50TWFwW3R5cGVdLnB1c2goe1xuICAgICAgICAgICAgc2Vuc29yLFxuICAgICAgICAgICAgYWN0aXZhdG9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZXZlbnRNYXApIHtcbiAgICAgIGxldCBoYW5kbGVyS2V5ID0ga2V5O1xuICAgICAgaWYgKGFzSGFuZGxlcnMpIHtcbiAgICAgICAgaGFuZGxlcktleSA9IGBvbiR7a2V5fWA7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcnNbaGFuZGxlcktleV0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IGFjdGl2YXRvciB9IG9mIGV2ZW50TWFwW2tleV0pIHtcbiAgICAgICAgICBpZiAoc3RhdGUuYWN0aXZlLnNlbnNvcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvcihldmVudCwgZHJhZ2dhYmxlSWQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbGlzdGVuZXJzO1xuICB9O1xuICBjb25zdCByZWNvbXB1dGVMYXlvdXRzID0gKCkgPT4ge1xuICAgIGxldCBhbnlMYXlvdXRDaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgZHJhZ2dhYmxlcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZHJhZ2dhYmxlcyk7XG4gICAgY29uc3QgZHJvcHBhYmxlcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZHJvcHBhYmxlcyk7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHN0YXRlLmFjdGl2ZS5vdmVybGF5O1xuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgICBmb3IgKGNvbnN0IGRyYWdnYWJsZSBvZiBkcmFnZ2FibGVzKSB7XG4gICAgICAgIGlmIChkcmFnZ2FibGUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gZHJhZ2dhYmxlLmxheW91dDtcbiAgICAgICAgICBpZiAoIWNhY2hlLmhhcyhkcmFnZ2FibGUubm9kZSkpXG4gICAgICAgICAgICBjYWNoZS5zZXQoZHJhZ2dhYmxlLm5vZGUsIGVsZW1lbnRMYXlvdXQoZHJhZ2dhYmxlLm5vZGUpKTtcbiAgICAgICAgICBjb25zdCBsYXlvdXQgPSBjYWNoZS5nZXQoZHJhZ2dhYmxlLm5vZGUpO1xuICAgICAgICAgIGlmICghbGF5b3V0c0FyZUVxdWFsKGN1cnJlbnRMYXlvdXQsIGxheW91dCkpIHtcbiAgICAgICAgICAgIHNldFN0YXRlKFwiZHJhZ2dhYmxlc1wiLCBkcmFnZ2FibGUuaWQsIFwibGF5b3V0XCIsIGxheW91dCk7XG4gICAgICAgICAgICBhbnlMYXlvdXRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZHJvcHBhYmxlIG9mIGRyb3BwYWJsZXMpIHtcbiAgICAgICAgaWYgKGRyb3BwYWJsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSBkcm9wcGFibGUubGF5b3V0O1xuICAgICAgICAgIGlmICghY2FjaGUuaGFzKGRyb3BwYWJsZS5ub2RlKSlcbiAgICAgICAgICAgIGNhY2hlLnNldChkcm9wcGFibGUubm9kZSwgZWxlbWVudExheW91dChkcm9wcGFibGUubm9kZSkpO1xuICAgICAgICAgIGNvbnN0IGxheW91dCA9IGNhY2hlLmdldChkcm9wcGFibGUubm9kZSk7XG4gICAgICAgICAgaWYgKCFsYXlvdXRzQXJlRXF1YWwoY3VycmVudExheW91dCwgbGF5b3V0KSkge1xuICAgICAgICAgICAgc2V0U3RhdGUoXCJkcm9wcGFibGVzXCIsIGRyb3BwYWJsZS5pZCwgXCJsYXlvdXRcIiwgbGF5b3V0KTtcbiAgICAgICAgICAgIGFueUxheW91dENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudExheW91dCA9IG92ZXJsYXkubGF5b3V0O1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBlbGVtZW50TGF5b3V0KG92ZXJsYXkubm9kZSk7XG4gICAgICAgIGlmICghbGF5b3V0c0FyZUVxdWFsKGN1cnJlbnRMYXlvdXQsIGxheW91dCkpIHtcbiAgICAgICAgICBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcIm92ZXJsYXlcIiwgXCJsYXlvdXRcIiwgbGF5b3V0KTtcbiAgICAgICAgICBhbnlMYXlvdXRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbnlMYXlvdXRDaGFuZ2VkO1xuICB9O1xuICBjb25zdCBkZXRlY3RDb2xsaXNpb25zID0gKCkgPT4ge1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9IHN0YXRlLmFjdGl2ZS5vdmVybGF5ID8/IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU7XG4gICAgaWYgKGRyYWdnYWJsZSkge1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gcHJvcHMuY29sbGlzaW9uRGV0ZWN0b3IoXG4gICAgICAgIGRyYWdnYWJsZSxcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGF0ZS5kcm9wcGFibGVzKSxcbiAgICAgICAge1xuICAgICAgICAgIGFjdGl2ZURyb3BwYWJsZUlkOiBzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWRcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZUlkID0gZHJvcHBhYmxlID8gZHJvcHBhYmxlLmlkIDogbnVsbDtcbiAgICAgIGlmIChzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQgIT09IGRyb3BwYWJsZUlkKSB7XG4gICAgICAgIHNldFN0YXRlKFwiYWN0aXZlXCIsIFwiZHJvcHBhYmxlSWRcIiwgZHJvcHBhYmxlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZHJhZ1N0YXJ0ID0gKGRyYWdnYWJsZUlkKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSB7XG4gICAgICBpZDogXCJzZW5zb3JNb3ZlXCIsXG4gICAgICBvcmRlcjogMCxcbiAgICAgIGNhbGxiYWNrOiAodHJhbnNmb3JtKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5hY3RpdmUuc2Vuc29yKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHRyYW5zZm9ybS54ICsgc3RhdGUuYWN0aXZlLnNlbnNvci5jb29yZGluYXRlcy5kZWx0YS54LFxuICAgICAgICAgICAgeTogdHJhbnNmb3JtLnkgKyBzdGF0ZS5hY3RpdmUuc2Vuc29yLmNvb3JkaW5hdGVzLmRlbHRhLnlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm07XG4gICAgICB9XG4gICAgfTtcbiAgICByZWNvbXB1dGVMYXlvdXRzKCk7XG4gICAgYmF0Y2goKCkgPT4ge1xuICAgICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgXCJkcmFnZ2FibGVJZFwiLCBkcmFnZ2FibGVJZCk7XG4gICAgICBhZGRUcmFuc2Zvcm1lcihcImRyYWdnYWJsZXNcIiwgZHJhZ2dhYmxlSWQsIHRyYW5zZm9ybWVyKTtcbiAgICB9KTtcbiAgICBkZXRlY3RDb2xsaXNpb25zKCk7XG4gIH07XG4gIGNvbnN0IGRyYWdFbmQgPSAoKSA9PiB7XG4gICAgY29uc3QgZHJhZ2dhYmxlSWQgPSB1bnRyYWNrKCgpID0+IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZCk7XG4gICAgYmF0Y2goKCkgPT4ge1xuICAgICAgaWYgKGRyYWdnYWJsZUlkICE9PSBudWxsKSB7XG4gICAgICAgIHJlbW92ZVRyYW5zZm9ybWVyKFwiZHJhZ2dhYmxlc1wiLCBkcmFnZ2FibGVJZCwgXCJzZW5zb3JNb3ZlXCIpO1xuICAgICAgfVxuICAgICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgW1wiZHJhZ2dhYmxlSWRcIiwgXCJkcm9wcGFibGVJZFwiXSwgbnVsbCk7XG4gICAgfSk7XG4gICAgcmVjb21wdXRlTGF5b3V0cygpO1xuICB9O1xuICBjb25zdCBvbkRyYWdTdGFydCA9IChoYW5kbGVyKSA9PiB7XG4gICAgY3JlYXRlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU7XG4gICAgICBpZiAoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHVudHJhY2soKCkgPT4gaGFuZGxlcih7IGRyYWdnYWJsZSB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uRHJhZ01vdmUgPSAoaGFuZGxlcikgPT4ge1xuICAgIGNyZWF0ZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgICAgaWYgKGRyYWdnYWJsZSkge1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gdW50cmFjaygoKSA9PiBzdGF0ZS5hY3RpdmUub3ZlcmxheSk7XG4gICAgICAgIE9iamVjdC52YWx1ZXMob3ZlcmxheSA/IG92ZXJsYXkudHJhbnNmb3JtIDogZHJhZ2dhYmxlLnRyYW5zZm9ybSk7XG4gICAgICAgIHVudHJhY2soKCkgPT4gaGFuZGxlcih7IGRyYWdnYWJsZSwgb3ZlcmxheSB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uRHJhZ092ZXIgPSAoaGFuZGxlcikgPT4ge1xuICAgIGNyZWF0ZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gc3RhdGUuYWN0aXZlLmRyb3BwYWJsZTtcbiAgICAgIGlmIChkcmFnZ2FibGUpIHtcbiAgICAgICAgdW50cmFjayhcbiAgICAgICAgICAoKSA9PiBoYW5kbGVyKHsgZHJhZ2dhYmxlLCBkcm9wcGFibGUsIG92ZXJsYXk6IHN0YXRlLmFjdGl2ZS5vdmVybGF5IH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uRHJhZ0VuZCA9IChoYW5kbGVyKSA9PiB7XG4gICAgY3JlYXRlRWZmZWN0KFxuICAgICAgKHsgcHJldmlvdXNEcmFnZ2FibGUsIHByZXZpb3VzRHJvcHBhYmxlLCBwcmV2aW91c092ZXJsYXkgfSkgPT4ge1xuICAgICAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgICAgICBjb25zdCBkcm9wcGFibGUgPSBkcmFnZ2FibGUgPyBzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlIDogbnVsbDtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGRyYWdnYWJsZSA/IHN0YXRlLmFjdGl2ZS5vdmVybGF5IDogbnVsbDtcbiAgICAgICAgaWYgKCFkcmFnZ2FibGUgJiYgcHJldmlvdXNEcmFnZ2FibGUpIHtcbiAgICAgICAgICB1bnRyYWNrKFxuICAgICAgICAgICAgKCkgPT4gaGFuZGxlcih7XG4gICAgICAgICAgICAgIGRyYWdnYWJsZTogcHJldmlvdXNEcmFnZ2FibGUsXG4gICAgICAgICAgICAgIGRyb3BwYWJsZTogcHJldmlvdXNEcm9wcGFibGUsXG4gICAgICAgICAgICAgIG92ZXJsYXk6IHByZXZpb3VzT3ZlcmxheVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJldmlvdXNEcmFnZ2FibGU6IGRyYWdnYWJsZSxcbiAgICAgICAgICBwcmV2aW91c0Ryb3BwYWJsZTogZHJvcHBhYmxlLFxuICAgICAgICAgIHByZXZpb3VzT3ZlcmxheTogb3ZlcmxheVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcHJldmlvdXNEcmFnZ2FibGU6IG51bGwsXG4gICAgICAgIHByZXZpb3VzRHJvcHBhYmxlOiBudWxsLFxuICAgICAgICBwcmV2aW91c092ZXJsYXk6IG51bGxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuICBvbkRyYWdNb3ZlKCgpID0+IGRldGVjdENvbGxpc2lvbnMoKSk7XG4gIHByb3BzLm9uRHJhZ1N0YXJ0ICYmIG9uRHJhZ1N0YXJ0KHByb3BzLm9uRHJhZ1N0YXJ0KTtcbiAgcHJvcHMub25EcmFnTW92ZSAmJiBvbkRyYWdNb3ZlKHByb3BzLm9uRHJhZ01vdmUpO1xuICBwcm9wcy5vbkRyYWdPdmVyICYmIG9uRHJhZ092ZXIocHJvcHMub25EcmFnT3Zlcik7XG4gIHByb3BzLm9uRHJhZ0VuZCAmJiBvbkRyYWdFbmQocHJvcHMub25EcmFnRW5kKTtcbiAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICBhZGRUcmFuc2Zvcm1lcixcbiAgICByZW1vdmVUcmFuc2Zvcm1lcixcbiAgICBhZGREcmFnZ2FibGUsXG4gICAgcmVtb3ZlRHJhZ2dhYmxlLFxuICAgIGFkZERyb3BwYWJsZSxcbiAgICByZW1vdmVEcm9wcGFibGUsXG4gICAgYWRkU2Vuc29yLFxuICAgIHJlbW92ZVNlbnNvcixcbiAgICBzZXRPdmVybGF5LFxuICAgIGNsZWFyT3ZlcmxheSxcbiAgICByZWNvbXB1dGVMYXlvdXRzLFxuICAgIGRldGVjdENvbGxpc2lvbnMsXG4gICAgZHJhZ2dhYmxlQWN0aXZhdG9ycyxcbiAgICBzZW5zb3JTdGFydCxcbiAgICBzZW5zb3JNb3ZlLFxuICAgIHNlbnNvckVuZCxcbiAgICBkcmFnU3RhcnQsXG4gICAgZHJhZ0VuZCxcbiAgICBvbkRyYWdTdGFydCxcbiAgICBvbkRyYWdNb3ZlLFxuICAgIG9uRHJhZ092ZXIsXG4gICAgb25EcmFnRW5kXG4gIH07XG4gIGNvbnN0IGNvbnRleHQgPSBbc3RhdGUsIGFjdGlvbnNdO1xuICByZXR1cm4gPENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9Pntwcm9wcy5jaGlsZHJlbn08L0NvbnRleHQuUHJvdmlkZXI+O1xufTtcbnZhciB1c2VEcmFnRHJvcENvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VDb250ZXh0KENvbnRleHQpIHx8IG51bGw7XG59O1xuXG4vLyBzcmMvY3JlYXRlLXBvaW50ZXItc2Vuc29yLnRzXG5pbXBvcnQgeyBvbkNsZWFudXAsIG9uTW91bnQgfSBmcm9tIFwic29saWQtanNcIjtcbnZhciBjcmVhdGVQb2ludGVyU2Vuc29yID0gKGlkID0gXCJwb2ludGVyLXNlbnNvclwiKSA9PiB7XG4gIGNvbnN0IFtcbiAgICBzdGF0ZSxcbiAgICB7XG4gICAgICBhZGRTZW5zb3IsXG4gICAgICByZW1vdmVTZW5zb3IsXG4gICAgICBzZW5zb3JTdGFydCxcbiAgICAgIHNlbnNvck1vdmUsXG4gICAgICBzZW5zb3JFbmQsXG4gICAgICBkcmFnU3RhcnQsXG4gICAgICBkcmFnRW5kXG4gICAgfVxuICBdID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IGFjdGl2YXRpb25EZWxheSA9IDI1MDtcbiAgY29uc3QgYWN0aXZhdGlvbkRpc3RhbmNlID0gMTA7XG4gIG9uTW91bnQoKCkgPT4ge1xuICAgIGFkZFNlbnNvcih7IGlkLCBhY3RpdmF0b3JzOiB7IHBvaW50ZXJkb3duOiBhdHRhY2ggfSB9KTtcbiAgfSk7XG4gIG9uQ2xlYW51cCgoKSA9PiB7XG4gICAgcmVtb3ZlU2Vuc29yKGlkKTtcbiAgfSk7XG4gIGNvbnN0IGlzQWN0aXZlU2Vuc29yID0gKCkgPT4gc3RhdGUuYWN0aXZlLnNlbnNvcklkID09PSBpZDtcbiAgY29uc3QgaW5pdGlhbENvb3JkaW5hdGVzID0geyB4OiAwLCB5OiAwIH07XG4gIGxldCBhY3RpdmF0aW9uRGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICBsZXQgYWN0aXZhdGlvbkRyYWdnYWJsZUlkID0gbnVsbDtcbiAgY29uc3QgYXR0YWNoID0gKGV2ZW50LCBkcmFnZ2FibGVJZCkgPT4ge1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDApXG4gICAgICByZXR1cm47XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIG9uUG9pbnRlck1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgb25Qb2ludGVyVXApO1xuICAgIGFjdGl2YXRpb25EcmFnZ2FibGVJZCA9IGRyYWdnYWJsZUlkO1xuICAgIGluaXRpYWxDb29yZGluYXRlcy54ID0gZXZlbnQuY2xpZW50WDtcbiAgICBpbml0aWFsQ29vcmRpbmF0ZXMueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgYWN0aXZhdGlvbkRlbGF5VGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQob25BY3RpdmF0ZSwgYWN0aXZhdGlvbkRlbGF5KTtcbiAgfTtcbiAgY29uc3QgZGV0YWNoID0gKCkgPT4ge1xuICAgIGlmIChhY3RpdmF0aW9uRGVsYXlUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dChhY3RpdmF0aW9uRGVsYXlUaW1lb3V0SWQpO1xuICAgICAgYWN0aXZhdGlvbkRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIG9uUG9pbnRlck1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgb25Qb2ludGVyVXApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgY2xlYXJTZWxlY3Rpb24pO1xuICB9O1xuICBjb25zdCBvbkFjdGl2YXRlID0gKCkgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlLnNlbnNvcikge1xuICAgICAgc2Vuc29yU3RhcnQoaWQsIGluaXRpYWxDb29yZGluYXRlcyk7XG4gICAgICBkcmFnU3RhcnQoYWN0aXZhdGlvbkRyYWdnYWJsZUlkKTtcbiAgICAgIGNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIGNsZWFyU2VsZWN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKCFpc0FjdGl2ZVNlbnNvcigpKSB7XG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uUG9pbnRlck1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIGlmICghc3RhdGUuYWN0aXZlLnNlbnNvcikge1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0ge1xuICAgICAgICB4OiBjb29yZGluYXRlcy54IC0gaW5pdGlhbENvb3JkaW5hdGVzLngsXG4gICAgICAgIHk6IGNvb3JkaW5hdGVzLnkgLSBpbml0aWFsQ29vcmRpbmF0ZXMueVxuICAgICAgfTtcbiAgICAgIGlmIChNYXRoLnNxcnQodHJhbnNmb3JtLnggKiogMiArIHRyYW5zZm9ybS55ICoqIDIpID4gYWN0aXZhdGlvbkRpc3RhbmNlKSB7XG4gICAgICAgIG9uQWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQWN0aXZlU2Vuc29yKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZW5zb3JNb3ZlKGNvb3JkaW5hdGVzKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uUG9pbnRlclVwID0gKGV2ZW50KSA9PiB7XG4gICAgZGV0YWNoKCk7XG4gICAgaWYgKGlzQWN0aXZlU2Vuc29yKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkcmFnRW5kKCk7XG4gICAgICBzZW5zb3JFbmQoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsZWFyU2VsZWN0aW9uID0gKCkgPT4ge1xuICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH07XG59O1xuXG4vLyBzcmMvZHJhZy1kcm9wLXNlbnNvcnMudHN4XG52YXIgRHJhZ0Ryb3BTZW5zb3JzID0gKHByb3BzKSA9PiB7XG4gIGNyZWF0ZVBvaW50ZXJTZW5zb3IoKTtcbiAgcmV0dXJuIDw+e3Byb3BzLmNoaWxkcmVufTwvPjtcbn07XG5cbi8vIHNyYy9jcmVhdGUtZHJhZ2dhYmxlLnRzXG5pbXBvcnQge1xuICBjcmVhdGVFZmZlY3QgYXMgY3JlYXRlRWZmZWN0MixcbiAgY3JlYXRlU2lnbmFsLFxuICBvbkNsZWFudXAgYXMgb25DbGVhbnVwMixcbiAgb25Nb3VudCBhcyBvbk1vdW50MlxufSBmcm9tIFwic29saWQtanNcIjtcblxuLy8gc3JjL3N0eWxlLnRzXG52YXIgbGF5b3V0U3R5bGUgPSAobGF5b3V0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgdG9wOiBgJHtsYXlvdXQueX1weGAsXG4gICAgbGVmdDogYCR7bGF5b3V0Lnh9cHhgLFxuICAgIHdpZHRoOiBgJHtsYXlvdXQud2lkdGh9cHhgLFxuICAgIGhlaWdodDogYCR7bGF5b3V0LmhlaWdodH1weGBcbiAgfTtcbn07XG52YXIgdHJhbnNmb3JtU3R5bGUgPSAodHJhbnNmb3JtKSA9PiB7XG4gIHJldHVybiB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dHJhbnNmb3JtLnh9cHgsICR7dHJhbnNmb3JtLnl9cHgsIDApYCB9O1xufTtcbnZhciBtYXliZVRyYW5zZm9ybVN0eWxlID0gKHRyYW5zZm9ybSkgPT4ge1xuICByZXR1cm4gdHJhbnNmb3Jtc0FyZUVxdWFsKHRyYW5zZm9ybSwgbm9vcFRyYW5zZm9ybSgpKSA/IHt9IDogdHJhbnNmb3JtU3R5bGUodHJhbnNmb3JtKTtcbn07XG5cbi8vIHNyYy9jcmVhdGUtZHJhZ2dhYmxlLnRzXG52YXIgY3JlYXRlRHJhZ2dhYmxlID0gKGlkLCBkYXRhID0ge30pID0+IHtcbiAgY29uc3QgW3N0YXRlLCB7IGFkZERyYWdnYWJsZSwgcmVtb3ZlRHJhZ2dhYmxlLCBkcmFnZ2FibGVBY3RpdmF0b3JzIH1dID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IGNyZWF0ZVNpZ25hbChudWxsKTtcbiAgb25Nb3VudDIoKCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IG5vZGUoKTtcbiAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICBhZGREcmFnZ2FibGUoe1xuICAgICAgICBpZCxcbiAgICAgICAgbm9kZTogcmVzb2x2ZWROb2RlLFxuICAgICAgICBsYXlvdXQ6IGVsZW1lbnRMYXlvdXQocmVzb2x2ZWROb2RlKSxcbiAgICAgICAgZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgb25DbGVhbnVwMigoKSA9PiByZW1vdmVEcmFnZ2FibGUoaWQpKTtcbiAgY29uc3QgaXNBY3RpdmVEcmFnZ2FibGUgPSAoKSA9PiBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlSWQgPT09IGlkO1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoKSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlLmRyYWdnYWJsZXNbaWRdPy50cmFuc2Zvcm0gfHwgbm9vcFRyYW5zZm9ybSgpO1xuICB9O1xuICBjb25zdCBkcmFnZ2FibGUgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICAoZWxlbWVudCwgYWNjZXNzb3IpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGFjY2Vzc29yID8gYWNjZXNzb3IoKSA6IHt9O1xuICAgICAgY3JlYXRlRWZmZWN0MigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IG5vZGUoKTtcbiAgICAgICAgY29uc3QgYWN0aXZhdG9ycyA9IGRyYWdnYWJsZUFjdGl2YXRvcnMoaWQpO1xuICAgICAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYWN0aXZhdG9ycykge1xuICAgICAgICAgICAgcmVzb2x2ZWROb2RlLmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBhY3RpdmF0b3JzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbkNsZWFudXAyKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3RpdmF0b3JzKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVkTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGtleSwgYWN0aXZhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzZXROb2RlKGVsZW1lbnQpO1xuICAgICAgaWYgKCFjb25maWcuc2tpcFRyYW5zZm9ybSkge1xuICAgICAgICBjcmVhdGVFZmZlY3QyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFRyYW5zZm9ybSA9IHRyYW5zZm9ybSgpO1xuICAgICAgICAgIGlmICghdHJhbnNmb3Jtc0FyZUVxdWFsKHJlc29sdmVkVHJhbnNmb3JtLCBub29wVHJhbnNmb3JtKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHRyYW5zZm9ybVN0eWxlKHRyYW5zZm9ybSgpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0cmFuc2Zvcm1cIiwgc3R5bGUudHJhbnNmb3JtID8/IG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidHJhbnNmb3JtXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICByZWY6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHNldE5vZGVcbiAgICAgIH0sXG4gICAgICBpc0FjdGl2ZURyYWdnYWJsZToge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGlzQWN0aXZlRHJhZ2dhYmxlXG4gICAgICB9LFxuICAgICAgZHJhZ0FjdGl2YXRvcnM6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRyYWdnYWJsZUFjdGl2YXRvcnMoaWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogdHJhbnNmb3JtXG4gICAgICB9XG4gICAgfVxuICApO1xuICByZXR1cm4gZHJhZ2dhYmxlO1xufTtcblxuLy8gc3JjL2NyZWF0ZS1kcm9wcGFibGUudHNcbmltcG9ydCB7XG4gIGNyZWF0ZUVmZmVjdCBhcyBjcmVhdGVFZmZlY3QzLFxuICBjcmVhdGVTaWduYWwgYXMgY3JlYXRlU2lnbmFsMixcbiAgb25DbGVhbnVwIGFzIG9uQ2xlYW51cDMsXG4gIG9uTW91bnQgYXMgb25Nb3VudDNcbn0gZnJvbSBcInNvbGlkLWpzXCI7XG52YXIgY3JlYXRlRHJvcHBhYmxlID0gKGlkLCBkYXRhID0ge30pID0+IHtcbiAgY29uc3QgW3N0YXRlLCB7IGFkZERyb3BwYWJsZSwgcmVtb3ZlRHJvcHBhYmxlIH1dID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IGNyZWF0ZVNpZ25hbDIobnVsbCk7XG4gIG9uTW91bnQzKCgpID0+IHtcbiAgICBjb25zdCByZXNvbHZlZE5vZGUgPSBub2RlKCk7XG4gICAgaWYgKHJlc29sdmVkTm9kZSkge1xuICAgICAgYWRkRHJvcHBhYmxlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5vZGU6IHJlc29sdmVkTm9kZSxcbiAgICAgICAgbGF5b3V0OiBlbGVtZW50TGF5b3V0KHJlc29sdmVkTm9kZSksXG4gICAgICAgIGRhdGFcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIG9uQ2xlYW51cDMoKCkgPT4gcmVtb3ZlRHJvcHBhYmxlKGlkKSk7XG4gIGNvbnN0IGlzQWN0aXZlRHJvcHBhYmxlID0gKCkgPT4gc3RhdGUuYWN0aXZlLmRyb3BwYWJsZUlkID09PSBpZDtcbiAgY29uc3QgdHJhbnNmb3JtID0gKCkgPT4ge1xuICAgIHJldHVybiBzdGF0ZS5kcm9wcGFibGVzW2lkXT8udHJhbnNmb3JtIHx8IG5vb3BUcmFuc2Zvcm0oKTtcbiAgfTtcbiAgY29uc3QgZHJvcHBhYmxlID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG4gICAgKGVsZW1lbnQsIGFjY2Vzc29yKSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSBhY2Nlc3NvciA/IGFjY2Vzc29yKCkgOiB7fTtcbiAgICAgIHNldE5vZGUoZWxlbWVudCk7XG4gICAgICBpZiAoIWNvbmZpZy5za2lwVHJhbnNmb3JtKSB7XG4gICAgICAgIGNyZWF0ZUVmZmVjdDMoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkVHJhbnNmb3JtID0gdHJhbnNmb3JtKCk7XG4gICAgICAgICAgaWYgKCF0cmFuc2Zvcm1zQXJlRXF1YWwocmVzb2x2ZWRUcmFuc2Zvcm0sIG5vb3BUcmFuc2Zvcm0oKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gdHJhbnNmb3JtU3R5bGUodHJhbnNmb3JtKCkpO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRyYW5zZm9ybVwiLCBzdHlsZS50cmFuc2Zvcm0gPz8gbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJ0cmFuc2Zvcm1cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHJlZjoge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogc2V0Tm9kZVxuICAgICAgfSxcbiAgICAgIGlzQWN0aXZlRHJvcHBhYmxlOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogaXNBY3RpdmVEcm9wcGFibGVcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiB0cmFuc2Zvcm1cbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIHJldHVybiBkcm9wcGFibGU7XG59O1xuXG4vLyBzcmMvZHJhZy1vdmVybGF5LnRzeFxuaW1wb3J0IHsgUG9ydGFsIH0gZnJvbSBcInNvbGlkLWpzL3dlYlwiO1xuaW1wb3J0IHsgU2hvdyB9IGZyb20gXCJzb2xpZC1qc1wiO1xudmFyIERyYWdPdmVybGF5ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IFtzdGF0ZSwgeyBvbkRyYWdTdGFydCwgb25EcmFnRW5kLCBzZXRPdmVybGF5LCBjbGVhck92ZXJsYXkgfV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKTtcbiAgbGV0IG5vZGU7XG4gIG9uRHJhZ1N0YXJ0KCh7IGRyYWdnYWJsZSB9KSA9PiB7XG4gICAgc2V0T3ZlcmxheSh7XG4gICAgICBub2RlOiBkcmFnZ2FibGUubm9kZSxcbiAgICAgIGxheW91dDogZHJhZ2dhYmxlLmxheW91dFxuICAgIH0pO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGVsZW1lbnRMYXlvdXQobm9kZSk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0ge1xuICAgICAgICAgIHg6IChkcmFnZ2FibGUubGF5b3V0LndpZHRoIC0gbGF5b3V0LndpZHRoKSAvIDIsXG4gICAgICAgICAgeTogKGRyYWdnYWJsZS5sYXlvdXQuaGVpZ2h0IC0gbGF5b3V0LmhlaWdodCkgLyAyXG4gICAgICAgIH07XG4gICAgICAgIGxheW91dC54ICs9IGRlbHRhLng7XG4gICAgICAgIGxheW91dC55ICs9IGRlbHRhLnk7XG4gICAgICAgIHNldE92ZXJsYXkoeyBub2RlLCBsYXlvdXQgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBvbkRyYWdFbmQoKCkgPT4gcXVldWVNaWNyb3Rhc2soY2xlYXJPdmVybGF5KSk7XG4gIGNvbnN0IHN0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBzdGF0ZS5hY3RpdmUub3ZlcmxheTtcbiAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgIGlmICghb3ZlcmxheSB8fCAhZHJhZ2dhYmxlKVxuICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJ0cmFuc2Zvcm0gMHNcIixcbiAgICAgIHRvcDogYCR7b3ZlcmxheS5sYXlvdXQudG9wfXB4YCxcbiAgICAgIGxlZnQ6IGAke292ZXJsYXkubGF5b3V0LmxlZnR9cHhgLFxuICAgICAgXCJtaW4td2lkdGhcIjogYCR7ZHJhZ2dhYmxlLmxheW91dC53aWR0aH1weGAsXG4gICAgICBcIm1pbi1oZWlnaHRcIjogYCR7ZHJhZ2dhYmxlLmxheW91dC5oZWlnaHR9cHhgLFxuICAgICAgLi4udHJhbnNmb3JtU3R5bGUob3ZlcmxheS50cmFuc2Zvcm0pLFxuICAgICAgLi4ucHJvcHMuc3R5bGVcbiAgICB9O1xuICB9O1xuICByZXR1cm4gPFBvcnRhbCBtb3VudD17ZG9jdW1lbnQuYm9keX0+PFNob3cgd2hlbj17c3RhdGUuYWN0aXZlLmRyYWdnYWJsZX0+PGRpdiByZWY9e25vZGV9IGNsYXNzPXtwcm9wcy5jbGFzc30gc3R5bGU9e3N0eWxlKCl9Pnt0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IHByb3BzLmNoaWxkcmVuKHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGUpIDogcHJvcHMuY2hpbGRyZW59PC9kaXY+PC9TaG93PjwvUG9ydGFsPjtcbn07XG5cbi8vIHNyYy9zb3J0YWJsZS1jb250ZXh0LnRzeFxuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCBhcyBjcmVhdGVDb250ZXh0MixcbiAgY3JlYXRlRWZmZWN0IGFzIGNyZWF0ZUVmZmVjdDQsXG4gIHVudHJhY2sgYXMgdW50cmFjazIsXG4gIHVzZUNvbnRleHQgYXMgdXNlQ29udGV4dDJcbn0gZnJvbSBcInNvbGlkLWpzXCI7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSBhcyBjcmVhdGVTdG9yZTIgfSBmcm9tIFwic29saWQtanMvc3RvcmVcIjtcblxuLy8gc3JjL21vdmUtYXJyYXktaXRlbS50c1xudmFyIG1vdmVBcnJheUl0ZW0gPSAoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCkgPT4ge1xuICBjb25zdCBuZXdBcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gIG5ld0FycmF5LnNwbGljZSh0b0luZGV4LCAwLCAuLi5uZXdBcnJheS5zcGxpY2UoZnJvbUluZGV4LCAxKSk7XG4gIHJldHVybiBuZXdBcnJheTtcbn07XG5cbi8vIHNyYy9zb3J0YWJsZS1jb250ZXh0LnRzeFxudmFyIENvbnRleHQyID0gY3JlYXRlQ29udGV4dDIoKTtcbnZhciBTb3J0YWJsZVByb3ZpZGVyID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IFtkbmRTdGF0ZV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBjcmVhdGVTdG9yZTIoe1xuICAgIGluaXRpYWxJZHM6IFtdLFxuICAgIHNvcnRlZElkczogW11cbiAgfSk7XG4gIGNvbnN0IGlzVmFsaWRJbmRleCA9IChpbmRleCkgPT4ge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgc3RhdGUuaW5pdGlhbElkcy5sZW5ndGg7XG4gIH07XG4gIGNyZWF0ZUVmZmVjdDQoKCkgPT4ge1xuICAgIHNldFN0YXRlKFwiaW5pdGlhbElkc1wiLCBbLi4ucHJvcHMuaWRzXSk7XG4gICAgc2V0U3RhdGUoXCJzb3J0ZWRJZHNcIiwgWy4uLnByb3BzLmlkc10pO1xuICB9KTtcbiAgY3JlYXRlRWZmZWN0NCgoKSA9PiB7XG4gICAgaWYgKGRuZFN0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZCAmJiBkbmRTdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQpIHtcbiAgICAgIHVudHJhY2syKCgpID0+IHtcbiAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gc3RhdGUuc29ydGVkSWRzLmluZGV4T2YoZG5kU3RhdGUuYWN0aXZlLmRyYWdnYWJsZUlkKTtcbiAgICAgICAgY29uc3QgdG9JbmRleCA9IHN0YXRlLmluaXRpYWxJZHMuaW5kZXhPZihkbmRTdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQpO1xuICAgICAgICBpZiAoIWlzVmFsaWRJbmRleChmcm9tSW5kZXgpIHx8ICFpc1ZhbGlkSW5kZXgodG9JbmRleCkpIHtcbiAgICAgICAgICBzZXRTdGF0ZShcInNvcnRlZElkc1wiLCBbLi4ucHJvcHMuaWRzXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBtb3ZlQXJyYXlJdGVtKHN0YXRlLnNvcnRlZElkcywgZnJvbUluZGV4LCB0b0luZGV4KTtcbiAgICAgICAgICBzZXRTdGF0ZShcInNvcnRlZElkc1wiLCByZXNvcnRlZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZShcInNvcnRlZElkc1wiLCBbLi4ucHJvcHMuaWRzXSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgYWN0aW9ucyA9IHt9O1xuICBjb25zdCBjb250ZXh0ID0gW3N0YXRlLCBhY3Rpb25zXTtcbiAgcmV0dXJuIDxDb250ZXh0Mi5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+e3Byb3BzLmNoaWxkcmVufTwvQ29udGV4dDIuUHJvdmlkZXI+O1xufTtcbnZhciB1c2VTb3J0YWJsZUNvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VDb250ZXh0MihDb250ZXh0MikgfHwgbnVsbDtcbn07XG5cbi8vIHNyYy9jcmVhdGUtc29ydGFibGUudHNcbmltcG9ydCB7IGNyZWF0ZUVmZmVjdCBhcyBjcmVhdGVFZmZlY3Q1LCBvbkNsZWFudXAgYXMgb25DbGVhbnVwNCwgb25Nb3VudCBhcyBvbk1vdW50NCB9IGZyb20gXCJzb2xpZC1qc1wiO1xuXG4vLyBzcmMvY29tYmluZS1yZWZzLnRzXG52YXIgY29tYmluZVJlZnMgPSAoc2V0UmVmQSwgc2V0UmVmQikgPT4ge1xuICByZXR1cm4gKHJlZikgPT4ge1xuICAgIHNldFJlZkEocmVmKTtcbiAgICBzZXRSZWZCKHJlZik7XG4gIH07XG59O1xuXG4vLyBzcmMvY3JlYXRlLXNvcnRhYmxlLnRzXG52YXIgY3JlYXRlU29ydGFibGUgPSAoaWQsIGRhdGEgPSB7fSkgPT4ge1xuICBjb25zdCBbZG5kU3RhdGUsIHsgYWRkVHJhbnNmb3JtZXIsIHJlbW92ZVRyYW5zZm9ybWVyIH1dID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IFtzb3J0YWJsZVN0YXRlXSA9IHVzZVNvcnRhYmxlQ29udGV4dCgpO1xuICBjb25zdCBkcmFnZ2FibGUgPSBjcmVhdGVEcmFnZ2FibGUoaWQsIGRhdGEpO1xuICBjb25zdCBkcm9wcGFibGUgPSBjcmVhdGVEcm9wcGFibGUoaWQsIGRhdGEpO1xuICBjb25zdCBzZXROb2RlID0gY29tYmluZVJlZnMoZHJhZ2dhYmxlLnJlZiwgZHJvcHBhYmxlLnJlZik7XG4gIGNvbnN0IGluaXRpYWxJbmRleCA9ICgpID0+IHNvcnRhYmxlU3RhdGUuaW5pdGlhbElkcy5pbmRleE9mKGlkKTtcbiAgY29uc3QgY3VycmVudEluZGV4ID0gKCkgPT4gc29ydGFibGVTdGF0ZS5zb3J0ZWRJZHMuaW5kZXhPZihpZCk7XG4gIGNvbnN0IGxheW91dEJ5SWQgPSAoaWQyKSA9PiBkbmRTdGF0ZS5kcm9wcGFibGVzW2lkMl0/LmxheW91dCB8fCBudWxsO1xuICBjb25zdCBzb3J0ZWRUcmFuc2Zvcm0gPSAoKSA9PiB7XG4gICAgY29uc3QgZGVsdGEgPSBub29wVHJhbnNmb3JtKCk7XG4gICAgY29uc3QgcmVzb2x2ZWRJbml0aWFsSW5kZXggPSBpbml0aWFsSW5kZXgoKTtcbiAgICBjb25zdCByZXNvbHZlZEN1cnJlbnRJbmRleCA9IGN1cnJlbnRJbmRleCgpO1xuICAgIGlmIChyZXNvbHZlZEN1cnJlbnRJbmRleCAhPT0gcmVzb2x2ZWRJbml0aWFsSW5kZXgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSBsYXlvdXRCeUlkKGlkKTtcbiAgICAgIGNvbnN0IHRhcmdldExheW91dCA9IGxheW91dEJ5SWQoXG4gICAgICAgIHNvcnRhYmxlU3RhdGUuaW5pdGlhbElkc1tyZXNvbHZlZEN1cnJlbnRJbmRleF1cbiAgICAgICk7XG4gICAgICBpZiAoY3VycmVudExheW91dCAmJiB0YXJnZXRMYXlvdXQpIHtcbiAgICAgICAgZGVsdGEueCA9IHRhcmdldExheW91dC54IC0gY3VycmVudExheW91dC54O1xuICAgICAgICBkZWx0YS55ID0gdGFyZ2V0TGF5b3V0LnkgLSBjdXJyZW50TGF5b3V0Lnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWx0YTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZXIgPSB7XG4gICAgaWQ6IFwic29ydGFibGVPZmZzZXRcIixcbiAgICBvcmRlcjogMTAwLFxuICAgIGNhbGxiYWNrOiAodHJhbnNmb3JtMikgPT4ge1xuICAgICAgY29uc3QgZGVsdGEgPSBzb3J0ZWRUcmFuc2Zvcm0oKTtcbiAgICAgIHJldHVybiB7IHg6IHRyYW5zZm9ybTIueCArIGRlbHRhLngsIHk6IHRyYW5zZm9ybTIueSArIGRlbHRhLnkgfTtcbiAgICB9XG4gIH07XG4gIG9uTW91bnQ0KCgpID0+IGFkZFRyYW5zZm9ybWVyKFwiZHJvcHBhYmxlc1wiLCBpZCwgdHJhbnNmb3JtZXIpKTtcbiAgb25DbGVhbnVwNCgoKSA9PiByZW1vdmVUcmFuc2Zvcm1lcihcImRyb3BwYWJsZXNcIiwgaWQsIHRyYW5zZm9ybWVyLmlkKSk7XG4gIGNvbnN0IHRyYW5zZm9ybSA9ICgpID0+IHtcbiAgICByZXR1cm4gKGlkID09PSBkbmRTdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlSWQgJiYgIWRuZFN0YXRlLmFjdGl2ZS5vdmVybGF5ID8gZG5kU3RhdGUuZHJhZ2dhYmxlc1tpZF0/LnRyYW5zZm9ybSA6IGRuZFN0YXRlLmRyb3BwYWJsZXNbaWRdPy50cmFuc2Zvcm0pIHx8IG5vb3BUcmFuc2Zvcm0oKTtcbiAgfTtcbiAgY29uc3Qgc29ydGFibGUgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlKGVsZW1lbnQsICgpID0+ICh7IHNraXBUcmFuc2Zvcm06IHRydWUgfSkpO1xuICAgICAgZHJvcHBhYmxlKGVsZW1lbnQsICgpID0+ICh7IHNraXBUcmFuc2Zvcm06IHRydWUgfSkpO1xuICAgICAgY3JlYXRlRWZmZWN0NSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkVHJhbnNmb3JtID0gdHJhbnNmb3JtKCk7XG4gICAgICAgIGlmICghdHJhbnNmb3Jtc0FyZUVxdWFsKHJlc29sdmVkVHJhbnNmb3JtLCBub29wVHJhbnNmb3JtKCkpKSB7XG4gICAgICAgICAgY29uc3Qgc3R5bGUgPSB0cmFuc2Zvcm1TdHlsZSh0cmFuc2Zvcm0oKSk7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRyYW5zZm9ybVwiLCBzdHlsZS50cmFuc2Zvcm0gPz8gbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInRyYW5zZm9ybVwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICByZWY6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHNldE5vZGVcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiB0cmFuc2Zvcm1cbiAgICAgIH0sXG4gICAgICBpc0FjdGl2ZURyYWdnYWJsZToge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGRyYWdnYWJsZS5pc0FjdGl2ZURyYWdnYWJsZVxuICAgICAgfSxcbiAgICAgIGRyYWdBY3RpdmF0b3JzOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gZHJhZ2dhYmxlLmRyYWdBY3RpdmF0b3JzXG4gICAgICB9LFxuICAgICAgaXNBY3RpdmVEcm9wcGFibGU6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBkcm9wcGFibGUuaXNBY3RpdmVEcm9wcGFibGVcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIHJldHVybiBzb3J0YWJsZTtcbn07XG5cbi8vIHNyYy9kcmFnLWRyb3AtZGVidWdnZXIudHN4XG5pbXBvcnQge1xuICBGb3IsXG4gIG1lcmdlUHJvcHMgYXMgbWVyZ2VQcm9wczIsXG4gIG9uQ2xlYW51cCBhcyBvbkNsZWFudXA1LFxuICBvbk1vdW50IGFzIG9uTW91bnQ1LFxuICBTaG93IGFzIFNob3cyXG59IGZyb20gXCJzb2xpZC1qc1wiO1xuaW1wb3J0IHsgUG9ydGFsIGFzIFBvcnRhbDIgfSBmcm9tIFwic29saWQtanMvd2ViXCI7XG52YXIgSGlnaGxpZ2h0ZXIgPSAocHJvcHMpID0+IHtcbiAgcHJvcHMgPSBtZXJnZVByb3BzMih7IGNvbG9yOiBcInJlZFwiLCBhY3RpdmU6IGZhbHNlIH0sIHByb3BzKTtcbiAgcmV0dXJuIDxkaXZcbiAgICBzdHlsZT17e1xuICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIsXG4gICAgICAuLi5sYXlvdXRTdHlsZShwcm9wcy5sYXlvdXQpLFxuICAgICAgb3V0bGluZTogXCIxcHggZGFzaGVkXCIsXG4gICAgICBcIm91dGxpbmUtd2lkdGhcIjogcHJvcHMuYWN0aXZlID8gXCI0cHhcIiA6IFwiMXB4XCIsXG4gICAgICBcIm91dGxpbmUtY29sb3JcIjogcHJvcHMuY29sb3IsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvcixcbiAgICAgIFwiYWxpZ24taXRlbXNcIjogXCJmbGV4LWVuZFwiLFxuICAgICAgXCJqdXN0aWZ5LWNvbnRlbnRcIjogXCJmbGV4LWVuZFwiLFxuICAgICAgLi4ucHJvcHMuc3R5bGVcbiAgICB9fVxuICA+e3Byb3BzLmlkfTwvZGl2Pjtcbn07XG52YXIgRHJhZ0Ryb3BEZWJ1Z2dlciA9ICgpID0+IHtcbiAgY29uc3QgW3N0YXRlLCB7IHJlY29tcHV0ZUxheW91dHMgfV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKTtcbiAgbGV0IHRpY2tpbmcgPSBmYWxzZTtcbiAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgIGlmICghdGlja2luZykge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmVjb21wdXRlTGF5b3V0cygpO1xuICAgICAgICB0aWNraW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRpY2tpbmcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgb25Nb3VudDUoKCkgPT4ge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlKTtcbiAgfSk7XG4gIG9uQ2xlYW51cDUoKCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlKTtcbiAgfSk7XG4gIHJldHVybiA8UG9ydGFsMiBtb3VudD17ZG9jdW1lbnQuYm9keX0+XG4gICAgPEZvciBlYWNoPXtPYmplY3QudmFsdWVzKHN0YXRlLmRyb3BwYWJsZXMpfT57KGRyb3BwYWJsZSkgPT4gZHJvcHBhYmxlID8gPEhpZ2hsaWdodGVyXG4gICAgICBpZD17ZHJvcHBhYmxlLmlkfVxuICAgICAgbGF5b3V0PXtkcm9wcGFibGUubGF5b3V0fVxuICAgICAgYWN0aXZlPXtkcm9wcGFibGUuaWQgPT09IHN0YXRlLmFjdGl2ZS5kcm9wcGFibGVJZH1cbiAgICAvPiA6IG51bGx9PC9Gb3I+XG4gICAgPEZvciBlYWNoPXtPYmplY3QudmFsdWVzKHN0YXRlLmRyYWdnYWJsZXMpfT57KGRyYWdnYWJsZSkgPT4gZHJhZ2dhYmxlID8gPEhpZ2hsaWdodGVyXG4gICAgICBpZD17ZHJhZ2dhYmxlLmlkfVxuICAgICAgbGF5b3V0PXtkcmFnZ2FibGUubGF5b3V0fVxuICAgICAgYWN0aXZlPXtkcmFnZ2FibGUuaWQgPT09IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZH1cbiAgICAgIGNvbG9yPVwiYmx1ZVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBcImFsaWduLWl0ZW1zXCI6IFwiZmxleC1zdGFydFwiLFxuICAgICAgICBcImp1c3RpZnktY29udGVudFwiOiBcImZsZXgtc3RhcnRcIixcbiAgICAgICAgLi4udHJhbnNmb3JtU3R5bGUoZHJhZ2dhYmxlLnRyYW5zZm9ybSlcbiAgICAgIH19XG4gICAgLz4gOiBudWxsfTwvRm9yPlxuICAgIDxTaG93MiB3aGVuPXtzdGF0ZS5hY3RpdmUub3ZlcmxheX0ga2V5ZWQ+eyhvdmVybGF5KSA9PiA8SGlnaGxpZ2h0ZXJcbiAgICAgIGlkPXtvdmVybGF5LmlkfVxuICAgICAgbGF5b3V0PXtvdmVybGF5LmxheW91dH1cbiAgICAgIGFjdGl2ZT17dHJ1ZX1cbiAgICAgIGNvbG9yPVwib3JhbmdlXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC4uLnRyYW5zZm9ybVN0eWxlKG92ZXJsYXkudHJhbnNmb3JtKVxuICAgICAgfX1cbiAgICAvPn08L1Nob3cyPlxuICA8L1BvcnRhbDI+O1xufTtcbmV4cG9ydCB7XG4gIERyYWdEcm9wRGVidWdnZXIsXG4gIERyYWdEcm9wUHJvdmlkZXIsXG4gIERyYWdEcm9wU2Vuc29ycyxcbiAgRHJhZ092ZXJsYXksXG4gIFNvcnRhYmxlUHJvdmlkZXIsXG4gIGNsb3Nlc3RDZW50ZXIsXG4gIGNsb3Nlc3RDb3JuZXJzLFxuICBjcmVhdGVEcmFnZ2FibGUsXG4gIGNyZWF0ZURyb3BwYWJsZSxcbiAgY3JlYXRlUG9pbnRlclNlbnNvcixcbiAgY3JlYXRlU29ydGFibGUsXG4gIGxheW91dFN0eWxlLFxuICBtYXliZVRyYW5zZm9ybVN0eWxlLFxuICBtb3N0SW50ZXJzZWN0aW5nLFxuICB0cmFuc2Zvcm1TdHlsZSxcbiAgdXNlRHJhZ0Ryb3BDb250ZXh0LFxuICB1c2VTb3J0YWJsZUNvbnRleHRcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0EsU0FDRUEsS0FBSyxFQUNMQyxhQUFhLEVBQ2JDLFlBQVksRUFDWkMsVUFBVSxFQUNWQyxPQUFPLEVBQ1BDLFVBQVUsUUFDTCxVQUFVO0FBQ2pCLFNBQVNDLFdBQVcsUUFBUSxnQkFBZ0I7O0FBRTVDO0FBQ0EsSUFBSUMsTUFBTSxHQUFHLE1BQU07RUFDakJDLENBQUM7RUFDREMsQ0FBQztFQUNEQyxLQUFLO0VBQ0xDLE1BQU07RUFDTkMsV0FBV0EsQ0FBQ0MsSUFBSSxFQUFFO0lBQ2hCLElBQUksQ0FBQ0wsQ0FBQyxHQUFHTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0YsSUFBSSxDQUFDTCxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDQyxDQUFDLEdBQUdLLElBQUksQ0FBQ0MsS0FBSyxDQUFDRixJQUFJLENBQUNKLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUNDLEtBQUssR0FBR0ksSUFBSSxDQUFDQyxLQUFLLENBQUNGLElBQUksQ0FBQ0gsS0FBSyxDQUFDO0lBQ25DLElBQUksQ0FBQ0MsTUFBTSxHQUFHRyxJQUFJLENBQUNDLEtBQUssQ0FBQ0YsSUFBSSxDQUFDRixNQUFNLENBQUM7RUFDdkM7RUFDQSxJQUFJRSxJQUFJQSxDQUFBLEVBQUc7SUFDVCxPQUFPO01BQUVMLENBQUMsRUFBRSxJQUFJLENBQUNBLENBQUM7TUFBRUMsQ0FBQyxFQUFFLElBQUksQ0FBQ0EsQ0FBQztNQUFFQyxLQUFLLEVBQUUsSUFBSSxDQUFDQSxLQUFLO01BQUVDLE1BQU0sRUFBRSxJQUFJLENBQUNBO0lBQU8sQ0FBQztFQUN6RTtFQUNBLElBQUlLLElBQUlBLENBQUEsRUFBRztJQUNULE9BQU8sSUFBSSxDQUFDUixDQUFDO0VBQ2Y7RUFDQSxJQUFJUyxHQUFHQSxDQUFBLEVBQUc7SUFDUixPQUFPLElBQUksQ0FBQ1IsQ0FBQztFQUNmO0VBQ0EsSUFBSVMsS0FBS0EsQ0FBQSxFQUFHO0lBQ1YsT0FBTyxJQUFJLENBQUNWLENBQUMsR0FBRyxJQUFJLENBQUNFLEtBQUs7RUFDNUI7RUFDQSxJQUFJUyxNQUFNQSxDQUFBLEVBQUc7SUFDWCxPQUFPLElBQUksQ0FBQ1YsQ0FBQyxHQUFHLElBQUksQ0FBQ0UsTUFBTTtFQUM3QjtFQUNBLElBQUlTLE1BQU1BLENBQUEsRUFBRztJQUNYLE9BQU87TUFDTFosQ0FBQyxFQUFFLElBQUksQ0FBQ0EsQ0FBQyxHQUFHLElBQUksQ0FBQ0UsS0FBSyxHQUFHLEdBQUc7TUFDNUJELENBQUMsRUFBRSxJQUFJLENBQUNBLENBQUMsR0FBRyxJQUFJLENBQUNFLE1BQU0sR0FBRztJQUM1QixDQUFDO0VBQ0g7RUFDQSxJQUFJVSxPQUFPQSxDQUFBLEVBQUc7SUFDWixPQUFPO01BQ0xDLE9BQU8sRUFBRTtRQUFFZCxDQUFDLEVBQUUsSUFBSSxDQUFDUSxJQUFJO1FBQUVQLENBQUMsRUFBRSxJQUFJLENBQUNRO01BQUksQ0FBQztNQUN0Q00sUUFBUSxFQUFFO1FBQUVmLENBQUMsRUFBRSxJQUFJLENBQUNVLEtBQUs7UUFBRVQsQ0FBQyxFQUFFLElBQUksQ0FBQ1E7TUFBSSxDQUFDO01BQ3hDTyxXQUFXLEVBQUU7UUFBRWhCLENBQUMsRUFBRSxJQUFJLENBQUNRLElBQUk7UUFBRVAsQ0FBQyxFQUFFLElBQUksQ0FBQ1U7TUFBTyxDQUFDO01BQzdDTSxVQUFVLEVBQUU7UUFBRWpCLENBQUMsRUFBRSxJQUFJLENBQUNVLEtBQUs7UUFBRVQsQ0FBQyxFQUFFLElBQUksQ0FBQ1U7TUFBTztJQUM5QyxDQUFDO0VBQ0g7QUFDRixDQUFDO0FBQ0QsSUFBSU8sYUFBYSxHQUFJQyxPQUFPLElBQUs7RUFDL0IsSUFBSUMsTUFBTSxHQUFHLElBQUlyQixNQUFNLENBQUNvQixPQUFPLENBQUNFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztFQUN4RCxNQUFNO0lBQUVDO0VBQVUsQ0FBQyxHQUFHQyxnQkFBZ0IsQ0FBQ0osT0FBTyxDQUFDO0VBQy9DLElBQUlHLFNBQVMsRUFBRTtJQUNiRixNQUFNLEdBQUdJLHdCQUF3QixDQUFDSixNQUFNLEVBQUVFLFNBQVMsQ0FBQztFQUN0RDtFQUNBLE9BQU9GLE1BQU07QUFDZixDQUFDO0FBQ0QsSUFBSUksd0JBQXdCLEdBQUdBLENBQUNKLE1BQU0sRUFBRUUsU0FBUyxLQUFLO0VBQ3BELElBQUlHLFVBQVUsRUFBRUMsVUFBVTtFQUMxQixJQUFJSixTQUFTLENBQUNLLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtJQUNyQyxNQUFNQyxNQUFNLEdBQUdOLFNBQVMsQ0FBQ08sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ2pETCxVQUFVLEdBQUcsQ0FBQ0csTUFBTSxDQUFDLEVBQUUsQ0FBQztJQUN4QkYsVUFBVSxHQUFHLENBQUNFLE1BQU0sQ0FBQyxFQUFFLENBQUM7RUFDMUIsQ0FBQyxNQUFNLElBQUlOLFNBQVMsQ0FBQ0ssVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO0lBQzFDLE1BQU1DLE1BQU0sR0FBR04sU0FBUyxDQUFDTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNDLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDakRMLFVBQVUsR0FBRyxDQUFDRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCRixVQUFVLEdBQUcsQ0FBQ0UsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUN6QixDQUFDLE1BQU07SUFDTEgsVUFBVSxHQUFHLENBQUM7SUFDZEMsVUFBVSxHQUFHLENBQUM7RUFDaEI7RUFDQSxPQUFPLElBQUkzQixNQUFNLENBQUM7SUFDaEIsR0FBR3FCLE1BQU07SUFDVHBCLENBQUMsRUFBRW9CLE1BQU0sQ0FBQ3BCLENBQUMsR0FBR3lCLFVBQVU7SUFDeEJ4QixDQUFDLEVBQUVtQixNQUFNLENBQUNuQixDQUFDLEdBQUd5QjtFQUNoQixDQUFDLENBQUM7QUFDSixDQUFDO0FBQ0QsSUFBSUssYUFBYSxHQUFHQSxDQUFBLE1BQU87RUFBRS9CLENBQUMsRUFBRSxDQUFDO0VBQUVDLENBQUMsRUFBRTtBQUFFLENBQUMsQ0FBQztBQUMxQyxJQUFJK0Isa0JBQWtCLEdBQUdBLENBQUNDLGNBQWMsRUFBRUMsZUFBZSxLQUFLO0VBQzVELE9BQU9ELGNBQWMsQ0FBQ2pDLENBQUMsS0FBS2tDLGVBQWUsQ0FBQ2xDLENBQUMsSUFBSWlDLGNBQWMsQ0FBQ2hDLENBQUMsS0FBS2lDLGVBQWUsQ0FBQ2pDLENBQUM7QUFDekYsQ0FBQztBQUNELElBQUlrQyxlQUFlLEdBQUdBLENBQUNmLE1BQU0sRUFBRUUsU0FBUyxLQUFLO0VBQzNDLE9BQU8sSUFBSXZCLE1BQU0sQ0FBQztJQUNoQixHQUFHcUIsTUFBTTtJQUNUcEIsQ0FBQyxFQUFFb0IsTUFBTSxDQUFDcEIsQ0FBQyxHQUFHc0IsU0FBUyxDQUFDdEIsQ0FBQztJQUN6QkMsQ0FBQyxFQUFFbUIsTUFBTSxDQUFDbkIsQ0FBQyxHQUFHcUIsU0FBUyxDQUFDckI7RUFDMUIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUNELElBQUltQyxxQkFBcUIsR0FBR0EsQ0FBQ0MsVUFBVSxFQUFFQyxXQUFXLEtBQUs7RUFDdkQsT0FBT2hDLElBQUksQ0FBQ2lDLElBQUksQ0FDZGpDLElBQUksQ0FBQ2tDLEdBQUcsQ0FBQ0gsVUFBVSxDQUFDckMsQ0FBQyxHQUFHc0MsV0FBVyxDQUFDdEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHTSxJQUFJLENBQUNrQyxHQUFHLENBQUNILFVBQVUsQ0FBQ3BDLENBQUMsR0FBR3FDLFdBQVcsQ0FBQ3JDLENBQUMsRUFBRSxDQUFDLENBQ3RGLENBQUM7QUFDSCxDQUFDO0FBQ0QsSUFBSXdDLDBCQUEwQixHQUFHQSxDQUFDQyxXQUFXLEVBQUVDLFlBQVksS0FBSztFQUM5RCxNQUFNbEMsR0FBRyxHQUFHSCxJQUFJLENBQUNzQyxHQUFHLENBQUNGLFdBQVcsQ0FBQ2pDLEdBQUcsRUFBRWtDLFlBQVksQ0FBQ2xDLEdBQUcsQ0FBQztFQUN2RCxNQUFNRCxJQUFJLEdBQUdGLElBQUksQ0FBQ3NDLEdBQUcsQ0FBQ0YsV0FBVyxDQUFDbEMsSUFBSSxFQUFFbUMsWUFBWSxDQUFDbkMsSUFBSSxDQUFDO0VBQzFELE1BQU1FLEtBQUssR0FBR0osSUFBSSxDQUFDdUMsR0FBRyxDQUFDSCxXQUFXLENBQUNoQyxLQUFLLEVBQUVpQyxZQUFZLENBQUNqQyxLQUFLLENBQUM7RUFDN0QsTUFBTUMsTUFBTSxHQUFHTCxJQUFJLENBQUN1QyxHQUFHLENBQUNILFdBQVcsQ0FBQy9CLE1BQU0sRUFBRWdDLFlBQVksQ0FBQ2hDLE1BQU0sQ0FBQztFQUNoRSxNQUFNVCxLQUFLLEdBQUdRLEtBQUssR0FBR0YsSUFBSTtFQUMxQixNQUFNTCxNQUFNLEdBQUdRLE1BQU0sR0FBR0YsR0FBRztFQUMzQixJQUFJRCxJQUFJLEdBQUdFLEtBQUssSUFBSUQsR0FBRyxHQUFHRSxNQUFNLEVBQUU7SUFDaEMsTUFBTW1DLFdBQVcsR0FBR0osV0FBVyxDQUFDeEMsS0FBSyxHQUFHd0MsV0FBVyxDQUFDdkMsTUFBTTtJQUMxRCxNQUFNNEMsV0FBVyxHQUFHSixZQUFZLENBQUN6QyxLQUFLLEdBQUd5QyxZQUFZLENBQUN4QyxNQUFNO0lBQzVELE1BQU02QyxnQkFBZ0IsR0FBRzlDLEtBQUssR0FBR0MsTUFBTTtJQUN2QyxPQUFPNkMsZ0JBQWdCLElBQUlGLFdBQVcsR0FBR0MsV0FBVyxHQUFHQyxnQkFBZ0IsQ0FBQztFQUMxRTtFQUNBLE9BQU8sQ0FBQztBQUNWLENBQUM7QUFDRCxJQUFJQyxlQUFlLEdBQUdBLENBQUNQLFdBQVcsRUFBRUMsWUFBWSxLQUFLO0VBQ25ELE9BQU9ELFdBQVcsQ0FBQzFDLENBQUMsS0FBSzJDLFlBQVksQ0FBQzNDLENBQUMsSUFBSTBDLFdBQVcsQ0FBQ3pDLENBQUMsS0FBSzBDLFlBQVksQ0FBQzFDLENBQUMsSUFBSXlDLFdBQVcsQ0FBQ3hDLEtBQUssS0FBS3lDLFlBQVksQ0FBQ3pDLEtBQUssSUFBSXdDLFdBQVcsQ0FBQ3ZDLE1BQU0sS0FBS3dDLFlBQVksQ0FBQ3hDLE1BQU07QUFDdkssQ0FBQzs7QUFFRDtBQUNBLElBQUkrQyxhQUFhLEdBQUdBLENBQUNDLFNBQVMsRUFBRUMsVUFBVSxFQUFFQyxPQUFPLEtBQUs7RUFDdEQsTUFBTUMsTUFBTSxHQUFHSCxTQUFTLENBQUNJLFdBQVcsQ0FBQzNDLE1BQU07RUFDM0MsTUFBTTRDLFNBQVMsR0FBRztJQUFFQyxRQUFRLEVBQUVDLFFBQVE7SUFBRUMsU0FBUyxFQUFFO0VBQUssQ0FBQztFQUN6RCxLQUFLLE1BQU1BLFNBQVMsSUFBSVAsVUFBVSxFQUFFO0lBQ2xDLE1BQU1LLFFBQVEsR0FBR3JCLHFCQUFxQixDQUFDa0IsTUFBTSxFQUFFSyxTQUFTLENBQUN2QyxNQUFNLENBQUNSLE1BQU0sQ0FBQztJQUN2RSxJQUFJNkMsUUFBUSxHQUFHRCxTQUFTLENBQUNDLFFBQVEsRUFBRTtNQUNqQ0QsU0FBUyxDQUFDQyxRQUFRLEdBQUdBLFFBQVE7TUFDN0JELFNBQVMsQ0FBQ0csU0FBUyxHQUFHQSxTQUFTO0lBQ2pDLENBQUMsTUFBTSxJQUFJRixRQUFRLEtBQUtELFNBQVMsQ0FBQ0MsUUFBUSxJQUFJRSxTQUFTLENBQUNDLEVBQUUsS0FBS1AsT0FBTyxDQUFDUSxpQkFBaUIsRUFBRTtNQUN4RkwsU0FBUyxDQUFDRyxTQUFTLEdBQUdBLFNBQVM7SUFDakM7RUFDRjtFQUNBLE9BQU9ILFNBQVMsQ0FBQ0csU0FBUztBQUM1QixDQUFDO0FBQ0QsSUFBSUcsY0FBYyxHQUFHQSxDQUFDWCxTQUFTLEVBQUVDLFVBQVUsRUFBRUMsT0FBTyxLQUFLO0VBQ3ZELE1BQU1VLGdCQUFnQixHQUFHWixTQUFTLENBQUNJLFdBQVcsQ0FBQzFDLE9BQU87RUFDdEQsTUFBTTJDLFNBQVMsR0FBRztJQUFFQyxRQUFRLEVBQUVDLFFBQVE7SUFBRUMsU0FBUyxFQUFFO0VBQUssQ0FBQztFQUN6RCxLQUFLLE1BQU1BLFNBQVMsSUFBSVAsVUFBVSxFQUFFO0lBQ2xDLE1BQU1ZLGdCQUFnQixHQUFHTCxTQUFTLENBQUN2QyxNQUFNLENBQUNQLE9BQU87SUFDakQsTUFBTTRDLFFBQVEsR0FBR3JCLHFCQUFxQixDQUNwQzRCLGdCQUFnQixDQUFDbEQsT0FBTyxFQUN4QmlELGdCQUFnQixDQUFDakQsT0FDbkIsQ0FBQyxHQUFHc0IscUJBQXFCLENBQ3ZCNEIsZ0JBQWdCLENBQUNqRCxRQUFRLEVBQ3pCZ0QsZ0JBQWdCLENBQUNoRCxRQUNuQixDQUFDLEdBQUdxQixxQkFBcUIsQ0FDdkI0QixnQkFBZ0IsQ0FBQ2hELFdBQVcsRUFDNUIrQyxnQkFBZ0IsQ0FBQy9DLFdBQ25CLENBQUMsR0FBR29CLHFCQUFxQixDQUN2QjRCLGdCQUFnQixDQUFDL0MsVUFBVSxFQUMzQjhDLGdCQUFnQixDQUFDOUMsVUFDbkIsQ0FBQztJQUNELElBQUl3QyxRQUFRLEdBQUdELFNBQVMsQ0FBQ0MsUUFBUSxFQUFFO01BQ2pDRCxTQUFTLENBQUNDLFFBQVEsR0FBR0EsUUFBUTtNQUM3QkQsU0FBUyxDQUFDRyxTQUFTLEdBQUdBLFNBQVM7SUFDakMsQ0FBQyxNQUFNLElBQUlGLFFBQVEsS0FBS0QsU0FBUyxDQUFDQyxRQUFRLElBQUlFLFNBQVMsQ0FBQ0MsRUFBRSxLQUFLUCxPQUFPLENBQUNRLGlCQUFpQixFQUFFO01BQ3hGTCxTQUFTLENBQUNHLFNBQVMsR0FBR0EsU0FBUztJQUNqQztFQUNGO0VBQ0EsT0FBT0gsU0FBUyxDQUFDRyxTQUFTO0FBQzVCLENBQUM7QUFDRCxJQUFJTSxnQkFBZ0IsR0FBR0EsQ0FBQ2QsU0FBUyxFQUFFQyxVQUFVLEVBQUVDLE9BQU8sS0FBSztFQUN6RCxNQUFNYSxlQUFlLEdBQUdmLFNBQVMsQ0FBQ0ksV0FBVztFQUM3QyxNQUFNQyxTQUFTLEdBQUc7SUFBRVcsS0FBSyxFQUFFLENBQUM7SUFBRVIsU0FBUyxFQUFFO0VBQUssQ0FBQztFQUMvQyxLQUFLLE1BQU1BLFNBQVMsSUFBSVAsVUFBVSxFQUFFO0lBQ2xDLE1BQU1lLEtBQUssR0FBRzFCLDBCQUEwQixDQUFDeUIsZUFBZSxFQUFFUCxTQUFTLENBQUN2QyxNQUFNLENBQUM7SUFDM0UsSUFBSStDLEtBQUssR0FBR1gsU0FBUyxDQUFDVyxLQUFLLEVBQUU7TUFDM0JYLFNBQVMsQ0FBQ1csS0FBSyxHQUFHQSxLQUFLO01BQ3ZCWCxTQUFTLENBQUNHLFNBQVMsR0FBR0EsU0FBUztJQUNqQyxDQUFDLE1BQU0sSUFBSVEsS0FBSyxHQUFHLENBQUMsSUFBSUEsS0FBSyxLQUFLWCxTQUFTLENBQUNXLEtBQUssSUFBSVIsU0FBUyxDQUFDQyxFQUFFLEtBQUtQLE9BQU8sQ0FBQ1EsaUJBQWlCLEVBQUU7TUFDL0ZMLFNBQVMsQ0FBQ0csU0FBUyxHQUFHQSxTQUFTO0lBQ2pDO0VBQ0Y7RUFDQSxPQUFPSCxTQUFTLENBQUNHLFNBQVM7QUFDNUIsQ0FBQzs7QUFFRDtBQUNBLElBQUlTLE9BQU8sR0FBRzNFLGFBQWEsQ0FBQyxDQUFDO0FBQzdCLElBQUk0RSxnQkFBZ0IsR0FBSUMsV0FBVyxJQUFLO0VBQ3RDLE1BQU1DLEtBQUssR0FBRzVFLFVBQVUsQ0FDdEI7SUFBRTZFLGlCQUFpQixFQUFFUDtFQUFpQixDQUFDLEVBQ3ZDSyxXQUNGLENBQUM7RUFDRCxNQUFNLENBQUNHLEtBQUssRUFBRUMsUUFBUSxDQUFDLEdBQUc1RSxXQUFXLENBQUM7SUFDcEM2RSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2R2QixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ2R3QixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ1hDLE1BQU0sRUFBRTtNQUNOQyxXQUFXLEVBQUUsSUFBSTtNQUNqQixJQUFJM0IsU0FBU0EsQ0FBQSxFQUFHO1FBQ2QsT0FBT3NCLEtBQUssQ0FBQ0ksTUFBTSxDQUFDQyxXQUFXLEtBQUssSUFBSSxHQUFHTCxLQUFLLENBQUNFLFVBQVUsQ0FBQ0YsS0FBSyxDQUFDSSxNQUFNLENBQUNDLFdBQVcsQ0FBQyxHQUFHLElBQUk7TUFDOUYsQ0FBQztNQUNEQyxXQUFXLEVBQUUsSUFBSTtNQUNqQixJQUFJcEIsU0FBU0EsQ0FBQSxFQUFHO1FBQ2QsT0FBT2MsS0FBSyxDQUFDSSxNQUFNLENBQUNFLFdBQVcsS0FBSyxJQUFJLEdBQUdOLEtBQUssQ0FBQ3JCLFVBQVUsQ0FBQ3FCLEtBQUssQ0FBQ0ksTUFBTSxDQUFDRSxXQUFXLENBQUMsR0FBRyxJQUFJO01BQzlGLENBQUM7TUFDREMsUUFBUSxFQUFFLElBQUk7TUFDZCxJQUFJQyxNQUFNQSxDQUFBLEVBQUc7UUFDWCxPQUFPUixLQUFLLENBQUNJLE1BQU0sQ0FBQ0csUUFBUSxLQUFLLElBQUksR0FBR1AsS0FBSyxDQUFDRyxPQUFPLENBQUNILEtBQUssQ0FBQ0ksTUFBTSxDQUFDRyxRQUFRLENBQUMsR0FBRyxJQUFJO01BQ3JGLENBQUM7TUFDREUsT0FBTyxFQUFFO0lBQ1g7RUFDRixDQUFDLENBQUM7RUFDRixNQUFNQyxjQUFjLEdBQUdBLENBQUNDLElBQUksRUFBRXhCLEVBQUUsRUFBRXlCLFdBQVcsS0FBSztJQUNoRCxNQUFNQyxXQUFXLEdBQUdGLElBQUksQ0FBQ0csU0FBUyxDQUFDLENBQUMsRUFBRUgsSUFBSSxDQUFDSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQzVGLE9BQU8sQ0FBQyxNQUFNNkUsS0FBSyxDQUFDVyxJQUFJLENBQUMsQ0FBQ3hCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7TUFDbkM2QixPQUFPLENBQUNDLElBQUksQ0FDVCx5Q0FBd0NKLFdBQVksYUFBWTFCLEVBQUcsRUFDdEUsQ0FBQztNQUNEO0lBQ0Y7SUFDQWMsUUFBUSxDQUFDVSxJQUFJLEVBQUV4QixFQUFFLEVBQUUsY0FBYyxFQUFFeUIsV0FBVyxDQUFDekIsRUFBRSxFQUFFeUIsV0FBVyxDQUFDO0VBQ2pFLENBQUM7RUFDRCxNQUFNTSxpQkFBaUIsR0FBR0EsQ0FBQ1AsSUFBSSxFQUFFeEIsRUFBRSxFQUFFZ0MsYUFBYSxLQUFLO0lBQ3JELE1BQU1OLFdBQVcsR0FBR0YsSUFBSSxDQUFDRyxTQUFTLENBQUMsQ0FBQyxFQUFFSCxJQUFJLENBQUNJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdEQsSUFBSSxDQUFDNUYsT0FBTyxDQUFDLE1BQU02RSxLQUFLLENBQUNXLElBQUksQ0FBQyxDQUFDeEIsRUFBRSxDQUFDLENBQUMsRUFBRTtNQUNuQzZCLE9BQU8sQ0FBQ0MsSUFBSSxDQUNULDhDQUE2Q0osV0FBWSxhQUFZMUIsRUFBRyxFQUMzRSxDQUFDO01BQ0Q7SUFDRjtJQUNBLElBQUksQ0FBQ2hFLE9BQU8sQ0FBQyxNQUFNNkUsS0FBSyxDQUFDVyxJQUFJLENBQUMsQ0FBQ3hCLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDZ0MsYUFBYSxDQUFDLENBQUMsRUFBRTtNQUNsRUgsT0FBTyxDQUFDQyxJQUFJLENBQ1Qsc0JBQXFCSixXQUFZLFlBQVcxQixFQUFHLHNDQUFxQ2dDLGFBQWMsRUFDckcsQ0FBQztNQUNEO0lBQ0Y7SUFDQWxCLFFBQVEsQ0FBQ1UsSUFBSSxFQUFFeEIsRUFBRSxFQUFFLGNBQWMsRUFBRWdDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztFQUMzRCxDQUFDO0VBQ0QsTUFBTUMsWUFBWSxHQUFHQSxDQUFDO0lBQ3BCakMsRUFBRTtJQUNGa0MsSUFBSTtJQUNKMUUsTUFBTTtJQUNOMkU7RUFDRixDQUFDLEtBQUs7SUFDSixNQUFNQyxpQkFBaUIsR0FBR3ZCLEtBQUssQ0FBQ0UsVUFBVSxDQUFDZixFQUFFLENBQUM7SUFDOUMsTUFBTVQsU0FBUyxHQUFHO01BQ2hCUyxFQUFFO01BQ0ZrQyxJQUFJO01BQ0oxRSxNQUFNO01BQ04yRSxJQUFJO01BQ0pFLGVBQWUsRUFBRTtJQUNuQixDQUFDO0lBQ0QsSUFBSVosV0FBVztJQUNmLElBQUksQ0FBQ1csaUJBQWlCLEVBQUU7TUFDdEJFLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUNoRCxTQUFTLEVBQUU7UUFDakNpRCxZQUFZLEVBQUU7VUFDWkMsVUFBVSxFQUFFLElBQUk7VUFDaEJDLFlBQVksRUFBRSxJQUFJO1VBQ2xCQyxRQUFRLEVBQUUsSUFBSTtVQUNkQyxLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7UUFDRGxGLFNBQVMsRUFBRTtVQUNUK0UsVUFBVSxFQUFFLElBQUk7VUFDaEJDLFlBQVksRUFBRSxJQUFJO1VBQ2xCRyxHQUFHLEVBQUVBLENBQUEsS0FBTTtZQUNULElBQUloQyxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTyxFQUFFO2NBQ3hCLE9BQU9uRCxhQUFhLENBQUMsQ0FBQztZQUN4QjtZQUNBLE1BQU1xRSxZQUFZLEdBQUdGLE1BQU0sQ0FBQ1EsTUFBTSxDQUNoQ2pDLEtBQUssQ0FBQ0UsVUFBVSxDQUFDZixFQUFFLENBQUMsQ0FBQ3dDLFlBQ3ZCLENBQUM7WUFDREEsWUFBWSxDQUFDTyxJQUFJLENBQUMsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEtBQUtELENBQUMsQ0FBQ0UsS0FBSyxHQUFHRCxDQUFDLENBQUNDLEtBQUssQ0FBQztZQUM5QyxPQUFPVixZQUFZLENBQUNXLE1BQU0sQ0FDeEIsQ0FBQ3pGLFNBQVMsRUFBRTBGLFlBQVksS0FBSztjQUMzQixPQUFPQSxZQUFZLENBQUNDLFFBQVEsQ0FBQzNGLFNBQVMsQ0FBQztZQUN6QyxDQUFDLEVBQ0RTLGFBQWEsQ0FBQyxDQUNoQixDQUFDO1VBQ0g7UUFDRixDQUFDO1FBQ0R3QixXQUFXLEVBQUU7VUFDWDhDLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxZQUFZLEVBQUUsSUFBSTtVQUNsQkcsR0FBRyxFQUFFQSxDQUFBLEtBQU07WUFDVCxPQUFPdEUsZUFBZSxDQUNwQnNDLEtBQUssQ0FBQ0UsVUFBVSxDQUFDZixFQUFFLENBQUMsQ0FBQ3hDLE1BQU0sRUFDM0JxRCxLQUFLLENBQUNFLFVBQVUsQ0FBQ2YsRUFBRSxDQUFDLENBQUN0QyxTQUN2QixDQUFDO1VBQ0g7UUFDRjtNQUNGLENBQUMsQ0FBQztJQUNKLENBQUMsTUFBTSxJQUFJbUQsS0FBSyxDQUFDSSxNQUFNLENBQUNDLFdBQVcsS0FBS2xCLEVBQUUsSUFBSSxDQUFDYSxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTyxFQUFFO01BQ25FLE1BQU1nQyxXQUFXLEdBQUc7UUFDbEJsSCxDQUFDLEVBQUVnRyxpQkFBaUIsQ0FBQzVFLE1BQU0sQ0FBQ3BCLENBQUMsR0FBR29CLE1BQU0sQ0FBQ3BCLENBQUM7UUFDeENDLENBQUMsRUFBRStGLGlCQUFpQixDQUFDNUUsTUFBTSxDQUFDbkIsQ0FBQyxHQUFHbUIsTUFBTSxDQUFDbkI7TUFDekMsQ0FBQztNQUNELE1BQU0yRixhQUFhLEdBQUcsOEJBQThCO01BQ3BELE1BQU11QixtQkFBbUIsR0FBR25CLGlCQUFpQixDQUFDSSxZQUFZLENBQUNSLGFBQWEsQ0FBQztNQUN6RSxNQUFNd0IsZUFBZSxHQUFHRCxtQkFBbUIsR0FBR0EsbUJBQW1CLENBQUNGLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDLEdBQUdBLFdBQVc7TUFDckc3QixXQUFXLEdBQUc7UUFDWnpCLEVBQUUsRUFBRWdDLGFBQWE7UUFDakJrQixLQUFLLEVBQUUsR0FBRztRQUNWRyxRQUFRLEVBQUczRixTQUFTLElBQUs7VUFDdkIsT0FBTztZQUNMdEIsQ0FBQyxFQUFFc0IsU0FBUyxDQUFDdEIsQ0FBQyxHQUFHb0gsZUFBZSxDQUFDcEgsQ0FBQztZQUNsQ0MsQ0FBQyxFQUFFcUIsU0FBUyxDQUFDckIsQ0FBQyxHQUFHbUgsZUFBZSxDQUFDbkg7VUFDbkMsQ0FBQztRQUNIO01BQ0YsQ0FBQztNQUNEb0gsU0FBUyxDQUFDLE1BQU0xQixpQkFBaUIsQ0FBQyxZQUFZLEVBQUUvQixFQUFFLEVBQUVnQyxhQUFhLENBQUMsQ0FBQztJQUNyRTtJQUNBcEcsS0FBSyxDQUFDLE1BQU07TUFDVmtGLFFBQVEsQ0FBQyxZQUFZLEVBQUVkLEVBQUUsRUFBRVQsU0FBUyxDQUFDO01BQ3JDLElBQUlrQyxXQUFXLEVBQUU7UUFDZkYsY0FBYyxDQUFDLFlBQVksRUFBRXZCLEVBQUUsRUFBRXlCLFdBQVcsQ0FBQztNQUMvQztJQUNGLENBQUMsQ0FBQztJQUNGLElBQUlaLEtBQUssQ0FBQ0ksTUFBTSxDQUFDMUIsU0FBUyxFQUFFO01BQzFCbUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQjtFQUNGLENBQUM7RUFDRCxNQUFNQyxlQUFlLEdBQUkzRCxFQUFFLElBQUs7SUFDOUIsSUFBSSxDQUFDaEUsT0FBTyxDQUFDLE1BQU02RSxLQUFLLENBQUNFLFVBQVUsQ0FBQ2YsRUFBRSxDQUFDLENBQUMsRUFBRTtNQUN4QzZCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFFLGdEQUErQzlCLEVBQUcsRUFBQyxDQUFDO01BQ2xFO0lBQ0Y7SUFDQWMsUUFBUSxDQUFDLFlBQVksRUFBRWQsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQztJQUNuRDRELGNBQWMsQ0FBQyxNQUFNQyxnQkFBZ0IsQ0FBQzdELEVBQUUsQ0FBQyxDQUFDO0VBQzVDLENBQUM7RUFDRCxNQUFNNkQsZ0JBQWdCLEdBQUk3RCxFQUFFLElBQUs7SUFDL0IsSUFBSWEsS0FBSyxDQUFDRSxVQUFVLENBQUNmLEVBQUUsQ0FBQyxFQUFFcUMsZUFBZSxFQUFFO01BQ3pDLE1BQU15QixhQUFhLEdBQUdqRCxLQUFLLENBQUNJLE1BQU0sQ0FBQ0MsV0FBVyxLQUFLbEIsRUFBRTtNQUNyRHBFLEtBQUssQ0FBQyxNQUFNO1FBQ1YsSUFBSWtJLGFBQWEsRUFBRTtVQUNqQmhELFFBQVEsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQztRQUN6QztRQUNBQSxRQUFRLENBQUMsWUFBWSxFQUFFZCxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7TUFDcEMsQ0FBQyxDQUFDO0lBQ0o7RUFDRixDQUFDO0VBQ0QsTUFBTStELFlBQVksR0FBR0EsQ0FBQztJQUNwQi9ELEVBQUU7SUFDRmtDLElBQUk7SUFDSjFFLE1BQU07SUFDTjJFO0VBQ0YsQ0FBQyxLQUFLO0lBQ0osTUFBTTZCLGlCQUFpQixHQUFHbkQsS0FBSyxDQUFDckIsVUFBVSxDQUFDUSxFQUFFLENBQUM7SUFDOUMsTUFBTUQsU0FBUyxHQUFHO01BQ2hCQyxFQUFFO01BQ0ZrQyxJQUFJO01BQ0oxRSxNQUFNO01BQ04yRSxJQUFJO01BQ0pFLGVBQWUsRUFBRTtJQUNuQixDQUFDO0lBQ0QsSUFBSSxDQUFDMkIsaUJBQWlCLEVBQUU7TUFDdEIxQixNQUFNLENBQUNDLGdCQUFnQixDQUFDeEMsU0FBUyxFQUFFO1FBQ2pDeUMsWUFBWSxFQUFFO1VBQ1pDLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxZQUFZLEVBQUUsSUFBSTtVQUNsQkMsUUFBUSxFQUFFLElBQUk7VUFDZEMsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDO1FBQ0RsRixTQUFTLEVBQUU7VUFDVCtFLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxZQUFZLEVBQUUsSUFBSTtVQUNsQkcsR0FBRyxFQUFFQSxDQUFBLEtBQU07WUFDVCxNQUFNTCxZQUFZLEdBQUdGLE1BQU0sQ0FBQ1EsTUFBTSxDQUNoQ2pDLEtBQUssQ0FBQ3JCLFVBQVUsQ0FBQ1EsRUFBRSxDQUFDLENBQUN3QyxZQUN2QixDQUFDO1lBQ0RBLFlBQVksQ0FBQ08sSUFBSSxDQUFDLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxLQUFLRCxDQUFDLENBQUNFLEtBQUssR0FBR0QsQ0FBQyxDQUFDQyxLQUFLLENBQUM7WUFDOUMsT0FBT1YsWUFBWSxDQUFDVyxNQUFNLENBQ3hCLENBQUN6RixTQUFTLEVBQUUrRCxXQUFXLEtBQUs7Y0FDMUIsT0FBT0EsV0FBVyxDQUFDNEIsUUFBUSxDQUFDM0YsU0FBUyxDQUFDO1lBQ3hDLENBQUMsRUFDRFMsYUFBYSxDQUFDLENBQ2hCLENBQUM7VUFDSDtRQUNGLENBQUM7UUFDRHdCLFdBQVcsRUFBRTtVQUNYOEMsVUFBVSxFQUFFLElBQUk7VUFDaEJDLFlBQVksRUFBRSxJQUFJO1VBQ2xCRyxHQUFHLEVBQUVBLENBQUEsS0FBTTtZQUNULE9BQU90RSxlQUFlLENBQ3BCc0MsS0FBSyxDQUFDckIsVUFBVSxDQUFDUSxFQUFFLENBQUMsQ0FBQ3hDLE1BQU0sRUFDM0JxRCxLQUFLLENBQUNyQixVQUFVLENBQUNRLEVBQUUsQ0FBQyxDQUFDdEMsU0FDdkIsQ0FBQztVQUNIO1FBQ0Y7TUFDRixDQUFDLENBQUM7SUFDSjtJQUNBb0QsUUFBUSxDQUFDLFlBQVksRUFBRWQsRUFBRSxFQUFFRCxTQUFTLENBQUM7SUFDckMsSUFBSWMsS0FBSyxDQUFDSSxNQUFNLENBQUMxQixTQUFTLEVBQUU7TUFDMUJtRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BCO0VBQ0YsQ0FBQztFQUNELE1BQU1PLGVBQWUsR0FBSWpFLEVBQUUsSUFBSztJQUM5QixJQUFJLENBQUNoRSxPQUFPLENBQUMsTUFBTTZFLEtBQUssQ0FBQ3JCLFVBQVUsQ0FBQ1EsRUFBRSxDQUFDLENBQUMsRUFBRTtNQUN4QzZCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFFLGdEQUErQzlCLEVBQUcsRUFBQyxDQUFDO01BQ2xFO0lBQ0Y7SUFDQWMsUUFBUSxDQUFDLFlBQVksRUFBRWQsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQztJQUNuRDRELGNBQWMsQ0FBQyxNQUFNTSxnQkFBZ0IsQ0FBQ2xFLEVBQUUsQ0FBQyxDQUFDO0VBQzVDLENBQUM7RUFDRCxNQUFNa0UsZ0JBQWdCLEdBQUlsRSxFQUFFLElBQUs7SUFDL0IsSUFBSWEsS0FBSyxDQUFDckIsVUFBVSxDQUFDUSxFQUFFLENBQUMsRUFBRXFDLGVBQWUsRUFBRTtNQUN6QyxNQUFNeUIsYUFBYSxHQUFHakQsS0FBSyxDQUFDSSxNQUFNLENBQUNFLFdBQVcsS0FBS25CLEVBQUU7TUFDckRwRSxLQUFLLENBQUMsTUFBTTtRQUNWLElBQUlrSSxhQUFhLEVBQUU7VUFDakJoRCxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUM7UUFDekM7UUFDQUEsUUFBUSxDQUFDLFlBQVksRUFBRWQsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO01BQ3BDLENBQUMsQ0FBQztJQUNKO0VBQ0YsQ0FBQztFQUNELE1BQU1tRSxTQUFTLEdBQUdBLENBQUM7SUFBRW5FLEVBQUU7SUFBRW9FO0VBQVcsQ0FBQyxLQUFLO0lBQ3hDdEQsUUFBUSxDQUFDLFNBQVMsRUFBRWQsRUFBRSxFQUFFO01BQ3RCQSxFQUFFO01BQ0ZvRSxVQUFVO01BQ1ZDLFdBQVcsRUFBRTtRQUNYQyxNQUFNLEVBQUU7VUFBRWxJLENBQUMsRUFBRSxDQUFDO1VBQUVDLENBQUMsRUFBRTtRQUFFLENBQUM7UUFDdEJrSSxPQUFPLEVBQUU7VUFBRW5JLENBQUMsRUFBRSxDQUFDO1VBQUVDLENBQUMsRUFBRTtRQUFFLENBQUM7UUFDdkIsSUFBSW1JLEtBQUtBLENBQUEsRUFBRztVQUNWLE9BQU87WUFDTHBJLENBQUMsRUFBRXlFLEtBQUssQ0FBQ0csT0FBTyxDQUFDaEIsRUFBRSxDQUFDLENBQUNxRSxXQUFXLENBQUNFLE9BQU8sQ0FBQ25JLENBQUMsR0FBR3lFLEtBQUssQ0FBQ0csT0FBTyxDQUFDaEIsRUFBRSxDQUFDLENBQUNxRSxXQUFXLENBQUNDLE1BQU0sQ0FBQ2xJLENBQUM7WUFDbkZDLENBQUMsRUFBRXdFLEtBQUssQ0FBQ0csT0FBTyxDQUFDaEIsRUFBRSxDQUFDLENBQUNxRSxXQUFXLENBQUNFLE9BQU8sQ0FBQ2xJLENBQUMsR0FBR3dFLEtBQUssQ0FBQ0csT0FBTyxDQUFDaEIsRUFBRSxDQUFDLENBQUNxRSxXQUFXLENBQUNDLE1BQU0sQ0FBQ2pJO1VBQ3BGLENBQUM7UUFDSDtNQUNGO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQztFQUNELE1BQU1vSSxZQUFZLEdBQUl6RSxFQUFFLElBQUs7SUFDM0IsSUFBSSxDQUFDaEUsT0FBTyxDQUFDLE1BQU02RSxLQUFLLENBQUNHLE9BQU8sQ0FBQ2hCLEVBQUUsQ0FBQyxDQUFDLEVBQUU7TUFDckM2QixPQUFPLENBQUNDLElBQUksQ0FBRSw2Q0FBNEM5QixFQUFHLEVBQUMsQ0FBQztNQUMvRDtJQUNGO0lBQ0EsTUFBTThELGFBQWEsR0FBR2pELEtBQUssQ0FBQ0ksTUFBTSxDQUFDRyxRQUFRLEtBQUtwQixFQUFFO0lBQ2xEcEUsS0FBSyxDQUFDLE1BQU07TUFDVixJQUFJa0ksYUFBYSxFQUFFO1FBQ2pCaEQsUUFBUSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDO01BQ3RDO01BQ0FBLFFBQVEsQ0FBQyxTQUFTLEVBQUVkLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUM7RUFDSixDQUFDO0VBQ0QsTUFBTTBFLFVBQVUsR0FBR0EsQ0FBQztJQUFFeEMsSUFBSTtJQUFFMUU7RUFBTyxDQUFDLEtBQUs7SUFDdkMsTUFBTW1ILFFBQVEsR0FBRzlELEtBQUssQ0FBQ0ksTUFBTSxDQUFDSyxPQUFPO0lBQ3JDLE1BQU1BLE9BQU8sR0FBRztNQUNkWSxJQUFJO01BQ0oxRTtJQUNGLENBQUM7SUFDRCxJQUFJLENBQUNtSCxRQUFRLEVBQUU7TUFDYnJDLE1BQU0sQ0FBQ0MsZ0JBQWdCLENBQUNqQixPQUFPLEVBQUU7UUFDL0J0QixFQUFFLEVBQUU7VUFDRnlDLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxZQUFZLEVBQUUsSUFBSTtVQUNsQkcsR0FBRyxFQUFFQSxDQUFBLEtBQU1oQyxLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVMsRUFBRVM7UUFDckMsQ0FBQztRQUNEbUMsSUFBSSxFQUFFO1VBQ0pNLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxZQUFZLEVBQUUsSUFBSTtVQUNsQkcsR0FBRyxFQUFFQSxDQUFBLEtBQU1oQyxLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVMsRUFBRTRDO1FBQ3JDLENBQUM7UUFDREssWUFBWSxFQUFFO1VBQ1pDLFVBQVUsRUFBRSxJQUFJO1VBQ2hCQyxZQUFZLEVBQUUsSUFBSTtVQUNsQkcsR0FBRyxFQUFFQSxDQUFBLEtBQU1QLE1BQU0sQ0FBQ3NDLFdBQVcsQ0FDM0J0QyxNQUFNLENBQUN1QyxPQUFPLENBQ1poRSxLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVMsR0FBR3NCLEtBQUssQ0FBQ0ksTUFBTSxDQUFDMUIsU0FBUyxDQUFDaUQsWUFBWSxHQUFHLENBQUMsQ0FDbEUsQ0FBQyxDQUFDc0MsTUFBTSxDQUFDLENBQUMsQ0FBQzlFLEVBQUUsQ0FBQyxLQUFLQSxFQUFFLEtBQUssOEJBQThCLENBQzFEO1FBQ0YsQ0FBQztRQUNEdEMsU0FBUyxFQUFFO1VBQ1QrRSxVQUFVLEVBQUUsSUFBSTtVQUNoQkMsWUFBWSxFQUFFLElBQUk7VUFDbEJHLEdBQUcsRUFBRUEsQ0FBQSxLQUFNO1lBQ1QsTUFBTUwsWUFBWSxHQUFHRixNQUFNLENBQUNRLE1BQU0sQ0FDaENqQyxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTyxHQUFHVCxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTyxDQUFDa0IsWUFBWSxHQUFHLEVBQzdELENBQUM7WUFDREEsWUFBWSxDQUFDTyxJQUFJLENBQUMsQ0FBQ0MsQ0FBQyxFQUFFQyxDQUFDLEtBQUtELENBQUMsQ0FBQ0UsS0FBSyxHQUFHRCxDQUFDLENBQUNDLEtBQUssQ0FBQztZQUM5QyxPQUFPVixZQUFZLENBQUNXLE1BQU0sQ0FDeEIsQ0FBQ3pGLFNBQVMsRUFBRStELFdBQVcsS0FBSztjQUMxQixPQUFPQSxXQUFXLENBQUM0QixRQUFRLENBQUMzRixTQUFTLENBQUM7WUFDeEMsQ0FBQyxFQUNEUyxhQUFhLENBQUMsQ0FDaEIsQ0FBQztVQUNIO1FBQ0YsQ0FBQztRQUNEd0IsV0FBVyxFQUFFO1VBQ1g4QyxVQUFVLEVBQUUsSUFBSTtVQUNoQkMsWUFBWSxFQUFFLElBQUk7VUFDbEJHLEdBQUcsRUFBRUEsQ0FBQSxLQUFNO1lBQ1QsT0FBT2hDLEtBQUssQ0FBQ0ksTUFBTSxDQUFDSyxPQUFPLEdBQUcvQyxlQUFlLENBQzNDc0MsS0FBSyxDQUFDSSxNQUFNLENBQUNLLE9BQU8sQ0FBQzlELE1BQU0sRUFDM0JxRCxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTyxDQUFDNUQsU0FDdkIsQ0FBQyxHQUFHLElBQUl2QixNQUFNLENBQUM7Y0FBRUMsQ0FBQyxFQUFFLENBQUM7Y0FBRUMsQ0FBQyxFQUFFLENBQUM7Y0FBRUMsS0FBSyxFQUFFLENBQUM7Y0FBRUMsTUFBTSxFQUFFO1lBQUUsQ0FBQyxDQUFDO1VBQ3JEO1FBQ0Y7TUFDRixDQUFDLENBQUM7SUFDSjtJQUNBdUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUVRLE9BQU8sQ0FBQztFQUN4QyxDQUFDO0VBQ0QsTUFBTXlELFlBQVksR0FBR0EsQ0FBQSxLQUFNakUsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDO0VBQzlELE1BQU1rRSxXQUFXLEdBQUdBLENBQUNoRixFQUFFLEVBQUVxRSxXQUFXLEtBQUs7SUFDdkN6SSxLQUFLLENBQUMsTUFBTTtNQUNWa0YsUUFBUSxDQUFDLFNBQVMsRUFBRWQsRUFBRSxFQUFFLGFBQWEsRUFBRTtRQUNyQ3NFLE1BQU0sRUFBRTtVQUFFLEdBQUdEO1FBQVksQ0FBQztRQUMxQkUsT0FBTyxFQUFFO1VBQUUsR0FBR0Y7UUFBWTtNQUM1QixDQUFDLENBQUM7TUFDRnZELFFBQVEsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFZCxFQUFFLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0VBQ0osQ0FBQztFQUNELE1BQU1pRixVQUFVLEdBQUlaLFdBQVcsSUFBSztJQUNsQyxNQUFNakQsUUFBUSxHQUFHUCxLQUFLLENBQUNJLE1BQU0sQ0FBQ0csUUFBUTtJQUN0QyxJQUFJLENBQUNBLFFBQVEsRUFBRTtNQUNiUyxPQUFPLENBQUNDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQztNQUN6RDtJQUNGO0lBQ0FoQixRQUFRLENBQUMsU0FBUyxFQUFFTSxRQUFRLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRTtNQUN0RCxHQUFHaUQ7SUFDTCxDQUFDLENBQUM7RUFDSixDQUFDO0VBQ0QsTUFBTWEsU0FBUyxHQUFHQSxDQUFBLEtBQU1wRSxRQUFRLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUM7RUFDNUQsTUFBTXFFLG1CQUFtQixHQUFHQSxDQUFDakUsV0FBVyxFQUFFa0UsVUFBVSxLQUFLO0lBQ3ZELE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDbkIsS0FBSyxNQUFNaEUsTUFBTSxJQUFJaUIsTUFBTSxDQUFDUSxNQUFNLENBQUNqQyxLQUFLLENBQUNHLE9BQU8sQ0FBQyxFQUFFO01BQ2pELElBQUlLLE1BQU0sRUFBRTtRQUNWLEtBQUssTUFBTSxDQUFDRyxJQUFJLEVBQUU4RCxTQUFTLENBQUMsSUFBSWhELE1BQU0sQ0FBQ3VDLE9BQU8sQ0FBQ3hELE1BQU0sQ0FBQytDLFVBQVUsQ0FBQyxFQUFFO1VBQ2pFaUIsUUFBUSxDQUFDN0QsSUFBSSxDQUFDLEtBQUssRUFBRTtVQUNyQjZELFFBQVEsQ0FBQzdELElBQUksQ0FBQyxDQUFDK0QsSUFBSSxDQUFDO1lBQ2xCbEUsTUFBTTtZQUNOaUU7VUFDRixDQUFDLENBQUM7UUFDSjtNQUNGO0lBQ0Y7SUFDQSxNQUFNRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLEtBQUssTUFBTUMsR0FBRyxJQUFJSixRQUFRLEVBQUU7TUFDMUIsSUFBSUssVUFBVSxHQUFHRCxHQUFHO01BQ3BCLElBQUlMLFVBQVUsRUFBRTtRQUNkTSxVQUFVLEdBQUksS0FBSUQsR0FBSSxFQUFDO01BQ3pCO01BQ0FELFNBQVMsQ0FBQ0UsVUFBVSxDQUFDLEdBQUlDLEtBQUssSUFBSztRQUNqQyxLQUFLLE1BQU07VUFBRUw7UUFBVSxDQUFDLElBQUlELFFBQVEsQ0FBQ0ksR0FBRyxDQUFDLEVBQUU7VUFDekMsSUFBSTVFLEtBQUssQ0FBQ0ksTUFBTSxDQUFDSSxNQUFNLEVBQUU7WUFDdkI7VUFDRjtVQUNBaUUsU0FBUyxDQUFDSyxLQUFLLEVBQUV6RSxXQUFXLENBQUM7UUFDL0I7TUFDRixDQUFDO0lBQ0g7SUFDQSxPQUFPc0UsU0FBUztFQUNsQixDQUFDO0VBQ0QsTUFBTTlCLGdCQUFnQixHQUFHQSxDQUFBLEtBQU07SUFDN0IsSUFBSWtDLGdCQUFnQixHQUFHLEtBQUs7SUFDNUIsTUFBTTdFLFVBQVUsR0FBR3VCLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDakMsS0FBSyxDQUFDRSxVQUFVLENBQUM7SUFDbEQsTUFBTXZCLFVBQVUsR0FBRzhDLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDakMsS0FBSyxDQUFDckIsVUFBVSxDQUFDO0lBQ2xELE1BQU04QixPQUFPLEdBQUdULEtBQUssQ0FBQ0ksTUFBTSxDQUFDSyxPQUFPO0lBQ3BDMUYsS0FBSyxDQUFDLE1BQU07TUFDVixNQUFNaUssS0FBSyxHQUFHLGVBQWdCLElBQUlDLE9BQU8sQ0FBQyxDQUFDO01BQzNDLEtBQUssTUFBTXZHLFNBQVMsSUFBSXdCLFVBQVUsRUFBRTtRQUNsQyxJQUFJeEIsU0FBUyxFQUFFO1VBQ2IsTUFBTXdHLGFBQWEsR0FBR3hHLFNBQVMsQ0FBQy9CLE1BQU07VUFDdEMsSUFBSSxDQUFDcUksS0FBSyxDQUFDRyxHQUFHLENBQUN6RyxTQUFTLENBQUMyQyxJQUFJLENBQUMsRUFDNUIyRCxLQUFLLENBQUNJLEdBQUcsQ0FBQzFHLFNBQVMsQ0FBQzJDLElBQUksRUFBRTVFLGFBQWEsQ0FBQ2lDLFNBQVMsQ0FBQzJDLElBQUksQ0FBQyxDQUFDO1VBQzFELE1BQU0xRSxNQUFNLEdBQUdxSSxLQUFLLENBQUNoRCxHQUFHLENBQUN0RCxTQUFTLENBQUMyQyxJQUFJLENBQUM7VUFDeEMsSUFBSSxDQUFDN0MsZUFBZSxDQUFDMEcsYUFBYSxFQUFFdkksTUFBTSxDQUFDLEVBQUU7WUFDM0NzRCxRQUFRLENBQUMsWUFBWSxFQUFFdkIsU0FBUyxDQUFDUyxFQUFFLEVBQUUsUUFBUSxFQUFFeEMsTUFBTSxDQUFDO1lBQ3REb0ksZ0JBQWdCLEdBQUcsSUFBSTtVQUN6QjtRQUNGO01BQ0Y7TUFDQSxLQUFLLE1BQU03RixTQUFTLElBQUlQLFVBQVUsRUFBRTtRQUNsQyxJQUFJTyxTQUFTLEVBQUU7VUFDYixNQUFNZ0csYUFBYSxHQUFHaEcsU0FBUyxDQUFDdkMsTUFBTTtVQUN0QyxJQUFJLENBQUNxSSxLQUFLLENBQUNHLEdBQUcsQ0FBQ2pHLFNBQVMsQ0FBQ21DLElBQUksQ0FBQyxFQUM1QjJELEtBQUssQ0FBQ0ksR0FBRyxDQUFDbEcsU0FBUyxDQUFDbUMsSUFBSSxFQUFFNUUsYUFBYSxDQUFDeUMsU0FBUyxDQUFDbUMsSUFBSSxDQUFDLENBQUM7VUFDMUQsTUFBTTFFLE1BQU0sR0FBR3FJLEtBQUssQ0FBQ2hELEdBQUcsQ0FBQzlDLFNBQVMsQ0FBQ21DLElBQUksQ0FBQztVQUN4QyxJQUFJLENBQUM3QyxlQUFlLENBQUMwRyxhQUFhLEVBQUV2SSxNQUFNLENBQUMsRUFBRTtZQUMzQ3NELFFBQVEsQ0FBQyxZQUFZLEVBQUVmLFNBQVMsQ0FBQ0MsRUFBRSxFQUFFLFFBQVEsRUFBRXhDLE1BQU0sQ0FBQztZQUN0RG9JLGdCQUFnQixHQUFHLElBQUk7VUFDekI7UUFDRjtNQUNGO01BQ0EsSUFBSXRFLE9BQU8sRUFBRTtRQUNYLE1BQU15RSxhQUFhLEdBQUd6RSxPQUFPLENBQUM5RCxNQUFNO1FBQ3BDLE1BQU1BLE1BQU0sR0FBR0YsYUFBYSxDQUFDZ0UsT0FBTyxDQUFDWSxJQUFJLENBQUM7UUFDMUMsSUFBSSxDQUFDN0MsZUFBZSxDQUFDMEcsYUFBYSxFQUFFdkksTUFBTSxDQUFDLEVBQUU7VUFDM0NzRCxRQUFRLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUV0RCxNQUFNLENBQUM7VUFDL0NvSSxnQkFBZ0IsR0FBRyxJQUFJO1FBQ3pCO01BQ0Y7SUFDRixDQUFDLENBQUM7SUFDRixPQUFPQSxnQkFBZ0I7RUFDekIsQ0FBQztFQUNELE1BQU1NLGdCQUFnQixHQUFHQSxDQUFBLEtBQU07SUFDN0IsTUFBTTNHLFNBQVMsR0FBR3NCLEtBQUssQ0FBQ0ksTUFBTSxDQUFDSyxPQUFPLElBQUlULEtBQUssQ0FBQ0ksTUFBTSxDQUFDMUIsU0FBUztJQUNoRSxJQUFJQSxTQUFTLEVBQUU7TUFDYixNQUFNUSxTQUFTLEdBQUdZLEtBQUssQ0FBQ0MsaUJBQWlCLENBQ3ZDckIsU0FBUyxFQUNUK0MsTUFBTSxDQUFDUSxNQUFNLENBQUNqQyxLQUFLLENBQUNyQixVQUFVLENBQUMsRUFDL0I7UUFDRVMsaUJBQWlCLEVBQUVZLEtBQUssQ0FBQ0ksTUFBTSxDQUFDRTtNQUNsQyxDQUNGLENBQUM7TUFDRCxNQUFNQSxXQUFXLEdBQUdwQixTQUFTLEdBQUdBLFNBQVMsQ0FBQ0MsRUFBRSxHQUFHLElBQUk7TUFDbkQsSUFBSWEsS0FBSyxDQUFDSSxNQUFNLENBQUNFLFdBQVcsS0FBS0EsV0FBVyxFQUFFO1FBQzVDTCxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRUssV0FBVyxDQUFDO01BQ2hEO0lBQ0Y7RUFDRixDQUFDO0VBQ0QsTUFBTWdGLFNBQVMsR0FBSWpGLFdBQVcsSUFBSztJQUNqQyxNQUFNTyxXQUFXLEdBQUc7TUFDbEJ6QixFQUFFLEVBQUUsWUFBWTtNQUNoQmtELEtBQUssRUFBRSxDQUFDO01BQ1JHLFFBQVEsRUFBRzNGLFNBQVMsSUFBSztRQUN2QixJQUFJbUQsS0FBSyxDQUFDSSxNQUFNLENBQUNJLE1BQU0sRUFBRTtVQUN2QixPQUFPO1lBQ0xqRixDQUFDLEVBQUVzQixTQUFTLENBQUN0QixDQUFDLEdBQUd5RSxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ksTUFBTSxDQUFDZ0QsV0FBVyxDQUFDRyxLQUFLLENBQUNwSSxDQUFDO1lBQ3hEQyxDQUFDLEVBQUVxQixTQUFTLENBQUNyQixDQUFDLEdBQUd3RSxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ksTUFBTSxDQUFDZ0QsV0FBVyxDQUFDRyxLQUFLLENBQUNuSTtVQUN6RCxDQUFDO1FBQ0g7UUFDQSxPQUFPcUIsU0FBUztNQUNsQjtJQUNGLENBQUM7SUFDRGdHLGdCQUFnQixDQUFDLENBQUM7SUFDbEI5SCxLQUFLLENBQUMsTUFBTTtNQUNWa0YsUUFBUSxDQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUVJLFdBQVcsQ0FBQztNQUM5Q0ssY0FBYyxDQUFDLFlBQVksRUFBRUwsV0FBVyxFQUFFTyxXQUFXLENBQUM7SUFDeEQsQ0FBQyxDQUFDO0lBQ0Z5RSxnQkFBZ0IsQ0FBQyxDQUFDO0VBQ3BCLENBQUM7RUFDRCxNQUFNRSxPQUFPLEdBQUdBLENBQUEsS0FBTTtJQUNwQixNQUFNbEYsV0FBVyxHQUFHbEYsT0FBTyxDQUFDLE1BQU02RSxLQUFLLENBQUNJLE1BQU0sQ0FBQ0MsV0FBVyxDQUFDO0lBQzNEdEYsS0FBSyxDQUFDLE1BQU07TUFDVixJQUFJc0YsV0FBVyxLQUFLLElBQUksRUFBRTtRQUN4QmEsaUJBQWlCLENBQUMsWUFBWSxFQUFFYixXQUFXLEVBQUUsWUFBWSxDQUFDO01BQzVEO01BQ0FKLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDO0lBQzFELENBQUMsQ0FBQztJQUNGNEMsZ0JBQWdCLENBQUMsQ0FBQztFQUNwQixDQUFDO0VBQ0QsTUFBTTJDLFdBQVcsR0FBSUMsT0FBTyxJQUFLO0lBQy9CeEssWUFBWSxDQUFDLE1BQU07TUFDakIsTUFBTXlELFNBQVMsR0FBR3NCLEtBQUssQ0FBQ0ksTUFBTSxDQUFDMUIsU0FBUztNQUN4QyxJQUFJQSxTQUFTLEVBQUU7UUFDYnZELE9BQU8sQ0FBQyxNQUFNc0ssT0FBTyxDQUFDO1VBQUUvRztRQUFVLENBQUMsQ0FBQyxDQUFDO01BQ3ZDO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQztFQUNELE1BQU1nSCxVQUFVLEdBQUlELE9BQU8sSUFBSztJQUM5QnhLLFlBQVksQ0FBQyxNQUFNO01BQ2pCLE1BQU15RCxTQUFTLEdBQUdzQixLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVM7TUFDeEMsSUFBSUEsU0FBUyxFQUFFO1FBQ2IsTUFBTStCLE9BQU8sR0FBR3RGLE9BQU8sQ0FBQyxNQUFNNkUsS0FBSyxDQUFDSSxNQUFNLENBQUNLLE9BQU8sQ0FBQztRQUNuRGdCLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDeEIsT0FBTyxHQUFHQSxPQUFPLENBQUM1RCxTQUFTLEdBQUc2QixTQUFTLENBQUM3QixTQUFTLENBQUM7UUFDaEUxQixPQUFPLENBQUMsTUFBTXNLLE9BQU8sQ0FBQztVQUFFL0csU0FBUztVQUFFK0I7UUFBUSxDQUFDLENBQUMsQ0FBQztNQUNoRDtJQUNGLENBQUMsQ0FBQztFQUNKLENBQUM7RUFDRCxNQUFNa0YsVUFBVSxHQUFJRixPQUFPLElBQUs7SUFDOUJ4SyxZQUFZLENBQUMsTUFBTTtNQUNqQixNQUFNeUQsU0FBUyxHQUFHc0IsS0FBSyxDQUFDSSxNQUFNLENBQUMxQixTQUFTO01BQ3hDLE1BQU1RLFNBQVMsR0FBR2MsS0FBSyxDQUFDSSxNQUFNLENBQUNsQixTQUFTO01BQ3hDLElBQUlSLFNBQVMsRUFBRTtRQUNidkQsT0FBTyxDQUNMLE1BQU1zSyxPQUFPLENBQUM7VUFBRS9HLFNBQVM7VUFBRVEsU0FBUztVQUFFdUIsT0FBTyxFQUFFVCxLQUFLLENBQUNJLE1BQU0sQ0FBQ0s7UUFBUSxDQUFDLENBQ3ZFLENBQUM7TUFDSDtJQUNGLENBQUMsQ0FBQztFQUNKLENBQUM7RUFDRCxNQUFNbUMsU0FBUyxHQUFJNkMsT0FBTyxJQUFLO0lBQzdCeEssWUFBWSxDQUNWLENBQUM7TUFBRTJLLGlCQUFpQjtNQUFFQyxpQkFBaUI7TUFBRUM7SUFBZ0IsQ0FBQyxLQUFLO01BQzdELE1BQU1wSCxTQUFTLEdBQUdzQixLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVM7TUFDeEMsTUFBTVEsU0FBUyxHQUFHUixTQUFTLEdBQUdzQixLQUFLLENBQUNJLE1BQU0sQ0FBQ2xCLFNBQVMsR0FBRyxJQUFJO01BQzNELE1BQU11QixPQUFPLEdBQUcvQixTQUFTLEdBQUdzQixLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTyxHQUFHLElBQUk7TUFDdkQsSUFBSSxDQUFDL0IsU0FBUyxJQUFJa0gsaUJBQWlCLEVBQUU7UUFDbkN6SyxPQUFPLENBQ0wsTUFBTXNLLE9BQU8sQ0FBQztVQUNaL0csU0FBUyxFQUFFa0gsaUJBQWlCO1VBQzVCMUcsU0FBUyxFQUFFMkcsaUJBQWlCO1VBQzVCcEYsT0FBTyxFQUFFcUY7UUFDWCxDQUFDLENBQ0gsQ0FBQztNQUNIO01BQ0EsT0FBTztRQUNMRixpQkFBaUIsRUFBRWxILFNBQVM7UUFDNUJtSCxpQkFBaUIsRUFBRTNHLFNBQVM7UUFDNUI0RyxlQUFlLEVBQUVyRjtNQUNuQixDQUFDO0lBQ0gsQ0FBQyxFQUNEO01BQ0VtRixpQkFBaUIsRUFBRSxJQUFJO01BQ3ZCQyxpQkFBaUIsRUFBRSxJQUFJO01BQ3ZCQyxlQUFlLEVBQUU7SUFDbkIsQ0FDRixDQUFDO0VBQ0gsQ0FBQztFQUNESixVQUFVLENBQUMsTUFBTUwsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0VBQ3BDdkYsS0FBSyxDQUFDMEYsV0FBVyxJQUFJQSxXQUFXLENBQUMxRixLQUFLLENBQUMwRixXQUFXLENBQUM7RUFDbkQxRixLQUFLLENBQUM0RixVQUFVLElBQUlBLFVBQVUsQ0FBQzVGLEtBQUssQ0FBQzRGLFVBQVUsQ0FBQztFQUNoRDVGLEtBQUssQ0FBQzZGLFVBQVUsSUFBSUEsVUFBVSxDQUFDN0YsS0FBSyxDQUFDNkYsVUFBVSxDQUFDO0VBQ2hEN0YsS0FBSyxDQUFDOEMsU0FBUyxJQUFJQSxTQUFTLENBQUM5QyxLQUFLLENBQUM4QyxTQUFTLENBQUM7RUFDN0MsTUFBTW1ELE9BQU8sR0FBRztJQUNkckYsY0FBYztJQUNkUSxpQkFBaUI7SUFDakJFLFlBQVk7SUFDWjBCLGVBQWU7SUFDZkksWUFBWTtJQUNaRSxlQUFlO0lBQ2ZFLFNBQVM7SUFDVE0sWUFBWTtJQUNaQyxVQUFVO0lBQ1ZLLFlBQVk7SUFDWnJCLGdCQUFnQjtJQUNoQndDLGdCQUFnQjtJQUNoQmYsbUJBQW1CO0lBQ25CSCxXQUFXO0lBQ1hDLFVBQVU7SUFDVkMsU0FBUztJQUNUaUIsU0FBUztJQUNUQyxPQUFPO0lBQ1BDLFdBQVc7SUFDWEUsVUFBVTtJQUNWQyxVQUFVO0lBQ1YvQztFQUNGLENBQUM7RUFDRCxNQUFNaEUsT0FBTyxHQUFHLENBQUNvQixLQUFLLEVBQUUrRixPQUFPLENBQUM7RUFDaEMsT0FBQUMsaUJBQUEsQ0FBUXJHLE9BQU8sQ0FBQ3NHLFFBQVE7SUFBQ2xFLEtBQUssRUFBRW5ELE9BQU87SUFBQSxJQUFBc0gsU0FBQTtNQUFBLE9BQUdwRyxLQUFLLENBQUNvRyxRQUFRO0lBQUE7RUFBQTtBQUMxRCxDQUFDO0FBQ0QsSUFBSUMsa0JBQWtCLEdBQUdBLENBQUEsS0FBTTtFQUM3QixPQUFPL0ssVUFBVSxDQUFDdUUsT0FBTyxDQUFDLElBQUksSUFBSTtBQUNwQyxDQUFDOztBQUVEO0FBQ0EsU0FBU3lHLFNBQVMsRUFBRUMsT0FBTyxRQUFRLFVBQVU7QUFDN0MsSUFBSUMsbUJBQW1CLEdBQUdBLENBQUNuSCxFQUFFLEdBQUcsZ0JBQWdCLEtBQUs7RUFDbkQsTUFBTSxDQUNKYSxLQUFLLEVBQ0w7SUFDRXNELFNBQVM7SUFDVE0sWUFBWTtJQUNaTyxXQUFXO0lBQ1hDLFVBQVU7SUFDVkMsU0FBUztJQUNUaUIsU0FBUztJQUNUQztFQUNGLENBQUMsQ0FDRixHQUFHWSxrQkFBa0IsQ0FBQyxDQUFDO0VBQ3hCLE1BQU1JLGVBQWUsR0FBRyxHQUFHO0VBQzNCLE1BQU1DLGtCQUFrQixHQUFHLEVBQUU7RUFDN0JILE9BQU8sQ0FBQyxNQUFNO0lBQ1ovQyxTQUFTLENBQUM7TUFBRW5FLEVBQUU7TUFBRW9FLFVBQVUsRUFBRTtRQUFFa0QsV0FBVyxFQUFFQztNQUFPO0lBQUUsQ0FBQyxDQUFDO0VBQ3hELENBQUMsQ0FBQztFQUNGTixTQUFTLENBQUMsTUFBTTtJQUNkeEMsWUFBWSxDQUFDekUsRUFBRSxDQUFDO0VBQ2xCLENBQUMsQ0FBQztFQUNGLE1BQU13SCxjQUFjLEdBQUdBLENBQUEsS0FBTTNHLEtBQUssQ0FBQ0ksTUFBTSxDQUFDRyxRQUFRLEtBQUtwQixFQUFFO0VBQ3pELE1BQU15SCxrQkFBa0IsR0FBRztJQUFFckwsQ0FBQyxFQUFFLENBQUM7SUFBRUMsQ0FBQyxFQUFFO0VBQUUsQ0FBQztFQUN6QyxJQUFJcUwsd0JBQXdCLEdBQUcsSUFBSTtFQUNuQyxJQUFJQyxxQkFBcUIsR0FBRyxJQUFJO0VBQ2hDLE1BQU1KLE1BQU0sR0FBR0EsQ0FBQzVCLEtBQUssRUFBRXpFLFdBQVcsS0FBSztJQUNyQyxJQUFJeUUsS0FBSyxDQUFDaUMsTUFBTSxLQUFLLENBQUMsRUFDcEI7SUFDRkMsUUFBUSxDQUFDQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUVDLGFBQWEsQ0FBQztJQUN2REYsUUFBUSxDQUFDQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUVFLFdBQVcsQ0FBQztJQUNuREwscUJBQXFCLEdBQUd6RyxXQUFXO0lBQ25DdUcsa0JBQWtCLENBQUNyTCxDQUFDLEdBQUd1SixLQUFLLENBQUNzQyxPQUFPO0lBQ3BDUixrQkFBa0IsQ0FBQ3BMLENBQUMsR0FBR3NKLEtBQUssQ0FBQ3VDLE9BQU87SUFDcENSLHdCQUF3QixHQUFHUyxNQUFNLENBQUNDLFVBQVUsQ0FBQ0MsVUFBVSxFQUFFakIsZUFBZSxDQUFDO0VBQzNFLENBQUM7RUFDRCxNQUFNa0IsTUFBTSxHQUFHQSxDQUFBLEtBQU07SUFDbkIsSUFBSVosd0JBQXdCLEVBQUU7TUFDNUJhLFlBQVksQ0FBQ2Isd0JBQXdCLENBQUM7TUFDdENBLHdCQUF3QixHQUFHLElBQUk7SUFDakM7SUFDQUcsUUFBUSxDQUFDVyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUVULGFBQWEsQ0FBQztJQUMxREYsUUFBUSxDQUFDVyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUVSLFdBQVcsQ0FBQztJQUN0REgsUUFBUSxDQUFDVyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRUMsY0FBYyxDQUFDO0VBQ2pFLENBQUM7RUFDRCxNQUFNSixVQUFVLEdBQUdBLENBQUEsS0FBTTtJQUN2QixJQUFJLENBQUN4SCxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ksTUFBTSxFQUFFO01BQ3hCMkQsV0FBVyxDQUFDaEYsRUFBRSxFQUFFeUgsa0JBQWtCLENBQUM7TUFDbkN0QixTQUFTLENBQUN3QixxQkFBcUIsQ0FBQztNQUNoQ2MsY0FBYyxDQUFDLENBQUM7TUFDaEJaLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUVXLGNBQWMsQ0FBQztJQUM5RCxDQUFDLE1BQU0sSUFBSSxDQUFDakIsY0FBYyxDQUFDLENBQUMsRUFBRTtNQUM1QmMsTUFBTSxDQUFDLENBQUM7SUFDVjtFQUNGLENBQUM7RUFDRCxNQUFNUCxhQUFhLEdBQUlwQyxLQUFLLElBQUs7SUFDL0IsTUFBTXRCLFdBQVcsR0FBRztNQUFFakksQ0FBQyxFQUFFdUosS0FBSyxDQUFDc0MsT0FBTztNQUFFNUwsQ0FBQyxFQUFFc0osS0FBSyxDQUFDdUM7SUFBUSxDQUFDO0lBQzFELElBQUksQ0FBQ3JILEtBQUssQ0FBQ0ksTUFBTSxDQUFDSSxNQUFNLEVBQUU7TUFDeEIsTUFBTTNELFNBQVMsR0FBRztRQUNoQnRCLENBQUMsRUFBRWlJLFdBQVcsQ0FBQ2pJLENBQUMsR0FBR3FMLGtCQUFrQixDQUFDckwsQ0FBQztRQUN2Q0MsQ0FBQyxFQUFFZ0ksV0FBVyxDQUFDaEksQ0FBQyxHQUFHb0wsa0JBQWtCLENBQUNwTDtNQUN4QyxDQUFDO01BQ0QsSUFBSUssSUFBSSxDQUFDaUMsSUFBSSxDQUFDakIsU0FBUyxDQUFDdEIsQ0FBQyxJQUFJLENBQUMsR0FBR3NCLFNBQVMsQ0FBQ3JCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBR2dMLGtCQUFrQixFQUFFO1FBQ3ZFZ0IsVUFBVSxDQUFDLENBQUM7TUFDZDtJQUNGO0lBQ0EsSUFBSWIsY0FBYyxDQUFDLENBQUMsRUFBRTtNQUNwQjdCLEtBQUssQ0FBQytDLGNBQWMsQ0FBQyxDQUFDO01BQ3RCekQsVUFBVSxDQUFDWixXQUFXLENBQUM7SUFDekI7RUFDRixDQUFDO0VBQ0QsTUFBTTJELFdBQVcsR0FBSXJDLEtBQUssSUFBSztJQUM3QjJDLE1BQU0sQ0FBQyxDQUFDO0lBQ1IsSUFBSWQsY0FBYyxDQUFDLENBQUMsRUFBRTtNQUNwQjdCLEtBQUssQ0FBQytDLGNBQWMsQ0FBQyxDQUFDO01BQ3RCdEMsT0FBTyxDQUFDLENBQUM7TUFDVGxCLFNBQVMsQ0FBQyxDQUFDO0lBQ2I7RUFDRixDQUFDO0VBQ0QsTUFBTXVELGNBQWMsR0FBR0EsQ0FBQSxLQUFNO0lBQzNCTixNQUFNLENBQUNRLFlBQVksQ0FBQyxDQUFDLEVBQUVDLGVBQWUsQ0FBQyxDQUFDO0VBQzFDLENBQUM7QUFDSCxDQUFDOztBQUVEO0FBQ0EsSUFBSUMsZUFBZSxHQUFJbEksS0FBSyxJQUFLO0VBQy9Cd0csbUJBQW1CLENBQUMsQ0FBQztFQUNyQixPQUFBMkIsTUFBQSxPQUFVbkksS0FBSyxDQUFDb0csUUFBUTtBQUMxQixDQUFDOztBQUVEO0FBQ0EsU0FDRWpMLFlBQVksSUFBSWlOLGFBQWEsRUFDN0JDLFlBQVksRUFDWi9CLFNBQVMsSUFBSWdDLFVBQVUsRUFDdkIvQixPQUFPLElBQUlnQyxRQUFRLFFBQ2QsVUFBVTs7QUFFakI7QUFDQSxJQUFJQyxXQUFXLEdBQUkzTCxNQUFNLElBQUs7RUFDNUIsT0FBTztJQUNMWCxHQUFHLEVBQUcsR0FBRVcsTUFBTSxDQUFDbkIsQ0FBRSxJQUFHO0lBQ3BCTyxJQUFJLEVBQUcsR0FBRVksTUFBTSxDQUFDcEIsQ0FBRSxJQUFHO0lBQ3JCRSxLQUFLLEVBQUcsR0FBRWtCLE1BQU0sQ0FBQ2xCLEtBQU0sSUFBRztJQUMxQkMsTUFBTSxFQUFHLEdBQUVpQixNQUFNLENBQUNqQixNQUFPO0VBQzNCLENBQUM7QUFDSCxDQUFDO0FBQ0QsSUFBSTZNLGNBQWMsR0FBSTFMLFNBQVMsSUFBSztFQUNsQyxPQUFPO0lBQUVBLFNBQVMsRUFBRyxlQUFjQSxTQUFTLENBQUN0QixDQUFFLE9BQU1zQixTQUFTLENBQUNyQixDQUFFO0VBQVEsQ0FBQztBQUM1RSxDQUFDO0FBQ0QsSUFBSWdOLG1CQUFtQixHQUFJM0wsU0FBUyxJQUFLO0VBQ3ZDLE9BQU9VLGtCQUFrQixDQUFDVixTQUFTLEVBQUVTLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR2lMLGNBQWMsQ0FBQzFMLFNBQVMsQ0FBQztBQUN4RixDQUFDOztBQUVEO0FBQ0EsSUFBSTRMLGVBQWUsR0FBR0EsQ0FBQ3RKLEVBQUUsRUFBRW1DLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSztFQUN2QyxNQUFNLENBQUN0QixLQUFLLEVBQUU7SUFBRW9CLFlBQVk7SUFBRTBCLGVBQWU7SUFBRXdCO0VBQW9CLENBQUMsQ0FBQyxHQUFHNkIsa0JBQWtCLENBQUMsQ0FBQztFQUM1RixNQUFNLENBQUM5RSxJQUFJLEVBQUVxSCxPQUFPLENBQUMsR0FBR1AsWUFBWSxDQUFDLElBQUksQ0FBQztFQUMxQ0UsUUFBUSxDQUFDLE1BQU07SUFDYixNQUFNTSxZQUFZLEdBQUd0SCxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJc0gsWUFBWSxFQUFFO01BQ2hCdkgsWUFBWSxDQUFDO1FBQ1hqQyxFQUFFO1FBQ0ZrQyxJQUFJLEVBQUVzSCxZQUFZO1FBQ2xCaE0sTUFBTSxFQUFFRixhQUFhLENBQUNrTSxZQUFZLENBQUM7UUFDbkNySDtNQUNGLENBQUMsQ0FBQztJQUNKO0VBQ0YsQ0FBQyxDQUFDO0VBQ0Y4RyxVQUFVLENBQUMsTUFBTXRGLGVBQWUsQ0FBQzNELEVBQUUsQ0FBQyxDQUFDO0VBQ3JDLE1BQU15SixpQkFBaUIsR0FBR0EsQ0FBQSxLQUFNNUksS0FBSyxDQUFDSSxNQUFNLENBQUNDLFdBQVcsS0FBS2xCLEVBQUU7RUFDL0QsTUFBTXRDLFNBQVMsR0FBR0EsQ0FBQSxLQUFNO0lBQ3RCLE9BQU9tRCxLQUFLLENBQUNFLFVBQVUsQ0FBQ2YsRUFBRSxDQUFDLEVBQUV0QyxTQUFTLElBQUlTLGFBQWEsQ0FBQyxDQUFDO0VBQzNELENBQUM7RUFDRCxNQUFNb0IsU0FBUyxHQUFHK0MsTUFBTSxDQUFDQyxnQkFBZ0IsQ0FDdkMsQ0FBQ2hGLE9BQU8sRUFBRW1NLFFBQVEsS0FBSztJQUNyQixNQUFNQyxNQUFNLEdBQUdELFFBQVEsR0FBR0EsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekNYLGFBQWEsQ0FBQyxNQUFNO01BQ2xCLE1BQU1TLFlBQVksR0FBR3RILElBQUksQ0FBQyxDQUFDO01BQzNCLE1BQU1rQyxVQUFVLEdBQUdlLG1CQUFtQixDQUFDbkYsRUFBRSxDQUFDO01BQzFDLElBQUl3SixZQUFZLEVBQUU7UUFDaEIsS0FBSyxNQUFNL0QsR0FBRyxJQUFJckIsVUFBVSxFQUFFO1VBQzVCb0YsWUFBWSxDQUFDMUIsZ0JBQWdCLENBQUNyQyxHQUFHLEVBQUVyQixVQUFVLENBQUNxQixHQUFHLENBQUMsQ0FBQztRQUNyRDtNQUNGO01BQ0F3RCxVQUFVLENBQUMsTUFBTTtRQUNmLElBQUlPLFlBQVksRUFBRTtVQUNoQixLQUFLLE1BQU0vRCxHQUFHLElBQUlyQixVQUFVLEVBQUU7WUFDNUJvRixZQUFZLENBQUNoQixtQkFBbUIsQ0FBQy9DLEdBQUcsRUFBRXJCLFVBQVUsQ0FBQ3FCLEdBQUcsQ0FBQyxDQUFDO1VBQ3hEO1FBQ0Y7TUFDRixDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFDRjhELE9BQU8sQ0FBQ2hNLE9BQU8sQ0FBQztJQUNoQixJQUFJLENBQUNvTSxNQUFNLENBQUNDLGFBQWEsRUFBRTtNQUN6QmIsYUFBYSxDQUFDLE1BQU07UUFDbEIsTUFBTWMsaUJBQWlCLEdBQUduTSxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUNVLGtCQUFrQixDQUFDeUwsaUJBQWlCLEVBQUUxTCxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUU7VUFDM0QsTUFBTTJMLEtBQUssR0FBR1YsY0FBYyxDQUFDMUwsU0FBUyxDQUFDLENBQUMsQ0FBQztVQUN6Q0gsT0FBTyxDQUFDdU0sS0FBSyxDQUFDQyxXQUFXLENBQUMsV0FBVyxFQUFFRCxLQUFLLENBQUNwTSxTQUFTLElBQUksSUFBSSxDQUFDO1FBQ2pFLENBQUMsTUFBTTtVQUNMSCxPQUFPLENBQUN1TSxLQUFLLENBQUNFLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDM0M7TUFDRixDQUFDLENBQUM7SUFDSjtFQUNGLENBQUMsRUFDRDtJQUNFQyxHQUFHLEVBQUU7TUFDSHhILFVBQVUsRUFBRSxJQUFJO01BQ2hCRyxLQUFLLEVBQUUyRztJQUNULENBQUM7SUFDREUsaUJBQWlCLEVBQUU7TUFDakJoSCxVQUFVLEVBQUUsSUFBSTtNQUNoQkksR0FBRyxFQUFFNEc7SUFDUCxDQUFDO0lBQ0RTLGNBQWMsRUFBRTtNQUNkekgsVUFBVSxFQUFFLElBQUk7TUFDaEJJLEdBQUcsRUFBRUEsQ0FBQSxLQUFNO1FBQ1QsT0FBT3NDLG1CQUFtQixDQUFDbkYsRUFBRSxFQUFFLElBQUksQ0FBQztNQUN0QztJQUNGLENBQUM7SUFDRHRDLFNBQVMsRUFBRTtNQUNUK0UsVUFBVSxFQUFFLElBQUk7TUFDaEJJLEdBQUcsRUFBRW5GO0lBQ1A7RUFDRixDQUNGLENBQUM7RUFDRCxPQUFPNkIsU0FBUztBQUNsQixDQUFDOztBQUVEO0FBQ0EsU0FDRXpELFlBQVksSUFBSXFPLGFBQWEsRUFDN0JuQixZQUFZLElBQUlvQixhQUFhLEVBQzdCbkQsU0FBUyxJQUFJb0QsVUFBVSxFQUN2Qm5ELE9BQU8sSUFBSW9ELFFBQVEsUUFDZCxVQUFVO0FBQ2pCLElBQUlDLGVBQWUsR0FBR0EsQ0FBQ3ZLLEVBQUUsRUFBRW1DLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSztFQUN2QyxNQUFNLENBQUN0QixLQUFLLEVBQUU7SUFBRWtELFlBQVk7SUFBRUU7RUFBZ0IsQ0FBQyxDQUFDLEdBQUcrQyxrQkFBa0IsQ0FBQyxDQUFDO0VBQ3ZFLE1BQU0sQ0FBQzlFLElBQUksRUFBRXFILE9BQU8sQ0FBQyxHQUFHYSxhQUFhLENBQUMsSUFBSSxDQUFDO0VBQzNDRSxRQUFRLENBQUMsTUFBTTtJQUNiLE1BQU1kLFlBQVksR0FBR3RILElBQUksQ0FBQyxDQUFDO0lBQzNCLElBQUlzSCxZQUFZLEVBQUU7TUFDaEJ6RixZQUFZLENBQUM7UUFDWC9ELEVBQUU7UUFDRmtDLElBQUksRUFBRXNILFlBQVk7UUFDbEJoTSxNQUFNLEVBQUVGLGFBQWEsQ0FBQ2tNLFlBQVksQ0FBQztRQUNuQ3JIO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7RUFDRixDQUFDLENBQUM7RUFDRmtJLFVBQVUsQ0FBQyxNQUFNcEcsZUFBZSxDQUFDakUsRUFBRSxDQUFDLENBQUM7RUFDckMsTUFBTXdLLGlCQUFpQixHQUFHQSxDQUFBLEtBQU0zSixLQUFLLENBQUNJLE1BQU0sQ0FBQ0UsV0FBVyxLQUFLbkIsRUFBRTtFQUMvRCxNQUFNdEMsU0FBUyxHQUFHQSxDQUFBLEtBQU07SUFDdEIsT0FBT21ELEtBQUssQ0FBQ3JCLFVBQVUsQ0FBQ1EsRUFBRSxDQUFDLEVBQUV0QyxTQUFTLElBQUlTLGFBQWEsQ0FBQyxDQUFDO0VBQzNELENBQUM7RUFDRCxNQUFNNEIsU0FBUyxHQUFHdUMsTUFBTSxDQUFDQyxnQkFBZ0IsQ0FDdkMsQ0FBQ2hGLE9BQU8sRUFBRW1NLFFBQVEsS0FBSztJQUNyQixNQUFNQyxNQUFNLEdBQUdELFFBQVEsR0FBR0EsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekNILE9BQU8sQ0FBQ2hNLE9BQU8sQ0FBQztJQUNoQixJQUFJLENBQUNvTSxNQUFNLENBQUNDLGFBQWEsRUFBRTtNQUN6Qk8sYUFBYSxDQUFDLE1BQU07UUFDbEIsTUFBTU4saUJBQWlCLEdBQUduTSxTQUFTLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUNVLGtCQUFrQixDQUFDeUwsaUJBQWlCLEVBQUUxTCxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUU7VUFDM0QsTUFBTTJMLEtBQUssR0FBR1YsY0FBYyxDQUFDMUwsU0FBUyxDQUFDLENBQUMsQ0FBQztVQUN6Q0gsT0FBTyxDQUFDdU0sS0FBSyxDQUFDQyxXQUFXLENBQUMsV0FBVyxFQUFFRCxLQUFLLENBQUNwTSxTQUFTLElBQUksSUFBSSxDQUFDO1FBQ2pFLENBQUMsTUFBTTtVQUNMSCxPQUFPLENBQUN1TSxLQUFLLENBQUNFLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDM0M7TUFDRixDQUFDLENBQUM7SUFDSjtFQUNGLENBQUMsRUFDRDtJQUNFQyxHQUFHLEVBQUU7TUFDSHhILFVBQVUsRUFBRSxJQUFJO01BQ2hCRyxLQUFLLEVBQUUyRztJQUNULENBQUM7SUFDRGlCLGlCQUFpQixFQUFFO01BQ2pCL0gsVUFBVSxFQUFFLElBQUk7TUFDaEJJLEdBQUcsRUFBRTJIO0lBQ1AsQ0FBQztJQUNEOU0sU0FBUyxFQUFFO01BQ1QrRSxVQUFVLEVBQUUsSUFBSTtNQUNoQkksR0FBRyxFQUFFbkY7SUFDUDtFQUNGLENBQ0YsQ0FBQztFQUNELE9BQU9xQyxTQUFTO0FBQ2xCLENBQUM7O0FBRUQ7QUFDQSxTQUFTMEssTUFBTSxRQUFRLGNBQWM7QUFDckMsU0FBU0MsSUFBSSxRQUFRLFVBQVU7QUFDL0IsSUFBSUMsV0FBVyxHQUFJaEssS0FBSyxJQUFLO0VBQzNCLE1BQU0sQ0FBQ0UsS0FBSyxFQUFFO0lBQUV3RixXQUFXO0lBQUU1QyxTQUFTO0lBQUVpQixVQUFVO0lBQUVLO0VBQWEsQ0FBQyxDQUFDLEdBQUdpQyxrQkFBa0IsQ0FBQyxDQUFDO0VBQzFGLElBQUk5RSxJQUFJO0VBQ1JtRSxXQUFXLENBQUMsQ0FBQztJQUFFOUc7RUFBVSxDQUFDLEtBQUs7SUFDN0JtRixVQUFVLENBQUM7TUFDVHhDLElBQUksRUFBRTNDLFNBQVMsQ0FBQzJDLElBQUk7TUFDcEIxRSxNQUFNLEVBQUUrQixTQUFTLENBQUMvQjtJQUNwQixDQUFDLENBQUM7SUFDRm9HLGNBQWMsQ0FBQyxNQUFNO01BQ25CLElBQUkxQixJQUFJLEVBQUU7UUFDUixNQUFNMUUsTUFBTSxHQUFHRixhQUFhLENBQUM0RSxJQUFJLENBQUM7UUFDbEMsTUFBTXNDLEtBQUssR0FBRztVQUNacEksQ0FBQyxFQUFFLENBQUNtRCxTQUFTLENBQUMvQixNQUFNLENBQUNsQixLQUFLLEdBQUdrQixNQUFNLENBQUNsQixLQUFLLElBQUksQ0FBQztVQUM5Q0QsQ0FBQyxFQUFFLENBQUNrRCxTQUFTLENBQUMvQixNQUFNLENBQUNqQixNQUFNLEdBQUdpQixNQUFNLENBQUNqQixNQUFNLElBQUk7UUFDakQsQ0FBQztRQUNEaUIsTUFBTSxDQUFDcEIsQ0FBQyxJQUFJb0ksS0FBSyxDQUFDcEksQ0FBQztRQUNuQm9CLE1BQU0sQ0FBQ25CLENBQUMsSUFBSW1JLEtBQUssQ0FBQ25JLENBQUM7UUFDbkJxSSxVQUFVLENBQUM7VUFBRXhDLElBQUk7VUFBRTFFO1FBQU8sQ0FBQyxDQUFDO01BQzlCO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0VBQ0ZpRyxTQUFTLENBQUMsTUFBTUcsY0FBYyxDQUFDbUIsWUFBWSxDQUFDLENBQUM7RUFDN0MsTUFBTStFLEtBQUssR0FBR0EsQ0FBQSxLQUFNO0lBQ2xCLE1BQU14SSxPQUFPLEdBQUdULEtBQUssQ0FBQ0ksTUFBTSxDQUFDSyxPQUFPO0lBQ3BDLE1BQU0vQixTQUFTLEdBQUdzQixLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVM7SUFDeEMsSUFBSSxDQUFDK0IsT0FBTyxJQUFJLENBQUMvQixTQUFTLEVBQ3hCLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsT0FBTztNQUNMcUwsUUFBUSxFQUFFLE9BQU87TUFDakJDLFVBQVUsRUFBRSxjQUFjO01BQzFCaE8sR0FBRyxFQUFHLEdBQUV5RSxPQUFPLENBQUM5RCxNQUFNLENBQUNYLEdBQUksSUFBRztNQUM5QkQsSUFBSSxFQUFHLEdBQUUwRSxPQUFPLENBQUM5RCxNQUFNLENBQUNaLElBQUssSUFBRztNQUNoQyxXQUFXLEVBQUcsR0FBRTJDLFNBQVMsQ0FBQy9CLE1BQU0sQ0FBQ2xCLEtBQU0sSUFBRztNQUMxQyxZQUFZLEVBQUcsR0FBRWlELFNBQVMsQ0FBQy9CLE1BQU0sQ0FBQ2pCLE1BQU8sSUFBRztNQUM1QyxHQUFHNk0sY0FBYyxDQUFDOUgsT0FBTyxDQUFDNUQsU0FBUyxDQUFDO01BQ3BDLEdBQUdpRCxLQUFLLENBQUNtSjtJQUNYLENBQUM7RUFDSCxDQUFDO0VBQ0QsT0FBQWpELGlCQUFBLENBQVE0RCxNQUFNO0lBQUEsSUFBQ0ssS0FBS0EsQ0FBQTtNQUFBLE9BQUVqRCxRQUFRLENBQUNrRCxJQUFJO0lBQUE7SUFBQSxJQUFBaEUsU0FBQTtNQUFBLE9BQUFGLGlCQUFBLENBQUc2RCxJQUFJO1FBQUEsSUFBQ00sSUFBSUEsQ0FBQTtVQUFBLE9BQUVuSyxLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVM7UUFBQTtRQUFBLElBQUF3SCxTQUFBO1VBQUEsTUFBQWtFLElBQUEsR0FBQUMsTUFBQTtVQUFBLE1BQUFDLEtBQUEsR0FBWWpKLElBQUk7VUFBQSxPQUFBaUosS0FBQSxrQkFBQUMsS0FBQSxDQUFBRCxLQUFBLEVBQUFGLElBQUEsSUFBSi9JLElBQUksR0FBQStJLElBQUE7VUFBQUksUUFBQSxDQUFBSixJQUFBO1lBQUEsTUFBQUssR0FBQSxHQUFBeEMsTUFBQSxPQUF1QyxPQUFPbkksS0FBSyxDQUFDb0csUUFBUSxLQUFLLFVBQVU7WUFBQSxhQUFwQ3VFLEdBQUEsS0FBdUMzSyxLQUFLLENBQUNvRyxRQUFRLENBQUNsRyxLQUFLLENBQUNJLE1BQU0sQ0FBQzFCLFNBQVMsQ0FBQyxHQUFHb0IsS0FBSyxDQUFDb0csUUFBUTtVQUFBO1VBQUF3RSxRQUFBLENBQUFDLEdBQUE7WUFBQSxNQUFBQyxHQUFBLEdBQTVIOUssS0FBSyxDQUFDK0ssS0FBSztjQUFBQyxJQUFBLEdBQVM3QixLQUFLLENBQUMsQ0FBQztZQUFBMkIsR0FBQSxLQUFBRCxHQUFBLENBQUFDLEdBQUEsSUFBQUcsV0FBQSxDQUFBWCxJQUFBLEVBQUFPLEdBQUEsQ0FBQUMsR0FBQSxHQUFBQSxHQUFBO1lBQUFELEdBQUEsQ0FBQUcsSUFBQSxHQUFBRSxPQUFBLENBQUFaLElBQUEsRUFBQVUsSUFBQSxFQUFBSCxHQUFBLENBQUFHLElBQUE7WUFBQSxPQUFBSCxHQUFBO1VBQUE7WUFBQUMsR0FBQSxFQUFBSyxTQUFBO1lBQUFILElBQUEsRUFBQUc7VUFBQTtVQUFBLE9BQUFiLElBQUE7UUFBQTtNQUFBO0lBQUE7RUFBQTtBQUM3SCxDQUFDOztBQUVEO0FBQ0EsU0FDRXBQLGFBQWEsSUFBSWtRLGNBQWMsRUFDL0JqUSxZQUFZLElBQUlrUSxhQUFhLEVBQzdCaFEsT0FBTyxJQUFJaVEsUUFBUSxFQUNuQmhRLFVBQVUsSUFBSWlRLFdBQVcsUUFDcEIsVUFBVTtBQUNqQixTQUFTaFEsV0FBVyxJQUFJaVEsWUFBWSxRQUFRLGdCQUFnQjs7QUFFNUQ7QUFDQSxJQUFJQyxhQUFhLEdBQUdBLENBQUNDLEtBQUssRUFBRUMsU0FBUyxFQUFFQyxPQUFPLEtBQUs7RUFDakQsTUFBTUMsUUFBUSxHQUFHSCxLQUFLLENBQUNwTyxLQUFLLENBQUMsQ0FBQztFQUM5QnVPLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDRixPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUdDLFFBQVEsQ0FBQ0MsTUFBTSxDQUFDSCxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDN0QsT0FBT0UsUUFBUTtBQUNqQixDQUFDOztBQUVEO0FBQ0EsSUFBSUUsUUFBUSxHQUFHWCxjQUFjLENBQUMsQ0FBQztBQUMvQixJQUFJWSxnQkFBZ0IsR0FBSWhNLEtBQUssSUFBSztFQUNoQyxNQUFNLENBQUNpTSxRQUFRLENBQUMsR0FBRzVGLGtCQUFrQixDQUFDLENBQUM7RUFDdkMsTUFBTSxDQUFDbkcsS0FBSyxFQUFFQyxRQUFRLENBQUMsR0FBR3FMLFlBQVksQ0FBQztJQUNyQ1UsVUFBVSxFQUFFLEVBQUU7SUFDZEMsU0FBUyxFQUFFO0VBQ2IsQ0FBQyxDQUFDO0VBQ0YsTUFBTUMsWUFBWSxHQUFJQyxLQUFLLElBQUs7SUFDOUIsT0FBT0EsS0FBSyxJQUFJLENBQUMsSUFBSUEsS0FBSyxHQUFHbk0sS0FBSyxDQUFDZ00sVUFBVSxDQUFDakwsTUFBTTtFQUN0RCxDQUFDO0VBQ0RvSyxhQUFhLENBQUMsTUFBTTtJQUNsQmxMLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHSCxLQUFLLENBQUNzTSxHQUFHLENBQUMsQ0FBQztJQUN0Q25NLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHSCxLQUFLLENBQUNzTSxHQUFHLENBQUMsQ0FBQztFQUN2QyxDQUFDLENBQUM7RUFDRmpCLGFBQWEsQ0FBQyxNQUFNO0lBQ2xCLElBQUlZLFFBQVEsQ0FBQzNMLE1BQU0sQ0FBQ0MsV0FBVyxJQUFJMEwsUUFBUSxDQUFDM0wsTUFBTSxDQUFDRSxXQUFXLEVBQUU7TUFDOUQ4SyxRQUFRLENBQUMsTUFBTTtRQUNiLE1BQU1LLFNBQVMsR0FBR3pMLEtBQUssQ0FBQ2lNLFNBQVMsQ0FBQ0ksT0FBTyxDQUFDTixRQUFRLENBQUMzTCxNQUFNLENBQUNDLFdBQVcsQ0FBQztRQUN0RSxNQUFNcUwsT0FBTyxHQUFHMUwsS0FBSyxDQUFDZ00sVUFBVSxDQUFDSyxPQUFPLENBQUNOLFFBQVEsQ0FBQzNMLE1BQU0sQ0FBQ0UsV0FBVyxDQUFDO1FBQ3JFLElBQUksQ0FBQzRMLFlBQVksQ0FBQ1QsU0FBUyxDQUFDLElBQUksQ0FBQ1MsWUFBWSxDQUFDUixPQUFPLENBQUMsRUFBRTtVQUN0RHpMLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHSCxLQUFLLENBQUNzTSxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDLE1BQU0sSUFBSVgsU0FBUyxLQUFLQyxPQUFPLEVBQUU7VUFDaEMsTUFBTVksUUFBUSxHQUFHZixhQUFhLENBQUN2TCxLQUFLLENBQUNpTSxTQUFTLEVBQUVSLFNBQVMsRUFBRUMsT0FBTyxDQUFDO1VBQ25FekwsUUFBUSxDQUFDLFdBQVcsRUFBRXFNLFFBQVEsQ0FBQztRQUNqQztNQUNGLENBQUMsQ0FBQztJQUNKLENBQUMsTUFBTTtNQUNMck0sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUdILEtBQUssQ0FBQ3NNLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDO0VBQ0YsQ0FBQyxDQUFDO0VBQ0YsTUFBTXJHLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFDbEIsTUFBTW5ILE9BQU8sR0FBRyxDQUFDb0IsS0FBSyxFQUFFK0YsT0FBTyxDQUFDO0VBQ2hDLE9BQUFDLGlCQUFBLENBQVE2RixRQUFRLENBQUM1RixRQUFRO0lBQUNsRSxLQUFLLEVBQUVuRCxPQUFPO0lBQUEsSUFBQXNILFNBQUE7TUFBQSxPQUFHcEcsS0FBSyxDQUFDb0csUUFBUTtJQUFBO0VBQUE7QUFDM0QsQ0FBQztBQUNELElBQUlxRyxrQkFBa0IsR0FBR0EsQ0FBQSxLQUFNO0VBQzdCLE9BQU9sQixXQUFXLENBQUNRLFFBQVEsQ0FBQyxJQUFJLElBQUk7QUFDdEMsQ0FBQzs7QUFFRDtBQUNBLFNBQVM1USxZQUFZLElBQUl1UixhQUFhLEVBQUVwRyxTQUFTLElBQUlxRyxVQUFVLEVBQUVwRyxPQUFPLElBQUlxRyxRQUFRLFFBQVEsVUFBVTs7QUFFdEc7QUFDQSxJQUFJQyxXQUFXLEdBQUdBLENBQUNDLE9BQU8sRUFBRUMsT0FBTyxLQUFLO0VBQ3RDLE9BQVF6RCxHQUFHLElBQUs7SUFDZHdELE9BQU8sQ0FBQ3hELEdBQUcsQ0FBQztJQUNaeUQsT0FBTyxDQUFDekQsR0FBRyxDQUFDO0VBQ2QsQ0FBQztBQUNILENBQUM7O0FBRUQ7QUFDQSxJQUFJMEQsY0FBYyxHQUFHQSxDQUFDM04sRUFBRSxFQUFFbUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLO0VBQ3RDLE1BQU0sQ0FBQ3lLLFFBQVEsRUFBRTtJQUFFckwsY0FBYztJQUFFUTtFQUFrQixDQUFDLENBQUMsR0FBR2lGLGtCQUFrQixDQUFDLENBQUM7RUFDOUUsTUFBTSxDQUFDNEcsYUFBYSxDQUFDLEdBQUdSLGtCQUFrQixDQUFDLENBQUM7RUFDNUMsTUFBTTdOLFNBQVMsR0FBRytKLGVBQWUsQ0FBQ3RKLEVBQUUsRUFBRW1DLElBQUksQ0FBQztFQUMzQyxNQUFNcEMsU0FBUyxHQUFHd0ssZUFBZSxDQUFDdkssRUFBRSxFQUFFbUMsSUFBSSxDQUFDO0VBQzNDLE1BQU1vSCxPQUFPLEdBQUdpRSxXQUFXLENBQUNqTyxTQUFTLENBQUMwSyxHQUFHLEVBQUVsSyxTQUFTLENBQUNrSyxHQUFHLENBQUM7RUFDekQsTUFBTTRELFlBQVksR0FBR0EsQ0FBQSxLQUFNRCxhQUFhLENBQUNmLFVBQVUsQ0FBQ0ssT0FBTyxDQUFDbE4sRUFBRSxDQUFDO0VBQy9ELE1BQU04TixZQUFZLEdBQUdBLENBQUEsS0FBTUYsYUFBYSxDQUFDZCxTQUFTLENBQUNJLE9BQU8sQ0FBQ2xOLEVBQUUsQ0FBQztFQUM5RCxNQUFNK04sVUFBVSxHQUFJQyxHQUFHLElBQUtwQixRQUFRLENBQUNwTixVQUFVLENBQUN3TyxHQUFHLENBQUMsRUFBRXhRLE1BQU0sSUFBSSxJQUFJO0VBQ3BFLE1BQU15USxlQUFlLEdBQUdBLENBQUEsS0FBTTtJQUM1QixNQUFNekosS0FBSyxHQUFHckcsYUFBYSxDQUFDLENBQUM7SUFDN0IsTUFBTStQLG9CQUFvQixHQUFHTCxZQUFZLENBQUMsQ0FBQztJQUMzQyxNQUFNTSxvQkFBb0IsR0FBR0wsWUFBWSxDQUFDLENBQUM7SUFDM0MsSUFBSUssb0JBQW9CLEtBQUtELG9CQUFvQixFQUFFO01BQ2pELE1BQU1uSSxhQUFhLEdBQUdnSSxVQUFVLENBQUMvTixFQUFFLENBQUM7TUFDcEMsTUFBTW9PLFlBQVksR0FBR0wsVUFBVSxDQUM3QkgsYUFBYSxDQUFDZixVQUFVLENBQUNzQixvQkFBb0IsQ0FDL0MsQ0FBQztNQUNELElBQUlwSSxhQUFhLElBQUlxSSxZQUFZLEVBQUU7UUFDakM1SixLQUFLLENBQUNwSSxDQUFDLEdBQUdnUyxZQUFZLENBQUNoUyxDQUFDLEdBQUcySixhQUFhLENBQUMzSixDQUFDO1FBQzFDb0ksS0FBSyxDQUFDbkksQ0FBQyxHQUFHK1IsWUFBWSxDQUFDL1IsQ0FBQyxHQUFHMEosYUFBYSxDQUFDMUosQ0FBQztNQUM1QztJQUNGO0lBQ0EsT0FBT21JLEtBQUs7RUFDZCxDQUFDO0VBQ0QsTUFBTS9DLFdBQVcsR0FBRztJQUNsQnpCLEVBQUUsRUFBRSxnQkFBZ0I7SUFDcEJrRCxLQUFLLEVBQUUsR0FBRztJQUNWRyxRQUFRLEVBQUdnTCxVQUFVLElBQUs7TUFDeEIsTUFBTTdKLEtBQUssR0FBR3lKLGVBQWUsQ0FBQyxDQUFDO01BQy9CLE9BQU87UUFBRTdSLENBQUMsRUFBRWlTLFVBQVUsQ0FBQ2pTLENBQUMsR0FBR29JLEtBQUssQ0FBQ3BJLENBQUM7UUFBRUMsQ0FBQyxFQUFFZ1MsVUFBVSxDQUFDaFMsQ0FBQyxHQUFHbUksS0FBSyxDQUFDbkk7TUFBRSxDQUFDO0lBQ2pFO0VBQ0YsQ0FBQztFQUNEa1IsUUFBUSxDQUFDLE1BQU1oTSxjQUFjLENBQUMsWUFBWSxFQUFFdkIsRUFBRSxFQUFFeUIsV0FBVyxDQUFDLENBQUM7RUFDN0Q2TCxVQUFVLENBQUMsTUFBTXZMLGlCQUFpQixDQUFDLFlBQVksRUFBRS9CLEVBQUUsRUFBRXlCLFdBQVcsQ0FBQ3pCLEVBQUUsQ0FBQyxDQUFDO0VBQ3JFLE1BQU10QyxTQUFTLEdBQUdBLENBQUEsS0FBTTtJQUN0QixPQUFPLENBQUNzQyxFQUFFLEtBQUs0TSxRQUFRLENBQUMzTCxNQUFNLENBQUNDLFdBQVcsSUFBSSxDQUFDMEwsUUFBUSxDQUFDM0wsTUFBTSxDQUFDSyxPQUFPLEdBQUdzTCxRQUFRLENBQUM3TCxVQUFVLENBQUNmLEVBQUUsQ0FBQyxFQUFFdEMsU0FBUyxHQUFHa1AsUUFBUSxDQUFDcE4sVUFBVSxDQUFDUSxFQUFFLENBQUMsRUFBRXRDLFNBQVMsS0FBS1MsYUFBYSxDQUFDLENBQUM7RUFDdEssQ0FBQztFQUNELE1BQU1tUSxRQUFRLEdBQUdoTSxNQUFNLENBQUNDLGdCQUFnQixDQUNyQ2hGLE9BQU8sSUFBSztJQUNYZ0MsU0FBUyxDQUFDaEMsT0FBTyxFQUFFLE9BQU87TUFBRXFNLGFBQWEsRUFBRTtJQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25EN0osU0FBUyxDQUFDeEMsT0FBTyxFQUFFLE9BQU87TUFBRXFNLGFBQWEsRUFBRTtJQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25EeUQsYUFBYSxDQUFDLE1BQU07TUFDbEIsTUFBTXhELGlCQUFpQixHQUFHbk0sU0FBUyxDQUFDLENBQUM7TUFDckMsSUFBSSxDQUFDVSxrQkFBa0IsQ0FBQ3lMLGlCQUFpQixFQUFFMUwsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNELE1BQU0yTCxLQUFLLEdBQUdWLGNBQWMsQ0FBQzFMLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDekNILE9BQU8sQ0FBQ3VNLEtBQUssQ0FBQ0MsV0FBVyxDQUFDLFdBQVcsRUFBRUQsS0FBSyxDQUFDcE0sU0FBUyxJQUFJLElBQUksQ0FBQztNQUNqRSxDQUFDLE1BQU07UUFDTEgsT0FBTyxDQUFDdU0sS0FBSyxDQUFDRSxjQUFjLENBQUMsV0FBVyxDQUFDO01BQzNDO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxFQUNEO0lBQ0VDLEdBQUcsRUFBRTtNQUNIeEgsVUFBVSxFQUFFLElBQUk7TUFDaEJHLEtBQUssRUFBRTJHO0lBQ1QsQ0FBQztJQUNEN0wsU0FBUyxFQUFFO01BQ1QrRSxVQUFVLEVBQUUsSUFBSTtNQUNoQkksR0FBRyxFQUFFbkY7SUFDUCxDQUFDO0lBQ0QrTCxpQkFBaUIsRUFBRTtNQUNqQmhILFVBQVUsRUFBRSxJQUFJO01BQ2hCSSxHQUFHLEVBQUVBLENBQUEsS0FBTXRELFNBQVMsQ0FBQ2tLO0lBQ3ZCLENBQUM7SUFDRFMsY0FBYyxFQUFFO01BQ2R6SCxVQUFVLEVBQUUsSUFBSTtNQUNoQkksR0FBRyxFQUFFQSxDQUFBLEtBQU10RCxTQUFTLENBQUMySztJQUN2QixDQUFDO0lBQ0RNLGlCQUFpQixFQUFFO01BQ2pCL0gsVUFBVSxFQUFFLElBQUk7TUFDaEJJLEdBQUcsRUFBRUEsQ0FBQSxLQUFNOUMsU0FBUyxDQUFDeUs7SUFDdkI7RUFDRixDQUNGLENBQUM7RUFDRCxPQUFPOEQsUUFBUTtBQUNqQixDQUFDOztBQUVEO0FBQ0EsU0FDRUMsR0FBRyxFQUNIeFMsVUFBVSxJQUFJeVMsV0FBVyxFQUN6QnZILFNBQVMsSUFBSXdILFVBQVUsRUFDdkJ2SCxPQUFPLElBQUl3SCxRQUFRLEVBQ25CaEUsSUFBSSxJQUFJaUUsS0FBSyxRQUNSLFVBQVU7QUFDakIsU0FBU2xFLE1BQU0sSUFBSW1FLE9BQU8sUUFBUSxjQUFjO0FBQ2hELElBQUlDLFdBQVcsR0FBSWxPLEtBQUssSUFBSztFQUMzQkEsS0FBSyxHQUFHNk4sV0FBVyxDQUFDO0lBQUVNLEtBQUssRUFBRSxLQUFLO0lBQUU3TixNQUFNLEVBQUU7RUFBTSxDQUFDLEVBQUVOLEtBQUssQ0FBQztFQUMzRDtJQUFBLE1BQUFvTyxLQUFBLEdBQUE3RCxNQUFBO0lBQUFHLFFBQUEsQ0FBQTBELEtBQUEsUUFjRXBPLEtBQUssQ0FBQ1gsRUFBRTtJQUFBdUwsUUFBQSxDQUFBeUQsR0FBQSxJQUFBbkQsT0FBQSxDQUFBa0QsS0FBQSxFQWJEO01BQ0xuRSxRQUFRLEVBQUUsT0FBTztNQUNqQixnQkFBZ0IsRUFBRSxNQUFNO01BQ3hCLEdBQUd6QixXQUFXLENBQUN4SSxLQUFLLENBQUNuRCxNQUFNLENBQUM7TUFDNUJ5UixPQUFPLEVBQUUsWUFBWTtNQUNyQixlQUFlLEVBQUV0TyxLQUFLLENBQUNNLE1BQU0sR0FBRyxLQUFLLEdBQUcsS0FBSztNQUM3QyxlQUFlLEVBQUVOLEtBQUssQ0FBQ21PLEtBQUs7TUFDNUJJLE9BQU8sRUFBRSxNQUFNO01BQ2ZKLEtBQUssRUFBRW5PLEtBQUssQ0FBQ21PLEtBQUs7TUFDbEIsYUFBYSxFQUFFLFVBQVU7TUFDekIsaUJBQWlCLEVBQUUsVUFBVTtNQUM3QixHQUFHbk8sS0FBSyxDQUFDbUo7SUFDWCxDQUFDLEVBQUFrRixHQUFBO0lBQUEsT0FBQUQsS0FBQTtFQUFBO0FBRUwsQ0FBQztBQUNELElBQUlJLGdCQUFnQixHQUFHQSxDQUFBLEtBQU07RUFDM0IsTUFBTSxDQUFDdE8sS0FBSyxFQUFFO0lBQUU2QztFQUFpQixDQUFDLENBQUMsR0FBR3NELGtCQUFrQixDQUFDLENBQUM7RUFDMUQsSUFBSW9JLE9BQU8sR0FBRyxLQUFLO0VBQ25CLE1BQU1DLE1BQU0sR0FBR0EsQ0FBQSxLQUFNO0lBQ25CLElBQUksQ0FBQ0QsT0FBTyxFQUFFO01BQ1pqSCxNQUFNLENBQUNtSCxxQkFBcUIsQ0FBQyxZQUFXO1FBQ3RDNUwsZ0JBQWdCLENBQUMsQ0FBQztRQUNsQjBMLE9BQU8sR0FBRyxLQUFLO01BQ2pCLENBQUMsQ0FBQztNQUNGQSxPQUFPLEdBQUcsSUFBSTtJQUNoQjtFQUNGLENBQUM7RUFDRFYsUUFBUSxDQUFDLE1BQU07SUFDYjdHLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsUUFBUSxFQUFFdUgsTUFBTSxDQUFDO0VBQzdDLENBQUMsQ0FBQztFQUNGWixVQUFVLENBQUMsTUFBTTtJQUNmNUcsUUFBUSxDQUFDVyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUU2RyxNQUFNLENBQUM7RUFDaEQsQ0FBQyxDQUFDO0VBQ0YsT0FBQXhJLGlCQUFBLENBQVErSCxPQUFPO0lBQUEsSUFBQzlELEtBQUtBLENBQUE7TUFBQSxPQUFFakQsUUFBUSxDQUFDa0QsSUFBSTtJQUFBO0lBQUEsSUFBQWhFLFNBQUE7TUFBQSxRQUFBRixpQkFBQSxDQUNqQzBILEdBQUc7UUFBQSxJQUFDZ0IsSUFBSUEsQ0FBQTtVQUFBLE9BQUVqTixNQUFNLENBQUNRLE1BQU0sQ0FBQ2pDLEtBQUssQ0FBQ3JCLFVBQVUsQ0FBQztRQUFBO1FBQUF1SCxRQUFBLEVBQUloSCxTQUFTLElBQUtBLFNBQVMsR0FBQThHLGlCQUFBLENBQUlnSSxXQUFXO1VBQUEsSUFDbEY3TyxFQUFFQSxDQUFBO1lBQUEsT0FBRUQsU0FBUyxDQUFDQyxFQUFFO1VBQUE7VUFBQSxJQUNoQnhDLE1BQU1BLENBQUE7WUFBQSxPQUFFdUMsU0FBUyxDQUFDdkMsTUFBTTtVQUFBO1VBQUEsSUFDeEJ5RCxNQUFNQSxDQUFBO1lBQUEsT0FBRWxCLFNBQVMsQ0FBQ0MsRUFBRSxLQUFLYSxLQUFLLENBQUNJLE1BQU0sQ0FBQ0UsV0FBVztVQUFBO1FBQUEsS0FDOUM7TUFBSSxJQUFBMEYsaUJBQUEsQ0FDUjBILEdBQUc7UUFBQSxJQUFDZ0IsSUFBSUEsQ0FBQTtVQUFBLE9BQUVqTixNQUFNLENBQUNRLE1BQU0sQ0FBQ2pDLEtBQUssQ0FBQ0UsVUFBVSxDQUFDO1FBQUE7UUFBQWdHLFFBQUEsRUFBSXhILFNBQVMsSUFBS0EsU0FBUyxHQUFBc0gsaUJBQUEsQ0FBSWdJLFdBQVc7VUFBQSxJQUNsRjdPLEVBQUVBLENBQUE7WUFBQSxPQUFFVCxTQUFTLENBQUNTLEVBQUU7VUFBQTtVQUFBLElBQ2hCeEMsTUFBTUEsQ0FBQTtZQUFBLE9BQUUrQixTQUFTLENBQUMvQixNQUFNO1VBQUE7VUFBQSxJQUN4QnlELE1BQU1BLENBQUE7WUFBQSxPQUFFMUIsU0FBUyxDQUFDUyxFQUFFLEtBQUthLEtBQUssQ0FBQ0ksTUFBTSxDQUFDQyxXQUFXO1VBQUE7VUFDakQ0TixLQUFLO1VBQUEsSUFDTGhGLEtBQUtBLENBQUE7WUFBQSxPQUFFO2NBQ0wsYUFBYSxFQUFFLFlBQVk7Y0FDM0IsaUJBQWlCLEVBQUUsWUFBWTtjQUMvQixHQUFHVixjQUFjLENBQUM3SixTQUFTLENBQUM3QixTQUFTO1lBQ3ZDLENBQUM7VUFBQTtRQUFBLEtBQ0U7TUFBSSxJQUFBbUosaUJBQUEsQ0FDUjhILEtBQUs7UUFBQSxJQUFDM0QsSUFBSUEsQ0FBQTtVQUFBLE9BQUVuSyxLQUFLLENBQUNJLE1BQU0sQ0FBQ0ssT0FBTztRQUFBO1FBQUVrTyxLQUFLO1FBQUF6SSxRQUFBLEVBQUd6RixPQUFPLElBQUF1RixpQkFBQSxDQUFNZ0ksV0FBVztVQUFBLElBQ2pFN08sRUFBRUEsQ0FBQTtZQUFBLE9BQUVzQixPQUFPLENBQUN0QixFQUFFO1VBQUE7VUFBQSxJQUNkeEMsTUFBTUEsQ0FBQTtZQUFBLE9BQUU4RCxPQUFPLENBQUM5RCxNQUFNO1VBQUE7VUFDdEJ5RCxNQUFNLEVBQUUsSUFBSTtVQUNaNk4sS0FBSztVQUFBLElBQ0xoRixLQUFLQSxDQUFBO1lBQUEsT0FBRTtjQUNMLEdBQUdWLGNBQWMsQ0FBQzlILE9BQU8sQ0FBQzVELFNBQVM7WUFDckMsQ0FBQztVQUFBO1FBQUE7TUFDRDtJQUFBO0VBQUE7QUFFTixDQUFDO0FBQ0QsU0FDRXlSLGdCQUFnQixFQUNoQjFPLGdCQUFnQixFQUNoQm9JLGVBQWUsRUFDZjhCLFdBQVcsRUFDWGdDLGdCQUFnQixFQUNoQnJOLGFBQWEsRUFDYlksY0FBYyxFQUNkb0osZUFBZSxFQUNmaUIsZUFBZSxFQUNmcEQsbUJBQW1CLEVBQ25Cd0csY0FBYyxFQUNkeEUsV0FBVyxFQUNYRSxtQkFBbUIsRUFDbkJoSixnQkFBZ0IsRUFDaEIrSSxjQUFjLEVBQ2RwQyxrQkFBa0IsRUFDbEJvRyxrQkFBa0IiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF19